Yeni Proje : BaskentiNeresi
Bu günlerde fikrim şu yönde değişti: Eskiden bir programlama dilini öğreneceğim zaman açar dilin yapısıyla ilgili kitap, blog, dökuman okur; varsa videolarını izlerdim. Dili o şekilde öğrendiğimi, öğrenebileceğimi düşünürdüm. Ancak geçen zaman bana bu konuda yanıldığımı bir dili öğrenmek için o dili kullarak, uygulama geliştirmemin daha verimli olacağını gösterdi. Bu uygulamada bu düşüncenin ürünlerinden biri, başlangıcı. Programın konusu, amacı olayı elbette basit. Ancak temel şeyleri öğrenmek açısından önemli. Diğer projeler için yazdığım blog yazıları gibi bunu da başlıklara bölüp yazacağım. Uzunca olacak istediğiniz kısmı okuyabilmeniz için.
Programın Tanımı
Program size seçtiğiniz bölgedeki ülkelerin başkentlerini soruyor. Sorular dört şıktan oluşuyor. Siz doğru cevap verdikçe yeni sorular soruluyor. Yanlış cevap verildiğinde sorunun doğru cevabı söyleniyor.(Bir anlamda yeni başkentler de öğrenmiş oluyorsunuz) Daha sonra her doğru cevap için topladığınız birer puandan isterseniz skorunuz veritabanına kaydediliyor.
Programın Teknik Özellikleri
Programı Python programlama dilini
kullanarak yazdım. Veritabanı kullandığım ilk programım diyebiliriz(Web sitelerini ve txtleri saymazsak).
Bu yüzden ayri bir heyecan oldu. Veritabanı olarak SQLite
kullandım.
SQLite’ı ilk defa kullandım, çok derin bilgim olmadığı için bir kaç bilgi verip kaynaklara yönlendireceğim.
SQLite kütüphanesi Python içerisinde hazır olarak var zaten. Veritabanlarını yönetmek için SQLite programını kurmanız gerekiyor, komut satırından çalışan bir program(Ubuntu için).
Biraz SQL
bilginiz varsa alışmanız çok zaman almayacaktır.
Şu kaynaktan SQLite için daha detaylı bilgiye ulaşabilirsiniz.
Şu sitede de SQLite ve Python bir arada nasıl kullanılabileceğini basit örneklerden karışık örneklere doğru anlatan bir kaynak.
Programımda grafiksel bir arayüz yok (henüz), komut satırından kullanılabilir.
Programlama Aşamalari
Öncelikle soruların hazırlanabilmesi için elimizde bölgelere göre ülkelerin başkentleri olmalı.
Wikipedia’dan tek tek bilgiyi çekebilir miyim diye düşündüm ama o bambaşka bir uygulama olurdu :)
Şu siteden bulduğum listeyi kullandım.
Bu listede ülkeler bölgelerine ayrılmış, ülke ve başkent arasında “:” (iki nokta) var.
Bazılarında “-” var ancak bir editörden “replace” komutuyla onları da “:” yapabiliriz.
Bu noktadan sonra bu dosyadan listeyi okuyup istediğim şekilde Python’daki list
eler yapısına taşıdım.
Bu noktadan sonra düzenli veriyi veritabanına eklemek çok zor olmuyor.
Daha sonra veritabanındaki verilerin çekilmesi, şıkların oluşturulması, cevabın random bir şıkka konulması gibi işlemler oldu.
Programdaki menüleri de while ve if yapısı kullanarak yapmaya çalıştım.
Programın Çalıştırılması
ayristir.py
dosyasini bir kere çalıştırdığınızda veritabanı oluşturulacak, info.txt
‘den okunan bilgiler veritabanına eklenecek.
Tek sefer çalıştırmamız yeterli. Daha sonra capital.py
dosyasını çalıştırarak programı kullanmaya, oyunu oynamaya başlayabilirsiniz.
Aslinda ayristir.py
dosyasını da capital.py
scriptinin içine dahil edebilir miydik?
Evet olurdu, zaten ayristir.py
veritabanı yoksa oluşturuyor ve bilgileri ekliyor.
İlk çalıştırmadan sonra zaten olduğu için aynı işlemi tekrar etmeyecekti.
Kaynak Kodlari
info.txt : Başkentlerin olduğu liste
schema.sql : Veritabanındaki tabloların yapısının nasıl olacağını gösteren script.
// sadece bir kere çalıştırılmalı. ayristir.py : info.txt’ten bilgiyi aldıktan sonra düzenleyen, veritabanına ekleyen dosya.
// ayristir.py bir kere çalıştırılmadan çalıştırılmamalı. capital.py : Ana program kodlarının yer aldığı dosya.
// ayristir.py scriptini çalıştırdıktan sonra oluşacak. myDB.db : Veritabanı.
Ekran Görüntüleri
Çok sevdiğimiz, biriciğimiz komut satırı ekranımız : )
Neler Yapılabilir
// ayristir.py
dosyasi capital.py
dosyasina import edilebilir. Üstte bahsettiğim şekilde yapılırsa kullanımı daha sorunsuz olacaktır.
Tablolar düzgün oluşturulmazsa bile myDB.db
dosyası oluşturulmuşsa schema.sql
scripti çalıştırılmayacaktır. Bunu daha efektif yapabiliriz.
// Çoğu hata kontrolü yapılmadı. integer beklenen yere string girilmesi vs. Veritabanına bağlanırken, veri çekerken oluşabilecek hatalara karşın kontroller yapılmadı. Daha [robust](https://en.wikipedia.org/wiki/Robustness_(computer_science) bir program için bunların yapılması gerekiyor elbette.
// Veritabanındaki bilgilerin güncellenmesi seçeneği eklenebilir. Yeni ülke/başkent eklemek. Var olanı düzenlemek. Skor tabelasını sıfırlamak. Skor tabelasını en yüksek puanlara göre yazdırmak. Veritabanı işlemleri için pratik yapma fırsatı.
// Veritabanı bağlantısını bir fonksiyona veya ayri bir scripte taşımak gerekiyor. Bu şekilde veritabanının ayrı yapılması gereken işlemleri ana programın içerisinde bulunuyor. Program büyüdükçe böyle kalması sıkıntı olacaktır.
// Programda yazdığım bazı fonksiyonlar için Python’un kendi fonksiyonları var. Mesela daha az kod olması için onlar kullanılabilir. Seçeneklerin yerini karıştırmak için shuffle, veritabanından gelen veri arasında seçilen dört random ülke arasından hangisinin sorulacağını belirlemek için choice fonksiyonları kullanılabilir. Amaç dili öğrenmekse kendi fonksiyonunuzu yazmak daha faydalı tabi.
// Grafiksel bir arayüz eklenebilir. Python diliyle yazılmış henüz grafiksel arayüze sahip programım yok. Öğrenmek için o işi bu program üzerinde yapabilirim. Aynı şekilde Java diliyle da yazma planım var.
// Programın bir exesi oluşturulabilir. Onu yaptığımda buraya eklerim. Bu iş için bir kaynak.
// Veritabanı bağlantısı kapatılabilir, herhangi bir yerde kapattığımı hatırlamıyorum. conn.close() :)
Benim yaptıklarım ve ilerisi için düşüncelerim bu şekilde. Sizin var mı eleştiriniz, fikriniz ?
İyi kodlamalar.