25
Eki

Veri Yapıları ve Algoritmalar (COMP231) dersinin bu haftaki projesinde sıralama algoritmalarının implementasyonu ve analizi yapılması istendi. Proje Quick sort ile beraber ders kitabı olarak kullandığımız Cormen’in Introduction to Algorithms kitabındaki Merge sort algoritmasının yazımını bize bırakmış ve Insertion sort ile beraber birtakım yardımcı fonksiyonları hazır olarak vermişti.

Güzel bir pazar günü başlangıcında quick sort’u yazıp diğer kısımlarını akşama bırakmış idim. Sanırım eğlence akşam vaktini bu işe ayırmamla başladı. Gece 10.30 – 3.30 arası Cormen’in Merge sort algoritmasını yazmakla,  toplamda 4 tane algoritmanın analizini yapıp anlamlı veri elde eden programcığı yazmakla ve gnuplot öğrenmekle geçti. Sonunda gnuplot ile sonucu elde ettim ancak twitter’da bahsettiğim üzere bir problem vardı. Gecenin o vaktinde artık ekrana bakacak halim kalmadığı ve proje teslimine 5 saat kaldığı için projenin o hali ile gönderip sabah labda bakmaya karar verdim.

Sabah problemi reb’e söylemem ile beraber durumun hocaların bulunduğu e-posta listesine atılması bir oldu :) Şimdi bulduğum sonucu ve olması gereken sonucu yan yana koyalım.

İlk analizde görüyoruz ki harika bir gariplikte O(n^2) çalışması gereken insertion sort O(n) çalışmakta. Normalde O(n . lgn) çalışması gereken merge sort neredeyse O(n^2) çalışıyor gibi görünüyor.

Tabi ki hata bu veriyi üreten kodda meydana geliyor. Sıralama algoritmalarının çalışmasında herhangi bir sıkıntı mevcut değil. Sakin kafa ile düşününce anlıyoruz ki durum tamamiyle mutation, yani bir dizinin (array) ortak kullanımından kaynaklanıyor. Alınan kahve oranı ve gecenin ilerleyen saatleri ile yazılan kod kalitesi arasında bir ilişki olabileceğini düşünürsek ilk veriyi üreten kodun kirli bir biçimde yazıldığına şaşırmamak gerek. Kod tek bir liste alıp o liste üzerinde tek tek sıralama algoritmalarını çalıştırıyor. Yani ilk sıralamadan sonra elimizde sıralı bir liste oluyor ve devamındaki 3 algoritma sıralı liste üzerinde sonuç veriyor. Durum böyle olunca, insertion sort çalışması gereken bir biçimde sıralı liste üzerinde O(n) zamanda çalışıyor. Merge sort sıralanmamış liste üzreinde ilk olarak çalıştırıldığı için onun dışındaki diğer algoritmalar da aynı şekilde sıralı listeler üzerinde sonuç veriyor.

Sabah veri üreten programığı düzgün bir biçimde yazdıktan sonra doğru olan yukarıdaki sonuçları elde ettim. Sağda görüldüğü üzere insertion sort O(n^2) zamanda çalışıyor ve diğer algoritmalar yok denecek kadar az bir sürede işlemi tamamlıyor. Soldaki grafikte ise kalan algoritmaların analizi mevcut. Görüldüğü gibi 25.000.000 elemanlı listeye kadar analizi mevcut ki bu kadar büyük bir rakamda insertion sort’u beklemek çok uzun süreceği için çıkarmak zorunda kaldım.

Yanlış veriyi üreten programcığı buradan görebilirsiniz. Farkedeceğiniz üzere getAnalysis metodu tek bir liste üzerinde işlem yapmakta. Düzgün ve temiz haline ise buradan ulaşılabilir. getAnalysis artık bir metod ve liste alarak, önce listeyi kopyalıyor, ardından da zamanı döndürüyor. Bu işlemi 4 algoritma için tekrarlayıp zamanlarını aldıktan sonra dosyaya yazdırıyorum.

Ne öğrendim? 

Temel olarak yorgunken bir problemin içinden çıkılamadığında dinlenilmesi gerektiğini öğrendim. İşin teknik kısmında ise mutation konusunda dikkatli olunması gerektiğini, sıralama algoritmalarının nasıl davrandığını düzgün bir biçimde aklımda yazdım. Tabi sonucunda bölüm içerisinde eğlence konusu olmam ve “Eren The Sorter” olarak adlandırılmamın kaçışı olmadı :)

Not: Grafikleri geç bir saatte oluşturduğum için yazım yanlışı yaptım. Grafiklerin sadece başlığının düzeltilmiş hali ile uğraşacak ve görselleri tekrar yükleyecek gücü bulamadığım için grafikleri okurken comprasion kelimesini comparison şeklinde okumanızı rica ediyorum efem.

29
Nis

Pardus kullanıcıları eposta listesinde bir soruna çok pratik bir çözüm önerisi gördüm. Çözümü yazan sayın Muhammed Er beye teşekkür ederiz. Java ve Pardus sorunsalına kısa ve anlaşılır bir çözüm yazmış. Soruyu ve cevabı buraya yazıyorum:

Soru:

Ben javaws ile java uygulaması çalıştırıyorum. Fakat program çalıştığında hata alıyorum. Hatanın nedeni javanın update edilmiş olması sanırım. Pardus’ta son sürüm java + update’lerde yüklü durumda oluyor. Benim yüklü olan java versiyonunun update’lerini silmem gerek. Update’leri nasıl silerim?  Veya yüklü olan javayı update’lerle beraber silip nasıl yalın halini ekleyebilirim? Yardımlarınız için şimdiden teşekkürler.

Cevap:

1. java.sun.com sitesinden javayı indirin.
2. Setup dosyasını çalıştırın,
3. “Ev dizini”nize kurun. /home/mehmet/java gibi
4. echo $PATH komutuyla PATH listesinden şu anki javaws nin bulunduğu dizini çıkartın(kurulu olduğu yeri öğrenmek için “which javaws” diyebilirsiniz.)
5. java dizinini PATH’a ekleyin, “export PATH=/home/mehmet/java/bin:$

PATH gibi(dikkat; /java içerinsinde ki bin dizinini ekleyin.)
6. PATH değişkenini değiştirdiğiniz konsoldan, tekrar programınızı çalıştırmayı deneyin. Çünkü o konsoldan çıktığınızda ayarlarınız yok olacaktır.

***

Share and Enjoy: Twitter Facebook FriendFeed Tumblr Google Bookmarks del.icio.us LinkedIn email Identi.ca MySpace StumbleUpon Technorati Posterous RSS Reddit Digg Yahoo! Buzz Yahoo! Bookmarks blogmarks Suggest to Techmeme via Twitter Netvibes Live

1
Eyl





MultiThread Programming (ÇokluKanal programlama) terimine kısaca bakmak gerekirse, bir programdaki akış kontrol mekanizmasıdır. Örneğin; klasik batch modunda programlardan farklı olarak kullanıcı herhangibir anda girdi girerken program arka planda başka veriler toplayabiliyor olmasıdır.

Gelelim önemine: Çok çekirdekli işlemcilerin piyasaya çıkmasıyla beraber çok kanallı programlar önem kazandı. Performansın önemli olduğu çeşitli algoritmik uygulamalar için ise vazgeçilmez bir kaynak oluyor.

Java her ne kadar platformdan bağımsız olma özelliği gösterse de bu sadece byteCode konusundadır. Java sanal makinesini sonuçta işletim sisteminde çalışır. Bu açıdan işletim sistemlerinin çoğul çekirdekli sistemlerde programları yönetme farklılıkları gösterir. Örneğin C dilinde, dil seviyesinde çok kanallı programlama desteği yoktur. Ancak işletim sistemi öncül tiplerini kullanarak bu yetiye ulaşır.

Bu zamana kadar çeşitli Linux dağıtımları, Java'nın crossPlatform olmasını da kullanarak performans karşılaştırmaları yapmışlar. Örneğin Ubuntu vs Vista. Sunuyu burdan indirebilirsiniz: "JAVA Multi-thread Programming on CMP System" .

Biz de test için bir java sınıfı oluşturduk. Programa göre 1, 3, 5, 7, 10 saniye olmak üzere 5 farklı zaman diliminde, biri yüksek öncelikli(7) diğeri düşük öncelikli (3), 2 kanalın çalışması sırasında while döngüsünün 5 defa tekrarlanarak "counter" sayacını kaç defa arttırdığı ölçüldü.

Bu tip ölçümlerde her ne kadar sistem durumu, uygulamaların etkinliği vs vs birçok etmen olmasına rağmen kabaca bir ölçüm elde ettik.

**00****00****00****00****00****00****00****00****00****00****00**

Her zaman dilimi (1, 3, 5, 7, 10 saniye) için 5 ölçüm yapıldı. Bu beş ölçümün ortalaması ise o saniye dilimi için kullanıldı.

Yüksek Öncelikli Kanal ile Pardus ve Vista'da yapılan ölçümler sonucu:

Düşük Öncelikli Kanal ile Pardus ve Vista'da yapılan ölçümler sonucu:

Grafikleri yorumlamak gerekirse:
  1. Yüksek öncelikli kanalda, programların çalışma sürelerine bağlı olarak artış hızı Pardus'ta daha fazla olduğunu görüyoruz. Bunun yanında Pardus daha düzensiz olarak hızlı arttığını görüyoruz. Pardus burada birim zamanda daha çok döngü sağlayıp eşit süreli çalışma zamanları için daha çok counter hit üretmiştir.

    Vista ise düzenli bir hız artışına sahip ama birim zamanda performansı Pardus'a göre %14.06 daha düşük çıkıyor.

    Pardus dolu dizgin koşarken Vista düzgün ilerlemeyi seçiyor :)

  2. Düşük öncelikli kanalın her iki işletim sisteminde çalışmasını incelemek gerekirse, Pardus'un, her bir zaman diliminde üretilen ortalama sayaç sayısının zamana göre artış hızı Vista'dan daha fazla. Düşük öncelikli kanalda Pardus düzenli bir artışı seçerken Vista da yine düzenli olarak artıyor. Örneğin 5 sn'li çalışma süresince aralarında ki standart sapma ise %19.02 gibi azımsanmayacak bir rakam.
Düşük öncelikli kanalla yüksek öncelikli kanalın 2 işletim sisteminde hız karşılaştırmasını yaptık. Burada ilginç bir diğer nokta ise Pardus'ta yüksek öncelikli kanal bazen düşük öncelikli kanala yetişemiyor. :). Ölçüm sonuçları en sonda verilmiştir. İncelerseniz bu garipliği görebilirsiniz :).


Bu grafikte ise 5 zaman dilimi için(1, 3, 5, 7, 10 saniye) (High level, Low level) çifti çizildi. Bu grafiği Microsoft Math 2007'den çizdim bu arada. Gariptir ki Microsoft bu projeyi açık olarak yürütüyor, yoksa işimiz ne :). Çok kullanışlı bir program tavsiye ederim.

Kaynak Dosyalar ve Bilgisayar bileşen özellikleri için: Burdan

Ayrıntılı ölçüm sonuçları ve Grafikler için: Burdan


Eksik ve eklemek istedikleriniz varsa yorumlarınızı beklerim...
9
Nis

seamlogo8. Linux ve Özgür Yazılım Şenliği kapsamında 17 Nisan Cuma günü, 13:00-15:00 arasında, JBoss Seam Atölye Çalışması yapılacak.

Çalışma içeriği ise şöyle :

  • EJB3, JPA, JSF teknolojilerine giriş
  • gerekli çalışma ortamının oluşiturulması
  • seam-gen kullanılarak bir seam projesi oluşturulması
  • eclipse ve netbeans altında ilgili projenin açılması
  • ajax destekli küçük bir uygulamanın yazılması

Atölye çalışması konuyla ilgilenen herkesin katılımına açık olmakla birlikte temel java ve web teknolojileri bilgisi faydalı olacaktır.

24
Mar

Bu hatayı aldığınızda öncelikle listelerde geçerli olan remove(int index) fonksiyonunun referans sayfasına bakalım;

Throws:
UnsupportedOperationException - if the remove method is not supported by this list.

Aslında hata gayet açıklayıcıydı ama başka tür hatalar aldığınızda da referans sayfasına bakmanızda fayda olduğundan bu aşamayı da yazdım.

Ben bu hatayı Arrays.asList ile liste oluşturduğumda aldım;

        List enumList = Arrays.asList(ApplicationStatus.values());
        enumList.remove(3);

Bu kodun amacı ApplicationStatus sınıfındaki enum degerleri bir listeye atıp ardından bazı elemanları silme işlemi yapmaktı.

Bu şekilde asList ile oluşturulan listeler java.util.Arrays$ArrayList gibi bir liste döndürüyor ve bu tip listeler remove() add() gibi fonksiyonları desteklemiyor. Bu sebepten UnsupportedOperationException hatasını alıyoruz.

Bunun çözümü bir şekilde düzgün bir liste oluşturmak. Ben şöyle yaptım;

        List enumList = Arrays.asList(ApplicationStatus.values());
        List realList = new ArrayList();
        for (int i = 0; i < enumList.size(); i++) {
            realList.add(enumList.get(i));
        }
        realList.remove(3);

Artık realList ile istediğim gibi remove(), add() fonksiyonlarını kullanabiliyorum.

8. Linux ve Özgür Yazılım Şenliği, bu sene İstanbul Bilgi Üniversitesinde 17-18 Nisan  tarihlerinde gerçekleştiriliyor.

Bu sene şenlik sırasında JBoss Seam konusunda bir atölye çalışması yapıyor olacağım. İlgilenen herkesi beklerim…

16
Ara

turkcell-isolaTurkcell’den beklemediğim ve beni şaşırtan bir haber geldi. Turkcell Teknoloji ilk açık kaynaklı, GPL lisanslı ürünü Isola Framework’u duyurdu. Isola, Java ile web uygulaması geliştirenler için yine bir javascript frameworku olan Extjs’i temel alarak geliştirilmiş bir javascript frameworku. Sanırım ajax4jsf’e benzer bir işi yapıyor.

