06 Temmuz 2010 Salı

Python + PyQt4 için IDE Maceraları

Son bir kaç entryden de farkedeceğiniz üzre son haftalarda python dili ile oldukça yakından ilgileniyorum. Python öğrenmesi ve yazması oldukça zevkli bir dil. "Built-in" şekilde gelen işlerimizi en basite indirgeyecek bir çok modülleri bulunuyor. Dediğim gibi python öğrenmesi ve yazması zevkli olduğu gibi size zamandan kazandıracak bir dil.

    Python ile ilgili yazılan her yazıda olduğu gibi ben de python'un en sevdiğim özelliklerinden biri olan "girintili" yazma meselesine deyineyim. Python syntax'ı diğer çoğu dil gibi köşeli parantez blokları kullanan bir dil değildir. Bildiğiniz üzere php,c,c++,c# vs. bir çok dilde kod blokları (döngüler,if-else,class tanımlamaları) köşeli parantezler ile belirlenir ({}). Pythonda ise bu durum farklıdır. Kod bloklarınızı girintiler ile diğer bir ifade ile tab atlamaları ile yazarsınız.

Hemen kısa bir örnek vermek gerekirse


<?
$dur=FALSE;
$i=0;
while(!$dur){
echo $i." xx";
$i++;
if($i == 5){
$dur=TRUE;
}
}
?>
Yukarıda ki php kodunun pythondaki karşılğı şudur.
dur=False
i=0
while not dur:
 print "%s xx" % (i)
 i+= 1
 if i == 5:
  dur=True

Python hakkında kısa(?) bir girişten sonra son bir haftadır PyQt4 modülleri ile birlikte python kodları yazmak için araştırdığım ve kullandığım IDE (Integrated Development Engine) 'leri kısaca tanıtayım. Hangisini kullanacağınıza siz karar verin.

Gedit

    Gedit gnome desktop ile gelen default text editördür. Default text editör deyip geçmeyelim. Gedit oldukça özelleştirilebilir ve plugin desteğine sahiptir. Pluginlerle gediti neredeyse windows ortamındaki notepad++' ya benzetmek mümkündür. Gedit ufak projelerde hata düzeltmelerinde vs. küçük işleriniz için kullanabileceğiniz bir araçtır. Bir çok dilde "syntax highlighting" desteğine sahiptir. Eklentilerle "auto complete" özelliği kullanabilirsiniz.  Yalnız bu çok işlevsel olmadığı için arayışlarımı başka ide'lerle sürdürdüm.



Stanis Python Editor

    Stanis Python Editor kısa adıyla SPE, wxPython Gui arabirimi ile yazılmış ufak boyutlu çok işlevsel bir editordur. Aslında Tam olarak IDE denemez. Ama SPE diğer IDE lere taş çıkartacak özelliklere sahiptir. Bunların başında kod tamamlama, syntax highlighting, debug gelmektedir. SPE başlarda ufak uygulamalarda işimi fazlasıyla görüyordu. Ta ki Gui arabirimleri olan uygulamalar yazmaya geldiğimde.(PyGTK,PyQt4). Eğer gui arabirimli uygulamalar yazmayacaksanız ve ufak boyutlu bir editor arıyorsanız SPE sizin için uygun editördür diyebilirim.



