18 Aralık 2013 Çarşamba

FastCGI, Nginx Yapılandırması

Bu yapılandırmayı neden kullanmam gerekti öncelikle ondan bahsedeyim. 

Bu yıl yapmaya çalıştığım işlerden biri de Haproxy için web arayüzü yazmak. Stajda Flask kullanarak yazdığım 'Hapra' uygulamasını temel alacağı ve o uygulamanın çıktıları arayüzde gerektiği için  Hapra'nın sürekli çalışır durumda olması gerekiyordu.

Sunucuya nginx'i kurduktan sonra Flask için bu işin FastCGI ile yapılabileceğini öğrendim. 

Nginx ile WSGI uygulamasını kullanmak için önce bir FastCGI sunucu gerekiyor. En çok kullanılanı Flup  olduğu için onu kurdum.
#apt-get install python-flup

Adımlar sırayla şöyle:
1. Önce Flask ile yazılan uygulamamızı /var/www altına taşımalıyız.
2. Uygulamanın içine a.fcgi dosyası oluşturup aşağıdakileri yazmalıyız.
    
#!/usr/bin/python 
from flup.server.fcgi import WSGIServer 
from yourapplication import app 

if __name__ == '__main__': 
    WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()
  
*Burada  'yourapplication' ve 'app' kısmını kendi uygulamanıza göre değiştirmelisiniz.

3. a.fcgi'ye çalışma izni vermeliyiz.

#chmod +x a.fcgi

#chown -R www-data:www-data klasoradi

4. #vim /etc/nginx/sites-enabled/default

5. Bu yapılandırma dosyasında 'location/' satırını yorum satırı yapıp aşağıdaki satırları eklemeliyiz.

location / { try_files $uri @yourapplication; } 
location @yourapplication { 
    include fastcgi_params; 
    fastcgi_param PATH_INFO $fastcgi_script_name;
    fastcgi_param SCRIPT_NAME ""; 
    fastcgi_pass unix:/tmp/yourapplication-fcgi.sock; }

Son satırı değiştirip a.fcgi'de belirttiğiniz yolu yazmalısınız.

6. service nginx restart
7. su www-data

Yapılandırmadaki değişiklikten sonra nginx'i yeniden başlattık, www-data kullanıcısı olduk.

8. screen
a.fcgi arkada hep çalışır durumda olmalı. Bu yüzden screen komutunu kullandık.

9. /var/www/yourapplication/a.fcgi
Son olarak .fcgi dosyasını çalıştırdığımızda uygulamamız sürekli çalışır durumda olacaktır.

Görüşmek üzere..



 


Screen Kullanımı

Merhabalar, bu yazımda sunucuda yapılandırma yaparken kulandığım screen komutundan ve temel kullanımından bahsedeceğim.

Uzak bağlantılarda birden fazla uçbirim açmak için 'screen' komutu kullanılıyor.

Yüklü değilse,

deb paket yöneticisi kullanıyorsanız: #apt-get install screen 
rpm paket yöneticisi kullanıyorsanız: #yum install screen
dedikten sonra komutu kullanabilirsiniz.

screen                                                                                                                        

Bu komutu verdiğimizde aşağıdaki gibi bir ekranla karşılaşacağız.


Bu kısımdan sonra görülen komut satırı yeni açtığınız ekrandır.
Çalışan ekranları görmek için 'screen -ls' ya da 'screen -list' komutlarını kullanabilirsiniz.

Ctrl-a screen'de komut verileceğini belirtir.

Örneğin Ctrl-a-d ekranı arka plana atar. 'screen ls' diyerek ekranın durumunu görürüz.

Bağlanmak istediğimiz ekran için 'screen -r ekran_numarası' komutu kullanılır.

Bazı Kısayollar:

C+a+c (yeni pencere)
C+a+" (pencere listesi)
C+a+d (pencereyi arka plana alma)
C+a+0 (0 numaralı pencereye geçiş yapar)
C+a+A (isim verme)
C+a C+a (açık pencereler arasında sırayla geçiş)
C+a+n ya da space ya da p (sonraki/önceki ekran)
C+a+K ya da exit (ekranı kapatma, exit sormadan kapatır)
Ctrl-a ? (Kısayolları görüntüler)
Ctrl+A [ (Kopyala)
Ctrl+A ] (Yapıştır)

Daha çok parametresi için 'screen --help' ile sizleri başbaşa bırakıyorum.

12 Aralık 2013 Perşembe

INET-TR’13

Bu yıl 18.si düzenlenen Türkiye'de İnternet Konferansı,  9-11 Aralık tarihinde İstanbul Üniversitesi'nde gerçekleşti. Kendime kısa bir tatil ilan ettiğim için, etkinliğe Bolu'dan katıldım. 

