Perşembe, Eylül 14, 2017

Satranç tahtasında bir birini yemeyen Kaleler (Python 2)

Python ile Satranç tahtasına 8 Kaleyi, bir birini yemeyecek şekilde nasıl yerleştirirsiniz?

sorusuna cevap vermek için uğraşırken, aşağıdaki gibi bir kod yapısına ulaştım.

Bu esnada;
for item in liste döngüsü içinde ;
 liste.remove(item) işlemi yaparken, her seferinde listedeki item sayısı değiştiği için kodun sağlıklı işlemediğini öğrendim.

Bunu çözmek için ya iki ayrı liste kullanmak
ya da for item in list(liste) yapısını tercih etmek gerekiyormuş.

Kod aşağıdaki gibi,
bir birini yemeyecek şekilde Random Kale yerleşimleri üretiyor.







# Birbirini Yemeyen Kaleler
# twitter.com/MuratTatar


from random import choice

harfler=["a","b","c","d","e","f","g","h"]
x=8

tahta=[]
ar=[]
for i in harfler:
        for j in range(1,x+1):
                ar = [i,j]
                tahta.append(ar)


kaleler=[]
for k in range(1,x+1):
        r = choice(tahta); kaleler.append(r)
        print "random yerlesim:", r

        bas=r[0]; son=r[1]

        for t in list(tahta):
                if t[0]==bas: print "yatay elenen kesisim karesi",t; tahta.remove(t)
                if t[1]==son:
                        print "dikey elenen kesisim karesi",t
                        try: tahta.remove(t)
                        except: pass


print "\n\n Birbirini Yemeyen Kale yerlesimleri:\n", kaleler, "\n\n"


Cuma, Ağustos 04, 2017

Python OpenCV2 ile Yüz tanıma

Tanışma faslı..
Antreman faslı..
Tanıma faslı..

Klasör ve Dosya yapımız şöyle:




https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
buradaki xml dosyasını alıp
yuz.xml olarak kayıt edelim




KutuphaneOlustur.py içeriğimiz:
===================================

import numpy as np
import cv2
import time
import win32gui

detector = cv2.CascadeClassifier('yuz.xml')

cam = cv2.VideoCapture(0)


ks = open("kisiler.txt","r"); kisiler = ks.read(); ks.close()
kisiler = kisiler.split('\n')
sonno = len(kisiler); kayitno = sonno + 1

isimler=[]
for kisi in kisiler:
    no, isim = kisi.split(':')
    isimler.append(isim)
 


def KontrolKayit(yeniad):
    if not yeniad in isimler:
        ky = open("kisiler.txt","a"); ky.write(str("\n"+str(kayitno)+":"+str(yeniad))); ky.close()
     
    else:
        yeniad = raw_input(u'Bu isimde birini tanıyorum. \n Karışmaması için Soyisim vb. alabilir miyim: ')
        KontrolKayit(yeniad)


#+++++++++++++++++++++++++++++++++++++++++++++++++++
     
yeniad = raw_input(u'Tanışalım isminiz nedir?: ')
     
KontrolKayit(yeniad)



Id=kayitno

time.sleep(1)

sampleNum = 0
while 1:
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.3, 5)
 

    for (x,y,w,h) in faces:
        cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)


        time.sleep(.5)
        #kisinin cok sayida resmini kayit
        sampleNum = sampleNum+1
        cv2.imwrite("dataSet/User."+str(Id) +'.'+ str(sampleNum) + ".jpg", gray[y:y+h,x:x+w])

     
        cv2.imshow('KutuphaneKayit',cv2.flip(img,1))





 
    #wait for 100 miliseconds
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
    # break if the sample number is morethan 20
    elif sampleNum>20:
        break




cam.release()
cv2.destroyAllWindows()

import Antreman

============================

Antreman.py içeriğimiz:

======================
import os
import cv2
import numpy as np
from PIL import Image

#creating a recognizer

recognizer = cv2.face.createLBPHFaceRecognizer()
path = 'dataSet'

def getImagesWithID(path):
    imagePaths=[os.path.join(path, f) for f in os.listdir(path)]  
    faces=[]
    IDs=[]
    for imagePath in imagePaths:
        faceImg = Image.open(imagePath).convert('L')
        faceNp = np.array(faceImg, 'uint8')
        ID=int(os.path.split(imagePath)[-1].split('.')[1])
        print ID
        faces.append(faceNp)
        IDs.append(ID)
        cv2.imshow('training', faceNp)
        cv2.waitKey(5)
    return np.array(IDs), faces

Ids, faces = getImagesWithID(path)
recognizer.train(faces, Ids)

if not os.path.exists('trainer'):
    os.makedirs('trainer')