NetBeans

    Aslında NetBeans'ı bu yazıda sadece python için editör sıfatıyla değerlendirmek kulaklarımın çınlamasına neden olur. Netbeans java ile yazılmış "open source" bir IDE'dir. Linux üzerinde python dışında php && mysql ile ilgilendiğimden dolayı netbeansın büyük boyutuna aldırış etmeden hemen yükledim. Eğer python için kullanmayacaksam bile php için ne kadar güzel bir IDE olduğunu zaten biliyordum. Netbeans'a python desteğini eklenti ile sağlıyoruz. Eklenti dediğime bakmayın Netbeans IDE'sinde eklentilerle bile olsa bir yazılım geliştirmek başka bir ayrıcalık. NetBeans kod tamamlama, renklendirme, debug ve özelleştirmeleri sayesinde oldukça gözümü kamaştıran bir IDE. Boyutunun büyük olmasına karşın RAM'den az kullanması da NetBeans'ı sevmemde önemli bir etken oldu. Kullandıkça oldukça hoş özelliklerini keşfettim. Mesela sizin kodlama stilinizi analiz edip size ufak hatırlatmalarda bulunabiliyor. Örneğin çoğu değişkeninizi "is_true", "yeni_x" gibi alt tire işareti kullanarak tanımladınız. Ama bir class ismini "yeniSinif" gibi büyük küçük harf kullanarak tanımladınız. Netbeans farklı tanımladığınız classın sol tarafında ufak bir icon  çıkarıp "bu sizin kodlama stilinize uygun bir tanımlama değil" gibi bir açıklama ile sizi uyarabiliyor. Bilmiyorum sizce bu özellik ne kadar anlatılmaya değer ama böyle ufak birşeyi bile düşünenlerin kodladığı bir IDE ne kadar kullanışlıdır siz düşünün.
    Netbeans'da herşey mükemmeldi ta ki yine bir sorunla karşılaşana kadar. Evet Netbeans da "auto complete" için PyQt4 modüllerini indexleyemiyordu. Aslında "auto complete" in PyQt4 modülleri için çalışmaması sorunu IDE'ler yüzünden değildi. PyQt4 modülleri derlenmiş modüllerdir. Bu yüzden IDE'ler "auto complete" için gerekli analizi yapamıyorlardı.
NetBeans PyQt4 ile uygulama geliştirme dışında benim için en mükemmel IDE idi. Sistemimden silmedim, hala php için kullanıyorum.



Eclipse

    Eclipse tabiri caiz ise Netbeans kadar taşaklı bir IDE'dir. Yine Netbeans gibi java ile yazılmıştır. Eclipsede de kod tamamlama, syntax highlighting, debug gibi kısımlar ön plana çıkıyor. Lakin özelleştirme konusuna geldiğimizde eclipse biraz zayıf kalıyor. Sistemimde siyah ağırlıklı tema kullandığım için Eclipse'in editör alanı göze hiç hoş gelmiyordu. Renklendirme ayarlarını değiştirmek için ayarlar kısmına geldiğimde farkettim ki Eclipse hiç de kullanıcı dostu değil. Sırf editör arka planı değiştirmek için uzun bir süre internette araştırdım. En sonunda siyah ağırlıklı temalar kullanan sistemler için birisi Eclipse profil ayarları dosyasını paylaşmış. Ayarları aktardıktan sonra bir süre Eclipse kullanmaya devam ettim. Eclipse ile python uygulamaları yazmak için pydev eklentisini yüklememiz gerekiyor. Eklentiyi yükledikten sonra ilk iş PyQt4 modüllerinde kod tamamlaması olup olmadığına bakmaktı. Ön tanımlı olarak Eclipse PyQt4 modüllerini otomatik tamamlama yapamıyordu. Window->Settings>Pydev>Interpreter Python kısmından aşağıdaki seçeneklerden "forced-builtins" kısmına "PyQt4" eklememiz gerekiyor. Ekledikten sonra PyQt4 için otomatik tamamlama yapıp yapamadığına baktım. İlk başta tamamlama yapabildiği için sevinmiştim. Hatta built-in modüller için en iyi kod tamamlamalarını Eclipse yapıyordu. Ama PyQt4 için tamamlamaları sadece ilgili modülün ilgili sınıfını tam olarak yazdığınızda yapabiliyordu. Örnek vermek gerekirse