Hava şartları ve İstanbul'un trafiği berbattı. Çomü'den katılanlarla Kongre Merkezi'nde buluştum. (+Necdet Yücel, +Ebru Akagunduz, +Esra Altintas+Berk Güreken, +Faruk Uzun, +Feyza Yavuz, +Ayşe Melike Yurtoğlu ve +yeliz taneroğlu )

Sabahki +Ebru Akagunduz ve Tülin İzer'in "Linux Çekirdeğine Nasıl Katkı Verilir?" sunumunu ne yazık ki kaçırdım. Ama buradan benim gibi izleyebilirsiniz :)  

Öğleden sonra +Çağdaş Direk'in "Müzik ve Medya Dünyası için Özgür Yazılımlar" sunumuna katıldım. Sunumda Teknolojik aletler geliştikçe ses kalitesindeki değişimin nasıl olduğundan, yazılımsal ve donanımsal olarak bu kaliteyi nasıl değiştirebileceğimizden, geliştirilen yazılımlardan ve özelliklerinden bahsedildi. Müzikle ilgilendiğimden benim için yararlı geçen bir sunumdu.

Bir de "Toplumsal Olaylar, Sosyal Medya ve Hukuk" paneline katıldım. 
Konuşmacılar: Ebru Baranseli(Moderatör), Başak Purut(Ekşi Sözlük), Hande Kuday,Efkan Bolaç, Gökhan Ahi(Bilgi Üniversitesi).  Toplumsal olaylar sırasında sosyal medya kullanımından, kullanıcıların yasal haklarından bahsedilen panel, soru-cevap şeklinde sona erdi. 

Elazığ'dan kalkıp gelen, twitterdan bildiğim +sümeyye Bazna ile burada tanıştık. Çok da memnun oldum:)

Etkinlikten sonra +Kaan Ozdincer de bize katıldı. Kadıköy'de otobüs saatine kadar bolca muhabbet etme fırsatımız oldu.

Yine çok eğlendiğim, 'iyi ki de gitmişim' dediğim bir etkinlik oldu :)



30 Kasım 2013 Cumartesi

Özgür Web Teknoloji Günleri 2013

Geçtiğimiz hafta Yeditepe Üniversitesi'nde gerçekleşen 'Özgür Web Teknoloji Günleri' hakkında ben de birşeyler yazmak istedim.

Etkinliğe +Necdet Yücel ve +Ebru Akagunduz ile birlikte katıldık. ÇOMÜ'den daha çok öğrenci ile katılmak isterdik ama vize dönemi bitmemişti.

Bu sene etkinliğin genel konusu ölçeklenebilirlikti. Konuşmalar 3 salonda paralel olarak yapıldı. İlk gün birkaç sunum dinledim. Katılımcıların fazla olduğunu söyleyemeyeceğim.

Etkinliğin ikinci günü Ebru ile birlikte konuşma yaptık. Ebru, Yakından Eğitim'de geliştirdiği Couchbase Nagios eklentisinden bahsetti. Ben de staj dönemimde +Kaan Ozdincer ile üzerinde çalıştığımız Haproxy kitaplığından ve web uygulamasından bahsettim. 

İlk kez bir topluluk karşısına çıkıp birşeyler anlattım. İtiraf etmeliyim ki dışarıdan göründüğü kadar kolay değilmiş. Ne kadar heyecanlansam da benim için çok güzel bir deneyim oldu. Sonraki konuşmalarımda bu kadar heyecanlanmam sanırım :)

Etkinlikten sonra mezunlarla bolca zaman geçirdik. Benim için hem faydalı hem de çok eğlenceliydi.




3 Kasım 2013 Pazar

Qmail Kurulumu

Merhabalar, geçen yazımda biraz Qmail'den bahsetmiştim. Kurulumu bitirince nasıl olduğunu paylaşayım istedim.

Qmail'i kurmadan önce hostname(e-posta sunucu ismi) DNS sunucuda kayıtlı ve sorgulanabilir olmalı. Ayrıca bazı yazılımların kurulu olması gerekiyor.

ucspi-tcp: Tcp tetikleyicisidir. Gelen tcp isteklerini dinleyip, istekler için uygun programları çalışmaları için tetikler.

Yazılımı kurmak için önce buradan indirelim.

#gunzip ucspi-tcp-0.88.tar.gz
#tar -xf ucspi-tcp-0.88.tar
#cd  ucspi-tcp-0.88
#make setup check

!! Glibc'nin 2.3.1 ve daha üst versiyonunu kullanıyorsanız (ldd --version ile öğrenebilirsiniz) "#make setup check" demeden önce error.h dosyasında "extern int errno;" satırını "#include <errno.h>" diye değiştirmelisiniz. 

daemontools: Unix servis yönetim programıdır. Duran servis varsa 'run' betiği ile servisi yeniden başlatır. Multilog sistem günlüklerini tutar. Belirlenen buyutu aşarsa günlükleri arşivler. Bu yazılımı da kurmadan önce '/package' diye bir dizin oluşturalım.

