Çerezler
Bu web sitesi sizlere daha iyi hizmet verebilmek için çerezleri kullanır.
                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.
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'); // trueBir 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();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.
Aşağıdaki örnekler, Map nesnesinin çeşitli kullanım senaryolarını göstermektedir.
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: 0Map'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)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
// 250Map 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 ]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.
                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.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.
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.
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
                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.
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
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.
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.
# 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}")
# 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}")
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}")
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}")
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.
                ![]()
 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. 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:

 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.
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.

2. Harici Bir Kaynaktan Görüntü Ekleme:
Bir CDN'den veya başka bir web sitesinden bir görüntü yükler.

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.

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.

5.  ve  ile Resim ve Açıklama:
Bir resmi ve ilişkili başlığını semantik olarak gruplandırmak için kullanılır.
    
    Akdeniz'de muhteşem bir günbatımı görüntüsü. 
 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.
                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.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];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.
ProductID, ProductName, Price ve StockQuantity gibi sütunlar bulunmaktadır.SELECT TOP 5 ProductName, Price
FROM Ürünler
ORDER BY Price DESC;SELECT TOP 10 PERCENT ProductName, StockQuantity
FROM Ürünler
ORDER BY StockQuantity ASC;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;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.
                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.
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.
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.
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}")
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.
                function generatorFunction(): Generator
{
    yield $value;
    // veya
    yield $key => $value;
}
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.
 $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...
?>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.
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.
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.
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.
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.
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.
                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.
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:    / ;
      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;
}
        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;
}
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.
                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, 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.
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.
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.
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.
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.
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.
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.
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ı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.
                
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.
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, ...);
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.
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ı: 9Statik 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.
                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.
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;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.
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);
COUNT(*))Bu sorgu, Satislar tablosundaki toplam satış kaydını döndürür.
SELECT
    COUNT(*) AS ToplamSatisSayisi
FROM
    Satislar;COUNT(kolon_adı))MusteriID değeri olan (yani NULL olmayan) satışların sayısını bulur.
SELECT
    COUNT(MusteriID) AS MusteriliSatisSayisi
FROM
    Satislar;COUNT(DISTINCT kolon_adı))Kaç farklı müşterinin satış yaptığını gösterir.
SELECT
    COUNT(DISTINCT MusteriID) AS BenzersizMusteriSayisi
FROM
    Satislar;SUM())Tüm satışların toplam miktarını döndürür.
SELECT
    SUM(Miktar) AS ToplamSatisMiktari
FROM
    Satislar;AVG())Tüm satışların ortalama miktarını döndürür.
SELECT
    AVG(Miktar) AS OrtalamaSatisMiktari
FROM
    Satislar;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;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;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;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;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.
                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.
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.
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.
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
*/
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.
                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,  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.
HTML belgelerinde sayfa başlığı,  bölümü içinde yer alan  etiketi ile tanımlanır. Bu etiket, açılış ve kapanış etiketleri arasında sayfanın başlık metnini içerir.
    Sayfa Başlığı Buraya Gelir 
 Etiketi: Bu, HTML belgesinin başlığını tanımlayan ana etikettir. Bir açılış  etiketi ve bir kapanış  etiketi gerektirir. Bu etiket çifti arasına yerleştirilen metin, web sayfasının başlığı olarak işlenir.
Başlık Metni:  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.
Yerleşim:  etiketi, HTML belgesinin  etiketi içinde yer almalıdır.  bölümü, sayfa hakkında meta veri (görünmeyen bilgiler) sağlayan diğer etiketleri (örneğin, , , ) barındırır.  etiketi içinde yer alan  etiketi, HTML spesifikasyonlarına aykırıdır ve doğru şekilde işlenmeyebilir.
Aşağıdaki örnekler,  etiketinin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Örnek 1: Temel Bir Web Sayfası İçin Başlık Tanımlama
Bu örnek, genel bir web sayfası için açıklayıcı bir başlık belirlemeyi göstermektedir.
    
    
    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  oluşturulabileceğini gösterir.
    
    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.
