Sayı 2 , İndir - FİL : PHP ve Teknoloji Dergisi - PHP-TR
Transkript
Sayı 2 , İndir - FİL : PHP ve Teknoloji Dergisi - PHP-TR
FİL:PHP ve Teknoloji fil.php-tr.com Kasım 2013 Sayı 2 (Ücretsizdir) MAGENTO - E-TİCARET YAZILIMI p h p ? TORTOISESVN KURULUMU VE KULLANIMI < BİR YAZILIMCI ŞİRKETTEN NEDEN AYRILIR fo re PHP İLE MEMCACHED KULLANIMI ac h PHP İLE REGULAR EXPRESSION (REGEX) fopen( “http: //www. exampl e.com/ ”, “r”); PHP5-FPM + NGINX ile COUCHBASE NOSQL DATABASE KULLANIMI ANGULARJS 1 FİLLER GEZİYOR KÜNYE Yayıncı : PHP-TR.com Editör : Ayhan Barış Tasarım : Tolga Dedebek Logo : Emin Zeybek Yazarlar : Ayhan Barış Baran Sakallıoğlu Berk Çekişbaş Ceyda Anıl Fatih Demirel Musa Avcı Uğur Eski Mobil Uygulamalar : Ahmet Ertekin Ali Çetin Seyhan Yılmaz Facebook : groups/tr.developers Twitter : @php_tr / #phptr https://play.google.com/store/apps/details?id=com.phptr.dergi&hl=tr Android uygulaması e-dergi sayılarının listesini veren ve e-dergiyi indirmenizi sağlayan bir arayüz sunar. 1 http ://fil .php -tr.c om .php-tr.com m http://foru http://www.php-tr.com MAGENTO - E-TİCARET YAZILIMI Fatih Demirel 2 f.demirel@degenstudio.com Bu yazımda size Magento’nun kurulumu ve sunduğu avantajlardan bahsedeceğim. Başlangıç seviyesinde bir yazı olacak fakat diğer sayılarda çok daha detaylı çalışmalar yapacağız. Yazı dizimizin sonunda Magento hakkında tüm ayrıntıları öğrenmiş ve ayriyeten bir e-ticaret platformunu tamamlamış olacağız. Birçok Magento projesinde karşılaştığım ve yanıtlarını bulamayacağınız problemleri çözüm yollarıyla sizlerle paylaşıp, güzel bir kaynak oluşturmak amacı ile bu yazıma başlıyorum. olamaz diyebilirim. Magento, açık kaynak kodlu bir e-ticaret platformdur. Bu platformun çok gelişmiş özelliklere sahip ücretli sürümü de bulunmaktadır. Ücretli ve ücretsiz birçok eklentiyi kolayca entegre edebilirsiniz. Açık kaynaklı oluşundan dolayı sürekli güncellenerek yeni sürümleri çıkmaktadır. Ücretli sürümleri Magento Enterprise ve Magento Enterprise Premium olarak adlandırılmıştır ve bu sürümler güvenlik, eklentiler, mobile web mağaza, 7 / 24 destek ve kişisel eğitimler içermekte olup çok daha büyük projeler için düzenlenmiştir. Eğer daha küçük projeler geliştirmek için e-ticaret sisteminizi kurmak istiyorsanız, ücretsiz sürümü size yeterli olacaktır. Dünya üzerinde birçok ünlü e-ticaret sistemi Magento alt yapısını kullanmaktadırlar ve bu alanda kullanım yüzdesi oldukça yüksektir. Bu ünlü firmalar arasında Nokia ve Lenovo olduğunu belirtsem belki biraz daha ilginizi çekebilir. Hatta EBAY gibi bir devin arkasında olması ile diğer platformlar arasındaki uçurumun sebeplerini anlamanıza yardımcı olabilirim. Türkçe kaynak sıkıntısı olsa da diğer dillerde oldukça geniş içerik ve eklenti bulabilirsiniz. Yapacağınız tasarımı kolay bir şekilde entegre edebilecek ve hızlı bir şekilde geliştirebileceksiniz. Sunduğu olanaklara bakaraktan ve diğer platformları kullanmam ile karşılaştırma yapacak olursam eğer birçok platform Magento’ya rakip dahi Mobil mağazaların tercihi de yine Magento olmaktadır. Mobil uygulama entegrasyonu çok iyi bir platform olduğunu da söyleyebilirim. Bunu avantajlar kısmına yazabiliriz. Magento ile projeler geliştirenler bilirler ki, Magento biraz daha fazla kaynak tükettiğinden ve geniş bir yapıya sahip olduğundan, sunucu seçimlerinizde hıza önem vermeniz gerektiğini belirtmem gerek. Bunu dezavantaj olarak saymıyorum. Çünkü Magento daha büyük çaplı projelere odaklanmış durumda olduğu için bu konu hedef kitlesi doğrultusunda eksi sayılacak bir durum teşkil etmiyor. Kurulumu İlk önce kurulumu yapmak için kayıt olmamız ve dosyaları indirmemiz gerekmektedir. ht tp://w w w.magentocommerce.com/download linkinden en son sürümün zip dosyasını indiriyoruz. Tabi bu arada indirmek için tıkladığımızda kayıt olmamız gereklidir. İndirmeyi tamamladıktan sonra kurulumu yapmak için dosyalarımızı ftp ‘den atıp, veri tabanımızı oluşturup, kuruluma geçebiliriz. • Magento PHP 5.2.0 ve yukarısını desteklemektedir. O yüzden sunucunuzda PHP 5.2.0 ve üzeri yüklü olmalıdır. • İlk adımda lisans sözleşmesini okuduğumuzu ve kullanım şartlarına razı olduğumuzu (I agree to the above terms and conditions) işaretleyip Devam’a (Continue) tıklıyoruz. • Bu kısımda döviz kuru, dil ve saat kısımlarını belirliyoruz. • Daha önceden oluşturduğumuz veritabanımızın bilgilerini giriyoruz. • Kurulumun sonunda verilen şifreleme anahtarını bir yere not alınız çünkü bu anahtar daha sonra size lazım olacaktır. Eğer sunucunuzda pdo_mysql, mcrypt, curl ve gd adlı php eklentileri aktif değilse php.ini dosyasında değişiklikler yapmalısınız; pdo_mysql aktive etme işlemi için pdo eklentisini aktif hale getirmelisiniz. Bunun için php.ini dosyasında; ;extension=php_mcrypt.dll ;extension=php_curl.dll ;extension=php_gd2.dll satırlarının başlarındaki kaldırmalısınız. • Burada ise yönetim panelinde çizelgelerin gösterilmesi (Enable charts), Url onaylanması, Web sunucu üzerine yazma ve eğer SSL kullanacak isek (Use Secure URLs (SSL)) kısımlarını işaretleyip, kuruluma devam ediyoruz. noktalı virgülleri (;) pdo_mysql Must Be Loaded Hatası Kurulumda bu hata ile karşılaşırsanız eğer, public_html klasörü içerisine bir php.ini dosyası içerisine aşağıdaki komutları girmeniz gerekecektir. extension = pdo.so extension = pdo_mysql extension = pdo_mysql.so Türkçe Dil Paketinin Yüklenmesi İlk önce yönetim paneline giriş yapıp aşağıda belirttiğim adımları izlemeniz gerekmektedir; Sistem >> Magento Connect >> Magento Connect Manager 3 • Daha sonraki kısımda ise giriş için belirleyeceğimiz kullanıcı adı ve şifre bilgilerimizi girip devam (continue) butonuna basarak diğer adıma geçiyoruz. Bu yolu izledikten sonra giriş yapınız. İlk seçenekteki “Search for modules via Magento Connect” linkine tıklayınız. Daha sonra Languages / Locales kısmına geliniz. Burada türkçe dil eklentisi için diğer sayfaya geçiniz. Magento Community Modules - Turkish (Turkey) Language Pack linkine tıklayınız ve; Get Extension Key butonuna tıklayıp, lisans sözleşmesini kabul ettiğinizi bildiren kutucuğu doldurup GET EXTENSION KEY butonuna basınız. Açılan kutuda bize lazım olacak olan eklenti anahtarını (extension key) kopyalayabilirsiniz. Kodu kopyaladıktan sonra tekrar Magento Bağlantı Yöneticisi (Magento Connect Manager) ekranına gelerek ikinci seçenek olan “Paste extension key to install:” bölümüne, kopyalamış olduğumuz eklenti anahtarını (extension key) yapıştırıp, Install butonuna tıklayınız. kolay eklenebilmesi, • Birçok mühendis tarafından düzenli olarak kodlarının incelenip düzenlenmesi ile birlikte Google Arama Motoru Optimizasyonu kurallarına uyumunun yüksek olması ve Google servisleri ile entegrasyonu. Bu yazımda size basit kurulum ve Magento’nun bize sunduğu avantajlardan kısaca bahsettim. Diğer yazımda daha detaylı bir şekilde karşılaşacağımız problemleri, dezavantajlarını ve daha derinlere inip teknik detaylarını anlatacağım. Kaynaklar: http://www.magentocommerce.com/ Eğer aşağıdaki hatayı alıyorsanız; Failed to download Magento-community/Locale_Mage_community_ tr_TR within preferred state “stable”, latest release is version 1.0.19870.4.12, stability “beta”, use “channel:// co n n ec t.M a ge n to co m m erce.co m/co m m u nit y/Lo cale _ M a ge _ community_tr_TR-1.0.19870.4.12” to install Cannot initialize ‘channel://connect.Magentocommerce.com/ community/Locale_Mage_community_tr_TR’, invalid or missing package file Install Errors Package “channel://connect.Magentocommerce.com/community/ Locale_Mage_community_tr_TR” is not valid PEAR ERROR: install failed “Paste extension key to install:” kısmına uzantı anahtarını (Magento community/Locale_Mage_ community_tr_TR-1.0.19870.4.12) yazın Install butonuna basınız; Artık Magento’yu Türkçeleştirmiş bulunmaktayız. Genel Olarak Bize Sunduğu En Önemli Avantajlar • Büyük bir topluluk ürünü olmasından dolayı, destek ve düzenli olarak güncelleme konusunda çok iyi ve problemlerinizin çözümlerini kolaylıkla bulabilirsiniz,, • Esnek bir yapıya sahip olması, • Bir e-ticaret platformundan beklediğiniz birçok özelliğin ücretli ve ücretsiz olarak sunulması ve çok fazla modül olması, Fatih Demirel • Mobil ticaret uyumu, • Açık kaynaklı bir sistem olduğu için güvenlik konusunda kontrol imkânınız bulunmakta, 4 • Kolay entegre edilebilen ödeme sistemleri, • Kod yapısının çok temiz olması ve yeni özelliklerin f.demirel@degenstudio.com Degen Ltd. (Bulgaristan) İş Geliştirme Müdürü TORTOISESVN KURULUM VE KULLANIMI Berk Çekişbaş berkcekisbas@gmail.com Tortoise SVN Giriş Subversion; “Tigris.org: Açık Kaynak Yazılım Mühendisliği Araçları” sitesi ve CollabNet şirketi adı altında http://subversion.tigris.org/ internet adresinde yayınlanan açık kaynak kodlu bir Sürüm Kontrol Sistemi’dir. Ve komut satırından çalışmaktadır. Belirli bir proje üzerinde çalışırken ekip halinde hızlı bir şekilde projenin en güncel haline ulaşmak ve dosyalardaki tüm değişiklikleri kaydederek dosyanın istenilen zamanda istenilen haline ulaşılmasını, kimlerin ne tür değişiklikler yaptığını belirlemek ve ortak bir çalışma alanı oluşturmak için kullanılır. Subversion 2000 yılından beri geliştirilmektedir. Tortoise SVN Projesi yine aynı ekip tarafından yürütülen açık kaynak kodlu subversion sistemini Windows ortamında daha kolay bir kullanım sunmak için geliştirilmiş bir araçtır. TortoiseSVN Windows ortamında birkaç tıklama ile bizim komutlarımızı subversion a göndererek işlemlerimizi kolayca yapmamızı sağlamaktadır. TortoiseSVN’i uzak bir makinede ya da kendi bilgisayarımız üzerinde bir depo oluşturarak kullanabiliriz. 5 TortoiseSVN Kurulumu TortoiseSVN’i http://tortoisesvn.net/downloads.html adresinden download edebiliriz ve yazılımın Türkçe dil paketi bulunmaktadır. Programın kurulumunu gerçekleştirdikten sonra varsayılan olarak C:\Program Files\TortoiseSVN dizini altına kurulmaktadır. Visual SVN Server Kurulumu Tortoise SVN için bir SVN sunucusunu Linux makine üzerinde de yapabiliriz ama Windows platformu üzerinde kullanımından bahsettik ve sunucu için de yine Windows üzerinden devam edelim. Windows subversion sunucusu için VisualSVN Server kullanacağız. VisualSVN Server lisans olarak iki seçenek sunmakta biri ücretsiz basit yönetim arayüzü, Windows oturum açma desteği sunmakta. Ücretli versiyonu ise Active Directory ile entegre olma gibi yeteneklere sahip fakat ücretsiz versiyonu da gayet iyi çalışmakta ve ofis içerisinde ya da farklı bölgelerde çalışan ekip arkadaşları için ortak bir depo alanı sunmakta gayet başarılı. Visual SVN Server ı http://www.visualsvn.com/server/licensing/ adresinden temin edip kurulumunu yapabiliriz. Şimdi kurulumu ve bir proje için kısaca ayarlarını inceleyelim. tutacağı dizin, sunucunun çalışacağı portu belirliyoruz. Standart ayarlarında bırakıp devam edelim dilersek kendi sunucumuza göre düzenleyebiliriz. İlerliyoruz ve Install diyerek kurulumu bitiriyoruz. Burada kurulumda bizim ihtiyacımız olan Visual Server and Management Console seçeneğini seçiyoruz ve bize SVN sunucusu ile birlikte bir yönetim konsolu arayüzü sağlıyor. Eğer subversion u komut sistemi ile de çalıştırmak istersek Add Subversion command-line tools seçeneğini de işaretleyebiliriz. Kurulum tamamlandıktan sonra VisualSVN Server Manager uygulamasını çalıştırıyoruz ve karşımıza bu ekran geliyor. Sol menüde Repositories, Users, Groups olarak menü geliyor. İstersek açık bir erişim ya da kullanıcı veya gruplara şifre ile erişim sağlayabiliriz. Biz şifreli bir erişim sağlayarak ilerleyelim. Bunun için ilk olarak bir kullanıcı tanımlıyoruz. Bunun için users kısmına sağ tıklayarak bir username ve password belirliyoruz. Burada standart seçeneğini seçerek devam ediyoruz. 6 Daha sonra Repositories kısmına sağ tıklayarak create new repository kısmına tıklıyoruz ve ilk olarak bizden bir repository ismi istiyor. Buraya proje ismini girerek devam edelim. Daha sonraki ekranda bize boş bir projemi oluşturacağımızı ya da otomatik olarak trunk, branches, tags dizinlerini standart olarak oluşturacağımızı mı soruyor. Biz boş bir proje diyerek devam ediyoruz. Burada programın kurulacağı standart dizin ve dosyaları Kurulum tamamlandıktan sonra TortoiseSVN Windows un sağ klik menüsüne SVN Checkout ve Tortoise SVN şekline iki seçenek olarak kendisini ekliyor. SVN Checkout Son olarak depo için erişim ayarlarını yapmamızı istiyor. İlk seçenekte erişim kısıtlaması yok. İkinci seçenekte tüm ekli kullanıcılara depo için okuma ve yazma izni veriyor. 3. Seçenekte ise belli kullanıcı veya gruplara spesifik yetkiler verebiliyoruz. Biz oluşturduğumuz test kullanıcımıza custom butonunu tıklayarak add seçeneği ile ekli kullanıcıları görüyoruz ve test kullanıcımızı seçiyoruz. Okuma ve yazma izni veriyoruz ve tamam diyerek kullanıcı işlem menüsünü kapatıyoruz. Daha sonra crate diyerek depo oluşturma işlemini tamamlıyoruz. Son olarak bize proje adını, web üzerinden ve TortoiseSVN üzerinden ulaşabileceğimiz bir link, ekli kullanıcılar ve yetkilerini gösteren bir ekran geliyor Tamam diyerek depo oluşturma işlemimizi tamamlıyoruz. Visual SVN Server bir Apache web sunucusu ile birlikte kuruluyor. Bu yüzden tarayıcı üzerinden de bize verdiği adresi kullanarak dosyalara erişim imkânı sağlayabiliyoruz. Uzak sunucuda kullanacaksak eğer makine ismi yerine IP adresi belirmemiz yeterli olacaktır. Bir dizinimizi proje dizini olarak belirledikten sonra depo ile dizinimizi eşitlemek için belirlediğimiz dizine sağ klik ile SVN Checkout diyoruz, Url of repository kısmına sunucumuzu kurarken belirlediğimiz repository adresini giriyor ve devam ediyoruz. Daha sonra bize kullanıcı adı ve şifre soracak. Kullanıcı adı ve şifremizi girdikten sonra bize bir çalışma kopyası oluşacak. Artık oluşturduğumuz bu dizin bizim çalışma kopyamız oluyor. Klasörün sol at köşesinde yeşil bir çentik belirmesi gerek Artık çalışma kopyamızı oluşturduk. SNV Commit Basit olarak VisualSVN Server üzerinde bir depo oluşturma ve kullanıcılara yetkilendirmeyi öğrenerek kurulumumuzu yaptık. Artık TortoiseSVN’i kurarak devam edebiliriz. Tortoise SVN Kurulumu 7 TortoiseSVN’in kurulumu oldukça basit. Öncelikle TortoiseSVN’i http://tortoisesvn.net/downloads.html adresinden download ediyoruz. Standart Windows kurulumu Next Next Next diyerek kurulumu bitiriyoruz. Kurulumda bize seçenekler sunacak. Yine burada subversion u komut satırından kullanmak istersek kurulum seçeneklerinde command line tools seçeneğini seçerek komut satırı desteğini de kullanabiliyoruz. Şimdi projemizi başlatıyor ya da mevcut proje dosyalarımızı oluşturduğumuz bu dizin içerisine kopyalıyoruz. Daha sonra belirlediğimiz dizine sağ tuş tıklayıp Commit diyerek dosyaları depo ya gönderme işlemine başlıyoruz. Üst kısımda yaptığımız işlem hakkında bir mesaj yazabiliriz. Aslında proje gidişatı açısından yapılan her işlemde gerekli notların bırakılması gerek. Alt kısımdan depodaki dosyalardan sizin değişiklik yapmış olduklarınız gösterilir ve hangisini depo ya göndermek istediğiniz seçersiniz. All diyerek tüm dosyaları depo ya gönderiyoruz. SVN Update Projemiz üzerinde çalışmaya başlamadan önce diğer proje çalışanlarının yaptıkları değişiklerle çalışma kopyamızı güncellemek için SVN Update butonuna tıklıyoruz. Böylece diğer güncellemeler çalışma kopyamıza indiriyor ve projeye bize ait kısmında kaldığımız yerden devam ediyoruz. Show Log vermeyebilir. Bu gibi durumlarda çalışmayı temizleyip yenidne başlayabiliriz. Bunun için çalışma kopyası dizinimize sağ tuş tıklayarak TortoiseSVN menüsü altından clean up diyoruz. Çakışmaları Düzeltmek (Resolving Conflicts) Eğer aynı projede çalışan iki kişi bir dosyada aynı satırları değiştirirse çalışma olayı ortaya çıkar. 1. Geliştirici test. php de ilgili satırları değiştirir ve depoya gönderir. Aynı anda depodan güncelleme yapdan aynı dosya üzerinde değişiklik yapan diğer geliştirici depodan güncelleme yapmadan aynı satırları değiştirmiş ise dosyaları depoya göndermek istediğinde çakışma durumu meydana gelir. Çalışmalar dosyada aşağıdaki şekilde işlenir. your changes ======= code merged from repository >>>>>>> revision filename.ext.mine : <<<<<<< filename Bu dosya çalışma olmadan önce depoda mevcut olan dosyadır. Bu dosyada çalışma mimleri yer almaz ve en son güncelleme yapılmadan önceki halini barındırır. filename.ext.rOLDREV : Çalışma kopyası dizinimize sağ tuş tıkladığımızda TortoiseSVN Menüsü altında Show log seçeneğini seçtiğimizde karşımıza log messages penceresi açılır. Pencerenin en üstünde tarih kutucuklarından görmek istediğimiz tarihi seçerek o iki tarih aralığına ait proje ile ilgili işlemleri görebiliriz. Yine üstteki arama kutusu ise bir kullanıcı adı, dosya başlığı ya da bir metin ile ilgili işlemin arama yapılmasını sağlamaktadır. Ortadaki kutuda yapılan işlemler, alttaki kutuda ise işlemin üzerine tıkladığımızda değişiklik yapılan dosyalar görüntülenmektedir. Dosyada son düzenlemeleri yapmadan önce depodan aldığımız dosyadır. filename.ext.rNEWREV : Çalışma dosyasını güncellediğimiz sırada subversion un sunucudan aldığı dosyadır. Dosya üzerindeki çakışmalar kontrol edilip orijin dosya gerektiği gibi güncellendikten sonra çalışma kopyası dizinine sağ klik yaprak TortoiseSVN tıklanır ve Resolve komutu çalıştırılır. Son Tortoise SVN in en basit hali ile kullanımı bu şekildedir. Tabii ki de sadece bu kadar la kalmayan bir sürü özelliği bulunan yazılımı kısaca en temel kullanım biçimi ile özetlemeye çalıştım. Herhangi bir sorunuz olursa bana Facebook grubundaki PHP-TR grubundan ulaşabilirsiniz. Örnek olarak değişiklik yapılmış bir işleme tıklıyoruz ve aşağıdan test.php dosyasına sağ tuş tıklayarak Show changes diyoruz ve karşımıza kullanıcının bu dosya üzerinde ne gibi değişiklikler yaptığını gösteren bir ekran geliyor. Değişiklik yapılan kısımlar sarı olarak işaretleniyor. 8 Çalışma Kopyasını Temizlemek Sunucu taraflı tamamlanmayan subversion komutlarından dolayı çalışmamız bazen tutarsız hale gelebilir ya da komutlar istediğimiz sonuçları Bir dahaki makalede görüşmek üzere. Berk Çekişbaş berkcekisbas@gmail.com İOSOB Yazılım Uzmanı & Sistem Yöneticisi BİR YAZILIMCI ŞİRKETTEN NEDEN AYRILIR? Ceyda Anıl Hangi sektörde çalışıyor olursanız olun, IT departmanı şirketin en değerli departmanlarından biridir. Özellikle internet sektöründe faaliyet gösteren bir şirkette çalışıyorsanız, yazılımcılar çok daha değerlidir. Dinamikliğin oldukça yoğun olduğu, her gün farklı teknolojilerin geliştiği günümüzde, bir web sitenin neden ne olursa olsun açılmaması ya da kod hatası ile çalışmaması, şirkette negatif enerjinin yayılmasına neden olur. Bu durumda sorumluluk yazılımcıların üzerine yüklenecektir. İnsanoğlu önyargıda bulunmayı çok sever. Sık iş değiştirmiş bir yazılımcı ile karşılaşıldığında “ya hemen giderse?” şüphesi uyanır. Aidiyet duygusu yaratmak ve çalışılan atmosferi keyifli kılmak yönetimin elindedir. Çalışana değer verilmiyor ve motivasyonu sağlanmıyorsa yazılımcıyı o şirkette daha fazla tutamazsınız. Peki, bir yazılımcı işinden neden ayrılır? : • Esnek çalışma saatlerinde, gecesini gündüzüne katıp çalışırken, “sabah erken gelmelisin” ya da “geç kaldın” uyarısını duyuyorsa • Projeleri tamamladığında olumlu tepki vermeyip, eksik ya da hatalı çalışmalarında negatif eleştiriyle karşılaşıyorsa, • Rahat ve verimli çalışmasına neden olan kıyafetlerine karışılıyorsa, • Verilen proje veya çalışmayı yaparken farklı departmandaki bir çalışma arkadaşı işine karışıyorsa, 9 • Bağlı olduğu yöneticisinin ya da ekip liderinin agresif ve negatif tepkilerini görüyorsa, • Takım Lideri olmayı ya da projeyi yönetmeyi beklerken hiç beklemediği bir anda üstüne bir yönetici getiriliyorsa, • Yaptığı çalışmalar monotonlaşmışsa, • Çalıştığı şirkette kendisini daha geliştirebileceğini düşünmüyorsa, fazla • İnisiyatif almak isteyen biriyse ve yapmak istedikleri yaptırılmıyorsa, • Fikirlerini dile getirirken önemsenmediğini ya da alay edildiğini düşünüyorsa, • Huzurlu bir çalışma hissetmiyorsa, • Şirketin vizyonu ile örtüşmediğini görüyorsa, ortamında kendi olduğunu vizyonunun • Maddi kazancı tatmin etmiyorsa, • Bulunduğu konumdan daha düşündüğü bir teklif aldıysa iyi olduğunu Unutmamalı, sık iş değiştirmek, yazılımcının başarılı ya da başarısız olduğunu göstermez. Yapılan araştırmalara göre bir şirkette verimli çalışma süresi ortalama 3 yıldır. Çünkü uzun yıllar çalışmak çalışanın yeteneklerini köreltir ve bakış açısını daraltır, kısa süreli çalışma ise güvensizliğe neden olur. Ancak internet sektöründe IT departmanı için böyle bir varsayımda bulunmak oldukça güçtür. Startup kültüründeki çalışma ile kurumsal şirketteki çalışma farklılık gösterir. Bu nedenle deneyim yılı baz alınarak değerlendirme yapmak yerine, çalışılan şirketlere ve yapılan projelere bakmak çok daha sağlıklı olacaktır. Ceyda Anıl 10 www.ceydaanil.com E-nerjik PHP ile MemCached Ayhan Barış MemCached (http://memcached.org) 2003 yılında LiveJournal (http://livejournal.com/) için yazılmış ve geliştirilmesi devam eden açık kaynak kodlu, yüksek performanslı, dağıtık mimaride çalışabilen bir önbellekleme sunucu sistemidir. MemCached ile sürekli ihtiyacınız olan dizileri, program ayar verilerini, uzun süren MySQL sorgu sonuçlarını önbellekleyerek yazılımınızın çok daha hızlı çalışmasını sağlayabilirsiniz. MemCached kullanan büyük oyuncular; • • • • • • • • • • • • Kullanımı ayhanbaris@gmail.com Limango LiveJournal Wikipedia Flickr Bebo Twitter Typepad Yellowbot Youtube Digg WordPress.com Craigslist MemCached ‘in depolama stili key-value (anahtar kelime – yüklenen değer) şeklindedir. Hafızada durmasını istediğiniz değere bir key tanımlarsınız ve bu key’e değer set edersiniz. Örnek key-value; kullanmasında kullanılır. MemCache ise PHP’nin MemCached sunucusuna bağlanan, değer set eden, anlık durum bilgisi gösteren yani MemCached üzerinde işlemler yapan kütüphanesidir. Linux’da Kurulum MemCached sunucuyu yum veya apt-get ile kurabilirsiniz. İşletim sisteminiz 32bit ise 32bit versiyonunu kurun. # yum install memcached.x86_64 yada # apt-get install memcached MemCache client kütüphanesini PECL ile kurabilirsiniz. # pecl install memcache Linux’da MemCached Sunucuyu Başlatmak # memcached -d -m 512 -l 127.0.0.1 -p 11211 -u nobody key : iller value : Türkiyedeki tüm il listesi (İstanbul, Ankara, İzmir …) (d = daemon, m = memory (512MB), u = user, l = IP adresi, p = port) key : BanlanmisIpler Windows’da Kurulum value : array(‘1.1.1.1’,’2.2.2.2’,’3.3.3.3’) Öncelikle Win32 binary versiyonunu http://code.jellycan. com/files/memcached-1.2.6-win32-bin.zip adresinden indirin. Dosyayı c:\memcached dizinine açın. key : user5 11 value : user5’in tüm session verisi. MemCached TCP/IP üzerinde çalışan bir sunucudur. Sunucuya farklı programlama dilleri ğie bağlanılabilir. Örneğin PHP ile değer set edip, JAVA yada başka bir programlama dili ile bu değeri okuyabilirsiniz. Bu yöntem genellikle hibrit sistemlerin ortak Session c:/memcached/memcached.exe -d install ile MemCached sunucuyu Windows’a servis olarak kurabilirsiniz. Windows’da MemCached Sunucuyu Başlatmak Kurulumları tamamladıktan sonra Apache’yi restart edin, phpinfo()’da MemCache kütüphanesini göreceksiniz. c:/memcached/memcached.exe -d start yada net start “memcached Server” Windows’da default olarak MemCached sunucu 64MB ile çalıştırılır. Ama 64MB az ve bunu değiştirmek için Registry Editörden; HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/memcached Server Artık hazır sayılırız. Bir cache sunucumuz var ve cache sunucusunda işlemler yapabileceğimiz bir kütüphanemiz. Artık MemCached 512MB ile çalışacak. memcache_ornek.php Kısmını bulun ve “ImagePath” kısmını şu şekilde değiştirin. 12 Windows’da WAMP kullanıyorsanız, PHP’nin MemCache client kütüphanesi için php_memcache eklentisini açın. Bu işlemi manuel olarak php.ini’yi düzenleyerek de yapabilirisiniz. <?php $memcache = new Memcache; $memcache->connect(‘127.0.0.1’, 11211) or die (“MemCached servera baglanilamiyor!”); $cachelenecekVeri = “istanbul,ankara,izmir”; /* * MemCached’e veri gönder. * iller = key * $cachelenecekVeri = veriler * false = 3. parametre sıkıştırma * parametresidir, true olduğunda * veriler sıkıştırılarak saklanır * 100 = 4. parametre saniye * olarak cachleme süresidir */ $memcache->set(‘iller’, $cachelenecekVeri, false, 100); /* * MemCached’den veri al. */ $cachedekiDeger = $memcache->get(‘iller’); var_dump($cachedekiDeger); ?> Genel Memcache Kullanım Algoritması: $data[] = $sira->ad; } # db’den gelen veriyi cache’e yaz , 3600 = 1 saat $memcache->set(‘iller’, $data, false, 3600); } else { echo “data cacheden geliyor...<br>”; } # veriyi kullan print_r($data); ?> Dikkat Edilmesi Gerekenler • Memcache bir cache sistemidir. Verilerinizin kaybolabilir! • Memcache’de key (anahtar kelime) en fazla 250 karakter olabilir. • Cache’lenen veri en fazla 1MB olabilir. 1MB üzerinde veri saklayacaksanız sıkıştırma parametresini “true” yapın. Sıkıştırılan veri önbellekten okununduğunda açılması gerekir ve bu sıkıştırma/açma işlemi CPU maliyeti oluşturur, unutmayın. Senaryo 1: İlk ziyaretçide cache boş olacak. Sayfa ziyaretçisi “Evet” adımından devam edecek ve asıl kaynağından veriyi alıp sistemde cache verisini oluşturtacak. Senaryo 2: İkinci ziyaretçide cache dolu olduğu için “Hayır” adımından ilerler ve verileri asıl kaynağından değil cache’den alır. • Memcache’de cache için ayrılan alan hiçbir zaman dolmaz. Eğer sürekli veri set ediyorsanız ve yer kalmadı ise otomatik olarak en eski verinin üzerine yazılacaktır (LRU). • x86 ve x86_64 farkı: x86 mimaride cache için ram’de en fazla 4GB ayırabilirsiniz. x86_64 mimaride 16.8 milyon terabyte’a kadar desteklemektedir. Kaynaklar http://www.php.net/memcache http://memcached.org/ http://en.wikipedia.org/wiki/Memcached 13 memcache_sql_ornek.php <?php # MemCached’e baglan $memcache = new Memcache; $memcache->connect(‘127.0.0.1’, 11211) or die (“MemCached servera baglanilamiyor!”); # cache’den veriyi almaya calis $data = $memcache->get(‘iller’); if ($data === false) { # eger donen deger FALSE ise cachede veri yoktur # db’den veriyi al ve cache’e yaz echo “data asıl kaynaktan geliyor...<br>”; mysql_connect(“localhost”,”root”,””); $data = array(); $SQL = “SELECT ad FROM iller”; $sorgu = mysql_query($SQL); while ($sira = mysql_fetch_object($sorgu)) { Ayhan Barış ayhanbaris@gmail.com PHP İLE REGULAR EXPRESSION (REGEX) Musa Avcı Regular expression (regex) Türkçesiyle düzenli ifadeler metinlerde bir biçimsel dil kullanarak tarif edilen kısımları seçip ayırmamıza yarayan bir programdır. Neredeyse bütün programlama dillerinde kullanılan regex ile metinlerde ayrıştırmak istediğiniz her şeye ulaşabilirsiniz. Örneğin günümüzde en çok içerik çalma botlarında kullanılır. Fakat yazı düzeni sağlamak ya da metinlerde aranan ifadelere ulaşıp onları manipüle etmek için de kullanabilirsiniz. Bu yazıda öncelikle regex desenlerini denemek için bir kaç kullanışlı site paylaşacağım, sonrasında temel ihtiyaçları karşılayacak ve en çok kullanılan regex desenlerinden ve bunları PHP ile nasıl kullanacağımızdan bahsetmeye çalışacağım. 14 Giriş Yazı boyunca göstereceğim desenleri deneyebilmek için anlık işlemler yapabilen ve her regex çalışmamızda tarayıcımızın bir tabında açık olması gereken bu siteleri mutlaka yer imlerinize ekleyin. Regex101 http://regex101.com/ (Favorim) Rubular http://rubular.com/ Gethifi Regexp Tool http://www.gethifi.com/tools/regex RegExr http://gskinner.com/RegExr/ Hoşunuza giden bir tanesini açın ve verilen örnekleri canlı bir şekilde deneyerek d2aha iyi kavrayın. Bir Kelime Aramak Regex ile yapılabileğimiz en basit işlem kelime aramaktır, bunun için direkt aramak istediğimiz kelimeyi yazmak yeterli. Örnek olarak düzenli ifademize “elma” yazıyoruz. Ve elde edeceğimiz sonuçta elma kelimelerinin seçildiğini görebilirsiniz. Örnek düzenli ifade: elma Metin ve sonuç: Bu deneme amaçlı yazılmış ve içerisinde elma geçen öylesine bir metin. Yukarıda kırmızı renkle işaret edilen kelime, yazdığımız ifadenin yakaladığı kelimenin göstergesidir. Bundan sonraki örneklerde de elde ettiğimiz sonuçları böyle göstereceğim. Özel Karakterler Düzenli ifadelerde bolca anlam ve ifade içeren özel karakterler vardır. Asıl yapmak istediklerimizi bunlarla ifade edip istenilen sonuca ulaşırız. Öncelikle bu karakterlerin ne olduklarına bakalım, sonrasında da nasıl kullanıldıklarını örnekler ile deneyelim. Düzenli İfadelerde Kullanılan Özel Karakterler: Karakter Açıklaması \d Herhangi bir rakamı ifade eder . Satır başı hariç herhangi bir karakteri ifade eder \w Herhangi bir harfi, rakamı veya alt tireyi ifade eder \s Herhangi bir görünmez karakteri ve boşluğu ifade eder. (Boşluk, tab, satır başı gibi) ^ Başlangıcı ifade eder $ Sonu ifade eder * Kendinden önce yazılmış karakterin; sıfır veya daha fazla tekrar etmesini ifade eder + Kendinden önce yazılmış karakterin; bir veya daha fazla tekrar etmesini ifade eder ? Kendinden önce yazılmış karakterin; olsa da olur olmasa da olurunu ifade eder {123} Kendinden önce yazılmış karakterin; parantez içerisine yazılan sayı kadar tekrar etmesini ifade eder {1, 2} Kendinden önce yazılmış karakterin; parantez içerisinde yazılan iki sayı arasında tekrar etmesini ifade eder (…) Parantez içerisine yazılan ifadeleri gruplamaya yarar (…|…) [ ... ] \ Parantez içerisine yazılan “|” dik tire işareti ya da anlamına gelir, içerisine yazılan ve dik tire ile ayrılan ifadelerden herhangi birisinin eşleşmesini ifade eder Köşeli parantez içerisine yazılan karakterlerden bir tanesini ifade eder Kaçış karakteri. Yukarıda yazdığımız karakterleri normal olarak yazmak istediğimizde başına kaçış işaretini koyarız. Örneğin noktayı ifade etmek için \. \D Rakam olmayan herhangi bir karakteri ifade eder \S Görünmez ve boşluk olmayan karakteri ifade eder \W Harf, rakam veya alt tire olmayan karakteri ifade eder \b Kelimenin başını veya sonunu ifade eder [^ ... ] Üç nokta yerine yazılan karakterler haricindeki karakterleri ifade eder [a-z] A dan z’ye olan harflerden birisini ifade eder 15 Regex Ayarları Regex desenleri iki “/” (bölü) işaretinin arasına yazılır. Sondaki bölü işaretinden sonra isteğe bağlı olarak regex ayar karakterleri girilir. Ayar karaktleri: Karakter Açıklaması i Büyük küçük harfe duyarsız olur g İlk eşleşmede durmaz, kapsamlı tarama yapar s Satır başı hariç her şeyi ifade eden nokta karakterinin satır başını da ifade etmesini sağlar m ^ ve $ karakterlerinin her satırın başını ve sonunu ifade etmesini sağlar Örnek Kullanımı: /elma/i Bu örnekte büyük ELMA, küçük elma ya da ElMa şeklinde yazılanları da büyük küçük harfe aldırmadan yakalar. Yukarıdaki örnek selma, elmas gibi kelimelerin içerisindeki “elma”ları da bulacaktır. Eğer sadece elma kelimesini aramak istiyorsak kelime başı ve sonunu ifade eden \b kullanacağız. /\belma\b/gi Şimdi sadece elma kelimesini bulacağız, selma, elmas gibi diğer elma içeren kelimeleri yakalamayacaktır. Sayıları Yakalamak Gelelim şimdi yukarıdaki tabloda listelediğimiz karakterlerin örnek kullanımına. Girilen içerikte sadece sayıları bulmak için “\d” ve “+” karakterlerini kullanacağız. /\d+/g Bu örnek sadece 1234, 321 789 sayılarla eşleşir. “g” ayarı ile de bir kere değil kapsamlı aramasını ifade ettik. Bir veya daha fazla tekrarı ifade eden “+” karakterinin başına herhangi bir rakamı ifade eden “\d” yazdık. Daha işe yarar bir örnek için girilen içerikteki tarih formatında yazılmış ifadeyi yakalayalım. /(\d{2}\.\d{2}\.\d{4})/g İfadenin karışık görünmesi sizi korkutmasın, ilgili yerlerden inceleyerek ayıkladığınızda ne olduğunu daha rahat özetleyebilirsiniz. \d{2} 2 rakamı, sonrasında \. kaçış karakteri ile noktayı, son kısımda ise 4 rakamı ifade ettik. Böylece 10.08.2013 gibi bir içerikle eşleşecektir. Kelimeleri Yakalamak Yukarıdaki örnekle benzer bir ifade ile yapabiliriz. 16 /(\w+)/g \w ifadesi herhangi bir harfi ifade ettiğini söylemiştik fakat Türkçe karakterlerin bu ifade için istisna olduğunu bilmeniz gerekiyor. Eğer Türkçe bir içerikle çalışıyorsak yapmamız gereken ifade şöyle olmalı; /([a-zA-ZÇŞĞÜÖİçşğüöı]+)/g Bu ifade ile Türkçe kelimeleri de yakalayabiliriz Küçük ve büyük a’dan z’ye harlerin yanına Türkçe’de olan küçük ve büyük harfleri ekledik. Bir diğer örnek olarak da içerikten sadece istenilen bir kelimeyi almayı deneyelim. /benim adım (\w+)/gi Merhabalar benim adım Musa! Başlangıç Ve Sona Göre Yakalama ^ ve $ karakterleriyle başının ya da sonunun nasıl olacağını ifade edebiliriz. Örnek olarak sadece selam ile başlayan içeriği ayıklamayı deneyelim. /^selam/ Bu örnek metin selam ile başlamadığı için hiç bir şeyle eşleşmeyecektir selam! bu örnek daha samimi olduğu için eşleşecektir Selam ile başlayan ve hoşçakal ile biten metnin arasında geçenleri yakalayacak bir örnek daha; /^selam(.+)hoşçakal$/ selam buralar yakalanacak hoşça kal Düzenli İfadeleri Php İle Kullanmak Gelelim bu faydalı işlemleri PHP üzerinde kullanmaya. Bunun için bir kaç faydalı fonksiyon ile tanışacağız. İfadenin Eşleşip Eşleşmediğini Kontrol Etmek preg _ match() fonksiyonu ile yazdığımız ifadenin verdiğimiz içerikle eşleşmediğini kontrol edebiliyoruz. Örnekte girdinin geçerli bir saat formatı olup olmadığını kontrol edeceğiz. $pattern= ‘/^([01][0-9]|[2][0-3]):[0-5][0-9]:[0-5][0-9]$/’; $content = ‘23:15:59’; if(preg_match($pattern, $content)) { echo ‘Doğru bir saat girilmiş’; } else { echo ‘Yanlış bir saat formatı girilmiş’; } Eğer ifade metin içerisinde eşleşirse true aksi halde false döner. 17 Yazdığımız ifadenin açıklamasını da merak ediyorsanız; öncelikle ^ ile metnin başını ifade ettik, yani tam olarak bizim istediğimiz gibi başlamalı. Sonunda da $ kullandık, bu sayede tam olarak bizim istediğimiz başlangıca ve sona sahip olan bir içeriği aradığımızı ifade ettik. Sonrasında ([01][0-9]|[2][0-3]) 2 ifadeyi gruplandırdık. Çünkü saat ya 01 den 19’a kadar ya da 20 dan 23’e kadar olabilir. Eğer [0-9]{2} şeklinde 0 ile 9 arasında 2 sayı ile eşleş deseydik, 99 gibi 23’den büyük sayılara da eşleşirdi. Yakalanan İçerikleri Almak Düzenli ifadelerde yakalamak ve ayırmak istediğimiz içeriklerin ifadelerini parantez içerisinde yazarız. Parantez içerisine yazılan ifadelere eşleşen içeriklere preg_match_all fonksiyonu sayesinde ulaşacağız. Bu fonksiyon tüm içeriği taramasını sağlayan “g” ayarını içerir, yani preg_match_all kullanırken “g” (global) ayarını yazmanıza gerek yok. Teorik bilgi ve örneklerin haricinde biraz gerçek hayattaki kullanımlarına bakarak daha iyi kavrayabileceğimizi düşünüyorum. Bir sitenin kayak kodundan title etiketi arasında yer alan site başlığını yakalamak için şöyle bir ifade yazabiliriz. $pattern = ‘/<title>(.+)<\/title>/i’; $content = file_get_contents(‘http://www.phpr.org’); preg_match_all($pattern, $content, $results); print_r($results); Ekran çıktısı şöyle olacaktır; Array ( [0] => Array ( [0] => <title>php serüvenleri - PHP dersleri, PHP örnekleri, PHP kodları</title> ) [1] => Array ( [0] => php serüvenleri - PHP dersleri, PHP örnekleri, PHP kodları ) ) $results değişkenindeki dizinin ilk elemanı; girilen ifade ile eşleşen içeriklerin dizisini verir. Sonraki elemanları ise parantezler ile grupladığımız ifadelere eşleşen içeriklerin dizisini verir. Yani bizim asıl ihtiyacımız olan title etiketleri arasında parantez içerisine aldığımız karakterleri almak için 2. elemana bakacağız. İkinci elemanda kendi içerisinde bir dizi, yani eğer birden fazla eşleşme olursa onları da sırayla verecektir. Düzenli ifadeleri kullanarak içeriği değiştirme Yine kullanışlı bir örnek ile açıklayalım. Girilen metin içerisine düz bir şekilde yazılan URL’leri HTML formatında link yapalım. Bunun için öncelikle bir URL’yi ifade edecek olan desen lazım. Ben internette hazır örneklerden birisini seçtim, dilerseniz siz de diğerlerine http://regexlib.com/Search.aspx?k=URL adresinden bakabilirsiniz. preg_replace fonksiyonu ile eşleşen ifadelerde yine parantez içinde grupladığımız ifadeleri istediğimiz şekilde değiştirebiliriz. // URL’leri yakalayan desen $pattern=‘(https?:\/\/(([a-zA-Z0-9]([a-zA-Z0-9-]{0,61} [a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}\/?[^\b\s]+))’; $content = ‘Diğer PHP serüvenlerine http://www.phpr.org adresinden bakabilirsiniz’; $replace = ‘<a href=”$0”>$1</a>’; echo preg_replace($pattern, $replace, $content); 18 Ekranda düz yazı ile yazdığımız URL’nin link olmuş hali yazar; Diğer PHP serüvenlerine www.phpr.org adresinden bakabilirsiniz Daha Fazlası İfade Gruplarını Yakalamamak Yukarıda özellikle yakalamak istediğimiz ifadeleri parantez içine almamız gerektiğini söylemiştim. Fakat her parantez içine aldığımızı yakalamak istemeyebiliriz. Bunun için parantezleri (?: ... ) şeklinde kullanabiliriz. Böylece bu parantezin yakaladığı içerik sadece çalışırken kullanılır, sonuçta gösterilmez. /(\w+@\w+(?:\.\w+)+)/ E-mail adresini ifade eden desende iki grubumuz var, fakat içerideki grubu sonuçta almamıza gerek yok. İfadeyi çalıştırdığımızda sadece mail adreslerini veren bir dizimiz olacak. İfade gruplarını isimlendirme Yukarıdaki örnekte gereksiz parantezleri almayıp elde ettiğimiz sonucu biraz daha düzene sokmuş olduk. Şimdi ise bu gruba isim vererek daha da düzeni sağlayabiliriz. Grupları /(?<grupismi>ifade)/ şeklinde isimlendirebilirsiniz. $pattern = ‘/(?<email>\w+@\w+(?:\.\w+)+)/i’; $content = ‘Bir kaç adres: elma@manav.com, yarimkilo@kasap.com, ates@askeriye.com’; preg_match_all($pattern, $content, $results); print_r($results[‘email’]); Çıktı: Array ( [0] => elma@manav.com [1] => yarimkilo@kasap.com [2] => ates@askeriye.com ) Hiç dizi elemanlarının hangisi benim ihtiyacım olandı diye uğraşmadan direkt isim verdiğimiz grubun yakaladığı içeriklere ulaşabiliriz. Hava Durumu Yine pratik bir örnek ile meteoroloji sitesinden İstanbul için günlük hava durumunu yakalayan bir desen hazırlayalım. Bu tür işlerin püf noktası aradığımız içeriği çevreleyen eşsiz desenleri görmek. İstanbul için günlük hava durumunu veren sayfa; http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=ISTANBUL 19 Sayfanın kaynağını açıp aradığımız sıcaklığın hangi HTML etiketleri arasında olduğuna bakıyoruz. $content = file_get_contents(‘http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m=ISTANBUL’); // Derece preg_match_all(‘/<em class=”renkMin zemimeZ”>(.+)C<\/em><\/td>/si’, $content, $results); // İlk eşleşeni alıyoruz $degree = $results[1][0]; // Hava durumunun ikonu ve açıklaması preg_match_all(‘/”([\wÇŞİĞÜÖöçşğüı ]+)” rowspan=”2”><img src=”\.\.([\w\/\.-]+)”/si’, $content, $results); $description = $results[1][0]; $image = ‘http://www.mgm.gov.tr‘ . $results[2][0]; echo $degree . ‘ ‘ . $description; echo ‘<img src=”’ . $image . ‘” />’; Ekranda hava durumunu görürüz. Musa Avcı Daha yeni başlıyoruz. Aşağıdaki faydalı kaynakları da inceleyip kurcalamanızı öneriyorum. @musa_avci www.phpr.org regexlib.com Wikipedia http://en.wikipedia.org/wiki/Regular_expression regular-expressions.info 30 dakikalık Regex öğretisi http://www.codeproject.com/Articles/9099/The-30Minute-Regex-Tutorial Regex için 30 kullanışlı araç http://www.hongkiat.com/blog/regular-expressiontools-resources/ Uzun bir yazı oldu ama neresinden dalarsanız dalın faydalanabileceğinizi düşünüyorum. Ben de yazıyı hazırlarken bir çok yeni şey öğrendim bu nedenle size teşekkür ediyorum. Big Data* * Burayı okuduğuna göre büyük işlerle uğraşmak istiyorsun. Eğer buna bir adım 20 daha yaklaşmak istersen info@sociaplus.com adresinden bize ulaşabilirsin. SOCIAPlus PHP5-FPM + NGINX ile COUCHBASE NOSQL DATABASE KULLANIMI baransakallioglu@gmail.com İçerik Bu yazıda sizlere sıfırdan Couchbase kurulumu, Nginx kurulumu ve PHP5-FPM kurulumunu ve Couchbase PHP SDK kurulumunu anlattıktan sonra PHP SDK kod örneği ile Couchbase’de neler yapabileceğimizden kısaca bahsedeceğim. Couchbase Nedir Couchbase nedir diye tanımlamak isteyecek olursak, Couchbase JSON döküman yönelimli key-value NoSQL veritabanı sistemidir. Projenin tarihçesi ise şöyle: Apache CouchDB Damien Katz tarafından geliştirilen açık kaynaklı veritabanı sistemiyken Chris Anderson ve Jan Lehnardt ile beraber CouchOne Inc. firmasını kurarlar. O sıralarda başka bir key-value veritabanı sistemi olan Membase de popülerlik kazanır ve 2011 Şubat ayında CouchOne ve Membase Inc. birleşerek şu anki Couchbase fikri ortaya çıkar. CouchDB’nin döküman tabanlı data modeli, indexleme ve sorgulama yetenekleriyle, Membase’in kolay ölçeklenebilirlik ve her zaman online olma özellikleri bu şekilde bir araya gelmiş olur. Şu anda da Couchbase hem open source hem de enterprise olmak üzere iki şekilde dağıtıma sunulmaktadır. 21 Couchbase Kimler İçin Uygundur Couchbase interaktif web uygulamaları için üretilmiş NoSQL döküman veritabanıdır. Esnek data modeline sahiptir, kolaylıkla ölçeklenebilir ve yüksek performans sağlar. Dağıtık sistemi sayesinde her zaman online servis verebilecek şekilde dizayn edilmiştir. Siteniz veya uygulamanız yüksek hit alyorsa, klasik relational database sistemleri bu yükü kaldırmaya yetmiyorsa Baran Sakallıoğlu (MySQL gibi) veya Memcache cache de kullanıyorum ama buna güzel bir web arayüzle ulaşabilsem istatistikleri anlık görebilsem diyorsanız Couchbase sizin için güzel bir çözüm olacaktır. Dezavantajı veriyi öncelikle RAM’de saklama şeklinde çalıştığı için hosting maliyeti klasik sistemlere göre biraz daha fazla olacaktır. Couchbase Veri Yapısı ve Mimarisi Couchbase’de objeler ve onların ilişkilerini saklamak için JSON döküman formatı kullanılır. Böylece veri şeması değişiklikleri kolaylıkla yapılabilir. Aynı tür objeler için bile farklı veri yapıları kullanılabilir. Başlangıçta bir kullanıcı için sadece kullanıcı adı alanı tutarken sonra JSON field olarak ad soyad eklemek gibi. Couchbase cluster’a yeni bir makine eklemek ve çıkarmak oldukça basit bir işlemdir. Aynı zamanda clusterlar arası yedekleme ile herhangi bir lokasyonda problem olduğu zaman başka bir lokasyondaki cluster kullanılmaya devam edilebilir. Veriyi dağıtma işlemini Couchbase otomatik olarak yapar. Uygulama seviyesinde herhangi bir ekstra efor sarfedilmez. Veri ön planda kullanılan Memcache ile RAM’de tutulduğu için oldukça hızlı bir sistemdir. Couchbase kurulu olan her bir makine node olarak tanımlanır. Node fiziksel bir makine olabileceği gibi VPS veya bir Amazon Cloud instance da olabilir. Clusterdaki tüm node’lar birbirine eştir, aynı fonksiyonaliteyi sağlar ve aynı bileşenlere sahiptir. Master-slave ilişkisi yoktur. Her yeni eklenecek makine ile beraber Couchbase lineer olarak RAM ve disk kapasitesini artırır. Couchbase’de veriler bucket ismi verilen yapılarda tutulur. Bunları MySQL’deki veritabanı gibi düşünebiliriz. İki tür bucket bulunur, biri Couchbase bucket öbürü ise Memcached bucket. Memcached bucketlar alışık olduğumuz cache sistemiyle birebir aynıdır. Couchbase bucketlar ise Memcached bucketlara ekstra olarak veriyi kalıcı olarak diskte saklar, node’lar arası replication sağlar ve bu özelliğiyle herhangi bir node işlem görmediğinde rebalance denilen işlem ile beraber veri kaybını önler. Couchbase bucketlarda key başına saklanabilecek maksimum veri miktarı 20 mb. Couchbase ön planda veri yazma ve okuma işlemlerini için Memcache katmanını kullanırken, her bir node üzerindeki birden fazla thread ile veriyi aynı zamanda diske yazar. Böylece cluster’a yazılan herhangi bir veri client’ı bloklamadan önce yazma kuyruğuna atılır ve sırası geldiğinde diske kalıcı olarak yazılır. Couchbase client’dan istek gelmedikçe veya key geçerlilik süresi geçmediği sürece veriyi kesinlikle diskten silmez. Olası bir makine reset durumunda veriler tekrar diskten RAM’e aktarılır. Warm-up ismi verilen bu süreçten sonra node tekrar aktif olarak işlev görmeye devam eder. Couchbase sık kullanılan verileri RAM de tutarken LRU algoritmasıyla (en nadir kullanılan) veriler RAM’den diske yazılır. Bu otomatik işlem Ejection olarak geçer. Eğer sadece memcached bucket kullanılır ve ram yetersiz gelmeye başlarsa bu aynı işlem devam eder ve memcached bucketlarda kalıcı olarak veri saklama olmadığı için veri kaybı oluşur. Bu işleme ise Eviction denir. Genel olarak Couchbase mimarisi ve kavramları anlattığımıza göre basit bir uygulama örneği ile bu kavramları canlı olarak görmenin vakti geldi :) Couchbase Kurulumu Couchbase’i Linux (Debian, Centos, RHEL, Ubuntu), Windows (32-64 bit) MacOSX işletim sistemlerinden herhangi birine kurabilirsiniz. 22 Bu yazıda DigitalOcean cloud hostingden alınan iki adet VPS makine üzerinde (512mb ram 1 çekirdek) Ubuntu 12.04LTS 64 bit ve Couchbase Community Edition kurup, bir tanesini aynı zamanda web server (nginx + php5 fpm + couchbase php extension) olarak kuracağım. Eğer siz farklı bir linux dağıtımı, Windows veya MacOSX kullanıyor iseniz kaynakçada bulunan linklerden installation tutoriallara ulaşabilirsiniz. bir makine ile 16gb ramli bir makineyi aynı clustera eklediğimizde kota olarak maksimum 6-7gb kadar ram verebileceğimiz için 16gb ramli makinenin çoğu boşa gitmiş olacaktır. İki adet sanal makineyi DigitalOcean üzerinde oluşturduk. Benim konfigürasyonda makine isimleri ve ipler şöyle Couchbase1 ipsi 192.241.146.89 Couchbase2 ipsi 192.241.151.198 İki makineyi de ssh ile bağlandıktan sonra apt-get update ile repository’leri güncelliyoruz. Bu esnada continue y/n şeklineki sorulara y basıp enterlıyoruz. Daha sonra apt-get dist-upgrade ile sistemi güncelliyoruz. Karşınıza pembe bir ekran çıktığında install the system maintainers version seçeneğini (en üstteki) ok tuşları ile seçip enter’a basıyoruz apt-get upgrade son upgradeleri yapıyoruz. Şimdi sıra couchbase kurmaya geldi. Couchbase ssl istediği için kurulumdan önce libssl yüklüyoruz. apt-get install libssl0.9.8 http://www.couchbase.com/download adresinden community edition 2.1.1 i indiriyoruz. 32bit veya 64 bit versiyona dikkat etmeyi unutmayın. 21 Eylül 2013 itibarıyle Ubuntu 12.04 64bit versiyonu indirmek için şu komutu çalıştırın wget http://packages.couchbase.com/ releases/2.1.1/couchbase-server-community_ x86_64_2.1.1.deb Kurulumu Başlatmak İçin Daha sonrasunda ufak bir kod yazıp, couchbase cluster’a php ile bağlanma, temel methodları kullanmayı göstereceğim. dpkg -i x86_64_2.1.1.deb Herhangi bir production senaryosu için Couchbase’in önerdiği en düşük konfigürasyon 4 çekirdekli işlemci ve 8gb RAM olduğunu unutmayın Makinelerin aynı ağ üzerinde bulunmaları da performans artışında önemli bir etken. Hatta hard disk olarak SSD kullanırsanız diske yazma ve okuma işlemlerinde önemli bir performans artışı sağlayabilirsiniz. komutunu çalıştırıyoruz. Böylece debian package manager bizim için kurulumu gerçekleştiriyor. Herhangi bir hata ile karşılaşmadıysanız ‘You have successfully installed Couchbase Server’ yazısını görmeniz gerekiyor. Bu yazıyı gördükten sonra tüm işlemleri ikinci makine için de yapıyoruz. Couchbase’de ilk kurulum esnasında cluster RAM kotası soracağı için, makinelerin aynı konfigürasyonda olmasına dikkat etmek gerekiyor çünkü 8gb ramli couchbase-server-community_ İki makinemiz de hazır olduğuna göre cluster kurma işlemine başlayabiliriz. Burdan sonraki kurulumu tamamen web panel üzerinden yapacağız. Couchbase 8091 portundan bir web erişimi sağlıyor. http://192.241.146.89:8091 adresinden ilk makineye bağlanıyoruz. Bu makinede start clusterı başlatıp ikinci makinede join cluster işlemini yapacağız. Buradaki setup tuşuna basıyoruz. Databases path ve indices path alanını isterseniz değiştirebilirsiniz fakat ben default olarak bırakıyorum. Hostname makinenizin ipsi olsun, Start a new cluster seçili olduktan sonra RAM quota default olarak Couchbase sistemdeki toplam ramin %60ını hesaplayarak seçiyor. Bu alanı da yanda yazan (256 - 393) maksimum kadar değiştiriyorum çünkü couchbase kendi önlem mekanizması olarak verilen RAM kotasının her zaman %80i kadarını kullanıyor. Böylece maksimum rami kullanabiliriz fakat başka uygulamalar da olacak ise kabaca sisteme ne kadar ram ayıracağınızı siz belirleyip dilediğiniz miktarı ayarlayabilirsiniz. Nexte basıp ilerliyoruz Create default bucket adımında bucket type kendi sistem gereksiniminize göre belirleyebilirsiniz. Eğer sırf memcached olarak kullanayım veriler yedekli durmasın makine reset olduğunda veri kaybının benim için bir önemi yok diyorsanız memcached bucket seçin. Ama tavsiyem couchbase bucket seçmeniz olacaktır. Per node ram quota’yı ilk adımda belirlediğimiz Cluster quota olarak seçin. Eğer daha sonra başka bucketler da açarım (aynı cluster üzerinde iki application için ayrı bucket. MySQL’deki veritabanı gibi düşünebilirsiniz.) RAM miktarını indirebilirsiniz. İki uygulamam olacak ve bunlar aynı yer seçsin diyorsanız Toplam ramin yarısı kadar bir değer girebilirsiniz. Şu anda tek uygulama olacağı için ben o değeri 393 olarak seçiyorum. Enable replica eğer data birden fazla node’da kopyalar halinde tutulsun istiyorsanız işaretli olsun. İleride çok daha fazla makine clusterda olabilir ve ekstra önlem almak istiyorum diyorsanız 3 ve üzeri makineli cluster yapılarında replication 2 olarak da seçebilirsiniz. 23 Şu anda 2 makine olduğu için replicayı işaretleyip 1 olarak bırakıyorum. Provision number of workers default 3 olarak bırakabilirsiniz. En alttaki flush’ı seçerseniz admin panelden bucket içindeki tüm verileri tek seferde silmek gibi bir opsiyona sahip olabilirsiniz. Ben test ortamı olduğu için bu seçeneği de işaretliyorum. Sample Data ve Sample Map Reduce ekranından dilerseniz kendi test bucket ve viewlarını sisteme kurabilirsiniz fakat ben bunları yüklemeden next ile ilerliyorum. Eğer updatelerdan haberdar olmak istiyorsanız son adımdaki tiki işaretli bırakıp alttaki forma email ad soyad ve firma bilgilerinizi girebilirsiniz. Ben hiçbirşeyi doldurmadan bu ekranı atlıyorum. Son adımda sistem bizden web panel için admin şifresi isteyecek. Test ortamı olduğu için ben “phpfil” olarak belirleyip geçiyorum. Alfanümerik zor bir şifre belirlemeyi unutmayın. Bu adımı da tamamladıktan sonra panelde şöyle bir ekran belirecek. Couchbase cluster’a her makine ekleme veya çıkarmada rebalance işlemi mutlaka yapılması gerekiyor. Rebalance kısaca clusterdaki verilerin içeride bulunan tüm makinelere yeniden dengeli bir biçimde dağıtılması. Sağ üstteki rebalance tuşuna basıyoruz. Rebalance işleminin bitmesini bekliyoruz. Ekrandaki gibi her bir node’un % olarak ne kadar işi kaldığını görebilirsiniz. Şimdi sıra ikinci makinemizi de cluster’a eklemeye geldi. Üstteki menüden server nodes’a tıklıyoruz. Add server butonuna basıyoruz. Server ip address kısmına ikinci makinenin ipsini yazıyoruz (Bu örnekte 192.241.151.198) password alanına ilk makinede belirlediğimiz “phpfil” şifresini giriyoruz. Siz tabi ki başka şifre belirttiyseniz onu girmeyi unutmayın. Confirm ekranını onaylayın. Sunuculuk kısımları bitirdikten sonra artık php ile bu sisteme nasıl bağlantı kullanabiliriz onun hazırlıklarına başlayabiliriz. Bunun için Couchbase1 makinesini webserver yapıyoruz. Nginx Webserver ve PHP5-FPM Kurulumu Önce nginx kurulumu ile başlayalım. En son sürümleri takip etmek için ubuntu launchpad repositorylerini kullanacağız bu yüzden python software properties’i kurmamız gerekiyor. SSH’dan aşağıdaki komutları çağırıyoruz. apt-get install python-software-properties Nginx ppa’sını sisteme ekliyoruz. add-apt-repository ppa:nginx/stable 24 Repo güncelleme ve nginx kurulumunu başlatıyoruz. Eklenen makine üzerinde eğer daha önceden bir couchbase kurulu ve üzerinde veri varsa hepsi silinir. Bizde sıfır makine olduğu için bu durum bir problem teşkil etmemekte. Eğer firewall veya kurulum problemi yaşamadıysanız ekranda pending rebalance göreceksiniz. apt-get update & apt-get install nginx. nginx –v ile sürümünüzü onayladıktan sonra (1.4.1 olmalı) service nginx start ile web sunucunuzu başlatabilirsiniz. http://192.241.146.89/ adresinden (tabi ki siz kendi ipnize bakın) nginx karşılama ekranını gördüyseniz php5-fpm kurulumuna geçebiliriz. Nginxdeki gibi son sürüm php5 kullanmak için gene ppa ekliyoruz. FTP veya shell yolu ile /usr/share/nginx/html klasörü altına ilk php dosyamızı kaydedelim. İçerisine sadece <?php phpinfo(); ?> olan phpinfo.php dosyamızı kaydedip DigitalOcean’da root bilgilerimizle FileZilla yardımı ile sftp kullanarak makinemize direk erişebiliriz. add-apt-repository ppa:ondrej/php5 Sonrasında repo güncelleme ve php install için apt-get update & apt-get install php5-fpm Şimdi sıra geldi php.ini dosyamızdaki cgi.fix_pathinfo değerini 0’a çekmeye. nano /etc/php5/fpm/php.ini ile cgi.fix_ pathinfo = 1 yazan kısmı 0a çevirip ctrl+x ve y basıp enterlıyoruz(kullanımı kolay olduğu için bundan sonraki dosya editlemeleri hep nano ile yapacağım. Tercihen vim’i de kullanabilirsiniz. ). /etc/php5/fpm/pool.d/www.conf komutunu çalıştırarak listen = 127.0.0.1:9000 satırını listen= /var/run/php5-fpm.sock olarak değiştirip üstteki nano örnekteki gibi kaydediyoruz. Eğer ayarlarda problem yok ise hiçbir değişiklik yapmadan devam edebilirsiniz. service php5-fpm restart ile phpyi tekrar çalıştırıyoruz. Sıra geldi web düzeltmeye. nano sunucumuzun nginx http://192.241.146.89/phpinfo.php adresinde php konfigürasyonumuzu gördüysek Web sunucu kurma işimiz de bitti demektir. Şimdi couchbase php sdk yükleme işlemlerine başlayabiliriz. Couchbase PHP SDK Kurulumu Bunun için önce couchbase c library yüklüyoruz. ayarlarını /etc/nginx/sites-available/default. Ayarları resimdeki gibi yapabilirsiniz. wget list -O/etc/apt/sources.list.d/couchbase. http://packages.couchbase.com/ubuntu/ couchbase-ubuntu1204.list ile c library repository listemize ekliyoruz. GPG keyi de sunucumuza ekliyoruz. wget -O- http://packages.couchbase.com/ubuntu/ couchbase.key | sudo apt-key add apt-get update & apt-get install libcouchbase2libevent libcouchbase-dev ile c library kurulumu tamamlıyoruz. php library için de aşağıdaki 4 komutu sırayla çalıştırıyoruz. 25 Servername example.com yerine localhost veya varsa yönlendireceğiniz site onun ismini domainadiniz.com şeklinde yazabilirsiniz. Ayarları kaydettikten sonra service nginx restart ile nginx yeniden başlatalım. apt-get install php-pear apt-get install build-essential apt-get install php5-dev pecl install couchbase php.ini dosyamıza extension=json.so, extension=couchbase.so satırlarını bu sıra ile ekliyoruz. bu yüzden aşağıdaki komutu çalıştırıp düzenlemeleri yapıyoruz nano /etc/php5/fpm/php.ini ve kaydediyoruz. php ve nginxi tekrar başlatıyoruz değişikliklerin geçerli olması için service php5-fpm restart service nginx restart. Eğer başarılı kurulduysa http://192.241.146.89/phpinfo. php adresinde couchbase sekmesi resimdeki gibi gözükmesi gerekiyor. Couchbase::SERIALIZER_JSON); //tüm keylerimizin başına phpfil_ ekliyoruz. $cb->setOption(Couchbase::OPT_PREFIX_KEY, “phpfil_”); //herhangi bir option değerini çekiyoruz. prefix key bize phpfil_ dönüyor. var_dump($cb->getOption(Couchbase::OPT_PREFIX_ KEY)); echo “<br/>”; //operasyonların timeout süresini 5 sn olarak ayarlıyoruz. $cb->setTimeout(5000); //timeout süresini ekrana bastırıyoruz. demin 5000 set ettiğimiz için şimdi de 5000 dönecek. echo $cb->getTimeout(); echo “<br/>”; //client versiyonunu ekrana bastırıyoruz. echo $cb->getClientVersion(); echo “<br/>”; //a keyine 101 değerini yazıyoruz $cb->set(“a”, 101); //a keyindeki değeri alıp ekrana basıyoruz. int(101) var_dump($cb->get(“a”)); echo “<br/>”; Şimdi de phpinfo.php ile aynı dizin altına gelecek couchbase.php dosyasını oluşturalım. Bu php dosyasında couchbase cluster’a bağlanıp, clusterda kaç makine var, bunların versiyonları nedir, obje yazarken serialize method olarak neyi kullanacağız, operasyonlarda timeout süremiz ne olacak, ve her script çalıştığında çoğul hiti sayacak şekilde increment işlemini yapacağız. <?php ini_set(‘display_errors’,’on’); //ilk parametre couchbase adresi, ikinci parametre kullanıcı adı, ikinci parametre şifre, üçüncü parametre bucket ismi. try { $cb = new Couchbase(“192.241.146.89:8091”, “”, “”, “default”); //bağlı olan serverları ekrana bastırıyoruz. var_dump($cb->getServers()); echo “<br/>”; 26 //sunucuların versiyonlarını bastırıyoruz var_dump($cb->getVersion()); echo “<br/>”; //obje serializer olarak json seçiyoruz. $cb->setOption(Couchbase::OPT_SERIALIZER, //testler bitti şimdi her sayfaya ziyareti kaydeden scriptimize başlayalım $dosya_adi = $_SERVER[‘SCRIPT_NAME’]; //key değerini 1 artırıyoruz, son parametredeki true eğer key daha önce yaratılmamışsa yaratmak için. increment bize +1 eklenmiş değer ne ise onu döndürüyor. var_dump($cb->increment($dosya_adi, 1, true)); echo “<br/>”; } catch(CouchbaseException $ce) { var_dump($ce); } ?> Sizin de admin panelini görmeniz için bir süreliğine bu iki makineyi açık tutacağım. Yazıdaki ip adresleri ve php dosyalarını sizler de çalıştırıp çıktıları inceleyebilirsiniz. Bir sonraki yazıda php sessionları couchbase’de tutma ve view ile bunlar üzerinde sorgu yapabilmeyi anlatacağım. O zamana kadar herhangi bir sorunuz olursa baransakallioglu@gmail.com adresinden bana ulaşabilirsiniz. KAYNAKLAR: http://www.couchbase.com/couchbase-vs-couchdb http://couchdb.apache.org/ http://docs.couchbase.com/couchbase-manual2.2/#couchbase-getting-started-prepare http://nginxlibrary.com/ubuntu-latest-nginx/ http://www.couchbase.com/ communities/php/getting-started https://www.digitalocean.com/community/ articles/how-to-install-linux-nginx-mysqlphp-lemp-stack-on-ubuntu-12-04 http://www.couchbase.com/ communities/c/getting-started http://www.couchbase.com/ communities/php/getting-started http://docs.couchbase.com/couchbasesdk-php-1.1/#php-method-summary Baran Sakallıoğlu 27 baransakallioglu@gmail.com linkedin.com/profile/view?id=128193862 ANGULARJS ugureski@me.com Uğur Eski Bu yazıda AngularJS’den giriş seviyesinde bahsedeceğim. AngularJS nedir, hangi durumlarda kullanmamız doğru olur gibi sorulara cevap vereceğim. Ve daha anlatımlarla birlikte örnekler sunacağım. AngularJS nedir? AngularJS Google tarafından desteklenen ve geliştirilen javascript kütüphanesidir. AngularJS yapı olarak MVC kullanır ve diğer javascript kütüphanelerinden ekstra olarak “Data Binding”, “Routing” ve “Templates” gibi özellikler barındırır. DOM manipülasyonlarının template’lere taşınması ile Single Page Application diye adlandırabileceğimiz uygulamalarda daha hızlı ve yönetimi kolay geliştirme yapmamıza olanak sunar. Hello Word! Örnek: <!doctype html> <html ng-app> <head> <script src=”https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js”></script> </head> <body> <div> <label>Name:</label> <input type=”text” ng-model=”yourName” placeholder=”Enter a name here”> <hr> <h1>Hello {{yourName}}!</h1> </div> </body> </html> 28 Örnekte angular “ng-app” yönergesi tetikleniyor. Ve daha sonrasında oluşturulan şablonu okuyarak çift yönlü olarak çalışmaya başlıyor. “ng-model” yönergesi ile input içeriği {{yourName}} ifadesine bağlanıyor. Bu şekilde angular anlık olarak veriyi inputdan okuyup yönergeye göre hareket ederek {{yourName}} ifadesinin olduğu yere değeri yazacaktır. Örnek: <!doctype html> <html> <head> <script src=”https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js”></script> <script type=”text/javascript”> var myApp = angular.module(‘myApp’, []); myApp.controller(‘MainCtrl’, [‘$scope’, function ($scope) { $scope.numbers = [10, 25, 35, 45, 60, 80, 100]; $scope.lowerBound = 42; $scope.greaterThanNum = function (item) { return item > $scope.lowerBound; }; }]); </script> </head> <body> <div ng-app=”myApp”> <div ng-controller=”MainCtrl”> <p>Fitrelemek için değer giriniz</p> <input type=”text” ng-model=”lowerBound” /> <ul> <li ng-repeat=”number in numbers | filter:greaterThanNum”> {{ number }} </li> </ul> </div> </div> </body> </html> Bu örnekte yapılmak istenen, inputa girilen değere göre, javascript verisi içinde filtreleme yaparak büyük olanları ekrana anlık değişimle listelemek. “ng-controller” yönergesi ile uygulamasını bir controllera bağlıyor ve controller aracılığı ile veri işleniyor. “ng-repeat” yönergesi döngü ile veriyi {{number}} ifadesinin bulunduğu yere yazıyor. Filtreleme ise filter parametresi ile belirlenen fonksiyon tetiklenerek eşleşen veriyi geri döndürüyor. İnputdaki değer değiştiğinde listede anlık olarak değişecektir. Çünkü {{lowerBound}} ifadesi greaterThanNum fonksiyonunda kullandığından listedeki değerler tekrar filtreden geçecektir. Bu işlem otomatik olarak angular tarafından gerçekleştirilecektir. Son Söz Web uygulamaları geliştirirken, kullanıcı etkileşiminin yüksek olduğu ve asenkron veri akışının sık kullanıldığı uygulamalarda arayüz geliştirme ve transfer edilen nesneler sebebiyle kod satırları arasında boğulmanıza neden olmakta. AngularJS bu süreçte arayüz tarafını kendi yöneterek rahat nefes almamızı sağlıyor. Bu makale AngularJS’yi giriş seviyesinde bahsetmeye çalıştım. Sonraki makalelerimde daha kapsamlı olarak bahsetmeye çalışacağım. Kaynaklar Uğur Eski http://angularjs.org/ http://en.wikipedia.org/wiki/AngularJS http://blog.kartaca.com/2013/09/angularjs-ve-backbonejs/ 29 http://muratcorlu.com/post/angularjs-kullanmak-icin-10-neden/ ugureski@me.com SOCIAPlus FİLLER GEZİYOR İNEGÖL İNEGÖL İNEGÖL İNEGÖL İSTANBUL 30 İZMİR