powershell ve pash    08/04/08

linux_suse Vakt-i zamanında powershell‘i kurcalamış ve çok güzel bir izlenim elde etmiş idim. PowerShell gerçekten güzel, kullanılabilitesi yüksek bir araç.

Bugün PowerShell’in açık kaynak kodlu benzeri|rakibi olan|olmayı hedefleyen ve diğer işletim sistemlerinde de çalışabilir vaziyette olan Pash‘a denk geldim. Desteklenesi bir proje.

Pash Ana Sayfası

Pash Proje Sayfası

firefox 3.0b4 ve YSlow    20/03/08

Yahoo’nun Firebug ile çalışan YSlow analiz sistemi, çıkmış olan en son beta sürümü 3.0b4 ile çalışmıyor. Resmi YSlow eklentisinde maxVersion 3.0b4pre olarak belirtilmiş. Bu nedenle yüklediğiniz xpi dosyasını - ki aslında bu bir “zip” dosyadır - bir klasöre açtıktan sonra “install.rdf” dosyasını açıp <em:maxVersion> etiketinin değerini 3.0b4 olarak değiştirirseniz sorun ortadan kalkıyor.

<em:maxVersion>3.0b4</em:maxVersion>

install.rdf dosyasını güncelledikten sonra çıkan dosyaları yeniden zip’leyip uzantısını xpi olarak güncellediğinizde ve ve bu dosyayı Firefox ile açtığınızda kurulum sorunsuz olarak gerçekleşiyor.

Kolaylıklar.

İlk göz ağrılarımızdan olan RadRails editörünün geliştirimi Aptana’ya geçtikten sonra 1.0 numaralı kararlı sürümü geçenlerde (11 Mart) duyuruldu. Hemmen incelemeye başladım ve ekran görüntüleri eşliğinde bir yazı hazırlamaya çalıştım.

RadRails’i kurabilmek için öncelikle Aptana Studio’nun sisteminizde kurulu olması gerekiyor.
Aptana Studio’da sırasıyla Help > Software Updates > Find and Install menüsüne ulaşıp buradan Search for new features to install seçimini yapıp Next dedikten sonra RadRails’i seçebilir ve kurabilirsiniz.

Yükledikten sonra Aptana Studio’yu kapatıp açmalısınız. Eğer Türkçe bir işletim sistemi kullanıyor iseniz fi tarihinde olan problem hala devam ettiği için -nl en-En parametresini kısayola eklemelisiniz. Ardından yeni bir rails projesine başlayabilir ya da var olan bir projenizi ithal (import) edebilirsiniz.

İlk dikkatimi çeken yeni bir rails projesi oluşturup o projeye geçtiğim halde görünümün (perspective) Rails’e geçmemesiydi. Bu nedenle bunu elle çevirmek durumundasınız. ( Window > Open Perspective > Other > RadRails )

RadRails’in yeni özelliklerine liste halinde karşılaştırmalı (karşılaştırmalar çok yanlı bu arada) olarak buradan bakabilirsiniz. Tabii bu liste de ayrı bir komedi. Zira listede "Eclipse Compability" özelliğinin (!) karşılaştırması da yer alıyor.

Ekran görüntüleriyle bazı özellikler şu şekilde:

 

generator  Generator penceresi ilk sürümden bu yana hemen hemen aynı, görevini layıkıyla yapıyor.

 

hizlibutonlar Kod penceresinde helper/view/model/controller ve test dönüşümleri güzel düşünülmüş. Örn. controllerdan view’a dönerken fonksiyon içerisinde iseniz hangi tür dosya istediğiniz, herhangi bir fonksiyonunun dışında iseniz fonksiyon seçimi ve dosya tipi soruluyor ve yok iseler oluşturuluyor.

h1-editor Rhtm düzenleme ekranında ufaktan xhtml düzenleme butonları yerleştirilmiş. Güzel olmuş.

 

presence

Kod tamamlama özelliği geliştirilmiş, daha fazla dökümansal ayrıntıya yer vermeye başlamış.

 

 

tabilegecis

Tab ile kod tamamlamalar ile geçiş yapılabiliyor.

 

tail

Bu güzel bir özellik. Entegre tail sistemi.

Kelimesel ya da düzenli ifadeler eşliğinde renklendirme özelliği verilebiliyor. Bir editörün içinde bulunması çok güzel.

Tutulası bir özellik.

 

 

 

