3-1-2011, 8:15 ö.s. //
//
python
, vim
, nautilus
// 660
Sıkıldıkça geliştirdim arşiv düzenleyiciye sonunda albüm kapağı indirme özelliğini ekledim. Arşiv düzenleyicinin ne olduğu hakkında bilgi almak için scriptin sayfasına bakabilirsiniz.
Henüz nautilus için olanına eklemedim, onu da muhtemelen yarın eklerim, şimdilik arayüzlü halinde albüm kapağı indiriyor sadece. Ek olarak, albüm kapaklarının indirilebilmesi için mechanize kütüphanesine ihtiyaç duyuyor. Ubuntu (ve sanırım Debian) kullanıcıları sudo apt-get install python-mechanize komutuyla indirebilirler, PyPI veya pip aracılığıyla da indirilebilir.
Eğer mechanize yüklü değilse, kapak indirme seçeneği aktif olmuyor. Onun dışında program aynı şekilde çalışmaya devam ediyor.
Bu arada programın albüm kapaklarını nasıl bulduğundan bahsedeyim biraz. Mechanize'dan daha önce biraz bahsetmiştim. Yine mechanize ile, google resimler'e giriyorum, formu sanatçı adı + albüm adı ile dolduruyorum, sayfadan, kendi yazdığım regex deseni ile arama yapıyorum(ilk başta BeautifulSoup ile resimleri ayırıyordum, fakat onlarca sayfa için tekrarlayınca performans kaybı ço koldu), sonuçlardan birkaç kritere göre eleme yaparak, kalan ilk sonucu indirip kaydediyorum.
İndirme işlemlerini threading ile yapıyorum(bu tip işlemlerde çok bariz performans artışı sağlıyor). Aşağıda programı test ederken yaptığım bir denemenin sonucunu görebilirsiniz. Genel olarak oldukça isabetli resimler indiriyor. Arama cümlesi değiştirilerek (sanatçı adı + albüm adı + " album cover" gibi mesela) daha uygun sonuçlar da elde edilebilir.

Yarın muhtemelen nautilus scriptine de ekleyeceğim bu özelliği, aslında ben zaten sadece nautilus scriptini kullanıyorum(aracı bir script ile, düzenleyip arşivimin olduğu yere kopyalıyor, onu da bir ara yazacağım sanırım).
Bu arada, sanırım tüm kodlarımı github veya benzeri bir yere koyacağım. Bu şekilde çok zor olmaya başladı, her güncellemeden sonra tar dosyasını oluşturmak bile zor geliyor artık, bir yolunu bulmam lazım. Daha düzenli olacak sanırım öyle. Django admin scriptini de bayaa geliştirdim, örneğin artık programın üzerine sürüklediğim dosya veya klasörleri alanıma upload ediyor. Sadece bu programı kullanarak her işimi görebiliyorum. Kodlarımı bir yerde topladıktan sonra, Django admin programını da koyacağım. Nasıl birşey olduğunu merak edenler için, şu yazımda bir ekran görüntüsü koymuştum.
Unutmadan, program için hata raporlarınızı ve tercüme desteğinizi bekliyorum. Tam olarak tercüme edebilsem, Ubuntu veya Pardus için paketler hazırlanabilir aslında.
Bir sonraki hedef, klasör izleme ve eklemeleri otomatik düzenleme özelliği. Asıl hedefim de TidySongs'daki tüm özellikleri eklemek :)
Şurdan indirebilirsiniz. Not: paketleme, distutils vs. ile uğraşmamak için programı tek bir dosyaya sığdırmaya çalıştım. Kod biraz kötü durumda yani :) . Bir sonraki sefer ciddi bir temizlik/düzenleme yapmam gerekecek sanırım.
Ekleme: Benim etiket sistemi tamamen sapıtmış, daha mantıklı bir algoritma lazım sanırım.
23-12-2010, 5:11 ö.s. //
//
java
, ödev
// 606
Bugün bil113 final için birkaç satır birşeyler yazdım, Deitel'den Java: How to Program'a baktım biraz. Deitel'in Python kitabı rezaletti, ama bu iyiymiş(Amazon'dan da çılgın puanlar almış zaten). Recursion, searching and sorting bölümlerinin alıştırmalarını falan çözdüm. Kağıt üzerinde yine bildiğimizden çok az puanlar alacağız ama, neyse..
Hazırlık için çözülebilecek bazı klasik basit problemler:
Aksini belirttiklerim hariç, çözümlerim bu ve şu dosyalarda(main methodları testlerim için). Sort.java dosyasındaki düzenleme methodların ilk bakışta arrayi değiştirmesi gerekirken aslında neden değiştirmediği(ya da hangi arrayi değiştirdiği) de düşünülebilir. İlk başta anlam verememiştim. Tam sınav sorusu bence.
Bunların dışında, codingbat'deki sorular güzel. Hepsi bittikten sonra çözümlerini yazacağım buraya.
Bu arada, biraz konu dışı olacak ama, Python'da tek satırda quicksort, ibretlik:
def qsortr(list):
return [] if list==[] else qsortr([x for x in list[1:] if x < list[0]]) + [list[0]] + qsortr([x for x in list[1:] if x >= list[0]])
Bu arada(2), bu yazıyı aşağıda ekran görüntüsünü görebileceğiniz programla ekliyorum:

