5
Eki
Birden fazla bilgisayar üzerinde e-kitap okuyor ve bununla da kalmayıp okuduğunuz bazı satırların altını çiziyor, sayfa üzerinde notlar alıyorsanız işinize yarayabilecek bir konudan, e-kitaplar üzerindeki işaretlemelerin eş zamanlanmasından bahsedeceğim. İhtiyacınız olan sadece Okular ve Dropbox.

Yapılacaklar fazla karmaşık değil, yine de basitçe takip edilebilmesi için işlem basamakları şeklinde vermek daha iyi olur:
  • İlk önce Okular'da dosyalar üzerinde yaptığınız tüm işlemlerin saklı olduğu ilgili dizini yedekleyin. Çünkü işlem sırasında bunları yanlışlıkla silebilirsiniz. Pardus 2011.2 üzerinde bu dizinin yolu /home/kullanıcı-adı/.kde/share/apps/okular oluyor. okular dizinini ev dizininizin içine kopyalayabilirsiniz. Bu geçici olarak duracak sadece, her şeyin yolunda gittiğinden emin olduktan sonra silebilirsiniz.
  • Şimdi Dolphin üzerinde yeni bir sekme açın ve Dropbox dizininize gidin burada. Önceki (/home/kullanıcı-adı/.kde/share/apps/okular dizininin açık olduğu) sekmeye dönün, bir üst dizine çıkın ve buradan okular'ı seçerek Dropbox dizini sekmesine sürükleyin. Burada karmaşık anlattığıma bakmayın yaptığımız sadece bir sembolik bağ koymak. Komut satırından ln ile nasıl yapacağınızı şuradan görebilirsiniz.
  • Diğer bilgisayarda Dropbox dizinini açın. Eğer burada okular dizinini sembolik bağ olarak görüyorsanız her şey tamam demektir. Ama bende ne yazık ki böyle olmadı. Bu yüzden ek bir işlem daha yapmam gerekti. Sizdeki durum da böyleyse ilk önce ikinci bilgisayardaki Dropbox'u kapatın. Dropbox dizini içindeki okular'ı silin. Onun yerine bu bilgisayarın /home/kullanıcı-adı/.kde/share/apps/okular dizininin sembolik bağını ekleyin. Dropbox'u tekrar açın. Şimdi iki bilgisayarın Dropbox dizininde de sembolik bağ olarak bulunması gerekiyor okular'ın.
Bu işlemlerin ardından bir bilgisayarda yaptığınız işaretlemeleri diğer bilgisayarlarla eş zamanlayabilirsiniz, aynı anda dosyalar üzerinde işaretleme yapmayacağınızı ve internet bağlantınızın olduğunu varsayarak bunu söylüyorum tabii. Bir bilgisayarda e-kitap üzerinde işlem yapar ama bu değişiklikleri Dropbox sunucusuyla eşitlemeden (örneğin o an bağlantınızın olmaması gibi bir durumla) diğer bilgisayarda e-kitap üzerinde işaretleme yaparsanız ve Dropbox sunucusuyla eşitlerseniz bir önceki değişiklikler kaybolacaktır, buna dikkat edilmeli.



İlgili Bağlantılar
5
Eyl
Kendimi Şanslı Hissediyorum™ komutu, otomatik olarak aradığınız sorguyla ilgili ilk paketi kurmanızı sağlar.

Kendimi Şanslı Hissediyorum™ komutu ile istediğiniz paketleri aramak ve kurmak için daha az, incelemek ve kullanmak içinse daha çok zaman ayırabilirsiniz.

Kendimi Şanslı Hissediyorum™ komutunu kolayca kullanabilirsiniz, ihtiyaç duyduğunuz bir konsoldan fazlası değildir. Kullanım şekli kolay ve akılda kalıcıdır:
pisi sr -N yapılacak-sorgu | head -1 | cut -f1 -d' ' | sudo xargs pisi it
Kendimi Şanslı Hissediyorum™ komutunun örnek kullanımlarından birkaçını aşağıda görebilirsiniz:
$ pisi sr -N vektörel çizim | head -1 | cut -f1 -d' ' | sudo xargs pisi it
Paket(ler)in toplam boyu: 10.41 MB
İndiriliyor 1 / 1
inkscape paketi pardus deposunda bulundu.
inkscape-0.48.1-31-p11-x86_64.pisi (10.4 MB)100%    951.15 KB/s [00:00:00] [tamamlandı]
Kuruluyor 1 / 1
inkscape-0.48.1-31-p11-x86_64.pisi [önbellekte]
inkscape paketi 0.48.1 sürümü 31 yayımı kuruluyor
inkscape dosyaları arşivden çıkartılıyor.
inkscape paketi yapılandırılıyor
inkscape yapılandırıldı.
inkscape kuruldu. 
$ pisi sr -N ClientForm | head -1 | cut -f1 -d' ' | sudo xargs pisi it
Aşağıdaki paket(ler) zaten kurulu ve yeniden kurulmayacak:
python-clientform              
Kurulacak paket yok.
İleride Kendimi Şanslı Hissediyorum™ komutunun daha hızlı bir şekilde kullanılması için pisi-luck isminde bir betik de sunulacaktır.

Gelişmeleri yorumlar üzerinden takip edebilir, tamamen özgür ve Google'nin aynı isimli düğmesinden ilham almış bir fikir olan Kendimi Şanslı Hissediyorum™ komutu ve pisi-luck betiğinin gelişimine katkıda bulunabilirsiniz.

Önümüzdeki dönemde günlüğümde kullandığım ve rastgeleliğe yeni bir rastgelelik katan kendimi şahbaz hissediyorum (buradan verilen bağlantı üzerinden çalışmaz) yapısının bir benzeri için de planlara başlamış durumdayım.

25
Ağu
Donkey ya da daha genel olarak bilinen ve kendi dosya isminden aldığı ismiyle DONKEY.BAS, 1981 yılında yazılmış ve IBM bilgisayarlarla dağıtılan PC-DOS işletim sisteminin erken sürümleriyle birlikte gelen bir bilgisayar oyunudur. Oyundaki amacınız çayıra salınmasına rağmen yola çıkarak canına susayan eşeklere çarpmamaya çalışarak F1 aracınızla yolunuza devam etmekten başka bir şey değil.

DONKEY.BAS, daha sonraki oyunlarla ve hatta kendi dönemindeki diğer sistemlerin oyunlarıyla karşılaştırıldığında epey basit bir oyundu. Peki böyle basit ve eski bir oyunu Penguenler de Oynar sayfalarına taşıyan özellik ne ola ki diye soranlar vardır sanırım. Oyunu dikkat çekici kılan yazarlarından birinin Microsoft'un kurucularından Bill Gates olması.

70'lerin sonu ve 80'lerin ilk yıllarında bilgisayar üreten IBM, yeni bilgisayarlarla birlikte dağıtılmak üzere bir işletim sistemi ve BASIC'in bir sürümünü yazması için Microsoft ile anlaşma yapmıştı. Bu anlaşma sonucu PC-DOS, IBM bilgisayarlarla dağıtılmaya başlandı, MS-DOS ise Microsoft tarafından satılan ayrı bir ürün olarak sunuldu piyasaya. Bu iki işletim sistemi de Microsoft BASIC'in bir sürümünü içeriyordu.

DONKEY.BAS, IBM bilgisayarların ve BASIC programlama dilinin renkli grafikler ve sesler içeren etkileşimli programlar üretmek hakkındaki yeteneklerini göstermek için Bill Gates ve Neil Konzen tarafından yazılmıştır. Oyuna ilgi hala devam etmektedir bu yazının size ulaşmasından da anlaşılacağı üzere. Şimdi panhaema'daki donkey.bas ve patent ihlalleri'nden kısa bir alıntıyla devam edelim (alıntıdaki alıntının çevirisini ben yaptım varsa yanlışları bana aittir):
Aradan yıllar geçer. DONKEY.BAS'ın programcılarından Bill Gates o yılları şöyle anar: 
"Ben ve Neil Thompson, sabahın dördünde küçük bir odanın içinde prototip bir IBM bilgisayarın başında oturuyorduk. IBM kapıda bir kilit olmasında ısrar etmişti ve biz de sadece kapısında bir kilit bulunan bu gizli odaya sahiptik, bu yüzden tüm geliştirmemizi burada yapmak zorunda kaldık ve sıcaklık neredeyse 40 dereceydi. Fakat gecenin geç saatlerine kadar IBM ile yerleşik olarak gelen BASIC'in yapabileceklerini gösteren küçük bir uygulama yazdık. Ve bu DONKEY.BAS'tı. Bu çok heyecan verici bir zamanda olmuştu." 
Hatta o programcının bu açıklamaları yaptığı yıllarda DONKEY.BAS, .NET uygulamalarının performansını göz önüne koymak adına tekrar ele alınır. 
Aradan geçen yıllara rağmen çeşitli yazılım geliştirme platformlarını meşhur etmeye/tanıtmaya devam eden bu küçük oyun kodu, açık mavi bir gezegenin yollarında direksiyon sallayan yalnız bir F1 pilotu olduğunuzu varsaymanızla başlar. Kabaca (?) yola fırlayan eşeklere çarpmamak için mücadele verdiğiniz bu oyunda, çarptığınız eşekler, puan almaktadır... 
Yıl 2007 oldu, çarptığımız eşekler hala puan alıyor demek geliyor ama daha retorik yazmak lazım: 
Şimdi bu oyunun yaptığı patent ihlallerini gözden geçirelim:
  1. Mavi ambians. Dolayısıyla, Venus akla geliyor. İleriye dönük gezegensel bir patent ihlali olabilir.
  2. F1 aracı. Kesinlikle affedilmez bir ahlaksızlık. F1 aracı tasarlayanların, 80'lerdeki maddi durumunun yegane nedenlerinden biri olması kuvvetle muhtemel.
  3. Eşek. Yaradana patent borcunuz var...
  4. Kontrol tuşları.
  5. Yol çizgileri.
  6. Puanlama sistemi.
  7. Eşeğe çarpınca arabanın parçalanması. Fizik kuralları dahilinde bir ihlal...
