Ev Arşiv Hakkında

Arşiv düzenleme scripti için arayüz

13-11-2010, 3:06 ö.s. // yorum // python , nautilus // 586

Şurdaki arşiv düzenleme scriptim için arayüz tasarlamaya başlamıştım. Canım sıkıldıkça birşeyler ekliyorum ve son hali şimdilik şöyle:

Biraz daha kullanıcı dostu bir hale getirip yayınlayacağım. Bu arada küçük bir dil problemi yaşıyorum, görebileceğiniz gibi progrmaın yarısı türkçe yarısı ingilizce :) .

Bu arada ara ara arkadaşlardan "kim kullanıyor bu programı" şeklinde yorumlar alıyorum. Kimse kullanmıyor, kendim için yazdım ve ben sürekli kullanıyorum. Fakat aklımda çok güzel birkaç özellik var, çok uğraşmadığım için uzun sürecek ama onları da ekledikten sonra kullanılabilir diye düşünüyorum. Şu anda da tek seferliğine arşivi düzenlemek için kullanılabilir. Ben kendime aracı bir script daha yazdım, onu da düzenleyip yayınlayacağım, örneğin yeni bir albüm indirdiğimde, yine nautilus aracılığıyla scripti çalıştırıyorum ve script o albümü düzenleyip(grup adı/albüm adı/ şeklinde) /home/osa1/Music klasörüme kopyalıyor. Bu script ile her yeni albüm indirişimde kullanıyorum ve arşivim hep düzenli kalıyor.

Arayüz için GTK+ kullandım. QT ile yapmayı planlamıştım ama GTK+nın yanında öğrenmesi çok zor ve kompleks gibi geldi. GTK+ ile birkaç sıfırdan başlayarak birkaç saatte bu hale getirebildim.

Bil113 arasınav ve kağıt üzerinde kod yazmak

31-10-2010, 8:42 ö.s. // yorum // python , java // 729

Bugün olduğumuz Bil113 arasınavında gördük ki, "hello world"ü bile Eclipse, Netbeans vs. ile yazan bizler, iş kağıt kalem ile yazmaya gelince çakılıyoruz(ben öyle değil ama yine de çakıldım gerçi). Aslında sınavın kağıt kalemle çözmek için biraz zor olduğunu düşünüyorum. Sınavda onlarca dakika uğraştığım soruları bilgisayar karşısında 5 dakikada çözebildim.

Asal sayıları tespit etme gibi kolay soruları değil de, değişik bir şekilde çözdüğümü düşündüğüm üçgen sorusunu yazayım. Soru: verilen 3 kenarla bir üçgen oluşturulup oluşturulamayacağını döndür(boolean):

public static boolean kontrol(int a, int b, int c) {

    return (a < b+c && a > Math.abs(b-c) && b < a+c && b > Math.abs(a-c) && c < a+b && c > Math.abs(a-b));
}

Bu tek satırı kağıt üzerinde yazmak bayaa zor oluyor gerçi. Neyse. Sınavın sanırım en zor sorusu olan farklı tabanlarda sayıları kaydedip kendi aralarında işleme sokabildiğimiz soru:

public class Sayi {

    String s;
    int d;

    public Sayi(String s, int d) {

        this.s = s;
        this.d = d;
    }

    public int onluk() {
        // this.s'i 10 tabanında döndür

        int r = 0;

        for (int i = 0; i < this.s.length(); i++) {
            r += Integer.parseInt(this.s.substring(i, i+1)) * Math.pow(d, this.s.length()-i-1);
        }

        return r;
    }

    public static String taban(int s, int d) {
        // Girilen s sayısını d tabanında döndür

        String r1 = "";
        String r2 = "";

        while (s >= d) {
            r1 += s % d;
            s = s / d;
        }
        r1 += s;
        for (int i = 0; i < r1.length(); i++) {
            r2 += r1.substring(r1.length()-i-1, r1.length()-i);
        }
        return r2;

    }

    public static void main(String[] args) {

        Sayi deneme = new Sayi("134125", 6);
        System.out.println(deneme.onluk());
        System.out.println(Sayi.taban(987652, 2));
    }
}

Sorunun tamamı bu kadar değil de, bu kısımdan sonrası ıvır zıvır. Sınavda yaptım bu soruyu aslında da, muhtemelen bir sürü yanlışım çıkacaktır(yeterince detaylı incelenirse, hatta belki de kodum derlenemez bile).

