42
hayat teknik

Kişisel güncem dışında bu sayfalarda fazla bir şey yok. Son günce girdileri aşağıda, günce konuları ise yan tarafta bir yerlerde görülüyor olmalı. Bugüne değin yazılan bütün günceleri görmek için bir arşiv mevcut.

Günce girdilerine ilgili girdinin altında görünen “discussion” (tartışma) bağına tıklayarak (girdiyle ilgili olmasını umduğumuz) yorumlar yazabilirsiniz. Bu özellikten yararlanabilmeniz için bir openid (açık kimlik) hesabı edinmeniz gerekiyor.

Unutmadan… Halen üzerinde çalıştığım irili ufaklı yazılım projelerinin bir listesine code.00101010.info bağından, şahsımla ilgili irtibat bilgilerine de şuradan ulaşabiliyor olmanız lazım.

RSS Add a new post titled:
vimperator

Vimperator

Bu bir eklenti değil, bir devrim! Ağlamak istiyorum…

:set guioptions=bS
:o 00101010.info

Emacsen’ler mahzun olmayın, sizin için de var birşeyler.

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
golf

Golf

Ukalalığımı mazur görürseniz…

Burada kestirmesi tabiatıyle awk veya sed:

awk -F'=' '/^PROJECT_ROOT=/ { gsub("\"","", $2); print $2 }' gitweb
sed -ne 's/^PROJECT_ROOT="\([^"]\+\)"/\1/p' gitweb

Filhakika perl‘de de bu bir “tek satırlık”tır:

perl -nle 'print $1 if /^PROJECT_ROOT="([^"]+)"/' <gitweb

Yok “ama bu bir betiğin bir şeysi sadece” ise, lafı uzatmadan dilin “selika”sına uygun bir golf atışı yapılır:

...

open CONF, 'gitweb' or die "yok açılmıyor: $!";

my $projectroot;
while (<CONF>) {
    do { $projectroot = $1; last } if /^PROJECT_ROOT="([^"]+)"/;
}

...

Yok eğer “ben OOP manzarası isterim”se CPAN’da tura çıkılır, “sıtriim itereyt” eden OOP soslu bir modül bakılır.

Aynı kalbe hem Python hem Perl biraz zor girer; birini seven diğerini terkeder. :-) Perl benim ilk aşkım; terkeden olmadım hiç bir zaman, Perl de bu kaidenin dışında değil.

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
etch

Etch a Sketch

Etch

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
frobozz

Frobozz

Bir süredir, elimdeki bazı C tabanlı yazılım projelerinde kullanabileceğim ve öğrencilere de önerebileceğim basit bir Birim Test kitaplığı arıyordum. Birim Test konusunu (ve daha genel düzeyde XP’yi) önemsiyorum; disiplinle icra edilen her işi önemsediğim gibi. Nedense bu disiplin ve hackerlık sözcükleri kulağa çok da uyumlu gelen bir terkip oluşturmuyor. Eğer bu uyumsuzluğu gidermek hacker sözcüğünü lugatten silmemi gerektirseydi bu durumu sanıyorum ben de Thomas Dickey gibi gerekçelendirirdim… ve evet Linus Torvalds’ın bu tip konulardaki olumsuz etkisinden haberdarım :-)

Önce hazır Debian paketleri sonra da Google üzerinde yaptığım aramalarda check dışında tatminkâr birşey bulamadım; tâ ki en cutest olanıyla karşılaşıncaya kadar… Doğrusu check‘in de hakkını vermek lâzım, autoconf araçlarıyla uyumlu çalışıyor. Fakat ben biraz daha basit birşeyler peşindeydim. Aslında basitlik sözü beklentimi tam ifade etmiyor. Tekerleği yeniden icat için önemli bir gerekçem olmadığı sürece kullanmaktan kaçınmadığım Glib’le tümleşik bir birim test kitaplığı hemen tercih edebileceğim bir şey olurdu ve bunu yaparken kitaplığın karmaşıklığına değil karmaşıklığı Glib içinde nasıl gizlediğine bakardım. Ama böyle bir kitaplık yok (ben bulamadım en azından). Bu durumda Glib dışına çıkıyorum; bulacağım kitaplığın Glib’in rengi içinde kaybolacak kadar basit olmasını istememin nedeni bu.

Sadece GNOME için değil genel amaçlı bir kitaplık olmak iddiasındaki Glib’de eksikliğini hissettiğim birkaç şeyden biri bu birim test, bir diğeri de “komut satırı ayrıştırıcısı”. GNOME uygulamaları yaygın şekilde popt‘u kullanıyor. Eminim ki bana malum olmayan çeşitli gerekçeleri vardır, fakat neden argp değil? Madem Glib dışında bir çözüm aranacak ve komut satırı bir GUI programı için çok da kritik bir alan değil, bağımlılıkları azaltmak adına argp daha uygun olmaz mıydı? Komut satırı ayrıştırıcısının Glib içinde olmaması benim de zor yoldan öğrendiğim bir yerelleştirme kusuruna yol açıyor. Glib üzerinden g_print ailesi ile görüntülenen yerelleştirilmiş iletilerin doğru şekilde görüntülenmesi için bind_textdomain_codeset(PACKAGE, "UTF-8") gibi reçetelendirilmiş bir çağrı gerekiyor. Sorun şu ki, bu çağrıyı argp‘nin faaliyetlerinden önce yaparsanız komut satırı iletileri Türkçe olarak doğru basılmıyor. Eğer komut satırı ayrıştırıcısı Glib’e tümleşik, yani ileti trafiği için aynı alt yapıyı kullanıyor olsaydı böyle bir sorun da olmayacaktı. popt‘un bu meseleyi erkanına uygun şekilde çözdüğünü de sanmıyorum, fakat aşağı yukarı her GNOME uygulamasında gördüğüm şu libpopt bağımlılığından dolayı hazzetmediğim bu kitaplığı da denemek istemiyorum.

Birim test meselesi… CuTest basit iki dosyadan oluşuyor: CuTest.c ve CuTest.h. CuTest’i kullanan bir gerçek hayat örneği aradım ve izini APR‘de buldum, üstelik tam da benim arzuladığım bazı zenginleştirmelerle. Apache geliştiricileri de basitliğinden dolayı CuTest’i kullanmış. Glib’e alternatif olarak öne sürülebilecek genel amaçlı bir C kitaplığı önermem gerekseydi bu basitçe APR olurdu. Bellek havuzu ve kanallama (threading) özellikleri harika. Apache grubunun yazılım misyonuna da uyuyor, yani taşınabilirliği üst seviyede. Pratik sonuçları itibarıyla bir karşılaştırma yapmam mümkün değil, ama taşınabilirliği Glib’den daha iyi olmalı. APR, Glib bağlamında önemli pratik sonuçlara yol açacak bir farklılık var mamafih. APR, özgür fakat GPL uyumlu olmayan Apache lisansıyla geliyor. Yani projenizde GPL bir bileşen varsa APR’den mahrum kalacaksınız; ufak tefek kod parçaları için benim de sığındığım fair use hali veya kişisel kullanım dışında tabii.

CuTest‘i APR’deki değiştirilmiş haliyle alarak autoconfiscate etmeye çalıştım. Amacım make check ile icra edilen check hedefini gerçeklemekti. Bu tip muhayyer makamlarda kullandığım bir isimlendirmeyle frobozz dizininde başlayan denemeler olumlu sonuçlar verince bu test sürecini daha da otomatize etmek için birkaç betik yazarak tests/Makefile.am‘e ekledim. Fakat automake‘in keder verici kısıtlarından dolayı normalde sıradan bir Makefile’da çalışan birçok numara automake‘de çalışmıyor (ör. *_SOURCES değişkenlerinde dosyaları açık halde vermek gerekiyor, joker karakterler sapıtıyor vb.). Kod üreten betikleri oldum olası sevmemişimdir. Doğru çözüm CuTest’de yani kitaplık düzeyinde değişiklikler yapmaktı ki şu anda kaçındığım bir şey bu. Bu yüzden autoconfiscate sürecini basit tuttum. Böylesi anlaşılırlık adına daha iyi oldu.

Çalışmaların bir noktasında bu işin bir tür şablona dönüştüğünü görerek Glib, debug, profile ve gettext desteği gibi fazladan bir kaç özellik daha ekleyerek frobozz’u genelleştirdim ve son aşamada umumun menfaatini düşünerek frobozz’da şahsıma ait kalıntıları da bul/değiştir yaparak özelleştiren bir frob betiğiyle meseleyi nihayetlendirdim :-) Aslında kalıntılar tamamen kalkmadı; frobozz hâlâ var, bu şablonu bir tar paketi halinde indirebilirsiniz. Bunu yaparken frob betiğini de (son haliyle) depodan almayı unutmayın. Çalışma prensibini ayrıntılı olarak anlatmaya eriniyorum. Kaynak koddaki her foo.c dosyasına bir test suiti muamelesi gösterek buna ait bir tests/test-foo.c dosyası oluşturuyor ve birim test rutinlerini yazıyorum. Test rutinlerini ana kaynak koddan ayırarak kendi başına bir tests dizinine koymak autoconfiscation‘ın bir gereği ve ortalığın düzenli görünmesine de yarıyor. Tabii bunu sağlamak için bir dizi derleme numarası gerekiyordu. Şu erken safhada çok kusuru olduğuna eminim. Denemek isteyeceklere iyi froblamalar!

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
küre

Küre

6 (yazıyla “altı”) dersle boğuşuyorum; sabah ders, gece ders… Öğretim görevliliği tuhaf iş… Şöyle çayımı, kahvemi alıp gönlüme göre bir kaç satır kodlamayı, bir kaç paketi kurcalamayı özledim. Gönlüme uymayan her işte yaptığım gibi, “ceketini alıp terk-i diyar” eden adama ne kadar yakınım, bakacağız… En son Ankara’ya yaptım bunu galiba…

Dersler çoğu noktada doğaçlama gidiyor. Tezgahı kuruyorum kürsüde, heybemdekileri boşaltıyorum. İşte elma, portakal; tatlı, çürük, bayat ne dökülürse. Müşterilerin (öğrenciler) ilgi veya ilgisizliğini umursamadan… Mal ortada; beğenen alıyor.

Kürsü, çevresinde binbir kirpiğin kırpıştığı cam bir kürenin merkezi gibi, “nazar değmesin” sözünün ayıp kaçacağı bir yer….

Merkezden dışarı bakmazsanız içine hapsolursunuz. Ben de öyle yapıyorum, üstelik hiçbir şekilde denetleyemediğim bir dikkatle; “bak bu çocuk çok uykusuz”, “bu moralsiz”, “hmmm, anlamadılar, hay Allah!”, “bu benzetme uymadı”, “şunun bir sorunu var, ikide bir telefonuna bakıyor”. Arada bir beyinlerinin hangi noktasının veya benim hangi açıklamamın tetiklediğini bir türlü bilemediğim tuhaf soru veya gülüşmeleri bir yana bu arkadaşları seviyorum. Yorulmak kötü de değil hani! Ama işte, yoruluyorum…

Gürol Ağırbaş, “Köprüler / İki Dünya”… “Dört Mevsim” veya “Carmina Burana”yı Savni Sami Özer‘den dinlemek iyi gidiyor.

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
debian installer

Debian-installer hakkında karalamalar

Debian-installer rüştünü ispatlamış Debian tekniklerinin etkin şekilde kullanıldığı bir proje. Nedir bu teknikler?

[1] Dillerini korumak için yasa çıkaran, Cemil Meriç’in ifadesiyle Dünya Edebiyatının sekreteryalığını yapan bir ulus olarak Fransızların i18n duyarlılıklarını anlamak mümkün. GNU gettext’in şef geliştiricisi Francois Pinard’ı anmak isterim hemen. Debian kapsamında po ve po-debconf çevirilerinde eriştikleri yüksek yüzdeyi de belirtmeden geçemeyeceğim. (po-debconf çevirilerinde 50’ye yakın dil arasında Türkçe 10’uncu geliyor. Büyük ölçüde d-i çevirileriyle yakalanan ve tabii daha da yukarılara çekmemiz gereken bir oran bu.)

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
shuttleworth