#mkdir -p /package
#chmod 1755 /package

Erişim iznini  1755 ile "drwxr-xr-t" haline geldi. Burada 't' sticky bitin belirlendiğini gösteriyor. Bu sayede sadece dosya sahibi erişimde değişiklik yapabilir ve dosyayı silebilir.

Şimdi yazılımı  package dizinine indirip kuralım. 

#cd /package
#gunzip daemontools-0.76.tar.gz
#tar -xpf  daemontools-0.76.tar
#rm daemontools-0.76.tar
#cd admin/daemontools-0.76
#./package/install

Yine Glibc'nin 2.3.1 üstü versiyonunu kullanıyorsanız son komuttan önce "/package/admin/daemontools-0.76/src/error.h" dosyasında "extern int errno;" satırını "#include <errno.h>" diye değiştirmelisiniz.

Kurulumdan sonra daemontools çalışıyor mu diye bakmak istersek:

#ps aux| grep svscan

Qmail için /var/qmail dizinini oluşturalım.

#mkdir /var/qmail

Qmail çeşiti görevleri yürütmek için sistem kullanıcı ve gruplarına ihtiyaç duyar. Nedeni de qmail yazarı D.J.Bernstein'in sistem kütüphanelerine güvenmemesi.Derlemeden önce UID'ler tespit edilip program içine gömülür. Bu nedenle gerekli kullanıcı ve gruplar oluşturulmalı.

#groupadd nofiles
#useradd -g nofiles -d /var/qmail qmaild
#useradd -g nofiles -d /var/qmail/alias alias
#useradd -g nofiles -d /var/qmail qmaill
#useradd -g nofiles -d /var/qmail qmailp

#groupadd qmail
#useradd -g qmail -d /var/qmail qmailq
#useradd -g qmail -d /var/qmail qmailr
#useradd -g qmail -d /var/qmail qmails

Şimdi qmail'i indirip aşağıdaki komutları verelim.

#gunzip qmail-1.03.tar.gz
#tar -xf  qmail-1.03.tar
#cd qmail-1.03
#make setup check

Derlemeden sonra Qmail'i yapılandırmalıyız. Eğer DNS ayarları düzgün çalışıyorsa "#./config" ile yapılandırma başlatılır.

DNS geçici nedenlerle çalışmıyorsa host ismini bulamadığından olabilir.

#./config-fast host adı.alan adı

Şimdi de açılış betiklerini oluşturalım.

#vi /var/qmail/rc

#!/bin/sh
exec env - PATH="/var/pmail/bin:$PATH"  \
qmail-start "`cat /var/qmail/control/defaultdelivery`"

E-postanın nasıl dağıtılacağı da defaultdelivery dosyasından okunacak.

# echo ./Maildir/ > /var/qmail/control/defaultdelivery

rc dosyasının da izinlerini verelim.

#chmod 755 /var/qmail/rc

Qmail servisleri için supervise dizinleri ve günlük dizinleri oluşturalım.

#mkdir -p /var/qmail/supervise/qmail-send/log
#mkdir -p /var/qmail/supervise/qmail-smtpd/log
#mkdir -p /var/qmail/supervise/qmail-smtpd
#chown -R qmaill /var/log/qmail

Her biri için çalıştırma betikleri oluşturalım.

#vi /var/qmail/supervise/qmail-send/run

#!/bin/sh
exec /var/qmail/rc

#vi /var/qmail/supervise/qmail-smtpd/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \
/usr/local/bin/multilog t /var/log/qmail/smtpd

#vi /var/qmail/supervise/qmail-smtpd/run

#!/bin/sh
QMAILDUID= `id -u qmaild`
NOFILESGID= `id -g qmaild`
MAXSMTPD= `cat /var/qmail/control/concurrencyincoming`
exec /usr/local/bin/softlimit -m 8000000 \
/usr/local/bin/tcpserver -v -H -R -l 0 -x \
/etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u "$QMAILDUID" -g "$NOFILESGID" 0 smtp /var/qmail/bin/qmail-smtpd 2>&1

concurrencyincoming, aynı anda tcp sunucusu tarafından kabul edilecek bağlantı sayısını belirler.

#echo 150 > /var/qmail/control/concurrencyincoming
#chmod 644 /var/qmail/control/concurrencyincoming

#vi /var/qmail/supervise/qmail-smtpd/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \
/usr/local/bin/multilog t /var/log/qmail/smtpd

Bu betiklere çalışma hakkı verelim.

#chmod 755 /var/qmail/supervise/qmail-send/run
#chmod 755 /var/qmail/supervise/qmail-send/log/run
#chmod 755 /var/qmail/supervise/qmail-smtpd/run
#chmod 755 /var/qmail/supervise/qmail-smtpd/log/run

Daemontools tarafından çalıştırılsın istiyorsak /service dizinine link oluşturmalıyız.

#ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /service

qmailctl betiği çalışıyorsa link oluşturduktan sonra qmail çalışacaktır. Çalışmıyorsa qmailctl başlatılır.

#qmailctl start

Sunucu kendi üstünden SMTP ile e-posta teslimine izin vermek için /etc/tcp.smtp'ye şu satırları ekleyelim.

#echo 127.:allow,RELAYCLIENT= >> /etc/tcp.smtp
#tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp </etc/tcp.smtp

Alias Tanımları:

Qmail kurulumunda en az 3 alias tanımlanmalı.
postmaster: Sistem yöneticisine yönlendirilmeli.
mailer-daemon: Geri dönen e-postalar için standart alıcı.
root: Sistem yöneticisine yönlendirilmeli.

#echo aybuke > /var/qmail/alias/.qmail-root
#echo aybuke > /var/qmail/alias/.qmail-postmaster
#echo aybuke > /var/qmail/alias/.qmail-mailer-daemon
#chmod 644 /var/qmail/alias/.*

#qmailctl start

#qmail stat (4 servis de başlamış olmalı)

Kullanıcı Hesabı Açma:

#groupadd personel
#useradd -g personel -d /home/personel/olric olric
#/var/qmail/bin/maildirmake /home/personel/olric/Maildir
#echo ./Maildir/ > /home/personel/olric/.qmail
#chown -Rolric:personel /home/personel/olric/Maildir
#chown -Rolric:personel /home/personel/olric/.qmail

Test etmek için "#/var/qmail/bin/qmail-inject" diyoruz.Burada yerel kullanıcıya da uzak bir sunucuya e-posta gönderimi yaplabilir.

Deneme takibi için de :
#tail -f /var/log/qmail/current komutunu kullanabiliriz.

Daha ayrıntılı bakmak isteyenler için: http://cr.yp.to/ adresini önerebilirim.
Ayrıca Türkçe kaynak için de benim de okuduğum İsmail Yenigül, Barış Şimşek ve Huzeyfe Önal'ın Qmail kitabını tavsiye ederim.

Kolay gelsin.

23 Ekim 2013 Çarşamba

Bootstrap'a Giriş

Bootstrap, hızlı ve daha kolay web uygulaması ya da sitesi geliştirmek için çokça tercih edilen bir frameworktür. 
"Mark Otto" ve "Jacob Thornton" tarafından oluşturulmuş ve hala sürdürülüyor. Twitter, Bootstrap'ı  Apache 2 ile lisanslayarak açık kaynak yapmış.

İndirmek için 3 seçenek:

1. git clone git://github.com/twbs/bootstrap.git
2. bower install bootstrap
3. son sürüm için tıklayın.

İçerik:

bootstrap/
├── css/
│   ├── bootstrap.css
│   ├── bootstrap.min.css
│   ├── bootstrap-theme.css
│   └── bootstrap-theme.min.css
├── js/
│   ├── bootstrap.js
│   └── bootstrap.min.js
└── fonts/
    ├── glyphicons-halflings-regular.eot
    ├── glyphicons-halflings-regular.svg
    ├── glyphicons-halflings-regular.ttf
    └── glyphicons-halflings-regular.woff
 

Bu dosyalardan yararlanabilmek için oluşturmak istediğimiz HTML sayfasını bootstrap klasörünün içine taşımalıyız. 

Şimdik basit bir giriş sayfası tasarlayalım. 
Önce DOCTYPE'ı tanıtalım, html taglarımızı yazalım ve bootstrap'ı kullanabilmek için yolunu ekleyelim.


Head kısmına sayfa başlığını da ekleyelim.
    <title>Hello Bootstrap</title

Body kısmında bir form oluşturalım.  "well" sınıfı Bootstrap'ın içerisinde yer alıyor.
Sonra kullanıcı adı ve parolası etiketlerini oluşturuyoruz. Altına bir text alanı oluşturuyoruz. Son olarak da giriş butonu ekliyoruz. Burada "span3" text kutusunun 3 birim olacağını anlatıyor, "placeholder" ise text kutusunun içine kısa bir açıklama için kullanılabilir.
  
    <form class="well">
     <label>Username:</label>
     <br />
     <input type="text" class="span3" placeholder="Username" />
     <br />
     <label>Password:</label>
     <br />
     <input type="text" class="span3" placeholder="Password">
     <br />
     <br />
     <button class="btn btn-primary">Login</button>
     </form>

Son olarak sayfamız:



Bir de listeleri kullanalım.

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>Hello Bootstrap</title>
    <link type="text/css" rel="stylesheet" href="css/bootstrap.css">
  </head>


  <body>
  <ul class="nav nav-list">
   <li><a href="#"> Home</a></li>
   <li><a href="#"> Profil</a></li>
   <li><a href="#"> Message</a></li>
   <li><a href="#"> Log Out</a></li>
  </ul>
  <script src="js/bootstrap.js"></script>
  </body>