Kağıt-kalem olduğumuz bu programlama sınavından öğrenilenler:

  • Java'da String'lerle intler birbirlerine eklenebiliyor(concatenate yani, String'in yanına int'i String'e çevirerek ekleme). Sınavda int'i String'e çevirmeyi bulamadığım için eklenebildikleirini varsayarak yapmıştım. Gerçekten de öyleymiş.

  • this kelimesi tam olarak Python'daki selfe eşit değilmiş. Hala çözemedim tam olarak ama, bununla alakalı bir yazı yazacağım.

  • Kodu izlemek çok zor bir olay(değişkenlerin değerleri, ekrana yazdırılanlar vs). Scope, class ve instance değişkenlerinin özelliklerini vs. çok iyi bilmek gerekiyor. thise Python'daki self muamelesi yaptım, bakalım sonuç ne olacak.

  • IDLE, ipython gibi araçlardan mıdır nedir, test etmeden hiçbir şeyi düzgün yazamadığımı farkettim. Python'da ne zaman bir şeyden emin olmasam test ederek doğru yolu buluyordum. Java'da bu çok daha zor olduğundan, hatta kağıt kalem ile imkansız olduğundan, zor anlar yaşadım diyebiliriz.

  • Yine sanırım eski alışkanlıklardan, kodu okuyup takip etmek yerine, merak ettiğin yerlere print'ler yerleştirerek kodu takip ettiğimden, kağıt üzerinde etkili olamadım(?!) diyebilirim. Çok sinir bozucu bir iş.

Ekleme

Sınavdan birkaç dakika önce 'ya çıkarsa' diye bir arkadaşla yazdığımız, bir matrisin karesini alan kod:

public class MatrisDeneme {

    public static void main(String[] args) {

        int[][] matris ={{3, 5, 9},
                         {5, 6, 1},
                         {6, 8, 10}};

        int[][] yeni ={{0, 0, 0},
                       {0, 0, 0},
                       {0, 0, 0}};

        if (matris.length != matris[0].length) {
            // yapilamaz
        } else {
            for (int i = 0; i < matris.length; i++) {
                // 0 1 2
                for (int j = 0; j < matris.length; j++) {
                    // 00 01 02 10 11 12 20 21 22
                    for (int k = 0; k < matris.length; k++) {
                        yeni[i][j] += matris[k][j]*matris[j][k];
                    }
                }
            }
        }

        System.out.println(yeni[2][2]);
        System.out.println(yeni[0][1]);
    }

}

Bil113 ödev2 çözüm

26-10-2010, 1:01 ö.ö. // yorum // java , ödev // 727

Bil113 dersi 2. ödev için benim çözümümü buradan indirebilirsiniz. 212 satır olduğundan sayfaya yapıştırmıyorum.

Problemi buradan indirebilirsiniz. Kısaca, bir alan üzerine av ve avcı çizdirip, avcının avı yakalamasını sağlıyoruz. Tabii bazı şartlar var.

Avcım pek zeki olmadı, çok fazla ihtimal var ve bir yerden sonra sıktı açıkçası. Programın bazı özellikleri:

Yorumlarla beraber toplam satır sayısı: 212

Değerlendirilen ihtimaller:

  • Her durumda av hareket eder, bir sonraki el oyun bitecek olsa da, köşeye sıkışmış olsa da. Sadece üst üste doğma durumunda hareket etmez. Üst üste doğma durumunda oyun 0 turda bitmiş olur.

  • Av veya avcı grid alanı dışında oluşturulamaz, öyle bir durumda kullanıcıdan yeni koordinatlar istenir.

  • Av gridin sınırlarına olan uzaklığını bilmez. Eğer avcı ona çarprazdan yaklaşmışsa, önce Y ekseninde kaçmaya çalışır, kaçacak yeri kalmadığında X ekseninde eğer gideibliyorsa sağa, gidemiyorsa sola kaçar. Avın yakalanma süresini kısaltmak için herhangi birşey yapmaz. Sadece öncelikleri vardır, onlara göre hareket eder, bu, duruma göre yakalanma süresini bazen kısaltır, bazen de uzatır. Random kütüphanesi falan kullanmadım.

  • Grid çizme işlemi static gridCiz methodu ile yapılmaktadır. Bu method 6 arg alır, grid'in X ve Y uzunluğu, prey'in X ve Y koordinatı, hunter'ın X ve Y koordinatı.

Eski arşiv için düzenlemeler

25-10-2010, 9:38 ö.s. // yorum // python , markdown, pygments , wordpress , vim // 608

Eski wordpress arşivimi daha okunabilir bir hale getirmek için küçük bir parser yazma niyetindeydim ama beceremedim. Şimdilik aşağıdaki template filter ile işimi görüyorum:

def wpcodegen(value):
    value = value.replace('[code lang="python"]', '<pre class="wp">')
    value = value.replace('[/code]', '</pre>')
    value = value.replace('[coolcode]', '<pre class="wp">')
    value = value.replace('[/coolcode]', '</pre>')
    return value

Aslında syntax renklendirme için uğraşıyordum. Python kodlarını markdown ve codehilite ile renklendirecektim. Bunun için yazıyı parçalara ayırık, [code] ... [/code] arasını gerekli fonksiyona gönderip(fonksiyona göndermeden önce markdown'a göre biçimlendirmem gerekiyordu, dolayısıyla [code] ... [/code] arasını önce satır satır parçalayıp gerekli biçimlendirmeleri yapmam gerekri) çıktıyı o parçayı yazının neresinden söktüysem oraya yerleştirecektim. Kodlamaya başladıktan sonra biraz daha esnek bir yapı için fantastik işlere giriştim. Son hali duruma göre güzel çalışabiliyor aslında.

class Parser:

    def __init__(self, metin, baslangic, bitis):
        self.metin = metin
        self.devam = metin
        self.pos = [[0, 0]]
        self.baslangic = baslangic
        self.bitis = bitis
        self.__setPos()

    def __setPos(self, index = 0):
        try:
            bas = self.devam.index(self.baslangic) + \
                  len(self.baslangic) + index
            son = self.devam.index(self.bitis) + index
        except ValueError:
            return self.pos

        self.pos.append([bas, son])
        self.devam = self.devam[son+len(self.bitis):]
        return self.__setPos(index = son+len(self.bitis))

    def codehilite(self, lang=""):
        if self.pos == [[0, 0]]:
            return self.metin

        s = ''

        for i in range(len(self.pos)):
            if i == range(len(self.pos))[-1]: 
                break
            i += 1
            kod = ''
            basladi = False
            s += self.metin[self.pos[i-1][1] : self.pos[i][0]-len(self.baslangic)]
            for satir in self.metin[self.pos[i][0] : self.pos[i][1]].split('\n'):
                if not basladi:
                    if not lang == "":
                        kod += '\t:::%s\n' % lang
                    basladi = True
                kod += '\t%s\n' % satir
            s += Markdown(kod, ['codehilite'])

        return s

Birkaç sorun var, birincisi, wordpressde yazdığım bu yazılar veritabanına hep ' " gibi karakterler kaçılarak(ne desem bilemedim, &amp; gibi karakterlere dönüştürülerek işte) kaydedilmiş. Fakat codehilite kullandığımda onlar ekrana &amp; şeklinde yazdırılıyor. Onun dışında, iki ayrı tagı ayrıştırmak istiyorsanız 2 ayrı parser oluşturmalı ve aynı işlemi iki parser ile de uygulamalısınız. Hoş olmadı.

Kullanımı şu şekilde olacaktı:

>>> ornekMetin = u'Buraya [test]bazı etiketler [/test]gelecek'
>>> parser = Parser(ornekMetin, '[test]', '[/test]')
>>> parser.codehilite()
u'Buraya <pre><code>baz\xc4\xb1 etiketler\n</code></pre>'

Bil113 Lab 1. arasınav cevapları

18-10-2010, 2:01 ö.s. // yorum // java // 741

Birkaç güne dersin sayfasında cevaplar açıklanır muhtemelen, en azından alternatif olarak, sınavda benim yazdığım cevaplar:

Soru 1: Girilen iki kesiri toplayıp çarpıp yine a/b şeklinde ifade etme:

import java.util.Scanner;

public class Soru1 {

    public static void main(String[] args) {

        Scanner girdi = new Scanner(System.in);
        System.out.print("İlk kesirin pay ve paydasını giriniz : ");
        int pay1 = girdi.nextInt();
        int payda1 = girdi.nextInt();
        System.out.print("İkinci kesirin pay ve paydasını giriniz : ");
        int pay2 = girdi.nextInt();
        int payda2 = girdi.nextInt();

        int sonucToplamPay, sonucToplamPayda, sonucCarpimPay, sonucCarpimPayda;

        sonucToplamPayda = payda1 * payda2;
        sonucToplamPay = pay1*payda2 + pay2*payda1;

        sonucCarpimPay = pay1*pay2;
        sonucCarpimPayda = payda1*payda2;

        System.out.println(pay1 + "/" + payda1 + " + " + pay2 + "/" + payda2 + " = " + sonucToplamPay + "/" + sonucToplamPayda);
        System.out.println(pay1 + "/" + payda1 + " * " + pay2 + "/" + payda2 + " = " + sonucCarpimPay + "/" + sonucCarpimPayda);
    }
}

Soru 2: Girilen 3 sayıyı küçükten büyüğe sıralama. Aşağıdaki kod eşitlik durumunda da düzgün çalışıyor(daha kısa bir şekilde çözen var mı?):

import java.util.Scanner;

public class Soru2 {

    public static void main(String[] args) {

        boolean devam = true;

        while (devam) {
            Scanner girdi = new Scanner(System.in);
            int a = girdi.nextInt();
            int b = girdi.nextInt();
            int c = girdi.nextInt();

            if (a > b) {
                if (b > c) {
                    System.out.println(c + " " + b + " " + a);
                } else { // a > b, c > b veya b == c durumu
                    if (a > c) {
                        System.out.println(b + " " + c + " " + a);
                    } else { // a > b, c > a veya a == c durumu
                        System.out.println(b + " " + a + " " + c);
                    }
                }
            } else { // b > a veya b == a durumu
                if (a > c) { // b > a > c
                    System.out.println(c + " " + a + " " + b);
                } else { // b > a, c > a veya a == c
                    if (b > c) { // b > c > a
                        System.out.println(a + " " + c + " " + b);
                    } else { // c > b > a veya c == b > a
                        System.out.println(a + " " + b + " " + c);
                    }
                }
            }

            System.out.print("Devam?");
            girdi.nextLine(); // bug gibi birşey
            if (girdi.nextLine().equals("hayır")) {
                devam = false;
            }
        }
    }
}

Soru 3: Girilen cümledeki büyük harfleri küçük, küçük harfleri büyük harfe çevirme(türkçe karakter girilmeyecek). Her harf için, eğer harfin büyültülmüş hali kendisine eşitse, harfi küçülttüm, değilse büyülttüm. Bir arkadaş da ASCII tablosundan küçük ve büyük harflerin aralığını tespit edip yapmış.

import java.util.Scanner;

public class Soru3 {

    public static void main(String[] args) {

        Scanner girdi = new Scanner(System.in);
        String str = girdi.nextLine();
        String harf;

        for (int i = 0; i < str.length(); i++) {
            harf = str.substring(i, i+1);
            if (harf.equals(harf.toLowerCase())) { // harf zaten kucuk
                System.out.print(harf.toUpperCase());
            } else { // harf buyuk
                System.out.print(harf.toLowerCase());
            }
        }
    }
}

Soru 4: Guess my number. 1 ile 100 arasında bir sayı tutulacak.

import java.util.Random;
import java.util.Scanner;

public class Soru4 {

    public static void main(String[] args) {

        Scanner girdi = new Scanner(System.in);

        Random r = new Random();
        int randomNumber = Math.abs(r.nextInt());
        randomNumber = (randomNumber % 100) + 1;

        int tahminSayisi = 1;
        int tahmin = -1;

        System.out.println("Bilgisayar 1 ile 100 arasında bir sayı tuttu.");

        while (!(tahmin == randomNumber)) { 
            System.out.print("Tahmininiz? ");
            tahmin = girdi.nextInt();
            if (tahmin < randomNumber) {
                System.out.println("Tahmininizi arttırın.");
            } else if (tahmin > randomNumber) {
                System.out.println("Tahmininizi azaltın.");
            } else {
                System.out.println("Tebrikler, " + tahminSayisi + " tahminde sayıyı bildiniz.");
            }
            tahminSayisi++;
        } // while biter
    }
}

Alternatif çözümü olan var mı?

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