13-11-2010, 3:06 ö.s. //
//
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.
31-10-2010, 8:42 ö.s. //
//
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]);
}
}
26-10-2010, 1:01 ö.ö. //
//
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ı.
25-10-2010, 9:38 ö.s. //
//
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, & gibi karakterlere dönüştürülerek işte) kaydedilmiş. Fakat codehilite kullandığımda onlar ekrana & ş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>'
18-10-2010, 2:01 ö.s. //
//
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