DONKEY.BAS'ın oynayışından da biraz daha detaylıca bahsedip yazıyı sonlandırma aşamasına geçeyim. Oyunda iki şeritli bir yolda sadece şerit değiştirerek karşınıza çıkan eşeklere çarpmamaya çalışıyorsunuz. Araç hızlanmak için gaza ve yavaşlamak için bir frene sahip değil, sadece bir direksiyonunuz var sağa ve sala hareket etmek için. Oyunda derin anlamlar da aranmaması gerekiyor, öne çıkan eşeklerden kaçmaktan başka hiçbir amaç yok, dünyayı kurtarmıyoruz bu oyunda.

Oyun, IBM bilgisayardaki tek renkli ekran kipi olan CGA'yı kullanıyordu. Bu kip dört rengin kullanılmasını sağlasa da DONKEY.BAS genellikle sadece üç renk gösteriyordu ekranda. Oyunun düşük çözünürlüklü grafikleri ise çok basit görünümlüydü.

Oyunda yol, araç ve eşekler dışında, talimatlar ve puan durumu da gösteriliyor. Eğer bir eşeğe çarparsanız hem siz hem de eşek patlıyorsunuz bilgisayar hoparlöründen gelen bir ses efektiyle birlikte ve siz etaba yeni baştan başlarken eşekler bir puan kazanıyor. Oyuncu ise etap tamamladıkça puan kazanıyor.

Oyunun kaynak kodlarını ve Macintosh camiasının oyun hakkındaki görüşlerini kaynaklardaki yazılardan okuyabilirsiniz isterseniz. Bu yazı epey uzun olduğu için daha fazla uzatmak istemiyorum.

DONKEY.BAS'ın Gambas ile yazılmış bir yeniden yapımı da bulunuyor DONKEY.GB isminde. Sanıırm şurada da Assembly ile yazılmış bir yeniden yapım bulunuyor.

Bu yazının yayına girmesini takip eden yirmi dört saati kapsayacak özel teklifim de şu: DONKEY.BAS'ın pygame ile bir yeniden yapımını yazıp Pardus için paketleyecek kişi Happy Kitty'de paketçi olacak. Bence yeterince eğlenceli bir teklif :) En azından esas oyunun sunduklarının tamamını sunmalı bu yeniden yapım. Bu yüzden oyunu oynamanızı veya en azından YouTube üzerindeki videolarına iyice bakmanızı tavsiye ederim. Eşek teması yerine penguenlerin (TUX), otoyol yerine kutupların kullanılması daha iyi olacaktır. Oyun yine de DONKEY.BAS'ın hissiyatını vermelidir. Sadece bu güne özel bir teklif olduğu için şuraya yazmıyorum, ileride Happy Kitty'de paketçi olmak isterseniz bu sayfayı kontrol edebilirsiniz.

İyi oyunlar. Bol şanslar. Belki bir gazete de sizin için İlk PC Oyununu Bir Gecede Geliştirdi başlığını atar bir otuz sene sonra kim bilir.


Kaynaklar:
Hürriyet - İlk PC oyununu bir gecede geliştirdi
Wikipedia - DONKEY.BAS
panhaema - donkey.bas ve patent ihlalleri
Coding Horror - Bill Gates and DONKEY.BAS

İlgili Yazılar:
Gorillas
15
Ağu
Bir önceki yazım Asla Asla Deme ile her ne kadar teknik ve detaylı olmasa da özgür yazılımlarda lisans analizine kısa bir giriş yapmıştık.

Lisans analizi hem uygulama yazarı geliştiriciler hem de bu uygulamaları dağıtan ve çoğunlukla paketçi olarak anılan geliştiriciler için önemli bir konudur. Kullanıcılar ve lisans analizinin doğrudan ilişkileri bulunmamakla birlikte sonuçları ve etkileriyle lisans yönetimi sırasında karşılaştıklarından aralarında dolaylı bir ilişki vardır.

Sanırım bu özgür yazılımlarda lisans analizi konusunda yazacağım üç veya dört yazılık giriş seviyesi bir serinin ikinci yazısı olacak. Bu yazıda yine kısaca lisans analizi yapan bir uygulamayı tanıyacağız. Ve bu seferki konuğumuz: OSLC (Open Source License Checker / Açık Kaynak Lisans Denetleyicisi).
OSLC, açık kaynak yazılım lisanlarını analiz için Java'da, platform bağımsız olarak geliştirilmiş bir risk yönetim aracıdır.
Desteklediği özelliklerden öne çıkanlar aşağıdaki gibi özetlenebilir:
  • Sabit disk üzerinden tek bir kaynak dosyayı veya kaynak dizini işleyebilir.
  • Arşiv dosyalarını (zip, jar, tar, tar.gz, tgz) işleyebilir.
  • Java, Javascript, PHP, Python ve C/C++ kaynak kodları üzerinden açık kaynak yazılım lisanslarını tanımlayabilir. Linux çekirdek kaynağı desteği vardır ve LICENSE.txt, COPYING.txt gibi özel dosyaları kullanabilir.
  • Lisans eşleşmelerini güvenli bir şekilde asıl lisans metinleriyle karşılaştırma yaparak gösterir.
  • Eşleşen lisans metinlerini vurgulu olarak gösterir.
  • Yerel ve referans çatışmaları kontrol edip gösterebilir: Kaynak dosya A, Kaynak dosya B'yi lisans referans sınırlaması nedeniyle içeremez veya içeri aktaramaz diyelim. Somut olması açısından, örneğin GPL lisanslı bir kaynak kod dosyası PHP lisanslı bir kaynak dosyayı içeremez veya içeri aktaramaz. Genel çatışma desteğiyse henüz uygulamanın yapılacaklar listesinde bulunuyor.
  • Kaynak dosyaları filtreleme desteği.
  • Yazdırma desteği.
  • Bulunan yazar ismi, yıl gibi etiketleri gösterme desteği.
  • Lisans istisnalarını kontrol etme ve gösterme desteği.
  • Yasaklanmış ibareleri kontrol etme ve gösterme desteği.
  • Paketteki kaynak kodlar hakkında özet ve rapor oluşturabilme.
  • Bir kaynak dosya paketindeki uyumlu lisansları listeleyebilme.
  • Sisteme yeni lisanslar ve yasaklanmış ibareler ekleyebilme.
  • İnternet üzerinden oluşturulmuş veritabanlarını indirip kullanabilme.
  • Kaynak kodlardaki telif hakkı sahiplerini belirleyebilme.
  • Lisans ve telif hakları raporlarını PDF ve RTF biçiminde dışarı aktarabilme.
  • Hem SVN hem de CVS üzerinden kod çekme desteği.
  • İngilizce ve Fince'nin yanı sıra yeni dil dosyaları oluşturma ve uygulamada bunları kullanma desteği.
OSLC'nin son sürümünü indirmek için proje sayfasını kullanabilirsiniz. Uygulama yaptığım denemelerde 64 bit bir Pardus 2011.1'de sorunsuzca çalıştı. Arşivi indirdikten sonra Ark ile açmanız ve sonrasında uygulama dizinine girerek OSLC'nin grafik arayüzünü açmak için:
$ java -Xms512M -Xmx512M -jar oslc.jar
komutunu, komut satırı arayüzünü açmak için de:
$ java -Xms512M -Xmx512M -jar oslc.jar -- $@
komutunu kullanabilirsiniz. Aslında dizin içinde oslcgui ve oslccli kabuk betikleri var ama bunların bir hatadan dolayı yeniden oluşturulması gerekiyor, isterseniz bunu yaparak bu betikleri de kullanabilirsiniz.
Uygulamayı grafik arayüz üzerinden açtığınızda temiz bir uygulama ekranı sizi karşılıyor. Dosya menüsünden üzerinde çalışılmak istenen uygulamaya ait kaynak kod dizini seçilebiliyor. Bu işlem yapıldıktan sonra tüm dosyalar taranıyor ve lisans bilgileri aktarılıyor. Her ne kadar arşiv dosyalarının da işlenebileceği özelliklerde belirtilmiş olsa da yaptığım bir denemede bunun olmadığını gördüm. SVN veya CVS üzerinden kod çekme özelliklerini ise test etmedim. Dosya menüsünden ayrıca yazdırma ve PDF / RTF olarak dışarı aktarma işlemleri de gerçekleştirilebiliyor.
Araçlar menüsünden:
  • Yeni lisans ekleme,
  • Varolan lisansları düzenleme,
  • Lisansları silme,
  • Tanımlı lisansları listeleme,
  • İnternet üzerinden yeni lisans veritabanı çekme,
  • Uygulama arayüzü dili seçme ve
  • Yeni dil dosyası oluşturma
işlemleri yapılabiliyor. Bu özelliklerden bazıları kaynak kodlara eklenmiş olmasına rağmen arayüz üzerinde devre dışı bırakılmış durumda bazı bilinen hatalar veya olgunlaşmamış özellikler dolayısıyla.

Yardım menüsünden de detaylı bir kullanıcı rehberine ve OSLC'nin README dosyasına ulaşabilirsiniz. Yine burası üzerinde hakkında ekranına da ulaşabilir ve uygulamanın yazarlarını ve lisansını görebilirsiniz.

Henüz çoğuna bakma fırsatı bulamadım ama OSLC belgelendirmeyi epey sıkı tutmuşa benziyor. Lisans analizi konusuyla ilgileniyorsanız OSLC'nin Teknik Özellikler'ine bakmak isteyebilirsiniz.
Son olarak, uygulamanın terminal üzerinden de çalışabilmesi, diğer GNU/Linux araçlarıyla etkileşim içinde kullanıma imkan verdiği için epey önemli bir özellik.

OSLC, lisans analizi hakkında bir uygulama arıyorsanız incelemenizde fayda olan bir uygulama, denemenizi tavsiye ederim.
14
Ağu
İlk önce başlığın konumuzla hiçbir ilgisi olmadığını söylemek isterim, Asla Asla Deme sadece Never Say Never Again'in Türkiye'de yayınlandığı zaman İnsan Gibi Yaşa'nın yanı sıra aldığı isimlerden biri. Şimdi üzerinde biraz konuşacağımız konumuzsa ASLA.

Yazıya devam etmeden önce eğer checkelf'in ne olduğu hakkında bir fikriniz yoksa benim onunla gerçek anlamda nasıl tanıştığıma (herkese açık değilmiş, eski bir kayıt olduğu için de üzerinde değişiklik yapmak istemedim şimdi) ve Pardus Developer Base'deki belgesine bir göz atmanız iyi olabilir.

