Bir başka doktor muayenesi

Bu doktor maceralarım beni her zaman güldürmeyi başarıyor. Geçen hafta ürolog randevum vardı. Randevu zamanı geldiğinde muayenehaneye gelmiştim ama bencen önce iki kişi daha vardı. Beklemeye başladım. On dakika sonra sıra bana geldi. İçeri girdim ve hemşireye randevum olduğunu söyledim. Bana idrar tahlili için bir kap verdi. Tuvalete gittim. Tuvalet doluydu. Ben beklerken başka bir hasta geldi ve tuvaletin dolu olduğunu görünce kadınlar tuvaletine girdi. Birazdan erkekler tuvaleti boşaldı. İçeri girdim, kabı elime aldım ve işemeye başladım. Yani başlamak istedim. Birkaç damladan sonrası gelmedi. Bir beş on dakika daha boğuştum ama olmadı. Eser miktarda idrarla kabı geri götürmek de istemedim. Maazallah sırf bu örnek için özel vitrin yaptırıp üzerinde adımın yazılı olduğu bu kabı herkese sergileyebilirlerdi. Kabı tuvaletle laboratuar arasındaki kapağı açıp aradaki bölmeye koydum ve çıktım. Bu sırada hemşire de beni arıyormuş. Kısaca, kabı hemen hemen boş bir şekilde ara bölmeye koyduğumu söyledim ve o da “sorun değil” diyerek beni doktorun yanına gönderdi.

Doktor önce kan tahlili sonuçlarını anlattı. Değerler yine biraz yüksekmiş ama sorun değilmiş. Geçen seneki işlemlerin aynısını yaparız diyerek Ocak ayı için randevu verdi. Ardından bir şikayetimin olup olmadığını sordu. Ben de önce yok dedim ama sonra şikayetsiz gidersem doktora ayıp olur diye işerken hafif bir yanma var dedim. O da “idrar tahlili verdiniz nasıl olsa, orada bakarız” dedi. Ben de durumun düşündüğü gibi olmadığını anlattım. “Hallederiz” dedi. Sonra muayeneye geçti. Şimdi muayenenin detaylarına girmeyeceğim. Doktor yeterince girdi zaten. Ardından “her şey yolunda, Ocak’ta görüşürüz” dedi. “İdrar tahlili ne olacak?” diye sordum. O da “muayene ettim, sorun yok” dedi. İçimden “vay be, gavur ultrasonla yanmayı bile kontrol edebiliyor. Bir de idrar örneği verebilseydim neler neler bulurlardı acaba?” diyerek odadan çıktım.

Isenachweiher

Hafta sonu çocuklarla yakınlardaki bir göle gittik. Isenach adlı akarsunun döküldüğü Isenachweiher. Tabii ki bu mevsimde çok bir şey görmeyi beklemiyordum. Fotoğraf makinemin pilini de bu nedenle şarj etmemiştim. Aslında bunun ne kadar kötü bir fikir olduğunu gidince anladım.

Yağmur sonrası bir dönem olduğu için çevre patikalar mantarlar açısından çok zengindi. Gölün çevresinde kısa bir tur sonunda bir sürü mantar türü görebildim. Çocuklar sıkılmasa gezintiyi daha da uzatabilirdim ama zaten yeterli şarjım da yoktu.

Hazır göle gelmişken iki kavanoz su örneği aldım. Gölün çevresindeki aşırı yüksek ağaçlar yüzünden gölde pek su bitkisi yoktu ama belki örneklerde bir şeyler bulabilirim diye ümit etmiştim ve düşündüğümden iyi şeyler de çıktı.

Türlerin ne olduğunu henüz bilmiyorum ama şimdilik şu diatomları bulabildim:

https://www.instagram.com/p/CGmNZEspxZV/
https://www.instagram.com/p/CGmW7jypJVm/

Ayrıca gölde tipik ördek aileleri de vardı. Hatta bir balıkçıl da kısa süreli bir iniş de yaptı ama hemen uzaklaştı sonra. Anlaşılan gölde balık da varmış.

Kısa bir turdan sonra yine evin yolunu tuttuk.

