Salı, Kasım 29, 2005

Daha ne Olsun

Ruby yakında konuştuğunuzu anlayacak muhtemelen ;-)

This seemingly empty class definition is the recipe business object that Rails maps to the recipes table in the database. You will see more concretely what I mean by this in a moment. Right now, I want to point out that this little bit of programming magic happened because we used a Rails naming convention: a singular model class name (Recipe) maps to a plural database table (recipes). Rails is smart about English pluralization rules, so Company maps to companies, Person maps to people, and so forth.

Pazartesi, Kasım 28, 2005

Biz kırk kişiyiz birbirimizi biliriz

Geçen hafta tıbbi bilişim derneği tarafından Antalyada düzenlenen tıbbi bilişim kongresindeydim. Beklediğimin üstünde bir etkinlikdi. Çok faydalı oldu. Özellikle sağlık bakanlığının yoğun katılımı kongrenin verimini ve etkinliğini büyük ölçüde arttırdı bana kalırsa.

Bu arada piyasadaki hastahane yönetimi programlarını da inceleme fırsatı buldum toplu halde. Ve hayatımda gördüğüm en büyük kaynak israflarından biriydi... Bu yazılımların hepsi aynı işi yapıyor, aynı şekilde yapıyor. Sağlık bakanlığı bunlardan birini alıp kodunu açsa hastahaneler büyük ölçüde bu yazılıma yöneleceklerdir. Firmalarda açık kaynak modeline uygun olarak destek satacaklardır. Geliştirilen diğer modüllerde programa ekelndikçe çok verimli ve standart bir yapı oluşacaktır sağlık camiasında ama... Nerde o vizyon...

Bir umuttur yaşatan insanı

Kötü cumartesi,
Kötü pazar,
Berbat pazartesi,

Ve umut ve hayal,
Nerden geldi ?
Tam umutdan umudumu kesmişken,
Şair söyledi,

Akıyorsa göz yaşım kurumasın
Coşup seven gönlümse durmasın,

Öyle ya

Hiç bir kere hayat bayram olmadı
yada
Her nefes alışımız bayramdı...

Salı, Ekim 18, 2005

Matematik ve Romantizm

Bu yakın çağ yazarlarının nasıl bu kadar romantik olduklarına şaşırmamak gerekiyor. Adamların yaşadığı çağın gereği. Son asırda düello sırasında vurulup ölen kaç matematikçi biliyorsunuz ki ?

Sözü fazla uzatmadan pek fazla tanınmayan bir matematikçiden bahstmek istiyorum.

Fransız matematikçisi Galois, 1811-1832 yılları arasında yaşadı. Abel'in çağdaşı olan bu matematikçinin doğum ve ölüm tarihlerine bakarsanız 21 yıllık bir ömür sürdüğünü görür ve bu işte bir yanlışlık olduğunu düşünebilirsiniz. Hiçbir yanlışlık yok. Galois'nın hayatı Brezilya dizilerine konu olmaya aday şanssızlıklarla sürüp gitmiş ve 21 yılda tükenmiştir.Fransız matematikçisi Galois, 1811-1832 yılları arasında yaşadı. Abel'in çağdaşı olan bu matematikçinin doğum ve ölüm tarihlerine bakarsanız 21 yıllık bir ömür sürdüğünü görür ve bu işte bir yanlışlık olduğunu düşünebilirsiniz. Hiçbir yanlışlık yok. Galois'nın hayatı Brezilya dizilerine konu olmaya aday şanssızlıklarla sürüp gitmiş ve 21 yılda tükenmiştir.

Paris yakınlarındaki küçük bir kasabanın belediye başkanının oğlu olan Galois, matematiğe okul yaşamı sırasında ilgi duymaya başlamış ve 14 yaşındayken Lagrange ve Abel'in eserlerini okumuştur.Sınıfta, büyük matematikçilerin kuramları üzerine düşünmesi, ödevlerini unutması ve dikkatsizliği nedeniyle öğretmenlerini kızdırdığı bilinmektedir. Galois'in matematiğe karşı duyduğu sevgi o kadar büyüktü ki birgün öğretmenlerinden birisi, "Anne-babasının Galois'e sadece matematik dersi aldırmalarının iyi olacağını düşünüyorum." demiştir.

Daha 16 yaşında iken pek çok matematik klasiğini okumuş olmasına rağmen üniversiteye kabul edilmedi. Kendisini kanıtlayabilmek için 17 yaşında zamanın tanınmış matematikçilerinden Cauchy'ye verdiği makalesini Cauchy kaybetti. 18 yaşındayken bir yarışmaya soktuğu bir diğer makalesi de, yarışmanın hakemi Fourier ölünce kayboldu. Zorla girebildiği öğretmen okulundan, okul yönetimini eleştirdiği için kovuldu. Bir dergiye sunduğu bir başka makalesi, hakem ispatların içinden çıkamadığı için reddedildi. Bir taraftan matematik dersleri vererek hayatını kazanmaya çalışan Galois bir tarfatan da siyasete bulaşmıştır. 1830 Devrimi'ne Cumhuriyetçi olarak katıldı. Siyasi nedenlerle de iki kez hapse girip çıktı.

