Yükleniyor...
Softmush.com, teknoloji, yazılım ve dijital dünyaya dair derinlemesine içeriklerle bilgiye ulaşmanın güvenilir adresi. - Softmush.com
“ Söz konusu olan vatansa, gerisi teferruat. ”
Mustafa K. Atatürk
@emin

Emin ALT.
Developer
 Biyografi: Elma veren ağacı taşlarlar.
PHP Dilinde İsim Alanları (Namespaces) Kullanımı

PHP'de isim alanları (namespaces), kod organizasyonunu ve çakışmaları önlemeyi sağlayan güçlü bir özelliktir. Büyük ölçekli uygulamalarda veya üçüncü taraf kütüphanelerle çalışırken, aynı isimde sınıfların, arayüzlerin, fonksiyonların veya sabitlerin tanımlanması olası bir sorundur. İsim alanları, bu tür isim çakışmalarını (name collision) engellemek ve kodun daha modüler, okunabilir ve yönetilebilir olmasını sağlamak için bir kapsülleme katmanı sunar.


Sözdizimi


Bir PHP dosyasında isim alanı tanımlamak için namespace anahtar kelimesi kullanılır.



Detaylı Açıklama


İsim alanı sözdiziminin temel bileşenleri şunlardır:


  • namespace anahtar kelimesi: Bir dosya için isim alanı bildirimini başlatır. Bu bildirim, dosyadaki tüm sınıflar, arayüzler, özellikler (traits), fonksiyonlar ve sabitler için geçerlidir.

  • Vendor\Project\Module: Bu kısım, tanımlanan isim alanının adını temsil eder. Genellikle ters eğik çizgi (\) ile ayrılmış hiyerarşik bir yapı kullanılır. PHP topluluğu arasında kabul gören PSR-4 autoloading standardı, genellikle isim alanı adlarının vendor (sağlayıcı), project (proje) ve module/sub-module (modül/alt modül) yapısını takip etmesini önerir.

  • İsim alanı bildirimi, dosyanın en üstünde, declare anahtar kelimesinden sonra ve PHP kodundan önce yapılmalıdır. Tek bir dosyada birden fazla isim alanı bildirimine izin verilmez.

  • Global isim alanı: Herhangi bir namespace bildirimi olmayan tüm kodlar global isim alanı içinde kabul edilir. Bir isim alanı içinde global isim alanındaki bir sınıfa veya fonksiyona erişmek için \ öneki kullanılır (örneğin, \DateTime).


Örnekler


Aşağıdaki örnekler, isim alanlarının farklı senaryolarda nasıl kullanıldığını göstermektedir.


Örnek 1: Temel İsim Alanı Tanımı ve Kullanımı


İki farklı isim alanında aynı isimde sınıfların nasıl tanımlandığını ve kullanıldığını gösterir.



Çıktı:


Veritabanı bağlantısı oluşturuldu (App\Database).
API bağlantısı oluşturuldu (App\Api).

Örnek 2: use Anahtar Kelimesi ile İsim Alanı İçe Aktarma


use anahtar kelimesi, tam nitelikli isimleri (FQN) kısaltmak ve kodu daha okunabilir hale getirmek için kullanılır.


log("Uygulama başlatıldı.");

$notifier = new EmailNotifier();
$notifier->notify("Yeni bir kullanıcı kaydoldu.");

$dbConn = new DbConnection(); // Takma ad ile kullanım

?>

Çıktı:


Dosyaya loglandı: Uygulama başlatıldı.
E-posta ile bildirildi: Yeni bir kullanıcı kaydoldu.
Veritabanı bağlantısı oluşturuldu (App\Database).

Örnek 3: İsim Alanı İçinde Global Fonksiyonlara Erişim


Bir isim alanı içinden global isim alanındaki bir fonksiyona veya sınıfa erişmek için \ öneki kullanılır.


format('Y-m-d H:i:s') . PHP_EOL;

// Helper sınıfı üzerinden fonksiyonu çağırma
echo "Rastgele Dize: " . Helper::generateRandomString(15) . PHP_EOL;

?>

Çıktı:


Şu anki zaman (global): 2023-10-27 10:30:00 (Örnek tarih ve saat)
Rastgele Dize: aBcD1eF2gH3iJ4k (Örnek çıktı)

Önemli Notlar


  • Tek Dosya, Tek İsim Alanı: Genel kabul gören pratik, her PHP dosyasında yalnızca bir isim alanı bildirimi yapmaktır. Bu, kodun okunabilirliğini ve otomatikle yükleme (autoloading) mekanizmalarının düzgün çalışmasını sağlar.

  • PSR-4 Standardı: PHP topluluğu tarafından önerilen PSR-4 autoloading standardı, isim alanlarının dosya sistemi yapısıyla eşleşmesini teşvik eder. Örneğin, App\Database\Connection isim alanındaki bir sınıf genellikle src/App/Database/Connection.php yolunda bulunur.

  • Global Fonksiyonlara Erişim: Bir isim alanı içinde global bir fonksiyona veya sınıfa (örneğin strlen() veya DateTime) erişmek için başına \ koyarak tam nitelikli yolunu belirtmek iyi bir pratiktir (örneğin \strlen()). Bu, isim alanınızda aynı isimde bir fonksiyon veya sınıf tanımlandığında oluşabilecek belirsizliği önler.

  • use Bildiriminin Kapsamı: use bildirimleri, sadece tanımlandıkları dosya içinde geçerlidir ve mevcut isim alanını etkilemez. Her dosya için ayrı ayrı use bildirimleri yapılmalıdır.

  • İsim Alanı Gruplama Kullanımı: PHP 7'den itibaren, aynı kök isim alanına sahip birden fazla sınıfı veya fonksiyonu tek bir use bildirimi ile içe aktarmak mümkündür (örneğin, use App\Module\{ClassA, ClassB, FunctionC};).

  • Sınıf Adı Çakışmaları: İki farklı kütüphaneden gelen aynı isimli sınıfları kullanmanız gerektiğinde, use anahtar kelimesi ile as takma adını kullanarak çakışmaları çözebilirsiniz (örneğin, use MyVendor\Utility\Logger as MyLogger;).

14
0
HTML Dilinde Açıklamaların (Comments) Etkin Kullanımı

HTML geliştirme sürecinde, kodun okunabilirliğini artırmak, gelecekteki değişiklikleri kolaylaştırmak ve takım çalışmasını desteklemek amacıyla açıklamalara ihtiyaç duyulur. HTML yorumları, tarayıcılar tarafından göz ardı edilen ve web sayfasında görüntülenmeyen metin blokları eklemenin standart yoludur. Bu kılavuz, HTML yorumlarının sözdizimini, kullanım alanlarını ve en iyi pratiklerini detaylı bir şekilde ele alacaktır.


Sözdizimi


HTML yorumları, karakter dizisiyle sona erer. Bu iki işaret arasında yer alan tüm içerik, tarayıcı tarafından yorumlanmaz ve sayfa üzerinde gösterilmez. Bu yapı, tek satırlık yorumlar veya birden çok satırı kapsayan yorumlar için kullanılabilir.




Yukarıdaki sözdiziminde:


  • (kapanış etiketi): Yorum bloğunun sonunu belirtir.


Pratik Kullanım Örnekleri


HTML yorumları, çeşitli senaryolarda kodun yönetimini ve anlaşılırlığını artırmak için kullanılabilir.


1. Kodun Amacını Açıklama: Bu, özellikle karmaşık veya belirli bir işlevi olan kod bloklarının ne yaptığını belgelemek için kullanılır. Büyük projelerde veya takım ortamında kodun ne işe yaradığını hızlıca anlamak için kritik öneme sahiptir.






Web Sitemize Hoş Geldiniz

Bu sayfa, HTML yorumlarının kullanımını göstermektedir.

2. Hata Ayıklama ve Geçici Kod Devre Dışı Bırakma: Bir kod bloğunun sayfa üzerindeki etkisini geçici olarak kaldırmak veya bir hatanın kaynağını izole etmek için kullanılabilir. Bu, belirli bir bölümü devre dışı bırakarak sayfanın diğer kısımlarını test etmeyi sağlar.

Bu paragraf görünür.

Bu paragraf da görünür.

3. Tarayıcıya Özel İçerik (Koşullu Yorumlar - Eski IE Sürümleri İçin): Bazı durumlarda, özellikle eski Internet Explorer sürümlerine özel koşullu yorumlar kullanılabilirdi. Bu, belirli bir tarayıcı sürümüne özel CSS veya JavaScript dosyalarını yüklemek için bir yöntemdi. Ancak modern web geliştirme pratiklerinde bu artık nadiren görülür ve genellikle tavsiye edilmez.


Önemli Notlar ve İpuçları


  • İç İçe Yorumlar: HTML yorumları iç içe kullanılamaz. Yani bir yorum bloğu içinde başka bir yorum bloğu açıp kapatmak beklenen davranışı göstermez ve genellikle hataya yol açar. Örneğin, --> yapısı geçersizdir.

  • Güvenlik: HTML yorumları tarayıcıda görünmese de, sayfanın kaynak kodunda bulunurlar ve herkes tarafından incelenebilirler. Bu nedenle, hassas bilgileri (API anahtarları, parolalar vb.) asla HTML yorumlarında saklamayın.

  • Dosya Boyutu: Aşırıya kaçan veya gereksiz yorumlar, HTML dosyasının boyutunu artırabilir. Genellikle, kodu yeterince açıklayıcı kılan ve gereksiz tekrarı önleyen dengeli bir yaklaşım benimsenmelidir.

  • Kod Temizliği: Üretim ortamına canlıya alınacak kodlarda, geliştirme aşamasındaki geçici yorumları temizlemek iyi bir pratik olabilir. Çoğu otomatik kod küçültme (minifier) aracı, dosya boyutunu azaltmak için yorumları kaldırır.

  • Tarayıcı Desteği: HTML yorum sözdizimi, tüm modern web tarayıcıları tarafından tam olarak desteklenir ve herhangi bir uyumluluk sorunu yaratmaz.

11
0
CSS Dilinde CSS Padding Kullanımı: Detaylı Rehber

Cascading Style Sheets (CSS) dilinde padding özelliği, bir elementin içeriği ile kenarlığı arasındaki iç boşluğu ayarlamak için kullanılır. Bu boşluk, elementin görsel alanını genişletir ancak içeriğin kendisini etkilemez. Web sayfalarının düzeninde ve elementler arası görsel hiyerarşide kritik bir role sahiptir. padding, CSS Kutu Modeli'nin (Box Model) önemli bir bileşenidir ve elementlerin tarayıcıda nasıl render edileceğini doğrudan etkiler.


Temel Sözdizimi


padding özelliği, bir elementin dört tarafındaki iç boşlukları (üst, sağ, alt, sol) tek tek veya toplu olarak tanımlamak için çeşitli sözdizimi biçimlerine sahiptir. En yaygın kullanımları aşağıdaki gibidir:



/* Tek tek özellikler */
padding-top: ;
padding-right: ;
padding-bottom: ;
padding-left: ;

/* Kısaltılmış (shorthand) özellik - 4 değer */
padding:    ;

/* Kısaltılmış (shorthand) özellik - 3 değer */
padding:   ;

/* Kısaltılmış (shorthand) özellik - 2 değer */
padding:  ;

/* Kısaltılmış (shorthand) özellik - 1 değer */
padding: ;

Detaylı Açıklama


padding özelliği için atanabilecek değerler, piksel (px), yüzde (%), em (em), rem (rem) gibi uzunluk birimleri veya auto gibi anahtar kelimeler olabilir. Negatif değerler padding için geçerli değildir.


  • Tek Tek Özellikler:


    padding-top, padding-right, padding-bottom ve padding-left özellikleri, elementin belirtilen tarafına doğrudan bir boşluk değeri atar. Bu yöntem, her taraf için farklı değerler gerektiğinde veya belirli bir tarafı hedeflemek istendiğinde kullanışlıdır.


  • Kısaltılmış (Shorthand) Özellik - Dört Değer:


    padding: üst sağ alt sol; şeklinde kullanılır. Değerler saat yönünde atanır: üst, sağ, alt ve sol. Bu, her bir tarafa farklı bir boşluk vermek için en yaygın ve okunabilir yöntemdir.


  • Kısaltılmış (Shorthand) Özellik - Üç Değer:


    padding: üst sağ-sol alt; şeklinde kullanılır. Birinci değer üst kenar için, ikinci değer hem sağ hem de sol kenarlar için, üçüncü değer ise alt kenar için geçerlidir.


  • Kısaltılmış (Shorthand) Özellik - İki Değer:


    padding: üst-alt sağ-sol; şeklinde kullanılır. Birinci değer hem üst hem de alt kenarlar için, ikinci değer ise hem sağ hem de sol kenarlar için geçerlidir.


  • Kısaltılmış (Shorthand) Özellik - Tek Değer:


    padding: tüm-taraflar; şeklinde kullanılır. Belirtilen tek değer, elementin dört kenarının (üst, sağ, alt, sol) tamamına uygulanır. Bu, tüm kenarlara eşit boşluk vermek istendiğinde en kısa yöntemdir.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, padding özelliğinin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.


Örnek 1: Tek Değer Kullanımı


Tüm kenarlara eşit 20 piksel iç boşluk uygulanması.



.kutucuk-1 {
    background-color: lightblue;
    border: 1px solid blue;
    padding: 20px; /* Tüm kenarlara 20px iç boşluk */
}

Örnek 2: İki Değer Kullanımı


Üst ve alt kenarlara 15 piksel, sağ ve sol kenarlara 30 piksel iç boşluk uygulanması.



.kutucuk-2 {
    background-color: lightgreen;
    border: 1px solid green;
    padding: 15px 30px; /* Üst/Alt: 15px, Sağ/Sol: 30px */
}

Örnek 3: Dört Değer Kullanımı


Üst kenara 10 piksel, sağa 20 piksel, alta 30 piksel ve sola 40 piksel iç boşluk uygulanması.



.kutucuk-3 {
    background-color: lightcoral;
    border: 1px solid red;
    padding: 10px 20px 30px 40px; /* Üst: 10px, Sağ: 20px, Alt: 30px, Sol: 40px */
}

Örnek 4: Yüzde Değer Kullanımı


Elementin genişliğine göre yüzde bazında iç boşluk uygulanması. Yüzde değerler her zaman elementin genişliğine göre hesaplanır, yüksekliğine göre değil.



.kutucuk-4 {
    width: 200px;
    height: 100px;
    background-color: lightgray;
    border: 1px solid black;
    padding: 10% 5%; /* Üst/Alt: genişliğin %10'u, Sağ/Sol: genişliğin %5'i */
}

İpuçları/Önemli Notlar


  • Box-sizing: border-box: Varsayılan olarak, padding bir elementin toplam genişliğine ve yüksekliğine eklenir. Bu durum, düzen hesaplamalarını karmaşıklaştırabilir. box-sizing: border-box; özelliğini kullanarak, padding ve border değerlerinin elementin belirtilen genişlik ve yüksekliğine dahil edilmesini sağlayabilirsiniz. Bu, daha öngörülebilir bir düzen oluşturmanıza yardımcı olur.


  • Negatif Değerler: padding özelliği için negatif değerler kullanılamaz. Negatif boşluklar yaratmak için margin özelliğini kullanmanız gerekir.


  • İçerik Genişliği: padding, elementin içeriği ile kenarlığı arasındaki mesafeyi artırdığı için, elementin görsel boyutunu genişletir. Ancak, içeriğin asıl genişliği (width değeri) değişmez, sadece etrafındaki boşluk artar.


  • Görsel Hiyerarşi: padding, metin veya diğer elementlerin kenarlara çok yakın durmasını engeller, böylece okunabilirliği ve genel kullanıcı deneyimini iyileştirir.


  • Kısaltılmış Kullanım Önceliği: Tek tek padding-top, padding-right vb. özellikleri tanımladıktan sonra, kısaltılmış padding özelliğini kullanırsanız, kısaltılmış özellik önceki tanımları geçersiz kılar. Bu nedenle, stil çakışmalarını önlemek için kullanım sırasına dikkat edin.


12
0
PHP Nedir? Kapsamlı Bir Rehber ve Popüler Web Dilinin Geleceği

İnternet dünyasının temel taşlarından biri olan PHP, web sitelerinin dinamik ve interaktif olmasını sağlayan güçlü bir programlama dilidir. Milyonlarca web sitesinin ve popüler web uygulamalarının arkasındaki teknoloji olan PHP, özellikle sunucu tarafı (server-side) web geliştirmede kendine sağlam bir yer edinmiştir. Peki, tam olarak PHP nedir? Nasıl çalışır ve neden bu kadar popülerdir? Bu kapsamlı rehberde, PHP'nin ne olduğunu, tarihçesini, temel özelliklerini, kullanım alanlarını, avantajlarını ve geleceğini detaylı bir şekilde inceleyeceğiz. Web geliştirme dünyasına adım atmak isteyenler veya mevcut bilgilerini pekiştirmek isteyenler için bu makale, PHP'nin derinliklerine inen bir yolculuk sunacak.



PHP Nedir? Temel Tanımlar ve Amaç


PHP, açılımı "Hypertext Preprocessor" olan, geniş ölçüde kullanılan, açık kaynaklı bir sunucu taraflı komut dosyası dilidir. Aslen "Personal Home Page" olarak başlayan bu isim, zamanla dilin yetenekleri genişledikçe değiştirilmiştir. PHP, özellikle web geliştirmeye odaklanmıştır ve HTML içine gömülebilir. Yani, bir HTML belgesi içerisinde PHP kodları yazabilir ve bu kodların sunucu tarafından işlenerek dinamik içerik üretmesini sağlayabilirsiniz.

PHP'nin temel amacı, statik HTML sayfalarının aksine, her kullanıcı isteğinde veya belirli koşullara göre değişebilen dinamik web sayfaları oluşturmaktır. Örneğin, bir kullanıcının oturum açtığında farklı bir içerik görmesi, bir e-ticaret sitesinde ürün listelerinin veritabanından çekilmesi veya bir blog sitesinde yorumların anında yayınlanması gibi işlevler, PHP gibi sunucu taraflı diller sayesinde mümkün olur. Bu dinamizm, web sitelerini daha etkileşimli, kişiselleştirilmiş ve güncel hale getirir.

PHP, sunucu üzerinde çalışır ve bir web tarayıcısı tarafından istenen bir PHP dosyasını işler. Sunucu, PHP kodunu çalıştırır, sonuçları (genellikle HTML olarak) oluşturur ve bu çıktıyı tarayıcıya gönderir. Tarayıcıya ulaşan tek şey, nihai HTML çıktısıdır; orijinal PHP kodu asla istemci tarafına gönderilmez. Bu, hem güvenlik hem de performans açısından önemli bir avantajdır.



PHP'nin Tarihçesi ve Evrimi


PHP'nin hikayesi, 1994 yılında Rasmus Lerdorf adında bir geliştiricinin kendi kişisel ana sayfasını yönetmek için bir dizi C dilinde CGI (Common Gateway Interface) ikilisi yazmasıyla başladı. Bu araçlar, form verilerini işlemek ve MySQL veritabanlarıyla etkileşim kurmak gibi basit görevleri yerine getiriyordu. Lerdorf, bu araçları "Personal Home Page/Forms Interpreter" (PHP/FI) olarak adlandırdı ve 1995 yılında kaynak kodunu halka açık hale getirdi.

PHP/FI'nin popülaritesi hızla arttı ve diğer geliştiriciler de kendi web sitelerinde kullanmaya başladı. Geri bildirimler ve katkılarla dil gelişmeye devam etti. 1997 yılında, Andi Gutmans ve Zeev Suraski adında iki geliştirici, PHP/FI'nin çekirdeğini yeniden yazmaya karar verdi. Bu yeniden yazım, performans ve modülerlik açısından önemli iyileştirmeler getirdi ve "Zend Engine" adını aldı. 1998'de, bu yeni sürüm PHP 3.0 olarak piyasaya sürüldü ve dilin adını "PHP: Hypertext Preprocessor" olarak değiştirdi.

PHP 4.0, 2000 yılında piyasaya sürüldü ve daha da geliştirilmiş bir Zend Engine (Zend Engine 1.0) ile birlikte geldi. Bu sürüm, oturum desteği, çıktı tamponlama ve daha iyi web sunucusu entegrasyonu gibi önemli özellikler ekledi. PHP 4, dilin küresel çapta benimsenmesinde kritik bir rol oynadı.

2004 yılında, PHP 5.0, tamamen yeniden tasarlanmış bir Zend Engine (Zend Engine 2.0) ile birlikte çıktı. Bu sürüm, özellikle nesne yönelimli programlama (OOP) desteğini önemli ölçüde geliştirdi, XML ve veritabanı entegrasyonunu iyileştirdi ve birçok yeni özellik ekledi. PHP 5, uzun yıllar boyunca web geliştirmenin temel direği oldu.

En büyük sıçramalardan biri, 2015 yılında piyasaya sürülen PHP 7 serisi oldu. PHP 6 projesi başarısızlıkla sonuçlandıktan sonra, geliştiriciler doğrudan PHP 7'ye geçtiler. PHP 7, Zend Engine 3.0'ı tanıttı ve performans açısından devrim niteliğinde iyileştirmeler getirdi. PHP 5'e kıyasla çoğu uygulamada iki kat daha hızlı çalışabiliyordu. Ayrıca, yeni tür bildirimleri, anonim sınıflar ve daha birçok modern programlama özelliği eklendi.

PHP'nin en son büyük sürümü olan PHP 8, 2020 yılında yayınlandı. JIT (Just In Time) derleyici, nitelikler (attributes), adlandırılmış argümanlar, birleşim türleri (union types) ve match ifadesi gibi heyecan verici yeni özellikler sunarak dilin gücünü ve modernliğini daha da artırdı. PHP, sürekli gelişen, güncel ve performans odaklı bir dil olmaya devam etmektedir.



PHP Neden Tercih Edilmeli? Avantajları


PHP'nin web geliştirme dünyasındaki kalıcı popülaritesi, sunduğu bir dizi önemli avantajdan kaynaklanmaktadır:

  • Açık Kaynak ve Ücretsizdir: PHP, açık kaynaklı bir dildir ve kullanımı tamamen ücretsizdir. Bu, geliştiriciler ve şirketler için maliyetleri düşürür ve geniş bir topluluğun dilin gelişimine katkıda bulunmasına olanak tanır.

  • Geniş Topluluk ve Destek: PHP, dünya çapında milyonlarca geliştiriciye sahip devasa bir topluluğa sahiptir. Bu, sorun yaşadığınızda veya yardıma ihtiyacınız olduğunda kolayca destek bulabileceğiniz anlamına gelir. Forumlar, belgeler, tutorial'lar ve açık kaynaklı projelerle dolu bir ekosistem mevcuttur.

  • Öğrenmesi Kolay: Diğer bazı programlama dillerine kıyasla PHP'nin sözdizimi nispeten basittir ve yeni başlayanlar için öğrenmesi daha kolaydır. Basit web sayfaları oluşturmak için hızla temel bilgilere hakim olunabilir.

  • Esneklik ve Entegrasyon Yeteneği: PHP, HTML ile kolayca entegre olabilir. Ayrıca, çeşitli veritabanları (MySQL, PostgreSQL, Oracle, SQL Server vb.), web sunucuları (Apache, Nginx) ve işletim sistemleri (Linux, Windows, macOS) ile sorunsuz bir şekilde çalışabilir. Bu esneklik, geliştiricilere geniş bir seçenek yelpazesi sunar.

  • Performans: PHP 7 ve PHP 8 ile birlikte performans ciddi oranda artırılmıştır. Özellikle JIT derleyicisi gibi yeni özellikler, PHP uygulamalarının çok daha hızlı çalışmasını sağlamıştır. Bu, büyük ölçekli ve yüksek trafikli web siteleri için kritik bir faktördür.

  • Çok Yönlülük: PHP sadece web siteleri oluşturmakla kalmaz; komut satırı uygulamaları, masaüstü uygulamaları (GTK+ ile) ve hatta API'ler oluşturmak için de kullanılabilir.

  • Zengin Kütüphane ve Çerçeve Ekosistemi: Laravel, Symfony, CodeIgniter gibi güçlü çerçeveler ve WordPress, Drupal, Joomla gibi popüler içerik yönetim sistemleri (CMS) sayesinde geliştirme süreci hızlanır ve daha düzenli hale gelir. Composer gibi paket yöneticileri, kütüphane yönetimini kolaylaştırır.



PHP Nerelerde Kullanılır? Yaygın Kullanım Alanları


PHP'nin kullanım alanları oldukça geniştir ve internetin önemli bir bölümünü oluşturur. İşte PHP'nin en yaygın kullanıldığı bazı alanlar:

  • Dinamik Web Siteleri ve Uygulamalar: PHP, e-ticaret siteleri, sosyal medya platformları, haber portalları, bloglar ve forumlar gibi dinamik içerik sunan her türlü web sitesinin omurgasını oluşturur. WordPress, Drupal, Joomla gibi dünyanın en popüler CMS'lerinin tamamı PHP ile yazılmıştır.

  • İçerik Yönetim Sistemleri (CMS): Dünya genelindeki web sitelerinin büyük bir yüzdesi WordPress tarafından desteklenmektedir ve WordPress'in kendisi de tamamen PHP ile yazılmıştır. Benzer şekilde, Drupal ve Joomla gibi diğer büyük CMS'ler de PHP kullanır.

  • E-ticaret Platformları: Magento, OpenCart, PrestaShop gibi popüler e-ticaret çözümleri PHP tabanlıdır. Bu platformlar, ürün katalogları, sepet işlevselliği, ödeme ağ geçitleri ve sipariş yönetimi gibi karmaşık işlevleri PHP ile sağlar.

  • API Geliştirme: PHP, RESTful API'ler oluşturmak için sıklıkla kullanılır. Bu API'ler, mobil uygulamalar, tek sayfa uygulamalar (SPA'lar) veya diğer hizmetler arasında veri alışverişini sağlar. Laravel ve Symfony gibi çerçeveler, API geliştirmeyi oldukça kolaylaştırır.

  • Sosyal Medya ve Büyük Ölçekli Uygulamalar: Facebook gibi dünyanın en büyük sosyal medya platformlarından biri, başlangıcından bu yana PHP'yi yoğun bir şekilde kullanmıştır (özel olarak optimize edilmiş bir versiyonu olan Hack ile birlikte). Wikipedia gibi bilgi devleri de PHP kullanır.

  • Komut Satırı Uygulamaları: PHP, sadece web sunucuları üzerinde değil, aynı zamanda komut satırı arayüzü (CLI) uygulamaları oluşturmak için de kullanılabilir. Bu, otomasyon görevleri, veri işleme betikleri veya arka plan işlemleri için idealdir.



PHP'nin Çalışma Prensibi


PHP'nin çalışma prensibi, bir web sitesini ziyaret ettiğinizde gerçekleşen adımları anlamak için önemlidir. İşte basit bir açıklama:

  1. İstemci İsteği: Bir kullanıcı web tarayıcısına bir URL yazar veya bir bağlantıya tıklar. Bu, web sunucusuna bir istek gönderir.

  2. Sunucu Tarafında İşleme: Web sunucusu (örneğin Apache veya Nginx), isteğin bir PHP dosyasına yönelik olduğunu anlar. Bu durumda, isteği PHP yorumlayıcısına (veya PHP işlemcisine) iletir.

  3. PHP Yorumlayıcısı: PHP yorumlayıcısı (genellikle Zend Engine), PHP dosyasındaki kodu satır satır okur ve çalıştırır. Bu sırada, veritabanı bağlantıları kurabilir, veritabanından veri çekebilir, dosya işlemleri yapabilir, form verilerini işleyebilir ve diğer sunucu tarafı mantığını uygulayabilir.

  4. HTML Çıktısı Üretimi: PHP kodu çalıştıktan sonra, genellikle dinamik olarak üretilmiş HTML, CSS ve JavaScript kodlarından oluşan bir çıktı üretir.

  5. Sunucu Yanıtı: Web sunucusu, PHP yorumlayıcısından aldığı bu çıktıyı alır ve istemciye (kullanıcının web tarayıcısına) bir HTTP yanıtı olarak geri gönderir.

  6. Tarayıcı Tarafında Görüntüleme: Kullanıcının web tarayıcısı, sunucudan gelen HTML çıktısını alır ve ekranda web sayfasını görüntüler. Kullanıcı, PHP kodunu değil, sadece nihai HTML çıktısını görür.

Bu süreç, her web sayfası isteği için tekrarlanır ve PHP'nin dinamik ve etkileşimli web deneyimleri sunmasını sağlar.



PHP Ekosistemi: Çerçeveler, CMS'ler ve Araçlar


PHP'nin gücü, sadece dilin kendisinden değil, aynı zamanda etrafında inşa edilen zengin ekosistemden de gelir. Bu ekosistem, geliştiricilerin daha hızlı, daha verimli ve daha güvenli uygulamalar oluşturmasına yardımcı olan birçok araç, kütüphane ve çerçeve içerir.

  • PHP Çerçeveleri (Frameworks): PHP çerçeveleri, web uygulaması geliştirmeyi hızlandıran ve standartlaştıran yapılandırılmış bir temel sağlar. En popüler PHP çerçeveleri şunlardır:
    • Laravel: Modern, zarif ve güçlü bir çerçevedir. Geliştirici deneyimini ön planda tutar ve birçok yerleşik özellikle gelir. Geniş bir topluluğa ve zengin bir dokümantasyona sahiptir.

    • Symfony: Kurumsal düzeyde uygulamalar için sağlam ve esnek bir çerçevedir. Bileşen tabanlı yapısıyla dikkat çeker ve Laravel de dahil olmak üzere birçok başka projede Symfony bileşenleri kullanılır.

    • CodeIgniter: Hafif ve hızlı bir çerçevedir. Öğrenme eğrisi daha düşüktür ve küçük ile orta ölçekli projeler için idealdir.

    • Zend Framework (Laminas Project): Kurumsal uygulamalar için güçlü ve modüler bir çerçevedir. Büyük projelerde esneklik ve ölçeklenebilirlik sunar.

    • Yii: Yüksek performanslı web uygulamaları geliştirmek için tasarlanmış bir çerçevedir. Kapsamlı özellik setine sahiptir.


  • İçerik Yönetim Sistemleri (CMS): PHP, dünyanın en yaygın kullanılan CMS'lerinin temelini oluşturur:
    • WordPress: Bloglardan e-ticaret sitelerine kadar her türlü web sitesini oluşturmak için kullanılan açık kaynaklı bir CMS'dir. Dünya üzerindeki web sitelerinin %40'ından fazlası WordPress kullanır.

    • Drupal: Kurumsal düzeyde ve karmaşık web siteleri için güçlü ve esnek bir CMS'dir. Güvenlik ve ölçeklenebilirlik konusunda öne çıkar.

    • Joomla: WordPress ve Drupal arasında bir denge sunan, orta ölçekli web siteleri için popüler bir CMS'dir.


  • Paket Yöneticisi (Composer): Composer, PHP için standart bir bağımlılık yöneticisidir. Projelerinizde ihtiyaç duyduğunuz kütüphaneleri ve paketleri kolayca indirmenizi, yönetmenizi ve güncellemenizi sağlar. PHP ekosistemindeki modern geliştirmenin temel taşlarından biridir.

  • Entegre Geliştirme Ortamları (IDE'ler): PhpStorm, VS Code, Sublime Text gibi araçlar, PHP geliştiricilerine kod yazma, hata ayıklama ve proje yönetimi konusunda büyük kolaylıklar sunar.



PHP'nin Geleceği


Bazı dönemlerde "PHP öldü mü?" gibi sorular ortaya çıksa da, PHP her geçen gün kendini yenileyen ve geliştiren canlı bir dildir. PHP 7 ve PHP 8 ile gelen performans iyileştirmeleri, modern özellikler ve sürekli devam eden geliştirme süreçleri, dilin web geliştirme dünyasındaki yerini sağlamlaştırmıştır. Büyük teknoloji şirketleri (Facebook, Wikipedia) hala PHP'ye yatırım yapmakta, Laravel gibi çerçeveler yenilikçi çözümler sunmakta ve WordPress gibi CMS'ler milyonlarca siteye güç vermeye devam etmektedir. PHP, bulut tabanlı mimariler, mikro hizmetler ve API odaklı geliştirme gibi modern yaklaşımlara da başarıyla adapte olmaktadır. Bu nedenle, PHP'nin geleceği parlak ve web geliştirmenin vazgeçilmez bir parçası olmaya devam edecektir.



PHP Öğrenmeye Nasıl Başlanır?


Eğer PHP öğrenmeye başlamak istiyorsanız, işte size bazı adımlar ve kaynaklar:

  1. Temel Web Bilgisi: HTML ve CSS'i iyi anladığınızdan emin olun. JavaScript'e temel düzeyde hakim olmak da faydalıdır.

  2. Geliştirme Ortamı Kurulumu: Yerel bir sunucu ortamı kurmanız gerekecek. XAMPP, WAMP veya MAMP gibi paketler, Apache web sunucusu, MySQL veritabanı ve PHP'yi tek bir pakette sunar ve kurulumu kolaylaştırır.

  3. Temel PHP Sözdizimi: Değişkenler, veri tipleri, operatörler, koşullu ifadeler (if/else), döngüler (for/while), fonksiyonlar gibi temel PHP sözdizimini öğrenin.

  4. Veritabanı Entegrasyonu: PHP'nin MySQL gibi veritabanlarıyla nasıl etkileşim kurduğunu öğrenin. PDO (PHP Data Objects) veya MySQLi uzantısını kullanarak veritabanı işlemleri yapmayı pratik edin.

  5. Nesne Yönelimli Programlama (OOP): Daha büyük ve karmaşık uygulamalar geliştirmek için OOP prensiplerini (sınıflar, nesneler, miras, arayüzler) anlamak önemlidir.

  6. Çerçeveler ve CMS'ler: Temel PHP'ye hakim olduktan sonra, Laravel veya Symfony gibi bir PHP çerçevesini veya WordPress gibi bir CMS'i öğrenmeye başlayabilirsiniz. Bu, daha hızlı ve yapılandırılmış geliştirme yapmanızı sağlar.

  7. Pratik Yapın: En iyi öğrenme yolu pratik yapmaktır. Küçük projelerden başlayın, hata yapmaktan korkmayın ve sürekli olarak yeni şeyler deneyin.

  8. Kaynaklar: PHP'nin resmi belgeleri (php.net), online eğitim platformları (Udemy, Coursera), YouTube kanalları ve geliştirici blogları harika öğrenme kaynaklarıdır.



Sıkça Sorulan Sorular (SSS)


Bu bölümde, PHP hakkında en çok merak edilen bazı sorulara yanıt bulacaksınız.

PHP öğrenmek zor mu?

Hayır, PHP genel olarak öğrenmesi kolay bir dildir, özellikle web geliştirme dünyasına yeni başlayanlar için. Sözdizimi diğer bazı dillerden daha basittir ve geniş bir topluluk desteği ile bol miktarda kaynak mevcuttur. Temel HTML ve CSS bilginiz varsa, PHP'ye adapte olmanız daha da kolay olacaktır.

PHP hala popüler mi?

Kesinlikle evet. Bazı iddialara rağmen, PHP web geliştirme dünyasının en popüler dillerinden biri olmaya devam ediyor. Milyonlarca web sitesi, özellikle WordPress gibi büyük platformlar PHP ile çalışıyor. PHP 7 ve PHP 8 ile gelen performans iyileştirmeleri ve modern özellikler, dilin canlılığını korumasını sağlıyor.

PHP ile neler yapılabilir?

PHP ile dinamik web siteleri, e-ticaret platformları, bloglar, forumlar, sosyal medya siteleri, API'ler, İçerik Yönetim Sistemleri (CMS) ve hatta bazı komut satırı uygulamaları geliştirebilirsiniz. İnternette gördüğünüz çoğu dinamik içeriğin arkasında PHP veya benzeri bir sunucu taraflı dil bulunur.

PHP hangi veritabanlarıyla çalışır?

PHP, MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle ve MongoDB gibi birçok farklı veritabanıyla sorunsuz bir şekilde entegre olabilir. En yaygın kullanılanı MySQL'dir, ancak PHP'nin esnekliği sayesinde çoğu modern veritabanıyla çalışabilir.

PHP hangi işletim sistemlerinde çalışır?

PHP, platformdan bağımsız bir dildir. Linux, Windows, macOS ve Unix tabanlı sistemler dahil olmak üzere hemen hemen tüm büyük işletim sistemlerinde çalışabilir. Bu, geliştiricilere ve sunucu yöneticilerine büyük bir esneklik sunar.

PHP mi yoksa Python mu daha iyi?

Her iki dilin de kendine özgü güçlü yönleri vardır. PHP, web geliştirmeye odaklanmış ve bu alanda çok güçlü bir ekosisteme sahiptir. Python ise daha genel amaçlı bir dil olup web geliştirmeyle birlikte veri bilimi, yapay zeka ve otomasyon gibi alanlarda da yaygın olarak kullanılır. Seçim, projenizin gereksinimlerine ve kişisel tercihlerinize bağlıdır.

PHP mi yoksa JavaScript (Node.js) mi daha iyi?

PHP ve Node.js (JavaScript'in sunucu tarafı çalışma zamanı) her ikisi de sunucu tarafı geliştirme için popüler seçeneklerdir. PHP genellikle geleneksel web uygulamaları ve CMS'ler için tercih edilirken, Node.js gerçek zamanlı uygulamalar, mikro hizmetler ve tek sayfa uygulamalarının (SPA) API katmanları için güçlüdür. İki dil de modern web geliştirmede önemli bir rol oynar ve çoğu zaman birlikte kullanılırlar (örneğin, PHP bir web sitesinin arka ucunu sağlarken, JavaScript ön yüzü dinamik hale getirir).

9
0
YouTube Kanalı Açarak Gelir Elde Etme Rehberi: Hayallerinizi Gerçeğe Dönüştürün!

Merhaba sevgili içerik üreticisi adayları ve dijital dünya meraklıları! Bugün, birçoğumuzun hayalini süsleyen, yaratıcılığımızı gelire dönüştürebileceğimiz harika bir platformdan bahsedeceğiz: YouTube.


Belki de aklınızda harika bir video fikri var, belki de uzman olduğunuz bir konuda insanlara faydalı olmak istiyorsunuz. Ya da sadece ek gelir elde etmenin yeni yollarını arıyorsunuz. Her ne sebeple olursa olsun, YouTube, milyonlarca insana ulaşabileceğiniz ve potansiyelinizi keşfedebileceğiniz eşsiz bir alan sunuyor. Peki, bir YouTube kanalı açarak gerçekten gelir elde edebilir misiniz? Cevabımız kocaman bir evet! Ama bu yolculukta bilmeniz gereken bazı önemli adımlar ve stratejiler var. Hazırsanız, bu heyecan verici dünyaya birlikte dalalım.


YouTube Yolculuğuna Başlarken: Temelleri Atmak


Her büyük başarı hikayesi sağlam temeller üzerine kurulur. YouTube serüveninize başlarken de dikkat etmeniz gereken ilk adımlar var.


  • Nişinizi Belirleyin: Hangi konuda içerik üreteceksiniz? Oyun, makyaj, teknoloji, eğitim, gezi, yemek tarifleri... Seçenekler sınırsız. Önemli olan, hem tutkulu olduğunuz hem de bilgi sahibi olduğunuz bir alanı seçmek. Unutmayın, nişiniz ne kadar spesifik olursa, hedef kitlenize ulaşmanız o kadar kolaylaşır ve kendinizi o alanda bir otorite olarak konumlandırabilirsiniz. Nişinizi belirlemek, uzun vadeli başarınızın anahtarıdır.


  • Kanal Adı ve Markalaşma: Kanalınızın adı, markanızın ilk izlenimidir. Akılda kalıcı, nişinizle uyumlu ve telif hakkı sorunu olmayan bir isim seçin. Kanalınızın logosu, banner'ı ve genel görsel kimliği de profesyonel bir görünüm için kritik. Bu unsurlar, izleyicilerinizin kanalınızı tanımasını ve hatırlamasını sağlar.


  • Ekipman ve Başlangıç: Çoğu kişi "Profesyonel ekipmanım yok" diyerek başlama konusunda çekimser kalır. Ancak günümüzde iyi bir akıllı telefon bile başlangıç için yeterli olabilir! Önemli olan, iyi bir ışıklandırma ve net bir ses kalitesi sağlamaktır. Zamanla ve geliriniz arttıkça ekipmanınızı geliştirebilirsiniz. Asıl önemli olan içeriktir, ekipman değil.


  • İçerik Planlaması: Başarılı bir YouTube kanalı rastgele videolardan oluşmaz. Bir içerik takvimi oluşturmak, ne zaman ne tür videolar çekeceğinizi planlamak ve düzenli yayın akışı sağlamak izleyici sadakatini artırır. Konu araştırması yapın, senaryolarınızı hazırlayın ve çekim planınızı oluşturun.


Kaliteli İçerik Üretimi: İzleyicileri Bağımlı Hale Getirin


YouTube'da kalıcı olmak ve gelir elde etmek istiyorsanız, kaliteli içerik üretmekten asla ödün vermemelisiniz.


  • Video Kalitesi: Görüntü kalitesi kadar ses kalitesi de çok önemlidir. Kimse cızırtılı veya anlaşılmayan bir sesi dinlemek istemez. İyi bir mikrofon edinmek, ilk yatırımınız olabilir. Videolarınızın çözünürlüğü yüksek olsun ve iyi bir ışıklandırma kullanmaya özen gösterin.


  • Kurgu ve Montaj: Videolarınızı sıkıcı olmaktan çıkaracak, akıcı ve dinamik bir kurgu yapın. Giriş, gelişme, sonuç dengesini iyi ayarlayın. Müzik, efektler ve metinler kullanarak videonuzu daha ilgi çekici hale getirin. Ücretsiz veya uygun fiyatlı montaj programlarıyla başlayabilirsiniz.


  • Başlıklar ve Küçük Resimler (Thumbnails): Videonuz ne kadar iyi olursa olsun, eğer kimse tıklamazsa izlenmez. Videonuzun başlığı ve küçük resmi, adeta bir vitrin gibidir. Merak uyandıran, videonun içeriğini yansıtan ve yüksek çözünürlüklü küçük resimler hazırlayın. Başlıklarınızda anahtar kelimeler kullanmayı unutmayın.


  • YouTube SEO: Videolarınızın keşfedilmesini sağlamak için YouTube SEO'sunu iyi kullanmalısınız. Videonuzun başlığına, açıklamasına ve etiketlerine alakalı anahtar kelimeler ekleyin. Açıklamalarınızı detaylı yazın, zaman damgaları ekleyin ve diğer videolarınıza veya ilgili kaynaklara bağlantılar verin. Bu, YouTube algoritmasının videonuzu doğru kitlelere ulaştırmasına yardımcı olur.


Kitlenizi Büyütmek ve Etkileşimi Artırmak


Para kazanmanın yolu, geniş ve sadık bir kitleye sahip olmaktan geçer. Kitlenizi büyütmek için sürekli çaba göstermelisiniz.


  • Düzenli Yayın Akışı: Belirli aralıklarla video yayınlamak, izleyicilerinizin ne zaman yeni içerik bekleyeceğini bilmesini sağlar ve sadakatlerini pekiştirir. Tutarlı olmak, YouTube algoritması tarafından da ödüllendirilir.


  • Yorumlara Cevap Verin: İzleyicilerinizle etkileşim kurmak, onlarla bir bağ kurmanın en iyi yoludur. Yorumlarına cevap verin, sorularını yanıtlayın ve onların fikirlerine değer verdiğinizi gösterin. Bu, topluluk hissini güçlendirir.


  • Sosyal Medya Entegrasyonu: YouTube kanalınızı diğer sosyal medya platformlarında da tanıtın. Instagram, TikTok, Twitter gibi platformlarda videolarınızdan kısa kesitler paylaşarak daha fazla kişiye ulaşın ve kanalınıza yönlendirin.


  • Ortak Çalışmalar (Collaborations): Benzer nişlerdeki diğer YouTuber'larla işbirliği yapmak, her iki tarafın da kitlesini genişletmek için harika bir yöntemdir. Farklı kitlelere ulaşarak abone sayınızı hızla artırabilirsiniz.


YouTube'dan Para Kazanma Yolları: Gelirinizi Çeşitlendirin


Şimdi gelelim asıl konuya: YouTube'dan nasıl para kazanılır? Tek bir yöntemle sınırlı kalmak yerine, gelirinizi çeşitlendirmek akıllıca olacaktır.


  • YouTube İş Ortağı Programı (AdSense): Bu, YouTube'dan para kazanmanın en bilinen yoludur. Kanalınızın belirli kriterleri (genellikle 1000 abone ve son 12 ayda 4000 saat genel izlenme süresi veya Shorts videolarında 90 günde 10 milyon geçerli izlenme) karşılaması halinde başvurabilirsiniz. Onaylandığınızda, videolarınızda gösterilen reklamlardan gelir elde edersiniz. Gelir, reklam türüne, izleyici demografisine ve reklamverenlerin bütçesine göre değişiklik gösterir. Bu, çoğu YouTuber için ilk gelir kapısıdır.


  • Marka İş Birlikleri ve Sponsorluklar: Kanalınız büyüdükçe, markalar ürünlerini veya hizmetlerini tanıtmanız için sizinle iletişime geçebilir. Bu, genellikle doğrudan bir ödeme karşılığında veya ürün değişimi şeklinde olur. Nişinizle alakalı ve izleyicilerinize fayda sağlayacak markalarla çalışmak, hem sizin hem de markanın itibarını artırır. Şeffaf olun ve sponsorlu içeriği her zaman belirtin.


  • Ürün Satışı (Merchandise): Kendi markanız altında tişört, kupa, şapka gibi ürünler satarak gelir elde edebilirsiniz. Özellikle sadık ve büyük bir kitleniz varsa, bu yöntem oldukça etkili olabilir. YouTube'un kendi merchandise rafı özelliği de bulunmaktadır.


  • Satış Ortaklığı (Affiliate Marketing): Videolarınızda bahsettiğiniz ürün veya hizmetlerin linklerini açıklama bölümüne ekleyerek, bu linkler üzerinden yapılan her satıştan komisyon kazanabilirsiniz. Amazon Ortaklık Programı gibi platformlar bu konuda size yardımcı olabilir. İzleyicilerinize gerçekten faydalı olabilecek ürünleri tavsiye etmeye özen gösterin.


  • Patreon ve Kitle Fonlaması: İzleyicileriniz, Patreon gibi platformlar aracılığıyla kanalınıza aylık belirli bir miktar ödeme yaparak doğrudan destek olabilirler. Karşılığında onlara özel içerikler, erken erişim veya diğer ayrıcalıklar sunabilirsiniz. Bu, özellikle niş ve sadık bir topluluğa sahip kanallar için harika bir gelir kaynağıdır.


  • Dijital Ürünler ve Hizmetler: Eğer bir uzmansanız, bilginizi e-kitaplar, online kurslar, danışmanlık hizmetleri veya premium içerikler gibi dijital ürün ve hizmetlere dönüştürebilirsiniz. YouTube kanalınız, bu ürünlerinizi tanıtmak ve satmak için güçlü bir platform görevi görür. Örneğin, bir fitness kanalı kişisel antrenman programları satabilir, bir dil öğrenme kanalı özel dersler verebilir.


  • YouTube Premium Geliri: YouTube Premium aboneleri, platformu reklamsız izlerler. Bu aboneler videolarınızı izlediğinde, YouTube bu gelirin bir kısmını içerik üreticileriyle paylaşır. Bu da ek bir pasif gelir kaynağıdır.


  • Süper Sohbet ve Süper Teşekkürler: Canlı yayınlar sırasında izleyicileriniz Süper Sohbet ile mesajlarını öne çıkarabilir veya Süper Teşekkürler ile favori videolarınıza doğrudan destek gönderebilir. Bu da izleyici katılımını teşvik eden ve ek gelir sağlayan özelliklerdir.


Başarıya Giden Yolda Önemli İpuçları


YouTube'da gelir elde etmek bir maraton, sprint değil. Bu yolculukta sizi motive tutacak ve başarıya taşıyacak bazı önemli noktalar var.


  • Sabırlı Olun ve Tutarlı Kalın: Hiçbir kanal bir gecede fenomen olmaz. Sabırla ve düzenli olarak içerik üretmeye devam edin. Başarı zamanla ve emekle gelecektir.


  • Analitikleri Takip Edin: YouTube Studio'daki analitik verileri düzenli olarak inceleyin. Hangi videolarınız daha çok izleniyor? İzleyicileriniz videonuzun hangi bölümünde ayrılıyor? Hangi demografik yapıya sahip izleyicileriniz var? Bu veriler, içerik stratejinizi geliştirmeniz için paha biçilmez bilgiler sunar.


  • Trendleri Yakalayın ama Kendiniz Olun: Popüler konuları ve trendleri takip etmek önemlidir, ancak kendi özgün sesinizi ve tarzınızı kaybetmeyin. Taklitçi olmak yerine, kendi benzersiz bakış açınızı sunun.


  • Geri Bildirimlere Açık Olun: İzleyicilerinizin yorumları ve eleştirileri, kendinizi geliştirmeniz için bir fırsattır. Olumlu ve yapıcı eleştirileri dikkate alın.


  • Ağ Kurun: Diğer içerik üreticileriyle iletişimde olun, topluluklara katılın. Tecrübe paylaşımı ve destek almak, bu yolculukta yalnız olmadığınızı hissettirecektir.


Gördüğünüz gibi, YouTube sadece bir video platformu değil, aynı zamanda ciddi bir gelir potansiyeli sunan, kendi işinizi kurabileceğiniz bir ekosistemdir. Başlamak için mükemmel anı beklemeyin, elinizdeki imkanlarla ilk adımı atın. Unutmayın, en büyük YouTuber'lar bile bir zamanlar sıfırdan başladı. Yaratıcılığınızı serbest bırakın, tutkunuzu paylaşın ve bu heyecan verici dijital dünyada kendi yerinizi oluşturun. Başarılar dileriz!


9
0
JavaScript Dilinde JS Dates Kullanımı

JavaScript'te tarih ve saat verilerini yönetmek, görüntülemek ve üzerinde işlem yapmak için yerleşik Date nesnesi kullanılır. Bu nesne, milisaniyeler cinsinden zamanı temsil eder ve 1 Ocak 1970 UTC (Evrensel Eşgüdümlü Saat) tarihinden bu yana geçen süreyi temel alır. Date nesnesi ile mevcut tarihi ve saati alabilir, belirli bir tarihi oluşturabilir, tarih bileşenlerini değiştirebilir ve farklı formatlarda görüntüleyebilirsiniz.


Sözdizimi


Date nesnesi, new Date() yapıcı fonksiyonu kullanılarak dört farklı şekilde oluşturulabilir:


  • new Date(): Mevcut tarih ve saati içeren bir Date nesnesi oluşturur.

  • new Date(milisaniye): 1 Ocak 1970 UTC'den bu yana geçen milisaniye sayısını temsil eden bir Date nesnesi oluşturur.

  • new Date(tarihDizisi): Bir tarih dizisini (örneğin, "2023-10-26" veya "October 26, 2023 10:30:00") ayrıştırarak bir Date nesnesi oluşturur.

  • new Date(yıl, ay, gün, saat, dakika, saniye, milisaniye): Belirli tarih ve saat bileşenleriyle bir Date nesnesi oluşturur. Ay değeri 0'dan (Ocak) 11'e (Aralık) kadar indeklenmiştir.


Detaylı Açıklama


Date nesnesinin yapıcı fonksiyonları ve yöntemleri, tarih ve saat manipülasyonu için güçlü araçlar sunar:


  • new Date(): Argüman olmadan çağrıldığında, Date nesnesi, komutun çalıştırıldığı yerel sistemin mevcut tarih ve saatini temsil eder.

  • new Date(milisaniye): Bu yapıcı, new Date(0) ile 1 Ocak 1970 UTC başlangıcını temsil eder. Pozitif değerler bu tarihten sonrasını, negatif değerler ise öncesini ifade eder. Örneğin, new Date(86400000) 1 Ocak 1970 UTC'den 24 saat sonrasını temsil eder.

  • new Date(tarihDizisi): JavaScript, çeşitli ISO 8601 formatlarını (örneğin, "YYYY-MM-DD", "YYYY-MM-DDTHH:mm:ssZ") ve tarayıcıya özgü bazı diğer tarih dizisi formatlarını ayrıştırabilir. Ancak, tarayıcılar arası tutarlılık için ISO 8601 formatları tercih edilmelidir.

  • new Date(yıl, ay, gün, saat, dakika, saniye, milisaniye): Bu yapıcı, tarih bileşenlerini doğrudan belirterek kesin bir tarih ve saat oluşturmanıza olanak tanır. ay parametresinin 0-indeksli olduğunu unutmamak önemlidir. Örneğin, Ekim ayı için 9 değeri kullanılır. gün, saat, dakika, saniye ve milisaniye parametreleri isteğe bağlıdır ve belirtilmezse varsayılan olarak 1 (gün için) veya 0 (diğerleri için) değerini alırlar.


Date nesnesinin birçok yöntemi vardır. Bunlar genellikle iki kategoriye ayrılır: yerel zaman dilimine göre (getFullYear(), getMonth()) ve UTC'ye göre (getUTCFullYear(), getUTCMonth()) çalışan yöntemler. Benzer şekilde, tarih bileşenlerini ayarlamak için setFullYear() veya setUTCFullYear() gibi yöntemler mevcuttur.


Pratik Kullanım Örnekleri


Mevcut tarih ve saati alıp görüntüleme:

const simdi = new Date();
console.log(simdi); // Örnek çıktı: Thu Oct 26 2023 10:30:00 GMT+0300 (Türkiye Standart Saati)
console.log(simdi.toLocaleDateString()); // Örnek çıktı: 26.10.2023
console.log(simdi.toLocaleTimeString()); // Örnek çıktı: 10:30:00
console.log(simdi.toISOString()); // Örnek çıktı: 2023-10-26T07:30:00.000Z (UTC formatında)

Belirli bir tarih ve saat oluşturma:

// Yıl, ay (0-indeksli), gün, saat, dakika, saniye, milisaniye
const dogumGunu = new Date(1990, 4, 15, 12, 0, 0, 0); // 15 Mayıs 1990, 12:00:00
console.log(dogumGunu.toDateString()); // Örnek çıktı: Tue May 15 1990

// Tarih dizisi kullanarak
const yaziIleTarih = new Date("2024-01-20T14:30:00Z"); // UTC olarak 20 Ocak 2024, 14:30:00
console.log(yaziIleTarih.toLocaleString()); // Tarayıcının yerel ayarına göre görüntülenir

Tarih bileşenlerini alma:

const bugun = new Date();
const yil = bugun.getFullYear(); // Yılı alır (örneğin, 2023)
const ay = bugun.getMonth();   // Ayı alır (0-11, Ocak 0'dır)
const gun = bugun.getDate();    // Ayın gününü alır (1-31)
const gunAdi = bugun.getDay();  // Haftanın gününü alır (0-6, Pazar 0'dır)
const saat = bugun.getHours();  // Saati alır (0-23)
const dakika = bugun.getMinutes(); // Dakikayı alır (0-59)
const saniye = bugun.getSeconds(); // Saniyeyi alır (0-59)
const milisaniye = bugun.getMilliseconds(); // Milisaniyeyi alır (0-999)
const zamanDamgasi = bugun.getTime(); // 1 Ocak 1970'ten bu yana geçen milisaniye sayısı

console.log(`Yıl: ${yil}, Ay: ${ay + 1}, Gün: ${gun}, Saat: ${saat}:${dakika}`);

Tarih bileşenlerini ayarlama:

const gelecektekiTarih = new Date();
gelecektekiTarih.setFullYear(2025);
gelecektekiTarih.setMonth(0); // Ocak
gelecektekiTarih.setDate(1); // Ayın 1. günü
gelecektekiTarih.setHours(9);
gelecektekiTarih.setMinutes(0);
gelecektekiTarih.setSeconds(0);
gelecektekiTarih.setMilliseconds(0);

console.log(gelecektekiTarih.toLocaleString()); // Örnek çıktı: 1.01.2025 09:00:00

Tarihler arası fark hesaplama:

const tarih1 = new Date('2023-10-01');
const tarih2 = new Date('2023-10-31');

const farkMilisaniye = tarih2.getTime() - tarih1.getTime();
const farkGun = farkMilisaniye / (1000 * 60 * 60 * 24);

console.log(`İki tarih arasındaki gün farkı: ${farkGun}`); // Çıktı: 30

Önemli Notlar


  • Ay İndekslemesi: Date nesnesinin yapıcı fonksiyonunda ve getMonth(), setMonth() gibi yöntemlerinde ay değerleri 0'dan 11'e kadar indekslenir (0 = Ocak, 11 = Aralık). Bu yaygın bir hata kaynağıdır.

  • Saat Dilimi Farklılıkları: Date nesnesi, genellikle yerel saat dilimini kullanır. Ancak, getUTCFullYear(), setUTCHours() gibi UTC ön ekli yöntemler, Evrensel Eşgüdümlü Saat'e göre işlem yapar. Bu durum, özellikle uluslararası uygulamalarda veya sunucu-istemci iletişimi sırasında önemlidir. Tarihleri UTC formatında depolayıp, kullanıcının yerel saat dilimine göre görüntülemek iyi bir pratiktir.

  • String Ayrıştırma Güvenilirliği: new Date(tarihDizisi) yapıcı fonksiyonu, farklı tarayıcılarda ve JavaScript motorlarında farklı dizileri ayrıştırabilir. En güvenilir yöntem, ISO 8601 formatında tarih dizileri kullanmak (örneğin, "YYYY-MM-DDTHH:mm:ss.sssZ" veya "YYYY-MM-DD").

  • Date.now(): Bu statik yöntem, 1 Ocak 1970 UTC'den bu yana geçen milisaniye sayısını döndürür ve bir Date nesnesi oluşturmadan anlık zaman damgasını almak için hızlı bir yoldur. Performans açısından new Date().getTime()'dan daha etkilidir.

  • Geçersiz Tarihler: Geçersiz bir tarih oluşturmaya çalışırsanız (örneğin, 31 Şubat), Date nesnesi "Invalid Date" (Geçersiz Tarih) döndürür. Bu durumu isNaN(date.getTime()) ile kontrol edebilirsiniz.

9
0
Python Dilinde Python Booleans Kullanımı

Python'da Booleans, programlama mantığının temelini oluşturan, yalnızca iki olası değere sahip özel bir veri tipidir: True ve False. Bu değerler, koşullu ifadelerde, döngülerde ve genel program akış kontrolünde kararlar almak için kullanılır. Mantıksal işlemlerin sonucunu temsil ederler ve bir durumun doğru mu yanlış mı olduğunu belirtirler. Python'da, bool sınıfının bir örneği olarak kabul edilirler ve dahili olarak sırasıyla 1 ve 0 tam sayı değerlerine karşılık gelirler.


Temel Sözdizimi


Python'da boolean değerleri doğrudan True ve False anahtar kelimeleri kullanılarak ifade edilir. Bu anahtar kelimeler büyük harfle başlar ve Python'ın ayrılmış kelimeleridir.


Detaylı Açıklama


  • True: Mantıksal olarak "doğru" anlamına gelir. Bir koşulun karşılandığını veya bir ifadenin geçerli olduğunu belirtir.

  • False: Mantıksal olarak "yanlış" anlamına gelir. Bir koşulun karşılanmadığını veya bir ifadenin geçersiz olduğunu belirtir.


Python'da birçok veri tipi ve ifade, boolean bağlamında değerlendirildiğinde dolaylı olarak bir boolean değere sahiptir. Örneğin, boş stringler (""), boş listeler ([]), boş sözlükler ({}), 0 sayısı ve None değeri False olarak değerlendirilirken; sıfırdan farklı sayılar, dolu stringler ve dolu koleksiyonlar True olarak değerlendirilir. Bu duruma "truthiness" denir ve bool() fonksiyonu ile açıkça kontrol edilebilir.


Pratik Kullanım Örnekleri


Örnek 1: Basit Atama ve Kontrol
Bir değişkene boolean değeri atayarak ve bu değeri kullanarak koşullu bir ifade çalıştırmak için aşağıdaki kodu inceleyebiliriz.

is_active = True
is_admin = False

if is_active:
    print("Kullanıcı aktif.")
else:
    print("Kullanıcı pasif.")

if is_admin:
    print("Yönetici yetkilerine sahip.")
else:
    print("Yönetici yetkilerine sahip değil.")

Örnek 2: Karşılaştırma Operatörleri
Karşılaştırma operatörleri (==, !=, <, >, <=, >=) her zaman bir boolean değeri döndürür.

x = 10
y = 20

print(f"x == y: {x == y}")
print(f"x != y: {x != y}")
print(f"x < y: {x < y}")
print(f"x > y: {x > y}")

Örnek 3: Mantıksal Operatörler
Mantıksal operatörler (and, or, not) boolean değerleri birleştirmek veya tersine çevirmek için kullanılır.

has_permission = True
is_logged_in = True
is_subscriber = False

if has_permission and is_logged_in:
    print("Erişim granted.")

if has_permission or is_subscriber:
    print("En az bir koşul doğru.")

if not is_subscriber:
    print("Abone değil.")

Örnek 4: bool() Fonksiyonu ile Değerlendirme
Bir ifadenin boolean bağlamında nasıl değerlendirileceğini bool() fonksiyonu ile açıkça görebiliriz.

print(f"bool(0): {bool(0)}")
print(f"bool(1): {bool(1)}")
print(f"bool(''): {bool('')}")
print(f"bool('Hello'): {bool('Hello')}")
print(f"bool([]): {bool([])}")
print(f"bool([1, 2]): {bool([1, 2])}")
print(f"bool(None): {bool(None)}")

İpuçları/Önemli Notlar


  • True ve False anahtar kelimeleri Python'da büyük harfle başlar. Küçük harfle yazmak (örneğin, true veya false) bir hata ile sonuçlanır çünkü bunlar ayrılmış anahtar kelimelerdir ve değişken adları olarak algılanmazlar.

  • Boolean değerleri, dahili olarak sırasıyla 1 ve 0 tamsayı değerlerine karşılık gelir. Bu, bazen aritmetik işlemlerde veya tip dönüştürmelerde ilginç sonuçlar doğurabilir; örneğin, True + True ifadesi 2 sonucunu verir.

  • Karşılaştırma ve mantıksal operatörler, koşullu ifadeler ve döngüler için vazgeçilmezdir. Programınızın akışını kontrol etmek için bu operatörleri doğru bir şekilde kullanmak kritik öneme sahiptir.

  • bool() fonksiyonu, herhangi bir Python nesnesinin boolean karşılığını elde etmek için kullanılabilir. Bu, özellikle bir koleksiyonun boş olup olmadığını veya bir değişkenin değer içerip içermediğini kontrol etmek için faydalıdır.

14
0
JavaScript Dilinde Diziler (Arrays) Kullanımı

JavaScript, web geliştirmede dinamik ve etkileşimli deneyimler oluşturmak için vazgeçilmez bir dildir. Bu dilin temel yapı taşlarından biri olan diziler (arrays), birden çok değeri tek bir değişken altında depolamamızı ve yönetmemizi sağlar. Diziler, veri koleksiyonlarını düzenli bir şekilde saklamak, üzerlerinde döngüler yapmak ve çeşitli manipülasyonlar gerçekleştirmek için kritik öneme sahiptir. Bu makalede, JavaScript dizilerinin temel sözdizimini, öğelere erişimi, yaygın kullanılan metotları ve pratik uygulama örneklerini detaylı bir şekilde inceleyeceğiz.


Sözdizimi


JavaScript'te dizi oluşturmanın ve kullanmanın iki temel yolu vardır:


1. Dizi Değişmezi (Array Literal) Kullanımı


Bu, en yaygın ve önerilen yöntemdir. Köşeli parantezler [] arasına, virgülle ayrılmış olarak dizi öğeleri yazılır.


const meyveler = ["Elma", "Muz", "Portakal"];
let sayilar = [1, 2, 3, 4, 5];
const karisikDizi = ["Metin", 123, true, null, {adi: "Nesne"}];

Yukarıdaki örneklerde görüldüğü gibi, bir dizi içinde farklı veri tiplerini barındırabiliriz. Diziler const, let veya var anahtar kelimeleri ile tanımlanabilir.


2. Array Kurucu Fonksiyonu (Constructor Function) Kullanımı


new Array() kurucu fonksiyonunu kullanarak da dizi oluşturulabilir. Bu yöntem daha az tercih edilse de, belirli senaryolarda kullanılabilir.


const meyveler = new Array("Elma", "Muz", "Portakal");
const bosDizi = new Array(); // Boş bir dizi oluşturur
const onElemanliDizi = new Array(10); // 10 boş öğe içeren bir dizi oluşturur

Tek bir sayısal argümanla çağrıldığında, new Array() o boyutta boş öğeler içeren bir dizi oluşturur. Birden fazla argümanla çağrıldığında ise, bu argümanlar dizinin öğeleri haline gelir.


Dizi Öğelerine Erişim ve Değiştirme


Dizilerdeki öğelere, sıfır tabanlı indeksleme kullanarak erişilir. Yani, ilk öğenin indeksi 0, ikincisinin 1 ve bu şekilde devam eder. Öğelere erişmek için dizi adından sonra köşeli parantez içinde indeks numarası belirtilir.


const renkler = ["Kırmızı", "Yeşil", "Mavi"];
console.log(renkler[0]); // Çıktı: Kırmızı
console.log(renkler[1]); // Çıktı: Yeşil

Dizi öğelerini değiştirmek de benzer şekilde yapılır. İstenen indeks belirtilerek yeni bir değer atanır:


renkler[2] = "Sarı";
console.log(renkler); // Çıktı: ["Kırmızı", "Yeşil", "Sarı"]

Bir dizinin toplam öğe sayısını öğrenmek için length özelliğini kullanırız:


console.log(renkler.length); // Çıktı: 3

Örnekler


1. Dizi Tanımlama ve Temel Erişim


Bu örnek, bir dizi tanımlamayı ve belirli indekslerdeki öğelere nasıl erişileceğini göstermektedir.


// Bir meyve dizisi tanımlama
const meyveler = ["Elma", "Armut", "Kiraz", "Çilek"];

// Dizinin ilk elemanına erişme (indeks 0)
console.log("İlk meyve:", meyveler[0]); // Çıktı: İlk meyve: Elma

// Dizinin üçüncü elemanına erişme (indeks 2)
console.log("Üçüncü meyve:", meyveler[2]); // Çıktı: Üçüncü meyve: Kiraz

// Dizinin son elemanına erişme (length - 1)
console.log("Son meyve:", meyveler[meyveler.length - 1]); // Çıktı: Son meyve: Çilek

2. Dizi Öğelerini Değiştirme ve Yeni Öğeler Ekleme/Çıkarma


Bu örnek, var olan bir dizi öğesinin nasıl değiştirileceğini ve dizinin sonuna/başına öğe ekleme/çıkarma işlemlerini göstermektedir.


let alisverisListesi = ["Süt", "Ekmek", "Yumurta"];

// İkinci öğeyi değiştirme (indeks 1)
alisverisListesi[1] = "Peynir";
console.log("Değişen liste:", alisverisListesi); // Çıktı: Değişen liste: ["Süt", "Peynir", "Yumurta"]

// Dizinin sonuna yeni bir öğe ekleme (push metodu)
alisverisListesi.push("Meyve Suyu");
console.log("Ekleme sonrası:", alisverisListesi); // Çıktı: Ekleme sonrası: ["Süt", "Peynir", "Yumurta", "Meyve Suyu"]

// Dizinin sonundaki öğeyi çıkarma (pop metodu)
const cikarilanOge = alisverisListesi.pop();
console.log("Çıkarılan öğe:", cikarilanOge); // Çıktı: Çıkarılan öğe: Meyve Suyu
console.log("Çıkarma sonrası:", alisverisListesi); // Çıktı: Çıkarma sonrası: ["Süt", "Peynir", "Yumurta"]

// Dizinin başına yeni bir öğe ekleme (unshift metodu)
alisverisListesi.unshift("Yoğurt");
console.log("Başına ekleme:", alisverisListesi); // Çıktı: Başına ekleme: ["Yoğurt", "Süt", "Peynir", "Yumurta"]

// Dizinin başındaki öğeyi çıkarma (shift metodu)
const cikarilanBasOge = alisverisListesi.shift();
console.log("Baştan çıkarılan öğe:", cikarilanBasOge); // Çıktı: Baştan çıkarılan öğe: Yoğurt
console.log("Baştan çıkarma sonrası:", alisverisListesi); // Çıktı: Baştan çıkarma sonrası: ["Süt", "Peynir", "Yumurta"]

3. Diziler Üzerinde Döngü Kullanımı


Dizi öğeleri üzerinde işlem yapmak için döngüler sıkça kullanılır. En yaygın yöntemlerden biri for döngüsü ve forEach() metodudur.


const ogrenciler = ["Ali", "Ayşe", "Mehmet", "Fatma"];

// For döngüsü ile dizi öğelerini listeleme
console.log("For döngüsü ile öğrenciler:");
for (let i = 0; i < ogrenciler.length; i++) {
  console.log(ogrenciler[i]);
}

// forEach() metodu ile dizi öğelerini listeleme
console.log("\nforEach() ile öğrenciler:");
ogrenciler.forEach(function(ogrenci, index) {
  console.log(`${index + 1}. ${ogrenci}`);
});

Önemli Notlar


  • Dinamik Boyut: JavaScript dizileri dinamik yapıdadır. Oluşturulduktan sonra boyutları otomatik olarak büyüyüp küçülebilir. Önceden bir boyut belirtme zorunluluğu yoktur.

  • Karışık Veri Tipleri: JavaScript dizileri, aynı anda string, number, boolean, object, null, undefined gibi farklı veri tiplerini barındırabilir.

  • Referans Tipi: Diziler birer referans tipi (reference type) veri yapısıdır. Bir diziyi başka bir değişkene atadığınızda, aslında dizinin kendisi değil, bellekteki referansı kopyalanır. Bu nedenle, yeni değişken üzerinden yapılan değişiklikler orijinal diziyi de etkiler.

  • const ile Dizi Tanımlama: const ile tanımlanan bir dizinin referansı değiştirilemez, yani başka bir dizi atanması mümkün değildir. Ancak, dizinin içindeki öğeler (indeksler üzerinden) değiştirilebilir veya dizi metotları (push, pop vb.) ile manipüle edilebilir.


    const sabitDizi = [1, 2, 3];
    sabitDizi.push(4); // Geçerli: [1, 2, 3, 4]
    // sabitDizi = [5, 6]; // Hata: Assignment to constant variable.
  • Dizi Metotları: JavaScript, dizilerle çalışmayı kolaylaştıran zengin bir dizi metotları setine sahiptir (map(), filter(), reduce(), find(), splice(), slice() vb.). Bu metotlar, diziler üzerinde daha gelişmiş işlemler yapmak için kullanılır ve modern JavaScript programlamasında kritik öneme sahiptir.

8
0
SQL Dilinde NULL Değerlerin Etkili Kullanımı

Veritabanı yönetim sistemlerinde, bir sütundaki veri değerinin bilinmediğini, uygulanabilir olmadığını veya henüz atanmadığını belirtmek için NULL anahtar kelimesi kullanılır. Bu özel değer, diğer veri türlerinden farklı olarak, bir sayıyı (örneğin 0) veya boş bir karakter dizisini (örneğin '') temsil etmez; aksine, bir değerin yokluğunu veya belirsizliğini ifade eder. SQL sorgularında NULL değerlerle doğru bir şekilde çalışabilmek, veri bütünlüğünü sağlamak ve beklenen sonuçları elde etmek için kritik öneme sahiptir.


Sözdizimi


SQL'de NULL değerleri sorgulamak ve yönetmek için genellikle IS NULL, IS NOT NULL operatörleri ve COALESCE gibi özel fonksiyonlar kullanılır. Temel kullanım yapıları aşağıdaki gibidir:



-- Bir sütunda NULL değerleri seçmek için:
SELECT column_name(s)
FROM table_name
WHERE column_name IS NULL;

-- Bir sütunda NULL olmayan değerleri seçmek için:
SELECT column_name(s)
FROM table_name
WHERE column_name IS NOT NULL;

-- NULL değerleri alternatif bir değerle değiştirmek için:
SELECT COALESCE(column_name, default_value) AS new_column_name
FROM table_name;

Detaylı Açıklama


NULL Nedir?


SQL'deki NULL, bir değerin yokluğunu temsil eder. Bu, bir sütunun o satır için herhangi bir bilgi içermediği veya bu bilginin bilinmediği anlamına gelir. NULL, sıfırdan, boş bir karakter dizisinden veya boşluktan farklıdır. Örneğin, bir kullanıcının telefon numarasının NULL olması, o kullanıcının telefon numarasının olmadığını veya bilinmediğini ifade eder; '0' olması ise telefon numarasının 0 olduğunu gösterir.


IS NULL Operatörü


IS NULL operatörü, belirli bir sütundaki değerin NULL olup olmadığını kontrol etmek için kullanılır. Geleneksel karşılaştırma operatörleri (=, <>, !=) NULL değerlerle doğru şekilde çalışmadığı için bu operatör zorunludur. WHERE koşulunda kullanılarak, belirtilen sütunda NULL değeri bulunan tüm satırları döndürür.


IS NOT NULL Operatörü


IS NOT NULL operatörü, IS NULL operatörünün zıttıdır. Bir sütundaki değerin NULL olmadığını kontrol etmek için kullanılır. Bu operatör, belirli bir sütunda geçerli (NULL olmayan) bir değere sahip olan tüm satırları seçmek istediğinizde faydalıdır.


COALESCE Fonksiyonu


COALESCE fonksiyonu, kendisine verilen ifadeler listesinden NULL olmayan ilk ifadeyi döndürür. Bu fonksiyon, bir sütundaki NULL değerleri okunaklı bir varsayılan değerle (örneğin 'Bilinmiyor' veya 0) değiştirmek istediğinizde çok kullanışlıdır. Eğer tüm ifadeler NULL ise, COALESCE de NULL döndürür.


NULL ile Karşılaştırmalar


SQL'de NULL değerleri doğrudan diğer değerlerle (hatta başka bir NULL ile bile) = veya <> gibi operatörlerle karşılaştırmak her zaman UNKNOWN (bilinmeyen) sonucunu verir. Örneğin, NULL = NULL ifadesi TRUE döndürmez, UNKNOWN döndürür. Bu nedenle, NULL değerleri test etmek için mutlaka IS NULL veya IS NOT NULL operatörleri kullanılmalıdır.


Örnekler


Aşağıdaki örnekler, NULL değerlerin SQL sorgularında nasıl kullanıldığını göstermektedir. İlk olarak, örnek bir tablo oluşturalım ve içine veri ekleyelim:



-- 1. Örnek Tablo Oluşturma ve Veri Ekleme
CREATE TABLE Calisanlar (
    CalisanID INT PRIMARY KEY,
    Ad VARCHAR(50) NOT NULL,
    Soyad VARCHAR(50) NOT NULL,
    Email VARCHAR(100),
    Telefon VARCHAR(15),
    DepartmanID INT
);

INSERT INTO Calisanlar (CalisanID, Ad, Soyad, Email, Telefon, DepartmanID) VALUES
(1, 'Ayşe', 'Yılmaz', 'ayse.yilmaz@example.com', '5551234567', 101),
(2, 'Mehmet', 'Demir', NULL, '5557654321', 102),
(3, 'Zeynep', 'Kaya', 'zeynep.kaya@example.com', NULL, 101),
(4, 'Ali', 'Can', 'ali.can@example.com', '5559876543', 103),
(5, 'Elif', 'Aksoy', NULL, NULL, 102),
(6, 'Deniz', 'Çelik', 'deniz.celik@example.com', '5551112233', NULL);

IS NULL Kullanımı


Email adresi NULL olan çalışanları listelemek:



SELECT CalisanID, Ad, Soyad, Email
FROM Calisanlar
WHERE Email IS NULL;

Bu sorgu, Mehmet Demir ve Elif Aksoy'un kayıtlarını döndürecektir.


IS NOT NULL Kullanımı


Telefon numarası tanımlanmış (NULL olmayan) çalışanları listelemek:



SELECT CalisanID, Ad, Soyad, Telefon
FROM Calisanlar
WHERE Telefon IS NOT NULL;

Bu sorgu, Ayşe Yılmaz, Mehmet Demir, Ali Can ve Deniz Çelik'in kayıtlarını döndürecektir.


COALESCE Kullanımı


Email adresi NULL olan çalışanlar için 'Email Yok' yazısını göstermek:



SELECT
    CalisanID,
    Ad,
    Soyad,
    COALESCE(Email, 'Email Yok') AS GosterilenEmail
FROM Calisanlar;

Bu sorgu, Mehmet Demir ve Elif Aksoy'un Email sütununda 'Email Yok' ifadesini gösterecektir.


Birden Fazla NULL Kontrolü


Hem Email hem de Telefon bilgisi NULL olan çalışanları bulmak:



SELECT CalisanID, Ad, Soyad, Email, Telefon
FROM Calisanlar
WHERE Email IS NULL AND Telefon IS NULL;

Bu sorgu, Elif Aksoy'un kaydını döndürecektir.


Önemli Notlar


  • NULL ve Sıfır/Boş String Farkı: NULL, matematiksel sıfırdan (0) veya boş karakter dizisinden ('') farklıdır. Bu değerler birer veri değeriyken, NULL bir değerin yokluğunu ifade eder. Karşılaştırmalarda bu farka dikkat edilmelidir.

  • Karşılaştırma Operatörleri: =, <>, != gibi standart karşılaştırma operatörlerini NULL değerlerle kullanmaktan kaçının. Bu operatörler NULL ile karşılaştırıldığında her zaman UNKNOWN döndürür ve beklenen sonucu vermez. Daima IS NULL veya IS NOT NULL kullanın.

  • Toplama Fonksiyonları ve NULL: COUNT(), SUM(), AVG() gibi toplama (aggregate) fonksiyonları genellikle NULL değerleri hesaplamalarına dahil etmez. Örneğin, AVG(SutunAdı), SutunAdı içindeki NULL değerleri göz ardı ederek ortalamayı hesaplar. Ancak COUNT(*), NULL değerleri de içeren tüm satırları sayar.

  • NOT IN ve NULL: NOT IN operatörü ile NULL değerleri kullanırken dikkatli olun. Eğer NOT IN listesinde bir NULL değer varsa, sorgu beklenmedik şekilde hiçbir sonuç döndürmeyebilir çünkü NULL ile yapılan herhangi bir karşılaştırma UNKNOWN sonucunu verir. Örneğin, SELECT * FROM Tablo WHERE Deger NOT IN (1, 2, NULL); sorgusu UNKNOWN nedeniyle sorunlara yol açabilir.

  • Veritabanı Tasarımı: Tablo oluştururken bir sütunun NULL değer kabul edip etmeyeceğini NULL veya NOT NULL kısıtlamaları ile belirleyebilirsiniz. NOT NULL kısıtlaması, o sütunun her zaman bir değer içermesini sağlar ve veri bütünlüğünü artırır.

8
0
PHP Dilinde Hata ve İstisna Yönetimi

PHP dilinde hata ve istisna yönetimi, uygulamaların beklenmedik durumlarla nasıl başa çıktığını belirleyen kritik bir konudur. Etkili hata yönetimi, uygulamanın kararlılığını artırır, kullanıcı deneyimini iyileştirir ve hata ayıklama süreçlerini önemli ölçüde kolaylaştırır. PHP, hem geleneksel hata işleme yaklaşımları hem de modern istisna mekanizmaları sunarak geliştiricilere esneklik sağlar.

Temel Sözdizimi


PHP'de hata ve istisna yönetimi, genellikle iki ana mekanizma etrafında şekillenir:

  • İstisna Yönetimi: Potansiyel olarak hata oluşturabilecek kod bloklarını sarmalamak ve bu bloklarda fırlatılan istisnaları yakalamak için try...catch...finally yapıları kullanılır. Özel durumları belirtmek için throw ifadesiyle istisnalar fırlatılabilir.

  • Geleneksel Hata İşleme: PHP'nin eski sürümünden gelen ve E_NOTICE, E_WARNING gibi hata seviyelerini içeren hatalar için set_error_handler() fonksiyonu ile özel hata işleyicileri tanımlanabilir.

Detaylı Açıklama


PHP'nin hata ve istisna yönetimi yapıları aşağıdaki bileşenlerden oluşur:

  • try Bloğu: İstisna fırlatma potansiyeli olan kodun yerleştirildiği bloktur. Bu blok içindeki herhangi bir istisna fırlatıldığında, normal akış durur ve uygun catch bloğu aranır.

  • catch Bloğu: Bir try bloğu içinde fırlatılan belirli bir türdeki istisnayı yakalamak için kullanılır. catch bloğu, yakalanan istisnayı parametre olarak alır ve bu istisna üzerinde işlem yapılmasına olanak tanır. PHP 7'den itibaren birden fazla catch bloğu tanımlanabilir ve bir catch bloğu birden fazla istisna türünü | operatörü ile yakalayabilir.

  • finally Bloğu (PHP 5.5+): İster bir istisna fırlatılsın ister fırlatılmasın, try ve catch bloklarından sonra her durumda çalıştırılması garanti edilen kod bloğudur. Bu genellikle kaynakların serbest bırakılması veya temizlik işlemleri için kullanılır.

  • throw İfadesi: Manuel olarak bir istisna nesnesi fırlatmak için kullanılır. Genellikle bir koşul sağlanmadığında veya beklenmedik bir durum oluştuğunda programın akışını kontrol altına almak için tercih edilir.

  • set_error_handler(callable $handler, int $error_types = E_ALL | E_STRICT): PHP'nin varsayılan hata işleyicisini özel bir fonksiyonla değiştirmeye yarar. Bu fonksiyon, E_ERROR dışındaki tüm hata türlerini (E_WARNING, E_NOTICE vb.) yakalayabilir. Fonksiyon, hata kodu, hata mesajı, dosya adı ve satır numarası gibi parametreler alır.

  • restore_error_handler(): Daha önce set_error_handler() ile değiştirilmiş olan hata işleyiciyi PHP'nin varsayılan işleyicisine geri döndürür.

  • error_reporting(int $level): Hangi hata seviyelerinin raporlanacağını belirler. Geliştirme ortamında genellikle tüm hatalar raporlanırken (E_ALL), üretim ortamında daha düşük seviyeli hatalar gizlenir.

  • display_errors ve log_errors: PHP'nin php.ini dosyasında veya çalışma zamanında ayarlanabilen bu yönergeler, hataların tarayıcı çıktısında gösterilip gösterilmeyeceğini ve hata günlüklerine yazılıp yazılmayacağını kontrol eder.

Pratik Kullanım Örnekleri


Aşağıdaki örnekler, PHP'de hata ve istisna yönetiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.

1. Temel try...catch Kullanımı

"; // Çalışır
    echo bolmeIslemi(10, 0) . "
"; // İstisna fırlatır echo "Bu satır çalışmayacak.
"; } catch (Exception $e) { echo "Hata yakalandı: " . $e->getMessage() . "
"; } ?>

2. Özel İstisna Sınıfı Tanımlama ve Kullanımı

getMessage() . " (Kod: " . $this->getCode() . ")";
    }
}

function veritabaninaBaglan() {
    // Bağlantı denemesi yapıldığı varsayılsın
    $basarili = false; // Bağlantının başarısız olduğunu simüle edelim

    if (!$basarili) {
        throw new VeritabaniBaglantiHatasi("Veritabanı sunucusuna ulaşılamıyor.");
    }
    return "Bağlantı başarılı!";
}

try {
    echo veritabaninaBaglan() . "
"; } catch (VeritabaniBaglantiHatasi $e) { echo $e->hataMesaji() . "
"; } catch (Exception $e) { // Genel istisnaları yakalamak için echo "Genel bir hata oluştu: " . $e->getMessage() . "
"; } ?>

3. finally Bloğu Kullanımı

";
        // Dosya okuma işlemleri...
    } catch (Exception $e) {
        echo "Hata: " . $e->getMessage() . "
"; } finally { if ($dosyaKaynagi) { fclose($dosyaKaynagi); echo "Dosya kapatıldı.
"; } else { echo "Dosya zaten açık değildi veya açma başarısız oldu.
"; } } } dosyaIslemi("olmayan_dosya.txt"); dosyaIslemi("varolan_dosya.txt"); // Bu dosyayı manuel olarak oluşturmanız gerekebilir ?>

4. set_error_handler() ile Geleneksel Hata Yakalama

Özel Hata: [$errno] $errstr - $errfile:$errline
"; // Hata günlüğüne yazma error_log("Özel Hata [$errno]: $errstr - $errfile:$errline"); // TRUE döndürmek, PHP'nin dahili hata işleyicisinin çalışmasını engeller. return true; } // Özel hata işleyiciyi ayarla set_error_handler("ozelHataIsleyici"); // E_WARNING seviyesinde bir hata oluştur echo $tanimsizDegisken; // E_NOTICE veya E_WARNING oluşturabilir // E_NOTICE seviyesinde bir hata oluştur $dizi = []; echo $dizi[0]; // Özel hata işleyiciyi eski haline getir restore_error_handler(); // Bu hata artık varsayılan işleyici tarafından ele alınır (veya gizlenir) trigger_error("Bu hata artık eski işleyiciye döner.", E_USER_WARNING); ?>

Önemli Notlar


  • Throwable Arayüzü (PHP 7+): PHP 7'den itibaren hem Error (dahili PHP hataları) hem de Exception (kullanıcı tanımlı ve standart istisnalar) sınıfları Throwable arayüzünü uygular. Bu sayede catch (Throwable $e) kullanarak tüm yakalanabilir hataları ve istisnaları tek bir blokta ele alabilirsiniz.

  • Hata Seviyeleri: PHP, E_ERROR, E_WARNING, E_NOTICE, E_PARSE gibi birçok hata seviyesi tanımlar. Uygulamanızın davranışını ve hata raporlama düzeyini bu seviyeleri kullanarak kontrol etmek önemlidir.

  • Üretim Ortamında Hata Gösterimi: Üretim ortamında display_errors ayarının Off (kapalı) olduğundan emin olun. Hataların doğrudan kullanıcıya gösterilmesi güvenlik zafiyetlerine yol açabilir. Bunun yerine, log_errors ayarını On (açık) yaparak hataları güvenli bir günlük dosyasına yazdırın.

  • Hata Günlükleme: error_log() fonksiyonu, hataları PHP'nin yapılandırılmış günlük dosyasına veya belirtilen bir hedefe yazmak için kullanılabilir. Özel hata işleyicileriniz içinde bu fonksiyonu kullanarak detaylı hata kayıtları tutmanız önerilir.

  • İstisna Hiyerarşisi: Birden fazla catch bloğu kullanırken, istisnaları en spesifikten en genele doğru sıralayın. Örneğin, özel bir istisna sınıfını (VeritabaniBaglantiHatasi) genel bir Exception sınıfından önce yakalayın.

  • Boş catch Bloklarından Kaçının: Bir istisnayı yakalayıp hiçbir işlem yapmamak (boş catch bloğu), hatanın gözden kaçmasına ve uygulamanın beklenmedik şekillerde davranmasına neden olabilir. Her zaman yakalanan istisnaları günlüğe kaydedin veya uygun bir şekilde ele alın.

12
0
Matematikte Doğuştan Kötü Olmak Mümkün Mü? Bilimin Işığında Bir Bakış

Hepimizin hayatında en az bir kere duyduğu, belki de kendi kendine sorduğu bir soru var: "Ben matematikte doğuştan kötüyüm, değil mi?" Bu cümle, genellikle matematiğe karşı hissedilen bir çaresizliğin, bir kabullenişin ifadesidir. Ancak bir SEO yazarı ve gazeteci olarak, bu konuda edindiğim bilgilerle size bambaşka bir pencere açmak istiyorum. Gerçekten de bazı insanlar matematikte doğuştan mı başarısızdır, yoksa bu sadece yaygın bir yanılsama mı?


Gelin, bu konuyu bilimsel veriler, uzman görüşleri ve psikolojinin ışığında derinlemesine inceleyelim. Çünkü matematik, sandığımızdan çok daha esnek, öğrenilebilir ve herkesin erişebileceği bir alandır.


"Matematik Beyni" Efsanesi: Gerçek mi, Mit mi?


Toplumda sıkça karşılaştığımız bir inanç vardır: Bazı insanların "matematik beyni" ile doğduğu, bazılarının ise bu yetenekten yoksun olduğu. Bu durum, genellikle çocukluktan itibaren "sayısalcı" veya "sözelci" gibi etiketlemelerle pekiştirilir. Ancak modern bilim, bu katı ayrımın pek de doğru olmadığını gösteriyor. Beynimiz, düşündüğümüzden çok daha esnektir ve hayat boyu öğrenmeye açıktır.


Araştırmalar, matematiğin sadece sol beynin işi olmadığını, aslında beynin birçok farklı bölgesinin etkileşim içinde çalıştığını ortaya koyuyor. Mantık, problem çözme, uzamsal düşünme, hatta yaratıcılık bile matematiksel süreçlerde rol oynar. Yani, "matematik beyni" diye tekil bir yapıdan bahsetmek yerine, matematiksel düşünmenin karmaşık ve çok yönlü bir beceri olduğunu anlamak daha doğru olacaktır.


Zihin Yapısının Gücü: Sabit mi, Gelişebilir mi?


Stanford Üniversitesi'nden psikolog Carol Dweck'in çalışmaları, "zihin yapısı" kavramının öğrenme üzerindeki etkisini çarpıcı bir şekilde ortaya koymuştur. Dweck, iki ana zihin yapısından bahseder:


  • Sabit Zihin Yapısı (Fixed Mindset): Bireylerin yeteneklerinin doğuştan geldiğine ve değiştirilemez olduğuna inandığı durumdur. "Matematikte kötüyüm, çünkü bu benim kaderim" düşüncesi bu kategoriye girer. Bu inanca sahip kişiler, zorluklarla karşılaştıklarında kolayca pes etme eğilimindedirler.

  • Büyüme Zihin Yapısı (Growth Mindset): Bireylerin yeteneklerinin çaba, pratik ve doğru stratejilerle geliştirilebileceğine inandığı durumdur. "Matematikte şu an zorlanıyorum, ama daha çok çalışarak ve farklı yöntemler deneyerek öğrenebilirim" düşüncesi bu zihin yapısının temelidir. Bu kişiler, hataları öğrenme fırsatı olarak görür ve azimle yola devam ederler.


Matematikteki başarısızlığın büyük bir kısmı, aslında sabit zihin yapısının bir sonucudur. Eğer kendimize "yapamam" dersek, beynimiz de bu inancı pekiştirir ve gerçekten yapamayız. Oysa büyüme zihin yapısını benimsemek, matematiksel potansiyelimizi ortaya çıkarmanın ilk ve en önemli adımıdır.


Eğitim Metotlarının Rolü: Her Öğrenciye Uygun Bir Yol Var mı?


Matematik öğrenme deneyimimiz, büyük ölçüde bize nasıl öğretildiğiyle de şekillenir. Geleneksel ezbere dayalı, formül odaklı öğretim yöntemleri, birçok öğrencinin matematiğin soyut dünyasında kaybolmasına neden olabilir. Oysa modern eğitim yaklaşımları, matematiği daha somut, anlamlı ve etkileşimli hale getirmeyi hedefler.


Öğretmenlerin sabrı, konuyu farklı açılardan açıklama yeteneği ve öğrencilerin bireysel öğrenme stillerine dikkat etmesi, matematik başarısı üzerinde kritik bir etkiye sahiptir. Bazı öğrenciler görsel öğrenirken, bazıları işitsel, bazıları ise yaparak-yaşayarak öğrenir. Tek tip bir öğretim metodunun herkes için geçerli olmadığını anlamak, matematik eğitiminde devrim niteliğinde bir adımdır.


Matematik Kaygısı: Görünmez Bir Engel


Matematik kaygısı, birçok insanın matematiksel görevler karşısında hissettiği gerginlik, endişe ve korku durumudur. Bu kaygı, sınav anında zihnin donmasına, basit hatalar yapmaya ve hatta matematiksel kavramları anlama yeteneğinin körelmesine neden olabilir. Matematik kaygısı, genellikle geçmişteki olumsuz deneyimler, öğretmenin veya ebeveynlerin olumsuz yaklaşımları veya toplumsal baskılar sonucunda ortaya çıkar.


İlginçtir ki, matematik kaygısı yaşayan bireylerin çoğu, aslında matematiksel yetenekten yoksun değildir. Aksine, zeki ve potansiyeli yüksek öğrencilerde bile görülebilir. Kaygı, bilişsel kaynakları tüketerek problem çözme becerisini engeller. Bu durum, "matematikte kötüyüm" algısını pekiştiren bir kısır döngü yaratır.


Ailenin ve Çevrenin Etkisi: "Ben de Matematikte İyi Değildim"


Ebeveynlerin veya çevrenin matematiğe karşı tutumu, çocukların matematiğe bakış açısını derinden etkiler. "Ben de matematikte iyi değildim zaten" gibi ifadeler, farkında olmadan çocuklara matematiğin zor ve başa çıkılamaz bir ders olduğu mesajını verir. Bu tür olumsuz mesajlar, çocukların matematiğe karşı önyargılı yaklaşmasına ve daha başlamadan pes etmesine neden olabilir.


Araştırmalar, ebeveynlerin çocuklarının matematik ödevlerine yardımcı olurken gösterdikleri kaygının bile çocuklara geçebileceğini gösteriyor. Destekleyici, olumlu ve sabırlı bir çevre, matematik öğreniminde mucizeler yaratabilir.


Diskaluli: Gerçek Bir Öğrenme Güçlüğü (Ancak Nadir)


Yukarıda bahsettiğimiz tüm faktörler, matematiksel başarısızlığın büyük bir kısmını açıklasa da, çok nadir de olsa gerçek bir öğrenme güçlüğü olan "diskalkuli"den bahsetmek gerekir. Diskaluli, matematiksel kavramları anlama, sayıları işleme ve aritmetik işlemleri yapmada ciddi ve kalıcı zorluklarla karakterize edilen nörolojik bir durumdur.


Diskaluli tanısı konmuş bireyler, temel sayı hissi (number sense) ve matematiksel muhakeme yeteneğinde belirgin eksiklikler yaşarlar. Ancak unutulmamalıdır ki, diskalkuli matematiksel zorluk yaşayan nüfusun çok küçük bir yüzdesini oluşturur. Matematikte zorlanan çoğu kişi, diskalkuli değil, yukarıda saydığımız öğrenme, zihin yapısı veya kaygı temelli sorunlar yaşamaktadır. Doğru destek ve stratejilerle bu zorlukların üstesinden gelmek mümkündür.


Pratik ve Tekrarın Önemi: Bir Kas Gibi Gelişen Beyin


Matematik de bir dil öğrenmek veya bir enstrüman çalmak gibidir. Düzenli pratik, tekrar ve sabır gerektirir. İlk başta zor gelen kavramlar, üzerine gidildikçe, farklı örneklerle tekrarlandıkça zihnimizde yer edinir ve kalıcı hale gelir.


Beynimizdeki sinir ağları, yeni bilgiler öğrendikçe güçlenir ve yeni bağlantılar kurar. Bu duruma nöroplastisite denir. Yani, matematiksel beceriler, tıpkı bir kas gibi, kullanıldıkça ve zorlandıkça gelişir. Yanlış yapmak, öğrenme sürecinin doğal bir parçasıdır. Önemli olan, yanlışlardan ders çıkarıp denemeye devam etmektir.


Ne Yapmalı? Matematikle Barışmanın Yolları


Eğer siz de kendinizi "matematikte kötüyüm" diyenlerden biri olarak görüyorsanız, umutsuzluğa kapılmayın. İşte size birkaç öneri:


  • Zihin Yapınızı Değiştirin: Sabit zihin yapısından büyüme zihin yapısına geçmeye çalışın. "Yapamam" yerine "Henüz yapamıyorum, ama öğrenebilirim" deyin.

  • Küçük Adımlarla Başlayın: Kendinizi bunaltacak büyük hedefler koymak yerine, temel kavramları anlamaya odaklanın. Küçük başarılar, motivasyonunuzu artıracaktır.

  • Yardım Almaktan Çekinmeyin: Anlamadığınız bir konu olduğunda öğretmenlerinizden, arkadaşlarınızdan veya özel ders verenlerden yardım isteyin. Utanmak yerine, meraklı olun.

  • Farklı Kaynakları Deneyin: Sadece ders kitabıyla sınırlı kalmayın. İnternetteki eğitim videoları, interaktif uygulamalar veya farklı anlatım tarzına sahip kitaplar size yeni kapılar açabilir.

  • Matematikle Aranızdaki Kaygıyı Azaltın: Meditasyon, derin nefes alma egzersizleri gibi tekniklerle sınav kaygınızı yönetmeyi öğrenin. Başarıya giden yolda sakin bir zihin şarttır.

  • Pratik Yapın, Tekrar Edin: Düzenli olarak problem çözün. Başarısız olsanız bile, bu bir öğrenme fırsatıdır. Yanlışlarınızdan ders çıkarın.

  • Matematiğin Günlük Hayattaki Yerini Görün: Matematik sadece formüllerden ibaret değildir. Mutfakta, alışverişte, spor yaparken veya oyun oynarken bile matematikle iç içeyiz. Bu bağlantıları görmek, matematiği daha anlamlı hale getirecektir.


Sonuç olarak, "matematikte doğuştan kötü olmak" kavramı, modern bilimin ve psikolojinin ışığında geçerliliğini büyük ölçüde yitirmiştir. Yeteneklerimiz sabit değildir; zihin yapımız, aldığımız eğitim, yaşadığımız kaygılar ve çevremizin etkisiyle şekillenir. Matematik, tıpkı diğer tüm beceriler gibi, çaba, doğru stratejiler ve inançla geliştirilebilir bir alandır. Kendinize bu şansı verin ve matematiğin büyülü dünyasını yeniden keşfedin!


11
0
JavaScript Dilinde JS Sets Kullanımı

JavaScript'te Setler, benzersiz değerlerden oluşan bir koleksiyonu depolamak için kullanılan özel bir nesne türüdür.
Bu veri yapısı, tekrar eden öğelerin otomatik olarak elenmesini sağlayarak veri yönetimi ve manipülasyonunda önemli avantajlar sunar.
Bu makale, JavaScript Setlerinin temel kullanımını, sözdizimini ve pratik uygulamalarını detaylı bir şekilde açıklayacaktır.


Sözdizimi


Bir Set oluşturmak için new Set() kurucusu kullanılır.
Değerler, Set'in kurucusuna bir iterable (örneğin bir dizi) olarak geçirilebilir veya daha sonra add() metodu ile eklenebilir.


// Boş bir Set oluşturma
const mySet = new Set();

// Başlangıç değerleri ile Set oluşturma
const initialSet = new Set([1, 2, 3, 2, 4]); // initialSet: {1, 2, 3, 4}

// Metotlar
mySet.add(value);      // Bir değer ekler
mySet.delete(value);   // Bir değeri siler
mySet.has(value);      // Bir değerin varlığını kontrol eder
mySet.clear();         // Set'teki tüm öğeleri siler
mySet.size;            // Set'teki öğe sayısını döndürür

Detaylı Açıklama


  • new Set([iterable]): Yeni bir Set nesnesi oluşturur. İsteğe bağlı olarak, iterable bir nesne (örneğin bir dizi) alabilir. Bu iterable içindeki tüm öğeler Set'e eklenir. Tekrar eden değerler otomatik olarak göz ardı edilir.

  • Set.prototype.add(value): Set'e yeni bir değer ekler. Eğer değer zaten Set'te mevcutsa, Set değişmez. Zincirleme çağrılara izin vermek için Set nesnesini döndürür.

  • Set.prototype.delete(value): Set'ten belirli bir değeri siler. Eğer değer Set'te mevcutsa true, aksi takdirde false döndürür.

  • Set.prototype.has(value): Belirli bir değerin Set'te olup olmadığını kontrol eder. Varsa true, yoksa false döndürür.

  • Set.prototype.clear(): Set'teki tüm öğeleri siler ve Set'i boşaltır.

  • Set.prototype.size: Set'teki benzersiz öğelerin sayısını döndüren bir erişimci özelliğidir.

  • Set.prototype.forEach(callbackFn[, thisArg]): Set'teki her öğe için bir callback fonksiyonu yürütür. Dizilerdeki forEach metoduna benzer.

  • Set.prototype.values(), Set.prototype.keys(), Set.prototype.entries(): Set'teki değerleri, anahtarları (Set'lerde anahtarlar ve değerler aynıdır) veya anahtar/değer çiftlerini ([value, value] formatında) içeren yeni bir Iterator nesnesi döndürür.

Pratik Kullanım Örnekleri


Aşağıdaki örnekler, JavaScript Setlerinin çeşitli kullanım senaryolarını göstermektedir.


1. Benzersiz Öğeleri Toplama


Bir dizideki yinelenen öğeleri kaldırmak ve yalnızca benzersiz değerleri elde etmek için Setleri kullanmak oldukça etkilidir.


const numbers = [1, 2, 3, 4, 2, 1, 5, 6, 3];
const uniqueNumbers = new Set(numbers);

console.log(uniqueNumbers); // Set(6) {1, 2, 3, 4, 5, 6}

// Set'i tekrar bir diziye dönüştürme
const uniqueNumbersArray = [...uniqueNumbers];
console.log(uniqueNumbersArray); // [1, 2, 3, 4, 5, 6]

2. Öğelerin Varlığını Kontrol Etme


Bir öğenin bir koleksiyonda olup olmadığını hızlıca kontrol etmek için has() metodunu kullanabilirsiniz.


const fruits = new Set(['elma', 'armut', 'muz']);

console.log(fruits.has('elma'));   // true
console.log(fruits.has('çilek'));  // false

fruits.add('çilek');
console.log(fruits.has('çilek'));  // true

3. Set Üzerinde İterasyon


Set öğeleri üzerinde döngü yapmak için forEach() metodunu veya for...of döngüsünü kullanabilirsiniz.


const colors = new Set(['kırmızı', 'mavi', 'yeşil']);

// forEach ile iterasyon
colors.forEach(color => {
    console.log(color);
});
// Çıktı:
// kırmızı
// mavi
// yeşil

// for...of ile iterasyon
for (const color of colors) {
    console.log(color);
}
// Çıktı:
// kırmızı
// mavi
// yeşil

Önemli Notlar


  • Değer Karşılaştırması: Setler, değerleri karşılaştırırken aynı algoritmayı kullanır. Bu, NaN değerlerinin Set içinde benzersiz olarak ele alındığı anlamına gelir (NaN === NaN false olmasına rağmen, Set içinde sadece bir adet NaN bulunabilir). Obje referansları için, farklı referanslara sahip aynı içeriğe sahip objeler farklı kabul edilir.

  • Sırasız Yapı: Setler, öğeleri eklenme sırasına göre depolasa da, Setin birincil amacı benzersiz öğeleri tutmaktır, belirli bir sırayı garanti etmek değildir. Bazı durumlarda iterasyon sırası ekleme sırasına denk gelebilir, ancak buna güvenilmemelidir.

  • Performans: Bir öğenin Set'te varlığını kontrol etmek (has() metodu) genellikle O(1) zaman karmaşıklığına sahiptir, bu da büyük veri kümeleri için dizilerdeki aramalara göre daha verimli olabilir.

  • Zayıf Referanslar: Eğer objeler için zayıf referanslara ihtiyacınız varsa (yani objeye başka referans kalmadığında otomatik olarak belleğin serbest bırakılmasını istiyorsanız), WeakSet kullanmanız gerekebilir. Ancak WeakSet sadece objeleri depolayabilir ve iterable değildir.

  • Anahtar-Değer Çiftleri İçin Setler: Eğer benzersiz anahtar-değer çiftleri depolamanız gerekiyorsa, Map nesnesi daha uygun bir seçenek olabilir.

8
0
SQL Dilinde SQL UPDATE Kullanımı: Veri Güncelleme Rehberi

Veritabanı yönetim sistemlerinde (DBMS) mevcut kayıtların üzerinde değişiklik yapmak, veri bütünlüğünü sağlamak ve dinamik uygulamalar geliştirmek için temel bir gerekliliktir. SQL (Yapısal Sorgu Dili) bu ihtiyacı karşılamak üzere güçlü bir komut olan UPDATE ifadesini sunar. Bu makale, SQL UPDATE komutunun sözdizimini, kullanımını ve pratik örneklerini detaylı bir şekilde ele alarak, veritabanlarınızdaki bilgileri güvenli ve etkili bir şekilde nasıl güncelleyeceğinizi açıklamaktadır.


Sözdizimi


SQL UPDATE komutunun temel yapısı aşağıdaki gibidir:


UPDATE tablo_adı
SET sütun1 = değer1, sütun2 = değer2, ...
WHERE koşul;

Yukarıdaki sözdizimi, belirli bir tablodaki bir veya daha fazla satırın bir veya daha fazla sütunundaki verileri değiştirmek için kullanılır.


Detaylı Açıklama


  • UPDATE tablo_adı: Güncellemek istediğiniz tablonun adını belirtir. Bu kısım, işlemin hangi veritabanı nesnesi üzerinde yapılacağını tanımlar.

  • SET sütun1 = değer1, sütun2 = değer2, ...: Güncellenecek sütunları ve bu sütunlara atanacak yeni değerleri belirtir. Birden fazla sütunu güncellemek için sütun-değer çiftleri virgüllerle ayrılır. Atanan değerler sabit bir değer, başka bir sütunun değeri, bir ifade veya bir alt sorgunun sonucu olabilir.

  • WHERE koşul: Bu anahtar kelime ve ardından gelen koşul, hangi satırların güncelleneceğini belirler. Yalnızca belirtilen koşulu sağlayan satırlar güncellenir. Eğer WHERE koşulu kullanılmazsa, tablodaki tüm satırlar SET ifadesinde belirtilen değerlerle güncellenir. Bu, genellikle istenmeyen ve dikkatli olunması gereken bir durumdur.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, UPDATE komutunun farklı senaryolarda nasıl kullanılabileceğini göstermektedir. Örneklerde Müşteriler ve Ürünler adında iki tablo varsayılmaktadır.


Örnek 1: Tek Bir Sütunu Güncelleme


Belirli bir müşteri ID'sine sahip müşterinin e-posta adresini güncelleyelim:


UPDATE Müşteriler
SET E_posta = 'yeni.eposta@example.com'
WHERE MüşteriID = 101;

Bu sorgu, MüşteriID'si 101 olan kaydın E_posta sütununu yeni.eposta@example.com olarak değiştirir.


Örnek 2: Birden Fazla Sütunu Güncelleme


Belirli bir ürünün fiyatını ve stok miktarını aynı anda güncelleyelim:


UPDATE Ürünler
SET Fiyat = 29.99, StokMiktarı = 150
WHERE ÜrünID = 205;

ÜrünID'si 205 olan ürünün hem Fiyat hem de StokMiktarı sütunları güncellenir.


Örnek 3: Koşula Bağlı Olarak Değerleri Artırma veya Azaltma


Belirli bir kategorideki tüm ürünlerin fiyatını %10 artıralım:


UPDATE Ürünler
SET Fiyat = Fiyat * 1.10
WHERE Kategori = 'Elektronik';

Bu örnek, mevcut Fiyat değerini kullanarak yeni bir değer hesaplar ve atar.


Örnek 4: Tüm Satırları Güncelleme (Dikkatli Kullanın!)


Eğer WHERE koşulu kullanılmazsa, tablodaki tüm satırlar güncellenir. Örneğin, tüm ürünlerin durumunu 'Pasif' olarak ayarlamak için:


UPDATE Ürünler
SET Durum = 'Pasif';

Bu sorgu, Ürünler tablosundaki her ürünün Durum sütununu 'Pasif' olarak ayarlar. Bu tür bir işlem yapmadan önce daima veritabanı yedeği almanız ve işlemin etkilerini tam olarak anladığınızdan emin olmanız şiddetle tavsiye edilir.


Önemli Notlar


  • WHERE koşulunun gücü ve tehlikesi: WHERE koşulu olmadan yapılan bir UPDATE işlemi, tablonuzdaki tüm verileri geri dönülemez bir şekilde değiştirebilir. Her zaman önce SELECT sorgusu ile güncellenecek satırları kontrol edin.

  • TRANSACTION kullanımı: Büyük veya kritik UPDATE işlemleri yaparken BEGIN TRANSACTION, COMMIT ve ROLLBACK komutlarını kullanmak iyi bir uygulamadır. Bu, bir hata durumunda değişiklikleri geri almanıza olanak tanır.

  • Yedekleme: Herhangi bir büyük veri değişikliği yapmadan önce daima veritabanınızın yedeğini alın. Bu, beklenmedik sorunlar karşısında verilerinizi kurtarmanızı sağlar.

  • Performans: Çok büyük tablolarda UPDATE işlemleri performans sorunlarına yol açabilir. İndekslerin doğru kullanılması ve işlem büyüklüğünün optimize edilmesi önemlidir.

  • SQL Injection: Kullanıcı girdileri ile dinamik UPDATE sorguları oluştururken SQL Injection saldırılarına karşı dikkatli olun. Güvenli parametreli sorgular (prepared statements) kullanmak bu tür riskleri azaltır.

15
0
Python Dilinde Python Lists Kullanımı

Python programlama dilinde listeler, birden fazla öğeyi tek bir değişken altında depolamak için kullanılan temel ve çok yönlü veri yapılarından biridir. Sıralı, değiştirilebilir (mutable) ve farklı veri tiplerindeki öğeleri barındırabilen koleksiyonlardır. Veri yönetimi, algoritma geliştirme ve birçok programlama görevinde kritik bir rol oynarlar. Bu kılavuz, Python listelerinin oluşturulmasından karmaşık manipülasyonlarına kadar tüm yönlerini adım adım ele alacaktır.


Sözdizimi


Python'da bir liste, köşeli parantezler [] içine virgülle ayrılmış öğeler yerleştirilerek oluşturulur.


liste_adi = [eleman1, eleman2, eleman3, ...]

Detaylı Açıklama


  • liste_adi: Oluşturulan listeyi referans alan değişkendir. Geçerli bir Python tanımlayıcısı olmalıdır.

  • =: Atama operatörüdür. Sağdaki liste değerini soldaki değişkene atar.

  • []: Köşeli parantezler, bir liste veri yapısının başlangıcını ve sonunu işaret eder. Python yorumlayıcısı, bu parantezlerin içindeki öğeleri bir liste olarak tanır.

  • eleman1, eleman2, eleman3, ...: Listede saklanacak öğelerdir. Bu öğeler, tam sayılar, ondalık sayılar, dizeler, boolean değerler, hatta başka listeler veya özel nesneler dahil olmak üzere herhangi bir Python veri tipinde olabilir. Öğeler birbirlerinden virgül , ile ayrılır.

Listeler sıralıdır, yani öğelerin eklenme sırası korunur ve bir dizin (index) numarası ile erişilebilirler. İlk öğenin dizini 0'dır. Ayrıca, listeler değiştirilebilirdir, yani oluşturulduktan sonra öğeleri eklenebilir, çıkarılabilir veya güncellenebilir.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, Python listelerinin temel kullanım senaryolarını göstermektedir.


1. Liste Oluşturma


Boş bir liste veya farklı veri tiplerini içeren bir liste oluşturabilirsiniz.


# Boş bir liste oluşturma
bos_liste = []
print(f"Boş Liste: {bos_liste}")

# Tam sayılar içeren bir liste
sayilar = [1, 2, 3, 4, 5]
print(f"Sayılar Listesi: {sayilar}")

# Dizeler içeren bir liste
meyveler = ["elma", "armut", "kiraz"]
print(f"Meyveler Listesi: {meyveler}")

# Farklı veri tiplerini içeren bir liste
karisik_liste = [10, "Python", True, 3.14]
print(f"Karışık Liste: {karisik_liste}")

# İç içe liste (nested list)
ic_ice_liste = [[1, 2], ["a", "b"]]
print(f"İç İçe Liste: {ic_ice_liste}")

2. Listeye Erişim


Listelerdeki öğelere dizin numaraları (index) kullanılarak erişilir. Dizinler 0'dan başlar. Negatif dizinler listenin sonundan itibaren saymaya başlar (-1 son öğeyi temsil eder).


my_list = ["a", "b", "c", "d", "e"]

# İlk öğeye erişim
print(f"İlk öğe: {my_list[0]}") # Çıktı: a

# Üçüncü öğeye erişim
print(f"Üçüncü öğe: {my_list[2]}") # Çıktı: c

# Son öğeye erişim (negatif dizin)
print(f"Son öğe: {my_list[-1]}") # Çıktı: e

# Sondan ikinci öğeye erişim
print(f"Sondan ikinci öğe: {my_list[-2]}") # Çıktı: d

3. Liste Öğelerini Değiştirme


Listeler değiştirilebilir olduğu için, belirli bir dizindeki öğeyi güncelleyebilirsiniz.


sayilar = [10, 20, 30, 40]
print(f"Orijinal liste: {sayilar}")

# İlk öğeyi değiştirme
sayilar[0] = 5
print(f"Değiştirilen ilk öğe sonrası: {sayilar}") # Çıktı: [5, 20, 30, 40]

# Son öğeyi değiştirme
sayilar[-1] = 50
print(f"Değiştirilen son öğe sonrası: {sayilar}") # Çıktı: [5, 20, 30, 50]

4. Listeye Eleman Ekleme


append() metodu listenin sonuna, insert() metodu ise belirtilen bir dizine öğe ekler.


meyveler = ["elma", "armut"]

# listenin sonuna öğe ekleme
meyveler.append("muz")
print(f"Append sonrası: {meyveler}") # Çıktı: ['elma', 'armut', 'muz']

# Belirli bir dizine öğe ekleme (dizin 1'e 'kiraz' ekle)
meyveler.insert(1, "kiraz")
print(f"Insert sonrası: {meyveler}") # Çıktı: ['elma', 'kiraz', 'armut', 'muz']

5. Listeden Eleman Çıkarma


remove() metodu belirtilen değeri, pop() metodu belirtilen dizindeki öğeyi (veya son öğeyi), del anahtar kelimesi ise belirtilen dizindeki öğeyi veya dilimi siler.


renkler = ["kırmızı", "yeşil", "mavi", "sarı"]

# Değere göre silme
renkler.remove("yeşil")
print(f"Remove 'yeşil' sonrası: {renkler}") # Çıktı: ['kırmızı', 'mavi', 'sarı']

# Dizin 1'deki öğeyi silme (pop varsayılan olarak son öğeyi siler)
silinen_renk = renkler.pop(1)
print(f"Pop sonrası: {renkler}, Silinen: {silinen_renk}") # Çıktı: ['kırmızı', 'sarı'], Silinen: mavi

# 'del' anahtar kelimesi ile dizin 0'daki öğeyi silme
del renkler[0]
print(f"Del sonrası: {renkler}") # Çıktı: ['sarı']

# Tüm listeyi silme
# del renkler
# print(renkler) # Hata verecektir, çünkü liste artık mevcut değil.

# Listeyi temizleme (içindeki tüm öğeleri siler, liste objesi kalır)
sayilar = [1, 2, 3]
sayilar.clear()
print(f"Clear sonrası: {sayilar}") # Çıktı: []

6. Liste Dilimleme (Slicing)


Listenin bir bölümünü (dilimini) almak için dilimleme işlemi kullanılır. Sözdizimi liste[baslangic:bitis:adim] şeklindedir.


alfabe = ["a", "b", "c", "d", "e", "f", "g"]

# İlk üç öğeyi al
print(f"İlk üç: {alfabe[0:3]}") # Çıktı: ['a', 'b', 'c']
print(f"İlk üç (kısa): {alfabe[:3]}") # Çıktı: ['a', 'b', 'c']

# İkinci dizinden sona kadar
print(f"İkinci dizinden sona: {alfabe[1:]}") # Çıktı: ['b', 'c', 'd', 'e', 'f', 'g']

# Üçüncü dizinden beşinci dizine kadar (beşinci dahil değil)
print(f"Üçüncüden beşe: {alfabe[2:5]}") # Çıktı: ['c', 'd', 'e']

# Tüm listeyi kopyalama
kopyalanmis_alfabe = alfabe[:]
print(f"Kopyalanmış: {kopyalanmis_alfabe}") # Çıktı: ['a', 'b', 'c', 'd', 'e', 'f', 'g']

# Her ikinci öğeyi al
print(f"Her ikinci: {alfabe[::2]}") # Çıktı: ['a', 'c', 'e', 'g']

# Listeyi ters çevir
print(f"Ters çevrilmiş: {alfabe[::-1]}") # Çıktı: ['g', 'f', 'e', 'd', 'c', 'b', 'a']

7. Temel Liste Operasyonları


Listeler üzerinde çeşitli temel operasyonlar gerçekleştirebilirsiniz.


liste1 = [1, 2, 3]
liste2 = [4, 5, 6]

# Listeleri birleştirme (concatenation)
birlesik_liste = liste1 + liste2
print(f"Birleşik liste: {birlesik_liste}") # Çıktı: [1, 2, 3, 4, 5, 6]

# Bir listeyi tekrarlama
tekrarlanan_liste = liste1 * 3
print(f"Tekrarlanan liste: {tekrarlanan_liste}") # Çıktı: [1, 2, 3, 1, 2, 3, 1, 2, 3]

# Liste uzunluğunu bulma
print(f"Liste1 uzunluğu: {len(liste1)}") # Çıktı: 3

# Bir öğenin listede olup olmadığını kontrol etme
print(f"2 listede mi? {'2' in liste1}") # Çıktı: False (int 2, str '2' değil)
print(f"2 listede mi? {2 in liste1}") # Çıktı: True
print(f"7 listede mi? {7 not in liste2}") # Çıktı: True

Önemli Notlar


  • Değiştirilebilirlik (Mutability): Listeler değiştirilebilir veri yapılarıdır. Bu, içeriklerinin oluşturulduktan sonra değiştirilebileceği anlamına gelir. Bu özellik, listelerin esnekliğini artırır ancak aynı zamanda dikkatli kullanılmasını gerektirir, özellikle liste kopyalama ve referans verme durumlarında.

  • Heterojen Öğeler: Bir Python listesi, farklı veri tiplerindeki (örneğin, tam sayı, dize, boolean, hatta başka bir liste) öğeleri aynı anda barındırabilir.

  • Sıralı Yapı ve Dizinleme: Listelerdeki öğeler belirli bir sırayı korur ve bu sıraya dizin numaraları (0'dan başlayarak) aracılığıyla erişilebilir. Dizin dışı bir öğeye erişim denemesi IndexError hatasına yol açar.

  • Kopyalama Davranışı: Bir listeyi basit bir atama (örneğin, yeni_liste = eski_liste) ile kopyalamak, yeni bir liste oluşturmaz, yalnızca orijinal listenin referansını kopyalar. Bu, her iki değişkenin de aynı listeyi işaret ettiği anlamına gelir. Bağımsız bir kopya oluşturmak için .copy() metodu veya dilimleme [:] kullanılmalıdır (örn. yeni_liste = eski_liste.copy()).

  • Yüksek Performanslı İşlemler: Büyük listelerde sık sık ekleme/çıkarma işlemleri yapılıyorsa, performans sorunları yaşanabilir. Bu tür senaryolarda, collections.deque gibi alternatif veri yapıları daha uygun olabilir.

8
0
PHP Dilinde İstisnalar (Exceptions) Kullanımı

PHP programlamada, bir uygulamanın çalışma zamanında beklenmedik durumlarla karşılaşması yaygın bir senaryodur. Bu tür durumlar, programın normal akışını bozarak hatalara veya istenmeyen davranışlara yol açabilir. PHP'de bu tür durumları zarif ve kontrollü bir şekilde yönetmek için istisnalar (exceptions) mekanizması kullanılır. İstisnalar, hata koşullarını temsil eden nesnelerdir ve programın hatayı yakalamasına, işlemesine ve uygun bir yanıt vermesine olanak tanır. Bu kılavuz, PHP dilinde istisnaların temel sözdizimini, detaylı kullanımını ve pratik örneklerini adım adım açıklamaktadır.


Temel Sözdizimi


PHP'de istisna yönetimi, try, catch ve isteğe bağlı olarak finally blokları kullanılarak gerçekleştirilir. Bu yapı, potansiyel olarak istisna fırlatabilecek kodun yürütülmesini izlemek ve fırlatılan istisnaları ele almak için tasarlanmıştır.


Detaylı Açıklama


İstisna yönetimi yapısının her bir bileşeni belirli bir amaca hizmet eder:


  • try Bloğu: Potansiyel olarak bir istisna fırlatabilecek kodun bulunduğu alandır. Program bu blok içindeki kodun yürütülmesini izler. Eğer try bloğu içinde bir istisna fırlatılırsa, PHP normal akışı durdurur ve fırlatılan istisnayı yakalayabilecek uygun bir catch bloğu arar.

  • catch Bloğu: Bir try bloğunda fırlatılan istisnaları yakalamak ve işlemek için kullanılır. Her catch bloğu, yakalamak istediği istisna tipini (sınıfını) belirtir. PHP, fırlatılan istisna nesnesinin tipiyle eşleşen ilk catch bloğunu yürütür. Bir istisna yakalandığında, catch bloğu içindeki kod çalıştırılır ve bu, hatanın ele alınmasını sağlar. Birden fazla catch bloğu kullanarak farklı istisna tiplerini ayrı ayrı ele alabilirsiniz.

  • finally Bloğu: PHP 5.5'ten itibaren kullanılabilen bu blok, try ve catch blokları tamamlandıktan sonra, bir istisna fırlatılsın veya fırlatılmasın, her zaman yürütülecek kodu içerir. Bu, veritabanı bağlantılarını kapatma, dosya tanıtıcılarını serbest bırakma gibi temizleme (cleanup) işlemleri için son derece kullanışlıdır ve kaynak sızıntılarını önlemeye yardımcı olur.

  • throw Anahtar Kelimesi: Bir istisna fırlatmak için kullanılır. Bir Exception sınıfının veya ondan türetilmiş bir sınıfın nesnesiyle birlikte kullanılır. Örneğin: throw new Exception("Hata mesajı");

  • Exception Sınıfı: PHP'de tüm yerleşik ve özel istisnaların türediği temel sınıftır. Kendi özel istisna sınıflarınızı oluştururken genellikle bu sınıftan türetirsiniz.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, istisna yönetiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.


Örnek 1: Temel İstisna Yakalama


";
    echo bolmeIslemi(5, 0) . "
"; // Bu satırda istisna fırlatılacak echo bolmeIslemi(20, 4) . "
"; // Bu satır çalışmayacak } catch (Exception $e) { echo "Hata yakalandı: " . $e->getMessage() . "
"; } echo "Program devam ediyor.
"; ?>

Bu örnekte, bolmeIslemi fonksiyonu sıfıra bölme durumunda bir istisna fırlatır. try bloğu içinde bu istisna yakalanır ve hata mesajı ekrana yazdırılır. İstisna fırlatıldıktan sonra try bloğundaki diğer kodların çalışmadığına dikkat edin.


Örnek 2: Çoklu catch Blokları ve Özel İstisnalar


Kendi özel istisna sınıflarınızı tanımlayarak daha spesifik hata durumlarını ele alabilirsiniz. Özel istisna sınıfları genellikle Exception sınıfından türetilir.


getMessage() . "
"; } catch (VeritabaniBaglantiHatasiException $e) { echo "Veritabanı hatası yakalandı: " . $e->getMessage() . "
"; } catch (Exception $e) { // Diğer tüm istisnaları yakalamak için echo "Genel bir hata yakalandı: " . $e->getMessage() . "
"; } finally { echo "İşlem tamamlandı, kaynaklar serbest bırakılıyor (finally bloğu).
"; } ?>

Bu örnek, farklı hata türlerini ele almak için birden çok catch bloğunun nasıl kullanılacağını gösterir. finally bloğu ise, istisna fırlatılsa da fırlatılmasa da her zaman çalışarak temizleme işlemleri için bir garanti sağlar.


Örnek 3: İstisnaları Yeniden Fırlatma (Re-throwing Exceptions)


Bazen bir istisnayı yakalayıp belirli bir işlem yaptıktan sonra, daha yüksek bir seviyede ele alınması için yeniden fırlatmak isteyebilirsiniz.


getMessage());
        // İstisnayı daha yüksek bir seviyede yakalanmak üzere yeniden fırlat
        throw new Exception("Dosya işlemi sırasında bir sorun oluştu.", 0, $e);
    }
}

try {
    $data = dosyaOku("olmayan_dosya.txt");
    echo "Dosya içeriği: " . $data . "
"; } catch (Exception $e) { echo "Uygulama seviyesinde hata: " . $e->getMessage() . "
"; if ($e->getPrevious()) { echo "Önceki hata: " . $e->getPrevious()->getMessage() . "
"; } } ?>

Bu örnekte, dosyaOku fonksiyonu bir istisna yakalar, loglar ve ardından daha genel bir istisna mesajıyla yeniden fırlatır. Yeniden fırlatılan istisnaya orijinal istisna, getPrevious() metodu ile erişilebilir.


İpuçları ve Önemli Notlar


  • Spesifik catch Blokları Önce Gelmeli: Birden fazla catch bloğu kullanırken, daha spesifik istisna sınıflarını (GecersizParametreException gibi) genel Exception sınıfından önce yerleştirin. Aksi takdirde, daha genel olan blok tüm istisnaları yakalar ve spesifik bloklara asla ulaşılamaz.

  • İstisnaları Yutmaktan Kaçının: Bir istisnayı yakalayıp hiçbir işlem yapmadan (boş bir catch bloğu) bırakmak, hataların gizlenmesine ve hata ayıklamanın zorlaşmasına neden olur. Her zaman yakalanan istisnayı loglayın, kullanıcıya anlamlı bir mesaj gösterin veya uygun şekilde ele alın.

  • Sadece Hata Durumları İçin Kullanın: İstisnalar, programın normal akışının bir parçası olmayan, beklenmedik hata durumları için tasarlanmıştır. Kontrol akışını yönlendirmek için istisnaları kullanmaktan kaçının (örneğin, bir döngüyü kırmak için).

  • Throwable Arayüzü: PHP 7'den itibaren, hem Exception hem de Error sınıflarının uyguladığı Throwable arayüzü tanıtılmıştır. Bu, hem istisnaları hem de ciddi hataları (örneğin, bellek tükenmesi) tek bir catch (Throwable $e) bloğu ile yakalamanıza olanak tanır.

  • Standart İstisna Sınıfları: PHP, InvalidArgumentException, RuntimeException, PDOException gibi birçok yerleşik istisna sınıfı sağlar. Uygulamanızda bu standart sınıfları veya bunlardan türettiğiniz özel sınıfları kullanmak iyi bir pratiktir.


8
0
JavaScript Dilinde Map Nesnesinin Kapsamlı Kullanımı

Map nesnesi, JavaScript'te anahtar-değer çiftlerini saklamak için kullanılan güçlü bir veri yapısıdır. Geleneksel nesnelerin (Object) sınırlamalarını aşarak, anahtar olarak herhangi bir veri türünü (nesneler, fonksiyonlar, ilkel değerler) kullanılmasına olanak tanır ve elemanların eklenme sırasını korur. Bu özellikler, Map'i belirli senaryolarda Object'e göre daha esnek ve verimli bir alternatif haline getirir.


Sözdizimi


Map nesnesi, new Map() yapıcı fonksiyonu kullanılarak oluşturulur. Anahtar-değer çiftleri eklemek, almak ve yönetmek için çeşitli yöntemler sunar.


Yeni bir Map oluşturma:


const myMap = new Map();

Başlangıç değerleri ile Map oluşturma:


const initialMap = new Map([
  ['anahtar1', 'değer1'],
  ['anahtar2', 'değer2']
]);

Bir anahtar-değer çifti ekleme:


myMap.set('ad', 'Alice');

Bir anahtarın değerini alma:


const ad = myMap.get('ad'); // 'Alice'

Bir anahtarın varlığını kontrol etme:


const varMi = myMap.has('ad'); // true

Bir anahtar-değer çiftini silme:


myMap.delete('ad');

Map'teki eleman sayısını alma:


const boyut = myMap.size;

Tüm anahtar-değer çiftlerini temizleme:


myMap.clear();

Detaylı Açıklama


Map nesnesi, JavaScript'teki geleneksel Object'lere göre bazı önemli avantajlar sunar ve farklı kullanım senaryolarına hitap eder.


  • Anahtar Türleri: Geleneksel nesnelerde anahtarlar yalnızca string veya Symbol olabilirken, Map nesneleri anahtar olarak herhangi bir veri türünü (nesneler, fonksiyonlar, diziler, ilkel değerler vb.) kabul edebilir. Bu, özellikle DOM elemanları veya diğer nesneleri doğrudan anahtar olarak kullanmak istediğinizde büyük bir avantaj sağlar.

  • Eleman Sırası: Map nesneleri, anahtar-değer çiftlerinin eklenme sırasını korur. Bu, üzerinde iterasyon yaparken elemanların hangi sırayla eklendiğini bilmek veya bu sırayı kullanmak istediğinizde önemlidir. Geleneksel nesnelerde özelliklerin sırası garanti edilmez (ancak ES2015'ten sonra bazı durumlarda kısmen garanti edilmeye başlanmıştır, yine de Map kadar güçlü değildir).

  • Boyut: Map nesnesinin size özelliği, içerdiği anahtar-değer çiftlerinin sayısını doğrudan ve verimli bir şekilde verir. Geleneksel nesnelerde bu bilgiye ulaşmak için genellikle Object.keys(obj).length gibi yöntemler kullanmak gerekir ki bu da her seferinde yeni bir dizi oluşturmayı gerektirir.

  • Performans: Sık sık anahtar-değer çiftlerinin eklenip silindiği senaryolarda, Map genellikle geleneksel nesnelere göre daha iyi performans sergileyebilir. Özellikle anahtar sayısı arttıkça bu fark daha belirgin hale gelebilir.

  • Iterasyon: Map nesneleri doğrudan iterable'dır. Bu, for...of döngüleri ile kolayca anahtarlar, değerler veya anahtar-değer çiftleri üzerinde döngü yapmanızı sağlar. map.keys(), map.values() ve map.entries() yöntemleri, ilgili iterable nesneleri döndürür.

Bir Map'e aynı anahtarla yeni bir değer atandığında, mevcut değerin üzerine yazılır. Bu, anahtarların benzersiz olmasını sağlar.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, Map nesnesinin çeşitli kullanım senaryolarını göstermektedir.


Örnek 1: Temel Map İşlemleri


Bu örnek, bir Map oluşturmayı, eleman eklemeyi, eleman almayı, varlığını kontrol etmeyi ve silmeyi gösterir.


const kullaniciBilgileri = new Map();

// Eleman ekleme
kullaniciBilgileri.set('id', 101);
kullaniciBilgileri.set('ad', 'Veli');
kullaniciBilgileri.set('soyad', 'Demir');
kullaniciBilgileri.set('aktif', true);

console.log('Kullanıcı Adı:', kullaniciBilgileri.get('ad')); // Çıktı: Kullanıcı Adı: Veli
console.log('ID mevcut mu?', kullaniciBilgileri.has('id')); // Çıktı: ID mevcut mu? true
console.log('Email mevcut mu?', kullaniciBilgileri.has('email')); // Çıktı: Email mevcut mu? false

// Bir elemanı silme
kullaniciBilgileri.delete('aktif');
console.log('Aktif durumu silindi mi?', !kullaniciBilgileri.has('aktif')); // Çıktı: Aktif durumu silindi mi? true

console.log('Map boyutu:', kullaniciBilgileri.size); // Çıktı: Map boyutu: 3

// Tüm elemanları temizleme
kullaniciBilgileri.clear();
console.log('Map temizlendikten sonra boyut:', kullaniciBilgileri.size); // Çıktı: Map temizlendikten sonra boyut: 0

Örnek 2: Nesneleri Anahtar Olarak Kullanma


Map'in en güçlü yönlerinden biri, anahtar olarak nesneleri kullanabilmesidir. Bu örnek, iki farklı nesneyi anahtar olarak nasıl kullanacağımızı gösterir.


const kullanici1 = { id: 1, ad: 'Ayşe' };
const kullanici2 = { id: 2, ad: 'Fatma' };

const kullaniciRolleri = new Map();

kullaniciRolleri.set(kullanici1, 'Yönetici');
kullaniciRolleri.set(kullanici2, 'Editör');

console.log(kullaniciRolleri.get(kullanici1)); // Çıktı: Yönetici
console.log(kullaniciRolleri.get(kullanici2)); // Çıktı: Editör

// Yeni bir nesne oluşturup aynı değerlere sahip olsa bile farklı bir anahtar olarak kabul edilir.
const kullanici3 = { id: 1, ad: 'Ayşe' };
console.log(kullaniciRolleri.get(kullanici3)); // Çıktı: undefined (çünkü bellekte farklı bir referanstır)

Örnek 3: Map Üzerinde Iterasyon


Map nesneleri, for...of döngüsü ile kolayca iterate edilebilir. Bu örnek, anahtarlar, değerler ve anahtar-değer çiftleri üzerinde nasıl döngü yapılacağını gösterir.


const urunFiyatlari = new Map([
  ['Laptop', 12000],
  ['Klavye', 500],
  ['Fare', 250]
]);

console.log('--- Anahtar-Değer Çiftleri ---');
for (const [urun, fiyat] of urunFiyatlari) {
  console.log(`${urun}: ${fiyat} TL`);
}
// Çıktı:
// Laptop: 12000 TL
// Klavye: 500 TL
// Fare: 250 TL

console.log('\n--- Sadece Anahtarlar ---');
for (const urun of urunFiyatlari.keys()) {
  console.log(urun);
}
// Çıktı:
// Laptop
// Klavye
// Fare

console.log('\n--- Sadece Değerler ---');
for (const fiyat of urunFiyatlari.values()) {
  console.log(fiyat);
}
// Çıktı:
// 12000
// 500
// 250

Örnek 4: Map'i Diziye ve Diziyi Map'e Dönüştürme


Map ve dizi arasında kolayca dönüşüm yapabilirsiniz.


// Diziden Map oluşturma
const diziVeri = [['a', 1], ['b', 2], ['c', 3]];
const harita = new Map(diziVeri);
console.log('Diziden Oluşturulan Map:', harita); // Çıktı: Diziden Oluşturulan Map: Map(3) { 'a' => 1, 'b' => 2, 'c' => 3 }

// Map'i diziye dönüştürme (entries olarak)
const haritaDizi = Array.from(harita);
console.log('Map\'in Diziye Dönüştürülmüş Hali (entries):', haritaDizi); // Çıktı: Map'in Diziye Dönüştürülmüş Hali (entries): [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]

// Sadece anahtarları diziye dönüştürme
const anahtarlarDizi = [...harita.keys()];
console.log('Map Anahtarları Dizi Olarak:', anahtarlarDizi); // Çıktı: Map Anahtarları Dizi Olarak: [ 'a', 'b', 'c' ]

// Sadece değerleri diziye dönüştürme
const degerlerDizi = [...harita.values()];
console.log('Map Değerleri Dizi Olarak:', degerlerDizi); // Çıktı: Map Değerleri Dizi Olarak: [ 1, 2, 3 ]

Önemli Notlar


  • Anahtar Karşılaştırması: Map'teki anahtarlar, SameValueZero algoritması kullanılarak karşılaştırılır. Bu, === operatörüne benzer ancak NaN değerinin kendisine eşit kabul edilmesi gibi bazı farklılıklar içerir (NaN === NaN false dönerken, Map içinde NaN anahtarı NaN ile eşleşir).

  • Map vs. Object: Ne zaman hangisini kullanacağınızı iyi belirleyin. Eğer anahtarlarınız yalnızca string veya Symbol ise ve eleman sırası önemli değilse, basit bir Object yeterli olabilir. Ancak anahtarlarınız farklı veri tiplerinde olacaksa, eleman sırasını korumanız gerekiyorsa veya sık sık eleman ekleyip siliyorsanız, Map genellikle daha iyi bir seçimdir.

  • Serileştirme: Map nesneleri doğrudan JSON.stringify() ile serileştirilemez. Bir Map'i JSON formatına dönüştürmek için önce onu bir diziye veya düz bir nesneye dönüştürmeniz gerekir.

  • WeakMap: JavaScript ayrıca WeakMap adında bir veri yapısı sunar. WeakMap, yalnızca nesneleri anahtar olarak kabul eder ve anahtarların "zayıf" referanslarını tutar. Bu, anahtar nesneye başka hiçbir referans kalmadığında çöp toplayıcının anahtarı ve ilgili değeri otomatik olarak silmesine olanak tanır. Bellek yönetimi açısından önemlidir, ancak Map'ten farklı bir kullanım senaryosu vardır.

9
0
SQL Dilinde SQL DELETE Kullanımı
SQL (Yapısal Sorgu Dili), veri tabanlarıyla etkileşim kurmak için kullanılan güçlü bir dildir. Bu etkileşimin temel bileşenlerinden biri de mevcut verileri silme yeteneğidir. DELETE ifadesi, bir tablodan bir veya daha fazla satırı kalıcı olarak kaldırmak için kullanılır. Bu makale, DELETE ifadesinin sözdizimini, kullanımını ve dikkat edilmesi gereken önemli noktaları detaylı bir şekilde ele alacaktır.

Sözdizimi


DELETE ifadesinin temel sözdizimi aşağıdaki gibidir:


DELETE FROM tablo_adi
WHERE kosul;

Tüm satırları silmek için WHERE koşulu atlanabilir:


DELETE FROM tablo_adi;

DELETE ifadesinin bileşenleri şunlardır:


  • DELETE FROM: Bu anahtar kelimeler, belirtilen tablodan satır silme işlemini başlatır.

  • tablo_adi: Verilerin silineceği tablonun adıdır. Bu, işlemin hedefidir.

  • WHERE kosul: İsteğe bağlı bir koşuldur. Bu koşul belirtilirse, yalnızca koşulu karşılayan satırlar silinir. Eğer WHERE koşulu belirtilmezse, tablodaki tüm satırlar silinir. Bu durum geri alınamaz olduğundan büyük dikkat gerektirir. Koşul, bir veya daha fazla sütun üzerinde mantıksal operatörler (=, <>, <, >, <=, >=, LIKE, IN, BETWEEN vb.) kullanılarak tanımlanır.


Örnekler


Aşağıdaki örnekler, DELETE ifadesinin çeşitli senaryolarda nasıl kullanılacağını göstermektedir. Örneklerde, Calisanlar adında bir tablonun var olduğu varsayılmaktadır.


Örnek 1: Belirli Bir Satırı Silme


Calisanlar tablosundan CalisanID'si 101 olan çalışanı silmek için:


DELETE FROM Calisanlar
WHERE CalisanID = 101;

Örnek 2: Birden Fazla Satırı Koşula Göre Silme


Calisanlar tablosundan 'Pazarlama' departmanında çalışan tüm personeli silmek için:


DELETE FROM Calisanlar
WHERE Departman = 'Pazarlama';

Örnek 3: Belirli Bir Tarihten Önceki Kayıtları Silme


Calisanlar tablosundan GirisTarihi 2020 yılından önce olan tüm çalışanları silmek için:


DELETE FROM Calisanlar
WHERE GirisTarihi < '2020-01-01';

Örnek 4: Tüm Satırları Silme (WHERE koşulu olmadan)


Calisanlar tablosundaki tüm kayıtları silmek için:


DELETE FROM Calisanlar;

Bu işlem, tablonun yapısını korurken tüm verileri kalıcı olarak kaldırır.


Önemli Notlar


  • Yedekleme: DELETE işlemini gerçekleştirmeden önce her zaman veri tabanınızı yedekleyin. Yanlışlıkla yapılan silme işlemleri geri alınamaz sonuçlar doğurabilir.

  • WHERE Koşulunun Önemi: WHERE koşulunu dikkatlice yazın ve doğruluğundan emin olun. Koşulun yanlış olması, beklenenden daha fazla veya yanlış verilerin silinmesine yol açabilir.

  • TRUNCATE TABLE vs. DELETE: Tüm satırları silmek için DELETE FROM tablo_adi; yerine TRUNCATE TABLE tablo_adi; de kullanılabilir. Ancak bu iki komut arasında önemli farklar vardır:

    • DELETE, satır satır silme işlemi yapar ve her silinen satır için işlem günlüğü (transaction log) kaydı tutar. Bu nedenle daha yavaş olabilir ve geri alınabilir (ROLLBACK) bir işlem olabilir.

    • TRUNCATE TABLE, tabloyu yeniden oluşturarak daha hızlı bir şekilde tüm verileri siler. İşlem günlüğüne minimum kayıt yazar, bu yüzden daha performanslıdır. Ancak, bu işlem genellikle geri alınamaz (ROLLBACK edilemez).

  • İlişkisel Bütünlük (Referential Integrity): Bir tabloda silmeye çalıştığınız veriler başka bir tablonun dış anahtar (FOREIGN KEY) kısıtlamaları tarafından referans alınıyorsa, silme işlemi başarısız olabilir veya ilişkili verilerin de silinmesini (ON DELETE CASCADE) tetikleyebilir. Veri tabanı tasarımınızı ve kısıtlamalarınızı anlayın.

  • İşlem Kontrolü (Transaction Control): Özellikle kritik silme işlemleri için BEGIN TRANSACTION (veya START TRANSACTION), COMMIT ve ROLLBACK komutlarını kullanın. Bu, silme işlemini test etmenize ve gerekirse geri almanıza olanak tanır.


    BEGIN TRANSACTION;
    DELETE FROM Calisanlar
    WHERE CalisanID = 101;
    -- SELECT * FROM Calisanlar WHERE CalisanID = 101; -- Silinip silinmediğini kontrol et
    -- COMMIT; -- Değişiklikleri kalıcı hale getir
    -- ROLLBACK; -- Değişiklikleri geri al
9
0
Python Dilinde Tuple Kullanımı: Sabit Veri Yapıları

Python programlama dilinde veri yapıları, programların veriyi düzenli ve etkin bir şekilde depolamasını ve işlemesini sağlar. Bu veri yapılarından biri olan tuple (demet), değiştirilemez (immutable) ve sıralı (ordered) bir koleksiyon türüdür. Listeler gibi diğer sıralı koleksiyonların aksine, bir tuple oluşturulduktan sonra elemanları değiştirilemez, eklenemez veya silinemez. Bu özelliği, tuple'ları sabit veri setlerini veya fonksiyonlardan birden fazla değer döndürmek gibi senaryolarda ideal bir seçim haline getirir.


Python Tuple: Temel Sözdizimi


Bir tuple, parantez () kullanılarak ve elemanları virgülle , ayrılarak oluşturulur. Elemanlar farklı veri tiplerinden olabilir.


# Boş bir tuple oluşturma
bos_tuple = ()

# Sayılardan oluşan bir tuple
sayi_tuple = (1, 2, 3, 4, 5)

# Farklı veri tiplerinden oluşan bir tuple
karisik_tuple = ("Python", 3.14, True, 100)

# Tek elemanlı tuple oluşturma (virgül kullanımı önemlidir)
tek_elemanli_tuple = (42,) # Virgül olmadan sadece parantez bir integer olur

# Parantez olmadan tuple oluşturma (tuple paketleme)
paketlenmis_tuple = 1, 2, "üç" # Bu da geçerli bir tuple oluşturur

Detaylı Açıklama


Tuple'ların temel özellikleri ve kullanım mekanizmaları aşağıda açıklanmıştır:


  • Değiştirilemezlik (Immutability): Bir tuple'ın en belirgin özelliğidir. Oluşturulduktan sonra içindeki elemanlar ne değiştirilebilir ne de yeni elemanlar eklenebilir veya mevcutlar silinebilir. Bu özellik, veri bütünlüğünü sağlamak ve tuple'ları daha güvenli veri taşıyıcıları yapmak için önemlidir.

  • Sıralı (Ordered): Tuple elemanları belirli bir sıraya sahiptir ve bu sıra korunur. Elemanlara erişim indeks numaraları aracılığıyla yapılır.

  • İndekslenebilir (Indexable): Listeler gibi, tuple elemanlarına da sıfır tabanlı indekslerle erişilebilir. Dilimleme (slicing) işlemleri de desteklenir.

  • Farklı Veri Tipleri: Bir tuple, aynı anda farklı veri tiplerinden (integer, float, string, boolean vb.) elemanları barındırabilir.

  • Tuple Paketleme ve Açma (Packing/Unpacking): Python, birden fazla değeri bir tuple olarak "paketlemeye" ve bir tuple'daki değerleri birden fazla değişkene "açmaya" olanak tanır. Bu, özellikle fonksiyonlardan çoklu değer döndürmede veya değişkenleri hızlıca takas etmede kullanışlıdır.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, Python tuple'larının nasıl oluşturulduğunu, elemanlarına nasıl erişildiğini ve çeşitli senaryolarda nasıl kullanıldığını göstermektedir.


Örnek 1: Tuple Oluşturma ve Elemanlara Erişme


# Bir tuple oluşturma
koordinatlar = (10, 20)
print(f"Koordinatlar: {koordinatlar}")

# İndeks kullanarak elemanlara erişim
x_koordinati = koordinatlar[0]
y_koordinati = koordinatlar[1]
print(f"X Koordinatı: {x_koordinati}, Y Koordinatı: {y_koordinati}")

# Negatif indeksleme
son_eleman = koordinatlar[-1]
print(f"Son eleman: {son_eleman}")

# Dilimleme (Slicing)
ilk_iki = (1, 2, 3, 4, 5)[0:2]
print(f"İlk iki eleman: {ilk_iki}")

Örnek 2: Tuple Paketleme ve Açma


# Tuple Paketleme
bilgi = "Alice", 30, "Mühendis" # Otomatik olarak bir tuple oluşturulur

# Tuple Açma
isim, yas, meslek = bilgi
print(f"İsim: {isim}, Yaş: {yas}, Meslek: {meslek}")

# Değişkenleri takas etme
a = 5
b = 10
print(f"Takas öncesi: a={a}, b={b}")
a, b = b, a # Tuple paketleme ve açma ile hızlı takas
print(f"Takas sonrası: a={a}, b={b}")

Örnek 3: Fonksiyonlardan Çoklu Değer Döndürme


def dikdortgen_bilgileri(uzunluk, genislik):
    alan = uzunluk * genislik
    cevre = 2 * (uzunluk + genislik)
    return alan, cevre # Fonksiyon bir tuple döndürür

# Fonksiyonu çağırma ve döndürülen tuple'ı açma
alan_degeri, cevre_degeri = dikdortgen_bilgileri(5, 8)
print(f"Dikdörtgenin Alanı: {alan_degeri}, Çevresi: {cevre_degeri}")

Örnek 4: Tuple Metotları


Tuple'lar, değiştirilemez olmalarına rağmen, elemanları üzerinde bilgi edinmek için bazı dahili metotlara sahiptir: count() ve index().


my_tuple = (1, 2, 2, 3, 4, 2, 5)

# count() metodu: Belirli bir elemanın kaç kez geçtiğini sayar
iki_sayisi = my_tuple.count(2)
print(f"2 sayısı tuple içinde {iki_sayisi} kez geçiyor.")

# index() metodu: Belirli bir elemanın ilk geçtiği indeksi döndürür
# Eğer eleman bulunamazsa ValueError yükseltir
uc_indeksi = my_tuple.index(3)
print(f"3 elemanının ilk indeksi: {uc_indeksi}")

# Olmayan bir eleman için deneme
try:
    altı_indeksi = my_tuple.index(6)
    print(f"6 elemanının ilk indeksi: {altı_indeksi}")
except ValueError as e:
    print(f"Hata: {e}")

Önemli Notlar ve İpuçları


  • Tek Elemanlı Tuple Oluşturma: Tek bir elemanı olan bir tuple oluştururken, elemandan sonra mutlaka bir virgül , eklemelisiniz. Örneğin, (42,) bir tuple'dır; (42) ise sadece bir tam sayıdır.

  • Performans: Tuples, listelere göre genellikle daha az bellek tüketir ve daha hızlı işlenir, çünkü değiştirilemez yapıları Python'ın optimizasyon yapmasına olanak tanır. Sabit veri setleri için tuple kullanmak performans avantajı sağlayabilir.

  • Hashable Olma: Yalnızca değiştirilemez (immutable) elemanlar içeren tuple'lar hashable'dır. Bu da onları Python sözlüklerinde anahtar olarak veya set'lerde eleman olarak kullanılabileceği anlamına gelir. Örneğin, (1, 2) bir sözlük anahtarı olabilirken, (1, [2, 3]) olamaz çünkü içindeki liste değiştirilemez değildir.

  • Değiştirilemezliğin Kapsamı: Tuple'lar kendileri değiştirilemez olsa da, eğer bir tuple mutable (değiştirilebilir) bir obje (örneğin bir liste) içeriyorsa, o mutable objenin içeriği değiştirilebilir. Tuple'ın referansı sabittir, ancak referans ettiği objenin içeriği değişebilir.

  • Kullanım Senaryoları: Tuples, özellikle aşağıdaki durumlarda tercih edilmelidir:

    • Fonksiyonlardan birden fazla değer döndürme.

    • Sabit koleksiyonları temsil etme (örneğin, haftanın günleri, renk kodları).

    • Sözlük anahtarı olarak kullanılacak verileri depolama.

    • Veri bütünlüğünün önemli olduğu durumlar.

17
0
HTML Dilinde Resimlerin (`` Etiketi) Detaylı Kullanımı
Web sayfaları, metinsel içeriğin yanı sıra görsel unsurlarla zenginleştirildiğinde kullanıcı deneyimi açısından önemli bir değer kazanır. HTML'de resimleri bir web sayfasına entegre etmek için kullanılan temel etiket, kendisi kapalı bir etiket olan etiketidir. Bu etiket, sayfaya harici bir görsel kaynağı yerleştirmek için kullanılır ve web içeriğinin estetik çekiciliğini ve bilgilendirici gücünü artırır. Bu makale, etiketinin sözdizimini, temel niteliklerini ve pratik kullanım örneklerini detaylı bir şekilde inceleyerek, resimlerin web'e doğru ve etkili bir şekilde nasıl dahil edileceğine dair kapsamlı bir rehber sunmaktadır.

Sözdizimi


etiketi, bir görselin kaynağını ve alternatif metnini belirtmek için ana nitelikleri kullanır. Temel kullanım yapısı aşağıdaki gibidir:


Resim Açıklaması

Detaylı Açıklama


etiketinin işlevselliği, çeşitli nitelikler aracılığıyla genişletilir. En yaygın ve zorunlu nitelikler aşağıda açıklanmıştır:


  • src (Source - Kaynak): Bu nitelik, görüntünün dosya yolunu veya URL'sini belirtir. Tarayıcı, bu yoldan görüntüyü alır ve sayfada görüntüler. Mutlak (https:// ile başlayan) veya göreceli (aynı sunucudaki bir klasöre işaret eden) yollar kullanılabilir. Bu, etiketi için zorunlu bir niteliktir.

  • alt (Alternative Text - Alternatif Metin): Bu nitelik, resmin içeriğini veya işlevini tanımlayan metinsel bir açıklama sağlar. Resim yüklenemediğinde, ekran okuyucular tarafından erişilebilirlik için veya arama motorları tarafından içeriği anlamak için kullanılır. Erişilebilirlik ve SEO için kritik öneme sahiptir.

  • width (Genişlik): Görüntünün genişliğini piksel cinsinden (varsayılan) veya yüzde olarak belirtir. Yalnızca width="200" yazmak 200 piksel anlamına gelir.

  • height (Yükseklik): Görüntünün yüksekliğini piksel cinsinden (varsayılan) veya yüzde olarak belirtir. Yalnızca height="150" yazmak 150 piksel anlamına gelir.

  • loading: Tarayıcının görüntüyü nasıl yüklemesi gerektiğini belirten bir ipucu sunar. Değerleri "lazy" (görüntü görüntüleme alanına yaklaştığında yükle) veya "eager" (hemen yükle) olabilir. Performans optimizasyonu için önemlidir.

  • srcset: Farklı çözünürlük veya ekran boyutları için birden fazla görüntü kaynağı belirtmenizi sağlar. Tarayıcı, kullanıcının cihazına en uygun görüntüyü seçer. Duyarlı (responsive) tasarım için vazgeçilmezdir.

  • sizes: srcset ile birlikte kullanıldığında, tarayıcıya görüntünün farklı görüntüleme alanlarında ne kadar yer kaplayacağını bildirir. Bu, tarayıcının srcset'ten en uygun görüntüyü seçmesine yardımcı olur.

Pratik Kullanım Örnekleri


Aşağıdaki örnekler, etiketinin çeşitli senaryolarda nasıl kullanılabileceğini göstermektedir.


1. Temel Görüntü Ekleme (Göreli Yol):


Bu örnek, aynı dizindeki bir resmi sayfaya ekler.


Şirket Logosu

2. Harici Bir Kaynaktan Görüntü Ekleme:


Bir CDN'den veya başka bir web sitesinden bir görüntü yükler.


Web Sitesi Bannerı

3. Duyarlı (Responsive) Görüntü Kullanımı (srcset ve sizes ile):


Tarayıcının farklı ekran boyutlarına göre en uygun görüntüyü seçmesini sağlar.


Manzara Resmi

4. Gecikmeli Yükleme (Lazy Loading):


Görüntünün yalnızca kullanıcı görüntüleme alanına yaklaştığında yüklenmesini sağlar, bu da sayfa performansını artırır.


Detaylı Bir Görsel

5.

ve
ile Resim ve Açıklama:


Bir resmi ve ilişkili başlığını semantik olarak gruplandırmak için kullanılır.


Sahilde Günbatımı
Akdeniz'de muhteşem bir günbatımı görüntüsü.

Önemli Notlar


  • alt Niteliklerinin Önemi: Her etiketi bir alt niteliği içermelidir. Bu, hem erişilebilirlik (ekran okuyucular için) hem de SEO (arama motorlarının resim içeriğini anlaması için) açısından kritik öneme sahiptir. Dekoratif resimler için alt="" boş bırakılabilir, ancak yine de nitelik mevcut olmalıdır.

  • Dosya Biçimleri: Yaygın olarak kullanılan resim formatları JPEG (fotoğraflar için), PNG (saydamlık gerektiren görseller için) ve GIF (animasyonlar için) ve WebP (genel olarak daha iyi sıkıştırma ve performans için) ve SVG (vektörel grafikler için) şeklindedir.

  • Performans Optimizasyonu: Büyük boyutlu resimler sayfa yükleme süresini artırabilir. Resimleri web için optimize etmek (sıkıştırmak ve doğru boyutlandırmak) önemlidir. loading="lazy" kullanmak da performansı artırabilir.

  • Boyutlandırma (width ve height): Tarayıcının resim için ayrılacak alanı önceden bilmesi için width ve height niteliklerini her zaman kullanmak iyi bir uygulamadır. Bu, "Cumulative Layout Shift" (CLS) gibi görsel istikrarsızlık sorunlarını önlemeye yardımcı olur.

  • Duyarlı Tasarım: Modern web geliştirmede resimlerin farklı ekran boyutlarına ve çözünürlüklerine uyum sağlaması çok önemlidir. srcset ve sizes nitelikleri bu ihtiyacı karşılamak için tasarlanmıştır.

8
0
SQL SELECT TOP Kullanımı: Sorgu Sonuçlarını Sınırlandırma
Veritabanlarından veri çekerken, özellikle büyük veri kümeleriyle çalışırken, yalnızca belirli sayıda veya oranda kaydı almak sıklıkla gerekli olur. SQL'deki SELECT TOP ifadesi, bu ihtiyacı karşılamak üzere tasarlanmış güçlü bir araçtır ve sorgu sonuçlarını belirli bir limit dahilinde döndürmeyi sağlar. Bu özellik, performans optimizasyonundan kullanıcı arayüzü kısıtlamalarına kadar çeşitli senaryolarda kritik bir rol oynar.

Sözdizimi


SELECT TOP ifadesinin genel sözdizimi aşağıdaki gibidir:
SELECT TOP sayı | yüzde [PERCENT]
FROM tablo_adı
WHERE koşul
ORDER BY sütun_adı [ASC|DESC];

Detaylı Açıklama


SELECT TOP ifadesinin her bir bileşeni belirli bir amaca hizmet eder:
  • SELECT: Veritabanından veri çekmek için kullanılan temel SQL komutudur.

  • TOP sayı: Sorgu sonucundan kaç adet kaydın döndürüleceğini belirten bir tam sayıdır. Örneğin, TOP 10 ilk 10 kaydı döndürür.

  • TOP yüzde PERCENT: Sorgu sonucundan döndürülecek kayıtların toplam kayıt sayısına göre yüzdesini belirtir. Örneğin, TOP 5 PERCENT toplam kayıtların ilk %5'ini döndürür.

  • FROM tablo_adı: Verilerin çekileceği tablonun adını belirtir.

  • WHERE koşul: İsteğe bağlı bir yan tümcedir. Belirtilen koşulları karşılayan kayıtları filtrelemek için kullanılır. Eğer bir WHERE koşulu kullanılmazsa, TOP tüm tablodaki kayıtlar üzerinde işlem yapar.

  • ORDER BY sütun_adı [ASC|DESC]: İsteğe bağlı ancak kritik bir yan tümcedir. Kayıtların hangi kritere göre sıralanacağını ve dolayısıyla hangi "ilk" kayıtların seçileceğini belirler. ASC (artan) veya DESC (azalan) sıralama yönünü belirtir. Eğer ORDER BY kullanılmazsa, döndürülen "ilk" kayıtlar veritabanının fiziksel depolama sırasına göre veya sorgu planına göre belirlenir ki bu da tutarsız sonuçlara yol açabilir. TOP ile birlikte ORDER BY kullanımı, tutarlı ve anlamlı sonuçlar elde etmek için şiddetle tavsiye edilir.

Pratik Kullanım Örnekleri


Aşağıdaki örneklerde, bir "Ürünler" tablosu olduğunu varsayalım. Bu tabloda ProductID, ProductName, Price ve StockQuantity gibi sütunlar bulunmaktadır.
**Örnek 1: En pahalı 5 ürünü listeleme.**
Bu örnek, ürünleri fiyata göre azalan sırada sıralar ve en pahalı ilk 5 ürünü seçer.
SELECT TOP 5 ProductName, Price
FROM Ürünler
ORDER BY Price DESC;
**Örnek 2: Stoğu en az olan %10 ürünü listeleme.**
Bu örnek, ürünleri stok miktarına göre artan sırada sıralar ve toplam ürün sayısının %10'una karşılık gelen stoğu en az ürünleri döndürür.
SELECT TOP 10 PERCENT ProductName, StockQuantity
FROM Ürünler
ORDER BY StockQuantity ASC;
**Örnek 3: Belirli bir kategoriye ait en yeni 3 ürünü listeleme.**
Bu örnek için "Ürünler" tablosunda bir CategoryID ve AddedDate sütunu olduğunu varsayalım. Koşul olarak CategoryID = 1 olan ürünleri filtreler, eklenme tarihine göre azalan sırada sıralar ve en yeni ilk 3 ürünü seçer.
SELECT TOP 3 ProductName, AddedDate
FROM Ürünler
WHERE CategoryID = 1
ORDER BY AddedDate DESC;

Önemli Notlar


  • Veritabanı Uyumluluğu: SELECT TOP ifadesi özellikle SQL Server ve MS Access gibi veritabanlarında yaygın olarak kullanılır. Diğer veritabanı sistemlerinde benzer işlevsellik farklı sözdizimleri ile sağlanır:

    • MySQL: LIMIT anahtar kelimesi (örneğin: SELECT sütunlar FROM tablo LIMIT 10;)

    • PostgreSQL: LIMIT anahtar kelimesi (örneğin: SELECT sütunlar FROM tablo LIMIT 10;)

    • Oracle: ROWNUM sözde sütunu (eski versiyonlar) veya FETCH FIRST N ROWS ONLY (Oracle 12c ve sonrası) kullanılır (örneğin: SELECT sütunlar FROM tablo FETCH FIRST 10 ROWS ONLY;)

  • ORDER BY Kullanımının Önemi: TOP ifadesi ile birlikte ORDER BY kullanmamak, veritabanının kayıtları fiziksel olarak nasıl depoladığına veya sorgu planına bağlı olarak rastgele veya tutarsız sonuçlar almanıza neden olabilir. Tutarlı ve öngörülebilir sonuçlar için mutlaka ORDER BY kullanın.

  • Performans: Büyük tablolarda TOP ifadesini kullanmak, sorgunun performansını artırabilir çünkü veritabanının tüm kayıtları işlemesi yerine yalnızca belirli sayıda kaydı işlemesini sağlar. Ancak, karmaşık WHERE ve ORDER BY yan tümceleriyle birleştiğinde performans üzerinde ek yükler oluşabilir.

  • Eşit Değerler (TIES): Bazı veritabanı sistemlerinde (örneğin SQL Server), TOP N WITH TIES sözdizimi ile, sıralama kriterine göre son kaydın aynı değere sahip olduğu ek kayıtları da dahil edebilirsiniz. Bu, TOP limitine ulaşılsa bile, son sıradaki değerle eşleşen tüm kayıtların döndürülmesini sağlar.

15
0
Python Dilinde Python Sets Kullanımı

Python programlama dilinde, verileri etkili bir şekilde depolamak ve yönetmek için çeşitli yerleşik veri yapıları bulunmaktadır. Bu yapılardan biri olan set, benzersiz elemanlardan oluşan, sırasız ve değiştirilebilir bir koleksiyondur. set'ler, özellikle bir koleksiyondaki yinelenen değerleri kaldırmak, üyelik testleri yapmak veya iki set arasındaki matematiksel küme işlemlerini (birleşim, kesişim, fark vb.) gerçekleştirmek için son derece kullanışlıdır. Bu makale, Python set'lerinin temel kullanımını, sözdizimini ve pratik uygulamalarını detaylandıracaktır.


Sözdizimi


set'ler, süslü parantezler {} kullanılarak veya set() yapıcı fonksiyonu aracılığıyla oluşturulabilir. Boş bir set oluşturmak için set() fonksiyonu kullanılmalıdır, çünkü {} boş bir sözlük (dict) oluşturur.


Detaylı Açıklama


Bir set oluşturmanın iki ana yolu vardır:


  • Literaller Kullanarak: Virgülle ayrılmış elemanları süslü parantezler içine alarak bir set oluşturabilirsiniz. Örnek: {"elma", "muz", "kiraz"}. Bu yöntem, başlangıçta elemanları olan bir set oluşturmak için idealdir.

  • set() Yapıcı Fonksiyonunu Kullanarak: Bir iterable (örneğin, liste, tuple, string) bir set'e dönüştürmek için set() fonksiyonunu kullanabilirsiniz. Örnek: set(["elma", "muz"]). Boş bir set oluşturmak için yalnızca set() kullanılmalıdır. {} kullanımı boş bir sözlük oluşturur.


set'lerin temel özellikleri şunlardır:


  • Benzersiz Elemanlar: Bir set yalnızca benzersiz elemanlar içerebilir. Yinelenen elemanlar eklenmeye çalışıldığında, set bunları otomatik olarak görmezden gelir.

  • Sırasız: set elemanlarının belirli bir sırası yoktur. Her çalıştırmada elemanların sırası değişebilir ve indeksleme yoluyla elemanlara erişilemez.

  • Değiştirilebilir (Mutable): Bir set oluşturulduktan sonra eleman ekleyebilir veya silebilirsiniz. Ancak set'in kendisi değiştirilebilirken, elemanları hashable olmalıdır. Yani, set elemanları listeler veya başka set'ler gibi değiştirilebilir nesneler olamaz.

Örnekler


1. set Oluşturma ve Yinelenen Elemanları Kaldırma:

# Süslü parantezlerle set oluşturma
meyveler = {"elma", "muz", "kiraz", "elma"}
print(f"Meyveler seti: {meyveler}")

# set() fonksiyonu ile liste üzerinden set oluşturma
sayilar_listesi = [1, 2, 2, 3, 4, 4, 5]
sayilar_seti = set(sayilar_listesi)
print(f"Sayılar seti: {sayilar_seti}")

# Boş set oluşturma
bos_set = set()
print(f"Boş set: {bos_set}")

# Hata: {} boş bir sözlük oluşturur
bos_sozluk = {}
print(f"Boş süslü parantez: {type(bos_sozluk)}")

2. set Elemanlarına Ekleme ve Silme:

renkler = {"kırmızı", "mavi"}
print(f"Orijinal renkler seti: {renkler}")

# add() metodu ile eleman ekleme
renkler.add("yeşil")
print(f"add() sonrası: {renkler}")

# Mevcut bir elemanı tekrar ekleme (değişiklik olmaz)
renkler.add("kırmızı")
print(f"Tekrar add() sonrası: {renkler}")

# update() metodu ile birden fazla eleman ekleme (iterable kullanarak)
renkler.update(["sarı", "mor", "mavi"])
print(f"update() sonrası: {renkler}")

# remove() metodu ile eleman silme (eleman yoksa KeyError verir)
renkler.remove("mavi")
print(f"remove() sonrası: {renkler}")

# discard() metodu ile eleman silme (eleman yoksa hata vermez)
renkler.discard("turuncu")
print(f"discard() sonrası (olmayan eleman): {renkler}")

# pop() metodu ile rastgele bir eleman silme ve döndürme
silinen_renk = renkler.pop()
print(f"pop() ile silinen: {silinen_renk}, Kalan renkler: {renkler}")

# clear() metodu ile tüm elemanları silme
renkler.clear()
print(f"clear() sonrası: {renkler}")

3. set Üzerinde Küme İşlemleri:

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

# Birleşim (Union): | operatörü veya union() metodu
birlesim = set1 | set2
print(f"Birleşim: {birlesim}") # veya set1.union(set2)

# Kesişim (Intersection): & operatörü veya intersection() metodu
kesisim = set1 & set2
print(f"Kesişim: {kesisim}") # veya set1.intersection(set2)

# Fark (Difference): - operatörü veya difference() metodu
fark1 = set1 - set2 # set1'de olup set2'de olmayanlar
print(f"Set1 - Set2 farkı: {fark1}") # veya set1.difference(set2)

fark2 = set2 - set1 # set2'de olup set1'de olmayanlar
print(f"Set2 - Set1 farkı: {fark2}") # veya set2.difference(set1)

# Simetrik Fark (Symmetric Difference): ^ operatörü veya symmetric_difference() metodu
# Her iki sette de olup kesişimde olmayanlar
simetrik_fark = set1 ^ set2
print(f"Simetrik Fark: {simetrik_fark}") # veya set1.symmetric_difference(set2)

# Alt Küme (Subset) ve Üst Küme (Superset) Testleri
set_a = {1, 2}
set_b = {1, 2, 3, 4}

print(f"Set A, Set B'nin alt kümesi mi? {set_a.issubset(set_b)}")
print(f"Set B, Set A'nın üst kümesi mi? {set_b.issuperset(set_a)}")

4. set Üyelik Testi:

harfler = {'a', 'b', 'c'}

print(f"'a' harfler setinde mi? {'a' in harfler}")
print(f"'d' harfler setinde mi? {'d' in harfler}")

Önemli Notlar


  • Boş set Oluşturma: Boş bir set oluşturmak için mutlaka set() fonksiyonunu kullanın. {} boş bir sözlük oluşturur.

  • Sırasız Yapı: set'ler sırasızdır. Elemanların eklenme sırası korunmaz ve indeksleme (my_set[0] gibi) kullanılamaz.

  • Değiştirilemez Elemanlar: set elemanları hashable (değiştirilemez) olmalıdır. Bu nedenle, list'ler, dict'ler veya başka set'ler doğrudan bir set'in elemanı olamaz. Eğer değiştirilemez bir set'e ihtiyacınız varsa frozenset kullanabilirsiniz.

  • Performans: set'ler, elemanların benzersizliğini kontrol etmek ve üyelik testleri (in operatörü) için yüksek performans sunar, özellikle büyük veri kümelerinde.

  • Kullanım Alanları: Tekrarlanan elemanları kaldırma, veri temizleme, iki koleksiyon arasındaki ortak veya farklı elemanları bulma gibi senaryolarda set'ler oldukça etkilidir.

19
0
PHP Dilinde Üreteçler (Generators) Kullanımı
PHP dilinde üreteçler (generators), özellikle büyük veri setleriyle çalışırken bellek tüketimini ve performansı optimize etmek amacıyla tasarlanmış güçlü bir özelliktir. Geleneksel olarak, bir dizi veya koleksiyon üzerinde döngü oluşturmak için tüm veriyi belleğe yüklemeniz gerekebilir. Ancak üreteçler, veriyi talep üzerine (on-demand) tek tek üreterek bu sorunu ortadan kaldırır. Bu sayede, tüm veri setini belleğe yüklemeden üzerinde yinelenebilir bir yapı oluşturulur ve böylece çok daha verimli bir kaynak kullanımı sağlanır. Üreteçler, özel bir tür yineleyici (iterator) olarak işlev görür ve `yield` anahtar kelimesi ile tanımlanır.

Sözdizimi


PHP'de bir üreteç fonksiyonu tanımlamak, standart bir fonksiyona benzer, ancak değer döndürmek için `return` yerine `yield` anahtar kelimesi kullanılır.

function generatorFunction(): Generator


{


    yield $value;


    // veya


    yield $key => $value;


}


Detaylı Açıklama


Yukarıdaki sözdiziminde yer alan ana bileşenler ve işlevleri aşağıda açıklanmıştır:
  • function generatorFunction(): Generator: Bu kısım, bir üreteç fonksiyonunun tanımlandığını belirtir. Fonksiyon adı herhangi bir geçerli PHP fonksiyon adı olabilir. PHP 7.0 ve sonrası için dönüş tipi ipucu olarak Generator kullanılabilir, bu fonksiyonun bir üreteç döndüreceğini açıkça belirtir.


  • yield $value;: Üreteçlerin kalbinde yer alan anahtar kelimedir. Bir fonksiyon içerisinde yield ifadesi kullanıldığında, PHP bu fonksiyonu otomatik olarak bir üreteç fonksiyonu olarak tanır. yield, fonksiyonun yürütülmesini duraklatır, belirtilen $value değerini çağırana geri döndürür ve fonksiyonun mevcut durumunu (yerel değişkenler, yürütme noktası vb.) korur. Bir sonraki değer istendiğinde, fonksiyon kaldığı yerden yürütülmeye devam eder.


  • yield $key => $value;: yield ifadesi, anahtar-değer çiftleri döndürmek için de kullanılabilir, tıpkı bir dizideki gibi. Bu, özellikle değerlerin belirli bir anahtarla ilişkilendirilmesi gereken durumlarda faydalıdır.


Bir üreteç fonksiyonu çağrıldığında, kodu hemen yürütülmez. Bunun yerine, bir Generator nesnesi döndürür. Fonksiyonun kodu ancak bu nesne üzerinde döngüye başlandığında (örneğin bir foreach döngüsü ile) adım adım yürütülür ve yield ifadeleri aracılığıyla değerler üretilir.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, üreteçlerin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.

Örnek 1: Basit Sayı Dizisi Üreteci


Bu örnek, belirli bir aralıktaki sayıları üreten basit bir üreteç fonksiyonunu göstermektedir.

Örnek 2: Büyük Dosyaları Satır Satır Okuma


Büyük bir metin dosyasını belleğe tamamen yüklemeden satır satır okumak için üreteçler idealdir.

Örnek 3: Veritabanı Kayıtlarını Bellek Dostu Şekilde İşleme


Bir veritabanından çok sayıda kayıt çekerken, tüm sonuç setini belleğe yüklemek yerine üreteçler kullanarak kayıtları tek tek işleyebilirsiniz. (Bu örnek bir veritabanı bağlantısı gerektirdiğinden basitleştirilmiştir.)
 $i, 'ad' => 'Kullanıcı ' . $i, 'email' => 'kullanici' . $i . '@example.com'];
    }

    echo "Veritabanı bağlantısı kapatılıyor..." . PHP_EOL;
}

// Sadece 3 kayıt işleyelim
foreach (veritabaniKayitlari(3) as $kayit) {
    echo "İşlenen kayıt ID: " . $kayit['id'] . ", Ad: " . $kayit['ad'] . PHP_EOL;
}

// Çıktı:
// Veritabanı bağlantısı açılıyor...
// Kayıt 1 çekiliyor...
// İşlenen kayıt ID: 1, Ad: Kullanıcı 1
// Kayıt 2 çekiliyor...
// İşlenen kayıt ID: 2, Ad: Kullanıcı 2
// Kayıt 3 çekiliyor...
// İşlenen kayıt ID: 3, Ad: Kullanıcı 3
// Veritabanı bağlantısı kapatılıyor...

?>

Önemli Notlar ve İpuçları


Üreteçler hakkında bilmeniz gereken bazı önemli noktalar ve ipuçları aşağıda listelenmiştir:
  • Bellek Verimliliği: Üreteçlerin en büyük avantajı bellek verimliliğidir. Tüm veri setini belleğe yüklemek yerine, değerleri talep üzerine ürettikleri için büyük dosyaları veya veritabanı sonuçlarını işlerken çok daha az bellek kullanırlar.


  • Tek Kullanımlık Yapı: PHP'deki üreteçler, ileriye dönük (forward-only) yineleyicilerdir. Bir üreteç üzerinde döngü tamamlandığında, genellikle en başa dönüp tekrar yinelemek mümkün değildir. Eğer tekrar kullanım gerekiyorsa, üreteç fonksiyonunu tekrar çağırmanız gerekir.


  • yield from Kullanımı: PHP 7.0 ile birlikte gelen yield from ifadesi, bir üreteçten başka bir üretece veya Traversable nesneye yetki devretmeyi sağlar. Bu, birden fazla iç içe üreteci tek bir yerden yönetmek için kullanışlıdır.


  • İstisna Yönetimi: Üreteç fonksiyonları içinde istisnalar fırlatılabilir ve bunlar normal fonksiyonlarda olduğu gibi yakalanabilir. Üreteç, bir istisna fırlattığında veya sonlandığında, artık daha fazla değer üretmez.


  • Dönüş Değeri: PHP 7.0 ve sonrası ile üreteçler, return ifadesi ile bir nihai değer döndürebilir. Ancak bu değere doğrudan foreach döngüsü üzerinden erişilemez. Generator::getReturn() metodu ile erişilebilir ve genellikle yield from ile birlikte kullanılır.


9
0
HTML Dilinde Favicon Kullanımı: Kapsamlı Rehber

Favicon, "favori simge" kelimelerinin kısaltması olup, bir web sitesini temsil eden küçük bir grafik simgesidir. Tarayıcı sekmelerinde, sık kullanılanlar listesinde, arama motoru sonuçlarında ve mobil cihazların ana ekranlarında görünerek web sitenizin markalaşmasında ve tanınabilirliğinde kritik bir rol oynar. Bu rehber, bir HTML belgesine favicon entegrasyonunun teknik detaylarını ve en iyi uygulamalarını adım adım açıklamaktadır.


Temel Sözdizimi


Bir HTML belgesine favicon eklemek için, genellikle belgenin bölümüne bir etiketi yerleştirilir. Bu etiket, tarayıcıya favicon dosyasının nerede bulunduğunu ve hangi türde olduğunu bildirir.


Detaylı Açıklama


Yukarıdaki sözdizimindeki her bir nitelik (attribute) belirli bir amaca hizmet eder:


  • : Bu etiket, mevcut belge ile harici bir kaynak arasındaki ilişkiyi belirtmek için kullanılır. Favicon durumunda, bu harici kaynak sitenizin simge dosyasıdır.

  • rel="icon": rel (ilişki) niteliği, bağlanan kaynağın geçerli belgeyle olan ilişkisini tanımlar. "icon" değeri, bağlanan URL'nin belge için bir simge olduğunu gösterir. Eski tarayıcılarla uyumluluk için bazen rel="shortcut icon" da kullanılır, ancak modern uygulamalarda rel="icon" yeterlidir.

  • type="image/x-icon": type niteliği, bağlanan dosyanın MIME türünü belirtir. Geleneksel favicon'lar için image/x-icon kullanılır. PNG formatındaki favicon'lar için image/png, GIF formatı için image/gif veya SVG için image/svg+xml gibi değerler de kullanılabilir.

  • href="/favicon.ico": href niteliği, favicon dosyasının URL'sini belirtir. Bu, bir mutlak URL (örn: https://www.example.com/favicon.ico) veya bir göreli URL (örn: /favicon.ico veya ./images/favicon.png) olabilir. Göreceli yollar genellikle daha esnektir.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, farklı senaryolarda favicon kullanımını göstermektedir.


Örnek 1: Geleneksel .ico Favicon Kullanımı

Bu, en yaygın ve geniş ölçüde desteklenen yöntemdir. Favicon dosyası genellikle web sitesinin kök dizininde bulunur.



Örnek 2: PNG Formatında Favicon Kullanımı

PNG formatı, daha iyi şeffaflık ve renk desteği sunar ve modern tarayıcılarda geniş çapta desteklenir. Dosya yolu, sitenizin dizin yapısına göre ayarlanmalıdır.



Örnek 3: Farklı Boyutlarda Favicon Sağlama

Birden fazla etiketi kullanarak, tarayıcının farklı cihazlar veya bağlamlar için en uygun simgeyi seçmesine olanak tanıyabilirsiniz. sizes niteliği, simgenin piksel cinsinden boyutlarını belirtir.







Önemli Notlar


  • Konumlandırma: Favicon etiketi daima HTML belgesinin bölümünde yer almalıdır. Bu, tarayıcının sayfayı yüklemeden önce simgeyi keşfedip görüntülemesini sağlar.

  • Dosya Biçimleri: En yaygın ve uyumlu favicon biçimi .ico'dur. Ancak, .png ve .gif gibi diğer biçimler de modern tarayıcılar tarafından geniş ölçüde desteklenir. SVG formatı (image/svg+xml) ise ölçeklenebilirlik avantajı sunar ancak tüm tarayıcılarda tam destek henüz yaygın değildir.

  • Tarayıcı Önbelleği: Tarayıcılar favicon'ları agresif bir şekilde önbelleğe alır. Bir favicon'u güncellediğinizde, değişikliklerin hemen görünmeyebileceğini unutmayın. Tarayıcı önbelleğini temizlemek veya yeni bir dosya adı (örn: favicon-v2.ico) kullanmak sorunu çözebilir.

  • Yol Belirtimi: Favicon dosyasının yolunu (href niteliği) doğru bir şekilde belirttiğinizden emin olun. Yanlış bir yol, simgenin yüklenmemesine neden olur.

  • Varsayılan Davranış: Eğer herhangi bir etiketi belirtilmezse, çoğu tarayıcı otomatik olarak web sitesinin kök dizininde favicon.ico adında bir dosya arar.

  • Çoklu Favicon'lar: Birden fazla etiketi kullanarak farklı boyutlarda veya formatlarda simgeler sağlayabilirsiniz. Tarayıcı, kullanıcının cihazına ve tarayıcı ayarlarına en uygun olanı otomatik olarak seçecektir.

9
0
CSS Dilinde Yazı Tiplerini (Fonts) Yönetimi

Cascading Style Sheets (CSS), web sayfalarının görsel sunumunu kontrol eden temel bir dildir. Bu kapsamda, bir web sayfasının okunabilirliğini ve estetiğini doğrudan etkileyen yazı tiplerinin (fonts) yönetimi kritik bir rol oynar. CSS, geliştiricilere yazı tiplerini tanımlama, boyutlandırma, ağırlıklandırma ve stillendirme konusunda geniş bir kontrol mekanizması sunar. Bu makale, CSS dilinde yazı tipi özelliklerinin kullanımı, sözdizimi ve pratik uygulamaları üzerine odaklanmaktadır.


Sözdizimi


CSS'te yazı tipi özelliklerini tanımlamak için birden fazla bireysel özellik kullanılabileceği gibi, tüm bu özellikleri tek bir deklarasyonda birleştiren bir kısayol (shorthand) özelliği olan font da mevcuttur. Bireysel özellikler şunlardır:


  • font-family: Yazı tipinin adını veya genel bir ailesini belirtir.

  • font-size: Yazı tipinin boyutunu ayarlar.

  • font-weight: Yazı tipinin kalınlığını (ağırlığını) belirler.

  • font-style: Yazı tipinin stilini (normal, italik, eğik) belirler.

  • line-height: Satır yüksekliğini ayarlar.

  • font-variant: Yazı tipinin küçük harf varyantlarını (örneğin, küçük büyük harfler) etkinleştirir.

  • font-stretch: Yazı tipinin genişliğini ayarlar (yalnızca belirli yazı tiplerinde desteklenir).


Kısayol font özelliği ise aşağıdaki sırayla değerleri kabul eder:



font:    / ;

Detaylı Açıklama


Her bir yazı tipi özelliğinin işlevi ve kabul ettiği değerler aşağıda detaylandırılmıştır:


  • font-family


    Bu özellik, elementin içeriği için tercih edilen yazı tipini veya yazı tipi ailesini belirtir. Birden fazla yazı tipi belirterek bir yedekleme (fallback) zinciri oluşturmak önemlidir. Tarayıcı, listedeki ilk mevcut yazı tipini kullanacaktır.


    
    p {
        font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
    }
            

    Genel yazı tipi aileleri (serif, sans-serif, monospace, cursive, fantasy) her zaman listenin sonunda yer almalıdır.


  • font-size


    Yazı tipinin boyutunu belirler. Çeşitli birimler kullanılabilir:


    • Mutlak Boyutlar: xx-small, x-small, small, medium, large, x-large, xx-large. Kullanıcının varsayılan yazı tipi boyutuna göre değişir.

    • Göreceli Boyutlar: smaller, larger. Ebeveyn elementin yazı tipi boyutuna göre ayarlama yapar.

    • Uzunluk Birimleri: px (piksel), em (ebeveynin yazı tipi boyutuna göre), rem (kök elementin yazı tipi boyutuna göre), vw (viewport genişliğine göre), vh (viewport yüksekliğine göre). Esneklik ve erişilebilirlik için em ve rem tercih edilir.

    • Yüzde: %. Ebeveyn elementin yazı tipi boyutuna göre yüzde cinsinden belirtir.


    
    h1 {
        font-size: 2.5rem; /* Kök elementin font boyutunun 2.5 katı */
    }
    
    p {
        font-size: 16px; /* Sabit piksel boyutu */
    }
            
  • font-weight


    Yazı tipinin kalınlığını (ağırlığını) ayarlar. Kabul ettiği değerler şunlardır:


    • Anahtar Kelimeler: normal (genellikle 400), bold (genellikle 700).

    • Sayısal Değerler: 100'den 900'e kadar, 100'ün katları şeklinde. Tüm yazı tipleri bu aralıktaki her ağırlığı desteklemeyebilir.

    • Göreceli Değerler: lighter, bolder. Ebeveyn elementin ağırlığına göre.


    
    strong {
        font-weight: bold;
    }
    
    .heading-light {
        font-weight: 300;
    }
            
  • font-style


    Yazı tipinin stilini belirler. Yaygın değerler:


    • normal: Normal metin.

    • italic: İtalik metin. Yazı tipinin gerçek italik versiyonu varsa kullanılır.

    • oblique: Eğik metin. Yazı tipinin gerçek italik versiyonu yoksa, normal metin eğik bir şekilde taklit edilir.


    
    em {
        font-style: italic;
    }
            
  • line-height


    Metin satırları arasındaki dikey boşluğu ayarlar. Değerler:


    • Sayısal Değer: Örnek: 1.5. Elementin font-size değerinin 1.5 katı anlamına gelir. En çok tercih edilen yöntemdir.

    • Uzunluk Birimi: Örnek: 20px, 1.2em.

    • Yüzde: Örnek: 150%. Elementin font-size değerinin yüzdesi.

    • normal: Tarayıcının varsayılan değeri.


    
    p {
        line-height: 1.6; /* Font boyutunun 1.6 katı */
    }
            
  • font-variant


    Yazı tipinin küçük büyük harf (small-caps) gibi özel varyantlarını belirler. En yaygın değeri small-caps'dir.


    
    .caps-text {
        font-variant: small-caps;
    }
            

Örnekler


Aşağıdaki örnekler, farklı yazı tipi özelliklerinin CSS'te nasıl kullanıldığını göstermektedir.


Örnek 1: Temel Yazı Tipi Tanımlaması



/* HTML */

Bu paragraf, temel yazı tipi özellikleriyle stilize edilmiştir.

/* CSS */ .basic-text { font-family: Georgia, serif; font-size: 18px; font-weight: normal; font-style: normal; line-height: 1.5; color: #333; }

Örnek 2: Kısayol font Özelliği Kullanımı



/* HTML */

Kısayol ile Stilize Edilmiş Başlık

/* CSS */ .shorthand-heading { /* font-style | font-variant | font-weight | font-size/line-height | font-family */ font: italic small-caps bold 2em/1.2 "Times New Roman", Times, serif; color: #0056b3; }

Örnek 3: Web Fontu Entegrasyonu (Google Fonts)


Harici bir kaynaktan yazı tipi kullanmak için önce bu yazı tipini projenize dahil etmeniz gerekir. Aşağıdaki örnekte Google Fonts'tan 'Roboto' yazı tipinin nasıl kullanılacağı gösterilmiştir.



/* HTML (head bölümüne eklenir) */


Bu metin, harici bir web fontu olan Roboto ile stilize edilmiştir.

/* CSS */ .webfont-text { font-family: 'Roboto', sans-serif; font-size: 1.2rem; font-weight: 400; line-height: 1.7; color: #555; }

Önemli Notlar


  • Yedekleme Yazı Tipleri: font-family özelliğinde her zaman genel bir yazı tipi ailesiyle (serif, sans-serif, monospace) biten bir yedekleme zinciri kullanın. Bu, kullanıcının sisteminde belirtilen ilk yazı tipi bulunamazsa, tarayıcının benzer bir alternatif bulmasını sağlar.

  • Erişilebilirlik ve Esneklik: Yazı tipi boyutları için piksel (px) yerine em veya rem gibi göreceli birimler kullanmak, kullanıcının tarayıcı ayarlarını veya cihazının ekran boyutunu dikkate alarak daha iyi bir erişilebilirlik ve duyarlılık sağlar.

  • Kısayol Özelliği Sırası: font kısayol özelliğini kullanırken, font-size ve line-height değerlerinin / ile ayrılması ve font-family'nin her zaman en sonda yer alması gerektiğini unutmayın. Diğer özellikler (font-style, font-variant, font-weight) herhangi bir sırayla belirtilebilir ancak genellikle yukarıda belirtilen sıra tercih edilir.

  • Web Font Performansı: Harici web fontları kullanırken, web sitesinin yükleme süresini etkileyebilecekleri için font dosya boyutlarını optimize etmeye dikkat edin. Yalnızca ihtiyacınız olan ağırlıkları ve stilleri yükleyin.

  • Desteklenmeyen Ağırlıklar/Stiller: Bir yazı tipi belirli bir ağırlığı (örneğin, 300 veya 900) veya stili (örneğin, italik) desteklemiyorsa, tarayıcı mevcut en yakın ağırlığı veya stili kullanır veya bir taklit (fake bold/italic) oluşturabilir. En iyi sonuçlar için, kullanmayı planladığınız tüm ağırlık ve stillerin yazı tipi dosyasında mevcut olduğundan emin olun.

8
0
Hormonlar: Hayatımızın Gizli Orkestra Şefleri

Sabah uyandığınızda hissettiğiniz o enerji patlaması, ya da aniden bastıran hüzün... Belki de geceleri bir türlü uyuyamama haliniz ya da hiç beklemediğiniz bir anda hissettiğiniz yoğun açlık hissi. Tüm bunların arkasında ne var biliyor musunuz? Minik ama güçlü kimyasal haberciler: Hormonlar!


Hayatımızın her anını, her tepkimizi, her düşüncemizi sessizce yöneten bu moleküller, vücudumuzun gizli orkestra şefleri gibi çalışır. Karmaşık bir senfoni misali, her biri kendi görevini mükemmel bir zamanlamayla yerine getirir. Peki, bu görünmez yöneticiler hayatımızı tam olarak nasıl kontrol ediyor ve biz bu dengeyi nasıl koruyabiliriz?


Hormonlar Tam Olarak Nedir ve Nasıl Çalışır?


Hormonlar, endokrin bezleri (tiroid, hipofiz, pankreas, böbrek üstü bezleri gibi) tarafından üretilen ve kan dolaşımına salınan kimyasal maddelerdir. Kan yoluyla vücudun farklı bölgelerindeki hedef hücrelere ulaşarak belirli mesajlar iletirler. Bu mesajlar, hücrelerin ne yapması gerektiğini söyler ve vücudun fonksiyonlarını düzenler.


Bir tür içsel iletişim ağı gibi düşünebilirsiniz. Büyümeden metabolizmaya, ruh halinden uyku düzenine, üremeden strese kadar pek çok hayati fonksiyonda rol oynarlar. Bu minik moleküllerin doğru miktarda ve doğru zamanda salgılanması, bedenimizin ve zihnimizin sağlıklı kalması için kritik öneme sahiptir.


Stres Hormonları: Savaş ya da Kaç Mekanizması


Hayatımızdaki en belirgin etkilerden biri stresle başa çıkma şeklimizdir. Kortizol ve adrenalin (epinefrin), acil durumlarda devreye giren 'savaş ya da kaç' hormonlarıdır. Bir tehlike algıladığımızda (bu gerçek bir tehdit de olabilir, sadece zihnimizde yarattığımız bir kaygı da), vücudumuz bu hormonları hızla salgılamaya başlar.


Adrenalin, kalp atış hızımızı artırır, kanı kaslarımıza pompalar ve ani bir enerji patlaması sağlar. Kortizol ise kan şekerimizi yükselterek anlık enerji ihtiyacımızı karşılar ve iltihabı baskılamaya yardımcı olur. Bu sayede hızlı tepki vermemizi ve kendimizi korumamızı sağlarlar. Ancak modern yaşamda kronik stres, bu hormonların sürekli yüksek seyretmesine neden olabilir. Bu durum, bağışıklık sistemini zayıflatabilir, uyku sorunlarına, kilo alımına, yüksek tansiyona ve hatta hafıza problemlerine yol açabilir.


Mutluluk Hormonları: Ruh Halimizin Yöneticileri


Hayatımızı kontrol eden sadece stres değil, aynı zamanda mutluluğumuz, motivasyonumuz ve sosyal bağlarımız da hormonlarla iç içedir. Serotonin, dopamin, oksitosin ve endorfin gibi hormonlar, genellikle 'mutluluk hormonları' olarak bilinir ve ruh halimizi derinden etkiler.


  • Serotonin: Ruh halimizi, uyku düzenimizi, iştahımızı ve sindirimimizi etkileyen önemli bir nörotransmitter ve hormondur. Düşük serotonin seviyeleri depresyon, anksiyete ve uyku bozukluklarıyla ilişkilendirilir. Güneş ışığına maruz kalmak, egzersiz yapmak ve triptofan içeren besinler (örneğin hindi, yumurta, peynir) tüketmek serotonin üretimini destekleyebilir.


  • Dopamin: Ödül ve motivasyon sistemiyle bağlantılıdır. Yeni bir şey öğrendiğimizde, bir hedefimize ulaştığımızda veya bir başarı elde ettiğimizde salgılanır, bize haz ve tatmin duygusu verir. Bu 'iyi hissettiren' hormon, bizi harekete geçmeye ve hedeflerimize ulaşmaya teşvik eder. Bağımlılıklarla da ilişkili olduğu bilinir.


  • Oksitosin: "Aşk hormonu" veya "bağlanma hormonu" olarak da bilinir. Sarılma, dokunma, sosyal bağ kurma ve cinsel yakınlık anlarında salgılanır. Güven duygusunu, empatiyi ve bağlılığı artırır. Annelerde doğum ve emzirme sırasında salgılanarak anne-bebek arasındaki bağı güçlendirir. Sosyal etkileşim ve sevgi dolu ilişkiler oksitosin seviyelerini yükseltir.


  • Endorfin: Vücudun doğal ağrı kesicisidir. Stres veya ağrıya tepki olarak salgılanır, aynı zamanda egzersiz yaparken (özellikle uzun süreli), kahkaha atarken veya baharatlı yiyecekler yerken de salgılanarak bize öfori ve rahatlama hissi verir. 'Koşucu yüksekliği' olarak bilinen durumun arkasındaki ana faktörlerden biridir.


Uyku Hormonu: Melatonin


Uykumuz da hormonların sıkı kontrolü altında. Melatonin, beynimizdeki epifiz bezi tarafından salgılanan bir hormondur ve vücudumuzun sirkadiyen ritmini, yani uyku-uyanıklık döngüsünü düzenler. Karanlıkta salgılanmaya başlar ve bize uyku vaktinin geldiğini haber verirken, gündüz ışığı ise melatonin üretimini baskılar.


Modern yaşamda, ekranlara maruz kalma, düzensiz uyku saatleri veya vardiyalı çalışma gibi faktörler melatonin döngümüzü bozabilir. Bu da uyku kalitemizi doğrudan etkiler, uykuya dalmakta zorlanma, yorgunluk ve genel olarak zayıf bir uyku düzeni ile sonuçlanabilir.


Metabolizma Hormonları: Enerji ve Kilo Dengesi


Enerjimiz, kilomuz ve genel vücut işleyişimiz de hormonların marifetidir. Tiroid hormonları (T3 ve T4) ve insülin bu süreçte kilit rol oynar.


  • Tiroid Hormonları (T3, T4): Boynumuzda bulunan tiroid bezi tarafından üretilir ve metabolizma hızımızı belirler. Vücudun enerji üretimini, sıcaklığını, kalp atış hızını ve organların çalışma hızını etkiler. Tiroid hormonlarının fazlalığı (hipertiroidi) kilo kaybı, çarpıntı ve anksiyeteye; eksikliği (hipotiroidi) ise kilo alımı, yorgunluk ve depresyona yol açabilir.


  • İnsülin: Pankreas tarafından salgılanan insülin, kan şekerini düzenler. Yemek yedikten sonra kan şekerimiz yükseldiğinde, insülin salgılanır ve hücrelerin glikozu enerji olarak kullanabilmesi için bir anahtar görevi görür. İnsülin direnci veya yetersiz insülin üretimi, tip 2 diyabet gibi ciddi sağlık sorunlarına neden olabilir.


Üreme Hormonları: Cinsiyet ve Yaşam Döngüsü


Cinsiyetimiz, gelişimimiz, üreme sağlığımız ve hatta bazı davranışlarımız da bu hormonların eseridir. Östrojen ve testosteron, temel üreme hormonlarıdır ve hem kadınlarda hem de erkeklerde farklı oranlarda bulunarak çok çeşitli fonksiyonları etkiler.


  • Östrojen: Kadınlarda temel üreme hormonu olup, adet döngüsü, gebelik, kemik sağlığı, cilt elastikiyeti ve ruh hali üzerinde etkilidir. Ergenlik döneminde ikincil cinsel özelliklerin gelişimini sağlar. Menopoz döneminde östrojen seviyelerinin düşmesi, sıcak basmaları, kemik yoğunluğunda azalma ve ruh hali değişimleri gibi semptomlara yol açabilir. Erkeklerde de az miktarda bulunur ve bazı fizyolojik süreçlerde rol oynar.


  • Testosteron: Erkeklerde temel üreme hormonu olup, kas kütlesi, kemik yoğunluğu, sperm üretimi, libido ve enerji seviyeleri üzerinde etkilidir. Ergenlik döneminde ses kalınlaşması, sakal çıkması gibi ikincil cinsel özelliklerin gelişimini sağlar. Düşük testosteron seviyeleri erkeklerde yorgunluk, libido kaybı ve kas kaybına neden olabilir. Kadınlarda da az miktarda bulunarak enerji, libido ve kemik sağlığına katkıda bulunur.


Büyüme Hormonu: Gelişim ve Onarım


Adı üzerinde, büyümemizi sağlayan bir hormondur. Hipofiz bezi tarafından salgılanan büyüme hormonu, çocuklukta boy uzamasını, kas ve kemik gelişimini destekler. Yetişkinlikte ise doku onarımı, metabolizma, kas kütlesinin korunması ve genel vücut kompozisyonu üzerinde etkilidir.


Özellikle derin uyku evrelerinde salgılanımı artar, bu yüzden kaliteli ve yeterli uyku büyüme hormonu seviyeleri için çok önemlidir. Yaşlandıkça büyüme hormonu seviyeleri doğal olarak düşer, bu da kas kütlesi kaybı ve iyileşme sürelerinin uzaması gibi etkilerle ilişkilendirilir.


Hormonal Dengesizlikler ve Etkileri


Peki ya bu hassas denge bozulursa? Hormonlarımızın birinin bile fazla ya da az salgılanması, vücudumuzda domino etkisi yaratarak çok çeşitli sağlık sorunlarına yol açabilir. Hormonal dengesizlikler, yaşam kalitemizi önemli ölçüde etkileyebilir.


Örneğin, tiroid hormonlarının aşırı veya yetersiz salınımı, ani kilo değişiklikleri, yorgunluk veya kalp sorunlarına neden olabilir. Kadınlarda adet düzensizlikleri, polikistik over sendromu (PCOS), kısırlık gibi durumlar hormonal dengesizliklerle yakından ilişkilidir. Erkeklerde düşük testosteron seviyeleri ise enerji düşüklüğü, libido kaybı, kas kütlesi azalması gibi sorunlara yol açabilir. Ruh halindeki ani değişimler, anksiyete, depresyon, hafıza sorunları ve hatta cilt problemleri de hormonal dalgalanmaların bir sonucu olabilir.


Bu nedenle, vücudumuzun gönderdiği sinyallere dikkat etmek ve olası hormonal dengesizlik belirtilerinde bir uzmana danışmak büyük önem taşır.


Hormonları Dengelemek İçin Neler Yapabiliriz?


Hormonların hayatımızdaki bu denli kritik rolünü anladıktan sonra, "Bu kadar önemli bir sistemin sağlıklı çalışması için neler yapabiliriz?" sorusu akla geliyor. İyi haber şu ki, yaşam tarzı seçimlerimizle hormon dengemizi büyük ölçüde destekleyebiliriz:


  • Dengeli ve Besleyici Beslenme: İşlenmiş gıdalardan, aşırı şekerden ve sağlıksız yağlardan uzak durmak hormonlar için temeldir. Yeterli protein, lif, sağlıklı yağlar (omega-3 gibi) ve bol miktarda sebze-meyve tüketmek, hormon üretimi ve dengesi için gerekli yapı taşlarını sağlar.


  • Düzenli Egzersiz: Haftada en az 150 dakika orta yoğunlukta veya 75 dakika yüksek yoğunlukta egzersiz yapmak, hem stres hormonlarını dengelemeye yardımcı olur hem de mutluluk hormonlarının salgılanmasını teşvik eder. Özellikle direnç egzersizleri ve kardiyo, insülin duyarlılığını artırarak metabolik sağlığı destekler.


  • Kaliteli ve Yeterli Uyku: En az 7-9 saat kesintisiz ve kaliteli uyku, melatonin, büyüme hormonu, kortizol ve diğer birçok hormonun düzenli salgılanması için hayati öneme sahiptir. Yatak odanızı karanlık, serin ve sessiz tutmaya özen gösterin.


  • Stres Yönetimi Teknikleri: Meditasyon, yoga, derin nefes egzersizleri, doğada vakit geçirmek, hobiler edinmek veya sevdiklerinizle zaman geçirmek gibi aktiviteler, kortizol seviyelerini düşürmeye ve genel ruh halinizi iyileştirmeye yardımcı olabilir.


  • Yeterli Su Tüketimi: Vücudun tüm kimyasal süreçleri ve hormonların taşınması için su olmazsa olmazdır. Günde en az 8-10 bardak su içmeye özen gösterin.


  • Toksinlerden Uzak Durma: Bazı kimyasallar (örneğin plastiklerdeki BPA, fitalatlar ve bazı pestisitler) hormon taklitçisi görevi görerek endokrin sistemimizi bozabilir. Mümkün olduğunca doğal ve organik ürünler kullanmaya, plastik kullanımını azaltmaya çalışın.


  • Gerekirse Uzman Desteği: Hormonal dengesizlik belirtileri yaşıyorsanız, bir doktor veya endokrinoloji uzmanına danışmak, doğru teşhis ve tedavi için en doğru adımdır.


Unutmayın, hormonlarınızın sağlıklı çalışması, genel sağlığınız, enerji seviyeniz ve yaşam kaliteniz için kritik öneme sahiptir. Vücudunuzun bu gizli orkestra şeflerine iyi bakın, onlar da size harika bir yaşam senfonisi sunsun.


9
0
JavaScript Dilinde JS Math Kullanımı

JavaScript, web uygulamalarının dinamik etkileşimini sağlayan güçlü bir dil olmakla birlikte, karmaşık matematiksel hesaplamalar için de sağlam bir temel sunar. Bu bağlamda, JavaScript'in yerleşik Math nesnesi, standart matematiksel işlevleri ve sabitleri programcıların kullanımına sunarak, sayısal işlemlerin kolay ve verimli bir şekilde gerçekleştirilmesini sağlar. Bir sınıf olmamasına rağmen, Math nesnesi tüm özelliklerini ve metotlarını statik olarak sunar; bu da onun doğrudan erişilebilir olduğu ve örneklendirilmesinin gerekmediği anlamına gelir. Bu makalede, Math nesnesinin temel kullanımından gelişmiş uygulamalarına kadar uzanan çeşitli yönlerini inceleyeceğiz.


Sözdizimi


JavaScript'teki Math nesnesi, doğrudan erişilebilen statik metotlar ve özellikler içerir. Bu, Math nesnesini oluşturmanıza gerek olmadığı anlamına gelir; tüm metotlarına ve özelliklerine doğrudan Math. önekiyle erişilebilir.


Genel kullanım yapısı aşağıdaki gibidir:

Math.propertyName;
Math.methodName(arg1, arg2, ...);

Detaylı Açıklama


Math nesnesi bir yapıcıya (constructor) sahip değildir ve tüm metotları ile özellikleri statiktir. Bu, new Math() şeklinde bir kullanımın geçersiz olduğu ve hata döndüreceği anlamına gelir. Bunun yerine, Math.PI gibi bir sabite veya Math.random() gibi bir metoda doğrudan erişilir.


Aşağıda, Math nesnesinin sıkça kullanılan bazı metotları ve özellikleri detaylı olarak açıklanmıştır:


  • Math.PI: Bir dairenin çevresinin çapına oranı olan pi (π) sayısının değerini döndürür.

  • Math.abs(x): Bir sayının mutlak değerini döndürür.

  • Math.round(x): Bir sayıyı en yakın tam sayıya yuvarlar. .5 durumunda yukarı yuvarlar.

  • Math.floor(x): Bir sayıyı her zaman aşağıya, en yakın tam sayıya yuvarlar.

  • Math.ceil(x): Bir sayıyı her zaman yukarıya, en yakın tam sayıya yuvarlar.

  • Math.random(): 0 (dahil) ile 1 (hariç) arasında rastgele bir ondalık sayı döndürür.

  • Math.max(x1, x2, ..., xn): Verilen sayılar arasındaki en büyük değeri döndürür.

  • Math.min(x1, x2, ..., xn): Verilen sayılar arasındaki en küçük değeri döndürür.

  • Math.pow(x, y): x sayısının y kuvvetini döndürür (xy).

  • Math.sqrt(x): Bir sayının karekökünü döndürür.

  • Math.sin(x), Math.cos(x), Math.tan(x): Trigonometrik sinüs, kosinüs ve tanjant değerlerini radyan cinsinden verilen bir açı için döndürür.


Örnekler


Aşağıdaki örnekler, Math nesnesinin farklı metotlarının pratik uygulamalarını göstermektedir.


Örnek 1: Temel Yuvarlama İşlemleri ve Pi Sabiti Kullanımı

// Pi (π) değerini alma
const piValue = Math.PI;
console.log("Pi değeri:", piValue); // Çıktı: Pi değeri: 3.141592653589793

// Sayı yuvarlama örnekleri
let num1 = 4.7;
let num2 = 4.3;
let num3 = 4.5;
let num4 = -4.7;

console.log("Math.round(4.7):", Math.round(num1));   // Çıktı: 5
console.log("Math.round(4.3):", Math.round(num2));   // Çıktı: 4
console.log("Math.round(4.5):", Math.round(num3));   // Çıktı: 5
console.log("Math.floor(4.7):", Math.floor(num1));   // Çıktı: 4
console.log("Math.ceil(4.3):", Math.ceil(num2));     // Çıktı: 5
console.log("Math.abs(-4.7):", Math.abs(num4));     // Çıktı: 4.7

Örnek 2: Rastgele Sayı Üretimi

Math.random() metodu 0 (dahil) ile 1 (hariç) arasında bir sayı üretir. Belirli bir aralıkta rastgele tam sayı üretmek için bu metot Math.floor() ile birlikte kullanılabilir.

// 0 ile 1 arasında rastgele ondalık sayı
const randomDecimal = Math.random();
console.log("Rastgele ondalık:", randomDecimal); // Örn: 0.123456789

// 1 ile 10 arasında rastgele tam sayı (1 ve 10 dahil)
function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

const randomNum = getRandomInt(1, 10);
console.log("1-10 arası rastgele tam sayı:", randomNum); // Örn: 7

Örnek 3: Üs Alma ve Karekök Hesaplama

// Üs alma (2^3 = 8)
const powerResult = Math.pow(2, 3);
console.log("2 üzeri 3:", powerResult); // Çıktı: 8

// Karekök alma (karekök 81 = 9)
const sqrtResult = Math.sqrt(81);
console.log("81'in karekökü:", sqrtResult); // Çıktı: 9

Örnek 4: En Büyük ve En Küçük Değeri Bulma

const numbers = [10, 5, 20, 8, 15];

// Array'deki en büyük ve en küçük değeri bulmak için spread operatörü (...) kullanılır.
const maxVal = Math.max(...numbers);
const minVal = Math.min(...numbers);

console.log("En büyük değer:", maxVal); // Çıktı: 20
console.log("En küçük değer:", minVal); // Çıktı: 5

// Doğrudan sayılarla da kullanılabilir
console.log("max(1, 5, 2, 9):", Math.max(1, 5, 2, 9)); // Çıktı: 9

Önemli Notlar


  • Statik Nesne: Math bir nesne olmasına rağmen, bir yapıcıya sahip değildir ve doğrudan new Math() ile örneklendirilemez. Tüm metotları ve özellikleri statiktir ve doğrudan Math.metotAdı() veya Math.özellikAdı şeklinde çağrılır.

  • Radyan Kullanımı: Trigonometrik fonksiyonlar (Math.sin(), Math.cos(), Math.tan()) açıları derece yerine radyan cinsinden bekler. Dereceyi radyana çevirmek için derece * (Math.PI / 180) formülünü kullanabilirsiniz.

  • Math.random() Aralığı: Math.random() her zaman 0 (dahil) ile 1 (hariç) arasında bir değer döndürür. Belirli bir aralıkta (min, max) tam sayı elde etmek için genellikle Math.floor(Math.random() * (max - min + 1)) + min formülü kullanılır.

  • Floating-Point Hassasiyeti: JavaScript, diğer programlama dillerinde olduğu gibi, kayan noktalı sayılarla (floating-point numbers) çalışırken hassasiyet sorunları yaşayabilir. Bu durum, özellikle ondalık sayılarla yapılan karmaşık hesaplamalarda beklenmedik sonuçlara yol açabilir. Örneğin, 0.1 + 0.2 doğrudan 0.3 yerine 0.30000000000000004 sonucunu verebilir.

  • Type Coercion: Math metotları, kendisine geçirilen argümanları otomatik olarak sayısal tiplere dönüştürmeye çalışır. Geçersiz bir değer (örneğin, bir string) geçirildiğinde NaN (Not-a-Number) döndürebilir.

8
0
SQL Aggregate Functions: Veri Kümelerini Özetleme ve Analiz Etme Rehberi

SQL (Structured Query Language), veritabanlarındaki büyük veri kümelerini yönetmek ve analiz etmek için temel bir araçtır. Bu analizin kritik bir parçası, veri gruplarını özetlemeye ve tek bir anlamlı değer döndürmeye yarayan Aggregate Functions (Toplama Fonksiyonları) olarak bilinen özel işlevlerdir. Bu fonksiyonlar, bir sütundaki tüm değerlerin toplamını, ortalamasını, en büyük veya en küçük değerini veya toplam satır sayısını hesaplamak gibi işlemleri gerçekleştirmek için kullanılır. Bu makale, SQL Aggregate Functions'ın temel prensiplerini, sözdizimini, pratik kullanım örneklerini ve önemli notları kapsamlı bir şekilde açıklamaktadır.


Sözdizimi


SQL Aggregate Functions, genellikle SELECT ifadesi içinde, isteğe bağlı olarak GROUP BY, WHERE ve HAVING yan tümceleriyle birlikte kullanılır. Genel sözdizimi aşağıdaki gibidir:

SELECT
    kolon_adı_1,
    AGGREGATE_FUNCTION(kolon_adı_2) AS takma_ad
FROM
    tablo_adı
WHERE
    koşul_filtreleme_satırlar
GROUP BY
    kolon_adı_1
HAVING
    koşul_filtreleme_gruplar
ORDER BY
    kolon_adı_1;

Detaylı Açıklama


Yukarıdaki sözdizimindeki her bir bileşen, agrega fonksiyonlarının nasıl çalıştığını anlamak için hayati öneme sahiptir:


  • SELECT: Sorgunuzdan döndürülecek sütunları belirtir. Agrega fonksiyonları bu bölümde kullanılır ve genellikle bir AS anahtar kelimesi ile bir takma ad (alias) atanır.


  • AGGREGATE_FUNCTION(kolon_adı_2): Veriler üzerinde işlem yapacak olan toplama fonksiyonudur. En yaygın kullanılanlar şunlardır:


    • COUNT(): Belirli bir sütundaki veya tüm satırlardaki eleman sayısını döndürür. COUNT(*) tüm satırları sayar, COUNT(kolon_adı) NULL olmayan değerleri sayar, COUNT(DISTINCT kolon_adı) ise benzersiz NULL olmayan değerleri sayar.


    • SUM(): Belirli bir sayısal sütundaki tüm değerlerin toplamını hesaplar.


    • AVG(): Belirli bir sayısal sütundaki tüm değerlerin ortalamasını hesaplar.


    • MIN(): Belirli bir sütundaki en küçük değeri döndürür.


    • MAX(): Belirli bir sütundaki en büyük değeri döndürür.


  • FROM tablo_adı: Verilerin çekileceği tablonun adını belirtir.


  • WHERE koşul_filtreleme_satırlar: Agrega işlemi yapılmadan önce satırları filtrelemek için kullanılır. Bu yan tümce, gruplama yapılmadan önceki bireysel satırlara uygulanır.


  • GROUP BY kolon_adı_1: Satırları bir veya daha fazla sütuna göre gruplar. Agrega fonksiyonu daha sonra her grup için ayrı ayrı uygulanır ve her gruptan tek bir özet satırı döndürülür. SELECT listesinde agrega fonksiyonu dışında kalan her sütunun GROUP BY listesinde de yer alması gerekir.


  • HAVING koşul_filtreleme_gruplar: GROUP BY ile oluşturulan grupları filtrelemek için kullanılır. WHERE yan tümcesinin aksine, HAVING ifadesi agrega fonksiyonlarının sonuçlarına dayalı filtreleme yapabilir.


  • ORDER BY kolon_adı_1: Sonuç kümesini belirli bir sütuna veya agrega sonucuna göre sıralar.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler için, bir şirketin satış verilerini içeren Satislar adlı bir tablo ve çalışan bilgilerini içeren Calisanlar adlı bir tablo kullanıldığını varsayalım.


Satislar Tablo Yapısı:

CREATE TABLE Satislar (
    SatisID INT PRIMARY KEY,
    UrunID INT,
    MusteriID INT,
    SatisTarihi DATE,
    Miktar DECIMAL(10, 2),
    Adet INT
);

INSERT INTO Satislar (SatisID, UrunID, MusteriID, SatisTarihi, Miktar, Adet) VALUES
(1, 101, 1, '2023-01-15', 150.75, 2),
(2, 102, 2, '2023-01-15', 200.00, 1),
(3, 101, 1, '2023-01-16', 75.50, 1),
(4, 103, 3, '2023-01-16', 300.25, 3),
(5, 102, 1, '2023-01-17', 120.00, 1),
(6, 101, 4, '2023-01-17', 50.00, 1),
(7, 104, 2, '2023-01-18', 450.00, 2),
(8, 101, NULL, '2023-01-18', 100.00, 1);

Calisanlar Tablo Yapısı:

CREATE TABLE Calisanlar (
    CalisanID INT PRIMARY KEY,
    Ad VARCHAR(50),
    Soyad VARCHAR(50),
    Departman VARCHAR(50),
    Maas DECIMAL(10, 2)
);

INSERT INTO Calisanlar (CalisanID, Ad, Soyad, Departman, Maas) VALUES
(1, 'Ayşe', 'Yılmaz', 'IT', 60000.00),
(2, 'Can', 'Demir', 'Satış', 55000.00),
(3, 'Elif', 'Kaya', 'IT', 62000.00),
(4, 'Mert', 'Arslan', 'Pazarlama', 58000.00),
(5, 'Zeynep', 'Şahin', 'Satış', 59000.00),
(6, 'Deniz', 'Çelik', 'Pazarlama', 57000.00);

1. Toplam Satış Sayısını Bulma (COUNT(*))


Bu sorgu, Satislar tablosundaki toplam satış kaydını döndürür.

SELECT
    COUNT(*) AS ToplamSatisSayisi
FROM
    Satislar;

2. Belirli Bir Kolondaki NULL Olmayan Değer Sayısı (COUNT(kolon_adı))


MusteriID değeri olan (yani NULL olmayan) satışların sayısını bulur.

SELECT
    COUNT(MusteriID) AS MusteriliSatisSayisi
FROM
    Satislar;

3. Benzersiz Müşteri Sayısını Bulma (COUNT(DISTINCT kolon_adı))


Kaç farklı müşterinin satış yaptığını gösterir.

SELECT
    COUNT(DISTINCT MusteriID) AS BenzersizMusteriSayisi
FROM
    Satislar;

4. Toplam Satış Miktarını Hesaplama (SUM())


Tüm satışların toplam miktarını döndürür.

SELECT
    SUM(Miktar) AS ToplamSatisMiktari
FROM
    Satislar;

5. Ortalama Satış Miktarını Hesaplama (AVG())


Tüm satışların ortalama miktarını döndürür.

SELECT
    AVG(Miktar) AS OrtalamaSatisMiktari
FROM
    Satislar;

6. En Yüksek ve En Düşük Satış Miktarını Bulma (MAX(), MIN())


En yüksek ve en düşük satış miktarını aynı sorguda bulur.

SELECT
    MAX(Miktar) AS EnYuksekSatisMiktari,
    MIN(Miktar) AS EnDusukSatisMiktari
FROM
    Satislar;

7. Her Ürün İçin Toplam Satış Miktarını ve Adedini Bulma (GROUP BY)


Bu sorgu, her bir UrunID için toplam satış miktarını ve satılan toplam adedi hesaplar.

SELECT
    UrunID,
    SUM(Miktar) AS ToplamMiktar,
    SUM(Adet) AS ToplamAdet
FROM
    Satislar
GROUP BY
    UrunID
ORDER BY
    UrunID;

8. Belirli Bir Eşiğin Üzerinde Toplam Satışa Sahip Ürünleri Listeleme (HAVING)


Sadece toplam satış miktarı 200'den büyük olan ürünleri listeler.

SELECT
    UrunID,
    SUM(Miktar) AS ToplamMiktar
FROM
    Satislar
GROUP BY
    UrunID
HAVING
    SUM(Miktar) > 200
ORDER BY
    ToplamMiktar DESC;

9. Departmanlara Göre Ortalama Maaş ve Çalışan Sayısı (GROUP BY ve Farklı Fonksiyonlar)


Her departmandaki ortalama maaşı ve çalışan sayısını gösterir.

SELECT
    Departman,
    AVG(Maas) AS OrtalamaMaas,
    COUNT(CalisanID) AS CalisanSayisi
FROM
    Calisanlar
GROUP BY
    Departman
HAVING
    COUNT(CalisanID) > 1 -- Birden fazla çalışanı olan departmanlar
ORDER BY
    OrtalamaMaas DESC;

Önemli Notlar


  • NULL Değerler: SUM(), AVG(), MIN(), MAX() gibi çoğu agrega fonksiyonu, hesaplamalarında NULL değerleri göz ardı eder. COUNT(kolon_adı) da yalnızca NULL olmayan değerleri sayarken, COUNT(*) NULL değerleri içeren satırları da sayar.


  • WHERE vs. HAVING: WHERE yan tümcesi, gruplama yapılmadan önce bireysel satırları filtreler. HAVING yan tümcesi ise, GROUP BY işlemi uygulandıktan sonra oluşan grupları filtrelemek için kullanılır ve agrega fonksiyonlarının sonuçlarını kullanabilir.


  • GROUP BY Kısıtlamaları: SELECT ifadesinde agrega fonksiyonu kullanmıyorsanız ve GROUP BY kullanıyorsanız, SELECT listesindeki tüm sütunların GROUP BY listesinde de yer alması gerekir (veya agrega fonksiyonları içinde olmaları gerekir). Aksi takdirde, SQL veritabanı hangi değerin her grup için döndürüleceğini bilemez ve bir hata verir.


  • DISTINCT Anahtar Kelimesi: COUNT(DISTINCT kolon_adı), SUM(DISTINCT kolon_adı), AVG(DISTINCT kolon_adı) gibi kullanımlar, yalnızca belirtilen sütundaki benzersiz değerler üzerinde işlem yapar. Örneğin, SUM(DISTINCT Miktar), aynı miktara sahip birden fazla satış olsa bile her miktarı yalnızca bir kez toplar.


  • Performans: Büyük veri kümelerinde agrega fonksiyonlarının kullanımı, özellikle GROUP BY ve ORDER BY ile birleştiğinde performans üzerinde etkili olabilir. Uygun indeksleme, sorgu performansını artırmada önemli rol oynar.


8
0
PHP Dilinde Öznitelikler (Attributes) Kullanımı: Derinlemesine Bir Kılavuz

PHP 8.0 ile birlikte dile eklenen öznitelikler (attributes), kodunuza yapısal meta veriler eklemenin modern ve deklaratif bir yolunu sunar. Bu özellik, daha önce genellikle DocBlock yorumları aracılığıyla sağlanan bilgilerin, doğrudan dilin kendisi tarafından tanınabilen ve yansıma (reflection) API'si aracılığıyla erişilebilen bir formatta tanımlanmasına olanak tanır. Öznitelikler, sınıflara, yöntemlere, özelliklere, fonksiyonlara ve hatta parametrelere atanabilir, bu da framework'ler, ORM'ler, validasyon sistemleri ve diğer kod analiz araçları için güçlü ve tip güvenli bir mekanizma sağlar.


Temel Sözdizimi


PHP'de bir öznitelik, köşeli parantezler (#[ ve ]) içine alınmış bir isim ve isteğe bağlı olarak parametreler ile tanımlanır. Bu isim, aslında bir PHP sınıfının adıdır ve bu sınıfın bir örneği, özniteliğin uygulandığı elemanla ilişkilendirilir.



Detaylı Açıklama


Bir özniteliğin kendisi, #[Attribute] özniteliği ile işaretlenmiş basit bir PHP sınıfıdır. Bu işaretleme, PHP motoruna ilgili sınıfın bir öznitelik olarak kullanılabileceğini bildirir.


  • Öznitelik Sınıfı Tanımlama: Bir öznitelik oluşturmak için, #[Attribute] özniteliğini kullanarak bir sınıf tanımlamanız gerekir. Bu sınıf, özniteliğin davranışını veya içerdiği verileri belirler.


    message = $message;
        }
    }
    

  • Hedef Kısıtlamaları: #[Attribute] özniteliğine parametreler geçirilerek, özniteliğin hangi türdeki elemanlara (sınıf, yöntem, özellik vb.) uygulanabileceği kısıtlanabilir. Bu, Attribute::TARGET_CLASS, Attribute::TARGET_METHOD, Attribute::TARGET_PROPERTY, Attribute::TARGET_FUNCTION, Attribute::TARGET_PARAMETER ve Attribute::TARGET_ALL gibi sabitlerle yapılır.



  • Tekrarlanabilir Öznitelikler: Varsayılan olarak, bir elemana aynı öznitelikten yalnızca bir tane uygulanabilir. Ancak, Attribute::IS_REPEATABLE sabiti kullanılarak bir özniteliğin birden çok kez uygulanmasına izin verilebilir.


    name = $name;
        }
    }
    

  • Parametreler: Öznitelik sınıfları, constructor'ları aracılığıyla parametre alabilirler. Bu parametreler, özniteliği uygularken doğrudan parantez içinde belirtilir ve özniteliğin davranışını özelleştirmek için kullanılır.



Pratik Kullanım Örnekleri


Aşağıdaki örnekler, PHP özniteliklerinin nasıl tanımlandığını ve yansıma API'si (Reflection API) kullanılarak nasıl okunduğunu göstermektedir.


Örnek 1: Basit Bir Yönlendirme (Routing) Özniteliği


Bu örnek, bir web uygulamasında yöntemleri belirli URL yollarına bağlamak için kullanılabilecek basit bir #[Route] özniteliği tanımlar ve ardından bu özniteliği yansıma ile okur.


path = $path;
        $this->methods = $methods;
    }
}

class ApiController
{
    #[Route("/api/users", "GET")]
    public function getUsers(): array
    {
        return ['John Doe', 'Jane Smith'];
    }

    #[Route("/api/users/{id}", "GET")]
    public function getUser(int $id): string
    {
        return "User ID: {$id}";
    }
}

// Öznitelikleri yansıma ile okuma
$reflector = new ReflectionClass(ApiController::class);

foreach ($reflector->getMethods() as $method) {
    echo "Metot: " . $method->getName() . "
"; foreach ($method->getAttributes(Route::class) as $attribute) { $route = $attribute->newInstance(); // Öznitelik sınıfının bir örneğini oluşturur echo " Yol: " . $route->path . ", Metotlar: " . implode(", ", $route->methods) . "
"; } } /* Çıktı: Metot: getUsers Yol: /api/users, Metotlar: GET Metot: getUser Yol: /api/users/{id}, Metotlar: GET */

Örnek 2: Validasyon (Doğrulama) Özniteliği ve Hedef Kısıtlaması


Bu örnek, bir özelliğin minimum ve maksimum değerler arasında olmasını gerektiren bir #[Range] özniteliği tanımlar ve bu özniteliği yalnızca özelliklere uygulanacak şekilde kısıtlar.


min = $min;
        $this->max = $max;
    }
}

class Product
{
    #[Range(min: 0, max: 100)]
    public int $stock;

    #[Range(min: 1, max: 999)]
    public float $price;

    public function __construct(int $stock, float $price)
    {
        $this->stock = $stock;
        $this->price = $price;
    }
}

// Öznitelikleri yansıma ile okuma
$reflector = new ReflectionClass(Product::class);

foreach ($reflector->getProperties() as $property) {
    echo "Özellik: " . $property->getName() . "
"; foreach ($property->getAttributes(Range::class) as $attribute) { $range = $attribute->newInstance(); echo " Min: " . $range->min . ", Max: " . $range->max . "
"; } } /* Çıktı: Özellik: stock Min: 0, Max: 100 Özellik: price Min: 1, Max: 999 */

Örnek 3: Tekrarlanabilir Öznitelikler


Bu örnek, bir sınıfın birden fazla etiketle işaretlenmesine olanak tanıyan tekrarlanabilir bir #[Tag] özniteliği tanımlar.


name = $name;
    }
}

#[Tag("Veritabanı")]
#[Tag("ORM")]
#[Tag("PHP 8")]
class UserRepository
{
    // ...
}

// Öznitelikleri yansıma ile okuma
$reflector = new ReflectionClass(UserRepository::class);

echo "Sınıf: " . $reflector->getName() . "
"; foreach ($reflector->getAttributes(Tag::class) as $attribute) { $tag = $attribute->newInstance(); echo " Etiket: " . $tag->name . "
"; } /* Çıktı: Sınıf: UserRepository Etiket: Veritabanı Etiket: ORM Etiket: PHP 8 */

İpuçları ve Önemli Notlar


  • Performans Avantajı: Öznitelikler, DocBlock yorumlarının aksine, PHP'nin derleme aşamasında işlenir. Bu, çalışma zamanında ek bir ayrıştırma (parsing) yükü oluşturmadıkları anlamına gelir ve performans açısından DocBlock tabanlı çözümlerden daha verimlidir.


  • Kullanım Alanları: Öznitelikler, framework'lerde (örneğin, yönlendirme, ORM eşlemesi), validasyon kuralı tanımlarında, seri hale getirme (serialization) işlemlerinde, kod üretimi (code generation) araçlarında ve IDE entegrasyonlarında yaygın olarak kullanılır.


  • Yansıma API'si (Reflection API): Özniteliklere erişim yalnızca PHP'nin Yansıma API'si aracılığıyla mümkündür. ReflectionClass::getAttributes(), ReflectionMethod::getAttributes() gibi yöntemler, uygulanan öznitelikleri almanızı sağlar.


  • Ad Alanları (Namespaces): Öznitelik sınıflarını kullanırken, tıpkı diğer sınıflarda olduğu gibi ad alanlarını (namespaces) doğru bir şekilde belirtmeli veya use ifadesiyle içe aktarmalısınız.


  • PHP Sürümü: Öznitelikler özelliği sadece PHP 8.0 ve sonraki sürümlerde mevcuttur. Daha önceki PHP sürümlerinde kullanılmaya çalışıldığında ayrıştırma hatasına neden olur.


  • Constructor Bağımsız Değişkenleri: Öznitelik sınıflarının constructor'ları, tip ipuçları (type hints) ile tanımlanan bağımsız değişkenleri kabul edebilir. Bu, özniteliğe geçirilen değerlerin tip güvenliğini sağlar.


  • Sözdizimi Esnekliği: Öznitelikler, tek bir satırda veya birden fazla satıra yayılarak tanımlanabilir, bu da kod okunabilirliğini artırır.



7
0
HTML Dilinde Sayfa Başlığı (Page Title) Kullanımı

Web belgelerinin temel bileşenlerinden biri olan HTML sayfa başlığı, kullanıcı deneyimi ve arama motoru optimizasyonu (SEO) açısından kritik bir öneme sahiptir. Bir web sayfasının başlığını tanımlayan bu bileşen, tarayıcı sekmelerinde, arama motoru sonuç sayfalarında (SERP'ler) ve yer imlerinde görünen metindir. Bu makale, </code> etiketinin HTML dilindeki doğru kullanımını, sözdizimini, pratik örneklerini ve geliştiriciler için önemli ipuçlarını teknik bir yaklaşımla ele alacaktır.</p><br> <h3>Sözdizimi</h3><br> <p>HTML belgelerinde sayfa başlığı, <code><head></code> bölümü içinde yer alan <code><title></code> etiketi ile tanımlanır. Bu etiket, açılış ve kapanış etiketleri arasında sayfanın başlık metnini içerir.</p><br> <div class="code-block"><pre><code><head> <title>Sayfa Başlığı Buraya Gelir

Detaylı Açıklama


  • </code> Etiketi:</strong> Bu, HTML belgesinin başlığını tanımlayan ana etikettir. Bir açılış <code><title></code> etiketi ve bir kapanış <code> etiketi gerektirir. Bu etiket çifti arasına yerleştirilen metin, web sayfasının başlığı olarak işlenir.


  • Başlık Metni: </code> etiketleri arasına yerleştirilen metin, sayfanın içeriğini doğru ve özlü bir şekilde özetlemelidir. Bu metin, tarayıcıların sekme başlıklarında, sık kullanılanlar listelerinde ve arama motoru sonuçlarında görüntülenir. Başlık metni, sayfanın ana konusu hakkında net bir fikir vermelidir.</p><br></li> <li><p><strong>Yerleşim:</strong> <code><title></code> etiketi, HTML belgesinin <code><head></code> etiketi içinde yer almalıdır. <code><head></code> bölümü, sayfa hakkında meta veri (görünmeyen bilgiler) sağlayan diğer etiketleri (örneğin, <code><meta></code>, <code><link></code>, <code><style></code>) barındırır. <code><body></code> etiketi içinde yer alan <code><title></code> etiketi, HTML spesifikasyonlarına aykırıdır ve doğru şekilde işlenmeyebilir.</p><br></li> </ul> <h3>Pratik Kullanım Örnekleri</h3><br> <p>Aşağıdaki örnekler, <code><title></code> etiketinin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.</p><br> <p><strong>Örnek 1: Temel Bir Web Sayfası İçin Başlık Tanımlama</strong></p><br> <p>Bu örnek, genel bir web sayfası için açıklayıcı bir başlık belirlemeyi göstermektedir.</p><br> <div class="code-block"><pre><code><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Hakkımızda - Şirketinizin Adı

Yukarıdaki örnekte, sayfanın "Hakkımızda" bölümü olduğu ve "Şirketinizin Adı" adlı bir kuruluşa ait olduğu net bir şekilde belirtilmiştir. Bu, kullanıcıların ve arama motorlarının sayfanın içeriğini kolayca anlamasına yardımcı olur.


Örnek 2: Blog Yazısı İçin Dinamik Başlık Yapısı


Bir blog veya dinamik içerik platformu için başlıklar genellikle içeriğin kendisinden türetilir. Aşağıdaki yapı, bir blog yazısının başlığını ve genel blog adını birleştirerek nasıl bir </code> oluşturulabileceğini gösterir.</p><br> <div class="code-block"><pre><code><head> <meta charset="UTF-8"> <title>HTML5'te Yeni Özellikler: Detaylı İnceleme - Teknik Blog

Burada, makale başlığı (`HTML5'te Yeni Özellikler: Detaylı İnceleme`) ve blog adı (`Teknik Blog`) birleştirilerek hem bilgilendirici hem de marka bilinirliği sağlayan bir başlık oluşturulmuştur. Bu yaklaşım, dinamik olarak oluşturulan sayfalarda yaygın olarak kullanılır.


Önemli Notlar


  • Tekillik: Her web sayfası için </code> etiketi benzersiz olmalıdır. Yinelenen başlıklar, arama motorlarının sitenizi doğru bir şekilde dizine eklemesini zorlaştırabilir ve kullanıcı deneyimini olumsuz etkileyebilir.</p><br></li> <li><p><strong>Uzunluk:</strong> Çoğu arama motoru, başlıkları yaklaşık 50-60 karakter civarında keser. Bu nedenle, en önemli anahtar kelimelerin ve bilgilerin başlığın başına yerleştirilmesi önerilir.</p><br></li> <li><p><strong>Anahtar Kelime Kullanımı:</strong> Sayfanın ana konusunu en iyi özetleyen ve hedef kitlenizin arama yaparken kullanabileceği anahtar kelimeleri <code><title></code> etiketi içinde doğal bir şekilde kullanmak, SEO performansını artırır.</p><br></li> <li><p><strong>Marka Adı:</strong> Genellikle marka adı veya site adı, başlığın sonunda, bir ayırıcı (örneğin, tire (-) veya dikey çubuk (|)) ile birlikte yer alır. Örnek: "Ürün Adı - Marka Adı".</p><br></li> <li><p><strong>Anlamlı ve Çekici Olma:</strong> Başlık sadece anahtar kelimelerden oluşmamalıdır. Kullanıcıları tıklamaya teşvik edecek, sayfanın içeriği hakkında doğru ve çekici bir açıklama sunmalıdır.</p><br></li> <li><p><strong>Konum:</strong> <code><title></code> etiketi her zaman <code><head></code> etiketi içinde yer almalıdır. Yanlış yerleşim, sayfanızın arama motorları tarafından doğru şekilde tanınmamasına neden olabilir.</p><br></li> </ul> </div> <div class="begenme"> <i class='bx bxs-hot'></i> <div class="begeni-sayisi"> 8 </div> <i class='bx bxs-heart'></i> <div class="begeni-sayisi"> 0 </div> </div> </div> </div> </a> <a style="text-decoration:none; display:flex; justify-content: center; align-items: flex-end;" href="posts/css-dilinde-ikon-kullanimi-temel-yaklasimlar-ve-uygulamalar-422"> <div class="user-yazi"> <div class="yazi-photo"><img class="user-yazi-photo" src="https://softmush.com/api/images/post_banner/css-dilinde-ikon-kullanimi-temel-yaklasimlar-ve-uygulamalar-68f1a3481dec1.webp" alt=""> </div> <div class="yazi-icerik-2"> <div class="yazi-baslik-2"> CSS Dilinde İkon Kullanımı: Temel Yaklaşımlar ve Uygulamalar </div> <div class="yazi-aciklama-2"> Web arayüzlerinde görsel zenginlik ve işlevsellik sağlamak amacıyla ikonlar kritik bir rol oynar. Bu makale, Cascading Style Sheets (CSS) dilini kullanarak web projelerine ikonların nasıl entegre edildiğini ve stilize edildiğini teknik bir perspektiften inceleyecektir. Özellikle, harici ikon kütüphanelerinin kullanımı ve CSS'in bu ikonları görselleştirmedeki gücü üzerinde durulacaktır. <br> <h3>Temel Sözdizimi (Syntax)</h3><br> CSS tabanlı ikon kullanımı genellikle iki ana yaklaşıma dayanır: harici bir ikon fontu kütüphanesini dahil etmek ve bu kütüphanenin sunduğu ikonları CSS pseudo-elementleri (<code>::before</code> veya <code>::after</code>) aracılığıyla veya doğrudan HTML etiketleri üzerinden stilize etmektir. En yaygın yöntem, ikon fontlarının özel karakterlerini <code>content</code> özelliği ile kullanmaktır. <br> <div class="code-block"><pre><code> /* İkon fontunun dahil edilmesi (genellikle <head> içinde veya CSS <link> ile) */ @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css'); /* İkonun bir pseudo-element ile tanımlanması */ .icon-example::before { font-family: 'Font Awesome 6 Free'; /* İkon fontunun adı */ font-weight: 900; /* İkonun kalınlığı (Solid için 900) */ content: '\f007'; /* İkonun Unicode değeri (örneğin, kullanıcı ikonu) */ margin-right: 5px; color: #3498db; } /* Doğrudan bir HTML elementi (örneğin <i>) ile kullanım */ .fa-user { color: #2ecc71; font-size: 24px; } </code></pre><div class="code-footer">softmush.com</div></div> <br> <h3>Detaylı Açıklama</h3><br> Yukarıdaki sözdizimi, CSS ikon kullanımının temel bileşenlerini göstermektedir. Her bir bileşenin işlevi aşağıda açıklanmıştır: <ul> <li><p><code>@import url(...)</code>: Bu direktif, harici bir CSS dosyasını mevcut stil sayfasına dahil etmek için kullanılır. İkon fontu kütüphaneleri genellikle bu yolla veya doğrudan HTML içindeki <code><link></code> etiketiyle projenize entegre edilir. Bu, ikon karakterlerinin tarayıcı tarafından erişilebilir olmasını sağlar.<br></p></li> <li><p><code>.icon-example::before</code>: Bu, bir HTML elementine (<code>.icon-example</code> sınıfına sahip herhangi bir element) görsel içerik eklemek için kullanılan bir <strong>pseudo-element</strong>tir. <code>::before</code>, elementin içeriğinden önce, <code>::after</code> ise elementin içeriğinden sonra ekleme yapar. İkon fontlarını bu şekilde kullanmak, HTML yapısını temiz tutar.<br></p></li> <li><p><code>font-family</code>: İkonun hangi font ailesinden geldiğini belirtir. Bu, dahil ettiğiniz ikon kütüphanesinin sağladığı özel font adıdır (örneğin, Font Awesome için <code>'Font Awesome 6 Free'</code> veya <code>'Material Icons'</code>).<br></p></li> <li><p><code>font-weight</code>: İkon fontunun belirli bir stilini (örneğin, Regular, Solid, Light) seçmek için kullanılır. Font Awesome gibi kütüphanelerde, farklı stiller farklı ağırlık değerleriyle temsil edilir (örneğin, Solid için <code>900</code>, Regular için <code>400</code>).<br></p></li> <li><p><code>content</code>: Pseudo-elementin içine yerleştirilecek içeriği tanımlar. İkon fontları söz konusu olduğunda, bu genellikle ikonun özel <strong>Unicode değeri</strong>dir (örneğin, <code>'\f007'</code>). Her ikonun kendine özgü bir Unicode değeri vardır ve bu değer, ikon kütüphanesinin dökümantasyonunda bulunur.<br></p></li> <li><p><code>.fa-user</code>: Birçok ikon kütüphanesi, ikonları doğrudan HTML etiketlerine (genellikle <code><i></code> veya <code><span></code>) uygulayabileceğiniz önceden tanımlanmış CSS sınıfları (örneğin, <code>fa fa-user</code> veya <code>fas fa-user</code>) sağlar. Bu sınıflar, gerekli <code>font-family</code>, <code>font-weight</code> ve <code>content</code> özelliklerini otomatik olarak uygular.<br></p></li> </ul> <h3>Pratik Kullanım Örnekleri</h3><br> Aşağıdaki örnekler, CSS ikonlarının farklı senaryolarda nasıl kullanılabileceğini göstermektedir. <br> <strong>Örnek 1: Pseudo-Element ile Bir Linke İkon Ekleme</strong> Bu örnek, bir bağlantının önüne Font Awesome'dan bir ev ikonu eklemeyi göstermektedir. <br> <div class="code-block"><pre><code> <!-- HTML Yapısı --> <a href="#" class="home-link">Anasayfa</a> <!-- CSS Kodları --> .home-link { text-decoration: none; color: #2c3e50; font-size: 18px; display: inline-flex; align-items: center; } .home-link::before { font-family: 'Font Awesome 6 Free'; font-weight: 900; /* Solid ikon */ content: '\f015'; /* Ev ikonu Unicode'u */ margin-right: 8px; color: #e74c3c; font-size: 20px; } </code></pre><div class="code-footer">softmush.com</div></div> <br> <strong>Örnek 2: Doğrudan Sınıf Kullanımı ile Sosyal Medya İkonları</strong> Bu örnek, Font Awesome'ın kendi sınıf adlarını kullanarak sosyal medya ikonlarını nasıl gösterebileceğinizi açıklar. <br> <div class="code-block"><pre><code> <!-- HTML Yapısı --> <div class="social-icons"> <i class="fab fa-facebook-f"></i> <i class="fab fa-twitter"></i> <i class="fab fa-instagram"></i> </div> <!-- CSS Kodları --> .social-icons .fab { /* Tüm brand ikonlarına uygulanır */ font-size: 30px; margin: 0 10px; cursor: pointer; transition: color 0.3s ease; } .social-icons .fa-facebook-f { color: #3b5998; } .social-icons .fa-twitter { color: #00acee; } .social-icons .fa-instagram { color: #c32aa3; } .social-icons .fab:hover { opacity: 0.8; } </code></pre><div class="code-footer">softmush.com</div></div> <br> <strong>Örnek 3: Farklı Font Ağırlıkları ve Boyutlandırma</strong> Bu örnek, aynı ikonun farklı ağırlık (solid/regular) ve boyutlarda nasıl kullanılabileceğini gösterir. <br> <div class="code-block"><pre><code> <!-- HTML Yapısı --> <span class="user-profile"> <i class="fas fa-user"></i> Kullanıcı Profili </span> <span class="notification-icon"> <i class="far fa-bell"></i> </span> <!-- CSS Kodları --> .user-profile { font-size: 20px; color: #34495e; margin-right: 20px; } .user-profile .fas { /* Solid kullanıcı ikonu */ color: #27ae60; margin-right: 5px; } .notification-icon { font-size: 24px; color: #e67e22; } .notification-icon .far { /* Regular zil ikonu */ color: #f39c12; } </code></pre><div class="code-footer">softmush.com</div></div> <br> <h3>Önemli Notlar</h3><br> CSS ikonlarını kullanırken göz önünde bulundurulması gereken bazı kritik noktalar aşağıda sıralanmıştır: <ul> <li><p><strong>Performans:</strong> Büyük ikon kütüphanelerinin tamamını dahil etmek, sayfa yükleme süresini artırabilir. Sadece ihtiyacınız olan ikonları veya subset'leri dahil etmeye özen gösterin. Bazı kütüphaneler (örneğin, Font Awesome Pro), sadece seçilen ikonları içeren özel paketler oluşturma imkanı sunar.<br></p></li> <li><p><strong>Erişilebilirlik (Accessibility):</strong> İkonların görsel bir anlamı varsa, ekran okuyucular için bu anlamı sağlamak önemlidir. Genellikle <code><i></code> veya <code><span></code> etiketleri içinde kullanılan ikonlara <code>aria-hidden="true"</code> özelliği ekleyerek ekran okuyucuların tekrarlayan veya anlamsız ikonları okumasını engelleyebilirsiniz. Anlamlı ikonlar için <code><span class="sr-only">[İkon Açıklaması]</span></code> gibi metinsel açıklamalar eklemeyi düşünebilirsiniz.<br></p></li> <li><p><strong>SVG İkonları:</strong> İkon fontlarına alternatif olarak SVG (Scalable Vector Graphics) ikonları da yaygın olarak kullanılır. SVG'ler, çözünürlükten bağımsız olarak keskin görünür ve CSS ile kolayca stilize edilebilir. SVG Sprite veya inline SVG kullanımı, daha iyi performans ve esneklik sağlayabilir.<br></p></li> <li><p><strong>Tarayıcı Desteği:</strong> İkon fontlarının ve pseudo-elementlerin modern tarayıcılarda geniş desteği vardır. Ancak eski tarayıcılar için yedek çözümler veya polifiller gerekebilir.<br></p></li> <li><p><strong>Font Yolu:</strong> İkon fontu dosyalarının (<code>.woff</code>, <code>.ttf</code> vb.) sunucuda doğru yolda olduğundan ve tarayıcının bunlara erişebildiğinden emin olun. Yanlış yol, ikonların kare kutular olarak görünmesine neden olabilir.<br></p></li> </ul> </div> <div class="begenme"> <i class='bx bxs-hot'></i> <div class="begeni-sayisi"> 9 </div> <i class='bx bxs-heart'></i> <div class="begeni-sayisi"> 0 </div> </div> </div> </div> </a> <a style="text-decoration:none; display:flex; justify-content: center; align-items: flex-end;" href="posts/javascript-dilinde-regexp-duzenli-ifadeler-kullanimi-423"> <div class="user-yazi"> <div class="yazi-photo"><img class="user-yazi-photo" src="https://softmush.com/api/images/post_banner/javascript-dilinde-regexp-duzenli-ifadeler-kullanimi-68f1b15702106.webp" alt=""> </div> <div class="yazi-icerik-2"> <div class="yazi-baslik-2"> JavaScript Dilinde RegExp (Düzenli İfadeler) Kullanımı </div> <div class="yazi-aciklama-2"> <p>JavaScript'te düzenli ifadeler (Regular Expressions veya kısaca RegExp), metin içindeki desenleri eşleştirmek, aramak, değiştirmek ve doğrulamak için güçlü bir araçtır. Bu kılavuz, JavaScript ortamında RegExp'in nasıl tanımlandığını ve kullanıldığını, temel sözdiziminden başlayarak çeşitli metotlarla pratik uygulamalarına kadar adım adım açıklamaktadır.</p><br> <h3>Temel Sözdizimi</h3><br> <p>JavaScript'te düzenli ifadeler iki ana şekilde oluşturulabilir: bir <code>RegExp</code> literal'i veya <code>RegExp</code> kurucusu kullanılarak.</p><br> <p>Bir <strong>RegExp literal'i</strong>, deseni iki eğik çizgi (<code>/</code>) arasına alarak oluşturulur ve isteğe bağlı olarak sonuna bayraklar eklenir:</p><br> <div class="code-block"><pre><code>/desen/bayraklar</code></pre><div class="code-footer">softmush.com</div></div> <p>Bir <strong>RegExp kurucusu</strong> ise, deseni ve bayrakları string olarak alır:</p><br> <div class="code-block"><pre><code>new RegExp("desen", "bayraklar")</code></pre><div class="code-footer">softmush.com</div></div> <p>Literal kullanımı genellikle daha basit ve performanttır, ancak desenin veya bayrakların çalışma zamanında dinamik olarak oluşturulması gerektiğinde kurucu yöntemi tercih edilir.</p><br> <h3>Detaylı Açıklama</h3><br> <p>Yukarıdaki sözdiziminde yer alan <code>desen</code> ve <code>bayraklar</code> bileşenleri aşağıdaki gibi açıklanabilir:</p><br> <ul> <li><p><strong>Desen (Pattern):</strong> Eşleştirilmek istenen karakter dizilerini veya kalıpları tanımlar. Bu, sabit karakterler, özel karakterler (örneğin, <code>.</code> herhangi bir karakteri eşleştirmek için), niceleyiciler (örneğin, <code>+</code> bir veya daha fazla kez eşleştirmek için) ve karakter sınıfları (örneğin, <code>[0-9]</code> bir rakamı eşleştirmek için) içerebilir.</p><br></li> <li><p><strong>Bayraklar (Flags):</strong> Düzenli ifadenin eşleştirme davranışını değiştiren isteğe bağlı tek karakterlerdir. En yaygın kullanılan bayraklar şunlardır:</p><br> <ul> <li><p><code>g</code> (global): Desenin tüm eşleşmelerini bulur, ilk eşleşmeden sonra durmaz.</p><br></li> <li><p><code>i</code> (case-insensitive): Büyük/küçük harf duyarsız eşleştirme yapar.</p><br></li> <li><p><code>m</code> (multiline): Çok satırlı giriş dizilerinde <code>^</code> ve <code>$</code> karakterlerinin her satırın başında ve sonunda eşleşmesini sağlar.</p><br></li> <li><p><code>u</code> (unicode): Deseni Unicode kod noktaları dizisi olarak ele alır.</p><br></li> <li><p><code>s</code> (dotAll): <code>.</code> (nokta) karakterinin satır sonu karakterleri dahil herhangi bir karakterle eşleşmesini sağlar.</p><br></li> <li><p><code>d</code> (hasIndices): Eşleşen alt dizelerin başlangıç ve bitiş indekslerini içeren bir dizi döndürür.</p><br></li> </ul><br> </li> </ul><br> <h3>Pratik Kullanım Örnekleri</h3><br> <p>JavaScript'teki string metotları, düzenli ifadelerle birlikte kullanılarak metin üzerinde çeşitli işlemler yapılmasına olanak tanır. İşte bazı temel metotlar ve örnek kullanımları:</p><br> <p><strong>1. <code>RegExp.prototype.test()</code>:</strong> Bir string'de bir desenin bulunup bulunmadığını kontrol eder ve bir boolean değer döndürür.</p> <div class="code-block"><pre><code>const desen = /elma/; const metin1 = "Bugün elma yedim."; const metin2 = "Bugün armut yedim."; console.log(desen.test(metin1)); // true console.log(desen.test(metin2)); // false</code></pre><div class="code-footer">softmush.com</div></div> <p><strong>2. <code>String.prototype.match()</code>:</strong> Bir string'de deseni arar ve tüm eşleşmeleri içeren bir dizi döndürür. <code>g</code> bayrağı yoksa sadece ilk eşleşmeyi döndürür.</p> <div class="code-block"><pre><code>const desen = /elma/g; const metin = "Yeşil elma, kırmızı elma ve sarı elma."; const eslesmeler = metin.match(desen); console.log(eslesmeler); // ["elma", "elma", "elma"] const desenBuyukKucuk = /Elma/gi; // Büyük/küçük harf duyarsız ve global const eslesmelerBuyukKucuk = metin.match(desenBuyukKucuk); console.log(eslesmelerBuyukKucuk); // ["elma", "elma", "elma"]</code></pre><div class="code-footer">softmush.com</div></div> <p><strong>3. <code>String.prototype.replace()</code>:</strong> Bir string'deki desene uyan kısımları başka bir string ile değiştirir.</p> <div class="code-block"><pre><code>const desen = /elma/g; const metin = "Yeşil elma, kırmızı elma."; const yeniMetin = metin.replace(desen, "armut"); console.log(yeniMetin); // "Yeşil armut, kırmızı armut." const desenRakamlar = /\d+/g; // Bir veya daha fazla rakamı eşleştir const metinRakamlar = "Toplam 123 adet ürün, fiyat 45.67 TL."; const yeniMetinRakamlar = metinRakamlar.replace(desenRakamlar, "XXX"); console.log(yeniMetinRakamlar); // "Toplam XXX adet ürün, fiyat XXX.XX TL."</code></pre><div class="code-footer">softmush.com</div></div> <p><strong>4. <code>String.prototype.search()</code>:</strong> Bir string'de deseni arar ve ilk eşleşmenin indeksini döndürür. Eşleşme bulunamazsa <code>-1</code> döndürür. <code>g</code> bayrağı bu metot için anlamsızdır.</p> <div class="code-block"><pre><code>const desen = /kırmızı/; const metin = "Yeşil elma, kırmızı elma."; const indeks = metin.search(desen); console.log(indeks); // 12 (k harfinin indeksi) const desenYok = /mavi/; const indeksYok = metin.search(desenYok); console.log(indeksYok); // -1</code></pre><div class="code-footer">softmush.com</div></div> <p><strong>5. <code>String.prototype.split()</code>:</strong> Bir string'i, belirtilen bir desen veya karakter dizisi kullanarak bir diziye böler.</p> <div class="code-block"><pre><code>const desen = /\s*,\s*/; // Virgül etrafındaki boşlukları da yakalar const metin = "elma, armut , muz, kiraz"; const meyveler = metin.split(desen); console.log(meyveler); // ["elma", "armut", "muz", "kiraz"] const desenKarakter = /a/g; // Her 'a' karakterinden böl const kelime = "banana"; const parcalar = kelime.split(desenKarakter); console.log(parcalar); // ["b", "n", "n", ""] (son 'a'dan sonra boş string)</code></pre><div class="code-footer">softmush.com</div></div> <h3>İpuçları ve Önemli Notlar</h3><br> <ul> <li><p><strong>Kaçış Karakterleri:</strong> Özel anlamı olan karakterleri (örneğin, <code>.</code>, <code>*</code>, <code>+</code>, <code>?</code>, <code>^</code>, <code>$</code>, <code>(</code>, <code>)</code>, <code>[</code>, <code>]</code>, <code>{</code>, <code>}</code>, <code>|</code>, <code>\</code>) desen içinde literal olarak kullanmak isterseniz, önüne ters eğik çizgi (<code>\</code>) ekleyerek kaçış yapmalısınız. Örneğin, bir noktayı (<code>.</code>) eşleştirmek için <code>/\./</code> kullanın.</p><br></li> <li><p><strong>Dinamik Desenler:</strong> Deseni bir string'den oluşturuyorsanız (<code>new RegExp("desen")</code>), bu string içindeki kaçış karakterlerini (<code>\</code>) iki kez kaçış yapmanız gerekebilir (örneğin, <code>new RegExp("\\d+")</code>).</p><br></li> <li><p><strong>Performans:</strong> Çok karmaşık veya verimsiz düzenli ifadeler, özellikle büyük metinler üzerinde çalışırken performans sorunlarına neden olabilir. Deseninizi mümkün olduğunca spesifik ve basit tutmaya çalışın.</p><br></li> <li><p><strong>Stateful RegExp:</strong> <code>g</code> bayrağına sahip bir <code>RegExp</code> nesnesi, <code>lastIndex</code> özelliğini günceller. Aynı <code>RegExp</code> nesnesini birden fazla kez <code>test()</code> veya <code>exec()</code> ile çağırırsanız, eşleşmeler bir önceki çağrının bittiği yerden devam eder. Bu durum, beklenmedik sonuçlara yol açabilir, bu yüzden dikkatli olun veya her kullanımda yeni bir <code>RegExp</code> literal'i oluşturmayı düşünün.</p><br></li> <li><p><strong>Online Araçlar:</strong> Düzenli ifadeleri test etmek ve geliştirmek için Regex101 veya RegExr gibi çevrimiçi araçları kullanmak, karmaşık desenleri anlamanıza ve hata ayıklamanıza yardımcı olabilir.</p><br></li> </ul><br> </div> <div class="begenme"> <i class='bx bxs-hot'></i> <div class="begeni-sayisi"> 10 </div> <i class='bx bxs-heart'></i> <div class="begeni-sayisi"> 0 </div> </div> </div> </div> </a> <a style="text-decoration:none; display:flex; justify-content: center; align-items: flex-end;" href="posts/sql-dilinde-min-ve-max-fonksiyonlarinin-kullanimi-424"> <div class="user-yazi"> <div class="yazi-photo"><img class="user-yazi-photo" src="https://softmush.com/api/images/post_banner/sql-dilinde-min-ve-max-fonksiyonlarinin-kullanimi-68f1bf53431ae.webp" alt=""> </div> <div class="yazi-icerik-2"> <div class="yazi-baslik-2"> SQL Dilinde MIN ve MAX Fonksiyonlarının Kullanımı </div> <div class="yazi-aciklama-2"> <p>SQL (Yapısal Sorgu Dili), veri tabanlarından bilgi çekmek, güncellemek ve yönetmek için kullanılan güçlü bir dildir. Veri analizi süreçlerinde sıkça karşılaşılan ihtiyaçlardan biri, bir veri setindeki en küçük veya en büyük değeri belirlemektir. Bu gereksinimi karşılamak üzere SQL, <code>MIN()</code> ve <code>MAX()</code> adlı iki önemli toplama (aggregate) fonksiyonu sunar. Bu fonksiyonlar, belirli bir sütundaki sayısal, tarih veya hatta metinsel değerler arasında en düşük veya en yüksek olanı hızlıca bulmanızı sağlar.<br></p> <h3>Sözdizimi</h3><br> <p><code>MIN()</code> ve <code>MAX()</code> fonksiyonlarının temel sözdizimi oldukça basittir. Her iki fonksiyon da parametre olarak bir sütun adı alır.<br></p> <div class="code-block"><pre><code>SELECT MIN(kolon_adi) FROM tablo_adi WHERE kosul;</code></pre><div class="code-footer">softmush.com</div></div> <div class="code-block"><pre><code>SELECT MAX(kolon_adi) FROM tablo_adi WHERE kosul;</code></pre><div class="code-footer">softmush.com</div></div> <h3>Detaylı Açıklama</h3><br> <p>Yukarıdaki sözdiziminde yer alan her bir bileşenin anlamı aşağıda açıklanmıştır:<br></p> <ul> <li><p><code>SELECT</code>: Veri tabanından veri çekmek için kullanılan SQL komutudur. Bu komut ile hangi sütunların döndürüleceği belirtilir.<br></p></li> <li><p><code>MIN(kolon_adi)</code>: Belirtilen <code>kolon_adi</code> sütunundaki en küçük (minimum) değeri döndüren toplama fonksiyondur. Sayısal değerler için en küçük sayıyı, tarih değerleri için en eski tarihi, metinsel değerler için ise alfabetik olarak en başta gelen değeri bulur.<br></p></li> <li><p><code>MAX(kolon_adi)</code>: Belirtilen <code>kolon_adi</code> sütunundaki en büyük (maksimum) değeri döndüren toplama fonksiyondur. Sayısal değerler için en büyük sayıyı, tarih değerleri için en yeni tarihi, metinsel değerler için ise alfabetik olarak en sonda gelen değeri bulur.<br></p></li> <li><p><code>FROM tablo_adi</code>: Sorgunun hangi tablodan veri çekeceğini belirtir.<br></p></li> <li><p><code>WHERE kosul</code> (Opsiyonel): Sorgu sonuçlarını belirli bir kritere göre filtrelemek için kullanılır. Sadece bu koşulu sağlayan satırlar <code>MIN()</code> veya <code>MAX()</code> fonksiyonuna dahil edilir.<br></p></li> </ul> <h3>Örnekler</h3><br> <p>Aşağıdaki örneklerde, bir <code>Urunler</code> tablosu kullanıldığı varsayılmıştır. Bu tablo, <code>UrunID</code>, <code>UrunAdi</code>, <code>Kategori</code>, <code>Fiyat</code> ve <code>StokAdedi</code> sütunlarını içermektedir.<br></p> <p><strong>Örnek 1: Tüm Ürünlerin En Düşük Fiyatını Bulma</strong><br></p> <p>Bu sorgu, <code>Urunler</code> tablosundaki tüm ürünler arasında en düşük fiyatı döndürecektir.<br></p> <div class="code-block"><pre><code>SELECT MIN(Fiyat) AS EnDusukFiyat FROM Urunler;</code></pre><div class="code-footer">softmush.com</div></div> <p><strong>Örnek 2: Tüm Ürünlerin En Yüksek Fiyatını Bulma</strong><br></p> <p>Bu sorgu, <code>Urunler</code> tablosundaki tüm ürünler arasında en yüksek fiyatı döndürecektir.<br></p> <div class="code-block"><pre><code>SELECT MAX(Fiyat) AS EnYuksekFiyat FROM Urunler;</code></pre><div class="code-footer">softmush.com</div></div> <p><strong>Örnek 3: Belirli Bir Kategorideki En Düşük Fiyatı Bulma</strong><br></p> <p><code>WHERE</code> koşulunu kullanarak sadece 'Elektronik' kategorisindeki ürünlerin en düşük fiyatını bulabiliriz.<br></p> <div class="code-block"><pre><code>SELECT MIN(Fiyat) AS ElektronikEnDusukFiyat FROM Urunler WHERE Kategori = 'Elektronik';</code></pre><div class="code-footer">softmush.com</div></div> <p><strong>Örnek 4: Her Kategori İçin En Yüksek Fiyatı Bulma</strong><br></p> <p><code>GROUP BY</code> ifadesini kullanarak her bir kategori için ayrı ayrı en yüksek fiyatı bulabiliriz.<br></p> <div class="code-block"><pre><code>SELECT Kategori, MAX(Fiyat) AS KategoriEnYuksekFiyat FROM Urunler GROUP BY Kategori;</code></pre><div class="code-footer">softmush.com</div></div> <p><strong>Örnek 5: En Az Stoğa Sahip Ürünün Stok Adedini Bulma</strong><br></p> <p><code>StokAdedi</code> sütunundaki en küçük değeri bularak, bir ürünün minimum stok adedini belirleyebiliriz.<br></p> <div class="code-block"><pre><code>SELECT MIN(StokAdedi) AS MinimumStok FROM Urunler;</code></pre><div class="code-footer">softmush.com</div></div> <h3>Önemli Notlar</h3><br> <ul> <li><p><strong><code>NULL</code> Değerler:</strong> <code>MIN()</code> ve <code>MAX()</code> fonksiyonları, işleme alırken <code>NULL</code> değerleri genellikle göz ardı eder. Yani, bir sütunda <code>NULL</code> değerler varsa, bu değerler hesaplamaya dahil edilmez.<br></p></li> <li><p><strong>Veri Tipleri:</strong> Bu fonksiyonlar sayısal değerlerin yanı sıra tarih ve metin (string) tipleri üzerinde de çalışır. Tarihler için en eski/en yeni, metinler için ise alfabetik sıralamaya göre en düşük/en yüksek değeri döndürür.<br></p></li> <li><p><strong><code>DISTINCT</code> Anahtar Kelimesi:</strong> <code>MIN(DISTINCT kolon_adi)</code> veya <code>MAX(DISTINCT kolon_adi)</code> şeklinde kullanım mümkündür, ancak <code>MIN()</code> ve <code>MAX()</code> zaten tek bir değer döndürdüğü için <code>DISTINCT</code> anahtar kelimesinin bu bağlamda pratik bir faydası genellikle yoktur.<br></p></li> <li><p><strong>Performans:</strong> Çok büyük veri setlerinde, <code>MIN()</code> ve <code>MAX()</code> sorgularının performansı, ilgili sütun üzerinde indeks olup olmamasına bağlı olarak değişebilir. İndeksler, bu tür sorguların daha hızlı çalışmasını sağlayabilir.<br></p></li> <li><p><strong><code>GROUP BY</code> ve <code>HAVING</code>:</strong> Eğer <code>MIN()</code> veya <code>MAX()</code> fonksiyonlarını <code>GROUP BY</code> ile birlikte kullanıyorsanız ve gruplandırılmış sonuçlar üzerinde bir filtreleme yapmak istiyorsanız, <code>WHERE</code> yerine <code>HAVING</code> koşulunu kullanmanız gerekir. Örneğin, <code>HAVING MAX(Fiyat) > 1000</code>.<br></p></li> </ul> </div> <div class="begenme"> <i class='bx bxs-hot'></i> <div class="begeni-sayisi"> 8 </div> <i class='bx bxs-heart'></i> <div class="begeni-sayisi"> 0 </div> </div> </div> </div> </a> <a style="text-decoration:none; display:flex; justify-content: center; align-items: flex-end;" href="posts/python-dilinde-kosullu-mantik-if-else-kullanimi-425"> <div class="user-yazi"> <div class="yazi-photo"><img class="user-yazi-photo" src="https://softmush.com/api/images/post_banner/python-dilinde-kosullu-mantik-if-else-kullanimi-68f1cd6ad1bf4.webp" alt=""> </div> <div class="yazi-icerik-2"> <div class="yazi-baslik-2"> Python Dilinde Koşullu Mantık: If...Else Kullanımı </div> <div class="yazi-aciklama-2"> <p>Python programlamada karar verme mekanizmaları, kodun belirli koşullara göre farklı yollar izlemesini sağlar. Bu, programlarınızın dinamik ve etkileşimli olmasının temelini oluşturur. Python'daki <code>if</code>, <code>elif</code> (else if'in kısaltması) ve <code>else</code> ifadeleri, bu koşullu mantığı uygulamanın anahtarıdır. Bu kılavuz, Python'da koşullu ifadelerin nasıl kullanılacağını, temel sözdiziminden başlayarak pratik uygulamalara ve önemli ipuçlarına kadar adım adım açıklamaktadır.</p><br> <h3>Sözdizimi</h3><br> <p>Python'da <code>if...elif...else</code> yapısının genel sözdizimi aşağıdaki gibidir:</p><br> <div class="code-block"><pre><code>if koşul1: # koşul1 doğruysa çalışacak kod bloğu elif koşul2: # koşul1 yanlış VE koşul2 doğruysa çalışacak kod bloğu else: # koşul1 ve koşul2 yanlışsa çalışacak kod bloğu </code></pre><div class="code-footer">softmush.com</div></div> <p>Her koşul ifadesi bir kolon (<code>:</code>) ile biter ve koşula bağlı kod bloğu girinti (indentation) ile tanımlanır. Python'da girintiler, kod bloklarını belirtmek için zorunludur.</p><br> <h3>Detaylı Açıklama</h3><br> <ul> <li><p><strong><code>if</code> ifadesi:</strong> Koşullu bloğun başlangıcını işaret eder. Belirtilen <strong><code>koşul1</code></strong> bir boolean (<code>True</code> veya <code>False</code>) olarak değerlendirilir. Eğer koşul <code>True</code> ise, <code>if</code> bloğunun içindeki kod çalıştırılır. Aksi takdirde, program bir sonraki <code>elif</code> veya <code>else</code> ifadesine geçer.</p></li> <li><p><strong><code>elif</code> ifadesi (isteğe bağlı):</strong> Birden fazla koşulu kontrol etmek için kullanılır. Eğer önceki <code>if</code> koşulu yanlışsa, program bir sonraki <code>elif</code> koşulunu kontrol eder. <strong><code>koşul2</code></strong> doğruysa, ilgili <code>elif</code> bloğu çalıştırılır. Bir <code>if</code> yapısında birden fazla <code>elif</code> ifadesi bulunabilir.</p></li> <li><p><strong><code>else</code> ifadesi (isteğe bağlı):</strong> Tüm önceki <code>if</code> ve <code>elif</code> koşulları yanlış olduğunda çalıştırılacak kodu tanımlar. Bu ifade, hiçbir koşulun sağlanmadığı durumlar için bir 'varsayılan' yol sağlar ve yapının sonunda yer alır.</p></li> </ul><br> <p>Unutulmamalıdır ki, bir <code>if...elif...else</code> zincirinde yalnızca bir kod bloğu çalıştırılır. İlk doğru koşul bulunduğunda, ilgili blok çalışır ve tüm yapıdan çıkılır.</p><br> <h3>Pratik Kullanım Örnekleri</h3><br> <p>Aşağıdaki örnekler, <code>if...elif...else</code> yapısının farklı senaryolarda nasıl kullanıldığını göstermektedir.</p><br> <p><strong>Örnek 1: Tek Bir <code>if</code> İfadesi</strong></p><br> <div class="code-block"><pre><code>yaş = 18 if yaş >= 18: print("Oy kullanabilirsiniz.") </code></pre><div class="code-footer">softmush.com</div></div> <p>Bu örnekte, <code>yaş</code> değişkeninin değeri 18 veya daha büyükse mesaj yazdırılır.</p><br> <p><strong>Örnek 2: <code>if...else</code> Kullanımı</strong></p><br> <div class="code-block"><pre><code>hava_durumu = "yağmurlu" if hava_durumu == "güneşli": print("Dışarı çıkıp yürüyüş yapın.") else: print("İçeride kalın ve kitap okuyun.") </code></pre><div class="code-footer">softmush.com</div></div> <p>Burada, <code>hava_durumu</code> değişkeni "güneşli" ise ilk blok, aksi halde <code>else</code> bloğu çalışır.</p><br> <p><strong>Örnek 3: <code>if...elif...else</code> Zinciri</strong></p><br> <div class="code-block"><pre><code>puan = 85 if puan >= 90: print("Notunuz: A") elif puan >= 80: print("Notunuz: B") elif puan >= 70: print("Notunuz: C") else: print("Notunuz: D veya F") </code></pre><div class="code-footer">softmush.com</div></div> <p>Bu örnekte, <code>puan</code> değişkenine göre farklı notlar atanır. Koşullar yukarıdan aşağıya doğru kontrol edilir ve ilk doğru koşulun bloğu çalıştırılır.</p><br> <p><strong>Örnek 4: İç İçe <code>if</code> İfadeleri</strong></p><br> <div class="code-block"><pre><code>kullanici_adi = "admin" sifre = "12345" if kullanici_adi == "admin": if sifre == "12345": print("Yönetici panelinize hoş geldiniz.") else: print("Yanlış şifre.") else: print("Kullanıcı adı bulunamadı.") </code></pre><div class="code-footer">softmush.com</div></div> <p>Koşullar karmaşıklaştığında, <code>if</code> ifadelerini iç içe kullanmak mümkündür. Ancak aşırı iç içe geçmiş yapılar kodun okunabilirliğini azaltabilir.</p><br> <h3>Önemli Notlar ve İpuçları</h3><br> <ul> <li><p><strong>Girinti (Indentation):</strong> Python'da kod blokları girintilerle belirlenir. Genellikle 4 boşluk kullanılır. Yanlış girinti <code>IndentationError</code> hatasına yol açar.</p></li> <li><p><strong>Kolon (<code>:</code>):</strong> Her <code>if</code>, <code>elif</code> ve <code>else</code> ifadesinden sonra bir kolon (<code>:</code>) gelmelidir.</p></li> <li><p><strong>Koşul İfadeleri:</strong> Koşul ifadeleri genellikle karşılaştırma operatörleri (<code>==</code>, <code>!=</code>, <code><</code>, <code>></code>, <code><=</code>, <code>>=</code>) ve mantıksal operatörler (<code>and</code>, <code>or</code>, <code>not</code>) kullanılarak oluşturulur.</p></li> <li><p><strong>Kısa Devre Değerlendirmesi:</strong> Mantıksal operatörler kullanılırken Python, koşulları soldan sağa değerlendirir ve sonucun zaten belirlenebildiği durumlarda değerlendirmeyi durdurur. Örneğin, <code>False and (pahalı_işlem())</code> ifadesinde <code>pahalı_işlem()</code> fonksiyonu asla çağrılmaz.</p></li> <li><p><strong>Boş Bloklar:</strong> Bir koşul bloğunun içine henüz kod yazmak istemiyorsanız, <code>pass</code> anahtar kelimesini kullanarak boş bir blok oluşturabilirsiniz. Bu, bir <code>IndentationError</code> oluşmasını engeller.</p></li> </ul><br> </div> <div class="begenme"> <i class='bx bxs-hot'></i> <div class="begeni-sayisi"> 7 </div> <i class='bx bxs-heart'></i> <div class="begeni-sayisi"> 0 </div> </div> </div> </div> </a> <a style="text-decoration:none; display:flex; justify-content: center; align-items: flex-end;" href="posts/html-dilinde-html-tables-kullanimi-427"> <div class="user-yazi"> <div class="yazi-photo"><img class="user-yazi-photo" src="https://softmush.com/api/images/post_banner/html-dilinde-html-tables-kullanimi-68f1f7b35715b.webp" alt=""> </div> <div class="yazi-icerik-2"> <div class="yazi-baslik-2"> HTML Dilinde HTML Tables Kullanımı </div> <div class="yazi-aciklama-2"> <p>HTML tabloları, verileri satırlar ve sütunlar halinde düzenli bir şekilde sunmak için kullanılan temel yapısal elementlerdir. Bu elementler, istatistiksel verilerden ürün listelerine kadar çeşitli bilgi türlerini okunabilir ve erişilebilir bir formatta görüntülemek için kritik öneme sahiptir. Doğru kullanıldığında, HTML tabloları karmaşık veri setlerinin görselleştirilmesinde güçlü bir araç sunar.</p><br> <h3>Temel Sözdizimi</h3><br> <p>Bir HTML tablosu, <code><table></code> etiketi ile tanımlanır. Tablo içindeki her satır <code><tr></code> (table row) etiketi ile belirtilir. Satırların içindeki her veri hücresi <code><td></code> (table data) etiketi ile oluşturulur. Başlık hücreleri için ise <code><th></code> (table header) etiketi kullanılır. Tablonun başlık bölümünü <code><thead></code>, gövde bölümünü <code><tbody></code> ve altbilgi bölümünü <code><tfoot></code> ile gruplamak, tablo yapısını semantik olarak güçlendirir.</p> <div class="code-block"><pre><code> <table> <thead> <tr> <th>Başlık 1</th> <th>Başlık 2</th> </tr> </thead> <tbody> <tr> <td>Veri 1A</td> <td>Veri 1B</td> </tr> <tr> <td>Veri 2A</td> <td>Veri 2B</td> </tr> </tbody> <tfoot> <tr> <td>Altbilgi 1</td> <td>Altbilgi 2</td> </tr> </tfoot> </table> </code></pre><div class="code-footer">softmush.com</div></div> <h3>Detaylı Açıklama</h3><br> <p>HTML tablolarını oluşturan temel etiketler ve bunların rolleri aşağıda açıklanmıştır:</p><br> <ul> <li><p><code><table></code>: Bu etiket, tüm tablo içeriğini kapsayan ana kapsayıcıdır. Tarayıcıya içeriğin bir tablo olarak yorumlanması gerektiğini bildirir. Genellikle <code>border</code>, <code>width</code> gibi eski nitelikler yerine CSS ile stil verilir.</p></li> <li><p><code><thead></code>: Tablonun başlık (header) bölümünü gruplandırmak için kullanılır. Genellikle tablo sütun başlıklarını içeren bir veya daha fazla <code><tr></code> etiketi içerir. Semantik olarak, bu bölüm tablonun içeriğini özetler ve genellikle sayfanın üst kısmında veya sabit bir konumda kalabilir.</p></li> <li><p><code><tbody></code>: Tablonun ana veri (body) bölümünü gruplandırmak için kullanılır. Tablonun gerçek veri satırlarını (<code><tr></code>) içerir. Bir tabloda birden fazla <code><tbody></code> etiketi bulunabilir, bu da veri gruplarını ayırmak için faydalıdır.</p></li> <li><p><code><tfoot></code>: Tablonun altbilgi (footer) bölümünü gruplandırmak için kullanılır. Genellikle toplamlar, özetler veya dipnotlar gibi bilgileri içeren bir veya daha fazla <code><tr></code> etiketi içerir. <code><tfoot></code> elementi, HTML kodu içinde <code><tbody></code>'den önce tanımlanmış olsa bile tarayıcı tarafından genellikle tablonun en altında görüntülenir.</p></li> <li><p><code><tr></code>: Bir tablo satırını (table row) tanımlar. <code><thead></code>, <code><tbody></code> veya <code><tfoot></code> içinde yer almalıdır. Her <code><tr></code> etiketi, bir veya daha fazla <code><th></code> veya <code><td></code> etiketi içerebilir.</p></li> <li><p><code><th></code>: Bir tablo başlık hücresini (table header) tanımlar. İçindeki metin genellikle tarayıcılar tarafından varsayılan olarak kalın ve ortalanmış olarak görüntülenir. <code><th></code> etiketleri, ilgili sütunun veya satırın ne anlama geldiğini açıklar ve erişilebilirlik açısından önemlidir.</p></li> <li><p><code><td></code>: Bir tablo veri hücresini (table data) tanımlar. Tablonun gerçek verilerini içerir. Her <code><td></code> etiketi, bir <code><tr></code> etiketi içinde yer almalıdır.</p></li> </ul><br> <p>Tablo hücrelerinin sütunları veya satırları birleştirmesi için <code>colspan</code> ve <code>rowspan</code> nitelikleri kullanılır:</p><br> <ul> <li><p><code>colspan</code>: Bir hücrenin kaç sütunu kapsayacağını belirtir. Örneğin, <code><td colspan="2"></code> etiketi, hücrenin iki sütunu genişletmesini sağlar.</p></li> <li><p><code>rowspan</code>: Bir hücrenin kaç satırı kapsayacağını belirtir. Örneğin, <code><td rowspan="2"></code> etiketi, hücrenin iki satır boyunca uzanmasını sağlar.</p></li> </ul> <h3>Pratik Kullanım Örnekleri</h3><br> <p>Aşağıdaki örnekler, HTML tablolarının farklı senaryolarda nasıl kullanılabileceğini göstermektedir.</p><br> <h4>Basit Bir Tablo Oluşturma</h4><br> <p>Bu örnek, temel <code><table></code>, <code><tr></code>, <code><th></code> ve <code><td></code> etiketlerini kullanarak basit bir öğrenci not tablosu oluşturur.</p> <div class="code-block"><pre><code> <table> <thead> <tr> <th>Öğrenci Adı</th> <th>Ders</th> <th>Not</th> </tr> </thead> <tbody> <tr> <td>Ayşe Yılmaz</td> <td>Matematik</td> <td>95</td> </tr> <tr> <td>Can Demir</td> <td>Türkçe</td> <td>88</td> </tr> <tr> <td>Elif Kaya</td> <td>Fizik</td> <td>72</td> </tr> </tbody> </table> </code></pre><div class="code-footer">softmush.com</div></div> <h4><code>colspan</code> ve <code>rowspan</code> Kullanımı</h4><br> <p>Bu örnek, hücreleri birleştirmek için <code>colspan</code> ve <code>rowspan</code> niteliklerinin nasıl kullanılacağını gösterir. Bu, daha karmaşık tablo düzenleri oluşturmak için faydalıdır.</p> <div class="code-block"><pre><code> <table> <thead> <tr> <th rowspan="2">Ürün</th> <th colspan="2">Miktar</th> <th rowspan="2">Fiyat</th> </tr> <tr> <th>Adet</th> <th>Birim</th> </tr> </thead> <tbody> <tr> <td>Laptop</td> <td>1</td> <td>Adet</td> <td>1200 TL</td> </tr> <tr> <td>Mouse</td> <td>2</td> <td>Adet</td> <td>150 TL</td> </tr> </tbody> <tfoot> <tr> <td colspan="3">Toplam</td> <td>1350 TL</td> </tr> </tfoot> </table> </code></pre><div class="code-footer">softmush.com</div></div> <h3>Önemli Notlar</h3><br> <p>HTML tablolarını kullanırken dikkate alınması gereken bazı önemli noktalar şunlardır:</p><br> <ul> <li><p><strong>Semantik Kullanım:</strong> Tabloları yalnızca tablo verileri (satırlar ve sütunlar halinde ilişkili veriler) için kullanın. Sayfa düzeni oluşturmak için tabloları kullanmaktan kaçının; bunun yerine CSS Grid veya Flexbox gibi modern düzen tekniklerini tercih edin.</p></li> <li><p><strong>Erişilebilirlik:</strong> Tabloların erişilebilirliğini artırmak için <code><th></code> etiketlerini doğru kullanın ve <code>scope</code> niteliği ile başlık hücrelerinin kapsamını belirtin (örneğin, <code><th scope="col"></code> veya <code><th scope="row"></code>). Karmaşık tablolar için <code><caption></code>, <code><colgroup></code> ve <code><col></code> etiketlerini de değerlendirin.</p></li> <li><p><strong>Stil Verme:</strong> Tabloların görsel görünümünü değiştirmek için CSS kullanın. Eski HTML nitelikleri (örneğin, <code>border</code>, <code>cellpadding</code>, <code>cellspacing</code>, <code>width</code>) yerine CSS özelliklerini (örneğin, <code>border</code>, <code>padding</code>, <code>border-spacing</code>, <code>width</code>) tercih edin.</p></li> <li><p><strong>Duyarlılık:</strong> Büyük tablolar mobil cihazlarda sorun yaratabilir. Duyarlı tablolar oluşturmak için CSS ile tabloya <code>overflow-x: auto;</code> ekleyerek yatay kaydırma çubukları sağlayabilir veya daha karmaşık duyarlı tablo tekniklerini uygulayabilirsiniz.</p></li> <li><p><strong>Boş Hücreler:</strong> Boş hücreler tarayıcıda boşluk olarak görünebilir. Bir hücrenin içeriği yoksa bile, <code><td></td></code> veya <code><th></th></code> şeklinde kapatılmış bir etiket kullanmak önemlidir.</p></li> </ul> </div> <div class="begenme"> <i class='bx bxs-hot'></i> <div class="begeni-sayisi"> 11 </div> <i class='bx bxs-heart'></i> <div class="begeni-sayisi"> 0 </div> </div> </div> </div> </a> <a style="text-decoration:none; display:flex; justify-content: center; align-items: flex-end;" href="posts/sql-dilinde-count-fonksiyonunun-detayli-kullanimi-430"> <div class="user-yazi"> <div class="yazi-photo"><img class="user-yazi-photo" src="https://softmush.com/api/images/post_banner/sql-dilinde-count-fonksiyonunun-detayli-kullanimi-68f221dba92a9.webp" alt=""> </div> <div class="yazi-icerik-2"> <div class="yazi-baslik-2"> SQL Dilinde COUNT Fonksiyonunun Detaylı Kullanımı </div> <div class="yazi-aciklama-2"> <p> SQL veritabanı yönetiminde, veri kümelerinden bilgi çıkarmak için çeşitli <strong>aggregate fonksiyonlar</strong> kullanılır. Bu fonksiyonlardan biri olan <code>COUNT</code>, bir sorgu tarafından döndürülen satır sayısını veya belirli bir kolondaki <code>NULL</code> olmayan değerlerin sayısını belirlemek için kritik bir araçtır. Bu makale, <code>COUNT</code> fonksiyonunun temel sözdiziminden başlayarak, farklı kullanım senaryoları ve pratik örneklerle detaylı bir rehber sunmaktadır. Veri analizi, raporlama ve istatistiksel sorgular için <code>COUNT</code> fonksiyonunu etkili bir şekilde kullanmayı öğrenmek, her SQL geliştiricisi ve veritabanı yöneticisi için temel bir beceridir. </p><br> <h3>Temel Sözdizimi</h3><br> <p> <code>COUNT</code> fonksiyonunun genel sözdizimi aşağıdaki gibidir: </p><br> <div class="code-block"><pre><code> COUNT ( { * | [ ALL | DISTINCT ] ifade } ) </code></pre><div class="code-footer">softmush.com</div></div> <p> Bu sözdizimi içerisinde farklı parametreler, sayım işleminin nasıl yapılacağını belirler. </p><br> <h3>Detaylı Açıklama</h3><br> <p> <code>COUNT</code> fonksiyonunun yapısını oluşturan her bir bileşen, belirli bir amaca hizmet eder: </p><br> <ul> <li> <p><strong><code>*</code> (Yıldız):</strong> Bir sorgu tarafından döndürülen toplam satır sayısını sayar. Bu, <code>NULL</code> değerler içeren satırları da dahil olmak üzere, filtrelenmiş tüm satırları sayar. Performans açısından genellikle en hızlı yöntemdir çünkü belirli bir kolonu kontrol etme ihtiyacı yoktur.</p> </li> <li> <p><strong><code>ifade</code> (Expression):</strong> Sayılacak olan kolonun adını veya bir ifadeyi belirtir. <code>COUNT(kolon_adı)</code> kullanıldığında, SQL yalnızca bu kolonda <code>NULL</code> olmayan değerlere sahip satırları sayar. Eğer tüm satırları saymak istiyorsanız ve kolonun <code>NULL</code> değer içerme olasılığı varsa, <code>COUNT(*)</code> kullanmanız daha doğru olur.</p> </li> <li> <p><strong><code>ALL</code>:</strong> Bu anahtar kelime isteğe bağlıdır ve varsayılan davranıştır. <code>ifade</code> içindeki tüm değerleri (tekrarlananları da dahil) sayar. Genellikle açıkça belirtilmez.</p> </li> <li> <p><strong><code>DISTINCT</code>:</strong> Bu anahtar kelime, <code>ifade</code> içindeki yalnızca benzersiz, <code>NULL</code> olmayan değerleri sayar. Örneğin, bir kolonda kaç farklı değer olduğunu öğrenmek istediğinizde kullanılır. Performans maliyeti <code>COUNT(*)</code> veya <code>COUNT(kolon_adı)</code>'na göre daha yüksek olabilir, çünkü veritabanının benzersiz değerleri belirlemek için ek işlem yapması gerekir.</p> </li> </ul><br> <p> <code>COUNT</code> fonksiyonu genellikle <code>WHERE</code> yan tümcesi ile birlikte belirli koşullara uyan kayıtları saymak için, <code>GROUP BY</code> yan tümcesi ile birlikte verileri gruplayarak her grup için sayım yapmak üzere ve <code>HAVING</code> yan tümcesi ile birlikte gruplanmış sayımlar üzerinde filtreleme yapmak için kullanılır. </p><br> <h3>Pratik Kullanım Örnekleri</h3><br> <p> Aşağıdaki örnekler, bir <code>Urunler</code> tablosu üzerinden <code>COUNT</code> fonksiyonunun farklı senaryolarda nasıl kullanıldığını göstermektedir. <code>Urunler</code> tablosunun <code>UrunID</code>, <code>UrunAd</code>, <code>KategoriID</code> ve <code>Fiyat</code> kolonlarına sahip olduğunu varsayalım. </p><br> <h4>Örnek 1: Tablodaki Toplam Satır Sayısını Bulma</h4><br> <p> Bu sorgu, <code>Urunler</code> tablosundaki tüm satırların sayısını döndürür. </p><br> <div class="code-block"><pre><code> SELECT COUNT(*) AS ToplamUrunSayisi FROM Urunler; </code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 2: Belirli Bir Kolondaki NULL Olmayan Değerlerin Sayısını Bulma</h4><br> <p> Bu sorgu, <code>Fiyat</code> kolonu <code>NULL</code> olmayan ürünlerin sayısını döndürür. Eğer bazı ürünlerin fiyatı belirtilmemişse, bu sorgu <code>COUNT(*)</code>'dan farklı bir sonuç verebilir. </p><br> <div class="code-block"><pre><code> SELECT COUNT(Fiyat) AS FiyatliUrunSayisi FROM Urunler; </code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 3: Benzersiz Kategori Sayısını Bulma</h4><br> <p> Bu sorgu, <code>Urunler</code> tablosunda kaç farklı kategori bulunduğunu gösterir. </p><br> <div class="code-block"><pre><code> SELECT COUNT(DISTINCT KategoriID) AS BenzersizKategoriSayisi FROM Urunler; </code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 4: Belirli Bir Koşula Uyan Kayıtların Sayısını Bulma</h4><br> <p> Bu sorgu, fiyatı 50 TL'den yüksek olan ürünlerin sayısını döndürür. </p><br> <div class="code-block"><pre><code> SELECT COUNT(*) AS YuksekFiyatliUrunSayisi FROM Urunler WHERE Fiyat > 50; </code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 5: Her Kategori İçin Ürün Sayısını Bulma</h4><br> <p> Bu sorgu, <code>KategoriID</code>'ye göre ürünleri gruplar ve her kategori için toplam ürün sayısını listeler. </p><br> <div class="code-block"><pre><code> SELECT KategoriID, COUNT(*) AS UrunSayisi FROM Urunler GROUP BY KategoriID; </code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 6: Belirli Bir Eşiğin Üzerinde Ürüne Sahip Kategorileri Listeleme</h4><br> <p> Bu sorgu, <code>GROUP BY</code> ile birlikte <code>HAVING</code> yan tümcesini kullanarak, 5'ten fazla ürüne sahip kategorileri ve bu kategorilerdeki ürün sayılarını listeler. </p><br> <div class="code-block"><pre><code> SELECT KategoriID, COUNT(*) AS UrunSayisi FROM Urunler GROUP BY KategoriID HAVING COUNT(*) > 5; </code></pre><div class="code-footer">softmush.com</div></div> <h3>Önemli Notlar</h3><br> <ul> <li> <p><strong><code>COUNT(*)</code> ve <code>COUNT(kolon_adı)</code> Farkı:</strong> <code>COUNT(*)</code>, sorgunun döndürdüğü tüm satırları sayarken, <code>COUNT(kolon_adı)</code> yalnızca belirtilen <code>kolon_adı</code>'nda <code>NULL</code> olmayan değerlere sahip satırları sayar. Bu, özellikle <code>NULL</code> değerlerin bulunduğu kolonlarda önemli bir fark yaratabilir.</p> </li> <li> <p><strong><code>DISTINCT</code> Kullanımı:</strong> <code>COUNT(DISTINCT kolon_adı)</code>, bir kolondaki benzersiz değerlerin sayısını bulmak için kullanılır. Büyük veri kümelerinde performansı etkileyebilir, çünkü veritabanının benzersiz değerleri belirlemek için ek bir sıralama veya hash işlemi yapması gerekebilir.</p> </li> <li> <p><strong>Aggregate Fonksiyonu:</strong> <code>COUNT</code>, bir aggregate fonksiyonudur ve genellikle <code>GROUP BY</code> yan tümcesi ile birlikte kullanılır. <code>GROUP BY</code> kullanılmadığında, tüm veri kümesi tek bir grup olarak kabul edilir ve tek bir sayım değeri döndürülür.</p> </li> <li> <p><strong>Koşullu Sayımlar:</strong> Belirli bir koşula uyan kayıtları saymak için <code>WHERE</code> yan tümcesi kullanılır. Daha karmaşık koşullu sayımlar için <code>CASE</code> ifadesi (örneğin, <code>COUNT(CASE WHEN koşul THEN 1 ELSE NULL END)</code>) kullanılabilir. Bu, aynı sorgu içinde birden fazla koşula dayalı sayım yapmanıza olanak tanır.</p> </li> <li> <p><strong>Performans:</strong> Genel olarak <code>COUNT(*)</code>, <code>COUNT(kolon_adı)</code>'ndan daha performanslı olabilir, çünkü indeksleme durumuna bağlı olarak doğrudan satır sayısına erişebilir. <code>DISTINCT</code> kullanımı ise genellikle en yavaş olanıdır.</p> </li> </ul> </div> <div class="begenme"> <i class='bx bxs-hot'></i> <div class="begeni-sayisi"> 16 </div> <i class='bx bxs-heart'></i> <div class="begeni-sayisi"> 0 </div> </div> </div> </div> </a> <a style="text-decoration:none; display:flex; justify-content: center; align-items: flex-end;" href="posts/python-dilinde-yapisal-desen-eslestirme-structural-pattern-matching-ve-match-deyimi-kullanimi-431"> <div class="user-yazi"> <div class="yazi-photo"><img class="user-yazi-photo" src="https://softmush.com/api/images/post_banner/python-dilinde-yapisal-desen-eslestirme-structural-pattern-matching-ve-match-deyimi-kullanimi-68f22fedea70f.webp" alt=""> </div> <div class="yazi-icerik-2"> <div class="yazi-baslik-2"> Python Dilinde Yapısal Desen Eşleştirme (Structural Pattern Matching) ve Match Deyimi Kullanımı </div> <div class="yazi-aciklama-2"> <p>Python 3.10 ile tanıtılan yapısal desen eşleştirme (structural pattern matching) özelliği, programcılara kodlarını daha okunaklı ve yönetilebilir hale getirme imkanı sunar. Özellikle karmaşık veri yapılarını analiz ederken veya farklı durumları işlerken, <code>match</code> deyimi <code>if/elif/else</code> zincirlerine modern ve güçlü bir alternatif sunar. Bu makale, Python'daki <code>match</code> deyiminin temel prensiplerini, sözdizimini ve çeşitli kullanım senaryolarını detaylı bir şekilde açıklamaktadır.</p> <h3>Sözdizimi</h3><br> <p>Python'daki <code>match</code> deyiminin temel sözdizimi aşağıdaki gibidir:</p><br> <div class="code-block"><pre><code>match konu: case desen_1: # desen_1 eşleşirse çalışacak kod case desen_2 if koşul: # desen_2 eşleşirse ve koşul doğruysa çalışacak kod case _: # hiçbir desen eşleşmezse çalışacak kod (isteğe bağlı)</code></pre><div class="code-footer">softmush.com</div></div> <h3>Detaylı Açıklama</h3><br> <p><code>match</code> deyiminin her bir bileşeni belirli bir amaca hizmet eder:</p><br> <ul> <li><p><code><strong>match konu:</strong></code><br> <code><strong>konu</strong></code> ifadesi, eşleştirme yapılmak istenen herhangi bir Python objesidir. Bu, bir değişken, bir fonksiyon çağrısının sonucu veya doğrudan bir değer olabilir. <code>match</code> deyimi, bu <code>konu</code> objesini sırasıyla tanımlanan <code>case</code> desenleriyle karşılaştırır.</p></li> <li><p><code><strong>case desen:</strong></code><br> Her <code>case</code> bloğu, <code>konu</code> ile eşleştirilmeye çalışılan bir <code><strong>desen</strong></code> tanımlar. Desenler çeşitli tiplerde olabilir ve aşağıdaki gibi farklı eşleştirme mekanizmalarını destekler:</p><br> <ul> <li><p><strong>Değer Desenleri (Literal Patterns):</strong> Sabit değerlerle (sayılar, dizeler, <code>True</code>, <code>False</code>, <code>None</code>) eşleşir. Örn: <code>case 1:</code>, <code>case "hata":</code>.</p></li> <li><p><strong>Yakalama Desenleri (Capture Patterns):</strong> Bir değeri bir değişkene atar. Örn: <code>case x:</code>. Eğer <code>x</code> daha önce tanımlanmamışsa, eşleşen değeri <code>x</code>'e atar. Eğer <code>_</code> kullanılırsa, bu bir <strong>wildcard (joker) deseni</strong> olarak kabul edilir ve değeri yakalamaz, sadece eşleşir.</p></li> <li><p><strong>Sıra Desenleri (Sequence Patterns):</strong> Listeler veya tuple'lar gibi sıralı veri yapılarını eşleştirmek için kullanılır. Örn: <code>case [x, y]:</code>, <code>case (başlangıç, *diğerleri):</code>.</p></li> <li><p><strong>Haritalama Desenleri (Mapping Patterns):</strong> Sözlükler gibi anahtar-değer çiftlerini içeren veri yapılarını eşleştirmek için kullanılır. Örn: <code>case {"tip": "hata", "kod": c}:</code>.</p></li> <li><p><strong>Sınıf Desenleri (Class Patterns):</strong> Belirli bir sınıfın örneklerini eşleştirmek ve bu örneklerin niteliklerine erişmek için kullanılır. Örn: <code>case Nokta(x=nx, y=ny):</code>.</p></li> <li><p><strong>OR Desenleri (OR Patterns):</strong> Birden fazla deseni <code>|</code> operatörü ile birleştirerek, herhangi bir desenin eşleşmesi durumunda kod bloğunun çalışmasını sağlar. Örn: <code>case "a" | "b":</code>.</p></li> <li><p><strong>AS Desenleri (AS Patterns):</strong> Bir deseni eşleştirirken aynı zamanda eşleşen değeri başka bir değişkene atamak için kullanılır. Örn: <code>case ["komut", *args] as tüm_komut:</code>.</p></li> </ul><br> </li> <li><p><code><strong>if koşul:</strong></code> (Guard)<br> Her <code>case</code> deseninin arkasına isteğe bağlı olarak bir <code>if koşul:</code> ifadesi eklenebilir. Bu, desenin eşleşmesinin yanı sıra, belirtilen koşulun da doğru olmasını gerektirir. Koşul, desende yakalanan değişkenleri kullanabilir. Örn: <code>case {"yaş": y} if y >= 18:</code>.</p></li> </ul><br> <h3>Pratik Kullanım Örnekleri</h3><br> <p>Aşağıdaki örnekler, <code>match</code> deyiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.</p><br> <h4>Örnek 1: Temel Değer Eşleştirme</h4><br> <p>Bir HTTP durum kodunu işleme:</p><br> <div class="code-block"><pre><code>durum_kodu = 200 match durum_kodu: case 200: print("OK - İstek başarıyla işlendi.") case 404: print("Bulunamadı - Kaynak mevcut değil.") case 500: print("Sunucu Hatası - İç sunucu hatası oluştu.") case _: # Joker desen, diğer tüm durumlar için print(f"Bilinmeyen durum kodu: {durum_kodu}")</code></pre><div class="code-footer">softmush.com</div></div> <p>Çıktı:</p><br> <div class="code-block"><pre><code>OK - İstek başarıyla işlendi.</code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 2: Sıra Desenleri ve Yakalama</h4><br> <p>Bir komut listesini ayrıştırma:</p><br> <div class="code-block"><pre><code>komut = ["yükle", "uygulama.exe", "--sessiz"] match komut: case ["yükle", dosya, *argümanlar]: print(f"'{dosya}' yükleniyor. Argümanlar: {argümanlar}") case ["sil", dosya]: print(f"'{dosya}' siliniyor.") case _: print("Geçersiz komut.")</code></pre><div class="code-footer">softmush.com</div></div> <p>Çıktı:</p><br> <div class="code-block"><pre><code>'uygulama.exe' yükleniyor. Argümanlar: ['--sessiz']</code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 3: Haritalama Desenleri ve Koşullu Eşleştirme (Guard)</h4><br> <p>Bir kullanıcı objesini işleme:</p><br> <div class="code-block"><pre><code>kullanici_verisi = {"ad": "Mehmet", "rol": "admin", "aktif": True} match kullanici_verisi: case {"rol": "admin", "aktif": True}: print("Yönetici girişi yapıldı.") case {"rol": "editor", "aktif": True, "ad": isim}: print(f"Editör '{isim}' giriş yaptı.") case {"aktif": False}: print("Kullanıcı hesabı pasif.") case _: print("Bilinmeyen kullanıcı durumu.")</code></pre><div class="code-footer">softmush.com</div></div> <p>Çıktı:</p><br> <div class="code-block"><pre><code>Yönetici girişi yapıldı.</code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 4: Sınıf Desenleri</h4><br> <p>Özel bir sınıfın örneklerini eşleştirme. Önce sınıfı tanımlayalım:</p><br> <div class="code-block"><pre><code>class Nokta: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return f"Nokta(x={self.x}, y={self.y})" nokta_objesi = Nokta(10, 20) mesaj_objesi = "Merhaba" match nokta_objesi: case Nokta(x=0, y=0): print("Orijin noktasında.") case Nokta(x=nx, y=ny) if nx == ny: print(f"x ve y değerleri eşit: {nx}") case Nokta(x=nx, y=ny): print(f"Farklı bir nokta: x={nx}, y={ny}") case _: print("Bir Nokta objesi değil.")</code></pre><div class="code-footer">softmush.com</div></div> <p>Çıktı:</p><br> <div class="code-block"><pre><code>Farklı bir nokta: x=10, y=20</code></pre><div class="code-footer">softmush.com</div></div> <h4>Örnek 5: OR Desenleri ve AS Desenleri</h4><br> <p>Birden fazla durumu tek bir <code>case</code> altında işleme ve değeri yakalama:</p><br> <div class="code-block"><pre><code>durum = "başarılı" # durum = "tamamlandı" # durum = "işlem_yapılmadı" match durum: case "başarılı" | "tamamlandı" as sonuc: print(f"İşlem {sonuc} şekilde tamamlandı.") case "hata" | "başarısız": print("İşlemde bir hata oluştu.") case _: print("Bilinmeyen durum.")</code></pre><div class="code-footer">softmush.com</div></div> <p>Çıktı:</p><br> <div class="code-block"><pre><code>İşlem başarılı şekilde tamamlandı.</code></pre><div class="code-footer">softmush.com</div></div> <h3>Önemli Notlar</h3><br> <ul> <li><p><strong>Sıralama Önemlidir:</strong> <code>match</code> deyimi, <code>case</code> bloklarını yukarıdan aşağıya doğru sırayla değerlendirir. İlk eşleşen <code>case</code> bloğu yürütülür ve <code>match</code> deyiminden çıkılır. Bu nedenle, daha spesifik desenler genel desenlerden önce gelmelidir.</p></li> <li><p><strong><code>_</code> (Wildcard):</strong> Alt çizgi (<code>_</code>), hiçbir şeyi yakalamayan ve her zaman eşleşen bir joker desendir. Genellikle <code>match</code> bloğunun son <code>case</code>'i olarak, varsayılan bir durumu ele almak için kullanılır (<code>else</code> gibi).</p></li> <li><p><strong><code>if</code> Koşulları (Guards):</strong> Bir <code>case</code> deseni eşleşse bile, arkasından gelen <code>if</code> koşulu <code>False</code> ise o <code>case</code> bloğu yürütülmez. Bu, daha karmaşık koşulları desen eşleştirmeye dahil etmek için güçlü bir yoldur.</p></li> <li><p><strong>Değişken Yakalama:</strong> Bir desende kullanılan ve daha önce tanımlanmamış bir isim (örneğin <code>case x:</code>), eşleşen değeri o değişkene atar. Bu, yakalama deseni olarak bilinir.</p></li> <li><p><strong>Python 3.10 ve Sonrası:</strong> <code>match</code> deyimi, Python'ın 3.10 sürümü ile birlikte tanıtılmıştır. Daha eski Python sürümlerinde bu özellik bulunmamaktadır.</p></li> <li><p><strong>Performans:</strong> Küçük ve basit koşullar için <code>if/elif/else</code> zincirleri hala uygun olabilir. Ancak karmaşık veri yapıları üzerinde birden fazla durumu ele alırken <code>match</code> deyimi, kodu daha okunaklı ve sürdürülebilir hale getirir.</p></li> </ul><br> </div> <div class="begenme"> <i class='bx bxs-hot'></i> <div class="begeni-sayisi"> 15 </div> <i class='bx bxs-heart'></i> <div class="begeni-sayisi"> 0 </div> </div> </div> </div> </a> <a style="text-decoration:none; display:flex; justify-content: center; align-items: flex-end;" href="posts/php-dilinde-ontanimli-degiskenler-kullanimi-432"> <div class="user-yazi"> <div class="yazi-photo"><img class="user-yazi-photo" src="https://softmush.com/api/images/post_banner/php-dilinde-ontanimli-degiskenler-kullanimi-68f23e041732a.webp" alt=""> </div> <div class="yazi-icerik-2"> <div class="yazi-baslik-2"> PHP Dilinde Öntanımlı Değişkenler Kullanımı </div> <div class="yazi-aciklama-2"> <p>PHP geliştiricileri için öntanımlı değişkenler, web uygulamalarının kalbinde yer alan temel bir yapıdır. Bu değişkenler, PHP tarafından otomatik olarak oluşturulur ve bir betiğin herhangi bir yerinden erişilebilir durumdadırlar. HTTP isteklerinden oturum verilerine, sunucu bilgilerinden dosya yüklemelerine kadar uygulamanın farklı katmanlarından bilgiye erişimi kolaylaştırarak dinamik ve etkileşimli web sayfaları oluşturulmasına olanak tanırlar.</p><br> <h3>Öntanımlı Değişkenlere Genel Bakış</h3><br> <p>PHP, betik yürütülmeden önce veya yürütme sırasında otomatik olarak doldurulan bir dizi özel değişkene sahiptir. Bu değişkenler, "süper global" olarak da adlandırılır, çünkü kapsamları ne olursa olsun (fonksiyonlar, sınıflar veya global kapsam) PHP betiğinin her yerinden erişilebilirler. En yaygın kullanılan öntanımlı değişkenler şunlardır:</p><br> <ul> <li><p><code>$_GET</code>: HTTP GET metodu ile gönderilen verileri içerir.</p></li> <li><p><code>$_POST</code>: HTTP POST metodu ile gönderilen verileri içerir.</p></li> <li><p><code>$_REQUEST</code>: Hem <code>$_GET</code> hem de <code>$_POST</code> ve <code>$_COOKIE</code> verilerini içerir.</p></li> <li><p><code>$_SESSION</code>: Oturum değişkenlerini içerir. Oturum başlatıldıktan sonra kullanılabilir.</p></li> <li><p><code>$_COOKIE</code>: HTTP çerezlerini içerir.</p></li> <li><p><code>$_SERVER</code>: Sunucu ve yürütme ortamı hakkında bilgi içerir.</p></li> <li><p><code>$_FILES</code>: HTTP POST metodu ile yüklenen dosyalar hakkında bilgi içerir.</p></li> <li><p><code>$_ENV</code>: Ortam değişkenlerini içerir.</p></li> </ul><br> <h3>Temel Sözdizimi</h3><br> <p>Öntanımlı değişkenler, bir dizi gibi davranır ve içerdikleri verilere anahtar-değer çiftleri aracılığıyla erişilir. Genel sözdizimi aşağıdaki gibidir:</p> <div class="code-block"><pre><code>$_DEĞİŞKEN_ADI['anahtar'];</code></pre><div class="code-footer">softmush.com</div></div> <p>Burada;</p><br> <ul> <li><p><code>$_DEĞİŞKEN_ADI</code>: Erişmek istediğiniz öntanımlı değişkenin adını (örn. <code>$_GET</code>, <code>$_POST</code>) temsil eder.</p></li> <li><p><code>'anahtar'</code>: Erişilmek istenen verinin benzersiz tanımlayıcısını temsil eder. Bu, bir HTML formundaki bir alanın <code>name</code> özelliği, bir URL sorgu parametresinin adı, bir çerezin adı veya bir sunucu bilgisinin spesifik bir etiketi olabilir.</p></li> </ul><br> <h3>Detaylı Açıklama</h3><br> <p>Her bir süper global değişkenin işlevselliği ve tipik kullanım alanları aşağıda açıklanmıştır:</p><br> <ul> <li><p><code>$_GET</code>:</p><br> <p>Tarayıcının adres çubuğunda (URL'de) <code>?</code> işaretinden sonra gelen sorgu dizgisindeki parametrelere erişmek için kullanılır. Örneğin, <code>example.com/sayfa.php?id=123&ad=test</code> URL'sinde <code>id</code> ve <code>ad</code> parametrelerine <code>$_GET['id']</code> ve <code>$_GET['ad']</code> ile erişilebilir.</p><br> </li> <li><p><code>$_POST</code>:</p><br> <p>HTML formları aracılığıyla HTTP POST metodu kullanılarak gönderilen verilere erişmek için kullanılır. Bu veriler URL'de görünmez ve genellikle hassas bilgiler (şifreler) veya büyük veri setleri için tercih edilir.</p><br> </li> <li><p><code>$_REQUEST</code>:</p><br> <p>PHP'nin yapılandırmasına (<code>variables_order</code>) bağlı olarak <code>$_GET</code>, <code>$_POST</code> ve <code>$_COOKIE</code> değişkenlerinin içeriğini birleştirir. Ancak, değişken önceliği nedeniyle beklenmedik davranışlara yol açabileceği için genellikle doğrudan <code>$_GET</code> veya <code>$_POST</code> kullanılması önerilir.</p><br> </li> <li><p><code>$_SESSION</code>:</p><br> <p>Kullanıcı oturumları arasında veri saklamak için kullanılır. Bir kullanıcının web sitesindeki etkileşimlerini takip etmek (giriş durumu, sepet içeriği vb.) için idealdir. Kullanmadan önce <code>session_start()</code> fonksiyonu çağrılmalıdır.</p><br> </li> <li><p><code>$_COOKIE</code>:</p><br> <p>Kullanıcının tarayıcısında depolanan HTTP çerezlerine erişmek için kullanılır. Çerezler, kullanıcı tercihlerini veya kimlik bilgilerini saklamak gibi amaçlarla kullanılabilir.</p><br> </li> <li><p><code>$_SERVER</code>:</p><br> <p>Web sunucusu ve geçerli yürütme ortamı hakkında kapsamlı bilgi sağlar. Örneğin, <code>$_SERVER['REQUEST_METHOD']</code> ile HTTP isteğinin metodunu (GET, POST), <code>$_SERVER['REMOTE_ADDR']</code> ile kullanıcının IP adresini alabilirsiniz.</p><br> </li> <li><p><code>$_FILES</code>:</p><br> <p>HTML formları aracılığıyla yüklenen dosyalar hakkında bilgi (dosya adı, türü, boyutu, geçici konumu) içerir. Dosya yükleme işlemleri için özel olarak tasarlanmıştır.</p><br> </li> <li><p><code>$_ENV</code>:</p><br> <p>Çevre değişkenlerini içerir. Bu değişkenler, web sunucusunun (Apache, Nginx vb.) veya işletim sisteminin PHP betiğine sağladığı sistem düzeyindeki ayarlardır.</p><br> </li> </ul><br> <h3>Pratik Kullanım Örnekleri</h3><br> <p>Aşağıdaki örnekler, öntanımlı değişkenlerin PHP betiklerinde nasıl kullanıldığını göstermektedir.</p><br> <h4>Örnek 1: <code>$_GET</code> Kullanımı</h4><br> <p>Bu örnekte, bir URL'den <code>ad</code> parametresini alıp ekrana yazdıracağız. Öncelikle, kullanıcıdan adını isteyen bir HTML formu oluşturalım:</p> <div class="code-block"><pre><code><!-- index.html --> <!DOCTYPE html> <html lang="tr"> <head> <meta charset="UTF-8"> <title>GET Örneği

    Adınızı Girin (GET)

Şimdi de islem.php dosyasında bu veriyi işleyelim:


Merhaba, " . $ad . "!

"; } else { echo "

Lütfen adınızı girin.

"; } ?>

Örnek 2: $_POST Kullanımı


Bu örnek, bir form aracılığıyla HTTP POST metodu ile gönderilen kullanıcı adını ve şifresini nasıl işleyeceğimizi gösterir. Yine bir HTML formu ile başlayalım:





    
    POST Örneği


    

Giriş Yap (POST)





Şimdi de giris.php dosyasında bu veriyi işleyelim:


Hoş geldiniz, " . $kullanici_adi . "!

"; } else { echo "

Kullanıcı adı veya şifre yanlış.

"; } } else { echo "

Lütfen kullanıcı adı ve şifrenizi girin.

"; } ?>

Örnek 3: $_SESSION Kullanımı


Bu örnek, oturum değişkenlerini kullanarak kullanıcı girişini simüle eder ve kullanıcının adını oturumda saklar.


Oturumdaki kullanıcı adı: " . htmlspecialchars($_SESSION['kullanici_adi']) . "

"; } else { echo "

Oturumda 'kullanici_adi' bulunamadı.

"; } echo "

Oturumu Bitir

"; ?>

Oturum sonlandırıldı.

"; echo "

Oturum verisini tekrar oku (boş olmalı)

"; ?>

Örnek 4: $_SERVER Kullanımı


Bu örnek, $_SERVER değişkeni aracılığıyla sunucu ve istek bilgilerine nasıl erişileceğini gösterir.

Sunucu Bilgileri";
echo "

İstek Metodu: " . $_SERVER['REQUEST_METHOD'] . "

"; echo "

Sunucu Adı: " . $_SERVER['SERVER_NAME'] . "

"; echo "

Sunucu Yazılımı: " . $_SERVER['SERVER_SOFTWARE'] . "

"; echo "

İstek URI: " . $_SERVER['REQUEST_URI'] . "

"; echo "

Kullanıcının IP Adresi: " . $_SERVER['REMOTE_ADDR'] . "

"; // Tüm _SERVER değişkenlerini görmek için: // echo "
";
// print_r($_SERVER);
// echo "
"; ?>

Önemli Notlar ve Güvenlik İpuçları


  • Veri Doğrulama ve Filtreleme: Kullanıcıdan gelen tüm girişler ($_GET, $_POST, $_COOKIE vb.), herhangi bir işlem yapılmadan veya veritabanına kaydedilmeden önce mutlaka doğrulanmalı ve filtrelenmelidir. Bu, SQL enjeksiyonu, XSS (Cross-Site Scripting) ve diğer güvenlik açıklarına karşı kritik bir önlemdir. PHP'nin htmlspecialchars(), strip_tags(), filter_var() gibi fonksiyonları bu amaçla kullanılabilir.

  • $_REQUEST Kullanımından Kaçınma: Değişken önceliği ayarları nedeniyle $_REQUEST kullanımı, beklenmedik sonuçlara yol açabilir. Mümkün olduğunca spesifik olarak $_GET veya $_POST kullanılması daha güvenli ve öngörülebilirdir.

  • isset() ile Kontrol: Öntanımlı değişkenlerdeki bir anahtara erişmeden önce, o anahtarın gerçekten var olup olmadığını isset() fonksiyonu ile kontrol etmek iyi bir uygulamadır. Bu, "Undefined index" uyarılarını ve potansiyel hataları önler.

  • Oturum Güvenliği: Oturum güvenliği için session_start() her sayfanın başında çağrılmalı ve oturum kimliği sabitleme (session fixation) ve oturum kaçırma (session hijacking) gibi risklere karşı dikkatli olunmalıdır. Oturum verileri hassas bilgiler içeriyorsa, ek şifreleme veya token mekanizmaları düşünülebilir.

  • Dosya Yükleme Güvenliği: $_FILES ile dosya yüklerken, yüklenen dosya türü, boyutu ve içeriği mutlaka doğrulanmalıdır. Kötü amaçlı dosyaların sunucuya yüklenmesini önlemek için sıkı kontroller uygulanmalıdır.

  • Ortam Değişkenleri ve Hassas Bilgiler: $_ENV ve $_SERVER gibi değişkenler hassas sunucu veya sistem yapılandırma bilgilerini içerebilir. Bu bilgilerin yanlışlıkla son kullanıcıya gösterilmemesine dikkat edilmelidir.

8
0
HTML Dilinde Listelerin Kullanımı: Detaylı Bir Kılavuz

HTML, web içeriğini yapılandırmak için çeşitli etiketler sunar. Bu etiketler arasında, bilgiyi düzenli ve okunabilir bir formatta sunmak için listeler temel bir rol oynar. Listeler, birbiriyle ilişkili öğeleri gruplamak, adımları sıralamak veya terimleri tanımlamak için kullanılır. Bu kılavuz, HTML'de sırasız, sıralı ve tanımlama listelerinin nasıl oluşturulacağını, temel sözdiziminden pratik kullanım örneklerine kadar adım adım ele alacaktır.


Sözdizimi


HTML, üç ana liste türünü destekler:


  • Sırasız Listeler (Unordered Lists): Öğeler arasında belirli bir sıralamanın önemli olmadığı durumlarda kullanılır ve genellikle madde işaretleriyle gösterilir.

      etiketi ile tanımlanır.

    • Sıralı Listeler (Ordered Lists): Öğelerin belirli bir sıraya göre sunulması gerektiğinde kullanılır ve genellikle sayılar veya harflerle gösterilir.

        etiketi ile tanımlanır.

      1. Tanımlama Listeleri (Description Lists): Terim ve açıklamaların eşleştirildiği listelerdir.

        etiketi ile tanımlanır.


    Her üç liste türünde de, her bir liste öğesi

  • (liste öğesi) etiketi ile temsil edilir. Tanımlama listeleri için ise
    (tanımlama terimi) ve
    (tanımlama açıklaması) etiketleri kullanılır.


    Detaylı Açıklama


      • : Sırasız bir liste başlatır. Liste öğeleri genellikle disk, daire veya kare gibi madde işaretleriyle görüntülenir.

        1. : Sıralı bir liste başlatır. Liste öğeleri varsayılan olarak sayılarla (1, 2, 3...) görüntülenir, ancak type niteliği ile bu davranış değiştirilebilir (örneğin, type="a" küçük harfler, type="I" büyük Roma rakamları).

        2. : Hem
            hem de
              etiketleri içinde tek bir liste öğesini tanımlar.

            1. : Tanımlama listesini başlatır. Bir terim ve ilgili açıklamasını içeren bir listedir.

            2. : Tanımlama listesinde bir terimi (definition term) tanımlar.

            3. : Tanımlama listesinde
              etiketiyle tanımlanan terimin açıklamasını (definition description) sağlar.

          Pratik Kullanım Örnekleri


          Aşağıdaki örnekler, farklı liste türlerinin ve iç içe listelerin nasıl oluşturulacağını göstermektedir.

          Sırasız Liste:

          • Elma

          • Muz

          • Çilek

          Sıralı Liste:

          1. Birinci Adım

          2. İkinci Adım

          3. Üçüncü Adım

          Sıralı Liste (Harf Tipi):

          1. Giriş

          2. Gelişme

          3. Sonuç

          Tanımlama Listesi:

          HTML

          HyperText Markup Language'ın kısaltmasıdır.

          CSS

          Cascading Style Sheets'in kısaltmasıdır.

          İç İçe Listeler:

          • Kahvaltı

          • Öğle Yemeği

            • Salata

            • Ana Yemek

            • Tatlı

          • Akşam Yemeği

          Önemli Notlar


          • Erişilebilirlik: Listelerin doğru semantik etiketlerle kullanılması, ekran okuyucular gibi yardımcı teknolojilerin içeriği doğru bir şekilde yorumlaması için kritik öneme sahiptir.

          • Stil Uygulama: Listelerin varsayılan görünümü CSS ile tamamen özelleştirilebilir. list-style-type, list-style-image ve list-style-position gibi CSS özellikleri kullanılarak madde işaretleri veya numaralandırma stilleri değiştirilebilir.

          • İç İçe Kullanım: Listeler iç içe yerleştirilebilir. Bir liste öğesinin (

          • ) içine başka bir
              veya
                etiketi ekleyerek hiyerarşik yapılar oluşturulabilir. Ancak, bir liste öğesinin içeriği her zaman bir

                veya diğer uygun blok seviyesi etiketlerle sarmalanmalıdır.

              1. Tanımlama Listesi Kullanımı:

                , sadece terim-tanım çiftleri için değil, genel olarak anahtar-değer çiftlerini veya soru-cevap formatlarını sunmak için de kullanılabilir.

              2. Doğru Etiket Seçimi: İçeriğinizin doğasına uygun liste türünü seçmek önemlidir. Sıranın önemli olduğu yerlerde

                  , önemli olmadığı yerlerde
                    , terim ve açıklamalar için
                    tercih edilmelidir.

12
0
CSS Dilinde CSS Listeler Kullanımı

CSS, web sayfalarında listelerin görünümünü kontrol etmek için güçlü araçlar sunar. Bu makale, sıralı (ordered) ve sırasız (unordered) listelerin varsayılan stillerini nasıl değiştireceğinizi, özel işaretleyiciler (marker) atayacağınızı ve liste öğeleri arasındaki boşlukları nasıl yöneteceğinizi detaylı bir şekilde açıklayacaktır. Amacımız, listelerinizi web tasarımınıza mükemmel bir şekilde entegre etmek için gerekli tüm bilgileri sağlamaktır.


Sözdizimi


CSS'te listelerle çalışırken en sık kullanılan özellikler list-style-type, list-style-position ve list-style-image'dir. Bu özellikler genellikle list-style kısayol özelliği ile birleştirilebilir.



ul {
  list-style-type: disc; /* veya square, circle, none, decimal, lower-alpha vb. */
  list-style-position: inside; /* veya outside */
  list-style-image: url('marker.png'); /* özel bir görsel kullanmak için */
}

/* Kısayol (shorthand) kullanımı */
li {
  list-style: square inside url('marker.png');
}

Detaylı Açıklama


CSS listelerinin görünümünü kontrol eden temel özellikler şunlardır:


  • list-style-type: Liste işaretleyicisinin (marker) türünü belirler. Sırasız listeler için disc (varsayılan), circle, square, none gibi değerler alabilir. Sıralı listeler için decimal (varsayılan), decimal-leading-zero, lower-alpha, upper-alpha, lower-roman, upper-roman gibi değerler kullanılabilir. none değeri, işaretleyiciyi tamamen kaldırır.

  • list-style-position: Liste işaretleyicisinin liste öğesi kutusunun içinde mi yoksa dışında mı konumlanacağını belirler. outside (varsayılan) değeri, işaretleyiciyi öğe kutusunun solunda, metinle hizalı olarak konumlandırır. inside değeri ise işaretleyiciyi öğe kutusunun içine, metnin bir parçasıymış gibi yerleştirir.

  • list-style-image: Varsayılan işaretleyici yerine özel bir görsel kullanmanızı sağlar. Değer olarak bir görselin URL'sini alır, örneğin url('resim.svg'). Eğer görsel yüklenemezse veya bu özellik belirtilmezse, list-style-type özelliği devreye girer.

  • list-style: Yukarıdaki üç özelliği tek bir kısayol özelliğiyle birleştirmek için kullanılır. Değerler herhangi bir sırada yazılabilir, ancak list-style-image özelliği varsa list-style-type'ın yerine geçer (görsel yüklenemezse geri dönüş olarak kullanılır). Örnek: list-style: square inside url('marker.png');


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, farklı list-style özelliklerinin nasıl uygulandığını göstermektedir.


Örnek 1: Temel Sırasız Liste Stilini Değiştirme


Bu örnekte, sırasız bir listenin (

    ) işaretleyicisini daire (circle) olarak ayarlayacağız ve metin hizalamasını değiştireceğiz.

    
    /* HTML */
    
    • Öğe Bir
    • Öğe İki
    • Öğe Üç
    /* CSS */ .liste-daire { list-style-type: circle; list-style-position: inside; padding-left: 0; /* Tarayıcı varsayılan padding'ini sıfırlama */ }

    Örnek 2: Özel Görsel Kullanımı


    Bu örnek, bir listenin işaretleyicisi olarak özel bir görselin nasıl kullanılacağını gösterir. list-style-image özelliği ile bir görsel belirtilirken, görselin yüklenmemesi durumunda bir geri dönüş olarak list-style-type da tanımlanabilir.

    
    /* HTML */
    
    • Görsel İşaretli Öğe Bir
    • Görsel İşaretli Öğe İki
    /* CSS */ .liste-gorsel { list-style-image: url('https://via.placeholder.com/15x15/0000FF/FFFFFF?text=%2B'); /* Mavi bir artı işareti görseli */ list-style-type: square; /* Görsel yüklenmezse kare göster */ padding-left: 20px; /* Görsel için yeterli boşluk */ }

    Örnek 3: Numaralı Liste Stillerini Ayarlama


    Sıralı listeler (

      ) için farklı numaralandırma stilleri kullanmak mümkündür, örneğin küçük harfler veya Roma rakamları.

      
      /* HTML */
      
      1. İlk Adım
      2. İkinci Adım
      3. Üçüncü Adım
      1. Bölüm I
      2. Bölüm II
      /* CSS */ .liste-harf { list-style-type: lower-alpha; } .liste-roma { list-style-type: upper-roman; }

      Önemli Notlar


      • Varsayılan Boşluklar: Tarayıcılar

          ve
            etiketlerine varsayılan olarak padding ve margin değerleri uygular. Bu boşlukları kontrol etmek için padding-left: 0; ve margin: 0; gibi CSS kurallarını kullanmanız gerekebilir.

          1. list-style: none; Kullanımı: İşaretleyicileri tamamen kaldırmak için list-style-type: none; veya kısayol olarak list-style: none; kullanın. Bu genellikle özel işaretleyiciler oluşturmak veya listeleri menü gibi farklı bir amaçla stilize etmek için yapılır.

          2. Erişilebilirlik: Görsel işaretleyicileri kaldırdığınızda, liste öğelerini okunabilir ve erişilebilir tutmak için alternatif görsel ipuçları veya anlamsal yapıları korumaya dikkat edin.

          3. Özel İşaretleyiciler ve Kontrol: list-style-image özelliği, işaretleyicinin boyutunu veya konumunu doğrudan kontrol etme konusunda sınırlıdır. Daha gelişmiş kontrol için, işaretleyiciyi ::before sözde-elemanı (pseudo-element) ile oluşturup content özelliği ve diğer CSS özellikleriyle stilize etmek daha esnek bir yaklaşımdır.

          4. Kısayol Özelliği: list-style kısayol özelliği, okunabilirliği artırır ve daha az kod yazmanızı sağlar. Ancak, değerlerin sırası önemli değildir, tarayıcı bunları doğru şekilde ayrıştırır. Yine de, standart bir sıra (type position image) izlemek iyi bir uygulamadır.

9
0
JavaScript’te Hata Yönetimi: `Error` Nesnesinin Kullanımı

Modern web uygulamalarının karmaşıklığı, beklenmedik durumların veya hataların ortaya çıkma olasılığını artırmaktadır. JavaScript, bu tür durumları yönetmek için yerleşik bir mekanizma sunar: Error nesnesi. Bu nesne, çalışma zamanı hatalarını temsil etmek, onları yakalamak ve uygun şekilde ele almak için kritik bir araçtır. Uygulama kararlılığını ve kullanıcı deneyimini sağlamak adına Error nesnesinin etkin kullanımı, her JavaScript geliştiricisinin sahip olması gereken temel bir yetkinliktir.


Hata Nesnesinin Sözdizimi


JavaScript'te bir hata nesnesi oluşturmak için Error yapıcısını (constructor) kullanırız. Bu, programatik olarak bir hata durumunu belirtmenin en yaygın yoludur.


new Error([message[, fileName[, lineNumber]]])

Detaylı Açıklama


Error yapıcısının aldığı parametreler ve Error nesnesinin temel özellikleri aşağıda detaylandırılmıştır:


  • message: Hatanın kısa ve açıklayıcı bir metinle ifade edildiği bir String değeridir. Hata nesnesinin temel içeriğini oluşturur.

  • fileName (İsteğe Bağlı): Hatanın meydana geldiği dosyanın yolunu belirten bir String değeridir. Genellikle hata yakalama mekanizmaları tarafından otomatik olarak doldurulur.

  • lineNumber (İsteğe Bağlı): Hatanın meydana geldiği dosyadaki satır numarasını belirten bir Number değeridir. Bu da genellikle otomatik olarak atanır.

Error nesnesinin kendisi, bu parametrelere ek olarak iki önemli özelliğe sahiptir:


  • name: Hata türünün adını belirten bir String değeridir (örneğin, 'Error', 'TypeError', 'ReferenceError'). Özel hata türleri oluşturulduğunda bu özellik özelleştirilebilir.

  • stack: Hatanın çağrı yığınını (call stack) gösteren bir String değeridir. Hatanın nerede ve nasıl oluştuğunu anlamak için son derece faydalıdır.

Pratik Kullanım Örnekleri


Aşağıdaki örnekler, Error nesnesinin JavaScript uygulamalarında nasıl kullanılabileceğini göstermektedir.


Örnek 1: Temel Hata Fırlatma ve Yakalama


Bir fonksiyonun belirli bir koşulu karşılamadığı durumlarda programın akışını durdurmak ve bir hata durumu bildirmek için throw new Error() kullanılır. try...catch bloğu ile bu hatalar yakalanabilir.


function bolmeIslemi(sayi1, sayi2) {
  if (sayi2 === 0) {
    throw new Error("Sıfıra bölme hatası: Bölen sıfır olamaz.");
  }
  return sayi1 / sayi2;
}

try {
  console.log(bolmeIslemi(10, 2)); // Çıktı: 5
  console.log(bolmeIslemi(10, 0)); // Bu satır bir hata fırlatacak
} catch (e) {
  console.error("Bir hata oluştu:", e.message);
  console.error("Hata adı:", e.name);
  console.error("Hata yığını:", e.stack);
}

Örnek 2: Özel Hata Türü Oluşturma


Uygulamaya özgü hata durumlarını daha spesifik bir şekilde yönetmek için Error nesnesinden türetilmiş özel hata sınıfları oluşturulabilir. Bu, hata türlerinin daha kolay ayırt edilmesini ve işlenmesini sağlar.


class GecersizGirdiHatasi extends Error {
  constructor(message) {
    super(message);
    this.name = "GecersizGirdiHatasi"; // Hatanın adını özelleştiriyoruz
  }
}

function veriIsle(veri) {
  if (typeof veri !== 'number' || veri < 0) {
    throw new GecersizGirdiHatasi("Girdi pozitif bir sayı olmalıdır.");
  }
  return veri * 2;
}

try {
  console.log(veriIsle(5)); // Çıktı: 10
  console.log(veriIsle(-3)); // Bu satır özel bir hata fırlatacak
} catch (e) {
  if (e instanceof GecersizGirdiHatasi) {
    console.error("Geçersiz girdi hatası yakalandı:", e.message);
  } else {
    console.error("Beklenmeyen bir hata oluştu:", e.message);
  }
}

Örnek 3: try...catch...finally Kullanımı


try...catch...finally yapısı, hata oluşsa da oluşmasa da belirli kod bloklarının çalıştırılmasını garanti eder. Bu, kaynakları temizlemek veya bazı işlemleri tamamlamak için kullanışlıdır.


function dosyaOku(dosyaAdi) {
  let dosyaAcik = false;
  try {
    console.log(`${dosyaAdi} dosyası açılıyor...`);
    dosyaAcik = true;

    // Simulate an error
    if (dosyaAdi === "hatali.txt") {
      throw new Error("Dosya okunamadı: Erişim reddedildi.");
    }

    console.log(`${dosyaAdi} dosya içeriği işleniyor.`);
    return "Dosya içeriği...";
  } catch (e) {
    console.error("Hata:", e.message);
    return null;
  } finally {
    if (dosyaAcik) {
      console.log(`${dosyaAdi} dosyası kapatılıyor.`);
    }
  }
}

console.log(dosyaOku("veri.txt"));
console.log("\n--- Yeni İşlem ---\n");
console.log(dosyaOku("hatali.txt"));

Önemli Notlar ve İpuçları


  • Spesifik Hata Türleri Kullanımı: JavaScript, TypeError, ReferenceError, RangeError gibi çeşitli yerleşik hata türleri sunar. Mümkün olduğunca hatanın doğasına uygun spesifik hata türlerini kullanmaya özen gösterin. Bu, hata ayıklamayı ve hata işleme mantığını basitleştirir.

  • Hataları Bastırmayın: Bir try...catch bloğunda hatayı yakalayıp hiçbir işlem yapmamak (boş bırakmak), uygulamanızdaki sorunların gizlenmesine neden olur. Hataları her zaman uygun bir şekilde günlüğe kaydedin veya kullanıcıya bildirin.

  • finally Bloğunun Önemi: Kaynakları (dosya bağlantıları, ağ istekleri vb.) serbest bırakmak veya belirli bir işlemi tamamlamak için finally bloğunu kullanın. Bu blok, hata oluşsa da oluşmasa da her zaman çalıştırılır.

  • Geniş Kapsamlı try...catch Bloklarından Kaçının: Tüm uygulamanızı tek bir try...catch bloğuna sarmak, hangi hatanın nerede meydana geldiğini anlamayı zorlaştırır. Hata yakalama bloklarınızı, hata potansiyeli olan belirli işlevlere veya kod parçalarına odaklayın.

  • Üretim Ortamında Hata İzleme: Canlı sistemlerde oluşan hataları izlemek için Sentry, Bugsnag gibi üçüncü taraf hata izleme hizmetlerini kullanmayı düşünün. Bu hizmetler, hata raporlarını toplar, analiz eder ve geliştiricilere anında bildirimler gönderir.

9
0
SQL Dilinde SUM Fonksiyonu: Detaylı Kullanım Kılavuzu

SQL (Yapısal Sorgulama Dili), veritabanlarından bilgi almayı ve manipüle etmeyi sağlayan güçlü bir dildir. Bu dilin temel bileşenlerinden biri olan SUM() fonksiyonu, sayısal bir sütundaki değerlerin toplamını hesaplamak için kullanılan bir toplama (aggregate) fonksiyonudur. Raporlama, finansal analiz veya genel veri özetleri oluştururken, belirli bir kriteri karşılayan tüm kayıtların toplam değerini bulmak hayati öneme sahiptir. Bu kılavuz, SUM() fonksiyonunun sözdiziminden başlayarak, çeşitli kullanım senaryolarını örneklerle açıklayacak ve bu güçlü fonksiyonu verimli bir şekilde kullanmanıza yardımcı olacak pratik bilgiler sunacaktır.


SQL SUM Fonksiyonunun Sözdizimi


SUM() fonksiyonunun temel sözdizimi aşağıdaki gibidir:


SELECT SUM(sutun_adi)
FROM tablo_adi
WHERE kosul;

İsteğe bağlı olarak, yalnızca benzersiz değerlerin toplamını almak için DISTINCT anahtar kelimesi kullanılabilir:


SELECT SUM(DISTINCT sutun_adi)
FROM tablo_adi
WHERE kosul;

Detaylı Açıklama


SUM() fonksiyonu, belirtilen bir sayısal ifadenin veya sütunun değerlerini toplar. Fonksiyonun bileşenleri şunlardır:


  • SUM(): Bu, toplama işlemini gerçekleştiren ana fonksiyondur.

  • sutun_adi veya expression: Toplanacak değerleri içeren sayısal bir sütun adını veya sayısal bir değer döndüren herhangi bir ifadeyi (örneğin, Miktar * BirimFiyat) temsil eder. Bu ifade, INT, DECIMAL, FLOAT gibi sayısal veri tiplerine sahip olmalıdır.

  • DISTINCT (isteğe bağlı): Eğer bu anahtar kelime kullanılırsa, SUM() fonksiyonu yalnızca belirtilen sütundaki veya ifadedeki benzersiz değerlerin toplamını hesaplar. Yinelenen değerler toplama dahil edilmez. Genellikle bu anahtar kelimeye ihtiyaç duyulmaz ve kullanımı performansı etkileyebilir.

  • FROM tablo_adi: Sorgunun hangi tablodan veri alacağını belirtir.

  • WHERE kosul (isteğe bağlı): Toplama işlemine dahil edilecek satırları filtrelemek için kullanılır. Yalnızca belirtilen koşulu sağlayan satırlar toplanır.


SUM() fonksiyonu, varsayılan olarak NULL değerleri toplama işlemine dahil etmez. Yani, bir sütunda NULL değeri varsa, bu değer göz ardı edilir ve toplam etkilenmez.


Pratik Kullanım Örnekleri


Aşağıdaki örneklerde, bir satış tablosu olan Satislar'ı kullanacağız. Bu tablo, SatisID, UrunID, Miktar, BirimFiyat, SatisTarihi ve MusteriID sütunlarını içermektedir.


Örnek 1: Tüm Satışların Toplam Miktarını Bulma


Tüm satış kayıtlarındaki ürünlerin toplam miktarını bulmak için basit bir SUM() kullanımı:


SELECT SUM(Miktar) AS ToplamMiktar
FROM Satislar;

Açıklama: Bu sorgu, Satislar tablosundaki tüm Miktar değerlerini toplar ve sonucu ToplamMiktar adıyla döndürür.


Örnek 2: Ürün Başına Toplam Satış Hacmini Hesaplama


GROUP BY ifadesiyle birlikte SUM() kullanarak her bir ürün için ayrı ayrı toplam satış miktarını hesaplayabiliriz:


SELECT UrunID, SUM(Miktar) AS UrunToplamMiktar
FROM Satislar
GROUP BY UrunID;

Açıklama: Sorgu, UrunID'ye göre gruplandırma yapar ve her bir UrunID için ilgili satış miktarlarının toplamını hesaplar.


Örnek 3: Belirli Bir Tarihten Sonraki Toplam Geliri Hesaplama


WHERE koşulu ile belirli bir tarihten sonraki satışların toplam gelirini (miktar * birim fiyat) hesaplayabiliriz:


SELECT SUM(Miktar * BirimFiyat) AS ToplamGelir
FROM Satislar
WHERE SatisTarihi > '2023-01-16';

Açıklama: Bu sorgu, 16 Ocak 2023 tarihinden sonra gerçekleşen satışların her biri için Miktar ile BirimFiyat'ı çarparak geliri bulur ve bu gelirlerin toplamını ToplamGelir olarak döndürür.


Örnek 4: Farklı Miktar Değerlerinin Toplamını Bulma


Eğer sadece benzersiz satış miktarlarının toplamını almak istiyorsanız, DISTINCT anahtar kelimesini kullanabilirsiniz:


SELECT SUM(DISTINCT Miktar) AS FarkliMiktarToplami
FROM Satislar;

Açıklama: Bu sorgu, Satislar tablosundaki Miktar sütununda tekrar eden değerleri bir kez sayarak, yalnızca farklı Miktar değerlerinin toplamını hesaplar.


Örnek 5: Toplam Geliri Hesaplama ve Filtreleme (HAVING ile)


GROUP BY ile birlikte HAVING kullanarak, belirli bir eşiğin üzerindeki toplam gelire sahip ürünleri filtreleyebiliriz:


SELECT UrunID, SUM(Miktar * BirimFiyat) AS UrunToplamGelir
FROM Satislar
GROUP BY UrunID
HAVING SUM(Miktar * BirimFiyat) > 200;

Açıklama: Bu örnek, her bir UrunID için toplam geliri hesaplar ve yalnızca toplam geliri 200'den fazla olan ürünleri listeler.


Önemli Notlar ve İpuçları


  • NULL Değerler: SUM() fonksiyonu, NULL değerleri otomatik olarak göz ardı eder. Eğer NULL değerleri sıfır olarak dahil etmek isterseniz, COALESCE() veya ISNULL() gibi fonksiyonları kullanmalısınız (örneğin, SUM(COALESCE(sutun_adi, 0))).

  • Sayısal Olmayan Veri Tipleri: SUM() yalnızca sayısal veri tipleriyle çalışır. Sayısal olmayan bir sütun üzerinde kullanılırsa hata verecektir. Gerekirse, veri tipini uygun bir sayısal türe dönüştürmek için CAST() veya CONVERT() gibi fonksiyonları kullanın.

  • GROUP BY ile Kullanım: SUM() fonksiyonunun gücü genellikle GROUP BY ifadesiyle birleştiğinde ortaya çıkar. Bu kombinasyon, verileri belirli kategorilere göre gruplandırarak her grup için ayrı ayrı toplamları hesaplamanıza olanak tanır.

  • HAVING ile Filtreleme: GROUP BY kullanıldığında, gruplar üzerinde filtreleme yapmak için WHERE yerine HAVING ifadesi kullanılır. WHERE, gruplama yapılmadan önce satırları filtrelerken, HAVING gruplama yapıldıktan ve toplama fonksiyonları uygulandıktan sonra grupları filtreler.

  • Performans: Büyük veri kümelerinde SUM() kullanımı, özellikle DISTINCT anahtar kelimesiyle veya karmaşık ifadelerle birleştiğinde performans üzerinde etki yaratabilir. İndeksleme, sorgu optimizasyonu ve uygun veri tipi seçimi gibi faktörler performansı artırabilir.

9
0
Orionid Meteor Yağmuru: Halley Kuyruklu Yıldızı’nın Büyüleyici Mirası ve Gözlem Rehberi

Merhaba gökyüzü tutkunları! Sonbaharın serin gecelerinde bizi bekleyen muhteşem bir görsel şölen var: Orionid Meteor Yağmuru! Bu, sadece bir göktaşı yağmurundan çok daha fazlası; tarihin en ünlü kuyruklu yıldızlarından Halley'nin bize bıraktığı büyüleyici bir miras. Hazırsanız, bu eşsiz olayı ne zaman ve nasıl izleyeceğinize dair tüm detaylara dalalım ve evrenin sunduğu bu harika hediyeyi kaçırmamanız için ipuçlarımı sizinle paylaşayım.


Orionid Meteor Yağmuru Nedir?


Peki, Orionidler tam olarak nedir? Göktaşı yağmurları, Dünya'nın uzayda seyreden bir kuyruklu yıldızın veya asteroidin yörüngesinde bıraktığı toz ve kaya parçacıkları bulutundan geçtiğinde meydana gelir. Bu minik parçacıklar, gezegenimizin atmosferine saniyede yaklaşık 66 kilometre gibi inanılmaz bir hızla girer. Atmosferdeki hava molekülleriyle sürtünme sonucu yanarak parlamaya başlarlar ve biz de onlara "kayan yıldız" veya "meteor" deriz. Orionidler, adını gökyüzünde ışınsal olarak yayılıyor gibi göründükleri Orion Takımyıldızı'ndan alır. Bu takımyıldız, meteorların çıkış noktası gibi görünse de, aslında tüm gökyüzünde görülebilirler.


Halley Kuyruklu Yıldızı'nın Mirası


Orionidlerin özel olmasının en büyük nedeni, onların kaynağının Halley Kuyruklu Yıldızı olmasıdır. Bu ünlü kuyruklu yıldız, her 75-76 yılda bir Dünya'nın yakınından geçer ve yörüngesinde geride milyonlarca küçük parçacık bırakır. Dünya, bu parçacıkların içinden her yıl Ekim ayında geçtiğinde, Halley'nin mirası olan Orionidleri gökyüzünde izleme şansı buluruz. Bu, aslında çok eski bir gök olayıdır ve binlerce yıldır insanları büyülemeye devam etmektedir. Halley'nin bıraktığı bu izler, bize tarihin derinliklerinden gelen bir mesaj niteliğindedir.


Orionid Meteor Yağmuru Ne Zaman Gerçekleşecek?


En önemli soru: Ne zaman? Orionid meteor yağmuru genellikle 2 Ekim ile 7 Kasım tarihleri arasında aktif olur. Ancak, asıl görsel şölen, yani en yoğun dönemi, 20-21 Ekim gecesi civarında gerçekleşir. Bu gecelerde, hava koşulları uygun olduğunda ve ışık kirliliğinden uzak bir noktadaysanız, saatte 10 ila 20 kadar meteor görme şansınız olabilir. Hatta bazı yıllar bu sayı daha da artabilir! Bu tarihleri takvimlerinize işaretlemeyi unutmayın.


Bu yıl, yani 2024'te, Orionidlerin zirvesi yine 20-21 Ekim gecesine denk geliyor. Genellikle gece yarısından sonra, sabaha karşı 02:00 ile şafak sökene kadar olan saatler, meteor izlemek için en ideal zaman dilimidir. Bu saatlerde, Dünya'nın dönüşü sayesinde meteor parçacıklarıyla daha doğrudan bir çarpışma yaşarız ve bu da görünen meteor sayısını artırır. Ay'ın durumu da gözlem kalitesini doğrudan etkiler ve bu yılki gözlemler için Ay'ın durumu oldukça önemli bir faktör olacak.


Ay'ın Etkisi ve Gözlem İpuçları


Peki, Ay'ın durumu nasıl olacak? 2024'te Orionidlerin zirve yaptığı 20-21 Ekim gecesi, Ay'ın evresi son dördün evresine yakın olacak. Bu, Ay'ın gökyüzünde oldukça parlak olacağı ve dolayısıyla daha sönük meteorları görmemizi zorlaştıracağı anlamına geliyor. Ancak umutsuzluğa kapılmayın! Ay battıktan sonraki saatler veya Ay'ın parlaklığının en az olduğu anlar, yine de gözlem için harika fırsatlar sunabilir. Ay ışığından en az etkilenecek bir gözlem noktası seçmek veya Ay'ı görüş alanınızın dışında tutacak bir yere bakmak, bu durumu avantaja çevirmenize yardımcı olacaktır. Unutmayın, en parlak meteorlar Ay ışığında bile görülebilir!


Orionid Meteor Yağmuru Nasıl İzlenir?


Şimdi gelelim bu muhteşem şöleni nasıl en iyi şekilde izleyeceğinize. Özel bir ekipmana ihtiyacınız yok, sadece sabır ve doğru bir hazırlık yeterli:


  • Karanlık Bir Yer Bulun: Şehir ışıklarından uzakta, mümkün olduğunca karanlık bir yer seçmek en önemlisidir. Büyük şehirlerin ışık kirliliği, sönük meteorları görmenizi engelleyecektir. Parklar, kırsal alanlar, dağ evleri veya yüksek tepeler ideal olabilir. Işık kirliliği ne kadar az olursa, o kadar çok meteor görme şansınız artar.

  • Ay'ın Durumunu Kontrol Edin: Gözlem yapacağınız gecenin Ay takvimini kontrol edin. Eğer Ay parlaksa, Ay batana kadar beklemek veya Ay'ın doğrudan görüş açınızda olmadığı, gökyüzünün daha karanlık bir kısmına bakmak faydalı olabilir.

  • Gözlerinizi Karanlığa Alıştırın: Gözlerinizin karanlığa alışması yaklaşık 20-30 dakika sürer ve bu süre zarfında ışığa maruz kalmaktan kaçınmak çok önemlidir. Bu süre zarfında telefonunuza veya diğer ışık kaynaklarına bakmaktan kaçının. Eğer bir ışığa ihtiyacınız olursa, kırmızı ışıklı bir fener kullanın; kırmızı ışık, gözlerinizin karanlığa adaptasyonunu bozmaz.

  • Rahat Edin: Gözlem yaparken yere uzanmak veya rahat bir kamp sandalyesine oturmak, boynunuzu ağrıtmadan gökyüzünü daha uzun süre izlemenizi sağlar. Battaniye, uyku tulumu gibi sıcak tutacak şeyleri yanınıza almayı unutmayın, zira sonbahar geceleri oldukça serin olabilir ve üşümek gözlem keyfinizi kaçırabilir.

  • Sabırlı Olun: Meteorlar düzenli aralıklarla gelmez. Bazen birkaç dakika boyunca hiçbir şey göremeyebilirsiniz, sonra aniden birkaç tane arka arkaya geçebilir. Bu yüzden sabırlı olmak ve gökyüzünü sürekli taramak önemlidir. Unutmayın, her bir meteor, Halley'nin bize gönderdiği özel bir selamdır.


Gökyüzünde Nereye Bakmalı?


Orionidlerin "ışıma noktası" (radyantı) Orion Takımyıldızı'nda olsa da, meteorları gökyüzünün herhangi bir yerinde görebilirsiniz. Aslında, radyanttan uzaklaşan meteorlar, Dünya atmosferine daha eğik bir açıyla girdikleri için daha uzun ve etkileyici izler bırakır. Bu yüzden tüm gökyüzünü kapsayacak şekilde geniş bir görüş açısına sahip olmaya çalışın. Başınızı gökyüzünün en karanlık ve bulutsuz kısmına çevirin ve sadece bekleyin. Gözleriniz sürekli hareket halinde olsun ve gökyüzünü yavaşça tarayın.


Neler Beklemelisiniz?


Orionidler, saatte yaklaşık 10 ila 20 meteor görme potansiyeli sunar (Zenithal Hourly Rate - ZHR). ZHR, ideal koşullarda, yani tamamen karanlık bir gökyüzünde, radyantın tam tepede olduğu ve görüş alanını hiçbir şeyin engellemediği varsayılarak hesaplanan teorik bir sayıdır. Gerçekte, şehir ışıklarından veya Ay ışığından etkilenen bir yerdeyseniz bu sayı daha düşük olabilir. Ancak göreceğiniz her bir meteor, Halley'nin mirasının bir parçası olduğu için paha biçilmezdir ve size evrenin büyüklüğünü hatırlatacaktır.


Orionidler, çok hızlı meteorlar olmalarıyla bilinirler; yaklaşık 66 km/s hızla Dünya atmosferine girerler. Bu inanılmaz hız, onların genellikle parlak ve hızlı izler bırakmalarına neden olur. Bazen atmosferde daha büyük parçacıkların yanmasıyla oluşan parlak fireball'lar (ateş topları) bile görebilirsiniz. Bu ateş topları, gökyüzünde birkaç saniye boyunca parlayarak gözlemcileri büyüleyebilir ve ardında uzun, dumanlı bir iz bırakabilir. Onları gördüğünüz an, gerçekten unutulmaz bir deneyim yaşayacaksın!


Halley Kuyruklu Yıldızı: Tarihi Bir Bağlantı


Halley Kuyruklu Yıldızı, insanlık tarihinde en çok bilinen ve gözlemlenen kuyruklu yıldızlardan biridir. Antik çağlardan beri pek çok kültür tarafından gözlemlenmiş ve kaydedilmiştir. Düzenli aralıklarla geri dönüşü, astronom Edmund Halley'ye yörüngesini hesaplama ve geri dönüşünü tahmin etme imkanı sunmuş, bu da onu bilimsel tahminlerin ilk büyük başarılarından biri haline getirmiştir. Kuyruklu yıldızın kendisini bir sonraki görüşümüz 2061 yılı civarında olacak. Ancak her yıl Ekim ayında Orionid meteor yağmuru sayesinde, onun uzayda bıraktığı izleri takip ederek bu tarihi gök cismine bir selam gönderebiliyoruz. Bu, aslında geçmişle bugünü, insanlık tarihiyle kozmik zamanı birleştiren eşsiz bir kozmik bağdır.


Astrophotografi Meraklılarına İpuçları


Eğer bu anı ölümsüzleştirmek istersen, birkaç ipucu senin için:


  • Geniş Açılı Lens: Gökyüzünün geniş bir bölümünü yakalamak ve daha fazla meteor yakalama şansını artırmak için geniş açılı (14-24mm) bir lens kullanın.

  • Tripod: Uzun pozlama çekimleri için fotoğraf makinenizin sabit kalması şarttır. Sağlam bir tripod olmazsa olmazdır.

  • Manuel Ayarlar: Yüksek ISO (1600-6400 arası, kameranızın gürültü performansına göre), düşük f-stop değeri (f/2.8 veya daha düşük) ve 15-30 saniye arası pozlama süresi deneyin. Yüksek ISO, kameranızın ışığa daha duyarlı olmasını sağlarken, düşük f-stop daha fazla ışık girmesine olanak tanır. Uzun pozlama ise meteorların izlerini yakalamak için gereklidir.

  • Odaklama: Lensi manuel moda alıp sonsuzluğa odaklayın. Karanlıkta bunu yapmak zor olabilir, bu yüzden önceden pratik yapın veya uzak bir ışık kaynağına odaklayarak ayarlarınızı yapın.


Güvenlik ve Konfor Önlemleri


Gece gözlemi yaparken güvenliğiniz ve konforunuz çok önemlidir. Unutmayın, keyifli bir deneyim için iyi hazırlanmak şart:


  • Sıcak Giyinin: Sonbahar geceleri aldatıcı olabilir. Kat kat giyinmek, termal içlikler, kalın çoraplar, şapka, eldiven ve su geçirmez bir dış katman, soğuktan korunmanızı sağlar.

  • Yanınıza İçercek ve Yiyecek Alın: Termos içinde sıcak çay veya kahve gibi içecekler ve atıştırmalıklar, uzun gözlem seanslarında enerjinizi yüksek tutar ve içten ısınmanıza yardımcı olur.

  • Güvenli Bir Yer Seçin: Mümkünse yalnız gitmek yerine arkadaşlarla gitmek veya bildiğiniz, güvenli, erişimi kolay bir alanı tercih etmek her zaman daha iyidir. Yeni bir yere gidiyorsanız, gündüz keşfetmekte fayda var.

  • Çevreye Duyarlı Olun: Gözlem yaparken doğaya zarar vermemeye özen gösterin, çöplerinizi yanınızda götürün ve ses kirliliği yaratmaktan kaçının.


Neden Bu Kadar Özel?


Orionidler, sadece gökyüzündeki anlık ışık izleri değildir; onlar aynı zamanda bilim, tarih ve insanlığın evrenle olan derin bağının bir yansımasıdır. Halley'nin bize bıraktığı bu minik parçacıklar, her yıl bizi evrenin derinliklerine, kozmik bir dansa davet eder. Bu, şehir hayatının gürültüsünden ve karmaşasından uzaklaşıp, evrenin sonsuzluğunu ve kendi küçüklüğümüzü hissetmek için harika bir fırsattır. Bir an durup, milyarlarca yıl önceki bir kuyruklu yıldızın kalıntılarını izlemek, gerçekten büyüleyici ve düşündürücü bir deneyimdir. Gezegenimizin bu kozmik toz bulutundan geçerken yaşadığımız bu anlık karşılaşmalar, bize evrenin dinamik ve sürekli değişen doğasını hatırlatır.


Unutmayın, en iyi gözlem için ihtiyacınız olan tek şey karanlık bir gökyüzü, sabır ve biraz şans. Hava durumu tahminlerini takip edin, en uygun geceyi seçin ve bu muhteşem gökyüzü şöleninin tadını çıkarın. Belki de bir dilek tutmak için mükemmel bir an yakalarsınız! Gökyüzünüz açık, geceniz yıldızlarla dolsun!


11
0
Python Dilinde While Döngüleri Kullanımı

Python programlama dilinde while döngüsü, belirli bir koşul doğru olduğu sürece bir kod bloğunu tekrar tekrar yürütmek için kullanılır. Bu döngü yapısı, bir işlemin ne zaman duracağının belirli bir sayı yerine bir koşula bağlı olduğu senaryolarda oldukça etkilidir. Kullanıcı girdisi beklenmesi, bir veri yapısındaki öğelerin işlenmesi veya bir oyun döngüsünün sürdürülmesi gibi durumlarda program akışını kontrol etmek için vazgeçilmez bir araçtır.


Temel Sözdizimi


Bir while döngüsünün genel yapısı aşağıdaki gibidir:

while koşul:
    # Koşul doğru olduğu sürece yürütülecek kod bloğu
    # Döngü değişkenini güncelleyen ifadeler
else:
    # Koşul yanlış olduğunda (ve break kullanılmadığında) yürütülecek kod bloğu

Bu yapıda:


  • while: Döngüyü başlatan anahtar kelimedir.

  • koşul: Her iterasyonun başında değerlendirilen bir boolean ifadedir. Bu koşul True olduğu sürece döngü devam eder.

  • : (İki nokta üst üste): Koşul ifadesinden sonra gelir ve döngü bloğunun başladığını belirtir.

  • Girintili Kod Bloğu: Koşul doğru olduğunda yürütülecek olan bir veya daha fazla satırdan oluşur. Python'da girinti (indentation) kod bloklarını tanımlamak için kullanılır.

  • else (İsteğe Bağlı): while döngüsüyle birlikte kullanılabilen isteğe bağlı bir bloktur. Döngü koşulu False olduğunda ve döngü break ifadesiyle sonlandırılmadığında yürütülür.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, while döngüsünün çeşitli kullanım senaryolarını göstermektedir.


Örnek 1: Basit Bir Sayıcı Döngüsü


Bu örnekte, bir değişkenin değeri belirli bir sayıya ulaşana kadar döngüyü sürdürüyoruz.

sayac = 0
while sayac < 5:
    print(f"Sayı: {sayac}")
    sayac += 1 # Sayacı her döngüde bir artırıyoruz
print("Döngü tamamlandı.")

Açıklama: sayac değişkeni 0'dan başlar ve her iterasyonda 1 artırılır. sayac < 5 koşulu False olana kadar döngü devam eder. Koşul False olduğunda döngüden çıkılır ve "Döngü tamamlandı." mesajı yazdırılır.


Örnek 2: break İfadesiyle Döngüyü Sonlandırma


break ifadesi, döngü koşulu hala True olsa bile döngüden hemen çıkmak için kullanılır.

i = 1
while True: # Sonsuz döngü başlatıyoruz
    print(f"i'nin değeri: {i}")
    if i == 3:
        print("3'e ulaşıldı, döngüden çıkılıyor.")
        break # Döngüyü sonlandır
    i += 1
print("Döngü dışı.")

Açıklama: while True ile teorik olarak sonsuz bir döngü başlatılır. Ancak, i değişkeni 3 olduğunda break ifadesi çalışır ve döngü anında sonlanır. Bu, belirli bir iç koşul karşılandığında döngüden çıkmak için kullanışlıdır.


Örnek 3: continue İfadesiyle İterasyonu Atlatma


continue ifadesi, mevcut iterasyonun geri kalanını atlayarak döngünün bir sonraki iterasyonuna geçmek için kullanılır.

j = 0
while j < 5:
    j += 1
    if j == 3:
        print(f"{j} atlanıyor...")
        continue # Bu iterasyonun geri kalanını atla
    print(f"j'nin değeri: {j}")
print("Döngü tamamlandı.")

Açıklama: j 3 olduğunda, "3 atlanıyor..." mesajı yazdırılır ve continue ifadesi çalışarak print(f"j'nin değeri: {j}") satırını atlar. Döngü bir sonraki iterasyondan devam eder.


Örnek 4: else Bloğu Kullanımı


else bloğu, döngü koşulu False olduğunda ve döngü break ile sonlandırılmadığında yürütülür.

k = 0
while k < 3:
    print(f"k'nin değeri: {k}")
    k += 1
else:
    print("While döngüsü doğal yollarla tamamlandı.")

Açıklama: Bu örnekte döngü k 3 olana kadar devam eder. Koşul False olduğunda else bloğu yürütülür. Eğer break ifadesi ile döngüden çıkılsaydı, else bloğu çalışmazdı.


Önemli Notlar ve İpuçları


  • Sonsuz Döngülerden Kaçının: while döngüsünde koşulun her zaman True kalması veya hiçbir zaman False olmaması durumunda sonsuz bir döngü oluşur. Bu, programınızın kilitlenmesine neden olabilir. Koşulu etkileyecek bir ifadeyi (örneğin, bir sayacı artıran veya bir kullanıcı girdisi alan) döngü içinde bulundurduğunuzdan emin olun.

  • Koşulu Güncelleyin: Döngü koşulunun sonunda False değerini almasını sağlayacak bir mekanizma mutlaka olmalıdır. Aksi takdirde sonsuz döngü oluşur.

  • break ve continue Dikkatli Kullanın: Bu ifadeler güçlüdür ve döngü akışını değiştirirler. Kodun okunabilirliğini azaltmamak için gerektiğinde ve anlaşılır bir şekilde kullanılmalıdır.

  • else Bloğunun Davranışı: else bloğu, yalnızca while döngüsü koşulunun False olmasıyla doğal bir şekilde sona erdiğinde yürütülür. Eğer döngü bir break ifadesiyle kesilirse, else bloğu yürütülmez.

  • for vs. while: Belirli bir öğe dizisi üzerinde (örneğin bir liste veya dize) yineleme yapmanız gerektiğinde genellikle for döngüsü daha uygundur. while döngüsü ise, döngünün kaç kez çalışacağını önceden bilmediğiniz, belirli bir koşulun karşılanmasını beklediğiniz durumlarda tercih edilir.

11
0
PHP Dilinde Öntanımlı İstisnalar: Etkili Hata Yönetimi

Modern yazılım geliştirmede, beklenmedik durumları ve hataları etkili bir şekilde yönetmek, uygulamanın sağlamlığı ve sürdürülebilirliği için kritik öneme sahiptir. PHP, bu tür durumları ele almak için güçlü bir istisna yönetimi mekanizması sunar. Bu mekanizma, programın normal akışını bozmadan, hata koşullarının yakalanmasını ve uygun şekilde işlenmesini sağlar. PHP'deki öntanımlı istisnalar, çeşitli hata senaryoları için standartlaştırılmış çözümler sunarak geliştiricilerin daha temiz, okunaklı ve bakımı kolay kod yazmasına yardımcı olur.


Temel Sözdizimi


PHP'de istisnaları kullanmanın temel yapısı, bir kod bloğunu hata açısından izlemek için try, yakalanan istisnayı işlemek için catch ve isteğe bağlı olarak, try ve catch bloklarının yürütülmesinden sonra her zaman çalıştırılacak kodu tanımlamak için finally anahtar kelimelerinden oluşur.


Detaylı Açıklama


İstisna yönetiminin temel bileşenleri ve öntanımlı istisna sınıfları şunlardır:


  • try Bloğu: İstisna fırlatma potansiyeli olan kod, bu bloğun içine yerleştirilir. Eğer bu blok içinde bir istisna fırlatılırsa, normal akış kesilir ve kontrol uygun catch bloğuna geçer.

  • catch Bloğu: Bir try bloğu içinde fırlatılan bir istisnayı yakalamak için kullanılır. catch anahtar kelimesi, parantez içinde yakalanacak istisna türünü (sınıfını) ve bu istisnayı temsil edecek bir değişkeni (genellikle $e) alır. PHP, istisna hiyerarşisinde fırlatılan istisnayla eşleşen ilk catch bloğunu çalıştırır. Genel Exception sınıfı en genel istisna türüdür ve tüm istisnaları yakalar. Daha spesifik istisnalar için, bu sınıfın alt sınıfları kullanılmalıdır.

  • finally Bloğu (PHP 5.5+): Bu blok içindeki kod, try ve catch bloklarının yürütülmesinden sonra her zaman çalışır, bir istisna fırlatılsa da fırlatılmasa da. Kaynakları serbest bırakmak veya temizlik işlemleri yapmak için idealdir.

  • throw Anahtar Kelimesi: Manuel olarak bir istisna fırlatmak için kullanılır. Bir istisna fırlatıldığında, programın normal akışı durur ve kontrol, fırlatılan istisnayı yakalamaya uygun bir catch bloğu arar.

  • Exception Sınıfı: PHP'deki tüm istisna sınıflarının temelidir. Kendi özel istisna sınıflarınızı oluştururken bu sınıftan türetebilirsiniz. Exception sınıfı; hata mesajı, hata kodu, dosya adı ve satır numarası gibi önemli bilgilere erişim sağlayan metotlara sahiptir.

  • Öntanımlı İstisna Sınıfları: PHP, çeşitli senaryolar için bir dizi öntanımlı istisna sınıfı sunar. Bunlar, Exception sınıfının alt sınıflarıdır ve belirli hata koşullarını daha spesifik olarak ele almanızı sağlar. Örnekler arasında şunlar bulunur:

    • InvalidArgumentException: Bir fonksiyona veya metoda geçersiz bir argüman iletildiğinde fırlatılır.

    • LengthException: Bir değerin uzunluğu uygun olmadığında fırlatılır (örn. bir string'in veya dizinin).

    • OutOfRangeException: İstenen değerin geçerli bir aralık dışında olduğunu belirtir.

    • RuntimeException: Çalışma zamanında ortaya çıkan hatalar için genel bir istisnadır. Diğer, daha spesifik RuntimeException alt sınıfları da mevcuttur (örn. BadFunctionCallException, BadMethodCallException).

    • TypeError: Bir fonksiyona veya metoda yanlış türde bir argüman iletildiğinde fırlatılır (PHP 7+).


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, öntanımlı istisnaların PHP uygulamalarında nasıl kullanılabileceğini göstermektedir.


Örnek 1: Temel try-catch kullanımı


";
    echo "10 / 0 = " . bol(10, 0) . "
"; // Bu satır bir istisna fırlatır echo "Bu satır asla çalışmayacak.
"; } catch (InvalidArgumentException $e) { echo "Bir hata yakalandı: " . $e->getMessage() . "
"; echo "Hata kodu: " . $e->getCode() . "
"; echo "Hata dosyası: " . $e->getFile() . " satır " . $e->getLine() . "
"; } finally { echo "Bölme işlemi denemesi tamamlandı.
"; } echo "Program devam ediyor.
"; ?>

Bu örnekte, bol fonksiyonu sıfıra bölme durumunda bir InvalidArgumentException fırlatır. try bloğu bu fonksiyonu çağırır ve istisna oluştuğunda kontrol catch bloğuna geçer. finally bloğu ise istisna fırlatılsa da fırlatılmasa da çalışır.


Örnek 2: Birden Fazla catch Bloğu ile Spesifik İstisnaları Yakalama


 2) {
        throw new OutOfRangeException("Mod değeri 0 ile 2 arasında olmalıdır.");
    }

    switch ($mod) {
        case 0: return strtoupper($veri);
        case 1: return strtolower($veri);
        case 2: return strrev($veri);
    }
    return $veri; // Bu satıra asla ulaşılmamalı
}

try {
    echo islemYap("Merhaba", 1) . "
"; echo islemYap("", 0) . "
"; // InvalidArgumentException fırlatır echo islemYap("Dunya", 5) . "
"; // Bu satıra ulaşılamaz } catch (InvalidArgumentException $e) { echo "Geçersiz argüman hatası: " . $e->getMessage() . "
"; } catch (OutOfRangeException $e) { echo "Aralık dışı hata: " . $e->getMessage() . "
"; } catch (Exception $e) { // Tüm diğer istisnaları yakalar echo "Genel bir hata oluştu: " . $e->getMessage() . "
"; } finally { echo "İşlem denemesi sona erdi.
"; } ?>

Bu örnek, farklı istisna türlerini yakalamak için birden fazla catch bloğunun nasıl kullanılacağını gösterir. PHP, istisna hiyerarşisinde en spesifik olandan en genele doğru sıralama yapılmasını önerir. Bu şekilde, önce InvalidArgumentException ve OutOfRangeException gibi özel durumlar yakalanır, ardından Exception ile diğer tüm istisnalar ele alınır.


Önemli Notlar ve İpuçları


  • Spesifik İstisnaları Yakalayın: Mümkün olduğunca spesifik istisna sınıflarını yakalayın (örn. InvalidArgumentException yerine Exception kullanmak yerine). Bu, hata koşullarını daha doğru bir şekilde tanımlamanıza ve işlemenize olanak tanır.

  • İstisna Hiyerarşisi: Birden fazla catch bloğu kullanırken, en spesifik istisnaları önce, en genel istisnayı (Exception) ise en sona yerleştirin. Aksi takdirde, genel istisna bloğu tüm istisnaları yakalayabilir ve daha spesifik bloklara asla ulaşılamaz.

  • finally Bloğunu Kullanın: Kaynakları serbest bırakmak (örn. dosya tanıtıcıları, veritabanı bağlantıları) veya temizlik işlemleri yapmak için finally bloğunu kullanın. Bu, kodun hem başarıyla tamamlandığı hem de bir istisna fırlatıldığı durumlarda tutarlılık sağlar.

  • Kendi İstisna Sınıflarınızı Oluşturun: PHP'nin öntanımlı istisnaları çoğu durumu kapsasa da, uygulamanıza özgü hata durumları için Exception sınıfından türeyen kendi istisna sınıflarınızı oluşturmanız, kodunuzu daha anlamlı ve yönetilebilir hale getirebilir.

  • Hata Mesajlarını Açık Tutun: İstisnaları fırlatırken, sorunun ne olduğunu ve nasıl düzeltilebileceğini açıklayan net ve bilgilendirici hata mesajları sağlayın. Bu, hata ayıklama sürecini büyük ölçüde hızlandırır.

  • İstisnaları Yutmaktan Kaçının: Bir istisnayı yakalayıp hiçbir şey yapmamak (boş bir catch bloğu) yaygın bir hatadır. Bu, hataların göz ardı edilmesine ve uygulamanızda gizli sorunlara yol açabilir. Her zaman yakaladığınız bir istisnayı işleyin (örn. loglayın, kullanıcıya bildirin veya yeniden fırlatın).


9
0
JavaScript Dilinde JS Events Kullanımı

JavaScript, web sayfalarını etkileşimli hale getirmek için kullanıcı eylemlerine veya tarayıcı olaylarına tepki verme yeteneği sağlar. Bu tepkiler, 'olaylar' (events) aracılığıyla yönetilir. Bir kullanıcı bir düğmeye tıkladığında, bir form gönderdiğinde veya fare imlecini bir öğenin üzerine getirdiğinde, JavaScript bu olayları dinleyebilir ve tanımlanan işlevleri çalıştırabilir. Bu makale, JavaScript olaylarının temel kullanımını, sözdizimini ve pratik uygulamalarını detaylandıracaktır.


Sözdizimi


JavaScript'te bir DOM öğesine olay dinleyicisi eklemenin en yaygın ve önerilen yolu EventTarget.addEventListener() metodunu kullanmaktır. Bu metod, belirli bir olay türü gerçekleştiğinde çalıştırılacak bir işlevi (handler) kaydeder.


target.addEventListener(event, listener, [options]);

Detaylı Açıklama


EventTarget.addEventListener() metodu üç ana argüman alır:


  • target: Olay dinleyicisinin ekleneceği DOM öğesidir. Örneğin, bir düğme, bir metin alanı veya belge kendisi olabilir.

  • event: Dinlenecek olayın adını belirten bir stringdir. Örnekler arasında 'click', 'mouseover', 'keydown', 'submit' bulunur. Olay adları büyük/küçük harfe duyarlıdır ve genellikle küçük harfle yazılır.

  • listener: Belirtilen olay gerçekleştiğinde çağrılacak olan işlevdir (callback fonksiyonu). Bu işlev, olayın kendisi hakkında bilgi içeren bir Event nesnesini argüman olarak alabilir.

  • options (isteğe bağlı): Olay dinleyicisinin davranışını yapılandıran bir nesnedir. En yaygın seçenekler şunlardır:


    • capture: Bir boolean değeridir. true ise, olay yakalama (capturing) aşamasında, false ise olay kabarcıklanma (bubbling) aşamasında tetiklenir. Varsayılan değer false'tur.

    • once: Bir boolean değeridir. true ise, olay dinleyicisi olay bir kez tetiklendikten sonra otomatik olarak kaldırılır. Varsayılan değer false'tur.

    • passive: Bir boolean değeridir. true ise, dinleyicinin event.preventDefault() çağrısı yapmayacağını belirtir. Bu, özellikle kaydırma (scrolling) olaylarında performansı artırabilir. Varsayılan değer false'tur.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, JavaScript olaylarının çeşitli kullanım senaryolarını göstermektedir.


Örnek 1: Düğme Tıklama Olayı


Bir HTML düğmesine tıklandığında konsola bir mesaj yazdıran basit bir örnek.







Örnek 2: Giriş Alanı Değişikliği


Bir metin giriş alanındaki değer her değiştiğinde bu değişikliği yakalayan bir örnek.




Girilen Değer:

Örnek 3: Fare Üzerine Gelme ve Ayrılma


Bir öğenin üzerine fare imleci geldiğinde ve ayrıldığında farklı işlevleri çalıştıran bir örnek.



Fareyi Üzerime Getir

Önemli Notlar


  • Dinleyiciyi Kaldırma: Performans ve bellek sızıntılarını önlemek için, özellikle tek seferlik olaylarda veya bileşenler kaldırıldığında EventTarget.removeEventListener() metodunu kullanarak olay dinleyicilerini kaldırmak önemlidir. addEventListener ile aynı argümanlar kullanılmalıdır (aynı fonksiyon referansı dahil).

  • Olay Nesnesi: Olay dinleyici fonksiyonuna otomatik olarak geçirilen Event nesnesi, olayın türü (event.type), hedefi (event.target), tuş bilgisi (event.key, event.keyCode) gibi değerli bilgiler içerir.

  • event.preventDefault(): Bazı olayların varsayılan tarayıcı davranışları vardır (örneğin, bir bağlantıya tıklamak sizi başka bir sayfaya götürür veya bir form göndermek sayfayı yeniler). Bu varsayılan davranışları durdurmak için olay nesnesi üzerindeki event.preventDefault() metodunu kullanabilirsiniz.

  • Olay Kabarcıklanması ve Yakalama: Olaylar, DOM ağacında yukarı (kabarcıklanma) veya aşağı (yakalama) doğru yayılır. addEventListener metodunun üçüncü argümanı (veya options nesnesindeki capture özelliği) bu davranışı kontrol etmenizi sağlar. Çoğu durumda, varsayılan kabarcıklanma davranışı yeterlidir.

  • this Anahtar Kelimesi: Bir olay dinleyicisi içinde this anahtar kelimesi, olayın gerçekleştiği DOM öğesini (event.currentTarget) ifade eder. Ancak, arrow fonksiyonlar kullanıldığında this, tanımlandığı kapsayıcı kapsamı korur.

9
0