Category Archives: Python 3

Python ile Metinlerde Frekans Analizi

Elimizdeki bir metinde hangi karakterlerin olduğunu, hangi karakterin kaç kere geçtiğini ve metnin yüzde kaçını oluşturduğunu ölçmek için kullanabileceğimiz bir sınıf oluşturdum. Sınıfın yaptığı, Python’da yer alan veri yapılarını kullanarak girilen metnin frekans analizini yapmak.

Ne işe yaradığına geleyim. Program herhangi bir jargonda kullanılan harf, rakam ve karakterlerin analizini yapıyor. Yani mesela çocuk hikayelerini verdiğinizde alıntılar çok olduğu için tırnak işaretlerinin frekansını ve yüzdesini bazı harflere göre daha yüksek bulurken, sayıların az olmasını bekleriz. İşte bu analizi yapıp, hangi harf daha çok kullanılıyor diye bir veri elde ediyoruz. Bunu yerine koyma ile şifrelenmiş(Substitution) metinlerin orijinal hallerini elimizde sadece şifreli metin varken bulurken kullanıyoruz. Continue reading Python ile Metinlerde Frekans Analizi

Python ile Sezar(Ceasar) Şifrelemesi – Kullanıcı Arayüzü

Şifreleme yaparken karşılaşılabilecek en basit algoritmalardan birisi Sezar(Ceasar) algoritması. Bu algoritmanın anlatımına buradan ulaşabilirsiniz. Basit anlamda harfleri 3’er kaydırarak uygulanıyor. Kodu yazarken 3 sağa kaydırdık, isterseniz kod üzerinde ilgili kısımlarda – ve + işaretlerini değiştirerek sola kaydırabilirsiniz. Continue reading Python ile Sezar(Ceasar) Şifrelemesi – Kullanıcı Arayüzü

Python3 Kullanarak Merkezi Farklar Yöntemiyle Sayısal Türev

Kodlarla veya programlama ile ilgili sorularınızı http://www.ufakseyleratolyesi.com/sorucevap/ adresinden her zaman sorabilirsiniz.

 

İleri ve Geri Farklar Yöntemi İle Türev Hesabı

1. dereceden türev almak için(elbette istediğimiz dereceden alabiliriz, programı basit tutmak istedim) kullanacağımız yöntemlerden olan ileri ve geri farklar yöntemini bir bilgisayar programı haline getirmek istedim. Python3 ile yazdığım koda fonksiyonu x^2+5*x+3 gibi ve hesaplamak istediğiniz değeri giriyorsunuz ve size türev değerini h değişkeninin farklı değerlerine göre veriyor. Ayrıca aradaki hatayı da hesaplayıp ekrana döküyor. Şu an tek sorunu h’ı 10 üzeri -20 lerden daha düşük seviyelere taşıyamıyor olması. Ama bu haliyle de hata ortalama 10 üzeri -16 civarında dolaşıyor(mutlak hata). Kodu da şu şekilde:

Bu kod ileri farklar ile türev alıyor. Geri farklar yöntemi ile almak istersek basitçe turev fonksiyonunun içerisindeki

kısmını (f(x)-f(x-h))/h şeklinde değiştirmek yeterli olacaktır.

 

Solution: cannot verify github.com’s certificate, issued by `/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1′:

I was trying to making an .APK file for Android using python-for-android provided by tito on Github. When I completed the installation of prequisities and start the process of makin the .apk file of example kivy application(see www.kivy.org for examples), I came across this issue:

cannot verify github.com’s certificate, issued by `/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV CA-1′:

I tried the same on other linux machines whose operation systems are Ubuntu and Linux Mint and both gave me the same error. The terminal also suggest that when the program trying to make a ssl connection, add –no-check-certificate argument to it and it will pass the controlling certificate. I tried this:

It gave me another error which says that distribute.sh does not have –no-check-certificate option. After all, I realized that this option belongs to wget. So, if you are using wget and getting some error like that, you can try this option and it will probably solve your problem. Otherwise, if you are not utilizing wget directly, you have to find in your program file(here it is distribute.sh) wget prompts and add “–no-check-certificate” to them. In python-for-android, I have made somethink like this:

The last line of this was changed:

The final state of the sh code is:

As seen in the code, I have added a line and changed a part of the last line. The purpose of the adding is being aware of what we did last time when we will use this in future. In the last line, of course, added the –no-check-certificate option to wget command.

sa

Python ile Paralel Port Kontrolü – Video

Pyparallel modülü yardımıyla Python’u kullanarak bilgisayarımızın paralel portunu kullanabiliriz. Bu yazıda bunun hakkında bilgi vereceğim. Öncesinde, paralel port yapısı hakkında kısa bir bilgiye buradan ulaşabilirsiniz. Pyparallel modülünün eski olduğu için şu an geliştirildiğini söyleyemiyorum. Bunun sebebi ise yeni bilgisayarlarda paralel port çıkışının olmaması, iyi ihtimal seri port çıkışının olması ve bildiğimiz üzere USB yaygınlığı.

Bu aşamada öncelikle şunları belirtelim. İlk olarak, elimizde bilgisayarımızın herhangi bir portuna giden .dll dosyası mevcutsa(mesela C ile yazılmış, sürücüleri kurulmuş bir halde), bu dosyalardaki fonksiyonlara Python üzerinden erişebiliriz. Ben bunları Java ile yapıyordum, Python’da tekrar öğrenmek istemiyorum. Ama Python kodları da çekici geliyor derseniz, pyjnius adlı modülle Python kodunun istediğiniz kısmından Java sınıflarına erişebilirsiniz.

Gerekli yönlendirmeleri en baştan yaptığıma inanarak devam edeyim. Pyserial adlı modül seri port iletişimini Python’a taşıyor. Bununla birlikte, pyparallel aslında bu modül sayfalarında, Türkçe olarak özetlersem, hala gelişim aşamasında gözüken ama geliştirilmediği neredeyse apaçık söylenen bir modül. Ama işin aslına bakacak olursak, işimize yarayabilecek her şey hazırlanmış ve çalışır durumda. Bu durumda eksik ne?

Geliştirilme aşaması yazması sanırım USB’den paralel port dönüştürücülere veya seri porttan paralel porta dönüştürücülere itafen yazılmış. Çünkü hazırlanan driverlar ne windowsta ne de modülün kendisi linuxta bu tip çevirici aparatları desteklemiyor. Kısacası, Python ile paralel port kullanmak istiyorsanız bilgisayarınızda bir paralel port çıkışı olmalı. En azından benim şu ana kadar gördüğüm bütün modüller bunu zorunlu kılıyor.

Ama Python’dan bahsetmişken, bu modülün sağladığı kolaylıklar elbet de var. Ama ondan bahsetmeden önce, nasıl yükleyeceğimize bir bakalım.

Windows için kurulum

Bu adreste hazırlanan dll dosyalarının üzerine .sys dosyaları eklenerek ve geliştirilerek şurada hazırlanan bir paket ile elinizde dll dosyalarına ulaşabildiğiniz her programlama dilinden bilgisayarınızın çıkışlarını kontrol imkanınız oluyor. Sitesinde seri portların da kontrol edilebildiği yazıyor, ben denemedim. 32 ve 64 bit işletim sistemleri için dll dosyaları mevcut durumda. Yukarıdaki linklerden indirebilirsiniz.

NOT: Güvenlik için girişlere 1K’lık dirençlerin koyulması gerektiği yazıyor. Bu konuda sorumluluk size ait. Önerim inpout32.dll yi indirirken readme dosyasına da göz atmanız. Ayrıca orda örnek uygulamalarda da açıklamalar yer alıyor.

