Archive for July, 2008

Diğerlerinin yapamadığını yapmak: FreeBSD

Friday, July 18th, 2008

Bir haftadır almış olduğum Edimax 7128G Wireless kartını AP (Access Point) olarak çalıştırmaya uğraşıyorum. Öğrendim ki, bu kartın ne Linux sürücüsü ne de Windows sürücüsü AP olarak çalıştırmayı desteklemiyormuş. RT61 özgür sürücü projesinin sayfasından edindiğim bilgiye göre, wireless kartım FreeBSD altında AP olarak çalışabiliyormuş. İşte FreeBSD ile tanışma fırsatım bu şekilde oldu.

Daha önce çok kısa bir süre denemiştim FreeBSD’yi. Bu kısa sürelik dilimde, kendisi adına bir şey öğrenmek gibi bir çaba sarfetmedim. Şimdi ise bir sunucu için vazgeçilmez olarak kullanabileceğim bir işletim sistemi olarak görüyorum. Çok katı olması kendini cezbeden özelliği.

FreeBSD yüklenirken sadece core olarak yükleniyor. Hiç bir paket kurulmuyor. Sadece Linux uyumluluğu isterseniz, Linux uyumluluğu paketi kuruluyor. Daha sonra FreeBSD protlarından istediğiniz yazılımı kurabiliyorsunuz.

FreeBSD’nin portları (paketler) ise baya esnek. İsterseniz hazır derlenmiş binary paketleri kurabiliyorsunuz, isterseniz paket CVS deposunu çekip, oradan istediğiniz paketi kurma talimatını verebiliyorsunuz. FreeBSD size paketi indiriyor ve gerekli yamaları uygulayıp kendine uygun halde derliyor. Tamamen Make tabanlı paket sistemi, istediğiniz ayarları da yapabilmenize olanak sağlıyor. Sistem aynı zamanda, istediğiniz zaman sonradan yüklediğiniz tüm paketleri silmenize izin veriyor.

FreeBSD network bazında da kendi kernelini kullanıyor. Tamamen kendisi için geliştirilmiş olan sshd, ftpd, natd gibi araçları kullanıyor. Network yapılandırması bir router için Linux’un iptables’inden çok daha kolay. Gateway özelliğini açmalı ve Nat’ı aktifleştirmeniz bir router yapmanız için yeterli.

Dökümantasyon konusunda ise yazılmış olan handbook, bilmek istediklerinizi fazlasıyla karşılıyor. Handbook FreeBSD’yi ilk defa kullanacaklardan ustalara hitap edecek seviyede. Bu kadar açık dil ile yazılmış bir tek PHP‘nin manuelini görmüştüm.

İnternet üzerinde biraz FreeBSD’yi araştırdığınızda ise Netcraft’ın uptime’ı en uzun süre olan makineler listesinde bir çok FreeBSD makina ile karşılaşıyorsunuz. Eğer linke tıklarsanız gerçekten bu sürenin hayli uzun olduğunu görebilirsiniz. 1735 gün (4 sene 10 ay) açık olan makineler söz konusu.

Programlama araçları olarak FreeBSD üzerinde, kendine göre modifiye edilmiş gcc mevcut. Kütüphaneler olarak glibc yerine kendi apileri var. İsterseniz glic’yi paket olarak kurabiliyorsunuz.

Gördüğüm bazı eksiklere değinmek gerekirse, malesef FreeBSD terminalinde UTF-8 karakter seti kullanmak mümkün değil. Terminal en fazla 255 karaktere kadar destekliyor. Bunun yanında herhangi bir sanal makina kurmak ta mümkün değil. Hostunuzda sanal makina kullanmak isterseniz sorun yaratabilir.

Uzun lafın kısası, gerek üretici tarafından, gerekse kullanıcı topluluğu tarafından AP modunda desteklenmeyen Wireless kartım FreeBSD sayesinde çok iyi bir şekilde hizmet veriyor. Bunun yanında katı Unix benzeri bir sistemi keşfetmek çok zevk verici.

Alien Numbers

Tuesday, July 8th, 2008

Google code.jam‘i keşfetmem üzerine hemen kolları sıvadım. Code Jam, Google tarafından düzenlenen bir programlama yarışması. Verilen problemleri istediğiniz bir programlama dili kullanarak çözmeye çalışıyorsunuz. Yarışmanın ilk ayağı 16 Temmuz Çarşamba günü başlayacak. Üyelik ücretsiz. Profesyonelinden öğrencisine herkes yarışmaya katılabilir. Birinciye $10.000 ödül verilen yarışmada derece yapmanın Google’da bir iş bulabilmeye yarayacağını düşünüyorum.