rails-api

Rails Api ve Ruby Standart Kütüphanesine direkt erişim yapılabiliyor. Böylece yalnızca RadRails üzerinden tüm işlemlerin yapılabilmesi amaçlanmış. IDE’nin anlamını hatırlatıyor gibi bir nevi.

 

 

 

 

railstest test-basarili

Entegre test sistemiyle testlerin sonuçları grafiksel ekranda sunuluyor.

 

 

 

 

 

 

NetBeans, Ruby için destek vermeye başladığından beri NetBeans kullanan ve öncelerinde RadRails kullanmış biri olarak, NetBeans’ın ben de daha ayrı bir güzellik olgusu oluşturduğunu da belirtmek isterim.

Ayrıca, yukarıda adresini verdiğim karşılaştırma tablosuna NetBeans IDE’nin Ruby geliştiricisi olan Tor Norbye tarafından yazılmış ve gerçek dışı/saptırılmış olan bazı özelliklerin gerçeklerine yer verilmiş cevabı okumakta fayda var.

Şimdilik incelediğim özellikler bunlar. RadRails güzel bir aşama kaydetmiş. Daha öncede söylediğim gibi editör savaşları her daim geliştiricilere yarayan bir karşılaşma.

İyi çalışmalar.

Heroku.com beta incelemesi için başvuru yapmış idim, bugün bir davetiye geldi. Bende biraz inceleme fırsatı buldum. Güzel düşünülmüş bir sistem.

Heroku.com nedir?

Heroku.com bize diyor ki;

Daha önceden geliştirmiş olduğunuz rails uygulamanızı heroku.com’a aktarın ya da heroku.com üzerinden yeni bir rails uygulaması başlatın (kendi içinde editörü, generate, consol, migrate, veritabanı ve diğer çoğu olay mevcut) herhangi bir gönderim ve ayar işlemi yapmadan uygulamanız anında kullanılabilir hale gelsin.

railsconsole

Güzel bir düşünce aynı zamanda güzel bir uygulama ile de birleştirilmiş.

herokurenklendirme

Renklendirme eşliğinde, aynı zamanda uygulamayı düzenleyebilecek kullanıcıları belirtirek takım çalışması da yapabiliyorsunuz.

 

heroku.com güzel düşünülmüş ilginç bir sistem. Rails geliştiricileri için faydalı olacak bir sisteme benziyor. Günlüğüne de buradan ulaşabilirsiniz.

Facebook büyüdükçe büyüyor. Zamanla da büyüyecek gibi duruyor. Bu büyümeyi benim incelemem alanım dışında olduğu için sebeplerini araştırmayı pazarlamacılara bırakıyorum. Fakat geliştirici gözüyle Facebook’ta dikkat ettiğim en önemli olay “gerçekten güzel düşünülmüş bir altyapısı” olması. Özellikle “application” kavramı iyi düşünülmüş.

Yakında sunmayı planladığımız projemiz için ayrıca bir Facebook uygulaması da geliştirecektik. Öncesinde bir bilgi birikimim olması açısında Facebook Applications yapısına biraz göz attım.

Facebook java ve php geliştiricileri için official kütüphaneleri sunuyor. Özellikle PHP kütüphanesine ait bir çok örnek bulabilirsiniz.

Fakat, Kimyapacak.Com’u Ruby diliyle geliştirdiğim için RFacebook kütüphanesi benim ilgi alanıma giriyordu. RFacebook, “api”yi kullanan “api” olarak düşünülebilir. Alt yapısında “Hpricot” kullanıyor. RFacebook’un da en önemli kozu ruby “method_missing” fonksiyonu. Api’ye methodları bu şekilde iletiyor. Yani RDoc dökümantasyonunda Facebook fonksiyonlarının çoğunu görememiz bu yüzden, kullanamadığımızdan değil.

RFacebook’u gem paketi ile kurabiliyoruz:

sudo gem install rfacebook

Rails uygulamaları için; uygulamamızı kodlayıp en son bunu facebook’a entegre ediyoruz. Buradaki anahtar kelime “session” oluşturumu için :require_facebook_install | :require_facebook_login .

burhan_app.jpgKendime örnek bir uygulama seçerek ve “Burhan Altıntop” grubunun üye sayısını da göz önüne alarak Burhan Altıntop replikleri uygulaması geliştirdim. Bunun bir sebebi de fazla karmaşık bir uygulama olmamasıydı. Aslında böyle gibi dursa da işin en “zor” kısmından başladığımı sonradan anladım. Zira, facebook her sayfayı bellekte tutuyor. Özellikle profil sayfalarına büyük önem veriyor bu konuda. Yani “profil sayfasını” değiştirmek için facebook’a bilgi göndermek gerekiyor. Durum böyle olunca ve uygulama da sadece sözleri gösterince herhangi bir istek kullanıcılardan gelmemiş oluyor. Bunu çözmek için “Infinite session keys” kullanmak kaçınılmaz oluyor. Kullanıcı bir işlem yaptığı zaman (örn. uygulamayı kurmak) bunu veritabanına kaydetip daha sonra her kullanıcı için bu anahtarla giriş yapıp setFBML’yi kullanmak lazım oluyor.

Aslında tüm sayfalarda aynı içerik yer alacaksa bunun için FBML etiketi olan fb:ref düşünülmüş. Bu şekilde bir “handle” yahut “url” belirterek tüm heryeri güncelleyebiliyoruz fb:ref’e sahip olan. Fakat böyle olunca her profilde aynı içerik gösterilmiş oluyor.

Bir diğer değişken söz üretme tekniği ise uygulamayı yazdıktan sonra aklıma gelen bir sistem. Yine fb:random ile fb:ref’i birbirine katarak her sayfa güncellemesinde bir söz çıkartılabilir. Veritabanına yeni söz eklendiği zaman fb:ref’i güncellemek yeterli olacaktır.

Özet geçmek gerekirse, Facebook Applications, güzel bir yapıya sahip. İlk izlenimden elde edindiğim en önemli husus ve forumlarda da gördüğüm kadarıyla “profil kutuları” güncellenmesi. Güncelleme için mutlaka yazılıma istekte bulunulması lazım. Tetiklemeden güncellemek için (örneğin cron olayları için) infinite session’ları veritabanına kaydetmek lazım.
Bunun dışında normal bir uygulamayı facebook’a aktarmak inanılmaz bir yük değil. Özellikle kullanıcılara özel içerikli sistemlerde tabloda ekstradan “fb_user_id”yi tutan bir alan olursa sorgulamalarda user_id yerine fb_user_id ile çoğu kez işi götürebilirsiniz. (fb_user_id kullanıcının facebook id’si)