Tekillik: Her web sayfası için  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.
Uzunluk: Ç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.
Anahtar Kelime Kullanımı: Sayfanın ana konusunu en iyi özetleyen ve hedef kitlenizin arama yaparken kullanabileceği anahtar kelimeleri  etiketi içinde doğal bir şekilde kullanmak, SEO performansını artırır.
Marka Adı: 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ı".
Anlamlı ve Çekici Olma: 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.
Konum:  etiketi her zaman  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.
                ::before veya ::after) aracılığıyla veya doğrudan HTML etiketleri üzerinden stilize etmektir. En yaygın yöntem, ikon fontlarının özel karakterlerini content özelliği ile kullanmaktır.
/* İkon fontunun dahil edilmesi (genellikle  içinde veya CSS  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 ) ile kullanım */
.fa-user {
    color: #2ecc71;
    font-size: 24px;
}
@import url(...): 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  etiketiyle projenize entegre edilir. Bu, ikon karakterlerinin tarayıcı tarafından erişilebilir olmasını sağlar.
.icon-example::before: Bu, bir HTML elementine (.icon-example sınıfına sahip herhangi bir element) görsel içerik eklemek için kullanılan bir pseudo-elementtir. ::before, elementin içeriğinden önce, ::after ise elementin içeriğinden sonra ekleme yapar. İkon fontlarını bu şekilde kullanmak, HTML yapısını temiz tutar.
font-family: İ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 'Font Awesome 6 Free' veya 'Material Icons').
font-weight: İ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 900, Regular için 400).
content: Pseudo-elementin içine yerleştirilecek içeriği tanımlar. İkon fontları söz konusu olduğunda, bu genellikle ikonun özel Unicode değeridir (örneğin, '\f007'). Her ikonun kendine özgü bir Unicode değeri vardır ve bu değer, ikon kütüphanesinin dökümantasyonunda bulunur.
.fa-user: Birçok ikon kütüphanesi, ikonları doğrudan HTML etiketlerine (genellikle  veya ) uygulayabileceğiniz önceden tanımlanmış CSS sınıfları (örneğin, fa fa-user veya fas fa-user) sağlar. Bu sınıflar, gerekli font-family, font-weight ve content özelliklerini otomatik olarak uygular.
Anasayfa
.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;
}
.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;
}
.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;
}
Performans: 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.
Erişilebilirlik (Accessibility): İkonların görsel bir anlamı varsa, ekran okuyucular için bu anlamı sağlamak önemlidir. Genellikle  veya  etiketleri içinde kullanılan ikonlara aria-hidden="true" özelliği ekleyerek ekran okuyucuların tekrarlayan veya anlamsız ikonları okumasını engelleyebilirsiniz. Anlamlı ikonlar için [İkon Açıklaması] gibi metinsel açıklamalar eklemeyi düşünebilirsiniz.
SVG İkonları: İ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.
Tarayıcı Desteği: İ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.
Font Yolu: İkon fontu dosyalarının (.woff, .ttf 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.
                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.
JavaScript'te düzenli ifadeler iki ana şekilde oluşturulabilir: bir RegExp literal'i veya RegExp kurucusu kullanılarak.
Bir RegExp literal'i, deseni iki eğik çizgi (/) arasına alarak oluşturulur ve isteğe bağlı olarak sonuna bayraklar eklenir:
/desen/bayraklarBir RegExp kurucusu ise, deseni ve bayrakları string olarak alır:
new RegExp("desen", "bayraklar")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.
Yukarıdaki sözdiziminde yer alan desen ve bayraklar bileşenleri aşağıdaki gibi açıklanabilir:
Desen (Pattern): Eşleştirilmek istenen karakter dizilerini veya kalıpları tanımlar. Bu, sabit karakterler, özel karakterler (örneğin, . herhangi bir karakteri eşleştirmek için), niceleyiciler (örneğin, + bir veya daha fazla kez eşleştirmek için) ve karakter sınıfları (örneğin, [0-9] bir rakamı eşleştirmek için) içerebilir.
Bayraklar (Flags): 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:
g (global): Desenin tüm eşleşmelerini bulur, ilk eşleşmeden sonra durmaz.
i (case-insensitive): Büyük/küçük harf duyarsız eşleştirme yapar.
m (multiline): Çok satırlı giriş dizilerinde ^ ve $ karakterlerinin her satırın başında ve sonunda eşleşmesini sağlar.
u (unicode): Deseni Unicode kod noktaları dizisi olarak ele alır.
s (dotAll): . (nokta) karakterinin satır sonu karakterleri dahil herhangi bir karakterle eşleşmesini sağlar.
d (hasIndices): Eşleşen alt dizelerin başlangıç ve bitiş indekslerini içeren bir dizi döndürür.
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ı:
1. RegExp.prototype.test(): Bir string'de bir desenin bulunup bulunmadığını kontrol eder ve bir boolean değer döndürür.
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)); // false2. String.prototype.match(): Bir string'de deseni arar ve tüm eşleşmeleri içeren bir dizi döndürür. g bayrağı yoksa sadece ilk eşleşmeyi döndürür.
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"]3. String.prototype.replace(): Bir string'deki desene uyan kısımları başka bir string ile değiştirir.
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."4. String.prototype.search(): Bir string'de deseni arar ve ilk eşleşmenin indeksini döndürür. Eşleşme bulunamazsa -1 döndürür. g bayrağı bu metot için anlamsızdır.
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); // -15. String.prototype.split(): Bir string'i, belirtilen bir desen veya karakter dizisi kullanarak bir diziye böler.
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)Kaçış Karakterleri: Özel anlamı olan karakterleri (örneğin, ., *, +, ?, ^, $, (, ), [, ], {, }, |, \) desen içinde literal olarak kullanmak isterseniz, önüne ters eğik çizgi (\) ekleyerek kaçış yapmalısınız. Örneğin, bir noktayı (.) eşleştirmek için /\./ kullanın.
Dinamik Desenler: Deseni bir string'den oluşturuyorsanız (new RegExp("desen")), bu string içindeki kaçış karakterlerini (\) iki kez kaçış yapmanız gerekebilir (örneğin, new RegExp("\\d+")).
Performans: Ç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.
Stateful RegExp: g bayrağına sahip bir RegExp nesnesi, lastIndex özelliğini günceller. Aynı RegExp nesnesini birden fazla kez test() veya exec() 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 RegExp literal'i oluşturmayı düşünün.
Online Araçlar: 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.
                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, MIN() ve MAX() 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.