Bu kurulumun ardından, ctypes modülü iile dll dosyalarına Python üzerinden erişme imkanımızı kullanarak inpout32.dll dosyasına ulaşıyoruz:

LPT-1 için port adresleri (LPT1 olup olmadığını, farklıysa adreslerin ne olduğunu aygıt yöneticisi altından görebilirsiniz.)

ctypes.windll.inpout32

0x378 data

0x379 status

0x37a control

Data, status veya control çıkışlarına veri gönderebilmek için, bunların port adreslerini yazmamız gerekiyor. Bunlar LPT1 port adresleridir. Şimdi yapacağımız iş, uygun fonksiyona port adresini yazmak ve çıkışı alabilmektir.

Şimdi kodun ne yaptığını görelim. Önce ctypes modülünü import ederek inpout32.dll dosyasına erişiyoruz. Daha sonra bu dll dosyasındaki Out32 fonksiyonuna 2 parametre yolluyoruz. Bunların ilki port adresi, ikincisi ise veri. Veri kısmına ikilik, onluk veya onaltılık sistemde sayı gönderebiliriz. Yani mesela 16 yerine 0b00001111 veya 0x0F gibi bir gönderim de mümkündü.

İkilik modta saydırmak amacıyla 0 dan 255 e kadar olan sayıları for döngüsü yardımıyla sırayla çıkış fonksiyonuna yolladık. Ucuna ledler bağladığınızda ikilik modta saydığını görebilirsiniz. Bunun videosu yukarıda mevcut. time modülünden sleep() fonksiyonunu da geçişler arasına saniyenin 1/4’ü kadar bekleme koyabilmek için ekledim.

Şu anlık datayı kullanarak verilerimizi paralel porttan dışarı gönderebiliriz. Bu konuda wx modülü kullanılarak Adam Pierce tarafından hazırlanmış bir kodu da paylaşalım. Python ile paralel port üzerinde tam bir kontrol sağlayan ve görsel bir program olan portmon‘un kodlarını incelemenin faydalı olacağını düşünüyorum. Ayrıca sadece portu kontrol etmek isteyenler için(asıl ekleme amacım) kodlamadan kurtaracak bir uygulama. Kaynak kodtaki mail adresini yazarına sorun olmaması için sildim(spam programlarından kaçınma amacıyla). Ulaşmak isteyenler sorarlarsa adresi kendilerine iletirim. Kodlara geçelim:

Linuxta Pyparallel Kurulumu

Linuxta işimiz biraz daha rahat. Mint üzerinde direk yazılım merkezini açıp python-parallel(olmazsa pyparallel) aramasını yaptırın. Ardından gelen uygulamayı yüklediğinizde işiniz bitmiş oluyor. Burdaki kodlar ise biraz daha farklı. Windowsta kullandığımız dosya port adresini bildiğimizde her yere veri gönderebilmemizi sağlıyordu. Bu paralel port üzerine yazılmış bir modül olduğu için diğer çıkışları kontrol etmemize izin vermiyor. Şimdi kodlara geçelim:

parallel importumuzun içerisindeki Parallel sınıfını cikis isimli değişkene örnekledikten sonra, bunun methodlarından olan setData()’yı kullandık. Bu içerisine sadece gönderilecek veriyi alıyor. Burda da Windows kodunda olduğu gibi ikilik modta saydırmayı tercih ettik. Aralarda ise yine 1/4 saniyelik beklemeleri time.sleep ile sağladık.

Burada tahmin edeceğimiz gibi portun çıkışında neler olup bittiğini öğrenmek için getData() fonksiyonunu kullanabiliriz. Ya da istersek, kullanabileceğimiz bütün metotların isimleri için dir(“parallel”) yazabilir, hatta bunu bir döngü içerisinde daha düzenli bir şekilde bastırabiliriz.