</html>


Son olarak da ızgaralar ile küçük bir uygulama yapalım.

<!DOCTYPE html>
<html>
<head>
    <title>Hello Bootstrap</title>
    <link href="css/bootstrap.min.css" rel="stylesheet" />

    <style>
    .row > div {
        background-color: #dedef8;
        box-shadow: inset 1px -1px 1px #444, inset -1px 1px 1px #444;
    }
    </style>

</head>
<body>
    <div class="container">

        <h1>Hello Bootstrap</h1>

        <div class="row">

            <div class="col-md-3">
                <p>Part 1</p>
            </div>

            <div class="col-md-9">

                <div class="row">
                    <div class="col-md-6">
                        <p>Part 2</p>
                    </div>
                    <div class="col-md-6">
                        <p>Part 3</p>
                    </div>
                </div>

                <div class="row">
                    <div class="col-md-6">
                        <p>Part 4</p>
                    </div>
                    <div class="col-md-6">
                        <p>Part 5</p>
                    </div>
                </div>

            </div>

        </div>

    </div>
</body>
</html>
 
Burada farklı olarak style tagları içinde satırların özelliklerini yazdık.Daha sonra <div> tagları ile ızgaraları istediğimiz şekilde ekleyebiliriz. Çıktımız da aşağıdaki gibi olmalı.

 
 
 

20 Ekim 2013 Pazar

Qmail Hakkında


Merhabalar, bu yazımda sizlere Qmail'i tanıtmak istedim. Qmail Kitabı'nı bayramda okumaya başladım ancak yapılandırma kısmı bitmedi. Tam bitirdikten sonra ayrıntısıyla  kurulum ve yapılandırmasını da yazacağım.

E-posta servisinin sunucu-istemci mimarisinde çalışmasını sağlayan MTA, MUA, LDA gibi programlar vardır.

MTU(Mail User Agent): Kullanıcının bir e-posta sunucusu kullanarak e-posta alıp, göndermesini sağlayan yazılımlardır. Thunderbird, Outlook vs. e-posta istemcisidir.

MTA(Mail Transfer Agent): SMTP(Simple MaiI Transfer Protocol) kullanarak aldığı e-postayı diğerine ileten ya da  iletilen e-postayı teslim alan yazılımlardır. Qmail, Sendmail, Postfix örnek verilebilir.

LDA(Local Delivery Agent): Hedef e-posta adresi yerelde tanımlı olduğunda, LDA gelen e-postayı sistemde ilgili yere yazar.

Qmail, Dan Bernstein (D.J.B.) tarafından Sendmail'in yerine başka bir MTA kullanılsın diye Sendmail'deki güvenlik açıkları nedeni ile yazılmıştır. 

Yazarı güvenlik açığı bulan ilk kişiye 500$ ödül vereceğini söylemiş. Bildirisine buradan ulaşabilirsiniz. Henüz ödülü kazanan birileri çıkmamış.

Qmail; E-posta alma, gönderme, SMTP servisini çalıştırma gibi işler için ayrı programlar çalışmaktadır. Sendmail'de ise bu işi yapan tek bir program bulunmaktadır. Karmaşık ve uzun kodlarda hata olma olasılığı fazladır ve okunabilirliği zordur. Bu da Qmail'in güvenli ve basit olduğunu gösterir. 

Qmail Lisansı: Kodları istediğiniz şekilde kullanabilir ancak değişiklik yaptığınızda izinsiz dağıtamazsınız. 

Qmail'i altyapısında kullanan bazı e-posta sunucuları:

Yahoo! Mail
Mynet Mail
Superonline
Gmail
Network Solutions
PayPal/Confinity...





6 Ekim 2013 Pazar

Python-Haproxy-Tools ve Hapra(Haproxy Restful Api) Nedir?

Merhabalar,

Bu yazımda staj boyunca Kaan ile üzerinde çalıştığımız 2 projenin ne iş yaptığından bahsedeceğim.


İlk projemiz Python-Haproxy-Tools. Haproxy'nin yapılandırma dosyası için Python kullanarak yazdığımız bir yönetim kütüphanesi. Yapılandırma dosyasında değişiklikler yapabileceğimiz fonksiyonlardan oluşuyor. Böylece yapılandırma dosyasını her seferinde açıp ayarlamak yapmak yerine fonksiyonları kullanarak bu işi daha rahat yapabiliyoruz. Yapılan değişiklik sonucunda yapılandırma dosyası çalışır halde mi bunu da kontrol edebiliyoruz. 

Bu süreçte Python ile nesneye yönelik programlamayı, Haproxy'nin özelliklerini ve yapılandırma dosyasının  ne olduğunu ne işe yapadığını öğrendim.

İkinci projemiz Hapra ise bu kütüphane için yazılmış bir web api. Restful desteği olduğu ve framework'un yapısıyla ayrıca uğraşmak istemediğimiz için Flask diye bir microframework kullandık. Hapra sayesinde web api üzerinden de yapılandırma dosyası ayarı yapabiliyoruz. Çıktılarını da Json formatında yaptık nedeni ise, çıktısı tek türde olsun ki dileyen telefon, tablet vs. için de uygulama yazarsa rahatça  uyarlanabilsin.

Web api ile ilgilenirken de Flask'ı, Json'un nasıl kullanıldığını ve Restful'un özelliklerini  öğrendim.

Ayrıca github kullanımı, hata aratma gibi çalışırken hep lazım olan alışkanlıklar edindim. 

İleride başka projeler de anlatmak dileğiyle, iyi çalışmalar...

11 Eylül 2013 Çarşamba

Yaz Stajım-1


Merhabalar,

İlk stajımın nasıl geçtiğini sizlere de anlatayım istedim.

Stajımı Gamegos'da, Kaan ve İşbaran'ın yanında yaptım. İkisi de şirketin sistem yöneticisi.

Yaklaşık bir yıldır sistem yöneticisi olmak hedeflerim içine olduğu için yaptıkları iş fazlasıyla ilgimi çekti. Staj sayesinde bu işin kişiye nasıl sorumluluklar yüklediğini yakından gördüm. İş hayatı hakkında fikir sahibi oldum. İzlediğim kadarıyla zor bir iş ama hala ilgimi çekiyor :)

İstanbul'a gitmeden önce, Kaan'ların bana verecekleri iş hakkında biraz konuşmuştuk. Bilmem gereken çok konu vardı. Anlayacağınız dökümanlar, kitaplar okuyarak, küçük alıştırmalar yaparak geçen bir staj hazırlığı dönemim oldu.

İstanbul'a gittiğimde uğraştığım iş ise, HAproxy yapılandırma dosyası için bir kütüphane ve bu kütüphane için de bir rest api yazmaktı. Kütüphane yazarken Python nesne yönelimli programlama hakkında, Rest api yazarken de Flask ve JSon hakkında çok şey öğrendim.

Beni böyle çalıştırdıkları, yardımları ve dolu dolu geçen bu stajım için Necdet Hocam'a, Kaan'a ve İşbaran'a buradan da teşekkür edeyim :)

Ayrıca İstanbul'da bana evini açan Özge'ye ve harika yemekler yapan Hatice Teyzeye de teşekkür ederim. Staj süresince evimde gibiydim hep. Sohbet ettikçe Adana'yı gezmeye karar verdim. Yeniden misafirleri olacağım :)




28 Ağustos 2013 Çarşamba

Restful(REpresentational State Transfer) Giriş

Restful (temsili durum transferi) web hizmetleri ve web apiler için standart bir mimari tasarımdır. Kurallar bütünü gibi düşünülebilir.Amacı istemci sunucu arasındaki alışverişi HTTP üzerinden sağlamak.

Rest sistemindeki özellikler 6 bölümde incelenir.

1. istemci-sunucu mimarisi: İstemcinin sunucu tarafındaki veri kaynağı hakkında hiç birşey bilmemesi, Server'ın da doğru istekler geldiği sürece doğru yanıtı vermesidir.

2.Stateless:  Sunucu kısmında bir durumun tutulmadığını anlatır. İstemci tarafından yapılan sorgular sunucunun cevap verebilmesi için gerekli tüm bilgiyi taşır.

3.Cacheable: Http yanıtları önbelleklenebilir olabilir Bu nedenle sunucu, yanıtlarının bu özelliğe sahip olup olmadığını belirtmelidir.

4.Uniform İnterface: Bir istemci ve sunucu arasındaki iletişim yöntemi tek tip olmalıdır. Böylece her parça bağımsız şekilde değişebilir.

5Layered System: Burada kast edilen aslında istemcinin son sunucuya mı yoksa bir aracı sunucuya mı bağlandığını bilmiyor olması, yani her katman aslında tek bir katmanı biliyor.

6. Code on Daemon: Sunucu bazen istemci tarafına çalıştırılabilir kod veya komut dosyaları sağlayabilir.

Rest mimarisi http protokolüne uygun tasarlanmıştır. Http methodları ve anlamları aşağıdaki tabloda anlatılmış.


Birdahaki yazımda restful özelliği olan bir microframework(Flask) ile web api örneği yazacağım. 

Görüşmek üzere...

22 Ağustos 2013 Perşembe