MIN() ve MAX() fonksiyonlarının temel sözdizimi oldukça basittir. Her iki fonksiyon da parametre olarak bir sütun adı alır.
SELECT MIN(kolon_adi)
FROM tablo_adi
WHERE kosul;SELECT MAX(kolon_adi)
FROM tablo_adi
WHERE kosul;Yukarıdaki sözdiziminde yer alan her bir bileşenin anlamı aşağıda açıklanmıştır:
SELECT: Veri tabanından veri çekmek için kullanılan SQL komutudur. Bu komut ile hangi sütunların döndürüleceği belirtilir.
MIN(kolon_adi): Belirtilen kolon_adi 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.
MAX(kolon_adi): Belirtilen kolon_adi 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.
FROM tablo_adi: Sorgunun hangi tablodan veri çekeceğini belirtir.
WHERE kosul (Opsiyonel): Sorgu sonuçlarını belirli bir kritere göre filtrelemek için kullanılır. Sadece bu koşulu sağlayan satırlar MIN() veya MAX() fonksiyonuna dahil edilir.
Aşağıdaki örneklerde, bir Urunler tablosu kullanıldığı varsayılmıştır. Bu tablo, UrunID, UrunAdi, Kategori, Fiyat ve StokAdedi sütunlarını içermektedir.
Örnek 1: Tüm Ürünlerin En Düşük Fiyatını Bulma
Bu sorgu, Urunler tablosundaki tüm ürünler arasında en düşük fiyatı döndürecektir.
SELECT MIN(Fiyat) AS EnDusukFiyat
FROM Urunler;Örnek 2: Tüm Ürünlerin En Yüksek Fiyatını Bulma
Bu sorgu, Urunler tablosundaki tüm ürünler arasında en yüksek fiyatı döndürecektir.
SELECT MAX(Fiyat) AS EnYuksekFiyat
FROM Urunler;Örnek 3: Belirli Bir Kategorideki En Düşük Fiyatı Bulma
WHERE koşulunu kullanarak sadece 'Elektronik' kategorisindeki ürünlerin en düşük fiyatını bulabiliriz.
SELECT MIN(Fiyat) AS ElektronikEnDusukFiyat
FROM Urunler
WHERE Kategori = 'Elektronik';Örnek 4: Her Kategori İçin En Yüksek Fiyatı Bulma
GROUP BY ifadesini kullanarak her bir kategori için ayrı ayrı en yüksek fiyatı bulabiliriz.
SELECT Kategori, MAX(Fiyat) AS KategoriEnYuksekFiyat
FROM Urunler
GROUP BY Kategori;Örnek 5: En Az Stoğa Sahip Ürünün Stok Adedini Bulma
StokAdedi sütunundaki en küçük değeri bularak, bir ürünün minimum stok adedini belirleyebiliriz.
SELECT MIN(StokAdedi) AS MinimumStok
FROM Urunler;NULL Değerler: MIN() ve MAX() fonksiyonları, işleme alırken NULL değerleri genellikle göz ardı eder. Yani, bir sütunda NULL değerler varsa, bu değerler hesaplamaya dahil edilmez.
Veri Tipleri: 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.
DISTINCT Anahtar Kelimesi: MIN(DISTINCT kolon_adi) veya MAX(DISTINCT kolon_adi) şeklinde kullanım mümkündür, ancak MIN() ve MAX() zaten tek bir değer döndürdüğü için DISTINCT anahtar kelimesinin bu bağlamda pratik bir faydası genellikle yoktur.
Performans: Çok büyük veri setlerinde, MIN() ve MAX() 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.
GROUP BY ve HAVING: Eğer MIN() veya MAX() fonksiyonlarını GROUP BY ile birlikte kullanıyorsanız ve gruplandırılmış sonuçlar üzerinde bir filtreleme yapmak istiyorsanız, WHERE yerine HAVING koşulunu kullanmanız gerekir. Örneğin, HAVING MAX(Fiyat) > 1000.
                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 if, elif (else if'in kısaltması) ve else 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.
Python'da if...elif...else yapısının genel sözdizimi aşağıdaki gibidir:
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
Her koşul ifadesi bir kolon (:) 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.
if ifadesi: Koşullu bloğun başlangıcını işaret eder. Belirtilen koşul1 bir boolean (True veya False) olarak değerlendirilir. Eğer koşul True ise, if bloğunun içindeki kod çalıştırılır. Aksi takdirde, program bir sonraki elif veya else ifadesine geçer.
elif ifadesi (isteğe bağlı): Birden fazla koşulu kontrol etmek için kullanılır. Eğer önceki if koşulu yanlışsa, program bir sonraki elif koşulunu kontrol eder. koşul2 doğruysa, ilgili elif bloğu çalıştırılır. Bir if yapısında birden fazla elif ifadesi bulunabilir.
else ifadesi (isteğe bağlı): Tüm önceki if ve elif 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.
Unutulmamalıdır ki, bir if...elif...else 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.
Aşağıdaki örnekler, if...elif...else yapısının farklı senaryolarda nasıl kullanıldığını göstermektedir.
Örnek 1: Tek Bir if İfadesi
yaş = 18
if yaş >= 18:
    print("Oy kullanabilirsiniz.")
Bu örnekte, yaş değişkeninin değeri 18 veya daha büyükse mesaj yazdırılır.
Örnek 2: if...else Kullanımı
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.")
Burada, hava_durumu değişkeni "güneşli" ise ilk blok, aksi halde else bloğu çalışır.
Örnek 3: if...elif...else Zinciri
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")
Bu örnekte, puan 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.
Örnek 4: İç İçe if İfadeleri
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ı.")
Koşullar karmaşıklaştığında, if ifadelerini iç içe kullanmak mümkündür. Ancak aşırı iç içe geçmiş yapılar kodun okunabilirliğini azaltabilir.
Girinti (Indentation): Python'da kod blokları girintilerle belirlenir. Genellikle 4 boşluk kullanılır. Yanlış girinti IndentationError hatasına yol açar.
Kolon (:): Her if, elif ve else ifadesinden sonra bir kolon (:) gelmelidir.
Koşul İfadeleri: Koşul ifadeleri genellikle karşılaştırma operatörleri (==, !=, <, >, <=, >=) ve mantıksal operatörler (and, or, not) kullanılarak oluşturulur.
Kısa Devre Değerlendirmesi: 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, False and (pahalı_işlem()) ifadesinde pahalı_işlem() fonksiyonu asla çağrılmaz.
Boş Bloklar: Bir koşul bloğunun içine henüz kod yazmak istemiyorsanız, pass anahtar kelimesini kullanarak boş bir blok oluşturabilirsiniz. Bu, bir IndentationError oluşmasını engeller.
                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.
Bir HTML tablosu,