Şuan için code.jam’da örnek problemler mevcut. Bu problemler yarışanların code.jam hakkında fikir sahibi olmalarını sağlıyor. Pratikler alanında yer alan ilk problem Alien Numbers. Diğer problemlere göre kolay olan bu probleme bende bir çözüm üretmeyi başarabildim.

Nedir Bu Uzaylı Sayılar?
Pratiklerde yer alan ilk problem yeni bir sayı sistemi yaratmak ile ilgili. Problem sizden verilen karakterlere göre 2 değişik sayı sistemi yaratmanızı ve bu sistemde geçen bir sayıyı, ikinci sayı sisteminde yer alan karşılığını vermenizi istiyor. Diğer problemlere göre kolay olan bu problemi Perl ile yapmayı başardım. Size kısaca algoritmasından bahsedeyim.

Problemde yer alan açıklamaya bakacak olursak şu şekilde. Şuan kullandığımı sayı sistemi 0123456789 rakamlarından oluşmakta. Problem bize diyor ki size verdiğim karakterlerde bir sayı sistemi yarat ve alien sayısını, kaynak dil ile üretilmiş sayı sisteminden, hedef dil ile üretilmiş sayı sistemine tercüme et diyor. Problem programın yapmasını istediği 3 veri sunuyor.

alien_sayisi kaynak_dil hedef_dil

Problemin sayfasında yer alan örneklere bakacak olursak; alien sayısı olarak 9, kaynak dil olarak 0123456789 ve hedef dil olarak “oF8″ karakterleri verilmiş. Öncelikle kaynak dili ele alalım. Kaynak dil şuan kullandığımız sayı sistemidir ve oluşturulabilecek sayılar şu şekilde olmaktadır: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12… Görüdüğünüz gibi 0′ı kullanmadık. Sayma sayıları 1 den başlamaktadır. Hedef dilimizde de böyle olmalı. Verilen alien sayısı 9 bu sayı sisteminin 9. sayısını oluşturmaktadır. İkinci sayı sistemine bakacak olursak bize “oF8″ karakterleri verilmiş. Bu karakterler ile oluşturulacak sayılar şu şekilde olur: F, 8, Fo, FF, F8, 8o, 8F, 88, Foo, FoF… 9 sayısı kaynak dilimizde 9. sırada yer almaktaydı. Demekki 9 sayısının hedef dilimizde ki karşılı, hedef dilimizde 9. sıarada yer alan Foo.

Peki bunu programlama ile nasıl yapacağız?
Bu problemi programa dökmek için gerçek hayattaki gibi düşündüm (farklı çözümler üretenler de olmuş). Kullandığımız sayı sisteminde yer alan sayılar ile sonsuz miktarda sayı üretebiliyoruz. 0 1 2 3 4 5 6 7 8 9 ile saydıktan sonra 10 geliyor. Yani son sayıya geldiğimizde, eğer solunda bir sayı yoksa soluna bir ilk sayma sayımız ekleniyor ve ilk sayımız başa dönüyor. 17 18 19 20 şeklinde saydığımızda ise solda yer alan sayı, sayma sayılarımızın son sayısı olmadığından bir arttırılıyor. Yaptığım programın aynen bunu yapmasını sağladım. Öncelikle tüm sayıları bir array‘a bölüp, daha sonra 1. sayıdan başlayarak artmasını sağladım. Arttır fonksiyonunu inceleyecek olursak:

Teknik nedenlerden dolayı kaynak kod kaldırılmıştır. Lütfen aşağıdaki linkten kaynak kodu indiriniz.

Program üzerinde algoritmayı anlatmaya çalıştım. Programın tam halini:

http://onurs.googlecode.com/files/problema.zip

Adresinden indirebilirsiniz. Problem açıklaması ve girdi dosyası bulunmaktadır.

C ile Düzenli İfadeler

Friday, July 4th, 2008

Bu yazımda C programlama dili ile nasıl Düzenli İfadeler (Regular Expressions) kullanabileceğinizi anlatacağım. Yazı düzenli ifadeler’i bildiğinizi farz alarak hazırlanmıştır.

Öncelikle C dili için düzenli ifadeler kütüphanesini edinmelisiniz. GNU C Library ile gelen regex kütüphanesini kullanacağız. Eğer GNU tabanlı bir işletim sistemi kullanıyorsanız libc6-dev paketini yüklemeniz yeterli olacaktır. MS Windows tabanlı bir işletim sistemi kullanıyorsanız regex kütüphanesinin Windows portunu MinGW‘nin download sayfasından indirebilirsiniz.

(more…)