Bilgisayarlar ve 2038 yılı

0
FZ
Belli bir süredir gündemde olan bir sorun bugün takip ettiğim Compunauts listesinde karşıma ilginç bir şekilde çıkınca FM kitlesi ile paylaşayım dedim.

Basit bir Perl komut satırı ile sisteminizin 2038 yılına nasıl tepki vereceğini inceleyebilirsiniz...
perl -e 'use POSIX; $ENV{'TZ'} = "GMT"; for ($clock = 2147483641; $clock < 2147483651; $clock++) {print ctime($clock); }'

Yukarıdaki komutu MS Windows üzerinde Linux uygulamalarını çalıştırmak ve derlemek için kullandığım Cygwin ve bir Debian GNU/Linux sistemlerde denediğimde aşağıdaki çıktıyı elde ediyorum:

Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901

MS Windows için derlenmiş Perl'i kullanarak Windows 2000 Server komut satırında şu şekilde denediğimde ise:

perl -e "use POSIX; $ENV{'TZ'} = 'GMT'; for ($clock = 2147483641; $clock < 2147483651; $clock++) {print ctime($clock); }"

Şöyle bir çıktı elde ediyorum:
Tue Jan 19 05:14:01 2038
Tue Jan 19 05:14:02 2038
Tue Jan 19 05:14:03 2038
Tue Jan 19 05:14:04 2038
Tue Jan 19 05:14:05 2038
Tue Jan 19 05:14:06 2038
Tue Jan 19 05:14:07 2038
Görülen o ki 2038 yılı ile ilgili sorun devam ediyor. Uygulamaların bir kısmının 64 bitlik bir time_t kullanarak derlendiğinde sorunun bir kısmının giderilebileceği düşünülürse de 32 bit kullanarak tarih depolayan veritabanı sistemlerine dikkat etmekte fayda var!

Görüşler

0
tongucyumruk
Öhüm, dayanamayacağım ne yapayım...

import sys, time
print "n".join([time.ctime(f) for f in range(2147483641,2147483651)])
0
tongucyumruk
oops, sys modülüne ihtiyacımız yok... alışkanlıklar işte...
0
sametc
hangisi daha okunaklı ;))

0
mascix
perl
0
FZ
+1
0
sametc
abarttınız ama :)

yani gercekten bir kodlara goz atin .....

hiç programlama dilii bilmeyen biri perl kodunu gorunce 10 cesit soru sorar...

peki python icin kac soru sorar soyliyeyimmi 0 belki print "n" ile ilgili sorar o kadar...........

ilk ogrenilen dil: kolay anlaşılan dildir ....
0
tongucyumruk
Öhüm, print "n" değil aslında print "(backslash)n" olacaktı...
0
sametc
Bende zaten onu kastetmiştim. yani bu "n" ne anlama gelir diye..
0
sundance
Yahu ben de bunu anlamıyorum. Bana ne hiç programlama dili bilmeyen adamdan, dahası bana ne kardeşim Perl bilmeyen adamdan. Perl bilmeyen adam Perl anlamaya çalışmasın, bu mudur sıkıntı ?

Siz hiç duydunuz mu ? "Fransızca güzel bir dil ama Fransızca bilmeyen birisi hiçbir şey anlamaz"

Boşverelim bunları, asıl mesele "Ben xxxx'le şöyle şahane bir program yaptım, şu şu işi yapıyor" demek. Bunları konuşalım.
0
tongucyumruk
Açıkçası bir dili bilmeyen o dili anlamasın fikrine katılmıyorum. Özellikle seninde daha önce bahsettiğin "kendi kendine yetme" konusunda bu daha da önemli bir hal alıyor. Şöyle düşünelim. Ben Perl veya C bilmiyorum. Fakat önümdeki Perl veya C kodu okunaklı bir şekilde yazılmışsa içindeki çok derin olmayan hataları kodu okuyarak ayıklayabiliyorum. Bu sayede hem bir patch ile o kodun yazarına yardımcı olmuş oluyorum, hem de kendi kendime yeterek e-posta listelerinde veya irc'de yardım almama gerek kalmadan sorunumu çözüyorum. Bu nedenle Perl bilmeyen Perl kodu okumasın yaklaşımı bana hatalı geliyor.

Ha bunun Python'un okunabilirliğiyle alakası ne? Python diğer dillere oranla kodu biraz daha okunabilir yazmaya zorluyor. Peki python'da okunaksız kod yazılmaz mı? Bal gibi de yazılır, yazdım oradan biliyorum.

Sonuç olarak programlama dilinin Perl veya Python olması okunabilirlik konusunda sadece bir araç, olay eninde sonunda programcıda bitiyor.
0
FZ
Kusura bakma ama ben de bu mevzu ile verilmiş 3 örnekten en kolay anlaşılabilir olanının Python olduğuna katılmıyorum. Python bilmeyen biri olarak koda bakınca şunu düşünüyorum:

