Pythonzede

Python,Algoritma Teknikleri,İstatistik Hakkında konuşacağız.

Appengine'de Mail Api'nin Kullanılışı

Web sayfanızda iletişim bölümünde hazırladığınız bir form olsun ve sonuçlarını mail adresine gelmesini istiyorsunuz o zaman bu yazı size faydalı olabilir. Sıralama şu şekilde, 1.Formunuzu oluşturun, 2.Veritabanı için modelinizi yazın, 3.Formdan geleni işleyin. Öncelikle dosya yapımız;

|----- app.yaml
|----- iletisim.py
|----- model.py
|----- templates
|----------iletisim.html

Şeklindedir. Sıra sıra gitmek istiyorum. Html formumuzu oluşturalım(template/iletisim.html);



*

*



İsim ve soyisim girişi yapıldığında ve "Yolla" tıklandığında bilgilerin mail adresinize gelmesi için bir kaç adım var. Öncelikle modelimizi oluşturan python kodumuzu yazalım ("model.py")


from google.appengine.ext import webapp,db

class Basvuru_(db.Model):
"""
Basvuru yapilacagi zaman kullanilacak olan model
"""
ad = db.StringProperty(verbose_name="ad",required=True)
soyad = db.StringProperty(verbose_name="soyad",required=True)

##Otamatik Form Olusturmasi icin Kullanabilirsiniz
class Basvuru_form(djangoforms.ModelForm):
#Kullanisi
class Meta:
model = Basvuru_
fields = ('ad','soyad')


Modelimizi de olusturduktan sonra formdan gelen veriyi islemeye geldi. Bunun icin iletisim.py python dosyamızı oluşturup işlemlerimizi yapıyoruz.


from google.appengine.ext.webapp import template
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.api import users,mail
from django.shortcuts import render_to_response
import os,sys

class Iletisim(webapp.RequestHandler):
def get(self):

template_values={}
path = os.path.join(os.path.dirname(__file__), 'templates/iletisim.html')
self.response.out.write(template.render(path, template_values))

def post(self):
veri = Basvuru_form() #Bos girilip girilmedigini kontrol eder
if not veri.is_valid():
ad = up(unicode(self.request.POST["ad"]).encode("utf-8"))
soyad = up(unicode(self.request.POST["soyad"]).encode("utf-8"))
#TURKCE YAP
if ad and soyad: # isim ve soyisim girilmemisse formu kaydetmez
kayit = Basvuru_(ad=ad,soyad=soyad)
kayit.put()

if not mail.is_email_valid(ad): #eger isim yazmamissa size mail atmaz
pass
else:
sender_address = "yetis.m@gmail.com"
yollanan_adres="yetis.m@gmail.com,bilgi@spssanaliz.net"
subject = "Birisi Formu Doldurdu"
body ="\nAd Soyad : "+ad+" "+soyad+"formunuzu doldurdu."
mail.send_mail(sender_address,yollanan_adres, subject, body)
self.redirect("/ulasildi")#Burada form yollama basarili oldugunu gösteren bir mesaj verdirebilirsiniz.
else:
self.response.out.write("Bilgileri eksik girdiniz lütfen tekrar deneyiniz!!!iletisim")
else:
self.redirect("/hata")
application = webapp.WSGIApplication(
[
('/iletisim',Iletisim),
], debug=True)


Bunlara ek olarak dikkatinizi çekmiştir. "up" fonksiyonu kullanılmış, Türkçe karakter sorununu kaldırmak üzere bir arkadaşımdan bulduğum fonksiyonu kullanabilirsiniz. İşinizi oldukça göreceğini düşünüyorum ki sadece python'da değil, hangi dilde olursa olsun bu mantık ile Türkçe karakter problemlerini ortadan kaldırabilirsiniz. Eğer Türkçe karakter (ı,ğ,ü,ş,İ,ö,ç vb..)girilmiş ise büyük harfe çevip bu karakterlerden arındırıyor. Fonksiyonumuz;


def up(text):
"""Girilen TR karakterleri EN karakterlere cevirir"""
groupone = ["a", "b", "c", "\xc3\xa7", "\xc3\x87", "d", "e", "f", "g", \
"\xc4\x9f", "\xc4\x9e", "h", "\xc4\xb1", "i", "\xc4\xb0", \
"j", "k", "l", "m", "n", "o", "\xc3\xb6", "\xc3\x96", "p", \
"q", "r", "s", "\xc5\x9f", "\xc5\x9e", "t", "u", "\xc3\xbc", \
"\xc3\x9c", "v", "w", "x", "y", "z",\
"\xfe","\xde","\xfd","\xdd","\xf0","\xd0","\xfc","\xdc","\xf6","\xd6","\xe7","\xc7",\
"\u015f"]

grouptwo = ["A", "B", "C", "C", "C", "D", "E", "F", "G", "G", "G", "H", \
"I", "I", "I", "J", "K", "L", "M", "N", "O", "O", "O", "P", \
"Q", "R", "S", "S", "S", "T", "U", "U", "U", "V", "W", "X", \
"Y", "Z",\
"S","S","I","I","G","G","U","U","O","O","C","C",\
"S"]
for counter in range(len(groupone)):
text = text.replace(groupone[counter], grouptwo[counter])
return text

KontGmail

İsmi KontGmail

Can sıkıntısı dolu bir gecede ne yapmak istediğimi düşünürken, Cihan'ın aklıma soktuğu ve ne zaman yaptığımı hatırlamadığım, notifer tarzı dandik gmail kontrol edici programının kodlarını ekliyeceğim. Eklemekteki amaç kodların incelenmesi kullanılma amaçlarının nasıl olduğunun bilinmesi.

KontGmail aslında çok amaçlı fonksiyonları olacak programın gövde kısmı olacaktı fakat artık eskisi kadar ilgilenemiyorum. Örneğin sistem çekmecesine yerleşmiyor KontGmail, bunun için .net teknolojisini python ile kullanabilirdim, öncesinde bunu yaptım ama linux kullanan arkadaşlarımın varlığı aklıma gelince zaten geliştirilmiyecek bir programın kodlarını karmaşıklaştırmayayım diye düşündüm ve eklemedim.
Pek vaktim olmadığından özentisiz bir blog girdisi oluyor bu yüzden şimdiden kusuruma bakmayın.

Programda parselleme yapmak için freeparsel adlı farklı bir küçük modül kullandım. Arayüz olarakda tkinter ve bağlantı için urllib2 kullandım.

Programın tamamını ŞURADAN indirebilirsiniz.

İlgili programın kaynak kodu aşağıdaki gibidir:

# -*- coding: utf-8 -*-

import feedparser,urllib2,os,tkMessageBox
from textwrap import wrap
from ScrolledText import ScrolledText

from Tkinter import *

dosya_yeri=os.getcwd()

kul = "buraya_mail_adresinizi@gmail.com"
sif = "Buraya sifrenizi yaziniz"

