Çarşamba, Ağustos 26, 2009

Linux'de otomatik NTFS formatlı sürücü mount etme

Bilgisayarımda çift işletim sistemi kurulu bunlar Ubuntu ve Windows XP. Ubuntu kullandığım için windowsa ayit ntfs sürücülerime herhangi bir ekstra ayar yapmadan erişebiliyorum ve istediğim gibi dosylarımı kullanıyorum.

Ama bir sorunla karşılaştım. Örneğin ntfs sürücüsünde olan bir resmi masa üstünde arka plan olarak kullandığımda bilgisayar ilk açıldığında resmi görmüyodu. Taki ben o sürcüye giriş(mount) yapana kadar. Veya müzik çalarınızda ntfs sürücüsünde bulununa müzikler varsa onlarda ilgili sürücüye giriş(mount) yapana kadar çalışmıyorlardı.

Ufak bir araştırmadan sonra bundan kurtulmanın basit bir yolunu buldum. Eğer sizde aynı sorundan muzdarip iseniz aşağıdaki adımları izleyerek sorunu çözebilirsiniz.

NOT: Yapacağımız bazı işlemler için root yetkisine sahip olmanız gerekli.

1-fdisk -l (L nin küçük hali bir ile karıştırmayın) disk yapılandırmamız hakkında bilgi alıyoruz. Eğer sürücüye verdiğinizi etiket ismine göre hangi sürücüyü mount edeceğinize karar verecekseniz blkid komutunu kullanabilirsiniz. Örneğin bendeki disk yapısına göre sda5 mount edeceğim ntfs formatlı sürücüm.

2-Sürücümüz için /media dizininin içinde bir bağlantı noktası(dizin) oluşturuyoruz. Ben win1 adında bağlantı noktası oluşturdum. Burda dikkat etmeniz gereken nokta bağlantı noktasına verceğiniz isimde boşluk olmamasıdır.
cd /media
mkdir win1

NOT: Sisteme mount edeceğiniz her sürücü için ayrı bir bağlantı noktası(dizin) oluşturmalısınız.

3- Şimdi /etc dizinin deki fstab dosyasını metin editörü yardımı ile açalım. Ben ubuntu ile hazır gelen gedit kullanarak dosyayı açtım.
gedit  /etc/fstab

Aşağıdakine benzer içerikli bir dosya açılmış ise doğru yoldasınız demektir.

# /etc/fstab: static file system information.
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
proc /proc proc defaults 0 0
# / was on /dev/sda7 during installation
UUID=507455ed-b0da-4925-82d8-ac3d33828521 /ext4 relatime,errors=remount-ro 0 1
# swap was on /dev/sda6 during installation
UUID=d808dd6c-4084-4a2a-804f-d97d1962caaf none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0

4- Dikkat etmenizi istediğim yerler son iki satır. Bu satırlar belli kurallara uyularak yazılmıştır. Şimdi bizde kendi isteklerimiz doğrultusunda kendi kurallarımızı yazacağız. Ama öncesinde aşağıdaki açıklamları okuyun.

auto = Bağlamak istediğiniz sürücü/bölüm açılış sürecinde otomatik olarak bağlanabilir. Bu seçenek zaten "mount -a" komutunun varsayılan davranışı olduğu için ayrıca belirtmek gereksizdir.
noauto = Sürücü/bölüm açılış sürecinde otomatik olarak bağlanmaz.
dev/nodev = Bilgisi olan bir arkadaştan açıklama bekliyorum buraya.
exec/noexec = İkilik (binary) dosyaların çalışmasına izin ver/verme.
suid/nosuid = SUID ve SGID bit kullanımına izin ver/verme.
ro = Yalnızca okunabilir bağlamak için.
rw = Hem okunabilir hem yazılabilir bağlamak için.
user = Herhangi bir kullanıcının bağlama işlemini gerçekleştirebilmesi için gereklidir, bu seçenek "noexec, nosuid, nodev" seçeneklerini eğer aksi belirtilmemişse kendiliğinden kullanır.
nosuer = Sadece root yetkisine sahip kullanıcının bağlama işlemi gerçekleştirebilmesini sağlar. Bu seçenek varsayılan seçeneklerden birisidir.
defaults = Varsayılan ayarları - rw, suid, dev, exec, auto, nouser, async - kullanır.
Dump = Sabit disk ya da bölümün "dump" komutu kullanılarak yedeklenmesini ayarlar. Bu değişken genelde "0"dır ve bu haliyle yedekleme devre dışıdır.
Pass = Sistem açılışı (boot) sırasında fsck'nin bağlı sürücü ya da bölümleri kontrol sırasını belirler. Kök dizinin bulunduğu sürücü/bölüm 1 olmalıdır. Diğer sürücüler/bölümler 2 olabilir, ya da 0 yapılarak devredışı bırakılabilir.

Daha fazlası için burdan vede burdan yararlanabilirsiniz.