Bu kodu çalıştırdığımızda muhtemelen izinlerle ilgili bir sıkıntı yaşıyoruzdur. Ben çözümünü burda bulmuştum ancak daha sonra ana dökümantasyonu olan burda ve ilk bulduğum sitede de bahsi geçen şu adreste de olduğunu farkettim. Kodu çalıştırmadan önce konsolda şunları çalıştırmamız gerekiyor. Sebebi ise dökümantasyonun alt kısmında açıklanmış, ilgilenenler bakabilir. Yine de sorun yaşarsanız, programınız bilgisayarın bir portunu kullanacağı için ona sudo yetkisi vermeniz gerekiyor olabilir.

Uzak bilgisayardan paralel portun nasıl kontrol edildiğiyle ilgili uygulamayı çektiğim video:

 

PyGame İçin Program İskeleti ve Anlamları

Python ile oyun dünyasına giriş yapmak istiyorsanız muhtemelen ilk durağınız pygame olacak. Bu konuda çok fazla sayıda Türkçe döküman olmadığı için öğrendiklerimi aktarmak istiyorum. Ayrıca, Python ile oyun yazma hakkında bir kitabın çevirisi için şu an yazarıyla görüşüyoruz. Bu yazıda PyGame ile yazılacak olan uygulamada genel yapıyı ve anlamlarını ele alalım.

Öncelikle, normalde programın kapatılabilmesi için sys modülündekisys.exit() fonksiyonundan faydalanılır. Burda bunu kullanmaktan kurtulmuş olduk.  Ayrıca genelde o komut hata veriyordu(en azından benim bilgisayarımda), kapanıyor olsa da pek mutlu kapanmıyordu. Bu yapıda böyle bir sıkıntımız kalmamış oluyor. Hazır başlamışken söyleyeyim, normalde Python programı kapattığınızda arkada çalışmakta olan işlemleri sonlandırır ve siler. Ancak IDLE ile çalışıyorsanız Pygame’de bu gerçekleşmiyor. Son satırdaki pygame.quit() yapısı da bunun gerçekleşmesini sağlamak için var. Yani siz IDLE dışında(ya da başka bir IDE altında sorun yaşıyorsanız onun dışında) Python çekirdeği ile uygulamalarınızı çalıştırırken son satırı yazmak zorunda değilsiniz. Yine de, kodunuzu dağıtmak istiyorsanız kullanıcıları düşünerek bulundurmanızı öneririm.

Şimdi en baştan açıklamaya başlayalım. Elimizde 800×600 çözünürlüğünde bir pencere olmasını, başlığının “Oyun v0.1” olmasını istiyoruz. Ayrıca oyunun 50 FPS’de çalışmasını, yani saniyede 50 kere ekranın yenilenmesini istiyoruz. FPS konusuna yazını devamında tekrar gireceğiz.

İlk olarak pygame modülünü import ederek başladık (satır 1). 3. satırda ise pygame framework ünü kullanabilmemiz için init() fonksiyonu ile başlattık. Bu işlem pygame ile yazacağımız oyunlarda bir standart durumunda(en azından şu ana kadar gördüklerimde).

5. satırda istediğimiz çözünürlük değerini bir liste içerisinde cozunurluk isimli değişkene atıyoruz. Daha sonra bunu pencere boyutu olarak kullanabilmek için ve pencerenin üzerine daha sonra istediklerimizi çizebilmek için bir pencere nesnesi oluşturuyoruz. Yani kısaca, pygame.display.set_mode(cozunurluk) fonksiyonunun sonucunu pencere isimli bir değişkene atıyoruz. Bu değişken, elimizde bir yüzey durumunda. Bunu bir masa gibi düşünürsek artık oyunda yer alacak her görseli bunun üzerine koyacağız, oynayanlar da tam tepesinden bakmış olacak. Bu arada, çözünürlüğü liste şeklinde değil de, demet şeklinde de yazabilirdik. Herhangi bir fark olmamakla birlikte, belki farkedilmeyecek bir hız farkı olabilir, o da liste-demet ayrışımından. Ama dediğim gibi, 2 öğeli bir liste veya demet arasında farkedilebilir hız farkının olması çok çok zor.

8. satırda baslik isimli değişkeni kullanacak pencere başlığını ayarlıyoruz. Buradaki fonksiyon zaten yeterince açık, aldığı parametreye başlığı string olarak veriyoruz. Türkçe karakterler kullanabiliriz. Bu arada, burda baslik değişkenine değer atamamız zorunlu değil. pygame.display.set_caption(“Oyun başlığı”) yazdığımızda yine atama gerçekleşmiş oluyor.

10. satırda oyunun FPS değerini(Frame Per Second, saniyedeki çerçeve sayısı) yazdık. Bu değer, 1 saniye içerisinde uygulamanın ekranda kaç kez yeniden çizileceğini belirtiyor. Alternatif akımın frekansı gibi düşünebiliriz. 11. satırda ise bu değeri daha sonra oyun döngüsünde kullanabilmek için saat isminde bir değişkene pygame.time.Clock() fonksiyonunun değerini atıyoruz. Daha sonra, programın ana döngüsü başladığında, 23. satırdaki gibi saat.tick(FPS) yapısıyla bu değeri uygulamış oluyoruz. Bu, ana while döngümüzün saniyede verdiğimiz FPS değeri(burada 50 vermiştik) kadar dönmesini, dolayısıyla ekranın da o sayıda yenilenmesini sağlıyor. Ayrıca bu FPS değeri, programınızın çalışma hızını da doğrudan etkiler. Mesela, bir araba ekranın uçları arasında 2 saniyede dolaşıyorsa FPS değerini 2 katına çıkardığımızda 1 saniyede dolaşmış olur.

13. satırda programın kapatma tuşuna basıldığında değeri True olacak bir değişken tanımlayıp ona kapat ismini verdik. Dolayısıyla 14. satırdaki while döngüsü bu değişken False olduğu sürece açık kalacak. Bunun kontrolünü de 15-17. satırlar arasında yaptık. Kodlarda ayrıca belirtilen bu kısmı daha detaylı inceleyelim.

pygame.event.get() ile kullanıcının yaptığı her şeyi(imlecin o anki konumu, tıklamalar, klavyeden basılı tuşlar gibi) bir soraki döngüye kadar kaydeder. Buradaki for döngüsü ile bu kayıtlar arasında çıkış olup olmadığını if yapısı yardımıyla kontrol ettik. Eğer çıkış yapıldıysa, while döngüsünden çıkılabilsin diye kapat değişkenine True değerini verdik.

Aradaki yorum satırları yazacağınız oyuna göre değişebilir. 24. satırda ise ekranın yenilenebilmesi için gerekli kodumuzu yazdık. Bu da pygame ile yaptığımız tüm uygulamalarda yer alacak.

Messenger v0.3 İstemcisi ve Kaynak Kodları

Messenger v0.3’ün sunucu kaynak kodlarını bu adreste 2 gün önce yayınlamıştım. Ardından vakit kaybetmeden birkaç satırlık veri gönderme-alma şeklinde test eden bir program olan istemciyi düzenleyerek, v0.2’nin görsellerinden de faydalanarak yeni bir soluk getirdim. v0.1 tadında, yani büyük çoğunlukla MIRC mantığıyla çalışan bu messenger’a da yine v0.2’de olduğu gibi kayıt olmak gerekiyor. Kendi sunucunuzda çalışacaksanız biraz önce verdiğim linkteki dosyalardan faydalanabilirsiniz, ya da bana söylerseniz size sunucuyu açarım:) (Bugün açık olacak:5 ağustos 2012)

Kullanmadan önce kayıt yapmanız gereken sayfa için tıklayın(kendi sunucunuzu kurarsanız kendi kayıt sayfanızı koymanız gerekecek, dosyalar aşağıda ve indirme linkinde mevcut, PHP ve MySQL tabanlıdır.)