recognizer.save('trainer/training_data.yml')
cv2.destroyAllWindows()


============================

_ismenKisiTani.py içeriğimiz:

======================

import cv2
import numpy as np
import time

recognizer = cv2.face.createLBPHFaceRecognizer()
recognizer.load('trainer/training_data.yml')
cascadePath = "yuz.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)

cam = cv2.VideoCapture(0)
#font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
font = cv2.FONT_HERSHEY_DUPLEX

ks = open("kisiler.txt","r"); kisiler = ks.read(); ks.close()
kisiler = kisiler.split('\n')
sonno = len(kisiler)


isimler=[]
for kisi in kisiler:
    no, isim = kisi.split(':')
    isimler.append(isim)


while True:
    ret, im =cam.read()
    im = cv2.flip(im,1)
    gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    faces=faceCascade.detectMultiScale(gray, 1.2,5)
    for(x,y,w,h) in faces:
        cv2.rectangle(im,(x,y),(x+w,y+h),(225,0,0),2)
        Id, conf = recognizer.predict(gray[y:y+h,x:x+w])

        Id =  isimler[Id-1]

        if(conf<45 div="">
          Id="-cikaramadim-"

            
        cv2.putText(im,str(Id),(x,y-10),font,0.55,(0,255,0),1)
        #cv2.cv.PutText(cv2.cv.fromarray(im),str(Id), (x,y+h),font, 255)



    cv2.imshow('im',im)
    
    k = cv2.waitKey(30) & 0xff
    if (cv2.waitKey(30) & 0xFF==ord('q')) or (k == 27) :
        break


cam.release()
cv2.destroyAllWindows()

============================

Çarşamba, Ağustos 02, 2017

Win7

Windows 7, açık ara windows 8 ve windows 10'dan daha güzel.

Pazartesi, Temmuz 31, 2017

Python + Selenium ile Telefon numarasi yakalamaca

Webde tonlarca örnek bulmak mümkün belki ama insanın denediği şey "Türkiye Şartları"na (haha) uymayınca biraz motivasyonu düşüyor.

Şimdi DevNami'nin şurada anlattığı örneği, yerelleştirelim.


Öncelikle web sayfasından veri alıp işlemek için selenium modülünü kuralım:
Bunun için
Başlat>çalıştır> cmd.exe
ile açılan dos/komut penceresinde
pip install selenium
yazıp enterlamak yeterli olacaktır.

Web tarayıcı olarak Chrome kullanmak için 
https://sites.google.com/a/chromium.org/chromedriver/downloads 
adresinden chromedriver.exe indirelim.

Not defteri, SublimeText ya da Python IDE editörlerinden birisini açıp aşağıdaki kodları Sel-Telefon.py adıyla kayıt edelim.

(Az önce indirdiğimiz chromedriver.exe dosyası da Sel-Telefon.py ile aynı klasörde olsun.)

from selenium import webdriver as web
import re

url = "https://www.turhost.com/"

d = web.Chrome("chromedriver.exe")
d.get(url)
doc = d.page_source

telefonlar = re.findall(r'[(\s][\d]{3,4}[\s)-]+[\d]{1,4}[\s-]+[\d]{1,4}[\s-]+[\d]{2,4}',doc)

for tel in telefonlar:
    print tel
    
d.quit()


Burada;
from selenium import webdriver as web

Selenium modülü içinden webdriver'ı içeri aktardık. Ve buna arkadaşlar arasında kısaca web diyeceğiz dedik. Adı ibrahim ama biz ibo diye sesleneceğiz ;)

Burada;
import re
Regular Expression / Düzenli İfade modülü import ettik. Düzenli ifadeler biraz karmaşık gibi durabilir ama mantığı yerleşince hayli zaman kazandıracak işler de yapabilir.

Burada;
url = "https://www.turhost.com/"
Telefounu almak istediğimiz bir adres girdik

Burada;
d = web.Chrome("chromedriver.exe")
d.get(url)
doc = d.page_source

d isimli değişkenimizi adeta Chrome yaptık.
çocuğum d, şu adresi getir,
doc senin içeriğin ise, d'nin getirdiği adresin kaynak kodları olsun dedik.


Burada;
telefonlar = re.findall(r'[(\s][\d]{3,4}[\s)-]+[\d]{1,4}[\s-]+[\d]{1,4}[\s-]+[\d]{2,4}',doc)

for tel in telefonlar:
    print tel

telefonlar değişkenine, re ile sayfada yakaladıklarımızı atadık.
sonra her atanan telefonu tek tek listelemek için bir döngüye soktuk.

Türkiye'de telefon yazım şekli genelde (0212) 555 44 33 şeklinde yani;
[Parantez]+[4 Rakam]+[Parantez]+[boşluk]+[3 Rakam]+[boşluk]+[2 Rakam]+[boşluk]+[2 Rakam]
formatında. Bunu ReGex olarak yazarsak şöyle:
[(]+[\d]{4}+[)]+[\s]+[\d]{3}+[\s]+[\d]{2}+[\s]+[\d]{2}


 Ancak (0212) 555-44-33 şeklinde boşluk yerine Tire işareti kullanımı da olabiliyor
O zaman formatımız şu hale geliyor
[Parantez]+[4 Rakam]+[Parantez]+[boşluk ya da tire]+[3 Rakam]+[boşluk ya da tire]+[2 Rakam]+[boşluk ya da tire]+[2 Rakam]


O halde bizde [\s] yerine [\s-] yazıyoruz.

Ama bir de kurala uyamayanlar, parantez koymayan 0212 yerine 212 yazanlar var.
Ya da numara daha güzel görünmesi için 899 1 899 şeklinde yazanlar.
Bu durumda minimum ve maximum digit/rakam adeti için formatımızı düzenleyelim:
[(]+[\d]{3,4}+[)]+[\s]+[\d]{1,4}+[\s]+[\d]{1,4}+[\s]+[\d]{2,4} 

Burada da;
d.quit()
d'yi yani bir nevi chormu kapatıyoruz. (30 tane chrome açıksa makina üzülür malum, üzülmesin) 


Başka sayfalarda da denemek için url kısmını https://tr.godaddy.com/ ve https://www.natro.com/ ile değiştirince de çalışıyor. Tabi burada düşünemediğiz yazım şekillerini yakalamayacaktır.
onlar için format düzenlemesi yada telefonlar2 gibi yeni bir değişken ataması yapılabilir.

##  Bu paylaşımlardaki amacım, Python dersi vermek değil. Çünkü ben de yeni öğreniyorum.
##  Birlikte öğrenelim ;)

Uzuun Ara

Çook uzun bir aradır yazmıyordum.
Ve yazacak çook şey oldu.

Bi' şekilde Python'a bulaştım. Sanırım, Birlikte öğrenmek ve öğrendiğim bazı şeyleri paylaşmak için yeniden yazmak geldi içimden.
Belki arada geçen bazı şeyleri de yazarım ara ara.. belki ama.

Şimdi biraz Python'layalım ;)


Pazartesi, Aralık 22, 2008

HostV 2 LeaseWeb

Şifreyi unutmadan önce en son CPU problemleri ile ilgil yazmışım. Bir hayli olmuş.

Şükür ki o Şubat gibi bahsettiğim CPU problemlerinin çok daha fazla zorlu CPU meseleleri ile karşılaştım.

Şimdi bu nasıl söz dimi.
Evet şükür!
Çünkü -önceki bahsettiğim herşey normalken-çok fazla CPU problemi varsa demek ki be bluehost'a ne hostgator'e ne NiOsman'ın Netinternet'indeki VPS'ine sığmayan bir ziyaretçiniz var demektir.

Sitelerin tavan yaptığı zamanlarda ara sıra klitlenmeler olsa da şuan HostV'deki 1GB'lık VPS kabaca yeterli oluyor.

Ancak bununla birlikte HostV'deki VPS fiyatına Leaseweb'de Dedicated sunucular bulunduğu öğrendim. Bir ara yeni bir taşınma daha yakın gibi ;)

