<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Hana Kamer - Medium]]></title>
        <description><![CDATA[💻 - Medium]]></description>
        <link>https://medium.com/hana-kamer?source=rss----1e77728fa4fc---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Hana Kamer - Medium</title>
            <link>https://medium.com/hana-kamer?source=rss----1e77728fa4fc---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 11 Nov 2026 04:10:09 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/hana-kamer" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[7 gün, 7 Balkan ülkesi]]></title>
            <link>https://medium.com/hana-kamer/7-g%C3%BCn-7-balkan-%C3%BClkesi-11762358573a?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/11762358573a</guid>
            <category><![CDATA[gezi]]></category>
            <category><![CDATA[balkanlar]]></category>
            <category><![CDATA[medium-turkish]]></category>
            <category><![CDATA[balkans]]></category>
            <category><![CDATA[gezi-notlari]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Mon, 12 Nov 2018 21:26:55 GMT</pubDate>
            <atom:updated>2018-11-12T21:48:08.294Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M_Qmbf8s_CJhCXAzNfiMNQ.png" /></figure><p>Bir müddettir yapmayı planladığımız küçük Balkan turumuz hakkında tuttuğum notlar. Öncelikle Burakla ikimiz de öyle müze, kilise, camii insanları değiliz. Daha çok şehrin farklılıklarını orada yaşayan insan gözüyle görüp gezmeyi seviyoruz. Gezimiz de hep o yönde şekillendi ve ilerledi.</p><p>Türk vatandaşları için vize gerektiren tek ülke Avrupa Birliğinde olan Hırvatistan.</p><p>Yol toplamda yaklaşık 1800 km. Yaklaşık 2,5 depo yakıt ile Sofya’dan başladığımız turu tamamladık.</p><p>Turu sonbaharda yapmış olmamız çok güzel denk geldi. Turistlerle alt alta üste gezmektense daha boş ve fiyatların çıldırmadığı bir zaman gezmiş olduk. Sonbahar renkleri de ayrı güzellik katıyor bütün geziye.</p><h4>Üsküp, Makedonya</h4><p>Daha önceden de gidip çok beğendiğimiz Destan köftecisiden geçip öğle yemeği yiyip yolumuza devam ettik. Buraya ilk gelişimiz Kanyon Matka içindi gitmediyseniz mutlaka gidin. Mükemmel ötesi bir kanyon.</p><h4>Priştine, Kosova</h4><p>Yollar çok güzeldi ama Kosovo’nun kendisinde hiç bir şey yoktu. Priştine’ye akşam 5–6 gibi vardık. Merkezi bir turladık. Şehir hakkındaki izlenimlerim: İzmit’e banziyor, çok fazla dilenci var, Starbucks fln yoktu ama bir suru başka kendi kahvecileri vardı. 35 eur otel, kahve 2 eur.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5qUqJLlSUJ0YhnPUc-zJlw.jpeg" /><figcaption>Pristina’dan çıkarken. Yol sanki İzmit’e giriyomuşsunuz gibi…</figcaption></figure><h4>Shkoder, Arnavutluk</h4><p>Sabah Priştine’den Kotor’a doğru yola çıktık. Arnavutluk’a geçtik. Yollar yine çok güzel ve dağlıktı. Yolumuza yakın büyük şehir olan Shkoder’den geçtik. Orada öğle yemeği yedik. 1 saatlik izlenimim nüfus: erkek. Şaka bi yana sokakta öbek öbek erkekler ve arada sırada 1–2 kadın geçiyordu. Ama çok sayıda bisiklet kullanan vardı. Yaşlısıyla , genciyle; kadınıyla, erkeğiyle… Biraz trafik kurallarından bihaberlik var ama hiç gerginlik yaratmıyor garip bir şekilde:D Bir de sokakta yürürken yoğun bir yiyecekmiş gibi bakma bakışlarına maruz kaldık. Türkiye’den beri görmeyeli epey olmuş baya bu bakışları. Ama sebebini anlayamadık. Böyle olunca Arnavutluk’a kanımız pek ısınamadı. Yolumuz geçmediği sürece de geçmeyiz gibi.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PxXMmgv34hRnYoKX5zOSgg.jpeg" /><figcaption>Arnavutluk yolları ve Shkoder’den bir kaç kare</figcaption></figure><h4>Kotor, Karadağ</h4><p>Arnavutluk-Montenegro (polisler Arnavut) sınırında dikkatimi çeken polislerin araba kuyruğunu gezip pasaportları toplamalarıydı. Bu bekleme sürecini çok hızlandırdı. Aynı şekilde bagaj kontrolünde görevli polis de kuyruğun ilerlemesini beklemektense kendi gezip bagaj kontrolu yapıyordu. Ayrıca sınırında kendi dilini konuşmaya zorlamayan nadir ülkelerden biriydi, mükemmel Ingilizce konuşuyordu polisler.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2Fk6MGoOV1UHsrzpnZnQ%2Ftwitter%2Fiframe&amp;url=https%3A%2F%2Fmedia.giphy.com%2Fmedia%2Fk6MGoOV1UHsrzpnZnQ%2F200w_d.gif&amp;image=https%3A%2F%2Fi.giphy.com%2Fmedia%2Fk6MGoOV1UHsrzpnZnQ%2Fgiphy-downsized-large.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=giphy" width="435" height="773" frameborder="0" scrolling="no"><a href="https://medium.com/media/d262be5dc53067d390d8d9e3faf20b34/href">https://medium.com/media/d262be5dc53067d390d8d9e3faf20b34/href</a></iframe><p>Kotor’a aksam 7 gibi vardık. Yollar aşırı virajlı olduğu icin epey yorulmuştuk ama yine de merkezi bir görmeye gittik. Eski şehrin olduğu yere gittik. Kotor’un eski şehri hayatımda gördüğüm en güzel eski şehirlerden biri diyebilirim. Normalde eski şehir diye gideriz, bir iki sokak olur onların da büyük bir bölümü restore edilmiş olur ve o tarihi duyguyu hissedemezsiniz. Burası ise gerçek bir şehirdi. Eski taş binalar dip dibe, daracık sokaklar, kediler ❤… eski şehir beklenileceği üzere dükkanlar ve restoranlarla doldurulmuş ama bu sırada eski ruhun zarar görmemesine özen gösterilmiş. Tabelalar şehirle uyumlu, tasarımları hoş, mekanların sandalye ve masaları da yine etrafla uyum içinde.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*2Hjza84xZ1F02Kan_8jWsQ.jpeg" /><figcaption>Kotor eski şehirden ve kaldığımız daireden bir kaç resim</figcaption></figure><p>Eski şehri turladıktan sonra kaldığımız daireye geri döndük. Geceliği 45 eur olan, körfeze sıfır deniz manzaralı, kocaman teraslı bir apartta kaldık. Sabah kapımızın önünde bizi kedi karşıladı, kahvaltı için döndüğümüzde kedi bize yakaladığı kuşu gösterdi, horladık kediyi, geçtik içeri.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*6-ktowFTCx4-bJuUYI0BeQ.jpeg" /></figure><p>Apartın mutfağı vardı, kahvaltımızı kendimiz hazırladık. Kahvaltıdan sonra San Giovanni Kalesi’ne tırmandık. 1355 merdivenlik bir tırmanıştı. Normal şartlar altında yaklaşık 45 dk süren bir tırmanış. Merdiven olduğu için çıkması kolay. Tepeden bütün şehri ve körfezi görebiliyorsunuz. Kaleden inince yemek icin Tanjga diye bir restorana gittik, bunu Kotor’da yapılası şeylerin anlatıldığı bir blogdan okumuştum, gerçekten de çok başarılıydı. Aslında restorandan çok kasap gibi, dolaptan seçtiğiniz etleri pişiriyorlar.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*Z2Y5CWfFLAE8OmK1cKrzeA.jpeg" /><figcaption>San Giovanni Kalesine giden merdivenler ve oradan manzara</figcaption></figure><p>Kotor’da kaldığımız yer: Körfeze sıfır Bjelica Apartments, 45 eur.</p><h4>Dubrovnik, Hırvatistan</h4><p>Kotor’dan sonra Dubrovnik’e yola çıktık. Yaklaşık 2 saatte Dubrovnik’e vardık.</p><blockquote>Dubrovnik’de park yeri büyük sorun. Saati 10 eur gibi bir fiyattan bahsettiler bize.</blockquote><p>Kalmak için ayarladığımız yer eski şehrin içindeydi. Haliyle arabayı bir yere bırakmamız gerekti, bizimle eski şehrin kapısında buluşan ev sahibi (ya da bu işin sorumlusu) bize ucuz park yeri ayarladı, bizimle oraya kadar geldi ve daha sonra Uber ile dairemize geçtik (park yerine gecesi 13 eur ödedik).</p><p>Eski şehri bir ucundan diğer ucuna geçmemiz gerekiyordu kalacağımız yere ulaşmak için ve biz o sırada bu şehre aşık olduk. Bu, Kotor’dan çok çok daha büyük ve görkemli bir şehirdi. Bir gün kalmayı planlayarak yanlış mı yapıyoruz diye düşündük… ama bir gün gezdikten sonra karar verelim dedik.</p><p>Ertesi gün ben yapılacak bir kaç şey araştırdım: lift ile şehre uzaktan bakmak, şehrin yakınındaki adaya gitmek gibi seçenekler vardı. Önce gittik kahvaltısı övülen bir restoranda kahvaltı yaptık. O sırada dün gece aşık oldugumuz o şehrin havasının epey değiştiğini gördük. Her yer turist kaynıyor. Restoranlarda gereğinden fazla bir ilgi alaka, telefonuna bile bakmadan her şeyi kameraya alan insanlar, her şeyin gerrrreksiz pahalılığı ve abartılılığı. Yavaş yavaş soğumaya başladık. Etrafta biraz gezindik, şehri çevreleyen surlardan geçip sehrin tamamını görmeye karar verdik. Kişi başı 150 kn, yaklaşık 25 eur’a bilet. Rota 3,5 km. Büyük bir merakla başladık sur turuna lakin yol geçtikçe manzarada ve görebildiklerimizde pek bir değişikilik olmadı. Dubrovnik’de mutlaka yapılması gerekenler listesine giremiyor ne yazık ki bu etkinlik. Hatta boşverin yapmayın etkinliğine bile girebilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*amAkhXOYn0VxkkZFOcHjTA.jpeg" /><figcaption>Dubrovnik, eski şehirden ve surlardan bir kaç resim</figcaption></figure><p>Onun yerine Lokrum adasına gitseydik keske diye düşünüyorum. Ama artık bir dahakine… Surlardan indikten sonra Dubrovnik’in eski şehir dışında kendi merkezinde yemek yiyelim dedik, öyle bir merkez bulamadık. Yine içi ciksleştirilmiş, değerinden kat kat yüksek fiyata ama aynı zamanda ortası da soğuk pizza yapan bir restoranda yemek yedik ve yola çıktık. Gün batımına denk geldigimiz için mükemmel manzara eşliğinde deniz kenarından yolumuzu Bosna-Hersek’e doğru çevirdik.</p><p>Dubrovnik’de kaldığımız yer: Eski şehrin içinde Villa Madonna della Strada, 44 eur.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YDs0FVCC1SfCThueaDspDg.jpeg" /><figcaption>Mostar’a doğru giderken yol (dağlara doğru girmeden, Hırvat tarafı)</figcaption></figure><h4>Mostar, Bosna-Hersek</h4><blockquote>Ülkeye girişinizden sonra 24 saat içinde polise kaydolmanız gerekiyormuş. Biz çıkarken öğrendik:((</blockquote><p>Google maps’in bizi götürdüğü yoldaki sınır kapısından geri çevrildik, Orahov do Sınır kapısı. Bu kapı sadece kapıya 3–5 km yakınlıkta oturan ve çalışan yerliler için. 30 km daha ilerde olan Neum 2 kapısından geçtik.</p><p>Bosna Hersek yolları çok çok fena olmamakla birlikte, bol virajlı, kapkaranlık ve yer yer epey dardı (sanırım bu çok fenanın tanımı aslında, şöförüme sormam lazım=P). Onun dışında sıkıntılı değildi. 2,5 saat sonra Mostar’a vardık. Checkinimizi yaptıktan sonra yemek yemeye çıktık. Hindin Han diye bir mekanda yedik. Nehrin kenarında güzel, makul fiyatlı ve lezzetliydi. Bu arada Bosna Hersek’de kapalı alanda sigara içme yasağı yok. Insanlar restoranlarda, kafelerde, avm içlerinde her yerde sigara içiyor.</p><p>Ertesi sabah, geçtiğimiz akşam ışıklandırılmış olarak gördüğümüz köprüyü bir de aydınlıkta gördük. İnanılmaz güzel, turkuaz Neretva nehri akıyor köprünün altından. Çarşısı çok tatlı bir çarşı. Köprünün hemen yan tarafındaki savaş müzesine gidip köprünün yıkılmadan önceki ve sonraki fotoğraflarını, şehrin nasıl yok edildiğini gördük.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4MHxBUkn3bjGTg6S0APTAA.jpeg" /></figure><p>Oradan Hırvatların çoğunlukta olduğu bölgeye geçtik. Burada aynı şehirde olduğunuzu anlamak çok zor. Binalar, insanlar, giyimleri her şey o kadar değişiyor ki… Sokaklarda çoğu bina düzeltilmiş olmasına rağmen bir sürü yerde savaşın izlerini görebiliyorsunuz. Tamamen boyanıp duvarı yenilenmiş büyük bir binanın, bir duvarını özellikle ellenmeyip kurşun izleri ile bırakıldığı veya bütün sokağın evleri yenilenip tamir edilmiş olmasına rağmen arada bir tanesi yine bütün kurşun ve savaş izleri ile bırakılmış oluyor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2peGHZ_T1o3tioTdYr8WJA.jpeg" /><figcaption>Mostar’ın Hırvat tarafı ve savaş izleri</figcaption></figure><p>Keskin nişancı kulesi olan büyük ve terk edilmiş bir binanın yanından geçtik. Binanın her yerine grafitiler yapılmıştı farklı sanatçılar tarafından. Epey ilginçti.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*s-KU8gZffWqQ3m4qyC3Uug.jpeg" /><figcaption>Mostar’ın Hırvat tarafında yer alan keskin nişan kulesi ve binadaki graffitiler</figcaption></figure><p>Buralarda biraz daha gezdikten sonra Mostar’a çok yakin olan Bagaj tekkesine gittik. Orada nehrin dibinde ördeklerle yemek yedikten sonra Saraybosna’ya doğrular yola çıktık.</p><p>Mostar’da kaldığımız yer: eski şehre çok yakın, Pansion Bubamara, 33 eur.</p><h4>Saraybosna, Bosna-Hersek</h4><p>2,5 saatte Saraybosna’ya vardık. Pansiyonumuza yerleştikten sonra merkeze gidip biraz gezindik. Yöresel yemekleri olan klepe, kocaman mantı:), yedik, çok lezzetliydi.</p><p>Hiç sönmeden yanan 2. Dünya Savaşı anısına yapılmış olan Sonsuz Ateş’i (Vjecna Vatra) görmeye gittik.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*azRvEC0IUki3IeszEsVDtA.jpeg" /></figure><p>Akşam hava aşırı soğuduğu için koşa koşa odamıza geri döndük. Bir sonraki sabah çıkışımızı yapıp şehirde gezindik. Çarşıda yemek için bir çok Boşnak ve Türk mutfağı restoranı var. Sabah Türk restoranında kahvaltı yaptık, öğlen Boşnak mutfağı olan bir restorana oturup yöresel sarmalarından ve etli bir yemeklerinden yedik. Garson Türkçe bildigi için iletişim kolay oldu:D</p><p>Soykırım müzesine gittik. Çok can sıkıcı ve üzücü bir müzeydi. Oradan çıkınca zaten bir şey yapacak, gezecek fazla bir keyfimiz kalmamıştı. Ben sürekli insanları inceleyip savaş yıllarında kaç yaşında olduklarını, su an akıllarına geliyor mu hiç, bu travmayı nasıl atlattıklarını, ne kadar akraba ve tanıdıklarını kaybetmiş olabileceklerini düşünüp durdum. Bir sonraki gideceğimiz yer Sırbistandı, oraya gitmek istemiyordum artık. Ama yolun kabak gibi ortasında oldugumuz için Sırbistan’dan geçmekten başka yolumuz yoktu.</p><p>Sokaklarda Saraybosna gülü denilen, şarapnel parçalarının kırmızı dolgularla doldurulduğu yerleri görebilirsiniz. Burada da yine bazı binalarda özellikle tamir edilmemiş ve savaşın izlerini görebileceğiniz kurşun deliklerini görebiliyorsunuz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*z0UJQM0yJMZbAuE_tImlHQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/748/1*ysd9_MgK_SJ5NunJzME9Fw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*7pred0yWyuqqHkLEb8Fe8A.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*5lEdyYaaXaMCn8BtqgAg6w.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*KNRcbM2iynvB51v2MDlRpA.jpeg" /><figcaption>Saraybosna</figcaption></figure><p>(Yıllarca tarih kitaplarında okuduğumuz klasik cümle) Avusturya Macaristan İmparatorluğu veliaht Arşidükü Franz Ferdinand’ın vurulup 1. Dünya savaşının başlangıcının tetiklendiği köprüden geçtik.</p><p>Saraybosna’da kaldığımız yer: eski şehire çok yakın, Bed and Breakfast Vijecnica, 30 eur.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*X2ckm5N0locfLG9VRfOyZg.jpeg" /></figure><h4>Belgrad, Sırbistan</h4><p>Akşam 5 gibi elimiz mahkum Belgrad’a doğru yola çıktık. Saraybosna’dan biraz uzaklaşınca “Republic of Srpska “ tabelasını gördük, yani Bosna Hersek’deki Sırp Federasyonu sınırlarına geçtik. Bunun her ne kadar böyle olduğunu biliyor olsam da gerçekte gözümle görmüş olmak çok farklı hissetirdi…</p><p>2–2,5 saat sonra Sırbistan sınırına vardık. Bosna Hersek’den çıkışta sınırda bize güzel bir oyun oynayıp koparabilecekleri kadar para kopardılar. Tabi bunu güzel de bir kılıfa uydurdular. Bosna Hersek’e girişte giriş damgamızın vurulmamış olmasından girip; ülkeye giriş yaptıktan sonra polise kaydolmamış olmamızdan çıktılar. Ülkeye girdikten sonra polise kayıt yaptırmamız gerektiğini okumuştuk fakat aynı zamanda otelde kalıyorsak bunun otel tarafından yapıldığını da okumuştuk ama anlaşılan herkesin işini tekrar tekrar kontrol etmemiz gerekiyormuş. Gümrük polisi giriş damgamızı vurdu mu? Otel kaydımızı yaptı mı vs diye. Şimdi “e ortada işlenmiş suç var, cezasının olmasından daha doğal ne var ” diyebilirsiniz. Ben de öyle düşünüyorum lakin üstümüzde para olmadığını belirtince konuşmaların “iyi peki kaç var üstünüzde”ye gelmesi, ortada resmi bir şey olmadığının en büyük işaretiydi ki başta belirttikleri sayının yarısına da razı olmuş olmalarını karıştırmıyorum bile. Üstümüzde mark kalmadığı için geri dönüp çekelim dedik. Bu sefer pasaportlarımızı vermek istemediler. Özetle akıl alır gibi işler değildi ama deplasmanda olunca insan “tamam, peki” demekten başka bir şey yapamıyor. Neyse, 100 eur istemekle ile başlayan para tuzağından 52 eur vererek kurtulduk. Otelimize de gece geç saate vardık.</p><p>Belgrad’da 2 gece kalmaya karar verdik çünkü çok yorulmuştuk ve son kalan yolumuz en uzun yoldu. 1 günü tamamen gezmeye ayırdık, ikinci gün erkenden yola çıktık.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*KLHSG2ssPXommSpyksDQuw.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*qLyI_c3RRXPc5gpu13evIg.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VUWxBM2tiBG9h19Us4MUwA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*q7OYy_BGfzr00Dc8BwLhvA.jpeg" /><figcaption>Belgrad ve Kalemegdan Kalesinden nehir</figcaption></figure><p>Belgrad’da Kalemegdan’a gittik. Adından da anlaşılacağı üzere bir kale var. Çok etkileyici değildi. Bu yer nehrin kenarında olmasına rağmen güzel bir manzarası yoktu kaleye kadar. Bir yerin suya bakıp nasıl çirkin olabileceğini gördük. Kalenin içinde işkence yöntemleri müzesi ve savaş aletleri, tanklar ve alakasız bir şekilde dinazor heykelleri vardı. (evet Bosna Hersek’de soykırım müzesi varken burda işkence müzesi var)</p><p>Tesla müzesine gittik. Beklentilerimden çok aşağıdaydı. Ben teknik müze beklerken içinde 2–3 elektrik deneyi olan onun dışında Tesla’nın özel hayatını içeren eşya ve belgesel müzesiydi.</p><p>Ertesi gün Sofya’ya doğru yola çıktık. Bulgaristan’a varınca gurbet ellerde açık unuttuğum roaming sebebiyle kitlediğim telefon hesapları ile ilgilendik, bol bol üzüldük :D Ben dinlenebilmek için 1 gün boyunca tamamen uyudum. Her şeyiyle inanılmaz zevk aldığımız bir turdu. Mevsim, yollar, farklı kültürler, ayırdığımız süre her şey çok kıvamındaydı. Şimdi başka rotalar çizme peşindeyim ama bu sefer ehliyet almalıymışmışım.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=11762358573a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/7-g%C3%BCn-7-balkan-%C3%BClkesi-11762358573a">7 gün, 7 Balkan ülkesi</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Sofya İzlenimlerim]]></title>
            <link>https://medium.com/hana-kamer/sofya-58105fd5770e?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/58105fd5770e</guid>
            <category><![CDATA[medium-turkish]]></category>
            <category><![CDATA[bulgaristan]]></category>
            <category><![CDATA[yurtdışı]]></category>
            <category><![CDATA[sofia]]></category>
            <category><![CDATA[türkçe]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Sun, 06 Aug 2017 11:53:56 GMT</pubDate>
            <atom:updated>2017-08-06T12:57:33.786Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mP9yvitx9mR2gbYCgKB6TQ.jpeg" /></figure><p>Sofya’ya taşınalı 6 ay olduğuna ve Burak kalma iznini 1 sene uzattığına göre resmi olarak Sofya’yı ve Bulgaristan’ı beğendiğimize karar verdim. Bu yazının da yazılma zamanı geldi de geçiyor bile. Size biraz buradan umduğumuzu ve burada bulduğumuzu anlatacağım.<br>Buraya benim Bulgar vatandaşlığımdan yararlanıp Burak’a evlilik üzerinden D vizesi alarak giriş yaptık. Sürecin İ-N-A-N-I-L-M-A-Z çağ dışı olması bizi vazgeçirme kararına, sinir krizi eşiğine defalarca getirmesine rağmen bürokrasi ile uğraşacak son bir damla sabrımız kalmadığı için bu yolda devam ettik. Gerekli belgelerin belirtildiği resmi bir site, randevu alabileceğiniz herhangi bir sistem yok. Bu iki bilgiye bir de canı sıkılan bilimum insan ile işinizin olduğunu eklerseniz süreci hayal gücünüzle çözebilirsiniz.<br>Evet… Bulgaristanı olası göçülesi ülkeler listesinden sildiniz mi :D <br>Durun silmeyin hemen:)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/283/1*TWR2AjkjlxvZuylAYcitAQ.jpeg" /></figure><h4>Ev ve İş</h4><p>Ocak ayında ‘yuvayı dişi kuş yapar’ misali önden gidip 3 gün içinde kira buldum. Semt, İstanbul standartlarında Bostancı, Sofya’nın semtleri arasındaki sıralamasında Etiler’e denk gelen bir yer. 2 balkonuyla birlikte 100 metre kare olan, 1+1 eşyalı ev (buzdolabı, fırın, çamaşır makinası, bulaşık makinası, koltuklar, koltuklar, yatak, çalışma masası ), 1100 leva (<strong>1 leva =2.12 tl</strong>). Sürekli İstanbul ile karşılaştırdığımız için bize çok uygun gözüktü ama buranın yerlileri bizi epey hor gördü:D<br>Mahallede market, bakkal, fırın, kahveci, yemeklik hoş mekan vs hep evden 5 dk uzaklıkta olduğu için mahalleyi çok seviyorum.</p><p>Yuvayı kurduktan, Burak da buradaki işine başladıktan sonra bu sefer iş aramaya başladım.</p><p>İş arama sürecim çok hızlı gelişip sonuca vardı. İş görüşmeleri sırasında hiç bir yer evli olup olmadığımı, çocuk düşünüp düşünmediğimi sormadı (tabi bu bütün ülkenin böyle olduğu anlamına gelmez ama ben yaklaşık 10 tane görüşme yaptım).</p><p>Alınan vergilerin düşük olması sebebi ile bir çok firma yurt dışından gelip burada ofis açıyor. Bunlardan bazıları Skyscanner, Gameloft, Crytek, VMware, SAP. Büyük kurumsal şirketler dışında çok sayıda yerli ve yabancı startuplar da var. Bu nedenle sektör de geliştiriciye aç.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/500/1*C7wNmswjqqwMMz132qjLuA.gif" /></figure><h4><strong>Çalışma Koşulları</strong></h4><p>Çalışma koşulları benim şu ana kadar çalıştığım 6 yer arasında en iyisine sahip diyebilirim. Sınırsız evden çalışma, esnek çalışma saatleri, 19 gün yıllık izin (bu izinlere girdiğiniz andan itibaren sahipsiniz; 1 sene sonra değil ), 6 gün eğitim izni, 700 eu eğitim/konferans bütçesi, bir spor salonu ile anlaşma ve özel sağlık sigortası haklarına sahibim burada. Anlaştığım ücret İstanbul’da aldığım ücret ile rakam olarak benzer, birim olarak leva.</p><p>Fazla mesaiye karşı insanların fikirleri çok net: İş dışında insanların bir hayatı var; yoksa kötü ve oldu ki iş saati dışında bir şeyin yapılması gerekiyor (buna on call olarak beklemek de dahil) bu saatlerin parası ödenir. İnsanlar haklarının farkında ve peşinde.</p><p>Çalışma koşullarından bahsetmişken kadınların doğum izinlerinden de bahsedeyim. Kadın, çalıştığı yerde 1 seneyi doldurduğu takdirde doğumdan önce 45 gün dahil toplamda 410 gün ücretli izin hakkına sahip oluyor. Ücret, ortalama günlük ücretin %90 baz alınıp hesaplanıyor ve sosyal sağlık sigortası tarafından ödeniyor. Çocuk 2 yaşına basana kadar kadının bu izni kullanma hakkı var fakat ikinci sene ücret %80 oluyor.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/210/1*qX_PI9htmxhjL-ffbc6AXQ.png" /></figure><h4><strong>Alım Gücü</strong></h4><p>Alım gücü bulunduğunuz sektöre bağlı olarak inanılmaz değişiyor. Burada avukat, yazılımcı, diş doktoru yüksek alım gücüne sahip iken diğer mesleklerin maaşları Türkiye’deki asgari ücretin yarısından da aşağıda.</p><p>Bazı ürünlerin fiyatları şöyle: 1 kg ekmek 1 leva; dana eti 8–9 leva; tavuk but 6-7 leva; karışık kıyma 6–7 leva, 2 litre bira 3 leva, 0,5 kg yoğurt 1–2 leva, domates 3–4 leva. Dışarda ev yemeği yiyebileceğiniz yemekhane benzeri yerlerde ana yemekler 1–3 leva arası değişirken, lüks olmayan bir mekanda ana yemek 10 leva. Dışardan rahatlıkla lezzetli ve ucuz ev yemekleri bulabilirsiniz yani.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VzJNh4qBwqUP-rB0l3PEjg.jpeg" /></figure><h4>Ulaşım</h4><p>Şehrin her yeri ağaçlarla dolu ve bir yerden bir yere fiziksel olarak yürüyebileceğiniz bir düzene+düzensizliğe sahip. Toplu taşımada kullanılan biletler 1.60 fakat bunların dışında 50–60 levaya alabileceğiniz aylık kartlar var. İstanbul’da benim aylık yola 150 lira verirken burada en fazla 50 leva vermem gerekiyor. Evden ofise ulaşmam 20 dk sürüyor. Yola harcanan zaman ve para bu kadar az iken işten sonra herhangi bir etkinliğe gitmek çok rahat oluyor. Yolda gerek yaya gerek bisikletli olarak tanınıyorsunuz. Yaya yoluna ayağınızın ucuyla girdiğiniz anda arabalar duruyor. Diğer yandan kaldırımda yürümek büyük bir sorun :D Çünkü kaldırım taşları yol kenarlarındaki dev ağaçların dev köklerinden yerlerinden oynamış ve ayaklarınıza bakmadan yürümek tehlikeli. Yamuk taşlar dışında senelerce kapatılmamış boy boy delikler de var. Bu sebeple kaldırımlarda tekerlekli bir araçla (bebek arabası, tekerlekli sandalye) geçmek imkansız olmadığı zaman büyük dert.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/355/1*j1Kqp08FW2Z3pYSDmuW5EQ.gif" /></figure><h4>Yazılım sektörü</h4><p>Yazılım sektörü çok canlı ve her hafta ilgi alanıma giren en az bir etkinlik bulabiliyorum. Etkinliklerin çoğu İngilizce oluyor; ya da yabancı olmasına bağlı olarak İngilizce’ye geçilebiliyor. Etkinliklerin çoğu sponsorlu olup sonlarında bira+pizza+networking zamanı oluyor (şu anki işimi de böyle bir networking sırasında buldum).</p><p>Sektörde çok fazla insan var ve bir etkinlikte daha önce gördüğünüz insanlarla karşılaşmak neredeyse zor. Etkinliklerde konuşulan konular farklı tecrübelere sahip insanlara hitap edebilecek şekilde farklılık gösteriyor. Hackerspace’de zaman zaman workshoplar oluyor. Bunun dışında SoftUni adında, maddi ihtiyaçlarını şirketlerin sponsorluklarından elde eden; katılımı ücretsiz, sertifikaları ücretli bir organizasyon var. C#, JS, HTML ve CSS, oyun geliştirme, algoritma gibi aylarca süren kurslar veriyorlar. Aynı zamanda bu dersleri anında canlı olarak veya sonradan derslerin kayıtlarını izleyerek internetten takip etmek de mümkün.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IGB-JjsPNDq8AUJOIzyOPw.jpeg" /></figure><h4>Mevsimler</h4><p>Buraya kışın geldiğimiz için ilk Bulgaristan günlerimiz karlı ve romantikti. Ta ki… Kış bize gerçek yüzünü gösterene kadar… 1 hafta boyunca -20 derecede nasıl hayatta kaldık tam hatırlamıyorum ama bu sene yine hatırlayacağız muhtemelen. Bahar çiçekli yeşilli hoş bir geçiş yapıyor yaza. Yaz, 30 derece etrafında ama haftada bir güzel bir sağanak yağmur ile etrafı serinletiyor. Nem olmadığı için güneşten gölgeye geçtiğinizde anlamlı bir serinleme hissedebiliyorsunuz.</p><p>Kışın ısınma merkezi ısıtma sistemi ile sağlanabiliyor. Burada söz konusu olan merkez bina değil şehirde bulunan merkez. Elektrik santrallerinde enerji üretirken yan ürün olarak çıkan sıcak su kullanılıyor. Ayrıca musluklar da aynı merkezi sisteme bağlı olup sıcak su sağlıyor. Doğal gaz pek yaygın değil.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/990/1*DH_HLR3FWulIj9_wM7NnPw.gif" /></figure><h4>Sokakta kadın olmak</h4><p>Burada 6 ay boyunca beni rahatsız eden ve tedirgin eden tek bir durum olmadı. Saçımı masmavi boyamış olmam, istediğim gibi giyinip eve yürüyerek gitmem bu durumu değiştirmedi. Aldığım tek tepki 4–5 yaşındaki çocukların ‘annneaaeaeeaa kızın saçına baaaak’ demesi :D</p><h4>Başka başka</h4><p>Hafta sonları etkinliği olarak bir çok seçenek var. Birbirinden güzel, yemyeşil, ormanlı parklarda piknik yapmak, bisiklet/paten/kaykay sürmek, Sofya’nın hemen dibindeki Vitoşa dağında yürüyüş yapmak bunların arasında benim en en bayıldıklarım.</p><p>Sofya’nın dağlarla çevrili olup çukur bir alanda kalması sebebi ile fazla rüzgar olmuyor bu nedenle şehrin hava kirliliği sorunu var. Aynı zamanda kışın bütün evlerin merkezi ısıtma sistemi ile ısınmaması, kömür yakması da kışın 1–2 hafta fazlasıyla bir hava kirliliğine sebep oluyor.</p><p>Özetle biz burada umduğumuzdan fazlasını bulduk ve pek memnunuz. Fikrimizi değiştirecek kadar büyük değişikler olursa tekrar yazarım:)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=58105fd5770e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/sofya-58105fd5770e">Sofya İzlenimlerim</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Nereden başladım]]></title>
            <link>https://medium.com/hana-kamer/nereden-ba%C5%9Flad%C4%B1m-caaff48ce6e9?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/caaff48ce6e9</guid>
            <category><![CDATA[yazilim]]></category>
            <category><![CDATA[türkçe]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[medium-turkce]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Tue, 25 Oct 2016 14:18:44 GMT</pubDate>
            <atom:updated>2016-10-25T14:59:20.403Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/698/1*zmrt8Y1YbuNtM-ysNkqbyA.png" /></figure><p>Yeni başlayan biri olarak sık sık nereden başlayabilirim diye soranlar oluyor bu günlerde bana. O yüzden bunun hakkında da kendi başlangıcımı anlatan bir yazı yazmaya karar verdim. Biraz ayrıntıya girebilirim. Amacım bunun aslında hiç bir doğa üstü zeka veya hırs gerektirmediğini sadece biraz cesaret ve sabır gerektirdiğini anlatmak istemem.</p><p>İlk satır kodumu lisanstayken abimin ve annemin zoruyla yazmıştım. Herkesin kod yazmayı bilmesi gerektiğini söylüyorlardı ama benim gözümde çok zor ve korkunç bir şey gibi durduğu için inatla bulaşmıyordum. Daha sonra abim bana php dersleri indirdi ve kafama vura vura başlattı.</p><p>4 video izledim. echo ‘hello world’ yazdım ve php ile olan kısa yolculuğum sona erdi…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*xUmAySegFvjb6hb_4kOxkQ.gif" /></figure><p>Uzun süre yazılım konusu açılmadı. Benim inadım geçti ve lisansın uzatmalarında yazılım kursu buldum kendime. Broşürde yazan hiç bir dilden haberim yoktu. C#, html, css, jquery, asp.net gibi uzunca bir listeden oluşan broşürü aldım kursa başladım. ‘margin’, ‘padding’ en büyük kabuslarım olmuştu ‘vay be margin, padding anlayan insanlar var’ diye düşünüyordum hatta:D Kurs bitti. Sertifikamı aldım. Oooo ben bu sertifikayla neler yaparım dedim. Gözüm gibi korudum sertifikayı. (Şu an cv’mde itinayla saklıyorum o kısmı :D)</p><h4>Lisans sonrası</h4><p>Okumaya doymamış olmalıydım ki bir de üzerine İTÜ’de Moleküler Biyoloji ve Genetik yüksek lisansı yapmaya başladım. Uzun süre yazılım üzerine bir plan yapmadım. Ama laboratuvar ve akademik çirkinlikler canımı sıkmaya başlayınca başka yollar aramaya başladım kendime ve biyoenformatik (biyoinformatik mi biyoenformatik mi olduğuna dair çok tartışma var ben <a href="http://biyoenformatik.blogspot.com.tr/2012/03/biyoinformatik-mi-yoksa-biyoenformatik.html">şuraya</a> bakıp karar verdim) bölgesinde iki gücümü birleştirmeye karar verdim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*87unf7p3LBAAlO_3GLLckw.gif" /></figure><p>. learn English! (tik)</p><p>. learn python! (hmmmm?)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*1vnECcJg0IuzpJ_EKaqiaA.gif" /></figure><p><a href="https://www.codecademy.com/">Codecademy</a>’i buldum.</p><p><a href="https://www.codecademy.com/">Codecademy</a>’de python derslerini bitirdim. Aynı zamanda <a href="https://www.coursera.org/">coursera</a> diye çok güzel derslerin olduğu bir yer buldum. Buradan biyoinformatik, python, R , istatistik derslerine başladım.</p><p>Sonuç? Dağıldım.</p><p>Her şeyden biraz biraz bilmeye başladım ama birleştirebilecek miyim diye paniklemeye başladım. Yalnız başıma yapamayacağımı düşündüm. Tekrar google’a saldırdım ve kendime bu alanda gönüllü staj yapabileceğim yer aramaya başladım. Ahmet Raşit Öztürk hocamı buldum. Kendime bir aylık staj ayarladım. Kayseri’de Genom ve Kök Hücre Merkezi’nde 5–6 kişilik grup geceli gündüzlü sıkı yönetim altında staj yaptık. <a href="https://d3js.org/">D3.js</a> ile burada tanıştım. Blog yazmakla burada tanıştım:)(bunun biyoinformatikle ne alakası var diye epey isyan etmiştim başta), Django ile burada tanıştım. Hocamız bizi full-stack biyoenformatikçi atom karıncalar yapmak istiyordu:) Biz ne kadar yapabiliyorduk bilmiyorum:)</p><h4>O tabağındaki yüksek bitecek!</h4><p>Stajım bitti. İstanbul’a geri döndüm. Tezimi yazmaya başladım. Bu sefer ilk defa kod yazmak çok fena aklıma girmişti ve aslında biyoloji kısmından izole olduğumda biyoenformatikten daha çok zevk aldığımı fark ettim (evet o biyoenformatik olmuyor artık).</p><p>Bu sırada bir bisiklet turunda <a href="https://twitter.com/fthrkl">Fatih Erikli</a> ile tanıştım. Önce onu çamurlu yokuşta fren yaparak öldürmeye çalıştım. Baktım ölmüyor, arkadaş olduk ve Fatih için sihirli kelimeyi söyledim →‘python’. O zaman Fatih bana her sene tekrarlanan <a href="http://ab.org.tr/">akademik bilişim konferansından</a> bahsetti. Kessssinlikle gelmem gerektiğini söyledi.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/291/1*XcvtrlJujcUfQJdCfPWGZQ.jpeg" /><figcaption>akademik bilişim’de son gün çektiğim resim, ‘bitirmeyin la hop’ yazıyor</figcaption></figure><p>Gittim. Benim gibi bir sürü insan gördüm. Meraklı, nereden başlayacağını bilmeyen, hevesli insanlar. Bu işin peşinden koşma kararım güçlendikçe güçlendi.</p><p>Aynı sene <a href="https://kamp.linux.org.tr/2016/">Linux Yaz Kampı</a>’nda Python ve Django ile Web Development sınıfında 2 hafta boyunca süper bir kampa katıldım. (2016&#39;da aynı kampa front end sınıfına eğitmen olarak katıldım)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xytbXjqmMr9hUzbo9i7qkg.png" /></figure><p>Kendime junior pozisyonunda iş aramaya başladım. Gönderdikleri challengeları işe girebilmek için değil de kendimi geliştirmek için kullanmaya başladım. Girdiğim ilk yerde front end development ile tanıştım ve bu sefer burada kaldım:)</p><p>İşe girdikten sonra side-project yapmaya çalıştım hep. Github kültürü ile tanıştım. Yaptığım küçük küçük projelerle orayı hep canlı tutmaya çalıştım.</p><p>Başlangıçta proje fikri bulmakta çok zorlandım (hala da zorlanıyorum). Bu sefer de <a href="https://www.freecodecamp.com/">free code camp</a>’i keşfettim.</p><p>Yaptığım şeylerin sadece front end alanında sınırlı kalmamasına da baktım. Front end development alanından alakasız şeylerle ilgilenirken bir çok ortak kafa yapısı ile karşılaştım ve bu olaylara bakış açımı genişletti.</p><h4>Mini özet</h4><p>Çok çok özetle önerebileceklerim:</p><ul><li>İngilizce öğrenmek</li><li>Google kullanmak ( bildiğiniz konularda bile — how can i start running, how can I start programming, how can I open the door)</li><li>Eventlere gitmek, insanlarla tanışmak, çok insanla tanışmak (illa sizin gibi aynı şeyleri yapmaya çalışan ya da yapmış biri ile tanışırsınız ve bu size yol gösterir)</li><li>Blog yazmak</li><li>Blog okumak</li><li><a href="https://news.ycombinator.com/">hackernews</a>, <a href="http://usepanda.com/">usepanda</a> (kendini anlatıyor zaten), twitter gibi yerleri takip etmek</li><li>Eventlere gitmek:)</li><li>Son olarak da bir sürü işe başvurun. Hem özgüveniniz artar, red aldığınızda hayatın devam ettiğini görürsünüz hem de gönderdikleri challengelar ile bir çok şey öğrenirsiniz.</li></ul><h4>Bana söylenilen ama daha yapmadıklarım:)</h4><ul><li>10 parmak klavye öğrenmek</li><li><a href="http://shop.oreilly.com/product/0636920025832.do">Design patterns</a> kitabını okumak</li><li>MIT’ni <a href="https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00sc-introduction-to-computer-science-and-programming-spring-2011/">opencourseware</a> derslerini bitimek</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=caaff48ce6e9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/nereden-ba%C5%9Flad%C4%B1m-caaff48ce6e9">Nereden başladım</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Raspberry Pi’nin kurulumu ve LAMP sunucusu olarak yapılandırması]]></title>
            <link>https://medium.com/hana-kamer/raspberry-pinin-lamp-sunucusu-olarak-yap%C4%B1land%C4%B1rmas%C4%B1-2c573b7892c3?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/2c573b7892c3</guid>
            <category><![CDATA[yazilim]]></category>
            <category><![CDATA[raspberry-pi]]></category>
            <category><![CDATA[türkçe]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Sun, 28 Aug 2016 13:22:02 GMT</pubDate>
            <atom:updated>2016-08-28T14:08:33.619Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/900/1*xgK6H4Dy4g2D_RSrB6wAiA.jpeg" /></figure><p>Bu hafta ilk defa Raspberry Pi ile uğraştım. Sıfırdan kurulumunu yapıp LAMP server olarak kullanmak üzere yapılandırmasını yaptım. Bu yazıda Raspberry Pi’yi nasıl sıfırdan LAMP sunucusuna çevirebileceğinizi anlatacağım.</p><p>En başta Raspberry’nin modelini öğrenmeniz elinizde ne olup olmadığını bilmeniz açısından yararlı olabilir.</p><p>Raspberry’nin modelini öğrenmek için devre tahtasının üstündeki model bilgisini kullanabilirsiniz(1).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hVDk1JRbJ4o8QdOPuAv0Pw.jpeg" /></figure><p>Ramin büyüklüğünü öğrenmek icin de ana chipin üstünde yazan koda bakıp 2G mi 4G mi içerdiğine bakmamız gerekir.</p><pre><strong>2G: </strong>2Gbit bellek, 256 MB</pre><pre><strong>4G: </strong>4Gbit bellek, 512 MB</pre><p>Bendekinin chipinde 4G yazdığından bu özelliklere uyan Model B Revision 2.0 olduğu anlaşılıyor.</p><h3>Kurulum</h3><p>Raspberry Pi’yi kullanmak için yapmamız gereken ilk şey işletim sistemini kurmak. Bunun icin bootable bir SD card hazırlamak gerekir. (Bu model, boot sırasında flash usb kısmını okumayıp, SD kartı okuduğundan SD kart hazırlamamız gerekir.)</p><p>SD kartı hazılamak için <a href="https://www.raspberrypi.org/downloads/">link</a>e gidip Raspbian işletim sistemini indirebilirsiniz.</p><p>İnen dosyayı açın ve içindeki img dosyasını çıkarın.</p><p>Diğer yandan kullanacağınız SD kartınız fat32 formatında formatlayın. Formatlama işleminden sonra terminalde</p><pre>diskutil list</pre><p>komutu ile bilgisayarınızdaki diskleri listeleyin(1).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4AbaDHlWulco2UWn8Gg84Q.png" /></figure><p>SD kartınızın hangisi olduğunu belirleyin ve onun erişebilirliğini kesin (unmount):</p><pre>diskutil unmountDisk /dev/disk2</pre><p>daha sonra <strong>img dosyasının bulunduğu dizin</strong>e gidin ve :</p><pre>sudo dd bs=1m if=2016-05-27-raspbian-jessie.img of=/dev/<strong>r</strong>disk3</pre><p>komutu ile kopyalama işlemini gerçekleştirin.</p><pre><strong>dd    : </strong>belirtilen dosyayı verilen parametrelere göre formatlayıp kopyalayan komut.<br><strong>bs    : </strong>birim zamanda okuduğu ve yazdığı byte sayısını belirten parametre<br><strong>if    : stdin </strong>yerine dosyadan okuncağını belirten parametre<br><strong>stdin : </strong>standart input<br><strong>of    : stdout </strong>yerine dosyaya yazılacağını belirten parametre<br><strong>r     : </strong>raw (r parametresini eklemeden de aynı işlemi yürütebilirsiniz fakat daha uzun sürer. İkisinin karşılaştırıldığı makaleye <a href="http://serenity.ee/post/82120938429/mac-os-dd-with-devdisk-vs-devrdisk">şuradan</a> bakabilirsiniz)</pre><p>İşlem bittiğinde aşağıdaki gibi özet göreceksiniz</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ulscrdyTN8J-6lBUn6Aqrg.png" /></figure><p>Kopyalama işleminden sonra eject edip SD kartı <strong>SD kart okuyucusu</strong>na yerleştirin. (raspberrynin bu modeli boot sırasında usbyi okumadığından kart okuyucusundan yapmanız gerekir) Klavyenizi, ekranınızı ve SD kart okuyucusunu Raspberry Pi’ye bağladığınıza emin olduğunuzda güç kablosunu bağlayın. Kurulum işlemi hemen başlayacaktır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/446/1*55-86xFnMcg3k_uDD5V5Og.jpeg" /></figure><p>Kurulumu yaptıktan sonra login için ‘pi’ adını ve ‘raspberry’ parolası ile ilerleyebilirsiniz. Parolanızı güvenliğinizi sağlamak için değiştirmeniz gerekir.</p><pre>passwd</pre><p>komutu ile eski ve yeni parolanızı girip değiştirebilirsiniz.</p><h4>İnternet bağlantısı (wifi ile)</h4><p>Önce ağınızdaki kablosuz bağlantıları sıralamak için aşağıdaki komutu terminalden çalıştırın.</p><pre>sudo iwlist wlan0 scan<br>********************************************************************<br><strong>iwlist   : iwconfig </strong>içinde gösterilmeyen kablosuz ağ arayüzü bilgilerini listeler.<br><strong>iwconfig : </strong>kablosuz ağ arayüz yapılandırması<br><strong>wlan0    : </strong>arayüz parametresinin değeri<br><strong>scan     : </strong>Alandaki Access Point ve Ad-hoc hücrelerini listeler</pre><p>Bağlanmak istediğiniz wifiyi belirleyin.</p><pre><strong>ESSID</strong>: ”internet bağlantınızın adı”</pre><pre><strong>IE   </strong>: bağlantının kullandığı güvenlik standardı.</pre><p>İstediğimiz bağlantıya bağlanmak için bunu yapılandırmaya eklememiz gerekir.</p><pre>sudo nano /etc/wpa_supplicant/wpa_supplicant.conf</pre><p>ile wpa-supplicant yapılandırmasını açmış oluruz.</p><p>Bu dosyanın en altına kablosuz bağlantınızın adını ve parolasını girin:</p><pre>network = {<br>    ssid=&quot;wifinizin adı&quot;<br>    psk=&quot;parolanız&quot;<br>}</pre><p>CTRL+X , Y ve son olarak enter ile yaptığınız değişiklikleri kaydedip dosyayı kapatabilirsiniz. Yaptığınız değişikliğin bağlantıya yansımadığını düşünüyorsanız manuel olarak arayüzü baştan başlatabilirsiniz:</p><pre>sudo ifdown wlan0</pre><pre>sudo ifup wlan0</pre><p>Diğer seçenek Raspberry’i reboot etmeniz:</p><pre>sudo reboot </pre><p>Bağlanıp bağlanamadığınızı kontrol edebilirsiniz:</p><pre>ifconfig wlan0 </pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FoDI10zHv5ORx6Opb1VaxQ.png" /></figure><p>Gelen veride ‘inet addr’ bölümü olup olmadığını kontrol etmeniz gerekir.</p><p>İnternete bağlandığınızdan emin olduktan sonra işletim sisteminizin ve paketlerinizin güncel hale getirmeniz gerekir:</p><pre>sudo apt-get update</pre><pre>sudo apt-get upgrade</pre><p>Raspberry Pi’yi kullanıma hazır hale getirmiş olduk. Artık ikinci aşamaya geçebiliriz.</p><h3>LAMP server kurulumu</h3><pre><strong>LAMP sunucusu  : </strong>web servisi çözümlerinde kullanılan ve bir platformu her yönü ile karşılamak için gerekli yazılım setlerinin birleşmesiyle oluşan yazılım stacklerinden biridir. Oluştuğu birimlerin baş hariflerinden alıyor adını (Linux, Apache, MySQL ve PHP)</pre><h4>Statik IP</h4><p>Yapılandırmaya Pi’ye sabit bir IP adresi vermekle başlayacağız. Bu neden gerekli? Evde kullandığımız ip adresler genelde sabit adresler değil, belli bir aralığa düşer. Ağa yeni bir bilgisayar eklendiği anda router ona da yeni bir ip verir. Bir alet ağdan koptuğu zaman ip’si boşa düşer ve bir sonra bağlanan alete bu ip verilir.</p><p>Static IP bunun aksine değişmeyen IP’dir. Bilgisayar kullanacağı adresleri belirler ve bunları routera söyler.</p><p>Raspberry’nin kullandığı <strong>DHCP</strong> adresini görmeniz için:</p><pre>ifconfig</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kF8gTacL3HARybGxW2--PQ.png" /></figure><pre><strong>DHCP     : </strong>Dynamic Host Configuration Protocol, yukarıda bahsettiğimiz routerın dinamik ip verme protokoludur. Network yönetici (administrator) ihtiyacını azaltmak üzere bilgisayarların IP isteklerini otomatik olarak cevaplayarak bu işlemi DHCP sunucusu üzerinden otomatize eder. Bu sunucunun olmaması durumunda IPlerin statik olarak belirlenmesi gerekir.</pre><pre><strong>inet addr</strong> : raspberry&#39;nin şuanki adresi</pre><pre><strong>bcast</strong>     : yayın adresi, ağlar arası iletişim sırasında verinin belli bir ağa bağlı bütün bilgisayarlara gönderilmek istendiğinde kullanılan özel bir adrestir.</pre><pre><strong>mask</strong>      : IP adresini <strong>subnet</strong>lere bölüp uygun hostları belirlemek için kullanılan 32-bitlik gösterimdir. Bir netmaskda 2 bit otomatik olarak atanmış olur. Bunlardan biri 255.255.225.0&#39;da yer alan 0; atanmış olan network adresi, ikicisi de 255.255.255.255&#39;deki yayın adresi olan 255&#39;dir. Bu iki bit her zaman atanmış olur ve kullanılamaz.</pre><pre><strong>subnet   :</strong> IP adresinin mantıksal altyapılara bölünmesidir. Bu işlem, bir alt ağda (subnet) yer alan bütün aletlerin birbirleri ile iletişimde bulunmasını, aynı zamanda da alt ağların da birbirleri arasında veri alışverişinde bulunmasına izin verir.</pre><p>Yapılandırma için edinmemiz gereken bir kaç veri daha var:</p><pre>netstat -nr</pre><pre>************************</pre><pre><strong>-r       : </strong>IP routing tablosunun içeriğinin gösterilmesini söyler.<br><strong>-n       : </strong>netstat komutunun, adresleri;  sembolik host ve network isimleri olarak değil de noktalarla ayrılmış IP adresleri olarak göstermesini belirtir.</pre><p>Bu komut ile sistemdeki butun network bağlantılarını listelemek için kullanılır. Sadece bağlı olanları değil dinlemede olup bağlanacak olan networkleri de listeler.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uwrU8D5iKSwwfprTWGzBcQ.png" /></figure><pre><strong>gateway     : </strong>Bütün trafiğin üzerinden geçtiği router IP adresi</pre><p>Şimdi bu topladığımız verileri kullanarak gerekli yapılandırmayı yapmalıyız. Yapılandırmayı<strong> dhcpcd.conf</strong> dosyasında yapacağız.</p><pre><em>sudo nano /etc/dhcpcd.conf</em></pre><p>Dosyanın en altına ethernet mi yoksa wifi arayüzü için yapılandırma yaptığımızı belirttikten sonra ayarlarımızı girmemiz gerekir.</p><pre>interface wlan0</pre><pre>static ip_address=192.168.0.10/24<br>static routers=192.168.1.1<br>static domain_name_servers=192.168.1.1</pre><pre><strong>interface</strong>         : Hangi network arayüzü için yapılandırma yaptığınızı belirtir.<br><strong>static ip_address</strong> : Atamak istediğiniz sabit IP (Sonuna /24 eklediğinizden emin olun. Bu kısım network büyüklüğünü belirtir.)<br><strong>static routers</strong>    : Gateway’in IP adresi <br><strong>static domain_name_servers</strong> : DNS’inizin (Domain Name System) IP adresi</pre><p>Raspberry’i reboot ettikten sonra IP’yi tekrar kontrol edersek ayarladığımız IP’de olduğunu görürüz.</p><pre>Eğer Raspberry Pi ye ssh ile kendi bilgisayarınızdan bağlanmak isterseniz önce Raspberry&#39;nin terminalinden &#39;hostname -I&#39; komutu ile kullandığı IP&#39;yi bulabilirsiniz.<br>Daha sonra bu IP&#39;yi bilgisayarınızın terminalinde</pre><pre>ssh <strong>pi</strong>@&lt;IP&gt;</pre><pre>komutu ile kullanırsanız Raspberry&#39;e ssh ile bağlanmış olacaksınız. Buradaki &#39;pi&#39; Raspberry&#39;deki user adı.<br></pre><h4>İnternetten ulaşılabilirlik</h4><p>Sunucuyu internete ulaşılır şekle nasıl sokabiliriz?</p><p>Evden kullandığımız yerel networkumuzde olan IP adresi özel IP adresi aralığına sahiptir. Öyle ki internetten ulaşılması imkansızdır. Bunun yerine ISP(Internet Service Provider) router tarafından kullanılacak tek dinamik ip adres sağlar. Internetteki trafiğin Raspberry’e akışının mümkün olabilmesi için bu IP adresinin routerdanmış gibi gözükmesi gerekir. Bu işleme Network Address Translation (NAT) denir.</p><p>Geçiş izninin olması gerektiği port 80 (http)dir. bilgisayara internet aracılığı ile login olmak isterseniz o zaman port 22 (ssh) den geçiş izni olmalı.</p><p>Bunu yapmak için routerınızın ayarlarını izlemeniz gerekir. Benimki Huawei markası . Temel ayarlardan dsl internetin bagli oldugunu kontrol ettikten sonra gelişmiş ayarlardan NAT sekmesine gelip onun altındaki port eşleştirme sekmesinde açmak istediğimiz iki portun değerini (22 ve 80) yazıp gönderiyorsunuz. Portlarınızın açılıp açılmadığını <a href="http://portchecker.co/">http://portchecker.co/</a> linkinden bakabilirsiniz. Açılmadıysa güvenlik duvarını düşüğe çekerek tekrar deneyin.</p><p>Bu aşamaya kadar Raspberry’nin IP’sini sabitledik ve sunucumuzu internete ulaşılabilir yapmak için routerımızda iki port açtık.</p><h4>Web sunucusu</h4><p>Sırada <a href="https://httpd.apache.org/">apache</a> web sunucusunun kurulumu var.</p><pre>apache2 linux isletim sistemlerinde yaygın olarak kullanılan Web sunucusudur. Web sunucusu, kullanıcı tarafında yapılan istek karşılığında gönderilecek web sayfasının tutulduğu/sunulduğu sunucudur. Kullanıcı istek yollarken ve gelen cevabı görüntülerken tarayıcıyı kullanır.</pre><p>Kuruluma baslamadan önce sistemimizin güncel olmasına dikkat göstermeliyiz. apt-get update ve update ile son güncellemeleri çekebiliriz.</p><pre>sudo apt-get install apache2</pre><h4>Veri tabanı sunucusu</h4><p>Web sunucusu icin gerekli yazılımı indirdikten sonra veri tabanı sunucusu olarak kullanacağımız mysql-serveri da indirelim.</p><pre>Burada sunucu derken sunucunun iki farklı alanda kullanılabileceğine değinmek istiyorum. Bir, makina olarak adı sunucu olan bilgisayar; ikinicisi de farklı içeriğin sunulmasından sorumlu olan yazılımlar; web sunucu, database sunucu, mail sunucu vs.</pre><h4>php</h4><p>Mysql-serveri yükleme işlemi de bittikten sonra php’yi ekleyebiliriz. Işletim sistemini yüklerken beraberinde Perl ile geldigi icin Perl i atlayabiliriz.</p><pre>sudo apt-get install php5</pre><p>ile php 5 i yükleyelim.</p><p>php’nin mysqle ulaşabilmesi için gerekli kütüphanelerin kurulumu için de:</p><pre>sudo apt-get install php5-mysql</pre><p>Kurulumunuzu test etmek için tarayıcınızdan Raspberry’e verdiğiniz IP adresini girerseniz çalıştığını belirten bir karşılama sayfası açılmalı:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/802/1*vQCcLw2hd1x3QMPl7CT57Q.png" /></figure><p>Evet…</p><p>Hissi biraz şunu andırabilir…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/650/1*Jwp3yJOmU9pDAXEtOZGT0Q.gif" /></figure><p>Referanslar <a href="http://www.makeuseof.com/tag/static-ip-address-advantages-disadvantages/">1</a>, <a href="https://www.element14.com/community/community/raspberry-pi/raspberrypi_projects/blog/2014/02/24/raspberry-pi-as-a-lamp-server">2</a>, <a href="http://www.penguintutor.com/linux/raspberrypi-webserver">3</a>, <a href="https://www.raspberrypi.org/">4</a>, <a href="https://help.ubuntu.com/lts/serverguide/httpd.html">5</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2c573b7892c3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/raspberry-pinin-lamp-sunucusu-olarak-yap%C4%B1land%C4%B1rmas%C4%B1-2c573b7892c3">Raspberry Pi’nin kurulumu ve LAMP sunucusu olarak yapılandırması</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Linux Yaz Kampı 2016]]></title>
            <link>https://medium.com/hana-kamer/linux-yaz-kamp%C4%B1-2016-657b08f6abd7?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/657b08f6abd7</guid>
            <category><![CDATA[yazilim]]></category>
            <category><![CDATA[türkçe]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Tue, 23 Aug 2016 15:02:37 GMT</pubDate>
            <atom:updated>2016-08-23T16:11:51.716Z</atom:updated>
            <content:encoded><![CDATA[<p>Geçen sene Python-Django sınıfında öğrenci olarak katıldığım Linux Yaz Kampı’na bu sene Front End sınıfında <a href="https://twitter.com/monrcelik">Onur Çelik</a> ile eğitmen olarak katıldım. En temelden bir giriş yaparak bu alanda kullanılan teknolojiler hakkında bildiklerimizi aktarmaya çalıştık.</p><p>Tarayıcıların nasıl çalıştığına değindikten sonra HTML ve CSS’den bahsettik. Uygulama kısmı için seçtiğimiz bir tasarımı kodladık. Yeri geldi editörü HTML’in sıkıcılığından uzaklaştırmak için tahtayı editörümüz yaptık.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/423/1*5gHI3vjVfaFrtiT7K3wxgg.jpeg" /></figure><p>Kampın tatil günü bisikletle tura çıktık ve Bolu’daki travertenlere ayaklarımızı bandık. Sonra doğaçlama bir şekilde ormandan geçen bir yoldan turumuza devam ettik. Tekrarlanılası bir rota. (merak edenlere <a href="https://www.strava.com/activities/672456198">link</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/378/1*piFepwbRlfKSyJNRqylxBA.jpeg" /></figure><p>Bir gün ara verdikten sonra Javascript’e geçtik. Hafta sonunda <a href="https://twitter.com/fthrkl">Fatih Erikli</a>’nin Django sınıfına sınıfın ikinci eğitmeni, <a href="https://twitter.com/onurmatik">Onur Mat</a> gelene kadar desteğe ve HTML, CSS anlatmaya geçtim. Benim yokluğumu kapatmak için <a href="https://twitter.com/neoberg">Burak Can</a> ve <a href="https://twitter.com/azizarsl">Aziz Arslan</a> da Front End sınıfına geldi:P Ben orda yoktum ama duyduğuma göre baya iyi şeyler dönmüş. callbackler, event looplar …</p><p>Javascript’e geldiğimizde uygulamalarımız daha eğlenceli bir hal aldı:) Sayaç, hava durumu uygulaması, film listeleme gibi basit uygulamalarla istek yollama ve temel javascript işlemlerini pekiştirdikten sonra modern javascript araçlarından bahsettik. Bir gün Django sınıfı ile çimlerde ortak ders yaptık ve Fatih <a href="http://www.slideshare.net/lahavlevelaislabonita/dugumkume-42428350">Graph Veritabanı NEO4J</a>’den bahsetti.</p><p>Son olarak herkesin beklediği konuya, Angular’a geldik ve insanları sakinleştirdik:D Angular’ın genel işleyişinden bahsettikten sonra daha önce framework kullanmadan yaptığımız uygulamaları bu sefer Angular ile yaptık. Alış veriş sepeti ve imdb klonu iki uygulama ile dersi sonlandırdık.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mdqLBKfiqVueYrHIN0onQw.jpeg" /></figure><p>Yaptığımız uygulama örneklerini <a href="https://github.com/monrcelik/lyk2016-js">github’da</a> bulabilirsiniz.</p><p>Ders bitiminden sonra sınıfımız bize pasta alarak tatlı bir süpriz yaptı. Projektörle de ekrana sağdan sola kayan TEŞEKKÜRLER yazısı ile desteklemişlerdi süprizlerini. Bu efekti nasıl yaptıklarını söylemeyeceğim, lyk2016 sırrı olarak kalsın:) Nazik jestleri için teşekkürler tekrardan:)</p><p>Bunun dışında Doruk Fişek’in kampta olduğu günler öğle arasında max kaç kişi yoğurtlu gözleme yemeye gidecek gibi challangelar edindik. Sanırım 18 kişiyi geçemedik. Sıradaki kamplara bakacağız artık.</p><p>Bazı günler konferans yapsak nasıl olur diye bir deneme sürüşü yapıldı:) Barış ile başladı Barış ile bitti. Herkes sınıflarını sakinleştirdikten sonra yapmama kararı alındı bu senelik. Sıradaki kamplara bakacağız artık:)</p><p>Bu sene çok güzeldi. Seneye daha da güzel bir kampta görüşmek üzere.</p><blockquote>mini özet :</blockquote><blockquote>Çardak, yoğurtlu gözleme, çim-çekirdek, çim-fiskiye, çamaşır makinası yok mu?, arabaya sığar mıyız?, acıkan var mı?, çay, hırka var mı hırka?, kütük ev, kedi arkanda/kedi kaçtı, anahtarı versem sınıfı açar mısın?, karpuz, kirpi, şırdan, patatesli gözleme kimin?, alo Yaşar…</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=657b08f6abd7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/linux-yaz-kamp%C4%B1-2016-657b08f6abd7">Linux Yaz Kampı 2016</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Angular’ın perde arkası (1.x)]]></title>
            <link>https://medium.com/hana-kamer/angular%C4%B1n-perde-arkas%C4%B1-1-x-9beaa5b7355b?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/9beaa5b7355b</guid>
            <category><![CDATA[yazilim]]></category>
            <category><![CDATA[angularjs]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Wed, 11 May 2016 17:18:29 GMT</pubDate>
            <atom:updated>2016-05-15T13:13:31.923Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*IzMXUeiZc4yPoOzzfwN-Sg.png" /></figure><p>Yazılarımda amaçladığım şey, yeni öğrendiğim şeyleri tazeyken anlatıp en temeline kadar araştırmak. Bu yazımda da Angular 1.x ‘in nasıl çalıştığından ve temelinden bahsedeceğim. Her ne kadar Angular 2 çıkıyor olsa da Angular 1.x’e hemen sırtımızı dönemeyiz:)</p><p>AngularJS başlıca Google ekibi tarafından geliştirilen açık kaynak bir JS frameworkudur. MVC mimari yapısını sunar, declerative bir yaklaşım izler, moduler yapılarda yazılmayı destekler ve test aşamasını kolaylaştırır.</p><p>SPAlarda (Single Page Application) amaç, model state indeki değişikliği algılamak. Buradaki her değişiklik DOM’un yenilenmesi, re-render ve reflow gibi ağır işlemleri tetikler. Bunu her model değişitiğinde yapmaktansa değişiklikleri biriktirip belli aralıklarla tetiklemek verimliliği arttırır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dUpn4rHezV2smeMoysZD6A.png" /></figure><p>Angular MEAN stackın frontend bölümünde yer alır.</p><p><strong><em>Software stack:</em></strong><em> Bir app oluşturmak için ihtiyaç duyulan bütün altyapı ve componentleri tek bir platformda birleştiren yazılım yapısıdır.</em></p><p><strong><em>MEAN stack: </em></strong><em>Dinamik web app yapmak için kullanılan JS software stack. Elemanları:</em></p><ul><li><em>MongoDB</em></li><li><em>Express.js</em></li><li><em>Angular.js</em></li><li><em>Node.js</em></li></ul><p>AngularJS, UI ların yazılmasında <strong>declerative</strong> programlama prensibinin kullanılması gerektiğini savunan felsefe üzerine geliştirilmiştir.</p><ul><li><strong><em>Declerative </em></strong><em>programlamada sadece ne yapmak istenen yazılır, fakat yolu belirtilmez.</em></li><li><strong><em>Imperative </em></strong><em>programlamada yapmak istenen işlemler adım adım belirtirtilir.</em></li></ul><h3>Angular, değer değişikliklerini data modelini yenileyecek şekilde nasıl algılar?</h3><p>Angular’ın bunu nasıl yaptığını anlamak için <strong>$scope</strong>, <strong>$watch</strong>, <strong>$digest</strong> ve <strong>$apply</strong> terimlerini anlamak gerekir.</p><h4>$scope</h4><p>Bilgisayar biliminde <strong>scope</strong>, bir ismin bir oluşum ile ilişkilendirilebildiği (bir değişkenin, programın bağ kurulabilen kısmını oluşturması gibi) yer olarak tanımlanır.</p><p>Angular’da <strong>scope</strong>, app’in içinde yer alan değişken ve fonksiyonlara sahip olan objedir. <strong>Controller</strong> ve <strong>View</strong> arasında köprü görevi görür.</p><h4>$watch</h4><p><strong>View</strong> katmanına bir değişken bağladığınız anda AngularJS bir ‘<strong>watch</strong>’ oluşturur. <strong>Watch</strong>, AngularJS’in <strong>$scope</strong> objesindeki değişkenlerin değişimlerinin izlenmesini sağlar.</p><h4>$digest</h4><p><strong>Digest </strong>döngüsü, belli aralıklarla çalıştırılan bir koddur. Buradaki amaç sık sık ve gereksiz olarak tekrarlanmasını istemediğimiz ağır görevleri birleştirip öyle çalıştırmak. Bu görevlere örnek olarak DOM rendering, reflow /layout işlemlerini verebiliriz.</p><p><strong>Digest</strong> döngüsünü, bir Angular App’inin durmadan atması gereken kalbine benzetebiliriz. Zira bu döngünün durması, Angular’ın hiç bir değişikliği algılamamasına neden olur.</p><p><strong>Digest</strong> döngüsü, bulunduğu <strong>scope</strong> ve çocuklarının <strong>watchExpression</strong>larını işler, bütün <strong>watch</strong>ları tek tek geçerek değişime uğramış değişken var mı diye kontrol eder. <strong>watchExpression’</strong>da şuan bulunan değer ile bir önceki değer karşılaştırılır. Değerler aynı değil ise ‘<strong>dirty</strong>’ olarak işaretlenir.</p><h4>watchExpressions</h4><p>Her <strong>$digest</strong> döngüsü içerisinde <strong>watchExpression</strong> var. <strong>wacthExpression</strong>, her döngüde o an izlemekte olduğu değeri döner(dirty checking).</p><p>Eğer şu anki ve önceki değer aynı değil ise karşılık gelen listener tetiklenir.</p><p><strong><em>listener:</em></strong><em> Belli bir aksiyondan sonra tetiklenmesi istenen belirli fonksiyonlar vardır. Bu fonsiyonların, kendilerini tetikleyecek olan aksiyonu beklemesine ‘listen’ (dinlemek) denir.</em></p><p>Bir listenerın tetiklenmesi ile <strong>model</strong>de oluşan değişiklik başka listenerlerın tetiklenmesine sebep olabilir. Bu nedenle watcherlar yeni watcher oluşumu durana kadar tekrar tekrar çalıştırılır.</p><h4>$apply</h4><p>Bunu Angular dünyası ile dış dünya arasındaki bağlantı servisi olarak düşünebiliriz. <strong>$apply</strong>, <strong>$digest</strong> metodunu çağırır.</p><p>Tarayıcının DOM eventleri Angular’ın dışından tetiklendiği zaman <strong>$apply</strong> kullanılmalı (JQuery gibi third party kütüphaneleri kullanacağınız zaman Angular’ın bunlar aracılığı ile oluşan değişimleri izleyebilmesi için apply metoduna gömmeniz gerekir ki Angular bunlardan haberdar olsun.).</p><h3>Özet</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/397/1*pS3xYDDyRQymYu17f_rlzg.jpeg" /><figcaption>resim kaynağı için <a href="http://techiejs.com/Blog/Post/Understanding-The-AngularJS-Digest-Loop">link</a></figcaption></figure><p>Artık bu 3 terimi tanımladıktan sonra süreci şöyle özetleyebiliriz:</p><ul><li>UI’a değişken bağladığınız anda bu değişken<strong> watcher</strong> ratafından izlenmeye başlanır.</li><li>Angular, $scope.$digest() fonksiyonunu çağırır ve <strong>$digest </strong>döngüsünü başlatır.</li><li>Döngü sırasında bütün<strong> watcher</strong>lar kontrol edilir.</li><li>Değişkenlerde değişiklik varsa ‘<strong>dirty</strong>’ olarak işaretlenir; yoksa döngü tekrarlanır ve değişen <strong>watcher</strong> var mı diye kontrol edilir.</li><li>Değişen <strong>watcher</strong> yoksa listener tetiklenir, varsa döngü tekrarlanır.</li><li>Döngü en az 2, en fazla da 10 defa tekrarlanır ki sonsuz döngüye girmek engellensin.</li></ul><h3>Nasıl çalışır?</h3><p>Angular’da karşımıza çıkan temel konseptleri inceledim bu bölümde.</p><p>Angular frameworkunun çalışma prensibine göre Angular, önce HTML sayfasını okur ve HTML tag özelliklerini input ve outputlar ile ilişkilendirilmiş direktifler olarak yorumlar.</p><h4>HTML derleyici</h4><p>Anguların HTML derleyicisi tarayıcıya yeni HTML yazım şekli (syntax) öğretir. Bu derleyici HTML elemanlarına davranış bağlayarak özelleşmiş HTML elemanları ve özelliklerinin oluşmasını sağlar. Angular, bu davranış uzantıları olan elemanlara direktif adını verir.</p><p>Derleyici iki işlem gerçekleştirir:</p><ol><li><strong>derleme:</strong> Bütün DOM’u yukarıdan aşağı tarayarak direktifleri toplar ve sonuçta bir <strong>linking</strong> fonksiyonu oluşturur.</li><li>Bütün <strong>direktifler</strong> toplandıktan sonra bunlar önceliklerine göre sınıflandırılır.<br># tek bir DOM elementine bağlı birden fazla <strong>direktif</strong> bulunması durumunda bunlar önceliklerine göre işlenir</li><li><strong>link:</strong> Topladığı direktifleri <strong>scope</strong>’a bağlayarak canlı <strong>View</strong> oluşturma. Canlı olmasından anlaşılacağı üzere scope <strong>Model’</strong>de yapılan değişiklikler <strong>View’</strong>da hemen yasıtılır ve aynı şekilde <strong>View’</strong>da yapılan değişiklik de scope modeline yansıtılır. DOM’un listenerlar ile, scope’un da $watch ile ayarlanıp ikisinin birbiri ile senkonize halde tutulmasıdır.</li></ol><h4>Module</h4><p>Module, Angular app’ı parçası olarak tanımlanabilir.</p><h4>Direktif (Directive)</h4><p>DOM’un işlenmesi için kullanılan kod parçaları olarak tanımlanırlar. Bunlar DOM elemanlarında yer alan ve Angular’ın HTML derleyicisini hedef alan işaretlerdir. Derleyici, <strong>direktif</strong> ile kaşılaştığında; Angular’a, bulundugu eleman için tanımlanmış olan davranışın atanmasını söyler. Başka bir deyişle <strong>direktif</strong>, DOM’da derleyici ile karşılaştığında çalıştırılan fonksiyondur.</p><p>Direktifler HTML elemanlarının isimlerinde, class isimlerinde, özelliklerinde ve yorumlarında yer alabilir.</p><p>Angular’ın önceden tanımlanmış direktifleri olduğu gibi kendimiz de custom direktif ekleyebiliriz.</p><p>Angular 1.5 ile beraber <strong>Component</strong> yapısı Angular 1.x e girmiş oldu. <strong>Component</strong>lar <strong>direktifl</strong>erin özel bir çeşidi olup, daha basit bir yazım şekline sahiptir. <strong>Component</strong>e dayalı yapı oluşturmayı kolaylaştırır ve DOM’a müdahale etme hedefiniz olmadığı sürece <strong>component</strong> kullanımı önerilir.</p><h4>Servis</h4><p><strong>Servisler</strong>, obje dönen callback fonksiyonlardır. Bunlar app’in farklı katmanlarında aynı dataya ulaşımasını ve değiştirilebilmesini sağlar. <strong>Servisler</strong>, <strong>direktif</strong>, <strong>controller</strong> ve <strong>filtreler</strong> tarafından kullanılabilir. Bu şekile kod moduler yapısını korur ve sorumlulukların ayrıştırılması (separation of concerns) felsefesine bağlı kalır.</p><p>Sonuç olarak domainler arası data paylaşmak istediğimizde <strong>servis</strong> kullanmak kodun temiz ve moduler kalmasını destekleyen bir yaklaşım olur.</p><h4>Controller</h4><p><strong>Controller</strong>, model datasının <strong>$scope</strong> aracılığı ile <strong>View</strong>’a bağlanmasından sorumludur. Ancak datanın çekilmesi ve değiştirilmesi aşamasından sorumlu değildir. Bunun için <strong>servisler</strong> kullanılır.</p><p>Angular’da <strong>controller</strong>, Angular <strong>scope</strong>’unu genişletmek için kullanılan constructor fonksiyonu olarak tanımlanır.</p><p><strong><em>constructor fonksiyonu</em></strong><em>: Javascrip’de </em><strong><em>yeni obje oluşturmak</em></strong><em> için ‘new’ ile çağrılan fonksiyonlardır. Aynı özellik ve metodlara sahip benzer objeler oluşturmak için kullanılırlar.</em></p><p><strong>Controller</strong>, ng-controller <strong>direktifi</strong> kullanarak DOM’a bağlandığında; Angular, tanımlanan <strong>Controller</strong>’ın constructor fonksiyonu ile yeni bir <strong>Controller</strong> objesi oluşturur.</p><p>Örnek olarak bir Controllerı şöyle oluşturabiliriz:</p><pre>var myApp = angular.module(&#39;myApp&#39;,[]);</pre><pre>myApp.controller(&#39;MainController&#39;, [&#39;$scope&#39;, function($scope) {<br>  $scope.greeting = &#39;Hello Angular!&#39;;<br>}]);</pre><p>Bu <strong>Controller</strong>’ın ‘greeting’ özelliği ‘Hello Angular!’ değerine sahip olsun.</p><p>Bu <strong>Controller</strong>’ı DOM’a bağlamak istersek:</p><pre>&lt;div ng-controller=&quot;MainController&quot;&gt;<br>  {{ greeting }}<br>&lt;/div&gt;</pre><p>şeklinde ng-controller <strong>direktifi</strong> aracılığı ile C<strong>ontroller</strong> bağlanır. Böylece artık MainController’da yer alan ‘greeting’e ulaşabiliriz.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9beaa5b7355b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/angular%C4%B1n-perde-arkas%C4%B1-1-x-9beaa5b7355b">Angular’ın perde arkası (1.x)</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tarayıcılar Nasıl Çalışıyor 2/2]]></title>
            <link>https://medium.com/hana-kamer/taray%C4%B1c%C4%B1lar-nas%C4%B1l-%C3%A7al%C4%B1%C5%9F%C4%B1yor-2-2-6e32fc8034ea?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/6e32fc8034ea</guid>
            <category><![CDATA[türkçe]]></category>
            <category><![CDATA[yazilim]]></category>
            <category><![CDATA[web-development]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Sat, 30 Apr 2016 15:47:18 GMT</pubDate>
            <atom:updated>2016-06-28T08:00:18.297Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*VNfnu2CBBngL-EiuB_TFgg.jpeg" /></figure><p>Bu serinin ilk bölümünde HTML parsing ve Render Tree’nin nasıl oluştuğunu, render tree ve dom arasındakı farkları anlatmıştım. Bu seride önce, ilk seride yer alması gereken CSS parsing’den bahsedeceğim ve daha sonra kaldığım yerden devam edeceğim.</p><h4>CSS parsing</h4><p>CSS, HTML’den farklı olarak ‘context-free’ bir dildir. Webkit, Flex ve Bison parser yaratıcılarını kullanarak CSS gramer dosyalarından otomatik olarak parser oluşturur. Bison, aşağıdan yukarı yani shift reduce parser oluşturur.</p><p><strong>Shift reduce parser:</strong> Bu parsing işleminde parse tree (parçalama ağacı) dallardan başlayıp köke doğru ilerlerleyerek oluşturulmaya başlanır.</p><p>Firefox el ile yazılmış, yukarıdan aşağı çalışma mantığına sahip bir parser kullanır. Sonuç olarak parçalama işlemi sonucunda bir stylesheet objesi oluşturur.</p><h4>Scriptlerin ve Stylesheetlerin işlenme sırası</h4><p>Web, senkron bir şekilde çalışır. Parser &lt;script&gt; tagına vardığında, parse etme işlemi script çalıştırılana kadar duraksar. Scriptin uzak bir kaynaktan gelecek olması durumunda yine script temin edilene kadar parse işlemi duraksar. Ancak ‘defer’ özelliği ile bu duraksama engellenebilir. Bu durumda dosyanın tamamı parse edilmeden script çalıştırılmaz.</p><p>Diğer taraftan stylesheetler, DOM ağacını değiştirmediklerinden parse işlemi sırasında hataya sebep olur. Bu tür hataları önlemek adına Firefox ortada parse edilecek stylesheetler varken scriptleri engeller. Webkit ise sadece stillere ulaşmaya çalışan scriptleri engeller.</p><h4>Stillerin Hesaplanması</h4><p>Render Tree’nin oluşturulması için her render objesinin görsel özellikleri hesaplanmalı. Bu da stil özellikleri hesaplanarak yapılır.</p><p>Stylesheet parse edildikten sonra kurallar, seçicilere bağlı olarak birkaç farklı hash map’e eklenir. Mapler id, class adı, tag adı ve bunların hiç birine giremeyen genel bir map olmak üzere kategorilenir. Örneğin, seçici id ise kural, id map’e eklenir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/715/1*DRcN7ecOa6JDJKkQ3Xp_2A.png" /></figure><blockquote><strong>Stylesheet </strong>(stil şablonları): kurallar bütünü.<br><strong>Kural:</strong> selector ve declaration block.<br><strong>Declaration block:</strong> deklarasyon grubu.<br><strong>Declaration: </strong>özellik ve değer</blockquote><p>Seçici, dosyadaki elemanlarla eşleşir. Buna ‘match’ denir.</p><p>Kurallar, eşleşen elemanlar için geçerli.</p><p>Style rules için birden fazla kaynak olabilir:</p><ul><li>CSS kuralları (external olarak veya style elemanları içinde)</li><li>Inline style özellikleri</li><li>HTML görsel özellikleri</li></ul><p>Son iki durumda eleman ve stil eşleştiği için match edilmesi kolay olur.</p><p>Sayfadaki stillerin farklı kaynakları vardır. Bunları şöyle sıralayabiliriz:</p><ul><li>Sayfa kaynağı</li><li>Kullanıcı</li><li>Tarayıcıların varsayılan stylesheetleri</li></ul><p># Örnek olarak Chrome ve Firefox’un varsayılan stylesheetlerine buradan ulaşabilirsiniz: <a href="http://trac.webkit.org/browser/trunk/Source/WebCore/css/html.css">Chrome default style sheet</a>, <a href="http://hell.meiert.org/core/css/firefox-3.6.3.css">Firefox default style sheet</a>. Bütün tarayıcıların varsayılan stylesheetlerinin listesine <a href="http://meiert.com/en/blog/20070922/user-agent-style-sheets/">şuradan</a> bakabilirsiniz.</p><blockquote>Bu noktada reset-css’den bahsetmek istiyorum. Tarayıcıların varsayılan cssleri developerın oluşturduğu sayfanın farklı tarayıcılarda farklı görünmesine sebep olur. Bunun üstesinden gelmek için reset-css kullanılabilir. Reset-css, HTML’in bütün “type selector”lerini içerir ve bunların değerlerinin tarayıcılar arasında sabitlenmesini sağlar. (type selector: HTML düğümlerini seçebilen seçicilerdir.)</blockquote><blockquote>normalize.css (bütün seçicilerin özellikleri belli bir değer alır)</blockquote><blockquote>reset.css (bütün seçicilerin özellikleri sıfırlanır)</blockquote><p>Firefox’da rule tree (kural ağacı) ve stil context yapısı var.</p><p>Stil context, hesaplanan son değerleri içeren yapı; rule tree ise eşleşen kurallardan oluşturulan ağaçtır.</p><p>Belli bir eleman için stil contexti hesaplanırken o elemanın kural ağacındaki yeri belirlenir, yoksa da ağaca eklenir. Daha sonra bu yapıdaki kurallar uygulanmaya başlanır. Ağacın en altındaki düğümden ağacın üst kısımlarına doğru ilerlenir. En altta yer alan düğümlerin seçicilikleri en yüksektir. Eşleştirmek istenilen path tam olarak karşılığı bulunana kadar ağaç yukarı doğru taranır.</p><p>Bir özellik ve elemanın son değerleri hesaplanırken geçilen aşamaları şöyle sıralayabiliriz:</p><ol><li>Hiç bir kuralın eşleşmemesi durumunda özelliğin inherited veya reset özelliği olup olmamasına bakılır. Inherited ise üst elemanın (parent) değerini alır; reset ise varsayılan (default) değerini alır.<br>inherited:<br>. ‘font-size’, ‘color’ vs<br>reset:<br>. ‘border’, ‘background’ vs.</li><li>Bir kuralın eşleşmesi durumunda, o kuralın değeri kullanılır.</li><li>Birden fazla kuralın eşleşmesi durumunda ‘cascade’ neyin kullanılacağına karar verir.</li></ol><p><strong>cascade:</strong> Kuralların uygulanma sırası.</p><p>Cascade sırasında kurallar belli önceliklere göre sınıflandırılır.</p><p>Bu öncelik sıralaması şöyle:</p><ul><li>kaynak</li><li>seçicinin seçiciliği</li><li>sıra</li></ul><p><strong>Kaynak</strong></p><p>Kaynağa bağlı uygulanma önceliği:</p><ol><li>tarayıcı</li><li>kullanıcı</li><li>yazar normal</li><li>yazar important</li><li>kullanıcı important</li></ol><p>Bu sıralamaya göre tarayıcı deklarasyonları en önemsiz olanıdır.</p><p><strong>Seçicilik</strong></p><p>Kaynak önceliği seviyesinin aynı olması durumunda seçiciliğe ve sonrasında seçildikleri sıraya bakılır. HTML görsel özellikleri, denk geldikleri css deklarayonlarına çevrilirler ve yazarın düşük öncelikli kuralları kadar önceliğe sahip olurlar.</p><p>Bir seçicinin spesifikliği CSS2 dokumantasyonuna göre şöyle hesaplanır:</p><p>Seçicilerin a, b, c, d değerlerinin birleştirilmesi ile elde edilen spesifiklik değeri dikkate alınır.</p><p>a = deklarasyon, seçici olan bir kural değil de, &lt;style&gt;&lt;/style&gt; tagları arasında tanımlanmış ise 1; değil ise 0 değerini alır.</p><p>b = seçicide yer alan id özelliklerinin sayısı</p><p>c = seçicide yer alan diğer özelliklerin ve pseudo-classların sayısı</p><p>d = seçicide yer alan eleman adlarının ve pseudo elemanların sayısı</p><p>Spesifiklik hesabını daha iyi anlamak için <a href="http://specificity.keegan.st/"><strong>şuradaki</strong></a> görselleştirme çalışmasına göz atabilirsiniz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N1KAgbVlp-yjUS9Pjstgog.png" /></figure><p><strong>Sıra</strong></p><p>Kaynak ve seçiciliğin son değerin hesaplanmasında yetersiz kaldığı durumda değerlerin atanma sırasına bakılır. Bu durumda en son verilen değer dikkate alınır.</p><p>Webkit’de kural ağacı yoktur. Eşeleşen kurallar 4 defa taranır. Önce non-important ve seçiciliği yüksek özellikler uygulanır, daha sonra important ve seçiciliği yüksek olan özellikler , daha sonra normal öncelikte ve non-importan özellikler ve son olarak normal öncelikte ve important olan özellikler uygulanır. Birden fazla defa tanımlanmış özellik olduğunda, cascade sırasına göre, son uygulanan kalıcı olur.</p><h4>LAYOUT</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*xwO4sd9a3r45LRt8qfQ1hQ.gif" /></figure><p>Renderer (render tree’ yi oluşturan elemanlar, Firefox ‘frame’ olarak da tanımlar) oluştulup ağaca eklendiği zaman bir pozisyon ve büyüklüğe sahip olmaz. Bu değerlerin hesaplandığı aşamaya layout ve reflow denir.</p><p>HTML akışa dayalı bir layout modeli kullanır. Yani tek seferde geometrinin hesaplanması mümkün olur. Akışın sonraki aşamalarında yer alan elemanlar genelde, akışın öncesinde yer alan elemanları etkilemez. Bu yüzden akış; yukarıdan aşağıya veya sağdan sola ilerleyebilir. Bazen istisnalardan bahsedilebilir. Örneğin tablolar birden fazla geçişe gerek duyabilir.</p><p>Koordinat sistemi root frame’i (kökteki renderer) referans alır. Üst ve sol koordinatlar kullanılır.</p><p>Layout yenilenen bir işleyişe sahip. Rendererin kökünden (root) başlar (HTML dosyasında &lt;html&gt; elemanı). Düzenleme hiyerarşik olarak yenilenerek devam eder ve ilerler.</p><p>Kökteki renderer’in (root frame) pozisyonu 0,0&#39;dır ve boyutları tarayıcı penceresinin görünen kısmı kadardır (viewport).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/482/1*c5TbQ2KIKVgQpffQ-QGAeQ.png" /><figcaption>resim kaynağı için <a href="http://marksheet.io/css-responsiveness.html">link</a></figcaption></figure><p>Bütün rendererlerin layout veya reflow metodu vardır. Her renderer düzenlenmeyi gerektiren çocuklarının layout metodunu çağırır.</p><p><strong>DIRTY BIT SISTEMI</strong></p><p>Küçük bir değişiklikte düzenlenmenin baştan sona tetiklenmemesi için tarayıcılar ‘dirty bit’ olarak bilinen bir sistem kullanır. Değişikliğe uğrayan veya sonradan eklenen renderer kendini ve çocuklarını ‘dirty’ olarak işaretler. Bu, düzenleme gerektirdiği anlamına gelir.</p><p>İki çeşit etiket var: ‘dirty’ ve ‘children are dirty’ (rendererin kendisi değişim gerektirmese de çocuklarından en az bir tanesi düzen gerektirdiği anlamına gelir.)</p><p><strong>GLOBAL ve KADEMELİ DÜZENLEME</strong></p><p>Düzenleme render treenin tamamını baştan düzenlemek üzere ‘global’ olarak tetiklenebilir. Bu,</p><ol><li>Bütün rendererları etkileyen global bir stil değişimi sonucu (font size)</li><li>ekranın boyutunun değişimi sonucu tetiklenebilir.</li></ol><p>Kademeli düzenleme durumunda sadece ‘dirty’ olarak işaretlenmiş olan rendererlar düzenlenir. Kademeli düzenleme asenkron olarak yapılırken global düzenleme senkron olarak yapılır.</p><p>Düzenleme süreci genellikle şöyle ilerler:</p><ol><li>Parent (ata) renderer kendi genişliğini belirler</li><li>Children (oğul) rendererlere doğru ilerler<br>1. child renderer i yerleştirir (x ve y koordinatlarını belirler)<br>2. Gerekiyorsa childın düzenlenmesini tetikler (global veya dirty durumunda)</li><li>Parent, çocukların margin, padding ve yüksekliklerini toplayarak kendi yüksekliğini belirler.</li><li>Dirty bit’i ‘false’ olarak değiştirir</li></ol><p>Layout sürecinin sonunda ortaya net olarak pozisyonu ve boyutu olan ‘box model’ çıkar. Bütün göreceli değerlerin kesin büyüklükleri hesaplanır.</p><p><strong>box model: </strong>Bu model görsel özellikleri tanımlanmış dikdörtgenleri tanımlar. Her kutunun içerik alanı (yazı, resim vs) ve opsiyonel olan padding, border ve margin alanları vardır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/466/1*fmz1LpaJJpMjG0zrraT1_Q.png" /></figure><p>Her elemanın display özelliği vardır ve bu özellik ne çeşit bir kutunun oluşturulacağını belirler. Varsayılan display özelliği ‘inline’dır fakat bu tarayıcının varsayılan style sheetine göre değişiklik gösterebilir.</p><p>Renderer’in genişliği kendisini içeren container blockunun genişliği, rendererin style özelliği, marginler ve borderlar kullanılarak hesaplanır.</p><h4>PAINTING</h4><p>Render tree adım adım geçilerek renderer’in “paint()” methodu çağrılarak içeriğin ekranda gösterilmesi sağlanır. Painting kullanıcı arayüz altyapı komponentini kullanır (UI infrastructure).</p><p><strong>GLOBAL ve KADEMELİ PAINTING</strong></p><p>Düzenleme gibi renklendirme işlemi de global veya kademeli bir şekilde yapılabilir.</p><p>Renklendirme sırası:</p><ol><li>Background color</li><li>Backgorund image</li><li>Border</li><li>Children</li><li>Outline</li></ol><ul><li>Firefox’da görüntüleme listesi vardır. Doğru renklendirme sırasına göre dizilmiş rendererları içerir.</li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6e32fc8034ea" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/taray%C4%B1c%C4%B1lar-nas%C4%B1l-%C3%A7al%C4%B1%C5%9F%C4%B1yor-2-2-6e32fc8034ea">Tarayıcılar Nasıl Çalışıyor 2/2</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[D3.js ile meslek-eğitim anketinden toplanılan veriyi görselleştirme]]></title>
            <link>https://medium.com/hana-kamer/d3-js-ile-meslek-e%C4%9Fitim-anketinden-toplan%C4%B1lan-veriyi-g%C3%B6rselle%C5%9Ftirme-99b2e97f954e?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/99b2e97f954e</guid>
            <category><![CDATA[türkçe]]></category>
            <category><![CDATA[yazilim]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Fri, 01 Apr 2016 15:55:10 GMT</pubDate>
            <atom:updated>2016-04-01T16:08:12.239Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aSf1Z41dmV7udrBhSzm0MA.png" /></figure><p>Bir ay önce bütün sosyal medya kanallarından ısrarla paylaştığım bir anket olmuştu. Amacım küçük çaplı bir veri görselleştirme projesi yapmaktı.</p><p>Öncelikle anketin yayılmasına yardımcı olan herkese teşekkürler:)</p><p>İlk defa bir anket düzenledim ve yaklaşık 600 veri topladım. Aslında ilk anket için fena bir sayı olmadığını düşünüyorum ama bir daha anket yaparsam dikkat edeceklerimi sıralayayım:</p><ul><li>Kişilerin el ile girebilecekleri veriyi mümkün oldukça minimuma indirirdim zira datayı işlemesi, aradan geyikleri ayıklaması epey zaman alıyor.</li><li>Daha renkli olmasına ve doldurana bir heyecan katmasına en az toplayacağım veri kadar önem verirdim</li><li>Anketteki soruları verilen cevaplar doğrultusunda yönlendirirdim</li><li>Son olarak da zorunlu olmayan bölüm eklemezdim zira bunun eklenmemiş olmaktan bir farkı yok:)</li></ul><p>Anketi Google Docs kullanarak hazırladım. Cevaplar Google Sheets’de live olarak kaydoluyor. Anketin dolumları bittikten sonra girilen meslekleri ve eğitimleri sınıflandırdım.</p><p><a href="https://shancarter.github.io/mr-data-converter/">Mr. Data Converter</a> online tool’unu kullanarak json formatına çevirdim.</p><p>Projemde <a href="https://d3js.org/">d3.js</a> kütüphanesini kullandım. Alınan eğitimin edinilen meslek ile arasındaki ilişkiyi göreselleştirmek için Sankey diagramını kullandım.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lNZC7rJiRy9T5VFizpCB6g.png" /><figcaption>resim kaynağı için <a href="https://github.com/calischs/Sankey/blob/master/SankeyNotes.pdf">link</a></figcaption></figure><p>Sankey diagramı bir çeşit akış diagramıdır. Okların kalınlığı akışın miktarını yansıtır. Bu diagramlar genellikle işlemler arasındaki enerji veya madde akışını göstermek için kullanılır. Sankey diagramı, ismini; bu diargramı buhar makinesinin enerji verimini görselleştirmek için kullanan <a href="https://en.wikipedia.org/wiki/Matthew_Henry_Phineas_Riall_Sankey">Matthew Henry Phineas Riall Sankey</a> adındaki İrlandalı bir kaptandan almıştır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EZEiU6HJcITyLwC6C7lMBg.png" /></figure><p>Grafiğin interaktif haline <a href="http://hanakamer.github.io/data-vis/build/"><strong>buradan</strong></a> ulaşabilisiniz.</p><p>Diargramdaki linklerin görünürlüğünü arttırmak için önerilen bir renk paleti var mı veya renk seçimleri nasıl yapılmalı diye araştırdım ve <a href="http://colorbrewer2.org/">şu</a> siteyi buldum. Çok sevdim bence siz de bakın:)</p><p>Meslek memnuniyeti, çalışılan yıl ve sektör verilerini göstermek için heatmap diagramını kullandım. Aynı meslekte, aynı süre çalışanların 10 üzerinden değerlendirilmiş olan memnuniyetlerinin ortalamarını alıp çıkan değerleri renklerle derecelendirdim.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AdUhPqX955pqVuf-ejS_-w.png" /></figure><p>Grafiğe <a href="http://hanakamer.github.io/data-vis/build/"><strong>buradan</strong></a> ulaşabilisiniz.</p><p>Tabi ki bu verilerden neden — sonuç ilişkisine varmak imkansız, en başında projenin öyle bir amacının olmadığını da belirteyim.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=99b2e97f954e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/d3-js-ile-meslek-e%C4%9Fitim-anketinden-toplan%C4%B1lan-veriyi-g%C3%B6rselle%C5%9Ftirme-99b2e97f954e">D3.js ile meslek-eğitim anketinden toplanılan veriyi görselleştirme</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Biyokimya-Genetik diye giderken nereden çıktı yazılım?]]></title>
            <link>https://medium.com/hana-kamer/23-nisan-2015-per%C5%9Fembe-tarihinde-yazd%C4%B1%C4%9F%C4%B1m-eski-blogumdan-ta%C5%9F%C4%B1d%C4%B1%C4%9F%C4%B1m-yaz%C4%B1-8c494151d554?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/8c494151d554</guid>
            <category><![CDATA[yazilim]]></category>
            <category><![CDATA[turkce]]></category>
            <category><![CDATA[genetik]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Thu, 17 Mar 2016 09:26:36 GMT</pubDate>
            <atom:updated>2016-03-17T09:37:51.426Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>[23 Nisan 2015 Perşembe tarihinde yazdığım, eski blogumdan taşıdığım yazı]</blockquote><p>Uzun bir aradan sonra bloguma devam ediyorum. Bu arada İTÜ’de başladığım Moleküler Biyoloji ve Genetik bölümündeki yüksek lisansımı bitirdiğim gibi gelecek planlarımı da değiştirdim. Blog yazmaya başlamam Kayseri’de yaptığım biyoinformatik stajı ile başlamıştı. Bu dönem, kod yazmakla en haşır neşir olduğum dönemdi. Kayseri’den İstanbul’a tez ve yüksek lisans işlerime devam etmek için geri döndüğümde kod yazmaktan ne kadar zevk aldığımı tekrar tekrar hatırladım. Tez yazmanın o yıpratıcı sürecini yaşarken bir yandan madem bu kadar yıpranıyorum neden hala bu alanda doktora yapmayı düşünüyorum diye kendimi sorguladım.</p><p>5 sene biyokimya okuyup üstüne 2 sene yüksek lisans yapmışken aslında kod yazmayı sevdiğini keşfetmek ve buna kanalize olmak istemek için çok mu geçti? Bir şey için geç olduğunu söylerken aslında ne için gecikiyoruz? Bu bölümü boşuna mi okudun/m sorularıyla karşılaşırken “boşuna”dan kasıt nedir? Boşuna olmayan okumaların ve okumamaların bizi nereye götürmesi bekleniyor? Şu sıralar bir yandan junior yazılımcı olarak işlere başvururken bir yandan kendimi geliştirmeye çalışıyorum. Bu arada en çok karşılaştığım soru neden bu kadar çok biyokimya/genetik okuduktan sonra yazılıma karar verdiğim.</p><p>İlginçtir ki ÖSS’den hemen sonra tercih zamanlarında bu soruyla bu kadar karsılaşmamıştım. İnsanlar neden biyokimya diye merak etmiyordu. Hem neden etsinler ki? Herhalde neden biyokimya olduğunu öğrenmek için meslekler kitapçığını açıp biyokimyanın gelecekte Türkiye’nin parlayan alanı olacağını okumuşlardır. Meslekler kitapçıklarında meslekler birbirinden güzeldir. Biyoloji, biyokimya gibi alanlarda rengarenk tüplerle çeşit çeşit deneyler yapacağınızı okursunuz. Ama kimse size deney arkadaşlarınızın zehirli maddelerle çalışırken alınması gereken güvenlik önlemlerini almayacaklarını, çalıştığınız kimyasalları kanalizasyona boşaltacağınızı, okuduğunuz makalelerde yapılan deneylerin aynısını yapmanıza rağmen aynı sonuçları almayacağınızı bunun sebebinin de insanların akıllarındaki sonuca varmak için sonuçlara taklalar attırması olduğunu söylemez. Aylarca uğraştığınız deney sonuçlarını pozitif çıkmadığı için kullanamayacağınızı ve bu yüzden tekrar tekrar oldurana kadar olduğunuz yerden ayrılamayacağınızı da kimse söylemez. Kimse neyi nasıl yaptığınızla ilgilenmez. Önemli olan sonuçlardır. Önemli olan pozitif sonuçlardır. Şunu şunu yaptım A sonucunu beklerken B sonucu çıktı diye “başarısızlık” olarak nitelendirilecek makalelerle karşılaşamayacak olmanız da bundandır. Aslında bunları meslekler kitapçıklarından okuyarak öğrenemeyeceğiniz gibi başkasının deneyimini dinleyerek de öğrenemeyeceğiniz şeyler. Özetle tercih dediğiniz şey sadece ÖSS sonrası yapılmak zorunda değildir. Tez sürecimin son bir kaç ayına kadar doktora yapmayı planlarken aslında bunu etrafımdaki insanların isteği üzerine yapmak istediğimi fark ettim. Akademik ortamda ilerlemek istediğiniz zaman sık sık karşılaşacağınız kalıplar vardır: Aman Türkiye’nin bilindik üniversitelerine git, aman not ortalamanı yüksek tut, aman yurt dışına git… Ama kimse size aman işini güzel yap demez. Çünkü bunu kontrol etmenin yolu yoktur. Okuduğunuz değeri grafiğiniz daha güzel çıksın diye 3 değil de 9 yazıp yazmadığınızı kimse bilmez. Nereden bilecek? Yoksa deneyi yapan öğrencilere güvenecek misiniz? Neden güveneceksiniz? O öğrencilerin motivasyonu nedir? Başlarında deneyin gidişatını beğenmeyen hocası, maddi destek sağlamayan sistem ve bir gün ben de ‘Nature’da makale yayınlarım hedefi mi? Halbuki adı olan üniversiteye gidip yüksek notlarla süslediğiniz cv nizi bir de makale ile şişridiğinizde sizden kralı olmaz akademik ortamlarda. Türkiye’nin bilindik üniveristelerinde kadroda yer almak isterseniz mutlaka yurt dışında bir kaç sene geçirmiş olmanızı isterler fakat yurt dışında gördüğünüz laboratuvar düzeninin Türkiye’ye taşımanız için değil kesinlikle. Çünkü öyle olsa, bu üniversitelerin en azından bir kimyasal atık politikası olurdu. Peki ben bu bölümleri okuduğuma pişman mıyım? Kesinlikle değilim. Hatta alanlarla tanışma sıramın da çok güzel denk geldiğini düşünüyorum. Önce kod yazmakla tanışsaydım muhtemelen biyoloji ilgimi çekmezdi. Lisansım ve yüksek lisansım sırasında bol bol laboratuvarda çalıştım. Herkesin çıkmayan sonuçlarından dert yandığı ortak alanı, asansörde ben de az söylenmedim. Sonuç aldığımda da bütün dünyaya sarılmak istediğim zamanlar da olmuştu. Fakat bunun hobi seviyesinde kalması benim için yeterli:) Bende laboratuvar sabrı yokmuş ya da vardı olanı tükettim. Bu alanlardan neden vazgeçtiğimi anlatırken yazılım dünyasıyla karşılaştırma yapmaktan kaçındım. Çünkü bu alanda da yeniyim. Kötü yanları da olduğundan eminim. Çünkü toz pembe meslekler sadece meslek kitapçıklarında var. ( Ne kadar etkilemiş bu kitapçıklar beni…)</p><p>Bunu okuyan ve hayatını akademik kariyer etrafında planlayan arkadaşlarım yazımın içinden “sen bizim sonuçlarımıza palavra mı dedin?!?” anlamını çıkarmasınlar. Benim gördüğüm şartlar, akademik kariyer yapmak konusunda yeterince motive edici olmadığı için kafamda bu soruları oluşturuyor. Bu yüzden cümlelerimde ima veya gerçek olay ipucu aramayın.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/360/1*3D_6pYWcmFqosqlNf9qt8A.gif" /><figcaption>Bunlardan ötürü…</figcaption></figure><p><em>Originally published at </em><a href="http://mavikarpus.blogspot.com.tr/2015/04/biyokimya-genetik-diye-giderken-nereden.html"><em>mavikarpus.blogspot.com.tr</em></a><em> on April 23, 2015.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8c494151d554" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/23-nisan-2015-per%C5%9Fembe-tarihinde-yazd%C4%B1%C4%9F%C4%B1m-eski-blogumdan-ta%C5%9F%C4%B1d%C4%B1%C4%9F%C4%B1m-yaz%C4%B1-8c494151d554">Biyokimya-Genetik diye giderken nereden çıktı yazılım?</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tarayıcılar nasıl çalışıyor[1/2]]]></title>
            <link>https://medium.com/hana-kamer/taray%C4%B1c%C4%B1lar-nas%C4%B1l-%C3%A7al%C4%B1%C5%9F%C4%B1yor-1-2-52e3224defa4?source=rss----1e77728fa4fc---4</link>
            <guid isPermaLink="false">https://medium.com/p/52e3224defa4</guid>
            <category><![CDATA[yazilim]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[türkçe]]></category>
            <dc:creator><![CDATA[Hana Kamer]]></dc:creator>
            <pubDate>Wed, 24 Feb 2016 06:18:10 GMT</pubDate>
            <atom:updated>2016-03-17T17:36:30.838Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nXp0lFDnEUWwbqVrChrUEQ.jpeg" /></figure><p>Bir frontend developer olarak yazdığınız kod tarayıcı tarafından işlenirken tarayıcının nasıl çalıştığını bilmemek size çok zaman kaybettirebilir. Aldığınız hatanın neyden kaynaklı olduğunu anlamanız veya en azından keyword edinmeniz sizi devtools’da körü körüne CSS ile boğuşmaktan kurtarabilir.</p><p>Tarayıcıların nasıl çalıştığını bilmek size ne katabilir?</p><ul><li>CSS lerinizi daha doğru kurallara göre yazabilirsiniz.</li><li>Birden fazla CSS kaynağı kullamanız durumunda tarayıcının bunları nasıl işlediğini, neye öncelik verdiğini bilirsiniz.</li><li>Sayfanızı performans açısından nasıl optimize edebileceğinize dair fikir yürütebilirsiniz.</li></ul><p>Bu katkılar size yeterince cazip geldiyse emin olun bu yazının sonuna kadar dayanabilirsiniz:)</p><blockquote><strong>NOT 1</strong>-Konu uzun olduğu için yazıyı ikiye bölmeye karar verdim. Bu bölümde render tree’nin oluşumuna kadar olan işleyişi anlatacağım.</blockquote><blockquote><strong>NOT 2</strong>- Bazı terimlerin tam olarak Türkçe karşılığı olmadığı için, terimlerin anlamını yazdıktan sonra İngilizce olarak kullanmaya devam edeceğim.</blockquote><p>Bildiğiniz gibi tarayıcının amacı sizin sunucudan istediğiniz kaynağı görüntülemek. Peki bunu nasıl yapar?</p><p>Siz tarayıcının adres barına ulaşmak istediğiniz içeriğin <a href="https://en.wikipedia.org/wiki/Uniform_Resource_Locator">URL</a>’ini (Uniform Resource Locator) girdiniz. Tarayıcı ulaşmak istediğiniz domain’in IP’sini öğrenerek (DNS lookup) sunucuya bir sorgu atar.</p><p>Tarayıcı sunucudan bir HTTP cevabı alır. Aldığı cevaba göre bir yol izler. Biz burada aldığı cevabın HTML olması durumunu inceleyeceğiz.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/580/1*Y3kUyY3lWxsE4e7v5Upd4w.png" /><figcaption>Genel tarayıcı yapısını oluşturan elemanlar (2)</figcaption></figure><p>Tarayıcıların genel olarak yapısı:</p><ul><li>Kullanıcı arayüzü</li><li>Tarayıcı motoru</li><li>Rendering motoru</li><li>Networking</li><li>Display backend</li><li>JS interpreter</li><li>Veri depolama</li></ul><p>bölümlerinden oluşur.</p><blockquote><strong>Kullanıcı arayüzü:</strong> Kullanıcının tarayıcı ile iletişim kurmasını sağlayan arayüzdür. İleri/geri butonları, yenileme/durdurma butonları ve içeriğin görüntülendiği alan dışında kalan bütün kısımdır.</blockquote><blockquote><strong>Tarayıcı motoru:</strong> Kullanıcı arayüzü ile rendering motoru arasındaki eylemleri dizeler.</blockquote><blockquote><strong>Rendering motoru:</strong> İstenilen içeriğin görüntülenmesinden sorumludur.</blockquote><blockquote><strong>Networking:</strong> Tarayıcı ve farklı ağ sunucuları arasında veri alışverişini sağlayan birimdir. Bu veri alışverişini farklı protokoller kullanarak yapabilir.</blockquote><blockquote><strong>Display backend:</strong> Kullanıcı için bazı temel grafik bileşenlerinin oluşturulmasından sorumludur. (combobox vs).</blockquote><blockquote><strong>JS interpreter:</strong> Javascript kodunu çözümleyip çalıştırır.</blockquote><h3>Rendering motoru</h3><p>Cevapta dönen HTML kaynağının çözümlenip DOM ağacının oluşmasını, CSS stillerine göre elemanların görsel özelliklerinin hesaplanıp buna göre düzenlenip kullanıcıya sunulmasını sağlar.</p><p>Bunu yaparken şu adımları izler:</p><ul><li>HTML kaynağının parse edilmesi</li><li>DOM un oluşturulması</li><li>CSS kaynaklarının parse edilmesi</li><li>Render tree’nin oluşturulması</li><li>Layout</li><li>Painting</li></ul><p>Farklı tarayıcılar farklı render motorları kullanır fakat genel olarak çalışma prensipleri aynıdır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*g-bOLQHXyRvjw_331md39A.jpeg" /></figure><h3>HTML parsing</h3><blockquote><strong>Bir dosyayı parse etmek</strong>: Dosya kaynağını, bilgisayar kodunun kullanabileceği bir yapıya dönüştürmektir. Düğüm ve dallanmalardan oluşan hiyerarşik bir yapı oluşur. Dosya oluşturulurken kullanılan kurallara dayanır.</blockquote><p>HTML (Hyper Text Markup Language) syntax spesifikasyonları <a href="https://www.w3.org/"><strong>W3C</strong></a> organizasyonu tarafından tanımlanmıştır.</p><p>HTML yapı bakımından XML’e çok benzemektedir fakat parse edilmesi daha zordur. Bunun sebebi HTML’in hatalara daha toleranslı olmasıdır. HTML, normalde hiç olmayan bir tagi kullanmanıza, bazen açma yada kapama taglerini yazmamanıza bile izin verir.</p><p>Bu özellikler HTML’in parse edilmesini zorlaştırır çünkü izleyebileceğiniz tek bir kural veya yol oluşturmanızı engeller. Bu, HTML’in “context free” dil <strong>olmamasından</strong> kaynaklanır.</p><blockquote>“Context free” bir dilde aynı karakter dizisinin anlamı içerikten bağımsızdır ve her zaman aynıdır. “Context free” olmayan dilde ise aynı karakter dizisinin anlamı yerine ve duruma bağlı olarak değişir, yani anlam içeriğe doğrudan bağlıdır.</blockquote><p>Parsing sırasında iki işlem gerçekleştirilir:</p><h4>1. Lexical analiz (sözlüksel analiz)</h4><p>Lexical analiz sırasında veriler “token”lara atanır. Bu bir nevi bizim konuştumuz dilin kelime kelime sözlükten karşılık bulması gibi sembolize edilebilir.</p><blockquote><strong>Lexical analiz:</strong> Bir karakter dizisini “token”lara çevirmek.</blockquote><blockquote><strong>Token:</strong> Başka bir şeyi temsil eden obje.</blockquote><blockquote><strong>HTML “token”ları:</strong> Açma kapama tagleri, özellik (attribute) değerleri ve isimleri</blockquote><p>Bu analizde kullanılan algoritmada bir “state” (durum) değişkeni vardır ve verinin anlamlandırılması bu “state”e bağlıdır.</p><ul><li>İlk state <strong>data state</strong>dir.</li><li>“&lt;” ile karşılaşınca <strong>open tag state</strong> (açık tag durumu) olarak değişir.</li><li>Sonraki karakterler <strong>start tag token</strong>’ı oluşturur ve bu surada durum <strong>tag name state</strong>’ini alır.</li><li>“&gt;” ile kaşılaşılşana kadar durum tag name state olarak kalır.</li><li>“&gt;” karakterine gelince durum tekrar <strong>data state</strong>’ e geçer</li></ul><pre>&lt;html&gt;.......................................start tag<br>   &lt;head&gt;....................................start tag<br>      &lt;title&gt;................................start tag<br>         Test................................data<br>      &lt;/title&gt;...............................end tag<br>   &lt;/head&gt;...................................end tag<br>   &lt;body&gt;....................................start tag<br>      &lt;h1&gt;...................................start tag<br>        Parse me!............................data<br>      &lt;/h1&gt;..................................end tag<br>   &lt;/body&gt;...................................end tag<br>&lt;/html&gt;......................................end tag</pre><h4>2. Syntax analizi</h4><blockquote><strong>Syntax:</strong> Bir programda tanımlanmış sembol kombinasyonlarının, anlamlı bir dizilim oluşturmasında uyulan kurallar kümesi.</blockquote><p>Parser bu aşamada lexerdan bir token ister ve aldığı token’i kendi syntax kurallarına uygun olarak “<strong>parse tree</strong>”ye yerleştirir. Parse tree <strong>DOM</strong>’u oluşturur. HTML ve DOM arasında birebir ilişki vardır.</p><blockquote>DOM: Document Object Model, HTML dosyasının obje olarak gösterimi ve Javascript ile ilişkilendirilebildiği bir arayüzdür. İçerik ağacı olarak da bilinir (content tree).</blockquote><h3>Render tree’nin oluşturulması</h3><p>Basitçe görsel özellikleri içeren dikdörtgen alanlardan oluşur denilebilir. Renk ve boyut gibi özellikleri içerir. Dosyanın görsel sunumu olan bu yapı içeriğin doğru sırada renklendirilmesini ve şekillenmesini sağlar.</p><p>Render tree elemanlarını Firefox ‘frame’, Webkit ise ‘render object’ olarak isimlendirir.</p><p>Görsel olmayan DOM elemanları render tree’ye eklenmediğinden, HTML ve DOM arasındaki ilişki birebir iken, DOM ve render tree arasındaki ilişki birebir degildir artık.</p><p>Örneğin &lt;head&gt; elemanı DOM’da yer alırken render tree’de yer almaz. Ayni şekilde “display” özelliği “none” olan elemanlar da render tree’de yer almaz. Diğer taraftan “visibility” özelliği “hidden” olan elemanlar render tree’ye eklenir.</p><p>DOM ve render tree arasındaki ilişkinin birebir olmamasının başka bir nedeni de bazı DOM elemanlarının birden fazla görsel karşılığı olmasıdır. Örneğin, “select”in 3 renderer’ı var :</p><ul><li>Display area</li><li>Drop down list</li><li>Button</li></ul><p>HTML’in bozuk bir yapıda olması da DOM’dan farklı bir render tree oluşmasına sebep olur.</p><p>Aşağıda bir HTML kodunun DOM ve render tree yapısını görebilirsiniz:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/686/1*YsTT0DFI0Be7DkQ2Y_ETvw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UHuzbhyrdVjIa_0cJCs0xQ.png" /></figure><blockquote>Yazının bir sonraki bölümünde render tree’de yer alan elemanların CSS özelliklerinin ve sayfadaki pozisyonlarının nasıl hesaplandığını; son olarak da elemanların renklendirilmesini anlatacağım.</blockquote><p>Kaynaklar:</p><ol><li><a href="http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/">http://www.html5rocks.com/en/tutorials/internals/howbrowserswork/</a></li><li>A Reference Architecture for Web Browsers. Alan Grosskurth, Michael W. Godfrey</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=52e3224defa4" width="1" height="1" alt=""><hr><p><a href="https://medium.com/hana-kamer/taray%C4%B1c%C4%B1lar-nas%C4%B1l-%C3%A7al%C4%B1%C5%9F%C4%B1yor-1-2-52e3224defa4">Tarayıcılar nasıl çalışıyor[1/2]</a> was originally published in <a href="https://medium.com/hana-kamer">Hana Kamer</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>