Messenger’ı İndirmek İçin Tıklayın (Fix1 içerir, önceden indirdiyseniz güncelleyin.)

 

 

—— Burdan sonrası sunucu kurulumu ve kodlar içindir. ——

Windows altında sunucu kurmak isterseniz tıkla çalıştır sürümü için tıklayın(Bu sürüm bu şekilde çalışmayabilir, mümkünse python3 kurup alttaki kodlarla devam edin.)

Sunucu dosyaları, kayıt sayfası, istemci dosyalarını paket halinde indirmek için tıklayın.

 

Şimdi kodları ve bilgileri verelim:

Aslında v0.1’den farklı olarak kayıt-giriş sistemi, şifrelerin md5 ile saklanması, biraz daha düzenli bir görünüm, kayıt sırasındaki isimle mesajların gönderilmesi, son mesajların otomatik olarak gösterilmesi(0.5 saniye yenilenme aralığı ayarlandı, kodlarda 0.5’i bulup istediğiniz sayıyla değiştirebilir, sunucu yükünü belirleyebilirsiniz.) ayarlandı. Sunucu çalıştığı andan itibaren tüm mesajların kapatılana kadar tutulması için ayarlama yapıldı. Fazlasıyla uzun bir sohbet planlıyorsanız son 50 mesajın sunucuda tutulması için şöyle bir kod bloğunu uygun yere eklemeniz gerekecek, ya da iletişime geçerseniz sizin için eklerim:

En başta linkini verdiğim, en altta tekrar paylaşacağım sunucu kodlarındakimesaj_ekle() fonksiyonunu bu şekilde düzenlerseniz son 50 mesajı tutmaya başlar. Oradaki 50’yi istediğiniz sayıyla değiştirmekte tabii ki özgürsünüz.

Kayıt sayfası(HTML) kodları(indirme linki yukarıda var):

Kayıt formunu işleyecek PHP sayfası kodları:

PHP dosyası için MySQL ayarlarının yapılacağı config.php dosyası

MySQL sorgusu:

Sunucuyu sadece derleyip yayınlamayı tercih etmedim. Sebebi ise benim linux sunucuda çalışmam ve sizin de bunu yapacağınıza dair inancım, zira pymysql modülünü Windows altında çalıştırmak istiyorsanız bile Linux altında 2to3’ten geçirmeniz gerekiyor, ya da ben Windows’ta yapamadım, her neyse. Kaynak kodları aşağıda, indirme linki yukarıda. Size tavsiyem sunucuyu bir linux server üzerinde çalıştırmanız. Ama ben MySQL kullanmak istemiyorum derseniz de sql yapısını sqlite3’e aktarıp devam edebilirsiniz. Python onunla birlikte geldiği için de ekstra bir işleme gerek kalmaz. Ama MySQL,  Fatih‘in beni birkaç dakikada ikna ettiği üzere çok çok daha kuvvetli ve gelişmiş bir yapıda, söylemedi demeyin.

Sunucu kodlarını verecek olursak:

 

Messenger v0.3 Sunucusu Hazır

Başlıkta v0.3 dedim, aslında oturup yeni bir messenger yazdım. Hatta IRC, Messenger arası bir program, ya da program olma yolunda ilerleyen kodlar oluştu. Kodlar dedim çünkü tamamlanınca sistemde kayıtlı olan kişilerin toplu konuşmasını sağlayan bir program olacak. v0.2 nin algoritma yapısı üzerinde daha çok çalışmak gerektiğinden dolayı bunu bitirmeyi planlıyorum. 0.2 kurulacak olan kulüpten isteyenlerle birlikte yürüyecek.

Lafı fazla uzatmadan, sunucu az çok hazır durumda. Üzerine istemciyi yazmak kaldı. Sunucunun veritabanı kısmı v0.2 ile tamamen aynı. Kodlar şimdilik şu halde:

Modüler yapıdan biraz uzaklaşmış durumdayım. Bölümlerden oluşan bir programı modüler halde yazmak oldukça sağlıklı olsa da bunun şu ana kadar uğraştığım mesaj programları üzerinde verimli bir şekilde uygulanabileceğini düşünmüyorum.

Messenger v0.2 Kodları – Geliştirilme Aşamaları ve Çalıştırılabilir Hali

Messenger v0.1 i hatırlayanınız varsa, üzerinden çok uzun bir süre geçmeden v0.2 ye başladım. Kullanıcı kayıt sistemi, sadece listede olanlarla konuşma, ikili sohbetler, kullanıcı girişi ve kayıt gibi özellikler derken bir kısmı tamamlanmış bir kısmı 2 yerden internete girebildiğimde(yakında olacak İnşAllah) tamamlanacak kısımlara sahip oldu. Şimdi bu programı yazarken edindiğim bazı tecrübeleri, programın özelliklerini ve eklenecekleri yazayım. Unutmadan, mesaj gönderip alma olayını test edemediğim için debug aşaması henüz gerçekleşmedi. Onun için sanırım çalışmıyor, dediğim gibi yakında debug üzerine yoğunlaşacağım. Şu an giriş yapılabiliyor, arkadaş listesini alıyor, pencereler açılıyor ve mesaj göndermeyi/almayı deniyor. Neyse, zaten uzun olacak, özelliklere geçelim.

Teşekkür: Programlamada kat ettiğim her satır kodta emeği bulunan Fatih‘e, sunucunun dil desteğinde yaşadığım sorunlar için hem çözüm yolları öneren, hem de sunucusunda ilginç sunucu denemeleri yapmama izin veren, fütursuzca istediğim şeyleri sabırla yapan Uğur‘a sonsuz teşekkürler. Belki oldukça küçük bir program yazıyorum ama bu bile onların sayesinde oldu.

Özellikler

– PHP ile Kayıt Sayfası Yazıldı, Ufak Şeyler Atölyesi altına kurduğum sunucu hem PHP sunucu işini hallediyor hem de messenger sunucusunun aktif olduğu zamanlarda kullandığım sunucu görevini yerine getiriyor.

– PHP kayıt sayfası yapılırken kullanıcının önceden kayıt olup olmadığı da denetleniyor, yani kullanıcı ID’si eşsiz olsa bile, girişler mail adresi ile yapılacağı için buna başvuruldu.

– Şifreler MD5 ile saklanıyor. Programın 0.2 sürümü tamamlandığında 2 veya 3 md5 ile saklanacak, şu anlık bu şekilde.

– Veritabanı olarak MySQL kullanılıyor. Bunun sunucusu yine Ufak Şeyler Atölyesi’nde barınıyor.

– Program girişinde kullanıcı adı ve şifre isteniyor. Kullanıcı adı mail adresi olarak yazılıyor. Giriş yapılırken multithreading kullanılarak pencerenin herhangi bir şekilde donması, takılması engellendi.

– Kullanıcı adı veya şifre yanlışsa uyarı veriyor, tekrar giriş yapılması isteniyor.

– Kullanıcı adı ve şifre doğruysa giriş yapılıyor, program o bilgileri tekrar istemiyor ve yine multithreading ile takılmadan arkadaş listesini yüklemeye başlıyor.

– Arkadaş listesi yüklenirken bilgileri gelen kişiler anlık olarak listeye ekleniyor, böylece listenin tamamı gelmeden de kişi ile sohbet başlatılabiliyor veya ondan mesaj alınabiliyor.

– Aynı anda 500 pencere açık tutulabiliyor, bunun kolayca artırılıp azaltılabilmesi için bu nitelikler kodun belirli bir kısmında toplandı. Bellekte fazla yer işgal etmemesi için şu anlık 500 tane ile sınırlandırıldı.

