Ev Arşiv Hakkında

Java ile süper gereksiz işler

8-10-2010, 10:54 ö.s. // yorum // java // 696

Bugün bil113 lab dersinde çözmemiz istenen 3 problemden birisi benim daha önceden Python ile çözdüğüm şeyin biraz daha basit haliydi. Kullanıcıdan istenen bir tek pozitif tam sayıya göre aşağıdaki gibi bir şekil çizmemiz gerekiyordu:

Tek pozitif bir tamsayi giriniz:
5

  *
 ***
*****
 ***
  *

Neyse, daha önceden çözdüğümden az da olsa bir fikrim vardı, çözüm sadece for ve if(kullanıcının girdiği sayıyı kontrol amacıyla) döngüleri kullanılarak yapılmalıydı. Ders sırasında, bazı yerlerde deneme-yanılma yoluyla(şu anda sorsanız anlatamam), aşağıdaki kodu yazdım:

import java.util.Scanner;

public class LabUcgen {

    public static void main(String[] args) {

        int tamsayi;
        Scanner girdi = new Scanner(System.in);
        System.out.println("Lutfen bir tek tamsayi degeri giriniz:");
        tamsayi = girdi.nextInt();
        int tamsayi2 = tamsayi;

        for (int satir=1; satir < tamsayi2-1; satir++) {
            for (int bosluk=0; bosluk + tamsayi < tamsayi2-bosluk; bosluk++ ) {
                System.out.print(" ");
            }
            for (int yildiz = 1; yildiz < tamsayi+1; yildiz++) {
                System.out.print("*");
            }
            System.out.println("");
            tamsayi = tamsayi - 2;
        }
    }
}

Daha sonra biraz daha düşündüm, kağıt kalem elde, satır sayısına göre kaç boşluk ve kaç yıldız koyulması gerektiğini döndüren bir fonksiyon yazmaya kalktım, Java'da beceremedim(çok uğraşmadım da, henüz arrayden başka veri yapısı bilmiyorum Java'da), fakat Python'da şöyle bir recursive fonksiyon yazabildim:

def hesap(yildiz, satir):
    bb = yildiz/2+1

    if satir <= yildiz/2:
        bosluk = bb-satir # kac tane bosluk?
        yildiz_sayisi = yildiz-bosluk*2
    else:
        return hesap(yildiz, yildiz-satir+1)
    return (bosluk, yildiz_sayisi)

>>> hesap(9, 3)
(2, 5)
>>> hesap(9, 3) == hesap(9, 7)
True