class KontGmail(object):
def __init__(self):
self._URL = "https://mail.google.com/mail/feed/atom"
self.maxmail=10
def g_baglan(self):
self.giris = urllib2.HTTPBasicAuthHandler()
self.giris.add_password('New mail feed',\
'mail.google.com',\
kul,sif)
self.opener = urllib2.build_opener(self.giris)
self.posta_oku = self.opener.open(self._URL).read()
self.gelen_posta = feedparser.parse(self.posta_oku)
def g_oku(self):
self.gelen_yollayan = []
self.gelen_baslik = []
if len(self.gelen_posta.entries)==0:
print "Yeni Postanız Yok"
else:
for gelen in self.gelen_posta.entries:
self.gelen_yollayan.append(gelen.author)
self.gelen_baslik.append(gelen.title)
return self.gelen_yollayan,self.gelen_baslik





class AnaSayfa(object):
def __init__(self,master):
self.text = ScrolledText(bg="black",font=("Verdana",7,"bold"),fg="white",state=NORMAL)
self.text.place(relx=0.0,rely=0.0,relheight=1,relwidth=1)
self.postaOku()

def postaOku(self):
kontrol = KontGmail()
kontrol.g_baglan()
gelenler = kontrol.g_oku()
for gelen in gelenler[0]:
self.text.insert(END,"%s\n"%gelen)
self.text.config(state=DISABLED)
class Iconlar(object):
def __init__(self,master):
os.chdir(dosya_yeri+"/simgeler/")
self.res1=PhotoImage(file="page_user_dark.gif")

if __name__=="__main__":
root = Tk()
root.title("KontGmail Gmail Posta Kontrol")
icon = Iconlar(AnaSayfa)
ekran = AnaSayfa(root)

#root.wm_resizable(0, 0)
boyutx,boyuty = 300,100
ekranx=root.winfo_screenheight()
ekrany=root.winfo_screenwidth()
root.geometry("%sx%s+%s+%s"%(boyutx,boyuty,700,600))
#root.overrideredirect(1)
root.iconbitmap(default='sistem.ico')
root.resizable(width=FALSE, height=FALSE)

##root.configure(bg="HotPink4")
root.wm_attributes("-alpha",0.8)

root.mainloop()



Google App Engine uygulama geliştirme 2

Google App Engine ile uygulama geliştirmenin ikinci sayısında aslında sizlere apilerden bahsedecektim fakat farklı konulardan bahsedeceğim. Bunlar;

1. Google App Engine Django Kurulumu
2. Google App Engine ve Django Form Yaratma
3. Formları İşleme Ziyaretçi Defteri Uygulaması

Hiç laf ebeliği yapmadan olaya giriyorum çünkü uzun bir yazı olacak.

1. Google App Engine Django Kurulumu:
Öncelikle şunu söylemeliyim, Appengine'nin kendi web çatısı var ancak, dökümasyonu djangonun çok iyi ve sadece dökümasyon ile sınırlayamam artılarını. Bir kaç sebebden olsa gerek ısrarla django ile çalışıyorum appenginede. Şimdi sıra sıra nasıl Google'ın beleş uygulama motorunda çalışacağını görelim.

a) django-admin.py startproject yetis şeklinde bir proje başlattık. Ayrıntılara takılmayın isimler saçma bende profesyonel kodcu değilim :D

b) main.py

c) settings.py

d) app.yaml

application: app_engine_domain_adi
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: main.py

app.yaml dosyası hakkında daha önce neyin ne olduğunu anlatmıştım ve linklerde vermiştim bu sebebden dolayı bir daha üzerinden geçmiyeceğim. Şimdi bir deneme yapın ekranda django falan diyecek :D google_appengine/dev_appserver.py dosyanin_bulundugu_yer

e) Artık bir uygulama başlata biliriz ortam uygun hale geldi :D
> cd yetis
> python manage.py startapp Blog
uygulamamızın adı Blog olsun...

Artık Django'yu Google App Engine'de kullanabilirsiniz.

2. Google App Engine ve Django Form Yaratma ve İşleme:
Bu konudan açarak bahsetmek istiyorum bu nedenle link vermiyeceğim. Django Form işleme,yaratma,düzenlemenin Appengine'ye uyarlamasıdır, yani bu uygulama Django içindir Appengine sadece çalıştırır :D