Failure Function

Bu seferki algoritma aslında yine başka bir algoritmada kullanılan bir parça olacak. Basit metin arama algoritmasında bulmak istediğimiz metin parçasını ana metin üzerinde her adımda bir karakter kaydırarak üst üste gelen harflerin aynı olup olmadığına bakıyorduk. Bu yazıda bakacağımız algoritma her adımda bir karakter kaydırma sorununa bir çözüm bulmaya çalışacak.

Aradığımız metin parçasındaki harflerin özelliklerini kullanarak bazen birden fazla karakter kaydırma imkanını elde edebiliriz. Yani karakterleri karşılaştırırken fark olan ilk konuma kadar olan karakterlere göre birer karakter kaydırmanın bu başlangıç kısmında bir eşitlik yaratamayacağından emin olabilirsek bundan faydalanarak kaydırma adımını hızlandırabiliriz. Hedefimiz şu: Arama metnindeki ilk uyumsuzluğun konumuna göre kaç adım sıçrama yapmamız gerektiğini söyleyen bir tablo bulmak istiyoruz. Dolayısıyla normal arama işleminde yine karakterleri tek tek kontrol edeceğiz ama ilk farkta bu tablo bize bir sonraki arama için ne kadar sıçrama yapmamız gerektiğini (şansımız iyi giderse birden fazla) söyleyecek.

Wikipediadan aldığım bazı örnekleri vereyim şimdi.

             1         2  
m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W: ABCDABD
i: 0123456

Burada ana metin S ile aradığımız metin de W ile gösterilmekte. Burada i = 3 indeksli karakter ilk uyumsuzluğun olduğu yer. Şimdi W ile gösterilen karakter dizisini birer birer sağa kaydıracağım ama bu sırada S karakter dizisinde algoritmanın henüz görmediği yerlere X koyacağım. Bu X koyulu yerlere karşılık gelecek W karakterlerini de kullanmaya gerek olmayacak çünkü bu karakterleri henüz görmediğimizden buralarda eşitlik olup olmadığını bilmiyoruz.

             1         2  
m: 01234567890123456789012
S: ABCXXXXXXXXXXXXXXXXXXXX
W:  ABC
i: 0123456

İlk kaydırmadan sonra ilk konumda (i = 1) bir eşitsizlik var. Daha bakmaya gerek yok, bir kere daha kaydıralım.

             1         2  
m: 01234567890123456789012
S: ABCXXXXXXXXXXXXXXXXXXXX
W:   ABC
i: 0123456

Yine W parçasının başı yukarıdaki S dizisinin bilinen kısmının sonuyla uyuşmadı. Demek ki bu diziyi iki adım kaydırmak da işe yaramayacak. O zaman aramaya 3 adım kaydırarak devam etmek lazım.

Bu örnekten sonra iki şeye dikkat çekmek istiyorum.

  1. Aradığımız şey aslında W dizisinin başındaki bir dizinin (önek) yine W dizisinin sonundaki bir diziyle (sonek) uyuşup uyuşmadığı. İlk X nerede olursa olsun oraya kadar S dizisiyle yine aynı konuma kadarki W dizileri aynı olduğundan yukarıdaki fikri kullanabiliriz.
  2. İlk bakışta yine her adımda W dizisinin bir önekini bir kaydırıp kontrol ediyoruz gibi görünüyor ve böylece aramada yine her seferinde W dizisini bir karakter kaydırıp basit arama algoritmasına döneceğiz gibi geliyor ama aslında bunu sadece örnek olarak verdim. İleride bu tabloyu aramadan önce sadece arama metnini kullanarak bir kereliğine oluşturabileceğimizi göreceğiz.

Örnek:

             1         2  
m: 01234567890123456789012
S: ABC ABCDAB ABCDABCDABDE
W:            ABCDABD
i:            0123456

Burada ilk uyumsuzluk i = 6 konumunda oluşmuş. O zaman ana metinle aranan metin arasında i = 5 noktasına göre tam uyum vardır. O zaman aranan metnin o noktasına kadarki önekiyle ilgileneceğiz.

             1         2  