Yine checkelf de konumuzla ilgili değil, sadece bir işi tamamen doğru bir biçimde otomatik olarak yaptırabilmek için seçenek varken, bunu hata yapmaya müsait bir şekilde elle yapmanın pek de iyi bir yöntem olmadığını göstermesi açısından okunmasında fayda olduğunu düşünüyorum.

ASLA'dan az önce haberim oldu. Benim de kullanmayı ve / veya geliştirmeyi epeyce istediğim bir uygulama olduğu için görünce çok heyecanlandım ve hemen Java ile yazılmış uygulamanın son sürümüne ait ikilik arşivini indirdim. Proje sayfasında ayrıca ASLA'nın kaynak kodları ve şu an ne olduğu hakkında pek de bir fikrimin olmadığı modified.binutils paketleri de bulunuyor.

Bu arada Java'ya bakış açımı JDownloader ve IOGraph gibi yazılımlar çoktan değiştirmiş olmasaydı bir de bunun şaşkınlığını yaşardım ASLA'da.

ASLA (Automated Software License Analyzer / otomatik yazılım lisans çözümleyicisi), mevcut yazılım paketlerinin (arşivler de uygulamaların ana geliştiricileri tarafından sunulan birer pakettir aslında ama doğrudan dağıtımlarda kullanılacak seviyede ve yapıda olmadığı için dağıtım geliştiricileri tarafından ayrıca paketlenirler) lisanslarını bulmak ve tanımlamak için kullanılan bir araçtır. Bazı açılardan EULAlyzer'e benzediği söylenebilir.

ASLA, proje sayfasına baktığım kadarıyla bir süredir aktif olarak devam etmiyor ama yine de güncel bir 64 bit Pardus 2011.1 üzerinde sorunsuzca çalışıyor. Uygulamayı başlatmak için indirilen arşivin açılması ve sonrasında da ASLA dizinine girilerek
$ ./run.sh
komutunun çalıştırılması yeterli .
ASLA pek de basit bir iş yapmıyor olsa da arayüzünün kimseyi korkutacağını sanmıyorum. Lisans analizi yapmaya başlamak için ilk önce bir arşiv dosyasına ihtiyacımız var. İstediğiniz bir arşivi internetten indirebilirsiniz. Ben şu üç arşiv üzerinde çalışma yaptım:
Arşivi temin ettikten sonra bunu Ark ile açmamız gerekiyor ilk önce. Arşivi Dolphin üzerinde sağ tıklayarak Arşivi Buraya Aç. Klasör Yapısını Koru seçeneğini seçebilirsiniz.

Daha sonra ASLA'da Analyze > Analyze only licences of a package menü seçeneğini kullanarak lisans analizi yapmak istediğiniz uygulamanın kaynak kodlarının bulunduğu dizini seçebilirsiniz.
Sol tarafta lisanslar ağaç yapısıyla sıralanıyor. Burada hangi dosyaların hangi lisansları kullandığı, hangi dosyalarda lisan bilgisi bulunmadığı vs. görülebiliyor. Sol tarafta ise dosya yolu ve ismi, dosya tipi, lisans, lisans durumu, alt lisans gibi bilgiler ve dosyanın kendisi görülebiliyor.
Kurallar bölümünde de lisansların birbiriyle ilişkileri düzenlenebiliyor. Bu kısmı henüz tam incelemedim.

Yalnızca paketçilere hitap eden bir yazı oldu, eğer bir paketçi değilseniz ve anlamadığınız yerler varsa gönül rahatlığıyla başka yazılara geçebilirsiniz :) Paketçiyseniz de bundan sonra paket yaptığınızda önceki yöntemlerinize ek olarak bu uygulamayla da analiz yapmayı deneyebilirsiniz. Uygulama bir süredir geliştirilmediği için şu an kesin doğru sonuçlar vermesi beklenemez ama yine de paket yaparken lisanslarla uğraşmayı kolaylaştırabilir veya biraz uğraşla bunu sağlayabilecek hale getirilebilir.
2
Haz
Geçenlerde AUR için yapılmış (daha doğrusu AUR desteği de olan) Blinky'i görünce ben de PiSi için bir benzerini yapmak istemiştim ama nedense öylece yapılmadan kalanlardan olmuş bu fikir de.

Dün de Pardus-kullanıcıları e-posta listesinde şu mesajı görünce ve KDialog'u biraz kurcalayınca ortaya basit bir PiSi ön yüzü olan kitty çıktı.
Gerçi yukarıdaki ekran görüntüsünden kiitty'nin ne olduğu az çok anlaşılsa da herhangi bir yanlış anlamaya mahal bırakmamak için biraz daha açayım. kitty bir paket yöneticisi değildir, sadece pisi komutunun bazı parametrelerini (alt komut veya hiç uğraşmadan doğrudan komut da diyebiliriz aslında) konsola gerek kalmadan kullanmayı mümkün kılan bir araçtır. Şu an pisi em, pisi rm, pisi ur, pisi info ve pisi ar komutlarını çalıştırabiliyor. Başka komutlar da eklenebilir, örneğin depo kaldırma ve depoları aktifleştirme / devre dışı bırakma vs.

identi.ca göndergeci'nden sonra epey bir ara vermiştim kabuk betiklerine, benim için güzel bir antrenman oldu kitty.

Blinky yetkilendirme için sudo, kdesudo, gksudo komutlarını desteklese de ben sadece kdesu komutunu kullanabildim çeşitli nedenlerle. kdesu'yu da kabuk üzerinden doğrudan kdusu komutuyla çağırmak mümkün olmadığı için aşağıdaki şekilde kullandım:
$(kde4-config --path libexec)kdesu
Benzer nedenlerle sadece bir terminal uygulamasını, Konsole'yi destekliyor kitty, birden fazla uygulamayı desteklemek göründüğünden daha zormuş.

KDialog'u kullanırken bol bol kendi yardımından, “KDE Dialogs” ile Kabuk Programlama Mucizesi -1, “KDE Dialogs” ile Kabuk Programlama Mucizesi -2 ve diğer örneklerden yararlandım.

Yapılan işlemler tamamlandığında da hoş bir bildirim mesajı göstertmek istiyordum ama bununla ilgili bazı durumlar olduğu için sonraya kaldı. passivepopup'ta henüz istenen simge gösterilemiyor, aslında bu o kadar önemli değildi ve şimdilik öntanımlı olanı kullanmakta bir sakınca görmüyordum. Ama daha büyük bir sorunla karşılaştım. Konsole'ye birden fazla karmaşık (çok fazla tırnaklı) komut göndermeyi başaramadım. Örneğin şurada yazılanları uyguladığımda şöyle basit bir komutu çalıştırabiliyorum:
$ konsole --noclose -e bash -c "echo 'hede 123' && echo 'foo 123'"
ama benim kullandığı komutlarda çalıştıramadım, sanırım bunu aşabilmek için tırnakları bir daha kontrol etmem gerekecek.

kitty'nin yapımıyla ilgili ilginç olarak bahsedebileceğim sanırım bir de --without-buildno'nun --with-build-host ile değiştirildiğini öğrenmem var. Uzun zamandır kullanmadığım için yeni dikkatimi çekti. Örneğin şöyle bir komut yardımıyla sistemimde kendi inşa ettiğim ve kurduğum paketleri listeleyebiliyorum:
$ pisi li -b localhost
Kısaca böyle, kimsenin böyle bir araca ihtiyacı var mı bilmiyorum ama kitty burada, kullanabilir, karşılaştığınız hataları bildirebilir, istediğiniz yeni özellikleri söyleyebilirsiniz.

Son olarak şunu da söyleyeyim, uygulama acemi ellerde tehlikeli olabilir, bu yüzden kullanırken dikkatli olunuz.
22
May
Subversion en yaygın sürüm kontrol sistemlerinden biridir. Google Code, Pardus gibi pek çok yerde ve projede kullanılmaktadır.
Subversion yeterince harika olmasına rağmen parolaları saklamak için düz metin dosyaları kullanıyordu 1.6 serisine kadar (aslında kaynak yazıda kolay bir yol sunmaya başladı denmiş, yani Subversion bir şekilde şifreli parola kaydetme desteği sunuyor olabilir daha önceki sürümlerinde de, bu konuyu pek araştırmadım).

Bu yüzden eğer göndermek istediğiniz her değişiklikte tekrar tekrar parolanızı girmek istemiyorsanız parolanızın ev dizininde açık seçik durmasına göz yummanız gerekiyordu eskiden. Ben güvenliğe pek önem veremediğim için tembellik hakkımı kullanıyordum Pardus'ta bu özelliğin desteklenmeye başlamasına kadar. Aslında böyle bir özelliğin varolduğundan da zaten Pardus'taki subversion paketinde aktif hale getirilmesiyle haberim oldu.

Subversion'un bu özelliğini kullanmak çok basit ama yine de benim gibi yeni haberi olacaklar için bahsetmek iyi olabilir. Yapılması gerekenler kısaca şöyle:

1. Pardus depolarından subversion'un bir alt paketi olan subversion-plugin-kwallet, Paket Yönetici üzerinden ya da terminalden
$ sudo pisi it subversion-plugin-kwallet
komutuyla yüklenir.

2. Ev dizinin içinde .subversion dizini bulunuyorsa bu dizin silinir. Bunun için Dolphin'de gizli dosya ve dizinleri görünür yaptıktan sonra .subversion dizinini seçip silebilir ya da yine terminal üzerinden
$ rm -rf ~/.subversion
komutundan yararlanabilirsiniz.

3. Şimdi yapmamız gereken tek şey sürüm kontrol sisteminde bulunan bir dizine girmek ve bir deneme yapmak. Bunun için bir metin dosyası oluşturdum ben (ne yaptığımı açıkça belirtmek için echo kullandım yoksa yeni metin belgesi için Kate'den yararlanıyorum, endişeye gerek yok):
$ echo hede > test
4. Sonrasında da oluşturduğum bu dosyayı sürüm takip sistemine ekledim:
$ svn add test
5. Şimdi de sunucuya göndermeyi deneyelim bu küçük test dosyasını:
$ svn commit test
Bu son adımda eğer her şey yolunda gitmişse sizi KDE Cüzdan Yöneticisi'nin karşılaması gerekiyor.
Daha önceden cüzdan kullanıyorsanız yapmanız gereken sadece Her Zaman İzin Ver düğmesine basmak. Dana önceden bir yapılandırmanız yoksa kolayca bir tane oluşturabilirsiniz, yardıma ihtiyacınız olursa Pardus Wiki'deki maddesine ve kendi sitesindeki belgelendirmesine bakabilirsiniz.

Subversion ve KWallet'ın birlikte kullanımıyla ilgili daha fazlası için aşağıdaki bağlantılara bakılabilir:
6. Ben test dosyasını silip
$ svn rm test
$ svn commit test
7. Son olarak da yazıyı yayınlıyorum :)
25
Mar
GNU/Linux terminallerinde (terminal emülatörlerinde) renkli karakterler kullanmak için birkaç farklı yöntem bulunmaktadır. Bunlardan en bilineni NCurses ve türevleri olsa gerek. Diğer bir yaygın yöntem de terminale onun için anlamlı çeşitli özel kodlar göndermektir (rastlantıya bakın ki bu yazının konusu da bu özel kodlardır). Terminal ekranlarında renkli çıktılar almak sadece filmlerde güzel bir sahne çekmek için değil aynı zamanda çıktıların daha kolay okunması için de önemlidir. Örneğin bir derleme işleminin çıktısında tamamlanan işlemler yeşil, uyarılar sarı ve hatalar kırmızı olarak renklendirilse takibi daha kolay olacaktır (bkz: colorgcc).

Şimdi basit bir örnekle kaçış karakterlerini renkli karakterler oluşturmak için nasıl kullanacağımıza bakalım:



echo -e "\033[44;37;5m Merhaba \033[0m Dünya"

  • echo Ekrana herhangi bir karakter dizisi basmak için kullanılabilir.
  • -e echo komutunun kaçış karakterlerini aktifleştirmeye yarayan parametresi.
  • \033 kaçış karakterlerini kullanmaya başladığımızı söylemek için kullanıyoruz.
  • [ terminale gönderdiğimiz mesajın parametrelerini girmeye başladığımızı bildiriyoruz.
  • ; Parametreleri birbirinden ayırmak için kullanıyoruz.
  • 44;37;5m yazıların rengi, özellikleri ve arkaplan rengini ayarlamak için kullanılan örnek değerlerdir. Renk kodları belli bir sıraya bağlı kalınmadan kullanılabilir yani önce arkaplan rengini veya yazı rengini ayarlamış olmanız bir farklılık göstermeyecektir çünkü renk kodları farklıdır. m ile ise yazıya çeşitli ek özellikler kazandırılabilir, ayrıca terminale gönderdiğimiz özel mesajın sonlandığını da bildirmektedir. Kullanılabilecek kodların bir kısmını aşağıdaki listelerden görebilirsiniz:


Yazı renkleri

30  Siyah
31  Kırmızı
32  Yeşil
33  Sarı
34  Mavi
35  Mor
36  Camgöbeği
37  Beyaz


Arkaplan renkleri

40 Siyah
41 Kırmızı
42 Yeşil
43 Sarı
44 Mavi
45 Mor
46 Camgöbeği
47 Beyaz


Yazı özellikleri

0 Tüm özellikleri öntanımlılara döndür
1 Kalın yaz
4 Altıçizili yaz
5 Yanıp söndürerek yaz
7 Video renklerini tersine çevir

Yukarıdaki listelerden yararlanarak ve deneme yaparak, bundan sonra yazacağınız BASH betiklerini renklendirebilirsiniz (örnek bir kullanımı identi.ca göndergeci'nde görebilirsiniz).

Elbette terminale kaçış karakterleri göndererek yapabilecekleriniz sadece çıktıları renklendirmekle sınırlı değil. Yazılacakların terminal ekranının tam olarak neresinde görünmesini istiyorsanız oraya da yazdırabilirsiniz. Yalnız bu tip imlecin veya çıktıların yerini değiştiren kodları kullanmadan/kullandıktan önce/sonra ekranı temizlemek iyi olacaktır. Ekranı temizlemek için şu iki (veya sizin keşfettiğiniz başka bir) komuttan yararlanabilirsiniz:

clear
echo -e "\033[2J"

Terminalde çıktıyı konumlandırmak için gerekenleri yine basit bir örnek üzerinde inceleyelim, aşağıdaki komut terminalin onuncu satırının beşinci sütunundan başlayarak Merhaba Dünya yazacaktır:

echo -e "\033[10;5H Merhaba Dünya \033[0m"



Eğer daha fazlasını istiyorsanız aşağıdaki anahtar ifadelere ve komutlara bakabilirsiniz:




tr -c "[:digit:]" " " < /dev/urandom | dd cbs=$COLUMNS conv=unblock | GREP_COLOR="1;32" grep --color "[^ ]"

yes "$(seq 232 255;seq 254 -1 233)" | while read i; do printf "\x1b[48;5;${i}m\n"; sleep .01; done

// renkli-merhaba.cpp
// g++ renkli-merhaba.cpp -o renkli-merhaba
// ./renkli-merhaba

#include >iostream<
#include >cstdlib<

int main()
    {
    system("clear");
    std::cout << "\033[32;1mRenkli Merhaba\033[0m" << std::endl;
    }



Kaynaklar:

  1. Terminal colour highlights
  2. Colour on text terminal
  3. Konsol Programlarında Çıktı Renklendirme ve GotoXY


5
Mar

Tam iki sene önce yani ben daha lise hayatıma yeni başladığım zamanlarda, Python öğrenme çabalarım sürüyordu. O günlerde öğrendiğim yeni şeyleri oturup, uygulamam akılda kalması için ve pratikleşmem için çok gerekliydi. Ben de bir oyun yapayım dedim. Arkadaşlarımla nasıl bir şey yaparız diye fikir yürütürken en son aklıma – Bir odadan kaçış oyunu yapalım, karakter bir şekilde odadan kaçmaya çalışsın, kendini yesin, şeklinde bir konsept geldi.

Nasıl yapılır demeden oturup, direk başladık. Henüz Okan ile Furkan’ın Python’dan haberi olmadığı sıralarda oturup ana harita çizimleri yapıp, üzerinde x,y de hareket ettirdim. Hikaye konusunda fikirlerini alarak bilgisayar odasında çalışarak bitirdiğimiz,(inanılmaz bir şekilde ilkeldi, o yüzden kayboldu diyebilirim.(görmek bile istemiyorum)) projemizin adı F(urkan)O(kan)D(oğan) projesi oldu. Google Code sayfası fod-project idi. Neyse bir sene sonra Furkanlar Eskişehir’e taşındıklarında OD – project olarak kaldık. Baş harfi eksikti.

Yeni proje arayışlarıda olan ben, bir ada-yaşam oyunu yapalım diye bir fikir ortaya attım. Kareli deftere haritayı çizdik. Okan artık Python hakkında az da olsa bilgiliydi. Okan’a harita tasarımcılığını üstlendi. OD olarak kalan projenin başına Mert’in (sözde) katılması ile proje “mod-project” oldu. (hala adı da öyle)

İşleri svn deposundan götürdük. Kayıtlara şuradan(ilk zamanları) bakabilirsiniz. Yeni öğrendiğim dictionary(sözlük) nesnesini kullanarak şöyle bir harita sistemi oluşturdum.

elf.map11 = {
“15,2″:[ "             ___","            /  X","         __/    ","        /       ","   ____/        ","  (             "],
“14,2″:[ "             ___","            / X ","         __/    ","        /       ","   ____/        ","  (             "],

gibi  bir yapısı vardı. Yani x,y’de kordinatı veriyordunuz o konumda X’in durduğu haritayı alıyordunuz. Bu zahmetli yazım işini Okan üstlendiği için benim için pek problem olmadı. Ama bu tüm yapı hem zaman kaybı hem de büyük bir karmaşıklığa sürükledi oyunu.  mod-tra yani mod-training aslında haritası planladığımızdan küçük olan ve bizim için denemelik alt proje idi. En son bütün bir karmaşıklık beni deli etti. Her şey birbirine girdi sinirlenip geliştirmeye ara verdim. Zaten M ve O’da pek oralı olmamıştı. :)

Bu arada ben, o mod-project deposunu çok ilginç denemelerde kullandım. Örneğin QTCPServer kullanarak internet üzerinden oynanabilen bir taş-makas-kağıt oyunu yaptım. (Sunucu tarafında yaptığım hileden sinirlenen arkadaşlarımın hala o “Nasıl ya?” diyişleri kulaklarımda)

Okan da bu arada “Rus Ruleti” çalışmalarına başladı “Ek” klasörü altında. Ben de PyQt denemelerime devam ettim. En son mod-xml diye XML’den de haritayı çağırıp üzerinde oynatabilmiştim.

Ocak ayında Okan ile eski günlerin anısında mod-xmlv2 yapalım dedik. O bir daha harita tasarımcısı oldu. Oturdu uğraştı. XML biçimini değiştirdi. Ben de mini bir oyun motoru yazdım. W-A-S-D-E-Q ile anında konsoldan oynanabilen, oyun bitişinde şu kadar saniye de kaçtın diye zevkli bir oyun denemesiydi. Oyun motoru aslında oyun yapmak isteyenler için örnek olabilir, hatta istediğiniz büyüklükte harita yapabilirsiniz. Onun dışında en son oyunu bitirdiğimizde aklımda XML’de oyunu bitirebiliriz gibi fikirler geldi. Tüm o karakter hareketlerini vs. Kısacası yeni bir dil gibi bir şey olacaktı. Ama zaman yetmedi.

Şu an oyunu proje sitesinden svn ile çekip mod-xmlv2′den oynayabilirsiniz.(mod-project’in M’si olan Mert ise 14 saniyelik rekorunda çok iddaalı.)

Oyunun hikayesinden sonra biraz teknik detaya inersek oyun, XML’i okuyan minik bir motoru var. Bu parça XML’deki tagleri parçalayıp alan ve harita olan kısmı okuyan bölüm. xml.dom.minidom ile yapıldı. Oyun aslında gitmek için sadece bir ileride verdiğiniz ilerleme komutuna bağlı olarak kordinatın yürünebilir (-,/ vs) işareti olmayan yer varsa boşluk ise yürüyor. Nesneler Y(yatak), M(masa) şeklinde isimlendirilmiş şekilde. Üzerine geldiğinizde nesne hakkındaki bilgiler, eğer yapabiliyorsanız masanın altına bakabiliyorsunuz. En son odadan çıkmaya çalışıyorsunuz.

Mantık olarak böyle biz yaparken çok eğlendik, denerseniz sizde eğlenebilirsiniz. Oyun projeleriniz varsa alıp, bu mini oyun motorunu ilham alarak(ya da direk kopyalayıp) kendi oyununuzu yapabilirsiniz. Bizim 3 senedir uğraştığımız, en doğru yöntemi nasıl buluruz diye harcadığımız 3 yılı kazanabilirsiniz. (Baya ara verdik ondan 3 sene oldu.)

Bu arada sadece tek bağımlılığı var o da Python :) Konsoldan güzel güzel oynamanızı ve odadan kolay kaçmalar diliyorum.

svn checkout http://mod-project.googlecode.com/svn/trunk/ mod-project

‘i konsola yazıp direk indirebilirsiniz.

(Bunu unutmadan yazmam gerekiyordu. :) )

19
Şub

Bir önceki dersimizde qt creator’u kurmuş bir iki şeye göz gezdirmiştik. Şimdi bir uygulama yaparak bir şeyler daha öğrenelim. Bir iki not ile başlayayım işe pardus 2011 sürümünde qt creator’un son sürümü bulunuyor, elle indirip kurmanıza gerek yok, paket yöneticisinden kurabilirsiniz.

Genel Bilgiler

Biraz qt ile ilgili temel şeylerden bahsedeyim. Qt sınıfındaki her şey QObject‘ten türemiştir. Görsel şeyler(tabwidget, label), QObject’ten türemiş QWidgetlerdir. Yani bir QLabel hem qobjectin hem de qwidget’in özelliklerini barındırır.

Derleme işleminden bahsedeyim. Derleme için qmake, make kullanılır. Tabii biz qt creator kullanacağımız için derleme işlemini ctrl + r ile halledeceğiz :)

Basit Bir Örnek

Qt Creator’den File->New File or Project->Qt GUI App. -> Gerekli adımları tamamladıktan sonra yeni bir proje oluşacak.

Şimdi içeriğine bakalım: en üstte bir dizin simgesi var ve yanında projenizin adı var. Bu projeniz :) . Altında bir .pro dosyası var. Bu önceki dersimde dediğim gibi proje dosyanız, proje bilgilerini içinde tutuyor. Onun altında 2 dizin daha var. Sources ve Headers. Bunlar projelerinizin kaynak dosyaları ve başlık dosyalarının dizinleri. Sourcesin içindeki main.cpp dosyası programınızı çalıştırmaya yarayan dosyadır(önceki derse bakın.). Headers’ın içindeki mainwindow.h dosyası Sources’in içindeki mainwindow.cpp’nin başlık dosyasıdır. En altta da Forms dizini bulunmakta. Buda formlarınızın bulunduğu dizindir. Buradaki formlar .ui uzantılıdır..ui dosyaları tasarım dosyalarıdır. Qt Creator derleme yapaken bunları c++ koduna otomatik olarak çevirir.

Şimdi basit bir metin not defteri uygulaması yapalım. Ama önce:

Sinyal/Slot Olayı

Örneğimize devam etmeden önce  sinyal slot kavramı üzerinde duralım. Nedir bu? Örneğin formunuzda bir button var. Buna tıkladığınızda bir şeyler yapmasını istiyorsunuz. Yani buttona tıklandığında bir sinyal çıkıyor ve o sinyali bir slot’a bağlayarak işlemlerimizi yapıyoruz. Peki neyi nasıl bağlarız:

connect(dugme, SIGNAL(clicked()), this, SLOT(close()));

Burada örnek olarak dugme’nin clicked() olayını this’in(yani formumuzun) close() olayına bağladık. Yani dugme’ye basıldığında formumuz kapanacak.

Örneğe Devam

Forms altındaki mainwindow.ui’ye çift tıklayalım ve aşağıdaki gibi bir form oluşturalım:

Bunları yaptıktan sonra Dosya Oku butonuna sağ tıklayıp -> Go to slot..’a basın. Select Signal penceresi gelecek oradan da clicked()‘a çift tıklayın. Böylece pushButtonun tıklanma olayını boş bir slota bağladık.(Üstteki anlattığım connect işlemini kendi otomatik ayarladı.) Ve bizi slotun içine yönlendirdi.

void MainWindow::on_pushButton_clicked()
{
}

Kodlarımızı bunun içine yazacağız artık.

QString str = QFileDialog::getOpenFileName(this, "Açılacak dosyayı seçin", ".", "Metin dosyaları (*.txt)");
QFile file(str);
file.open( QIODevice::ReadOnly | QIODevice::Text );
ui->plainTextEdit->setPlainText(file.readAll());
file.close();

1. satırda bir dosya açma diyaloğu gösterdik ve burdan gelecek dosya adını str’ye eşitledik. 2. satırda file adında bir QFile oluşturduk ve dosya yolunu str olarak belirledik. 3. satırda dosyamızı sadece okumak için açtık. 4. satırda plainTextEdit’e dosyanın içeriğini okuduk. 5. satırda da dosyamızı kapattık.

Çok biliyormuşum gibi bir şeyler anlatmaya çalıştım, yanlışım olmuş ise uyarırsanız, anlamadığınız yer olursa yazarsanız sevinirim. Yeni bir derste görüşmek üzere iyi günler :)

14
Oca

Ofiste sürüm telaşı var. Haftaya çıkacak olan 2011 için herkes harıl harıl çalışıyor. Benim işlerim( bir sonraki blog yazımda onlardan bahsedeceğim) bittiği için Fatih’in yanına gidip yapabileceğim bir şeyler var mı diye sorunca, bana bu hatadan bahsetti. Bu sabah iki saat süren güzel bir araştırmanını sonunda çözmüştük. Teker teker nasıl çözüldüğüne dair bir yazı yazdım yine. Başlayalım.

Hata nedir ?

Pardus 2011′de bazı ekran koruyucuları çalışmıyor. Tıkladığınızda siyah bir ekran çıkıyor. Yani çalışmıyor. Bununla ilgili bir hata kaydı girilmiş (Bug 15578 – Ekran koruyucuların bazıları çalışmıyor ). Aşağıdaki resimde görebileceğiniz gibi ilk bölümdeki “Değişen Çizgiler” adındaki ekran koruyucu siyah bir şekilde gözüküyor

Elimizde ne var ?

Hata kaydında hangi ekran koruyucuların çalışmadı bilgisi var. Bunun dışında ekran koruyucuları oluştusan xscreensaver paketçisi olan Fatih Aşıcı‘nın bir yorumu mevcut: “Bu ekran koruyucular xscreensaver paketinden çıkmamaya başlamış. Pakette yanlış bir şey olup olmadığına bakayım.”

Çözüm

Sistem ayarlarında “Ekran ve Monitör” kısmında “Ekran Koruyucu” ile ekran koruyucularını seçebilir ve değiştirebiliriz. Bazı ekran koruyucuların neden çalışmadığına bakmak için doğrudan sadece bu modülü çalıştırıp bakmak gerekiyor. Sistem ayarlarında her ayarlama ünitesi aslında birer bağımsız bir uygulama. Bunları

kcmshell4 --list

ile görebilirsiniz. Buraya göz atınca “screensaver” diye bir modül olduğunu göreceksiniz. Bunu konsoldan doğrudan

kcmshell4 screensaver

ile çalıştırabilirsiniz. Çalıştırınca da “Ekran Koruyucu” olarak söylediğim pencerenin aynısı çıkıyor. Şimdi bu ünitenin ismini öğrendiğimiz göre ,kaynak kodlarını araştırmaya başlayabiliriz. Bu paketler genellikle kdebase-workspace ve kdebase-runtime paketlerinden çıkıyor. Ben kdebase-workspace paketini açıp içinde “screensaver” ismini aratınca karşıma şunlar çıkıyor:

find -iname screensaver
./kcontrol/screensaver
./plasma/design/screensaver
./plasma/screensaver
./plasma/screensaver/containments/screensaver
./doc/kcontrol/screensaver
./krunner/screensaver

görüldüğü gibi screensaver ile ilgili birden fazla klasör var. Bizim sorunumuz sistem ayarlarında olduğu için “kcontrol” klasörüne girip orayı kurcalamaya başladım. Birden fazla dosya olsa da, genelikle bu KDE modüllerinin bir ana dosyası olur. Bunların isimlendirmesi de kcmMODULISMI.cpp ya da main.cpp şeklinde. Fakat screensaver ile ilgili bu şekilde bir dosya yoktu. Ama klasör içinde .cpp dosyaları zaten azdı ve isimlere bakarak scrnsave.cpp dosyasının doğru olacağını düşünerek açtım.

Arayüzü oluşturan kodlar ana sınıfta olacağından oraya göz atmaya başladım. Şimdi diyeceksiniz ki, KDE ya da QT bilmek gerekiyor mu kodu anlamak için? Kesinlikle Hayır! Eğer başka dillerde bir iki syntax biliyorsanız hemen hemen her kodu okuyabilirsiniz. Mesela bu ana sınıfta şöyle bir kod parçası var:

mSaverListView->setColumnCount(1);
mSaverListView->header()->hide();
mSelected = -1;
connect( mSaverListView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(slotSetup()));
connect( mSetupBt, SIGNAL( clicked() ), SLOT( slotSetup() ) );
connect( mTestBt, SIGNAL( clicked() ), SLOT( slotTest() ) );
mEnabledCheckBox->setChecked(mEnabled);
connect(mEnabledCheckBox, SIGNAL(toggled(bool)), this, SLOT(slotEnable(bool)));
mWaitEdit->setRange(1, INT_MAX);
mWaitEdit->setSuffix(ki18ncp("unit of time. minutes until the screensaver is triggered", " minute", " minutes"));

Bu koda mSaverListView bizim aramamız gereken kısım. Yani ekran koruyucuları oluşturan kısım muhtemelen. Burada muhtemelen diyorum çünkü ben şu an bunun ne yapacağını bilmiyorum. Ama isimden yola çıkarak ve arayüzde sadece bir liste olduğunu düşünürsek bu yolun yanlış olmayacağını düşünebiliriz.

Şimdi koda (scrnsave.cpp) de bu değişken ismini aratınca karşımıza birden fazla fonksiyonda karşımıza çıktığını göreceksiniz. Bunlara yine şöyle göz atınca bir iki ipucu alabiliyoruz.