Python'da Sınıflar ve Miras Alma

 Nesne tabanlı programlama denildiğinde akla gelen ilk şey sınıflardır. Sınıf dediğimiz kavram fonksiyonlara benzer. Fonksiyonlarda nasıl veri tipleri ve değişkenleri tekrar kullanmak için bir yerde toplayabiliyorsak, yazdığımız sınıflarda da nesnenin özelliklerini toplayabiliyoruz.

Sınıflarla ilgili birkaç kavramdan bahsedeyim.

-Sınıf Değişkeni:  Bir sınıfın tüm örnekleri tarafından paylaşılan değişkendir. Sınıf değişkenleri sınıf içinde tanımlanır fakat dışında sınıf metodudur.

-Fonksiyonu Aşırı Yükleme: Belirli bir işleve birden fazla davranış atamak.

-Operatör aşırı yükleme: Belirli bir operatör için birden fazla fonksiyon atamak.

-Miras Alma: Bir sınıftan türetilen diğer sınıflar için, o sınıfın özelliklerinin devri anlamındadır. 

Sınıf Oluşturma:

"class className: " şeklinde oluşturulur. Aşağıdaki kod parçasını deneme.py dosyasına yazalım.


class Employee: 
    empCount = 0
     
    def __init__(self, name, salary): 
       self.name = name  
       self.salary = salary 
       Employee.empCount += 1 
    def displayCount(self): 
       print "Total Employee %d" % Employee.empCount  
    def displayEmployee(self): 
       print "Name : ", self.name, ",Salary: ", self.salary

nesnelerini oluştururken Python'u çalıştırıp önce "from deneme import Employee" diyerek sınıftaki özellikleri kullanılabilir hale getiriyoruz.

emp1 = Employee("aybuke", "5000")

diyerek de nesnemizi oluşturabiliriz.

Bazı niteliklere erişmek için de aşağıdaki fonksiyonlar kulanılanılabilir:
- getattr(obj, name, [default]): nesne niteliğine erişmek için.
-hasattr(obj, name): niteliğin olup olmadığını kontrol etmek için.
-setattr(obj, name, value): nitelik ayarlamak için. Yoksa niteliği oluşturacaktır.
-delattr(obj, name): niteliği silmek için.

Dahili Sınıf Özellikleri: 

Nokta operatörü ile sınıf özelliklerine rahatça erişilir.

__dict__ : İsimuzaylarının bulunduğu sözlük.

__doc__: sınıf belgeleri tanımlandıysa buradadır.

__name__: sınıf adını bulundurur.

__module__: sınıfın tanımladığı modül adı. Etkileşimli modda __main__'dir.

__bases__:  Temel sınıf listesinde oluşma sırasına göre temel sınıfları barındıran, bir olasılıkla boş taban sınıfları. 

Miras Alma:

önce miras alınacak sınıfımızı oluşturalım.

class Animal(object): 
''' Our animal object '''
     def __init__(self,name,animalType): 
        print "I am a ",animalType 
    def makeNoise(self,noise): 
        print noise def sleep(self): 
        print "zzzz" 
    def eat(self,food): 
        print "Eating ",food

daha sonra alt sınıfımızı yazalım.

class Tiger(Animal):
    def __init__(self, name):
        super(Tiger, self).__init__(name, Tiger)
        self.makenoise('roar')
    def stalk(self):
        print 'talking an antelope'
        self.eat('anthelope meat')
yukarıda kullandığımız  "super" methodunun işlevi de şu aslında:

class A(object):
    
     def __init__(self):
     print ('running A .__init__')

class B(A):
     
     def __init__(self):
     print('running B.__init__')
     A.__init__(self)
     #super(B,self).__init__()

Sonraki yazımda görüşmek üzere..

15 Ağustos 2013 Perşembe

Pythonda Listeler, Tüpler, Sözlükler

Listeler, birden fazla değerin tutulabildiği veri tipleridir . Listelere eleman eklenip çıkartılabilir. İndeksleme sıfırdan başlar. Tanımlarken köşeli parantez [] kullanılır.

Tüpler, listelere benzer ancak içindeki değerleri değiştiremeyiz.Tanımlarken () parantez kullanırız. Ancak parantez kullanmasak da birden fazla elemana sahip her yeni değişken, Python'da tüp olarak algılanır.

Sözlükler ise anahtar değer çiftlerinden oluşur. Süslü parantez {} ile tanımlanır.

Küçük örneklerle aralarındaki farkları daha iyi anlayalım.

>>> liste = ['ilkbahar','yaz','sonbahar','kis']
>>> liste
['ilkbahar', 'yaz', 'sonbahar', 'kis']

liste elemanlarına erişirken:
>>> liste[1]
'yaz'

>>> liste[2:4]
['sonbahar', 'kis']

>>> liste[-2]
'sonbahar'
---------------------------------------------------------------------------------------------

>>> tup = ('canakkale','18','mart','universitesi')
>>> tup
('canakkale', '18', 'mart', 'universitesi')

