Hasan ÜNAL
2024-03-13T10:19:44+00:00
https://hasanunal.org
hasanunal
info@hasanunal.org
Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi - Girişim Limanı
2024-02-07T00:00:00+00:00
https://hasanunal.org/blog/techstars-startup-weekend-mersin
<p><strong>Mersin Girişim Limanı</strong>‘nda düzenlenen <strong>Techstars Startup Weekend Mersin</strong> etkinliğinde <strong>2. olduk</strong> 🏆🥳</p>
<p>Hafta sonu gece/gündüz çalışıp fikrimizin çalışan bir örneğini ve sunumu hazırlayıp asansör konuşmasında derdimizi anlatmayı başardık. 🎉</p>
<p>Harika bir deneyimdi. Bizi ağırlayan Mersin Üniversitesi Genç Girişimci Merkezi’ne, hocalarımıza, mentörlerimize, jüriye ve yarışmaya katılan değerli arkadaşlara teşekkürlerimi sunarım. 💐</p>
<h5 id="jüri-üyelerimiz">Jüri Üyelerimiz</h5>
<p><a href="https://www.linkedin.com/in/nihan-olcaytu%C4%9F-baran-a0352955" rel="nofollow" target="_blank">Nihan Baran</a> - Mersin Teknopark Genel Müdür Vekili<br />
<a href="https://www.linkedin.com/in/turgut-ermercimek-02114758/" rel="nofollow" target="_blank">Turgut Ermercimek</a> - MTSO<br />
<a href="https://www.linkedin.com/in/ilhan-ege-34623719/" rel="nofollow" target="_blank">Prof. Dr. İlhan Ege</a> - Mersin Üniversitesi<br />
<a href="https://www.linkedin.com/in/gurbuz-comak-15719a46/" rel="nofollow" target="_blank">Dr. Öğr. Üyesi Gürbüz Çomak</a> - Mersin üniversitesi<br />
<a href="https://www.mersin.edu.tr/academic/faculty-of-engineering/departments/department-of-computer-engineering/academic-staff/maci" rel="nofollow" target="_blank">Dr. Öğr. Üyesi Mehmet Acı</a> - Mersin Üniversitesi</p>
<h5 id="jüri-değerlendirme-kriterleri">Jüri değerlendirme kriterleri</h5>
<div class="mb-1"></div>
<ol>
<li><strong>İş Modeli (Business Model):</strong> <br />Ekip iş fikrini başarıyla hayata geçirmek için nasıl bir plan yapmış?</li>
<li><strong>Hedef Kitle Geçerliliği (Customer Validation):</strong> <br />Ekip gerçekten müşterinin ihtiyacı olan bir şeyi mi hayata geçiriyor?</li>
<li><strong>Uygulama ve Tasarım:</strong> <br />Hedef müşteri ile test edip geri bildirim alabilecekleri bir MVP hazırlamışlar mı?</li>
</ol>
<hr />
<div class="d-flex justify-content-center gap-1 mt-1">
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-1.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-1.jpg" class="w-100 h-100 object-fit-contain" alt="Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi" />
</a>
</div>
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-2.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-2.jpg" class="w-100 h-100 object-fit-contain" alt="Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi" />
</a>
</div>
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-3.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-3.jpg" class="w-100 h-100 object-fit-contain" alt="Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi" />
</a>
</div>
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-4.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-4.jpg" class="w-100 h-100 object-fit-contain" alt="Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi" />
</a>
</div>
</div>
<div class="d-flex justify-content-center gap-1 mb-2 mt-1">
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-5.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-5.jpg" class="w-100 h-100 object-fit-contain" alt="Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi" />
</a>
</div>
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-6.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-6.jpg" class="w-100 h-100 object-fit-contain" alt="Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi" />
</a>
</div>
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-7.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-7.jpg" class="w-100 h-100 object-fit-contain" alt="Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi" />
</a>
</div>
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-8.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2024-02-07-techstars-startup-weekend-mersin/techstars-startup-weekend-mersin-8.jpg" class="w-100 h-100 object-fit-contain" alt="Techstars Startup Weekend Mersin - Mersin Üniversitesi Genç Girişimci Merkezi" />
</a>
</div>
</div>
<div style="position:relative;overflow:hidden;padding-top: 105%;width:50%; margin: 0 auto 3rem; border-radius: 10px; border: 1px solid #ebebeb;">
<iframe frameborder="0" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;" src="https://www.linkedin.com/embed/feed/update/urn:li:activity:7160692266192248832"></iframe>
</div>
Borsa Altın Yatırım Exceli Google E-Tablolar (Google Sheets)
2024-01-30T00:00:00+00:00
https://hasanunal.org/blog/borsa-altin-yatirim-exceli-google-sheets
<blockquote>
<p>YATIRIM TAVSİYESİ DEĞİLDİR</p>
</blockquote>
<p>Merhabalar,</p>
<p>Öncelikle belirtmeliyim ki <strong>ben bir yatırım uzmanı değilim</strong> kendimce bir şeyler alıyorum/satıyorum ve takibinde çok zorlandığım için bir e-tablo yaptım paylaşmak istedim.</p>
<p>Burada niyetim; ben bu exceli yaparken ciddi vakit kaybettim, siz kaybetmeyin. <br />
İnternette yeterli kaynak yada ücretsiz paylaşımın bulamadım. Nerden baksanız 3-4 akşamımı bu işe ayırdım, ne gerek vardı.</p>
<p>Google E-Tablolar aslında çok gelişmiş ihtiyacımız olan bir çok şeyi bize çevrim içi sunan bir araç ama benim için en önemli özelliği her yerden erişebiliyor olmamız. Bu sayede bilgisayarımızda olmasa bile her yerden erişebiliyoruz.</p>
<p>Lafı uzatmadan bir kaç detayı paylaşıp sonrasında ekte dosyayı paylaşıyor olacağım.</p>
<p><img src="/assets/img/blog/2024-01-30-borsa-altin-yatirim-exceli-google-sheets/borsa-altin-yatirim-exceli-google-sheets.png" alt="Borsa Altın Yatırım Exceli Google E-Tablolar (Google Sheets)" title="Borsa Altın Yatırım Exceli Google E-Tablolar (Google Sheets)" /></p>
<hr />
<h3 id="hisse---monitör">Hisse - Monitör</h3>
<p>Bu ekranda aldığınız tüm hisseleri ekleyip monitör edebilirsiniz.</p>
<hr />
<h3 id="halka-arz">Halka Arz</h3>
<p>Halka arz edilen tüm hisseleri bu ekranda görebilirsiniz.</p>
<hr />
<h3 id="altın-ve-dolar">Altın ve Dolar</h3>
<p>Altın veya fiyatlarını bu ekranda görebilirsiniz. Alım satımlarınızı bu ekrandan görebilirsiniz.</p>
<hr />
<h3 id="hisse-kod">Hisse Kod</h3>
<p>Hisseye ait detaylı veriyi gireceğiniz alandır. Kaç tane hisseniz varsa o kadar çoğaltıp düzenlemeniz gerekir.
Tüm tablolar otomatik çalışmaktadır yapmanız gereken tek şey hisse kodu alanına hissenin kodunu yazmak.</p>
<hr />
<h2 id="bonus">Bonus</h2>
<p>Evet. Bonusu ne derseniz alım günü hisse yerine altın veya dolar almış olsaydınız kaç para kazanırdınız onu da hesaplıyor. Böylece hisse mantıklı bir araç mı yoksa dolar mı altın mı almalıydınız o hisseye devam etmeli misiniz yoksa artık vedalaşma vakti mi gibi bir çok soruya cevap bulup karar verebilirsiniz.</p>
<hr />
<p>Bu tabloyu yaparken excel bilgimi epey yenilemiş oldum ve sık sık <strong>chatgpt</strong>‘den yardım aldım.
Promp yeteneğimi geliştirdim soru sormak ayrı bir sanat aslında. :)
Gelecekte yapay zekalar ciddi oranda hayatımızda olacak ve onlarla iletişim kurmak için soru sormak çok önemli. Doğru soru sormanın önemli olduğunu düşünüyorum.</p>
<h1 id="i̇ndir">İndir</h1>
<p><a href="https://docs.google.com/spreadsheets/d/1vQm2nPfaJUu5QmV_9I4xvlmqHsS5wQXWysnn9CJQfys/edit?usp=sharing" rel="nofollow" target="_blank" class="d-inline-flex align-items-center justify-content-center gap-10 py-1 btn-main">
<img src="/assets/img/blog/2024-01-30-borsa-altin-yatirim-exceli-google-sheets/icon-xls.svg" width="40" height="40" />
<span class="ml-2">Yatırım Portföy Yönet - E-Tablo (Google Sheets)</span></a></p>
Eminönü Gezi Rehberi - Müze ve Yemek Önerileri
2024-01-06T00:00:00+00:00
https://hasanunal.org/blog/eminonu-gezi-rehberi
<p><img src="/assets/img/blog/2024-01-06-eminonu-gezi-rehberi/eminonu-istanbul-map.jpg" class="w-100" alt="Eminönü Gezi Rehberi" /></p>
<p>Merhabalar, bu yazımda <strong>Eminönü</strong>‘nde ve çevresi gezilecek yerler ve yemek önerileri paylaşacağım.<br />
<strong>İstanbul</strong>‘un belki de <em>(benim fikrim)</em> tarihi ve gezilecek yerler yakınlığı bakımından en zengin yeri diyebilirim.<br />
Öncelikle plan tamamen toplu taşıma ve yürüyüş üzerine. <mark><span><strong>Eminönü</strong> tarafına araçla gitmek saçmalık olur.</span></mark>
İkinci plan ise kesinlikle yıllık <strong>Müze Kart</strong> almak. Eminönü’nde bulunan hemen hemen tüm müzelerde geçerli.</p>
<hr class="my-2" />
<h2 id="öğle-yemeği---dönerci-şahin-usta">Öğle Yemeği - Dönerci Şahin Usta</h2>
<div class="d-flex flex-wrap">
<div class="w-100 w-md-25 d-flex flex-column">
<a data-fancybox="post-gallery" data-src="https://media-cdn.tripadvisor.com/media/photo-s/17/84/65/7a/donerci-sahin-usta.jpg" class="d-flex cursor-pointer h-100">
<img src="https://media-cdn.tripadvisor.com/media/photo-s/17/84/65/7a/donerci-sahin-usta.jpg" class="w-100 h-100 object-fit-cover" alt="Eminönü Gezi Rehberi" />
</a>
<small class="d-block text-center mb-1">görsel <a href="https://www.tripadvisor.com/LocationPhotoDirectLink-g293974-d2232745-i394552695-Donerci_Sahin_Usta-Istanbul.html" rel="nofollow" target="_blank">tripadvisor</a></small>
</div>
<div class="w-100 w-md-75 pl-0 pl-md-1">
<h5 id="gitmek-içini-ki-farklı-rota-mevcut"> Gitmek içini ki farklı rota mevcut </h5>
<ol><li>Sirkeci Marmaray durağından inip tarihi dokular arasından yürüyerek tırmanmak. Başlangıç için biraz yorucu olabilir ama bu rotayı tercih ederseniz muhtemelen daha önce hiç girmediğiniz sokaklarda seyahat edeceksiniz. Kendinizi Hindistan’da gibi hissedebilirsiniz :)</li><li>Çemberlitaş durağında inip yaklaşık 350mt. yürüyerek ulaşabilirsiniz.</li></ol>
</div>
</div>
<p>Gezimize güzel bir öğle yemeği ile başlayalım.
1969’tan beri faaliyette olduğunu söyleyen <em>(benim yaşım yetmez doğrulamaya)</em> belki de bölgenin en iyi dönerci. Fiyatları ayaküstü lezzete göre yüksek. Her gün yemeyecekseniz tolere edilir :)
Önerim <strong>pide arası yemeniz.</strong>
Aşağıda menüyü ve Google Haritalar yorumumu paylaşıyorum.<br /></p>
<ul>
<li><a href="https://maps.app.goo.gl/HKNZnmNmfCtodcb46" rel="nofollow" target="_blank"><strong>Yorumum - Dönerci Şahin Usta</strong></a></li>
</ul>
<hr class="my-2" />
<h2 id="mısır-çarşısı">Mısır Çarşısı</h2>
<p><img src="https://images.unsplash.com/photo-1666601597487-12a31835adec?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://unsplash.com/photos/a-person-looking-at-a-display-of-cheeses--bXX4iTDVrQ" rel="nofollow" target="_blank">unsplash</a></small></p>
<ul>
<li>Yaklaşık 100mt. mesafede.</li>
</ul>
<p>Tarihi bir doku evet ama fazlasıya kalabalık ve günümüz uzun olduğu için başlangıç için biraz yorucu olabilir o yüzden ufak bir göz attıktan sonra bir sonraki rotaya yönelmenizi öneririm.</p>
<blockquote>
<p>1660 yılında <a href="https://tr.wikipedia.org/wiki/Turhan_Sultan" title="Turhan Sultan" rel="nofollow" target="_blank">Turhan Sultan</a> tarafından Hassa baş mimarı Kâzım Ağa’ya yaptırılmıştır. Önceleri <em>Yeni Çarşı</em> ya da <em>Vâlide Çarşısı</em> olarak anılan ve rivâyete göre <a href="https://tr.wikipedia.org/wiki/M%C4%B1s%C4%B1r_(%C3%BClke)" title="Mısır (ülke)" rel="nofollow" target="_blank">Mısır</a>‘dan alınan vergilerle inşâ edilen çarşı, 18. yüzyıldan sonra bugün bilinen adıyla anılmaya başlanmıştır. Bol baharatlıdır içerisi.</p>
</blockquote>
<hr class="my-2" />
<h2 id="şerifiye-sarnıcı">Şerifiye Sarnıcı</h2>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Theodosius_cistern_08.jpg/1200px-Theodosius_cistern_08.jpg" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://tr.wikipedia.org/wiki/%C5%9Eerefiye_Sarn%C4%B1c%C4%B1" rel="nofollow" target="_blank">wikimedia.org</a></small></p>
<p>Karnımızı doyurduğumuza göre rotamız başlasın; <strong>Şerifiye Sarnıcı</strong> ile.</p>
<ul>
<li>Dönerci Şahin Usta’dan çıktıktan sonra 500-550mt. yürüdükten sonra ulaşabilirsiniz. Yürüyüş yolunda telefonunuza değil etrafınıza bakın her yer tarih.</li>
</ul>
<blockquote>
<p>Eminönü’nde bulunan bu sarnıç, 16. yüzyılda inşa edilmiş. İstanbul’un en büyük sarnıcı. İçerisinde 40 adet sütun bulunuyor. Sütunların her biri farklı bir mimariye sahip. Sarnıç, 1985 yılında restore edilmiş ve 2018 yılında ziyarete açılmış.</p>
</blockquote>
<p>Güncel giriş ücretini bilmiyorum, <strong>Müzekart</strong> geçerli değil fakat fiyatlar oldukça makul.
Belirli saatlerde sarnıçta <strong>ışık gösterileri</strong> oluyor. Benim gittiğim sırada saat başıydı.
Bu ışık gösterileri o kadar büyüleyici ki nasıl daha önce keşfetmediğiniz için kendinize kızabilirsiniz.
Ortalama 20dk süren bu ziyaretten sonra ikinci durağımıza geçiyoruz.</p>
<hr class="my-2" />
<h2 id="sultanahmet-meydanı">Sultanahmet Meydanı</h2>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/1/12/Exterior_of_Sultan_Ahmed_I_Mosque_in_Istanbul%2C_Turkey_002.jpg" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://commons.wikimedia.org/w/index.php?curid=22946519" rel="nofollow" target="_blank">wikimedia.org</a> - <a href="https://creativecommons.org/licenses/by/2.0" rel="nofollow" target="_blank">CC BY 2.0</a></small></p>
<ul>
<li>Yaklaşık 400mt. yürüdükten sonra ulaşabilirsiniz.
Eskiden martı ve güvercin seslerinin hakim olduğu <strong>Eminönü Meydanı</strong>, semtin kalbi olarak bilinir. Şimdilerde ise neredeyse Türk bulamayacağınız sayısız noktadan birisi.</li>
</ul>
<hr class="my-2" />
<h2 id="sultanahmet-camii">Sultanahmet Camii</h2>
<p><img src="https://images.unsplash.com/photo-1586871818843-dbce27eaf410?q=80&w=900&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://unsplash.com/photos/brown-and-white-concrete-building-mWxKMCLtnyw" rel="nofollow" target="_blank">unsplash</a></small></p>
<ul>
<li>100mt. mesafede.</li>
<li>Ücretsiz.</li>
</ul>
<p>Herhangi bir giriş ücreti bulunmuyor. Bir noktadan girip bir noktadan çıkıyorsunuz. Tarihi bir yapı, keyif alacağınızı düşünüyorum. Popülasyon fazlası ile karışık dış etkenlere fazla takılmayın.</p>
<blockquote>
<p>Her katında alçak düzeyde olmak üzere, caminin içi <a href="https://tr.wikipedia.org/wiki/%C4%B0znik" title="İznik" rel="nofollow" target="_blank">İznik</a>‘te 50 farklı Lale deseninden üretilmiş 20 binden fazla <a href="https://tr.wikipedia.org/wiki/%C3%87ini" title="Çini" rel="nofollow" target="_blank">çini</a> ile bezenmiştir. Alt seviyelerdeki çiniler gelenekselken, galerideki çinilerin desenleri çiçekler, meyveler ve servilerle gösterişli ve ihtişamlıdır. 20 binden fazla çini İznik’te çini ustası Kasap Hacı ve Kapadokya Barış Efendi’nin yönetiminde üretilmiştir. Her çini başına ödenecek tutar sultanın emriyle düzenlense de çini fiyatı zamanla artmış, bunun sonucunda kullanılan çinilerin kalitesi zamanla azalmıştır. Renkleri solmuş ve cilaları sönükleşmiştir.</p>
</blockquote>
<hr class="my-2" />
<h2 id="yerebatan-sarnıcı">Yerebatan Sarnıcı</h2>
<p><img src="https://images.unsplash.com/photo-1621165399246-52590f2504e8?q=80&w=900&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://unsplash.com/photos/brown-concrete-pillar-near-body-of-water-during-night-time-cqY1i3Royxc" rel="nofollow" target="_blank">unsplash</a></small></p>
<p>Başlangıçta Şerifiye Sarnıç’ı ile ara öğünü aldıktan sonra asıl öğüne geçebiliriz.</p>
<ul>
<li>Sultanahmet Camii’den çıktıktan sonra yaklaşık 250mt. yürüdükten sonra ulaşabilirsiniz.</li>
<li>Ücretli giriş.</li>
</ul>
<p>2020 yılında restorasyonu tamamlanan içerisi harikalar diyarına dönüşen tarihi yapı. Kapının önünde metrelerde kuyruk olması gözünüzü korkutmasın çünkü biz buna önceden hazırlıklıyız.</p>
<ul>
<li>Online bilet alacağız ve sıranın başına gidip yandaki girişten gireceğiz QR kodu okutacağız ve içerideyiz.</li>
<li><a href="https://www.passo.com.tr/tr/mekan/yerebatan-sarnici-muzeleri-bilet/719215" rel="nofollow" target="_blank"><strong>Passo Üzerinden Bilet Al</strong></a></li>
</ul>
<p>Belli saatlerde ışık gösterileri oluyor, şanslıysanız bunlardan birisine denk gelebilirsiniz.</p>
<hr class="my-2" />
<h2 id="ayasofya">Ayasofya</h2>
<p><img src="https://images.unsplash.com/photo-1621165397923-e905aee3d28d?q=80&w=900&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://unsplash.com/photos/brown-and-white-concrete-building-under-blue-sky-during-daytime-LsnAVYaFjSw" rel="nofollow" target="_blank">unsplash</a></small></p>
<ul>
<li>Yerebatan Sarnıç’ından çıktıktan sonra yaklaşık 120mt. yürüdükten sonra ulaşabilirsiniz.</li>
<li>Ücretsiz.</li>
</ul>
<blockquote>
<p><a href="https://tr.wikipedia.org/wiki/Mustafa_Kemal_Atat%C3%BCrk" title="Mustafa Kemal Atatürk" rel="nofollow" target="_blank">Mustafa Kemal Atatürk</a> tarafından 1934 yılında yayımlanan kararname ile tadilat çalışmasına alınmış, 1947 yılında bakanlar kurulu kararı ile müzeye dönüştürülme kararı alınıp müzeye dönüştürülmüş, kazı ve tadilat çalışmaları başlatılmış ve 1947’den 2020’ye kadar müze olarak hizmet vermiştir. 2020 yılında ise müze statüsü iptal edilerek cami statüsü verilmiştir.</p>
</blockquote>
<p>İçerisi oldukça büyük olan bu yapıya girdiğinizde kafanızı yukarı kaldırın. Harika işçilikler göreceksiniz bazı motiflerin üzeri örtülü olsa da gene de muhteşem.</p>
<hr class="my-2" />
<h4 id="aya-i̇rini">Aya İrini</h4>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/4/42/Hagia_Irene%2C_Istanbul_%2852112279404%29_%28cropped%29.jpg" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://commons.wikimedia.org/w/index.php?curid=118766872" rel="nofollow" target="_blank">wikimedia.org</a> - <a href="https://creativecommons.org/licenses/by/2.0" rel="nofollow" target="_blank">CC BY 2.0</a></small></p>
<blockquote>
<p>Topkapı bahçesine giriş yaptıktan sonra bahçede Aya İrini kilisesi mevcut. <strong>Giriş ücreti yüksek</strong> olduğu için girmedik ama tercih ederseniz diye eklemiş olalım.</p>
</blockquote>
<hr class="my-2" />
<h2 id="topkapı-sarayı-müzesi">Topkapı Sarayı Müzesi</h2>
<p><img src="https://images.unsplash.com/photo-1597147873356-ab36fc52dd2d?q=80&w=900&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://unsplash.com/photos/brown-and-white-concrete-building-qUey2pOvbvc" rel="nofollow" target="_blank">unsplash</a></small></p>
<ul>
<li>Yaklaşık 300mt. yürüdükten sonra girişe ulaşacaksınız.</li>
<li><strong>Müzekart</strong> ile girebilirsiniz.</li>
</ul>
<blockquote>
<p>Topkapı Sarayı <a href="https://tr.wikipedia.org/wiki/II._Mehmed" title="II. Mehmed" rel="nofollow" target="_blank">Fatih Sultan Mehmed</a> tarafından 1478’de yaptırılmış, <a href="https://tr.wikipedia.org/wiki/Abd%C3%BClmecid" title="Abdülmecid" rel="nofollow" target="_blank">Abdülmecid</a>’in <a href="https://tr.wikipedia.org/wiki/Dolmabah%C3%A7e_Saray%C4%B1" title="Dolmabahçe Sarayı" rel="nofollow" target="_blank">Dolmabahçe Sarayı</a>’nı yaptırmasına kadar yaklaşık 380 sene boyunca devletin idare merkezi ve Osmanlı padişahlarının resmi ikâmetgâhı olmuştur. Kuruluş yıllarında yaklaşık 700.000 m²’lik bir alanda yer alan sarayın bugünkü alanı 80.000 m²’dir.</p>
</blockquote>
<p>Açık alan gezmekten en keyif aldığım yerler arasında. Bölüm bölüm olan olan müze de <a href="https://tr.wikipedia.org/wiki/Topkap%C4%B1_Saray%C4%B1_M%C3%BCzesi" title="Topkapı Sarayı Müzesi" rel="nofollow" target="_blank">Topkapı Sarayı Müzesi</a>‘nde sergilenen 86 <a href="https://tr.wikipedia.org/wiki/Karat_(a%C4%9F%C4%B1rl%C4%B1k_birimi)" title="Karat (ağırlık birimi)" rel="nofollow" target="_blank">karat</a> ağırlığında bir <a href="https://tr.wikipedia.org/wiki/Elmas" title="Elması" rel="nofollow" target="_blank">elmas</a> görmek isteyebilirsiniz. Tılsımlı kıyafetlerin de olduğu bir bölüm mevcut.</p>
<p>Bahçesine çıktığınızda ise unutamayacağınız bir manzara sizleri bekliyor. Güzel bir İstanbul anısı fotoğrafınızı burada çekebilirsiniz. Güzel fotoğrafınızı çeken varsa çok şanslısınız. Ben şanslıyım :)</p>
<hr class="my-2" />
<h2 id="arkeoloji-müzesi">Arkeoloji Müzesi</h2>
<p><img src="https://images.unsplash.com/photo-1667414451942-44418823d785?q=80&w=900&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://unsplash.com/photos/a-stone-sculpture-of-a-group-of-people-riding-horses-gcKnSqLxod4" rel="nofollow" target="_blank">unsplash</a></small></p>
<ul>
<li>Yaklaşık 100mt gülhane parkına doğru indikten sonra girişe ulaşabilirsiniz.</li>
<li><strong>Müzekart</strong> ile girebilirsiniz.</li>
</ul>
<p>İçerisi bölüm bölüm, her gittiğimizde yeni bir eseri fark ettiğimiz muhteşem bir müze. Dönem dönem ikinci katı açılıyor ve yeni eserler de sergileniyor. Mutlaka ikinci katın açık mı kapalı mı olduğunu sorun.</p>
<p>Lahitler, muhteşem heykeller var. İçeride zamanın nasıl geçtiğini anlayamayacaksınız bile.</p>
<hr class="my-2" />
<h2 id="gülhane-parkı">Gülhane Parkı</h2>
<p><img src="https://images.unsplash.com/photo-1620175163620-151d610c631d?q=80&w=900&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://unsplash.com/photos/people-walking-on-park-during-daytime-WhQzCUQrPzk" rel="nofollow" target="_blank">unsplash</a></small></p>
<ul>
<li>Yaklaşık 150-200mt. aşağı indikten sonra parka ulaşıyoruz.</li>
</ul>
<p>Gülhane parkı lale zamanı muhteşem oluyor. Bu tarihlere denk gelirseniz çok şanslısınız. Popülasyonunun karışık olduğu bu parkta biraz soluklanıp bol kedinin olduğu bir cafede çay kahve içebilirsiniz. Atıştırmalıkları da gayet güzel. İstanbul Büyükşehir Belediye’sinin olduğu için fiyatları da dışarıya göre hesaplı ve hijyenik <em>(ben öyle olduğunu düşünüyorum.)</em> tavsiye ederim.</p>
<p><a href="https://haritane.com/beltur-gulhane-kandil-tesisleri-detay5427890/" rel="nofollow" target="_blank"><strong>Gülhane Parkı Kandil Kafe, Beltur</strong></a></p>
<p>Kedilerden korkmayın çağırmadığınız sürece gelmezler. Kimin sevip kimin sevmediğini iyi biliyorlar.</p>
<hr class="my-2" />
<h2 id="i̇slam-bilim-ve-teknoloji-tarihi-müzesi">İslam Bilim ve Teknoloji Tarihi Müzesi</h2>
<p><img src="https://istanbul-tourist-information.com/en/wp-content/uploads/2021/08/Istanbul-Museum-of-the-History-of-Science-and-Technology-in-Islam-1-1024x538.jpg" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://istanbul-tourist-information.com/tr/istanbul-islam-bilim-ve-teknoloji-tarihi-muzesi/" rel="nofollow" target="_blank">istanbul-tourist-information</a></small></p>
<ul>
<li>Beltur’dan çıktıktan sonra park içinde 100mt yürüyerek ulaşabilirsiniz.</li>
<li><strong>Müzekart</strong> ile girebilirsiniz.</li>
</ul>
<p>Dışarıdan müze olduğu hatta içeride ne olduğu belli olmayan dikkat çekmeyen kaç kez önünden geçip şans eseri fark ettiğimiz bir yapı oldu. İçerisi beklentimizin çok ötesinde ve büyük. Sizleri de şaşırtacağınızı düşünüyoruz tavsiye ederiz.</p>
<hr class="my-2" />
<h2 id="gülhane-parkı-sarnıcı">Gülhane Parkı Sarnıcı</h2>
<p><img src="https://geziloji.com.tr/wp-content/uploads/2023/03/gulhane-sarnici.jpg" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://geziloji.com.tr/gulhane-sarnici-nerede-tarihi-konumu-ulasim.html" rel="nofollow" target="_blank">geziloji</a></small></p>
<p>Bu bölgede oluruz da sarnıç biter mi? tabi ki bitmez.</p>
<ul>
<li>Park içerisinde yaklaşık 150mt yürüdükten sonra ulaşabilirsiniz.</li>
<li>Giriş ücretsiz.</li>
</ul>
<p>Genellikle kimsenin olmadığı sessiz sakin güzel bir yapı. Küçük o yüzden fazla vakit geçiremeyebilirsiniz fakat gerek ışıklandırması gerek sakinliği dinlendiriyor. İstanbul’da olan anlar, özlemişsinizdir böyle anları :)</p>
<hr class="my-2" />
<h2 id="hagios-paulos-yetimhanesi-ve-gotlar-sütunu">Hagios Paulos Yetimhanesi ve Gotlar Sütunu</h2>
<p><img src="https://i.neredekal.com/i/neredekal/75/1200x800/607162308322e04b7a235452" class="w-100" alt="Eminönü Gezi Rehberi" />
<small class="d-block text-center mb-1">görsel <a href="https://www.neredekal.com/gotlar-sutunu-gezilecek-yer-detay/" rel="nofollow" target="_blank">neredekal</a></small></p>
<ul>
<li>Parkın sonuna doğru yürürken göreceksiniz.</li>
</ul>
<p>Fazla dikkat çekmeyen bu yapı biraz parkın sonlarına doğru tepede. Sütunları inceleyebilirsiniz. Biraz tepede kaldığı için tırmanış az da olsa yoruyor ama iyi tarafından bakalım bunu çoğu kişi tercih etmeyeceği için buyrun size sessiz bir nokta daha.</p>
<p>Gotlar Sütunu Roma savaş anıtı.</p>
<hr class="my-2" />
<h2 id="akşam-yemeği">Akşam Yemeği</h2>
<ul>
<li>Yaklaşık 1km yürüyerek gülhane parkından çıkıyoruz.</li>
</ul>
<p>Rotamızı Eminönü tarafına çeviriyoruz. Yaklaşık 400mt. Yürüdükten sonra tavsiye edebileceğim iki seçeneğim bulunuyor.</p>
<h4 id="meşhur-filibe-köftecisi">Meşhur Filibe Köftecisi</h4>
<ul><li>Muhteşem bir köfte yemek isterseniz</li></ul>
<div class="d-flex flex-wrap mb-2">
<div class="w-100 w-md-25 d-flex flex-column">
<a data-fancybox="post-gallery-food" data-src="https://www.meshurfilibekoftecisi.com/tema/restaurant/uploads/menuler/meshur-filibe-koftesi_1.jpg" class="d-flex cursor-pointer h-100">
<img src="https://www.meshurfilibekoftecisi.com/tema/restaurant/uploads/menuler/meshur-filibe-koftesi_1.jpg" class="w-100 h-100 object-fit-cover" alt="Eminönü Gezi Rehberi" />
</a>
<small class="d-block text-center mb-1">görsel <a href="https://www.meshurfilibekoftecisi.com/kategori/filibe-koftecisi.html" rel="nofollow" target="_blank">meshurfilibekoftecisi</a></small>
</div>
<div class="w-100 w-md-75 pl-0 pl-md-1">
<strong><a href="https://maps.app.goo.gl/WMWCF8M1qdnqMUxo8" rel="nofollow" target="_blank">Google Yorumum - Haritalar</a></strong>
<ul>
<li><a href="https://www.meshurfilibekoftecisi.com/kategori/filibe-koftecisi.html" rel="nofollow" target="_blank">Fiyat Listesi</a></li>
<li>Yemekler çok lezzetliydi.</li>
<li><strong>Puan</strong><br />⭐⭐⭐⭐⭐</li>
</ul>
</div>
</div>
<h4 id="şehzade-cağ-kebap">Şehzade Cağ Kebap</h4>
<ul><li>Yöresel bir lezzet isterseniz</li></ul>
<div class="d-flex flex-wrap mb-2">
<div class="w-100 w-md-25 d-flex flex-column">
<a data-fancybox="post-gallery-food" data-src="https://media-cdn.tripadvisor.com/media/photo-s/12/80/a5/8a/cag-kebap-spicy-ezme.jpg" class="d-flex cursor-pointer h-100">
<img src="https://media-cdn.tripadvisor.com/media/photo-s/12/80/a5/8a/cag-kebap-spicy-ezme.jpg" class="w-100 h-100 object-fit-cover" alt="Eminönü Gezi Rehberi" />
</a>
<small class="d-block text-center mb-1">görsel <a href="https://www.tripadvisor.com.tr/Restaurant_Review-g293974-d2288800-Reviews-Sehzade_Cag_Kebap-Istanbul.html" rel="nofollow" target="_blank">tripadvisor</a></small>
</div>
<div class="w-100 w-md-75 pl-0 pl-md-1">
<strong><a href="https://maps.app.goo.gl/LkqeoUzLv3NgkS4L9" rel="nofollow" target="_blank">Google Yorumum - Haritalar</a></strong>
<ul>
<li>harika lezzet, bir tık pahalı. biraz yağlı, göz doyurucu değil fakat doyuyorsunuz bir porsiyon söyleyin sonra ek şiş söyleyebiliyorsunuz. sıcak sıcak yersiniz. manda yoğurt gayet başarılı. tavsiye ederim güzel mekan.</li>
<li><strong>Puan: </strong>⭐⭐⭐⭐⭐</li>
</ul>
</div>
</div>
<p>İkisi de muhteşem. İstediğinizi tercih edebilirisiniz.</p>
<h4 id="bonus-köfteci---tarihi-özkan-köftecisi">Bonus Köfteci - Tarihi Özkan Köftecisi</h4>
<ul><li>Muhteşem başka bir köfteci</li></ul>
<div class="d-flex flex-wrap mb-2">
<div class="w-100 w-md-25 d-flex flex-column">
<a data-fancybox="post-gallery-food" data-src="https://media-cdn.tripadvisor.com/media/photo-s/0b/4a/7f/d8/ozkan-koftecisi.jpg" class="d-flex cursor-pointer h-100">
<img src="https://media-cdn.tripadvisor.com/media/photo-s/0b/4a/7f/d8/ozkan-koftecisi.jpg" class="w-100 h-100 object-fit-cover" alt="Eminönü Gezi Rehberi" />
</a>
<small class="d-block text-center mb-1">görsel <a href="https://www.tripadvisor.com.tr/Restaurant_Review-g293974-d2672465-Reviews-Tarihi_Ozkan_Koftecisi-Istanbul.html" rel="nofollow" target="_blank">tripadvisor</a></small>
</div>
<div class="w-100 w-md-75 pl-0 pl-md-1">
<strong><a href="https://maps.app.goo.gl/A5nRUjeMCxMJyWJY6" rel="nofollow" target="_blank">Google Yorumum - Haritalar</a></strong>
<ul>
<li>tarihi çarşının içinde harika bir lezzet. doyurucu ve fiyatları iyi (1,5 porsiyon)</li>
<li><strong>Puan: </strong>⭐⭐⭐⭐⭐</li>
</ul>
</div>
</div>
<hr class="my-2" />
<h2 id="tatlı">Tatlı</h2>
<p>Biz Tatlıcı Safa Sirkeci’yi tercih ettik fakat <strong>beğenmedik</strong> o yüzden tatlı konusunda bir yönlendirme yapmak istemiyorum. Fakat ilginç derecede fiyatlar çok uygundu. Bu fiyatlara çay kahveyi bile zor içersiniz. Google yorumlarda menüyü de paylaşıyor olacağım.</p>
<p><a href="https://maps.app.goo.gl/7JoHhCQf1Ad9M5pX7" rel="nofollow" target="_blank">Google Yorumum - Haritalar</a></p>
<p>Karaköy Güllüoğlu çok met ediliyor denemedik ama aklınızda bulunsun.</p>
Eğitim - BTK Mersin İli Front-End Web Geliştirme Atölyesi
2023-12-24T00:00:00+00:00
https://hasanunal.org/blog/mersin-ili-front-end-web-gelistirme-atolyesi-2023
<p>BTK Akademi’nin Mersin’de düzenlediği, Üniversite öğrencileri ve yeni mezunlara yönelik front-end web geliştirme atölyesini tamamladık.</p>
<p>Bir ay süren eğitimde sektörde bizi neler bekliyor sorusuna kapı aralamış olduk. Keyifli bir süreçti. Katılan arkadaşlara teşekkür eder, kariyer yolculuklarında başarılar dilerim ✨</p>
<div class="d-flex justify-content-center gap-1 mb-2">
<div class="w-33">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2023-12-24_mersin-ili-front-end-web-gelistirme-atolyesi-2023/mersin-ili-front-end-web-gelistirme-atolyesi-2023-1.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2023-12-24_mersin-ili-front-end-web-gelistirme-atolyesi-2023/mersin-ili-front-end-web-gelistirme-atolyesi-2023-1.jpg" class="w-100 h-100 object-fit-contain" alt="BTK Mersin İli Front-End Web Geliştirme Atölyesi" />
</a>
</div>
<div class="w-33">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2023-12-24_mersin-ili-front-end-web-gelistirme-atolyesi-2023/mersin-ili-front-end-web-gelistirme-atolyesi-2023-2.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2023-12-24_mersin-ili-front-end-web-gelistirme-atolyesi-2023/mersin-ili-front-end-web-gelistirme-atolyesi-2023-2.jpg" class="w-100 h-100 object-fit-contain" alt="BTK Mersin İli Front-End Web Geliştirme Atölyesi" />
</a>
</div>
<div class="w-33">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2023-12-24_mersin-ili-front-end-web-gelistirme-atolyesi-2023/mersin-ili-front-end-web-gelistirme-atolyesi-2023-3.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2023-12-24_mersin-ili-front-end-web-gelistirme-atolyesi-2023/mersin-ili-front-end-web-gelistirme-atolyesi-2023-3.jpg" class="w-100 h-100 object-fit-contain" alt="BTK Mersin İli Front-End Web Geliştirme Atölyesi" />
</a>
</div>
</div>
<div style="position:relative;overflow:hidden;padding-top: 78%;width:50%; margin: 0 auto; border-radius: 10px; border: 1px solid #ebebeb;">
<iframe frameborder="0" style="position:absolute;top:0;left:0;width:100%;height:100%;border:0;" src="https://www.linkedin.com/embed/feed/update/urn:li:activity:7145313032506699776"></iframe>
</div>
<blockquote>
<p><a href="https://www.btkakademi.gov.tr/portal/public/MersinFrontendWebGelistirme2023" rel="nofollow" target="_blank">btkakademi.gov.tr - BTK Mersin İli Front-End Web Geliştirme Atölyesi</a></p>
</blockquote>
Google Drive Videoları HTML5 ile Sayfada Yükletmek
2023-10-15T00:00:00+00:00
https://hasanunal.org/blog/google-drive-videolari-html5-ile-sayfada-yukletmek
<p>Gezerken kısa kesitler halinde videolar çekiyorum. Çektiğim videoları amatör bir şekilde birleştirip, kolaj haline getirip sitemde paylaşmak istedim fakat videolar büyük boyutlu medyalar. Fotoğrafları bile 3.parti bir servisle çözerken videoları repoda depolamak anlamsız olurdu. İhtiyaç böyle ortaya çıktı ve araştırmaya başladım.</p>
<p>Başka birisi <a href="https://stackoverflow.com/questions/48124306/embedding-google-drive-videos-using-html5-video">stackoverflow’da ‘HTML5 videosunu kullanarak Google Drive Videolarını yerleştirme’</a> şeklinde bir soru sormuş. Cevapta ise video indirme bağlantısına video id verilirse onayatabileceği yönündeydi. Bu cevap tüm ihtiyaçları karşılıyordu.</p>
<p>Hızlıca nasıl yapacağınızı anlatıyorum.</p>
<p>Google Drive üzerinden paylaşılan videoları HTML5 ile kendi playeriniz ile sayfada yüklemek için birkaç adımı takip etmek gerekiyor. Bu adımları takip ederek, Google Drive üzerinden paylaşılan videoları kendi playeriniz ile sayfada oynatabilirsiniz.</p>
<h2 id="google-drive-videoları-sitenize-ekleme">Google Drive Videoları Sitenize Ekleme</h2>
<ul>
<li>Google Drive’a öncelikle sitemizde yayınlayacağımız videoları yüklüyoruz.</li>
<li>Yüklediğimiz videoyu herkese açık olacak şekilde paylaşıyoruz.</li>
<li>Yüklediğimiz videoya çift tıklayıp önizlemesini açıyoruz ve sağ üst köşede bulunan üç noktaya tıklıyoruz.</li>
<li>Açılan menüden “Yeni pencerede aç” seçeneğini seçiyoruz.</li>
<li>Açılan yeni pencerede video ID’yi kopyalıyoruz. https://drive.google.com/file/d/ID/view Buradaki ID kısmını kopyalıyoruz.</li>
<li>Artık bu ID ile videoyu sayfamızda oynatabiliriz.</li>
</ul>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><video</span> <span class="na">width=</span><span class="s">"320"</span> <span class="na">height=</span><span class="s">"240"</span> <span class="na">controls</span><span class="nt">></span>
<span class="nt"><source</span> <span class="na">src=</span><span class="s">"https://drive.google.com/uc?export=download&id=ID"</span> <span class="na">type=</span><span class="s">"video/mp4"</span><span class="nt">></span>
<span class="nt"></video></span>
</code></pre></div></div>
<p>Buradaki <strong>trick</strong> <strong>Google Drive</strong> dosya boyutu maks 99MB olan videolarınızı virüs kontrolü yapmadan indirmenizi sağlayabildiği için playerinize çekebilirsiniz. Fakat üstü boyutları oynatamazsınız hata verir. Bu yüzden videolarınızı 99MB’ın altında tutmanız gerekiyor.</p>
<h3 id="bu-yapıyı-özelleştirmek-isterseniz">Bu yapıyı özelleştirmek isterseniz</h3>
<p>Öncelikle sık kullanacaksanız bir fonksiyona bağlamakta fayda var.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">data-video-type=</span><span class="s">"reels"</span> <span class="na">data-video-id=</span><span class="s">"videoID"</span> <span class="na">data-video-title=</span><span class="s">"videoTitle"</span> <span class="na">data-video-cover=</span><span class="s">"videoCover"</span><span class="nt">></span>
<span class="nt"><img</span> <span class="na">src=</span><span class="s">"videoCover"</span> <span class="na">alt=</span><span class="s">"videoTitle"</span> <span class="nt">/></span>
<span class="nt"><span></span>videoTitle<span class="nt"></span></span>
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nx">createPopupVideo</span><span class="p">(</span><span class="nx">videoSrc</span><span class="p">,</span> <span class="nx">videoCover</span><span class="p">,</span> <span class="nx">videoTitle</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">popupOverlay</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">'</span><span class="s1">div</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">popupOverlay</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="dl">'</span><span class="s1">popup-video-overlay</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">popupVideo</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">'</span><span class="s1">div</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">popupVideo</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="dl">'</span><span class="s1">popup-video</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">popupVideo</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="s2">`
<div class="close-button">&times;</div>
<video class="video-reels-frame" poster="</span><span class="p">${</span><span class="nx">videoCover</span><span class="p">}</span><span class="s2">" controlsList="nodownload" controls="false">
<source src="</span><span class="p">${</span><span class="nx">videoSrc</span><span class="p">}</span><span class="s2">" type="video/mp4">
Your browser does not support the video tag.
</video>
<div class="video-reels-desc-popup">
<span></span><span class="p">${</span><span class="nx">videoTitle</span><span class="p">}</span><span class="s2"></span>
</div>
`</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">closeButton</span> <span class="o">=</span> <span class="nx">popupVideo</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">.close-button</span><span class="dl">'</span><span class="p">);</span>
<span class="nx">closeButton</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="nx">popupOverlay</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">none</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">popupOverlay</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span>
<span class="nx">popupVideo</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">none</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">popupVideo</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span>
<span class="p">});</span>
<span class="nx">popupOverlay</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="nx">popupOverlay</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">none</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">popupOverlay</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span>
<span class="nx">popupVideo</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">none</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">popupVideo</span><span class="p">.</span><span class="nx">remove</span><span class="p">();</span>
<span class="p">});</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">popupOverlay</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">popupVideo</span><span class="p">);</span>
<span class="k">return</span> <span class="p">{</span> <span class="na">overlay</span><span class="p">:</span> <span class="nx">popupOverlay</span><span class="p">,</span> <span class="na">video</span><span class="p">:</span> <span class="nx">popupVideo</span> <span class="p">};</span>
<span class="p">}</span>
<span class="kd">const</span> <span class="nx">reelsPopups</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="dl">'</span><span class="s1">[data-video-type="reels"]</span><span class="dl">'</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">reelsPopups</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">reelsPopups</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">reelsPopup</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">reelsPopup</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">click</span><span class="dl">'</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">videoId</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">videoId</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">videoCover</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">videoCover</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">videoTitle</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">videoTitle</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">videoSrc</span> <span class="o">=</span> <span class="s2">`https://drive.google.com/uc?&id=</span><span class="p">${</span><span class="nx">videoId</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">popupVideo</span> <span class="o">=</span> <span class="nx">createPopupVideo</span><span class="p">(</span><span class="nx">videoSrc</span><span class="p">,</span> <span class="nx">videoCover</span><span class="p">,</span> <span class="nx">videoTitle</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">});</span>
<span class="p">}</span>
</code></pre></div></div>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.popup-video</span> <span class="p">{</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">fixed</span><span class="p">;</span>
<span class="nl">top</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">left</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">transform</span><span class="p">:</span> <span class="nf">translate</span><span class="p">(</span><span class="m">-50%</span><span class="o">,</span> <span class="m">-50%</span><span class="p">);</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">24</span><span class="o">,</span> <span class="m">24</span><span class="o">,</span> <span class="m">27</span><span class="o">,</span> <span class="m">0</span><span class="mi">.92</span><span class="p">);</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">5px</span><span class="p">;</span>
<span class="nl">border-radius</span><span class="p">:</span> <span class="m">15px</span><span class="p">;</span>
<span class="nl">z-index</span><span class="p">:</span> <span class="m">3</span><span class="p">;</span>
<span class="k">@media</span> <span class="p">(</span><span class="n">max-width</span><span class="o">:</span> <span class="m">767px</span><span class="p">)</span> <span class="p">{</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">80%</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">&</span><span class="nt">-overlay</span> <span class="p">{</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">24</span><span class="o">,</span> <span class="m">24</span><span class="o">,</span> <span class="m">27</span><span class="o">,</span> <span class="m">0</span><span class="mi">.92</span><span class="p">);</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">fixed</span><span class="p">;</span>
<span class="nl">top</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">right</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">bottom</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">left</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="nl">z-index</span><span class="p">:</span> <span class="m">2</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.close-button</span> <span class="p">{</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">24</span><span class="o">,</span> <span class="m">24</span><span class="o">,</span> <span class="m">27</span><span class="o">,</span> <span class="m">0</span><span class="mi">.92</span><span class="p">);</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">flex</span><span class="p">;</span>
<span class="nl">align-items</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="nl">justify-content</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">fixed</span><span class="p">;</span>
<span class="nl">right</span><span class="p">:</span> <span class="m">-30px</span><span class="p">;</span>
<span class="nl">top</span><span class="p">:</span> <span class="m">-30px</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span> <span class="mh">#fff</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">30px</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="m">30px</span><span class="p">;</span>
<span class="nl">font-weight</span><span class="p">:</span> <span class="m">100</span><span class="p">;</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">24px</span><span class="p">;</span>
<span class="nl">border-radius</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">z-index</span><span class="p">:</span> <span class="m">3</span><span class="p">;</span>
<span class="nl">cursor</span><span class="p">:</span> <span class="nb">pointer</span><span class="p">;</span>
<span class="p">}</span>
<span class="nt">video</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="nb">block</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="na">aspect-ratio</span><span class="p">:</span> <span class="m">9</span><span class="o">/</span><span class="m">16</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="nb">auto</span><span class="p">;</span>
<span class="nl">max-height</span><span class="p">:</span> <span class="m">80vh</span><span class="p">;</span>
<span class="nl">outline</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span>
<span class="nl">border</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span>
<span class="nl">border-radius</span><span class="p">:</span> <span class="m">10px</span><span class="p">;</span>
<span class="nl">margin</span><span class="p">:</span> <span class="nb">auto</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Gerisini kendinize göre özelleştirebilirsiniz.</p>
<h2 id="sonuç">Sonuç</h2>
<p><a href="/reels/">Örnek görmek isterseniz buraya bakabilirsiniz.</a></p>
Reels - Vapur
2023-09-25T00:00:00+00:00
https://hasanunal.org/blog/reels-vapur
<p>İstanbul’da en keyif aldığım anlardan birisi de vapur yolculuğu yapmak. Özellikle güzel bir hava olduğunda, güneşin batışını izlemek için en güzel yerlerden birisi vapur. Bu videoda, vapur yolculuğu yaparken çektiğim kısa kesitleri birleştirerek reels olarak paylaştım.</p>
<div class="cursor-pointer video-reels-cover w-100 w-md-50 mx-auto mb-2" data-video-type="reels" data-video-id="1Ctdenu7_IAW8CtiHNsX8BLtV16JYohIt" data-video-title="VAPUR" data-video-cover="/assets/img/blog/2023-09-25-reels-vapur/reels-vapur-cover.png">
<img src="/assets/img/blog/2023-09-25-reels-vapur/reels-vapur-cover.png" class="d-block w-100 border-rounded" alt="Reels - Vapur" />
</div>
<blockquote>
<p>Sizde kısa videolarınızı sitenize eklemek isterseniz <a href="/blog/google-drive-videolari-html5-ile-sayfada-yukletmek">Google Drive Videoları HTML5 ile Sayfada Yükletmek</a> ilgili makaleye göz atabilirsiniz.</p>
</blockquote>
UI Developer Kariyeri Önerileri
2023-08-24T00:00:00+00:00
https://hasanunal.org/blog/ui-developer-kariyeri-onerileri
<p>Kıymetli meslektaşlarım Huseyin Daşçı ile UI Developer olmak isteyen arkadaşlara, dikkat etmeleri gereken hususlar hakkında fikirlerimizi paylaştık, Sefa Gayret hocamın sorularını yanıtladık.</p>
<p>Eğlenceli ve bilgilendirici bir yayın oldu.</p>
<h4 id="aşağıdaki-sorulara-yanıtlar-bulduk">Aşağıdaki sorulara yanıtlar bulduk.</h4>
<ul>
<li>Yazılım dünyasında UI Developer Kariyerinin bu kadar popüler olmasının nedenleri neler?</li>
<li>UI Developer alanında uzmanlaşmak isteyenlerin hangi yeteneklere sahip olması gerekir?</li>
<li>UI Developer adaylarının kariyer yolculuklarında sıklıkla yaptığı hatalar neler?</li>
<li>Siz bugün kariyerinizin başında olsanız neyi farklı yapardınız?</li>
<li>Adaylar mülakatlarda nasıl davranmalı, nelere dikkat etmeli?</li>
</ul>
<p>UIDeveloper kariyer yolculuğu hakkında fikirlerimizi paylaştığımız bir yayın oldu. Bizim için de yeni bir deneyim oldu. Umarım faydalı olmuştur.</p>
<p>Yayını organize eden Safa hocama ve beni hiçbir konuda yalnız bırakmayan Huseyin hocama teşekkür ederim.</p>
<div class="mx-auto">
<iframe width="100%" height="315" src="https://www.youtube.com/embed/9OY1u1gPKtA?si=7g2X10F1tjAkEtLx" class="border-rounded aspect-ratio-16-9" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>
</div>
<blockquote>
<p><a href="https://www.linkedin.com/posts/safagayret_ui-developer-kariyeri-%C3%B6nerileri-activity-7100581766263959553-8krJ/" rel="nofollow" target="_blank">Safa Gayret - UI Developer Kariyeri için işin uzmanlarından öneriler</a></p>
</blockquote>
Unsplash api ile resim çekme ve kullanma
2023-07-08T00:00:00+00:00
https://hasanunal.org/blog/unsplash-api-ile-resim-cekme-ve-kullanma
<p>Merhaba,</p>
<p>Unsplash API’sini kullanarak fotoğraf galerisi oluşturmayı örnek ile anlatmaya çalışacağım. JavaScript kullanarak API’den resimleri çekecek ve galeriye ekleyeceğiz. Ayrıca, sayfa scroll edildikçe otomatik olarak daha fazla resim yükleyeceğiz.</p>
<h2 id="i̇htiyaçlarımız">İhtiyaçlarımız</h2>
<ul>
<li>Unsplash API anahtarı</li>
<li>HTML dosyası</li>
<li>CSS dosyası</li>
<li>JavaScript dosyası</li>
</ul>
<h2 id="html-ve-css-dosyalarını-hazırlama">HTML ve CSS Dosyalarını Hazırlama</h2>
<p>İlk olarak, HTML dosyanızda bir <code>unsplash-gallery</code> id’sini verin. Bu, Unsplash resimlerini bu kapsayıcıya çekeceğiz. Sonrasında CSS ile görünümü iyileştireceğiz.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><!DOCTYPE html></span>
<span class="nt"><html></span>
<span class="nt"><head></span>
<span class="nt"><link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"style.css"</span><span class="nt">></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="nt"><div</span> <span class="na">id=</span><span class="s">"unsplash-gallery"</span><span class="nt">></div></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"script.js"</span><span class="nt">></script></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div></div>
<h2 id="css-dosyası-opsiyonel">CSS Dosyası (opsiyonel)</h2>
<p>SCSS dosyası oluşturup aşağıdaki kodları ekleyin. Bu kodlar sayesinde resimlerin görünümünü iyileştireceğiz.</p>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.masonry-gallery</span> <span class="p">{</span>
<span class="nl">column-count</span><span class="p">:</span> <span class="m">4</span><span class="p">;</span>
<span class="nl">column-gap</span><span class="p">:</span> <span class="m">16px</span><span class="p">;</span>
<span class="nc">.masonry-item</span> <span class="p">{</span>
<span class="nt">a</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">inline-block</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="nb">auto</span><span class="p">;</span>
<span class="nl">cursor</span><span class="p">:</span> <span class="nb">pointer</span><span class="p">;</span>
<span class="p">}</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">inline-block</span><span class="p">;</span>
<span class="nl">margin-bottom</span><span class="p">:</span> <span class="m">1rem</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="nt">img</span> <span class="p">{</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="nb">auto</span><span class="p">;</span>
<span class="nl">border-radius</span><span class="p">:</span> <span class="m">5px</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">@media</span> <span class="p">(</span><span class="n">max-width</span><span class="o">:</span> <span class="m">1200px</span><span class="p">)</span> <span class="p">{</span>
<span class="nl">column-count</span><span class="p">:</span> <span class="m">3</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">@media</span> <span class="p">(</span><span class="n">max-width</span><span class="o">:</span> <span class="m">767px</span><span class="p">)</span> <span class="p">{</span>
<span class="nl">column-count</span><span class="p">:</span> <span class="m">2</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<h2 id="javascript-dosyası">JavaScript Dosyası</h2>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">unsplash_gallery</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">unsplash-gallery</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">client_id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">UNSPLASH_API_ANAHTARI</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">per_page</span> <span class="o">=</span> <span class="mi">8</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">page</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">isLoading</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
<span class="c1">// Daha fazla resim yüklemek için çağrılan fonksiyon</span>
<span class="kd">const</span> <span class="nx">loadMore</span> <span class="o">=</span> <span class="k">async</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">isLoading</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
<span class="nx">isLoading</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
<span class="k">try</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s2">`https://api.unsplash.com/users/UNSPLASH_KULLANICI_ADI/photos/?client_id=</span><span class="p">${</span><span class="nx">client_id</span><span class="p">}</span><span class="s2">&per_page=</span><span class="p">${</span><span class="nx">per_page</span><span class="p">}</span><span class="s2">&page=</span><span class="p">${</span><span class="nx">page</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">data</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(({</span> <span class="nx">urls</span> <span class="p">})</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">unsplash_gallery</span><span class="p">.</span><span class="nx">insertAdjacentHTML</span><span class="p">(</span><span class="dl">'</span><span class="s1">beforeend</span><span class="dl">'</span><span class="p">,</span> <span class="nx">generateHTML</span><span class="p">(</span><span class="nx">urls</span><span class="p">));</span>
<span class="p">});</span>
<span class="nx">page</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Bir hata oluştu:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
<span class="p">}</span>
<span class="nx">isLoading</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1">// HTML oluşturma fonksiyonu</span>
<span class="kd">const</span> <span class="nx">generateHTML</span> <span class="o">=</span> <span class="p">(</span><span class="nx">urls</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">`<div class="masonry-item">
<img src="</span><span class="p">${</span><span class="nx">urls</span><span class="p">.</span><span class="nx">thumb</span><span class="p">}</span><span class="s2">" width="210" height="280" alt="image" />
</div>`</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1">// Sayfa scroll edildikçe daha fazla resim yüklemek için dinleyici ekleme</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">scroll</span><span class="dl">'</span><span class="p">,</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">scrollTop</span><span class="p">,</span> <span class="nx">scrollHeight</span><span class="p">,</span> <span class="nx">clientHeight</span> <span class="p">}</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">documentElement</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">scrollTop</span> <span class="o">+</span> <span class="nx">clientHeight</span> <span class="o">>=</span> <span class="nx">scrollHeight</span> <span class="o">-</span> <span class="mi">200</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">loadMore</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="c1">// İlk yüklemeyi başlatma</span>
<span class="nx">loadMore</span><span class="p">();</span>
</code></pre></div></div>
<p>Yukarıdaki JavaScript kodunda, <strong>UNSPLASH_API_ANAHTARI</strong> ve <strong>UNSPLASH_KULLANICI_ADI</strong> yerine kendi Unsplash API anahtarınızı ve Unsplash kullanıcı adınızı girin. Bu sayede API’ye istek yapacak ve resimleri çekeceğiz. Ayrıca, galeriye resimleri eklemek ve sayfa scroll edildikçe daha fazla resim yüklemesi ayarladık.</p>
<h3 id="unsplash-api-anahtarını-alma">Unsplash API Anahtarını Alma</h3>
<p>Unsplash API’sini kullanmak için bir API anahtarına ihtiyacınız olacak. Unsplash API’sini kullanmak için bir hesap oluşturmanız gerekiyor. Hesabınızı oluşturduktan sonra, Unsplash API anahtarınızı alabilirsiniz.</p>
<p>Unsplash API anahtarınızı almak için, Unsplash geliştirici sayfasına gidin ve hesabınızla giriş yapın. Giriş yaptıktan sonra, API anahtarınızı almak için <strong>New Application</strong> butonuna tıklayın.</p>
<h2 id="galeriyi-oluşturma">Galeriyi Oluşturma</h2>
<p>Son adımda, HTML dosyanızı bir tarayıcıda açın. Galeri, Unsplash API’sinden çekilen resimleri görüntüleyecektir. Sayfa scroll edildikçe otomatik olarak daha fazla resim yüklenecektir.</p>
<p>Bu adımları takip ederek, Unsplash API’sini kullanarak dinamik bir fotoğraf galerisi oluşturabilirsiniz. JavaScript kodu, sayfa yüklenirken otomatik olarak bazı resimler yükleyecek ve scroll edildikçe galeriye daha fazla resim ekleyecektir.</p>
<p>Galeri görünümünü CSS dosyanızda özelleştirebilir ve istediğiniz gibi düzenleyebilirsiniz. Projenizi geliştirmek fancybox kütüphanesini dahil edebiliriz.</p>
<h2 id="fancybox-kütüphanesini-dahil-etme-opsiyonel">Fancybox Kütüphanesini Dahil Etme (opsiyonel)</h2>
<p><a href="https://fancyapps.com/fancybox/getting-started/" rel="nofollow" target="_blank">fancyapps.com</a> adresinden kütüphaneyi projenize dahil ediniz.</p>
<p>İlgili satırı aşağıdaki kod ile değiştiriniz.</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// HTML oluşturma fonksiyonu</span>
<span class="kd">const</span> <span class="nx">generateHTML</span> <span class="o">=</span> <span class="p">(</span><span class="nx">urls</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">`<div class="masonry-item">
<a data-fancybox="gallery" data-src="</span><span class="p">${</span><span class="nx">urls</span><span class="p">.</span><span class="nx">regular</span><span class="p">}</span><span class="s2">">
<img src="</span><span class="p">${</span><span class="nx">urls</span><span class="p">.</span><span class="nx">thumb</span><span class="p">}</span><span class="s2">" width="210" height="280" alt="image" />
</a>
</div>`</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>Daha da geliştirelim ve lazyload da dahil edelim.</p>
<h2 id="lazyload-kütüphanesini-dahil-etme-opsiyonel">Lazyload Kütüphanesini Dahil Etme (opsiyonel)</h2>
<p><a href="https://www.npmjs.com/package/lazysizes" rel="nofollow" target="_blank">npmjs.com/package/lazysizes</a> adresinden kütüphaneyi projenize dahil ediniz.</p>
<p><code>src</code> adresine yüklenirken gözükecek görseli belirliyoruz.
<code>data-src</code> adresine ise resim yolunu yazıyouz.</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// HTML oluşturma fonksiyonu</span>
<span class="kd">const</span> <span class="nx">generateHTML</span> <span class="o">=</span> <span class="p">(</span><span class="nx">urls</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">`<div class="masonry-item">
<a data-fancybox="gallery" data-src="</span><span class="p">${</span><span class="nx">urls</span><span class="p">.</span><span class="nx">regular</span><span class="p">}</span><span class="s2">">
<img loading="lazy" src="default-content-image.svg" data-src="</span><span class="p">${</span><span class="nx">urls</span><span class="p">.</span><span class="nx">thumb</span><span class="p">}</span><span class="s2">" class="lazyload" width="210" height="280" alt="image" />
</a>
</div>`</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>Bu projede, Unsplash API’sini kullanarak bir galeri oluşturma sürecini anlatmaya çalıştım. Umarım yardımcı olmuştur.</p>
<hr />
<p><a href="/blog/unsplash-api-ile-koleksiyon-cekme-ve-kullanma">Unsplash API ile koleksiyon kullanımı için ilgili makaleye bakabilirsiniz.</a></p>
Unsplash api ile koleksiyon çekme ve kullanma
2023-07-08T00:00:00+00:00
https://hasanunal.org/blog/unsplash-api-ile-koleksiyon-cekme-ve-kullanma
<p>Merhaba,</p>
<p>Bir önceki yazımızda Unsplash API’sini kullanarak fotoğraf galerisi oluşturmayı anlatmıştım. Bu yazımızda ise Unsplash API’sini kullanarak koleksiyon resimlerini çekmeyi ve kullanmayı anlatacağım.</p>
<h2 id="koleksiyon-resimlerini-çekme">Koleksiyon Resimlerini Çekme</h2>
<p>Koleksiyon resimlerini çekmek için Unsplash API’sinin <code>/collections</code> endpoint’ini kullanacağız. Bu endpoint’e <code>client_id</code> ve <code>per_page</code> parametrelerini göndererek koleksiyon resimlerini çekeceğiz. <code>client_id</code> parametresi Unsplash API anahtarımızı, <code>per_page</code> parametresi ise sayfa başına kaç resim çekmek istediğimizi belirtiyor.</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Belirtilen kimliğe sahip HTML elementini al</span>
<span class="kd">const</span> <span class="nx">unsplash_collections</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">unsplash-collections</span><span class="dl">"</span><span class="p">);</span>
<span class="c1">// Element varsa devam et</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">unsplash_collections</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Unsplash API anahtarını al</span>
<span class="kd">const</span> <span class="nx">client_id</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">f_ljObZDY9xozwVHZGfQfa9hkqYP9WyvbRkbK4Hap74</span><span class="dl">"</span><span class="p">;</span>
<span class="c1">// Koleksiyon kimliğini al</span>
<span class="kd">const</span> <span class="nx">collection_id</span> <span class="o">=</span> <span class="nx">unsplash_collections</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">collectionId</span><span class="p">;</span>
<span class="c1">// Her sayfada görüntülenecek fotoğraf sayısı</span>
<span class="kd">const</span> <span class="nx">per_page</span> <span class="o">=</span> <span class="mi">30</span><span class="p">;</span>
<span class="c1">// Sayfa numarası ve yükleme durumu değişkenleri</span>
<span class="kd">let</span> <span class="nx">page</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">isLoading</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
<span class="c1">// Daha fazla fotoğraf yükleme işlevi</span>
<span class="kd">const</span> <span class="nx">loadMore</span> <span class="o">=</span> <span class="k">async</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="c1">// Yükleme işlemi devam ediyorsa çık</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">isLoading</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
<span class="nx">isLoading</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
<span class="k">try</span> <span class="p">{</span>
<span class="c1">// Unsplash API'ye istek gönder ve veri al</span>
<span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">fetch</span><span class="p">(</span><span class="s2">`https://api.unsplash.com/collections/</span><span class="p">${</span><span class="nx">collection_id</span><span class="p">}</span><span class="s2">/photos/?client_id=</span><span class="p">${</span><span class="nx">client_id</span><span class="p">}</span><span class="s2">&per_page=</span><span class="p">${</span><span class="nx">per_page</span><span class="p">}</span><span class="s2">&page=</span><span class="p">${</span><span class="nx">page</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nx">json</span><span class="p">();</span>
<span class="c1">// Gelen veri varsa işle</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">data</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Her bir fotoğraf için HTML içeriği oluştur ve ekle</span>
<span class="nx">data</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(({</span> <span class="nx">urls</span> <span class="p">})</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">unsplash_collections</span><span class="p">.</span><span class="nx">insertAdjacentHTML</span><span class="p">(</span><span class="dl">'</span><span class="s1">beforeend</span><span class="dl">'</span><span class="p">,</span> <span class="nx">generateHTML</span><span class="p">(</span><span class="nx">urls</span><span class="p">));</span>
<span class="p">});</span>
<span class="nx">page</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// Hata durumunda konsola yazdır</span>
<span class="nx">console</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Bir hata oluştu:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// Yükleme işlemi tamamlandığında durumu güncelle</span>
<span class="nx">isLoading</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1">// Fotoğraf HTML içeriğini oluşturma işlevi</span>
<span class="kd">const</span> <span class="nx">generateHTML</span> <span class="o">=</span> <span class="p">(</span><span class="nx">urls</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">return</span> <span class="s2">`<div class="masonry-item">
<img src="</span><span class="p">${</span><span class="nx">urls</span><span class="p">.</span><span class="nx">thumb</span><span class="p">}</span><span class="s2">" width="210" height="280" alt="image" />
</div>`</span><span class="p">;</span>
<span class="p">};</span>
<span class="c1">// Sayfa kaydırıldığında daha fazla fotoğraf yükleme</span>
<span class="nb">window</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">scroll</span><span class="dl">'</span><span class="p">,</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">scrollTop</span><span class="p">,</span> <span class="nx">scrollHeight</span><span class="p">,</span> <span class="nx">clientHeight</span> <span class="p">}</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">documentElement</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">scrollTop</span> <span class="o">+</span> <span class="nx">clientHeight</span> <span class="o">>=</span> <span class="nx">scrollHeight</span> <span class="o">-</span> <span class="mi">200</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">loadMore</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="c1">// İlk yükleme işlemini başlat</span>
<span class="nx">loadMore</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Sayfada kullanmak için ise data-attr kullanacağız.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">id=</span><span class="s">"unsplash-collections"</span> <span class="na">data-collection-id=</span><span class="s">"123456"</span><span class="nt">></div></span>
</code></pre></div></div>
<p><a href="/blog/likya-yolu-etap-1-ovacik-kabak">Örnek olarak görmek isterseniz buraya bakabilirsiniz.</a></p>
<p>Bu projede, Unsplash API’sini kullanarak koleksiyonu çekme sürecini anlatmaya çalıştım. Umarım yardımcı olmuştur.</p>
Likya Yolu - 1. Etap (Ovacık - Kabak)
2023-05-19T00:00:00+00:00
https://hasanunal.org/blog/likya-yolu-etap-1-ovacik-kabak
<p>Merhaba,</p>
<p>Uzun zamandır aklımda olan rotanın sonunda ilk adımını attım. 😃</p>
<p>19 Mayıs 2023 🇹🇷 tarihinde üç kişi <strong>(kuzenim ve dalış arkadaşım)</strong> tamamlamış bulunmaktayız.</p>
<p>Yolculuğumuzu ufak kesitler halinde anlatmak isterim.</p>
<p><a data-fancybox="maps" data-type="iframe" data-src="https://tr.wikiloc.com/wikiloc/spatialArtifacts.do?event=view&id=22796538&measures=off&title=off&near=off&images=off&maptype=H">
<img src="/assets/img/blog/2023-05-19-likya-yolu-etap-1-ovacik-kabak/likya-yolu-maps-ovacik-kabak.png" class="cursor-pointer w-100" alt="Likya Yolu | Ovacık - Kabap Harita" />
</a>
<small class="d-block text-center mb-1"><a href="https://tr.wikiloc.com/gezi-yuruyus-rotalari/likya-yolu-lycian-way-2018-single-file-fethiye-sidyma-patara-tahtali-geyikbayiri-22796538#lb-embed" rel="nofollow" target="_blank">Likya Yolu/Lycian Way - 2018</a></small></p>
<p>Yukarıdaki rotayı izleyeceğimiz şekilde ilk etabı yürümeye başladık.</p>
<p>O meşhur pozu vermeden olmaz.</p>
<div class="d-flex gap-1">
<div class="w-75">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2023-05-19-likya-yolu-etap-1-ovacik-kabak/likya-yolu-1.jpg?v=1" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2023-05-19-likya-yolu-etap-1-ovacik-kabak/likya-yolu-1.jpg?v=1" class="w-100 h-100 object-fit-cover" alt="Likya Yolu | 1" />
</a>
</div>
<div class="w-50">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2023-05-19-likya-yolu-etap-1-ovacik-kabak/likya-yolu-2.jpg?v=1" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2023-05-19-likya-yolu-etap-1-ovacik-kabak/likya-yolu-2.jpg?v=1" class="w-100 h-100 object-fit-cover" alt="Likya Yolu | 2" />
</a>
</div>
</div>
<p><small class="d-block text-center mb-1">[Likya Yolu | Ovacık - Faralya - Kabak]</small></p>
<p>Gece Ölüdeniz’e vardık ve <a href="https://goo.gl/maps/PCnG33Pe87kjZMyN8">Ölüdeniz Aydede Camping</a> alanında kamp kurduk. Burası güzel bir kamp alanı. Fakat bizim için biraz pahalıydı. 3 kişi 2 çadır için 450₺ ödedik. Fakat gece giriş yapıp sabah erkenden yola çıkacağımız için tesisin mutfak hariç hiçbir imkanından faydalanamadık.</p>
<p>8:00 gibi yumurtalarımızı haşlayıp yola koyulduk.</p>
<p>İlk rotamız <strong>Ovacık - Faralya</strong> arasıydı.</p>
<p>Tepeye yakın bir konumda kahvaltımızı yaptık ve rotayı yürümeye devam ettik.</p>
<p>İlk gün yaklaşık 12.5km yürüdük. ve Faralya’ya ulaştık.</p>
<p><a data-fancybox="gallery" data-src="https://images.unsplash.com/photo-1688818055485-6595afba8227?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wyNDgzMDl8MHwxfGNvbGxlY3Rpb258MnwtTmEtX2JvQUtyTXx8fHx8Mnx8MTY4ODgyNzk1N3w&ixlib=rb-4.0.3&q=80&w=1080" class="cursor-pointer text-underline">Faralya’da kamp yaptık.</a> Burada Kelebekler Vadisi’ni tepeden gören ücretsiz bir kamp alanı var. Burada kamp kurabilirsiniz. Fakat biz burada kamp kurmadık, ücretli bir kamp alanını tercih ettik.</p>
<p>Bu bölgede yaşayan bir aile bahçesini kamp alanı yapmış, 10/10 değildi ama en azında duş tuvalet sorunumuz olmadı. Telefonlarımızı şarj edip ertesi gün tekrar yola çıktık.</p>
<div class="d-flex gap-1">
<div class="w-50">
<img src="/assets/img/blog/2023-05-19-likya-yolu-etap-1-ovacik-kabak/likya-yolu-3.jpg?v=1" class="w-100 h-100" alt="Likya Yolu | 3" />
</div>
<div class="w-50">
<img src="/assets/img/blog/2023-05-19-likya-yolu-etap-1-ovacik-kabak/likya-yolu-4.jpg?v=1" class="w-100 h-100" alt="Likya Yolu | 4" />
</div>
</div>
<p>8:00 gibi çıktığımız; ikinci gün ise 9km yürüdük ve Kabak Koyu’na 14:00 gibi ulaştık. Likya Yolu’nun en güzel koylarından biri olan Kabak Koyu’nda kamp kurduk.</p>
<p>Burası artık son rotamızdı ve burada 1 gün kamp kurduk. Bol bol denize girip, güneşlendik.</p>
<p>Kamp noktası olarak <a href="https://goo.gl/maps/hzJcP4jUo1QgfXM77" rel="nofollow" target="_blank">Secret Garden Kabak</a> tercih ettik. Temiz ve güzeldi. Fiyatı da uygun. Genel olarak memnun kaldık.</p>
<p>İkinci etabı yürümek için sabırsızlanıyoruz. 🥳😄</p>
<h3 id="galeri">Galeri</h3>
<div class="unsplash-collections masonry-gallery" data-collection-id="-Na-_boAKrM"></div>
<p><strong><em>Yol açık, yola çık.</em></strong></p>
Hasanunal.org Gatsby ile yenilendi
2022-10-10T00:00:00+00:00
https://hasanunal.org/blog/hasanunal-org-yenilendi
<p>11 Yaşını dolduran kişisel sayfamı yenileme kararı aldım. 😅</p>
<p>Uzun bir dönem <em>WordPress</em> altyapısı ile yayında olan sayfamı ilk <strong>NextJS</strong> ile inşaa edip sonrasında daha performanslı bir araç kullanmalıyım diyerek <strong>Gatsby</strong> ile yeniden inşaa ettim. Son kararın <strong>jekyllrb</strong> olduğunu mutluluk ile duyurmak isterim. ❤️</p>
<p><strong>NextJS</strong> blog inşaası sürecinde yeni öğrendiğim bilgiler oldu. Uzun bir dönem önyargı ile yaklaştığım <strong>TailWind CSS</strong> ile tanışma fırsatım oldu ve css aşığı birisi olarak hayran kaldım. Fakat bir problem vardı derleme uzun sürüyordu ve fazla kaynak tüketiyordu. Hızlı derlemek için JIT <em>(Just in time)</em> kullandım. Gene tatmin olmadım ve projeyi açık kaynak yayınlayıp rafa kaldırdım.</p>
<blockquote>
<p><a href="https://github.com/hasanunal/Blog-NextJS-and-TailWind-CSS" rel="nofollow" target="_blank">Blog-NextJS-and-TailWind-CSS</a> projesinin kodlarına <a href="https://github.com/hasanunal/Blog-NextJS-and-TailWind-CSS" rel="nofollow" target="_blank">github üzerinden</a> ulaşabilirsiniz.</p>
</blockquote>
<p><strong>Jekyllrb</strong> sistemin en büyük artısı ise, <strong>Markdown</strong>.</p>
<p>İkinci önemli husus ise <strong>GitHub</strong> üzerinde <em>(Github Pages)</em> depolama yapabiliyor olmam. Yani sunucu masrafından kurtarıyor. 😊
Bu süreçte en zorlandığım konu ise içerikleri <code>markdown</code> formatına çevirmek oldu. 😕</p>
<p>Fakat her yeni proje gibi bu da çok şey öğretti 🤓</p>
<p>Neyse, lafı fazla uzatmadan istatistiklere geçelim. 📊</p>
<div class="d-flex justify-content-center gap-1">
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/hasanunal-org-yenilendi-1.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/hasanunal-org-yenilendi-1.jpg" class="w-100 h-100 object-fit-contain" alt="Hasanunal.org yenilendi - görsel 1" />
</a>
</div>
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/hasanunal-org-yenilendi-2.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/hasanunal-org-yenilendi-2.jpg" class="w-100 h-100 object-fit-contain" alt="Hasanunal.org yenilendi - görsel 2" />
</a>
</div>
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/hasanunal-org-yenilendi-3.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/hasanunal-org-yenilendi-3.jpg" class="w-100 h-100 object-fit-contain" alt="Hasanunal.org yenilendi - görsel 3" />
</a>
</div>
</div>
<p><small class="d-block mb-1"><a href="https://gtmetrix.com/reports/hasanunal.org/2Dx6rTaB/" rel="nofollow" target="_blank">A - gtmetrix.com/reports</a></small>
<small class="d-block mb-1"><a href="https://pagespeed.web.dev/report?url=https%3A%2F%2Fhasanunal.org%2F" rel="nofollow" target="_blank">Desktop - pagespeed.web.dev</a></small>
<small class="d-block mb-1"><a href="https://pagespeed.web.dev/report?url=https%3A%2F%2Fhasanunal.org%2F" rel="nofollow" target="_blank">Mobile - pagespeed.web.dev</a></small></p>
<blockquote>
<p>Bu web sitesinin kaynak kodlarına <a href="https://github.com/hasanunal/Hasanunal-Jekyll-Theme" rel="nofollow" target="_blank">Github üzerinden</a> erişebilirsiniz.</p>
</blockquote>
<p><strong><em>İyi çalışmalar.</em></strong></p>
svg ile interaktif harita yapımı — html css js ile harita yapımı
2021-08-15T00:00:00+00:00
https://hasanunal.org/blog/svg-ile-interaktif-harita-yapimi-html-css-js-ile-harita-yapimi
<p>Merhabalar, bir projede interaktif bölgesel haritaya ihtiyaç duyduk. Kaynak araştırdım fakat Türkçe içerik bulamadım, bende kaleme alıp anlatmak istedim.</p>
<p>Bu yazıda sizlere interaktif bölgesel bir harita nasıl yapılır göstermek istiyorum. İhtiyacımız olan materyaller interaktif hale getirmek istediğimiz haritanın SVG hali. Bizim projemizde bir tasarımcı çizdiği için biz ondan ilerlemiştik sizlerin de çizim yaptıracak imkanı varsa direkt #3.0 aşamaya geçebilirsiniz.</p>
<h2 id="10-harita-oluşturma">1.0 Harita oluşturma</h2>
<blockquote>
<p>Bunun için değişik araçlar mevcut fakat ben <a href="https://www.figma.com/">Figma</a> kullandığım için eklentisi de olan <a href="https://vector.mapcraft.biz/constructor/">https://vector.mapcraft.biz/constructor/</a> aracını kullanmayı tercih ettim.</p>
</blockquote>
<p><strong><em>Örnek olarak:</em> Akdeniz Bölgesi<br />
<em>(Kaynak:</em></strong> <a href="https://tr.wikipedia.org/wiki/Akdeniz_B%C3%B6lgesi"><strong><em>wikipedia</em></strong></a><strong><em>)</em></strong></p>
<ul>
<li><a href="https://tr.wikipedia.org/wiki/Adana" rel="nofollow" target="_blank">Adana</a>, <a href="https://tr.wikipedia.org/wiki/Antalya" rel="nofollow" target="_blank">Antalya</a>, <a href="https://tr.wikipedia.org/wiki/Burdur_(il)" rel="nofollow" target="_blank">Burdur</a>, <a href="https://tr.wikipedia.org/wiki/Hatay" rel="nofollow" target="_blank">Hatay</a>, <a href="https://tr.wikipedia.org/wiki/Isparta_(il)" rel="nofollow" target="_blank">Isparta</a>, <a href="https://tr.wikipedia.org/wiki/Mersin" rel="nofollow" target="_blank">Mersin</a>, <a href="https://tr.wikipedia.org/wiki/Osmaniye_(il)" rel="nofollow" target="_blank">Osmaniye</a>, <a href="https://tr.wikipedia.org/wiki/Konya" rel="nofollow" target="_blank">Konya</a>, <a href="https://tr.wikipedia.org/wiki/Kahramanmara%C5%9F" rel="nofollow" target="_blank">Kahramanmaraş</a>, <a href="https://tr.wikipedia.org/wiki/Karaman_(il)" rel="nofollow" target="_blank">Karaman</a>, <a href="https://tr.wikipedia.org/wiki/Afyonkarahisar_(il)" rel="nofollow" target="_blank">Afyonkarahisar</a>, <a href="https://tr.wikipedia.org/wiki/Denizli" rel="nofollow" target="_blank">Denizli</a>, <a href="https://tr.wikipedia.org/wiki/Gaziantep" rel="nofollow" target="_blank">Gaziantep</a>, <a href="https://tr.wikipedia.org/wiki/Ni%C4%9Fde" rel="nofollow" target="_blank">Niğde</a></li>
</ul>
<p><img src="/assets/img/blog/svg-ile-interaktif-harita-yapimi-1.png" class="w-100" alt="svg-ile-interaktif-harita-yapimi-1" />
<small class="d-block text-center"><a href="https://vector.mapcraft.biz/constructor/" rel="nofollow" target="_blank">vector.mapcraft.biz/constructor</a></small></p>
<p>Seçim sonrası “<strong>Download SVG</strong>” diyoruz. Düzenleme yapacaksanız; dosyayı <a href="https://www.figma.com/" rel="nofollow" target="_blank">Figma</a> ile açıp düzenleyebilirsiniz.<br />
<strong>Özelleştirmek istemiyorsanız direk #1.2 adıma geçebilirsiniz.</strong></p>
<h3 id="11-haritayı-özelleştirelim">1.1 Haritayı özelleştirelim</h3>
<p><em>(Opsiyon)</em></p>
<p><img src="/assets/img/blog/svg-ile-interaktif-harita-yapimi-2.png" class="w-100" alt="svg-ile-interaktif-harita-yapimi-2" />
<small class="d-block text-center"><a href="https://figma.com" rel="nofollow" target="_blank">figma.com</a></small></p>
<p>İndirdiğiniz SVG dosyasını Figma ile açarak düzenleme yapabilirsiniz. Katmanlara çift tıka girerek çizgi ve şekil renklerini değiştirebilirsiniz. Şehirleri renk-renk özelleştirmek isterseniz bu yöntemi seçebilirsiniz.<br />
<em>Veya sonraki aşamada göstereceğim css de ile aktiflik durumu hariç tek tip renk ile görünüm kazandırabilirsiniz.</em></p>
<h3 id="12-haritayı-kod-satırına-ekleme">1.2 Haritayı Kod Satırına Ekleme</h3>
<ul>
<li>Figma’da düzenleme sonrası; katmanlarda gruba sağ tıklayıp <strong>“Copy/Paste > Copy as SVG”</strong> adımlarını izleyebiliriz.</li>
<li>Düzenleme yapmadıysanız indirdiğiniz dosyayı editör ile açıyoruz ve kodları projemize dahil ediyoruz.</li>
</ul>
<h2 id="20-haritayı-işaretleme">2.0 Haritayı işaretleme</h2>
<p>SVG path değerlerine class verelim aktif ve üzerine gelme durumunda renk olayını css ile ayarlamak için class tanımlayalım ve aktif classı belirleyelim.</p>
<blockquote>
<p>(Anlatım boyunca scss yazıyor olacağız.)</p>
</blockquote>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><path</span> <span class="na">class=</span><span class="s">"region"</span> <span class="na">d=</span><span class="s">"..."</span><span class="nt">></path></span>
Eğer başlangıçta bir il aktif gelsin istersek:
<span class="nt"><path</span> <span class="na">class=</span><span class="s">"region on"</span> <span class="na">d=</span><span class="s">"..."</span><span class="nt">></path></span>
</code></pre></div></div>
<h3 id="21-css-ile-harita-aktif-ve-üzerine-gelince-durumlarını-ayarlama">2.1 CSS ile harita aktif ve üzerine gelince durumlarını ayarlama</h3>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.region</span> <span class="p">{</span>
<span class="na">fill</span><span class="p">:</span> <span class="mh">#8C5423</span><span class="p">;</span>
<span class="na">stroke</span><span class="p">:</span> <span class="mh">#ccc</span><span class="p">;</span>
<span class="na">stroke-linejoin</span><span class="p">:</span> <span class="n">round</span><span class="p">;</span>
<span class="na">fill-rule</span><span class="p">:</span> <span class="n">evenodd</span><span class="p">;</span>
<span class="nl">clip-rule</span><span class="p">:</span> <span class="n">evenodd</span><span class="p">;</span>
<span class="na">stroke-width</span><span class="p">:</span> <span class="m">1</span><span class="p">;</span>
<span class="nl">transition</span><span class="p">:</span> <span class="n">fill</span> <span class="m">300ms</span><span class="p">;</span>
<span class="k">&</span><span class="nd">:hover</span> <span class="p">{</span>
<span class="na">fill</span><span class="p">:</span> <span class="mh">#A67449</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">&</span><span class="nc">.on</span> <span class="p">{</span>
<span class="na">fill</span><span class="p">:</span> <span class="mh">#733E1F</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p><img src="/assets/img/blog/svg-ile-interaktif-harita-yapimi-3.png" class="w-100" alt="svg-ile-interaktif-harita-yapimi-3" />
<small class="d-block text-center">2.2 Şehir üzerine gelince açılacak bilgi kartı</small></p>
<p>İsteğimiz görünümü elde ettik şimdi etkileşim için JavaScript zamanı.</p>
<h3 id="22-şehir-üzerine-gelince-açılacak-bilgi-kartı">2.2 Şehir üzerine gelince açılacak bilgi kartı</h3>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"map-of-regions"</span><span class="nt">></span>
<span class="nt"><ul</span> <span class="na">class=</span><span class="s">"list-of-regions"</span><span class="nt">></span>
<span class="nt"><li</span> <span class="na">data-state=</span><span class="s">"mersin"</span> <span class="na">class=</span><span class="s">"region-card on"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"region-image"</span><span class="nt">></span>
<span class="nt"><img</span> <span class="na">src=</span><span class="s">"url"</span> <span class="na">alt=</span><span class="s">"Şehir"</span> <span class="na">class=</span><span class="s">"rounded-start"</span><span class="nt">></span>
<span class="nt"></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"region-content"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"fs-6 title"</span><span class="nt">></span>Şehir İsmi<span class="nt"></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"desc"</span><span class="nt">></span>
<span class="nt"><p></span>
Lorem ipsum.
<span class="nt"></p></span>
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"></li></span>
...
<span class="nt"></ul></span>
...
svg
...
<span class="nt"></div></span>
</code></pre></div></div>
<p>Açılacak kartımızı özelleştirelim.</p>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.map-of-regions</span> <span class="p">{</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">relative</span><span class="p">;</span>
<span class="nc">.list-of-regions</span> <span class="p">{</span>
<span class="nl">list-style</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
<span class="nl">margin</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">top</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">left</span><span class="p">:</span> <span class="m">40px</span><span class="p">;</span>
<span class="nc">.region-card</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="nb">none</span><span class="p">;</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="mh">#fff</span><span class="p">;</span>
<span class="nl">border</span><span class="p">:</span> <span class="m">1px</span> <span class="nb">solid</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="mi">.125</span><span class="p">);</span>
<span class="nl">border-radius</span><span class="p">:</span> <span class="m">0</span><span class="mi">.25rem</span><span class="p">;</span>
<span class="nl">box-shadow</span><span class="p">:</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="m">0</span><span class="o">,</span> <span class="mi">.1</span><span class="p">)</span> <span class="m">0</span> <span class="m">4px</span> <span class="m">12px</span><span class="p">;</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="k">&</span><span class="nc">.on</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">flex</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.region-image</span> <span class="p">{</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">100px</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="m">100px</span><span class="p">;</span>
<span class="k">&</span><span class="nc">.rounded-start</span> <span class="p">{</span>
<span class="nl">border-radius</span><span class="p">:</span> <span class="mi">.25rem</span> <span class="m">0</span> <span class="m">0</span> <span class="mi">.25rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nc">.region-content</span> <span class="p">{</span>
<span class="nl">padding</span><span class="p">:</span> <span class="m">10px</span><span class="p">;</span>
<span class="nc">.title</span> <span class="p">{</span>
<span class="nl">font-weight</span><span class="p">:</span> <span class="m">600</span><span class="p">;</span>
<span class="k">&</span><span class="nc">.fs-6</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">1rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<h2 id="30-javascript-ile-etkileşim-kazandırma">3.0 JavaScript ile etkileşim kazandırma</h2>
<p>JavaScript tarafında yakalamak için her bir şehrin koduna id veriyoruz.<br />
<em>Ben şehir ismi tercih ettim.</em></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><path</span> <span class="na">id=</span><span class="s">"kahramanmaras"</span> <span class="na">d=</span><span class="s">"..."</span><span class="nt">></path></span>
</code></pre></div></div>
<h3 id="31-üzerine-gelince-açılacak-bilgi-kartları-için-javascript-yazalım">3.1 Üzerine gelince açılacak bilgi kartları için JavaScript yazalım.</h3>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">regionsCards</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.list-of-regions</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">regionsCard</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">.list-of-regions li</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">generalRegions</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">#regions</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">svgPathRegions</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">#regions > *</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">regionActiveCard</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">[data-state=mersin]</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">regionActivePath</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">'</span><span class="s1">#mersin</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">function</span> <span class="nx">removeAllOn</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">regionsCard</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">el</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="dl">"</span><span class="s2">on</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>
<span class="nx">svgPathRegions</span><span class="p">.</span><span class="nx">forEach</span><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">el</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="dl">"</span><span class="s2">on</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="kd">function</span> <span class="nx">addOnFromState</span><span class="p">(</span><span class="nx">el</span><span class="p">)</span> <span class="p">{</span>
<span class="kd">const</span> <span class="nx">stateId</span> <span class="o">=</span> <span class="nx">el</span><span class="p">.</span><span class="nx">getAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">id</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">wordState</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">[data-state='</span><span class="dl">"</span> <span class="o">+</span> <span class="nx">stateId</span> <span class="o">+</span> <span class="dl">"</span><span class="s2">']</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">wordState</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">on</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">on</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">mediterraneanRegions</span><span class="p">();</span>
<span class="p">}</span>
<span class="kd">const</span> <span class="nx">mediterraneanRegions</span> <span class="o">=</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="nx">generalRegions</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">'</span><span class="s1">mousemove</span><span class="dl">'</span><span class="p">,</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">regionsCards</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">top</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">clientY</span> <span class="o">+</span> <span class="o">-</span><span class="mi">120</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">px</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">regionsCards</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">left</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">clientX</span> <span class="o">+</span> <span class="mi">20</span> <span class="o">+</span> <span class="dl">'</span><span class="s1">px</span><span class="dl">'</span><span class="p">;</span>
<span class="nx">regionsCards</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">position</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">fixed</span><span class="dl">'</span><span class="p">;</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="nx">svgPathRegions</span><span class="p">.</span><span class="nx">forEach</span><span class="p">((</span><span class="nx">el</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouseenter</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">removeAllOn</span><span class="p">();</span>
<span class="nx">addOnFromState</span><span class="p">(</span><span class="nx">el</span><span class="p">);</span>
<span class="p">});</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouseleave</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">removeAllOn</span><span class="p">();</span>
<span class="p">});</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">touchstart</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">removeAllOn</span><span class="p">();</span>
<span class="nx">addOnFromState</span><span class="p">(</span><span class="nx">el</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">});</span>
</code></pre></div></div>
<h3 id="33-seçim-olmaması-durumunda-aktif-şehir">3.3 Seçim olmaması durumunda aktif şehir</h3>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/* active city in case of not election */</span>
<span class="nx">generalRegions</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouseleave</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=></span> <span class="p">{</span>
<span class="nx">setTimeout</span><span class="p">(()</span> <span class="o">=></span> <span class="p">{</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="p">[...</span><span class="nx">regionsCard</span><span class="p">].</span><span class="nx">filter</span><span class="p">(</span><span class="nx">e</span><span class="o">=></span><span class="nx">e</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">contains</span><span class="p">(</span><span class="dl">"</span><span class="s2">on</span><span class="dl">"</span><span class="p">)).</span><span class="nx">length</span><span class="p">){</span>
<span class="nx">regionActiveCard</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">on</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">regionActivePath</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">on</span><span class="dl">"</span><span class="p">)</span>
<span class="nx">regionsCards</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">style</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">position:absolute</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">},</span> <span class="mi">1000</span><span class="p">);</span>
<span class="p">})</span>
</code></pre></div></div>
<iframe height="300" style="width: 100%;" scrolling="no" title="interactive Akdeniz Region map" src="https://codepen.io/hasanunal/embed/preview/ExXVJeQ?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/hasanunal/pen/ExXVJeQ" target="_blank" rel="nofollow">
interactive Akdeniz Region map</a> by Hasan ÜNAL (<a href="https://codepen.io/hasanunal" target="_blank" rel="nofollow">@hasanunal</a>)
on <a href="https://codepen.io" target="_blank" rel="nofollow">CodePen</a>.
</iframe>
<ul>
<li><a href="https://codepen.io/hasanunal/pen/ExXVJeQ" rel="nofollow" target="_blank">https://codepen.io/hasanunal/pen/ExXVJeQ</a></li>
<li><a href="https://github.com/hasanunal/interactive-Akdeniz-Region-map" rel="nofollow" target="_blank">https://github.com/hasanunal/interactive-Akdeniz-Region-map</a></li>
</ul>
<p><strong><em>Herkese iyi çalışmalar.</em></strong></p>
Ekran çözünürlüğüne göre duyarlı yazı boyutu — Responsive font size
2021-08-15T00:00:00+00:00
https://hasanunal.org/blog/css-responsive-font-kullanimi
<p>Merhaba, bu yazıda ekran çözünürlüğüne göre duyarlı yazı boyutunu ayarlamayı ve ölçü birimleri hakkında bilgiler vermeye çalışacağım.
Şimdiden keyifli okumalar :)</p>
<h2 id="1--css-ile-duyarlı-tipografi-oluşturalım-vw">1 — CSS ile duyarlı tipografi oluşturalım; vw</h2>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><h1</span> <span class="na">style=</span><span class="s">"font-size:calc(1.5rem + .75vw);"</span><span class="nt">></span>Merhaba Dünya<span class="nt"></h1></span>
</code></pre></div></div>
<p><strong>Merhaba Dünya</strong></p>
<p>Örnek olarak bir tane tanımlayalım.</p>
<iframe height="300" style="width: 100%;" scrolling="no" title="Perfectly Fitting text" src="https://codepen.io/SitePoint/embed/preview/XMPgdr?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
See the Pen <a href="https://codepen.io/SitePoint/pen/XMPgdr">
Perfectly Fitting text</a> by SitePoint (<a href="https://codepen.io/SitePoint">@SitePoint</a>)
on <a href="https://codepen.io">CodePen</a>.
</iframe>
<h3 id="11--nedir-rem">1.1 — Nedir rem?</h3>
<p>Web’de tipografi için en iyi uygulamalardan biri, rem ve em gibi göreli birimleri kullanmaktır. Soru şu ki, hangisini kullanmalısınız?</p>
<p><strong><em>em</em></strong> ve <strong><em>rem</em></strong> arasında aslında fark <strong>r</strong> yani <strong>root</strong>. Peki bunun anlamı ne?<br />
— rem dediğimiz zaman body yani kök (root) font-size değerine göre değer alır em ise bir üstteki kapsayıcıya göre değer almaktadır.</p>
<p>Tarayıcılarda varsayılan olarak font-size değeri 16px gelmektedir bu da;
1rem=16px anlamına gelmektedir.</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">body</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">16px</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.heading</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">2em</span> <span class="c">/* 16px * 2 = 32px */</span>
<span class="p">}</span>
</code></pre></div></div>
<p>— em kullanımına örnek</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"home-page"</span><span class="nt">></span>
<span class="nt"><h1</span> <span class="na">class=</span><span class="s">"home-page--heading"</span><span class="nt">></span>Başlık<span class="nt"></h1></span>
...
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.home-page</span> <span class="p">{</span> <span class="nl">font-size</span><span class="p">:</span> <span class="m">20px</span> <span class="p">}</span>
<span class="nc">.home-page--heading</span> <span class="p">{</span> <span class="nl">font-size</span><span class="p">:</span> <span class="m">2em</span> <span class="p">}</span> <span class="c">/* 20px * 2 = 40px */</span>
</code></pre></div></div>
<h3 id="12-nedir-vw-vw-ve-vh-birimleri">1.2— Nedir vw? vw ve vh birimleri</h3>
<p>Bu birimler, görünüm alanı genişliği ve görünüm alanı yüksekliğinin yüzdeleri cinsinden boyutları belirlemenize olanak tanır.</p>
<ul>
<li><strong>vw</strong>: Görüntü alanı genişliğinin yüzdesi</li>
<li><strong>vh</strong>: Görüntü alanı yüksekliğinin yüzdesi</li>
<li><strong>vmin</strong>: <code class="language-plaintext highlighter-rouge">vmin</code> – <code class="language-plaintext highlighter-rouge">vw</code> veya <code class="language-plaintext highlighter-rouge">vh</code>, hangisi daha küçükse</li>
<li><strong>vmax</strong>:<code class="language-plaintext highlighter-rouge">vw</code> veya <code class="language-plaintext highlighter-rouge">vh</code>, hangisi daha büyükse</li>
</ul>
<p><img src="/assets/img/blog/css-responsive-font-kullanimi-1.gif" class="w-100" alt="CSS Responsive font kullanımı - 1" />
<small class="d-block text-center">görsel <a href="https://zellwk.com/">https://zellwk.com/</a></small></p>
<blockquote>
<p>Viewport, bu durumda tarayıcı ekranını ifade eder. <code class="language-plaintext highlighter-rouge">1vw</code> tarayıcının genişliğinin yüzde biri anlamına gelir. <code class="language-plaintext highlighter-rouge">100vw</code> tam tarayıcı genişliği anlamına gelir. <strong>Unutmamakta fayda var buna scroll dahildir.</strong></p>
</blockquote>
<p><img src="/assets/img/blog/css-responsive-font-kullanimi-2.png" class="w-100" alt="CSS Responsive font kullanımı - 2" /></p>
<p>Örneğin, a <code class="language-plaintext highlighter-rouge">font-size</code> <code class="language-plaintext highlighter-rouge">8vw</code>, 1200px bir görüntü alanı genişliği için yaklaşık 96px, 400px bir görüntü alanı genişliği için 33px ve 1920px bir görüntü alanı genişliği için 154px olarak hesaplanacaktır.</p>
<h2 id="2--medya-sorgularıyla-yazı-tipi-boyutu">2 — Medya sorgularıyla yazı tipi boyutu</h2>
<p>Medya sorguları da çözüm sağlar. Kullanıcının tarayıcı genişliğine bağlı olarak otomatik olarak yeniden hesaplanır. Bir örnek yapalım</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.home-page--heading</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">2rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">@media</span> <span class="p">(</span><span class="n">min-width</span><span class="p">:</span> <span class="m">768px</span><span class="p">)</span> <span class="p">{</span>
<span class="nc">.home-page--heading</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">1rem</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<h2 id="bonus-bootstrap-5-duyarlı-font-ayarı">Bonus: Bootstrap 5 duyarlı font ayarı</h2>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.fs-1</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="n">calc</span><span class="p">(</span><span class="m">1.375rem</span> <span class="err">+</span> <span class="m">1.5vw</span><span class="p">)</span><span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.fs-2</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="n">calc</span><span class="p">(</span><span class="m">1.325rem</span> <span class="err">+</span> <span class="m">.9vw</span><span class="p">)</span><span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.fs-3</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="n">calc</span><span class="p">(</span><span class="m">1.3rem</span> <span class="err">+</span> <span class="m">.6vw</span><span class="p">)</span><span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.fs-4</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="n">calc</span><span class="p">(</span><span class="m">1.275rem</span> <span class="err">+</span> <span class="m">.3vw</span><span class="p">)</span><span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.fs-5</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">1.25rem</span><span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.fs-6</span> <span class="p">{</span>
<span class="nl">font-size</span><span class="p">:</span> <span class="m">1rem</span><span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p><strong>Tavsiye edilen tasarım dizayn ölçüleri</strong></p>
<p><img src="/assets/img/blog/css-responsive-font-kullanimi-3.png" class="w-100" alt="CSS Responsive font kullanımı - 3" />
<small class="d-block text-center"><a href="https://medium.com/eightshapes-llc/typography-in-design-systems-6ed771432f1e">kaynak</a></small></p>
<p><img src="/assets/img/blog/css-responsive-font-kullanimi-4.png" class="w-100" alt="CSS Responsive font kullanımı - 4" />
<small class="d-block text-center"><a href="https://medium.com/eightshapes-llc/typography-in-design-systems-6ed771432f1e">kaynak</a></small></p>
<p>Tasarım dizaynda tipografi ölçüleri için <a href="https://medium.com/eightshapes-llc/typography-in-design-systems-6ed771432f1e">Tasarım Sistemlerinde Tipografi</a> adlı makaleye göz atmanızı tavsiye ederim.</p>
<p><em>Bu makalede ölçü birimleri ve tasarım dizaynın önemine değinmeye çalıştım. Umarım faydalı olmuştur, iyi çalışmalar dilerim.</em></p>
<p>Faydalandığım kaynaklar<br />
— <a href="https://zellwk.com/blog/viewport-based-typography/" rel="nofollow" target="_blank">https://zellwk.com/blog/viewport-based-typography/</a>
— <a href="https://www.sitepoint.com/css-viewport-units-quick-start/" rel="nofollow" target="_blank">https://www.sitepoint.com/css-viewport-units-quick-start/</a>
— <a href="https://zellwk.com/blog/rem-vs-em/" rel="nofollow" target="_blank">https://zellwk.com/blog/rem-vs-em/</a>
— <a href="https://getbootstrap.com/docs/5.0/utilities/text/#font-size" rel="nofollow" target="_blank">https://getbootstrap.com/docs/5.0/utilities/text/#font-size</a></p>
CSS'de HSL önemi - Yeni nesil renk kodu kullanımı
2021-07-22T00:00:00+00:00
https://hasanunal.org/blog/cssde-hsl-onemi-yeni-nesil-renk-kodu-kullanimi
<p>Merhabalar, şimdilik yaygın bir kullanımı yok fakat CSS’de yeni bir renk kodu dönemi başlayacağını düşünüyorum; HSL.</p>
<p><img src="/assets/img/blog/css-hsl-onemi-1.jpg" class="w-100" alt="hsl önemi" /></p>
<p>Neden kullanmalıyız, bizlere faydası neler, neden <strong><em>Hex Code #RRGGBB</em></strong> veya <strong><em>Decimal Code (R,G,B)</em></strong> den vaz geçmeliyiz bunlardan bahsetmek istiyorum. Makale sonunda hex kodları ile devam edip etmemek sizlerin kararı :) <em>Ben yapıyı beğendim ve sonraki projelerimde HSL kullanmayı planlıyorum.</em></p>
<p><img src="/assets/img/blog/css-hsl-onemi-2.png" class="w-100" alt="hsl önemi" />
<small class="d-block text-center"><a href="https://caniuse.com/mdn-css_types_color_hsl" rel="nofollow" target="_blank">caniuse.com/mdn-css_types_color_hsl</a></small></p>
<h2 id="hex-ve-decimal-kodunun-dezavantajları">Hex ve Decimal kodunun dezavantajları</h2>
<ul>
<li>Sınırlı*</li>
<li>Hex Code #RRGGBB veya Decimal Code (R,G,B) okumak zordur.</li>
</ul>
<blockquote>
<p><strong><em>“Sınırlı” derken, bir renk tekerleğini açıp kendiniz bir renk seçmeden rengi değiştirmek kolay değil. Bu seçimi yaparken tondan çıkmanız çok muhtemel bir durum ki genellikle bu durum olur. Buna ek olarak, hex veya decimal koduna bakarak hangi rengin olduğunu</em> (sürekli kullanılan #000, #fff gibi renklerden bahsetmiyorum) <em>tahmin etmek kolay değil.</em></strong></p>
</blockquote>
<p><img src="/assets/img/blog/css-hsl-onemi-3.jpg" class="w-100" alt="hsl önemi" />
<small class="d-block text-center"><a href="https://color.adobe.com/tr/" rel="nofollow" target="_blank">color.adobe.com/tr/</a></small></p>
<p>Kırmızı bir renk paleti seçtim ve tonlarını görüyorsunuz. Hepsinde de kırmızı ama farklı tonlarda olduğunu koda bakarak söylemek zor.</p>
<p>Hızlı bir şekilde test etmek veya doğrulamak için bir rengin daha açık veya daha koyu bir tonunu oluşturmanız gerekebilir. Renk seçiciyi açmadan bu neredeyse imkansızdır :) <em>Renk seçici ile seçeceğiniz ton ise monitörünüzün kalitesine göre değişiklik gösterebilir. (Şahsi fikrim)</em></p>
<p>Neyse ki, HSL renkleri bu özel sorunu çözmemize yardımcı oluyor ve farklı senaryolara hızlı çözümler sunmamıza imkan sağlıyor. Bir arayüzden farklı renk paletlerini hızlıca oluşturmak gibi.</p>
<h2 id="hsl-nedir">HSL Nedir?</h2>
<p>HSL, ton, doygunluk ve parlaklık anlamına gelir.<br />
<strong>hsl (<em>hue</em>, <em>saturation</em>, <em>lightness</em>)</strong><br />
RGB renk tekerleğine dayanmaktadır. Her rengin doygunluk ve açıklık değerleri için bir açısı ve yüzde değeri vardır.</p>
<ul>
<li><strong>Hue</strong><br />
<em>Ton, renk tekerleğinde 0 ile 360 arasındaki bir derecedir.</em></li>
<li>**Saturation<br />
**<em>Doygunluk bir yüzde değeri; %0 bir gri tonu ve %100 tam renk anlamına gelir.</em></li>
<li>**lightness<br />
**Parlaklık yüzdesidir; %0 siyah, %100 beyazdır.</li>
</ul>
<blockquote>
<p><a href="https://www.w3schools.com/colors/colors_hsl.asp" rel="nofollow" target="_blank">Kaynak: w3schools.com/colors/colors_hsl.asp</a></p>
</blockquote>
<p>Bununla ton, doygunluk ve parlaklığı temsil eden üç değerimiz var. Rengi CSS’de şu şekilde kullanabiliriz:</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.element</span> <span class="p">{</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="n">hsl</span><span class="p">(</span><span class="m">196</span><span class="p">,</span> <span class="m">73%</span><span class="p">,</span> <span class="m">62%</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p><img src="/assets/img/blog/css-hsl-onemi-4.gif" class="w-100" alt="hsl önemi" />
<small class="d-block text-center"><a href="https://hslpicker.com/" rel="nofollow" target="_blank">hslpicker.com/</a></small></p>
<p><strong>Doygunluk</strong> ve <strong>ışık</strong> korunarak <em>(şeffaflıkla karıştırılmasın)</em> renkler arasında geçiş ve kolay bir şekilde okuyabilmek için HSL tercih etmekte fayda var.</p>
<h2 id="hsl-renkleri-i̇çin-kullanım-örnekleri">HSL Renkleri İçin Kullanım Örnekleri</h2>
<p>İmleç üzerine geldiğinde daha koyu yapalım. Bunun için sadece <strong>renk parlaklığı yüzdesi</strong> ile oynamamız yeterli.<br />
<strong>(</strong><em>hue</em>, <em>saturation</em>, <strong><em>lightness</em>)</strong></p>
<p><img src="/assets/img/blog/css-hsl-onemi-5.gif" class="w-100" alt="hsl önemi" />
<small class="d-block text-center"><a href="https://hslpicker.com/" rel="nofollow" target="_blank">hslpicker.com/</a></small></p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.btn</span> <span class="p">{</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="n">hsl</span><span class="p">(</span><span class="m">166</span><span class="p">,</span> <span class="m">78%</span><span class="p">,</span> <span class="m">37%</span><span class="p">);</span>
<span class="p">}</span>
<span class="nc">.btn</span><span class="nd">:hover</span> <span class="p">{</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="n">hsl</span><span class="p">(</span><span class="m">166</span><span class="p">,</span> <span class="m">60%</span><span class="p">,</span> <span class="m">30%</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Farklı senaryo ve daha etkili kullanımı</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nd">:root</span> <span class="p">{</span>
<span class="py">--btn-main-h</span><span class="p">:</span> <span class="m">166</span><span class="p">;</span>
<span class="py">--btn-main-s</span><span class="p">:</span> <span class="m">60%</span><span class="p">;</span>
<span class="py">--btn-main-l</span><span class="p">:</span> <span class="m">37%</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.btn</span> <span class="p">{</span>
<span class="nl">background-color</span><span class="p">:</span> <span class="n">hsl</span><span class="p">(</span><span class="n">var</span><span class="p">(</span><span class="n">--btn-main-h</span><span class="p">),</span> <span class="n">var</span><span class="p">(</span><span class="n">--btn-main-s</span><span class="p">),</span> <span class="n">var</span><span class="p">(</span><span class="n">--btn-main-l</span><span class="p">));</span>
<span class="p">}</span>
<span class="nc">.btn</span><span class="nd">:hover</span> <span class="p">{</span>
<span class="py">--btn-main-l</span><span class="p">:</span> <span class="m">54%</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Işık yüzdesi ne kadar yüksek olursa, o kadar hafif olur. Daha koyu bir renk için değeri azaltmamız gerekiyor.</p>
<p><strong>Umarım faydalı olmuştur :) Tasarım dolu günler dilerim.</strong></p>
<p>**_Faydalandığım kaynaklar<br />
<strong><em>Kapak resmi:</em></strong> <a href="https://tsh.io/blog/why-should-you-use-hsl-color-representation-in-css/" rel="nofollow" target="_blank">https://tsh.io/blog/why-should-you-use-hsl-color-representation-in-css/</a>
<a href="https://www.smashingmagazine.com/2021/07/hsl-colors-css/" rel="nofollow" target="_blank">https://www.smashingmagazine.com/2021/07/hsl-colors-css/</a>
<a href="https://www.w3schools.com/colors/colors_hsl.asp" rel="nofollow" target="_blank">https://www.w3schools.com/colors/colors_hsl.asp</a>
<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl()" rel="nofollow" target="_blank">https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/hsl()</a>
<a href="https://color.adobe.com/tr/" rel="nofollow" target="_blank">https://color.adobe.com/tr/</a>
<a href="https://hslpicker.com/" rel="nofollow" target="_blank">https://hslpicker.com/</a></p>
Bir web projesinin 2.0 versiyon hikayesi (eğitim içerik portalı)
2021-05-21T00:00:00+00:00
https://hasanunal.org/blog/egitim-icerik-portalinin-yenilenmesi
<p>Öncelikle deneysel başlayan hadi eğitim içeriklerini paylaşacağımız bir web sitesi kuralım işinin; hikayesine şahit olacaksınız :)</p>
<p><img src="/assets/img/blog/egitim-portali-yenileme-1.jpg" alt="Eğitim portalı yenileme - 1" /></p>
<p>Yukarıdaki ön yüzü boyama kitabı tadında başlayan tasarımımızı nasıl evrildiği ile başlayalım.</p>
<p>Öncelikle çizilen projeyi html css ve javascript kullanarak koda döktükten sonra back-endi php ile yazdığımız sisteme giydirdik. Sistemi kurduktan sonra bot hızında içerikler eklendiği* için bir anda ciddi bir data oluştu ve bu datayı kontrol edemiyorduk :) Kar topu etkisi yarattı…
<em>* A. Oğultegin hocamın hızına yetişmek ne mümkün :) Saygılar…</em></p>
<blockquote>
<p>Altyapıda yaşadığımız zorlukları front-end developer olarak doğru bir anlatım yapamayabilirim ama ilerleyen aşamalarda yorumlarımı sunmaya devam edeceğim yanlışlar olursa affola.</p>
</blockquote>
<ul>
<li><strong>İlk</strong> tasarımda en büyük problemlerden birisi kullanıcıyı çok fazla aşamadan geçirdikten sonra sonuca ulaştırıyorduk.</li>
</ul>
<p><em>Ana sayfa > Sınıf seçimi > Ünite seçimi > kategori seçimi > varsa alt kategori seçimi > içerik tipi > varsa alt içerik tipi > içerik</em></p>
<h4 id="v10-akış-diyagramı">v1.0 akış diyagramı</h4>
<p><img src="/assets/img/blog/egitim-portali-yenileme-2.png" alt="Eğitim portalı yenileme - 2" />
<small class="d-block">şekilleri en son okulda görmüştüm hatalı ise kusura bakmayın lütfen :)</small></p>
<ul>
<li>Çok ciddi bir efor sarf ettikten sonra içeriğe ulaşılıyordu. Bu yaptığımız ilk hataydı v2.0’da buna fazlasıyla dikkat ettik.</li>
<li><strong>İkinci</strong> en büyük hatamız ise; yanlış slider scripti kullanmak. Bunun sonucunda kullanıcı deneyimi açısından nasıl bir kabus olduğunu finalde anlayabildik…</li>
</ul>
<blockquote>
<p><a href="https://owlcarousel2.github.io/OwlCarousel2/" rel="nofollow" target="_blank">Owl Carousel 2</a> kullandık ve fark ettik ki kaydırırken kullanıcılar yanlış seçenek açıyorlar. Bu scriptin bu gibi olayları olduğunu <em>(kronik sorun)</em> edindiğimiz geri bildirimlerden deneyimledik. (trick bilgi olarak verebilirim; bence swiper kullanın daha stabil ve realtime responsive yapıyor ve bu muhteşem bir olay)<br />
— <strong>v2.0 sürümünde slider kullanmamaya karar verdik</strong> :)</p>
</blockquote>
<hr />
<p><img src="/assets/img/blog/egitim-portali-yenileme-3.jpg" alt="Eğitim portalı yenileme - 3" />
<small class="d-block">aogultegin.com v2.0</small></p>
<p>Arayüzü tamamen yeniledik ve <em>daha kolay ama basit olmayan</em> bir hale getirdik.</p>
<blockquote>
<p>“Her şey olabildiğince kolay olmalı, ama ‘basit’ değil.”<br />
— Albert Einstein</p>
</blockquote>
<p>— <strong>Figma</strong> ile arayüzü çizip front-end <strong>HTML5/CSS3 (scss)/JS</strong> kullanarak kodlandı.<br />
— PHP yazılan scripti çöpe atıp yeniden yazıldı ve <strong>Laravel</strong> framework kullanıldı. *<br />
— Eski veritabanındaki tüm içerikler ciddi zaman harcanarak taşındı. *<br />
* back-end‘i geliştiren F. Eşki’ye selamlar :)</p>
<p>— Yeni sunucu alımı yapıldı ve sistem gereksinimleri kuruldu. **<br />
** <em>N. Alpay’a teşekkürler :)</em></p>
<h4 id="v20-akış-diyagramı">v2.0 akış diyagramı</h4>
<p><img src="/assets/img/blog/egitim-portali-yenileme-4.png" alt="Eğitim portalı yenileme - 4" /></p>
<h5 id="yeni-yapıda-nelere-dikkat-ettik">Yeni yapıda nelere dikkat ettik?</h5>
<ul>
<li>İçeriğe daha hızlı erişmeyi mümkün kıldık.</li>
<li>Seçimleri çerezlere attık ve ana sayfayı tekrar ziyaret ettiği zaman sayfayı özelleştirdik.</li>
<li>— Giriş yaptığı saate özel mesaj çıkardık.</li>
<li>— Özel günlerde sitenin tüm renklerini ve mesaj alanını güncelledik.</li>
<li>— Sınıf seçimini hafızada tuttuk ve ana sayfa öne çıkanlar ve son eklenenler içeriklerini güncelledik, sınıf seçimini sol açılır menüye ve sağ seçeneklere görünür halde ekledik.</li>
<li>— Sınıf seçimini hafızada tutmamız sayesinde sınıf seçimi alanını ünite seçimi ile değiştirdik.</li>
<li>Bonus içerikleri kategorilendirdik ve ayrıştırdık.</li>
<li>İçerikleri yeni bir sayfa yerine popupda açtırmayı tercih ettik.</li>
</ul>
<p><strong>ve daha nice geliştirme ama en önemlisi bunlar olduğu için kısaca özetlemek istedim :)</strong></p>
<h5 id="geliştirmelere-nasıl-devam-ediyoruz">Geliştirmelere nasıl devam ediyoruz?</h5>
<p><img src="/assets/img/blog/egitim-portali-yenileme-5.jpg" alt="Eğitim portalı yenileme - 5" />
<small class="d-block">sıcaklık haritası</small></p>
<p>Sıcaklık haritası için <strong>Yandex.Metrica</strong> kullanıyoruz. Kullanıcı hareketlerine göre kullanıcı deneyimini şekillendiriyoruz.<br />
* UI olmadan UX olur mu sorusuna güzel bir örnek sanırım :)</p>
<p>Hak verirsiniz ki sitenin gelir ve trafiğini paylaşamıyorum fakat yukarıdaki sıcaklık raporu ortalama 30k kullanıcı istatistiği.</p>
<h5 id="eski-tasarım-ve-yeni-tasarım-trafik-kıyaslaması">Eski tasarım ve yeni tasarım trafik kıyaslaması</h5>
<p><img src="/assets/img/blog/egitim-portali-yenileme-6.jpg" alt="Eğitim portalı yenileme - 6" /></p>
<blockquote>
<p>Bu gelişimin en büyük etkenlerinden birisi olan içeriği de atlamamak lazım.<br />
A. Oğultegin hocam kaliteli içerik üretiyor ve çözemediğimiz bir şekilde hızlı :)<br />
Şu an sitede 4.000+ içerik mevcut ve her geçen gün bu sayı büyüyor.<br />
Teşekkürler A. Oğultegin hocam. Selamlar…</p>
</blockquote>
<p>Bir sonraki makale de görüşmek dileği ile…</p>
CSS’de yazımı basitleştirmek için :is() kullanımı
2021-04-18T00:00:00+00:00
https://hasanunal.org/blog/css-has-kullanimi
<p>Merhaba, yakın tarihte gündem olan css de is:() kullanımı ile ilgili türkçe bir kaynak göremedim ya da bulamadım ve bu konuyu kaleme almak istedim. :)</p>
<p>Avantajları neler? Daha az kod yazarak sonuca ulaşmamızı sağlıyor.
Olayı bir örnekle hızlıca açıklayalım.</p>
<p><a href="https://caniuse.com/?search=is">Can I use - :is()</a></p>
<h4 id="sözdizimi--kullanımı">Sözdizimi — Kullanımı</h4>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.className</span> <span class="nd">:is</span><span class="o">(</span><span class="nt">h1</span><span class="o">,</span> <span class="nc">.twoClassName</span> <span class="nt">a</span><span class="o">,</span> <span class="nc">.threeClassName</span> <span class="nt">span</span><span class="o">)</span> <span class="p">{</span>
<span class="nl">color</span><span class="p">:</span> <span class="no">red</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<h5 id="trick-bilgi">Trick bilgi</h5>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">*</span><span class="nd">:is</span><span class="o">(*</span><span class="nd">:hover</span><span class="o">,</span> <span class="o">*</span><span class="nd">:focus</span><span class="o">)</span>
<span class="nc">.card</span><span class="nd">:is</span><span class="o">(</span><span class="nc">.card</span><span class="nd">:hover</span><span class="o">,</span> <span class="nc">.card</span><span class="nd">:focus</span><span class="o">)</span>
</code></pre></div></div>
<p>Yazdığımız durumda tarayıcı aşağıdaki şekilde yorumlayacaktır.</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">*</span><span class="nd">:is</span><span class="o">(</span><span class="nd">:hover</span><span class="o">,</span> <span class="nd">:focus</span><span class="o">)</span>
<span class="nc">.card</span><span class="nd">:is</span><span class="o">(</span><span class="nd">:hover</span><span class="o">,</span> <span class="nd">:focus</span><span class="o">)</span>
</code></pre></div></div>
<p>Kafaları daha fazla karıştırmadan örneklendirelim :)
— Öncelikle yapıyı kuralım.</p>
<p><img src="/assets/img/blog/css-has-kullanimi.png" alt="css has kullanımı" /></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"container"</span><span class="nt">></span>
<span class="nt"><h1></span>CSS is:() kullanımı<span class="nt"></h1></span>
<span class="nt"><nav></span>
<span class="nt"><ol</span> <span class="na">class=</span><span class="s">"breadcrumb"</span><span class="nt">></span>
<span class="nt"><li</span> <span class="na">class=</span><span class="s">"breadcrumb-item"</span><span class="nt">><a</span> <span class="na">href=</span><span class="s">"/"</span><span class="nt">></span>Ana Sayfa<span class="nt"></a></li></span>
<span class="nt"><li</span> <span class="na">class=</span><span class="s">"breadcrumb-item"</span><span class="nt">><a</span> <span class="na">href=</span><span class="s">"/about"</span><span class="nt">></span>Hakkımda<span class="nt"></a></li></span>
<span class="nt"><li</span> <span class="na">class=</span><span class="s">"breadcrumb-item"</span><span class="nt">><a</span> <span class="na">href=</span><span class="s">"/contact"</span><span class="nt">></span>İletisim<span class="nt"></a></li></span>
<span class="nt"></ol></span>
<span class="nt"></nav></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"row"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"col-6 card active"</span><span class="nt">></span>
<span class="nt"><p></span>
Lorem Ipsum, dizgi ve baskı endüstrisinde kullanılan mıgır metinlerdir...
<span class="nt"><a</span> <span class="na">href=</span><span class="s">"#"</span><span class="nt">></span>Devamını oku...<span class="nt"></a></span>
<span class="nt"></p></span>
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">/* eski hali */</span>
<span class="nc">.container</span> <span class="nt">h1</span><span class="o">,</span>
<span class="nc">.container</span> <span class="nc">.breadcrumb</span> <span class="nt">a</span><span class="o">,</span>
<span class="nc">.container</span> <span class="nc">.card</span> <span class="nt">a</span> <span class="p">{</span>
<span class="nl">color</span><span class="p">:</span> <span class="no">red</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* yeni hali */</span>
<span class="nc">.container</span> <span class="nd">:is</span><span class="o">(</span><span class="nt">h1</span><span class="o">,</span> <span class="nc">.breadcrumb</span> <span class="nt">a</span><span class="o">,</span> <span class="nc">.card</span> <span class="nt">a</span><span class="o">)</span> <span class="p">{</span>
<span class="nl">color</span><span class="p">:</span> <span class="no">red</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<iframe height="300" style="width: 100%;" scrolling="no" title="CSS :is() example" src="https://codepen.io/hasanunal/embed/preview/BapOaGV?default-tab=html%2Cresult&theme-id=dark" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"></iframe>
<blockquote>
<p>Faydalanılan kaynaklar<br />
<a href="https://www.w3.org/TR/selectors-4/#matches" rel="nofollow" target="_blank">https://www.w3.org/TR/selectors-4/#matches</a>
<a href="https://www.youtube.com/watch?v=McC4QkCvbaY" rel="nofollow" target="_blank">https://www.youtube.com/watch?v=McC4QkCvbaY</a>
<a href="https://css-tricks.com/where-has-a-cool-specificity-trick-too/" rel="nofollow" target="_blank">https://css-tricks.com/where-has-a-cool-specificity-trick-too/</a></p>
</blockquote>
CSS Merkezleme konusunda ustalaşalım
2021-04-17T00:00:00+00:00
https://hasanunal.org/blog/css-merkezleme-konusunda-ustalasalim
<p>CSS’de bir şeyleri ortalamayı genel bir problem olarak ele alabiliriz. Peki bu yapı neden zor kabul ediliyor? Ben anlamak yerine ezbere gittiğimizi düşünmekteyim :)</p>
<p>Şimdi gelin CSS’de merkezleme konuları baştan sona inceleyelim.</p>
<h4 id="yatay-olarak-ortalama">Yatay olarak ortalama</h4>
<p>Satır içi öğeleri, yalnızca aşağıdakilerle blok düzeyinde bir ana öğe içinde yatay olarak ortalayabilirsiniz.</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.text-center</span> <span class="p">{</span>
<span class="nl">text-align</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Kapsayıcı görünüm <em>(display:…)</em> değeri “blok” veya “grid” olmak zorunda. “inline-block” veya “inline-grid” ise belli bir genişliği olması gerekmektedir.<br />
<a href="https://www.w3schools.com/cssref/pr_class_display.asp" rel="nofollow" target="_blank">https://www.w3schools.com/cssref/pr_class_display.asp</a></p>
<h5 id="türü-blok-element-ise">Türü blok element ise</h5>
<p><em>margin-left</em> ve <em>margin-right</em> değerlerine <em>auto</em> vererek ortalayabilirsiniz.<br />
Belirli bir genişliğe sahip olması gerekmekte, aksi takdirde tam genişliğe göre ortalanır.</p>
<p>Ortaladığınız blok seviyesi ögenin veya üst öğenin genişliği ne olursa olsun çalışacaktır. Örnek ile anlatalım.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"content"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"horizontally-center"</span><span class="nt">></span>
center element
<span class="nt"></div></span>
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.content</span> <span class="p">{</span>
<span class="nl">height</span><span class="p">:</span> <span class="m">100vh</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.horizontally-center</span> <span class="p">{</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">200px</span><span class="p">;</span>
<span class="nl">margin</span><span class="p">:</span> <span class="m">0</span> <span class="nb">auto</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<h4 id="birden-fazla-blok-ögesini-yatay-ortalama">Birden fazla blok ögesini yatay ortalama</h4>
<p>Bir satırda yatay olarak ortalanması gereken iki veya daha fazla blok düzeyinde öğeniz varsa <strong><em>display</em></strong><em>: inline-blok</em> veya <em>flex</em> ile yapabilirsiniz.</p>
<p><strong>inline-blok</strong> örneği yapalım.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-inline-block-center"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"content"</span><span class="nt">></span>
center one
<span class="nt"></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"content"</span><span class="nt">></span>
center two
<span class="nt"></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"content"</span><span class="nt">></span>
center three
<span class="nt"></div></span>
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-inline-block-center</span> <span class="p">{</span>
<span class="nl">text-align</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.d-inline-block-center</span> <span class="nc">.content</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">inline-block</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<h4 id="elementin-mutlak-özelliği-ile-yatay-ortalama-tavsiye-edilmez">Elementin mutlak özelliği ile yatay ortalama (Tavsiye edilmez)</h4>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-block-absolute-horizontally-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-block-absolute-horizontally-center</span> <span class="p">{</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">200px</span><span class="p">;</span>
<span class="nl">left</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">transform</span><span class="p">:</span> <span class="n">translateX</span><span class="p">(</span><span class="m">-50%</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<div class="text-center">
![css animation](/assets/img/blog/css-master-center.jpg)
</div>
<p>— Daha anlaşılır olması için: 200px genişliği olan bir nesne düşünelim ve dış kapsayıcısının genişliğinin 800px olduğunu varsayalım. left: 50%; değerini verdiğimiz durumda elementin sol tarafa uzaklığı 400px, sağ tarafa 200px olacaktır :)</p>
<p>X ekseninden -50% diyerek genişliğin yarısı kadar sola yaklaştırıyoruz. (200px-100px) Elementin sol tarafa uzaklığı 50%-100px;</p>
<h4 id="flex-ile-yatay-ortalama-önerilen">Flex ile yatay ortalama (önerilen)</h4>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-flex-horizontally-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-flex-horizontally-center</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">flex</span><span class="p">;</span>
<span class="nl">justify-content</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<h4 id="grid-ile-yatay-ortalama-önerilen">Grid ile yatay ortalama (önerilen)</h4>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-flex-grid-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-flex-grid-center</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">grid</span><span class="p">;</span>
<span class="nl">justify-content</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<h3 id="dikey-olarak-ortalama">Dikey olarak ortalama</h3>
<p>Dikey merkezleme, CSS’de biraz daha zordur.</p>
<p>İlk yöntem <em>(tavsiye edilmez)</em> nesneye absolute özelliği kazandırarak bir üst kapsayıcı yüksekliğine göre dikeyde ortalama</p>
<p><em>Trick bilgi: CSS’de</em> <strong><em>transform: translateY;</em></strong> <em>değeri Y eksenini koordinatına göre (dikey) hesaplamak için kullanılır.</em> <strong><em>-50%;</em></strong> <em>tanımı ise elementin</em> <strong><em>100%</em></strong> <em>yüksekliğini al ve</em> <strong><em>50%</em></strong> <em>yukarı uzaklığından çıkar.</em></p>
<h4 id="elementin-mutlak-özelliği-ile-dikey-ortalama-tavsiye-edilmez">Elementin mutlak özelliği ile dikey ortalama (Tavsiye edilmez)</h4>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-block-absolute-vertically-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-block-absolute-vertically-center</span> <span class="p">{</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="m">200px</span><span class="p">;</span>
<span class="nl">top</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">transform</span><span class="p">:</span> <span class="n">translateY</span><span class="p">(</span><span class="m">-50%</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<h4 id="flex-ile-dikey-ortalama-önerilen">Flex ile dikey ortalama (önerilen)</h4>
<p><a href="https://www.w3schools.com/cssref/css3_pr_flex.asp" rel="nofollow" target="_blank">CSS flex property</a></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-flex-vertically-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-flex-vertically-center</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">flex</span><span class="p">;</span>
<span class="nl">align-items</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<blockquote>
<p>Flex ile kapsayıcı içi elementleri dikeyde ortalamak için elementin mutlak yüksekliğinin olması gerekmekte.</p>
</blockquote>
<hr />
<h4 id="grid-ile-dikey-ortalama-önerilen">Grid ile dikey ortalama (önerilen)</h4>
<p><a href="https://www.w3schools.com/cssref/css3_pr_flex.asp" rel="nofollow" target="_blank">CSS flex property</a></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-grid-vertically-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-grid-vertically-center</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">grid</span><span class="p">;</span>
<span class="nl">align-items</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<blockquote>
<p>Grid ile kapsayıcı içi elementleri dikeyde ortalamak için elementin mutlak yüksekliğinin olması gerekmekte.</p>
</blockquote>
<hr />
<h4 id="elementin-mutlak-özelliği-ile-yatay-ve-dikey-ortalama-tavsiye-edilmez">Elementin mutlak özelliği ile yatay ve dikey ortalama (Tavsiye edilmez)</h4>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-block-absolute-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-block-absolute-center</span> <span class="p">{</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
<span class="nl">top</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">left</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">transform</span><span class="p">:</span> <span class="n">translete</span><span class="p">(</span><span class="m">-50%</span><span class="p">,</span> <span class="m">-50%</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<blockquote>
<p><strong>transform: translate(X, Y);</strong></p>
<p><strong>translateX;</strong> değeri X eksenini koordinatına göre (yatay)<br />
<strong>translateY;</strong> değeri Y eksenini koordinatına göre (dikey)</p>
</blockquote>
<h4 id="flex-ile-yatay-ve-dikey-ortalama-önerilen">Flex ile yatay ve dikey ortalama (önerilen)</h4>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-flex-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-flex-center</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">flex</span><span class="p">;</span>
<span class="nl">align-items</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="nl">justify-content</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p><a href="https://www.w3schools.com/cssref/css3_pr_justify-content.asp" rel="nofollow" target="_blank">CSS justify-content property</a></p>
<p><a href="https://www.w3schools.com/cssref/css3_pr_align-items.asp" rel="nofollow" target="_blank">CSS align-items property</a></p>
<h4 id="grid-ile-yatay-ve-dikey-ortalama-önerilen">Grid ile yatay ve dikey ortalama (önerilen)</h4>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"d-grid-center"</span><span class="nt">></span>
content
<span class="nt"></div></span>
</code></pre></div></div>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.d-grid-center</span> <span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">flex</span><span class="p">;</span>
<span class="py">place-content</span><span class="p">:</span> <span class="nb">center</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p><a href="https://www.w3schools.com/css/css_grid_container.asp" rel="nofollow" target="_blank">CSS Grid Container</a></p>
<blockquote>
<p>Grid hakkında detaylı anlatım için <a href="https://fatihhayrioglu.com/" rel="nofollow" target="_blank">Fatih Hayrioğlu</a>’nun kaleme aldığı “<a href="https://fatihhayrioglu.com/grid-hizalama-ve-siralama-islemleri/" rel="nofollow" target="_blank">Grid hizalama ve sıralama işlemleri</a>” makalesine göz atabilirsiniz.</p>
</blockquote>
CSS Animation kullanımı örnek proje ile anlatım
2021-04-14T00:00:00+00:00
https://hasanunal.org/blog/css-animation-ornek-proje-ile-anlatim
<p>Merhabalar, monitör yaptığımız işlemde bazı trick olaylardan faydalandık. Bunları sizlerle paylaşmak istiyorum.</p>
<p><img src="/assets/img/blog/css-animation.jpg" alt="css animation" /></p>
<p>Talep edilen dört kutucuğu birbiri ile ayrı ayrı ilişkilendirmek.</p>
<p>Senaryo:</p>
<ul>
<li>Yukarıdan aşağı, sağa, sola</li>
<li>Aşağıdan yukarı, sağa, sola</li>
<li>Sağdan karşıya, yukarı, aşağı</li>
<li>Soldan karşıya, yukarı, aşağı</li>
</ul>
<p>Peki biz nasıl bir yapı kurduk :)</p>
<p>Öncelikle relative bir kapsayıcıya ihtiyacımız var sonra <code>:root</code> renk ve boşluk değerini tanımlayarak başlıyoruz.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">class=</span><span class="s">"container bg-gray"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"interactive-icon"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"loading-line"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"line-right-to-top"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"linear-line"</span><span class="nt">></div></span>
<span class="nt"></div></span>
...
<span class="nt"></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"rounded-element"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"col-12 d-flex justify-content-center mb-3"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"round-box"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"icon energy"</span><span class="nt">></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"text"</span><span class="nt">></span>0.4 kW<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"row"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"col-6 d-flex justify-content-center"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"round-box"</span><span class="nt">></span>
icon
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"col-6 d-flex justify-content-center"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"round-box"</span><span class="nt">></span>
icon
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"col-12 d-flex justify-content-center"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"round-box"</span><span class="nt">></span>
icon
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"></div></span>
</code></pre></div></div>
<p>container içerisinde dört tane elementimizi oluşturduk ve bunları</p>
<table>
<tr>
<td colspan="2" class="text-center">col-12</td>
</tr>
<tr>
<td>col-6</td>
<td>col-6</td>
</tr>
</table>
<p>bir yapı kurduk. İstenen element şekilleri altıgen olduğu için css clip path özelliğinden faydalandık. Kullandığımız araç: <a href="https://bennettfeely.com/clippy/" rel="nofollow" target="_blank"><em>bennettfeely.com/clippy/</em></a></p>
<p><a href="https://caniuse.com/?search=clip-path" rel="nofollow" target="_blank">Can I use Search: clip-path</a></p>
<p>Şimdi ilk senaryo ile elementler arası iletişimi başlatalım.</p>
<h5 id="yukarıdan--aşağıya">Yukarıdan => Aşağıya</h5>
<p>İhtiyacımız olan yukarı ve aşağıyı kapsayacak absolute bir element. Bu elementin width ve height değerlerini 0 giriyoruz. Daha sonra animasyon ile bu değerleri değiştirerek yükleniyor görünümü kazandıracağız.</p>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.line-top-to-bottom</span> <span class="p">{</span>
<span class="nl">left</span><span class="p">:</span> <span class="nf">calc</span><span class="p">(</span><span class="m">50%</span> <span class="o">+</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">space</span><span class="p">));</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="nf">calc</span><span class="p">(</span><span class="m">100%</span> <span class="o">-</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">space</span><span class="p">));</span>
<span class="nc">.linear-line</span> <span class="p">{</span>
<span class="nl">border-left</span><span class="p">:</span> <span class="m">2px</span> <span class="nb">solid</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">color-one</span><span class="p">);</span>
<span class="nl">border-bottom</span><span class="p">:</span> <span class="m">2px</span> <span class="nb">solid</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">color-one</span><span class="p">);</span>
<span class="nl">box-shadow</span><span class="p">:</span> <span class="m">0</span> <span class="m">0</span> <span class="m">10px</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">255</span><span class="o">,</span> <span class="m">255</span><span class="o">,</span> <span class="m">255</span><span class="o">,</span> <span class="m">1</span><span class="p">)</span><span class="o">,</span> <span class="m">0</span> <span class="m">0</span> <span class="m">0px</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">255</span><span class="o">,</span> <span class="m">255</span><span class="o">,</span> <span class="m">255</span><span class="o">,</span> <span class="m">1</span><span class="p">)</span><span class="o">,</span>
<span class="m">0</span> <span class="m">0</span> <span class="m">10px</span> <span class="nf">rgba</span><span class="p">(</span><span class="m">255</span><span class="o">,</span> <span class="m">255</span><span class="o">,</span> <span class="m">255</span><span class="o">,</span> <span class="m">1</span><span class="p">)</span><span class="o">,</span> <span class="m">0</span> <span class="m">0</span> <span class="m">10px</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">color-one</span><span class="p">)</span><span class="o">,</span>
<span class="m">0</span> <span class="m">0</span> <span class="m">15px</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">color-one</span><span class="p">)</span><span class="o">,</span> <span class="m">0</span> <span class="m">0</span> <span class="m">20px</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">color-one</span><span class="p">)</span><span class="o">,</span>
<span class="m">0</span> <span class="m">0</span> <span class="m">30px</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">color-one</span><span class="p">);</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="na">-webkit-animation</span><span class="p">:</span> <span class="n">top-to-bottom</span> <span class="m">1s</span> <span class="n">ease-in</span> <span class="m">0</span><span class="mi">.5s</span> <span class="n">forwards</span><span class="p">;</span>
<span class="nl">animation</span><span class="p">:</span> <span class="n">top-to-bottom</span> <span class="m">1s</span> <span class="n">ease-in</span> <span class="m">0</span><span class="mi">.5s</span> <span class="n">forwards</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Elementimize absolute değeri vererek özgürleştiriyoruz. Relative kapsayıcısından dışarı çıkamadığı için animasyon işlemlerimiz alanımızda gerçekleşecektir.</p>
<p>Gecikme süreleri kullanarak çizgilerin birbirinden bağımsız yüklemesini ayarladık.</p>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">-webkit-animation</span><span class="p">:</span> <span class="n">top-to-bottom</span> <span class="m">1s</span> <span class="n">ease-in</span> <span class="m">0</span><span class="mi">.5s</span> <span class="n">forwards</span><span class="p">;</span>
<span class="nl">animation</span><span class="p">:</span> <span class="n">top-to-bottom</span> <span class="m">1s</span> <span class="n">ease-in</span> <span class="m">0</span><span class="mi">.5s</span> <span class="n">forwards</span><span class="p">;</span>
</code></pre></div></div>
<table class="my-2">
<thead>
<tr>
<th class="text-left">Değer</th>
<th class="text-left">Açıklama</th>
</tr>
</thead>
<tbody>
<tr>
<td>top-to-bottom</td>
<td>Animasyon adı</td>
</tr>
<tr>
<td>1s</td>
<td>Animasyon tamamlama süresi</td>
</tr>
<tr>
<td>esase-in</td>
<td>Animasyon hız eğrisi</td>
</tr>
<tr>
<td>.5s</td>
<td>Animasyon başlangıç gecikme süresi</td>
</tr>
<tr>
<td>forwards</td>
<td>Animasyon doldurma modu</td>
</tr>
</tbody>
</table>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">@-webkit-keyframes</span> <span class="nt">top-to-bottom</span> <span class="p">{</span>
<span class="nt">0</span><span class="nv">%</span> <span class="p">{</span> <span class="nl">height</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
<span class="nt">100</span><span class="nv">%</span> <span class="p">{</span> <span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
<span class="k">@keyframes</span> <span class="nt">top-to-bottom</span> <span class="p">{</span>
<span class="nt">0</span><span class="nv">%</span> <span class="p">{</span> <span class="nl">height</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span> <span class="p">}</span>
<span class="nt">100</span><span class="nv">%</span> <span class="p">{</span> <span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Animasyon işlemi: 0% değerinde ise height: 0<em>(px)</em> değerini al => 100% olduğunda <em>(animasyon tamamlandığında)</em> height: 100% ol diyoruz ve başlangıçta gözükmeyen elementin genişlik değeri ile oynayıp yükleniyormuş gibi görünüm elde ediyoruz.</p>
<p>Şimdi bu elementi birden fazla senaryo için çoğaltma işlemi yapacağız.
<strong>Elementimizi kopyalayarak —</strong></p>
<h5 id="i̇kinci-senaryoyu-gerçekleştirelim-yukarıdan--aşağıya">İkinci senaryoyu gerçekleştirelim. Yukarıdan => Aşağıya</h5>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.line-bottom-to-top</span> <span class="p">{</span>
<span class="nl">left</span><span class="p">:</span> <span class="nf">calc</span><span class="p">(</span><span class="m">50%</span> <span class="o">+</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">space</span><span class="p">));</span>
<span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="nf">calc</span><span class="p">(</span><span class="m">100%</span> <span class="o">-</span> <span class="nf">var</span><span class="p">(</span><span class="o">--</span><span class="n">space</span><span class="p">));</span>
<span class="nl">transform</span><span class="p">:</span> <span class="nf">scale</span><span class="p">(</span><span class="m">1</span><span class="o">,</span> <span class="m">-1</span><span class="p">);</span>
<span class="nc">.linear-line</span> <span class="p">{</span>
<span class="nl">border-left</span><span class="p">:</span> <span class="m">2px</span> <span class="nb">solid</span> <span class="mh">#0dcaf0</span><span class="p">;</span>
<span class="nl">border-bottom</span><span class="p">:</span> <span class="m">2px</span> <span class="nb">solid</span> <span class="mh">#0dcaf0</span><span class="p">;</span>
<span class="nl">width</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="nl">height</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
<span class="na">-webkit-animation</span><span class="p">:</span> <span class="n">top-to-bottom</span> <span class="m">1s</span> <span class="n">ease-in</span> <span class="m">0</span><span class="mi">.5s</span> <span class="n">forwards</span><span class="p">;</span>
<span class="nl">animation</span><span class="p">:</span> <span class="n">top-to-bottom</span> <span class="m">1s</span> <span class="n">ease-in</span> <span class="m">0</span><span class="mi">.5s</span> <span class="n">forwards</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Burada CSS dönüştürme Özelliği’nden faydalandık.</p>
<p>Bunu başarmak için CSS Dönüştürme Özelliği kullanabilirsiniz. Dikey çevirme, div’i şu şekilde ölçeklendirmeyi içerir:</p>
<div class="language-scss highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">-webkit-transform</span><span class="p">:</span> <span class="nf">scale</span><span class="p">(</span><span class="m">1</span><span class="o">,</span> <span class="m">-1</span><span class="p">);</span>
<span class="na">-ms-transform</span><span class="p">:</span> <span class="nf">scale</span><span class="p">(</span><span class="m">1</span><span class="o">,</span> <span class="m">-1</span><span class="p">);</span>
<span class="na">-o-transform</span><span class="p">:</span> <span class="nf">scale</span><span class="p">(</span><span class="m">1</span><span class="o">,</span> <span class="m">-1</span><span class="p">);</span>
<span class="nl">transform</span><span class="p">:</span> <span class="nf">scale</span><span class="p">(</span><span class="m">1</span><span class="o">,</span> <span class="m">-1</span><span class="p">);</span>
</code></pre></div></div>
<p><small>scss — transform ile element ayna görünüm işlemi</small></p>
<p>Bu aşamadan sonra yapılması gereken işlemler kutular arası iletişimin gelen isteğe göre JavaScript ile .loading-line elementi içindeki line-<strong><em>right</em></strong>-to-<strong><em>top</em></strong> değerlerini değiştirmek alanı yeniletmek.</p>
<h5 id="anlatımda-yapılan-örnek">Anlatımda yapılan örnek</h5>
<iframe height="300" style="width: 100%;" scrolling="no" title="linear line" src="https://codepen.io/hasanunal/embed/preview/gOgOVzP?default-tab=html%2Cresult&theme-id=dark" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"></iframe>
cloudflare curl ile önbellek temizleme – geliştirici modu açma
2021-02-03T00:00:00+00:00
https://hasanunal.org/blog/cloudflare-curl-ile-onbellek-temizleme-gelistirici-modu-acma
<p>Merhaba, sıklıkla çalıştığımız sitelerin cfde olmasından dolayı yaşadığımız önbellekleme sorununu nasıl kullanıcı şifresi olmadan çözeceğimizi bu makalede anlatmak istiyorum.</p>
<p>Bir internet sitesi cfde ise front-end developerın can çekişmesi elden bile değil. Bu gibi durumların önüne geçmek için proje yetkilisine dört saat ara ile geliştirici modunu da aç diyemediğimiz gibi, mail ve şifresini de talep etmek doğru olmaz. En kalıcı ve sağlıklı çözüm curl ile uzaktan bu işlemi tetikleme.</p>
<p><strong>Profile</strong> > <strong>My Profile</strong></p>
<p><img src="/assets/img/blog/cloudflare-curl.jpg" alt="cloudflare curl 1" /></p>
<p>Sağ üstte</p>
<ul>
<li>3. tab -> <strong>Api Token</strong></li>
<li><strong>Global API Key</strong> – > <em>View</em></li>
<li><strong>Passworld</strong> – > <em>View</em></li>
<li><strong>Your API Key</strong> – <em>copy</em></li>
</ul>
<p>Global keyi kopyaladık. Sırada zone id alma işlemi</p>
<p><strong>Anasayfa</strong> > siteadresi.com paneline girip <strong>ZONE ID</strong> kopyalıyoruz</p>
<p><img src="/assets/img/blog/cloudflare-curl-2.jpg" alt="cloudflare curl 2" /></p>
<p>sağ menüde</p>
<p>Daha sonra aşağıdaki ZONE-ID yazan yere kopyaladığınız kodu global key yerine yukarıda aldığınız kodu yapıştırın. Mail adresini girin ve komutu terminalde çalıştırın.</p>
<h4 id="geliştirici-modunu-kapatmak-için">Geliştirici Modunu kapatmak için</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-X</span> PATCH <span class="s2">"https://api.cloudflare.com/client/v4/zones/ZONE-ID/settings/development_mode"</span> <span class="se">\</span>
<span class="nt">-H</span> <span class="s2">"X-Auth-Email: mail adresi"</span> <span class="se">\</span>
<span class="nt">-H</span> <span class="s2">"X-Auth-Key: global key"</span> <span class="se">\</span>
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
<span class="nt">--data</span> <span class="s1">'{"value":"off"}'</span>
</code></pre></div></div>
<p><strong>value</strong> değerini <strong>on</strong> olarak çalıştırırsan <strong>developer mode</strong> açar</p>
<h4 id="önbellek-temizlemek-için">Önbellek temizlemek için</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-X</span> POST <span class="s2">"https://api.cloudflare.com/client/v4/zones/ZONE-ID/purge_cache"</span> <span class="se">\</span>
<span class="nt">-H</span> <span class="s2">"X-Auth-Email: mail adresi"</span> <span class="se">\</span>
<span class="nt">-H</span> <span class="s2">"X-Auth-Key: global key"</span> <span class="se">\</span>
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
<span class="nt">--data</span> <span class="s1">'{"purge_everything":true}'</span>
</code></pre></div></div>
6+1 Vatan Borcu Ödendi
2020-08-31T00:00:00+00:00
https://hasanunal.org/blog/vatan-borcu-odendi
<p>Bu vatan asıl, toprağın kara bağrında sıra dağlar gibi duranlarındır. Belki biz sizler gibi çok haketmedik bu vatanı ama bize emanet bıraktığınız mirasa sahip çıkmaya çalıştık. Eksik değil fazlasıyla dolu dolu yaptık.</p>
<p>Korona muhabbetinden dolayı 6 gittiğim askerlik 1 ay uzadı, tüm planları Nisan’a göre yapmışken Nisan’ın Mart’tan bir farkı kalmadı :)</p>
<p>Askerden döndükten sonra orda söylenemeyenleri burada öğreniyorsun, lokmalar boğazında düğümleniyor tüm planlarını yeniden gözden geçiriyorsun. Tüm hayatını orada özlem duyduğun ailene göre yeniden şekillendiriyorsun, ailenden kaçmak yerine daha fazla görebileceğin bir gelecek planlıyorsun. Aslında hayatta ki önemli şeyin sevgi, aile olduğunu öğreniyorsun.</p>
<p>Bu satırları yazarken derin bi nefes alıyorum ve hayatın gidişini sorguluyorum. Er olarak yapıpta askerlik günlerini özler mi bi insan? özlüyorum.</p>
<p>Askerden geldim ve corona bitmiş değil, evden dışarı çıkmıyoruz. Hayat çok farklı geliyor hiç bir şey bıraktığımız gibi değil bu yeni dünyaya alışmak biraz zaman alacak…</p>
<p>Bolu 2. Komando Tugayı 99/4A tertip bende kocaman bir hatıra, aile olarak kalacak. Askerlik çok şey kattı ve çok şeyi aldı. Her şey rağmen söylenebilecek tek bir söz var;</p>
<p><img src="/assets/img/blog/vatan-borcu-odendi-1.jpg?v=1" class="w-100" alt="anı" /></p>
<p><strong>Vatan sağ olsun…</strong><br />
<em>Tüm devrelerime selam olsun!</em></p>
css ile scroll
2020-08-22T00:00:00+00:00
https://hasanunal.org/blog/css-ile-scroll
<p>Sıklıkla kullandığım bi <strong>css</strong> kodu paylaşmak istiyorum. Bazı arkadaşlar element id scroll yapmak için <strong>JavaScript</strong> kullanıyor buna gerek olmadan basit tek satır bir css kodu ile halledebiliyoruz.</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">html</span> <span class="p">{</span><span class="py">scroll-behavior</span><span class="p">:</span> <span class="n">smooth</span><span class="p">;}</span>
</code></pre></div></div>
<p>daha sonrasını biliyorsunuz zaten ama madem anlatmaya başladık bitirelim.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><a</span> <span class="na">href=</span><span class="s">"#top"</span><span class="nt">></span>Yukarı çık<span class="nt"></a></span>
</code></pre></div></div>
<p>ve scroll edeceğimiz id değerini veriyoruz. Bu kadar 🙂</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><div</span> <span class="na">id=</span><span class="s">"top"</span><span class="nt">></span>
...
<span class="nt"></div></span>
</code></pre></div></div>
JavaScript renkleri tersine çevirme
2020-08-20T00:00:00+00:00
https://hasanunal.org/blog/javascript-renkleri-tersine-cevirme
<p>Merhaba, basit bi js kodu ile herhangi bir internet sitesinde çalıştırarak tüm her şeyi zıt renklerine çevirebilirsiniz.</p>
<p>Uzun okuma metinlerinde karanlık mod olmayan internet sitelerinde <strong>Bookmarks</strong> kısmına ekleyerek tek tıkla çalıştırdığım kod sayesinde çok rahat ediyorum sizde aynı mantıkla kullanıp geceleri makale okurken gözlerinizin yorulmasını engelleyebilirsiniz.</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">javascript</span><span class="p">:(</span><span class="kd">function</span><span class="p">(){</span> <span class="kd">var</span> <span class="nx">h</span><span class="o">=</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="dl">'</span><span class="s1">head</span><span class="dl">'</span><span class="p">)[</span><span class="mi">0</span><span class="p">],</span><span class="nx">s</span><span class="o">=</span><span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="dl">'</span><span class="s1">style</span><span class="dl">'</span><span class="p">);</span><span class="nx">s</span><span class="p">.</span><span class="nx">setAttribute</span><span class="p">(</span><span class="dl">'</span><span class="s1">type</span><span class="dl">'</span><span class="p">,</span><span class="dl">'</span><span class="s1">text/css</span><span class="dl">'</span><span class="p">);</span> <span class="nx">s</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">createTextNode</span><span class="p">(</span><span class="dl">'</span><span class="s1">html{-webkit-filter:invert(100%) hue-rotate(180deg) contrast(70%) !important; background: #fff;} .line-content {background-color: #fefefe;}</span><span class="dl">'</span><span class="p">));</span><span class="nx">h</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">s</span><span class="p">);</span> <span class="p">})()</span>
</code></pre></div></div>
<blockquote>
<p>Kaynak
<a href="https://gist.github.com/Artistan/45fa744b899f4f054173693298d41930" rel="nofollow" target="_blank">https://gist.github.com/Artistan/45fa744b899f4f054173693298d41930</a></p>
</blockquote>
CSS3 ile Satır Sayısı Sınırlama ve Sonuna 3 Nokta Ekleme
2020-08-18T00:00:00+00:00
https://hasanunal.org/blog/css3-ile-satir-sayisi-sinirlama-ve-sonuna-3-nokta-ekleme
<p>Uzun makalelere özet görünümü sağlamak backend ile çözülmesi gereken bir konu fakat bazı durumlarda biz front-endcilerin halletmesi gereken bir durum haline gelebiliyor.</p>
<p>Senaryo: Birden fazla kutu var ve hepsinde üç satır metin olması gerekiyor fakat çekilen özet metin kelime saydığı zaman bu uzun kelimelerde satır sayısını aşmaya neden olabiliyor bunu <a href="https://hasanunal.org/tag/#javascript">JavaScript</a> ile uzun bir yolla çözmek mümkünken <a href="https://hasanunal.org/tag/#css">CSS3</a> ile artık çok daha kolay!</p>
<p><strong>-webkit-line-clamp</strong> güncel bir <a href="https://hasanunal.org/tag/#css">CSS</a> tanımı. Bu yapı çok popüler olsa da henüz IE ve Firefox desteğini görmemekte. Buna rağmen Chrome, Safari, Opera ve birçok mobil tarayıcı -webkit-line-clamp kullanmanıza müsade etmekte.</p>
<blockquote>
<p>Tüm tarayıcı desteklerini görmek için <a href="https://caniuse.com/#feat=css-line-clamp" rel="nofollow" target="_blank">buraya</a> göz atabilirsiniz.</p>
<p><a href="https://caniuse.com/">caniuse.com</a>#feat=css-line-clamp</p>
</blockquote>
<p>Bir paragraftaki yazının 5. satırda kesilmesini ve sonuna 3 nokta eklenmesini sağlayalım.</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">p</span><span class="p">{</span>
<span class="nl">display</span><span class="p">:</span> <span class="n">-webkit-box</span><span class="p">;</span>
<span class="nl">-webkit-line-clamp</span><span class="p">:</span> <span class="m">5</span><span class="p">;</span>
<span class="nl">-webkit-box-orient</span><span class="p">:</span> <span class="n">vertical</span><span class="p">;</span>
<span class="nl">overflow</span><span class="p">:</span><span class="nb">hidden</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
Sitede özel imleç kullanma
2020-08-14T00:00:00+00:00
https://hasanunal.org/blog/sitede-ozel-imlec-kullanma
<p>Öncelikle kullanacağınız iconu seçiyorsunuz seçtikten sonra dosya formatına göre dönüştürme işlemi yapmanız gerekebilir.</p>
<p>Bunun için online converter servislerini kullanabilirsiniz.<br />
Benim kullandığım servis <a href="https://convertio.co" rel="nofollow" target="_blank"><strong>convertio.co</strong></a> adresi oldu.</p>
<p>Sonra png formatına dönüştürdüğümüz görselimizin base64 kodunu alarak css’e ekleme işlemini yapalım.</p>
<p>Bunun için online base64 kod veren servisler var.<br />
Benim kullandığım <a href="https://www.base64-image.de/" rel="nofollow" target="_blank"><strong>base64-image.de</strong></a> oldu.</p>
<p>Daha sonra css’de body etiketimize</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">cursor</span><span class="o">:</span> <span class="nt">url</span><span class="o">(</span><span class="s2">'base64 kodu'</span><span class="o">),</span> <span class="nt">auto</span><span class="o">;</span>
</code></pre></div></div>
<p>değerini girelim ve cursor değiştirme işlemimiz bitsin.</p>
<p>Aynı şekilde <em>a:hover</em> gibi değerlere de imleçin farklı hallerini girerek seçicinizi değiştirmeniz gerekiyor.</p>
<blockquote>
<p>İyi bir kullanıcı deneyimi için linklerde imlecin farklı halini kullanmanızı tavsiye ederim.</p>
</blockquote>
flexbox flex-shrink nedir?
2020-08-14T00:00:00+00:00
https://hasanunal.org/blog/flexbox-flex-shrink-nedir
<p><strong>flex-shrink</strong> tanımlanmış eleman, esnek kapsayıcı eleman içindeki diğer elemanlara göre nasıl büzüleceğini belirler.</p>
<p>Tarayıcı genişliği daraltılınca <strong>flex-shrink</strong> değeri <strong>2</strong> olarak belirlenen kutu daha fazla büzülecektir. Uyumlu web siteleri yaparken işe yarar bu özellik.</p>
<p><strong><em>flex-shrink yapısı</em></strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Yapısı: flex-shrink: <sayı>
Aldığı Değerler: sayı
Başlangıç Değeri: 1
Uygulanabilen Elementler: Esnek öğelere ve esnek kapsayıcı içindeki absolute tanımlı alt öğelere
Kalıtsallık: Yok
</code></pre></div></div>
<p>Verdiğim değer hiçbir şekilde değişmesin istiyorsanız <em><strong>flex-shrink:0;</strong></em> değerini vermeniz gerekiyor.</p>
<blockquote>
<p>Flexbox kullanırken bir projede karşılaştığım bugı çözmek için arayış içindeyken <a href="https://youtu.be/_s15i3MoAyE?t=2998" rel="nofollow" target="_blank"><strong><em>Adem İlter’in YouTube’da Flexbox videosu</em></strong></a> aklıma geldi. Çok güzel anlatmış bende yazıya döküyorum.</p>
</blockquote>
Udemy ücretsiz kurs dizini linkleri
2020-08-13T00:00:00+00:00
https://hasanunal.org/blog/udemy-ucretsiz-kurs-dizini-linkleri
<ul>
<li>Python: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fpython%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT00F5ennp2qVTOqh55AszMUX8mwCnJuvKC_6TwdDkoHXpriarUjYbcpKyOR8YkD7KGqFXBK9BKG3watSiCITgl5lWDEr-TWOMxkaOxAoBMkywaIfrGX4rk5F2waKFjQT7vOAu-JVQ&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/python/free/</a></li>
<li>Javascript: <a href="https://www.udemy.com/topic/javascript/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/javascript/free/</a></li>
<li>Angular: <a href="https://www.udemy.com/topic/angular/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/angular/free/</a></li>
<li>Kripto para: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fcryptocurrency%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT0nwZhq5-RHSziZC_FJcsJQbE3jLwkxDdD8x2kv66GNl6UFB38JN6YonVQC_GT5UEkEIKf0bl1merJWAsrk0-bHfLLCpl9tXVATjbv0DGr_n4hi1hYnZVou30860SSNqq-73PwLwA&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/cryptocurrency/free/</a></li>
<li>Linux: <a href="https://www.udemy.com/topic/linux/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/linux/free/</a></li>
<li>Photoshop: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fphotoshop%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT2sH4_X9c3_ViQX2Me4E8heaUlLdfi-BaDjui0S0pwW0l-ADrpA9VSSWI06ahB5pfz1bM2whyPkxdbmvSJ8NgE1OPLtvZziBEAcTyQ42XP5qbkyo7dJI6e5NDAz-BJSJ41xqebudw&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/photoshop/free/</a></li>
<li>PHP: <a href="https://www.udemy.com/topic/php/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/php/free/</a></li>
<li>Unity: <a href="https://www.udemy.com/topic/unity/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/unity/free/</a></li>
<li>WordPress: <a href="https://www.udemy.com/topic/wordpress/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/wordpress/free/</a></li>
<li>Photoshop: <a href="https://www.udemy.com/topic/photoshop/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/photoshop/free/</a></li>
<li>Java: <a href="https://www.udemy.com/topic/java/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/java/free/</a></li>
<li>Word: <a href="https://www.udemy.com/topic/microsoft-word/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/microsoft-word/free/</a></li>
<li>Grafik tasarım: <a href="https://www.udemy.com/topic/graphic-design/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/graphic-design/free/</a></li>
<li>Çince Öğrenme: <a href="https://www.udemy.com/topic/chinese-language/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/chinese-language/free/</a></li>
<li>Almanca öğrenme: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fgerman-language%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT3XgQvxn2TZMFnTf9uDqCAdcG1RsIuZzYp4Jzdt-RVap2npwcLkAHXXC6sbXkKQKx8pT_N_6LuNE-NGe4ZLfUNPEQDH7ORgaVkn85IzqG4P3zhpfygKEI_41nF12aE0WXXuJbtmQQ&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/german-language/free/</a></li>
<li>Amazon AWS: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Faws-certification%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT2F5WOse6clfolWiTdBTtqo1VomurNXe-XE8es5bM_6Iden9VXDwT-S4Hp_cVbW386pSomEMKFyDHXV_YnfbbRXw-ZlGsczxtMGsE79YoGCavHeUh81lCoB1qjhdgzPLzOVyr3cjw&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/aws-certification/free/</a></li>
<li>Yemek yapma: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fcooking%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT2E2duh_S7vrJncCFdoxDs3orvH_bSj0xdzRu55p_MncK28_biITY3FO8xg1xZrRsoiEO49ESxFHr-ToOiqFZeEeeCtncgvbcreen3dmwqhkqzwTJ4QteVyvo4fRNR_fxunfWsazg&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/cooking/free/</a></li>
<li>3D modelleme: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2F3d-modeling%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT3biDyhcS9K-_EsZhG9nR2FaNx4jD4EnqUCIyZLrK_Ya1hWDiszLS_65YjT1UKrsUn9NZTzt6BPn5WvsAUL3MsmBSD9UB6eKl420q1faR_GrdzMBaNKXprAdXIzmyQbXTA4QIg4NQ&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/3d-modeling/free/</a></li>
<li>Android geliştirme: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fandroid-development%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT0smUz6PoVtqqYnkb8jFC0Pym9xJAdC-AwK371FZn-7OTGKtvwvSyYr7CBmau3KbTSGsK2SDJEsRNdE3TPZeCCSFCfWPPRj4ecfWt6iUSCH7VGiNbv7sLMZ-9_SV7LD5SGEjKibtQ&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/android-development/free/</a></li>
<li>Veri analizi: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fdata-analysis%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT35q1Go8OO0w6DCUrCOJYcss6kz7UhrnGFGkyOgx6KXW_rYZyhIhZ2fZIN3b8oKxQUZAbUXP6-UFHY8jfvaxgs3oQIQK8CBXmwe6SJjws9YwfZRj4834OjiZV7XYooSdrhtt2yCQg&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/data-analysis/free/</a></li>
<li>Çizim: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fdrawing%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT1BL0HG-VmzucjDHsI7fsNSMiwmYPoLWDimEY_qJnG0mRK1UQX-yJezOKJhbS0jwgukzPzT19E-Jyn7pjmnplINP2UQ31ifRoqjwHVrtTwTdDhlRS2jl-s6sx0oV2V_5KNA9FDGBg&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/drawing/free/</a></li>
<li>İletişim becerileri: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fcommunication-skills%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT09uf1ItVXD5BNbuvmhVHbtF0B44ZfTaeEb9BqHE3MifEYGp0WCJUMLw3xaJGbNv1xfTEozYCJpCdpkNbceXBkNiSH4j4jSO2-g7eUleMix0Krjjx3cSDyjrHVhWpCud_tRFxSQVQ&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/communication-skills/free/</a></li>
<li>İspanyolca: <a href="https://www.udemy.com/topic/spanish-language/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/spanish-language/free/</a></li>
<li>İngilizce: <a href="https://www.udemy.com/topic/english-language/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/english-language/free/</a></li>
<li>Fransızca: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Ffrench-language%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT09HdqSv3WGfxzzfSiIhWkgjMzc96lrEtmL3s2pR1hXh6mG_-fIgY7ikdAKud6fm197oxfU5S8xv9VdjUUEUKtNmjqeekYgzh4EJj2kCUD2tJPXTgAD6ee_H5fsBjHmXZfy11kaEw&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/french-language/free/</a></li>
<li>Arapça: <a href="https://www.udemy.com/topic/arabic-language/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/arabic-language/free/</a></li>
<li>Portekizce: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fportuguese-language%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT3oER32jTj3aH0CIV-u5mwD-Reu2cmTDWIZyg8Sr8VzyqNU1HtKrO3RmpwVbbDpJadXyblz0TwzmyYKDBScR9pjuwZXvoReiI7KTODGrkMf-fjIp3z8PRV_fpclqUDm8dj23LGLKw&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/portuguese-language/free/</a></li>
<li>Rusça: <a href="https://www.udemy.com/topic/russian-language/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/russian-language/free/</a></li>
<li>Japonca: <a href="https://www.udemy.com/topic/japanese-language/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/japanese-language/free/</a></li>
<li>Excel: <a href="https://www.udemy.com/topic/excel/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/excel/free/</a></li>
<li>Muhasebe: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Faccounting%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT14gUaXa8cG2QQK9Z6O1X8rMytUWUT-JWVjSl7bt2FL5ipz_PO0PpqM_JWMlkYsf_QmVkwHF7WL_dsN6M6-Atu2Zrd8fUEtiy6qxJWRf3tv_09vpmYp04Pz8MUJob_CB7imyMhP3A&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/accounting/free/</a></li>
<li>Salesforce: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fsalesforce%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT1dq8BTX0TXr2XHy0_T-xzAw0u3gou4w48N1NEyLk0tSU87KA5hS5KDVNPsjpJtnO_-JUjHNQpG0hynPr1fmk3IkOavaYMriu8SDRC1upbs7_RgSsyQUCtsCdktErF248Xm7hrcBg&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/salesforce/free/</a></li>
<li>Fotoğrafçılık: <a href="https://www.udemy.com/topic/photography/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/photography/free/</a></li>
<li>Logo tasarımı: <a href="https://www.udemy.com/topic/logo-design/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/logo-design/free/</a></li>
<li>SQL: <a href="https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.udemy.com%2Ftopic%2Fsql%2Ffree%2F%3Ffbclid%3DIwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q&h=AT0uy8pdE5C-LgGWgQLujah6oPo49sp2p2Goj-G0SQOepnwuWgkvCkTB3VspwxDaHQ6B4g3sTgU0gVDlHBXskVcUgEOcwYrukh5xuz3tnS5oZu9LgEdWidNYu2P3dvwADiUlCgRPBA&__tn__=-UK-R&c[0]=AT0NMReS-6bsVnqima6led_BeNTBEjPolzymhPue9m64Pr2-7Ela1nqTWOTL1jQxj6ZmMBtOuzPQgaBmvZKGeo4pSbWA8tuNxyfBU8Iju-dEUApQ5tlIZGrkAJDHIFTgTdDIKuir_dIN1oXQUE78d3MyzJXf6ccFzTcNMx4_NOtPs0Gl_hiYyH-1sfMPe2DjbRRJyTnwn8cUuIAhRIx8" rel="nofollow" target="_blank">https://www.udemy.com/topic/sql/free/</a></li>
<li>Kullanıcı deneyimi: <a href="https://www.udemy.com/topic/user-experience-design/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/user-experience-design/free/</a></li>
<li>Digital marketing: <a href="https://www.udemy.com/topic/digital-marketing/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/digital-marketing/free/</a></li>
<li>Sunum becerileri: <a href="https://www.udemy.com/topic/presentation-skills/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/presentation-skills/free/</a></li>
<li>Özel tablolar: <a href="https://www.udemy.com/topic/pivot-tables/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/pivot-tables/free/</a></li>
<li>Risk yönetimi: <a href="https://www.udemy.com/topic/risk-management/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/risk-management/free/</a></li>
<li>Yazarlık: <a href="https://www.udemy.com/topic/writing/free/?fbclid=IwAR1JSzMZW-mgqkmX5iX1x-YWDNM1odrbBxETy4c315JYjQJ7Mb7-o4d72_Q" rel="nofollow" target="_blank">https://www.udemy.com/topic/writing/free/</a></li>
</ul>
Kurtlu meyveler
2020-07-11T00:00:00+00:00
https://hasanunal.org/blog/kurtlu-meyveler
<p>Ne ilginç bi blog demi? bi geliştirici günlüğünde yemek ile ilgili bi yazı, alakaya maydonoz işte 😀</p>
<p>Eskiden yemek seçen birisi olarak artık kurtlu meyveleri bile yiyebiliyorum bunu bi hayat öğretisi olarak gördüğüm için blogumda yazıyorum. Dağda kaldığım günlerde yemeğin değerini o kadar iyi anlıyor ki insan şükretmeyi öğreniyorsun ona ihtiyacın var, ne olursa olsun tüketmen gerekiyor. Plansız gidilen bi faaliyette aç kalmak o burun çevirdiğimiz yiyecekleri bile özlememize neden oluyor. Dağcılık eğitiminde bi çikolata için nelerimi vermezdim ki 😀 Askerdeyken yemezsen aç kalırsın, yemedim aç yattım ertesi gün tabldotu sildim süpürdüm 😀 Yemekte meşhur izmir köfte 2.Komando tugayında yapanlar iyi bilir.</p>
<p>Şekli bozulmuş bi meyveye bakıyorum ve aklıma dağdaki günler geliyor onun yiyeceğim son şey olabileceği geliyor aklıma ve tüketiyorum bu hikayede anlatmak istediğim hayattan tat almak lazım ottan boktan sebepler ile can sıkmamak lazım nohut yemiyorsun diye pilavdan vaz geçmemek lazım nohutları ayıkla yoluna devam et…</p>
CSS3 ile görsel oranı koruyarak sığdırma
2019-08-30T00:00:00+00:00
https://hasanunal.org/blog/css3-ile-gorsel-orani-koruyarak-sigdirma
<p>css’de kullandığımız background-size ve background-position özelliklerine benzer bir yapıyı img ve video etiketleri içerisinde kullanabileceğimiz özellik.</p>
<p>Gelen görseli kutuya sığdırmak için kullanılabilecek en etkili ve pratik çözümdür.</p>
<h4 id="object-fit">object-fit</h4>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Yapısı : object-fit: [ deger ]
Aldığı Değerler : fill | contain | cover | none | scale-down
Başlangıç değeri: fill
Uygulanabilen elementler: yerine konabilir elementler
Kalıtsallık: Yok
</code></pre></div></div>
<p><strong>object-fit</strong> özelliği, bir öğenin içerik kutusunun yüksekliğine ve genişliğine nasıl tepki verdiğini tanımlar.</p>
<p><strong>object-position</strong> özelliği ile birlikte resimler, videolar vd. medya formatları için tasarlanmıştır. <strong>object-fi</strong>t içerik kutusuna nesneyi en/boy oranını koruyarak, mümkün olduğunca uzatarak veya mümkün olduğunca fazla yer kaplayacak şekilde yerleştirmeyi sağlar.</p>
<p>Aldığı değerler</p>
<ul>
<li><strong>fill</strong>: En/boy oranına bakılmaksızın görüntüyü içerik kutusuna uyacak şekilde uzatan varsayılan değerdir.</li>
<li><strong>contain</strong>: En/boy oranını korurken kutuya doldurmak için duruma göre resmin boyutunu artırır veya azaltır.</li>
<li><strong>cover</strong>: Resim, en/boy oranını koruyarak ancak işlem sırasında resmi kırparak kutunun yüksekliğini ve genişliğini dolduracaktır.</li>
<li><strong>scale-down</strong>: Resim, en küçük somut nesne boyutunu bulmak için none ve contains arasındaki farkı karşılaştıracaktır ve uygun olanı uygulayacaktır.</li>
<li><strong>none</strong>: Resim orijinal halindeki boyutlarını korur ve içerik kutusu içine sığmaya çalışmaz. İçerik kutusundan taşan kısımlar kırpılır.</li>
</ul>
<h4 id="object-position">object-position</h4>
<p>object-position özelliği bir objenin içerik kutusundaki yerini ayarlamamızı sağlar.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Yapısı : object-position: [ deger ]
Aldığı Değerler : left | center | right | top | bottom | uzunluk değerleri | yüzde değerleri
Başlangıç değeri: 50% 50%
Uygulanabilen elementler: yerine konabilir elementler
Kalıtsallık: Var
</code></pre></div></div>
<p>See the Pen <a href="https://codepen.io/fatihhayri/pen/POEBbo/">object-fit öncesi</a> by Fatih (<a href="https://codepen.io/fatihhayri">@fatihhayri</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<blockquote>
<p><a href="https://fatihhayrioglu.com/css-ile-resim-oranini-koruyarak-sigdirma/" rel="nofollow" target="_blank">fatihhayrioglu.com/css-ile-resim-oranini-koruyarak-sigdirma/</a></p>
<p>– Kaynak</p>
</blockquote>
OS X’te Komut Satırı Kullanılarak Raspberry Pi SD Karta Nasıl Klonlanır
2019-07-12T00:00:00+00:00
https://hasanunal.org/blog/os-xte-komut-satiri-kullanilarak-raspberry-pi-sd-karta-nasil-klonlanir
<h4 id="projenin-klonunu-direk-sd-karta-yazıp-kullanmak-için"><a href="https://github.com/hasanunal/homebridge-turkey#projenin-klonunu-direk-sd-karta-yaz%C4%B1p-kullanmak-i%C3%A7in"></a>Projenin klonunu direk SD karta yazıp kullanmak için:</h4>
<p>Komut Satırını (CLI) Kullanarak Geri Yükleme</p>
<p>1. Geri Yüklenecek SD Kartı Takın, Mac’inizdeki SD kart okuyucusuna boş bir SD kart yerleştirin.</p>
<p>2. Geri Yüklenecek SD Kartı Bulun Terminal’i açın ve SD Kartınızı bulun, numaranın daha önce kullanılmış olandan farklı olabileceğine dikkat edin:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>diskutil list
</code></pre></div></div>
<p>3. SD Kartını çıkarın Terminal’de aşağıdaki komutu girin:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>diskutil unmountDisk /dev/disk2
</code></pre></div></div>
<p>3. SD Kartını formatlayın SD Kartınızı tanımladığınızda, benim durumumda / dev / disk2 , FAT16 olarak biçimlendirmek için aşağıdaki komutu girin . Durumunuz için gerekli olanı değiştirin:</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>newfs_msdos <span class="nt">-F</span> 16 /dev/disk2
</code></pre></div></div>
<p>SD Kartı Terminalden Biçimlendirme Adım 4. Klonlanmış Disk Görüntüsünden Geri Yükleme Daha önce klonladığınız dmg disk görüntüsünü bulun. Örneğim, dmg’nin Masaüstünde olduğunu varsayar. Terminal’de, benim örneğimde / dev / disk2 olan doğru hedef diski tanımladığınızdan emin olmak için aşağıdaki komutu girin .</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>~/Desktop/raspberrypi.dmg <span class="nv">of</span><span class="o">=</span>/dev/disk2
</code></pre></div></div>
<blockquote>
<p>İpucu: Disk görüntüsünün SD Karta geri yüklenmesinin biraz zaman alabileceğini unutmayın. Muhtemelen düşündüğünden çok daha uzun. Mac mini Core i5’im 8GB SDXC kartına geri yüklemek için 3 saat 27 dakika sürdü.</p>
</blockquote>
Homebridge güncelleme
2019-07-10T00:00:00+00:00
https://hasanunal.org/blog/homebridge-guncelleme
<p><strong>Güncelleme ve yükseltme yapma:</strong></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt-get update
<span class="nb">sudo </span>apt-get upgrade
</code></pre></div></div>
<p><strong>Sürüm aşağıda gösterildiği (veya üstü) gibi olmalıdır:</strong></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>g++-4.9 <span class="nt">-v</span>
...
gcc version 4.9.2 <span class="o">(</span>Raspbian 4.9.2-10<span class="o">)</span>
</code></pre></div></div>
<p><strong>Başka bir dağıtım veya derleyici sürümünüz varsa, güncellemeniz gerekir:</strong></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>apt-get <span class="nb">install </span>g++
</code></pre></div></div>
<p><strong>#NodeJS’yi yükleyin</strong></p>
<ul>
<li>4.0.0 sürümünden başlayarak, NodeJS varsayılan olarak ARM platformunu desteklemeye başladı.</li>
<li>Eğer yoksa <a href="http://raspberry%20pi/">Raspberry pi’nin tüm sürümleri için NodeJS</a></li>
</ul>
<blockquote>
<p>homebridge’in Nodejs sürüm 5.10 ile çalışmaya başladığını göz önünde bulundurursak nodeJS zaten kurulu geliyor ama gene de güncellemekte fayda var.</p>
</blockquote>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-sL</span> https://deb.nodesource.com/setup_6.x | <span class="nb">sudo</span> <span class="nt">-E</span> bash -
<span class="nb">sudo </span>apt-get <span class="nb">install</span> <span class="nt">-y</span> nodejs
</code></pre></div></div>
<p><strong>Sürümü kontrol et</strong></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nodejs <span class="nt">-v</span>
</code></pre></div></div>
<p>v6.9.5 veya üstü gözükmesi gerekiyor.</p>
<h4 id="sıfırdan-homebridgei-yükleyin">Sıfırdan Homebridge’i yükleyin</h4>
<p><a href="https://github.com/hasanunal/homebridge-turkey#s%C4%B1f%C4%B1rdan-yapmak-i%C3%A7in-homebridgei-y%C3%BCkleyin" rel="nofollow" target="_blank">Github - homebridge-turkey</a></p>
<blockquote>
<p>Bununla ilgili kaynağı orjinal adresinden bulabilirsiniz. <a href="https://github.com/nfarina/homebridge" rel="nofollow" target="_blank">HomeBridge</a></p>
</blockquote>
Siri Ses Kontrollü Priz – Homebridge
2019-07-06T00:00:00+00:00
https://hasanunal.org/blog/siri-ses-kontrollu-priz-homebridge
<p><strong>Homebridge ile priz kontrolü</strong></p>
<blockquote>
<p>Dipnot: Bunu yapmak için, iPhone’un Bluetooth özelliği etkin olmalı ve her iki cihazın da aynı WiFi ağında olması gerekir.</p>
</blockquote>
<p><a href="https://github.com/hasanunal/homebridge-turkey/tree/master/priz-kontrol#cmdswitch2-kurulumu"></a><strong>cmdswitch2 kurulumu</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>npm <span class="nb">install</span> <span class="nt">-g</span> homebridge-cmdswitch2
</code></pre></div></div>
<p><a href="https://github.com/hasanunal/homebridge-turkey/tree/master/priz-kontrol#homebridge-cmd_light_control"></a><em><strong>homebridge-cmd_light_control</strong></em></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>npm <span class="nb">install</span> <span class="nt">-g</span> homebridge-cmd_light_control
</code></pre></div></div>
<blockquote>
<p>Şimdi homebridge yapılandırma dosyasını ayarlamamız ve mevcut cihazlarınızı buna eklememiz gerekiyor.</p>
</blockquote>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span>
<span class="s">"bridge"</span><span class="p">:</span> <span class="p">{</span>
<span class="s">"name"</span><span class="p">:</span> <span class="s">"HasanUNAL - SmartHome"</span><span class="p">,</span>
<span class="s">"username"</span><span class="p">:</span> <span class="s">"- - -"</span><span class="p">,</span>
<span class="s">"port"</span><span class="p">:</span> <span class="o">-</span> <span class="o">-</span> <span class="o">-</span><span class="p">,</span>
<span class="s">"pin"</span><span class="p">:</span> <span class="s">"- - -"</span>
<span class="p">},</span>
</code></pre></div></div>
<p>Altına ekleyin:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="s">"accessories"</span><span class="p">:</span> <span class="p">[{</span>
<span class="s">"accessory"</span><span class="p">:</span> <span class="s">"CMD"</span><span class="p">,</span>
<span class="s">"service"</span><span class="p">:</span> <span class="s">"Light"</span><span class="p">,</span>
<span class="s">"brightnessHandling"</span><span class="p">:</span> <span class="s">"no"</span><span class="p">,</span>
<span class="s">"name"</span><span class="p">:</span> <span class="s">"Lamba"</span><span class="p">,</span>
<span class="s">"on_cmd"</span><span class="p">:</span> <span class="s">"/home/pi/lamba_ac.py"</span><span class="p">,</span>
<span class="s">"off_cmd"</span><span class="p">:</span> <span class="s">"/home/pi/lamba_kapat.py"</span><span class="p">,</span>
<span class="s">"get_status_cmd"</span><span class="p">:</span> <span class="s">"/home/pi/lamba_durum.py"</span>
<span class="p">}],</span>
<span class="s">"platforms"</span><span class="p">:</span> <span class="p">[{</span>
<span class="s">"platform"</span><span class="p">:</span> <span class="s">"cmdSwitch2"</span><span class="p">,</span>
<span class="s">"switches"</span><span class="p">:</span> <span class="p">[{</span>
<span class="s">"name"</span> <span class="p">:</span> <span class="s">"TV Priz"</span><span class="p">,</span>
<span class="s">"on_cmd"</span><span class="p">:</span> <span class="s">"/home/pi/priz_ac.py"</span><span class="p">,</span>
<span class="s">"off_cmd"</span><span class="p">:</span> <span class="s">"/home/pi/priz_kapat.py"</span><span class="p">,</span>
<span class="s">"state_cmd"</span><span class="p">:</span> <span class="s">"/home/pi/priz_durum.py"</span>
<span class="s">"manufacturer"</span><span class="p">:</span> <span class="s">"serial (gereksiz, boş bırakılabilir)"</span><span class="p">,</span>
<span class="s">"model"</span><span class="p">:</span> <span class="s">"serial (gereksiz, boş bırakılabilir)"</span><span class="p">,</span>
<span class="s">"serial"</span><span class="p">:</span> <span class="s">"serial (gereksiz, boş bırakılabilir)"</span>
<span class="p">}]</span>
<span class="p">}]</span>
</code></pre></div></div>
<p><a href="https://github.com/hasanunal/homebridge-turkey/tree/master/priz-kontrol#lamba-kontrol%C3%BC-python-dosyas%C4%B1"></a><strong>Lamba kontrolü (<em>python dosyası</em>)</strong></p>
<blockquote>
<p>220W ile çalıştığınızı unutmayın, elektrik bilginiz yoksa bu işe hiç kalkışmamanızı tavsiye ederim.</p>
</blockquote>
<blockquote>
<p><code class="language-plaintext highlighter-rouge">priz_ac.py</code> dosyasını oluşturalım:</p>
<blockquote>
<p>Not: Burada GPIO pinlerini kullanıyoruz, tetik veriyoruz. </p>
</blockquote>
</blockquote>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">#!/usr/bin/env python
</span> <span class="kn">import</span> <span class="nn">RPi.GPIO</span> <span class="k">as</span> <span class="n">GPIO</span>
<span class="n">gpio_pin_number</span><span class="o">=</span><span class="mi">20</span>
<span class="n">GPIO</span><span class="p">.</span><span class="n">setmode</span><span class="p">(</span><span class="n">GPIO</span><span class="p">.</span><span class="n">BCM</span><span class="p">)</span> <span class="c1"># BCM pin numarasi
</span> <span class="n">GPIO</span><span class="p">.</span><span class="n">setwarnings</span><span class="p">(</span><span class="bp">False</span><span class="p">)</span>
<span class="n">GPIO</span><span class="p">.</span><span class="n">setup</span><span class="p">(</span><span class="n">gpio_pin_number</span><span class="p">,</span> <span class="n">GPIO</span><span class="p">.</span><span class="n">OUT</span><span class="p">)</span>
<span class="n">GPIO</span><span class="p">.</span><span class="n">output</span><span class="p">(</span><span class="n">gpio_pin_number</span><span class="p">,</span> <span class="n">GPIO</span><span class="p">.</span><span class="n">HIGH</span><span class="p">)</span>
</code></pre></div></div>
<blockquote>
<p><code class="language-plaintext highlighter-rouge">priz_kapat.py</code> dosyasını oluşturalım:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">#!/usr/bin/env python
</span> <span class="kn">import</span> <span class="nn">RPi.GPIO</span> <span class="k">as</span> <span class="n">GPIO</span>
<span class="n">gpio_pin_number</span><span class="o">=</span><span class="mi">20</span>
<span class="n">GPIO</span><span class="p">.</span><span class="n">setmode</span><span class="p">(</span><span class="n">GPIO</span><span class="p">.</span><span class="n">BCM</span><span class="p">)</span> <span class="c1"># BCM pin numarasi
</span> <span class="n">GPIO</span><span class="p">.</span><span class="n">setwarnings</span><span class="p">(</span><span class="bp">False</span><span class="p">)</span>
<span class="n">GPIO</span><span class="p">.</span><span class="n">setup</span><span class="p">(</span><span class="n">gpio_pin_number</span><span class="p">,</span> <span class="n">GPIO</span><span class="p">.</span><span class="n">OUT</span><span class="p">)</span>
<span class="n">GPIO</span><span class="p">.</span><span class="n">output</span><span class="p">(</span><span class="n">gpio_pin_number</span><span class="p">,</span> <span class="n">GPIO</span><span class="p">.</span><span class="n">LOW</span><span class="p">)</span>
</code></pre></div> </div>
</blockquote>
<blockquote>
<p><code class="language-plaintext highlighter-rouge">priz_durum.py</code> dosyasını oluşturalım:
```python
#!/usr/bin/env python
# -<em>- coding: utf-8 -</em>-
import subprocess
from subprocess import Popen, PIPE</p>
</blockquote>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pin_number=20
proc = Popen(
"echo %s > /sys/class/gpio/export" % pin_number,
shell=True,
stdout=PIPE, stderr=PIPE
)
proc.wait()
proc = Popen(
"cat /sys/class/gpio/gpio%s/value" % pin_number,
shell=True,
stdout=PIPE, stderr=PIPE
)
proc.wait()
res = proc.communicate() # get tuple('stdout', 'stderr')
count = res[0].replace("\n","")
count = int(count)
if count == 0:
id=0
else:
print('1').replace("\n","") ```
</code></pre></div></div>
<blockquote>
<p>Burada da tetikten sonraki durumunu görmemizi sağlıyoruz. Prizin son durumunu.</p>
</blockquote>
<p>Bir lamba için, kodlar tamamen benzerdir, sadece lamba rölesinin sinyal kablosunu bağladığınız pimi değiştirin. Tüm komut dosyalarını çalıştırılabilir hale getiririz, gerekirse, komut dosyalarının doğru şekilde çalıştırılması için Python kitaplıklarını koyarız.</p>
<p><a href="https://github.com/hasanunal/homebridge-turkey/tree/master/priz-kontrol#yeniden-ba%C5%9Flatmak-i%C3%A7in"></a><strong>Yeniden başlatmak için</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>service homebridge restart
</code></pre></div></div>
<blockquote>
<p>İPhone’a giriyoruz, uygulama evinde – 2 yeni cihaz görünmeli. Harika! Röleler kontrollü bir priz (anahtar) ve bir lambanız var artık.</p>
</blockquote>
<h4 id="sesli-komut-ile-açmak-için">Sesli komut ile açmak için</h4>
<p><a href="https://github.com/hasanunal/homebridge-turkey/tree/master/priz-kontrol#sesli-komut-ile-a%C3%A7mak-i%C3%A7in" rel="nofollow" target="_blank">Github - #Sesli komut ile açmak için</a></p>
<blockquote>
<p>Hey siri, TV Priz aç!
Hey siri, lambaları yak!</p>
</blockquote>
Script etiketindeki defer ve async özellikleri
2019-03-22T00:00:00+00:00
https://hasanunal.org/blog/script-etiketindeki-defer-ve-async-ozellikleri
<p>Bir <strong><script></strong> etiketindeki <code class="language-plaintext highlighter-rouge">**_defer_**</code> ve <code class="language-plaintext highlighter-rouge">**_async_**</code> özellikleri nelerdir?</p>
<p>Her iki öz nitelik yoksa, komut dosyası eşzamanlı olarak indirilir ve yürütülür. Yürütmeyi bitirinceye kadar belgenin ayrıştırılması durduracaktır (varsayılan davranış). Komut dosyaları, karşılaşıldıkları sırada indirilir ve yürütülür.</p>
<p><strong>defer</strong> öz niteliği, belge hala ayrıştırılırken komut dosyasını indirir, ancak <strong>DOMContentLoaded</strong> <em><a href="/dom-nedir/">(DOM Nedir?)</a></em> olay dinleyicisi içinde yürütmeye eşdeğer, yürütmeden önce belgenin ayrıştırılmasının tamamlanmasını bekler. erteleme komut dosyaları sırayla yürütülür.</p>
<p>olay dinleyicisi içinde yürütmeye eşdeğer, yürütmeden önce belgenin ayrıştırılmasının tamamlanmasını bekler. erteleme komut dosyaları sırayla yürütülür.</p>
<hr />
<p><strong>Async</strong> niteliği, belgeyi ayrıştırırken komut dosyasını indirir ancak ayrıştırmayı tamamlamadan önce komut dosyasını yürütmek için ayrıştırıcıyı duraklatır. Zaman uyumsuz komut dosyaları sırayla çalıştırılmaz.</p>
<p>Not: Her iki öz nitelik yalnızca, komut dosyasında bir src öz niteliği varsa (<em>yani satır içi bir komut dosyası değil</em>) kullanılmalıdır.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><script </span><span class="na">src=</span><span class="s">"myscript.js"</span><span class="nt">></script></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"myscript.js"</span> <span class="na">defer</span><span class="nt">></script></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"myscript.js"</span> <span class="na">async</span><span class="nt">></script></span>
</code></pre></div></div>
<hr />
<p><em>Notlar:</em></p>
<p>Bir <strong>defer</strong> betiğini <head> içine yerleştirmek, tarayıcının betiği sayfa ayrıştırma sırasında indirmesine izin verir ve bu nedenle betiği gövdenin sonundan önce yerleştirmekten daha iyi bir seçenektir.</p>
<p>Senaryolar birbirlerine güveniyorsa, erteleme kullanın.</p>
<ul>
<li>Bir <strong>defer</strong> betiğini <head> içine yerleştirmek, tarayıcının betiği sayfa ayrıştırma sırasında indirmesine izin verir ve bu nedenle betiği gövdenin sonundan önce yerleştirmekten daha iyi bir seçenektir.</li>
<li>Senaryolar birbirlerine güveniyorsa, erteleme kullanın. (<strong>defer</strong>)</li>
<li>Komut dosyası bağımsızsa, zaman uyumsuz kullanın. (<strong>async</strong>)</li>
<li><strong>DOM</strong> hazır olmalı ve içerikler <strong>DOMContentLoaded</strong> dinleyicisine yerleştirilmemişse ertelemeyi kullanın.</li>
</ul>
<p><em><a href="https://hasanunal.org/blog/dom-nedir/">DOM Nedir?</a></em></p>
HTML5 semantik öğelerinin doğru kullanımını (Temel)
2019-03-21T00:00:00+00:00
https://hasanunal.org/blog/html5-semantik-ogelerinin-dogru-kullanimini-temel
<h4 id="headerarticlesectionfooter"><code class="language-plaintext highlighter-rouge"><header></code>, <code class="language-plaintext highlighter-rouge"><article></code>,<code class="language-plaintext highlighter-rouge"><section></code>, <code class="language-plaintext highlighter-rouge"><footer></code></h4>
<hr />
<p><strong><header></strong></p>
<p>Sayfanın bir bölümü hakkında tanıtım ve gezinme bilgilerini içermek için kullanılır. Bu, bölüm başlığı, yazarın adı, yayın tarihi ve saati, içindekiler tablosu veya diğer seyir bilgilerini içerebilir.</p>
<p><strong><a href="/birden-fazla-ve-ogesi-kullanilabilir-mi/">Birden fazla kullanılabilir mi?</a></strong></p>
<hr />
<p><strong><</strong>article<strong>></strong></p>
<p>Anlamını yitirmeden sayfa dışına mantıksal olarak bağımsız bir şekilde yeniden oluşturulabilir bağımsız bir kompozisyon barındırmak içindir. Bireysel blog gönderileri veya haber hikayeleri güzel örneklerdir.</p>
<hr />
<p><strong><</strong>section<strong>></strong></p>
<p>Ortak bir bilgi temasını veya amacını paylaşan içeriği tutmak için kullanılan esnek bir kaptır.</p>
<hr />
<p><strong><</strong>footer<strong>></strong></p>
<p>bir içerik bölümünün sonunda görünmesi gereken ve bölüm hakkında ek bilgi içermesi gereken bilgileri tutmak için kullanılır. Yazarın adı, telif hakkı bilgisi ve ilgili bağlantılar, bu tür içeriğin tipik örnekleridir.</p>
<p><strong><a href="/birden-fazla-ve-ogesi-kullanilabilir-mi/">Birden fazla kullanılabilir mi?</a></strong></p>
<p><em>Diğer anlamsal öğeler, eskiden de kullanılan <form> ve <table> şeklindedir.</em></p>
Önbellek bozma – Versiyon kullanımı
2019-03-19T00:00:00+00:00
https://hasanunal.org/blog/onbellek-bozma-versiyon-kullanimi
<h3 id="önbellek-bozmanın-amacı-nedir-ve-bunu-nasıl-başarabilirsiniz">Önbellek bozmanın amacı nedir ve bunu nasıl başarabilirsiniz?</h3>
<p>Tarayıcıların dosyaları web sitelerinde geçici olarak depolamak için önbellekleri olduğundan, sayfalar arasında geçiş yaparken veya aynı sayfayı yeniden yüklerken tekrar indirilmeleri gerekmez. Sunucu, tarayıcıya dosyayı belirli bir süre boyunca saklamasını söyleyen başlıkları göndermek üzere ayarlanmıştır. Bu, web sitesi hızını büyük ölçüde artırır ve bant genişliğini korur.</p>
<p>Ancak, web sitesi geliştiriciler tarafından değiştirildiğinde, kullanıcının önbelleği hala eski dosyaları çağırdığı için sorunlara neden olabilir. Önbelleğe alınmış CSS ve JavaScript dosyaları artık var olmayan, taşınmış veya yeniden adlandırılmış öğelerden biriyse, bu özellik onları eski işlevlere sahip bırakabilir veya bir web sitesini bozabilir.</p>
<p>Önbellek bozma, tarayıcıyı yeni dosyaları indirmeye zorlama işlemidir. Bu, dosyayı eski dosyaya göre farklı bir adlandırarak yapılır.</p>
<p>Tarayıcıyı dosyayı yeniden indirmeye zorlayan bir teknik, dosyanın sonuna bir sorgu dizesi eklemektir.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><script </span><span class="na">type=</span><span class="s">'text/javascript'</span> <span class="na">src=</span><span class="s">'script.js?v=1.0.1'</span><span class="nt">></script></span>
</code></pre></div></div>
<p>Tarayıcı farklı bir dosya olarak kabul eder, böylece dosya adı, yolu değiştirmeye girilen tarayıcıda önbellek temizlemeye ihtiyaç duyulmaz.</p>
DOM Nedir?
2019-03-19T00:00:00+00:00
https://hasanunal.org/blog/dom-nedir
<p>DOM (Belge Nesne Modeli), HTML ve XML belgelerini düğümlerden oluşan bir ağaç yapısı olarak gören çapraz platformlu bir API’dir. Bu düğümler (öğeler ve metin düğümleri gibi) programatik olarak değiştirilebilen nesnelerdir ve bunlara yapılan herhangi bir görünür değişiklik belgeye canlı olarak yansıtılır. Bir tarayıcıda, bu API, JavaScript düğümlerinde DOM düğümlerinin stillerini, içeriklerini, belgedeki yerleşimini değiştirmek veya olay dinleyicileriyle etkileşime girmek için manipüle edilebildiği yerlerde kullanılabilir.</p>
<hr />
<p><em>Notlar:</em></p>
<ul>
<li><strong>DOM</strong>, herhangi bir programlama dilden bağımsız olacak şekilde tasarlandı ve belgenin yapısal gösterimini tek ve tutarlı bir <strong>API</strong>‘den kullanılabilir hale getirdi.</li>
<li>DOM, tarayıcıda sayfa yüklenirken aşamalı olarak oluşturulur; bu nedenle komut dosyaları genellikle sayfanın altına, <a href="/blog/script-etiketindeki-defer-ve-async-ozellikleri/">erteleme (defer) özelliği</a> olan <strong><head></strong> bölümüne veya <strong>DOMContentLoaded</strong> olay dinleyicisinin içine yerleştirilir. <strong>DOM</strong> düğümlerini değiştiren komut dosyaları, hataları önlemek için <strong>DOM</strong> oluşturulduktan sonra çalıştırılmalıdır.</li>
<li><strong><em>document.getElementById()</em></strong> ve <strong><em>document.querySelector()</em></strong>, DOM düğümlerini seçmek için kullanılan ortak işlevlerdir.</li>
</ul>
Birden fazla header ve footer ögesi kullanılabilir mi?
2019-03-19T00:00:00+00:00
https://hasanunal.org/blog/birden-fazla-ve-ogesi-kullanilabilir-mi
<blockquote>
<p>Bir web sayfası birden çok <code><header></code> öğesi içerebilir mi? <code><footer></code> Peki ya elemanlar?</p>
</blockquote>
<p>Çok tartışılan bu sorunun cevabı EVET! 🙂</p>
<p>W3 belgeleri, etiketlerin en yakın atalarının “bölüm” başlıklarının (<header>) ve alt bilgi (<footer>) alanlarını temsil ettiğini belirtir.</p>
<p>Öyleyse sadece <body> sayfası bir üst bilgi ve alt bilgi içermekle kalmaz, her <article> ve <section> öğesini de içerebilir.</p>
Toggle Night Mode JS – JavaScript karanlık mod
2019-03-06T00:00:00+00:00
https://hasanunal.org/blog/toggle-night-mode-js-javascript-gece-modu
<p>Merhaba, bir projede ihtiyaç duyup yaptığım, gece modunu temaya eklemeyi anlatmak istiyorum.</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><input</span> <span class="na">type=</span><span class="s">"checkbox"</span> <span class="na">class=</span><span class="s">"geceModu"</span><span class="nt">></span>
</code></pre></div></div>
<p>Checkbox input’a class veriyoruz. Gece modu açık mı kapalı mı işlemini kontrol edecek input.</p>
<p>jQuery dahil etmeyi unutmayın. <strong>jQuery 3.x</strong></p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><script </span><span class="na">src=</span><span class="s">"https://code.jquery.com/jquery-3.3.1.min.js"</span> <span class="na">integrity=</span><span class="s">"sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="</span> <span class="na">crossorigin=</span><span class="s">"anonymous"</span><span class="nt">></script></span>
</code></pre></div></div>
<p>Logonun iki versiyonu olduğunu varsayalım, beyaz ve siyah versiyonu.<br />
Fonksiyon ile kontrol ettirip hangi logonun gözükeceğini belirleyelim.</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
<span class="nx">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.geceModu</span><span class="dl">"</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">(){</span>
<span class="kd">var</span> <span class="nx">siyah</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">resim yolu/logo.png</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">beyaz</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">resim yolu/logo-beyaz.png</span><span class="dl">'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">.logo</span><span class="dl">'</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="dl">'</span><span class="s1">src</span><span class="dl">'</span><span class="p">)</span> <span class="o">===</span> <span class="nx">beyaz</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">.logo</span><span class="dl">'</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="dl">'</span><span class="s1">src</span><span class="dl">'</span><span class="p">,</span> <span class="nx">siyah</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nx">$</span><span class="p">(</span><span class="dl">'</span><span class="s1">.logo</span><span class="dl">'</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="dl">'</span><span class="s1">src</span><span class="dl">'</span><span class="p">,</span> <span class="nx">beyaz</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">});</span>
</code></pre></div></div>
<p>Şimdi bazı divlere örnekler ile eklemeler yaptıralım. Bunun için <strong>jQuery</strong>‘nin <strong>toggleClass</strong> özelliğini kullanıyoruz.</p>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">body,nav,.logo,.urun</span><span class="dl">"</span><span class="p">).</span><span class="nx">toggleClass</span><span class="p">(</span><span class="dl">"</span><span class="s2">night</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>
<p>Yukarıda;<br />
<em>body, navbar (nav), .logo (class) .urun (class)</em><br />
Bu belirlediklerimizin class’ına night değerini atadık. yani</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ÖNCESİ : <span class="nt"><div</span> <span class="na">class=</span><span class="s">"urun"</span><span class="nt">></span>...<span class="nt"></div></span>
SONRASI : <span class="nt"><div</span> <span class="na">class=</span><span class="s">"urun night"</span><span class="nt">></span>...<span class="nt"></div></span>
</code></pre></div></div>
<p>Şimdi .<em>urun</em> ve .<em>night</em> için <strong>css</strong> yazalım.</p>
<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">.urun</span> <span class="p">{</span>
<span class="nl">background</span><span class="p">:</span><span class="m">#fff</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span><span class="m">#000</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.night</span> <span class="p">{</span>
<span class="nl">background</span><span class="p">:</span><span class="m">#000</span> <span class="cp">!important</span><span class="p">;</span>
<span class="nl">color</span><span class="p">:</span><span class="m">#fff</span> <span class="cp">!important</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Burada olay <em>!important</em><br />
Important kullanarak önceki seçicinin özelliğini yok saymış oluyoruz.</p>
<p><a href="https://fatihhayrioglu.com/important-tanimi/"><em>css important nedir?</em></a></p>
<p>Örnekle yazıyı sonlandırmak istiyorum umarım faydalı olmuştur.</p>
<p>See the Pen <a href="https://codepen.io/hasanunal/pen/OqWNBy/">gece modu</a> by Hasan ÜNAL (<a href="https://codepen.io/hasanunal">@hasanunal</a>) on <a href="https://codepen.io">CodePen</a>.</p>
console.log(“Merhaba Dünya!”);
2019-02-09T00:00:00+00:00
https://hasanunal.org/blog/merhaba-2019
<p>En son 2014’de blog yazıldı bu siteye 🙂 Artık aktifleşme zamanı…</p>
<p>İşlerin yoğunluğundan kişisel sitem ile uğraşamamam bu yıl itibari ile beni rahatsız etmeye başladı, portföyün güncel olmayışı yıllar önce yazılmış bloglar kendi sayfamı bile arada bir ziyaret etmem bir front-end developer için ne derece doğru sorusunu ortaya attı 🙂</p>
<p>Tüm bahaneleri bir kenara bırakıp sistemi güncelledim. 2019 yılının ikinci ayında tekrardan blog yazmaya başlayacağımı duyurmak istiyorum. Bir sonraki blogda görüşmek dileği ile…</p>
Eğitim - Mersin Üniversitesi IEEE Topluluğu - Web Programlama Temelleri Eğitimi
2018-11-01T00:00:00+00:00
https://hasanunal.org/blog/ieee-meu-web-programlama-temelleri-egitimi
<p>Mezun olup dinleyen değil anlatan konumda olmaktan gerçekten garip bir hismiş :)</p>
<p><strong>Mersin Üniversitesi</strong> son sınıf öğrencilerine, <strong>IEEE</strong> topluluğu aracılığı ile <strong><em>(gönüllü)</em></strong> “<strong>Web Programlama Temelleri</strong>” eğitimi vermeyi hedefliyorum.</p>
<p>Women in Engineering Society kapsamında “Web Programlama Temelleri” ile sizler ile buluşuyoruz.
Proje daha önce kodlama yapmamış (öncelik) kadınlar ve erkekler için kendi web sitelerini tasarlamayı amaçlayan kurstan oluşuyor.</p>
<p>Kurs 05.11.2018 tarihinde başlayıp, her pazartesi günleri saat 17:20 - 18:20 arasında, Mühendislik Fakültesinde gerçekleşecektir.</p>
<div class="d-flex gap-1">
<div class="w-25">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2018-11-01-ieee-meu-web-programlama-temelleri-egitimi/ieee-meu-web-programlama-temelleri-afis.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2018-11-01-ieee-meu-web-programlama-temelleri-egitimi/ieee-meu-web-programlama-temelleri-afis.jpg" class="w-100 h-100 object-fit-cover" alt="Mersin Üniversitesi IEEE Topluluğu - Web Programlama Temelleri Eğitimi - Afiş" />
</a>
</div>
<div class="w-50">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2018-11-01-ieee-meu-web-programlama-temelleri-egitimi/ieee-meu-web-programlama-temelleri-egitim-1.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2018-11-01-ieee-meu-web-programlama-temelleri-egitimi/ieee-meu-web-programlama-temelleri-egitim-1.jpg" class="w-100 h-100 object-fit-cover" alt="Mersin Üniversitesi IEEE Topluluğu - Web Programlama Temelleri Eğitimi - Ders 1" />
</a>
</div>
<div class="w-50">
<a data-fancybox="post-gallery" data-src="/assets/img/blog/2018-11-01-ieee-meu-web-programlama-temelleri-egitimi/ieee-meu-web-programlama-temelleri-egitim-2.jpg" class="d-flex cursor-pointer h-100">
<img src="/assets/img/blog/2018-11-01-ieee-meu-web-programlama-temelleri-egitimi/ieee-meu-web-programlama-temelleri-egitim-2.jpg" class="w-100 h-100 object-fit-cover" alt="Mersin Üniversitesi IEEE Topluluğu - Web Programlama Temelleri Eğitimi - Ders 2" />
</a>
</div>
</div>
<p><small class="d-block text-center mb-1">[Mersin Üniversitesi IEEE Topluluğu - Web Programlama Temelleri Eğitimi - Ders]</small></p>
<p>Bana bu fırsatı tanıyan Mersin Üniversitesi IEEE Topluluğu’na teşekkür ederim.</p>
<blockquote>
<p>İlgili Bağlantılar</p>
<p><a href="https://www.instagram.com/p/BpoVMvaHahV/" rel="nofollow" target="_blank">İEEE Mersin - Afiş</a>
<a href="https://www.instagram.com/p/BpzpLrZn2tf/" rel="nofollow" target="_blank">İEEE Mersin - Ders</a></p>
</blockquote>