Doğu Avrupa 2. Gün - Kiev: Olaylar Olaylar



27 Haziran 2017 Salı

Ertesi gün uyandığımda facebook'tan mesaj akınına uğradığımı fark ettim. Kiev'de bombalı araç infilak etmiş. Burada da mı buldunuz diye sövdük.

Hostelden çıktık. Direkt karşılaştığım manzara:



Sabah bahçede çay içen Türkleri görünce kahkaha attım direkt, ne çay sever insanlarız birader :)

Arkadaşın tripadvisor'dan bulduğu bir kahvaltı mekanına uberladık. Mekanda arkadaşlar bir Ukrayna kahvaltısı yapalım dedi. Üzümlü ekmek dışında dişe dokunur bir şey göremedim. Bu arada Uber'a gelen taksici amca bizi görünce haa ben Müslüman'ım falan dedi (ama Tatar değildi). Bizimkiler adamla muhabbet etmeye çalıştı ama yarı İngilizce çeyrek Rusça. Anlaşamadık.

Önce hat alma işiyle uğraştık. Hatlarda kaç cigabayt var onu öğrenmeye çalışıyoruz ama insanların İngilizce seviyesi yine yerlerde. Arkadaş "If I buy will 5 gb installed?" falan diyor, ikaz ediyorum "Abi basit konuşun!" diye. "Ay bay dis ay gat fayv cigabayt" dedim yaktım ampulleri ;) Kiev'de İngilizce konuştukça benim de İngilizce'm geri gitmeye başladı.

Bugün zamanın çoğu banka banka gezip arkadaşın Sarıyer'den aldığı üstü çizili eski doları bozdurmaya çalışmakla geçti. Exchange büroları makine okumuyor diye bozmuyor. Bankalar ise "Şu an bir şey yapamıyoruz sistem çökük Diego bi dur Allah'ını seversen." diyip duruyor, arkadaş sövüyor "Nasıl ülke burası bizde bankalar bir saat kapansa olay olur."

Gezdiğimizin bankalardan biri: (#bankarail)



Mesele sonradan anlaşıldı. Meğer o gün Ruslar siber saldırı yapmış Ukrayna'ya. Hosteldeki resepsiyonist bile check-inleri kalem kağıtla yapıyordu.

Yalnız arkadaş o doları sonra da bozamadı. Kiev'den dönünce memleketi Kırşehir'de bir atmye sokmuş, atm çat diye kabul etmiş :P

Exchangeleri gezerken ben de para bozdurdum çünkü Yapıkredi "Unicreditle anlaşmam var komisyon momisyon yok." demesine rağmen ATM "İlle de %3 isterim." diye haykırıyordu. Ben de hadi oradan diyip euroları harcadım. Bu gezi boyunca yaptığım en büyük hataydı çünkü bir daha azla %3 gibi ufak bir komisyondan para çekemedim.

Çok güzel bir taksi:



Kiev'in turist merkezi olan Bağımsızlık Meydanına (Maidan Nezalezhnosti) doğru yürümeye başladık. Hediyelikçiler, peluş hayvanların içine girip fotoğraf kovalayan adamlar, yanında hayvan taşıyan adamlar. Bazıları çok arsız oluyor. Bir adam arkadaşın kafasına maymun koydu trollüğüne. (fotoğraf çekemedim malesef)

Yürürken çektiğim birkaç güzel ev ve banka resmi:







Kiev elini korkak alıştırmayan bir şehir. Kaldırımların ne kadar geniş olduğunu görüyorsunuz:



Khreschatyk imiş bu caddenin adı. Yolda teyzenin biri benden para istedi, Rusça Rusça anlamıyorum diyince "Sen beni çok güzel anlıyorsun." dedi asdas. Dilenciler biraz ısrarcı olabiliyor burada.

Bağımsızlık meydanı:





Yalnız gezinin Kiev ayağı genelde gırgır şamata olduğu için burada ansiklopedik bilgi veremeyeceğim. Zaten internetten baktım şimdi ansiklopedi bilgi verecek bir şey de gözükmüyor. Turistler sıra sıra I <3 Kyiv'in önünde fotoğraf çekiniyor işte.

Bağımsızlık meydanının hemen karşısında da şöyle bir reklam panosu var, uyumlu olmuş



(ilk gördüğümde sosis sandım bunu)

Bir hediyelikçi:



Putin baskılı tuvalet kağıtları popüler hediyeliklerden. Ama sıradan marketlerde görmedim.

Meydanda oturan insanlar ve oynayan çocuklar:



Burada standart aktivitemiz oturup suya ayaklarımızı sokup kiraz yiyip insanlara ikram ederek muhabbet açmaya çalışmak :d





Buradan sonra bir de St. Sophia Katedraline gidip çan kulesine çıktık:







Ne kadar yükseğe çıktığımızı ve Ukraynalıların sigara sevdasını buradan görebilirsiniz:



Döndüğümüzde hostelin önünde pazar kuran bi adamla karşılaştık, Bayezid döneminden sikke satıyormuş, kaçıncısı dedik bilemedi, daha doğrusu kaçıncısı dediğimizi bile anlamadı. Sikkeler sahte tabii :) Arkadaş aldı bir tane.



Akşam hostelin bahçesinde oturduk, muhabbet ettik. Çevrede oturan Ukraynalı iki eleman buraya gelmiş muhabbete, Anna ve Lesyk.

Gelmeden önce Ukrayna hakkında bildiğim tek şey çok sevdiğim Potap & Nastya Kamenskykh isimli çiftten oluşan pop grubuydu. Dedim bundan muhabbet açayım. Anna kızımız "İğreeeeenç. O grup kötü müzik zevkinin işareti!" diyip iki dakika beni herkese rezil etti. Grubun en kötü şarkısını açıp herkese dinletti. Lesyk "Ya kulağa hoş geliyordur da sözleri çok aptalca ya." diyerek durumu hafifletti (?). "Bu daha güzel." diyip süper sıkıcı bir eurovision şarkısı açtı. Birinci olan Jamalayı ise dinlememiş bile, "o yarışma o kadar popüler değil ya." yaptı.

(Ukrayna'da bu grubun sözünü son güne kadar etmedim, son gün arkadaş bluetooth hoparlör alırken sordum, "Evet seviyoruz, hit!" dediler. Varşova'daki Polonyalı arkadaşlarım ise gruba bayılıyordu. Lanet olası Anna... Bu arada bu grubu merak ettiyseniz şöyle alalım.)

Lesyk ile biraz sohbet ettik, adam tarih okuyormuş, o yüzden muhabbeti güzeldi. Facebook'tan ekleştik. Kiev'de tanışıp facebook'tan ekleştiğim tek kişinin Ukraynalı bir erkek olması tam bir epic fail.

Bahçede otururken büyük gözlüklü ve kıvırcık saçlı bir eleman belirdi. Azerbaycanlıymış, ismi Hani (bal). Çorum'da okuyormuş, Litvanya'da Erasmusunu yapmış trenlerle dönüyormuş. Aha dedim bu adam ana dili gibi Rusça konuşuyordur şimdi, yaşasın insanlarla anlaşabileceğiz. Aldık gruba :P

Anna bahçedekileri toplayıp bomboş bir bara götürdü. "Amcasının barına mı götürdü acep, halı falan mı satacak?" gibi düşüncelere kapıldım. Fazla oturmayıp çıktık.

Yolda I <3 Kyiv'in önünden geçtik, birkaç troll foto çektik.



Yine dün gece gittiğimiz Caribbean cluba gittik. Ertesi gün resmi tatil olduğundan burada da etkinlik vardı ama giriş çok pahalıydı, ben girmedim. Dışarıda barzoların Ukrayna kızlarını ikna çalışmalarını izledim. Gece soğuktu tişörtle üşüttüm o kötü oldu.

Dönerken (yine uber) Hani'ye söyledim taksiciyle muhabbet et diye, sor bakalım işleri nasılmış. Hani Rusça konuşmaya başlayınca adam vatandaşını görmüş gibi dertlerini bir bir dökmeye başladı. Uber normalde arabası olanlar boş gezmesin diye çıkarılmış bir uygulama, ama burada taksiciler kullanıyor. Ben de kişi başı 15-20 grivna verdiğimizi hatırlıyorum (2-3 lira) 3-5 kilometre yollar 8-10 lira tutuyor yani. Uber çeyreğini alıyor, adamın elinde kuş gibi bir şey kalıyor. Adam mecbur kabul ediyormuş yoksa iş yok. Buradaki benzin fiyatları da oldukça düşük olmalı. (Not: Uber'ın çektiği fiyat yine yüksekmiş, şimdi baktım normal taksiyle 10 kilometre 85 grivna yani 10 lira filan. Ama normal taksi turist görünce geçirmeye çalışacağı için iyi bir seçenek değil.)

Uyuduk.

Günün özeti:







Doğu Avrupa 1. Gün - Kiev: Varış

26 Haziran 2017



Üniversite bitti ve ben biriktirdiğim paralarla geçen sene yaptığım gibi uzun soluklu bir geziye çıkmak istedim. Berlin'e uçup oradan Polonya'yı gezip sonra İstanbul'a kadar arabalarla inecektim. Fakat geziye davet ettiğim arkadaşlarımdan biri "Biz arkadaşla Kiev'e gidiyoruz sen de gel." diyince onların peşine takılmaya karar verip rotayı değiştirdim. (Oz ve İbo diyeceğim isimlerine, Oz Koç'ta gözetmen hocamın asistanıydı, Bilkent'ten de tanışıyoruz ama benden iki sene önce mezun oldu.) Sonra başka bir arkadaş da benim peşime takıldı, okeyi dörtledik. (Bunun ismi de Hak)

Arkadaşlarla bayii toplantısına gitmek için havalaanında buluştuk. Türkiye'den çıkış kuyruğu çok komikti, güzel bir Ukraynalı abla polise soru sormaya çalışıyor, polis İngilizce bilmiyor bir de utanıp kadınla göz göze gelmeden önüne doğru gülümsüyor. Biz arkada İngilizce bilenler olarak stres olup yardım etmeye çalışıyoruz. Sıra bana geldi, pasaportu verdim, hiperaktif bir insan olduğumdan beklerken bir yerlere vurup ritim tutmaya başladım. Polis abla bağırdı "Ne çok çalıyon sen ya oraya da mı çalmaya gidicen" diye. Şu güzel ortamı bozuyosun.

Uçağa doluştuk. Check-ini birbirimizden bağımsız yaptığımız için ayrı yerlere oturduk. Tyler Durden'in değimiyle kullan-at arkadaşlarım epey hoş sohbet çıktı, Ukrayna hakkında muhabbet ettik. Bir tanesi abim gibi gemi kaptanıydı, öbürü de benim girdiğim sene Bilkent'ten mezun olmuştu ve şimdi Kanada'da mastır yapmaktaydı. İstanbul'da tanıştığı bir Ukraynalı çağırmış beraber gezeriz diye. Uçaktan indiğimizde bizim arkadaşlarla karşılaştı ve "Beyler, İngilizce bilmeyen insanların memleketine hoş geldiniz!" diyerek aramızdan ayrıldı. Arkadaşlardan biri "Biz bununla aynı sınıftaydık ya bir derste." dedi. Dünya küçük.

Pasaport kuyruğundayız, arkadaşlar önden gidiyor. Daha önce internette Türkleri ayrı odaya alma (gerçi uçak ful Türk) hatta beğenmezlerse geri sepetleme gibi durumlar olduğunu görmüştüm. Pasaportlara da polis değil asker bakıyor, epey de sinirli gözüküyor. Adam bir de Putin'e benziyor. İbo'ya soru sordu bir yığın, arkadaş rezervasyon falan gösterdi, geçti. İkinci arkadaşa da bir şeyler dedi, arkadaş anlamadı, meğer gözlüğünü çıkar demiş.

Sıra bana geldi. Kalbim küt küt atıyor çünkü yeşil pasaportluyum (kaçma ihtimalim var), rezervasyonum bende değil ve geri dönüş uçağı yok. Adam pasaporta baktı. Sonra yanındaki kadın polis (asker?) ona bir şeyler söylemeye başladı. Sonra adam bana "Yanındakine sorabilir misin niye gelmiş?" dedi. Durumun heyecanıyla mal gibi İngilizce "Niye geldin?" dedim, çocuk bana boş boş bakınca Türkçe sordum. Çocuk Suriyeliydi, biraz kekeledikten sonra "Abim burada okuyor ziyaret edeceğim onu." dedi. "Eminsin di mi?" dedim evet dedi. Söyledim askerlere. Bana bir şey sormadılar. Sorgu beklerken sorguyu yapan oldum keh keh.