Ve nihayet, ertesi sabah düello edeceği, o soğuk mayıs gecesi gelip çatar. Galois henüz 21 yaşındadır. Tüm hayatı siyasi fikirler ve matematik teorileriyle geçmiş bir genç elbette insan öldürme 'sanatı' üzerine bilgisizdir. Öldürüleceğini anlar. Oysa daha kafasındaki matematik fikirlerini olgunlaştıracak zamanı olmamıştır. Ölümün bekleme odasında volta vurduğu bir saatte bu genç adam insanoğlunun ölümsüzler listesine adını yazdırmak için son kez hamle yapar. Bu son gece arkadaşı Chavelier'e bir mektup yazar. Bu mektupta Gauss'un kullandığı bazı teknikleri genelleştirerek, derecesi dörtten büyük olan her polinom için çalışacak bir 'kök bulma yöntemi' bulmanın neden imkansız olduğunu anlatır. İçinde kökleri aradığımız sayı sistemleri "cisimler" ile kökleri kendi arasında döndüren permütasyon "grupları" arasında daha önce gözlenmemiş ilişkiler bulur. Bu ilişkiler yumağına bugün genel olarak Galois teorisi denir.

Denklemin katsayılarını içine alan sayı sistemine denklemin tüm köklerini teker teker katarak sistemi büyüttüğümüzü düşünelim. Öte yandan tüm kökleri kendi arasında dönüştüren permütasyon grubu ve onun bazı kökleri sabit bırakan alt gruplarını düşünelim. Galois bu iki dünya arasında köprü kurar ve bir taraftaki kök bulma problemini, öbür tarafta bir grubun yapısını inceleme problemine dönüştürür. Görür ki, eğer bu tarafta kök bulunabiliyorsa öbür tarafta da grubun özel bir yapısı olması gerekir. Oysa bu özel yapının, derecesi dörtten büyük denklemelere karşılık gelen gruplarda, her zaman olmadığını tespit eder.

Sonuç olarak insanlığın iki bin yıldır aradığı kökler, basit cebirsel yöntemlerle bulunamaz. İşte Galois teorisinin basit bir özeti. Belki bu 'basit' açıklama size gereğinden fazla ayrıntılı ve teknik gelmiş olabilir. Daha kısa ve daha öz Galois teorisini neden anlatamayacağımı Galois teorisi hakkında söylenen bir sözle açıklayayım; "Galois teorisi sarımsağa benzer, azı olmaz..."

Galois'nın mektubu ölümsüzlüğe doğru fırlatılmış bir çığlıkla biter: " Bütün bu karmaşık hesapları açmakta kendisine yarar görecek birilerinin çıkacağını umarım." Ertesi gün düelloda vurulur. Hastanede bir gün can çekiştikten sonra ölür. Arkadaşı bu mektubu üç ay sonra yayınlarsa da mektup ilgi görmez. makalelerinin çoğu 1846'da yayımlanıncaya kadar gün ışığına çıkmamıştır. Bu tarihte Cauchy, grup kuramı hakkında yayınlar yapmaya başlayınca, Galois'in çalışmaları da matematikçilerin ilgisini çekmiştir.

Galois'in öneminin tam olarak anlaşılması, Camille Jordan'ın 1870 yılındaki yayımlarıyla gerçekleşmiştir. Eğer Galois, Newton ya da Gauss gibi uzun yıllar yaşamış olsaydı, matematiğe yapacağı katkıların çok daha fazla olacağı kesindir.

Pazar, Ekim 16, 2005

İlk jsf Uygulamam

Bütün o iyi hazırlanmış help sayfalarına rağmen yinede biraz zor oldu. Ama sonunda oldu . Jdeveloper'la ilk jsf uygulamamı yazdım. İlk başta biraz karışık görünüyor ama alışınca işleri oldukça kolaylaştıracak kadar güçlü bir teknoloji hissi verdi bana JSF. I sense the power. I want the all power :-).

Not: Bu arada deployment da problem çıkardı jdeveloper. O işi şimdilik elle hallettim. Ama hata mesajlarından anlayabildiğim kadarıyla windows ve karakter problemlerinden kaynaklanıyor sorun. Büyük bir hocamızın dediği gibi "Then I curse the Bill Gates"

Not2: Bu arada bir hatada EJB diagramına veri tabanı tablolarını sürükle bırak yaparken oluşabiliyor. Verdiği hata java.lang.NullPointerException şeklinde. sorun bilinen ve düzeltilmiş bir hata (Metalink Bug number 4624229). Ancak son versiyonu nedense halen indiremedim. Geçici bir çözüm dil ayarlarını denetim masasından ingilizce olarak belirleyip programı yeniden başlatmak...

Cumartesi, Ekim 15, 2005

Let's Go

What Video Game Character Are You? I am a Gauntlet Adventurer. I am a Gauntlet Adventurer.

I strive to improve my living conditions by hoarding gold, food, and sometimes keys and potions. I love adventure, fighting, and particularly winning - especially when there's a prize at stake. I occasionally get lost inside buildings and can't find the exit. I need food badly.

What Video Game Character Are You?

Pazar, Ekim 02, 2005

Tatil Dönüşü Oracle

Tatil bitti çalışma zamanı. Bir yandan aldığım 10 ders diğer taraftan iş yerindeki projeler. Spora vakit ayırmak lazımdı ama o meseleyi sabah 6.20 de kalkıp koşarak hallettim gibi. Diğer taraftan tenis ve aikidoyu bırakmak istemiyorum. Bir de vucut geliştirme için zaman lazım. Yazın kütüphaneye iade ettiğim japonca kitabını geri almak istiyorum. Ve tüm bunların ötesinde kişisel projeler var ( para kazanmak lazım :) ). Ve bir arada eğlenmek ve dinlenmek lazım. Ooof oof benden bana bir tane daha lazım.

Tatilde Myeclipse kurcalamıştım biraz. Küçük bir JSF gösterisi yaptım bölüm başkanın hoşuna gitti ama onun kalbi alışık olduğu Oracle'dan yana :) Benden Jdeveloperı incelemi istedi. Bende ADF destekli 10.1.3 versiyonunu indirdim. Adamlar sağlam iş çıkarmış. Kapalı kodlu ama ücretsiz. Açık kodlu alternatiflerinden çok çok üztün durumda olduğunu itiraf etmem gerekiyor. Sahip olduğu özellikler gerekse Oracle ın dokümantasyon desteği sayesinde çok başarılı bir ürün çıkmış ortaya. Hemen her konudaki flash öğreticileri gerçekten çok güzel. Sanırım biraz PL/SQL öğrenmemi gerektirecek olsada Oracle ı tercih edeceğim.

Yeni projede kullanacağımız sunucu da geldi bu arada. Çok şık bir alet standart özelliklerine ek olarak + 1 GB ram ve 2 x 72.8 SCSI HDD içeriyor. İç tasarımı mükemmel. Kurulumu yapan gençlerin iddası iç tasarımı ferrarinin tasarımcısın yaptığı yönündeydi. Doğrumu bilmiyorum ama çok hoş bir oyuncak. Tek kusuru win2003 yüklü olarak gelmesi oldu :-). Ama çok yakında değişecek bir aksilik olmazsa.

Tabi bu iş için gerçekçi nedenlerim olması gerekiyordu bölüm başkanına anlatmak için.
Sonuçta Win2003 ile M$ nin iyi bir iş çıkardığını kabul etmek gerekir. Ancak kendi jvm sinin geliştirmesini durduran, Java'yı piyasadan silmek için .net e milyonlarca dolar yatıran M$ nin java teknolojileri konusunda ileride takınacağı tavrın belirsizliği ve M$ nin bu tip konulardaki kirli geçmişi yeterli nedenleri sağladı bana. Sonuçta bundan 3-4 yıl sonra M$ ve Java birlikteliği üzerine yapılan bilgi-birikimin boşa gitmesi ihtimalini sağlam bir şekilde ortaya koyduktan sonra bu anlamda oldukça yol aldım sanırım.

Bu arada yeni elemanın sorumluluğuna verdiğim php projesinden de tamamen kurtulamadım ne yazık ki :( Sorunlu kodları düzeltmem gerekiyor halen. Neyse şimdilik iyi gidiyor sanırım yeni gelen iki elemanıda yetiştirmemle php defterini tamamen kapatacağım muhtemelen ;-)

Cumartesi, Eylül 03, 2005

Hava Durumu Tahminleri ve Ekonomik Tahminler

Katrina kasırgasının ABD yi vurduğu şu günlerde fraktallarla ilgili araştırma yaparken gözüme çarptı. Yazıdan ilginç alıntılar;

1961 yılının kış aylarında bir gün, Lorenz bu ardışık sayı dizilerinin birini uzun uzadıya incelemek istediği bir sırada kestirme bir yol izlemeye kalkıştı. Programı tekrar başa dönüp çalıştırmak yerine ortalarda bir yerden başladı. Makineye başlangıç durumundaki şartları vermek için, daha önce yazıcıdan çıkardığı dizilere bakıp oradaki sayıları klavyeden aynen girdi. Sonra da hem makinanın gürültüsünden kaçmak, hem de bir fincan kahve içmek üzere koridorun sonundaki hole gitti. Bir saat kadar sonra döndüğünde hiç ummadığı bir şeyle karşılaştı; hem de öyle bir şey ki bununla artık yepyeni bir bilim dalı filizlenmeye başlıyordu.

Bilgisayarın yaptığı bu dökümde bir önceki dökümün tıpatıp tekrarlanması gerekirdi. Lorenz aynı sayıları makineye kendi elleri ile girmişti. Programda bir değişiklik yoktu. Oysa Lorenz yazıcıdan yeni çıkan döküme baktığında gördüğü şey şuydu: Hava durumu bir önceki dökümde yer alan şekilden o kadar hızla uzaklaşmaktaydı ki, bir kaç aylık bir süre zarfında, aradaki bütün benzerlik ortadan kalkmıştı. Lorenz bir bu sayı kümesine baktı, bir de önceki sayı kümesine. Sanki bir şapkanın içinden rastgele iki hava durumu seçip almış gibiydi. İlk aklına gelen şey, gene vakumlu tüplerden birinin bozulduğu oldu. (1961 yılından bahsediyoruz, o zamanlar bilgisayarlar şimdikinden çok farklıymış) Birden gerçeği farkına vardı. Makina bozulmuş falan değildi. Mesele makinaya işlediği sayılardan kaynaklanıyordu. Bilgisayarın hafızasına kaydedilen ondalık kesir sayıları altı haneydi: .506127. Yazıcıdan çıkan dökümde ise yerden kazanmak için, sadece üç hane görünüyordu: .506. Lorenz sayıları kısaltarak son üç rakamı yuvarlamış, binde birlik bir farkın sonucu etkilemeyeceğini düşünmüştü. Aslında bu varsayımın akla aykırı bir yönü yoktu. Bir meteoroloji uydusu okyanusun yüzeyindeki sıcaklığı binde birlik bir hassaslıkla okuduğunda, uzmanlar kendilerini şanslı addediler. Lorenz'in Royal McBee'si (*) klasik programı uyguluyordu. Tamamiyle determinizme dayalı denklemler sistemi kullanmaktaydı. Belirli bir çıkış noktasından hareket edildiğinde hava durumunun her seferinde tıpatıp aynı gelişmeyi göstermesi gerekirdi. Biraz daha farklı bir çıkış noktasından hareket edildiğinde, hava durumunun da biraz daha farklı bir gelişme göstermesi gerekecekti. Küçücük bir sayı hatasının rüzgarın hafif esintisinden farkı yoktu; tabi ki hafif esintiler hava durumunda önemli, büyük ölçekli değişimleri getirmeden önce ya zayıflayıp ortadan yok oluyorlar ya da birbirlerini dengeliyorlardı. Oysa Lorenz'in kendine özgü denklemler sisteminde küçücük hatalardan büyük felaketler doğmaktaydı. devamı...

Cuma, Eylül 02, 2005

Bill Gates ve Apple




Ne Yorum Yapayım ki şimdi ben bu resmin üstüne...

Çarşamba, Ağustos 31, 2005

Programcılık Nereye Gidiyor ?

Bazen düşünüyorum programcılık nereye gidiyor diye....


Linux-programlama listesinde bir süredir devam eden bir tartışma var. Bir arkadaşımız genetik ile ilgili bir proje için 2 bitlik bir veri tipni nasıl oluşturacağını ve bu işin kazançlı olup oladığını soruyordu. Tüm tartışmaya linux-programlama listesinden erişebilirsiniz. Ancak benim aklıma takılan serdar hocanın yazdığı bir iletiydi


Alıntı:
Selamlar...


İki bitlik değişken olur. Ama bu yanındaki diğer bitlerde doluysa bir anlam ifade eder. Bkz: struct, ":" vs.


10^7 ne eder 10 milyon mu? 2 bit olsa her değer ne olur ? 20 Milyon bit. Ne eder, kabaca 2.5 MB filan. Her biri 8 bit olsa, 10 MB eder.


Genel olarak çoğu mimaride "int" 32 bit uzunlukta. Bu da bir int içine 16 tane 2 bit saklayabileceğiniz anlamına gelir. Fakat bu bitleri buradan çıkarmak ve yerleştirmek için çok çok daha fazla zaman harcarsınız. Kabaca, bu bitleri karşılaştırmak 5 saat çevrimi sürse, bitleri çıkarmak 30 saat çevrimi, koymak 30 saat çevrimi filan eder. Toplam 65 saat çevrimi. Bu da 10 kat daha yavaş çalışacaksınız demek olur.


2 yerine 8 bit kullanmakta benzer bir yavaşlığa sebep olur. Genel kural olarak en hızlı işlenen değişkenler "int" olanlardır.


Görüldüğü üzere sorun optimizasyon sorunu. Seçim yapmanız lazım: "Optimize for size" yada "Optimize for speed" arasında. 256 MB RAM olan bir sisteme dudak büküldüğünü düşünürsek, bir kaç MB için bir sürü takla atmaya ihtiyaç olmaz sanıyorum. O kodu yazarken kullanacağınız elektrik/su parasına sisteme biraz daha RAM
alabilirsiniz nerdeyse.


Saygı ve sevgiler..



Yıl içinde java ile ilgili bir sunumda java için yaklaşık şöyle birşey deniyordu


Alıntı:
JIT


Java ilk çıktığında bytecode işletme hızı çok iyi değildi. yerine göre sistemin öz yazılımlarından 5-10 kat yavaş çalışıyordu. Bu nedenle bazı yazılım geliştirme şirketleri JIT yanı "Just-in-time compile", "anında derleme" araçları üretmeye başladılar. Yapılan şey byte kodu sanal makinenin kurulu olduğu gerçek sistemin diline anında derleme yaparak dönüştürmesiydi. Bu sayede performansta ciddi artışlar sağlandı. Ama 2000 yılından sonra HotSpot teknolojisinin gelişmesi ile JIT'in işlevi VM'içinde yer almaya başlamış, işlemci hızı ve bellek miktarının dramatik biçimde artması ile dış JIT yazılımları popülerliğini kaybetmiştir. Bugün halen bir kaç ürün pazarda bulunsa da genellikle bu yöndeki ihtiyaç yok olmuş gibi gözükmektedir.


Kaynak vikipedi



Yani sonuç olarak gelişen teknolojinin işçilerinin yerini alan robotları üretmesi gibi gelişen teknoloji ve görsel programlama araçları da biz programcıların (en azından kod optimizasyonu vs gibi konulara değer ve önem verenlerin) yerinimi alacak.


Şimdilik Büyük ölçekli projelerde kod optimizasyonu önemli olsada sıradan günlük kullanım için olan ve pc ler için yazılan programlarda önemini kaybetmekte gibi geliyor bana.


Teknolojinin bu hızda gelişimyle yakın gelecekte sunucular üzerinde yazılacak uygulamalar içinde önemini kaybedecek ve bizde hala burda lisp şöyle hızlı Ruby de şöyle kolay kod yazılıyor üstelik java dan da % bilmem kaç hızlı oluyor diye konuştuğumuzla kalacağız.


Bu gün sürekle bırak programcılığının yaygınlaşmasıyla yazdığı programın kodunun tamamını görmeyen (zaten görsede anlamayan) programcı sayısı o kadar fazla ki.


Üstelik bu adamlar bayağı ticari işlerde yapıyorlar. Mesela benim yarı-zamanlı çalıştığım kuruma gelip bizim sektör için son derece komik br fiyata komple çözüm öneren ve bayağı ciddi referanslar veren bir yazılım firması ile ilgili şefe sorduğum soru halen aklımdadır.


Ben : "Ne ile yazmışlar programı ? (Bahsettiğimiz program 300+ bilgisayar ve 100 bin doların üzerinde sunucularla çalışan bir kuruma kurulacak) "


Şef: "Visual Basic"


Ben : ..... ?!&%

Pazar, Ağustos 28, 2005

Tatil Bölüm 1

Tatile çıkabildim sonunda. Hesapta işten uzak duracaktım. Ama nerde gene jsp, jsf derken daldım işlere.

Hazır başlmışken biraz anlatayım. www.myeclipseide.com da bulabileceğiniz oldukça güzel bir ide var jsp,jsf,hibernate gibi ihtayacım olan pek çok teknolojiyi destekliyor. Ayrıca entegre bir görsel web tasarım aracı sayesinde jsp tasarımını oldukça kolaylaştırıyor. Kusursuz değil ama yıllık 29$ a sahip olabileceğiniz güzel bir ide.

Özelliklerini keşfettikçe yazacağım.

Bu arada en sonunda Kubuntu kurdum. Gerçekten güzel olmuş. Yalnız paket deposunda MidnightCommander olmamasını kınıyorum. Onun dışında güzel. Debianımın her seferinde sorun çıkardığı usb belleğimi sorunsuz tanıdı. Java ve Zemberek işini de halledersem babamı Linux a geçirmiş olacağım.

Perşembe, Ağustos 11, 2005

Hoş Geldin Galaksi

Otostopçunun galaksi rehberinin buradaki sinemaya gelişinin 3 hafta ertelendiği haberinin verdiği üzüntüyü. FM galaksi biraz olsun hafifletti. Netekim 100 ünlü türk büyğünden birinin dediği gibi "Fazlamesai zağmiağsı biır zağmia değil biır Zumğuriyettir".

Cumartesi, Temmuz 09, 2005

Hoşgeldin Thunderbird

Vakti zamanında Miguel De Iceza'ya gıcık olduğumdan evolution ı bırakıp kmail a geçmiştim ama onun da yaptığı saçmalıklardan sıkılınca Thunderbird de karar kıldım. Artık bu da olmazsa bundan sonra mutt kullanacağımı ahanda buraya yazıyorum...

Not: Acaba TDK sözlüğüne göre ahanda daki "da" eki bitişik mi yazılır ayrı mı ?

Cumartesi, Temmuz 02, 2005

Bu gün Linux için ne yaptın ?

Sizde Linux'dan sistem kurcalamaktan vs. hoşlanıyor olabilirsiniz. Ama şu donanım sürücülerinin problem çıkarması yok mu... Hem o kadar para ver makina al hem de donanım üreticisinin sağlaması gereken işleri yap. Yok çekirdek derle yok modül ekle. Mecbur muyuz kardeşim ? O zaman ne yapılır ? Kuruma alınacak sunucun şartnamesine şöyle ufak bir madde eklenir hem ruh sağlımız hem de Linux için faydalı bir iş yapılır...

Madde 3.4