deneme=self.lineEdit
olarak bir değişken düşünün. Kod tamamlamalarını "deneme." yazdıktan sonra yapamıyordu. Ama "QtGui.QLineEdit." yaptığımızda tamamlıyabiliyordu. Tabi buda benim için hiç kullanışlı değildi. Eclipse'nin çok ram tüketmesi de cabasıydı. Bu nedenlerle Eclipse ile de yollarımı ayırıp başka IDE arayışlarını sürdürdüm. Eric4 Eric Python IDE python ile yazılmış diğer IDE'lere göre orta boyutta (30mb) tam teşekküllü bir PyQt4 IDE'si. Tam teşekkülü olmasa da diğer IDE'lere nazaran bence PyQt4 için kullanılabilecek en ideal IDE. Kod tamamlama(PyQt4 dahil), syntax highlighting, debugging, qt4 e özel araçlar(QMessageBox Wizard, QFileDialog Wizard,Regex Wizard vs.), IDE üzerinden form dosyasını python kodlarına çevirme, düşük ram kullanımı gibi özelliklere sahip. Eric ile PyQt4 de uygulama geliştirmeden önce kod tamamlamalarını etkinleştirmemiz için ufak bir ayar çekmemiz gerekiyor. Settings->Preferences->Editor->APIs' den language: python u seçip aşağıdaki Compile APIs butonuna basın ve auto complete için indexlemeye başlasın. Orjinal makale linki:http://www.h4ckinger.org/2010/07/python-pyqt4-icin-ide-maceralar.html Python kodcularına son söyleyeceklerim;
  • Eğer python öğrenmeye yeni başladıysanız ve gui arabirimleri olmayan uygulamar geliştirecekseniz SPE tam sizin için yazılmış bir IDE.
  • Eğer daha önce php && mysql,xhtml && css için Netbeans, Eclipse gibi büyük IDE'ler kullandıysanız ve kod yazarken bu konforları isterseniz düşük donanımlı pc'ler için en uygunu Netbeans, yüksek donanımlı pc'ler için en uygunu pythondaki gelişmiş "auto complete" özelliğinden dolayı Eclipse.
  • Eğer python'a zaten aşina iseniz ve PyQt4 uygulamaları geliştiriyorsanız sizin için en uygun IDE Eric Python IDE'dir.
  • Ufak tefek düzeltmeleriniz de de gedit gibi ufak editörleri kullanabilirsiniz.

03 Temmuz 2010 Cumartesi

LiteSpeed Web Server Remote Source Code Disclosure Scanner Demonstration

Demonstration of a small application  which written in python programming language via qt4 gui libraries to scan vulnerable litespeed web servers.

24 Haziran 2010 Perşembe

Blogger Özel Etki Alan Adı Erişememe Sorunu

      Youtube ip adreslerinin erişime engellenmesi  ve bu ip adreslerinin Google'ın başka servislerinde  de kullanılıyor olması nedeniyle, blogger'ı kendi alan adı ile kullanan bloglara yaklaşık 2 haftadır erişilemiyordu. Bu arada ne kadar acı bir durumdur ki  ben kendi bloguma erişilemediğini olaydan bir hafta sonra farkettim. Bunun nedeni de google dnslerini kullanıyor olmammış. Google dns'leri dışındaki dns leri kullanan kişiler bu sorunla daha erken karşılaştı sanırım.

Her neyse sorunun çözümünü baya bir araştırdıktan sonra şu blogda çözüme ulaştım.

//Anlatım Godaddy içindir.
Yapmanız gereken Godaddy panelinizde "Total DNS Control" kısmından önceden eklediğiniz "www" yi işaret eden "ghs.google.com" adresli "CNAME" kaydını silip onun yerine "www"  ve "@" işaretli 2 tane "A" kaydı eklemektir.

Yeni ayarlarınız aşağıdaki şekilde olmalıdır.

(Not "cs" i işaret eden adres counter-strike serverımızın adresidir. Siz onu görmezden gelebilirsiniz.)

22 Haziran 2010 Salı

Conky ile rhythmbox bilgilerini göstermek

Conky nedir diyecek olursanız Ubuntu-tr Wiki'den bir alıntı yapayım.

Conky adlı program ile masaüstünüzde text tabanlı olarak sisteminiz hakkında her türlü bilgiye , hatta daha gelişmiş özelliklere (hava durumu, şimdi çalınıyor gibi özellikler) sahip olabilirsiniz..

Bu script sayesinde masaüstünüzde faydalı olabilecek pek çok özelliği ekleyebilirsiniz. özelleştirilebilir olması sayesinde tamamen istediğiniz şekle sokabilirsiniz... 

Bu ufak bilginin ardından size Conky ile nasıl Rhythmbox'da şarkı bilgilerini alacağımızı göstereyim. Sol üst kısımda gördüğünüz resim aşağıdaki kodların ekran görüntüsüdür.