Bir de uygulamanız için iyi bir tasarımcı bulmayı ihmal etmeyin derim ben. Yazılımın tüm baloncuk hakları Sinan’a ait (:

vakit.rb    13/11/07

Namazvakti.com, güzel bir görünümle namaz vakitlerini kullanıcıya “online” olarak sunuyor. Aynı zamanda belirtilen şehire ait “xml” dosyasını da veriyor. Oldukça güzel bir sistem.

Bazen internet bağlantımın olmadığı zamanlar (kablomu çektiğim zamanlar) oluyor. Bu gibi zamanlarda hemen xml dosyasından günün tarihini okuyup ekrana yazdıran ufak bir araç geliştirdim. Kullanabilmek için namazvakti.com sitesinden şehrinizi arattırıp “yıllık xml” dosyasını vakit.rb’nin bulunduğu klasöre kaydetmeniz gerekiyor.

Diyanet.gov.tr ile namazvakti.com hesapları arasında oynamalar var. Bir kaç kaydı inceleyerek bunlar arasında farkın değerlerini çıkarttım. Yani sonuçları diyanet.gov.tr hesabına göre (arada yine bir-iki dakika oynama olabilir) görüyoruz.

Bursa için XML dosyası
İstanbul için XML dosyası

Kaynak kodlar

Kaynak Kod: vakit.rb
# şehrinize ait namazvakti.com xml verilerini offline olarak
# aynı klasöre "vakit.xml" dosya adı ile kayıt ediniz..
#
# murat çeliker, murat.cekiker@gmail.com
# http://www.ikinoktayazilim.com/wordpress/
#
# kasım 12, 2007
#
 
# namazvakti.com verilerini diyanet saatine göre düzenler
# birkaç veri incelenerek aradaki farklar tespit edilmiştir
#
def d(vakit, ekleme)
 
vakit = vakit.split(':')
 
saat, dakika = vakit[0].to_i, vakit[1].to_i + ekleme
 
carpim = 1
 
carpim = -1 if dakika < 0
 
saat, dakika = saat + 1 * carpim, dakika + -60 * carpim if dakika >= 60 or dakika < 0
 
"#{saat}:#{dakika}"
end
 
require 'rexml/document'
include REXML
 
bugun = Time.now.yday * 2 
bugun += 1 if (bugun % 2) == 0
vakitler = Document.new(File.new('vakit.xml')).root.to_a[bugun].text.split(/\t/)
 
puts "----- gunun namaz vakitleri ----- \n\n"
puts "  imsak: #{d(vakitler[0], 15)} \n  gunes: #{vakitler[2]} \n  oglen: #{d(vakitler[5], -4)} \n ikindi: #{d(vakitler[6], -6)} \n  aksam: #{vakitler[9]} \n  yatsi: #{d(vakitler[11], -9)} \n"
puts "\n\ncikmak icin bir tusa basiniz... \n"
gets

Faydalı olması ümidiyle.

cevirgec.png

Bundan bi’ kaç hafta önce yazmıştım çevirgeç‘i anca atabildim internete.

Nedir?

Çevirgeç, belirtilen klasörlerdeki resimleri belirtilen sürede duvar kağıdı yapar. Tüm resimler duvar kağıdı olana kadar aynı ada sahip dosya bir daha duvar kağıdı olmaz. Süre ise saniye cinsinden belirtilir. Aynı zamanda win32 servisi olduğu için bellekte fazla harcama yapmaz.

Neden?

Bu tür bir çok yazılım piyasada mevcut. Bunların bir çoğunda sonraki resime basınca aynı resim gelebiliyor. Ve yine bir çoğunda süre ayarı için belirli dakikaların altına inme/üstüne çıkma olayları yoktu. Ve yine bir çoğu win32 servisi değildi. Ve yine, …

Aynı şekilde çevirgeç’in eksiklerini konu alan “ve ama” ile başlayan çokca satır da gelebilir.
Ve ama, çevirgeçin ayar penceresi yok, ayarlaması zor.
Ve ama, çevirgeç imagemagick convert.exe’ye bağımlı.
Ve ama, çevirgeçin kontrolü konsoldan ya da “hizmetlerden” yapılmak zorunda.
gibi…

Kurulum

Çevirgeçin kurulumu oldukça kolay ama ayar yapması biraz zor. Ayar programını bir sonraki sürüm için (eğer olursa) yazmayı düşünüyorum. Şimdilik “yaml” dosyasını düzenleyerek bu işlemi yapabilirsiniz.

  • gem install cevirgec komutu ile çevirgeçi kurabiliyoruz.
  • Bu sıralar Rubyforge yansılarında sorun var. Gem paketlerini listelemede sorun oluşuyor. Bu nedenle bu adresten dosyayı bilgisayarınıza kaydettikten sonra konsolda kayıt edilen klasöre girerek yukarıdaki komutu verebilirsiniz.
  • Çevirgeçi hizmetlere kurmak için komut istemcisinde: cevirgec kurulum komutunu verebilirsiniz.
  • Kurulum işlemi bu kadar.

Çevirgeç Ayarları

Çevirgeçi kurduktan sonra ayar yapmak için sırasıyla aşağıdaki yordamları izleyebilirsiniz.

  • Ruby’nin kurulu olduğu dizine girin. (Gezginden)
  • Daha sonra \lib\ruby\gems\1.8\gems\cevirgec-0.1-mswin32\lib\cevirgec klasörüne ulaşın.
  • ayarlar.yaml dosyasını açıp düzenleme yapabilirsiniz.
  • ImageMagick convert.exe programını buradan yükleyebilirsiniz. Ayarlar.yaml dosyasında yerini yüklediğiniz klasör olarak belirtmeyi unutmayınız.

Hmm, acilen ayar programı lazım, satırları yazarken bile yoruyor insanı.

Çalıştırma silme, durdurma

komut istemcisinde:
cevirgec kurulum | baslat | durdur | sil | araver | devam | durum
kurulum: cevirgec’i kurar. baslat: çalışmaya başlatır durdur: çalışmasını durdurur
sil: servislerden çevirgeçi siler. araver: çevirgeçin çalışmasına araverir. devam: yeniden çalışmaya başlatır durum: şu an ne durumdaya cevap verir.

Son;

Program sadece win32 sistemlerde çalışıyor. Ayrıca win32utils paketinden bir kaç bağımlılık bulunuyor. Gem otomatik olarak bunlara dair “kurmak ister misiniz?” sorusu soracaktır. “y” ile devam edebilirsiniz.

GVim Portable    31/10/07

Portable Gvim yayımlanmış.

Sayfası şurada, hemen indirmek için buradan.

NetBeans’ın kararlı 6.0 sürümüne yaklaşırken 2. Beta sürümü de yayımlandı.

http://download.netbeans.org/netbeans/6.0/beta2/ adresinden yükleme dosyalarını bulabilirsiniz.

NetBeans Türkçe çeviri grubuna hâla kayıt olmadıysanız buradan ayrıntılı bilgiye ulaşabilirsiniz. Bekliyoruz herkesi.

Görüşmek üzere.

Bundan önceki yazımda JRuby ile Zemberek kütüphanesinin nasıl kullanılabileceğini basitçe görmüştük. Yazıda yer alan örneklere göz attığımızda Zemberek kütüphanesini kullanırken Java’da izlenen yolu birebir izledik.

Yani bir kelimeye ait önerileri bulmak için şu kodu kullandık.

oneriler = zembo.oner(yazi)
oneriler.each_with_index do |oneri, i|
  ...
  ...

Oysa bu kod Ruby programcıları için pek de güzel sayılmayacaktır.
Şöyle bir erişimin daha güzel olacağı aşikar.

# Meraba önerilerini döndürür
oneriler = "Meraba".oneriler
 
# Meraba'nın yazımı doğru mu?
puts "Meraba".yazim_dogru?
 
# Merhaba'yı heceler, heceleri kullanıma sunar
"Merhaba".hecele { |hece| print "#{hece}-" }

Bunları yapmak için öncelikle ufak bir sınıf ve modül yazmalı daha sonra bunu String sınıfına dahil etmeliyiz.

ZemberekJRuby sınıfı

# Basit Zemberek JRuby Kullanımı
#
# Murat ÇELİKER, murat.celiker@gmail.com
# http://ikinoktayazilim.com/wordpress/
#
 
require 'java'
require 'singleton'
 
# Basit Zemberek Ayrıştırıcımız
# Yalnızca bazı methodlar yer almaktadır
#
class ZemberekJRuby
 
 
include Singleton
 
 
# zemberek kütüphanemizi dahil edelim
 
require 'zemberek-tum-2.0.jar'
 
 
# zemberek sınıflarımızı dahil edelim
 
include_class 'net.zemberek.erisim.Zemberek'
 
include_class 'net.zemberek.tr.yapi.TurkiyeTurkcesi'
 
 
# bir tane zemberek oluşturalım
 
def initialize
   
@zembo = Zemberek.new(TurkiyeTurkcesi.new)
 
end
 
 
# kelimeDenetle çevirisi
 
def kelime_denetle(kelime)
   
@zembo.kelimeDenetle(kelime)
 
end
 
 
# hecele çevirisi
 
def kelime_hecele(kelime)
   
@zembo.hecele(kelime)
 
end
 
 
# oner çevirisi
 
def kelime_oner(kelime)
   
@zembo.oner(kelime)
 
end
 
end

Gördüğünüz gibi basit bir Zemberek JRuby sınıfı yazdık. Singleton kullanarak yalnızca bir kez oluşturulmasını da sağladık. Şimdi artık modülümüzü de yazıp String sınıfına dahil edip daha bi rubysel kullanım yapabiliriz.

TurkceJRb::Katar

# Katar değiştiricimiz
#
# örn: "deneme".denetle
#
module TurkceJRb
 
 
module Katar
   
   
def yazim_dogru?
     
ZemberekJRuby.instance.kelime_denetle(self)
   
end
 
   
def hecele
     
heceler = ZemberekJRuby.instance.kelime_hecele(self)
     
if block_given?
       
heceler.each { |hece| yield(hece) }
     
else
       
return heceler
     
end
   
end
 
   
def oneriler
       
oneri_listesi = ZemberekJRuby.instance.kelime_oner(self)
       
if block_given?
       
oneri_listesi.each { |oneri| yield(oneri) }
     
else
       
return oneri_listesi
     
end
   
end
 
 
end
 
end

Katar sınıfını dahil edelim

# String sınıfına eklemeler yapalım
#
class String
 
include TurkceJRb::Katar
end

Yeni Örneğimiz

İlk yazıdaki örneğimiz artık şu hale geldi:

# örneğimizi katar sınıfı methodlarına çevirelim
#
# String.oneriler , String.denetle gibi
#
yazi = ARGV.shift || 'meraba'
 
if yazi.yazim_dogru?
 
puts "#{yazi} dogru yazilmis"
 
yazi.hecele { |hece| print "#{hece}-" }
else
 
oneriler = yazi.oneriler
 
 
# önerilerimizi ekrana yazdıralım
 
puts "#{yazi} icin size #{oneriler.length} tane onerim var:"
 
oneriler.each_with_index do |oneri, i|
   
puts "Oneri #{i+1}: #{oneri}"
 
end 
 
 
# yahut
 
yazi.oneriler { |oneri| puts "#{oneri}" }
 
 
end

Dosyanın tamamına ait kaynak kod yazının devamında yer almaktadır.

Devamını Okumak İstiyorum

Taskbar Shuffle, taskbar da yer alan açık yazılımların yerlerini değiştirmeyi kendine görev edinmiş daha doğrusu ettirilmiş diyelim, yazılımı yazan birileri var sonuçta.

Çokça yazılım çalıştıran biri iseniz ve ilişkilendirilmiş yazılımları sırayla açmamış iseniz yazılımdan yazılıma geçişi kolaylaştırmak için kullanılabilir.

646 Kb. büyüklüğündeki Taskbar Shuffle’ın buradan kurulum dosyasını indirebilirsiniz yahut kurulumsuz yalnızca “exe” dosyası içeren zip dosyasını edinebilirsiniz.

PsPad

Editörlerin benim tarafımda inanılmaz değerleri vardır. İlginçtir, masaüstü uygulamaları geliştirmeye başlama sebebim kendime uygun bir editör tasarlamaktı. Adı “Düzenle” idi ve sanıyorum 368 adet sürüm çıkartmışımdır - benden başka kimsenin haberi yok tabii ki -

Bir editor deyip geçmemek lazım.

Windows ortamında şöyle eli yüzü düzgün bir editör arıyorken (daha önceleri editplus kullanıcısı olarak ve yaklaşık 1649 tane editör denemiş biri olarak) PSPad süper bir izlenim bıraktı bende.

Total Organizer    07/07/07

Organizer
Total Organizer Pro, windows için yapılacaklar listesinizi (takvim ve not tutma olayı da mevcut) tutabileceğiniz basit ve güzel bir uygulama.

Projeler klasöründe 2006′nın 5. ayında ya da daha öncesinde başladığım ve sonrasında büyük ihtimal unuttuğum (evet, insan yazacağı programı unutabiliyor) “Tutaç” şimdilik alternatif olamıyor ne yazıkki bu programa.

UI 2.0 & boyoto    05/07/07

Boyahane Otomasyonu yazılımın da kullanım mutlaka en basit şekilde olmak zorunda. Programı kulllanacak kişilerin çoğu programı kullanmaya başlayarak ilk kez bilgisayar ile tanışıyor çünkü. Ayrıca işçiye iş çıkarmak yerine onu daha verimli çalıştırmak daha önemli, bunun için yazılım da gereksiz alan olmamak zorunda, kullanım basit olmak zorunda, kafa karıştırıcı hiçbir şey bulunmamalı. Ayrıca güzel bir pencere de bunları sunmak tabii tümünden daha önemli bence.

Masaüstü uygulamaları geliştirirken en çok dikkat ettiğim husus kolay kullanılabilirlik ve güzel görünüm. Kolay kullanılabilirlik aranılana hızlıca ulaşabilme, güzel görünüm ise bu ulaşılabilecek alanları en anlamlı biçimde yerleştirme.

Boyotodan örnek iki ekran. (Boyoto projesinin satır sayısı 60000 i geçti, hayırlısı artık.)

Metre Programı
Yönetim Ekranı

Kde altında güzel bir ftp istemcisi aranıyorsa KFtpGrabber zaten baştan elenmeli. Aklımda Ruby&Qt ile Ftp istemcisi yazmak var, o zamana kadar Kasablanca güzel bir çözüm olacak sanırım.

Sayfada yayımlanan yazılar aksi belirtmedildiği sürece Murat Arif Çeliker'e aittir. Yorumlar, yorumu yapan kullanıcıların kendi görüşleridir.
açılış - deneyhane - tasarılar - hakkımda - iletişim -

Sitede altyapı olarak Wordpress kullanılmıştır.