5- Bu bilgiler ışığında kendi kuralınızı yazabilirsiniz. Benim kuralım aşağıdaki şekilde.
/dev/sda5 /media/win1 ntfs-3g defaults,locale=tr_TR.utf8  0  0

6- Dosyayı kaydedip kapattıktan sonra bilgisayarıızı yeniden başlatarak yaptıklarımızın işe yarayıp yaramadığını test edebilirsiniz.

Pazar, Ağustos 16, 2009

D'dili örnek kod

Bu zamana kadar D dili ile ilgili yazılarım kurulumla ilgiliydi. Artık ufaktan kod paylaşmanın zamanı geldi.

Aklıma toplu bir örnek gelmedi o yüzden C++ sınav sorularımı D ile yapıyorum. Aşağıdaki kod da sınav sorularımından bir tanesinin biraz daha modifiye edilmiş hali. Soruyu ddili.org sitesinin forumunda Haftanın Sorusu 2 başlığı altında paylaştım. Sorunun farklı yollardan çözümlerine oradan ulaşabilirsiniz.

Mümkün olduğunca açıklama satırları eklemeye çalıştım.Kullandığım fonksiyonlar hakkında daha ayrıntılı bilgi için ddili.org sitesinden yararlanabilirsiniz.


//Standart giriş çıkış kütüphanesi
import std.stdio;
import std.cstream;
//appender fonksiyonu için
import std.array;

class Foo
{
private:
//3x3 lük bir dizi. C++ için mDizi[3][3]
float[3][3] mDizi;
public:
//Foo sınıfının yapılandırıcısı. C++ da sınıfın ismi
this()
{
mDizi = new float[3][3];
mDizi = [[0,0,0],[0,0,0],[0,0,0]];
}
//Foo sınıfının yıkıcı fonksiyonu
~this()
{
//Ekrana parametre olarak girilen string yazdırılır ve imleç bir alt satra geçer
//C++ için cout<<"Nesne Silindi..."<<endl;
writeln("Nesne Silindi...");

/* D nin kendi çöp toplayıcısı var ama isteğe bağlı olarakta kendimiz de
c++ da olduğu gibi yine "delete" yardımı ile silme işlemini yapabiliyoruz.*/
delete mDizi[][];
}

/* İşletim sistemine göre 2 ayrı yaz() fonksiyonu var.
version() yardımı ile hangi işletim sistemi olduğunu belirliyoruz.
C++ için #ifndef-#endif */
version(Windows)
{
//İşletim sistemi windows ise çalışacak fonksiyon
void yaz()
{
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
// ┌ karaterin ekrana basar
if (i==0 && j ==0)
{
/*cast() yardımı ile tür dönüşümü yapıyoruz.
c++ için static_cast<char>
Ekrana parametre ile girilen string yazdırılır fakat imleç aynı satırda kalır.*/
write(cast(char)218);
}

// │ karakterini ekrana basar
if (i==1 && j == 0)
write(cast(char)179);

// └ karakterini ekrana basar
if (i==2 && j == 0)
write(cast(char)192);

//writef() fonksiyonu printf() fonksiyonu gibi kullanılır.
writef("%8.2f ",mDizi[i][j]);

// ┐ karakterini ekrana basar
if (i==0 && j ==2)
write(cast(char)191);

// │ karakterini ekrana basar
if (i==1 && j ==2)
write(cast(char)179);

// ┘ karakterini ekrana basar
if (i ==2 && j ==2)
write(cast(char)217);
}
writeln();
}
}
}
else version(linux)
{
//İşletim sistemi linux ise çalışacak fonksiyon
void yaz()
{
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
if (i==0 && j ==0)
write("┌");

if (i==1 && j == 0)
write("│");

if (i==2 && j == 0)
write("└");

writef("% 8.2f ",mDizi[i][j]);

if (i==0 && j ==2)
write("┐");

if (i==1 && j ==2)
write("│");

if (i ==2 && j ==2)
write("┘");
}
writeln();
}
}

}

void diziDoldur()
{
float k=1.00;
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
{
mDizi[i][j] = k*1.00;
k++;
}
}
}
//c++ daki const D dilinde de mevcut. Ama aralarında bazı farklıklar var.
void dizidenAl(const float pDizi[][3])
{
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
mDizi[i][j] = pDizi[i][j];
}
}
//"ref" anahtar kelimesi ile fonksiyona parametre olarak referans göndermiş olduk.
//C++ da "&" işleci bu işi yapar
void diziyeDöndür(ref float pDizi[][3])
{
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
pDizi[i][j] = mDizi[i][j];
}
}
//Kullanıcının sayı girebilmesi için
void klavyedenAl()
{
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
{
writef("mDizi[%d][%d]: ",i,j);
//Program çalışırken kullanıcıdan veri girişi istenir.
din.readf(&mDizi[i][j]);
}
}
}

/* toplama operatörünü(+) Foo sınıfdan oluşturulmuş iki nesnenin mDizi değişkenlerini
toplayacak şekilde aşırı yüklenmesi
C++ için "Foo Foo::operator+(Foo pToplanan)"*/
Foo opAdd(Foo pToplanan)
{
Foo yedek = new Foo();
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
yedek.mDizi[i][j] = mDizi[i][j] + pToplanan.mDizi[i][j];
}