Arkadaş otelle anlaştım 300 UAH (grivna) (40 tl) vereceğiz taksiye dedi. Attık 10 TL. Bu 10 TL Ukrayna'da verdiğim en yüksek taksi ücreti oldu. (Normalde havaalanından şehir merkezine gelmek 75 UAH imiş.)

Yollar bomboş ama taksi kırkla gidiyor. Bir anlam veremedik. Şoför Putin'e benziyor.


Hostele varıp check-in yaptık. Arkadaş yemek yiyelim dedi, garip bir konsepti olan bir mekana girdik, içerisi barbie evi gibiydi. Menüye baktım ama çok pahalıydı, 250 UAH'tan (36 lira) daha ucuz yemek yok gibiydi, ben bir şey yemedim. Sonradan anladık ki onlar yemeklerin gramajıydı, hay kafam :d



Bizim grupta şöyle bir eşitsizlik vardı: ben ucuz bütçeli İnterrail tarzı uzun bir gezi yapmayı arzularken ve kendi arkadaşımla da bu konuda anlaşmışken peşine takıldığımız iki arkadaş işlerinden bir haftalığına izin alıp kısa bir tatile çıkmış kişilerdi. Dolayısıyla restorandan çıkıp hemen cluba gittik Uber'la.

Vardığımız anda "Alpeeeeer" diye bir bağırtıyla karşılaştık. Oz'un tepkisi "Kiev merkez camii!" oldu. Harbiden club'ın önü camii avlusuna benziyordu ve Türkler buraya bayramlaşmaya gelmiş gibiydi.

İçeri girdik. (Arkadaşlardan birini şortlu diye almadılar.) Fazla kişi yoktu. Dans edenleri izledim. Birkaç tane Türkle daha bayramlaştım. "Şunlar bunlar paralı asker bak." diye eliyle gösterdi. İçeride kimseye bakmayıp sadece birbirleriyle dans etsinler diye mekan sahipleri kızlara para veriyormuş sanırım.

Bu arada itiraf etmek gerekirse yolculuğun Kiev ayağı genelde gittiğimiz clublar ve aramızda çevirdiğimiz geyiklerle dolu. Harbiden bilgilendirici gezi yazıları için Polonya ve Sırbistan'ı bekleyin.

Tan yeri ağarırken döndük.

Doğu Avrupa Gezisi - Rotam



Bu yazıyı bu yörede yolculuğa çıkan olursa kısaca bilgi vermek (Gezilecek yerler, yemekler ve ulaşım) Sonra uzun uzun her şehri resimlerle anlatacağım. Takipte kalın.

Çıkmadan Önce Mutlaka Alınması Gerekenler:
- Powerbank
- İyi fotoğraf ve video çeken telefon (kamera da olabilir ama insan anında instagrama atamıyor)
- İyi bir gps'i olan bir telefon
- Bluetooth hoparlör (eğlenceli oluyor)
- Bolca cash (bazı ülkelerde kredi kartı geçmiyor)
- Leblebi

Rezervasyonları genelde hostelworldden yaptık ama Skopje'de olan olaylardan sonra bir daha buradan yapmam.

Rota aslında Berlin'den başlayacaktı fakat geziye davet ettiğim arkadaşlarımdan biri arkadaşlarıyla Kiev'e gidecekmiş, biletleri de almış. O sebeple Kiev'den başlattım.

Rota (Parantez içindekiler günü birlik)
İstanbul -> Kiev -> Lviv -> Varşova -> Gdansk (Sopot) -> Poznan -> Berlin -> Wroclaw -> Krakow -> Budapeşte (Estergon) -> Novi Sad -> Belgrad -> Saraybosna -> Mostar (Pocitelj) -> Trebinje -> Budva (Kotor) -> Ülgün -> İşkodra -> Tiran -> Ohrid -> Üsküp -> İstanbul

Ukrayna

İstanbul - Kiev: 4 ay öncesinden Ankara aktarmalı 204 liraya aldım. (Aktarmasız 160 idi sanırım).
Kiev: 26 Haziran - 1 Temmuz arası beş gün geçirdik. Hava hep çok sıcaktı sadece son gün yağışlıydı. Biz dört kişi (sonradan beş olduk) olduğumuz için hep dolu dolu geçti, tek gezseydim ne kadar yeterli olur bilmiyorum. Dream House Hostel'de kaldık, kalabalık olduğu için öneririm, yeri de fena değil. Hava güzel olursa mutlaka ırmakta yüzmeye gidin. Sürekli Puzata Hata'dan bir şeyler yedik, fiyatlar iyi sayılır. Yalnız Kiev öyle sosyal olunacak bir yer değil bence, İngilizce bilmiyor kimse. Dışarıda da o kadar fazla turist yok.

Kiev'de üç arkadaş aramızdan ayrıldı, geziyi iki kişi tamamladık.

Kiev-Lviv: Kuşetli gece treniyle gittik 52 liraya (400 grivnaydı sanırım). Bileti erken alınca ucuz oluyor olabilir arkadaş 26 liraya gittim dedi. Gece 10:40 gibi binip sabah 7 gibi vardık.
Lviv: 1-3 Temmuz arası üç gün geçirdik. Üçüncü gün biraz gereksiz oldu. Mutlaka gezilip görülmesi gereken bir yer. Kryivka isimli milliyetçi konsepte hazırlanmış restorana ve Mazoh cafe isimli bara mutlaka gidin. 
Leosphere isimli ucuz hostelde kaldık 15 liraya, tek sıkıntısı odalar birbirine bağlanıyor.
Lviv gezi için başlangıç seviyesinde bir yer. Gezmek isteyen biri ilk buraya gidebilir gönül rahatlığıyla: yeme içme barınma ucuz, kazıklanacağınızı da sanmam turist kapanı bir yer değil, tarih bakımından zengin, vize yok, gidiş geliş ucuz, neredeyse her yer yürüme mesafesinde, eğlence var. Türk bol, kendinizi yalnız da hissetmezsiniz. Daha ne olsun? 

Polonya

Not: 1 zloty hemen hemen 1 TL.

Lviv - Varşova: Normalde Polskibusla 60 zlotye gidecektik ama yer kalmamıştı, İnfobus ile 34 liraya bulduk onla gittik (250 grivnaydı sanırım) Gece yolculuğuydu. Arabanın üzerinde İnfobus yazmıyor ve nereden kalkacağı belli değil, neyse ki şoför bizi aradı da tarif etti. Koltuk numarası yok, elinizi çabuk tutup yer kapın.
Sınırdakiler pek kibar değiller, sorguya çekip çantalara falan bakıyorlar.

Varşova: 4-8 Temmuz arası dört gün gezdik. Burada da arkadaşlarımda kaldığımız için dolu dolu geçti normalde bu kadar gezilmeyebilir, bir de ağırdan aldık. Kopernik center'a mutlaka gidin, bu bir gününüzü yiyecektir. Uprising Museum'a pek gerek yok. Old Town güzel. 

Varşova-Gdansk: %50 öğrenci indirimiyle 33 zloty'e trenle gittik. Polonya'daki trenlerde öğrenci indirimi sadece Polonya öğrencilerine yazıyormuş internette ama kondüktör bunu sorgulamadı. Yine de riske atmamak için %66 genç indirimiyle bindik öbür trenlere. 3-4 saat sürüyor.

Gdansk: 8-10 Temmuz arası 2.5 gün gezdik. Bisiklet kiralayıp Sopot'a gidebilirsiniz. Hostel Cycle-On, eski şehire çok yakın, iyi, 10 euro idi sanırım. Genelde hosteller 10 euro zaten. Zapiekanka yiyip durduk. 

Gdansk-Poznan: Bilet fiyatını unuttum, 40 zloty falandı herhalde tren. Yine 3-4 saat sürüyor.

Poznan: 10-11 Temuz. Sadece bir gece kaldık. Fazla bir şey yok, hosteldekilerle kaynaşınca eğlendik yine de. Kruvasan müzesinde şov izleyin eğlenceli. Hostel Retro fena değil.

Poznan-Berlin: Polskibus'la normalde fiyatı 50 zloty'di bir gün önceden fiyatı fırladı ben de anlamadım, 70'e binmek zorunda kaldım. 4 saat yol. 

Berlin: 11-14 Temmuz. Arkadaşımda kaldım (yol arkadaşımdan geçici bir süreliğine ayrıldım) Yolculuğun en gereksiz kısmıydı, her şey çok pahalı. Polonya'yı biraz daha gezmek daha iyi bir fikir olurmuş bence. Arkadaşlar çok övmüştü ama ben o kadar beğenmedim Berlin'i. Mercan restoranda ev yemeği yiyebilirsiniz, yemek + bulgur + salata 7 euro, ayran 1.5 euro, Berlin'e göre ucuz.
Çok sık bilet kontrolü var, 2.5 günde 5 kere kontrole denk geldim. Hepsi metroda.