Özgür yazılım projelerinde yönetim sorunları

Ubuntu’nun patronu, emekli kozmonot Mark Shuttleworth, özgür yazılım projelerinde para desteği (finansman) ve yönetim sorunlarıyla ilgili olarak günlüğünde önemli değerlendirmelerde bulunmuş. Çeşmenin başında işlerin nasıl göründüğünü anlamak açısından da önemli :-)

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
dpkgolf

Dpkgolf: debhelper’dan veya herşeyden sıkıldığım anlar

Kabul etmeliyim ki bendeki bu Perl ve Golf takıntısı hayra alâmet değil. İster istemez bir miktar (yoksa daha mı fazla?) “smarty pants” oluyorum. Sunucu tarafında bu girdiyi alır almaz “çift tırnakları” tashih etmeye girişen SmartyPants gibiyim. Bak yine geliyor fevç fevç: “Perl”, “Golf”, “SmartyPants”…

Birşeyler anlatacağım anlatmasına da bu girizgâh emekli bir başçavuşun muharebe hatıralarını anlatmaya bir türlü fırsat bulamadığı bir sohbetin orta yerine dalışına pek bir benzedi. Hikâye o ki emekli başçavuş askerlik hatıraları dışında her mevzudan dem vurulan bu sohbetten çok sıkılmış: “Yahu birisi de askerlikle alakalı bir çift laf etse de biz de konuşsak” diye dört dönüyor. Dakikalar geçiyor, tık yok, (kendince) hep yavan konular… Bakmış olmuyor; sohbetin duraksadığı kısa bir sessizlik anında, o sessizliği yaran bir patlamayla kükremiş: “Booooommm!’”… Ve sonra devam etmiş: “Boom denildi de aklıma geldi. Hiç unutmam bir gün cephedeyiz…”

Hadi bakalım, “Perl, Golf, SmartyPants” denildi de aklıma geldi şimdi. :-) Efendim, hiç unutmuyorum böyle IkiWiki’yle boğuştuğumuz demler, yeni eklenti adayları taraştırıyoruz. SmartyPants bunlardan biri. Markdown kullanılır da SmartyPants olmaz mı yanında hiç? Yakışır kardeşime! Tabii eklentiden önce bunu paketlemek gerekiyor. CPAN’de Text-Typography adıyla mevcut.

Sıra paketlemeye gelince bir fenalık bastırdı üzerime ki deymeyin gitsin. Önce Debian Perl Polisi ne diyor onu incelemek lâzım, sonra debhelper… Hani “adventure oyun çözümü gibi” derler ya öyle bir hâl! Sıkıntının doruklarında şeytana uydum. Debian Polütbüro sekreteri Manoj baba tarafından lanetlenmeyi göze alarak CDBS‘e yöneldim. Koşarak uzaklaştığım noktada geleneklerin çağrısını duymam imkansızdı artık. Viayımda seken parmaklarıma hükmedemiyordum. Şu üç satırlık debian/rules (evet, “Debian rulez!”) ne kadar da tahrik ediciydi! Üç vuruşluk bir oyuna sahne bir golf sahasında dolaşan develer, viayım kemılım! Hayır bu bir sanrı olmalıydı!

#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/perlmodule.mk

Sonuç? Debian paketi ve IkiWiki tipografi eklentisi. Pişman mıyım? Hmm, hayır. “Cdbs-Fu” gerektirmeyen bu paket için değil. Neredeyse bütün Debian (ve -son baktığımda- Ubuntu) GNOME paketlerinde kullanılan bir alt sistem olarak cdbs için bu paket leblebi mesabesindedir. Bir daha yapar mıyım? Uygun şartlar oluştuğunda, evet. “Uygunluk” sorgulamasında yararlanabilecek mütalaalar hakkında buyurun:

debian/rules: Moving to debhelper or cdbs

Enteresan karışımları tatmaya devam… Dolapdere Big Gang‘den “Local Strangers“… “Enjoy the silence” ne güzel, “Shut up” da öyle… Şadapma zamanı geldi. Türkçe’nin “smarty pants”leri! Sıkıysa yakalayın beni, size inat şadapıyorum!

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
viay kemıl