import diye bir şey kullanılmış, herhalde bazı kütüphaneleri, ek özellikleri vs. kullanmak için bir şeyler çağrılıyor. Sonra ekrana bir şey basılacak, ardından bir nokta geliyor... Buradan hemen sonra devreye join diye bir fonksiyon girmiş. Bir şeyleri birleştirecek herhalde. Belki bunu da basacak gibi... Göreceğiz. Ne birleşecek? time.ctime(f) diye bir şey var. Nesneye yönelik programlama herhalde. time diye bir nesnenin ctime diye bir metoduna f parametresi geçilmiş. f ne? Ardından sanki bir döngü geliyor. f var içinde, önceki fonksiyona geçilen f ile aynı mı? f'nin bir range yani aralık içinde olduğu söylenmiş, acaba nasıl artıyor, bu belli değil. Peki bu döngü ile time nesnesinin metodu mu birleşiyor. Yoksa time nesnesi aslında döngünün içinde mi, yoksa önce döngü çalışıyor, sonra bu f bir sürü değer alıyor ve bir anda hepsi time.ctime'a parametre olarak mı geçiliyor? Eğer f in ... diye döngü kurabiliyorsam range dememe gerek var mı, zaten vereceğim şeyin başlangıcı, bitişi (ve belki adım miktarı) yeterli olmaz mı... vs. vs. bir sürü soru.

Perl'e bakınca şunu görüyorum, POSIX diye bir modül kullan. Bir dizi... hayır hayır bir tür anahtar değer çifti (key/value pair), bunu belli bir değere eşitle. Sonra 70'lerden beri alışık olduğumuz bir for döngüsü içinde, ilk değerden başla, son değere dek bir artırarak git, döngü içinde döngü değişkenini ctime fonksiyonundan geçir ve çıkan şeyi bas (döngü bitene dek).

Lisp'e bakınca şunu görüyorum: encode-universal-time fonksiyonuna bir dizi sabit değer geç (muhtemelen bunlar bir şekilde encode edilecek olan gün ay yıl saat, vs. gibi şeyler, fonksiyonun ismi kabak gibi ortada çünkü ;-), neyse işte, çıkan değere 5000 ekle, çıkan değeri decode işlemine tabi tut yani ters fonksiyon uygula. Bitti. (Hmm, evet, tabii PRINT işlevselliği nerede değil mi? E iyi ama burada Lisp'i interpreter modunda kullanmıyor muyuz, yani niye print diyeyim ki, zaten Lisp'e verdiğim şeyler evaluate edilir yani değerleri hesaplanır ve sonuç bana yine Lisp ortamında döndürülür, pratik bir durum değil mi ;-)

Sonuç: Sonuç yok süreç var. Anadilimizi öğrenene kadar bile min. birkaç yıl harcıyoruz, uğraşacağımız dili öğrenmek için de biraz zahmete katlanalım, bir zahmet.