Sunucunun bütün parçaları Debian Linux 3.1 işletim sistemi ile uyumlu olmalıdır. Firma işletim sistemi tarafından tanınmayan veya sağlıklı olarak hizmet vermeyen donanımı üniversite tarafından belirlenecek uyumlu eşdeğeri veya uyumlu üst modeli ile değiştirmeyi taahüt edecektir.


Evet efendim bence de pek leziz oldu :-)

Perşembe, Haziran 30, 2005

Sun Ne Kullanıyor ?


Sun research sitesinde gezinirken yukarıdaki durumla karşılaştım php (jsp zor mu geldi acaba :) belki yakında ruby on rails ile yapılmış bir sun siteside görürüz...)+ mysql kullanan sitenin hangi işletim sistemini kullandığına bakmadım ama o da linux olabilir mi acaba :)

Çarşamba, Nisan 20, 2005

Bill Amca Kızarsa

Bir yazı okudum hayatım değişti. Bu adresteki arkadaş windowzunda java ile program yazmaya çalışırken biraz zorlanmış ve klavyesinden şu cümleleler dökülmüş;

.NET'te böyle miydi? Açıyordun Visual Studio.NET i, sürükle bırak ile ekranı tasarlayıp, sonra onlara çift tıklayıp kod yazıyordun, run edip kullanıordun...

Bir gün gelecek Bill amca artık dayanamayacak :
-tamam ulen, yeter zaten kazandığım para, siliorum piyasadan tüm Microsoft ürünlerini, bakem ne halt etceksiniz, diyecek, işte o zaman JAVA'cılar Linux'cular görecekler dünyanın kaç buçak olduğunu... Anlayacaklar Bill amcanın kıymetini...

Yazıyı okuduğumdan beri halen korkmakdayım. Lütfen yardım ediniz...

Cumartesi, Nisan 16, 2005

Java ile Tasarım Modelleri

Bana kalırsa Java'nın .Net e karşı en büyük üstünlüğü geniş ve çok seçenekli yapısı. Bu sayede Hem geniş bir kullanıcı ve döküman desteğine sahip oluyor hem de geliştiriciler için pek çok alternatif sağlıyor.

Ancak bu yapı öyle bir kavram karmaşasına sebep oluyor ki insan bazen bir java sözlüğüne ihtiyaç duyuyor.

Java ile web tabanlı yazılım geliştirme konusunu araştırırken karşıma sürekli "Model 1" ve "Model 2" olarak adlandırılan kavramlar çıkıyordu. Bu kavramların ne olduğuna dair açıklama burada , hangi modelin ne zaman kullanılması gerektiğini anlatan kısa not ise burada mevcut.

Ayrıca jsp ile web tabanlı uygulama geliştirmeyi planlayanların mutlaka gözatması gereken güzel ipuçları içeren bir diğer belge de burada bulunuyor.

Çarşamba, Nisan 13, 2005

Gezegen'e İnmişim

Bu gün ne zamandır göz atmadığım gezegen e bakarken haftalar önce atmış olduğum mail neticesinde (ben umudu kesmiştim) günlüğümün gezegene eklendiğini fark ettim. Tüm camiaya hayırlı uğurlu olsun :)

Cuma, Ocak 21, 2005

Uygulamalar Çekirdekle Nasıl İletişim Kurar

Uygulamalar ve çekirdek arasıdaki iletişim sistem çağrıları ile sağlanır. Çekirdek çağrı isteyenin bu çağrıdan yararlanıp yararlanamayacağına karar verir. Örneğin her isteyenin sabit diske veri yazmaması sağlanır.

Linux’ta strace komutu ile, çalıştırılan programların kullandığı sistem çağrılarını görebilirsiniz.

void main()
{
printf("Denemen");
}

Derleyip, strace ile inceleyelim.

siseci:~/kernel# make 1

siseci:~/kernel# strace ./1

execve("./1", ["./1"], [/* 32 vars */]) = 0

...

...

write(1, "Denemen", 7)= 7

....



execve ile yeni bir process başlatılıyor. write ile 1 ile gösterilen dosyaya 7 bayt uzunluğunda "denemen" yazılıyor.

Şimdi yukarıda anlatılanları burada somut olarak görmekteyiz. Uygulamamız çalıştığında write çağrısını kullanıyor. Çekirdek ise burada programın isteğini değerlendiriyor ve eğer uygunsa izin veriyor.

Burada bir noktayı hatırlatmak istiyorum. Biz direk makine koduyla (assambler) çalışıyor dahi olsak. Uygulamamız ve işlemcinin arasında çekirdek bulunduğundan sistem çağrılarını kullanmamız gerekir. Biraz daha açmak gerekirse çekirdeğin yüklenmiş olması işlemcinin artık meşhur protected mode safhasına geçmiş olması demektir. Bu noktadan sonra bizim uygulamamızın çekirdeğin izini olmadan aygıtlara direk erişimi söz konusu değildir.

Konunun daha açıklayıcı olması açısından sistemin başlama anına geri dönelim ve neler olduğuna bir bakalım:

Linux çekirdeği sadece standart bir C programıdır aslında. Yalnızca iki önemli farklılık vardır. C dilinde
yazılan programların başlangıç noktası main(int argc,char **argv) yordamıdır. Linux çekirdeği start_kernel(void) kullanır. Sistem baslarken ve çekirdek yüklenecekken daha program çevresi mevcut değildir. Yani ilk C yordamı çağrılmadan önce bir kaç şey daha yapılmalıdır. Bu isi gerçekleştiren donanım kodu arch/i386/asm/ dizini altında yer alır.


Assembler dili yordamı çekirdeği tam olarak 0x100000 (1 Mbyte) bellek adresine yükler, ardından da başlatma süreci esnasında dışlamalı olarak kullanılan kesme hizmet yordamlarını (interrupt servicing routines), genel dosya tanımlayıcı çizelgeleri (global file descriptor tables) ve kesme tanımlayıcı çizelgeleri (interrupt descriptor tables) yükler. Bu noktada işlemci korunurlu moda girer. Çekirdeği başlatmak için gereksiniminiz olan her şey init& dizini altındadır. Burası çekirdeği doğru düzgün başlatmakla görevlendirilmiş, geçirilen tüm açılış (boot) parametrelerini dikkate alan start_kernel() yordamıdır. İlk süreç sistem çağrıları kullanılmadan oluşturulur (daha henüz sistemin kendisi yüklenmemiştir).


Ayrıca Aşağıdaki tablo'da işlerin genel olarak nasıl yürüdüğünü anlamamıza yardımcı olacaktır. [En kısa zamanda türkçeleştireceğime söz :) ].

Buradaki gösterim basit ve anlaşılabilir olması için yalnızca temel öğeleri içermektedir. Ancak temel yapıyı kavramak için oldukça yeterlidir.




Yukarıda printf fonksiyonun sebep olduğu write çağrısını basitçe gördük. Ancak iş sistem çağrısı gerçekleştiğinde bitmiyor.

Aşağıda read çağrısı ve ardından gerçekleşen olaylar gösterilmiştir.




Şimdi burada neler olduğunu adım adım inceleyelim.

read çağrısın işlevi basitçe herhangi bir veriyi kaynağından alıp, onu isteyen programın bu iş için ayırdığı belleğe kopyalamaktır.

Bir sistem çağrısının çekirdeğe iletilmesi belirli bir "yazılım kesmesi" tarafından gerçekleştirilir. Bu kesme (aynı zaman da "kapı" da denir) x86 işlemcili Linux sistemler için 0x80 kesmesidir.

0x80 kesmesi hakkında not: Programcının işletim sistemi çekirdeğinden sistem servisi alması için kullanılır. Dosya açma, dosya kapama, aygıtlara erişim, terminal'e çıktı gönderme, yeni süreç yaratma gibi işlemleri yaparken çekirdek bize servis sağlar. Bu yapı, her programcının aygıtlar için kendi erişim kodunu tekrar tekrar yazması gibi bir zorluktan kurtarır bizi (ve tabi zaman kazandırır).Birçok programcı 0x80 kesmesini kullanmaz, hatta çoğu hayatında bir yada birkaç kez sadece ismini duymuş olabilir. Bunun nedeni ise bu tür servislerin üst seviye dillerde (HLL) programcının kolay kullanımı için önceden yazılmış fonksiyonlar tarafından yapılıyor olmasıdır. 0x80 kesmesinin direkt olarak kullanılmak zorunda olduğu tek dil Assembly Programlama dilidir.

İstediğiniz sistem çağrısını "EAX" yazmacına (yazmaç=register) atarsınız. Çağrının kabul ettiği parametreleri de geriye kalan yazmaçlara (EBX, ECX gibi) atayarak "0x80" kesmesini çağırırsınız. Şekilde direk olarak görünmese de aslında atanan __NR_read değil buna karşılık gelen çağrı kodudur. Söz konusu çağrı kodu ve __NR_read in alabileceği diğer parametreler /usr/include/asm/unistd.h dosyasında tanımlanmıştır.Ayrıca read ile ilgili man sayfasına "man 2 read" komutuyla ulaşabilirsiniz.

Buraya kadar yapılan işlemler "user space" de (user mode) da gerçekleşti. Basitçe read adlı sistem çağrısını 0x80 kapısını kullanarak "kernel space" e aktardık.
Şimdi bundan sonra kernel space'de (kernel mode da) olanlara bir bakalım.

Çekirdek ilk olarak bütün yazmaçları kaydeder (SAVE_ALL). Bir sonraki adımda EAX yazmacı tarafından yapılan isteğin bellek sınırlarını aşıp aşamdığı kontrol edilir (Check Limit of EAX) [1]. Daha sonra system çağrıları tablosuna bakıp (EAX yazmacındaki isteği kullanarak) uygun fonksiyonu çaliştırır. ( syscall_tab[EAX]() ). Burada çalıştırılacak fonksiyon sys_read fonksiyonudur.

Bir sonraki aşamada dosyaya ilişkin parametreler ve izinler kontrol edilir, eğer herşey uygunsa dosyadaki veri alınır (kopyalanır). Sonuç uygulamanın istediği belleğe kopyalanır ve sonuca dair onay değeri uygulamaya gönderilir.

