Çerezler
Bu web sitesi sizlere daha iyi hizmet verebilmek için çerezleri kullanır.
                Veritabanı sorgularında, belirli kriterlere uyan verileri çekmek genellikle tek bir koşuldan daha fazlasını gerektirir. SQL'deki mantıksal operatörler, bu tür karmaşık filtreleme ihtiyaçlarını karşılamak için güçlü araçlar sunar. Bu operatörlerden biri olan OR operatörü, birden fazla koşuldan en az birinin doğru olması durumunda bir kaydın sonuç kümesine dahil edilmesini sağlar. Bu makale, OR operatörünün sözdizimini, detaylı açıklamasını ve çeşitli pratik kullanım örneklerini ele alarak, veritabanı sorgularınızda çoklu koşulları etkin bir şekilde nasıl birleştireceğinizi göstermeyi amaçlamaktadır.
OR operatörü, genellikle WHERE yan tümcesi içinde, iki veya daha fazla koşulu birleştirmek için kullanılır. Genel sözdizimi aşağıdaki gibidir:
SELECT kolon1, kolon2, ...
FROM tablo_adı
WHERE koşul1 OR koşul2 OR koşul3 ...;Burada, koşul1, koşul2, koşul3 vb. birbirine OR operatörü ile bağlanan boolean ifadelerdir.
SELECT kolon1, kolon2, ...: Sorgu sonucunda görüntülenmesini istediğiniz sütunları belirtir.
FROM tablo_adı: Verilerin çekileceği veritabanı tablosunun adını belirtir.
WHERE: Sorgu sonucunu filtrelemek için kullanılan bir yan tümcedir. Sadece belirtilen koşul veya koşulları karşılayan satırlar sonuç kümesine dahil edilir.
koşul1, koşul2, koşul3: Bunlar, değerlendirilecek boolean ifadelerdir. Her koşul, bir sütun adı, bir operatör (=, >, <, >=, <=, <>, LIKE vb.) ve bir değerden oluşabilir.
OR: Bu mantıksal operatör, kendisiyle birleştirilen koşullardan herhangi birinin doğru (TRUE) olması durumunda tüm WHERE yan tümcesinin doğru kabul edilmesini sağlar. Eğer koşullardan biri bile doğruysa, ilgili satır sonuç kümesine dahil edilir. Sadece tüm koşullar yanlış (FALSE) olduğunda satır elenir.
OR ile FiltrelemeBelirli bir şehirdeki veya belirli bir departmandaki tüm çalışanları listelemek istediğinizde OR kullanabilirsiniz. Aşağıdaki örnek, 'İstanbul' şehrinde ikamet eden VEYA 'Pazarlama' departmanında çalışan tüm personeli getirir.
SELECT *
FROM Calisanlar
WHERE Sehir = 'İstanbul' OR Departman = 'Pazarlama';Bu sorgu, hem İstanbul'da yaşayan hem de Pazarlama departmanında çalışan birini, sadece İstanbul'da yaşayan ama farklı bir departmanda olanı ve sadece Pazarlama departmanında olup farklı bir şehirde yaşayanı sonuç kümesine dahil edecektir.
OR KullanımıÜç farklı şehirden (Ankara, İzmir, Bursa) müşterileri listelemek için birden fazla OR operatörü kullanabilirsiniz.
SELECT MusteriAdi, Sehir
FROM Musteriler
WHERE Sehir = 'Ankara' OR Sehir = 'İzmir' OR Sehir = 'Bursa';Bu sorgu, Sehir sütunu değeri 'Ankara', 'İzmir' veya 'Bursa' olan tüm müşterilerin adını ve şehrini döndürecektir.
AND ve OR Operatörlerinin Birlikte KullanımıAND ve OR operatörlerini birlikte kullanırken işlem önceliğine dikkat etmek önemlidir. AND operatörü, OR operatöründen daha yüksek önceliğe sahiptir. Beklenmeyen sonuçları önlemek için parantez () kullanmak en iyi uygulamadır.
Örneğin, 'Elektronik' kategorisindeki ürünlerden, fiyatı 100'den yüksek OLAN VEYA stok adedi 50'den az OLAN ürünleri bulmak istiyoruz:
SELECT UrunAdi, Fiyat, StokAdedi, Kategori
FROM Urunler
WHERE (Fiyat > 100 OR StokAdedi < 50) AND Kategori = 'Elektronik';Bu sorguda parantezler, önce (Fiyat > 100 OR StokAdedi < 50) koşulunun değerlendirilmesini sağlar, ardından bu sonucun Kategori = 'Elektronik' koşuluyla AND operatörü ile birleştirilmesini sağlar.
Koşulun Doğruluğu: OR operatörü ile birleştirilen koşullardan herhangi biri doğru olduğunda, tüm ifade doğru kabul edilir ve ilgili satır sorgu sonucuna dahil edilir.
Performans Etkisi: Çok sayıda OR koşulu kullanmak veya indekslenmemiş sütunlar üzerinde OR uygulamak, sorgu performansını olumsuz etkileyebilir. Özellikle büyük veri kümelerinde bu duruma dikkat edilmelidir.
Parantez Kullanımı: AND ve OR operatörlerini aynı WHERE yan tümcesinde kullanırken, işlem önceliğini açıkça belirtmek ve mantıksal hataları önlemek için parantez () kullanmak hayati öneme sahiptir.
IN Operatörü Alternatifi: Bir sütunun birden fazla belirli değere eşit olup olmadığını kontrol etmek için OR operatörü yerine IN operatörünü kullanmak daha okunabilir ve genellikle daha performanslı bir alternatiftir. Örneğin, WHERE Sehir = 'Ankara' OR Sehir = 'İzmir' OR Sehir = 'Bursa' yerine WHERE Sehir IN ('Ankara', 'İzmir', 'Bursa') kullanımı tercih edilebilir.
                Python programlamada, verilerin farklı tipler arasında dönüştürülmesi sıkça karşılaşılan bir gereksinimdir. Bu süreç, casting olarak adlandırılır ve bir veri tipini başka bir veri tipine çevirmemizi sağlar. Python, bu dönüşümleri gerçekleştirmek için int(), float() ve str() gibi yerleşik fonksiyonlar sunar. Bu mekanizma, özellikle kullanıcı girdilerini işlerken, matematiksel hesaplamalar yaparken veya veriyi belirli bir formatta sunarken büyük önem taşır.
Python'da casting işlemleri, dönüştürülmek istenen yeni veri tipinin adını bir fonksiyon gibi kullanarak gerçekleştirilir. Genel sözdizimi aşağıdaki gibidir:
yeni_veri_tipi(dönüştürülecek_değer)Burada yeni_veri_tipi, dönüştürme yapılacak hedef veri tipini (örneğin, int, float, str) temsil ederken, dönüştürülecek_değer ise üzerinde işlem yapılacak olan değişken veya değeri ifade eder.
int() Fonksiyonu: Bu fonksiyon, bir değeri tam sayıya dönüştürmek için kullanılır. Kayan noktalı sayıları tam sayıya dönüştürürken ondalık kısmını keser (yuvarlama yapmaz). String değerleri dönüştürürken, stringin yalnızca geçerli bir sayısal tam sayı temsili olması gerekir, aksi takdirde bir ValueError hatası yükseltir.
float() Fonksiyonu: Bir değeri kayan noktalı sayıya dönüştürür. Tam sayıları ondalık kısım ekleyerek kayan noktalı sayıya çevirir (örn: 5 -> 5.0). String değerler için, stringin geçerli bir sayısal kayan noktalı sayı temsili olması gerekir, aksi takdirde ValueError hatası verir.
str() Fonksiyonu: Herhangi bir veri tipini string (metin) temsiline dönüştürür. Bu fonksiyon, sayıları, listeleri, sözlükleri ve diğer tüm veri tiplerini hatasız bir şekilde stringe çevirebilir. Çoğu zaman en güvenli casting işlemidir.
bool() Fonksiyonu: Bir değeri Boole (True veya False) tipine dönüştürür. Python'da belirli değerler "yanlış" (falsy) kabul edilir: 0, 0.0, boş string (""), boş liste ([]), boş tuple (()), boş sözlük ({}), boş küme (set()) ve None. Diğer tüm değerler "doğru" (truthy) kabul edilir.
Bir string ifadeyi tam sayıya ve kayan noktalı sayıya dönüştürme:
sayi_string = "123"
ondalik_string = "123.45"
# String'i int'e dönüştürme
int_sayi = int(sayi_string)
print(f"'{sayi_string}' (string) -> {int_sayi} (int)")
# String'i float'a dönüştürme
float_sayi = float(ondalik_string)
print(f"'{ondalik_string}' (string) -> {float_sayi} (float)")
# Hatalı string dönüşümü (ValueError)
# int("hello") # Bu satır bir hata yükseltir
# float("123a") # Bu satır bir hata yükseltirÇıktı:
'123' (string) -> 123 (int)
'123.45' (string) -> 123.45 (float)Tam sayı ve kayan noktalı sayıları stringe dönüştürme:
tam_sayi = 42
ondalik_sayi = 3.14
# int'i string'e dönüştürme
string_tam_sayi = str(tam_sayi)
print(f"{tam_sayi} (int) -> '{string_tam_sayi}' (string)")
print(f"Dönüşüm sonrası tip: {type(string_tam_sayi)}")
# float'ı string'e dönüştürme
string_ondalik_sayi = str(ondalik_sayi)
print(f"{ondalik_sayi} (float) -> '{string_ondalik_sayi}' (string)")
print(f"Dönüşüm sonrası tip: {type(string_ondalik_sayi)}")Çıktı:
42 (int) -> '42' (string)
Dönüşüm sonrası tip: 
3.14 (float) -> '3.14' (string)
Dönüşüm sonrası tip:  Kayan noktalı sayıları tam sayıya dönüştürürken ondalık kısmın nasıl kaybedildiğini gösterir:
pi_degeri = 3.14159
buyuk_ondalik = 9.99
# float'ı int'e dönüştürme (ondalık kısım kesilir)
int_pi = int(pi_degeri)
print(f"{pi_degeri} (float) -> {int_pi} (int)")
int_buyuk_ondalik = int(buyuk_ondalik)
print(f"{buyuk_ondalik} (float) -> {int_buyuk_ondalik} (int)")Çıktı:
3.14159 (float) -> 3 (int)
9.99 (float) -> 9 (int)Farklı değerlerin Boole karşılıkları:
print(f"bool(10)       -> {bool(10)}")
print(f"bool(0)        -> {bool(0)}")
print(f"bool(3.14)     -> {bool(3.14)}")
print(f"bool('')       -> {bool('')}")
print(f"bool('Merhaba') -> {bool('Merhaba')}")
print(f"bool([])       -> {bool([])}")
print(f"bool([1, 2])   -> {bool([1, 2])}")
print(f"bool(None)     -> {bool(None)}")Çıktı:
bool(10)       -> True
bool(0)        -> False
bool(3.14)     -> True
bool('')       -> False
bool('Merhaba') -> True
bool([])       -> False
bool([1, 2])   -> True
bool(None)     -> FalseVeri Kaybı Riski: Kayan noktalı bir sayıyı (float) tam sayıya (int) dönüştürürken, ondalık kısım kesilir. Bu, önemli bir veri kaybına yol açabilir. Örneğin, int(3.99) sonucu 3 olacaktır.
ValueError Hataları: String ifadeleri sayısal tiplere (int veya float) dönüştürürken, stringin içeriği hedef tip için geçerli bir sayısal formatı temsil etmelidir. Geçersiz bir string (örneğin, "abc" veya "123a") dönüştürülmeye çalışıldığında Python bir ValueError hatası yükseltecektir. Bu tür durumları try-except blokları ile ele almak iyi bir pratik olabilir.
Yeni Nesne Oluşturma: Casting işlemi, orijinal değişkenin tipini doğrudan değiştirmez; bunun yerine, dönüştürülmüş değeri içeren yeni bir nesne oluşturur. Orijinal değişkenin tipi aynı kalır.
str()'nin Güvenilirliği: str() fonksiyonu, Python'daki hemen hemen her veri tipini bir string temsiline dönüştürebilir. Bu, çoğu zaman en güvenli ve hatasız casting işlemidir.
Açık Casting Önemi: Python dinamik tipli bir dil olmasına rağmen, bazı durumlarda açıkça casting yapmak, kodun okunabilirliğini artırır, beklenmeyen davranışları önler ve veri tiplerinin doğru bir şekilde işlendiğinden emin olmanızı sağlar.
                HTML, içeriği yapılandırmak ve anlamlandırmak için çeşitli etiketler sunar. Bu etiketlerden bazıları, alıntıları, kısaltmaları ve iletişim bilgilerini belirtmek için kullanılır. Bu makalede, , , ,  ve  etiketlerinin doğru ve semantik olarak nasıl kullanılacağını teknik detaylarıyla inceleyeceğiz. Bu etiketler, belgenin okunabilirliğini artırmanın yanı sıra, arama motorları ve yardımcı teknolojiler için içeriğin anlamını zenginleştirir.
HTML'de alıntı ve ilgili içerikler için kullanılan ana etiketlerin temel sözdizimi aşağıdaki gibidir.
  Bu, uzun bir alıntıdır.
Kısa bir alıntı: Bu kısa bir alıntıdır.
Bir eserin başlığı: Eserin Adı
Bir kısaltma: Kısaltma
  Yazar Adı
  İletişim Bilgisi
Her bir etiket, belirli bir semantik amaca hizmet eder ve doğru kullanımı, web içeriğinin erişilebilirliğini ve arama motoru optimizasyonunu (SEO) önemli ölçüde etkiler.
: Bu etiket, genellikle başka bir kaynaktan alınan ve birden fazla satır veya paragraf içerebilecek uzun alıntılar için kullanılır. Tarayıcılar genellikle bu içeriği diğer metinlerden girintili olarak gösterir. cite özniteliği, alıntının yapıldığı orijinal kaynağın URL'sini belirtmek için kullanılabilir.
: Bu etiket, metin içinde yer alan kısa, satır içi alıntılar için kullanılır. Tarayıcılar, bu etiketin içeriğini otomatik olarak tırnak işaretleri içine alır. cite özniteliği,  etiketinde olduğu gibi, alıntının kaynağını belirtir.
: Bu etiket, bir eserin (kitap, makale, şarkı, film, heykel vb.) başlığını belirtmek için kullanılır. Yazarın adı için kullanılmamalıdır. Genellikle italik olarak görüntülenir.
: Kısaltmalar ve akronimler için kullanılır. title özniteliği, kısaltmanın veya akronimin tam açılımını içerir. Bu, kullanıcıların kısaltmanın ne anlama geldiğini anlamalarına yardımcı olur ve erişilebilirlik açısından önemlidir.
: En yakın  veya  öğesinin iletişim bilgilerini (yazarın adı, e-posta adresi, fiziksel adres, URL vb.) belirtmek için kullanılır. Genellikle italik olarak görüntülenir ve tarayıcılar tarafından paragraf sonu gibi ek boşluklarla ayrılabilir.
Aşağıdaki örnekler, yukarıda açıklanan etiketlerin gerçek dünya senaryolarında nasıl kullanılacağını göstermektedir.
)
  "Hayal gücü bilgiden daha önemlidir. Bilgi sınırlıdır. Hayal gücü ise tüm dünyayı kapsar."
  
)
Steve Jobs bir keresinde Bugün, Apple telefonu yeniden icat ediyor.
 demişti.
)
En sevdiğim kitaplardan biri Sefillerdir.
)
HTML, HTML kısaltmasıyla bilinir.
)
  Yazar: Jane Doe
  E-posta: jane.doe@example.com
  Web Sitesi: example.com
Semantik Doğruluk: Bu etiketlerin temel amacı, içeriğe doğru anlamsal anlam kazandırmaktır. Sadece görsel stil için kullanılmamalıdırlar. Örneğin, girintili bir metin için  kullanmak yerine CSS ile stil vermek daha uygundur, ancak metin gerçekten bir alıntıysa  kullanılmalıdır.
cite Özniteliği: Hem  hem de  etiketlerindeki cite özniteliği, alıntının kaynağını belirten bir URL içermelidir. Bu özniteliğin değeri görsel olarak tarayıcıda görüntülenmez, ancak arama motorları ve yardımcı teknolojiler tarafından okunabilir.
 ve Tırnak İşaretleri:  etiketi kullanıldığında, tarayıcılar içeriği otomatik olarak uygun tırnak işaretleriyle çevreler. Bu nedenle, metne manuel olarak tırnak işaretleri eklemekten kaçınılmalıdır.
 ve Yazar:  etiketi yalnızca eserin başlığı için kullanılır, yazarın adı için değil. Yazarın adını belirtmek için genellikle normal paragraf etiketleri veya  içinde metin kullanılır.
 Kapsamı:  etiketi, genellikle en yakın makalenin () yazarının veya belgenin () sahibinin iletişim bilgilerini belirtir. Genel bir posta adresi veya şirket adresi için kullanılmamalıdır.
Erişilebilirlik ve SEO: Bu etiketlerin doğru kullanımı, web içeriğinin ekran okuyucular gibi yardımcı teknolojiler için daha erişilebilir olmasını sağlar. Ayrıca, arama motorlarının içeriği daha iyi anlamasına ve dizine eklemesine yardımcı olarak SEO performansını artırabilir.
                SQL (Structured Query Language), veritabanlarını yönetmek ve sorgulamak için kullanılan güçlü bir dildir. Ancak, karmaşık sorgular veya uzun betikler yazarken, kodun anlaşılabilirliğini ve sürdürülebilirliğini sağlamak kritik önem taşır. İşte bu noktada yorum satırları devreye girer. Yorumlar, SQL kodunuzun belirli bölümlerini açıklamak, geçici olarak devre dışı bırakmak veya gelecekteki referanslar için notlar eklemek amacıyla kullanılır. Bu kılavuz, SQL dilinde yorum satırlarının nasıl kullanılacağını, temel sözdiziminden pratik örneklere kadar adım adım açıklamaktadır.
SQL, iki ana yorum satırı türünü destekler:
Tek Satırlık Yorumlar: Bir satırın geri kalanını yorum olarak işaretler.
Çok Satırlık Yorumlar: Birden fazla satırı veya bir satırın belirli bir bölümünü yorum olarak işaretler.
Her bir yorum türünün kendine özgü kullanım şekli ve avantajları bulunmaktadır. Doğru bağlamda doğru yorum türünü kullanmak, kodunuzun netliğini önemli ölçüde artırır.
--Tek satırlık yorumlar, iki kısa çizgi (`--`) ile başlar ve o satırın sonuna kadar devam eder. Bu yorumlar, genellikle belirli bir sorgu satırını veya bir ifadenin amacını açıklamak için kullanılır. Kodun sonuna eklenebileceği gibi, ayrı bir satırda da yer alabilir.
/* ... */Çok satırlık yorumlar, bir eğik çizgi ve bir yıldız işareti (`/*`) ile başlar ve bir yıldız işareti ve bir eğik çizgi (`*/`) ile sona erer. Bu yorumlar, başlangıç ve bitiş işaretleri arasındaki tüm metni, kaç satıra yayılırsa yayılsın, yorum olarak kabul eder. Çok satırlık yorumlar, karmaşık sorgu bloklarını açıklamak, yazar bilgilerini belirtmek veya büyük kod bölümlerini geçici olarak devre dışı bırakmak için idealdir. SQL standartlarına göre, çok satırlık yorumlar birbirini kapsayacak şekilde (iç içe) kullanılamaz.
Aşağıdaki örnekler, SQL yorum satırlarının farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Bu örnek, bir SELECT sorgusundaki her bir sütunun veya koşulun ne anlama geldiğini açıklamak için tek satırlık yorumların nasıl kullanılabileceğini gösterir.
SELECT
    CalisanID, -- Çalışanın benzersiz kimliği
    Ad,        -- Çalışanın adı
    Soyad,     -- Çalışanın soyadı
    Maas       -- Çalışanın mevcut maaşı
FROM
    Calisanlar
WHERE
    DepartmanID = 10; -- Yalnızca 'Satış' departmanındaki çalışanları getirYukarıdaki sorguda, her sütunun yanında veya WHERE koşulunun sonunda yer alan yorumlar, kodun ne yaptığını hızlıca anlamaya yardımcı olur.
Bu örnek, bir sorgunun genel amacını açıklamak veya bir fonksiyonun nasıl çalıştığına dair kapsamlı bilgi sağlamak için çok satırlık yorumların nasıl kullanılabileceğini gösterir.
/*
Bu sorgu, 'Musteriler' tablosundaki tüm müşterileri listeler.
Sorgu aşağıdaki bilgileri içerir:
- Müşteri Adı
- Müşteri Soyadı
- Kayıt Tarihi (YYYY-MM-DD formatında)
Bu sorgu, raporlama ve analiz amaçlı kullanılmaktadır.
*/
SELECT
    MusteriAd,
    MusteriSoyad,
    FORMAT(KayitTarihi, 'yyyy-MM-dd') AS KayitTarihiFormatted
FROM
    Musteriler
WHERE
    KayitTarihi >= '2023-01-01'
ORDER BY
    MusteriSoyad;Burada, sorgunun başında yer alan çok satırlık yorum, sorgunun genel işlevini ve içerdiği bilgileri detaylı bir şekilde açıklar.
Çok satırlık yorumlar, test veya hata ayıklama sırasında bir kod bloğunu geçici olarak devre dışı bırakmak için de kullanılabilir.
SELECT
    UrunID,
    UrunAd,
    Fiyat
FROM
    Urunler
/*
WHERE
    Kategori = 'Elektronik'
    AND Fiyat > 500;
*/
ORDER BY
    UrunAd;Bu örnekte, WHERE koşulu çok satırlık bir yorum içine alınarak geçici olarak devre dışı bırakılmıştır. Bu sayede, koşulun etkisini test etmek veya sorguyu koşulsuz çalıştırmak kolaylaşır.
Okunabilirlik Önceliği: Yorumları, kodun amacını ve karmaşık mantığını açıklamak için kullanın. Açık ve kendini açıklayan kod bölümlerini aşırı yorumlamaktan kaçının.
Nedenini Açıklayın, Ne Yaptığını Değil: Kodun ne yaptığını açıklamak yerine (çünkü kod zaten bunu gösterir), neden belirli bir şekilde yazıldığını, hangi iş gereksinimini karşıladığını veya potansiyel tuzakları belirtmek için yorumları kullanın.
Geçici Kod Devre Dışı Bırakma: Hata ayıklama veya kodun belirli bölümlerini test etme amacıyla kod bloklarını geçici olarak devre dışı bırakmak için çok satırlık yorumları etkili bir şekilde kullanabilirsiniz.
Sürdürülebilirlik: Yorumlar, kodunuzu gelecekteki geliştiriciler (veya kendiniz) için daha anlaşılır hale getirerek bakım maliyetlerini düşürür.
Performans Etkisi: Yorumlar, SQL sorgularının performansını etkilemez. Veritabanı motoru, sorguları çalıştırmadan önce yorumları ayrıştırır ve yok sayar.
Tutarlılık: Ekibinizle bir yorumlama standardı belirleyin ve buna uyun. Bu, kod tabanının genel okunabilirliğini artırır.
                Python programlama dilinde string (dize) veri tipi, metinsel verileri temsil etmek için kullanılan temel bir veri yapısıdır. Karakter dizilerinden oluşan stringler, isimlerden cümlelere, dosya yollarından web içeriklerine kadar çok çeşitli verilerin depolanması ve işlenmesi için vazgeçilmezdir. Bu makale, Python'da stringlerin nasıl tanımlandığını, temel sözdizimini ve çeşitli kullanım senaryolarını detaylı bir şekilde açıklamaktadır.