Bilmediğin dilde sorun çözmeye gelince, yani şimdi sana 50 sayfa Türkçe metin sunsam ama bu metin mesela astronomideki bir problemin bir tarifiyle ilgili olsa hemencecik anlayabilecek misin eğer astronomi hakkında bilgi sahibi değilsen? (üstelik böyle bir metin matematiğe çok az göndermede bulunarak da yazılabilir, o yüzden 50 sayfa dedim zaten :-P

Düşüncem şu: Eğer kodun hedeflediği problem alanındaki teoriye vakıf değilseniz o kod, yani kodu geçtim, kabaca anadilinizde mevzuyu anlatsam yine anlamakta güçlük çekersiniz, başka kaynaklara yönelip daha uzun ve açıklayıcı anlatımları okumak gerekir. Bundan ötürü yani kodda sözdizim hatası bulmak kolay olabilir ama yani o kadarını derleyici ya da yorumlayıcı ya da kaynak kod analiz sistemleri de yapıyor. Dilin anlamına yani semantiğine vakıf olmak ve bunun da ötesine o dille çözülmeye çalışılmış probleme vakıf olmak ise bambaşka bir şey, bu bağlamda elbette dil programcıya ne denli soyutlama ve metaprogramlama gücü sunarsa o kadar iyi.
0
tongucyumruk
Anlatmaya çalıştığım şey şu: Kodun okunabilirliği önemlidir. Ben Perl bilmiyorum, Lisp'ten de "Lisp biliyorum" diyecek kadar anlamıyorum fakat üç dilin üçünde de verilen örnekler ne yapmaya çalıştığını rahatlıkla anlamama yetecek kadar açık yazılmıştı. Bana kalırsa i in range(0,10) da i=0; i=10; i++ da kıyısından köşesinden programlamaya bulaşmış herhangi bir insan için yeterince açıktır.

Kodu okuyup ne olduğunu anlamak için değil "kendi kendine yetebilmek" için kodu okumaktan bahsediyorum. Yoksa oturup Zope'un kodlarını okuyup anlamak isterseniz kodun Python ile yazılmış olması eğer python bilmiyorsanız tabiiki bir avantaj sağlamaz.

Bir programın ne "anlattığını" kavrayabilmek için o dili bilmek tabiiki gereklidir. Fakat basitçe bir derleyicinin yakalayamadığı bir ıİ problemini bu problemle daha önce uğraşmış biri C bilmese dahi C kodunun içinde bulup az bir C bilgisi ile düzeltebilir.
0
bm
Yahu ben de bunu anlamıyorum. Bana ne hiç programlama dili bilmeyen adamdan, dahası bana ne kardeşim Perl bilmeyen adamdan. Perl bilmeyen adam Perl anlamaya çalışmasın, bu mudur sıkıntı ?

Baska bir alinti yapayim:

The Novice has been the focus of an alarming amount of attention in the
computer field. It is not just that the preferred user is unskilled, it is
that the whole field in its application rewards novices and punishes experts.


( Erik Naggum http://groups-beta.google.com/group/comp.lang.lisp/msg/a6df017072f4c700 devami orada)

Yani yanliz degilsiniz, pekcok insan bundan rahatsiz. Ben Perl'
u sevdigimden demiyorum bunu, ama _ana_ kistasimiz 3-5 dakikada birseylerin anlasilmasi/olmasi/yapilabilmesi olunca bu karakter itibariyla anlasilmasi/olmasi/yapilmasi 3-5 dakikadan fazla surmesi gereken seylerin esasinda bunlardan faydalanmamalari icin bir sepep olmayan kisilerce dislanmasi sonucunu doguruyor. Yazik oluyor.
0
sundance
Çok güzel alıntı, uzmanların cezalandırılması konusu gerçekten olmakta, teşekkürler.
0
sametc
http://www.fazlamesai.net/modules.php?name=News&file=article&sid=2532

bu haberde yer alan sozlerinizi hatırlamanızı isterim :)
0
bm
CL-USER> (encode-universal-time 59 59 23 31 12 2038)
4386434399
CL-USER> (decode-universal-time (+ 5000 (encode-universal-time 59 59 23 31 12 2038)))

19
23
1
1
1
2039
5
NIL
-2
CL-USER>

problem neydi?

( http://clhs.lisp.se/Body/f_dec_un.htm [clhs.lisp.se])
0
bm
Cok tarafli oldu. Problem var esasinda, ama bignum'la hallolan problemden farkli: http://naggum.no/lugm-time.html [naggum.no]
0
raistlinthewiz
y2k38 :)
bi kac sene once, y2k bug gundemdeyken, bu konuda bir arastirma yapmis ve konuyla ilgili bir yazı yazmıstım ama simdi bulamıyorum :)
Görüş belirtmek için giriş yapın...

İlgili Yazılar

fazlamesai.net'e soralım: Blog yayıncılığı ama nasıl?

FK

Aslında uzun süredir FM'yi takip ediyordum.Fakat birşeyler sormak bu güne kısmetmiş. Kişilerin sitemiz üzerinden kendi bloglarını yayınlayabilecekleri bir web sitesi projesi dahilinde hangi script'i kullanmamız gerektiği konusunda bir arayış içerisine girdik.

Egzersiz Bisikleti

butch

Fazlamesai'ye soralım: Do you seek ICQ?

sundance

15 Kasım 1996'da çıktığında kısa sürede fenomen olmuştu. Dört İsrail'li gencin ortaya attığı anında mesajlaşma sistemi ICQ, Internet'e bakış tarzımızı tek başına değiştirmişti. Öyle ki Internet'in e-mail, web, irc ve ICQ'dan oluştuğunu söyleyenler bile vardı.

Bu şaşırtıcı başarı kısa sürede en büyük Internet firması olan AOL'un para benim değil mi?® felsefesi doğrultusunda ICQ'u satın alması ile en başarılı startup satışlarından birine döndü.

Peki o ilk göz ağrımız ICQ nereye gitti?

2000lerde Müzik Kalitesi ve Yüksek Ses Savaşları

FZ

Matematikçi, müzisyen ve yazılım geliştirme uzmanı bir dostumdan önemli bir konuya dikkat çeken ilginç bir e-posta alınca tüm müziksever FM üyeleri ile paylaşmadan edemedim:

"Emre kadresim,

Yeni yılın kutlu olsun.

3, 2, 1 Motor

butch

Fazlamesailerle yaklaşık iki ayı geride bıraktık. Varlığı sayesinde iyiden iyiye gececi olduk. Bir iki teknik aksaklık dışında test yayınını bitirmek için bir engel yok sanırım. Artık hareket zamanı. Fakat bunu yapmadan önce bir kez daha tartışalım bence fazlamesai.net nedir, amacına ulaşması için neler yapmalıyız.