Viayım, Kemılım

Mualla üstadımız Bram Moolenaar‘ın Stephen Covey’in “Etkili İnsanların 7 Alışkanlığı”ndan aldığı ilhamla irad ettiği o eşsiz “Metin Düzenlemede 7 Etkili Alışkanlık” hutbesinin ikinci sürümü çoktan duyurulmuş da haberimiz olmamış. Google vidyo kayıtları ve metni, ne güzel!

Bir de Boran söylemişti, kısa Camel’in yeni şeysi çıkmış. Samsun’a düşmedi daha… Böyle kahverengi bir paket, içimi hoş. Nereden mi biliyorum? Onur Ankara’dan gelirken sağolsun bir paket getirdi.

Telefon açacaktım Boran’a bu akşam, unutmuşum. Neyse “aydınlık şafaklar” görüşmesini sonra yaparız artık. Sahra Sıhhıye kurrasını bekliyoruz heyecanla…

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
valgrind

Bellek kaçaklarının peşinde koşuşturmacalar

Glib’le uğraşmaya devam ediyorum [1]. 2.6 sürümünde kitaplık arayüzüne bir komut satırı ayrıştırıcısı eklendiğini Enver’in bilgilendirmesiyle öğrenmiştim. O konuyla bilâhare ilgileneceğim. Ondan önce bellek kaçaklarını yakalamak için kitaplığın ne tür imkanlar sağladığını veya kaynağı yeniden derlemeyi gerektirmeyen Valgrind ile Glib’in arasının nasıl olduğunu anlamak istedim. Basit bir deneme:

$ cat >foo.c <<EOF
#include <glib.h>

int
main()
{
        GList *foo = NULL;

        foo = g_list_append(foo, "foo");
        g_list_free(foo);

        exit(0);
}
EOF

$ gcc -o foo foo.c -I/usr/include/glib-2.0 \
                   -I/usr/lib/glib-2.0/include \
                   -lglib-2.0

$ valgrind ./foo
...
==15671== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==15671== malloc/free: in use at exit: 2149 bytes in 4 blocks.
==15671== malloc/free: 4 allocs, 0 frees, 2149 bytes allocated.
==15671== For counts of detected errors, rerun with: -v
==15671== searching for pointers to 4 not-freed blocks.
==15671== checked 84068 bytes.
==15671==
==15671== LEAK SUMMARY:
==15671==    definitely lost: 0 bytes in 0 blocks.
==15671==      possibly lost: 0 bytes in 0 blocks.
==15671==    still reachable: 2149 bytes in 4 blocks.
==15671==         suppressed: 0 bytes in 0 blocks.
==15671== Reachable blocks (those to which a pointer was found) are not shown.
==15671== To see them, rerun with: --show-reachable=yes

Hmm… Ayrılan bütün belleği serbest bıraktığımız halde “ulaşılabilir durumda” olduğu bildirilen birkaç blok görülüyor. Tahmin edilebileceği gibi zararsız bir durum söz konusu. Kitaplık kendi içinde bazı işler çeviriyor. Glib’in mem-pool özelliği bu. Kendisine başvurulduğu anda Glib, bellek havuzundan hazır birkaç parça koparıyor ve nasıl olsa süreç sona erdiğinde sisteme iade edilecek belleği serbest bırakmaya çalışmıyor. Tablo basitçe bu sanıyorum. Doğru mu anladım?

Zaten yeterince kirli durumda olan Valgrind çıktısında en azından şu özet kısımlarını temiz görmek isterdim. Google aramalarında bu hususta açık öneriler bulamadım. Belki kitaplığın hata ayıklama sürümünde bu işin icabına bakmışlardır düşüncesiyle -dbg paketini kurdum: sonuç yok. Hata ayıklama sürümü sadece kitaplık simgelerini içeriyor, yani unstripped bir sürüm. Program çökmeleri için faydalı olabilir.

Kaynağı yakından inceleyelim:

$ apt-get source libglib2.0-0