Bu aşamadan sonra işlem tekrar user mode da devam eder. Uygulama kontrol değerine bakar hatasız ise işlemine devam eder. Artık uygulama istediği verinin hatasız biçimde geldiğini ve hafızadaki yerini bilmektedir.

Bu yazıda sizlere bir uygulamanın çekirdekle olan iletişimini elimden geldiğince sade ve basit bir biçimde anlatmaya çalıştım.
Umarım faydalı olmuştur.


Serbülent ÜNSAL
serbulentunsal (et) meds.ktu.edu.tr

Not: Bu belgedeki bilgiler GNU/Linux sistemler için olmasına karşın genel olarak diğer pek çok sistem içinde doğrudur.

[1]:İşlemcilerdeki hafıza oruma mekanizması ile ilgili daha ayrıntılı bilgi için (http://www.cs.ucsb.edu/~cs170/notes/memory/)

Kaynaklar:

http://www.acikkod.org/yayingoster.php?id=30
http://www.linuxfocus.org/Turkce/January1998/article19.html
http://www.core.gen.tr/Security/Documents/12.html
http://www.freebsd.org/doc/en_US.ISO8859-1/books/design-44bsd/overview-kernel-service.html
http://plg.uwaterloo.ca/~itbowman/CS746G/a1/
http://www.linux-mag.com/2000-11/gear_01.html

Salı, Ocak 18, 2005

User mode ve Kernel mode nedir ?

Daha önce kulağıma çalınan ancak ne olduğunu tam olarak bilmediğim bu iki terim hakkında ne yazik ki tam ve açıklayıcı bir Türkçe kaynağa rastlayamadım. Bu yüzden öğrendiklerimi özetleyen kısa bir bilgi notu yazmaya karar verdim. Bu notun bir kopyasını tr.wikipedia.org adresinde User mode ve Kernel mode başlıkları altında bulabilirsiniz.


Önce birkaç terime açıklık getirelim.

Protected mode: x86 (286 ve üstü intel ailesi ve uyumlu (amd,via vb.) ) işlemcilerde bellek adreslerine erişim belirli kısıtlamar çerçevesinde olur. Yani her uygulama her istediği bellek adresini istediği gibi kullanamaz. Her bellek bölgesinin erişim hakları descriptor denen kayıtlarla saklanır. Bu kayıtların arka arkaya dizilimi ile hafızanın tamamen adreslendiği bellek haritası ( memory map ) oluşturulur.

CPL: Code Privilege Level (Kod Yetki Düzeyi). x86 işlemcilerde descriptor tarafından ayarlanan ve o kodun çalıştığı yetki seviyesini (privilage level) gösteren 2 bitlik değer. 0 en yüksek yetki seviyesidir, ring 0 diye geçer. 3 ise en düşük değerdir, ring 3 olarak geçer. Arada ring 1 ve ring 2 diye tanımlanan başka seviyeler olmasına karşın işletim sistemlerinin çoğu yalnızca ring 0 ve ring 3 seviyelerini kullanırlar.

Kernel Mode

Linux işletim sistemi açılışta kernel mode’da ( ring 0 ) baslar. Sistem açılışı sırasında kernel yüklenir yüklenmez işlemci Protected Mode'a geçer ve bunun ardından çalıştırılan tüm programlar User Mode'da çalışır ( bazı donanım sürücüleri hariç ). Kernel mode'da çalışan uygulamalar bütün hafıza adreslerine ve Giriş-Çıkış (harddisk ve benzeri) aygıtlarına tam yetki ile erişirler. Ayrıca bu mode'da iken tüm sistem fonksiyonlarına erişilebilir, hafıza yeniden adreslenebilir.

User Mode

Linux sistemi açılışta kernel mode’da baslar. Sistem açılışı sırasında kernel yüklenir yüklenmez işlemci Protected Mode'a geçer. Bu mode’da uygulamalar sistem için kullanılan fonksiyonları güvenlik açısından direkt olarak kullanamaz. Kullanıcı sadece kendi başlattığı uygulamaların adres alanları içerisinde kalmak suretiyle işlerini yürütebilir. Sistemin güvenli bir şekilde çalışabilmesi için kullanıcıya kısıtlı izinler tanınmıştır. Bu mode'da çalışan uygulamalar sistem kaynaklarına erişmek istediklerinde ring 3 seviyesinde çalışmakta olan çekirdek servisleri aracılığı ile çekirdeğe istek gönderirler. Sistem çekirdeği de eğer uygunsa isteği yerine getirir.


Not 1: Yukarıda yazılanlar Linux işletim sistemi referans alınarak yazılmıştır. Ancak diğer pek çok işletim sisteminde de geçerlidir.

Not 2: Bu belge'yi Tonguç Yumruk'un uyarıları doğrultusunda yeniden gözden geçirdim, kendisine teşekkür ederim. Ayrıca bu gözden geçirme işlemi sırasında bu belgeye rastladım. Konu ile ilgili daha ayrıntılı bilgi isteyenler için oldukça faydalı.