Sayı 3 , İndir
Transkript
Sayı 3 , İndir
1 KÜNYE Yayıncı : PHP-TR.com Editör : Ayhan Barış Tasarım : Tolga Dedebek Logo : Emin Zeybek Yazarlar : Abdullah Yıldız Ceyda Anıl Erol Yapıcı Okan Yedibela Musa Avcı Yusuf Tuğrul Kocaman 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 Effects4Images Effects4Images, PNG ve JPEG resimlerinize Sınıfın kullanımı efekt veren, onları boyutlandırmanızı sağlayan Sınıfı mükemmel bir PHP sınıfıdır. Effects4Images’ın ‘Effects4Images.php’ desteklediği birden çok efekt vardır. Bu kullanacağınız efektlerle kombinasyonlar oluşturabilir, ya da Ardından yapıcı metodunda bi resim adresi tek efekt kullanarak resimlerinizi daha cazip belirtmeniz kullanmak için öncelikle diyerek dosyaya yeterlidir. include Bu yüklemelisiniz. yazı boyunca hale getirebilir, ya da belirli yerler için tekrar kullanacağımız resim alttadır. boyutlandırabilirsiniz. Ayrıca Effects4Images orantılı boyutlandırmayı da destekler! Yazar Yusuf Tuğrul Kocaman bu sınıfı kişisel kullanımı için yazmış, sonra da tüm dünyaya yararlı olabileceğini düşünerek Github’da paylaşmaya karar vermiştir. Fakat bu sınıfı yazarken az kalsın bilgisayarının işlemcisini yakıyormuş. Debug yaparken Development Box’ının disk alanı dolmuş ve gedit’te 2 düzenleme yapamaması sonucu <?php include ‘Effects4Images.php’; $effects = new Effects4Images(‘resimoriginal.png’); ?> cinler Şeklinde sınıf çağırılabilir, kullanılabilir ama tepesine çıkmıştır. Toplamda 3-4 saat anca sıkıntılı olur; çünkü Effects4Images eğer uğraşmış ama Twitter, Facebook gibi sosyal verilen resim PNG veya JPEG formatında ağlarda yazdığı yazılarla sanki 24 saat değilse bir EffectException fırlatır. Bu yüzden uğraşmış gibi gözükmektedir. try-catch bloklarını kullanmak daha mantıklı olacaktır. } ?> <?php include Effects4Images.php; try { $effects = new Effects4Images(http://www. hdwallpapers3d.com/wp-content/uploads/Top-HdWallpapers-2.jpg); } catch(EffectException $e) { echo $e->getMessage(); } ?> Resim Boyutlandırma Effects4Images, olarak resimlerinizi boyutlandırma özelliğine otomatik sahiptir. Yani isterseniz boya, isterseniz ene göre boyutlandırabilirsiniz. Ya da her ikisini de ben girmek boyutlandırma istiyorum derseniz, özelliğine de <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->resize(400,400)->out(true); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=UTF-8’); echo $e->getMessage(); } ?> Efektler manuel Yazının sahiptir. Otomatik olarak ene göre boyutlandırmak için şu şekilde bir kod kullanmanız yeterli olacaktır. <?php include Effects4Images.php; try { header(Content-Type:image/png); $effects = new Effects4Images(resimoriginal.png); $effects->autoResize(400)->out(true); } catch(EffectException $e) { header(Content-Type:text/ plain;charset=UTF-8); echo $e->getMessage(); } ?> Ya da boya göre boyutlandırma yapmak için kullanabileceğiniz kod. 3 Her iki değeri de girerek boyutlandırma yapmak için resize fonksiyonu kullanılır. Örnek olarak şöyle yapılabilir. <?php include Effects4Images.php; try { header(Content-Type:image/png); $effects = new Effects4Images(resimoriginal.png); $effects->autoResize(null,400)->out(true); } catch(EffectException $e) { header(Content-Type:text/ plain;charset=UTF-8); echo $e->getMessage(); başında belirttiğim gibi harika efektler yapmanız mümkün. Bunları farklı kombinasyonlarda kullanırsanız daha hoş sonuçlar alacaksınız. Mesela önce resmi keskinleştirip ardından efekti uygulamak daha hoş görüntü verir. Sharpen Resimlerinizi netleştirir, keskinleştirir. Hemen fark edilmese de toptan bakınca belli bir şeylerin değiştiğini ve canlandığını fark edeceksiniz. <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->sharpen()->out(); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> sonuçlar alınabilir. Gene blur fonksiyonu gaussianBlur gibi sayısal değer alır. Üst üste blur için kullanılabilir. <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->blur(15) ->out(true); Gaussian Blur Bulanıklaştırma kullanmamız efektini gerekebilir. çoğu Bu yerde fonksiyonla resimlerinize Gaussian yöntemiyle uygulanmış } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> blur efekti verebilirsiniz. Üst üste blur yapmak istiyorsanız gaussianBlur fonksiyonuna sayısal değer verebilirsiniz. <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->gaussianBlur(15)->out(); // $effects->gaussianBlur() uygulasaydık, 1 kere blurlamış olacaktı. } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=“UTF-8”‘); echo $e->getMessage(); } ?> Saman kağıdından gelen efekt: Sepian Bu efekti ben çok seviyorum ve öneriyorum. Saman kağıdını bilmeyen yoktur sanırım, peki bunu resimlere uygulayıp eskimiş gibi göstermek ister misiniz? <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->sepian() ->out(true); Selective Blur 4 Bu blur doğru yöntemi yerlerde pek önerilmese kullanıldığında de güzel } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png); $effects->negative()->out(true); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> Nostaljik bir efekt: Grayscale İsminin hakkını veren bu efekt resimlerinize siyah beyaz efekti veriyor. Oldukça kolay bir kullanımı var. <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->grayscale() ->out(true); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> Ters renkler, ters hayat: Negative Renkleri tersine çeviren bu efekt ile diğer 5 efektleri kombine çıkarabilirsiniz. edip değişik şeyler Not: İki kere üst üste “Negative” efekti uygularsanız orijinal resmi elde edersiniz. Pikselleri dağıtan efekt: Sketchy <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png); $effects->sketchy()->out(true); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> Veee köşe yuvarlama! Watermark ekleyerek resimlerinizi Köşe yuvarlama nedense benim çok hoşuma sahiplenin! giden bir özellik. Çoğu site tasarımında Botla içerik çalanın bol olduğu internet kullanır, Ubuntu sıkça kullanır, hoş görünüm dünyasında, eğer karşı taraf tamamen sağlayan bu efekti artık resimlerinize otomatik ise onu zor duruma düşürebilirsiniz: herhangi bir CSS kodu olmadan sonuna Resimlere damganızı ekleyerek! Oldukça kadar kazandırabilirsiniz. Aynı CSS’teki gibi çalışan özellik, argüman olarak sayısal veri alıyor: Çember yarıçapı, yani ‘radius’. <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->roundCorners(20)->out(true); // Yarıçap uzunluğu 20 piksel. } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> basit bir şekilde ekleyeceğiniz watermark size 9 adet bölge sunar: • 1- Üst sol • 2- Üst merkez • 3- Üst sağ • 4- Merkez sol • 5- Resim merkezi • 6- Merkez sağ • 7- Alt sol • 8- Alt merkez • 9- Alt sağ Örneğin sağ alta (genellikle sağ alta eklenir) bir damga vuralım. Bu noktada ‘Fluent Interface’ kullanmak işimizi oldukça kolaylaştırıyor. Performans Uyarısı: Bu fonksiyon PHP’nin anti-alias özelliği imagearc için olmadığı için resmi 15 kere büyütüp öyle işlem yapar. Bu yüzden yüksek boyutlu resimlerde 6 (1920x1080) devasa çözünürlük bellekte tutulacağından dikkatli kullanılmalıdır. <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->setWatermark(‘logo.png’) ->setWatermarkPosition(9) ->doWatermark() ->out(true); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> Keskin yuvarlak negatif Bazı hoş kombinasyonlar Benim beğendiğim bazı hoş kombinasyonlar var. Bunları sizinle paylaşmak isterim. Keskin, yuvarlak, saman kağıdı ve damgalı resim <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->sharpen() ->negative() ->roundCorners(20) ->out(true); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> Resmi kaydetme Resmi kaydetmek için out fonksiyonundan önce save fonksiyonunu kullanmanız yeterli. Fonksiyon iki değer alır, birincisi resmin 7 <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->sharpen() ->sepian() ->setWatermark(‘logo.png’) ->setWatermarkPosition(9) ->doWatermark() ->roundCorners(20) ->out(true); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> kaydedileceği yol, ikincisi ise kalitesidir. İkinci argüman opsiyoneldir eğer ayarlanmazsa Effects4Images::ULTRA kullanılır. Fonksiyon ikinci değer için sınıf sabitlerini kullanır. 1. Effects4Images::ULTRA – En iyi değer, sıkıştırma yok ama büyük dosya – Sıkıntı boyutları 2. Effects4Images::BEST çıkaracak kadar bozulma yok, dosyalar küçük ama gene büyük. 3. Effects4Images::NORMAL – Adı üstünde, normal derecede, orta boyutlu dosyalar. 4. Effects4Images::LOW – Kalite bozulmasının en azda olduğu değer ve düşük boyutlu dosyalar. 5. Effects4Images::SCRAP – Kalite bozulması var, düşük boyutlu dosyalar. <?php include ‘Effects4Images.php’; try { header(‘Content-Type:image/png’); $effects = new Effects4Images(‘resimoriginal.png’); $effects->sharpen() ->negative() ->roundCorners(20) ->save(‘out.png’, Effects4Images::NORMAL) // İkinci seçenek opsiyonel. ->out(true); } catch(EffectException $e) { header(‘Content-Type:text/ plain;charset=”UTF-8”’); echo $e->getMessage(); } ?> Son söz Bu sınıf https://github.com/kulturlupenguen/ effects4images adresinden geliştirilmeye devam ediliyor. Güncellemelerden eksik kalmamak için takip ediniz. Eğer katkıda bulunabileceğinizi düşünüyorsanız, bana ulaşabilirsiniz. Yusuf Tuğrul Kocaman 8 ytugrultr@gmail.com penguencik.com twitter.com/kulturlupenguen facebook.com/yusuftugrul.kocaman.1 github.com/kulturlupenguen VAGRANT NEDİR? Vagrant, Türkçe karşılık olarak göçebe, başıboş, avare olarak çevrilebilir. Vagrant, sanal makina programları (virtualbox, vmware) üzerine kurduğunuz işletim sistemlerini konsoldan yönetmenize olanak sağlayan bir uygulamadır. Yazılımcılara klonlanmış geliştirme ortamı sağlar. Bireysel olarak da kullanılabileceği gibi asıl faydasının ekip çalışmasında görüldüğü, son zamanlarda gitgide popülerleşmiş bir uygulamadır. Özetle: “Nasıl olur! Az önce benim bilgisayarımda çalışıyordu bu. Sunucuya yollayınca patlamış.” Sorunu yaşamamanızı sağlar. da bu oluşturduğumuz BaseBox’ ı kullanmasını sağladığınızda hepsi sunucuyla aynı özellikleri taşıyan birer lokal sunucuya sahip olacaklar. Bundan sonra 5 yazılımcının her biri projelerini ister not defteri ile yazsınlar, ister IDE ile yazsınlar problem değil. Bu sayede lokalde çalıştırdıkları her kod parçacığı ya da kod bloğu sunucuda da sorunsuz bir şekilde çalışacaktır. Her Yiğidin Yoğurt Yiyişi Farklıdır. Bir geliştirici için performans ya da istikrarlı çalışma için en önemli hususların başında kendisini rahat hissettiği yazılım geliştirme ortamı gelir. Ortam derken, rahat bir koltuk ve huzurlu, eğlenceli bir ofisi de bu tanıma katabiliriz. :) Ama bizi ilgilendiren kısmı; hepinizin de anlayacağı üzere çalıştığımız işletim sistemi, IDE, araçlar, sunucular, test ortamları vs. vs. Ekip içinde proje geliştirmek, birçok yazılımcının bu yukarıda bahsettiğimiz rahat çalışma ortamına erişmesine engel teşkil ediyor. Bazı şirketler kalıplar halinde yazılımcı bilgisayarları oluştururlar ve her yazılımcıya çalışacağı sistemi hazır olarak verirler. Yazılımcı, “Yok efendim ben Windows istemem Mac olsun, ben wamp istemem, AppServ olsun” deme lüksüne sahip olamayabiliyor. Aslında şirketler kendilerine göre haklı sebepler sunarak, böyle bir standardizasyonun verimlilik artışı sağlayacağını düşünürler. Halihazırda birçok başarılı web projeleri ayakta kalmak için bireylerinin birbirine entegre çalıştığı, zaman ve emek verimliliğini arttırmak için yöntemler geliştiriyorlar. Vagrant işte tam burada bize yardımcı oluyor. 10 Özetle Çalışma Mantığı 5 tane de yazılımcı olsun. Gerçek ortamda yayın yapan bir web sunucu olsun. Bu sunucu ile aynı şekilde yapılandırılmış bir sanal sistem (BaseBox) oluşturdunuz diyelim. 5 yazılımcının Vagrant’ın box mantığı temel ve proje olarak ayrılır. ProjectBox, BaseBox’dan oluşur. Önce bir BaseBox oluşturup, her projeniz için ayrı ayrı ProjectBox oluşturabilirsiniz. Kurulumu Vagrant’ı kullanabilmek için bilgisayarınızda Oracle VirtualBox’ın (www.virtualbox.org) kurulu olması gerekmektedir. Vagrant’ı Vmware ile de kullanabilirsiniz ama o sürümünün paralı olduğunu belirtmek isterim. Bu yüzden Vmware ile kurulumu anlatmayacağım. http://downloads.vagrantup.com/ istediğimiz bir Vagrant sitesinden sürümünü, hangi platformda kullanacaksak ona uygun olanı indirmemiz gerekmektedir. kullandığım için size Ben Windows Windows versiyonunu anlatmaya çalışacağım. Vagrant’ın kurulumu çok basit, kurulum adımlarını burada anlatmayacağım. 1. İleri,ileri butonlarına basarak kurulumu gerçekleştirdiniz varsayıyorum. Ben kurulum klasörünü değiştirmedim varsayılan olarak C:\HashiCorp\Vagrant adresine kurulum gerçekleşti. Daha önce BaseBox olmadığı için 4.adımda ki komutu uyguladığımızda aynı zamanda BaseBox burada verdiğimiz linkten download edilecek. Bu satırda ki precise32 oluşturacağımız sanal makinanın adı (BaseBox) ve hemen yanındaki de indireceğimiz linkidir. (Precise32 bir Ubuntu versiyonudur.) Dilerseniz kendi bulduğunuz BaseBox’ları da indirebilirsiniz. Bunun için Google da arama yaparsanız size Vagrant Box sağlayan siteler çıkacaktır. Mesela; http:// www.vagrantbox.es, http://puppet-vagrantboxes.puppetlabs.com. Ben sunucularımda CentOS kullandığım için bu sitelerden kendime uygun olan Centos box’larını tercih ediyorum. Şimdi precise32 ile anlatımımıza devam edelim. Komutu çalıştırdığınızda size “A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup. com` for more information on using Vagrant.” sanal ortamınızın kullanıma hazır olduğunu bildiren bir bilgi mesajı veriyor. 4. Hemen akabinde konsolda vagrant up 2. Şimdi C klasörüne gidip “wwwroot” adında bir klasör oluşturalım, onun içine de “phpfil” klasörü açalım. Project box’ı burada aktif edeceğiz. 3. Eski tip ya da yeni PowerShell konsolunu çalıştırıp oluşturduğumuz “php-fil” klasörüne gidelim. Konsolda vagrant init precise32 http://files.vagrantup. com/precise32.box komutu ile bulunduğumuz klasörün 11 ProjectBox olarak tanımlanmasını sağlıyoruz. komutunu çalıştırırsanız, bu komutla BaseBox inmeye başlayacaktır. Aslında bu komut ProjectBox’ı çalıştırmak için kullanılan bir komut ama ilk defa kullanıldığımız için BaseBox’ı indirecek ve ondan sonra ProjectBox’ı çalıştıracak. İnternetinizin hızına ve dosyanın boyutuna göre biraz sürebilir. İndirme bittikten sonra Vagrant, port ayarlarını yapmak için sizi biraz daha bekletecek. Bu zamanı kendinize içecek birşeyler alarak değerlendirebilirsiniz. İndirme tamamlandığında BaseBox oluşmuş olacaktır. Vagrant, aynı zamanda “php-fil” klasörüne ProjectBox’ı da oluşturulmuş olacak. BaseBox’lar “C:/ Kullanıcılar/kullanıcı_adiniz/.vagrant.d” klasöründe yer alırken Projectox ise az önceki komutu çalıştırdığınız “phpfil” klasöründe yer alır. Bundan sonra eğer başka projelerde BaseBox olarak precise32 kullanırsanız tekrar indirmeyip, indirdiğiniz BaseBox’ı kullanacaktır. key’ i de puttygen ile anlatacağım. 5. “php-fil” dizinindeki VagrantFile ProjectBox’ ının temel ayar dosyasıdır. Not defteri ile açarsanız şu iki satırın commentsiz olduğunu görürsünüz. Bu projenin hangi BaseBox’ı kullanacağını belirten ayarlardır. Şimdilik değiştirmiyoruz, isterseniz farklı BaseBox’ lar da indirip, projelerin farklı platformlarda nasıl çalıştığını bu şekilde farklı BaseBox’ ayarını değiştirerek deneyebilirsiniz. config.vm.box = “precise32” config.vm.box_url= http://files.vagrantup.com/precise32.box 6. Bu dosyada bir de network ayarları yapmamız gerekiyor. Commentli olan şu satırı bulup üzerinde değişiklik yapalım. Başındaki # kaldırıp port yönlendirmeyi aktif hale getirelim. # config.vm.network :forwarded_port, guest: 80, host: 8080 12 7. Tabi bu esnada ProjectBox açık olduğu için yaptığınız değişik uygulanmayacak. Bunun için Projectbox’ ı kapatıp tekrar açmanız gerekecek. Bunun için konsolda vagrant halt komutunu verebilirsiniz. Bu durumda ProjectBox kapanır. Tekrar vagrant up komutuyla çalıştırdığınızda yeni port yönlendirmelerinizin aktif olduğunu göreceksiniz. Ya da kısaca vagrant reload yazarsanız, aynı işlemi yapacaktır. Resim 2’de gördüyseniz bir de 2222 portu yönlendirilmiş bu da ssh bağlantısı için kullanacağız. Konsolda vagrant ssh komutu verdiğinizde size ssh için kullanabilecek program bulamadığı, path tanımlı olmadığının uyarısını verir, bunun yerine ssh client programları kullanabileceğinizi bildiren bir uyarı mesajı verecek. Linux kullanıcıları doğal olarak böyle bir uyarı almayacaklar. Bu uyarının hemen altında secure_key bilgisi gözükecek. Ben putty kullanıyorum, secure 8. Bu key dosyasını puttygen (http://the.earth. li/~sgtatham/putty/latest/x86/puttygen.exe) ile putty private key dosyasına yani *.ppk dosyasına çevirmeniz gerekmektedir. Konu dışına çıkmamak için secure key nedir ne değildir değinmek istemiyorum. Sadece bu adımı nasıl yapacağımızı belirtip geçelim. Puttygen ile load private key yapıp insecure_ private_key’i puttygen ile açalım daha sonra sağ altta bulunan save private key e basarsanız size ppk dosyasını oluşturmanız için klasör soracak. Oluşturup puttygen i kapatabilirsiniz. Şifresiz kaydetmek istediğinize emin misiniz diye sordu, evet deyip geçtik. 9. Resim 3’ü hatırlarsanız bize kullanıcı adı olarak vagrant vermişti. Private key de oluşturduğumuz için ssh ile 127.0.0.1:2222 ye bağlanmaya çalıştığımızda şifre sormadan login olabileceksiniz. Dilerseniz konsolda vagrant ssh-config ile ssh yapılandırmasını görebilirsiniz. 10. Bundan sonraki adım ise host işletim sistemi ile ProjectBox arasında klasörleri senkronize etmek. Konfigürasyon dosyamızda # config.vm.synced_folder “../data”, “/vagrant_data” Satırını bulun, satırı klonlayıp yeni oluşturduğunuz satırın başındaki # kaldırıp satırı aktif edin. Aktif ettiğiniz satırda da “” içerisinde bulunan klasör yollarından ilk sıradaki yani sol tarafta olan host makine yani sizin kullandığınız bilgisayarınızdaki yol, sağ taraftaki dizin yolu ise ProjectBox’ taki yolu gösteriyor. Bu şekilde istediğiniz kadar klasör senkronize edebilirsiniz. Bu adımı yaptığınızda şuna benzer bir yapılandırmanız olması lazım. Vagrant Komutları Bu bölümde de kısaca vagrant komutlarına değinmek istiyorum. Bu komutların bir kısmını zaten yukarıdaki adımlarda öğrendiniz, dilerseniz hepsine şöyle topluca göz atalım. box: BaseBox’ larla işlem yapan komuttur. box komutu add,list,remove,repackage şeklinde 4 tane daha parametre alır. add yeni box ekler, yazıda bahsetmiştik, remove eklediğiniz bir box’ı silmeye yarar. list mevcut box’ larınızı listeler. repackage ise mevcut bir box ı başka bir provider adresinden yani url’den tekrar indirip kurar. Örneklemek gerekirse vagrant box repackage precise32 http:// www.php-tr.org/deneme_vagrant.box destroy : Box’ ı siler, uzun süre kullanmayacaksanız, silmek için bunu kullanabilirsiniz. 13 Artık klasörlerimiz senkronize şekilde çalışıyorlar. Bir sonraki resime bakarsanız touch komutu box ta oluşturduğumuz dosya doğrudan ana makinada da oluşturuldu. halt : çalışan box’ ı durdurur. help : bu listeyi ve versiyon bilgilerini gösterir. init : bir vagrant ortamı, yani ProjectBox’ı oluşturur. package : Eğer birden çok yazılımcı için aynı box’ ı kullanacaksanız can alıcı komutlardan birisidir, mevcut box’ ı paketler ver diğer kullanıcıların indirebileceği, kullanacağı bir şekle getirir, sıkıştırılmış şekilde .box uzantılı bir dosya oluşturur. olduğunuz box’ın yapılandırma adımlarına hiç girmedik. Bu konular tamamen sunucu konfigürasyonu arzunuza bağlı. Mesela update yapabilirsiniz, lamp konfigürasyonlarını ayarlayıp ve servislerin her açılışta çalışmasını ayarlayabilirsiniz. Bu ayarları da internetten bulabileceğiniz shell scriptler ile hızlıca yapabilirsiniz. Ben size örnek olması için bir link vereyim. https://github.com/omerucel/vagrantshell-modules. Bu scriptleri hazırlayan arkadaşa da teşekkürlerimizi sunalım. Kaynak: www.vagrantup.com plugin : Adından anlaşılacağı üzere eklentileri düzenlemek için kullanılır. Bu komut da parametreye ihtiyaç duyar. install, license, list, uninstall, update parametreleriyle eklentileri düzenleyebilirsiniz. provision: Otomatik olarak box’ a uygulama yükleme, ayarları değiştirmenize yarar. Vagrant up komutu verdiğiniz an provision komutu zaten çalışır. Eğer sunucunuzu elle tek tek ssh’ dan ayarlarım diyorsanız, ihtiyacınız olmayabilir. Daha detaylı bilgi için internetten puppet, puppet server, chef solo, chef server ile ilgili dökümanları incelemenizi öneririm. reload : box’ ı kapatıp tekrar açar, konfigürasyon dosyasında değişiklik yaptıysanız bu komutu uygulamanız gerekmektedir. resume : suspend yaptığınız bir box’ ı tekrar çalışır hale getirir. ssh: box’ a ssh ile bağlanmaya yarar. Biz makalemizde putty kullanarak yapmıştık bu işlemi hatırlarsanız. ssh-config : ssh ayarlarınızı toplu halde gösterir. Abdullah Yıldız status : boxların çalışıp çalışmadığının bilgisini verir. suspend : çalışan bir box’ ı askıya alır, box restart olmadan durdurulur. 14 up : box’ ı çalıştırır. Bu yazıda Vagrant’ ın ne olduğunu, box kurulumunu anlattık ama burada kullanmış www.abdullahyildiz.com XHProf XHProf ile Analiz Yazılımcılar için en büyük sorunlardan biri bir işlemin tahmin edildiğinden daha uzun sürede çalışması. Bu gibi durumlarda programcı kodu açar ve nerde yanlış yaptığını bulmaya çalışır. Eğer XHProf gibi bir analizci kullanmışsanız bu sürenin neden olduğunu daha kısa sürede bulabilirsiniz. (Profiler kelimesini analizci olarak Türkçe’ye çevirdim) XHProf kaynak kodunu github’dan indirelim http://github.com/facebook/xhprof/tarball/ master wget https://github.com/facebook/xhprof/archive/master.zip XHProf Nedir? Eğer hata verirse bunu kullanabilirsiniz. Facebook tarafından Mart 2009’da yayınlanan XHProf PHP geliştiricileri için geliştirilmiş fonksiyonlevel hiyerarşik bir analizcidir. C ile yazılmış bir PHP eklentisidir. XHGui ile rapor sonuçlarını detaylı bir şekilde görebiliyoruz. Wget –no-check-certificate https:// github.com/facebook/xhprof/archive/ master.zip XHProf uygulamalarınızın fonksiyonlarını hiyerarşik bir şekilde analizini çıkaracaktır. Bu analiz sonuçlarında CPU zamanı, memory kullanımını bir fonksiyonun kaç kere kullanıldığını ve kullanıldığı süresini, veritabanından çekilen sorgularının ne kadar olduğunu görebilirsiniz. Gereksinimler • Zlip kütüphanesi: http://php.net/manual/ en/zlib.installation.php • phpize • Database yetkisi • Mysql, MySQLi, SQL Server desteklemesi Kurulum XHProf kurmak için phpize kurmamız gerekiyor. 15 phpize /usr/bin/phpize dizinindedir. apt-get install php5-dev İndirme işlemimiz geçebiliriz. bittikten sonra kurluma unzip master.zip cd xhprof-master/extension/ phpize ./configure make sudo make install Kurulum yaptıktan sonra php.ini aşağıdaki kodu eklememiz gerekiyor. [xhprof] extension=xhprof.so xhprof.output_dir=”/var/tmp/xhprof” Apache’yi restart edelim ve XHProf eklentisi aktif olacaktır. Şimdi php dosyalarını indirelim. https://github.com/facebook/xhprof projeyi indirelim. Ve analiz yapmak istediğimiz dizine kopyalayalım. XHProf analiz yaptıktan sonra sonuçları details diye tabloya kaydediyor. XHGui de bu tablodan verileri kullanıyor. Bunun için kullanacağımız veritabanına aşağıdaki tabloyu oluşturalım. XHProf_lib\utils\XHProf_runs.php dosyasının satır no 105 den sonra açıklama satırında bulunmaktadır. CREATE TABLE `details` ( `id` char(17) NOT NULL, `url` varchar(255) default NULL, `c_url` varchar(255) default NULL, `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `server name` varchar(64) default NULL, `perfdata` MEDIUMBLOB, `type` tinyint(4) default NULL, `cookie` BLOB, `post` BLOB, `get` BLOB, `pmu` int(11) unsigned default NULL, `wt` int(11) unsigned default NULL, `cpu` int(11) unsigned default NULL, `server_id` char(3) NOT NULL default ‘t11’, `aggregateCalls_include` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `url` (`url`), KEY `c_url` (`c_url`), KEY `cpu` (`cpu`), KEY `wt` (`wt`), KEY `pmu` (`pmu`), KEY `timestamp` (`timestamp`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; Tabloyu olşturduktan sonra xhprof_lib altındaki config.php dosyasını açalım ve ayarlarımızı yapalım $_xhprof[‘dbtype’] = ‘mysql’; $_xhprof[‘dbhost’] = ‘localhost’; $_xhprof[‘dbuser’] = ‘root’; $_xhprof[‘dbpass’] = ‘123456’’; $_xhprof[‘dbname’] = ‘xhprof’; $_xhprof[‘dbadapter’] = ‘Mysql’; $_xhprof[‘servername’] = ‘xhprof’; $_xhprof[‘namespace’] = ‘xhprof’; $_xhprof[‘url’] = ‘http://localhost/’; Evet artık ayarlamalarımız tamamlandı şimdi sıra kod yazmada. Analiz yapmak istediğiniz dosyayı açalım. Ve aşağıdaki gibi düzenleyelim. 16 // XHProfu başlatalım XHProf_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); //profiling yapmak istediğiniz code // profiler bitirelim $XHProf_data = XHProf_disable(); $XHProf_runs = new XHProfRuns_Default(); // sonucumuzu tabloya kaydedelim $run_id = $XHProf_runs->save_run($XHProf_data, “namespace _adi”); h t t p:// l o c a l h o s t / X H P r o f/ X H P r o f_ h t m l /i n d e x. php?run=$run_id linke giderek profiling sonucunu görebiliriz. XHProf_enable fonksiyonuna XHPROF_FLAGS_ CPU + XHPROF_FLAGS_MEMORY parametrelerini gönderdik bunların ne işe yaradığından bahsedeyim. XHPROF_FLAGS_CPU: CPU bilgisini bize geri döndürür. XHPROF_FLAGS_MEMORY : MEMORY bilgisini bize geri döndürür. XHPROF_FLAGS_NO_BUILTINS : Analiz yaparken PHP’deki fonksiyonları işleme almaz. Eğer analiz yapacağınız kod büyük ise bunu kullanabilirsiniz yada bazı fonksiyonları eleme imkanını da vermektedir. Bunu şu şekilde yapabilirsiniz; $engelli_fonksiyonlar = array(‘call_user_func’, ‘call_user_func_array’); XHProf_enable(0, array(‘ignored_functions’ => $ engelli_fonksiyonlar)); Tüm Sayfada analiz yapmak; Eğer bütün sayfalarda analiz yapmak istiyorsanız şu şekilde de yapabiliriz. Header.php oluşturalım ve içine şunları yazalım. <?php //header.php if (extension_loaded(‘XHProf’)) { include_once ‘/usr/local/lib/php/XHProf_ lib/utils/XHProf_lib.php’; include_once ‘/usr/local/lib/php/XHProf_ lib/utils/XHProf_runs.php’; XHProf_enable(XHPROF_FLAGS_CPU + XHPROF_ FLAGS_MEMORY); } ?> <?php //footer.php if (extension_loaded(‘XHProf’)) { $profiler_namespace = ‘php-tr’; // namespace for your application $XHProf_data = XHProf_disable(); $XHProf_runs = new XHProfRuns_Default(); $run_id = $XHProf_runs->save_run($XHProf_ data, $profiler_namespace); Açılan sayfanın sağ tarafında Cookie get post ve grafik bulunmaktadır. Resim-3’de göründüğü } ?> Son olarak header ve footer dosyalarımızın sayfaya otomatik eklemesi için .htaccess dosyasına aşağıdaki kodu ekleyelim. php_value auto_prepend_file /var/www/XHProf/header.php php_value auto_append_file /var/www/XHProf/footer.php Kurulum ve yapılandırma işlemimiz bitti şimdi gelelim raporlama ekranına. http://localhost/ XHProf/XHProf_html/index.php sayfasını açtığımızda bize analizlerin tarih bazında listesini vermektedir. gibi. Sayfanın sol tarafında ise daha detaylı bir bilgi vermekte. Açılan sayfada üst taraf da çeşitli filtreler bulunmaktadır. Domain bazında filtreleme, Server bazında filtreleme, En zor analizleri,en yüksek analizler, en yüksek ram ve uzun süren sorguları günlük yada haftalık olarak filtreleme imkanı vermektedir. İsterseniz kendi filtrenizi oluşturabilirsiniz tabi php yazmanız gerekmektedir. Bu bilgilerin altında da analizlerin detaylarını görebiliyoruz. Fonksiyon bazında listelenmiş şeklinde. Burada sıralama yapma imkanı veriyor bize. CPU ya göre sıralama işlemini yapabiliyoruz. Buradaki fonksiyonlarında detayına gidebiliyoruz ve bu fonksiyonların içerisinde hangi alt fonksiyonlar çalışmış ve bunlarında analizini ayrı bir şekilde bize rapor halinde vermektedir. Callgraphs Görüntüleme XHProf analiz liste ekranı Herhangi bir analize detaylı olarak bakalım. XHGuinin bir diğer özelliği de çalışan scriptin callgraphstını çıkarması. Yani size bir grafik oluşturuyor çalışan fonksiyonların. Directed graphs (yönlendirilmiş grafikler) fonksiyonlar arası bağlantıları gösterir ve öncelik durumuna göre sıraya sokarak bir grafik oluşturur. Bu grafik dosya bilgisi çalıştığı süre, kaç kere çağrıldığı bilgisini vermektedir. Bu veriyi gerekiyor. görmek için graphviz kurmamız apt-get install graphviz 17 Kurulum bittikten sonra config.php dosyasının içerisindeki yorum satırı haline getirilmiş olan satırları iptal edelim. //These are good for linux and its derivatives. $_xhprof[‘dot_binary’] = ‘/usr/bin/dot’; $_xhprof[‘dot_tempdir’] = ‘/tmp’; $_xhprof[‘dot_errfile’] = ‘/tmp/xh_dot.err’; Artık callgraphsımızı görebiliriz. http:// localhost/XHProf/XHProf_html/callgraph. php?run=$run_id XHProf’dan anlatacaklarım bu kadar bir sonraki konuda görüşmek üzere. O zamana kadar herhangi bir sorunuz olursa eroll.yapici@gmail. com’a mail atabilirsiniz. Kaynaklar http://erolyapici.com/xhprof-ile-php-analizi/ http://pecl.php.net/package/xhprof http://php.net/manual/tr/book.xhprof.php https://github.com/facebook/xhprof http://techportal.inviqa.com/ Erol Yapıcı 18 eroll.yapici@gmail.com www.erolyapici.com git config --global user.email okan@sample.com Yukarıdaki iki satır ile kullanıcı adımızı ve email adresimizi tanıtmış olduk. Bu işlemi sadece 1 kez gerçekleştiriyorsunuz. Her proje için ayrı ayrı yapmanıza gerek yok. SSH Key Oluştur Burada repo oluştururken github ı baz alarak anlatıyor olacağım. Tüm diğer git servislerinde de bu işlemler aynıdır. Github ve bilgisayarımız arasında güvenli bağlantı oluşturmak için ssh-key kullanmamız gerekiyor. Mevcut bir ssh key iniz var ise onu kullanabilirsiniz. Yok ise aşağıdaki satırı çalıştırıp ssh-key’i yaratabilirsiniz. ssh-keygen –t rsa Komutu çalıştırdığınız aşağıdaki kısım karşınıza geliyor.Enter ile geçiyoruz.Burada key in hangi dizinde oluşturulacağı yazıyor. Daha sonra key e ulaşmak için bu dizine ihtiyacınız olacak. - Enter file in which to save the key (/ home/you/.ssh/id_rsa): Sonraki kısımda ise key’i oluşturmak için bir anahtar kelime isteniyor. İsterseniz boş geçebilirsiniz : - - Gıt Kurulumu Ve Konfigürasyonu Ardından şuna benzer bir çıktı almamız gerekiyor. Linux Kurulumu - Kurulumu gerçekleştirmek oldukça basit. Komut satırında şu satırı çalıştırın: apt-get install git Your identification has been saved in / home/you/.ssh/id_rsa. - Your public key has been saved in /home/ you/.ssh/id_rsa.pub. Windows Kurulumu - The key fingerprint is: 01:0f:f4:3b:ca:85:d6: 17: http://msysgit.github.com adresine gidin ve .exe paketini indirip çalıştırın. Git Konfigürasyonu Git i kurduktan sonra bir dizi konfigürasyon gerçekleştirmeniz gerekiyor. Bu adım zorunlu değil ancak commitlerinizde bilgisayar adı yerine kullanıcı adınızı görmek istiyorsanız yapın. 19 passphrase (empty for no Enter passphrase): [Type a passphrase] Enter same passphrase again: [Type passphrase again] git config --global user.name “Okan Yedibela” a1:7d:f0:68:9d:f0:a2:db okan@sample.com Sırada oluşan bu ssh-key i github a eklemek var. Github a public key i eklemeniz gerekiyor. Public key e ulaşmak için en son adımda belirtilen ~/.ssh/id_rsa.pub dosyasını açın ve içeriği kopyalayın. Github.com da oturum açın ve sağ üstteki account settings i tıkayın. Sol tarafta SSH Keys başlığına tıklayın, gerisini halledin artık. Github Üzerinde Repo Oluştur Repoya Dosya Ekle, Düzenle Şimdi repo oluşturmaya ve bunu bilgisayarımıza çekmeye hazırız. Github üzerinden Create a Repo ile bir repo oluşturun. Burada private repo ücretli olduğu için public i seçmeniz gerekiyor. Beleş private repo oluşturmak istiyorum derseniz bkz:bitbucket. Repo üzerinde bir dosya düzenlediğinizde veya yeni bir dosya yarattığınızda git status ile dosyaların durumunu görebildiğimizden bahsettik. Şimdi sıra geldi bu dosyaları izlemeye almaya. İzlemeye almak için git add komutunu kullanılınır. Örneğin projede readme.txt adında bir dosya oluşturun ve console dan git statu komutunu çalıştırın. Bu dosyanın untracked olarak sınıflandırıldığını göreceksiniz. Bkz:Şekil-1 Not: Varolan bir klasörü git reposu haline getirmeyi anlatmıyorum. Siz yaparsınız ;) bkz: http://git-scm.com/book/en/Git-Basics-Gettinga-Git-Repository Git Kullanımı Repoyu Çek Github üzerinde oluşturduğumuz repoyu bilgisayarımıza veya herhangi bir sunucuya çekmek için clone özelliğini kullanabiliriz. Reponun adresini github üzerinden alıyoruz. Burada dikkat etmeniz gereken nokta ssh ve http protokolleri. http protokolü ile repoyu clone yaparsanız her pull ve push öncesinde kullanıcı şifrenizi girmek zorunda kalırsınız ki 5. kez tekrar ettiğinizde çıldırırsınız. Ssh protokolünü seçip devam ediyoruz. Repoyu hangi dizine çekmek istiyorsanız oraya gidin ve sonra aşağıdaki satırı çalıştırın. Eğer reponun çekileceği dizinde projeye henüz klasör oluşturmadıysanız aşağıdaki satırı kullanın. Sondaki sample oluşturulacak klasörü belirtir.Zaten proje klasörünüz de hazır ise sample ı silip devam edin : Daha sonra git add readme.txt satırını çalıştırıp git status komutu ile dosyanın durumunu tekrar görüntüleyin. Burada dosyanın artık izlemeye alındığını ve commit için hazırlık alanında bekletildiğini görebilirsiniz. Yine aynı şekilde varolan bir dosya üzerinde değişiklik yapıp git status komutunu çalıştırdığınızda dosyanın kayda hazırlanmamış olduğunu ve modified olduğunu göreceksiniz. Dosyayı hazırlık alanına almak için tekrar git add dosya_ismisatırını çalıştırın. Eğer kayda alınmamış birden fazla dosyanız var ise ve hepsini kayda almak istiyorsanız git add. komutunu kullanın. Commit Yap Yukarıdaki adımları uyguladıktan sonra artık commit işlemini yapabiliriz yani yaptığımız değişiklikleri kaydedebiliriz. Commit e dahil etmediğiniz her dosya sabit diskinizde değiştirilmiş dosyalar olarak kalacaktır. Yani git add ı kullanıp kayda hazırlamadığınız dosyalar. Commit git clone git@github.com:okanyedibela/php-tr. git sample Artık proje bilgisayarınızda. Şimdi son derece insancıl bir ortamda geliştirme yapmaya başlayabilirsiniz. Dosyaların Durumlarını Kontrol Et Dosyaların durumlarını görmek için git status komutunu kullanırız. Bu komut u clon işleminden sonra çalıştırdığınızda: 20 $ git status # On branch master nothing to commit (working directory clean) Çıktısını alırsınız. Bunun anlamı repo’da izlenen veya izlenmeyen olan herhangi bir dosyanın bulunmamasıdır. Ayrıca hangi branch üzerinde olduğunuzu gösterir. Şu anda master branch ı üzerinde çalışıyoruz. işlemini gerçekleştirmek çok basit git commit ile dosyalarınızı kaydedebilirsiniz. Eğer bu commit e dair bir yorum,mesaj yazmak isterseniz git commit –m”readme file added” komutunu kullanın. –m seçeneği yorum yazacağınızı belirtir. Burada –m i kullanmadan commit yapmamanızı öneririm. Daha sonra commitlerinize geri dönüp bir şey aradığınızda buraya yaptığınız yorumlardan aradığınız şeyi rahatlıkla bulabilirsiniz. Uzak Sunucuya Kod Gönder-Al (Github Repo) Yapılan commitleri repoya göndermek ve diğer geliştiricilerin bu kodlara sahip olmasını sağlamak için yapmamız gereken şey oldukça basit. git push origin branch_adı komutu ile tüm değişikliklerinizi repoya dahil ediyorsunuz. branch_adi bulunduğunuz branch ın adıdır. Bu anlatımda repoyu kendimiz oluşturup clone yaptığımızdan dolayı direkt olarak push işlemini yapabildik. Ancak birden fazla developer ın dahil olduğu bir projede çalışıyorsanız bütün bu anlatılan adımların başında git pull komutunu çalıştırıp reponun son halini bilgisayarınıza çekmenizi öneririm. Dosya Sil git rm dosyayolu/dosya_adi ile dosyayı silip arkamıza bakmadan devam edebiliriz. Push işlemini gerçekleştirmeyi unutmayalım. Branch Oluştur, Branchlarda Geçiş Yap, Branch Sil, Birleştir Git default olarak master branch ını getirir. Branchları yeni geliştirmelerde,hata gidermelerde veya başka işlerde kullanabiliriz. Amaç çalışan stabil bir branch ın yanında (bu genelde master olur) yeni yapılacak işleri paralel bir şekilde yürütebileceğimiz kopyaların oluşturulması. Bu kopyaları son stabil sürüm olan master dan oluştururuz genelde(senaryoya bağlı olarak farklı branchlar üzerinden de yeni branchlar oluşturabilirsiniz,dallanmanın olayı bu.). Yeni branch oluşturmak için : git branch yeni_ branch Oluşturulan branch a geçmek için : git checkout yeni_branch bitirdikten sonra. git checkout master branch ına geçiyoruz. master ile 3. Master a hangi branch ı dahil etmek istiyorsak git merge yeni_branch komutu ile bunu gerçekleştirebiliyoruz. 3 adımda basit bir senaryo ile branchlarımızı birleştirdik. Tabi daha sonra master branch ımızı push etmezsek -abi bu niye çalışmıyor ya diye düşünüp dururuz. Commit Geçmişini Görüntüle git log komutu ile projedeki tüm commitleri görüntüleyebilirsiniz. Burada Commit’in hash id si,tarihi ve commit’i yapan kişinin bilgileri görüntülenir. Eski Bir Commit’e Geri Dön Commitlerinizden birine geri dönmek isterseniz: git checkout hash_id ile sürümü istediğiniz commit e çekebilirsiniz. Eğer o zamana kadar yapılan tüm işlerden kurtulmak isterseniz : git rest --hard hash_id Son Git üzerinde anlatılacak ve uygulanacak çok fazla konu ve detay var. Burada yapmak istediğim işlemleri en temel haliyle gösterip git’i hiç bilmeyen birini iş yapabilecek seviyeye getirmekti. Detaylar için Git ile ilgili fazlaca kaynak ve örnek mevcut. Bunlardan yararlanarak Git i çok daha etkin ve verimli bir şekilde kullanabilecek seviyeye gelebilirsiniz. Branch silmek için: git –D yeni_branch Basit Bir Örnekle Nasıl Kullanırız ? Peki şuanda 2 branch var projede. Master ve yeni_branch. Master üzerinden oluşturduğumuz yeni_branch ı master a nasıl dahil edeceğiz ? Şu şekilde : 21 1. git status nerede olduğumuzu ne yaptığımızı herzaman bilelim. 2. Şu anda yeni_branch üzerinde olduğumuzu varsayalım. Branch üzerindeki işlerimizi Okan Yedibela okan@sociaplus.com SOCIAPlus YA Z I L I M C I Y I M Ü L Â K A T TA ÇILDIRTMANIN YO L L A R I Mülâkat lafını duymak bile birçok kişinin stres olmasına neden olur. Mülâkat yalnızca yazılımcılar için değil tasarımcılar, sistem mühendisleri ve proje yöneticileri için de sevilmeyen bir durumdur. Yazılımcının iş görüşmesindeki davranışları görüşülecek kişiye bağlı olarak değişir. Eğer teknik bir kişi görüşmeye katılacaksa kendisini daha iyi anlayacağını düşündüğü için daha rahat olur ancak karşısındaki kişi bir IKcı ise durum tamamen değişir. • Henüz kendisini anlatmaya başlamadan nereli olduğunu ya da ailesini sorun. • Eğer karşınızdaki yazılımcı PHP yazılım diline hakim ise .NET yazılım dilini; .NET yazılım diline hakim bir yazılımcı ise PHP yazılım dilini övün. IK’cılar özellikle IT depar tmanı içinde bulunan kişiler tarafından pek sevilmez. Bu durum daha önce gerçekleştirdiği iş görüşmelerindeki IKcılardan ya da çevresinde duyduğu mülâkat anılarından kaynaklanabilir. En büyük neden bir IK’cının yazılımcıyı, yazılımcının da IK’cıyı anlayamadığını düşünmesidir. Teknik bilgisi olmadığı düşünülen IK’cıya karşı ön yargı ile yaklaşıldığı gibi, IK’cı da yazılımcıların sosyal olmadığını ve içine kapalı olduğunu düşünerek ön yargıyla yaklaşıyor olabilir. • Farklı bir teknolojiye kaymak isteyen birine bunun mümkün olmayacağı konusunda diretin. Yazılımcılarla iletişim kurmak sanıldığı kadar zor değildir. Tam tersine yazılımcılar net insanlardır ve neyi sevip sevmediklerini belli ederler. İlk başta iletişim kurmaktan çekinebilirler ancak davranışları analiz edildiğinde ne düşündüklerini anlayabilirsiniz. Her yazılımcıyı aynı kalıba sokmak ne kadar yanlışşa, her IK’cıyı da aynı sanmak o kadar yanlıştır. • Mülâkat sırasında bir kağıt çıkar tıp kod yazmasını isteyin. Yazılımcıyı mülâkatta çıldır tmak istiyorsanız yapmanız gerekenler: 22 • Görüşmeyi daha önce nerede çalıştığını, hangi yazılım dillerini kullandığını ve hangi projelerde bulunduğunu incelemeden gerçekleştirin. • Görüşmeye vaktinde gelsin ya da gelmesin yazılımcıyı bir süre bekletin • Görüşme sırasında başka bir şey ile ilgilenin. • Okuduğu üniversiteyi sorgulayın. ve bölümü • Çalıştığı şirketleri ya da küçümseyerek dinleyin. projeleri • Daha önceden haber vermeden teknik ya da İngilizce teste sokun. • Çalışma koşullarını geçiştirin. • Yapacak çok işinizin olduğunu belir tip görüşmeyi kısa kesin. Mülâkat bir yazılımcıyı çıldır tmışsa, proje ne kadar olumlu etki yaratıyor olursa olsun, böyle bir şirkette çalışmak istemeyecektir. Ancak unutmayın ‘bu kadar da olur mu?’ dedir ten mülâkatlar, stres mülâkatı da olabilir! Mülâkatı kabusa çevirmemek başta yönetimin ve insan kaynakları depar tmanı yetkililerinin elindedir. Görüşmeyi gerçekleştirecek kişinin görüşmeye girmeden önce mutlaka görüşülecek kişi hakkında araştırma yapmış olması gerekir. Teknik arkadaşları anlamak için kod yazmak gerekmez, bazen yalnızca iletişim kurmak yeterlidir. Keyfli görüşmelere katılmanız dileğiyle :) Ceyda Anıl 23 www.ceydaanil.com E-nerjik PHP htaccess KULLANIMI • Özel dizinlerinizi şifreleyebilirsiniz. PHP ile bir dizin kontrol sistemi yazmaya uğraşmak yerine hemen bir kaç satır htaccess komutu ile istediğiniz dizine şifre ile girilmesini sağlayabilirsiniz. Web projelerinizi bir çok şekilde düzene • Resimlerinizin başka sitelerde sokup kullanıcı dostu URL’ler yapmamıza görünmesini engelleyebilirsiniz. ve bir takım yollarla güvenlik önlemleri de Başka sitelerde sizin sitenizdeki resimlerin almanıza yarayan ve bu alanda en favori gösterilmesini engelleyerek sunucunuzun olaylarımdan bir tanesidir. bant genişliğin başka sitelerce harcanmasını önleyebilirsiniz. (bu Htaccess Ile Neler Yapabiliriz? yöntemin adı hotlink diye geçer) • Ve bu yukarıda sayılanların haricinde • SEO dostu URL’ler oluşturabilme. bu yöntemleri bir arada kullanarak çok site.com/icerik.php?id=123 yerine site. daha fazlasını yapabilirsiniz. com/icerik-basligi gibi • Subdomain ya da dizin yönlendirmeleri. Hadi şimdi sırayla bu yukarıda saydıklarımın nasıl yapıldığına bakalım. site.com girildiğinde www.site.com’a yönlendirme gibi Seo Ve Kullanıcı Dostu Bağlantılar Oluşturma • “404 sayfa bulunamadı” gibi tüm hata sayfalarını istenilen yere yönlendirebilme. Htaccess’in en popüler kullanım alanlarından birisi budur. Ve sizin de en sevdiğiniz site.com/olmayan-sayfa-asdasd özelliklerinden birisi olacağına inanıyorum. girildiğinde sizin belirlediğiniz bir sayfa açılabilir. Bu olayı kullanmanın 2 ideal yöntemi var; • Sitenizin tamamına ya da bir dizine birincisi önceden öğrendiğimiz GET metodu sadece belirli bir IP’nin girebilmesini ile sayfa.php?sayfa=iletisim şeklinde, sağlayabilirsiniz. ya da POST metodu gibi “REQUEST_URI” ile Siteniz yapım aşamasındayken sadece sizin girip diğerlerini yapım aşamasında kullanmak. Hangisi kolayınıza geliyorsa onu seçebilirsiniz fakat benim favorim “REQUEST_ sayfasına yönlendirebilirsiniz. URI”den yana. • Özel dizinlere erişim engelleme. Sadece include edilen php dosyalarının olduğu bir klasörün kullanıcılar tarafından Yöntem 1: GET metodu kullanarak yapmak. girilmesini engelleyebilirsiniz. Öncelikle bir içerik sayfa.php‘miz olsun ve • Bazı web servisi botlarının sitenizi taramasını engelleyebilirsiniz. örnek amaçlı switch ile sayfaları tanımlayalım: Hoşunuza gitmeyen bir web arama motorunun ya da spam bir web servisinin <?php sitenizi taramasını engelleyebilirsiniz. if(!isset($_GET[‘sayfa’])) { // eğer boşsa 24 Htaccess; web alanında birçok faydalı yönlendirme işlerinin yapılmasını sağlayan, Apache web sunucularında olan etkili ve çok amaçlı bir ayar dosyasıdır. anasayfa varsayalım. $sayfa = ‘anasayfa’; } else { $sayfa = $_GET[‘sayfa’]; } switch($sayfa) { case ‘iletisim’: echo ‘<h2>İletişim</h2>’; echo ‘<p>Bize bilgi@site.com adresinden ulaşın!</p>’; echo ‘<p><a href=”/”>Anasayfa</a></p>’; break; case ‘hakkinda’: echo ‘<h2>Hakkında</h2>’; echo ‘<p>Bizi tanıyan tanır, yeniler örnek alır, tanımayanlar ibret alır.</p>’; echo ‘<p><a href=”/”>Anasayfa</a></p>’; break; case ‘anasayfa’: echo ‘<h2>Sitemize hoşgeldiniz!</h2>’; echo ‘<p><a href=”/hakkinda”>Hakkında</ a><br/>’; echo ‘<a href=”/iletisim”>İletişim</a></p>’; break; default: // hiç birisi değilse 404 varsayalim echo ‘<h2>Bulunamadı!</h2>’; echo ‘<p>Böyle bir sayfamız henüz yok, değiştirilmiş ya da silinmiş olabilir.</p>’; } Şuan htaccess kullanmadan bu sayfamızı “sayfa.php, sayfa.php?sayfa=hakkinda, sayfa. php?sayfa=iletisim” şeklinde kullanabiliriz. Şimdi gelelim bunu kullanıcı dostu yapmamıza, bu kısımda kod kısmımızda herhangi bir şey değiştirmemize gerek yok. Sitemizin ana dizinine “.htaccess” adında dosya oluşturuyoruz. Eğer FTP programınız ya da işletim sisteminiz böyle bir dosya oluşturmanıza izin vermiyorsa, not defterinden boş bir sayfa açıp kodları içerisine yazıp, farklı kaydet diyip, “Tüm dosyalar” seçeneğini seçip “.htaccess” yazıp bu dosyayı oluşturabilirsiniz. İçerisine şu satırları yazıyoruz: 25 RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ sayfa.php?sayfa=$1 [QSA,L] Bu işlemi yaptıktan sonra Htaccess; kullanıcılar eğer olmayan bir sayfaya girmeye çalışırlarsa, yani normalde /hakkinda ya da /iletisim gibi bir dizinimiz olmadığı için, 404 hata sayfasına değil de bizim sayfa.php dosyamıza yönlendirecek. Fakat yönlendirirken girilmiş olan sayfayı bizim dosyamıza “sayfa” GET parametresi olarak gönderek. Yani bu şekilde site.com/deneme diye girildiğinde arkaplanda çalışacak olan sayfa “site.com/sayfa.php?sayfa=deneme” olacaktır. Sonuç olarak yine aynı sistem çalışsa da kullanıcılar artık php dosyalarının adını ya da diğer GET parametresi uzantılarını yazmasına gerek kalmadan temiz ve akılda kalıcı bağlantılarla sitenizde gezebiliyor. Yöntem 2: REQUEST_URI ile yapmak. Diğer yöntemden tek farkı $_GET[‘sayfa’] yerine girilen adresi $_SERVER[‘REQUEST_URI’] ile okuyoruz. Fakat burada bize ilk baştaki “/” işaretini de veriyor (“/hakkinda” şeklinde). Bunun için ilk karekteri substr fonksiyonu ile atlıyoruz. Yani kod kısmımızın değiştireceğiz: ilk 5 satırını şöyle $sayfa = substr($_SERVER[‘REQUEST_URI’], 1); // ilk “/” karakterini atlıyoruz. if(!empty($sayfa)) { // eğer boşsa anasayfa varsayalım. $sayfa = ‘anasayfa’; } .htaccess dosyamızda da bu yöntem için bir satırlık değişiklik yapıyoruz, GET parametresi tanımladığımız kısmı siliyoruz: RewriteRule ^(.*)$ sayfa.php?sayfa=$1 [QSA,L] // yerine RewriteRule ^(.*)$ sayfa.php [L] Subdomain Ya Da Dizin Yönlendirme Bu blog üzerinde bir örneğini görebilirsiniz; phpr.org diye girmeye çalıştığınızda sizi otomatik olarak www.phpr.org adresine yönlendirir. Buradaki mevzu kişinin zevkine de bağlı olsa da daha çok arama motorları ile alakalı. Bazı durumlarda Google sitenizin “www” ekli olan ve olmayan halini farklı iki site gibi değerlendirebiliyor. Mesela bir sitenizin bir çok yerde linki hem “www” ile hem de olmadan paylaşılınca kısmen domain popülerliğini dağıtmış oluyor. Htaccess ile “www” olmadan girildiğinde ekleyerek kalıcı yönlendirme yapıldığında tüm ilgiler tek bir subdomain ve domainde toplanıyor. RewriteEngine On RewriteCond %{HTTP_HOST} phpr\.org [nc] RewriteRule (.*) http://www.phpr.org/$1 [R=301,L] İsterseniz tam tersini de yapabilirsiniz; RewriteEngine On RewriteCond %{HTTP_HOST} www\.phpr\.org [nc] RewriteRule (.*) http://phpr.org/$1 [R=301,L] Bir dizin yönlendirmek için de çok basit olarak tek bir satır ile yapabiliyoruz. Dikkat edilecek nokta dizini ne şekilde yönlendireceksiniz? Genel olarak kalıcı (301) ya da geçici (302) durumları kullanılır. Dahası için buraya bakabilirsiniz. Bazı Bot Ve Web Servislerinin Erişimini Engellemek İstemediğiniz ya da sitenizde aşırı dolaşıp yoran botları basit bir htaccess hamlesiyle engelleyip sunucunuzu rahatlatabilirsiniz. Şu adreste genel olarak mimlenmiş kötü amaçlı olduğu düşünülen tüm botların bu yöntem için olan listesini bulabilirsiniz. Ben örnek amaçlı bir kaç tanesini yazacağım. RewriteEngine On RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR] RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR] RewriteCond %{HTTP_USER_AGENT} ^Wget [OR] RewriteCond %{HTTP_USER_AGENT} ^Widow [OR] RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR] RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR] RewriteCond %{HTTP_USER_AGENT} ^Zeus RewriteRule .* - [F] Eğer kalıcı yönlendirme (301) derseniz arama motorları girilen adresdeki indexleri yeni yönlenen adres ile değiştirir. Geçici derseniz herhangi bir değişiklik yapmadan yönlenen adrese girer ve tarar. Ayrıca bu yöntem ile mobilden giren kişileri de RewriteEngine On RewriteRule ^eski_adres$ /yeni_adres [R=301,L] Hata Sayfalarını Yönlendirme Hata sayfalarının durum kodlarını öğrenmek için şuraya bakabilirsiniz. Bunlardan en yaygın olarak bildiğimiz; 404 kodlu sayfa bulunamadı, bir diğer örnek olarak da 403 kodlu giriş izni olmayan sayfa hatasıdır. Dikkat etmeniz gereken nokta; yukarıda SEO ve kullanıcı dostu bağlantılar oluşturma yönteminin temeli, olmayan sayfaları yani 404 kodlu sayfaları bizim belirli dosyamıza yönlendirme olduğu için o yöntemi kullanırken bu aşağıdaki kodlar ile 404 sayfası tanımlamaya çalışmak faydasız olacaktır. RewriteCond %{REQUEST_URI} !^/mobil_dizin/.*$ RewriteCond %{HTTP_USER_AGENT} “android|blackberry|ipad|iphone|ipod|iemobile| opera mobile|palmos|webos|googlebot-mobile” [NC] RewriteRule ^(.*)$ /mobil_dizin/ [L,R=302] Özel Dizinleri Şifrelemek Bu yöntem için öncelikle basit bir şifre dosyası oluşturmamız gerekiyor. Dosyanın içerisine her satıra bir kullanıcı ekleyebiliyoruz. Ve her satırda “isim:şifre” şeklinde kullanıcı adı ve şifreleri tanımlıyoruz. Şifre dosyamızın adını .htpasswd yapıp .htaccess dosyamızda belirteceğmiz bir yere yerleştiriyoruz. Sonrasında bu bilgiler ile şifrelemek istediğimizin dizinin içerisine aşağıdakileri yazıyoruz. ErrorDocument 403 /izin_yok.html ErrorDocument 404 /bulunamadi.html AuthUserFile /dosya/dizini/.htpasswd AuthType Basic AuthName “Gizli Dizin” Belirli IP Adresine Izin Verme/Engelleme İçeriklerin Başka Engellemek Tüm bir siteyi olduğu gibi isterseniz sadece belirli klasörlere göre de IP erişim engeli koyabilirsiniz. Bunu yapmak için hazırladığınız “.htaccess” dosyasını ilgili alt klasörün içerisine koymanız yeterli. deny from all #herkesin girmesini engelle allow from 127.0.0.1 #bu ip adresine izin ver allow from 192.168.0.0/255 #ya da bu ip blokunun girmesine izin ver 26 algılayıp mobil sitenize yönlendirilmesinde de kullanabilirsiniz. Ayrıca sadece “deny from all” diyerek kullanıcılar tarafından erişimini tamamen engelleyebilirsiniz. Sitelerde Kullanılmasını Hotlink adıyla bilinen bu yöntem sayesinde sitenizde olan müzik, resim, video gibi içeriklerin başka sitelerde gösterilip, oynatılmasını engellemenizi sağlıyor. Bu sayede sunucunuzun bant genişliğinin başka siteler üzerinden harcanmasına engel oluyorsunuz. Bu yöntemde başka siteden bizdeki bir resim görüntülenmek istendiğinde ona istenilen resim yerine bir hotlink uyarı resmi gösterebiliyoruz. Bunun çokça örneğini imageshack.us’da görmüşsünüzdür. RewriteEngine on RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://([-a-z09]+\.)?phpr\.org[NC] RewriteRule .*\.(zip|mp3|avi|wmv|mpg|mpeg)$ http:// www.phpr.org/hotlink.jpg [R,NC,L] Dikkat Edilmesi Gereken Bazı Detaylar Farkettiyseniz yukarıda gösterdiğim yöntemlerin neredeyse hepsinde ilk “RewriteEngine on” komutu var. Eğer bu yöntemlerden bir kaçını birlikte kullanacaksanız tekrar tekrar bu satırı eklemenize gerek yok. Bunu sadece htaccess dosyanızın en başında bir kere yazmanız yeterlidir. Diğer önemli husulardan birisi de birden fazla komut kullanırken işlemlerin sıralamasının öneminin olduğunu unutmayın. Yani eğer ilk önce 404 hata sayfası uyarı komutunu yazıp, alt satırına SEO dostu bağlantı komutlarını yazarsanız, önce 404 hata sayfa komutu tetiklenip ilgili yere gideceği için SEO dostu bağlantı yöntemi çalışmaz. Parantez içlerinde kullanılan NC, L ve R harflerinin anlamları: • L: Last Bu tanımlanmadan önce ifade edilen kurallar bundan sonrakilere geçmemesini ve karışmamasını sağlar. • R: Redirect Bu değer kullanılırsa browserda adres değişir, kullanılmazsa yönlendirme arkaplanda yapılır fakat kullanıcının girdiği URL aynı kalır • NC: No Case Büyük küçük harfe duyarsız davranır. • QSA: Query String Append GET metodu ile yönlendirme yaptığımızda yönlendirilen yere sonuna eklenen GET parametrelerini de dahil eder. Diğer tüm ifadeler için http://httpd.apache.org/ docs/2.2/mod/mod_rewrite.html#rewriteflags bakabilirsiniz. Musa Avcı 27 @musa_avci www.phpr.org