void KScreenSaver::findSavers()
{
if ( !mNumLoaded ) {
    mSaverServices = KServiceTypeTrader::self()->query( "ScreenSaver");
    new QTreeWidgetItem ( mSaverListView, QStringList(), 18n("Loading...") );
if ( mSaverServices.isEmpty() )
   mLoadTimer->stop();
else
   mLoadTimer->start( 50 );
}
for( KService::List::const_iterator it = mSaverServices.constBegin();
it != mSaverServices.constEnd(); it++,mNumLoaded++)
{
SaverConfig *saver = new SaverConfig;
QString file = KStandardDirs::locate("services", (*it)->entryPath());
if (saver->read(file)) {
    mSaverList.append(saver);
} else
    delete saver;
}

Bakınız yine kodun ne yapacağını anlamamıza gerek yok. Önemli olan sorunun nereden kaynaklandığına bakmak. Mesela yazımın başında da belirtiğim gibi, xscreensaver’de bazı paketler eksik olduğunu söyledi Fatih Aşıcı.

Ben ise olaya biraz farklı baktım. Madem bu paketler eksik, neden listede biz bunları görüyoruz ? Listeyi oluşturan nedir ? Oluşturuyorsa neye göre oluşturuyor ?

Yukarıda koda bakınca şu satır göze çarpıyor:

QString file = KStandardDirs::locate("services", (*it)-&gt;entryPath());

file adında bir değişken oluşturuyor. Bunu da KDE’nin standart dizinlerinden biri olan “services” klasöründen oluşturuyor (bakınız kodun ne anlama geldiğine yine bakmadım, ama değişken isimleri zaten kendini anlatıyor)

Bundan sonra bu dizinlerin nerede olduğunu bakmaya karar verelim. Genelikle kde paketlerinin veri dosyaları /usr/share/kde4 altın atılır. Bu dizine girdiğimizde ise “services” diye bir klasör olduğunu görececeğiz. Hatta bu klasörün içinde “ScreenSavers” adında bir klasör mevcut ve klasörün içeriği de şu şekilde devam ediyor:

[/usr/share/kde4/services/ScreenSavers ]$ ls
abstractile.desktop   decayscreen.desktop     halo.desktop            loop.desktop          rubik.desktop
anemone.desktop       deco.desktop            helix.desktop           m6502.desktop         sballs.desktop
anemotaxis.desktop    deluxe.desktop          hopalong.desktop        maze.desktop          shadebobs.desktop
...

Onlarca desktop dosyası mevcut. Demek ki ekran koruyucu listesini bu dosyalar oluşturuyor. Daha doğrusu “Ekran Koruyucu” modülü listeyi buradaki dosyalardan oluşturuyor. Bu desktop dosyaların İçeriği ise şu şekilde:

[Desktop Entry]
Exec=xflame
Icon=kscreensaver
Type=Service
X-KDE-ServiceTypes=ScreenSaver
TryExec=xscreensaver
Actions=InWindow;Root;Setup;
X-KDE-Category=Gadgets;Simulations
...

Burada “Exec=” ile başlayan kısımlar ekran koruyucusunun uygulama isimlerini gösteriyor. Yani bu dosyalar çağırılıyor. “Ekran Koruyucu” modülünde, listede herhangi bir ekran koruyucusuna tıkladığınızda işte buradaki Exec komutları çalıştırılıyor. Exec komutlarında belirtilen ekran koruyucuları da xscreensaver paketi ile beraber geliyor. O zaman bu dizinin içeriği ile xscreensaver’den çıkan paketleri karşlılaştırınca. Bakalım neler göreceğiz.

Konsolda dünyanın en iyi metin düzenleyicisi olan Vim’i açıp (swh), “ex” modunda

:vs

yazarak iki tane temiz pencere açalım

Ardından xscreensaver’den çıkan çalıştırabilinir dosyaları doğrudan vimin ilk penceresine yapıştıralım. Vim’de bash komutlarını doğrudan çağırıp, çıktılarını yapıştırabilirseniz. “ex” modunda şu komutu çalıştırmak yeterli

:r !pisi info xscreensaver -F |grep libexec

İkinci pencereye geçip (Ctrl-W, W) , bu sefer /usr/share/kde4/services/ScreenSaver içeriğini yapıştıralım. “Ex” modunda şu komutu çalıştırdım bu sefer:

:r !ls /usr/share/kde4/services/ScreenSavers/

Güzel olan ise desktop dosyalarını isimleri ile xscreensaver’den çıkan ekran koruyucu uygulamalarının ismi aynı. Tek yapmamız gereken bu isimleri karşılaştırmak. Fakat resimde de gördüğünüz gibi ilk pencerede her satırın başında dizin yolun adresleri mevcut. ikinci pencerede de dosyalar .desktop dosyası ile başlıyor.

Hepsini tek tek değiştirmiyorum tabi :) Elimizde Vim gibi şahane bir uygulama var, neden kullanmayalım ? (Vim konusunda biraz fanatikliğim var, özür). Vim’de de macrolar mevcut. “qa” tuşu ile macroyu başlatıp, bir takım işler yapıp “q” ile kapatabilirsiniz. Sonra bu kaydedilen makroyu her satırda “@a” ile çağırabilirsiniz. “a” ise macronun içeriğini kaydeden belleğin ismi. İlk pencerede her satır için yapmamız gerekenler şunlar (vim komutularıyla beraber)

  1. Satırın sonuna gitmek. Vim komutu: “$
  2. Sonra bir kelime geriye gitmek. Vim komutu : “b
  3. Kelimenin başlangıcından sonuna kadar silmek. Vim komutu: “d0
  4. Bir alt satıra inmek – Vim komutu: “j

Evet üç tane hamle ile bunu güzelce halledebiliriz. Bunları sırayla yaptıktan sonra tekrar “q” tuşu ile macroyu kapatacağım. Tüm satırlar için ex modunda

:%norm! @a

çalıştırınca aşağıdaki sonucu elde ediyoruz:

İkinci pencere için ise yine bir macro oluşturuyoruz. Her satır için yapmamız gerekenler ise

  1. Satırın başına gelmek – Vim komutu: “0
  2. Satırda . ile başlayan konuma gelmek . Vim komutu: “f.
  3. Sonra bu konumdan satırın sonuna kadar silmek Vim komutu: “d$
  4. Bir alt satıra inmek – Vim komutu: “j

:%norm! @a çalıştırınca aşağıdaki sonucu elde ediyoruz:

Evet şimdi yan yana iki tane liste elde ettik. Bunları kaydedip vimdiff ile açabilirdik. Ki genelikle öyle yapılır. Fakat bu şekilde iki tane pencere açıkken de diff komutunu kullanabilrsiniz. Yapmamız gereken “ex” modunda şu satırı yazmak:

:windo diffthis

Sol tarafta xscreensaver uygulamaları görülüyor. Sağ tarafta ise /usr/share/kde4/services/ScreenSavers altındaki desktop dosyaları. Buradan görüldüğü gibi desktop dosyalarında fazlalıklar var (yeşil olanlar). Yani var olan desktop dosyaları var fakat ona karşılıklı gelen xscreensaver ekran koruyucuları mevcut değil. Hata’da buradan kaynaklanıyor.Bazıları çalışmıyorsa, sistemde kurulmadığı anlamına geliyor. Peki sistemde kurulu olmayan bir ekran koruyucu için neden bu dosyalar oluşuyor ? Bu dosyalar nerden geliyor o zaman ?

Pisi’nin bununla ilgili çok güzel bir komut var, rastgele bir dosya üzerinde bu komutu çalıştırınca:

pisi sf /usr/share/kde4/services/ScreenSavers/boxed.desktop
Searching for /usr/share/kde4/services/ScreenSavers/boxed.desktop
Package <strong>kdeartwork-screensavers</strong> has file /usr/share/kde4/services/ScreenSavers/boxed.desktop

Bu paketin hangi bileşene ait olduğunu öğrenmek için de pisi info çalıştırıyorum:

pisi info kdeartwork-screensavers
Installed package:
Name                : kdeartwork-screensavers, version: 4.5.5, release: 43
Summary             : Additional KDE4 screensavers
Description         : Contains additional screensavers for KDE4.
Component           : desktop.kde.base

Bileşenin desktop.kde.base olduğunu görünce svn deposunda o dizine girdim. Kdeartwork-screensavers adında bir klasör mevcut değildi fakat kdeartwork klasörü mevcut idi. Bu paketin pspec.xml dosyasına bakınca kdeartwork ile gelen bir alt paket olduğunu görünce paketi açıp devam ettim:

pisi bi pspec.xml --unpack

/var/pisi/ altında kaynak kodunun dizinine girdiğimizde hiç bir şey aratmadan kscreensaver klasörü gözüme çarptığı için oradan başladım devam etmeye. Bu sefer doğrudan .desktop aratarak, bu dosyaların neden oluştuğuna veyahut da nasıl oluştuğunu öğrenmek istedim. Arayınca şunlar çıktı:

grep -rHIin desktop .
./kxsconfig/ScreenSavers/truchet.desktop:1:[Desktop Entry]
./kxsconfig/ScreenSavers/decayscreen.desktop:1:[Desktop Entry]
./kxsconfig/ScreenSavers/photopile.desktop:1:[Desktop Entry]
./kxsconfig/ScreenSavers/jigglypuff.desktop:1:[Desktop Entry]
...

Şeklinde desktop dosyaları mevcuttu. Bunlar bizim desktop dosyalarının ta kendisi. Bu yüzden kxsconfig klasörüne girip oraları kurcalamaya başladım. Klasörün içindeki CMakelists.txt dosyası çözümün ta kendisiydi:

########### install files ###############

FILE(GLOB _desktopfiles "ScreenSavers/*.desktop" )
foreach(_currentdesktopfile ${_desktopfiles})
·   STRING(REGEX REPLACE ".desktop" "" _newitem "${_currentdesktopfile}" )
·   #MESSAGE(STATUS "newItem &lt;${_newitem}&gt;")
·   GET_FILENAME_COMPONENT(_screensaverName ${_newitem} NAME_WE)
·   MESSAGE(STATUS "name without extension &lt;${_screensaverName}&gt;")
·   find_file(XSCREENSAVER_FILE_FOUND ${_screensaverName}.xml PATHS ${XSCREENSAVER_CONFIG_DIR} )
·   if(XSCREENSAVER_FILE_FOUND)
·   ·   MESSAGE(STATUS "xscreensaver name ${_screensaverName} found")
·   ·   install(FILES ${_currentdesktopfile} DESTINATION  ${SERVICES_INSTALL_DIR}/ScreenSavers )
·   else(XSCREENSAVER_FILE_FOUND)
·   ·   MESSAGE(STATUS "xscreensaver name ${_screensaverName} not found")
·   endif(XSCREENSAVER_FILE_FOUND)
endforeach(_currentdesktopfile ${_desktopfiles})

Burası tam olarak düşündüğüm şeyi yapıyordu. Desktop dosyalarının ismini XSCREENSAVER_CONFIG_DIR altından bakıyor ve eğer aynı dosya varsa gidip “desktop” dosyasını kuruyor.

İşte bütün sorun burada. Sorun şu ki, bu betik her koşulda tüm desktop dosyalarını yüklüyor. Xscreensaver’den çıkan ekran koruyucularını hiçe sayıyor. Yukarıdaki şu satırlarda sorun var yani:

find_file(XSCREENSAVER_FILE_FOUND ${_screensaverName}.xml PATHS ${XSCREENSAVER_CONFIG_DIR} )
if(XSCREENSAVER_FILE_FOUND)
...

Tam olarak hatayı görmek için cmake’in MESSAGE komutu ile şu şekilde yazıp Makefile’ı çalıştırıyorum tekrardan:

find_file(XSCREENSAVER_FILE_FOUND ${_screensaverName}.xml PATHS ${XSCREENSAVER_CONFIG_DIR} )
MESSAGE(STATUS ${XSCREENSAVER_FILE_FOUND} )
if(XSCREENSAVER_FILE_FOUND)
...

Aldığım sonuç ise şu şekildeydi.

-- /usr/share/xscreensaver/config/compass.xml
-- xscreensaver name truchet found
-- name without extension
-- /usr/share/xscreensaver/config/compass.xml
-- xscreensaver name decayscreen found
-- name without extension
-- /usr/share/xscreensaver/config/compass.xml
-- xscreensaver name photopile found
-- name without extension
-- /usr/share/xscreensaver/config/compass.xml
-- xscreensaver name jigglypuff found

Burada “compass” ile bitenler bizim XSCREENSAVER_FILE_FOUND değişkenin değeri. Gördüğünüz gibi aslında bu değişken her file_find komutu çağırıldığında değişmesi gerekiyordu. Fakat bizde değişmiyor

Peki neden ?

Fatih Aşıcı ve Gökçen Eraslan ile bu konuya bakarken, Gökçen şu komutu file_find’dan önce yerleştirmemizi söylemişti

unset(XSCREENSAVER_FILE_FOUND CACHE)
find_file(XSCREENSAVER_FILE_FOUND ${_screensaverName}.xml PATHS ${XSCREENSAVER_CONFIG_DIR} )

Bu şekilde tekrar make komutunu çalıştırdığımda şu çıktıyı almaya başladım

-- name without extension
-- /usr/share/xscreensaver/config/truchet.xml
-- xscreensaver name truchet found
-- name without extension
-- /usr/share/xscreensaver/config/decayscreen.xml
-- xscreensaver name decayscreen found
-- name without extension
-- /usr/share/xscreensaver/config/photopile.xml
-- xscreensaver name photopile found
-- name without extension
-- /usr/share/xscreensaver/config/jigglypuff.xml

Evet görüldüğü gibi artık XSCREENSAVER_FILE_FOUND değişkeni güzel bir şekilde değişmeye başlamıştı. Bu satırı ekleyip baştan derletip kdeartwork’u kurunca herşey güzelce çalıştı. Peki bu satırı neden eklememiz gerekiyordu ?

Cmake’de file_find komutunun yardım dosyasını şu şekilde açarak:

cmake --help-command find_file

Aşağıdaki kısmı okuyunca her şey daha iyi anlaşıldı:

This command is used to find a full path to named file.  A cache entry
named by <var> is created to store the result of this command.  If the
full path to a file is found the result is stored in the variable and
the search <strong>will not be repeated unless the variable is cleared</strong>. </var>

Yani file_find komutu ilk bulduğu değeri belleğe atıp kaydediyor. Ondan sonraki değerleri hiçe sayıyor. Bellekteki değeri silmemiz bekliyor.”unset” komutu ile işte bu değişkeni bellekten siliyor tam olarak. Paketi yamalayarak sisteme kurduktan sonra aşağıda “Ekran Koruyucu“yu açtığımda gördüğünüz gibi “Değişen Çizgiler” ekran koruyucusunun yok olduğunu görürsünüz:

Hepsi bu kadar. Yine bir satırlık bir yama ama gördüğünüz gibi bir çok şeyi değiştiriyor. Bunun gibi yüzlerce hata çözüldüğünü, çok daha eksantrik olanların olduğundan bahsetmeye gerek yok herhalde. Bazıları gerçekten çok zaman alabiliyor. Örneğin benim yazdığım bir diğer yazımdaki hata 2-3 günümü alırken, bu hata 2 saatimi almıştı. Biraz da o anki ruh halin de etkisi olabiliyor herhalde.

Bu arada yukarıda anlatıklarımın çoğu sesli düşünce. Hataya bakarken belki yüzlerce komut kullanıyorsunuz, vim macrolarını aslında çok hızlı bir şekilde yazıyorsunuz. Ben sadece adım adım neler yapıldığını ve nerelere gidebileceğini gösterdim yine. Vim ile yaptığım düzenlemelerde biraz ayrıntıya girdim biliyorum, fakat onu da macro ve iki dosya arasındaki karşılaştırma olayların sıkça yapıldığından biraz ipucu şekilde olsun dedim.Sorularınız varsa daha detaylı anlatabilirim.

28
Ara
qbasic gorillas'ı hatırlayan var mıdır bilmiyorum ama şu an çokça oynanan ve sevilen oyunlara ilham kaynağıdır kendisi. İsteyenler QB64 ile derleyip kullandıkları işletim sisteminde tekrar oynayabilir.

Derlemeyle uğraşmak istemeyenlerse Flash sürümünü şuradan oynayabilir.

Asıl güzel haberiyse sona sakladım. YouTube'de 3D qbasic gorillasGorillas GDI Demo gibi videolara bakarken bir yeniden yapım dikkatimi çekti. İsmi Gorillas.



QBasic için yazılmış Gorillas'ın iPhone, iPod touch vb. cihazlar için yazılmış açık kaynak bir portu. Proje sayfasına şuradan ulaşabilirsiniz. Aktif bir proje gibi duruyor. Apple ürünlerine sahip olanlar kesin bir baksın derim. Ben de gorillas.py'ye bakayım, çalıştırabilecek miyim.
13
Eyl

Bilgisayarımla aramda gerçekten bir bağ oluşmaya başladı. Aslında geç bile. Sonuçta birbirimizi üç yıldır tanıyoruz. Acı tatlı birçok günümüz ve gecemiz geçti onunla. Bazen ben onu üzdüm, bazen o beni üzdü. Bazen de başka insanlar ikimizi birden üzdü. Bunca zaman geçtikten sonra bilgisayarıma bir isim koymaya karar verdim. Neden derseniz; küçük bir hikayesi var. Bu bayramda evimize gelen dayımın arabasına isim takmış olduğunu öğrenince baba tarafında gelme bir adet olduğu üzere "Arabaya isim mi konur, çağırınca gelecek mi sanki?" (bunun da hikayesi var ama konuyu fazla dağıtmayacağım) diye karşılık verdim. Ama anne tarafında adet öyle olmayacak ki dayım "Öyle deme, eşyalara da isim konur. Ona değer verdiğini gösterir bu. Eşyanın ömrü de uzar." dedi ve ben düşünmeye başladım. Yeni bir ney aldığımız zaman ona okuduğum, okşadığım, sevgiyle muamele ettiğim olmuştu ama diğer eşyalarla aramda böyle bir ilişki olmamıştı. Sonunda bilgisayarımın da bu ilgiyi hak ettiğini düşündüm ve ona bir isim koydum: Çapar. Bu isim bilgisayarımın harap haline uygun düşer dedim. Sonra küçük bir araştırmayla bizim şekilsiz, bozuk, biçimsiz, tipsiz gibi anlamlara getirdiğimiz çapar sözcüğünün albino anlamına geldiğini ayrıca Türkmence’de ulak, haberci, müjdeci gibi anlamlara geldiğini öğrendim. Hepsi de gider benim bilgisayarıma. Üstelik çağırınca da geliyor. Hatta roota yalakalık bile yapıyor. Yakında başka şeyler de öğrenecek.


25
Tem

Siz de değişken yazarken seç yerine sec, üst yerine ust büyük yerine buyuk içinde_mi yerine icinde_mi yazmaktan sıkıldınız mı? O zaman python++ ile sorunlarınıza elveda deyin.

Python++ ne yapıyor?

Bu küçük program size hep aradığınız rahatlığı yaşatacak. Artık değişken isimlerinizde çşğüİıö kullanabileceksiniz. Tek yapmanız gereken kodunuzu python++’ya yollamak. O sizin için çşğüöİı yerine __ koyarak yeni bir cikti.py hazırlar ve çalıştırır.

Nasıl yapıcam?

Şimdi bu kodları python++.py adındaki bir dosyaya yazıp kaydedin ve çalıştırabilme izni verin (konsolda chmod +x python++.py). Ve daha sonra /usr/bin/python++ diye kopyalayın (konsolda sudo cp python++.py /usr/bin/python++ yazıp kullanıcı parolanızı girerek yapabilirsiniz). İşte kodlar:


#!/usr/bin/python
#-*- coding:utf-8 -*-

import os,sys
yol=sys.argv[1]

gir=open(yol,'r')
cik=open("cikti.py",'w')

kod=gir.read()
tirnak=False
for c in kod:
    if c=='"':
	tirnak=not tirnak
	cik.write(c)
	continue

    if tirnak:
	cik.write(c)
	continue

    if not "çÇşŞİıöÖğĞüÜ".count(c)==0:
	cik.write("_")
	continue

    else: cik.write(c)

gir.close()
cik.close()
os.system("python cikti.py")
  

Artık hem çiçek yazabileceksiniz hem böcek. Ama birkaç eksiğimiz var. Mesela karakter katarı içinde çift tırnak kullanamazsınız. Tek tırnak sorun olmuyor. Ve karakter katarlarını tek tırnakla belirtmeyin. Yoksa onların içindeki "çğşıİöü" "__" haline gelir. Hepinize kolay gelsin.