Böyle büyük ölçekteki bir şirektin özgür yazılıma destek vermesi, ülkemizde özgür yazılımın gelişmesi adına güzel bir gelişme. Turkcell Teknoloji için bu bir ilk ama son olmayacaktır diye düşünüyor ve umuyorum.

Bu güzel hareketinden dolayı Turkcell’i ben de (*) tebrik ediyorum.

Turkcell Teknoloji’nin nasıl bir yer olduğunu merak edenleriniz varsa Televidyon’un videosunu izleyebilirler ve bilgi alabilirler.

Bu arada haberi sevgili Görkem Çetin‘in linux sohbet listesine attığı posta sayesinde öğrendim. Kendisine bu güzel haberi ilettiği için teşekkür ederim.

12
Mar

Uygun Teknoloji, Java EE teknolojileri ile geliştirmekte olduğu özgür yazılım ürünlerinde birlikte çalışacak takım arkadaşları arıyor.

İlgilenenlerin CV’lerini bilgi [at] uygunteknoloji.com adresine göndermeleri rica olunur…

14
Oca

Pardus 2007.3′e kurduğum Eclipse yazılım geliştirme programında java dili kullanarak MySQL’e bağlanmaya çalışıyordum bir süredir (1-2 gündür). Ama bir türlü bağlanamadım. Bağlanmaya çalıştığımda şu hatayı alıyordum;

Cannot connect to db/user. Check your URL
Communications link failure

Last packet sent to the server 0 ms ago

Sonunda çözümü buldum… Problem mysql’in ilk kurulumuyla gelen ayarların dışarıdan erişime izin vermemesiymiş.. Düzeltmemiz gereken dosya /etc/mysql/my.ini dosyası.. Pardusta düzeltmeyi şu şekilde yapabiliyoruz;

Önce ALT+F2 ile çalıştır’ı açalım..

kdesu kwrite /etc/mysql/my.ini

yazıp root şifremizi girelim. daha sonra açılan dosyadaki

skip-networking

satırını bulun ve o satırın başına # ekleyin ve o satırı yorum satırı yapın. Yani o satır şöyle olsun,

# skip-networking

dosyayı kaydedip kapatın. daha sonra konsol açıp şunu yazarak mysql-serverı yeniden başlatın.

service mysql-server restart

Artık Pardus linuxta Eclipse kullanarak MySQL’e bağlanabiliyoruz…

Bu arada bu çözümü uzun araştırmalar sonucu buradan buldum..

20
Eyl

RedHat’ın Exadel’den devir alıp özgür yazılım haline getirdiği RichFaces JSF bileşen setinin yeni sürümü yayınlandı. Live demosuna buradan kendisine de şuradan erişebilirsiniz.

Seam uygulama çatısının 2.0 CR1 sürümü duyuruldu. Güncel kararlı sürüm 1.2.1′e göre bir çok yenilik içeren bu sürüm uzun zamandır beta aşamasındaydı. Sürüm hakkında bilgi için buraya indirmek için ise şuraya bakabilirsiniz.

Oracle ADF’den sonra Ajax destekli yeni bileşen setini de Apache vakfına bağışladı. Bilgi için buraya demo için ise şuraya bakabilirsiniz.

24
Ağu


Sun, SUNW olan NASDAQ borsa işaretçisini JAVA olarak değiştirme kararı almış. Sun ismin pek bilinmediğini Java adının ise daha çok tanındığını düşünüyorlarmış. Bakınız…

Bunun Sun için iyi olup olmadığını bilemeyeceğim ama sanırım Java için pek iyi olamayacak. Böyle bir hareketle Sun, insanların kafasında Java isminin kendileri ile daha yakın bağlar kuracağını hedeflemekte. Java’nın diğer teknolojilere göre en önemli üstülüğünün bir birine rakip bir çok şirketin ve kurumun bir arada aynı teknolojiyi geliştirmesiydi. Dolayısı ile de ismin / markanın biraz daha ortada, bir şirkete bu kadar da bağlı olmamasını, kendi adıma tercih ederdim.

31
Eki
Önce gelişmelerden bahsedeyim: Java ile bir program (hocanın verdiği java projesi) yaptım. İyi bir deneyimdi, nesne yöneliminin nasıl kolaylık sağladığını görmüş geçirmiş oldum. Ama tasarım kalıpları öğrenmeden bu iş zor gibi görünüyor. Amarok'un yüzünü görmüyorum, müzikten sıkıldım galiba... Java projesini yaparken Eclipse ile iyi ikili olduk :) . Pisidepo sürekli genişliyor ve wikilendi. Bu sayede wiki yönetmeyi de öğrendim. Eh bakalım tatilde ne yapacağız...