Berlin-Wroclaw: Otobüs yine Polskibus, 80 zloty. (Flixbus'a da bakın mutlaka.) 4 saat yolculuk.

Wroclaw: 14-15 Temmuz 1 gece. Belki çok fazla beklentiyle gittiğim için en sevmediğim şehir oldu, bir şey yok burada. 300+ cüce heykeli varmış. Cüce avına çıkabilirsiniz yapacak işiniz yoksa. Gece hayatı iyi.

Wroclaw-Krakow: Trene binmedik çünkü Polskibus bileti 10 zloty idi.

Krakow: 15-17 Temmuz 2.5 gün gezdik. Krakow eğlenceli bir yer. Eski şehiri harika. İkinci kez geldim, bir daha gelirim belki.  Free Walking Tour'a katılın mutlaka çok güzel hikayeler anlatıyorlar. Auschwitze sakın tur satın almayın, Auschwitze gitmeyi başarırsanız (otogardaki ablaya "Auschwitz" deyin) tur içeride beleş zaten, yalnız internetten rezervasyon yaptırmalısınız.

Krakow - Budapeşte: Polskibus 45 zloty. Gece yolculuğu yaptık. Yalnız ben pek uyuyamadım ya. Erken check-inn yapmanıza izin verecek bir hostel bulun, özel oda tutarsanız buna izin verirler. Şehirde çok fazla turistlere açılmış üniversite yurdu olduğu için bu mümkün. 

Not: Polonya'da hiç bilet kontrolüne denk gelmedim ama siz alın yine de. Bazen otobüslerin içinden de bilet alabiliyorsunuz, makineler var.

Polonya çok güzel bir ülke, burada çok güzel anılarım geçti. Gitmeden önce korkuyordum ırkçılar diye ama hiçbir şey olmadı. 

Macaristan

Budapeşte: 18-21 Temmuz 2 gün gezdik, bir gün de Estergon'a gittik. Aslında daha önce Budapeşte'ye geldiğim için rotayı Estergon-Pecs-Szeged diye ayarlamıştım ama Szegedde hostel yok adam akıllı, Pecs treni de çok erken kalkıyor. O yüzden böyle oldu. Ama iyi olmuş, Budapeşte geze geze bitirilemiyor. Free Walking Tour'a katılın mutlaka. Komünizm turuna da mutlaka gidin. Titiz restoranda Türk yemekleri yiyebilirsiniz.
Macaristan ucuzdu normalde ama Türk lirası değer kaybedince pahalanmış. Markette 18 tane balık parmak (fish finger) 6 lira mı ne. Ondan yiyin. Nasıl o kadar ucuz oluyor ben de bilmiyorum. Tren garına yakın olsun da Estergon'a rahat gidelim diye Pannonia hostel'de kaldık ama çok rezalet bir okul yurdu, kalmayın.
Budapeşte'de metroda güvenlikler anca onlarla göz göze gelirseniz veya göz göze gelmemek için uğraşırsanız kontrol yapıyorlar, onun dışında bu adamların ne yaptığı pek belli değil. Ama bilet alın yine de.

Estergon: Budapeşte'den gittik döndük. Fazla bir şey yok. Estergon kalesi öyle ahım şahım bir şey değil ama içindeki Bazilika güzel. Tuna ırmağının güzel bir manzarasıyla fotoğrafınız olabilir. Köprüyü geçip Slovakya'nın Sturuvo kasabasına yürüyebilir, otantik bir ortaçağ restoranında 4 euroya Haluşki deneyebilirsiniz, ayrıca 2.5 euroluk erikli kurabiyeler de nefis. Ama asıl olay restorandaki nesnelerle fotoğraf çekinmek. Restoranın ismi: Stredoveká sedliacka reštaurácia Böyle reklam yapmayı sevmem ama buna değdi.

Budapeşte - Novi Sad: Fiyat 12 euro, 6 saat falan sürüyordu sanırım. Tren fazla dolu olmuyor, bacaklarınızı uzatıp gidebilirsiniz. Sırp polisinden korkuyordum ama pasaporta diğerlerinden 15 saniye fazla bakmak, suratıma da iyice göz gezdirip "OK" demekten başka bir şey yapmadılar.

Sırbistan

Novi Sad: Burada ışıklandırma sarıdan beyaza evrildiği için insan kendini evinde hissetmeye başlıyor. :d 21-22 Temmuz arası, 1 gün gezdim. Yeterli. Ufak ve şirin bir şehir. Kalesi var nehrin karşısında, gece ışıklı olduğundan hoş oluyor. Ben gittiğimde Cuma gecesiydi kale ve nehir kenarı bayağı kalabalıktı. Kalenin içinde Exit festival varmış geçen hafta. Arkadaşım vardı o da küçük bir eski şehir turu yaptırdı. Tesla Art Hostel'de kalın mutlaka, sahibi olan adam konuşkan biridir bir şeyler anlatmayı sever, çekinmeden soru da sorabilirsiniz. Sırp kültürüne hakim bir abimizdir.

Novi Sad - Belgrad: Otobüs fiyatını unuttum ama ucuzdu. 

Belgrad: 22-26 Temmuz, 3 ful gün gezdik. Good Morning Hostel'de kaldık ucuz diye ama pek önermem. Konumu iyi yine de.
Belgrad'da tam üç ful gün gezmelik, daha fazla da gezebilirsiniz tabii. İlk gün walking tourla şehri dolandık, çok güzeldi. İkinci gün bu sefer şehrin güneyini kapsayan ve yakın dönemi anlatan bir yürüme turuna katıldık, sonra Zemun'a gittik. Buranın eski şehiri Türkiye'nin beldelerini andırıyor, fena değil. Kuğular felan var. Üçüncü gün Ada Ciganlija'ya gittik, burada yüzüp spor yapabilirsiniz. Ama o gün yağmur yağdığından bomboştu gerisingeri döndük :P Akşam Sırp arkadaşlarla Partizan-Olimpiakos maçını izleyip muhabbet ettik, gerçekten çok cana yakın insanlar. Önyargılarınızla gitmeyin. 

Arkadaşlar diyor ki Belgrad'da kimse bilet almıyor (onlar dahil) çünkü kontrolcünün kimlik sorma hakkı yok. Polisle gezip ona sordurması lazım, bununla da kim uğraşacak? (Bunu yapan kontrolcüye rastgeldim ama). Büfeler biletim yok diyip bilet satmıyor. Biz hep şoförden aldık o da pahalıydı. Yine de uğraşmamak için bilet aldık hep. 

İlk böreğimi burada yedim her yerde börekçi var, fiyatlar 2-3 lira genelde. Bir de Pljeskavica (plyeskavitsa) diye kocaman ve ucuz bir hamburgerleri var. Bir de cevapi yani İnegöl köfte var. 

Sırbistan'dan Türkiye'ye kısa devre yapmak isterseniz Niş isimli şehire gidin. Oradan Sofya 3 saat, tabii sınırda kuyruk olabilir. Sofya'dan da Türkiye'ye bir sürü otobüs var. Niş ve Sofya Avrupa'ya açılan kapı gibi çünkü buradan Wizzair uçuyor. (Eski Türkiye'de İstanbul'a da uçuyordu.)

Belgrad - Saraybosna: İkisinin arasında otobüsler var ama en iyisi geatours.rs ile gitmek. Ücret 20 euro, otobüsle aynı neredeyse. Rahat bir arabada dört kişi gittik, diğer iki kişi de Türk çıktı :d Yalnız yol çok virajlı ya, iyi bir mide gerek. Gea tours kapıya kadar bırakıyor. Bu iyi. Pasaport görevlileri şoförle muhabbet ede ede bastı pasaportları. Kuyruk falan yok hatta araba görmedim bizden başka.

Bosna Hersek

Bosna Hersek üçe ayrılmış bir ülke. Bosna kısmında Boşnaklar (Sırp ve Hırvatlara göre "Müslümanlar") çoğunlukta, Hersek'te Hırvatlar, bu ikisi federasyon. Sırpların ise ayrı devleti var Republika Srpska diye. Arada sınır kontrolü yok ama.

Saraybosna: 26-28 Temmuz'da oradaydık ama bence fazla oldu. Yarım gün bile yetebilir.
%80'i Boşnak. Eski şehir acayip dağlık bir yere kurulmuş, bizimkiler kurmuş :d. Türkler ve Arap turistler işgal etmiş, her yer Türkçe tabela dolu (Arapça tabela fazla yok niyeyse) Satıcıların bazıları Türkçe de konuşuyor. Biraz Bursa'yı andırıyor. Tepeye çıkıp çok güzel manzara fotoğrafları çekebilirsiniz. En tepedeki kalede bir tane pencereden dışarı çıkmak mümkün, en iyi manzara orada. Aman aşağı düşmeyin. Botanik parka gittik, bence zaman kaybıydı. Yemek seçenekleriniz börek ve İnegöl köfte. Büyük camiinin orada gizli bir geçit börekçiye gidiyor, en ucuz börekler orada. Lucky hostel diye evden bozma temiz bir yerde kaldık, öneririm. Bir de War Hostel var burada, kalmasanız bile gezebilirsiniz :P
Saraybosna'ya tramvayları Konya belediyesi hediye etmiş ama bunu bahane edip bilet almamazlık etmeyin, kontrolcüler komisyon için çalışıyor, Konyaymış Mevlanaymış dinlemezler.

Saraybosna-Mostar: Trenle gittik. Fiyatı hatırlamıyorum. 3-4 saatti yolculuk.

Mostar: 28-30 Temmuz'da 2 gece kaldık. Üç gün Mostar'da ne yaptın derseniz: iki sene önce Slovakya'da IAESTE programıyla staja gitmiştim, IAESTE'nin stajerleri için özel etkinlikleri mevcut, Mostar'da denk getirdik, katıldık. Mostar'ın yarısında biraz fazlası Hırvat gerisi Boşnak, köprünün bir tarafında Hırvatlar bir tarafında Boşnaklar yaşıyormuş. Eski şehiri gezdik. Çok aman aman bir yer değil. Pocitelj isimli kasabaya günü birlik gittik, işte orası çok güzeldi. Surlardan manzara gerçekten harika. Kravica isimli şelalede yüzdük, orası da çok güzeldi. 
Tren istasyonuna yakın bir börekçi var Pekara Orex diye. Türk bir teyze işletiyor. Sarımsaklı yoğurtlu bir börek yapıyor mis.

Mostar-Trebinje: Orijinal plan Mostar-Split-Dubrovnik'ti, sonra Mostar-Dubrovnik'e çevirdik, sonra baktık Dubrovnik pahalı olacak, bir de Saraybosna'daki abla "Dubrovnik çok kalabalık olur şimdi, Kotorla Budva oranın yavrusu gibi oralara gidin." diyince vazgeçtik. Ama böylesine viraj cenneti bir yerde Karadağ'a gece yolculuğu yapmayı göze alamadığım için arada Trebinje gezisi yapalım dedik. Bilet 12 euro, biraz pahalı. Hostel de 12 euro, o da pahalı. Ama kesinlikle değdi.

Trebinje: Republika Srpska'da. Burada sadece geldiğimiz akşam ve ertesi sabah öğlene kadar gezdik ama kesinlikle geldiğimize değdi. Eski şehir surlarla çevrilmiş kocaman bir açık hava barı resmen. Tepede güzel bir kilise var, otostopla gidebilirsiniz. Tepeden güzel manzaralar görebilirsiniz yine. Hostel Polako yeni açılmış, güzel bir ortamı mevcut, Polonyalı ve Amerikalı bir çift açmış. Sabahları şehir meydanına pazar kuruluyor, peynir alabilirsiniz :P

Trebinje-Budva: 10 euro, kaç saat sürdüğünü unuttum, 3-4 saat falandır yine. Dubrovnik-Budva arasında deli sıra varken burada yok, giriş çıkışta da uğraştırmadılar hiç. 

Karadağ

Eski şehirlerde pestilimi çıkana kadar yürümeyi deniz tatillerine tercih eden biri olduğum için burada fazla kalmadık, sadece 2 gece. Şehirler arası mesafe kısa, bir günde birkaç şehre günü birlik tur yapabilirsiniz. Budva'da kalmak daha ucuz, deniz Budva'da daha güzel, Budva parti kasabası. Buna rağmen niye herkes Kotor'da kalmayı öneriyor çözebilmiş değilim.

Burada euro kullanılıyor, o yüzden fiyatlar normalden birazcık daha pahalı.

Budva: Ufacık bir eski şehiri var. Kumlu taşlı sahiller mevcut. Deniz o kadar tuzlu ki gözüm yaşardı, fazla yüzemedim. (Denize alışık değilim gölde ılıcada yüzerim genelde) Club vardı ama pahalıydı (12€) girmedik. Börek yedik yine. Belgrad'dan beri börek yiyoruz. 
Saki Guesthouse'da kaldık, sahibi Novi Pazarlı bir Müslüman. Helal kahvaltı ve ızgara yemek servisi var tabii ücret karşılında, dışarıdan yemeğe gelenler oluyor. Hostelde yatak 15€, öneririm burayı.

Kotor: Günü birlik gidip geldik, fiyatı hatırlamıyorum ama çok değil. Yalnız öğrenci bileti varmış burada, turist şehri diye yoktur demiştim, öğrenci bileti isteyin. Kotor'da nispeten büyük bir eski şehir var, bence yine aman aman bir yer değil. İki saat gezdikten sonra yüzmek için Budva'ya döndük.

Budva-Ulçin: Budva'da gerizekalı bir otobüs terminali var, otobüs geldi mi gelmedi mi nereye geldi belli değil. Yedi kişi otobüsü kaçırdık. (5 Türk, diğer ikisi Sırp'tı sanırım) "Anons yaptık ya la" dediler ama nası anlayalım. Biletleri aldıktan sonra 3 saat sonra gelen bir otobüse binebildik neyse ki, onda da ayakta gittik. Bilet 5 euro.

Ulçin (Ulcinj): Harikulade bir yer, tek sıkıntısı ufak olması. Kumsalda yer bulamıyoruz. Adamlar bir de sahile camii yapmış, "Arkadaşlar safları sıklaştıralım güneşlenemiyorum." diye bağırasım geldi. Halkı Arnavut buranın. Hostel Breshka diye bir yerde kaldık, orayı da öneririm, sahipleri cana yakın. Börek yedik.

Şimdi buradan sonra rota biraz karışıyor. Üç tane ülke var; Arnavutluk, Kosova, Makedonya. Arnavutluk gezmeye pek değmez dediler. Kosova ufak. Makedonya içinse ikisinden birinden geçmek gerekiyor. Ayrıca Kosova'ya sadece Podgorica ve Ulçin'den geçiliyor, Budva ve Kotor'dan geçiş yok bildiğim kadarıyla.