Salı, Şubat 12, 2008

Zaman Freni -devam-

"Kelimenin ham anlamıyla hazine" dedikten sonra ara vermek zorunda kalmıştım. Benzer şekilde devam etmem gerekirse "Kelimenin tam anlamıyla hazin son" oldu bu hazinenin sonu :((

Aklıma geldikçe acıyorum... ama normaldir 8-9 yıllık bir birikimi kendi ellerimle sildiğim için henüz atamadım galiba..

İşte o günden beri 2GB'lık plugin tema vb. anlık kullanımlar dışında, hiç bir dosyam yok pc de. Nedense insan Boşlukta gibi hissediyor kendini böyle olunca ya da makinanın ona aitliği kaybolmuş gibi..

Üstelik hemen herşeyiniz internette duruyor, kaydedeceklerinizi bilmem neredeki bilgisayarların harddiskine kaydediyorsunuz..

Bi garip yani.

neyse.. "öncelikle" kısmı normal yazacaklarımdan daha uzun oldu galiba..
*/


Zaman Freni olayına gelirsek;

Zaten yaklaşık 20 yıl geçmesine rağmen, hala "geçmişte" yaşamaya alışımamışken, bir de şu zaman genleşmeleri yok mu. Tamam farkında olmayınca güzel, ama insan bi şekilde bunu hissettiği zaman çekilmez oluyor.

Yavaş çekimde ilerliyor herşey. Mesela, sayaçlarına bakıyorum sitelerin, 466 olmuş. Aradan yarım gün geçiyor, bakıyorum hala 466. F5-Refresh ı ıh.
"Haaa", oluyorum o anda geçen süre yarım gün değil yarım saatmiş.
Ya da gazetelere bakıyorum, yeni günün haberleri için. Dünkü haberler! "Olmaz ki kardeşim!" diye isyan ederken "Bak kaç saat geçmiş aradan.." diyebilmek için saate baktığımda fark ediyorum ki: Çocuk haklı!

Aslında bu zaman frenin kendi kontrolümde olmasını istediğim dönemler çok oluyor ama bunun için 200-300 yıl daha sabretmek gerek sanırım.
Ya da!

Zaman Freni

/* Önce bir tesbit: Fena halde paranoya olmuşum. Hack di, virüs tü, trojandı diye diye şifre değiştirmekten şifrem 16 haneli hale gelmiş. Sayarken bile karıştıracak kadar çok.
Yok, blogger falan değil derdim, merak eden varsa söylerim. Fakat onlarca kişinin emeğini taşımak hem yoruyor insanı hem de paranoya yapıyor.

Çok zaman önce "sık kullanılanlarımı" internete taşımaya başlamıştım; ev, iş, mekan derdi olmuyordu.
Sonra harikayaa'yı çekemeyenler olunca, hiç bir şifreyi kaydetmemeye başladım.

Derken text/html oldukları için hiç bir antivirüs programına yakalanmayan sinsi html_iFrame virüsleri çıktı. İşte sanırım bu zaman dilimi, şüphenin paranoyaya dönüştüğü günlerdi. Her html'in kaynak kodunda iFrame kontrolü yaptım aylarca.

Fakat bu arada güya! yedek olarak sakladığım bazı dosyalarda bizim sinsi arkadaşları barındıyormuşum. Barındırmak ne kelime oradan oraya yanımda taşıyordum. Çünkü 1999-2000 yılından bu yana yaptığım çalışmalar, arşivler, tutorialler, yedekler, resimler .... kelimenin tam anlamıyla "hazine".

-mola-

Cuma, Ocak 18, 2008

CPU problemleri (mi?)

Kasap et derdinde, koyun can derdinde...

Son zamanlarda "işlemci kullanım limitleri" ile boğuşuyorumya sanıyorum ki herkes bu dertten muzdarip. Her halde bu yüzden olacak; kendimce bulduğum çözümleri yada düşünceleri yazıyorum.

Bluehost forumlarındaki bu başlık altında promlemler yüzünden cıngar çıkaran bir müşteri ve diğerleri arasındaki diyalog var. [MultiLog da deniyor muydu acaba..? Neyse..]

Zaten içinde "forum" geçen tüm cümlelerde tartışma olduğu için nereyse kanıksadım bu olayları. Ancak burada tartışmaya milyon dolarlık şirketin sahibi/ceo suda katılıyor. "birimiz hepimiz, hepimiz birimiz.." kuralılın burada uygulanamayacağını, bir sitenin hatası yüzünden bütün siteler feda olsun denilemeyeceğini anlatmaya çalışıyor lakin gözü dönmüş hosting müşterisi, amcamı güzelce kalaylıyor.

Benim olayı buraya taşıma sebebim bu tartışmalar değil. Asıl sebebim, konu akışı içerisinde başvuru yapılan -belli ki sistem adminlerinden- Rando'nun açıklamaları.

Süper özetle diyorki: Sıkıntının sebebi %99 ihtimalle bir yerlerdeki 2 satırlık kod ve/ya İNDEX'lenmemiş MySQL tablolarıdır diyor.

* * *

Biraz açacak olursam, bütün gün sizi yoran şey, atıyorum Select * ramdom.. gibi bir sorgu olabilir. Görünüşe göre sayfanın bir kenarına yerleşleştirilmiş "Rasgele konu" linkidir. Ziyaretçi tıkladığında onu eski konular arasından birine götürecektir. işte çok masum gibi görünen bu kelimelik link, sizin kuyunuzu kazıyor olabilir.

Fazla sayıda konunuz varsa ve hele birde ORDER yapıyorsanız, o link için,
binlerce satıra bakacak ve sonra bir de bunları kendi içinde sıralamaya çalışacaktır.

Yani:
Bu tür sorunlar için gerçek çözümü dedicated servislerden önce ./root/tmp/slow_mysql_queries/ klasöründe aramak lazım..