return yedek;
}
}

Foo nesneOluştur()
{
Foo nesne = new Foo();
// nesne.klavyedenAl();
nesne.diziDoldur();

return nesne;
}

char tuşAl()
{
char tuş;

do
{
din.read(tuş);
} while(tuş == '\n');

return tuş;
}

int main()
{
char cevap;
float[3][3] dizidenAl=[[10.00,11.00,12.00],[13.00,14.00,15.00],[16.00,17.00,18.00]];
float[3][3] diziyeDöndür;
Foo f1 = new Foo();
Foo f2 = new Foo();
Foo f3 = new Foo();
Foo f4 = new Foo();
Foo[] fooDepo = new Foo[0];

auto sonunaEkle = appender(&fooDepo);

sonunaEkle.put(nesneOluştur());
do
{
if (cevap!='x')
writeln("NesneEklendi...");
write("Yeni Bir Nesne Oluşturmak İstermisiniz(E/H)?");
cevap = tuşAl();

switch(cevap)
{
/*C++ da olmayan bir özellik.D de switch yapısnda
virgül yardımı tek bir "case" satırında koşula
uygun birden fazla değer sonuç yazabiliyoruz*/
case 'e','E':sonunaEkle.put(nesneOluştur());break;
case 'h','H':break;
default:writeln("Lütfen E veya H karakterlerinden birini seçin");
cevap='x';break;
}
}while(cevap =='e' || cevap =='E' || cevap =='x');

foreach(yedek;fooDepo)
f2 = f2+yedek;

writeln("\n===fooDepo dizisine eklenen nesnelerindeki mDizi değişkenlerinin toplamı===");
f2.yaz();

writeln();

//Harici bir diziden veri alınması
f3.dizidenAl(dizidenAl);
writeln("===Harici bir diziden veri alan f3 nesnesi===");
f3.yaz();

writeln();

//Harici bir diziye veri gönderilmesi
f4.diziDoldur();
f4.diziyeDöndür(diziyeDöndür[]);
writeln("===f4 Nesnesinde harici bir diziye veri gönderildi===");
for (int i =0;i<3;i++)
{
for (int j=0;j<3;j++)
writef("%8.2f",diziyeDöndür[i][j]);

writeln();
}

return 0;
}



Pazartesi, Ağustos 10, 2009

Spezify görsel arama motoru

Spezify semantik aramaya dayalı olarak geliştirilmiş bir görsel arama motorudur. Burda ki görsellik ile aslında iki şeyi kastediyorum, ilki sadece görsel sonuçların ağırlıklı olduğu diğeride metinsel ifadelerinde görsel olarak gösterildiği manasında. Spezify bu ikisini yapmakata. Yani ağırlıklı olarak görsel öğelere yer vermekte, sonuca göre çıkan metinsel ifadeleride yine görsel olarak göstermekte.
Aslında fikir yeni değil. Bu işi yapan ginipic gibi bilgisayar yazılımları mevcut. Birkaç yıl önce yine görsel arama motoru olan pagebull'u duymuştum. Ozaman pek ilgilenmemiştim spezify keşfedince aklıma geldi, nette aradım ama artık hizmet vermediğini öğrendim. Yine semantik olmasada görsel arama motoru olarak adlandırılan managedq da örnek olarak gösterilebilir. Ve yine bu yazıyı hazırlarken öğrendiğim ve çok da heycanlandığım hakia var(dı). Vardı diyorum çünkü artık yok sanırım geliştirilmesi durdurulmuş :((. Hatta ana sayfasında "Türküz, doğruyuz, çalışkanız ve google'a rakibiz" şeklinde sloganı bile varmış :)).Buradan hakia ile ilgili bir yazıya ulaşabilirsiniz.
Konuyu fazla dağıtmadan bu yazımın esas oğlanı olan Spezify nin artılarını ve eksilerini değerlendirmeye başlayalım.
  • Web 3.0 standardı ile ismini sıkça duyamaya başladığımız semantik arama yapması spezify gelecek vadeder hale getiriyo.
  • managedq ile karşılaştırıldığında çok daha hızlı.
  • Arama sonuçları ekranda dağınık olarak gösteriliyo. Bu işleri biraz zorlaştırıyo.
  • Farenin sol tuşunu basılı turarak sağa - sola ve aşağı - yukarı hareket edilebilmekte.
  • Spezify aramalarında farklı arama motorlarının ve sitelerin API lerini kullanıyor.
  • Yahoo!,YouTube,Twitter,Wikipedia,Flickr ve eBay'i kaynak olarak kullanıyor.
  • Kotalı bir internet kullanıcısı olarak spezify görsel sonuçları ağırlık verdiğinden kota sınırlarını zorlıyacaktır diye düşünüyorum :).
Spezify den bir kaç ekran görüntüsü: