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
[email protected]
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
[email protected]
www.erolyapici.com
git config --global user.email [email protected]
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 [email protected]
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 [email protected]: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
[email protected]
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 [email protected] 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

Benzer belgeler