m: 01234567890123456789012
S: ABC ABCDAB ABCDABXXXXXX
W:            ABCDAB
i:            012345

Şimdi aranan metni birer kaydırdığımızda kendi önekiyle yine kendi soneki arasındaki uyumlara bakalım.

             1         2  
m: 01234567890123456789012
S: ABC ABCDAB ABCDABXXXXXX
W:             ABCDAB
i:            012345

i = 0 noktasında uyumsuzluk var. Yine kaydırmamız lazım.

             1         2  
m: 01234567890123456789012
S: ABC ABCDAB ABCDABXXXXXX
W:              ABCDAB
i:            012345

Uyumsuzluk devam ediyor. Yine kaydıracağız.

             1         2  
m: 01234567890123456789012
S: ABC ABCDAB ABCDABXXXXXX
W:               ABCDAB
i:            012345

Hala uyum bulunamadı. Kaydırmaya devam ediyoruz.

             1         2  
m: 01234567890123456789012
S: ABC ABCDAB ABCDABXXXXXX
W:                ABCDAB
i:            012345

Burada sonunda aranan W metninin iki karakterlik öneki ile yine W nin (tabii ki 6 karakterlik kısmı için, bu uzunluk en baştaki ilk uyumsuz nokta ile belirleniyor) iki karakterlik soneki arasında bir uyum bulundu. Demek ki tablomuzda ilk uyumsuzluk 6. konumda bulunursa 4. konuma kadar kaydırılmalı diye bir kayıt bulunmalı. Algoritma bu uyumsuzlukla karşılaştığında birer birer kaydırmak yerine hemen 4 karakter kaydırarak aradaki kontrolleri gönül rahatluğıyla atlayabilir.

Burada bir gözlemden daha bahsedeyim. Sağa doğru birer birer kaydırırken ilk uyumlu önnek, sonek çiftini bulduğumuzda kaydırmayı kesmemiz lazım. Yani en uyumlu olan en uzun önek, sonek çiftini arıyoruz. Bunun nedeni de aslında kolayca anlaşılabilir. Aranan metni kaydırdıkça bu metnin en son kısmı hep X ile gösterdiğimiz bölüme kayıyor, yani bu bölümde de uyumun devam etme hatta aranan metnin tamamının bulunma şansı var. Dolayısıyla bulunan ilk önek, sonek uyumunda durulmalı ki bu ihtimal gözden kaçırılmadan kontrol edilebilmeli.

Bir küçük nokta daha var ama onu zaten farketmişsinizdir. Önek ve soneklerin uyumuna bir kere kaydırdıktan sonra bakıyoruz. Kaydırmadan bakarsak her zaman uyumlu olurlar ve bu durumda algoritmamız kaydırmaya gerek yok diye saçma bir düşünceye kapılabilir.

Aşağıdaki linkten animasyon sayfasına girerek bu tablonun başta ana metne ihtiyaç duymadan nasıl hazırlandığını görebilirsiniz. Yani tabloyu arama algoritmasının en başında üretebiliriz ve sonra ana metinle beraber kolaylıkla kullanabiliriz. Bu kullanımı da başka bir yazı ve animasyonda göstereceğim.

Tablonun üzerindeki kısım önce indeks listesiyle başlıyor. İkinci satır ana metnin o ana kadar uyum sağlanmış kısmını gösteriyor. Bu farazi bir ana metin tabii ki, bütün işlemi aslında aranan metinde yapmama rağmen bu ana metin kısmını da göstermek istedim. Aranan metindeki uyumsuzluğun olduğu ilk nokta dolaylı olarak da ana metni o noktaya kadar belirlediği böylece daha kolay anlaşılır belki. Üçüncü satır aranan metnin tamamını gösteriyor. Son satır ise simulasyon sırasında kaydırılan kısmı gösteriyor. Yukarıdaki örneklerdeki W kısmı (ana metinle tam uyum sağlayan kısmı tabii ki) yani.