${color #DF5720}${font size=1}${alignc}Music${font}

${color 9ACD32}Artist:
${color a4a4a4}${execi 1 rhythmbox-client --no-start --print-playing-format %ta}
${color 9ACD32}Title:
${color a4a4a4}${execi 1 rhythmbox-client --no-start --print-playing-format %tt}
${color 9ACD32}Album:
${color a4a4a4}${execi 1 rhythmbox-client --no-start --print-playing-format %at}

${color a4a4a4}${execi 0.8 rhythmbox-client --no-start --print-playing-format %te}${alignr}${execi 1 rhythmbox-client --no-start --print-playing-format %td}
Bu kodları .conkyrc dosyamızda gereken bölüme yapıştırıyoruz. Eğer conkyrc dosyasını nasıl düzenleyeceğinizi bilmiyorsanız gerek ubuntu-tr forumlarında gerekse ubuntunun resmi forumlarında kullanıcıların örnek conkyrc dosyalarını paylaştıkları konular var. Ek olarak yararlanabileceğiniz kaynaklar. *http://wiki.ubuntu-tr.org/index.php/Conky_Nedir%3F_Nas%C4%B1l_Kullan%C4%B1l%C4%B1r%3F *http://conky.sourceforge.net/documentation.html *http://ubuntuforums.org/showthread.php?t=281865 *Örnek Conky screenshot'ları

20 Haziran 2010 Pazar

Compiz Fusion Screenshot Plugin - Imageshack Uploader Bash Script

Eğer Linux'nuzda Compiz Fusion yüklü ise gerçekten işletim sisteminizin yapabildiklerine git gide hayranlık duyuyorsunuz. Compiz'in gerçekten çok hoş özellikleri var. Bunlardan birisi de "Screenshot" aracı.

"Compiz Config Settings Manager" da screenshot yazdıktan sonra screenshot'ın yanındaki kutucuğa "tick" koyarak etkinleştirebilirsiniz.



Etkinleştirdikten sonra screenshot'ın üzerine tıklayarak ayarlar kısmına gelelim.



Bu kısımda ilk kutuya resimlerin kaydedileceği dizini giriyoruz.

"/home/h4ckinger/resimler/screenshots"
gibi
İkinci kısım ise ekran görüntüsü kaydedildikten sonra dosya yolunun argüman olarak verileceği uygulama için kullanılıyor.

Şimdi gelelim fasulyanın nimetlerine. Ben bu güzel Compiz aracı için ufak bir bash script yazdım. Script ekran görüntüsü alındıktan sonra dosyayı "imageshack.us" sitesine upload edip bize direk link şeklinde veriyor. Ayrıca linki otomatik olarak clipboarda alıyor ve bize resmi browserda açmasını isteyip istemediğimizi soruyor.

Hehe. Çok kullanışlı oldu benim için. Sizlerle de paylaşmak istedim.

Düzenleme:Bu arada betiği nautilus scriptlerine ekleyebilirsiniz. Böylece bilgisayarınızda varolan bir resme sağ tıklayarak upload edebilirsiniz.
mv h4-upload /home/kullaniciadi/.gnome2/nautilus-scripts
chmod +x /home/kullaniciadi/.gnome2/nautilus-scripts/h4-upload
#!/bin/bash 
# imageshack uploader bash script
# Kodlayan h4ckinger
# wwww.h4ckinger.org
# h4ckinger gmail com
# Otomatik Clipboarda alır ve isterseniz upload edilen resmi browserda açar
# Compiz Fusion Screenshot aracı ile kullanarak en iyi verimi alırsınız.
# Betiğin çalışması için curl,xclip ve zenity paketlerinin yüklü olmaları gereklidir.
# Yüklü değil ise betik otomatik olarak yüklemeyi dener.
# ./h4-upload.sh /home/h4ckinger/resim.jpg şeklinde kullanılır
#################################### 

#zenity varmı bak
VARMI=`which zenity`
if [ "$VARMI" = ""  ] ; then
    echo "uygulamanın çalışabilmesi için zenity programının yüklü olması gerekmektedir"
    sudo apt-get install zenity
fi
###

#xsel varmı bak
VARMI=`which curl`
if [ "$VARMI" = ""  ] ; then
    echo "uygulamanın çalışabilmesi için curl programının yüklü olması gerekmektedir"
    sudo apt-get install curl
fi
###

#xsel varmı bak
VARMI=`which xclip`
if [ "$VARMI" = ""  ] ; then
    echo "uygulamanın çalışabilmesi için xclip programının yüklü olması gerekmektedir"
    sudo apt-get install xclip
fi
###


linkver () {
SORU=$(zenity --width 450 --height 100 --entry --entry-text="$1" \
 --title="Resim linki"\
 --text="Browserda açmak için tamam'a basın")

if [ "$?" -eq 0 ] ; then
 `gconftool -g /desktop/gnome/applications/browser/exec` "$1"
fi
}

upload () {

out=upl.tmp.`date +%s`
echo "Upload ediliyor: $1"
curl -H Expect: -F fileupload="@$1" -F xml=yes -# "http://www.imageshack.us/index.php" > /tmp/$out 2>&1

if [ `cat /tmp/$out | grep image_link | wc -l` -lt 1 ]
 then
  echo "Error: $1"
 else 
  linkimiz=`cat /tmp/$out | tr -d " " | grep image_link | grep -o  http[^\<]*`
  echo "$linkimiz" | xclip -selection clipboard
  linkver "$linkimiz"
fi

rm /tmp/$out

}


if [ -z "$1" ]
then
 echo "Kullanım: `basename $0` [resim.jpg]"
 exit $E_NOARGS
else

upload "$1"

fi

14 Haziran 2010 Pazartesi

Kaliteli orospu çocukları

Gözleriyle sevişenlere "namussuz" damgası vuran ey güzel memleketimin güzel insanları!

Hepinize selam eder bu genç.

01 Haziran 2010 Salı

Python - Dosya Bulucu Betik

Ubuntu kullanmaya başlayalı 2 hafta kadar oldu. Bu dönemde MS yazılımlarına elveda ediyorum.
Ubuntu kullanmaya başladığımdan beri çok hoş bir dil olan Python öğrenmeye başladım. Syntax'ı oldukça güzel. Çoğunuzun da bildiği gibi python düzenli bir syntaxa sahip. Düzenli syntaxtan kastım "{}" ve ";" işaretlerinin yerine girinti çıkıntı kullanma zorunluluğudur. Bu da kod okunurluğunu artırıyor. El alışınca da hakikaten yazdığınız kodlardan büyük haz alıyorsunuz(En azından benim için öyle :) ).

      Bence bir dil üzerinde kendinizi geliştirmenin en kolay yolu gerçekten işe yarayabilecek uygulamalar yazmaktır. Bu sayede algoritma ve akış diyagramlarını ne şekilde nerelerde kullanacağınızı daha fazla düşünme fırsatınız oluyor. Ben de bu şekilde 2-3 günde bir ufak betikler yazmaya başladım.

Betiğimiz verilen regex(Düzenli ifade)'i, verdiğiniz dizin içerisindeki verdiğiniz uzantıyla eşleşen dosyalarda(alt klasörler dahil) arıyor. Eğer dosya içerisinde verilen regexp bulunmuşsa hangi satırda ve hangi karakterler arasında bulunduğunu söylüyor. Ve istenilirse sonuçlar log dosyasına yazdırıyor. Betiğimizde multithread kullandım. MultiThread kullanımı için çok güzel bir örnek oldu sanıyorum.

Betikten bir görüntü.



#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Coded by h4ckinger
#Blog :h4ckinger.org
#Contact:h4ckinger gmail com
import os,re,sys
from threading import Thread
from optparse import OptionParser

log=None

class calistir(Thread):
 def __init__(self,anaklasor,dosyalistesi,aranacak):
  Thread.__init__(self)
  self.dosyalistesi =dosyalistesi    #file list
  self.anaklasor  =anaklasor   #current scanning dir
  self.aranacak  =aranacak   #regex pattern
  
 def run(self):
  logmsg("\n\n[+] Current dir -> %s" % self.anaklasor)
  for dosyamiz in self.dosyalistesi:
   if not os.access(os.path.join(self.anaklasor,dosyamiz),os.R_OK):
    logmsg("\n[-]%s doesnt have permissions to read %s" % (os.getenv("USERNAME"),dosyamiz))
    continue
   fp=open(os.path.join(self.anaklasor,dosyamiz),"r+")
   satirlar=map(lambda line:line.rstrip(),fp.readlines())
   #[x.rstrip() for x in opener.readlines()]
   say=1
   for tek_satir in satirlar:
    bul=re.search(self.aranacak,tek_satir)
    if bul:
     logmsg("[+] Found in %s line %d [char = %s] - string:%s" % (dosyamiz,say,str(bul.span()),bul.group(0)))
    say+=1
   fp.close()

def about():
 return """#Python Example Projects - Project 3 - Multi Threaded File Content Scanner
#Coded by h4ckinger

    """

def clear():
 sil="clear" if (sys.platform == 'linux-i386' or sys.platform == 'linux2' or sys.platform == 'darwin') else "cls"
 os.system(sil)

def list_dirs(klasor,uzanti):
 dosyalar=[]
 for root, dirs, files in os.walk(klasor):
  for x in files:
   if x.endswith(tuple(uzanti.split(","))):
    dosyalar.append([root,x])
 return dosyalar

def logmsg(msg):
 global log
 print msg
 if log:
  log.write(msg+os.linesep)

def main():
 global log
 
 kullanim="python %prog [options]\n\n./%prog -p /home/"+os.getenv("USERNAME")+" -r [0-9a-f]{32} -e .html,.php -o scan.txt\n\nExample search md5 pattern in html and php files.\nAfter scan save output to scanlog.txt"
 optparser = OptionParser(description=about(),usage=kullanim,version="%prog version 1.0")
 optparser.add_option("-p", "--path",type="string",action="store",dest="path",help="Define root path to scan", metavar="/path/to/scan")
 optparser.add_option("-r", "--regex",type="string",action="store", dest="regex",help="Define regex pattern to search",metavar="Regular Expression")
 optparser.add_option("-e", "--extensions",type="string",action="store", dest="extensions",help="Define extension which will be scanned(would be more than one seperate with \",\")",metavar=".html,.php,.txt")
 optparser.add_option("-o", "--output",type="string",action="store", dest="output",help="Save results log file(OPTIONAL)",metavar="FILE")
 
 (options, args) = optparser.parse_args()
 

 
 if not options.path or not options.regex or not options.extensions:
  clear()
  optparser.print_help()
  sys.exit(0)
 if not os.path.isdir(options.path):
  print "[-]%s is not valid path" % options.path
  sys.exit(0)
 if not os.access(options.path,os.R_OK):
  print "[-]%s doesnt have permission on that directory" % os.getenv("USERNAME")
  sys.exit(0)
 
 if options.output:
  log=open(options.output,"w")
 
 tara=options.path    #path
 ara=options.regex    #regex
 uzantilar=options.extensions#extensions
 logmsg("[+] Listing files in root directory -> %s" % tara)
 sozluk=list_dirs(tara,uzantilar)
 logmsg("[+] Listing finished. Creating threads")
 ilk_klasor=sozluk[0][0]
 fazlami=any([True for x in range(len(sozluk)) if sozluk[x][0]!=sozluk[0][0]])# birden fazla klasor varmi
 threadlist=[]
 tmpdosyalar=[]
 logmsg("[+] Scanning content in files")
 
 for k in sozluk:
  dizin,adi=k
  tmpdosyalar.append(adi)
  if not fazlami and k==sozluk[len(sozluk)-1]:
   tek_baslat=calistir(ilk_klasor,tmpdosyalar,ara)
   tek_baslat.start()
  if ilk_klasor!=dizin:
   tek_thread=calistir(ilk_klasor,tmpdosyalar,ara)
   tek_thread.start()
   threadlist.append(tek_thread)
   tmpdosyalar=[]
   ilk_klasor=dizin
 
 for thr in threadlist:
  thr.join()
  
if __name__ == '__main__':
 main()