Glib’in inşa seçeneklerini incelediğimde çözümün ne olduğunu farkettim. Seçenekler arasında disable-mem-pools gibi bir şey var. Bu seçeneği kullanan -full-dbg gibi bir paket hazırlamak isterdim doğrusu. Fakat kitaplık paketleri hazırlamak her zaman müşkildir. Üstelik DBS kullanan bu paket yeterince de karmaşık. Bunun yerine debian/rules‘da inşa seçeneklerine şunları ekledim:

--disable-mem-pools --disable-threads

İkinci seçenek full-dbg hatırına… Paketi yeniden derlediğimizde (devscripts/debuild) oluşan yeni libglib2.0-0‘daki /usr/lib/* içeriğini mesela /usr/local/lib/debug gibi bir dizine koyuyoruz ve klasik bir numarayla sonuç:

$ LD_LIBRARY_PATH=/usr/local/lib/debug valgrind ./foo
...
==16035== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 15 from 1)
==16035== malloc/free: in use at exit: 0 bytes in 0 blocks.
==16035== malloc/free: 1 allocs, 1 frees, 12 bytes allocated.
==16035== For counts of detected errors, rerun with: -v
==16035== No malloc'd blocks -- no leaks are possible.

KDE ekosisteminden çıkan Valgrind çok yararlı bir araç. Hararetle öneriyorum. Bunların dışında araçlar da var: mesela memprof. Fakat motor tamirini böyle grafik ortamda icra etmeyi pek sevmiyorum. Valgrind için de bir grafik arayüz var: alleyoop. Lütfen bu tür arayüzlerden uzak duralım :-) Belirtmeden geçmeyeyim, Glib’in kendi araçları da gayet güzel. Mesela şu:

extern GMemVTable *glib_mem_profiler_table;
g_mem_set_vtable(glib_mem_profiler_table);

...

g_mem_profile();

Ama Glib’in bulaştığı bir davanın salâhiyeti için soruşturma tamamlanıncaya kadar kendisini açığa almamızda fayda var :-)

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
larry wall

Larry Wall ve Türkçe

Linux’da genel olarak u18a ve özellikle de UTF-8 kullanımıyla ilgili benim de takip ettiğim güzel bir eposta listesi mevcut. Listede birkaç gün önce UTF-8’de karakter dönüşümleri hakkında gelen bir soru üzerine ilginç bir tartışma döndü. Tartışmayı ilginç yapan husus taraflar arasında Perl’ün babası büyük üstad Larry Wall ve (eğer bu bir isim benzerliği olmayacaksa) düzenli ifadelerin mucidi Henry Spencer’in olması, ve konunun Türkçenin karakter dönüşümlerindeki oyun bozancı tekilliği etrafında dönmesiydi. Acaba bu ileti zincirini daha önceden önerdiğim (ve hâlâ vakit ayırıp da üzerinde çalışamadığım) Wikipedia belgesine “Hangi şöhretler ne dedi?” türünde bir magazin kısmı olarak eklesek mi? :-)

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
bayram

Bayram

Efendim, bir bayram daha geldi çattı ve, adet olduğu üzre, kendimizi bayram arefesindeki prokrastinasyonal, yani nasıl derler, “yapılmasa da olur, ama yapacağım” nev’inden meşgaleler arar hâlde bulduk. Bu jurnal cümlelerine hasbel kader gözü takılan cümle cemaatin Ramazan bayramını kutlayalım evveliyetle.

Kuşların getirdiği kimi haberler sayesinde, memleketin muhtelif medreselerinde verilmekte olan C derslerinde bizce “konayo” olarak bilinen, ecnebicesi conio.h olan taşınamazların, dersleri deruhte eden muallimler indinde musallat bir fikri sabite inkılâp ettiğini esefle öğrenmiş bulunmaktayım. Tabii ki bu mezalimde, inançları hilafında bir makama râm olmak durumunda kalan istiklâl ve istikbal sahibi talebelerin haykırışlarına (ki cihan şümul bir mahiyet arz ettiği kat’i olan bu çığlıkları sizin de duymanız pek mümkün) kulaklarımı tıkayamazdım. Ez-cümle işte o “bayram arefesi eğlencelik demler”e konumlandırdığımız mütevazı bir çalışmanın neticesi olarak course-goodies yaşca bendenizden küçük bu kardeşlerime bir bayram hediyesi olsun bakalım.

Package: course-goodies
Architecture: all
Description: Course goodies for C/C++ language courses
 Nothing interesting here; only a few source files, notably 'conio.h',
 to allow FLOSS-minded students to 'getch' or 'kbhit' while studying
 some examples dictated by some lecturers.

Marifetlerini ifade etmeye birkaç satırın kâfi geleceğini de düşünmekteyim:

$ cat >t.c <<'EOF'
#include <stdio.h>
#include <conio.h>

int main()
{
        /* falan filan */
        printf("Bastırın herhangi bir tuşa devam etmek için...\n");
        getch();
        return 0;
}
EOF
$ gcc -o t t.c
In file included from t.c:2:
/usr/include/conio.h:4:2: ... "using 'conio.h' is using a non-standard or vendor"
/usr/include/conio.h:5:2: ... "spesific or non-portable feature (whatever you prefer),"
/usr/include/conio.h:6:2: ... "please do use a more portable lib (e.g. ncurses)"
/usr/include/conio.h:7:2: ... "this is only a partial implementation of 'conio.h'"
$ ./t
Bastırın herhangi bir tuşa devam etmek için...