– Eklenecek arkadaş sayısında henüz bir sınırlama bulunmuyor. Ancak arkadaş eklemek için gereken modül henüz yazılmadı, MySQL üzerinden elle ekleniyor. Yakın bir zamanda site üzerinden ve daha sonra da program üzerinden yapılması için gereken modüller yazılacak.

– Mesaj gönderme sırasında kullanıcının online durumu kontrol ediliyor. Kullanıcı offline ise mesajın hemen yanında iletilemediği ve sebebi yazıyor. – Geliştirilmesi devam ediyor.

– Mesaj alırken gelecek tüm bağlantılar için istemci içerisine tek bir sunucu yerleştirildi. Sunucu gelen id kullanıcılar arasında varsa bağlantıyı kabul ediyor ve mesajı alıyor. – Geliştirilmesi devam ediyor.

– Yapılan mesajlaşmaların kayıt altına alınmasını önlemek amacıyla istemciler arası direkt mesaj aktarımı programın en başından en sonuna kadar yerleştirildi.

– Yapılan her konuşmada eşsiz bir şifre ile haberleşme için gerekli modül yazıldı, şifre üretiliyor programa entegre ve bu şifre ile verinin şifrelenmesi sağlanacak.

Şimdi kodlara geçelim. Sunucu kodlarını kısa bir süre sonra ekleyeceğim. İstemci kodları:

Programın çalışması için bu yazıda olan resmi veya hazırladığınız bir logo.gif dosyasını aynı dizine koymanız gerekmektedir. Tamamlayıp derlenmiş sürümü yayınlarken içerisine entegre edilmiş halde yayınlayacağım. Sunucu kodları yakında eklenecektir.

Düzenleme: Sunucu kodları eklenmiştir. Ayrıca istemci kodları da güncellenmiştir.

İstemci kodları, bundan sonraki 3 dosya istemci kodlarını oluşturuyor. Dosya isimlerini kodların bilgi kısmına ekledim, import seçeneklerinden istediğiniz şekilde düzenleyebilirsiniz.

Sunucu için 2. dosyamız:

Ve son sunucu dosyamız:

Bu arada kodlarda dikkat ettiyseniz pymysql adlı modülü kullandım. Blogda Python kategorisinde bununla ilgili detaylı bilgi bulabilirsiniz. Zira Python3 ile uyum sağlayan bence en kullanışlı modüllerden biridir. Sunucu kodları da burda bitti. Ancak paylaşmak istediğim 2 kod daha var. Biri MySQL veritabanı tablolarını oluşturup yapılandıracak kod, diğeri ise kayıt sağlayan PHP sayfalarının olduğu kod. Formun HTML kodları(evet, basit bir form oldu, CSS ile güzelleştirirseniz lütfen bana da atın:))

Öncelikle kayıt sayfasının PHP kodları:

Include edilen config.php sayfasının kodları:

Son olarak da bu sorguları çalıştırmak için oluşturacağınız veritabanının tablolarını oluşturan ve yapılandıran MySQL komutumuz:

install.php oluşturup bunları otomatikleştirmediğim için kusura bakmayın(yapacak olsam install.py yapardım o başka:)) Sorularınız olursa burdan iletebilirsiniz. Umarım bir gün bir yerde işinize yarar.

Şu andan sonra sanırım geliştirilmesine kulüpten arkadaşlarla devam edeceğiz. Ben 0.3 adında ayrı bir sürümü kendim yazmayı planlıyorum. Bunun algoritmasında sıkıntılar oldu ve sunucu yükünü azaltmak için yaptıklarım tek başına test bile edilemeyecek seviyeye ulaştı, en azından benim modemde port açma işkencesine girişemiyorum, insanlardan da bunu bekleyemem. Daha iyi alternatifler bulmak gerekiyor, daha iyi mesaj kodlarıyla olayı çözmek gerekiyor gibi, yani bu liste uzar. Ama en azından artık ne yapacağımızı çok daha iyi biliyorum.