>>> tup2 = "gs","fb","bjk"
>>> tup2
('gs', 'fb', 'bjk')
>>> type(tup2)
<type 'tuple'>

>>> (tp1, tp2, tp3) = ("1","2","3")
>>> tp1
'1'

tüp içindeki elemanlara erişirken:
>>> tup[1]
'18'----------------------------------------------------------------------------------------------

>>> sozluk = {'adi': 'aybuke', 'soyadi': 'ozdemir'}
>>> print sozluk
{'soyadi': 'ozdemir', 'adi': 'aybuke'}

sözlükteki elemanlara erişirken:
>>> sozluk['adi']
'aybuke'
-----------------------------------------------------------------------------------------------
dir (liste) diyerek liste veri tipi üzerinde kullanabileceğimiz fonksiyonları listeleriz. Bu tüpler ve sözlükler için de geçerli.

>>> dir(liste)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']









28 Temmuz 2013 Pazar

HAProxy(High Available Proxy) ve Yapılandırma Hakkında

 Öncelikle yapılandırma nedir bundan bahsedelim. Kelime anlamı düzenlemek, daha iyi hale getirmek, iyileştirmektir.

Temel yapılandırma, bir yazılımın kurulduktan sonra bileşenlerinin uygun şekilde ayarlanması, düzenlenmesi anlamındadır.

Proxy sunucusu; ağdaki diğer bilgisayarlara internet erişim servisi sağlayan bir bilgisayardır.

Haproxy ise  siteler veya sunucular için açık kaynaklı, yüksek performanslı bir tcp/http load balancer.(yük dengeleyici). Yani birden çok sunucu arasında istekleri yayarak web siteleri ve hizmetlerin performansını arttırmak için kullanılır.Ayrıca C programlama dili ile yazılmış, işlemci ve bellek kullanımı açısından hızlı, verimli, istikrarlı bir üne de sahip.

Bazı özellikleri:

Çerez tabanlı kalıcılık

İçerik tabanlı anahtarlama

SSL off-loading

Yük korumalı gelişmiş trafik düzenleme

Otomatik yük devretme

Regex tabanlı çalışma zamanı başlık kontrolü

Web tabanlı raporlama ve yönetim arayüzü

Gelişmiş sorun giderme uygulamaları ve / veya ağlara yardımcı olmak için giriş

vb.





 

 


Flask Nedir ? Nasıl Kullanılır ?


Flask; Python programlama dili ile yazılmış, web uygulamaları yazmak için kullanılan bir microframework. Yani çekirdeği basit ve geliştirilebilir.

Bir webapi yazarken framework ile zaman harcamak istemiyorsak, microframework kullanabiliriz.

Flask kurulumu oldukça basit, zaten depoda var. "pip install flask" , "apt-get install flask" ya da "easy_install flask" komutları ile artık Flask'ı kullanabiliriz.

Küçük bir örnekle Flask'ı daha iyi anlayalım.

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()


Hello.py dosyasına yukarıdaki küçük kod parçasını yazıyoruz. python hello.py diyerek kodu çalıştırıyoruz. Bakıldığında da direk anlaşılan bir uygulama zaten.

Yazılan uygulamalar 5000.portta çalışıyor.

Şimdik basit bir kişisel blog sayfası nasıl yazılır buna bakalım.
Kodlara buradan ulaşabilirsiniz.

Öncelikle, proje dizinini ve içine html dosyaları için 'template' , css kalıplarının bulunması için de 'static' dizinlerini oluşturalım.

/flask
   /template
   /static

 Sonra, veritabanı için schema.sql dosyasında bir şema oluşturalım. Örnekte id, title, text diye 3 başlık var.

Sonraki adımda, uygulamaların olacağı flaskr.py dosyasını oluşturuyoruz. Buraya flaskı import ettikten sonra ayar dosyaları için küçük bir yapılandırma yazıyoruz.

Daha sonra veritabanında şemayı oluşturmak için aşağıdaki komutu kullanıyoruz.

sqlite3 /tmp/flaskr.db < schema.sql 

Veritabanını ilklendirmek için flaskr.py'ye "from contextlib import closing" fonksiyonunu ekleyip init_db işlevini yazıyoruz. Konsoldan Python'u çalıştırıp init_db yi import ettiğimizde çalışıyor olduğunu görürüz.

>>> from flaskr import init_db
>>> init_db()
  


Artık veritabanı sorgu uygulamaları ve view uygulamalarını yazabiliriz. Uygulamalar için @app.route diyerek portta hangi yol ile çalışacağını yazıyoruz.
@app.route(/yol) gibi. Çalışacak fonksiyonu ve döndüreceği değeri de ekleyip uygulamayı tamamlayabiliriz.

Son olarak da html sayfalarını oluşturup python flaskr.py diyerek 5000.porttan blogumuzu görebiliriz.