Bir zamandır tercüme vesair işlerle de üstünüze afiyet pek uğraşamıyorum, binaenaleyh yukarıda iktibas ettiğim tercümelerin kalite murakabesini de işbu satırları buraya kadar okuma zahmetinde bulunmuş muazzez kaarilerime bırakıyorum. Hayırlı bayramlar!

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
oyun havası

Oyun havası

Bu oyun havası Chavez, Kastro ve bendenizin de naçizane gayretleriyle tahta oturan adamım Sam Hocevar‘a gider. Dunc Bank operasyonu unutulur mu hiç? Hmm, sıradaki?

bush

Hamiş: Tamam Hüsnücüğüm! Oyun havasını bilâhare lastfm’e geçireceğim…

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
javabetiği

JavaBetiği

Aşağıdaki kod:

document.write(new Date().toLocaleString()   + '<br/>');
document.write('IİĞÜŞÖÇ'.toLocaleLowerCase() + '<br/>');
document.write('ıiğüşöç'.toLocaleUpperCase() + '<br/>');

Wine üzerinde IE6+SP1’de şunu yazıyor:

24 Nisan 2007 Salı 01:00:28
iiğüşöç
IIĞÜŞÖÇ

Doğal ortamında IE6+SP2’de şöyle:

24 Nisan 2007 Salı 01:00:28
iİğüşöç
ıIĞÜŞÖÇ

Firefox (Iceweasel) sürüm 2.0.0.2’de ise şöyle:

Sal 24 Nis 2007 01:07:08 EEST
iiğüşöç
IIĞÜŞÖÇ

Üstad Brian Kernighan’ın Princeton’da verdiği bir ders var: “Computers in Our World”. Bu derste sunulan “Toy Machine Simulator” isimli JavaScript’le yazılmış basit benzeticiyi Türkçe’ye uyarlayalım dedik (sağolsun Nurettin büyük ölçüde halletti). Fakat yükle (load), çıkar (subtract) buyrukları falan derken işlerin beklenildiği gibi seyretmediğini görünce yukarıdaki denemeleri yapmak durumunda kaldım. Bu ECMAScript nanesini yanlış anlamıyorum değil mi? ‘toLowerCase’ var, bir de yerel duyarlı olması umulan ‘toLocaleLowerCase’ var; ne âlâ! “Yereli doğru mu algılıyor bu?’ kaygısıyla new Date().toLocaleString()’ şeysini özellikle bastırıyorum, orada sorun yok gözüküyor. ‘toLocale{Lower,Upper}Case’ işlevlerinin semantiğinden emin olmak için David Flanagan’ın “JavaScript The Definitive Guide” kitabına da baktım. Buyurun ‘String.toLocaleLowerCase’ maddesini okuyalım (vurgular bana ait):