Tablonun başlık satırı indekslerden oluşuyor, yani yukarıdaki örneklerdeki i satırı. İkinci satır önek ve soneklerdeki en uzun uyumlu karakter dizisini gösteriyor. Son satır da algoritmanın indeks numaralı pozisyondaki uyumsuzluk için arama metnini kaç karakter kaydetmesi gerektiğini gösteriyor. Dikkat ederseniz index – maksimum uzunluk = kaydırma miktarı gibi bir eşitlik de var.

Simulasyon

Doktor randevularında bu hafta

Bu yıl başında yaptırdığım biyopsilerden sonra üroloğa kontrole gittiğimde bana şunu dediğinden eminim: “Sonuçlar iyi. Kanser değil. Bir sonraki kontrolü ekimde yaparız. Aralıkta da ameliyat için randevu alın, geçen sefer yapılan işlemin aynısı yapılacak.”

Yani ben böyle anladım. Sonuçta atipik hücrelere rastlanıldığı için her yıl aynı kontrollerin yapılması da bana hiç anormal gelmedi. Doktor o muayenede bana ameliyat için alt bir kağıt da vermişti. Açıkçası pek dikkat etmedim kağıda, üzerinde anlaşılmaz bir iki kelime ve daha da anlaşılmaz bir imzadan başka bir şey yoktu. Muayenehanedeki hemşirelere bunu gösterdiğimde o kağıdı benden aldılar ve alt kattan ameliyat için randevu almamı söylediler. Hatta geç kalmamamı bile söylediler. Bu bana ilginç gelmişti, çünkü geçen sene randevuyu iki hafta kala çok rahat almıştım. Bu senenin tek özelliği ise korona yılı olmasıydı. Belki daha az ameliyat yapacaklardır diye düşünüp nedenini sormadım.

Yazın bu randevu sorunlarıyla pek ilgilenmedim. Eylül geldiğinde artık şu kontrol muayenesi için randevu alayım bari dedim ama telefonla muayenehaneye ulaşmak bir türlü mümkün olmadı. Sürekli meşgul. O zaman kendime sormaya başladım. Neden muayenehaneler kendilerinde kayıtlı hastalar için online randevu sistemi kurmuyorlar acaba? Telefonun tamamen kalkmasına da gerek yok, bazı hastalar telefonda önce bilgi almak isteyebilir.

Sonunda senelik iznimde muayenehaneye gittim. Haftaya bir randevu aldım. Sonra alt kata inip ameliyat için randevu alayım dedim. Danışmadaki kadın beni dinledi ve sonra bana garipçe baktı ve “randevuyu doktordan alacaksınız” dedi. Bana doktorun altı ay önce böyle söylediğini anlatmama rağmen kadın “biz anestezistiz, ameliyatı doktorunuz yapacak. Randevuyu ondan almalısınız” dedi yine. Açıklama bu açıdan bakınca mantıklı geldi ama peki bana aylar önce muayenehanede neden aksini söylemişlerdi? Muayenehaneye çıkıp bir de oradakilere sorayım dedim. Durumu anlattım ve kayıtlara baktılar. “Sadece kontrol gözüküyor sizde, doktor kontrolde ameliyat gerekip gerekmediğini söyler o zaman randevu alabilirsiniz” dediler. Son geldiğimde aynı insanlar çok farklı şeyler demişlerdi ama. Yoksa ben mi her şeyi yanlış hatırlıyordum? Ben bu düşüncelere dalmışken hemşirenin hayaş meyal “bir hafta filan önceden kan vereceksiniz. Değerlere göre doktor karar verir” dediğini duydum. Yeniden düşünmeye başladım. Bir hafta önce mi? Zaten randevum haftaya, yani bu hafta kan vermem lazım. On dakika önce diğer hemşire bana randevumla beraber bir kağıt daha vermişti, üzerinde kan verme saatleri yazıyordu. O sırada bakmamıştım ama randevu saatimde kan verme şansım olmayabilir bu durumda. Peki o hemşire neden bana bir hafta önce kan vermem gerektiğini söylemedi? Neyse daha fazla bir şeyleri yanlış anlamadan eve gideyim en iyisi.

