- İ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.
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 itKendimi Ş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İleride Kendimi Şanslı Hissediyorum™ komutunun daha hızlı bir şekilde kullanılması için pisi-luck isminde bir betik de sunulacaktır.
Aşağıdaki paket(ler) zaten kurulu ve yeniden kurulmayacak:
python-clientform
Kurulacak paket yok.
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.
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:
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.
- Mavi ambians. Dolayısıyla, Venus akla geliyor. İleriye dönük gezegensel bir patent ihlali olabilir.
- F1 aracı. Kesinlikle affedilmez bir ahlaksızlık. F1 aracı tasarlayanların, 80'lerdeki maddi durumunun yegane nedenlerinden biri olması kuvvetle muhtemel.
- Eşek. Yaradana patent borcunuz var...
- Kontrol tuşları.
- Yol çizgileri.
- Puanlama sistemi.
- Eşeğe çarpınca arabanın parçalanması. Fizik kuralları dahilinde bir ihlal...
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
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.
$ java -Xms512M -Xmx512M -jar oslc.jarkomutunu, 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
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.
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.shkomutunun ç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.
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)kdesuBenzer 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'"
$ pisi li -b localhost
Son olarak şunu da söyleyeyim, uygulama acemi ellerde tehlikeli olabilir, bu yüzden kullanırken dikkatli olunuz.
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-kwalletkomutuyla 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 ~/.subversionkomutundan 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 > test4. Sonrasında da oluşturduğum bu dosyayı sürüm takip sistemine ekledim:
$ svn add test5. Şimdi de sunucuya göndermeyi deneyelim bu küçük test dosyasını:
$ svn commit testBu 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:
- compiling subversion with kwallet support in ubuntu
- abs, subversion, and kwallet to store svn passwords encrypted
- Tip: Using KWallet or GNOME Keyring with Subversion
$ svn rm test7. Son olarak da yazıyı yayınlıyorum :)
$ svn commit test
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
clear
echo -e "\033[2J"
echo -e "\033[10;5H Merhaba Dünya \033[0m"
- HappyPenguin'deki konsol tabanlı oyunlar
- mplayer -vo caca video-hede.mpg
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:
- Terminal colour highlights
- Colour on text terminal
- Konsol Programlarında Çıktı Renklendirme ve GotoXY
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.
)
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
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ı
ile görebilirsiniz. Buraya göz atınca “screensaver” diye bir modül olduğunu göreceksiniz. Bunu konsoldan doğrudan
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:
./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->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.
{
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:
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:
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:
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
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
İ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:
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)
- Satırın sonuna gitmek. Vim komutu: “$“
- Sonra bir kelime geriye gitmek. Vim komutu : “b“
- Kelimenin başlangıcından sonuna kadar silmek. Vim komutu: “d0“
- 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
ç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
- Satırın başına gelmek – Vim komutu: “0“
- Satırda . ile başlayan konuma gelmek . Vim komutu: “f.“
- Sonra bu konumdan satırın sonuna kadar silmek Vim komutu: “d$“
- 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:
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:
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:
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:
/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ı:
./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:
FILE(GLOB _desktopfiles "ScreenSavers/*.desktop" )
foreach(_currentdesktopfile ${_desktopfiles})
· STRING(REGEX REPLACE ".desktop" "" _newitem "${_currentdesktopfile}" )
· #MESSAGE(STATUS "newItem <${_newitem}>")
· GET_FILENAME_COMPONENT(_screensaverName ${_newitem} NAME_WE)
· MESSAGE(STATUS "name without extension <${_screensaverName}>")
· 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:
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:
MESSAGE(STATUS ${XSCREENSAVER_FILE_FOUND} )
if(XSCREENSAVER_FILE_FOUND)
...
Aldığım sonuç ise şu şekildeydi.
-- 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
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
-- /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:
Aşağıdaki kısmı okuyunca her şey daha iyi anlaşıldı:
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.
Derlemeyle uğraşmak istemeyenlerse Flash sürümünü şuradan oynayabilir.
Asıl güzel haberiyse sona sakladım. YouTube'de 3D qbasic gorillas, Gorillas 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.
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.

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.
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…
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.
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.
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:$
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.
***
Eğer siz de kendiniz için programcıklar yapmak isterseniz:
- Plasma - Getting Started
- Introducing KDE 4 plasmoids
- Creating Plasmoids
- kde-look.org - plasmoids (basitten karmaşığa doğru)
- ve tabii ki KDE ile birlikte gelen programcıklar
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.

















