A copy of string, converted to lowercase letters in a locale-spesific way. Only a few languages, such as Turkish, have locale-spesific case mappings, so this method usually returns the same value as toLowerCase().

İşin içinde başka bir bit yeniği yoksa şayet (ilgilenenler benimle irtibata geçebilirler) nurtopu gibi bir Türkçe böceği var ortada, en alışıldık türden…

Şimdi bu böceği ezseniz n’olur ezmeseniz n’olur (şüphesiz ki raporlanması gerekiyor; en azından Mozilla Seamonkey grubuna)? JavaScript hataları “erörlü pul” gibidir; kıymetlidir, bir kere ortaya çıkmışsa sittin sene (sittin: Arapça’da 60) başbaşa yaşarsınız! :-) (Daha iyisini buluncaya kadar) aşağıdaki gibi bir geçici çözüm uydurdum buna. Google’dan böyle bir şey aratan olursa ağa takılsın diye buraya koyuyorum:

var TURKISH_CODEPOINTS = '\u00e2\u00e7\u011f\u0131\u00f6\u00fb\u00fc\u015f' +
                         '\u00c2\u00c7\u011e\u0130\u00d6\u00db\u00dc\u015e';
var TURKISH_LETTERS    = 'a-zA-Z' + TURKISH_CODEPOINTS;

var _turkish_hack = { lower:[], upper:[] };
if ('I'.toLocaleLowerCase != '\u0131')
        _turkish_hack.lower.push({ se:new RegExp('I', 'g'),       re:'\u0131' });
if ('\u0130'.toLocaleLowerCase != 'i')
        _turkish_hack.lower.push({ se:new RegExp('\\u0130', 'g'), re:'i'      });
if ('\u0131'.toLocaleUpperCase != 'I')
        _turkish_hack.upper.push({ se:new RegExp('\\u0131', 'g'), re:'I'      });
if ('i'.toLocaleUpperCase != '\u0130')
        _turkish_hack.upper.push({ se:new RegExp('i', 'g'),       re:'\u0130' });

if (_turkish_hack.lower.length)
        String.prototype.toTurkishLowerCase = function () {
                var fixed = this;
                for (var i in _turkish_hack.lower)
                        fixed = fixed.replace(
                                _turkish_hack.lower[i].se,
                                _turkish_hack.lower[i].re
                        );
                return fixed.toLocaleLowerCase();
        }
else String.prototype.toTurkishLowerCase = String.prototype.toLocaleLowerCase;

if (_turkish_hack.upper.length)
        String.prototype.toTurkishUpperCase = function () {
                var fixed = this;
                for (var i in _turkish_hack.upper)
                        fixed = fixed.replace(
                                _turkish_hack.upper[i].se,
                                _turkish_hack.upper[i].re
                        );
                return fixed.toLocaleUpperCase();
        }
else String.prototype.toTurkishUpperCase = String.prototype.toLocaleUpperCase;

Problem ‘ıİ’ harflerinde olduğundan sadece onlar için kendinden ayarlı bir şeyler kodladım. ‘toLocale{Lower,Upper}Case’ yerine ‘toTurkish{Lower,Upper}Case’ kullanılması yeterli olmalı (fazla deneme yapmadım, hataları olabilir). Bir de ‘TURKISH_LETTERS’ adında bir karakter aralığı tanımladım. Düzenli ifadelerde faydalı olabilir. Şunun gibi (‘toysim.js‘den alıntı):

op = s.replace(new RegExp('^[_' + TURKISH_LETTERS + ']\\S*'), "") // zap label if present
Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
orhanımtrak saatler

Orhanımtrak saatler

Her gece tek doz halinde alınır, fazlası fazlasıyla berhudâr eder.

Yanlış mı kalmış aklımda acaba
Muhabbet sokağı numara doksan
Boşa mı gidecek bu kadar çaba
İçim ürperiyor ya evde yoksan

Bir de Mehmet abi var. Boran‘ın hediyesi…

Posted Thu 17 Jul 2008 11:12:43 PM UTC Tags:
This site is powered by ikiwiki.png.