Karışıklığı önlemek için dosya yapısının tree'sini veriyorum.
|----- app.yaml
|----- index.yaml
|----- main.py
`----- yetis
------|----- Blog
------|----|----- bform.py
------|----|----- models.py
------|----|----- templates
------|--------------- ziyaretci.html
------|--------- views.py
------|----- manage.py
------|----- settings.py
------------ urls.py

Django ile proje başlattık ( yetis ) ve birde uygulama açtık ( Blog ) . Şimdi sıra ile gidelim
a) Model oluşturulacak
b) Model için Form oluşturulacak

a) Model Oluşturulacak:
Modelimizi bir ziyaretçi defteri oluşturma uygulamasına göre oluşturuyorum.

from google.appengine.ext import db
class Z_Defteri(db.Model):
ad = db.StringProperty(verbose_name="Ad",required=True)
soyad = db.StringProperty(verbose_name="Soyad",required=True)
not_ = db.TextProperty(verbose_name="Mesaj")
inci = db.IntegerProperty(default = 0)
tarih = db.DateTimeProperty(auto_now_add = 1)
yazan = db.UserProperty()

def __unicode__(self):
return "%s %s %s %s"%(self.not_,self.ad,self.soyad,self.inci)

Modeldeki alanların parantezleri içindeki değişkenlerden bahsedelim.
verbose_name = "Ad" ----> Tablom oluştuğunda alanın ismini "Ad" yaptım. Yani şurası; <input type="text" name="ad" id="id_ad"
Peki neden bunu yaptık. Tabloya müdahale gücümüzü arttırmak için. Biz isim vermezsek kendisi uygun bir isim atıyacaktı zaten. Bunu neden biz yapmayalım :D
required = True ----> Bu özellik bizi zahmetten kurtarıyor. Şimdi bu alan gerekli mi_? gereksiz mi_? bir diğer değişle, bu alan hiç girilmesede olur mu? Bunu belirlemek için şöye dedik : luzumlu = Evet işte bunu söylüyoruz. Peki neden! Hata takibi yapmak için, eğer kullanıcı benım oluşturduğum bir tablonun alanını es geçerse ben ona hopbala, burayı doldurmadan geçiş izni yok diyorum :)
default = 0 ---> Ön tanımlı olarak sıfır değerini alsın.
auto_now_add = 1 ---> Tarihi commit yaptığımda otomatik oluştur.


b) Model için Form oluşturulacak:
Nedir! Ne değildir! Model için Form derken Modelin alanları için işlem yapabileceğim bir form alanı oluşturmakdan bahsediyoruz. Bunu el ile de yapabilirsiniz ama neden yapasınız! Bir sürü koddan ve hata takibinden kurtuluyorsunuz. Başlayalım! Öncelikle bform.py adında bir dosya oluşturalım. Dosyanın nerede oluştuğunu yukardaki tree'e bakarak görebilirsiniz.
bform.py

from models import Z_Defteri
from google.appengine.ext.db import djangoforms

class ZD_Form(djangoforms.ModelForm):
class Meta:
model = Z_Defteri
fields = ('ad','soyad','not_','tarih',)
exclude = ['inci','yazan']

----> "from models import Z_Defteri" ile modelimizin aldık
----> "from google.appengine.ext.db import djangoforms" Appengine'nin django'da bulunan ModelForm olayını kullanmamızı sağlayan modulunu aldık.
----> ZD_Form sınıfımıza djangoforms.ModelForm miras atadık. Buradaki ModelForm django'da 1.0 da var. Önceki versiyonunda yok 0,96 da NewForm olsa gerek :D
Öntanımlı değişkenlerden bahsedeyim.
-----> model = Z_Defteri burada modelimizdeki değişkenleri atadık
-----> fields = ('ad','soyad','not_','tarih',) kullanacağımız alanlar
-----> exclude = ['inci','yazan'] ilk form oluştuğunda form'da gözükmesini istemediğimiz alanlar.

bform.py dosyasının içine bu uygulamada kullanacağınız butun formları atabilirsiniz. Böylelikle herşey toparlı olmuş olur.
3. Formları İşleme Ziyaretçi Defteri Uygulaması
İstediğimiz model için istediğimiz formu oluşturduk. Şimdi bu oluşturduğumuz formu ekranda göstermek ve kayıt, düzenleme, silme gibi uygulamaları yapmak kaldı. Burada sadece kayıt olayını ele alacağım. Ziyaretçi defteri uygulaması örneği üzerinde form işlemeyi göreceksiniz!

Bunun için üzerinde değişiklik yapacağım dosyalar. template klasöründeki ziyaretci.html dosyası, Blog uygulamasındaki views.py ve yetis projesindeki urls.py dosyalarıdır. Yukardaki tree'ye göre dosyaların yerlerini tesbit edebilirsiniz.
Öncelikle views.py dosyası:

from django.http import HttpResponse, HttpResponseRedirect
from yetis.Blog.models import Z_Defteri
from bform import ZD_Form
from django.shortcuts import render_to_response
from google.appengine.ext import db
from google.appengine.api import users

Formları oluşturduğumuz yer bform.py den ZD_Form'u çektik, users,db apilerini ekledik, djangonun bir kaç fonksiyonunu ekledik.

def ziyaretci_defteri(request):
yazilanlar = Z_Defteri.all()
yazilanlar.order("-tarih")
yazilanlar = yazilanlar.fetch(10)

kullanici = users.get_current_user()
ndform=''
if kullanici:
k_islem = ("Hosgeldiniz, %s! (<a href=\"%s\">Cikis Yap</a>)" %(kullanici.nickname(), users.create_logout_url("/")))

if request.method == "POST":
zdform = ZD_Form(request.POST)
if ndform.is_valid():
yazan = kullanici
inc =Z_Defteri.all()
inci = inc.count()
not_ = (request.POST["not_"]).decode("utf8")
ad = (request.POST["ad"]).decode("utf8")
soyad = (request.POST["soyad"]).decode("utf8")
kayit = Z_Defteri(not_=not_,ad=ad,soyad=soyad,inci=inci,yazan=yazan)
kayit.put()
return HttpResponseRedirect('/')
else:
zdform = ZD_Form()

else:
k_islem = ("<a href=\"%s\">Giris Yapiniz</a>." % users.create_login_url("/"))

return render_to_response('ziyaretci.html',{'zdform':zdform,'yazilanlar':yazilanlar,'k_islem':k_islem,'kullanici':kullanici} )

Algoritması!
--->Önce sayfaya giren kişinin google kullanıcısı olup olmadığına bakıyoruz,
-------> google kullanıcısı ise ziyaretçi defterine not bırakmasına izin veriyoruz
-------------> Eğer Post ediliyor ve mothodumuz POST ise Form oluştur
-------------------->submit tuşuna basılmış ve Form boş bırakılmamışsa
-------------------------->Veritabanına Formda girilen alanları yaz.
-------------> Post edilmemiş ise sadece Form oluştur
--->değil ise google giriş sayfasına yönlendiriyoruz giriş yapıp tekrar yönlendirilsin.
Değişkenleri anlatacağım;
yazilanlar --> Ziyaretçi defterine yazılan yazının argümanlarının tamamını sorgu ile çekiyor.
kullanici --> Sayfayı ziyaret eden kişi. Dilerse deftere birşeyler yazabilir.
k_islem --> kullanici işemleri. Giriş ve Çıkış işlemi sadece :D
zdform --> Ziyaretçi Defteri form bilgilerini bu değişken ile alıyoruz. Form bu değişkende oluşuyor.

Burada daha fazla derine inmiyeceğim. Django'dan anlıyan arkadaşlar anlamışlardır diye umut ediyorum. Appengine kullanan arkadaşlar ise yeterince açıklayıcı olduğumu düşünüyorum.Sıra tempaltes kısmına geldi. Web sayfasında göstermek ve güzel görüntü oluşturmak için template kullanıyoruz.
Blog uygulaması içine bir templates klasörü açın ve içine ziyaretci.html dosyası açın. İçeriğinin bir kısmını bilgi amaçlı olarak burada, geri kalan tamamının linkini vereceğim.
en üstte {{k_islem}} koyarak kullanıcının gmail kullanıcı olup olmadığına bakarak yönlendirebiliriz.

<form action="." method="post">
<table>
{{zdform}}
</table>
<table>
<input type="submit" name="gonder" value="Gönder" class="inputsag"/>
</table>
</form>

Formumuz bu şekilde ekranda gözüktü :D zdform.as_b derseniz "b" halinde zdform.as_ul "ul" şeklinde zdform.as_table ise "table" şeklinde form oluşturur. Hiç birşey yapmazsanız sadece form oluşur.


{% for not in yazilanlar %}
<table>
<TD>
<p id="kisi">{{not.ad}} {{not.soyad}} <hr>
<em> id="eposta">{{not.yazan.email}}</em>
<em id="tarih">{{not.tarih|date:"d M Y D"}}</em></p>
<p> id="mesaj">{{not.not_}}</p>
</table>
</TD>
{% endfor %}

burada appengine ait olan yer "not.yazan.email" kısmıdır. Kullanıcının email adresini yazdırıyorum."not.tarih|date:"d M Y D"" burada ise tarihi filitre ederek ekrana basıyorum.
html dosyasının kod kısmı buradan ibarettir.

Çalışır halini görmek için

http://pythonizm.appspot.com



referanslar:
1- http://code.google.com/appengine/docs/datastore/creatinggettinganddeletingdata.html
2- http://appengineguy.com/2008/06/proper-unit-testing-of-app-enginedjango.html
3- http://www.djangobook.com/en/1.0/chapter07/
4- http://docs.djangoproject.com/en/dev/ref/forms/fields/

R-Project'e Merhaba Diyelim

R-Project istatistiksel hesaplama ve grafik işleme için geliştirilmiş bir dil ve programdır.
denilliyor. Fazla mesaide yazılan bu tanıma dikkat ederseniz
"bir dil ve programdır"
kelimesinin altında hem bir istatistik dilini hemde gelişmiş bir programla muhattapsınız demek istiyorlar. İstatistik dili dememin sebebi R'nin kendi sayfasında
The R Project for Statistical Computing
(İstatistik hesaplama çiin r-projesi) başlığını kullanmasından ileri gelmektedir. Çok kolay gözüken kolay anlanan açık kaynak kodlu ( GNU lisanslı ) ve dünyanın çeşitli üniversitelerinin, araştırma kurumlarının, hastenelerinin ve bunun gibi bende geliştiriyorum diyenlerin( listesi ) ve kullanıcı sayısının yirmi milyon insan olduğu tahmin edilen güzel ve kullanışlı programlar topluluğu :D ( İstanbul Bilgi Üniversitesinin'de bir yansısı bulunmaktaymış. )


R'nin diğer istatistik ve benzer paket programlarından farklılığını görmek, istatistik ve benzer paket programların listesi, fiyatları, hangi analizleri yapabilip yapamadığı, hangi sistemlerde çalışıp çalışmadığını görmek için sizi Şöyle alalım :D

Kurulumu : Pardus için ; sudo pisi it R

Öntanımlı olarak konsol tabanlı çalışıyor ancak siz Gui arayüzlerinden birini seçebilirsiniz. Evet arayüzlerinden dedim çünkü bir çok alternatif var. Pardus deposunda bulunan Rkward buna bir örnek veya Rcmdr(Rcommander) Çok gelişmiş bir arayüz kullanabilirsiniz.
Konsolda Çalışmak için : R yazıp entera bastığımızda R ile programlamaya ve istatistiksel hesaplamaya hazırız.

Bazı Fonksiyonlar

head ------------------> İlk n elemanın gösterilmesini sağlar
sapply ----------------> Fonksiyona göre elemanları listeler
colMeans ------------> Sutun'un Ortalaması
colSums -------------> Sutun'un Toplamı
rowSums------------> Satır toplamı
median --------------> Medyan hesabı yapar
length-----------------> Uzunluğu hesapar
var --------------------> Varyans hesabı yapar
sd ----------------------> Standart Sapmayı hesaplar
tapply ----------------> İndexlenmiş gruba fonksiyon atayarak sonuç dönderir.
cbind -----------------> Sutunları birleştirir.
summary -----------> Fonksiyonlar ile nesnenin bir özetini çıkartır.
hist --------------------> Histogram çizer
histogram ----------> Gelişmiş Histogram çizer. Çalışması için library(lattice)
boxplot --------------> Kutu çizimi
bwplot ----------------> Gelişmiş kutu çizimi
stem ------------------> Ağaç ve yaprak gösteriminde çizim
barplot ---------------> bar çizimi
table ------------------> Frekans tablosu çıkartır
cor ---------------------> Korelasyonu hesaplar
lm ----------------------> Uyulacak olan lineer model
plot --------------------> Genel plot fonksiyonu
abline -----------------> modele göre grafikde çizgi çizer

Örneklere geçmeden önce birkaç ekleme yapmak istiyorum. R'nin bir çok araçı bulunmaktadır daha önce söylediğim gui araçları buna örnek. Diyelimki işinize yarayacığını düşündüğünüz bir araç buldunuz ve onu indirdiniz! Nasıl kuracaksınız? Bunu bir örnek ile anlatacağım falan öncelikle sizi burayı ziyaret etmelisiniz çünkü birçok uygulamanın R'ye nasıl kurulacağı anlatılıyor. Örnek bir uygulama aracı kuralım. Uygulama aracımızın adı mapproj. İnternetten indirdiğimiz mapproj.tar.gz dosyamızı bir yere çıkardıkdan sonra dosyamızın bulunduğu dizinde;
R CMD INSTALL mapproj

diyerek kurulumumuzu tamamlıyoruz... R'yi çalıştırıp
>library(mapproj)
Loading required package: maps
>map()



dediğimizde ekranımıza dünya haritası gelecek. Kurcalayın, istediğiniz kordinata göre yer bulabilirsiniz, renklendirebilirsiniz, bölge araması yapabilir, isimlendirebilirsiniz. Sadece Avrupa için CIA'in word data two' sunda ben 30 milyonluk bir görüntü kaydı buldum :D. Araştırırsanız çok güzel fikirler çıkartabilirsiniz.

R çok ilginç bir program içerisinde öyle bilgiler varki insanı şaşırtmıyor değil. Programı kurduğunuzda sadece İstatistiksel hesaplama ve R dili'ni kurmuş olmuyorsunuz. Binlerce veriyide bilgisayarınıza indiriyorsunuz. Batan gemi Titanik hakkında bile ellerinizin altında veri bulunuyor.

>help.start()--> Komutunu çalıştırdığınızda artık bütün ihtiyacınızı görecek dökümasyon sayfasına ulaşmış oluyorsunuz.
>?map()--------> demeye görün. İnternet browserınızda anında dökümasyonunu gösteriyor veya konsolda.
>ls() ------------> yüklü olan fonksiyon, değişken, nesneleri gösterir
>dir() ----------> O an içinde bulunduğunuz dizinin içeriğini gösterir.

Sonraki yazımda bir analiz yapacağım. Burası fazla şişti. Yeterince merhaba demişisizdir umarım.

İlk Google App Engine Uygulamam

AppEngine'de uygulama geliştirmek istiyenler için belki başlangıç referansı olabileceği kanısında olduğum için Google Code'de yeni bir proje başlangıçı yaptım ve http://code.google.com/p/gencistatistik/ adresine yaptığım uygulamanın kodlarını koydum. Açık kaynaklı ve geliştirmeye veya katkı sağlamaya açık olduğundan düşünceleri olan arkadaşlarımın bana ulaşmaları iyi olur.

Google Code'ye koyduğum AppEngine ile yapılan web uygulamasının yayınlandığı ve sonucu göreceğiniz yer ise Blog için http://yetis.appspot.com dergi için ise http://gencistatistik.appspot.com adresleridir. Blog uygulamasını geliştirmeyi gösterilen ilgiye göre arttıracağım.

Bir sonraki yazılarımda Google Code'de projeniz için ücretsiz olarak nasıl projenizi oluşturabileceğiniz, lisans seçenekleri, svn kullanmanın güzellikleri ve toplu çalışma mantığından bahsetmeyi düşünüyorum. Saygılarımla !

Google App Engine uygulama geliştirme 1

Son zamanlarda web programlama öğrenme azmimin sonunda galib geleceğimi ve bana çok uzak olan bu alanda kendime birşeyler katabileceğimi gösteriyor. Web programlama diyince akla gelen çatılara değiştirerek bir yenisini ekleyen ve iyiki olan Google'in APP ENGINE uygulaması ile web uygulamaları geliştirmeye bende başladım. Biraz araştırma, biraz deneme yanılma yöntemiyle mantığını azda olsa kavramış bulunmaktayım. App Engine yeni! djangoyu kullan, dökümasyonda sıkıntı çekersin veya sırf beleş hosting var o yüzden kullanıyorsun! diyenleri duyar gibiyim. Ne yalan söyleyim haklısınız ama önce aşağıdakileri okuyun.

  • 500 mb web alanı,

  • 9 tane app engine uygulaması açabilirsiniz ki bu toplamda 4500 mb'lık web alanı demek,

  • Aylık 5 milyon sayfa gösterimi için her App Engine uygulaması 500 mb'a kadar depo, yeterli band genişliği ve cpu kullanamı sağlıyor.

  • Uygulama version takip sistemi. Bunu alatmak zevkli olacak çünkü herkezin hoşuna gideceğine inanıyorum. Buraya bir yıldız atalım ve aşağıda anlatalım. *Version Takip

  • Google App Engine admin panelini unutmamış, istatistiklerin tutulduğu, version seçiminin yapılabildiği ve dilerseniz uygulamanıza varsa Domain adresinizle bütünleştirebilirsiniz. Bunlarla artı olarak milyonlarca tabloyu yönetmek için veri gösterim bölümü var(data viewer)... Uygulamanızın çalışma esnasındaki Log'larınızı takip edebilir ve hataları görebilirsiniz.

  • App Engine'nin bir özelliği daha çok hoşuma gidiyor. Henüz kullanmak nasip olmadı ama:D Admin panelini incelerseniz orada Developers yazan bir kısım var. Geliştiriciler bölümünde projenize istediğiniz kadar kullanıcıyı dahil edebilir ve ortak bir çatı altında uygulamalarınızı yönetebilirsiniz. Tek yapmanız gereken geliştirici olacak kişinin gmail adresini buraya yazmak.

  • Modeller,Template,Static dosyaları, kendi web uygulamaları için frameworkü ve en güzeli baştan aşağıya python ile web uygulamaları geliştirebileceğiniz açık kaynak kodlu güzel bir çalışma ortamı ve sağlayıcısı.


*Version Takip Açıklaması : Benim çok hoşuma giden ve sizinde çok hoşunuza gideceğine inandığım bir uygulamadan bahsedeceğim. Appengine'de ayar dosyasında şöyle birşey vardır.

application: gencistatistik
version: 2
runtime: python
api_version: 1


  • application kısmı uygulamamızın AppEngine'deki adını yazılıyor

  • runtime kısmı uygulamanın hangi dili kullandığını

  • api_version api versionudur. Bu kısmı pek anlamış değilim

  • version bu kısımda projenizi versionlara ayırabilirsiniz.

  • Örneğin bir blog uygulaması yapıyorsunuz. Geliştirdiğiniz blog uygulamanızı makinanızda google_appengine/dev_appserver.py sitem/ şeklinde test ettiniz hiç bir sorun yok, o zaman dediniz ki ben bunu geliştireceğim ve bunun üzerine gelişmiş versionlar koyacağım. Appengine size bu fırsatı tanıyor ve version kısmına 1 yazarsanız her alanınıza yüklediğinizde(google_appengine/appcfg.py update sitem/) 1 ve üstü versionlar olur. Diyelimki artık blog uygulamanız yeterince gelişti ve siz hataları görmek için 1 sürümünü kaldırmadan version kımına 2 yazdınız ve alanınıza yüklediniz. App Engine'de artık hem 1. ve hem 2. sürümler mevcut. Admin panelinden hangisini öntanımlı(default) version olarak seçerseniz o sürüm uygulama.appengine.com adresinde gözükür. Diğeri ise geliştiriciler tarafından test etmek amacı ile kullanılabilir. Süper değil mi? :D


    İştahınızın kabardığını düşünüyorum ve birazda icraat dediğinizi duyuyorum. Açıkcası bu yazıyı yazmadan 1 gün önce appengine ile merhabalaştım :D bir gün sonra küçük bir blog uygulaması yaptım.( http://gencistatistik.appspot.com/ ) Nereden başlıyacağınızı bilmiyorsanız pytr.org adresinde güzel referans olarak kabul ediyorum. Çok güzel bir anlatım tarzıyla konuyu özetlemişler, nasıl hesap alacağınızı, nereden başlıyacağınızı, kavramları ve başlangıç teknikleri. ( TIKLA )

    Django kullanan arkadaşlarımın çabuk adapte olacağına inanıyorum. Ben uygulamamda django kullanarak değil App Engine'nin kendi Framework'ünü kullanıyorum. Kendi blog adresimden bir örnek ile bitirmek hayırlı olacak uzadıkça uzuyor :D Öncelikle pytr.org adresindeki makaleleri okuduğunuzu varsayıyorum.
    Dosyanın içerik listesi.
    mysite
    ------>static
    ------>python
    -------------->templates
    ---------------------------->blogyaz.html
    ---------------------------->index.html
    -------------->hello.py
    ------>app.yaml
    Python dosyası sadece bir tane var. Bütün python kodları aynı yerde, parçalamadım.

    from google.appengine.ext import webapp
    from google.appengine.ext.webapp.util import run_wsgi_app
    from google.appengine.api import users
    from google.appengine.ext import db
    from google.appengine.ext.webapp import template
    #Blog uygulamamda kullanmak için tablolarım.
    class Blogum(db.Model):
    yazan = db.UserProperty()
    girdi = db.TextProperty()
    blogbaslik = db.StringProperty()
    date = db.DateTimeProperty(auto_now_add=True)

    class Karsilama(db.Model):
    yazan = db.UserProperty()
    yazi = db.StringProperty(multiline=True)
    date = db.DateTimeProperty(auto_now_add=True)

    Kısaca Blogum ve Karsilama tabloları oluşturdum. Appenginede djangoda olduğu gibi modeli oluşturmama gerek yok. İsterseniz çalışma anında dahi tablolara müdahale edebilirsiniz :D Karsilama gelen kişiye mesaj yazma veya algılama için oluşturdum. Tablolar çok basit olabilir ama buda bir örnek :D

    class AnaSayfa(webapp.RequestHandler):
    def get(self):
    bloglar = Blogum.all()
    bloglar.order("-date")
    kullanici = users.get_current_user()
    if kullanici:
    url = users.create_logout_url(self.request.uri)
    url_linktext = "Çıkış"
    else:
    url = users.create_login_url(self.request.uri)
    url_linktext = "Giriş"
    template_values = {
    "bloglar":bloglar,
    "url":url,
    "url_linktext":url_linktext,
    "kullanici":kullanici}
    path = os.path.join(os.path.dirname(__file__), 'templates/index.html')
    self.response.out.write(template.render(path, template_values))

    Class'larımız eğer biz appenginenin kendi web çatısını kullancaksak miras alıyoruz. Burada miras olarak webapp sınıfının fonksiyonu RequestHandler'i aldık. get fonksiyonunda yolluyor post fonksiyonu ile gelen veriyi yorumluyoruz. bloglar = Blogum.all() ile blogum tablosuna sorgu çekiyor ve order("-date") ile güncel tarihe göre sıralatıyoruz. (SQL nerde :D) Modeller ve alanları ile ilgili daha geniş bilgi için TIKLA burayı biraz kurcalayın.
    kullanici = users.get_current_user() burada Appenginenin Users Api'sini kullandık ve get_current_user() ile en basit söylem ile giren üye mi? öğrendik :D Üye ise çıkış yapmasını , üye değil ise google'ın giriş sayfasına yönlendirdik.

    Path dosyasında index.html dosyasının yerini aldık ve self.response.out.write(template.render(path, template_values)) ile template sözlüğündeki anahtarları index.html dosyamızda kullanmak üzere yolladık :D Artık html dosyamız ile işlemlerimize devam edebiliriz. Şimdilik bu kadar yeter sindirin ve kurcalayın html dosyalarımızda yolladığımız bu anahtarları nasıl kullandığımızı, static dosya mantığı, app.yaml dosyasının mantığı, admin paneli ve inşallah Appengine'deki uygulamamın içinde google api'lerinin nasıl kullanıldığını anlatacağım. Eksiğim yanlışım veya düzeltilmesi gereken bir yer, konu veya mantık hatası varsa lütfen uyarınız.

Python (vodafon mesaj) ve mechanize modülü

Bildiğiniz gibi Vodafone kullancılarının günlük bir mesaj hakkı vardır. Ancak bu mesaj hakkını hem sadece 1 tane olmasından hemde uğraşmak istemememizden kullanmayız. Bu python betiği ise üşengeç olup bir tanede olsa kullanırım diyenler için işe yarayabilir ama daha çok pythondan anlayan insanların "mechanize" modülüne örnek olması amaçlanmıştır.

Python programlama dilini benim gibi öğrenmek için uğraşanlardansanız sizin için bir örnek olabilir. Eğer Linux kullanıyorsanız konsol komutu gibi kullanabilirsiniz bunun için python dosyasısını pardus için söylüyorum /usr/local/bin/ kısmına kopyalayınız daha sonra konsolda python dosyasının ismini yazarak kullanabilirsiniz. Dosyaya kullanıcı hakkı vermeyi unutmayınız. İşinize yaraması umuduyla.


#!/usr/bin/env python
#-*- coding:utf-8 -*-

###########################################################
###VODAFONE abonelerinin günlük mesaj hakkını kullanması###
###için yazılmıştır. ###
###Yazan : Mustafa Yetiş ###
###E-Posta : yetis.m@gmail.com ###
###########################################################
try:
import mechanize
except:
print "mechanize modulü kurulu değil"
print "Yüklemek için: sudo pisi it mechanize"


def baglan():
global b
b=mechanize.Browser()
b.open('https://www.vodafone.com.tr/MyVodafone/login.php')
b.select_form(nr=1)
def giris():
global b
gsmno=raw_input("GSM NO :")
vodos=raw_input("Vodafon Şifreniz:")
b["GsmNo"]=gsmno
b["MyPass"]=vodos
print "Bağlaniyor"
r=b.submit()#giris

try:
b.open('https://www.vodafone.com.tr/MyVodafone/myvodafone.php?pageId=WebSms')
b.select_form(nr=1)
except:
print "Bağlandi"
print "Hatalı Numara veya Şifre"
exit(1)
def mesaj_cek():
global b
try:
print "Mesaj Yollanacak Numaranın(Örn 543) kodu:"
yolk1=raw_input() #Örneğin 543
print "Mesaj Yollanacak Numara(Örn 4658758) kodu:"
yolk2=raw_input() #Örnein 4658758
try:
b["WebSimSmsUserGsmPrefix"]=[yolk1]
b["WebSimSmsUserGsmNo"]=yolk2
except:
print "yanlis giris yaptiniz!"
exit(1)
print "Yollacak Mesajı Giriniz:"
mesaj=raw_input()
b["WebSimSmsText"]=mesaj
r=b.submit()
except:
print "GUNLUK SADECE 1 MESAJ HAKKINIZ VAR!!!"
exit(1)
b.close()
baglan()
giris()
mesaj_cek()

Python İle Kelime Ezberleme Programı

Merhaba arkadaşlar. Almanca öğrendiğim kelimeleri hatırlatma yapması veya daha önce öğrenmediğim öğrenmeye çalıştığım kelimeleri sorması ile kelime dağarcığımızı arttırmaya yönelik yaptım. Siz isterseniz ingilizce isterseniz başka bir dil için kullanabilirsiniz.
Program veri tabanında üç tane alan var bunlar: 1- Yabancı Kelime 2-Okunuşu 3-Türkçe Karşılığı
bu alanları girerek veritabanınızı büyütürek kelime kapasitenizi arttırabilirsiniz.
Önemli Not : Programın içindeki "yol" nesnesi veritabanının bulunduğu veya bulunması gerektiği yeri işaret eder. Ben pardus da /home/kullanıcı_adi dizinini kullanıyorum.
Örneğin windows kullanıcısı yol="c:\alm.db" diyebilir.

İşinize yarar umarım. Fazla özenmeden yazdım ama benim işimi görüyor.

#!/usr/bin/env python
#-*- coding:iso-8859-9 -*-

############################################
#Kelime Ezber Programı ####
#Yazan: Mustafa Yetiş ####
############################################

import sqlite3,random
import os
yer=os.getcwd()
yol="%s"%yer+"/"+"alm.db"
#Açıklamasını yukarda yapmışdım
bag=sqlite3.connect(yol) #----------------------> yol adlı veri tabanına bağlanıyor
cur=bag.cursor()
global dogru
global yanlis
dogru,yanlis=0.0,0.0
def all_ekran():
self.cur.execute(u'select * from alm') #-----> kayıtlı verileri alıyorum
i=1
print " ALMANCA"," OKUNUŞU"," TÜRKÇE"
for satir in cur:
print i,"%20s"%satir[0],"%22s"%satir[1],"%22s"%satir[2]
i+=1
def giris():
almanca=raw_input("almanca:")
okunusu=raw_input("okunuşu:")
turkce=raw_input("türkçe:")
cur.execute("insert into alm values(?,?,?)",(almanca,okunusu,turkce))
bag.commit()
def satir():
global hepsi
cur.execute(u'select * from alm')
hepsi=cur.fetchall() #-----------------------> Kayıtlı Veri Sayısı
def sor_alm():
global dogru
global yanlis
satir()
a=random.randint(0,len(hepsi)-1) #------------> Rasgele veri alıyor
print "\n",a,".)","%s"%hepsi[a][0],":?\n" #---> Soruyor
alm="%s"%hepsi[a][2]
cevap=raw_input("Türkçesi:") #-------------> Cevab alınıyor
if cevap==alm:
print "\n ALMANCA"," OKUNUŞU"," TÜRKÇE"
print a,"%20s"%hepsi[a][0],"%22s"%hepsi[a][1],"%22s"%hepsi[a][2]
dogru+=1.0
else:
yanlis+=1.0


def sor_trk():
global dogru
global yanlis
satir()
a=random.randint(0,len(hepsi)-1)
print "\n",a,".)","%s"%hepsi[a][2],":?\n"
trk="%s"%hepsi[a][0]
cevap=raw_input("Almancası:")
if cevap==trk:
print "\n ALMANCA"," OKUNUŞU"," TÜRKÇE"
print a,"%20s"%hepsi[a][0],"%22s"%hepsi[a][1],"%22s"%hepsi[a][2]
dogru+=1.0

else:
yanlis+=1.0
def basari():
global dogru
global yanlis
oran=dogru/(dogru+yanlis)
print "BAŞARINIZ:",oran
print "(1)Almanca kelimenin karşılığı"
print "(2)Türkçe kelimenin karşılığı\n"
secim=raw_input("Seçimini yapınız:")
if secim=="1":
while True:
sor_alm()
basari()
if secim=="2":
while True:
sor_trk()

Python ile Soket Programlama

Merhabalar, yeni bir projede kullanmak üzere soket programlama konusundayım. Clientler , soketler ile uğraşıyoruz. Önce sunucuyu açacağım,sonra istemciyi çalıştıracağım, sonra sunucuya ben geldim kardeş naber diyeceğim, sunucuda iyidir hadi konuşun siz benim işim var diyecek. Yani anlıyacağınız alengirli ( gösterişli ama tuzak dolu).

Basit basit örnekler vereceğim, bu şekilde zamanla hızlanırım diye düşünüyorum. Projem bittiğinde de projemizin tanıtımını buradan yapacağım ancak kendi web sitesi olacak, ticari amaç taşıdığından.

Client(istemci):

from socket import *
#Socket modülünün tamamı yüklendi
host = ""
# Buraya yerel ağda kullancaksaniz yerel ip farklı bir ağda çalışcaksanız internet ip'nizi
# vermelisiniz. Farklı ağ kullancaksanız giriş yapacağınız portu sunucunun modemden açmış olması gerek.
port = 34000
# örnek olarak 34000 port için özel sınırlamalar var bunları bilmelisiniz.
cakistir = ( host,port )
# Host ve port adreslerinizi çakıştırcaz.
boyut = 1024
# kaç bayt söz konusu : 1 kb mı ?

soket = socket (AF_INET,SOCK_STREAM)
# Soketi açtık AF_INET ve SOCK_STREAM Not:Olguları bilmelisiniz
soket.connect(cakistir)
# Bağlanma isteği yolladık
soket.send("Deneme Mesajı")
#mesajımız gitti,Not: SOCK_STREAM kullandigimizdan send kullandik Datagram'da sendto kullanmalıyız.

dinliyorum=soket.recv(boyut)
# Dinlemedeyiz belki birisi birşey yollar. Ama en fazla 1024 baytlık olacak yolladığı veri.
print dinliyorum
# ne demiştin


Server(sunucu):

from socket import *
#socket modülümüzü yükledik.
host = ""
# Yerel ip
port = 34000
# Aynı port dikkat ederseniz. Modem'den sunucu olduğum için bu portu açmalıyım eğer yerel olarak kullanacaksam gerek yok port açmaya.
boyut = 1024
# Bundan fazla yollarsan dinlemem kapatırım haberin olsun diyoruz.
cakistir = (host,port)
# Bunlar ayrılmaz ikili.

sunucuSock = socket(AF_INET,SOCK_STREAM)
# Soket açtım
sunucuSock.bind( cakistir )
# İp ve Portu çağıştırdık
sunucuSock.list(5)
# Ben en fazla 5 kişi ile muhattap olurum diyoruz. Yani 5 tane istemciyi dinliyecek o kadar kişi bağlancak. 6 kişi ise istemiyoruz bizim ev de bu kadar yatak var diyecek.
istemcisoketi,adres_port = sunucuSock.accept()
# Dananın kuyruğu burada kopuyor. Siz burada bağlantıyı kabul ediyor sunuz ve (baglanti,adres) çiftini geri döndürüyorsunuz.
veri = istemcisoketi.recv()
# Burada istemci ne diyor!.. Karşıdan yollanan ve veriyi bu şekilde alıyoruz. Yani kapı çalındı kapıyı açtık kimsiniz dedik oda bize birşeyler dedi. Sonra dinliyoruz işte ne derse alıyoruz. Şimdilik bir kere dinliyoruz ama while 1: içine atarsanız hep dinlersiz.
yaz = raw_input(">>")
istemcisoket.send(yaz)
# dikkat ederseniz connection nesnesi yani accept den geriye dönen değerden faydalanarak yolluyorum. Çünkü connection nesnesi ip ve port adreslerini tutuyor.
istemcisoket.close()
sunucuSock.close()

Şimdilik bu kadar. Yanlışlar veya doğru olmayan bilgiler olabilir. Bu durumda beni bilgilendirmeniz gerekli. Soket olayı çok karmaşık bununla ilgili size linkler koyuyorum okumalısınız ve okumalısınız yoksa öğrenilmiyor. Geyik tarzı yazmama kızmayın, bende fazla anlamadığımdan dalgaya vuruyorum.

İkili Arama Tekniği

İkili arama tekniği, sıralı dizilerde hızlı arama tekniğidir. Bu tekniğin mantığı; dizinin orta değerine bakar, küçükse artık sadece dizinin ilk yarı kısmı ile ilgilenir, tekrar orta kısmındaki elemana bakarak diziyi küçültükçe küçültür. log2*N tane arama yapar. Bu çok büyük avantajdır.
Yapay-Zeka.org adresinde şöyle açıklamış;

İkili Arama, sıralı bir dizide, belirli değerin bulunmasına yönelik bir algoritmadır. Bu teknikteki her bir adımda, aranan değerin, dizinin orta değerine eşit olup olmadığı kontrol edilir. Eşit olmaması durumunda aranan değerin orta değer tarafından ikiye ayrılan kısımlardan hangisinde olduğu kontrol edilir, aranan değeri içeren kısım bir sonraki adımda arama yapılacak dizi olur ve bu sayede arama yapılan listedeki eleman sayısı her adımda yarıya indirilmiş olur.

Bu algoritma ile N elemanlı bir dizide en fazla log_2 N karşılaştırma yaparak aranan değerin yerini bulmak mümkündür.

Kendi çizdiğim algoritma.

Yazdığım Python KODU

#!/usr/bin/python
# -*- coding: cp1254 -*-
"""
İkili arama, sıralı bir dizide, belirli değerin bulunmasına yönelik bir algoritmadır.
Dönen değer : Bulunursa , dizinin kaçıncı indizi olduğu
Bulunmazsa, -1
"""
def ikiliArama(aranan,dizi):
bas = 0
son = len(dizi)-1
while ( bas != son ):
i = int(round((bas + son )/2.0))
if dizi[i] == aranan:
return i
elif dizi[i] > aranan:
son = i
else :
bas = i
if int(round((bas + son )/2.0)) == son:
return -1


Örnekle pekiştirmek istiyorum:

>>> dizi = [1,2,6,5,43,65,45,43,23,21,12,11,14,43,23,77,22,11,1,1,2]
>>> dizi.sort()
>>> print dizi
[1, 1, 1, 2, 2, 5, 6, 11, 11, 12, 14, 21, 22, 23, 23, 43, 43, 43, 45, 65, 77]
>>> ikiliArama(43,dizi)
15
>>> ikiliArama(44,dizi)
-1

Doğrusal Arama Algoritması

Dogrusal arama tekniği (Linear Search veya Sequential Search) algoritması, bir liste içindeki elemana ulaşmaya yönelik arama algoritmasıdır. N boyutlu bir dizinin içerisinde, aranan elemanı bulana kadar eşleştirme yaparak ilerler. Bulduğu zaman durur ve çıkar.D
Python Fonksiyonu.


#!/usr/bin/python
# -*- coding: cp1254 -*-
##################
### Mustafa Yetiş ######
##################
def dogrusalArama ( aranan , dizi ) :
"""
Dogrusal arama (lineer search,sequential search) algoritması.
Kullanisi : dogrusalArama(aranan,dizi)
Yazan : Mustafa Yetiş
"""
for i in range ( len ( dizi ) ) :
if dizi[ i ] == deger :
sonuc = True
break;
if sonuc :
return i
else :
return -1


Pythonik yazım tarzları.

dogrusalArama_yer = lambda aranan,dizi:[("%d.inci deger : "%i,dizi[i]) for i in range(len(dizi)) if dizi[i]==aranan]
"""
Kullanışı : dogrusalArama_yer ( ara , dizi )
Geri dönen değer : x.inci deger : aranan
"""


dogrusalArama_son = lambda aranan,dizi : [ ( retrun i ) for i in range ( len ( dizi ) ) if dizi[ i ] == aranan ]
"""
Kullanılışı : dogrusalarama_son ( ara,dizi )
Geri dönen değer : aranan
"""

Geçmişe Özlem

Free Image Hosting at www.ImageShack.us
Eski arkadaşlarımızla eskiyi andığımızda mutlaka içinde geçen "susam sokağı sakinleri".



Hayatımızın kötü, sıkıcı, yorgun, yanlız veya istediğimiz gibi gitmediği anlarda aklımıza hep en mutlu olduğumuz zamanlar gelir. Herzaman yaptıklarımızla yüzleşemediğimizden veya yüzleşmek istememizden (korkmamızdan) sebeb olsa gerek bu özlemler hüzünlü olur. Halbuki mantık olarak iyi zamanları hatırlamak sevindirici olmalı peki ama neden üzülüyoruz, hüzünleniyoruz ! Bence herşeyi nasıl mahvettiğimiz ve şuandaki duruma hayatımızı nasıl getirdiğimiz yüzünden olsa gerek.

Geçmişte yaşadığımız iyi veya kötü ne olursa olsun hatırlandığı zaman acı veriyor yeterki kendimizi kötü hissedelim. Geçmişteki o güzellikler, sade gibi gözüken aslında nasıl kazandığımızı pek hatırlayamadığımız o sıkıcı olmayan, tek düze hayat tarzından uzak günler, düşündüğümüzde ahhhh! çektiğimiz ve yüzümüzde hafif bir tebessümle gözümüzün sağ çapraza baktığı günler bu günler her insanın başına geldiği anlardır. Aslında güzeldirler, çünkü yaşanmışlığın göstergesidir ve güzel olanla kötü olanı ayırt edebildiğimiz anlardır. Yaşadığımız utanç anlarını aklımıza getirdiğimizde, bıyık altından güldüğümüz, kötü anları aklımıza getirdiğimizde asla bir daha o duruma düşmüyeceğim halleri bunlar güzel, farkındalığın en güzel örnekleri. İlk kız arkadaşımızdan tutunda, ilk öpüştüğümüz o ilginç anlarda :) , yaşadığımız her an bizde bir iz bırakması gelecekte bunları kullanabilmek gerçekten güzel birşey olsa gerek. Birde kötü olanları var tabi karın ağrıları çektiğimiz anlar, hazımsızlıklarımızın olduğu anlar, sinirlenip çocuk gibi elde edemediklerimiz için üzülmemiz yada yaşadıklarımızdan dolayı bir suçlu aramamız. Aslında çok tehlikeli anlardır yabancı oluruz kendimize, aynanın karşısındayızdır ancak sanki biz aynaya değil ayna bize bakmakda yani o kadarcık uzağız kendimize. Bu gibi durumlara sürekli düşen biri olarak, şunu söyleyebilirim; elde edemediğimiz şeyleri orada bırakmamız daha iyidir diye düşünüyorum çünkü daha sonraki elde etme çabalarımız hiç bir zaman ilk elde etmek istediğimiz gibi olmuyacak. Kötü yaşanmışlık için ise ; bir daha asla bu yaşanmışlığı yaşamayacağınızı düşünmek sizi rahatlatacaktır ben öyle yapıyorum.

Geçmişimizi biz yazdık ve gelecekte öyle sadece basit paradokslara düşüp geleceğinizi sizin yazmayacağınız yanılgısına düşmeyin Unutmayın gelecek bizim elimizde geçmiş ise değil. Eski bir sözle bitiriyorum...

DÜN GEÇTİ, YARIN GELMEDİ,ANI YAŞAMAK LAZIM.

Hayatın Biriken Verileri

Geleceğe baktığımızda, hayaller kurduğumuzda, geçmişin üzerimizde bıraktığı izleri görürüz ve hep bu izlerle yaşamaya alışmaya çalışırız. Bazen bu izler için bir sorumlu bazen ise daha kötüsü suçlu aramakdayız aslında bu olay yanımızda birilerinide götürmek ya da yanlızlıklığımıza çözüm aramaktır veya buna benzer bir düşünce.

Neden ütü aletine dokunmadan veya yaklaşmadan sıcak olduğuna inanmayız veya ateşle oynamanın kötü bir şey olduğunu illa bir nusübet gelmeden anlayamamamız bizim zeka seviyemizden mi kaynaklanıyor! Hayatta hiç birşeyi eskiden, yaşanmışlıkdan bakarak örnek almıyoruz,sürekli kendi tecrübelerimizle yolumuza devam etmek ve kötü veya iyi bunu bizimde yaşamamız gerektiğine inanıyoruz ya da benim düşünceme göre bu bize doğuştan verilen bir içe dönüş. Hayatta yaşadıklarımızı bir veri setine atıp sonra bunu istatistiki analize atsaydık bir sonraki hamlemizde ne yapabileceğimizi kestirebilirmiydik.

Free Image Hosting at www.ImageShack.us

Bu veri setine göre haraketlerimiz hep bir "tek düzen" havasında gider ve sıkıcı,banel,anlamsız bir hayat benimsemiş olurduk. Öyle ise hata yapmanın normal olduğunu ve yaptığımız hataların aslında yaşanmışlık olması gerekliliğinin açık bir gösteri olduğunu kabullenip yolumuza bu hiç olmamış gibi hareket etmek bu kadar olanıksız gözükmesi nedensiz ve saçma. Halbuki insan oğlu olarak bahşedilmiş olanları sonuna kadar sömürüp üstüne birde güzel günahlar işleyip geride bırakıyoruz ama bu yapılanlar aslında iyi olmaya ve güzel olanlara ulaşmak için kullanılan bir araç olduğunun farkına varamıyoruz.

Hayat eğer bir veri setine konulsaydı ve bir sonraki hamlemizin yanlış olacağını bilseydik bunu genede yapardık. Çünkü hayatın biriken izleri bizi iyi ve güzel olana götürüyor. Bu izi taşımak, tecrübesizliğimizi ve yetersizliğimizi yüzümüze vurup yanlız olmadığımızı bize gösteriyor. Keşkelerle yaşamak yerine daha iyi bir geleceğe bakmak için hayayınızdaki biriken verileri kullanmak mantıklıdır.