Bu fonksiyonun olayı şu: örneğin 9 yıldızlık bir şekil çizdirecekseniz, 2. ve 8. satırlar birbirinin aynısı olacak. Şekil 5. satıra göre simetrik olacak yani. Dolayısıyla kullanıcı 8. satırda ne olmalı diye fonksiyonu çağırdığında, fonksiyon aslında 2. satırda ne olduğunu gösterecek(bkz hesap(yildiz, yildiz-satir+1), satir 8 ise, 9-8+1'den 2. satırı çağıracak).

Java'da da benzer bir şekilde, fakat herhangi bir method kullanmadan şu şekilde çözdüm:

public class LabUcgen3 {

    public static void main(String[] args) {
        int yildizSayisi = 13;
        int bb = yildizSayisi/2+1;
        int satir = 1;

        for (int baslangic = 0; satir < yildizSayisi; satir++) {
            int yazilanSatir;

            if (satir >= yildizSayisi/2) {
                yazilanSatir = yildizSayisi-satir-1;
            } else {
                yazilanSatir = satir;
            }

            int yazilacakBoslukSayisi = bb-yazilanSatir;
            int yazilacakYildizSayisi = yildizSayisi-yazilacakBoslukSayisi*2;

            for (int yazilanBosluk = 0; yazilanBosluk < yazilacakBoslukSayisi; yazilanBosluk++) {
                System.out.print(" ");
            }
            for (int yazilanYildiz = 0; yazilanYildiz < yazilacakYildizSayisi; yazilanYildiz++) {
                System.out.print("*");
            }
            System.out.println("");
        }
    }
}

Bu kodda aslında yukarıda yazdığım Python kodunun yaptığı işi yapmaya çalıştım, toplamSatirSayisi(ki bu yildizSayisi'na eşit)/2+1 simetri eksenim oldu, onun aşağısı ve yukarısı simetrik. if-else içerisinde yazdığım kod bu işe yarıyor, örneğin 9 yıldızlı bir şekil çizdereceksem ve 6.satırdaysam, satır sayım 9/2 den 4'ü geçtiği için, yazilanSatir = yildizSayisi-satir-1; kodu ile yazdığım satırı değiştiriyorum.

Daha kısa bir şekilde çözen var mı? Benim aklıma gelen en kısa yöntem buydu, onu da Python'da yazıp Java'ya çevirdim zaten(bu arada Java'ya da alışıyorum, uzun değişken isimleri falan, ehehe).

Java'da hangi sınıf hangi kütüphanede

6-10-2010, 7:38 ö.s. // yorum // java // 737

Derslerim gereği Java öğrenirken, hocanın ders için tavsiye ettiği kitap değil de, Head First Java adlı kitaba başlamıştım. Kitabın bitmesine yaklaşık 150 sayfa kaldı(swing bölümünü atladım), fakat kafama takılan birşey var:

Python öğrenirken(hala öğreniyorum gerçi) pek çok yerde, bir sınınfı veya fonksiyonu import ederken, from modul_adi import * kullanmanın dezavantajlarından bahsediliyordu, hatta Freenode'da o şekilde bir kullanım gördükleri zaman uyarıyorlardı beni(hatta Alex Martelli'nin StackOverflow'da bu konuyla alakalı bir yorumu için bkz). Ne yaptığından çok emin olmadığın sürece kullanmamalıyım diye.

Fakat nedense okuduğum kaynakta bu konu hakkında henüz tek satır bile okuyamadım. Ve şu ana kadar okuduğum tüm kodlarda gerekli sınıflar import java.sinif_adi.* şeklinde koda dahil edilmişlerdi. Bazı kodlarda bu şekilde 6 kütüphane import ediliyor ve daha sonra kodda hangi sınıf hangi kütüphaneden geliyor anlayamıyorsunuz. Netbeans veya Eclipse gibi bir IDE kullanmıyorsanız, her sınıf için Java belgelerinize bakmanız gerekiyor(Netbeans'da "browse source" seçeneği ile bulunduğu dosyayı açabiliyorsunuz).

Django ile muhatap olanlar from django.utils.translation import ugettext_lazy as _ şeklinde bir kullanımla mutlaka karşılaşmışlardır. Bu şekilde bu fonksiyonu _() şeklinde çağırabiliyoruz ve çok büyük kolaylık sağlıyor. Java'da sanırım böyle bir kolaylık yok.

İşin çözemediğim bir diğer yönü de, Java'da aslında kütüphaneleri import etmeden kullanabilirsiniz. Denemelerim sonucu şunu gördüm; java.io.PrintWriter() şeklinde, java.io kütüphanesini import etmeden kullanabilirim. Fakat import java.io şeklinde bir kullanım yok. Bu şekilde import etsem, daha sonra sadece io.PrintWriter() ile çağırsam diyemiyorsunuz. Fakat eğer isterseniz import java.io.* ile import edip, direkt sınıf adını yazarak çağırabilirsiniz.

DÜZENLEME: İlginç bir şekilde, import java.util.Scanner; kodundan sonra direkt olarak Scanner() oluşturabiliyorum, fakat nedense kendim yazmadğım bir kodda import java.io.*; yerine import java.io; yazdıp, gerekli sınıflara io. eklediğimde kod çalışmıyor, bahsettiğim paket yok diye.

Yanlışım varsa düzeltin, bana çok saçma geldi. Büyük ihtimalle bir noktayı kaçırıyorum. Kitapda import mekanizmasından hiç bahsedilmemiş, fakat sürekli kullanılıyor.

Java'da bir diğer anlamadığım(saçma bulduğum) olay da "Exception" ve hata yakalama olayı. Ondan da bahsedeceğim bir ara.

Python, Java, okunacaklar falan

3-10-2010, 11:07 ö.s. // yorum // python , django , java // 549

Okul başladığından beri ne Python ile ne Django ile uğraşamıyorum, tek satır Python kodu yazmadım neredeyse. Java'ya hala ısınamadım. An itibariyle Java'da canımı sıkan birkaç şey var:

  • İğrenç syntax. Uzun sınıf ve method adları.
  • Uzunluğu değiştirilemeyen, içine sadece tek tip alabilen array denen salak şey ile uğraşmak zorunda olmam.
  • String için bir method test etmek için bile, yeni bir sınıf oluşturup, içine bir method oluşturmak zorunda kalmam. Üşendiğim için istediğim testleri yapamamam.
  • Public, private, default, protected muhabbetleri. Neden böyle şeylere ihtiyaç duyulduğunu anlayamıyorum.
  • Haliyle getter ve setter olayları.
  • Operator overloading diye bir olayın olmaması. Tüm işin methodlara kalması.
  • Derslerim gereği(programlamaya giriş, veri yapıları, nesnesel tasarım, ve belki de fazlası) öğrenmek zorunda olmam(?!).

Aklıma gelenler şimdilik bunlar. Onun dışında, sürekli yaptığım gibi yine bir okuma listesi yaptım kendime. Bir kısmını bastıracağım sanırm, Türkçe derslerinde falan okumak güzel oluyor.

PyPsychofolder -bitmedi

22-9-2010, 8:14 ö.s. // yorum // python // 603

Şu kodu da kaybetmeden ekleyeyim, bir ara bitirilmek üzere. Psychofolder'ı Linux için port etmeye başlamıştım bir süre önce, Python ile. Bitmedi fakat şu hali ile de kullanılabilir. Buradan indirebilirsiniz.

Düzenlenecekler/eklenecekler:

  • Arayüz, en azından panele yerleşip programın çalışıp çalışmadığını bildiren, hangi klasörün izlendiğini gösteren/değiştirmeye izin veren basit birşey. Şu haliyle terminalden çalıştırmanız gerekiyor.
  • XML parser geliştirilebilir. Orjinal psychofolder xml dosyasını kullandım ve parser'ı xml dosyası çok benzer başka bir programdan(ne olduğunu unuttum şimdi) çalıp biraz değiştirdim. Asıl parser çok daha gelişmiş ve esnek bir haldeydi tabii ki..

Kullanım:

  • watcher.py dosyası, pyinotify kütüphanesini kullanarak dosya içerisinde belirtilen klasörü izliyor(izlenecek klasör XML dosyasında belirtilebilir). Bu dosya çalıştırılacak.
  • rules.py, rules.xml dosyasını ayrıştırarak dictionary biçiminde döndürür.
  • psycho.py, gerekli komutları çalıştırır.

Bu arada derslerim gereği Java'ya başladım. Onun hakkında da bir yazı yazacağım yakında..

Django'da Markdown ve Pygments kullanmak (2)

3-9-2010, 5:31 ö.s. // yorum // python , markdown, pygments // 1524

Daha önce bu konu hakkında bir yazı yazmıştım. Gayet güzel işliyordu herşey fakat bugün bir arkadaş bir hata bildirdi.

Eğer markdown'dan geçirdiğiniz yazıda <pre ...></pre> tagları varsa, normalde markdown bunlara dokunmuyor. Dolayısıyla daha sonra pygments uygulayabiliyorsunuz sorunsuz şekilde. Ama küçük bir farkla. Örneğin python kodu yazarken, eğer bir blokun içinde kod yazarken, boş bir satır bırakıyorsanız, boş satırdan sonraki kod bloktan dışarı çıkıyor. Örneğin aşağıdaki kod:

class Test:

    def bu_fonksiyon_bloktan_cikiyor():
        pass

Şu anda düzgün gözüken kodda, sitedeki değişiklikleri yapmadan önce fonksiyon bloktan dışarı çıkıyordu. Bunu nasıl çözerim diye araştrırken, Markdown'un aslında kendi pygments eklentisinin olduğunu farkettim(codehilite). Bunu kullanmak için eski template filterınızda markdown'u çağırdığınız yeri markdown.markdown(value, ['codehilite']) şeklinde değiştirmeniz gerekli.

Eğer daha önceden pygments kurduysanız codehilite eklentisinin dosyasından import şeklini kontrol etmeniz yeterli. Bu şekilde aslında daha hızlı olabilir. Önceden markdown'la html taglarını yerleştirdikten sonra, BeautifulSoup ile onu ayrıştırıp, gerekli yerleri pygments'e yolluyordum. Şimdi ise BeautifulSoup'a gerek kalmadan, markdown aşamasında pygments kullanılıyor.

0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12