Dün kan vermeye gittim. Sıra yoktu. Hemen beni içeri aldılar. Kan örneği alındı ve hemşire tamponu yapıştırdı ve buraya bastırın dedi. Diğer hemşire de kanı alan hemşireye “neden onu hemen dışarı atıyorsun ki?” diye sordu. Tipik bir yanlış anlama olmuştu. Kanı alan hemşire de “dışarı atmadım, tamponu bastırmasını söyledim” dedi. Artık benim kafam karışmıştı. İşim bitmişti ama gitmeli miydim kalmalı mıydım? Dört metrekarelik odada oturup bekledim ben de. Beş dakika sonra başka bir hemşire geldi ve “sizin işiniz bitmiş miydi?” diye sordu. İçimden “bilmem” dışımdan ise “evet” dedim. Giyinip kimseye bir şey sormadan çıktım eve gittim. Bakalım haftaya bir şey unutmuş muyum unutmamış mıyım öğrenirim heralde.

Tatil ve programlama dilleri

İki haftalık iznimde birkaç güncel programlama diliyle ilgilenmek istedim. Bu iş için öncelikle şirkette de kullandığım Eclipse program geliştirme ortamını kullanmayı düşündüm. Ne de olsa değişik dillerde programlama yapmak için tasarlanmış bir sistem. Marketplace adı verilen eklenti indirilen yerden doğru eklentileri indirdim. Go dili için Ubuntu altında epey işlem yapmam gerekti ama bunu nedense Eclipse altında çalıştırmayı başaramadım. Bir sürü ayar yapmam gerekti ama projeyi kurduğumda nedense programları acayip yerlerde çalıştırmaya kalktı. Ardından Go için başka bir program geliştirme ortamı aradım ve LiteIDE diye bir programı indirdim ve orada Go eklentisini yükledim ve hemen çalıştı. Büyük projeleri şimdilik düşünmediğim için bana yeterli geldi. Skor eclipse için 0-1 oldu böylece.

Ardından Rust dilini denedim. Yine eclipse için eklentisini yükledim. Bu daha sorunsuzdu ama sıra deneme programını çalıştırmaya geldiğinden yine bazı ayarları yapmam gerektiğini fark ettim ama bunu da beceremedim. Bunun üzerine bunu çok daha önceleri yüklediğim intelliJ Idea programının community versiyonunda deneyeyim dedim. Eklentiyi orada yükledim ve deneme programı hemen çalıştı. Böylece skor Eclipse 0 – Diğerleri 2 oldu.

Üçüncü adayım C++ diliydi. Bunu da 10 yıldır C++ programı yazmadığım için don standardlarda neler olduğunu öğrenmek için istiyordum. Bunun eclipse altında çalıştığından eminim çünkü daha önce de kullanmıştım. Nedense Java için kullandığım eclipse programına C++ eklentisi bulamadım. Bunun üzerine C++ için olan eclipse versiyonunu indirdim ve kurdum. Hemen C++ denemelerine başlayabildim. Sonunda Eclipse bir gol atmayı başarmıştı.

Son olarak da Scala dilini denemek istedim. Bu dil Java platformunda çalıştığı için eclipse sorun olmayacaktı. Eklentiyi ekledim ve deneme programını yazdım ama projeyi bir türlü çalıştıramadım. Bunun üzerine aynı denemeyi intelliJ Idea programında denedim. Eklentiyi yükledikten sonra deneme programı hiçbir ayar yapmaya gerek kalmadan çalıştı. Sonuç Eclipse 1 – Diğerleri 3 şeklindeydi.

Eclipse oldukça başarılı bir program ama benim beklentim de yüksekti. Mesela eklentiyi yükledikten sonra minimum ayarlama yapmak bunlardan biriydi. Bu diller bilgisayardan anlamayan birinin ilk programlama dili olabilir neticede ve bu ortamın böyle ihtimallere hazır olması lazım. Sonuçta intelliJ Idea bunu çok rahat başardı. IntelliJ Idea ile sadece Go dilini kullanamadım çünkü o eklenti sadece tam sürüm için vardı ama. Şimdilik ilgilendiğim diller için çözümler bulduğuma göre artık öğrenmeye başlayabilirim.