Python'da bir string oluşturmak için metni tek tırnak ('), çift tırnak (") veya üçlü tırnak (''' ya da """) arasına almanız yeterlidir. String değerleri bir değişkene atanabilir veya doğrudan kullanılabilir.
# Tek tırnak kullanarak string tanımlama
tek_tirnakli_string = 'Merhaba, Dünya!'
# Çift tırnak kullanarak string tanımlama
cift_tirnakli_string = "Python çok güçlüdür."
# Üçlü tırnak kullanarak çok satırlı string tanımlama
cok_satirli_string = '''Bu,
birden fazla
satıra yayılmış bir stringdir.'''
Python stringlerinin tanımlanmasında kullanılan farklı tırnak türleri ve özel karakterler, çeşitli senaryolarda esneklik sağlar:
Tek Tırnak (') ve Çift Tırnak ("): Bu iki yöntem, tek satırlık stringler için tamamen eşdeğerdir. Hangi yöntemin kullanılacağı genellikle kişisel tercihe veya stringin içinde diğer tırnak türlerinden birini barındırıp barındırmamasına bağlıdır. Örneğin, stringinizde tek tırnak varsa, dışı çift tırnakla tanımlamak karışıklığı önler ve kaçış karakteri kullanma ihtiyacını ortadan kaldırır.
Üçlü Tırnak (''' veya """): Üçlü tırnaklar, birden fazla satıra yayılan stringleri tanımlamak için kullanılır. Bu sayede her satır sonuna manuel olarak \n (yeni satır) kaçış karakteri eklemenize gerek kalmaz. Ayrıca, üçlü tırnaklar genellikle fonksiyonlar ve modüller için belgeleme stringleri (docstrings) yazmak için tercih edilir.
Kaçış Karakterleri (Escape Characters): Bazı özel karakterleri (örneğin, yeni satır, tab, veya string içinde kullanılan tırnak işareti) string içine eklemek için \ (ters eğik çizgi) ile başlayan kaçış dizileri kullanılır. En yaygın olanları \n (yeni satır), \t (tab), \' (tek tırnak), \" (çift tırnak) ve \\ (ters eğik çizgi) şeklindedir.
Ham Dizeler (Raw Strings): Bir string içindeki kaçış karakterlerinin özel anlamlarını kaybetmesini istiyorsanız, stringin başına r veya R harfini ekleyerek ham bir string oluşturabilirsiniz. Bu, özellikle dosya yolları gibi ters eğik çizgi içeren stringlerde kullanışlıdır, çünkü her ters eğik çizgiyi çiftleme ihtiyacını ortadan kaldırır.
Aşağıdaki örnekler, Python'da string tanımlamanın ve kullanmanın farklı yollarını göstermektedir.
# Örnek 1: Temel String Tanımlama
mesaj1 = "Merhaba Python!"
mesaj2 = 'Geliştiriciler için güçlü bir araç.'
print(mesaj1)
print(mesaj2)
# Çıktı:
# Merhaba Python!
# Geliştiriciler için güçlü bir araç.
# Örnek 2: Tırnak İşaretleri İçeren Stringler
# String içinde tek tırnak kullanmak için dışarıda çift tırnak kullanılır.
cift_tirnak_ici = "Bu, 'tek tırnak' içeren bir string."
print(cift_tirnak_ici)
# String içinde çift tırnak kullanmak için dışarıda tek tırnak kullanılır.
tek_tirnak_ici = 'Bu, "çift tırnak" içeren bir string.'
print(tek_tirnak_ici)
# Kaçış karakteri ile aynı tırnak türünü kullanma
kacis_karakterli = "Bu, \"çift tırnak\" içeren bir string."
print(kacis_karakterli)
# Çıktı:
# Bu, 'tek tırnak' içeren bir string.
# Bu, "çift tırnak" içeren bir string.
# Bu, "çift tırnak" içeren bir string.
# Örnek 3: Çok Satırlı Stringler
cok_satirli_mesaj = """
Bu bir
çok satırlı
mesajdır.
"""
print(cok_satirli_mesaj)
# Çıktı:
# 
# Bu bir
# çok satırlı
# mesajdır.
# 
# Örnek 4: Kaçış Karakterlerinin Kullanımı
yeni_satir = "İlk satır.\nİkinci satır."
tab_boslugu = "Ad\tSoyad"
ters_egik_cizgi = "C:\\Users\\Kullanici" # Ters eğik çizgi için iki tane kullanmalıyız
print(yeni_satir)
print(tab_boslugu)
print(ters_egik_cizgi)
# Çıktı:
# İlk satır.
# İkinci satır.
# Ad	Soyad
# C:\Users\Kullanici
# Örnek 5: Ham Dizeler (Raw Strings)
# Ham string kullanarak kaçış karakterlerini devre dışı bırakma
ham_dize = r"C:\Users\Kullanici\belgeler\yeni_dosya.txt"
print(ham_dize)
# Çıktı:
# C:\Users\Kullanici\belgeler\yeni_dosya.txt
Değiştirilemezlik (Immutability): Python'daki stringler değiştirilemez (immutable) veri tipleridir. Bu, bir string oluşturulduktan sonra içeriğinin doğrudan değiştirilemeyeceği anlamına gelir. String üzerinde bir işlem yaptığınızda (örneğin, birleştirme veya değiştirme), aslında yeni bir string nesnesi oluşturulur.
Dize Birleştirme: Birden fazla stringi birleştirmek için + operatörünü veya .join() metodunu kullanabilirsiniz. Büyük sayıda stringi birleştirmek için .join() metodu genellikle daha performanslıdır.
Dize Metotları: Python stringleri, metin manipülasyonu için zengin bir dizi yerleşik metoda sahiptir (örneğin, .upper(), .lower(), .strip(), .replace(), .split()). Bu metotlar, string nesneleri üzerinde çağrılarak yeni stringler döndürür.
F-stringler (Biçimlendirilmiş Dize Literalleri): Python 3.6 ve sonraki sürümlerinde tanıtılan f-stringler, stringleri değişken değerleriyle biçimlendirmenin son derece okunabilir ve etkili bir yoludur. Stringin başına f veya F koyularak tanımlanır ve süslü parantezler içinde değişken isimleri veya ifadeler doğrudan kullanılabilir.
                PHP'de isim alanları (namespaces), kod organizasyonunu ve çakışmaları önlemeyi sağlayan güçlü bir özelliktir. Büyük ölçekli uygulamalarda veya üçüncü taraf kütüphanelerle çalışırken, aynı isimde sınıfların, arayüzlerin, fonksiyonların veya sabitlerin tanımlanması olası bir sorundur. İsim alanları, bu tür isim çakışmalarını (name collision) engellemek ve kodun daha modüler, okunabilir ve yönetilebilir olmasını sağlamak için bir kapsülleme katmanı sunar.
Bir PHP dosyasında isim alanı tanımlamak için namespace anahtar kelimesi kullanılır.
İsim alanı sözdiziminin temel bileşenleri şunlardır:
namespace anahtar kelimesi: Bir dosya için isim alanı bildirimini başlatır. Bu bildirim, dosyadaki tüm sınıflar, arayüzler, özellikler (traits), fonksiyonlar ve sabitler için geçerlidir.
Vendor\Project\Module: Bu kısım, tanımlanan isim alanının adını temsil eder. Genellikle ters eğik çizgi (\) ile ayrılmış hiyerarşik bir yapı kullanılır. PHP topluluğu arasında kabul gören PSR-4 autoloading standardı, genellikle isim alanı adlarının vendor (sağlayıcı), project (proje) ve module/sub-module (modül/alt modül) yapısını takip etmesini önerir.
İsim alanı bildirimi, dosyanın en üstünde, declare anahtar kelimesinden sonra ve PHP kodundan önce yapılmalıdır. Tek bir dosyada birden fazla isim alanı bildirimine izin verilmez.
Global isim alanı: Herhangi bir namespace bildirimi olmayan tüm kodlar global isim alanı içinde kabul edilir. Bir isim alanı içinde global isim alanındaki bir sınıfa veya fonksiyona erişmek için \ öneki kullanılır (örneğin, \DateTime).
Aşağıdaki örnekler, isim alanlarının farklı senaryolarda nasıl kullanıldığını göstermektedir.
Örnek 1: Temel İsim Alanı Tanımı ve Kullanımı
İki farklı isim alanında aynı isimde sınıfların nasıl tanımlandığını ve kullanıldığını gösterir.
Çıktı:
Veritabanı bağlantısı oluşturuldu (App\Database).
API bağlantısı oluşturuldu (App\Api).Örnek 2: use Anahtar Kelimesi ile İsim Alanı İçe Aktarma
use anahtar kelimesi, tam nitelikli isimleri (FQN) kısaltmak ve kodu daha okunabilir hale getirmek için kullanılır.
log("Uygulama başlatıldı.");
$notifier = new EmailNotifier();
$notifier->notify("Yeni bir kullanıcı kaydoldu.");
$dbConn = new DbConnection(); // Takma ad ile kullanım
?>Çıktı:
Dosyaya loglandı: Uygulama başlatıldı.
E-posta ile bildirildi: Yeni bir kullanıcı kaydoldu.
Veritabanı bağlantısı oluşturuldu (App\Database).Örnek 3: İsim Alanı İçinde Global Fonksiyonlara Erişim
Bir isim alanı içinden global isim alanındaki bir fonksiyona veya sınıfa erişmek için \ öneki kullanılır.
format('Y-m-d H:i:s') . PHP_EOL;
// Helper sınıfı üzerinden fonksiyonu çağırma
echo "Rastgele Dize: " . Helper::generateRandomString(15) . PHP_EOL;
?>Çıktı:
Şu anki zaman (global): 2023-10-27 10:30:00 (Örnek tarih ve saat)
Rastgele Dize: aBcD1eF2gH3iJ4k (Örnek çıktı)Tek Dosya, Tek İsim Alanı: Genel kabul gören pratik, her PHP dosyasında yalnızca bir isim alanı bildirimi yapmaktır. Bu, kodun okunabilirliğini ve otomatikle yükleme (autoloading) mekanizmalarının düzgün çalışmasını sağlar.
PSR-4 Standardı: PHP topluluğu tarafından önerilen PSR-4 autoloading standardı, isim alanlarının dosya sistemi yapısıyla eşleşmesini teşvik eder. Örneğin, App\Database\Connection isim alanındaki bir sınıf genellikle src/App/Database/Connection.php yolunda bulunur.
Global Fonksiyonlara Erişim: Bir isim alanı içinde global bir fonksiyona veya sınıfa (örneğin strlen() veya DateTime) erişmek için başına \ koyarak tam nitelikli yolunu belirtmek iyi bir pratiktir (örneğin \strlen()). Bu, isim alanınızda aynı isimde bir fonksiyon veya sınıf tanımlandığında oluşabilecek belirsizliği önler.
use Bildiriminin Kapsamı: use bildirimleri, sadece tanımlandıkları dosya içinde geçerlidir ve mevcut isim alanını etkilemez. Her dosya için ayrı ayrı use bildirimleri yapılmalıdır.
İsim Alanı Gruplama Kullanımı: PHP 7'den itibaren, aynı kök isim alanına sahip birden fazla sınıfı veya fonksiyonu tek bir use bildirimi ile içe aktarmak mümkündür (örneğin, use App\Module\{ClassA, ClassB, FunctionC};).
Sınıf Adı Çakışmaları: İki farklı kütüphaneden gelen aynı isimli sınıfları kullanmanız gerektiğinde, use anahtar kelimesi ile as takma adını kullanarak çakışmaları çözebilirsiniz (örneğin, use MyVendor\Utility\Logger as MyLogger;).
                HTML geliştirme sürecinde, kodun okunabilirliğini artırmak, gelecekteki değişiklikleri kolaylaştırmak ve takım çalışmasını desteklemek amacıyla açıklamalara ihtiyaç duyulur. HTML yorumları, tarayıcılar tarafından göz ardı edilen ve web sayfasında görüntülenmeyen metin blokları eklemenin standart yoludur. Bu kılavuz, HTML yorumlarının sözdizimini, kullanım alanlarını ve en iyi pratiklerini detaylı bir şekilde ele alacaktır.
HTML yorumları,  karakter dizisiyle sona erer. Bu iki işaret arasında yer alan tüm içerik, tarayıcı tarafından yorumlanmaz ve sayfa üzerinde gösterilmez. Bu yapı, tek satırlık yorumlar veya birden çok satırı kapsayan yorumlar için kullanılabilir.
Yukarıdaki sözdiziminde:
 (kapanış etiketi): Yorum bloğunun sonunu belirtir.
HTML yorumları, çeşitli senaryolarda kodun yönetimini ve anlaşılırlığını artırmak için kullanılabilir.
1. Kodun Amacını Açıklama: Bu, özellikle karmaşık veya belirli bir işlevi olan kod bloklarının ne yaptığını belgelemek için kullanılır. Büyük projelerde veya takım ortamında kodun ne işe yaradığını hızlıca anlamak için kritik öneme sahiptir.
    Web Sitemize Hoş Geldiniz
    Bu sayfa, HTML yorumlarının kullanımını göstermektedir.
 2. Hata Ayıklama ve Geçici Kod Devre Dışı Bırakma: Bir kod bloğunun sayfa üzerindeki etkisini geçici olarak kaldırmak veya bir hatanın kaynağını izole etmek için kullanılabilir. Bu, belirli bir bölümü devre dışı bırakarak sayfanın diğer kısımlarını test etmeyi sağlar.
Bu paragraf görünür.
Bu paragraf da görünür.
3. Tarayıcıya Özel İçerik (Koşullu Yorumlar - Eski IE Sürümleri İçin): Bazı durumlarda, özellikle eski Internet Explorer sürümlerine özel koşullu yorumlar kullanılabilirdi. Bu, belirli bir tarayıcı sürümüne özel CSS veya JavaScript dosyalarını yüklemek için bir yöntemdi. Ancak modern web geliştirme pratiklerinde bu artık nadiren görülür ve genellikle tavsiye edilmez.
İç İçe Yorumlar: HTML yorumları iç içe kullanılamaz. Yani bir yorum bloğu içinde başka bir yorum bloğu açıp kapatmak beklenen davranışı göstermez ve genellikle hataya yol açar. Örneğin,  --> yapısı geçersizdir.
Güvenlik: HTML yorumları tarayıcıda görünmese de, sayfanın kaynak kodunda bulunurlar ve herkes tarafından incelenebilirler. Bu nedenle, hassas bilgileri (API anahtarları, parolalar vb.) asla HTML yorumlarında saklamayın.
Dosya Boyutu: Aşırıya kaçan veya gereksiz yorumlar, HTML dosyasının boyutunu artırabilir. Genellikle, kodu yeterince açıklayıcı kılan ve gereksiz tekrarı önleyen dengeli bir yaklaşım benimsenmelidir.
Kod Temizliği: Üretim ortamına canlıya alınacak kodlarda, geliştirme aşamasındaki geçici yorumları temizlemek iyi bir pratik olabilir. Çoğu otomatik kod küçültme (minifier) aracı, dosya boyutunu azaltmak için yorumları kaldırır.
Tarayıcı Desteği: HTML yorum sözdizimi, tüm modern web tarayıcıları tarafından tam olarak desteklenir ve herhangi bir uyumluluk sorunu yaratmaz.
                Cascading Style Sheets (CSS) dilinde padding özelliği, bir elementin içeriği ile kenarlığı arasındaki iç boşluğu ayarlamak için kullanılır. Bu boşluk, elementin görsel alanını genişletir ancak içeriğin kendisini etkilemez. Web sayfalarının düzeninde ve elementler arası görsel hiyerarşide kritik bir role sahiptir. padding, CSS Kutu Modeli'nin (Box Model) önemli bir bileşenidir ve elementlerin tarayıcıda nasıl render edileceğini doğrudan etkiler.
padding özelliği, bir elementin dört tarafındaki iç boşlukları (üst, sağ, alt, sol) tek tek veya toplu olarak tanımlamak için çeşitli sözdizimi biçimlerine sahiptir. En yaygın kullanımları aşağıdaki gibidir:
/* Tek tek özellikler */
padding-top: ;
padding-right: ;
padding-bottom: ;
padding-left: ;
/* Kısaltılmış (shorthand) özellik - 4 değer */
padding:    ;
/* Kısaltılmış (shorthand) özellik - 3 değer */
padding:   ;
/* Kısaltılmış (shorthand) özellik - 2 değer */
padding:  ;
/* Kısaltılmış (shorthand) özellik - 1 değer */
padding: ;
              padding özelliği için atanabilecek değerler, piksel (px), yüzde (%), em (em), rem (rem) gibi uzunluk birimleri veya auto gibi anahtar kelimeler olabilir. Negatif değerler padding için geçerli değildir.
Tek Tek Özellikler:
padding-top, padding-right, padding-bottom ve padding-left özellikleri, elementin belirtilen tarafına doğrudan bir boşluk değeri atar. Bu yöntem, her taraf için farklı değerler gerektiğinde veya belirli bir tarafı hedeflemek istendiğinde kullanışlıdır.
Kısaltılmış (Shorthand) Özellik - Dört Değer:
padding: üst sağ alt sol; şeklinde kullanılır. Değerler saat yönünde atanır: üst, sağ, alt ve sol. Bu, her bir tarafa farklı bir boşluk vermek için en yaygın ve okunabilir yöntemdir.
Kısaltılmış (Shorthand) Özellik - Üç Değer:
padding: üst sağ-sol alt; şeklinde kullanılır. Birinci değer üst kenar için, ikinci değer hem sağ hem de sol kenarlar için, üçüncü değer ise alt kenar için geçerlidir.
Kısaltılmış (Shorthand) Özellik - İki Değer:
padding: üst-alt sağ-sol; şeklinde kullanılır. Birinci değer hem üst hem de alt kenarlar için, ikinci değer ise hem sağ hem de sol kenarlar için geçerlidir.
Kısaltılmış (Shorthand) Özellik - Tek Değer:
padding: tüm-taraflar; şeklinde kullanılır. Belirtilen tek değer, elementin dört kenarının (üst, sağ, alt, sol) tamamına uygulanır. Bu, tüm kenarlara eşit boşluk vermek istendiğinde en kısa yöntemdir.
Aşağıdaki örnekler, padding özelliğinin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Örnek 1: Tek Değer Kullanımı
Tüm kenarlara eşit 20 piksel iç boşluk uygulanması.
.kutucuk-1 {
    background-color: lightblue;
    border: 1px solid blue;
    padding: 20px; /* Tüm kenarlara 20px iç boşluk */
}
Örnek 2: İki Değer Kullanımı
Üst ve alt kenarlara 15 piksel, sağ ve sol kenarlara 30 piksel iç boşluk uygulanması.
.kutucuk-2 {
    background-color: lightgreen;
    border: 1px solid green;
    padding: 15px 30px; /* Üst/Alt: 15px, Sağ/Sol: 30px */
}
Örnek 3: Dört Değer Kullanımı
Üst kenara 10 piksel, sağa 20 piksel, alta 30 piksel ve sola 40 piksel iç boşluk uygulanması.
.kutucuk-3 {
    background-color: lightcoral;
    border: 1px solid red;
    padding: 10px 20px 30px 40px; /* Üst: 10px, Sağ: 20px, Alt: 30px, Sol: 40px */
}
Örnek 4: Yüzde Değer Kullanımı
Elementin genişliğine göre yüzde bazında iç boşluk uygulanması. Yüzde değerler her zaman elementin genişliğine göre hesaplanır, yüksekliğine göre değil.
.kutucuk-4 {
    width: 200px;
    height: 100px;
    background-color: lightgray;
    border: 1px solid black;
    padding: 10% 5%; /* Üst/Alt: genişliğin %10'u, Sağ/Sol: genişliğin %5'i */
}
Box-sizing: border-box: Varsayılan olarak, padding bir elementin toplam genişliğine ve yüksekliğine eklenir. Bu durum, düzen hesaplamalarını karmaşıklaştırabilir. box-sizing: border-box; özelliğini kullanarak, padding ve border değerlerinin elementin belirtilen genişlik ve yüksekliğine dahil edilmesini sağlayabilirsiniz. Bu, daha öngörülebilir bir düzen oluşturmanıza yardımcı olur.
Negatif Değerler: padding özelliği için negatif değerler kullanılamaz. Negatif boşluklar yaratmak için margin özelliğini kullanmanız gerekir.
İçerik Genişliği: padding, elementin içeriği ile kenarlığı arasındaki mesafeyi artırdığı için, elementin görsel boyutunu genişletir. Ancak, içeriğin asıl genişliği (width değeri) değişmez, sadece etrafındaki boşluk artar.
Görsel Hiyerarşi: padding, metin veya diğer elementlerin kenarlara çok yakın durmasını engeller, böylece okunabilirliği ve genel kullanıcı deneyimini iyileştirir.
Kısaltılmış Kullanım Önceliği: Tek tek padding-top, padding-right vb. özellikleri tanımladıktan sonra, kısaltılmış padding özelliğini kullanırsanız, kısaltılmış özellik önceki tanımları geçersiz kılar. Bu nedenle, stil çakışmalarını önlemek için kullanım sırasına dikkat edin.
                İnternet dünyasının temel taşlarından biri olan PHP, web sitelerinin dinamik ve interaktif olmasını sağlayan güçlü bir programlama dilidir. Milyonlarca web sitesinin ve popüler web uygulamalarının arkasındaki teknoloji olan PHP, özellikle sunucu tarafı (server-side) web geliştirmede kendine sağlam bir yer edinmiştir. Peki, tam olarak PHP nedir? Nasıl çalışır ve neden bu kadar popülerdir? Bu kapsamlı rehberde, PHP'nin ne olduğunu, tarihçesini, temel özelliklerini, kullanım alanlarını, avantajlarını ve geleceğini detaylı bir şekilde inceleyeceğiz. Web geliştirme dünyasına adım atmak isteyenler veya mevcut bilgilerini pekiştirmek isteyenler için bu makale, PHP'nin derinliklerine inen bir yolculuk sunacak.
PHP, açılımı "Hypertext Preprocessor" olan, geniş ölçüde kullanılan, açık kaynaklı bir sunucu taraflı komut dosyası dilidir. Aslen "Personal Home Page" olarak başlayan bu isim, zamanla dilin yetenekleri genişledikçe değiştirilmiştir. PHP, özellikle web geliştirmeye odaklanmıştır ve HTML içine gömülebilir. Yani, bir HTML belgesi içerisinde PHP kodları yazabilir ve bu kodların sunucu tarafından işlenerek dinamik içerik üretmesini sağlayabilirsiniz.
PHP'nin temel amacı, statik HTML sayfalarının aksine, her kullanıcı isteğinde veya belirli koşullara göre değişebilen dinamik web sayfaları oluşturmaktır. Örneğin, bir kullanıcının oturum açtığında farklı bir içerik görmesi, bir e-ticaret sitesinde ürün listelerinin veritabanından çekilmesi veya bir blog sitesinde yorumların anında yayınlanması gibi işlevler, PHP gibi sunucu taraflı diller sayesinde mümkün olur. Bu dinamizm, web sitelerini daha etkileşimli, kişiselleştirilmiş ve güncel hale getirir.
PHP, sunucu üzerinde çalışır ve bir web tarayıcısı tarafından istenen bir PHP dosyasını işler. Sunucu, PHP kodunu çalıştırır, sonuçları (genellikle HTML olarak) oluşturur ve bu çıktıyı tarayıcıya gönderir. Tarayıcıya ulaşan tek şey, nihai HTML çıktısıdır; orijinal PHP kodu asla istemci tarafına gönderilmez. Bu, hem güvenlik hem de performans açısından önemli bir avantajdır.
PHP'nin hikayesi, 1994 yılında Rasmus Lerdorf adında bir geliştiricinin kendi kişisel ana sayfasını yönetmek için bir dizi C dilinde CGI (Common Gateway Interface) ikilisi yazmasıyla başladı. Bu araçlar, form verilerini işlemek ve MySQL veritabanlarıyla etkileşim kurmak gibi basit görevleri yerine getiriyordu. Lerdorf, bu araçları "Personal Home Page/Forms Interpreter" (PHP/FI) olarak adlandırdı ve 1995 yılında kaynak kodunu halka açık hale getirdi.
PHP/FI'nin popülaritesi hızla arttı ve diğer geliştiriciler de kendi web sitelerinde kullanmaya başladı. Geri bildirimler ve katkılarla dil gelişmeye devam etti. 1997 yılında, Andi Gutmans ve Zeev Suraski adında iki geliştirici, PHP/FI'nin çekirdeğini yeniden yazmaya karar verdi. Bu yeniden yazım, performans ve modülerlik açısından önemli iyileştirmeler getirdi ve "Zend Engine" adını aldı. 1998'de, bu yeni sürüm PHP 3.0 olarak piyasaya sürüldü ve dilin adını "PHP: Hypertext Preprocessor" olarak değiştirdi.
PHP 4.0, 2000 yılında piyasaya sürüldü ve daha da geliştirilmiş bir Zend Engine (Zend Engine 1.0) ile birlikte geldi. Bu sürüm, oturum desteği, çıktı tamponlama ve daha iyi web sunucusu entegrasyonu gibi önemli özellikler ekledi. PHP 4, dilin küresel çapta benimsenmesinde kritik bir rol oynadı.
2004 yılında, PHP 5.0, tamamen yeniden tasarlanmış bir Zend Engine (Zend Engine 2.0) ile birlikte çıktı. Bu sürüm, özellikle nesne yönelimli programlama (OOP) desteğini önemli ölçüde geliştirdi, XML ve veritabanı entegrasyonunu iyileştirdi ve birçok yeni özellik ekledi. PHP 5, uzun yıllar boyunca web geliştirmenin temel direği oldu.
En büyük sıçramalardan biri, 2015 yılında piyasaya sürülen PHP 7 serisi oldu. PHP 6 projesi başarısızlıkla sonuçlandıktan sonra, geliştiriciler doğrudan PHP 7'ye geçtiler. PHP 7, Zend Engine 3.0'ı tanıttı ve performans açısından devrim niteliğinde iyileştirmeler getirdi. PHP 5'e kıyasla çoğu uygulamada iki kat daha hızlı çalışabiliyordu. Ayrıca, yeni tür bildirimleri, anonim sınıflar ve daha birçok modern programlama özelliği eklendi.
PHP'nin en son büyük sürümü olan PHP 8, 2020 yılında yayınlandı. JIT (Just In Time) derleyici, nitelikler (attributes), adlandırılmış argümanlar, birleşim türleri (union types) ve match ifadesi gibi heyecan verici yeni özellikler sunarak dilin gücünü ve modernliğini daha da artırdı. PHP, sürekli gelişen, güncel ve performans odaklı bir dil olmaya devam etmektedir.
PHP'nin web geliştirme dünyasındaki kalıcı popülaritesi, sunduğu bir dizi önemli avantajdan kaynaklanmaktadır:
PHP'nin kullanım alanları oldukça geniştir ve internetin önemli bir bölümünü oluşturur. İşte PHP'nin en yaygın kullanıldığı bazı alanlar:
PHP'nin çalışma prensibi, bir web sitesini ziyaret ettiğinizde gerçekleşen adımları anlamak için önemlidir. İşte basit bir açıklama:
Bu süreç, her web sayfası isteği için tekrarlanır ve PHP'nin dinamik ve etkileşimli web deneyimleri sunmasını sağlar.
PHP'nin gücü, sadece dilin kendisinden değil, aynı zamanda etrafında inşa edilen zengin ekosistemden de gelir. Bu ekosistem, geliştiricilerin daha hızlı, daha verimli ve daha güvenli uygulamalar oluşturmasına yardımcı olan birçok araç, kütüphane ve çerçeve içerir.
Bazı dönemlerde "PHP öldü mü?" gibi sorular ortaya çıksa da, PHP her geçen gün kendini yenileyen ve geliştiren canlı bir dildir. PHP 7 ve PHP 8 ile gelen performans iyileştirmeleri, modern özellikler ve sürekli devam eden geliştirme süreçleri, dilin web geliştirme dünyasındaki yerini sağlamlaştırmıştır. Büyük teknoloji şirketleri (Facebook, Wikipedia) hala PHP'ye yatırım yapmakta, Laravel gibi çerçeveler yenilikçi çözümler sunmakta ve WordPress gibi CMS'ler milyonlarca siteye güç vermeye devam etmektedir. PHP, bulut tabanlı mimariler, mikro hizmetler ve API odaklı geliştirme gibi modern yaklaşımlara da başarıyla adapte olmaktadır. Bu nedenle, PHP'nin geleceği parlak ve web geliştirmenin vazgeçilmez bir parçası olmaya devam edecektir.
Eğer PHP öğrenmeye başlamak istiyorsanız, işte size bazı adımlar ve kaynaklar:
Bu bölümde, PHP hakkında en çok merak edilen bazı sorulara yanıt bulacaksınız.
PHP öğrenmek zor mu?
Hayır, PHP genel olarak öğrenmesi kolay bir dildir, özellikle web geliştirme dünyasına yeni başlayanlar için. Sözdizimi diğer bazı dillerden daha basittir ve geniş bir topluluk desteği ile bol miktarda kaynak mevcuttur. Temel HTML ve CSS bilginiz varsa, PHP'ye adapte olmanız daha da kolay olacaktır.
PHP hala popüler mi?
Kesinlikle evet. Bazı iddialara rağmen, PHP web geliştirme dünyasının en popüler dillerinden biri olmaya devam ediyor. Milyonlarca web sitesi, özellikle WordPress gibi büyük platformlar PHP ile çalışıyor. PHP 7 ve PHP 8 ile gelen performans iyileştirmeleri ve modern özellikler, dilin canlılığını korumasını sağlıyor.
PHP ile neler yapılabilir?
PHP ile dinamik web siteleri, e-ticaret platformları, bloglar, forumlar, sosyal medya siteleri, API'ler, İçerik Yönetim Sistemleri (CMS) ve hatta bazı komut satırı uygulamaları geliştirebilirsiniz. İnternette gördüğünüz çoğu dinamik içeriğin arkasında PHP veya benzeri bir sunucu taraflı dil bulunur.
PHP hangi veritabanlarıyla çalışır?
PHP, MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle ve MongoDB gibi birçok farklı veritabanıyla sorunsuz bir şekilde entegre olabilir. En yaygın kullanılanı MySQL'dir, ancak PHP'nin esnekliği sayesinde çoğu modern veritabanıyla çalışabilir.
PHP hangi işletim sistemlerinde çalışır?
PHP, platformdan bağımsız bir dildir. Linux, Windows, macOS ve Unix tabanlı sistemler dahil olmak üzere hemen hemen tüm büyük işletim sistemlerinde çalışabilir. Bu, geliştiricilere ve sunucu yöneticilerine büyük bir esneklik sunar.
PHP mi yoksa Python mu daha iyi?
Her iki dilin de kendine özgü güçlü yönleri vardır. PHP, web geliştirmeye odaklanmış ve bu alanda çok güçlü bir ekosisteme sahiptir. Python ise daha genel amaçlı bir dil olup web geliştirmeyle birlikte veri bilimi, yapay zeka ve otomasyon gibi alanlarda da yaygın olarak kullanılır. Seçim, projenizin gereksinimlerine ve kişisel tercihlerinize bağlıdır.
PHP mi yoksa JavaScript (Node.js) mi daha iyi?
PHP ve Node.js (JavaScript'in sunucu tarafı çalışma zamanı) her ikisi de sunucu tarafı geliştirme için popüler seçeneklerdir. PHP genellikle geleneksel web uygulamaları ve CMS'ler için tercih edilirken, Node.js gerçek zamanlı uygulamalar, mikro hizmetler ve tek sayfa uygulamalarının (SPA) API katmanları için güçlüdür. İki dil de modern web geliştirmede önemli bir rol oynar ve çoğu zaman birlikte kullanılırlar (örneğin, PHP bir web sitesinin arka ucunu sağlarken, JavaScript ön yüzü dinamik hale getirir).
                Merhaba sevgili içerik üreticisi adayları ve dijital dünya meraklıları! Bugün, birçoğumuzun hayalini süsleyen, yaratıcılığımızı gelire dönüştürebileceğimiz harika bir platformdan bahsedeceğiz: YouTube.
Belki de aklınızda harika bir video fikri var, belki de uzman olduğunuz bir konuda insanlara faydalı olmak istiyorsunuz. Ya da sadece ek gelir elde etmenin yeni yollarını arıyorsunuz. Her ne sebeple olursa olsun, YouTube, milyonlarca insana ulaşabileceğiniz ve potansiyelinizi keşfedebileceğiniz eşsiz bir alan sunuyor. Peki, bir YouTube kanalı açarak gerçekten gelir elde edebilir misiniz? Cevabımız kocaman bir evet! Ama bu yolculukta bilmeniz gereken bazı önemli adımlar ve stratejiler var. Hazırsanız, bu heyecan verici dünyaya birlikte dalalım.
Her büyük başarı hikayesi sağlam temeller üzerine kurulur. YouTube serüveninize başlarken de dikkat etmeniz gereken ilk adımlar var.
Nişinizi Belirleyin: Hangi konuda içerik üreteceksiniz? Oyun, makyaj, teknoloji, eğitim, gezi, yemek tarifleri... Seçenekler sınırsız. Önemli olan, hem tutkulu olduğunuz hem de bilgi sahibi olduğunuz bir alanı seçmek. Unutmayın, nişiniz ne kadar spesifik olursa, hedef kitlenize ulaşmanız o kadar kolaylaşır ve kendinizi o alanda bir otorite olarak konumlandırabilirsiniz. Nişinizi belirlemek, uzun vadeli başarınızın anahtarıdır.
Kanal Adı ve Markalaşma: Kanalınızın adı, markanızın ilk izlenimidir. Akılda kalıcı, nişinizle uyumlu ve telif hakkı sorunu olmayan bir isim seçin. Kanalınızın logosu, banner'ı ve genel görsel kimliği de profesyonel bir görünüm için kritik. Bu unsurlar, izleyicilerinizin kanalınızı tanımasını ve hatırlamasını sağlar.
Ekipman ve Başlangıç: Çoğu kişi "Profesyonel ekipmanım yok" diyerek başlama konusunda çekimser kalır. Ancak günümüzde iyi bir akıllı telefon bile başlangıç için yeterli olabilir! Önemli olan, iyi bir ışıklandırma ve net bir ses kalitesi sağlamaktır. Zamanla ve geliriniz arttıkça ekipmanınızı geliştirebilirsiniz. Asıl önemli olan içeriktir, ekipman değil.
İçerik Planlaması: Başarılı bir YouTube kanalı rastgele videolardan oluşmaz. Bir içerik takvimi oluşturmak, ne zaman ne tür videolar çekeceğinizi planlamak ve düzenli yayın akışı sağlamak izleyici sadakatini artırır. Konu araştırması yapın, senaryolarınızı hazırlayın ve çekim planınızı oluşturun.
YouTube'da kalıcı olmak ve gelir elde etmek istiyorsanız, kaliteli içerik üretmekten asla ödün vermemelisiniz.
Video Kalitesi: Görüntü kalitesi kadar ses kalitesi de çok önemlidir. Kimse cızırtılı veya anlaşılmayan bir sesi dinlemek istemez. İyi bir mikrofon edinmek, ilk yatırımınız olabilir. Videolarınızın çözünürlüğü yüksek olsun ve iyi bir ışıklandırma kullanmaya özen gösterin.
Kurgu ve Montaj: Videolarınızı sıkıcı olmaktan çıkaracak, akıcı ve dinamik bir kurgu yapın. Giriş, gelişme, sonuç dengesini iyi ayarlayın. Müzik, efektler ve metinler kullanarak videonuzu daha ilgi çekici hale getirin. Ücretsiz veya uygun fiyatlı montaj programlarıyla başlayabilirsiniz.
Başlıklar ve Küçük Resimler (Thumbnails): Videonuz ne kadar iyi olursa olsun, eğer kimse tıklamazsa izlenmez. Videonuzun başlığı ve küçük resmi, adeta bir vitrin gibidir. Merak uyandıran, videonun içeriğini yansıtan ve yüksek çözünürlüklü küçük resimler hazırlayın. Başlıklarınızda anahtar kelimeler kullanmayı unutmayın.
YouTube SEO: Videolarınızın keşfedilmesini sağlamak için YouTube SEO'sunu iyi kullanmalısınız. Videonuzun başlığına, açıklamasına ve etiketlerine alakalı anahtar kelimeler ekleyin. Açıklamalarınızı detaylı yazın, zaman damgaları ekleyin ve diğer videolarınıza veya ilgili kaynaklara bağlantılar verin. Bu, YouTube algoritmasının videonuzu doğru kitlelere ulaştırmasına yardımcı olur.
Para kazanmanın yolu, geniş ve sadık bir kitleye sahip olmaktan geçer. Kitlenizi büyütmek için sürekli çaba göstermelisiniz.
Düzenli Yayın Akışı: Belirli aralıklarla video yayınlamak, izleyicilerinizin ne zaman yeni içerik bekleyeceğini bilmesini sağlar ve sadakatlerini pekiştirir. Tutarlı olmak, YouTube algoritması tarafından da ödüllendirilir.
Yorumlara Cevap Verin: İzleyicilerinizle etkileşim kurmak, onlarla bir bağ kurmanın en iyi yoludur. Yorumlarına cevap verin, sorularını yanıtlayın ve onların fikirlerine değer verdiğinizi gösterin. Bu, topluluk hissini güçlendirir.
Sosyal Medya Entegrasyonu: YouTube kanalınızı diğer sosyal medya platformlarında da tanıtın. Instagram, TikTok, Twitter gibi platformlarda videolarınızdan kısa kesitler paylaşarak daha fazla kişiye ulaşın ve kanalınıza yönlendirin.
Ortak Çalışmalar (Collaborations): Benzer nişlerdeki diğer YouTuber'larla işbirliği yapmak, her iki tarafın da kitlesini genişletmek için harika bir yöntemdir. Farklı kitlelere ulaşarak abone sayınızı hızla artırabilirsiniz.
Şimdi gelelim asıl konuya: YouTube'dan nasıl para kazanılır? Tek bir yöntemle sınırlı kalmak yerine, gelirinizi çeşitlendirmek akıllıca olacaktır.
YouTube İş Ortağı Programı (AdSense): Bu, YouTube'dan para kazanmanın en bilinen yoludur. Kanalınızın belirli kriterleri (genellikle 1000 abone ve son 12 ayda 4000 saat genel izlenme süresi veya Shorts videolarında 90 günde 10 milyon geçerli izlenme) karşılaması halinde başvurabilirsiniz. Onaylandığınızda, videolarınızda gösterilen reklamlardan gelir elde edersiniz. Gelir, reklam türüne, izleyici demografisine ve reklamverenlerin bütçesine göre değişiklik gösterir. Bu, çoğu YouTuber için ilk gelir kapısıdır.
Marka İş Birlikleri ve Sponsorluklar: Kanalınız büyüdükçe, markalar ürünlerini veya hizmetlerini tanıtmanız için sizinle iletişime geçebilir. Bu, genellikle doğrudan bir ödeme karşılığında veya ürün değişimi şeklinde olur. Nişinizle alakalı ve izleyicilerinize fayda sağlayacak markalarla çalışmak, hem sizin hem de markanın itibarını artırır. Şeffaf olun ve sponsorlu içeriği her zaman belirtin.
Ürün Satışı (Merchandise): Kendi markanız altında tişört, kupa, şapka gibi ürünler satarak gelir elde edebilirsiniz. Özellikle sadık ve büyük bir kitleniz varsa, bu yöntem oldukça etkili olabilir. YouTube'un kendi merchandise rafı özelliği de bulunmaktadır.
Satış Ortaklığı (Affiliate Marketing): Videolarınızda bahsettiğiniz ürün veya hizmetlerin linklerini açıklama bölümüne ekleyerek, bu linkler üzerinden yapılan her satıştan komisyon kazanabilirsiniz. Amazon Ortaklık Programı gibi platformlar bu konuda size yardımcı olabilir. İzleyicilerinize gerçekten faydalı olabilecek ürünleri tavsiye etmeye özen gösterin.
Patreon ve Kitle Fonlaması: İzleyicileriniz, Patreon gibi platformlar aracılığıyla kanalınıza aylık belirli bir miktar ödeme yaparak doğrudan destek olabilirler. Karşılığında onlara özel içerikler, erken erişim veya diğer ayrıcalıklar sunabilirsiniz. Bu, özellikle niş ve sadık bir topluluğa sahip kanallar için harika bir gelir kaynağıdır.
Dijital Ürünler ve Hizmetler: Eğer bir uzmansanız, bilginizi e-kitaplar, online kurslar, danışmanlık hizmetleri veya premium içerikler gibi dijital ürün ve hizmetlere dönüştürebilirsiniz. YouTube kanalınız, bu ürünlerinizi tanıtmak ve satmak için güçlü bir platform görevi görür. Örneğin, bir fitness kanalı kişisel antrenman programları satabilir, bir dil öğrenme kanalı özel dersler verebilir.
YouTube Premium Geliri: YouTube Premium aboneleri, platformu reklamsız izlerler. Bu aboneler videolarınızı izlediğinde, YouTube bu gelirin bir kısmını içerik üreticileriyle paylaşır. Bu da ek bir pasif gelir kaynağıdır.
Süper Sohbet ve Süper Teşekkürler: Canlı yayınlar sırasında izleyicileriniz Süper Sohbet ile mesajlarını öne çıkarabilir veya Süper Teşekkürler ile favori videolarınıza doğrudan destek gönderebilir. Bu da izleyici katılımını teşvik eden ve ek gelir sağlayan özelliklerdir.
YouTube'da gelir elde etmek bir maraton, sprint değil. Bu yolculukta sizi motive tutacak ve başarıya taşıyacak bazı önemli noktalar var.
Sabırlı Olun ve Tutarlı Kalın: Hiçbir kanal bir gecede fenomen olmaz. Sabırla ve düzenli olarak içerik üretmeye devam edin. Başarı zamanla ve emekle gelecektir.
Analitikleri Takip Edin: YouTube Studio'daki analitik verileri düzenli olarak inceleyin. Hangi videolarınız daha çok izleniyor? İzleyicileriniz videonuzun hangi bölümünde ayrılıyor? Hangi demografik yapıya sahip izleyicileriniz var? Bu veriler, içerik stratejinizi geliştirmeniz için paha biçilmez bilgiler sunar.
Trendleri Yakalayın ama Kendiniz Olun: Popüler konuları ve trendleri takip etmek önemlidir, ancak kendi özgün sesinizi ve tarzınızı kaybetmeyin. Taklitçi olmak yerine, kendi benzersiz bakış açınızı sunun.
Geri Bildirimlere Açık Olun: İzleyicilerinizin yorumları ve eleştirileri, kendinizi geliştirmeniz için bir fırsattır. Olumlu ve yapıcı eleştirileri dikkate alın.
Ağ Kurun: Diğer içerik üreticileriyle iletişimde olun, topluluklara katılın. Tecrübe paylaşımı ve destek almak, bu yolculukta yalnız olmadığınızı hissettirecektir.
Gördüğünüz gibi, YouTube sadece bir video platformu değil, aynı zamanda ciddi bir gelir potansiyeli sunan, kendi işinizi kurabileceğiniz bir ekosistemdir. Başlamak için mükemmel anı beklemeyin, elinizdeki imkanlarla ilk adımı atın. Unutmayın, en büyük YouTuber'lar bile bir zamanlar sıfırdan başladı. Yaratıcılığınızı serbest bırakın, tutkunuzu paylaşın ve bu heyecan verici dijital dünyada kendi yerinizi oluşturun. Başarılar dileriz!
                JavaScript'te tarih ve saat verilerini yönetmek, görüntülemek ve üzerinde işlem yapmak için yerleşik Date nesnesi kullanılır. Bu nesne, milisaniyeler cinsinden zamanı temsil eder ve 1 Ocak 1970 UTC (Evrensel Eşgüdümlü Saat) tarihinden bu yana geçen süreyi temel alır. Date nesnesi ile mevcut tarihi ve saati alabilir, belirli bir tarihi oluşturabilir, tarih bileşenlerini değiştirebilir ve farklı formatlarda görüntüleyebilirsiniz.
Date nesnesi, new Date() yapıcı fonksiyonu kullanılarak dört farklı şekilde oluşturulabilir:
new Date(): Mevcut tarih ve saati içeren bir Date nesnesi oluşturur.
new Date(milisaniye): 1 Ocak 1970 UTC'den bu yana geçen milisaniye sayısını temsil eden bir Date nesnesi oluşturur.
new Date(tarihDizisi): Bir tarih dizisini (örneğin, "2023-10-26" veya "October 26, 2023 10:30:00") ayrıştırarak bir Date nesnesi oluşturur.
new Date(yıl, ay, gün, saat, dakika, saniye, milisaniye): Belirli tarih ve saat bileşenleriyle bir Date nesnesi oluşturur. Ay değeri 0'dan (Ocak) 11'e (Aralık) kadar indeklenmiştir.
Date nesnesinin yapıcı fonksiyonları ve yöntemleri, tarih ve saat manipülasyonu için güçlü araçlar sunar:
new Date(): Argüman olmadan çağrıldığında, Date nesnesi, komutun çalıştırıldığı yerel sistemin mevcut tarih ve saatini temsil eder.
new Date(milisaniye): Bu yapıcı, new Date(0) ile 1 Ocak 1970 UTC başlangıcını temsil eder. Pozitif değerler bu tarihten sonrasını, negatif değerler ise öncesini ifade eder. Örneğin, new Date(86400000) 1 Ocak 1970 UTC'den 24 saat sonrasını temsil eder.
new Date(tarihDizisi): JavaScript, çeşitli ISO 8601 formatlarını (örneğin, "YYYY-MM-DD", "YYYY-MM-DDTHH:mm:ssZ") ve tarayıcıya özgü bazı diğer tarih dizisi formatlarını ayrıştırabilir. Ancak, tarayıcılar arası tutarlılık için ISO 8601 formatları tercih edilmelidir.
new Date(yıl, ay, gün, saat, dakika, saniye, milisaniye): Bu yapıcı, tarih bileşenlerini doğrudan belirterek kesin bir tarih ve saat oluşturmanıza olanak tanır. ay parametresinin 0-indeksli olduğunu unutmamak önemlidir. Örneğin, Ekim ayı için 9 değeri kullanılır. gün, saat, dakika, saniye ve milisaniye parametreleri isteğe bağlıdır ve belirtilmezse varsayılan olarak 1 (gün için) veya 0 (diğerleri için) değerini alırlar.
Date nesnesinin birçok yöntemi vardır. Bunlar genellikle iki kategoriye ayrılır: yerel zaman dilimine göre (getFullYear(), getMonth()) ve UTC'ye göre (getUTCFullYear(), getUTCMonth()) çalışan yöntemler. Benzer şekilde, tarih bileşenlerini ayarlamak için setFullYear() veya setUTCFullYear() gibi yöntemler mevcuttur.
Mevcut tarih ve saati alıp görüntüleme:
const simdi = new Date();
console.log(simdi); // Örnek çıktı: Thu Oct 26 2023 10:30:00 GMT+0300 (Türkiye Standart Saati)
console.log(simdi.toLocaleDateString()); // Örnek çıktı: 26.10.2023
console.log(simdi.toLocaleTimeString()); // Örnek çıktı: 10:30:00
console.log(simdi.toISOString()); // Örnek çıktı: 2023-10-26T07:30:00.000Z (UTC formatında)Belirli bir tarih ve saat oluşturma:
// Yıl, ay (0-indeksli), gün, saat, dakika, saniye, milisaniye
const dogumGunu = new Date(1990, 4, 15, 12, 0, 0, 0); // 15 Mayıs 1990, 12:00:00
console.log(dogumGunu.toDateString()); // Örnek çıktı: Tue May 15 1990
// Tarih dizisi kullanarak
const yaziIleTarih = new Date("2024-01-20T14:30:00Z"); // UTC olarak 20 Ocak 2024, 14:30:00
console.log(yaziIleTarih.toLocaleString()); // Tarayıcının yerel ayarına göre görüntülenirTarih bileşenlerini alma:
const bugun = new Date();
const yil = bugun.getFullYear(); // Yılı alır (örneğin, 2023)
const ay = bugun.getMonth();   // Ayı alır (0-11, Ocak 0'dır)
const gun = bugun.getDate();    // Ayın gününü alır (1-31)
const gunAdi = bugun.getDay();  // Haftanın gününü alır (0-6, Pazar 0'dır)
const saat = bugun.getHours();  // Saati alır (0-23)
const dakika = bugun.getMinutes(); // Dakikayı alır (0-59)
const saniye = bugun.getSeconds(); // Saniyeyi alır (0-59)
const milisaniye = bugun.getMilliseconds(); // Milisaniyeyi alır (0-999)
const zamanDamgasi = bugun.getTime(); // 1 Ocak 1970'ten bu yana geçen milisaniye sayısı
console.log(`Yıl: ${yil}, Ay: ${ay + 1}, Gün: ${gun}, Saat: ${saat}:${dakika}`);Tarih bileşenlerini ayarlama:
const gelecektekiTarih = new Date();
gelecektekiTarih.setFullYear(2025);
gelecektekiTarih.setMonth(0); // Ocak
gelecektekiTarih.setDate(1); // Ayın 1. günü
gelecektekiTarih.setHours(9);
gelecektekiTarih.setMinutes(0);
gelecektekiTarih.setSeconds(0);
gelecektekiTarih.setMilliseconds(0);
console.log(gelecektekiTarih.toLocaleString()); // Örnek çıktı: 1.01.2025 09:00:00Tarihler arası fark hesaplama:
const tarih1 = new Date('2023-10-01');
const tarih2 = new Date('2023-10-31');
const farkMilisaniye = tarih2.getTime() - tarih1.getTime();
const farkGun = farkMilisaniye / (1000 * 60 * 60 * 24);
console.log(`İki tarih arasındaki gün farkı: ${farkGun}`); // Çıktı: 30Ay İndekslemesi: Date nesnesinin yapıcı fonksiyonunda ve getMonth(), setMonth() gibi yöntemlerinde ay değerleri 0'dan 11'e kadar indekslenir (0 = Ocak, 11 = Aralık). Bu yaygın bir hata kaynağıdır.
Saat Dilimi Farklılıkları: Date nesnesi, genellikle yerel saat dilimini kullanır. Ancak, getUTCFullYear(), setUTCHours() gibi UTC ön ekli yöntemler, Evrensel Eşgüdümlü Saat'e göre işlem yapar. Bu durum, özellikle uluslararası uygulamalarda veya sunucu-istemci iletişimi sırasında önemlidir. Tarihleri UTC formatında depolayıp, kullanıcının yerel saat dilimine göre görüntülemek iyi bir pratiktir.
String Ayrıştırma Güvenilirliği: new Date(tarihDizisi) yapıcı fonksiyonu, farklı tarayıcılarda ve JavaScript motorlarında farklı dizileri ayrıştırabilir. En güvenilir yöntem, ISO 8601 formatında tarih dizileri kullanmak (örneğin, "YYYY-MM-DDTHH:mm:ss.sssZ" veya "YYYY-MM-DD").
Date.now(): Bu statik yöntem, 1 Ocak 1970 UTC'den bu yana geçen milisaniye sayısını döndürür ve bir Date nesnesi oluşturmadan anlık zaman damgasını almak için hızlı bir yoldur. Performans açısından new Date().getTime()'dan daha etkilidir.
Geçersiz Tarihler: Geçersiz bir tarih oluşturmaya çalışırsanız (örneğin, 31 Şubat), Date nesnesi "Invalid Date" (Geçersiz Tarih) döndürür. Bu durumu isNaN(date.getTime()) ile kontrol edebilirsiniz.
                Python'da Booleans, programlama mantığının temelini oluşturan, yalnızca iki olası değere sahip özel bir veri tipidir: True ve False. Bu değerler, koşullu ifadelerde, döngülerde ve genel program akış kontrolünde kararlar almak için kullanılır. Mantıksal işlemlerin sonucunu temsil ederler ve bir durumun doğru mu yanlış mı olduğunu belirtirler. Python'da, bool sınıfının bir örneği olarak kabul edilirler ve dahili olarak sırasıyla 1 ve 0 tam sayı değerlerine karşılık gelirler.
Python'da boolean değerleri doğrudan True ve False anahtar kelimeleri kullanılarak ifade edilir. Bu anahtar kelimeler büyük harfle başlar ve Python'ın ayrılmış kelimeleridir.
True: Mantıksal olarak "doğru" anlamına gelir. Bir koşulun karşılandığını veya bir ifadenin geçerli olduğunu belirtir.
False: Mantıksal olarak "yanlış" anlamına gelir. Bir koşulun karşılanmadığını veya bir ifadenin geçersiz olduğunu belirtir.
Python'da birçok veri tipi ve ifade, boolean bağlamında değerlendirildiğinde dolaylı olarak bir boolean değere sahiptir. Örneğin, boş stringler (""), boş listeler ([]), boş sözlükler ({}), 0 sayısı ve None değeri False olarak değerlendirilirken; sıfırdan farklı sayılar, dolu stringler ve dolu koleksiyonlar True olarak değerlendirilir. Bu duruma "truthiness" denir ve bool() fonksiyonu ile açıkça kontrol edilebilir.
Örnek 1: Basit Atama ve Kontrol
Bir değişkene boolean değeri atayarak ve bu değeri kullanarak koşullu bir ifade çalıştırmak için aşağıdaki kodu inceleyebiliriz.
is_active = True
is_admin = False
if is_active:
    print("Kullanıcı aktif.")
else:
    print("Kullanıcı pasif.")
if is_admin:
    print("Yönetici yetkilerine sahip.")
else:
    print("Yönetici yetkilerine sahip değil.")Örnek 2: Karşılaştırma Operatörleri
Karşılaştırma operatörleri (==, !=, <, >, <=, >=) her zaman bir boolean değeri döndürür.
x = 10
y = 20
print(f"x == y: {x == y}")
print(f"x != y: {x != y}")
print(f"x < y: {x < y}")
print(f"x > y: {x > y}")Örnek 3: Mantıksal Operatörler
Mantıksal operatörler (and, or, not) boolean değerleri birleştirmek veya tersine çevirmek için kullanılır.
has_permission = True
is_logged_in = True
is_subscriber = False
if has_permission and is_logged_in:
    print("Erişim granted.")
if has_permission or is_subscriber:
    print("En az bir koşul doğru.")
if not is_subscriber:
    print("Abone değil.")Örnek 4: bool() Fonksiyonu ile Değerlendirme
Bir ifadenin boolean bağlamında nasıl değerlendirileceğini bool() fonksiyonu ile açıkça görebiliriz.
print(f"bool(0): {bool(0)}")
print(f"bool(1): {bool(1)}")
print(f"bool(''): {bool('')}")
print(f"bool('Hello'): {bool('Hello')}")
print(f"bool([]): {bool([])}")
print(f"bool([1, 2]): {bool([1, 2])}")
print(f"bool(None): {bool(None)}")True ve False anahtar kelimeleri Python'da büyük harfle başlar. Küçük harfle yazmak (örneğin, true veya false) bir hata ile sonuçlanır çünkü bunlar ayrılmış anahtar kelimelerdir ve değişken adları olarak algılanmazlar.
Boolean değerleri, dahili olarak sırasıyla 1 ve 0 tamsayı değerlerine karşılık gelir. Bu, bazen aritmetik işlemlerde veya tip dönüştürmelerde ilginç sonuçlar doğurabilir; örneğin, True + True ifadesi 2 sonucunu verir.
Karşılaştırma ve mantıksal operatörler, koşullu ifadeler ve döngüler için vazgeçilmezdir. Programınızın akışını kontrol etmek için bu operatörleri doğru bir şekilde kullanmak kritik öneme sahiptir.
bool() fonksiyonu, herhangi bir Python nesnesinin boolean karşılığını elde etmek için kullanılabilir. Bu, özellikle bir koleksiyonun boş olup olmadığını veya bir değişkenin değer içerip içermediğini kontrol etmek için faydalıdır.
                JavaScript, web geliştirmede dinamik ve etkileşimli deneyimler oluşturmak için vazgeçilmez bir dildir. Bu dilin temel yapı taşlarından biri olan diziler (arrays), birden çok değeri tek bir değişken altında depolamamızı ve yönetmemizi sağlar. Diziler, veri koleksiyonlarını düzenli bir şekilde saklamak, üzerlerinde döngüler yapmak ve çeşitli manipülasyonlar gerçekleştirmek için kritik öneme sahiptir. Bu makalede, JavaScript dizilerinin temel sözdizimini, öğelere erişimi, yaygın kullanılan metotları ve pratik uygulama örneklerini detaylı bir şekilde inceleyeceğiz.
JavaScript'te dizi oluşturmanın ve kullanmanın iki temel yolu vardır:
Bu, en yaygın ve önerilen yöntemdir. Köşeli parantezler [] arasına, virgülle ayrılmış olarak dizi öğeleri yazılır.
const meyveler = ["Elma", "Muz", "Portakal"];
let sayilar = [1, 2, 3, 4, 5];
const karisikDizi = ["Metin", 123, true, null, {adi: "Nesne"}];Yukarıdaki örneklerde görüldüğü gibi, bir dizi içinde farklı veri tiplerini barındırabiliriz. Diziler const, let veya var anahtar kelimeleri ile tanımlanabilir.
new Array() kurucu fonksiyonunu kullanarak da dizi oluşturulabilir. Bu yöntem daha az tercih edilse de, belirli senaryolarda kullanılabilir.
const meyveler = new Array("Elma", "Muz", "Portakal");
const bosDizi = new Array(); // Boş bir dizi oluşturur
const onElemanliDizi = new Array(10); // 10 boş öğe içeren bir dizi oluştururTek bir sayısal argümanla çağrıldığında, new Array() o boyutta boş öğeler içeren bir dizi oluşturur. Birden fazla argümanla çağrıldığında ise, bu argümanlar dizinin öğeleri haline gelir.
Dizilerdeki öğelere, sıfır tabanlı indeksleme kullanarak erişilir. Yani, ilk öğenin indeksi 0, ikincisinin 1 ve bu şekilde devam eder. Öğelere erişmek için dizi adından sonra köşeli parantez içinde indeks numarası belirtilir.
const renkler = ["Kırmızı", "Yeşil", "Mavi"];
console.log(renkler[0]); // Çıktı: Kırmızı
console.log(renkler[1]); // Çıktı: YeşilDizi öğelerini değiştirmek de benzer şekilde yapılır. İstenen indeks belirtilerek yeni bir değer atanır:
renkler[2] = "Sarı";
console.log(renkler); // Çıktı: ["Kırmızı", "Yeşil", "Sarı"]Bir dizinin toplam öğe sayısını öğrenmek için length özelliğini kullanırız:
console.log(renkler.length); // Çıktı: 3Bu örnek, bir dizi tanımlamayı ve belirli indekslerdeki öğelere nasıl erişileceğini göstermektedir.
// Bir meyve dizisi tanımlama
const meyveler = ["Elma", "Armut", "Kiraz", "Çilek"];
// Dizinin ilk elemanına erişme (indeks 0)
console.log("İlk meyve:", meyveler[0]); // Çıktı: İlk meyve: Elma
// Dizinin üçüncü elemanına erişme (indeks 2)
console.log("Üçüncü meyve:", meyveler[2]); // Çıktı: Üçüncü meyve: Kiraz
// Dizinin son elemanına erişme (length - 1)
console.log("Son meyve:", meyveler[meyveler.length - 1]); // Çıktı: Son meyve: ÇilekBu örnek, var olan bir dizi öğesinin nasıl değiştirileceğini ve dizinin sonuna/başına öğe ekleme/çıkarma işlemlerini göstermektedir.
let alisverisListesi = ["Süt", "Ekmek", "Yumurta"];
// İkinci öğeyi değiştirme (indeks 1)
alisverisListesi[1] = "Peynir";
console.log("Değişen liste:", alisverisListesi); // Çıktı: Değişen liste: ["Süt", "Peynir", "Yumurta"]
// Dizinin sonuna yeni bir öğe ekleme (push metodu)
alisverisListesi.push("Meyve Suyu");
console.log("Ekleme sonrası:", alisverisListesi); // Çıktı: Ekleme sonrası: ["Süt", "Peynir", "Yumurta", "Meyve Suyu"]
// Dizinin sonundaki öğeyi çıkarma (pop metodu)
const cikarilanOge = alisverisListesi.pop();
console.log("Çıkarılan öğe:", cikarilanOge); // Çıktı: Çıkarılan öğe: Meyve Suyu
console.log("Çıkarma sonrası:", alisverisListesi); // Çıktı: Çıkarma sonrası: ["Süt", "Peynir", "Yumurta"]
// Dizinin başına yeni bir öğe ekleme (unshift metodu)
alisverisListesi.unshift("Yoğurt");
console.log("Başına ekleme:", alisverisListesi); // Çıktı: Başına ekleme: ["Yoğurt", "Süt", "Peynir", "Yumurta"]
// Dizinin başındaki öğeyi çıkarma (shift metodu)
const cikarilanBasOge = alisverisListesi.shift();
console.log("Baştan çıkarılan öğe:", cikarilanBasOge); // Çıktı: Baştan çıkarılan öğe: Yoğurt
console.log("Baştan çıkarma sonrası:", alisverisListesi); // Çıktı: Baştan çıkarma sonrası: ["Süt", "Peynir", "Yumurta"]Dizi öğeleri üzerinde işlem yapmak için döngüler sıkça kullanılır. En yaygın yöntemlerden biri for döngüsü ve forEach() metodudur.
const ogrenciler = ["Ali", "Ayşe", "Mehmet", "Fatma"];
// For döngüsü ile dizi öğelerini listeleme
console.log("For döngüsü ile öğrenciler:");
for (let i = 0; i < ogrenciler.length; i++) {
  console.log(ogrenciler[i]);
}
// forEach() metodu ile dizi öğelerini listeleme
console.log("\nforEach() ile öğrenciler:");
ogrenciler.forEach(function(ogrenci, index) {
  console.log(`${index + 1}. ${ogrenci}`);
});Dinamik Boyut: JavaScript dizileri dinamik yapıdadır. Oluşturulduktan sonra boyutları otomatik olarak büyüyüp küçülebilir. Önceden bir boyut belirtme zorunluluğu yoktur.
Karışık Veri Tipleri: JavaScript dizileri, aynı anda string, number, boolean, object, null, undefined gibi farklı veri tiplerini barındırabilir.
Referans Tipi: Diziler birer referans tipi (reference type) veri yapısıdır. Bir diziyi başka bir değişkene atadığınızda, aslında dizinin kendisi değil, bellekteki referansı kopyalanır. Bu nedenle, yeni değişken üzerinden yapılan değişiklikler orijinal diziyi de etkiler.
const ile Dizi Tanımlama: const ile tanımlanan bir dizinin referansı değiştirilemez, yani başka bir dizi atanması mümkün değildir. Ancak, dizinin içindeki öğeler (indeksler üzerinden) değiştirilebilir veya dizi metotları (push, pop vb.) ile manipüle edilebilir.
const sabitDizi = [1, 2, 3];
sabitDizi.push(4); // Geçerli: [1, 2, 3, 4]
// sabitDizi = [5, 6]; // Hata: Assignment to constant variable.Dizi Metotları: JavaScript, dizilerle çalışmayı kolaylaştıran zengin bir dizi metotları setine sahiptir (map(), filter(), reduce(), find(), splice(), slice() vb.). Bu metotlar, diziler üzerinde daha gelişmiş işlemler yapmak için kullanılır ve modern JavaScript programlamasında kritik öneme sahiptir.
                Veritabanı yönetim sistemlerinde, bir sütundaki veri değerinin bilinmediğini, uygulanabilir olmadığını veya henüz atanmadığını belirtmek için NULL anahtar kelimesi kullanılır. Bu özel değer, diğer veri türlerinden farklı olarak, bir sayıyı (örneğin 0) veya boş bir karakter dizisini (örneğin '') temsil etmez; aksine, bir değerin yokluğunu veya belirsizliğini ifade eder. SQL sorgularında NULL değerlerle doğru bir şekilde çalışabilmek, veri bütünlüğünü sağlamak ve beklenen sonuçları elde etmek için kritik öneme sahiptir.
SQL'de NULL değerleri sorgulamak ve yönetmek için genellikle IS NULL, IS NOT NULL operatörleri ve COALESCE gibi özel fonksiyonlar kullanılır. Temel kullanım yapıları aşağıdaki gibidir:
-- Bir sütunda NULL değerleri seçmek için:
SELECT column_name(s)
FROM table_name
WHERE column_name IS NULL;
-- Bir sütunda NULL olmayan değerleri seçmek için:
SELECT column_name(s)
FROM table_name
WHERE column_name IS NOT NULL;
-- NULL değerleri alternatif bir değerle değiştirmek için:
SELECT COALESCE(column_name, default_value) AS new_column_name
FROM table_name;
NULL Nedir?
SQL'deki NULL, bir değerin yokluğunu temsil eder. Bu, bir sütunun o satır için herhangi bir bilgi içermediği veya bu bilginin bilinmediği anlamına gelir. NULL, sıfırdan, boş bir karakter dizisinden veya boşluktan farklıdır. Örneğin, bir kullanıcının telefon numarasının NULL olması, o kullanıcının telefon numarasının olmadığını veya bilinmediğini ifade eder; '0' olması ise telefon numarasının 0 olduğunu gösterir.
IS NULL Operatörü
IS NULL operatörü, belirli bir sütundaki değerin NULL olup olmadığını kontrol etmek için kullanılır. Geleneksel karşılaştırma operatörleri (=, <>, !=) NULL değerlerle doğru şekilde çalışmadığı için bu operatör zorunludur. WHERE koşulunda kullanılarak, belirtilen sütunda NULL değeri bulunan tüm satırları döndürür.
IS NOT NULL Operatörü
IS NOT NULL operatörü, IS NULL operatörünün zıttıdır. Bir sütundaki değerin NULL olmadığını kontrol etmek için kullanılır. Bu operatör, belirli bir sütunda geçerli (NULL olmayan) bir değere sahip olan tüm satırları seçmek istediğinizde faydalıdır.
COALESCE Fonksiyonu
COALESCE fonksiyonu, kendisine verilen ifadeler listesinden NULL olmayan ilk ifadeyi döndürür. Bu fonksiyon, bir sütundaki NULL değerleri okunaklı bir varsayılan değerle (örneğin 'Bilinmiyor' veya 0) değiştirmek istediğinizde çok kullanışlıdır. Eğer tüm ifadeler NULL ise, COALESCE de NULL döndürür.
NULL ile Karşılaştırmalar
SQL'de NULL değerleri doğrudan diğer değerlerle (hatta başka bir NULL ile bile) = veya <> gibi operatörlerle karşılaştırmak her zaman UNKNOWN (bilinmeyen) sonucunu verir. Örneğin, NULL = NULL ifadesi TRUE döndürmez, UNKNOWN döndürür. Bu nedenle, NULL değerleri test etmek için mutlaka IS NULL veya IS NOT NULL operatörleri kullanılmalıdır.
Aşağıdaki örnekler, NULL değerlerin SQL sorgularında nasıl kullanıldığını göstermektedir. İlk olarak, örnek bir tablo oluşturalım ve içine veri ekleyelim:
-- 1. Örnek Tablo Oluşturma ve Veri Ekleme
CREATE TABLE Calisanlar (
    CalisanID INT PRIMARY KEY,
    Ad VARCHAR(50) NOT NULL,
    Soyad VARCHAR(50) NOT NULL,
    Email VARCHAR(100),
    Telefon VARCHAR(15),
    DepartmanID INT
);
INSERT INTO Calisanlar (CalisanID, Ad, Soyad, Email, Telefon, DepartmanID) VALUES
(1, 'Ayşe', 'Yılmaz', 'ayse.yilmaz@example.com', '5551234567', 101),
(2, 'Mehmet', 'Demir', NULL, '5557654321', 102),
(3, 'Zeynep', 'Kaya', 'zeynep.kaya@example.com', NULL, 101),
(4, 'Ali', 'Can', 'ali.can@example.com', '5559876543', 103),
(5, 'Elif', 'Aksoy', NULL, NULL, 102),
(6, 'Deniz', 'Çelik', 'deniz.celik@example.com', '5551112233', NULL);
IS NULL Kullanımı
Email adresi NULL olan çalışanları listelemek:
SELECT CalisanID, Ad, Soyad, Email
FROM Calisanlar
WHERE Email IS NULL;
Bu sorgu, Mehmet Demir ve Elif Aksoy'un kayıtlarını döndürecektir.
IS NOT NULL Kullanımı
Telefon numarası tanımlanmış (NULL olmayan) çalışanları listelemek:
SELECT CalisanID, Ad, Soyad, Telefon
FROM Calisanlar
WHERE Telefon IS NOT NULL;
Bu sorgu, Ayşe Yılmaz, Mehmet Demir, Ali Can ve Deniz Çelik'in kayıtlarını döndürecektir.
COALESCE Kullanımı
Email adresi NULL olan çalışanlar için 'Email Yok' yazısını göstermek:
SELECT
    CalisanID,
    Ad,
    Soyad,
    COALESCE(Email, 'Email Yok') AS GosterilenEmail
FROM Calisanlar;
Bu sorgu, Mehmet Demir ve Elif Aksoy'un Email sütununda 'Email Yok' ifadesini gösterecektir.
Birden Fazla NULL Kontrolü
Hem Email hem de Telefon bilgisi NULL olan çalışanları bulmak:
SELECT CalisanID, Ad, Soyad, Email, Telefon
FROM Calisanlar
WHERE Email IS NULL AND Telefon IS NULL;
Bu sorgu, Elif Aksoy'un kaydını döndürecektir.
NULL ve Sıfır/Boş String Farkı: NULL, matematiksel sıfırdan (0) veya boş karakter dizisinden ('') farklıdır. Bu değerler birer veri değeriyken, NULL bir değerin yokluğunu ifade eder. Karşılaştırmalarda bu farka dikkat edilmelidir.
Karşılaştırma Operatörleri: =, <>, != gibi standart karşılaştırma operatörlerini NULL değerlerle kullanmaktan kaçının. Bu operatörler NULL ile karşılaştırıldığında her zaman UNKNOWN döndürür ve beklenen sonucu vermez. Daima IS NULL veya IS NOT NULL kullanın.
Toplama Fonksiyonları ve NULL: COUNT(), SUM(), AVG() gibi toplama (aggregate) fonksiyonları genellikle NULL değerleri hesaplamalarına dahil etmez. Örneğin, AVG(SutunAdı), SutunAdı içindeki NULL değerleri göz ardı ederek ortalamayı hesaplar. Ancak COUNT(*), NULL değerleri de içeren tüm satırları sayar.
NOT IN ve NULL: NOT IN operatörü ile NULL değerleri kullanırken dikkatli olun. Eğer NOT IN listesinde bir NULL değer varsa, sorgu beklenmedik şekilde hiçbir sonuç döndürmeyebilir çünkü NULL ile yapılan herhangi bir karşılaştırma UNKNOWN sonucunu verir. Örneğin, SELECT * FROM Tablo WHERE Deger NOT IN (1, 2, NULL); sorgusu UNKNOWN nedeniyle sorunlara yol açabilir.
Veritabanı Tasarımı: Tablo oluştururken bir sütunun NULL değer kabul edip etmeyeceğini NULL veya NOT NULL kısıtlamaları ile belirleyebilirsiniz. NOT NULL kısıtlaması, o sütunun her zaman bir değer içermesini sağlar ve veri bütünlüğünü artırır.
                PHP dilinde hata ve istisna yönetimi, uygulamaların beklenmedik durumlarla nasıl başa çıktığını belirleyen kritik bir konudur. Etkili hata yönetimi, uygulamanın kararlılığını artırır, kullanıcı deneyimini iyileştirir ve hata ayıklama süreçlerini önemli ölçüde kolaylaştırır. PHP, hem geleneksel hata işleme yaklaşımları hem de modern istisna mekanizmaları sunarak geliştiricilere esneklik sağlar.
PHP'de hata ve istisna yönetimi, genellikle iki ana mekanizma etrafında şekillenir:
İstisna Yönetimi: Potansiyel olarak hata oluşturabilecek kod bloklarını sarmalamak ve bu bloklarda fırlatılan istisnaları yakalamak için try...catch...finally yapıları kullanılır. Özel durumları belirtmek için throw ifadesiyle istisnalar fırlatılabilir.
Geleneksel Hata İşleme: PHP'nin eski sürümünden gelen ve E_NOTICE, E_WARNING gibi hata seviyelerini içeren hatalar için set_error_handler() fonksiyonu ile özel hata işleyicileri tanımlanabilir.
PHP'nin hata ve istisna yönetimi yapıları aşağıdaki bileşenlerden oluşur:
try Bloğu: İstisna fırlatma potansiyeli olan kodun yerleştirildiği bloktur. Bu blok içindeki herhangi bir istisna fırlatıldığında, normal akış durur ve uygun catch bloğu aranır.
catch Bloğu: Bir try bloğu içinde fırlatılan belirli bir türdeki istisnayı yakalamak için kullanılır. catch bloğu, yakalanan istisnayı parametre olarak alır ve bu istisna üzerinde işlem yapılmasına olanak tanır. PHP 7'den itibaren birden fazla catch bloğu tanımlanabilir ve bir catch bloğu birden fazla istisna türünü | operatörü ile yakalayabilir.
finally Bloğu (PHP 5.5+): İster bir istisna fırlatılsın ister fırlatılmasın, try ve catch bloklarından sonra her durumda çalıştırılması garanti edilen kod bloğudur. Bu genellikle kaynakların serbest bırakılması veya temizlik işlemleri için kullanılır.
throw İfadesi: Manuel olarak bir istisna nesnesi fırlatmak için kullanılır. Genellikle bir koşul sağlanmadığında veya beklenmedik bir durum oluştuğunda programın akışını kontrol altına almak için tercih edilir.
set_error_handler(callable $handler, int $error_types = E_ALL | E_STRICT): PHP'nin varsayılan hata işleyicisini özel bir fonksiyonla değiştirmeye yarar. Bu fonksiyon, E_ERROR dışındaki tüm hata türlerini (E_WARNING, E_NOTICE vb.) yakalayabilir. Fonksiyon, hata kodu, hata mesajı, dosya adı ve satır numarası gibi parametreler alır.
restore_error_handler(): Daha önce set_error_handler() ile değiştirilmiş olan hata işleyiciyi PHP'nin varsayılan işleyicisine geri döndürür.
error_reporting(int $level): Hangi hata seviyelerinin raporlanacağını belirler. Geliştirme ortamında genellikle tüm hatalar raporlanırken (E_ALL), üretim ortamında daha düşük seviyeli hatalar gizlenir.
display_errors ve log_errors: PHP'nin php.ini dosyasında veya çalışma zamanında ayarlanabilen bu yönergeler, hataların tarayıcı çıktısında gösterilip gösterilmeyeceğini ve hata günlüklerine yazılıp yazılmayacağını kontrol eder.
Aşağıdaki örnekler, PHP'de hata ve istisna yönetiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
1. Temel try...catch Kullanımı
"; // Çalışır
    echo bolmeIslemi(10, 0) . "
"; // İstisna fırlatır
    echo "Bu satır çalışmayacak.
";
} catch (Exception $e) {
    echo "Hata yakalandı: " . $e->getMessage() . "
";
}
?>2. Özel İstisna Sınıfı Tanımlama ve Kullanımı
getMessage() . " (Kod: " . $this->getCode() . ")";
    }
}
function veritabaninaBaglan() {
    // Bağlantı denemesi yapıldığı varsayılsın
    $basarili = false; // Bağlantının başarısız olduğunu simüle edelim
    if (!$basarili) {
        throw new VeritabaniBaglantiHatasi("Veritabanı sunucusuna ulaşılamıyor.");
    }
    return "Bağlantı başarılı!";
}
try {
    echo veritabaninaBaglan() . "
";
} catch (VeritabaniBaglantiHatasi $e) {
    echo $e->hataMesaji() . "
";
} catch (Exception $e) { // Genel istisnaları yakalamak için
    echo "Genel bir hata oluştu: " . $e->getMessage() . "
";
}
?>3. finally Bloğu Kullanımı
";
        // Dosya okuma işlemleri...
    } catch (Exception $e) {
        echo "Hata: " . $e->getMessage() . "
";
    } finally {
        if ($dosyaKaynagi) {
            fclose($dosyaKaynagi);
            echo "Dosya kapatıldı.
";
        } else {
            echo "Dosya zaten açık değildi veya açma başarısız oldu.
";
        }
    }
}
dosyaIslemi("olmayan_dosya.txt");
dosyaIslemi("varolan_dosya.txt"); // Bu dosyayı manuel olarak oluşturmanız gerekebilir
?>4. set_error_handler() ile Geleneksel Hata Yakalama
Özel Hata: [$errno] $errstr - $errfile:$errline
";
    // Hata günlüğüne yazma
    error_log("Özel Hata [$errno]: $errstr - $errfile:$errline");
    // TRUE döndürmek, PHP'nin dahili hata işleyicisinin çalışmasını engeller.
    return true;
}
// Özel hata işleyiciyi ayarla
set_error_handler("ozelHataIsleyici");
// E_WARNING seviyesinde bir hata oluştur
echo $tanimsizDegisken; // E_NOTICE veya E_WARNING oluşturabilir
// E_NOTICE seviyesinde bir hata oluştur
$dizi = [];
echo $dizi[0];
// Özel hata işleyiciyi eski haline getir
restore_error_handler();
// Bu hata artık varsayılan işleyici tarafından ele alınır (veya gizlenir)
trigger_error("Bu hata artık eski işleyiciye döner.", E_USER_WARNING);
?>Throwable Arayüzü (PHP 7+): PHP 7'den itibaren hem Error (dahili PHP hataları) hem de Exception (kullanıcı tanımlı ve standart istisnalar) sınıfları Throwable arayüzünü uygular. Bu sayede catch (Throwable $e) kullanarak tüm yakalanabilir hataları ve istisnaları tek bir blokta ele alabilirsiniz.
Hata Seviyeleri: PHP, E_ERROR, E_WARNING, E_NOTICE, E_PARSE gibi birçok hata seviyesi tanımlar. Uygulamanızın davranışını ve hata raporlama düzeyini bu seviyeleri kullanarak kontrol etmek önemlidir.
Üretim Ortamında Hata Gösterimi: Üretim ortamında display_errors ayarının Off (kapalı) olduğundan emin olun. Hataların doğrudan kullanıcıya gösterilmesi güvenlik zafiyetlerine yol açabilir. Bunun yerine, log_errors ayarını On (açık) yaparak hataları güvenli bir günlük dosyasına yazdırın.
Hata Günlükleme: error_log() fonksiyonu, hataları PHP'nin yapılandırılmış günlük dosyasına veya belirtilen bir hedefe yazmak için kullanılabilir. Özel hata işleyicileriniz içinde bu fonksiyonu kullanarak detaylı hata kayıtları tutmanız önerilir.
İstisna Hiyerarşisi: Birden fazla catch bloğu kullanırken, istisnaları en spesifikten en genele doğru sıralayın. Örneğin, özel bir istisna sınıfını (VeritabaniBaglantiHatasi) genel bir Exception sınıfından önce yakalayın.
Boş catch Bloklarından Kaçının: Bir istisnayı yakalayıp hiçbir işlem yapmamak (boş catch bloğu), hatanın gözden kaçmasına ve uygulamanın beklenmedik şekillerde davranmasına neden olabilir. Her zaman yakalanan istisnaları günlüğe kaydedin veya uygun bir şekilde ele alın.
                Hepimizin hayatında en az bir kere duyduğu, belki de kendi kendine sorduğu bir soru var: "Ben matematikte doğuştan kötüyüm, değil mi?" Bu cümle, genellikle matematiğe karşı hissedilen bir çaresizliğin, bir kabullenişin ifadesidir. Ancak bir SEO yazarı ve gazeteci olarak, bu konuda edindiğim bilgilerle size bambaşka bir pencere açmak istiyorum. Gerçekten de bazı insanlar matematikte doğuştan mı başarısızdır, yoksa bu sadece yaygın bir yanılsama mı?
Gelin, bu konuyu bilimsel veriler, uzman görüşleri ve psikolojinin ışığında derinlemesine inceleyelim. Çünkü matematik, sandığımızdan çok daha esnek, öğrenilebilir ve herkesin erişebileceği bir alandır.
Toplumda sıkça karşılaştığımız bir inanç vardır: Bazı insanların "matematik beyni" ile doğduğu, bazılarının ise bu yetenekten yoksun olduğu. Bu durum, genellikle çocukluktan itibaren "sayısalcı" veya "sözelci" gibi etiketlemelerle pekiştirilir. Ancak modern bilim, bu katı ayrımın pek de doğru olmadığını gösteriyor. Beynimiz, düşündüğümüzden çok daha esnektir ve hayat boyu öğrenmeye açıktır.
Araştırmalar, matematiğin sadece sol beynin işi olmadığını, aslında beynin birçok farklı bölgesinin etkileşim içinde çalıştığını ortaya koyuyor. Mantık, problem çözme, uzamsal düşünme, hatta yaratıcılık bile matematiksel süreçlerde rol oynar. Yani, "matematik beyni" diye tekil bir yapıdan bahsetmek yerine, matematiksel düşünmenin karmaşık ve çok yönlü bir beceri olduğunu anlamak daha doğru olacaktır.
Stanford Üniversitesi'nden psikolog Carol Dweck'in çalışmaları, "zihin yapısı" kavramının öğrenme üzerindeki etkisini çarpıcı bir şekilde ortaya koymuştur. Dweck, iki ana zihin yapısından bahseder:
Sabit Zihin Yapısı (Fixed Mindset): Bireylerin yeteneklerinin doğuştan geldiğine ve değiştirilemez olduğuna inandığı durumdur. "Matematikte kötüyüm, çünkü bu benim kaderim" düşüncesi bu kategoriye girer. Bu inanca sahip kişiler, zorluklarla karşılaştıklarında kolayca pes etme eğilimindedirler.
Büyüme Zihin Yapısı (Growth Mindset): Bireylerin yeteneklerinin çaba, pratik ve doğru stratejilerle geliştirilebileceğine inandığı durumdur. "Matematikte şu an zorlanıyorum, ama daha çok çalışarak ve farklı yöntemler deneyerek öğrenebilirim" düşüncesi bu zihin yapısının temelidir. Bu kişiler, hataları öğrenme fırsatı olarak görür ve azimle yola devam ederler.
Matematikteki başarısızlığın büyük bir kısmı, aslında sabit zihin yapısının bir sonucudur. Eğer kendimize "yapamam" dersek, beynimiz de bu inancı pekiştirir ve gerçekten yapamayız. Oysa büyüme zihin yapısını benimsemek, matematiksel potansiyelimizi ortaya çıkarmanın ilk ve en önemli adımıdır.
Matematik öğrenme deneyimimiz, büyük ölçüde bize nasıl öğretildiğiyle de şekillenir. Geleneksel ezbere dayalı, formül odaklı öğretim yöntemleri, birçok öğrencinin matematiğin soyut dünyasında kaybolmasına neden olabilir. Oysa modern eğitim yaklaşımları, matematiği daha somut, anlamlı ve etkileşimli hale getirmeyi hedefler.
Öğretmenlerin sabrı, konuyu farklı açılardan açıklama yeteneği ve öğrencilerin bireysel öğrenme stillerine dikkat etmesi, matematik başarısı üzerinde kritik bir etkiye sahiptir. Bazı öğrenciler görsel öğrenirken, bazıları işitsel, bazıları ise yaparak-yaşayarak öğrenir. Tek tip bir öğretim metodunun herkes için geçerli olmadığını anlamak, matematik eğitiminde devrim niteliğinde bir adımdır.
Matematik kaygısı, birçok insanın matematiksel görevler karşısında hissettiği gerginlik, endişe ve korku durumudur. Bu kaygı, sınav anında zihnin donmasına, basit hatalar yapmaya ve hatta matematiksel kavramları anlama yeteneğinin körelmesine neden olabilir. Matematik kaygısı, genellikle geçmişteki olumsuz deneyimler, öğretmenin veya ebeveynlerin olumsuz yaklaşımları veya toplumsal baskılar sonucunda ortaya çıkar.
İlginçtir ki, matematik kaygısı yaşayan bireylerin çoğu, aslında matematiksel yetenekten yoksun değildir. Aksine, zeki ve potansiyeli yüksek öğrencilerde bile görülebilir. Kaygı, bilişsel kaynakları tüketerek problem çözme becerisini engeller. Bu durum, "matematikte kötüyüm" algısını pekiştiren bir kısır döngü yaratır.
Ebeveynlerin veya çevrenin matematiğe karşı tutumu, çocukların matematiğe bakış açısını derinden etkiler. "Ben de matematikte iyi değildim zaten" gibi ifadeler, farkında olmadan çocuklara matematiğin zor ve başa çıkılamaz bir ders olduğu mesajını verir. Bu tür olumsuz mesajlar, çocukların matematiğe karşı önyargılı yaklaşmasına ve daha başlamadan pes etmesine neden olabilir.
Araştırmalar, ebeveynlerin çocuklarının matematik ödevlerine yardımcı olurken gösterdikleri kaygının bile çocuklara geçebileceğini gösteriyor. Destekleyici, olumlu ve sabırlı bir çevre, matematik öğreniminde mucizeler yaratabilir.
Yukarıda bahsettiğimiz tüm faktörler, matematiksel başarısızlığın büyük bir kısmını açıklasa da, çok nadir de olsa gerçek bir öğrenme güçlüğü olan "diskalkuli"den bahsetmek gerekir. Diskaluli, matematiksel kavramları anlama, sayıları işleme ve aritmetik işlemleri yapmada ciddi ve kalıcı zorluklarla karakterize edilen nörolojik bir durumdur.
Diskaluli tanısı konmuş bireyler, temel sayı hissi (number sense) ve matematiksel muhakeme yeteneğinde belirgin eksiklikler yaşarlar. Ancak unutulmamalıdır ki, diskalkuli matematiksel zorluk yaşayan nüfusun çok küçük bir yüzdesini oluşturur. Matematikte zorlanan çoğu kişi, diskalkuli değil, yukarıda saydığımız öğrenme, zihin yapısı veya kaygı temelli sorunlar yaşamaktadır. Doğru destek ve stratejilerle bu zorlukların üstesinden gelmek mümkündür.
Matematik de bir dil öğrenmek veya bir enstrüman çalmak gibidir. Düzenli pratik, tekrar ve sabır gerektirir. İlk başta zor gelen kavramlar, üzerine gidildikçe, farklı örneklerle tekrarlandıkça zihnimizde yer edinir ve kalıcı hale gelir.
Beynimizdeki sinir ağları, yeni bilgiler öğrendikçe güçlenir ve yeni bağlantılar kurar. Bu duruma nöroplastisite denir. Yani, matematiksel beceriler, tıpkı bir kas gibi, kullanıldıkça ve zorlandıkça gelişir. Yanlış yapmak, öğrenme sürecinin doğal bir parçasıdır. Önemli olan, yanlışlardan ders çıkarıp denemeye devam etmektir.
Eğer siz de kendinizi "matematikte kötüyüm" diyenlerden biri olarak görüyorsanız, umutsuzluğa kapılmayın. İşte size birkaç öneri:
Zihin Yapınızı Değiştirin: Sabit zihin yapısından büyüme zihin yapısına geçmeye çalışın. "Yapamam" yerine "Henüz yapamıyorum, ama öğrenebilirim" deyin.
Küçük Adımlarla Başlayın: Kendinizi bunaltacak büyük hedefler koymak yerine, temel kavramları anlamaya odaklanın. Küçük başarılar, motivasyonunuzu artıracaktır.
Yardım Almaktan Çekinmeyin: Anlamadığınız bir konu olduğunda öğretmenlerinizden, arkadaşlarınızdan veya özel ders verenlerden yardım isteyin. Utanmak yerine, meraklı olun.
Farklı Kaynakları Deneyin: Sadece ders kitabıyla sınırlı kalmayın. İnternetteki eğitim videoları, interaktif uygulamalar veya farklı anlatım tarzına sahip kitaplar size yeni kapılar açabilir.
Matematikle Aranızdaki Kaygıyı Azaltın: Meditasyon, derin nefes alma egzersizleri gibi tekniklerle sınav kaygınızı yönetmeyi öğrenin. Başarıya giden yolda sakin bir zihin şarttır.
Pratik Yapın, Tekrar Edin: Düzenli olarak problem çözün. Başarısız olsanız bile, bu bir öğrenme fırsatıdır. Yanlışlarınızdan ders çıkarın.
Matematiğin Günlük Hayattaki Yerini Görün: Matematik sadece formüllerden ibaret değildir. Mutfakta, alışverişte, spor yaparken veya oyun oynarken bile matematikle iç içeyiz. Bu bağlantıları görmek, matematiği daha anlamlı hale getirecektir.
Sonuç olarak, "matematikte doğuştan kötü olmak" kavramı, modern bilimin ve psikolojinin ışığında geçerliliğini büyük ölçüde yitirmiştir. Yeteneklerimiz sabit değildir; zihin yapımız, aldığımız eğitim, yaşadığımız kaygılar ve çevremizin etkisiyle şekillenir. Matematik, tıpkı diğer tüm beceriler gibi, çaba, doğru stratejiler ve inançla geliştirilebilir bir alandır. Kendinize bu şansı verin ve matematiğin büyülü dünyasını yeniden keşfedin!
                JavaScript'te Setler, benzersiz değerlerden oluşan bir koleksiyonu depolamak için kullanılan özel bir nesne türüdür.
Bu veri yapısı, tekrar eden öğelerin otomatik olarak elenmesini sağlayarak veri yönetimi ve manipülasyonunda önemli avantajlar sunar.
Bu makale, JavaScript Setlerinin temel kullanımını, sözdizimini ve pratik uygulamalarını detaylı bir şekilde açıklayacaktır.
Bir Set oluşturmak için new Set() kurucusu kullanılır.
Değerler, Set'in kurucusuna bir iterable (örneğin bir dizi) olarak geçirilebilir veya daha sonra add() metodu ile eklenebilir.
// Boş bir Set oluşturma
const mySet = new Set();
// Başlangıç değerleri ile Set oluşturma
const initialSet = new Set([1, 2, 3, 2, 4]); // initialSet: {1, 2, 3, 4}
// Metotlar
mySet.add(value);      // Bir değer ekler
mySet.delete(value);   // Bir değeri siler
mySet.has(value);      // Bir değerin varlığını kontrol eder
mySet.clear();         // Set'teki tüm öğeleri siler
mySet.size;            // Set'teki öğe sayısını döndürürnew Set([iterable]): Yeni bir Set nesnesi oluşturur. İsteğe bağlı olarak, iterable bir nesne (örneğin bir dizi) alabilir. Bu iterable içindeki tüm öğeler Set'e eklenir. Tekrar eden değerler otomatik olarak göz ardı edilir.
Set.prototype.add(value): Set'e yeni bir değer ekler. Eğer değer zaten Set'te mevcutsa, Set değişmez. Zincirleme çağrılara izin vermek için Set nesnesini döndürür.
Set.prototype.delete(value): Set'ten belirli bir değeri siler. Eğer değer Set'te mevcutsa true, aksi takdirde false döndürür.
Set.prototype.has(value): Belirli bir değerin Set'te olup olmadığını kontrol eder. Varsa true, yoksa false döndürür.
Set.prototype.clear(): Set'teki tüm öğeleri siler ve Set'i boşaltır.
Set.prototype.size: Set'teki benzersiz öğelerin sayısını döndüren bir erişimci özelliğidir.
Set.prototype.forEach(callbackFn[, thisArg]): Set'teki her öğe için bir callback fonksiyonu yürütür. Dizilerdeki forEach metoduna benzer.
Set.prototype.values(), Set.prototype.keys(), Set.prototype.entries(): Set'teki değerleri, anahtarları (Set'lerde anahtarlar ve değerler aynıdır) veya anahtar/değer çiftlerini ([value, value] formatında) içeren yeni bir Iterator nesnesi döndürür.
Aşağıdaki örnekler, JavaScript Setlerinin çeşitli kullanım senaryolarını göstermektedir.
Bir dizideki yinelenen öğeleri kaldırmak ve yalnızca benzersiz değerleri elde etmek için Setleri kullanmak oldukça etkilidir.
const numbers = [1, 2, 3, 4, 2, 1, 5, 6, 3];
const uniqueNumbers = new Set(numbers);
console.log(uniqueNumbers); // Set(6) {1, 2, 3, 4, 5, 6}
// Set'i tekrar bir diziye dönüştürme
const uniqueNumbersArray = [...uniqueNumbers];
console.log(uniqueNumbersArray); // [1, 2, 3, 4, 5, 6]Bir öğenin bir koleksiyonda olup olmadığını hızlıca kontrol etmek için has() metodunu kullanabilirsiniz.
const fruits = new Set(['elma', 'armut', 'muz']);
console.log(fruits.has('elma'));   // true
console.log(fruits.has('çilek'));  // false
fruits.add('çilek');
console.log(fruits.has('çilek'));  // trueSet öğeleri üzerinde döngü yapmak için forEach() metodunu veya for...of döngüsünü kullanabilirsiniz.
const colors = new Set(['kırmızı', 'mavi', 'yeşil']);
// forEach ile iterasyon
colors.forEach(color => {
    console.log(color);
});
// Çıktı:
// kırmızı
// mavi
// yeşil
// for...of ile iterasyon
for (const color of colors) {
    console.log(color);
}
// Çıktı:
// kırmızı
// mavi
// yeşilDeğer Karşılaştırması: Setler, değerleri karşılaştırırken aynı algoritmayı kullanır. Bu, NaN değerlerinin Set içinde benzersiz olarak ele alındığı anlamına gelir (NaN === NaN false olmasına rağmen, Set içinde sadece bir adet NaN bulunabilir). Obje referansları için, farklı referanslara sahip aynı içeriğe sahip objeler farklı kabul edilir.
Sırasız Yapı: Setler, öğeleri eklenme sırasına göre depolasa da, Setin birincil amacı benzersiz öğeleri tutmaktır, belirli bir sırayı garanti etmek değildir. Bazı durumlarda iterasyon sırası ekleme sırasına denk gelebilir, ancak buna güvenilmemelidir.
Performans: Bir öğenin Set'te varlığını kontrol etmek (has() metodu) genellikle O(1) zaman karmaşıklığına sahiptir, bu da büyük veri kümeleri için dizilerdeki aramalara göre daha verimli olabilir.
Zayıf Referanslar: Eğer objeler için zayıf referanslara ihtiyacınız varsa (yani objeye başka referans kalmadığında otomatik olarak belleğin serbest bırakılmasını istiyorsanız), WeakSet kullanmanız gerekebilir. Ancak WeakSet sadece objeleri depolayabilir ve iterable değildir.
Anahtar-Değer Çiftleri İçin Setler: Eğer benzersiz anahtar-değer çiftleri depolamanız gerekiyorsa, Map nesnesi daha uygun bir seçenek olabilir.
                Veritabanı yönetim sistemlerinde (DBMS) mevcut kayıtların üzerinde değişiklik yapmak, veri bütünlüğünü sağlamak ve dinamik uygulamalar geliştirmek için temel bir gerekliliktir. SQL (Yapısal Sorgu Dili) bu ihtiyacı karşılamak üzere güçlü bir komut olan UPDATE ifadesini sunar. Bu makale, SQL UPDATE komutunun sözdizimini, kullanımını ve pratik örneklerini detaylı bir şekilde ele alarak, veritabanlarınızdaki bilgileri güvenli ve etkili bir şekilde nasıl güncelleyeceğinizi açıklamaktadır.
SQL UPDATE komutunun temel yapısı aşağıdaki gibidir:
UPDATE tablo_adı
SET sütun1 = değer1, sütun2 = değer2, ...
WHERE koşul;Yukarıdaki sözdizimi, belirli bir tablodaki bir veya daha fazla satırın bir veya daha fazla sütunundaki verileri değiştirmek için kullanılır.
UPDATE tablo_adı: Güncellemek istediğiniz tablonun adını belirtir. Bu kısım, işlemin hangi veritabanı nesnesi üzerinde yapılacağını tanımlar.
SET sütun1 = değer1, sütun2 = değer2, ...: Güncellenecek sütunları ve bu sütunlara atanacak yeni değerleri belirtir. Birden fazla sütunu güncellemek için sütun-değer çiftleri virgüllerle ayrılır. Atanan değerler sabit bir değer, başka bir sütunun değeri, bir ifade veya bir alt sorgunun sonucu olabilir.
WHERE koşul: Bu anahtar kelime ve ardından gelen koşul, hangi satırların güncelleneceğini belirler. Yalnızca belirtilen koşulu sağlayan satırlar güncellenir. Eğer WHERE koşulu kullanılmazsa, tablodaki tüm satırlar SET ifadesinde belirtilen değerlerle güncellenir. Bu, genellikle istenmeyen ve dikkatli olunması gereken bir durumdur.
Aşağıdaki örnekler, UPDATE komutunun farklı senaryolarda nasıl kullanılabileceğini göstermektedir. Örneklerde Müşteriler ve Ürünler adında iki tablo varsayılmaktadır.
Belirli bir müşteri ID'sine sahip müşterinin e-posta adresini güncelleyelim:
UPDATE Müşteriler
SET E_posta = 'yeni.eposta@example.com'
WHERE MüşteriID = 101;Bu sorgu, MüşteriID'si 101 olan kaydın E_posta sütununu yeni.eposta@example.com olarak değiştirir.
Belirli bir ürünün fiyatını ve stok miktarını aynı anda güncelleyelim:
UPDATE Ürünler
SET Fiyat = 29.99, StokMiktarı = 150
WHERE ÜrünID = 205;ÜrünID'si 205 olan ürünün hem Fiyat hem de StokMiktarı sütunları güncellenir.
Belirli bir kategorideki tüm ürünlerin fiyatını %10 artıralım:
UPDATE Ürünler
SET Fiyat = Fiyat * 1.10
WHERE Kategori = 'Elektronik';Bu örnek, mevcut Fiyat değerini kullanarak yeni bir değer hesaplar ve atar.
Eğer WHERE koşulu kullanılmazsa, tablodaki tüm satırlar güncellenir. Örneğin, tüm ürünlerin durumunu 'Pasif' olarak ayarlamak için:
UPDATE Ürünler
SET Durum = 'Pasif';Bu sorgu, Ürünler tablosundaki her ürünün Durum sütununu 'Pasif' olarak ayarlar. Bu tür bir işlem yapmadan önce daima veritabanı yedeği almanız ve işlemin etkilerini tam olarak anladığınızdan emin olmanız şiddetle tavsiye edilir.
WHERE koşulunun gücü ve tehlikesi: WHERE koşulu olmadan yapılan bir UPDATE işlemi, tablonuzdaki tüm verileri geri dönülemez bir şekilde değiştirebilir. Her zaman önce SELECT sorgusu ile güncellenecek satırları kontrol edin.
TRANSACTION kullanımı: Büyük veya kritik UPDATE işlemleri yaparken BEGIN TRANSACTION, COMMIT ve ROLLBACK komutlarını kullanmak iyi bir uygulamadır. Bu, bir hata durumunda değişiklikleri geri almanıza olanak tanır.
Yedekleme: Herhangi bir büyük veri değişikliği yapmadan önce daima veritabanınızın yedeğini alın. Bu, beklenmedik sorunlar karşısında verilerinizi kurtarmanızı sağlar.
Performans: Çok büyük tablolarda UPDATE işlemleri performans sorunlarına yol açabilir. İndekslerin doğru kullanılması ve işlem büyüklüğünün optimize edilmesi önemlidir.
SQL Injection: Kullanıcı girdileri ile dinamik UPDATE sorguları oluştururken SQL Injection saldırılarına karşı dikkatli olun. Güvenli parametreli sorgular (prepared statements) kullanmak bu tür riskleri azaltır.
                Python programlama dilinde listeler, birden fazla öğeyi tek bir değişken altında depolamak için kullanılan temel ve çok yönlü veri yapılarından biridir. Sıralı, değiştirilebilir (mutable) ve farklı veri tiplerindeki öğeleri barındırabilen koleksiyonlardır. Veri yönetimi, algoritma geliştirme ve birçok programlama görevinde kritik bir rol oynarlar. Bu kılavuz, Python listelerinin oluşturulmasından karmaşık manipülasyonlarına kadar tüm yönlerini adım adım ele alacaktır.
Python'da bir liste, köşeli parantezler [] içine virgülle ayrılmış öğeler yerleştirilerek oluşturulur.
liste_adi = [eleman1, eleman2, eleman3, ...]liste_adi: Oluşturulan listeyi referans alan değişkendir. Geçerli bir Python tanımlayıcısı olmalıdır.
=: Atama operatörüdür. Sağdaki liste değerini soldaki değişkene atar.
[]: Köşeli parantezler, bir liste veri yapısının başlangıcını ve sonunu işaret eder. Python yorumlayıcısı, bu parantezlerin içindeki öğeleri bir liste olarak tanır.
eleman1, eleman2, eleman3, ...: Listede saklanacak öğelerdir. Bu öğeler, tam sayılar, ondalık sayılar, dizeler, boolean değerler, hatta başka listeler veya özel nesneler dahil olmak üzere herhangi bir Python veri tipinde olabilir. Öğeler birbirlerinden virgül , ile ayrılır.
Listeler sıralıdır, yani öğelerin eklenme sırası korunur ve bir dizin (index) numarası ile erişilebilirler. İlk öğenin dizini 0'dır. Ayrıca, listeler değiştirilebilirdir, yani oluşturulduktan sonra öğeleri eklenebilir, çıkarılabilir veya güncellenebilir.
Aşağıdaki örnekler, Python listelerinin temel kullanım senaryolarını göstermektedir.
Boş bir liste veya farklı veri tiplerini içeren bir liste oluşturabilirsiniz.
# Boş bir liste oluşturma
bos_liste = []
print(f"Boş Liste: {bos_liste}")
# Tam sayılar içeren bir liste
sayilar = [1, 2, 3, 4, 5]
print(f"Sayılar Listesi: {sayilar}")
# Dizeler içeren bir liste
meyveler = ["elma", "armut", "kiraz"]
print(f"Meyveler Listesi: {meyveler}")
# Farklı veri tiplerini içeren bir liste
karisik_liste = [10, "Python", True, 3.14]
print(f"Karışık Liste: {karisik_liste}")
# İç içe liste (nested list)
ic_ice_liste = [[1, 2], ["a", "b"]]
print(f"İç İçe Liste: {ic_ice_liste}")Listelerdeki öğelere dizin numaraları (index) kullanılarak erişilir. Dizinler 0'dan başlar. Negatif dizinler listenin sonundan itibaren saymaya başlar (-1 son öğeyi temsil eder).
my_list = ["a", "b", "c", "d", "e"]
# İlk öğeye erişim
print(f"İlk öğe: {my_list[0]}") # Çıktı: a
# Üçüncü öğeye erişim
print(f"Üçüncü öğe: {my_list[2]}") # Çıktı: c
# Son öğeye erişim (negatif dizin)
print(f"Son öğe: {my_list[-1]}") # Çıktı: e
# Sondan ikinci öğeye erişim
print(f"Sondan ikinci öğe: {my_list[-2]}") # Çıktı: dListeler değiştirilebilir olduğu için, belirli bir dizindeki öğeyi güncelleyebilirsiniz.
sayilar = [10, 20, 30, 40]
print(f"Orijinal liste: {sayilar}")
# İlk öğeyi değiştirme
sayilar[0] = 5
print(f"Değiştirilen ilk öğe sonrası: {sayilar}") # Çıktı: [5, 20, 30, 40]
# Son öğeyi değiştirme
sayilar[-1] = 50
print(f"Değiştirilen son öğe sonrası: {sayilar}") # Çıktı: [5, 20, 30, 50]append() metodu listenin sonuna, insert() metodu ise belirtilen bir dizine öğe ekler.
meyveler = ["elma", "armut"]
# listenin sonuna öğe ekleme
meyveler.append("muz")
print(f"Append sonrası: {meyveler}") # Çıktı: ['elma', 'armut', 'muz']
# Belirli bir dizine öğe ekleme (dizin 1'e 'kiraz' ekle)
meyveler.insert(1, "kiraz")
print(f"Insert sonrası: {meyveler}") # Çıktı: ['elma', 'kiraz', 'armut', 'muz']remove() metodu belirtilen değeri, pop() metodu belirtilen dizindeki öğeyi (veya son öğeyi), del anahtar kelimesi ise belirtilen dizindeki öğeyi veya dilimi siler.
renkler = ["kırmızı", "yeşil", "mavi", "sarı"]
# Değere göre silme
renkler.remove("yeşil")
print(f"Remove 'yeşil' sonrası: {renkler}") # Çıktı: ['kırmızı', 'mavi', 'sarı']
# Dizin 1'deki öğeyi silme (pop varsayılan olarak son öğeyi siler)
silinen_renk = renkler.pop(1)
print(f"Pop sonrası: {renkler}, Silinen: {silinen_renk}") # Çıktı: ['kırmızı', 'sarı'], Silinen: mavi
# 'del' anahtar kelimesi ile dizin 0'daki öğeyi silme
del renkler[0]
print(f"Del sonrası: {renkler}") # Çıktı: ['sarı']
# Tüm listeyi silme
# del renkler
# print(renkler) # Hata verecektir, çünkü liste artık mevcut değil.
# Listeyi temizleme (içindeki tüm öğeleri siler, liste objesi kalır)
sayilar = [1, 2, 3]
sayilar.clear()
print(f"Clear sonrası: {sayilar}") # Çıktı: []Listenin bir bölümünü (dilimini) almak için dilimleme işlemi kullanılır. Sözdizimi liste[baslangic:bitis:adim] şeklindedir.
alfabe = ["a", "b", "c", "d", "e", "f", "g"]
# İlk üç öğeyi al
print(f"İlk üç: {alfabe[0:3]}") # Çıktı: ['a', 'b', 'c']
print(f"İlk üç (kısa): {alfabe[:3]}") # Çıktı: ['a', 'b', 'c']
# İkinci dizinden sona kadar
print(f"İkinci dizinden sona: {alfabe[1:]}") # Çıktı: ['b', 'c', 'd', 'e', 'f', 'g']
# Üçüncü dizinden beşinci dizine kadar (beşinci dahil değil)
print(f"Üçüncüden beşe: {alfabe[2:5]}") # Çıktı: ['c', 'd', 'e']
# Tüm listeyi kopyalama
kopyalanmis_alfabe = alfabe[:]
print(f"Kopyalanmış: {kopyalanmis_alfabe}") # Çıktı: ['a', 'b', 'c', 'd', 'e', 'f', 'g']
# Her ikinci öğeyi al
print(f"Her ikinci: {alfabe[::2]}") # Çıktı: ['a', 'c', 'e', 'g']
# Listeyi ters çevir
print(f"Ters çevrilmiş: {alfabe[::-1]}") # Çıktı: ['g', 'f', 'e', 'd', 'c', 'b', 'a']Listeler üzerinde çeşitli temel operasyonlar gerçekleştirebilirsiniz.
liste1 = [1, 2, 3]
liste2 = [4, 5, 6]
# Listeleri birleştirme (concatenation)
birlesik_liste = liste1 + liste2
print(f"Birleşik liste: {birlesik_liste}") # Çıktı: [1, 2, 3, 4, 5, 6]
# Bir listeyi tekrarlama
tekrarlanan_liste = liste1 * 3
print(f"Tekrarlanan liste: {tekrarlanan_liste}") # Çıktı: [1, 2, 3, 1, 2, 3, 1, 2, 3]
# Liste uzunluğunu bulma
print(f"Liste1 uzunluğu: {len(liste1)}") # Çıktı: 3
# Bir öğenin listede olup olmadığını kontrol etme
print(f"2 listede mi? {'2' in liste1}") # Çıktı: False (int 2, str '2' değil)
print(f"2 listede mi? {2 in liste1}") # Çıktı: True
print(f"7 listede mi? {7 not in liste2}") # Çıktı: TrueDeğiştirilebilirlik (Mutability): Listeler değiştirilebilir veri yapılarıdır. Bu, içeriklerinin oluşturulduktan sonra değiştirilebileceği anlamına gelir. Bu özellik, listelerin esnekliğini artırır ancak aynı zamanda dikkatli kullanılmasını gerektirir, özellikle liste kopyalama ve referans verme durumlarında.
Heterojen Öğeler: Bir Python listesi, farklı veri tiplerindeki (örneğin, tam sayı, dize, boolean, hatta başka bir liste) öğeleri aynı anda barındırabilir.
Sıralı Yapı ve Dizinleme: Listelerdeki öğeler belirli bir sırayı korur ve bu sıraya dizin numaraları (0'dan başlayarak) aracılığıyla erişilebilir. Dizin dışı bir öğeye erişim denemesi IndexError hatasına yol açar.
Kopyalama Davranışı: Bir listeyi basit bir atama (örneğin, yeni_liste = eski_liste) ile kopyalamak, yeni bir liste oluşturmaz, yalnızca orijinal listenin referansını kopyalar. Bu, her iki değişkenin de aynı listeyi işaret ettiği anlamına gelir. Bağımsız bir kopya oluşturmak için .copy() metodu veya dilimleme [:] kullanılmalıdır (örn. yeni_liste = eski_liste.copy()).
Yüksek Performanslı İşlemler: Büyük listelerde sık sık ekleme/çıkarma işlemleri yapılıyorsa, performans sorunları yaşanabilir. Bu tür senaryolarda, collections.deque gibi alternatif veri yapıları daha uygun olabilir.
                PHP programlamada, bir uygulamanın çalışma zamanında beklenmedik durumlarla karşılaşması yaygın bir senaryodur. Bu tür durumlar, programın normal akışını bozarak hatalara veya istenmeyen davranışlara yol açabilir. PHP'de bu tür durumları zarif ve kontrollü bir şekilde yönetmek için istisnalar (exceptions) mekanizması kullanılır. İstisnalar, hata koşullarını temsil eden nesnelerdir ve programın hatayı yakalamasına, işlemesine ve uygun bir yanıt vermesine olanak tanır. Bu kılavuz, PHP dilinde istisnaların temel sözdizimini, detaylı kullanımını ve pratik örneklerini adım adım açıklamaktadır.
PHP'de istisna yönetimi, try, catch ve isteğe bağlı olarak finally blokları kullanılarak gerçekleştirilir. Bu yapı, potansiyel olarak istisna fırlatabilecek kodun yürütülmesini izlemek ve fırlatılan istisnaları ele almak için tasarlanmıştır.
İstisna yönetimi yapısının her bir bileşeni belirli bir amaca hizmet eder:
try Bloğu: Potansiyel olarak bir istisna fırlatabilecek kodun bulunduğu alandır. Program bu blok içindeki kodun yürütülmesini izler. Eğer try bloğu içinde bir istisna fırlatılırsa, PHP normal akışı durdurur ve fırlatılan istisnayı yakalayabilecek uygun bir catch bloğu arar.
catch Bloğu: Bir try bloğunda fırlatılan istisnaları yakalamak ve işlemek için kullanılır. Her catch bloğu, yakalamak istediği istisna tipini (sınıfını) belirtir. PHP, fırlatılan istisna nesnesinin tipiyle eşleşen ilk catch bloğunu yürütür. Bir istisna yakalandığında, catch bloğu içindeki kod çalıştırılır ve bu, hatanın ele alınmasını sağlar. Birden fazla catch bloğu kullanarak farklı istisna tiplerini ayrı ayrı ele alabilirsiniz.
finally Bloğu: PHP 5.5'ten itibaren kullanılabilen bu blok, try ve catch blokları tamamlandıktan sonra, bir istisna fırlatılsın veya fırlatılmasın, her zaman yürütülecek kodu içerir. Bu, veritabanı bağlantılarını kapatma, dosya tanıtıcılarını serbest bırakma gibi temizleme (cleanup) işlemleri için son derece kullanışlıdır ve kaynak sızıntılarını önlemeye yardımcı olur.
throw Anahtar Kelimesi: Bir istisna fırlatmak için kullanılır. Bir Exception sınıfının veya ondan türetilmiş bir sınıfın nesnesiyle birlikte kullanılır. Örneğin: throw new Exception("Hata mesajı");
Exception Sınıfı: PHP'de tüm yerleşik ve özel istisnaların türediği temel sınıftır. Kendi özel istisna sınıflarınızı oluştururken genellikle bu sınıftan türetirsiniz.
Aşağıdaki örnekler, istisna yönetiminin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Örnek 1: Temel İstisna Yakalama
";
    echo bolmeIslemi(5, 0) . "
"; // Bu satırda istisna fırlatılacak
    echo bolmeIslemi(20, 4) . "
"; // Bu satır çalışmayacak
} catch (Exception $e) {
    echo "Hata yakalandı: " . $e->getMessage() . "
";
}
echo "Program devam ediyor.
";
?>Bu örnekte, bolmeIslemi fonksiyonu sıfıra bölme durumunda bir istisna fırlatır. try bloğu içinde bu istisna yakalanır ve hata mesajı ekrana yazdırılır. İstisna fırlatıldıktan sonra try bloğundaki diğer kodların çalışmadığına dikkat edin.
Örnek 2: Çoklu catch Blokları ve Özel İstisnalar
Kendi özel istisna sınıflarınızı tanımlayarak daha spesifik hata durumlarını ele alabilirsiniz. Özel istisna sınıfları genellikle Exception sınıfından türetilir.
getMessage() . "
";
} catch (VeritabaniBaglantiHatasiException $e) {
    echo "Veritabanı hatası yakalandı: " . $e->getMessage() . "
";
} catch (Exception $e) { // Diğer tüm istisnaları yakalamak için
    echo "Genel bir hata yakalandı: " . $e->getMessage() . "
";
} finally {
    echo "İşlem tamamlandı, kaynaklar serbest bırakılıyor (finally bloğu).
";
}
?>Bu örnek, farklı hata türlerini ele almak için birden çok catch bloğunun nasıl kullanılacağını gösterir. finally bloğu ise, istisna fırlatılsa da fırlatılmasa da her zaman çalışarak temizleme işlemleri için bir garanti sağlar.
Örnek 3: İstisnaları Yeniden Fırlatma (Re-throwing Exceptions)
Bazen bir istisnayı yakalayıp belirli bir işlem yaptıktan sonra, daha yüksek bir seviyede ele alınması için yeniden fırlatmak isteyebilirsiniz.
getMessage());
        // İstisnayı daha yüksek bir seviyede yakalanmak üzere yeniden fırlat
        throw new Exception("Dosya işlemi sırasında bir sorun oluştu.", 0, $e);
    }
}
try {
    $data = dosyaOku("olmayan_dosya.txt");
    echo "Dosya içeriği: " . $data . "
";
} catch (Exception $e) {
    echo "Uygulama seviyesinde hata: " . $e->getMessage() . "
";
    if ($e->getPrevious()) {
        echo "Önceki hata: " . $e->getPrevious()->getMessage() . "
";
    }
}
?>Bu örnekte, dosyaOku fonksiyonu bir istisna yakalar, loglar ve ardından daha genel bir istisna mesajıyla yeniden fırlatır. Yeniden fırlatılan istisnaya orijinal istisna, getPrevious() metodu ile erişilebilir.
Spesifik catch Blokları Önce Gelmeli: Birden fazla catch bloğu kullanırken, daha spesifik istisna sınıflarını (GecersizParametreException gibi) genel Exception sınıfından önce yerleştirin. Aksi takdirde, daha genel olan blok tüm istisnaları yakalar ve spesifik bloklara asla ulaşılamaz.
İstisnaları Yutmaktan Kaçının: Bir istisnayı yakalayıp hiçbir işlem yapmadan (boş bir catch bloğu) bırakmak, hataların gizlenmesine ve hata ayıklamanın zorlaşmasına neden olur. Her zaman yakalanan istisnayı loglayın, kullanıcıya anlamlı bir mesaj gösterin veya uygun şekilde ele alın.
Sadece Hata Durumları İçin Kullanın: İstisnalar, programın normal akışının bir parçası olmayan, beklenmedik hata durumları için tasarlanmıştır. Kontrol akışını yönlendirmek için istisnaları kullanmaktan kaçının (örneğin, bir döngüyü kırmak için).
Throwable Arayüzü: PHP 7'den itibaren, hem Exception hem de Error sınıflarının uyguladığı Throwable arayüzü tanıtılmıştır. Bu, hem istisnaları hem de ciddi hataları (örneğin, bellek tükenmesi) tek bir catch (Throwable $e) bloğu ile yakalamanıza olanak tanır.
Standart İstisna Sınıfları: PHP, InvalidArgumentException, RuntimeException, PDOException gibi birçok yerleşik istisna sınıfı sağlar. Uygulamanızda bu standart sınıfları veya bunlardan türettiğiniz özel sınıfları kullanmak iyi bir pratiktir.
                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,