Bunu da yine fizik finalinden önce yazmıştım. Burda, adres satırı Django admin'de olduğu gibi, yazı başlığından otomatik olarak üretiliyor. Henüz bazı durumlarda yanlış sonuçlar verebiliyor. Tek tuşla yazılı django development server'da ekliyorum, kontrol edip, web'e tıklıyorum ve bir daha gönderiyorum. Çok pratik oldu. Normalde localde admin panelinden yazıyı ekleyip, herşey tamamsa, webe kopyalıyordum. Şimdilik sadece benim yönetici panelimde çalışsa da, biraz düzenlemeyle istediğim esnekliğe getireceğim programı. Daha sonra birkaç ekleme daha yapıp burada yayınlayacağım yine.(örneğin dosya upload işini daha kolaylaştıracak birşeyler ekledikten sonra)
Yazı eklemeyi daha da kolay hale getirebilmek için önceki projelerimden bkz. nautilus için ftp upload scripti
19-12-2010, 8:37 ö.s. //
//
python
, vim
, nautilus
// 635
Yarın fizik finalim var ve nautilus için basit bir CleanCSS scripti yazdım.
Scriptin yaptığı şey, seçtiğiniz CSS dosyasını CleanCSS'e gönderip, çıktığı isminde bir değişiklik yaparak gönderdiğiniz dosyayla aynı yere kaydediyor. Sıkıştırma düzeyi, satır 19'da belirtiliyor(default 3, yani en küçük çıktıyı alırsınız).
Program çok küçük olduğu için kodu buraya yapıştıracağım. Yapmanız gereken, scripte istediğiniz adı verip(formatı olmak zorunda değil, .py gerekli değil yani), çalıştırılabilir hale getirip, ~/.gnome2/nautilus-scripts/ klasörüne atmak. Daha sonra 1 veya daha fazla CSS dosyasını seçip sağ tıklayıp nautilus scriptleri bölümünden bu scripti seçmek.
#!/usr/bin/env python
import mechanize, BeautifulSoup, os.path
dosyalar = [f.strip() for f in os.environ['NAUTILUS_SCRIPT_SELECTED_URIS'].split('file://') if len(f) > 0]
#dosyalar = ["/home/osa1/Desktop/deneme.css"]
forms = mechanize.ParseFile(mechanize.urlopen("http://www.cleancss.com"), "http://www.cleancss.com")
form = forms[0]
for dosya in dosyalar:
dosya_ = open(dosya, "r")
css = dosya_.read()
dosya_.close()
form["css_text"] = css
template = form.find_control("template", type="select")
template.value = ["3"] # s1k1st1ma seviyesi
request = form.click()
response = BeautifulSoup.BeautifulSoup(mechanize.urlopen(request).read())
yeni_kod = "".join(response.findAll("code")[0].text.split("\n"))
yeni_kod = unicode(BeautifulSoup.BeautifulStoneSoup(yeni_kod,
convertEntities=BeautifulSoup.BeautifulStoneSoup.HTML_ENTITIES))
dosya_adi = os.path.basename(dosya_.name).split(".")[0]
yeni_dosya_adi = os.path.join(os.path.dirname(dosya_.name), dosya_adi + "_duzenli.css")
yeni_dosya = open(yeni_dosya_adi, "w")
yeni_dosya.write(yeni_kod)
yeni_dosya.close()
Bu arada, bağımlılıklar mechanize ve BeautifulSoup. İkisi de Ubuntu(ve sanırım Debian) depolarında var. Paket adları; python-mechanize ve python-beautifulsoup. Bu boyutta bir program için bağımlılıklar biraz abartı kaçmış gibi gözükebilir, ama zaten bu kütüphaneleri kullandığım için script bu boyutta.
Bu arada, iki kütüphane de mükemmel. BeautifulSoup'un zaten hastasıyız, uzun süredir kullanıyordum, mechanize'ı da bu iş için keşfettim. Webde neredeyse tarayıcı rahatlığında gezinmenizi sağlıyor. Aslında sanırım html parse için de kullanılabiliyor, ben BeautifulSoup bildiğim için hiç dökümantasyon okumakla falan uğraşmak istemedim, onu kullandım.
Asıl amacım bu scripti Vim için yazmaktı. Kendi belirlediğim bir kısayol tuşuyla .css formatlı dosyalara bu işlemi yapacaktım, fakat henüz Vim'e Python ile nasıl eklenti yazabileceğimi çözebilmiş değilim. Ondan önce birkaç deneme yapayım dedim, ortaya bu çıktı.
küçük bir bug düzeltildi
16-12-2010, 7:25 ö.s. //
//
java
, ödev
// 455
Ödevi kısaca başlıktaki gibi özetleyebiliriz. Bir yol haritamız var, verilen iki nokta arasındaki tüm yolları bulup, yolun ne kadar sürdüğünü hesaplamamız istendi.
Ödev hakkında daha detaylı bilgi, girdi formatı, vs. için föyü şurdan indirebilirsiniz.
Benim uyguladığım iki yöntem vardı, iki şekilde çözdüm yani ödevi. Bir tanesi, breadth-first search algoritmasıydı. Wikipedia'daki kodu ödeve uyarladım. İkinci yöntem de, kendi "recursive" yöntemdi.
Ödevi asistanlara gönderdiğim haliyle burdan indirilebilir.
Onun dışında, 2. lab sınavındaki 4. sorunun çözümü de burda. Bence bu sınavdaki en/tek zor ve zevkli soruydu. Kısaca, belirtilen dosyanın içinden belirtilen kelimelerin kaç kere geçtiğini bulan bir program. Girdi formatı tam olarak sorudaki gibi olmalı, fakat soru elimde olmadığından formatı yazamıyorum, hueahea.
Bu arada unutmadan, kullanılan dil Java.
12-12-2010, 1:52 ö.ö. //
//
python
, vim
// 557
Python ve Java ile yaptığım gereksiz işlere yenilerini eklemeye devam.
Çoplüğe dönen müzik arşivimi düzenlemek için(düzenleyemedim bir türlü şu arşivi :S) bir script daha. Burda aslında amacım arşivin düzenli olması falan değil de, can sıkıntısından birşeyler yazıyorum işte. Bu seferki içinde sadece bir dosya bulunan(klasör değil, en alt klasöre kadar tarar, en üst klasörü kopyalar) klasörleri bir yere topluyor.
#!/usr/bin/python
import os, shutil
def say(klasor, sayac):
for dosya in os.listdir(klasor):
if os.path.isdir(os.path.join(klasor, dosya)):
sayac += say(os.path.join(klasor, dosya), 0)
else:
sayac += 1
return sayac
#print say("/home/osa1/Desktop/ad", 0)
yer = "/home/osa1/Music/"
klasorler = filter(os.path.isdir, [yer + dosya for dosya in os.listdir(yer)])
for klasor in klasorler:
sayac = 0
if say(klasor, 0) == 1:
print klasor.split(os.path.sep)[-1]
os.rename(klasor, "/home/osa1/Music/test2/" + klasor.split(os.path.sep)[-1])
Arşiv düzenleyici arayüzünü güncelledim, küçük bir hata vardı. Dosya kopyalama sırasında kopyalanan dosya sayısı güncellenmiyordu.
Bir de, dizüstü bilgisayarımı fullhd monitöre bağladıktan sonra, bilgisayarı kapatıp açtığımda üst panel dağılmış oluyor. Panel ayarlarımı bir yere kopyaladım, ve bir komut aracılığıyla onu panel ayarlarının tutulduğu yere geri kopyalıyorum. Komutu .bashrc dosyama kopyaladım:
python -c 'import os; os.rename("/home/osa1/Yedek/panel", "/home/osa1/.gconf/apps/panel")'
Şimdilik bu kadar. Zaman buldukça gereksiz işler yapmaya devam edeceğim. Bu arada osa1.net'in de sayfalara bölünmeye ihtiyacı var. Örneğin python etiketine tıklarsanız, onlarca yazının aynı sayfada gözüktüğünü farkedebilirsiniz. Yeni bir etiket eklediğimde de, tüm eski yazıları tarayıp, yeni etikete göre etiketleme özelliği ekleyebilirsem de güzel olacak aslında. Bir de IRC botu vardı, yarım bıraktığım..
Ekleme: Bu arada sayfalama şeyini de ekledim, artık yazılar 5'er 5'er gösterilip, sayfalara ayrılıyorlar, sayfanın altından veya adres satırından diğer sayfalara geçebilirsiniz.
Ekleme2: Yeni bir etiket eklediğimde eski yazıların otomatik taranmasını da ekledim. Yanlız farkettim ki, otomaitk etiketleme sistemim pek de mantıklı çalışmıyor. Yani eğer etiket yazıda geçiyorsa, otomaitk olarak etiketleniyor. Alakasız etiketlerle etiketlenebiliyor yazılar. Daha mantıklı bir algoritma bulunabilir.
0 ,
1 ,
2 ,
3 ,
4 ,
5 ,
6 ,
7 ,
8 ,
9 ,
10 ,
11 ,
12