Rotalar:
Ulcinj - Podgorica - Prizren (en gereksiz rota, Podgorica'da bir şey yok)
Ulcinj - Prizren (bu güzel ama otobüs çok erken saatte, sabah 5'te mi 6'da mı ne) 
Ulcinj - Tiran - Makedonya

Ulçin'den Üsküp'e de vardır belki ama sormadım. En mantıklısı Ulçin'e bir saat uzaklıktaki Arnavutluk'un İşkodra kentine gidelim, oradan da vardır kesin Prizren'e dedim. Yokmuş, daha doğrusu var da aktarmalı ya da dolambaçlı yollar. Bunla uğraşacağımıza Tiran'a gidelim daha iyi dedik.

Ulçin - İşkodra (Shkoder): 6 euro. Geçiş kolay. Hatta damga bile basmamışlar.

Arnavutluk

Arnavutluk'un iki güzel yönü var: 1- Arnavut Bayrağı 2- Arnavut Ciğeri. Arnavut ciğeri diye bir şeyden haberleri yok :P yemeklerini de hiç tadamadık maleef. Börekleri teyzeler leğenden çıkartıp gösteriyor. Bir köfte bir liraydı ondan yedik tıka basa doyduk.

İşkodra (Shkoder): Yolculuğun açık ara en kötü ayağı. Çöpler ve bisikletli teyzelerden başka bir şey yok. "Free walking tour var burada o zaman kesin bir şey vardır." diye rotaya ekledim, walking tour bile 1.5 saat sürdü ahaha. Kaldığımız hostel sadece 5 euroydu, adamın biri açıp hosteli gönüllülere emanet etmiş, onlar da bir şey bilmiyorum. Gece boş odada yattık. Hava 41 derece, yanıyoruz. Bu şehirdeki tek işe yarar aktivitemiz kaleye çıkıp manzara fotoğrafı çekmekti. 

İşkodra - Tiran: 300 lek yani 10 lira. 2 saat sürüyor.

Tiran: Burada da çok bir şey yok ama yine de 1 gece kalınıp gezilecek kadar malzeme var hatta müzelere giderseniz belki 2 gece. Hemen yanında Durres şehri var oraya da günü birlik gidilebilir. Bizi Bilkent'ten bir arkadaş gezdirdi, free walking tour yapsaydık o da eğlenceli olurdu herhalde. Burası Bektaşiliğin merkezi, Bektaşi Kültür Merkezine gidebilirsiniz, cuma gittik Bektaşilerle cuma kılalım diye ama kimse yoktu, camiileri kapalıydı, müzeye girdik ama Arnavuçça. 

Hostel Trip'N'Hostel diye bir yerde kaldık, güzel bir ortamı var, öneririm kesinlikle. Fiyat birçok yerde olduğu gibi 10 €. 

Buradan Prizren'e geçecektik ama hosteller dolmuş. Dedik bari Ohrid'e gidelim. Ohrid'e gitmenin iki yolu var, biri pahalı bir yol, onda da otobüs aslında Strugaya gidiyor, oradan beri gidiyorsunuz. Bir de maceralı ve ucuz yol var, iki kişiyseniz 15-20 lira falan kâr edebilmek mümkün. Biz maceralıyı seçtik.

Tiran-Ohrid: Önce Pogradec diye Makedonya sınırındaki bir kasabaya gidiyorsunuz. Bunun otobüsleri Southeast Terminal'den kalkıyor, oraya otobüs yok, taksi çekeceksiniz, merkezden 300 lek tutar (10 lira). Oradan Pogradec 450 lek yani 15 lira. Oradan Makedonya'ya taksi çekeceksiniz, taksimetre fiyatı 600 lek, adam bize dedi 1000 lek, 500 lek var daha olmaz dedik tamam dedi.
Adam Arnavutluk sınırına bıraktı, sınırdaki polislere verdik pasaportları "Bu sefer damga basın ha" dedik. Sonra güneş batarken Makedonya sınırına yürüdük, "Makedonya'ya Hoşgeldiniz." yazısı üzerinde fotoğraf çekindik. Makedonya kısmına vardığımızda saat 7'yi 5 dakika falan geçmişti ama halbuki otobüs 7'de kalkıyordu. Fakat bekleyen iki tane sırt çantalı eleman vardı (bir tanesiyle daha önce Budvayla karşılaşmıştık.) onlar da otobüsü bekliyormuş, otobüste 40-50 dakika rötarlı geldi. Ücreti 110 dinar 1.8 euro ama euro kabul etmiyorlar ona göre.

Ohrid: Arnavutluk cehenneminden sonra burası iyi geldi, esiyor! Göl harika! Çok temiz! Tekne turu yapın, saat 10'da kalkıyor limandan, 10 €. Podradec'in oraya götürüyor :P Sahilin orada Cuba Libre diye açık hava clubları var (yanlışlıkla şehirin merkezindeki Cuba Libre'ye gitmeyin) fena değil ama çok kalabalık ve millet leş gibi sigara içiyor. Eski şehir küçük ama fena değil. Klasik hamburger dışında Türk yemekleri de mevcut. Türk lirasını çevirebilirsiniz hatta direkt kabul edenler de var. Kabuktan (daha doğrusu sedirden) kolye alabilirsiniz. City Inn / City Hostel diye bir yerde kaldık, öyle süper bir ortam yok ama konfor burada ayrıca sahibi de "Hoşgeldiniz argadaşııım" diye karşılıyor sizi :P 

Bitola'ya (Manastır) günü birlik gidecektik ama otobüse yetişemedik, siz gider ve seversiniz belki.

Ohrid - Üsküp: Kaç para hatırlamıyorum, 500 dinar falandı herhalde. Otobüs terminalinin orada bir bilet satış yeri var ama hemen oraya atlamayın, etrafta Kirille Bilet yazan başka yerler var onlara da sorun. (Biz sorduk çünkü pazar döndüğümüz için otobüsler doluydu.) 

Üsküp: Hostelworldde Hostel Valentin'de rezervasyonumuz vardı ama geldiğimizde "Yer yok, biz rezervasyonu iki gün önce kapattık ama hostelworld'de hala açık, nasıl iş anlayamadık." diyip kovdular. Beş kilometrede ötede başka bir hostele gittik, neyse ki orası boştu. Ertesi gün Real Madrid - Manchester United maçı varmış Üsküp'te, önceki gece kaldığımız hostel dahil tüm hosteller dolu, en ucuz yer 18 € istiyor adam başı. Sıcaktan başım ağrıyordu ve akşam Sofya'ya geçip parkta yatmak istemiyordum, zaten uykusuzdum. Interrail Türkiye'ye yazdık belki biri bir gün misafir dedik ama nerdeeee. Up bile yapmadılar. İkinci kez terminale geldiğinde İstanbul otobüslerini sordum, 30 euroya otobüs varmış. Artık bitirek dedik. Hostel sahibi "Biletler elektronik, siz turistim diyin bilet almayın." dediği için ilk defa bir şehirde bilet almıyordum ki hostelden terminale giderken yakalandık, para sıfırlandığı için bir şey yapamadık, baktık ödeyemiyoruz, bizi otobüsten indirip "Yavaş yavaş gidin bakalım." dediler (Türkçe). Gittik. Vardar ekspresle İstanbul'a bilet aldık. Hostele verdiğim paranın geriye kalanıyla terminalden börek aldık, gittik onları da kaybettik, gezideki en büyük pişmanlığım.

Üsküp'ü anca yarım gün gezebildik, bir tane free walking tour yaptık işte, İskender heykelinin orada başlıyor, öneririm. Yemek de ikram ettiler ki bu ilk oluyor. Matka kanyonuna gidemedik. Trollüğüne Arnavutluk bayrağı tişörtlü ve Makedonya şapkası takarak gezdim, Makedonlar tepki vermedi ama Arnavutlar çok sevdi. 

Özetle bilet ve börek alın her yerde, bunlar önemli.

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi - Son Sözler

Evet arkadaşlar yazı dizisinin sonuna geldik. İlk iç senedeki bilgisayar derslerinin tamamını anlattım, dördüncü senede de iki tane ders var ama öncekilerin devamı hemen hemen. İstek olursa onları ve teknik seçmeli dersleri de anlatırım.

Eğer bu yazıları okumuşsanız mutlaka geri bildirim gönderin, anlamadığınız yerleri sorun.

Yazıların tamamına buradan veya üstteki bilgisayar sekmesine tıklayarak erişebilirsiniz.

Gelecek yazılar gezi yazısı olacak, bir tane de YGS-LYS yazısı. 

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 10 - İşletim Sistemleri



Merhaba arkadaşlar bölüm sonu canavarına geldik. 3. sınıf 2. dönemi cehenneme çeviren bu ders okulun belki de en zor dersidir, bir sürü projesi bulunur ve bu projelerden alınan notlar 100, 30 ve 0'a fikslenmiştir. 

Bu ders mühendisi yazılımcıdan ayıran başlıca derstir diyebiliriz. 

CS 342 - Operating Systems

Üçüncü yazıda "Abstraction" yani "Soyutlama"dan bahsetmiştik. Soyutlama ile beraber bilgisayarın içi hakkında önemli derecede bilgi sahibi olup işe yaramayan kısımları ise kara kutu olarak düşünüp sadece işlevini bilip geçiyorduk. 

Aynı şekilde işletim sistemleri de bilgisayardaki düşük seviye yazılımları kullanıcıdan hatta programcıdan soyutlamaya yarıyor. Diyelim bir oyun yazacağız. Oyunu açınca bilgisayarın RAM'inde oyun için yer açılır, oyunun dosyaları harddiskten RAM'e aktarılır, bilgisayar ekranında yeni bir pencere açılıp oyunun ana menüsü buraya yüklenir, oyun kapanınca da oyunun bilgileri RAM'den silinir. Sizce bunları yazılımcılar tek tek yazıyor mudur? Hayır. Bu ve bu tip düşük seviye işleri işletim sistemi kendi yapar, sizden de bunu saklar. Yazılımcı tutup da bilgisayarın tüm RAM'ini kendi oyunuyla dolduramaz yani. Bir açık bulup bunu yaparsa ona HEÇKIR denir. Tabii bu windows için geçerli. Windows işletim sisteminin kodunu görüp değiştirmenize izin vermez. O yüzden bu dersin projelerini Linux isimli (daha doğrusu tabanlı) açık kaynak kodlu işletim sisteminde yaparsınız. İyi heçkırlıklar.


Bilgisayarda soyutlama katmanları bunun gibi bir şeydir. Hardware dediğimiz klavye mouse ekran bilmemneye erişimi olan "Device drivers" (laptopa format attığınızda cd'sini bulup kurduğunuz şey) ve saz arkadaşları bizden "Kernel" denilen "OS layer" yani "OS katmanı" ile soyutlanmıştır. Bu derste de bu OS katmanını programlarız.

OS nasıl çalışır?

Bilgisayar açıldığında RAM tamamen boştur, harddiskin ilk birkaç segmesindeki program çalışır, buna "bootloader" denir, bu bootloader işletim sisteminin bir bölümünü RAM'e yükler ve işi ona devreder. 

Yani bilgisayar açılınca bootloader'daki değişmez kod çalışır, o da artık harddiskte hangi işletim sisteminin kodu varsa alır onu yükler. Sonra işletim sisteminin kodu çalışır print("Selam ben linux") ekranaHoşgeldinizYazısıBastır(); gibi.

Sonra işletim sistemi bilgisayarın devamlı çalışmasına yarayan kodları yükleyip çalıştırmaya başlar. Bir yandan bu kodlar çalışır, bir yandan siz çalışırsınız. Nasıl oluyor bu?

Arka planda tek bir programın / görevin çalışmadığını zaten biliyorsunuz, bilmiyorduysanız ctrl + alt + delete 'e basıp kendiniz görebilirsiniz. Dördüncü yazıda gördünüz ki bir CPU aynı anda sadece bir programı okuyup işlem yapabilir. Peki nasıl oluyor da aynı anda bu kadar program çalışabiliyor arkada?

Öncelikle günümüzde artık bilgisayar birkaç çekirdekli. Dört çekirdekli bilgisayar demek tek CPU'da / işlemcide program çalıştırabilecek dört tane birim var demek. Dördüncü yazıda gördüğünüz o FETCH DECODE bilmemne aynı anda dört yerde oluyor yani. Böylece dört program gerçekten aynı anda çalışabiliyor.

Fakat bu bir sürü programın aynı anda çalışması için yeterli değil. Bir sürü programı aynı anda çalıştırmak için işletim sistemi context switch denilen içerik değiştirme metodunu kullanıyor. Yani bir programı durduruyor, başkasını çalıştırmaya başlıyor, bunu yaparken de CPU'nun FETCH edeceği kod değişmiş oluyor. 

Şimdi atıyorum elimizde şu programlar var:

Windows 10 
Microsoft Word (bunun yerine ben Kingsoft WPS kullanıyorum öneririm)
Dropbox / Google Drive / Herhangi bir bulut programı
Google Chrome
Antivirus

Önce google chrome kısayoluna basıyorsunuz biraz internette takılacaksınız, kısayola bastığınız anda context switching oluyor ve antivirusünüzün kodu çalışmaya başlıyor, if (thisIsNotVirus()) { boşver(); } şeklinde tıkladığınız şeyin virüs olup olmadığını kontrol eden bir kod çalışıyor. Eğer virüs falan yoksa antivirüs CPU'yu geri salıyor başkası ne yaparsa yapsın diye. Bu arada Dropbox bir tur da bana ver deyip araya giriyor ve kendi if(yeniDosyaYüklüMü()) kodunu çalıştırıyor, yüklenmemişse CPU'yu geri salıyor. Chrome yeni pencere açıyor. Bir internet sitesine giriyorsunuz. İnternet sitesi siteden yanıt beklerken Windows 10 araya giriyor ve pis işlerle uğraşıyor. Ardından canınız sıkıldı diyelim Microsoft Word'e tıklıyorsunuz. Windows 10 "Aha bu bir şeylere bastı" diyerek tüm diğer işleri durdurup en hızlı bir biçimde Microsoft Word'u açmaya çalışıyor ki kullanıcı "Bilgisayarım hızlı" izlenimine kapılsın. Word'de bir şeyler yazmaya başlıyorsunuz, yazdıkça windows 10 durup her şeyi bırakıp ekrana harfleri basıyor. Sonra kaydediyorsunuz. Fakat hafıza yavaş çalışan bir şey, dördüncü yazıda anlatmıştım. Siz kaydolmasını beklerken (gerçi fazla beklemiyorsunuz da) windows 10, dropbox, antivirus hepsi bir olup "Hafızadan cevap gelene kadar ben işlerimi yapayım" diyor ve sıra sıra bir sürü işlem yapıyorlar. Context switching mantığı bu.

Bilgisayarınız donduğunda ve yavaşladığında muhtemelen bilgisayarınızda CPU'nuzun halledemeyeceği ve RAM'inizin hafızada tutamayacağı kadar işlem açıktır ve işletim sisteminiz telaşla bunları bitirmeye uğraşmaktadır o sırada sizin işlemlerinize düşük öncelik verir, siz de bilgisayarım bozuldu sanırsınız.

*

Buraya kadar anlattığım kısımda programlar hep "benim işim uzayacak sen geç istersen" mantığıyla çalıştı. Ya peki Eminönü'ndeki baklava izdihamında olduğu gibi programlar en önden hiç ayrılmazlarsa? Ya siz bilgisayarın başında sürekli bir şeylere basıp bilgisayarı trollerseniz ve bilgisayar kendi işlerini yapamazsa?

Bunun için scheduling isimli işlemci zamanlama metotları geliştirilmiş. Bilgisayar bazen en acil işi, bazen en epeydir yapılmayan ve hakkı yenen işi, bazen birbirine bağlı işleri, bazen ise rastgele herhangi bir işi işlemciye alır (eskisini ise geçici olarak durdurur) ve onu çalıştırmaya başlar. Scheduling'in çeşitli teknikleri var ama fazlasını anlatmayacağım, merak edenler okusun.

*

Yukarıda birbirine bağlı işlerden bahsettim (çıtlattım). Bazı programlar aynı dosyaları okuyup yazar, dolayısıyla bunların zamanlaması sıkıntılıdır. Örneğin A programı ve B programı var, bunların ikisi aynı dosyaya yazı yazıyor. İkisi aynı anda aynı dosyaya yazı yazamıyor, birinin yazarken öbürünün oturması gerek. Bilgisayarın zamanlama kuralı şu: A programı HAZIR olduğu anda araya girip çalışmaya başlasın yani A'nın önceliği maksimum.

Bu durumda ne oluyor? B programı dosyaya yazarken A programı hazır oluyor ve devreye giriyor. A programı bakıyor dosya yazmaya müsait mi, "Haa B yazıyormuş." diyor. Fakat o an A programı hala hazır olduğundan ve kural "A programı hazırsa çalışsın" olduğundan A bir daha bakıyor dosya müsait mi, değil diyor. A bu kontrolü sonsuza kadar yapıyor, B'ye işi bırakmıyor ki adam bitirsin. Buna deadlock deniyor, yani sırası gelen program bağlı olduğu program işini bitirmediği için çalışmak istiyor çalışamıyor fakat sırasını da salmıyor. 

Tabii bunun çeşitli çözümü var, A'yı dosya yazamayınca uyutmak gibi. Tabii bu da sıkıntılar doğuruyor. Ders sıkıntılar silsilesiyle ilerliyor.

Bununla ilgili popüler ve eğlenceli bir örnek olan Dining Philosophers Problem yani "Makarna Yiyen Düşünürler Problemi"ni sizinle paylaşayım.



N tane filozofumuz var (N > 2) ve bunlar bir masada salçalı makarna yiyor (üniversite öğrencisi galiba bunlar) ama bunu sadece iki çatalları olduğu zaman yapabiliyorlar. Yemekten başka bir de düşünüyorlar. Yeterince düşündükten sonra acıkıp yiyorlar, yeterince yedikten sonra da çatalları bırakıp düşünüyorlar.

Fark ettiğiniz üzere hepsi aynı anda yiyemez, yan yana olan iki düşünür de aynı zamanda yiyemez. 

Hatalı çözüm:

Herhangi bir düşünür kodu: (her düşünürde bu kod var ve zamanlayıcı bunları sıra sıra çalıştırıyor)

while (true) {
    düşün();
    solÇatalıAl();
    sağÇatalıAl();
    ye();
    solÇatalıBırak();
    sağÇatalıBırak();
    geğir(); // tamam kötüydü
}

böyle oldu diyelim, birinci düşünür solÇatalıAl();'ı çalıştırdı o anda zamanlamayıcı çalıştı ikinci filozofa geçti, o da sol çatalı aldı. Hepsi sırayla sol çatalı aldı ve zamanlayıcı birinci filozofa geri döndü. 

Bu durumda herhangi bir sağÇatalıAl(); kodu çalışabilir mi? Tüm filozoflar solundaki çatalı aldıysa hayır çalışamaz çünkü N filozof için masada N tane çatal var.

Hiçbir sağÇatalıAl(); kodu çalışamayacağı için deadlock olur ve bilgisayar mavi ekran verir. (Not: Bu kodun herhangi bir yerinde "sağ çatalı alamıyorsan solu da bırak başkası yesin" diye bir şey yok dikkatinizi çekerim. Dolayısıyla kod sağÇatalıAl();'dan başka bir yere atlayamıyor kafasına göre.)

Bu problemi 1965'te Dijkstra isimli önemli bir bilgisayar bilimcisi hoca üniversitede sınava hazırlık egzersizi olarak vermiş. Sonra problem almış yürümüş oradan. Dijkstra'nın bulduğu çözümü burada anlatacağım ama size derste daha güzel ve verimli, fakat burada anlatması zor bir çözüm anlatacaklar :)

Dijkstra çatallara numara verelim demiş.


Kural şu "Her filozof önce en küçük numaralı çatalı alsın. Alamıyorsa yemekten vazgeçsin."

Bu durumda biri hariç herkes solundaki çatalı alacak, 1 ile 5 arasında kalan filozof ise hiçbir çatalı alamayacak. Böylece 4 ile 5 arasında kalan filozof iki çatalı da alıp yemeğini yiyebilecek ve çatalları bırakacak. Sonra öbürü, sonra öbürü. En sonunda herkes yemek yiyebilmiş olacak. 

Vikipediye göre bu çözüm çok fazla çatal alıp bırakma içerdiği için karmaşık sistemlerde verimsiz. (Bu kısmı ben de tam anlamadım, vikipediye yazan adam kısa geçmiş, verdiği kaynak da para istiyor.) Bu probleme daha güzel çözümler var elbet, fakat üşendiğim ve yazıyı da gereksiz yere uzatmak istemediğim için anlatmayacağım. Merak edenler için anahtar kelimeler philosophers dining problem ve semaphore

*

Dersin geri kalanında da Hafıza yapısı anlatılır. Atıyorum yeni bilgisayar aldınız ve içini beş megabytelık flaş oyunlarla doldurdunuz. Sonra büyüdüm ben diyip hepsini sildiniz. Bilgisayarınızın orasında burasında 5 megabytelık boşluklar kaldı. Boşluklar ardışık olmadığı için 50 gigabytelık GTA V'yi yükleyemiyorsunuz? Ne yapacaksınız? Neyse ki yıllar önce mühendisler bunu düşünüp önlem aldılar. 

*

Aşırı karışık ve zor konular olduğu için elimden geldiğince basit ve kısa anlamaya çalıştım. Lütfen 
anlamadığınız yer olursa bana mesaj atın. 

Yazı dizisinin de böylece sonuna gelmiş olduk.

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 9 - Veritabanı Sistemleri



3. sınıf birinci dönemdeki iki bilgisayar dersini de anlattım, şimdi geldim en okkalı döneme. Bu okkalı dönemde üç tane kazık gibi ders var: İşletim Sistemleri, Veritabanı Sistemleri ve Sinyal ve Sistemlerin temelleri. Sinyal ve sistemler elektronikçi konusu ve oldukça teorik olduğundan geçeceğiz. İşletim Sistemleri okulun en kazık dersidir. Ama ondan önce, ne işletim sistemleriyle ne de önceki derslerin hiçbiriyle bir alakası olmayan melankolik veritabanlarından biraz bahsedelim.

3. Sınıf 2. Dönem

CS 353 - Database Systems

Daha önce Ahmet'in arabası verisini tutmak için önce Ahmet'i sonra bir GidenAraba nesnesi olan ahmetinArabasını yaratmıştık. GidenAraba nesnesi de arabanın hızını falan içinde tutuyordu. 

Ya binlerce Ahmet, milyonlarca Giden Araba üzerinde işlem yapmamız gerekirse?

Bir gidenAraba arrayi açıp buna on milyon araba koymayı deneyebiliriz pekala, ardından da mavi ekranı yeriz. Çünkü RAM diye bir şey var ve sonsuz değil.

Ayrıca her şeyi koda yazarak oldukça kirli bir kod elde ederiz.

Ayrıca istediğimiz veriyi hızlıca çekip alamayız.

Ayrıca veriler arasında bağlantı varsa bir sürü işlem yapmamız gerekir, örneğin Ahmet arabasını değiştirince hem Ahmet nesnesini, hem GidenAraba nesnesini hatta GidenArabayıKullananSürücününGözRengi nesnesini elle değiştirmemiz gerekir.

Uzayıp giden bir nedenler listesinden dolayı Veritabanı kavramı ortaya çıkmış. Veritabanında tablolar bulunur ve bu tablolarda aynı kategorideki veriler tutulur. Şunun gibi bir şey:


Örneğin hepimizin kimlik bilgileri "Vatandaş" tablosunda tutulur. Tablolar başka tablolara veya kendilerine bağlı olabilir. Örneğin benim doğduğum şehir "Şehir" tablosunda kayıtlıyken annem ise yine "Vatandaş" tablosunda bulunur (ayrı bir "Anneler" tablosu yoktur yani)

Peki nasıl kuruluyor bu veritabanı, nasıl programlanıyor? Muhtemelen daha önce duyduğunuz SQL yardımıyla. 

SQL aslında bir programlama dilinden çok bir protokoldür, görgü kurallarıdır, adres yazarken mahalleden başlamaktır, yemeğe çorbayla başlayıp tatlıyla bitirmektir, mektupları iyi dileklerle bitirmektir. Veritabanı olayı ortaya çıkınca müyendizler "Ya şimdi ortaya bir sürü zottirik veritabanı dili çıkaracaklar. Olm bu veritabanları sonuçta hep aynı şeyleri yapmıyor mu? Bir standarda bağlayalım şunu." diye aralarında konuşmuş, ortaya SQL çıkmış. 

SQL'ü bilen herhangi bir veritabanı teknolojisini kullanabilir. MySQL, PostgreSQL vs. Gerçi bu standart yavaş yavaş yıkılmaya başladı, millet beğenmiyor SQL'i :)

SQL'de bir veritabanı şöyle yaratılır:

create table Vatandaş (
           ID  char(11),
           isim varchar(20),
           şehir varchar(20),
           yaş integer 
           primary key (ID));

create table tablo yarat demek. char(11) demek 11 tane karakterden oluşan string, 11'in hepsi kullanılmak zorunda. varchar(20) ise maksimum 20 tane karakterden oluşan string. integer artık biliyorsunuzdur umarım.

Burada ID Tc kimlik no ve kişiyle birebir eşleşir, yani bir tc kimlik nosunu birden fazla vatandaş kullanamaz, aynı şekilde de her tabloda da bu şekilde birebir eşleşen, genelde ismi "ID" koyulan anahtarlar bulunur ve buna primary key denir.

Şimdi böyle 80 milyon tane vatandaş olduğunu düşünürsek bu kadar bilgiyi tutmak için sünnet merasimine başlamamız gerekir. Bir char 1 byte'tır (içinde Türkçe karakterler varsa 2 byte), bu durumda "İstanbul" kelimesi 8 byte. Halbuki bir integer 4 byte'tır. Dolayısıyla her seferinde İstanbul yazıp boşuna 4 byte harcamamak için ayrı bir "Şehir" tablosu açarız.

create table Şehir (
           ID  char(2),
           isim varchar(20)
           primary key (ID));

Türkiye'de 81 il olduğuna göre ID'yi iki karakterle gösterebiliriz. 1...81 diye. Bu tabloda 81 tane il isimleriyle beraber yazarız. Vatandaş tablosunda ise şehir'in ismi yerine Şehir tablosundaki şehrin ID'sini gireriz. Vatandaş tablosunda bulunan Şehir ID'sine foreign key denir. 

create table Vatandaş (
           ID  char(11),
           isim varchar(20),
           şehir varchar(20),
           yaş integer
           primary key (ID)
           foreign key (şehir) references Şehir(ID));

İşe foreign key karışınca işler bulamaç olur çünkü artık tablolar birbirini bağlamaya başladı. Bir tabloya bir şey olunca öbürü de etkileniyor. Ya da ne bileyim, tablodaki şehirlere "Nüfus" sütunu eklesek artık "Nüfusu milyonun üstünde yaşayan vatandaşlar" gibi aramalar yapabiliriz. Dersin ilk kısmı genelde bu tip aramalarla geçiyor.

Gelişmiş aramalarla sizi sıkmayacağım, ama basit bir arama örneği vereyim.

Aramalar her zaman select from where sırasıyla yapılır.

select isim
from Vatandaş
where yaş = 15;

Örneğin bu Vatandaş tablosunda yaşı 15 olarak gözüken kişilerin isimlerini çeker.

select *
from Şehir

Bu da şehir tablosundaki bütün şehirleri tüm sütunlarıyla listeler, tablonun kendisini döner yani.

İşe şehri de karıştırmak için iki tabloyu birleştirmek gibi saçma sapan bir şey yaparız, ilk öğrenince mantığa yatmaz, sonra alışırsınız. Yani şöyle:

select *
from Vatandaş join Şehir on Vatandaş.şehir = Şehir.ID
where Vatandaş.yaş > 18
group by şehir
order by yaş

Bu kod önce "Vatandaş join Şehir" diyerek iki tabloyu birleştirdi birbirine yapıştırdı, ama gerçekten yapıştırdı. Örneğin normalde Vatandaş tablosunda sadece bir Ahmet Mehmetoğlu varken ve onun da şehirinde 1 yazıyorken yani adam Adanalıyken bir anda 81 tane Ahmet Mehmetoğlu türedi, hepsinin şehirinde 1 yazıyor ama Şehir.ID'leri 1'den 81'e, Şehir.isim'leri Adanadan Düzceye gidiyor. Yani elimizde hem vatandaşın hem şehrin sütunlarının olabilecek tüm kombinasyonlarını barındıran karma bir tablo oldu. 

Vatandaş.şehir = Şehir.ID kontrolünü yaparak tutarsız satırları eledik. Yani elimizde sadece Adanalı Ahmet Mehmetoğlu kaldı tekrar. 

(Eğer bu karma tablo olayını anlamadıysanız ders kitabından şu resmi göstereyim, Ahmet Mehmetli tablo çizmeye üşendim:

Burada gördüğünüz gibi r tablosuyla s tablosunun her elemanının eşleştiği bir tablo çıktı ortaya. Aynı olan isimler de r.B s.B diye yeniden adlandırıldı.)

Ondan sonra Vatandaş.yaş'ı kullanarak 18 yaşından büyük vatandaşları alıyoruz, gerisini atıyoruz.

group by diyerek şehirlere göre sıralıyoruz, Adanalı Ahmet Mehmetoğlu en üstte.

order by diyince de yaşa doğru sıralıyoruz. En yaşlı Adanalı kim ise en üstte oluyor.

Bunun gibi bir sürü karışık arama ve arama tekniği var ama ben burada kesiyorum.

Dersin yarısında bu tip şeylerle uğraşıyoruz.

Ondan sonraki yarısında birkaç ıvır zıvır konuyla beraber verilerin en verimli nasıl tutulacağı ve aramaların en verimli nasıl yapılacağı var. "Google bunlardan soruyormuş" dediğim yazıda ağaçları görmüştük mesela. Database için de özel ağaçlar var. Bu ağaçlarda arama yapmanın hız analizini falan öğreniyoruz. Aşırı üst düzey konular, kendim de zar zor anlamıştım zaten. 

Size veritabanıyla ilgili bir anımı anlatayım. Birinci sınıf ikinci dönemimde ilk yazılım projemizi yapıyorduk grupçak. Ben üst sınıflarla konuşuyordum bol bol. "İyi not almak için kendi başınıza bir şeyler öğrenmeniz gerek. Android öğrenebilirsiniz ama zordur. En kolay ve zevklisi database'dir." demişlerdi. Quiz oyunu yapıyorduk ve database iyi fikirdi. Fakat database'i bırak oyunun kendisini zor yetiştireceğimizi fark edince uğraşmadım. Fakat bütün soru ve cevapları koda yazınca hatamızı anladım. Hocalar da dedi zaten bunları bari bir not defterine yazaydınız diye. Database kullanmayan bir çok kişiye düşük not verdiler. Bunu okuyan genç dimağlar varsa en azından not için projelerine database katmalarına öneririm ;)

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 8 - Nesne Tabanlı Yazılım Mühendisliği

3. sınıf 1. Dönem

CS 319 - Object Oriented Software Engineering

Birinci yazıda classlardan nesnelerden falan bahsetmiş. GidenAraba classı vardı mesela. İstersek GelenAraba classı da açabiliriz, BeşDakkayaKalkacak classı da, ArkalaraDoğruİlerleyelim classı da.

İstersek Sayı classı açıp içine sayı tek bir integer koyup classı da bundan ibaret yapabiliriz, böyle int sayı = 5; yerine Sayı sayı = 5; yazabiliriz. Bir sınırı yok. Fakat sınırı yok diye kafamıza göre takılırsak ortaya program yerine lahana turşusu çıkabilir.

Bu ders nesne yönelimli programlama yaparken kodun organizasyonunu nasıl yapacağımızı anlatmaya çalışır.

Tabii bu organizasyon daha fazla kod yazılarak yapılmaz. O yüzden bol bol word belgesi açıp rapor yazmanız gerek.

Raporda çizeceğiniz grafiklerin üstünden Bomberman oyununu kullanarak kısaca geçeyim:

Senaryolar: Oyuncu sağa sola bomba koyabilir, koyarsa şu olur (etrafta kırılacak duvar varsa onlar kırılır, canavar varsa canavar ölür, oyuncu varsa oyuncu ölür), oyuncu sağa sola koşturabilir.

Use Case Diagram: Oyuncunun yapabileceklerinin genel görüntüsü. Şöyle bir şey:

Sequence Diagram: 

Herhangi bir senaryodaki nesne ve fonksiyonlar dizisini gösterir. Örneğin oyuncu bomba atacak, oyuncu tuşa basar, bombaAt(); fonksiyonu çalışır falan.




State Diagram:

Üçüncü yazıda sonlu durum makinelerini anlatmıştım, ha işte bu grafikte de oyunun durumları gösterilir. Karakter yürüyor, karakter duruyor, canavar yürüyor vs.



Bunun gibi bir sürü ıvır zıvırı çizmekle geçiyor ders ama bu derste öğreneceğimiz burada da bahsedeceğim çok önemli bir şey var: Dizayn Kalıpları.

Günümüzde koridorsuz odaların birbirine yapışık olduğu, evin ortasına inşa edilip pencere konulmamış odalı yampirik yumpirik evler yok, bütün evler standart ve bir kalıba oturulmuş, 2+1, 3+1 diyince tüm dünya anlıyor. Tabii bu evleri yapanlar ev teorisini çocukluğundan beri çalışıp özümseyerek yapmıyorlar, bir kalıp var hepsi oradan kopya çekiyor.

Aynı şey (hayatının bütün alanlarında olduğu gibi) kodlamada da geçerli. Otuz hatta kırk yıl önce geliştiren tasarım kalıpları halen öğretilmekte ve kullanılmakta. Bunun en ünlülerinden birinden bahsedeyim biraz: Model - View - Controller.



Bu kalıbın mantığı şu: Model diyeceğimiz somut şeyleri ayrı tut, örneğin bomberman'de bomberman karakterini ayrı tut, bunun haritadaki yerini, hızını, cebinde kalan bomba sayısı vs. çeşitli verisini ayrı tut. Bunun için bir BombermanModel classı aç.

Viewda Bu bomberman yürürken ayrı gözüküyor, bomba atarken ayrı gözüküyor, ölürken ayrı. Bu tip kullanıcının ekranda göreceği kısmı ayrı tut, bunun için bir BombermanView classı açıyoruz. Birden fazla View classımız olabilir, örneğin Bomberman oyununda ekrana bir mini harita yapıştırmak isteyebiliriz. Bomberman'in yeri değişince hem haritadaki Bomberman (BombermanView ile gösterilen) hem de mini haritadaki Bomberman (BombermanMiniView diyelim buna hadi) yer değiştirir. Fakat bombermanin haritadaki yeri BombermanModel'de kayıtlı. O yüzden bütün Viewları BombermanModel'e abone yapıyoruz.

Bir de oyuncu tuşlara basınca oluşacak olaylar için bir class açıyoruz, ismi BombermanController olacak. Bu class'ta fonksiyonlar olacak ve oyuncu bir tuşa basınca bu fonksiyonlar çağrılıp BombermanModel değişecek, örneğin BombermanController "yürü();" fonksiyonunu kullanacak, BombermanModel'in içindeki koordinatlar değişecek.

BombermanModel değişince kendisine abone olan Viewlara "Ben değiştim arkadaşlar, yeni sayımı bayiilerden isteyin." diye e-mail gönderir. Viewlar Bomberman'den yeni veriyi alır, örneğin haritada değiştiyse tüm Viewlar içindeki Bomberman'in yerini değiştirip ekrana basar.

Mantık özetle bu. Üniversitede yazdığım tüm yazılımları (gerçi fazla bir şey yazmadım) bu kalıpla yazdım ve bir çok kişi böyle yazdı. Öyle ki derste anlatılan diğer kalıplar pek umrumuzda olmadı. Fakat tabii iş hayatına gelince işler değişecek. Küçük şirketlerde ne olur bilemem de büyük şirketlerin büyük projelerinde muhtemelen başta bir Baş Mühendis olacak ve bu kişinin bir çok danışmanı olacak, nasıl bir dizayn yapılacağına beraber karar verip yazılımcılara uygulatacaklar.

Biz de okulu o karar veren Baş Mühendis olup paraları cukkalamak için okuyoruz :)

Genel ve önemli bilgileri yeterince verdiğim için yazıyı burada noktalıyorum. Anlaşılmayan bir şey varsa mutlaka sorun.

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 7 - Programlama Dilleri



Öncelikle tebrikler, üçüncü sınıfa geldiniz! Gerçek bilgisayar mühendisliğiyle, zevkli ve zorlayıcı derslerle bu yıl karşılaşacaksınız.

3. Sınıf 1. Dönem 

CS 315 - Programming Languages

Üniversiteye yeni başladığımda oryantasyonda bölüm başkanı bir konuşma yapmıştı. "Biz size programlama dili öğretmeyeceğiz. Biz size öğrenmeyi öğreteceğiz. " Yıllar sonra herhangi bir programlama dilinde ödev verdiklerinde ödevi yaparken dili de öğrenecek hale gelecekmişiz. 

Adam haklı.

Programlama dili diyince akla İngilizce, Çince gibi dil öğrenmek geldiği için bana gelen sık sorulardan biri "Kaç programlama dili öğretiyorlar? Hangileri?". Bu soru edebiyat okuyana "Kaç dil öğretiyorlar? Hangileri?" demekle aynı şey. Neden olduğunu bu derste anlıyoruz.

Aslında programlama dillerinin bir çoğunun işlevi aynıdır, aynı şeyi yaparlar. Fakat aynı şeyi yaparken karşılaşılan sorunları farklı bir şekilde çözerler. Bu derste de programlama dillerinin bu çözümleri nasıl uygulayabileceği örneklerle anlatılır. Yani programlama dilleri değil onların kökü, onların yapılışındaki kalıplar anlatılır ki yeni bir programlama dili çıktığında "Bu bunu nasıl yapmış?" şeklinde sorular sorarak programlama dilini çabucak kapasınız.

Örneğin bu java koduyla merhaba yazmak:

System.out.println ("Merhaba");

python:

print ("Sa")

Java kodundaki System bir class. (Classları birinci yazıda anlatmıştım.) Bunun içinde out diye bir parametre var, bu da aynı zamanda nesne (GidenAraba classında arabanınHızı vardı ya bunun Hız classının nesnesi olduğunu düşünün). Bunun bir de fonksiyonu var println diye. Anca onu çağırınca ekrana bir şeyler basabiliyoruz. Ölme eşşeğim ölme. Python çözmüş işi print() diye.

Java'da satırın bittiğini ; ile gösterirsiniz. Bu sayede aslında tek satıra bir sürü satır yazabilirsiniz. System.out.println("Merhaba");System.out.println("Naber");System.out.println("Anan nasıl");System.out.println("Baban nasıl"); diye. Python'da ; 'e gerek yoktur, Python satırın nerede bittiğini kendi anlar. Fakat eğer yukarıdaki gibi her şeyi bitişik yazarsanız anlayamaz. Dolayısıyla her şeyi bitişik yazamazsınız.

Aynı zamanda java'da kodun nerede başlayıp bittiğini { } ile gösterirsiniz.

Örnek:

if ( a > b )
{
    System.out.println("a b'den büyük");
}

System.out.println("bitti");

Burada { } ile if'in kapsamını yani kodun hangi kısmını koşula bağladığını gösteririz.

Yani bu durumda "a b'den büyük" cümlesi sadece a b'den büyük olduğunda ekrana yazdırılır fakat "bitti" her halükarda yazılır.

Python'da ise bunu yapmak için şunu yazmalısınız:

if ( a > b):
    print("a b 'den büyük")

print("bitti")

Bir fark yok gibi gözüküyor değil mi? Olay şu: her hangi bir programlama dilinde yazarken if'in neyi kapsadığını belirtmekle beraber kod okunaklı olsun diye taba basar veya dört tane boşluk bırakırık. Halbuki java boşlukları zaten sallamaz. Yani şu kod da pekala çalışır javada:

if ( a > b )
{
System.out.println("a b'den büyük");
}
System.out.println("bitti");

Ama bu kod pythonda çalışmaz:

if ( a > b):
print("a b 'den büyük")
print("bitti")

Çünkü python bu dört boşluk olayını kendine entegre etmiştir ve programcıları bunu kullanmaya zorlamaktadır, aynı zamanda kendi de if'in kapsamını anlamakta kullanmaktadır.

Bu dersin içeriğini uzun uzun anlatmak isterdim ama anlatması da anlaması da zor olacak. Kısaca özet geçiyorum o yüzden konuları. Ama iddia ediyorum bilgisayar mühendisliği okursanız en sevdiğiniz ders olacak.

Regular expressionlar

Harfler üzerinde işlem yapacağız diyelim. İşlemimize vereceğimiz bilinmeyen birden fazla a'dan veya a ile b'nin yan yana gelmesinden oluşmak zorunda. Yani a kabul, aa kabul, aaaaaaaaaa kabul, ab kabul. bbbbbbbb kabul değil. e^x kabul değil. Boş da kabul değil.

Tabii bunu olabilecek her a b kombinasyonu için if koyarak kontrol edemeyiz. 
if ( bilinmeyen == "a")
else if (bilinmeyen == "aa") 
olmaz yani.

Bunu aa*|ab olarak gösteririz ve verilen bilinmeyenin bu kalıba uyup uymadığına bakarız. Burada * "sonlu sayıda tekrar" demek yani yanyana sıfır veya sıfırdan fazla a. Başına bir tane a attık çünkü bilinmeyenin boş olmasını da istemiyoruz. | veya demek. Yani ya soldakini seçeceğiz ya sağdakini. ab'yi bitişik yazınca a'nın yanında b her zaman bonus geliyor.

Yani aa*|ab

a
aa
aaa
aaaaaaaaaaaaaaaaaa
ab

olabilir.

aa*|ab'ye regular expression denir.

Context free grammar 
Bu gramerler sayesinde kodun ne anlatmak istediği anlaşılır.

Bir gramer örneği:

ifade -> ifade toplama_işlemi terim | terim
terim -> terim çarpma_işlemi faktör | faktör
faktör -> '-' faktör | '(' ifade ')' | İSİM | SAYI

toplama_işlemi -> '+' | '-'
çarpma_işlemi -> '*' | '/'

Burada olay şu, ifade (bir satır koda yani sonu ; ile biten koda ifade deniyor) -> 'nın sağındaki şeye dönüşüyor, yani ya "ifade toplama_işlemi terim"e ya da sadece terime. terim ->'dan sonrasına, faktör de en sonunda İSİM veya SAYIya dönüşüyor. Bu kalıbı kullanarak bilgisayar kodu okuyor. 

Örneğin

elmasayısı + 5 * 3

Bu bir ifade. Sağdan başlayarak bunu en basit hale indirgiyoruz yani İSİM SAYI + - * /'ya indirgemeye çalışıyoruz.

ifade -> ifade toplama_işlemi terim oldu.

en sağdaki terim 'terim çarpma_işlemi faktör'e indirgendi. Faktörden de SAYI yani 3'e indirgendi.

ifade toplama_işlemi terim çarpma_işlemi 3 var elimizde.

çarpma_işlemi oluyor * (ifade toplama_işlemi terim * 3)

terim oluyor faktör, faktör oluyor 5.

toplama_işlemi oluyor +

son olarak ifade oluyor terim terim oluyor faktör faktör oluyor İSİM yani elmaSayısı

elmasayısı + 5 * 3 ifadesini elde ediyoruz.

Kısacası bilgisayar bu şekilde okuyor kodu. Kod İngilizce'den 010110111'lere bu şekilde çevriliyor.

Not: Niye ifade direkt 5 olmuyor da önce terim sonra faktör sonra 5 oluyor? Bunun nedeni işlem önceliği. Çarpma işlemiyle sadeleşen ifadeyi tanımlamak için faktör demeseydik hepsine aynı ismi verseydik bilgisayar aynı şeyi rastgele olarak farklı yorumlayabilirdi. Grameri bu şekilde oluşturunca muğlaklık gitmiş oldu. Detayları merak edenler için anahtar kelime: unambiguous grammar

Dersin ilk kısmı bu gramerleri yazabilmek veya koda çevirebilmekle geçer.

*

Ardından değişken isimleri ve yukarıda bahsettiğim kapsamlardan bahsedilir. Örneğin elmaSayısı diye bir değişken tanımladım ama bu elmaSayısı ismi nelerde geçerli. Örnek:

if ( bir şeyler) {
    int elmaSayısı = 10;
}

Örneğin bu java kodunda elmaSayısı sadece {} arasında tanımlıdır ve bunun dışında burada tanımladığınız elmaSayısını kullanamazsınız, ama {} dışında bir elmaSayısı varsa o kullanılır, tabii içindeki değer 10 olmayabilir bu durumda. Sıkıcı ve çok teknik olduğu için bu konuyu burada bırakıyorum.

Ardından ilk yazılarda bahsettiğim tiplerden ve bunların dilden dile nasıl değiştiğinden bahsedilir. örneğin java'da elmaSayısını "int elmaSayısı =10;" diye tanımlamanız gerekir ve ardından "elmaSayısı = "naberlen";" diyemezsiniz. Python'da ise elmaSayısı = 10 diye tanımlayıp ardından üzerine istediğinizi yazabilirsiniz. Tabii arkada çalışan işlemler farklıdır. Python eski elmaSayısını silip yerine string tutan bir elmaSayısı değişkeni tanımlar mesela ama çaktırmaz. Java'da bunları elle yapmanız gerekir.

Ardından fonksiyonların nasıl çalıştığından bahsedilir. Fonksiyonlar iç içe geçebilir (ikinci yazıda recursion kısmını hatırlayın) ve bu olay yüzünden farklı dillerde farklı davranabilirler çünkü. Geçtik. Son olarak exceptionlar anlatılır ama o kısmı boşverin.

Sıradaki yazıda görüşmek üzere.

Kapsamlı Bilgisayar Mühendisliği Eğitimi Rehberi 6 - Matematik ve Uygulamaları


Güncelleme: Lise müfredatından matris ve determinantlar kalktı diyenler oldu. Yazıda determinant yok. Matrisi kısaca açıklayayım, içine sayılar koyduğumuz kutulara matris denir. 3x4 boyutta bir matriste 3 satır 4 sütun bulunur. Birden fazla denklem çözerken bilinmeyenlerin katsayılırını kutulara yazarak çözebilir. İki matris çarpılıyorsa soldaki matrisin sütun sayısıyla sağdakinin satır sayısı eşit olmalı. Yani 2x4 matris ile 4x5 matris çarpılabilir. Oluşan matrisin boyutu 2x5 olur. Bu yazdıklarıma rağmen hala matrisli kısımları anlayamıyorsanız es geçebilirsiniz de, ziyanı yok.

Birinci sınıftaki Calculus dersleri pek önemli olmadığından kısa geçmiştim. Şimdi bilgisayar mühendisliğinin bazı temel taşlarını içeren Linear Algebra ve Probability & Statistics derslerinden ve buradaki matematik konseptlerinin bilgisayar bilimindeki uygulamalarından bahsedeceğim.

2. Sınıf 2. Dönem

Linear Algebra and Differential Equations

Endüstricilerle beraber aldığımız bu ders iki al bir öde şeklinde hazırlanmış. İçinde birbirinden bağımsız iki ders var yani.

Differential Equations: İçinde türev geçen denklemleri yani diferansiyel denklemleri çözmekle alakalı bir derstir. Lisede f(x) = x + 5 ise f'(x) kaçtır diye sorulurken bu derste f(x) = f'(x) + 5 ise f(x) nedir sorusunu sorarsın. Çözüm f(x) = C*e^x + 5 'tir. (C herhangi bir sabit değer) f(x)'in türevini alırsanız (C*e^x) elde ettiğinizi 5 ile toplayınca f(x)'e eşit olduğunu göreceksiniz. Çözüm tekniği ise x'li terimleri bir tarafa sabit değerleri bir tarafa alıp integral almaktan geçer. (Daha fazla bilgi için "separable" yani ayrılabilir diferansiyel denklemleri inceleyin.)

Diferansiyel denklemler çok bir işe yaramamaktadır. Benim karşıma bir daha çıkmadı. O yüzden çok üzerinde durmuyorum.

Linear Algebra: Lineer Cebir lise üçteki matris ve determinantların gelişmişidir. Çok fazla yeni konsept öğrenip kavramak gerektiğinden oldukça sıkıcıdır. Tabii ki daha kendim dinlerken uyuduğum kavramlardan burada bahsederek sizi sıkmayacağım. Dersin bu kısmında öğrendiğim ve sonradan karşıma çıkan iki önemli konsept var, anlatması da kolay, anlatıyorum.

- Denklem sistemleri ve çözümleri
Birden fazla bilinmeyen içeren denklemlere denklem sistemleri denir ve bunları lisede yaptığımız gibi sezgisel olarak çözmesi zordur, hele bilinmeyen sayısı arttıkça. O yüzden bu derste "Gauss İndirgeme Yöntemi" veya "Gauss Jordan Eliminasyonu" denilen yöntem öğretilir. (İngilizcesi Gaussian Elimination veya Gauss Jordan Method) Yöntem basittir; denklemleri al matris olarak yaz, sonra soldan başlayarak her sütundaki sayıların ilki 1 diğeri 0 olacak şekilde denklemleri düzenle.

Örnek:

x + y + z = 10

x + 2y + 2z = 20

x + 2y + 3z = 23

Oluşturalım matrisimizi:

[ 1 1 1 | 10 ]
[ 1 2 2 | 20 ]
[ 1 2 3 | 23 ]

Eşitliğin sağ tarafı da matrisin içinde, orayı | ile ayırdım.

Bu durumda matrisin satırlarını bir şeylerle çarpmak veya satırları birbirinden çıkarmakla lisede denklem çözerken denklemi ikiyle üçle çarpıp üsttekinden çıkarmak aynı şey. (Bu Kimya dersinde de yapılıyor hatta.) Bu durumda ikinci ve üçüncü satırdan ilk satırı çıkarırsak şu olur:

[ 1 1 1 | 10 ]
[ 0 1 1 | 10 ]
[ 0 1 2 | 13 ]

İlk sütun için istediğimizi elde ettik, sayıların ilki 1 diğerleri sıfır oldu. İkinci ve üçüncü sütun için tekrarlayalım, birinci ve üçüncü satırdan ikinci satırı çıkartalım:

[ 1 0 0 | 0 ]
[ 0 1 1 | 10 ]
[ 0 0 1 | 3 ]

Üçüncü sütun kaldı:

[ 1 0 0 | 0 ]
[ 0 1 0 | 7 ]
[ 0 0 1 | 3 ]

Bu durumda aslında şu denklemleri elde etmiş olduk:

1*x + 0*y + 0*z = 0
0*x + 1*y + 0*z = 7
0*x + 0*y + 1*z = 3

Buradan da çok açık olduğu üzere x = 0, y = 7 ve z = 3.

*

Tabii gerçek hayatta denklem sistemleri bu kadar kolay değil. Gerçek problem karşınıza çıkınca her zaman Gauss metoduyla kurtaramıyorsunuz ve başka metodlar da bilmek gerekiyor. Ama bundan daha önemlisi şu ki denklem sistemini kurabilmek.

Gauss'un adı başka yerlerde de geçti ama hakiki denklem sistemi kurduğumuz ders IE 400 yani Principles of Engineering Management oldu, yani bilgisayarcılar için endüstri mühendisliği dersi. Bu derste verilen problemlerden biri:

* Bir şirket A ve B makinelerini kullanarak X ve Y isimli iki ürün üretmektedir. X ürünü A makinesinde 50 dakikada, B makinesinde 30 dakikada üretilir. Y ürünü A makinesinde 24 dakikada, B makinesinde 33 dakikada üretilir.

Haftanın başında elde 30 tane X ve 90 tane Y vardır. A makinesi en fazla 40 saat, B makinesi en fazla 35 saat çalışabilir. Bu hafta X ürününden 75 tane, Y ürününden 95 tane gerekmekte. X ve Y ürünleri toplamı en fazla olacak şekilde denklem sistemi kurun ve bunu çözüp X ve Y'den ne kadar üretileceğini bulun.

Çözüm:

Nasıl çözüleceğini göstermeyeceğim, zaten ben de bilmiyorum :P Denklem sistemini yazayım:






  • 50x + 24y <= 40(60) ( A makinesinin çalışma süresi, dakika cinsinden)
  • 30x + 33y <= 35(60) ( B makinesinin çalışma süresi, dakika cinsinden)
  • x >= 75 - 30 = 45 (Üretilebilecek X stoğu, en az 75 olmalı ama elde 30 tane varmış zaten)
  • y >= 95 - 90 = 5 (Bu da Y stoğu)

  • Görev: Bu fonksiyonu maksimize etmek: (x+30-75) + (y+90-95) yani (x+y-50) yani x + y

    Bu en temel ve kolay örnekti, konumuz endüstri mühendisliği olmadığı için daha zorlarıyla uğraşamayacağım. Şuna bağlayacağım: burada iki bilinmeyenli bir sürü denklem elde ettik ve bunu çözmek için bir algoritmaya ihtiyacımız var. Her ne kadar burada işimize yaramadıysa da Gauss Jordan Eliminasyonu da bunların en basitlerinden biri.

    - Özvektörler

    Literatürde "Eigenvector" diye geçer. Vektör demek sadece satır ve sütundan oluşan matris demektir, kafanız karışmasın. 4x1 matris de vektördür, 1x4 matris de vektördür. 4x4 ise kare matristir.

    Eigenvector kısaca şu: Atıyorum 4x4 bir matrisiniz ve 4x1 bir vektörünüz var. Bu ikisini çarparsanız 4x1 vektör elde ederseniz doğru mu? Aynı şekilde herhangi bir 4x1 vektörü tamsayıyla çarparsanız yine 4x1 vektör elde edersiniz yani liseden bildiğiniz şeyler yine.

    4x4 matrise A
    4x1 vektöre v
    Tamsayıya C

    diyelim.

    A*v = C*v

    denkleminde v'ye A'nın eigenvector'u, C'ye de eigenvalue'su denir. Tahmin edemeyeceğiniz üzere bunu sağlayan az sayıda eigenvalue ve eigenvector vardır.

    Bu derste bunun çözümü falan da anlatılır da boşverin onları şimdi.

    Ne işe yaradığına gelelim.

    Daha önce Makine Öğrenmesi (Machine Learning) hakkında kısa bilgi vermiştim ama kaçıranlar ve tekrar okumak isteyenler için kısaca özetleyeyim. Makine öğrenmesinde bir sürü veri toplayıp o verinin özellikleri arasındaki bağlantıya bakıp yeni veriler üzerinde tahmin yaparsınız. Örneğin kişinin boyu, kilosu ve yağ oranından kaslı gözüküp gözükmemesi üzerine analiz kasıyoruz. Boy 180 kilo 60 yağ oranı %10 atıyorum, bunu bir vektörde gösteriyoruz ve vektörün son elemanı da kaslı için 1 kassız için 0 oluyor yani (180, 60, 10, 1). Çeşitli işlemlerle boyu 190 kilosu 50 yağ oranı 5 olan bir kişinin kaslı gözüküp gözükmediğini tahmin edeceğiz yani (190, 50, 5, x) vektöründe x'i bulacağız. Şimdi bu tahmini yapmak için bir milyon tane veri olduğunu düşünün. Her veri için 4 elemanlı vektör üzerinde işlem yapmamız gerek, kabaca 4 * bir milyon. Fakat sadece iki verimiz olsa işlem sayımız yarıya düşer iki milyon olurdu ve bilgisayar daha az çalışıp daha az ısınırdı. Lâkin ki boy, kilo ve yağ oranı üçü de önemli hangi birini atacağız? Cevap: hiç birini. Bunları aynı matrisin eigenvalue'sunu bulurken yaptığımız gibi tek bir sayıya indirgeyeceğiz. Basit bir mantık yürütürsek: bir insanın 180 cm boyunda 50 kiloda olup da %90 yağ oranına ulaşma imkanı yok. 150 cm boyunda 90 kilogram olup %10 yağ oranına da sahip olamaz değil mi ama? Özetle bu üç sayı arasında bir bağlantı var ve eigenvector ve eigenvaluelar ile bu bağlantıyı kullanıp üç bilinmeyeni tek bir bilinmeyende eritip ona göre işlem yapabiliyoruz yani vektörün boyutunu düşürüyoruz. Buna boyut küçültme yani dimensionality reduction deniyor. 

    Anlaşılmadıysa çok çok daha basit bir örnek vereyim (bu yeni aklıma geldi ama yukarıdakini silmeye üşendim) bir hayvanın aslan mı yarasa mı olduğunu tahmin edeceğiz ve elimizde iki özellik var: hayvanın rengi ve büyüklüğü. Renkler sarı ve siyah, büyüklük büyük ve küçük. Tabii ki bütün sarı ve büyük hayvanlar aslan, siyah ve küçük hayvanlar yarasa. Umarım sarı yarasa yoktur. Bu durumda eigenvektörümüz boyutu küçültüyor ve tek seçeneğimiz "siyah ve küçük" olmak veya "sarı ve büyük" olmak oluyor.

    Bu yaz sıcağında matematik çalışıp eigenvektörün bunu nasıl yaptığını anlatmaya üşendim.

    Probability and Statistics for Engineers

    Bu derste Probability yani Olasılık ve Statistics yani İstatistik olmak üzere iki kısımdan oluşur ve makinecilerle beraber alınır. Makine Öğrenmesinin belkemiğini oluşturur diyebiliriz.

    Bu ders üzerine de anlatılacak çok şey var, zevkli de bir derstir ama ben sadece Naif Bayes nedir onu anlatıp geçeceğim.

    Önce koşullu olasılık nedir onu açıklayayım, koşullu olasılık bir olayın gerçekleşeceği farz edildiğinde diğer olayın olma olasılığıdır. Örneğin bozuk paranın dik gelme olasılığı normalde 0'dır. Fakat bozuk para hileliyse sıfır değildir, bozuk para hileli olduğunda dik gelme ihtimalini bozuk paranın hem hileli olma hem dik gelme ihtimalini bozuk paranın hileli olma ihtimaline bölerek buluruz.

    Yani şu formül:


    Eğer A ve B bağımsız olaysa yani birinin olması diğerini etkilemiyorsa (zarın 6 gelme ihtimaliyle paranın tura gelme ihtimali) P(A kesişim B) = P(A) * P (B) olur P(B)'ler sadeleşir dolayısıyla A ve B bağımsızsa P(A|B) = P(A)'dır.

    P(B)'yi karşıya atarak aynı formülü B olayına uygulayabiliriz. Yani.


    Ortadaki fazlalığı atarsak ismi Bayes teoremi olan şu formülü elde ederiz:


    Gördüğünüz gibi bu formülde koşullu olasılığın içindeki bilinmeyenler yer değiştirdi.

    Şimdi diyelim adamın boyu, kilosu, yağ oranı, göz rengi bilmemnesi X1, X2, X3 diye gidiyor. Kaslı gözüküp gözükmemesi ise Y. Bu durumda adamın özellikleri ışığında kaslı gözüküp gözükmemesi P(Y | X1, X2, X3,....) diye uzayıp giden bir koşullu olasılıkla gösterilir. Bayes teoreminde bunu sol tarafa koyunca sağ tarafa da P(X1, X2, X3.... | Y) gibi bir şey yazarız fakat bunu hesaplamamıza pek imkan yoktur.

    Naive Bayes Y'nin olduğu farzedildiğinde X'lerin bağımsız olduğunu söyler. Adamın göz rengiyle kilosu alakasızdır pekala, adam kaslı olsa da olmasa da. Olaylar bağımsız olduğu için tüm olasılığı hepsini tek tek çarparak buluruz. Yani P(X1, X2, X3.... | Y) = P(X1 | Y) * P(X2 | Y) * P(X3| Y) *..şeklinde bulunur. *... kısmını çarpım işaretiyle gösterebiliriz.

    Bayes teoreminde paydadaki P(B) yani P(X1, X2, X3....) olasılığı adamın kaslı olup olmamasına bağlı olmadığı ve aslen sabit olduğu için ihmal ediliyor. Yani sadece pay hesaba katılıyor.

    Dolayısıyla

    P(Y | X) = P(X1, X2, X3,....|Y) * P(Y) = P(X1 | Y) * P(X2 | Y) * P(X3| Y)*... * P(Y)

    yani

    P ( Kaslı olma ihtimali | adamın kilosu, boyu, rengi) = P( göz rengi | kaslı olma ihtimali) * P (kilosu | kaslı olma ihtimali) * P (kaslı olma ihtimali)

    Atıyorum elimizde 20 tane nefer var. Bunların 8'i kaslı. 20 kişinin 15'i yeşil gözlü. Kaslıların yarısı yeşil gözlü. 10 kişi 80 kilo, 10 kişi 50 kilo. Kaslıların hepsi 80 kilo. Araya 21. bir adam geldi, bu adam 80 kilo ve yeşil gözlü. Bu adamın kaslı olma ihtimalini şöyle hesaplarız.

    P ( Kaslı olma ihtimali | adamın kilosu, boyu, rengi) = bu hesaplayacağımız şey zaten.

    P( göz rengi = yeşil | kaslı olma ihtimali) = kaslıların yarısı yeşil gözlü demiştik di mi? P ( yeşil göz kesişim kas) = 4 / 20. Bunu P( kaslı) yani 8/20'ye böleriz. Oldu sana 1/2. Gerçi kaslıların yarısı yeşil gözlü olduğu için direkt 1/2 de diyebiliriz.

    P( kilo = 80 | kaslı olma ihtimali) = 1 , bütün kaslılar 80 kilo demiştik.

    P (kaslı) = 8 / 20 herhangi bir kişinin kaslı olma ihtimali 0.4

    Yukarıdaki formüle göre bunları çarpıyoruz. 0.5 * 1 * 0.4 = 0.2

    Yani araya katılan bu 21. kişinin kaslı olma ihtimali 0.2. Bu kadar düşük olma ihtimalinin sebebi kaslı kişilerin nispeten az olması ve sadece yarısının yeşil gözlü olması.

    *

    Yazması zor ve sıkıcı bir yazı oldu. Umarım derdimi anlatabilmiştir, bu yazıyı okuyan olursa geri bildirimlerini kesinlikle almak isterim.

    Önümüzdeki yazıda görüşmek üzere.