11
Tem

Geçenlerde biri bana NetLogo programlama dilinden bahsetti. Çok basitmiş, tamamen görselmiş, eğlenceliymiş… Bir bakayım demiştim fırsat bulunca yükledim incelemeye başladım. Ama neyi inceleyeceksin? Örnek çalışmaları bile açamadım. Project yerine Model yazarlarsa böyle olur tabii.
Neyse, daha sonra üç gramdan biraz fazla (Uğur Can’ın kulakları çınlasın) olan İngilizce’mle http://ccl.northwestern.edu/netlogo/docs/ adresindeki Tutorial yazılarını anlamaya çalıştım. İlk bölüm “Models” diye bir şeymiş. Dedim ya Project’in laciverti gibi bir şey. Hızlıca geçtim. İkinci bölüm “Commands” aynı bizim fonksionlar gibi onu da “Ne zaman sözdiziminden bahsetmeye başlayacak?!” diyerek hızlı hızlı geçtim. Bu arada katnak kodlara bakıyorum ama bir şey anladığım yok. Sadece [ ] karakterleri kod bloklarını gösteriyor onu anladım.
Neyse, üçüncü bölüm “Procedures”. Ve “da da da dan” gibi bir ses çıkarıyorum içimden çünkü nihayet “select New from File menu” yazısını görüyorum. En başından başlıyoruz programa. Buton ekleme pek de garip gelmedi zaten bir baksan anlardın. Sonra fonksiyonun, yok yok “Command”ın to ve end kelimeleri arasında tanımlandığını gördüm. Eh, buna da pek fazla şaşırmadım. Ayrıca fonksiyonlara argüman aktarmak da ( ) arasına yazmak falan değil direk yazmakla oluyor. Yani tam bir okunabilirlik katliamı! Neyse bunu da geçelim. Sonraki gördüğüm komut “ask” ilk gördüğümde koşullu ifadelerle alakalı bir şey olduğundan tut da fonksiyon çağırmaya ya da tanımlamaya yaradığını bile düşünmüştüm. Bundan dolayı bu “ask” komutunun dizi içindeki elemanları sırayla gezmeye yarayan foreach gibi bir şey olduğunu öğrenince biraz da olsa şaşırdım.
Buraya kadar olan izlenimlerim NetLogo’dan iğrenmeme yol açmaya başlamıştı. Ama ben yine de devam ettim. Sonra “turtle” denilen nesnenin “forward” komutuyla ilerlediğini fark edince derin bir “ooooohaaaaaa” kopardım yüreğimin derinliklerinden. Çünkü bu bana şunu ifade etmişti: “Bu dil hareketli nesnelerin benzetimini yapmak için icat edilmiş olmalı”. Diğer dillerde bunu yapmak benim için tam bir işkence. Diğerleri için de zor olmalı. Ama NetLogo öyle mi! Bi tanedir o. Benden söylemesi.
Buraya kadar bir şey biliyormuş gibi ukalaca atıp tuttum. Adamların üşenmeyip yaptığı NetLogo’ya laf söyledim. Umarım bana sinir olmamışsınızdır. Çünkü bu yazıyı gerçekten de eğlenmek ve yer doldurmak için yazdım. Bir dahaki yazıda görüşmek üzere…


7
Haz

 Arama algoritmalarımıza yatay arama (bfs) ile devam ediyoruz.

Yatay arama derinlemesine aramadan farklı çalışır. Bir düğüme girdiğinde en uç noktaya varıncaya kadar gitmektense aynı dereceli diğer terimlere bakar. Bu işlemi nasıl yaptığını merak etmiştim. Meğerse kuyruk kullanılıyormuş. Kuyruk dediğimiz şey bir tür veri dizisi. Bu veri dizisine veriler en sona eklenir, veriler alınırken ilk baştaki veriden itibaren alınır. bfs algoritmasında her düğümün bağlı olduğu diğer düğümler kuyruğa eklenir ve kuyruktan alınan verilerde bfs tekrarlanır. Koda gelecek olursak:


//bfs.c 

#include <stdio.h>
int tablo[10][10];
int kuyruk[10];
int iz[10];
int aranan=6; //aranan düğüm
int bulundu=0;

// kuyruğa veri ekle
void ekle(int n)
{
    iz[n]=1;
    static int son=0;   //kuyruğun en sonu
    kuyruk[son]=n;
    son++;
    printf("%d Arama kuyruğuna eklendi!\n",n);
}

//kuyruktan veri al
int al()
{
    static int bas=0;   //kuyruğun en başı
    return kuyruk[bas++];
}

void bfs(int gel)
{
     printf("Giriliyor: %d\n",gel);
     int i;
     for(i=0;i<10;i++){
         if(!iz[i] && tablo[gel][i])
         {
             if(i==aranan)
             {
                 printf("Aranan %d bulundu!\n",i);
                 bulundu=1;
                 break;
             }
             else ekle(i);
         }
     }
}
int main()
{
    tablo[0][1]=tablo[1][0]=tablo[0][2]=tablo[2][0]=tablo[1][3]=tablo[3][1]=tablo[3][2]=tablo[2][3]=tablo[3][4]=tablo[4][3]=1;
    tablo[3][5]=tablo[5][3]=tablo[5][6]=tablo[6][5]=1;
    int i;
    while(!bulundu){
        iz[0]=1;
        bfs(al());

        }
     
    getch();
    return 0;
 
}

Programda her düğüme girerken neden “Giriliyor…” yazdırdığımı merak ediyorsanız, çok önemli bir sebebi yok. Sebebi hata korkusu. Ben de yeni başladığım için yanlış yazmış olabilirim. Bu şekilde hangi düğümlere girdiğini biliyorum ve programın doğru çalıştığından emin olabiliyorum.


19
May

Bu aralar python yerine C’ye çalışmayı düşündüm. Sonra Halil’e “Bana C öğretsene, Python çok yavaş” dedim tabii o da kabul etti. İlk olarak bazı algoritmaları öğretti. Bunlar arama algoritmaları. Ben de ilk olarak dfs’i yazdım.

Dfs’in ne olduğuna gelince: “Derinlemesine arama” demek oluyor. Yani düğümlerden birine girdiğinizde aramaya ona bağlı düğümlerden devam ediyorsunuz. Eğer düğümler çıkmaza girerse o zaman geri dönüp hemen yanındaki düğüme geçiyorsunuz. Kod şöyle:

#include<stdio.h>

int tablo[1000][1000];
int n=7;
int aranan=6;
int iz[1000];

void dfs(int gel){
    int i;
    iz[gel]=1;
    for(i=0;i<n;i++)
    {
        if(!iz[i] && tablo[gel][i])
        {
            printf("Giriliyor: %d \n",i);
            if(i==aranan)
            {
                printf("Aranan %d Bulundu\n",i);
                break;
            }
            else dfs(i);
        }
    }
    printf("Çıkılıyor: %d\n",gel);
}

int main(){
    tablo[0][1]=tablo[1][0]=tablo[0][2]=tablo[2][0]=tablo[1][3]=tablo[3][1]=tablo[3][2]=tablo[2][3]=tablo[3][4]=tablo[4][3]=1;
    tablo[3][5]=tablo[5][3]=tablo[5][6]=tablo[6][5]=1;
    dfs(0);
    printf("Arayan Bulur!\n");
    return 0;
}


Düğümleri oluştururken bir tablo oluşturup eğer düğümler arasında bağ varsa tablonun o sayıların kesişimine gelen elemanını (yani eğer 4, 2′ye bağlıysa tablo[4][2]=tablo[2][4]=1) 1 yapıyorsunuz. Tablo simetrik olmalı, çünkü mesela 4 2′ye bağlıysa 2 de 4′e bağlıdır. Bu değerleri bir girdi dosyasından da okuyabilirsiniz ama ben basit olması için programda elle girmiş oldum. Bunu yazdıktan sonra Halil “Bir de şey yaz sen: iki düğüm alsın kullanıcıdan, birinden diğerine gidilip gidilemeyeceğini göstersin.” Ama ben uğraşmadım. Bu algoritmadan sonra da bfs yazmaya çalışacağım. Yazdığım zaman onu da buraya korum. Hepinize iyi günler.


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

KDE'nin takvim programcığı masaüstündeyken sade bir görünüm almadığı için masaüstüne ekleyemiyordum. İstediğim Windows Vista'dakine benzer bir şeylerdi.

Hem güzel bir takvim programcığına ihtiyacım olduğundan hem de bir programcığın nasıl yapılacağını merak ettiğimden, kendim için merhaba dünya'dan az hallice bir şey çıkardım. Daha yeni bitti, birkaç şey daha eklenebilse güzel olacak.

Sizindir, dilediğiniz gibi kullanın (WTFPL).


Eğer siz de kendiniz için programcıklar yapmak isterseniz:
13
Nis

Evet, süpriz!

Geçen yıl PyGuguk adında bir guguklu saat yaptığımı hatırlıyorum. Tabi amatör bir uygulamaydı. Beklerken ana döngüyü bölemediği için donup kalıyordu ve kapatmak imkansızdı. Kontrolcu projesi ile uğraşırken öğrendiğim QThread ve Guguk için gereken QTimer ile artık guguklu saatimiz donmuyor, güzelce ötüyor.

Ses çalmak için Phonon kütüphanesini kullanıyorum. Fakat nedense Pardus’daki PyQt’de Phonon desteği yok. O yüzden Pardus için eğer Phonon kütüphanesini bulamazsa PyGame’e geçebilecek.

Guguk projesi ne yapıyor, her saat başı saat kadar ötüyor ve bir pencere çıkarıp size ‘Guguk!’ diyip saati söylüyor. Ayrıca guguklama işlemini durdurup susup oturmasını sağlayabilirsiniz.  Başlattığınızda siyah G harfi kırmızı oluyor ve çalışmaya başladığını haber veriyor.

Guguk projesini şuradan bulabilirsiniz.

Ve diğer süpriz:

Artık yazılarımın aynısı İngilizce olarak da bulabilrsiniz. Tamamen kendim çevirmeye çalıştım. Kelime kelime olmasa da anlamlarının aynı olduğundan emin olabilirsiniz.

Dil bölümünden dil değişikliği yapabilirsiniz.