HTML Layout Kullanımı
Yazar: Jane Doe • Tarih: 15 Kasım 2023
Bu makale, HTML layout prensiplerini detaylıca inceler.
Giriş
Web sayfalarının düzeni, kullanıcı deneyimi için kritik öneme sahiptir.
                SQL (Yapısal Sorgulama Dili), veritabanlarından bilgi almayı ve manipüle etmeyi sağlayan güçlü bir dildir. Bu dilin temel bileşenlerinden biri olan SUM() fonksiyonu, sayısal bir sütundaki değerlerin toplamını hesaplamak için kullanılan bir toplama (aggregate) fonksiyonudur. Raporlama, finansal analiz veya genel veri özetleri oluştururken, belirli bir kriteri karşılayan tüm kayıtların toplam değerini bulmak hayati öneme sahiptir. Bu kılavuz, SUM() fonksiyonunun sözdiziminden başlayarak, çeşitli kullanım senaryolarını örneklerle açıklayacak ve bu güçlü fonksiyonu verimli bir şekilde kullanmanıza yardımcı olacak pratik bilgiler sunacaktır.
SUM() fonksiyonunun temel sözdizimi aşağıdaki gibidir:
SELECT SUM(sutun_adi)
FROM tablo_adi
WHERE kosul;İsteğe bağlı olarak, yalnızca benzersiz değerlerin toplamını almak için DISTINCT anahtar kelimesi kullanılabilir:
SELECT SUM(DISTINCT sutun_adi)
FROM tablo_adi
WHERE kosul;SUM() fonksiyonu, belirtilen bir sayısal ifadenin veya sütunun değerlerini toplar. Fonksiyonun bileşenleri şunlardır:
SUM(): Bu, toplama işlemini gerçekleştiren ana fonksiyondur.
sutun_adi veya expression: Toplanacak değerleri içeren sayısal bir sütun adını veya sayısal bir değer döndüren herhangi bir ifadeyi (örneğin, Miktar * BirimFiyat) temsil eder. Bu ifade, INT, DECIMAL, FLOAT gibi sayısal veri tiplerine sahip olmalıdır.
DISTINCT (isteğe bağlı): Eğer bu anahtar kelime kullanılırsa, SUM() fonksiyonu yalnızca belirtilen sütundaki veya ifadedeki benzersiz değerlerin toplamını hesaplar. Yinelenen değerler toplama dahil edilmez. Genellikle bu anahtar kelimeye ihtiyaç duyulmaz ve kullanımı performansı etkileyebilir.
FROM tablo_adi: Sorgunun hangi tablodan veri alacağını belirtir.
WHERE kosul (isteğe bağlı): Toplama işlemine dahil edilecek satırları filtrelemek için kullanılır. Yalnızca belirtilen koşulu sağlayan satırlar toplanır.
SUM() fonksiyonu, varsayılan olarak NULL değerleri toplama işlemine dahil etmez. Yani, bir sütunda NULL değeri varsa, bu değer göz ardı edilir ve toplam etkilenmez.
Aşağıdaki örneklerde, bir satış tablosu olan Satislar'ı kullanacağız. Bu tablo, SatisID, UrunID, Miktar, BirimFiyat, SatisTarihi ve MusteriID sütunlarını içermektedir.
Tüm satış kayıtlarındaki ürünlerin toplam miktarını bulmak için basit bir SUM() kullanımı:
SELECT SUM(Miktar) AS ToplamMiktar
FROM Satislar;Açıklama: Bu sorgu, Satislar tablosundaki tüm Miktar değerlerini toplar ve sonucu ToplamMiktar adıyla döndürür.
GROUP BY ifadesiyle birlikte SUM() kullanarak her bir ürün için ayrı ayrı toplam satış miktarını hesaplayabiliriz:
SELECT UrunID, SUM(Miktar) AS UrunToplamMiktar
FROM Satislar
GROUP BY UrunID;Açıklama: Sorgu, UrunID'ye göre gruplandırma yapar ve her bir UrunID için ilgili satış miktarlarının toplamını hesaplar.
WHERE koşulu ile belirli bir tarihten sonraki satışların toplam gelirini (miktar * birim fiyat) hesaplayabiliriz:
SELECT SUM(Miktar * BirimFiyat) AS ToplamGelir
FROM Satislar
WHERE SatisTarihi > '2023-01-16';Açıklama: Bu sorgu, 16 Ocak 2023 tarihinden sonra gerçekleşen satışların her biri için Miktar ile BirimFiyat'ı çarparak geliri bulur ve bu gelirlerin toplamını ToplamGelir olarak döndürür.
Eğer sadece benzersiz satış miktarlarının toplamını almak istiyorsanız, DISTINCT anahtar kelimesini kullanabilirsiniz:
SELECT SUM(DISTINCT Miktar) AS FarkliMiktarToplami
FROM Satislar;Açıklama: Bu sorgu, Satislar tablosundaki Miktar sütununda tekrar eden değerleri bir kez sayarak, yalnızca farklı Miktar değerlerinin toplamını hesaplar.
GROUP BY ile birlikte HAVING kullanarak, belirli bir eşiğin üzerindeki toplam gelire sahip ürünleri filtreleyebiliriz:
SELECT UrunID, SUM(Miktar * BirimFiyat) AS UrunToplamGelir
FROM Satislar
GROUP BY UrunID
HAVING SUM(Miktar * BirimFiyat) > 200;Açıklama: Bu örnek, her bir UrunID için toplam geliri hesaplar ve yalnızca toplam geliri 200'den fazla olan ürünleri listeler.
NULL Değerler: SUM() fonksiyonu, NULL değerleri otomatik olarak göz ardı eder. Eğer NULL değerleri sıfır olarak dahil etmek isterseniz, COALESCE() veya ISNULL() gibi fonksiyonları kullanmalısınız (örneğin, SUM(COALESCE(sutun_adi, 0))).
Sayısal Olmayan Veri Tipleri: SUM() yalnızca sayısal veri tipleriyle çalışır. Sayısal olmayan bir sütun üzerinde kullanılırsa hata verecektir. Gerekirse, veri tipini uygun bir sayısal türe dönüştürmek için CAST() veya CONVERT() gibi fonksiyonları kullanın.
GROUP BY ile Kullanım: SUM() fonksiyonunun gücü genellikle GROUP BY ifadesiyle birleştiğinde ortaya çıkar. Bu kombinasyon, verileri belirli kategorilere göre gruplandırarak her grup için ayrı ayrı toplamları hesaplamanıza olanak tanır.
HAVING ile Filtreleme: GROUP BY kullanıldığında, gruplar üzerinde filtreleme yapmak için WHERE yerine HAVING ifadesi kullanılır. WHERE, gruplama yapılmadan önce satırları filtrelerken, HAVING gruplama yapıldıktan ve toplama fonksiyonları uygulandıktan sonra grupları filtreler.
Performans: Büyük veri kümelerinde SUM() kullanımı, özellikle DISTINCT anahtar kelimesiyle veya karmaşık ifadelerle birleştiğinde performans üzerinde etki yaratabilir. İndeksleme, sorgu optimizasyonu ve uygun veri tipi seçimi gibi faktörler performansı artırabilir.
                Merhaba gökyüzü tutkunları! Sonbaharın serin gecelerinde bizi bekleyen muhteşem bir görsel şölen var: Orionid Meteor Yağmuru! Bu, sadece bir göktaşı yağmurundan çok daha fazlası; tarihin en ünlü kuyruklu yıldızlarından Halley'nin bize bıraktığı büyüleyici bir miras. Hazırsanız, bu eşsiz olayı ne zaman ve nasıl izleyeceğinize dair tüm detaylara dalalım ve evrenin sunduğu bu harika hediyeyi kaçırmamanız için ipuçlarımı sizinle paylaşayım.
Peki, Orionidler tam olarak nedir? Göktaşı yağmurları, Dünya'nın uzayda seyreden bir kuyruklu yıldızın veya asteroidin yörüngesinde bıraktığı toz ve kaya parçacıkları bulutundan geçtiğinde meydana gelir. Bu minik parçacıklar, gezegenimizin atmosferine saniyede yaklaşık 66 kilometre gibi inanılmaz bir hızla girer. Atmosferdeki hava molekülleriyle sürtünme sonucu yanarak parlamaya başlarlar ve biz de onlara "kayan yıldız" veya "meteor" deriz. Orionidler, adını gökyüzünde ışınsal olarak yayılıyor gibi göründükleri Orion Takımyıldızı'ndan alır. Bu takımyıldız, meteorların çıkış noktası gibi görünse de, aslında tüm gökyüzünde görülebilirler.
Orionidlerin özel olmasının en büyük nedeni, onların kaynağının Halley Kuyruklu Yıldızı olmasıdır. Bu ünlü kuyruklu yıldız, her 75-76 yılda bir Dünya'nın yakınından geçer ve yörüngesinde geride milyonlarca küçük parçacık bırakır. Dünya, bu parçacıkların içinden her yıl Ekim ayında geçtiğinde, Halley'nin mirası olan Orionidleri gökyüzünde izleme şansı buluruz. Bu, aslında çok eski bir gök olayıdır ve binlerce yıldır insanları büyülemeye devam etmektedir. Halley'nin bıraktığı bu izler, bize tarihin derinliklerinden gelen bir mesaj niteliğindedir.
En önemli soru: Ne zaman? Orionid meteor yağmuru genellikle 2 Ekim ile 7 Kasım tarihleri arasında aktif olur. Ancak, asıl görsel şölen, yani en yoğun dönemi, 20-21 Ekim gecesi civarında gerçekleşir. Bu gecelerde, hava koşulları uygun olduğunda ve ışık kirliliğinden uzak bir noktadaysanız, saatte 10 ila 20 kadar meteor görme şansınız olabilir. Hatta bazı yıllar bu sayı daha da artabilir! Bu tarihleri takvimlerinize işaretlemeyi unutmayın.
Bu yıl, yani 2024'te, Orionidlerin zirvesi yine 20-21 Ekim gecesine denk geliyor. Genellikle gece yarısından sonra, sabaha karşı 02:00 ile şafak sökene kadar olan saatler, meteor izlemek için en ideal zaman dilimidir. Bu saatlerde, Dünya'nın dönüşü sayesinde meteor parçacıklarıyla daha doğrudan bir çarpışma yaşarız ve bu da görünen meteor sayısını artırır. Ay'ın durumu da gözlem kalitesini doğrudan etkiler ve bu yılki gözlemler için Ay'ın durumu oldukça önemli bir faktör olacak.
Peki, Ay'ın durumu nasıl olacak? 2024'te Orionidlerin zirve yaptığı 20-21 Ekim gecesi, Ay'ın evresi son dördün evresine yakın olacak. Bu, Ay'ın gökyüzünde oldukça parlak olacağı ve dolayısıyla daha sönük meteorları görmemizi zorlaştıracağı anlamına geliyor. Ancak umutsuzluğa kapılmayın! Ay battıktan sonraki saatler veya Ay'ın parlaklığının en az olduğu anlar, yine de gözlem için harika fırsatlar sunabilir. Ay ışığından en az etkilenecek bir gözlem noktası seçmek veya Ay'ı görüş alanınızın dışında tutacak bir yere bakmak, bu durumu avantaja çevirmenize yardımcı olacaktır. Unutmayın, en parlak meteorlar Ay ışığında bile görülebilir!
Şimdi gelelim bu muhteşem şöleni nasıl en iyi şekilde izleyeceğinize. Özel bir ekipmana ihtiyacınız yok, sadece sabır ve doğru bir hazırlık yeterli:
Karanlık Bir Yer Bulun: Şehir ışıklarından uzakta, mümkün olduğunca karanlık bir yer seçmek en önemlisidir. Büyük şehirlerin ışık kirliliği, sönük meteorları görmenizi engelleyecektir. Parklar, kırsal alanlar, dağ evleri veya yüksek tepeler ideal olabilir. Işık kirliliği ne kadar az olursa, o kadar çok meteor görme şansınız artar.
Ay'ın Durumunu Kontrol Edin: Gözlem yapacağınız gecenin Ay takvimini kontrol edin. Eğer Ay parlaksa, Ay batana kadar beklemek veya Ay'ın doğrudan görüş açınızda olmadığı, gökyüzünün daha karanlık bir kısmına bakmak faydalı olabilir.
Gözlerinizi Karanlığa Alıştırın: Gözlerinizin karanlığa alışması yaklaşık 20-30 dakika sürer ve bu süre zarfında ışığa maruz kalmaktan kaçınmak çok önemlidir. Bu süre zarfında telefonunuza veya diğer ışık kaynaklarına bakmaktan kaçının. Eğer bir ışığa ihtiyacınız olursa, kırmızı ışıklı bir fener kullanın; kırmızı ışık, gözlerinizin karanlığa adaptasyonunu bozmaz.
Rahat Edin: Gözlem yaparken yere uzanmak veya rahat bir kamp sandalyesine oturmak, boynunuzu ağrıtmadan gökyüzünü daha uzun süre izlemenizi sağlar. Battaniye, uyku tulumu gibi sıcak tutacak şeyleri yanınıza almayı unutmayın, zira sonbahar geceleri oldukça serin olabilir ve üşümek gözlem keyfinizi kaçırabilir.
Sabırlı Olun: Meteorlar düzenli aralıklarla gelmez. Bazen birkaç dakika boyunca hiçbir şey göremeyebilirsiniz, sonra aniden birkaç tane arka arkaya geçebilir. Bu yüzden sabırlı olmak ve gökyüzünü sürekli taramak önemlidir. Unutmayın, her bir meteor, Halley'nin bize gönderdiği özel bir selamdır.
Orionidlerin "ışıma noktası" (radyantı) Orion Takımyıldızı'nda olsa da, meteorları gökyüzünün herhangi bir yerinde görebilirsiniz. Aslında, radyanttan uzaklaşan meteorlar, Dünya atmosferine daha eğik bir açıyla girdikleri için daha uzun ve etkileyici izler bırakır. Bu yüzden tüm gökyüzünü kapsayacak şekilde geniş bir görüş açısına sahip olmaya çalışın. Başınızı gökyüzünün en karanlık ve bulutsuz kısmına çevirin ve sadece bekleyin. Gözleriniz sürekli hareket halinde olsun ve gökyüzünü yavaşça tarayın.
Orionidler, saatte yaklaşık 10 ila 20 meteor görme potansiyeli sunar (Zenithal Hourly Rate - ZHR). ZHR, ideal koşullarda, yani tamamen karanlık bir gökyüzünde, radyantın tam tepede olduğu ve görüş alanını hiçbir şeyin engellemediği varsayılarak hesaplanan teorik bir sayıdır. Gerçekte, şehir ışıklarından veya Ay ışığından etkilenen bir yerdeyseniz bu sayı daha düşük olabilir. Ancak göreceğiniz her bir meteor, Halley'nin mirasının bir parçası olduğu için paha biçilmezdir ve size evrenin büyüklüğünü hatırlatacaktır.
Orionidler, çok hızlı meteorlar olmalarıyla bilinirler; yaklaşık 66 km/s hızla Dünya atmosferine girerler. Bu inanılmaz hız, onların genellikle parlak ve hızlı izler bırakmalarına neden olur. Bazen atmosferde daha büyük parçacıkların yanmasıyla oluşan parlak fireball'lar (ateş topları) bile görebilirsiniz. Bu ateş topları, gökyüzünde birkaç saniye boyunca parlayarak gözlemcileri büyüleyebilir ve ardında uzun, dumanlı bir iz bırakabilir. Onları gördüğünüz an, gerçekten unutulmaz bir deneyim yaşayacaksın!
Halley Kuyruklu Yıldızı, insanlık tarihinde en çok bilinen ve gözlemlenen kuyruklu yıldızlardan biridir. Antik çağlardan beri pek çok kültür tarafından gözlemlenmiş ve kaydedilmiştir. Düzenli aralıklarla geri dönüşü, astronom Edmund Halley'ye yörüngesini hesaplama ve geri dönüşünü tahmin etme imkanı sunmuş, bu da onu bilimsel tahminlerin ilk büyük başarılarından biri haline getirmiştir. Kuyruklu yıldızın kendisini bir sonraki görüşümüz 2061 yılı civarında olacak. Ancak her yıl Ekim ayında Orionid meteor yağmuru sayesinde, onun uzayda bıraktığı izleri takip ederek bu tarihi gök cismine bir selam gönderebiliyoruz. Bu, aslında geçmişle bugünü, insanlık tarihiyle kozmik zamanı birleştiren eşsiz bir kozmik bağdır.
Eğer bu anı ölümsüzleştirmek istersen, birkaç ipucu senin için:
Geniş Açılı Lens: Gökyüzünün geniş bir bölümünü yakalamak ve daha fazla meteor yakalama şansını artırmak için geniş açılı (14-24mm) bir lens kullanın.
Tripod: Uzun pozlama çekimleri için fotoğraf makinenizin sabit kalması şarttır. Sağlam bir tripod olmazsa olmazdır.
Manuel Ayarlar: Yüksek ISO (1600-6400 arası, kameranızın gürültü performansına göre), düşük f-stop değeri (f/2.8 veya daha düşük) ve 15-30 saniye arası pozlama süresi deneyin. Yüksek ISO, kameranızın ışığa daha duyarlı olmasını sağlarken, düşük f-stop daha fazla ışık girmesine olanak tanır. Uzun pozlama ise meteorların izlerini yakalamak için gereklidir.
Odaklama: Lensi manuel moda alıp sonsuzluğa odaklayın. Karanlıkta bunu yapmak zor olabilir, bu yüzden önceden pratik yapın veya uzak bir ışık kaynağına odaklayarak ayarlarınızı yapın.
Gece gözlemi yaparken güvenliğiniz ve konforunuz çok önemlidir. Unutmayın, keyifli bir deneyim için iyi hazırlanmak şart:
Sıcak Giyinin: Sonbahar geceleri aldatıcı olabilir. Kat kat giyinmek, termal içlikler, kalın çoraplar, şapka, eldiven ve su geçirmez bir dış katman, soğuktan korunmanızı sağlar.
Yanınıza İçercek ve Yiyecek Alın: Termos içinde sıcak çay veya kahve gibi içecekler ve atıştırmalıklar, uzun gözlem seanslarında enerjinizi yüksek tutar ve içten ısınmanıza yardımcı olur.
Güvenli Bir Yer Seçin: Mümkünse yalnız gitmek yerine arkadaşlarla gitmek veya bildiğiniz, güvenli, erişimi kolay bir alanı tercih etmek her zaman daha iyidir. Yeni bir yere gidiyorsanız, gündüz keşfetmekte fayda var.
Çevreye Duyarlı Olun: Gözlem yaparken doğaya zarar vermemeye özen gösterin, çöplerinizi yanınızda götürün ve ses kirliliği yaratmaktan kaçının.
Orionidler, sadece gökyüzündeki anlık ışık izleri değildir; onlar aynı zamanda bilim, tarih ve insanlığın evrenle olan derin bağının bir yansımasıdır. Halley'nin bize bıraktığı bu minik parçacıklar, her yıl bizi evrenin derinliklerine, kozmik bir dansa davet eder. Bu, şehir hayatının gürültüsünden ve karmaşasından uzaklaşıp, evrenin sonsuzluğunu ve kendi küçüklüğümüzü hissetmek için harika bir fırsattır. Bir an durup, milyarlarca yıl önceki bir kuyruklu yıldızın kalıntılarını izlemek, gerçekten büyüleyici ve düşündürücü bir deneyimdir. Gezegenimizin bu kozmik toz bulutundan geçerken yaşadığımız bu anlık karşılaşmalar, bize evrenin dinamik ve sürekli değişen doğasını hatırlatır.
Unutmayın, en iyi gözlem için ihtiyacınız olan tek şey karanlık bir gökyüzü, sabır ve biraz şans. Hava durumu tahminlerini takip edin, en uygun geceyi seçin ve bu muhteşem gökyüzü şöleninin tadını çıkarın. Belki de bir dilek tutmak için mükemmel bir an yakalarsınız! Gökyüzünüz açık, geceniz yıldızlarla dolsun!
                Python programlama dilinde while döngüsü, belirli bir koşul doğru olduğu sürece bir kod bloğunu tekrar tekrar yürütmek için kullanılır. Bu döngü yapısı, bir işlemin ne zaman duracağının belirli bir sayı yerine bir koşula bağlı olduğu senaryolarda oldukça etkilidir. Kullanıcı girdisi beklenmesi, bir veri yapısındaki öğelerin işlenmesi veya bir oyun döngüsünün sürdürülmesi gibi durumlarda program akışını kontrol etmek için vazgeçilmez bir araçtır.
Bir while döngüsünün genel yapısı aşağıdaki gibidir:
while koşul:
    # Koşul doğru olduğu sürece yürütülecek kod bloğu
    # Döngü değişkenini güncelleyen ifadeler
else:
    # Koşul yanlış olduğunda (ve break kullanılmadığında) yürütülecek kod bloğu
Bu yapıda:
while: Döngüyü başlatan anahtar kelimedir.
koşul: Her iterasyonun başında değerlendirilen bir boolean ifadedir. Bu koşul True olduğu sürece döngü devam eder.
: (İki nokta üst üste): Koşul ifadesinden sonra gelir ve döngü bloğunun başladığını belirtir.
Girintili Kod Bloğu: Koşul doğru olduğunda yürütülecek olan bir veya daha fazla satırdan oluşur. Python'da girinti (indentation) kod bloklarını tanımlamak için kullanılır.
else (İsteğe Bağlı): while döngüsüyle birlikte kullanılabilen isteğe bağlı bir bloktur. Döngü koşulu False olduğunda ve döngü break ifadesiyle sonlandırılmadığında yürütülür.
Aşağıdaki örnekler, while döngüsünün çeşitli kullanım senaryolarını göstermektedir.
Örnek 1: Basit Bir Sayıcı Döngüsü
Bu örnekte, bir değişkenin değeri belirli bir sayıya ulaşana kadar döngüyü sürdürüyoruz.
sayac = 0
while sayac < 5:
    print(f"Sayı: {sayac}")
    sayac += 1 # Sayacı her döngüde bir artırıyoruz
print("Döngü tamamlandı.")
Açıklama: sayac değişkeni 0'dan başlar ve her iterasyonda 1 artırılır. sayac < 5 koşulu False olana kadar döngü devam eder. Koşul False olduğunda döngüden çıkılır ve "Döngü tamamlandı." mesajı yazdırılır.
Örnek 2: break İfadesiyle Döngüyü Sonlandırma
break ifadesi, döngü koşulu hala True olsa bile döngüden hemen çıkmak için kullanılır.
i = 1
while True: # Sonsuz döngü başlatıyoruz
    print(f"i'nin değeri: {i}")
    if i == 3:
        print("3'e ulaşıldı, döngüden çıkılıyor.")
        break # Döngüyü sonlandır
    i += 1
print("Döngü dışı.")
Açıklama: while True ile teorik olarak sonsuz bir döngü başlatılır. Ancak, i değişkeni 3 olduğunda break ifadesi çalışır ve döngü anında sonlanır. Bu, belirli bir iç koşul karşılandığında döngüden çıkmak için kullanışlıdır.
Örnek 3: continue İfadesiyle İterasyonu Atlatma
continue ifadesi, mevcut iterasyonun geri kalanını atlayarak döngünün bir sonraki iterasyonuna geçmek için kullanılır.
j = 0
while j < 5:
    j += 1
    if j == 3:
        print(f"{j} atlanıyor...")
        continue # Bu iterasyonun geri kalanını atla
    print(f"j'nin değeri: {j}")
print("Döngü tamamlandı.")
Açıklama: j 3 olduğunda, "3 atlanıyor..." mesajı yazdırılır ve continue ifadesi çalışarak print(f"j'nin değeri: {j}") satırını atlar. Döngü bir sonraki iterasyondan devam eder.
Örnek 4: else Bloğu Kullanımı
else bloğu, döngü koşulu False olduğunda ve döngü break ile sonlandırılmadığında yürütülür.
k = 0
while k < 3:
    print(f"k'nin değeri: {k}")
    k += 1
else:
    print("While döngüsü doğal yollarla tamamlandı.")
Açıklama: Bu örnekte döngü k 3 olana kadar devam eder. Koşul False olduğunda else bloğu yürütülür. Eğer break ifadesi ile döngüden çıkılsaydı, else bloğu çalışmazdı.
Sonsuz Döngülerden Kaçının: while döngüsünde koşulun her zaman True kalması veya hiçbir zaman False olmaması durumunda sonsuz bir döngü oluşur. Bu, programınızın kilitlenmesine neden olabilir. Koşulu etkileyecek bir ifadeyi (örneğin, bir sayacı artıran veya bir kullanıcı girdisi alan) döngü içinde bulundurduğunuzdan emin olun.
Koşulu Güncelleyin: Döngü koşulunun sonunda False değerini almasını sağlayacak bir mekanizma mutlaka olmalıdır. Aksi takdirde sonsuz döngü oluşur.
break ve continue Dikkatli Kullanın: Bu ifadeler güçlüdür ve döngü akışını değiştirirler. Kodun okunabilirliğini azaltmamak için gerektiğinde ve anlaşılır bir şekilde kullanılmalıdır.
else Bloğunun Davranışı: else bloğu, yalnızca while döngüsü koşulunun False olmasıyla doğal bir şekilde sona erdiğinde yürütülür. Eğer döngü bir break ifadesiyle kesilirse, else bloğu yürütülmez.
for vs. while: Belirli bir öğe dizisi üzerinde (örneğin bir liste veya dize) yineleme yapmanız gerektiğinde genellikle for döngüsü daha uygundur. while döngüsü ise, döngünün kaç kez çalışacağını önceden bilmediğiniz, belirli bir koşulun karşılanmasını beklediğiniz durumlarda tercih edilir.
                Modern yazılım geliştirmede, beklenmedik durumları ve hataları etkili bir şekilde yönetmek, uygulamanın sağlamlığı ve sürdürülebilirliği için kritik öneme sahiptir. PHP, bu tür durumları ele almak için güçlü bir istisna yönetimi mekanizması sunar. Bu mekanizma, programın normal akışını bozmadan, hata koşullarının yakalanmasını ve uygun şekilde işlenmesini sağlar. PHP'deki öntanımlı istisnalar, çeşitli hata senaryoları için standartlaştırılmış çözümler sunarak geliştiricilerin daha temiz, okunaklı ve bakımı kolay kod yazmasına yardımcı olur.
PHP'de istisnaları kullanmanın temel yapısı, bir kod bloğunu hata açısından izlemek için try, yakalanan istisnayı işlemek için catch ve isteğe bağlı olarak, try ve catch bloklarının yürütülmesinden sonra her zaman çalıştırılacak kodu tanımlamak için finally anahtar kelimelerinden oluşur.
İstisna yönetiminin temel bileşenleri ve öntanımlı istisna sınıfları şunlardır:
try Bloğu: İstisna fırlatma potansiyeli olan kod, bu bloğun içine yerleştirilir. Eğer bu blok içinde bir istisna fırlatılırsa, normal akış kesilir ve kontrol uygun catch bloğuna geçer.
catch Bloğu: Bir try bloğu içinde fırlatılan bir istisnayı yakalamak için kullanılır. catch anahtar kelimesi, parantez içinde yakalanacak istisna türünü (sınıfını) ve bu istisnayı temsil edecek bir değişkeni (genellikle $e) alır. PHP, istisna hiyerarşisinde fırlatılan istisnayla eşleşen ilk catch bloğunu çalıştırır. Genel Exception sınıfı en genel istisna türüdür ve tüm istisnaları yakalar. Daha spesifik istisnalar için, bu sınıfın alt sınıfları kullanılmalıdır.
finally Bloğu (PHP 5.5+): Bu blok içindeki kod, try ve catch bloklarının yürütülmesinden sonra her zaman çalışır, bir istisna fırlatılsa da fırlatılmasa da. Kaynakları serbest bırakmak veya temizlik işlemleri yapmak için idealdir.
throw Anahtar Kelimesi: Manuel olarak bir istisna fırlatmak için kullanılır. Bir istisna fırlatıldığında, programın normal akışı durur ve kontrol, fırlatılan istisnayı yakalamaya uygun bir catch bloğu arar.
Exception Sınıfı: PHP'deki tüm istisna sınıflarının temelidir. Kendi özel istisna sınıflarınızı oluştururken bu sınıftan türetebilirsiniz. Exception sınıfı; hata mesajı, hata kodu, dosya adı ve satır numarası gibi önemli bilgilere erişim sağlayan metotlara sahiptir.
Öntanımlı İstisna Sınıfları: PHP, çeşitli senaryolar için bir dizi öntanımlı istisna sınıfı sunar. Bunlar, Exception sınıfının alt sınıflarıdır ve belirli hata koşullarını daha spesifik olarak ele almanızı sağlar. Örnekler arasında şunlar bulunur:
InvalidArgumentException: Bir fonksiyona veya metoda geçersiz bir argüman iletildiğinde fırlatılır.
LengthException: Bir değerin uzunluğu uygun olmadığında fırlatılır (örn. bir string'in veya dizinin).
OutOfRangeException: İstenen değerin geçerli bir aralık dışında olduğunu belirtir.
RuntimeException: Çalışma zamanında ortaya çıkan hatalar için genel bir istisnadır. Diğer, daha spesifik RuntimeException alt sınıfları da mevcuttur (örn. BadFunctionCallException, BadMethodCallException).
TypeError: Bir fonksiyona veya metoda yanlış türde bir argüman iletildiğinde fırlatılır (PHP 7+).
Aşağıdaki örnekler, öntanımlı istisnaların PHP uygulamalarında nasıl kullanılabileceğini göstermektedir.
Örnek 1: Temel try-catch kullanımı
";
    echo "10 / 0 = " . bol(10, 0) . "
"; // Bu satır bir istisna fırlatır
    echo "Bu satır asla çalışmayacak.
";
} catch (InvalidArgumentException $e) {
    echo "Bir hata yakalandı: " . $e->getMessage() . "
";
    echo "Hata kodu: " . $e->getCode() . "
";
    echo "Hata dosyası: " . $e->getFile() . " satır " . $e->getLine() . "
";
} finally {
    echo "Bölme işlemi denemesi tamamlandı.
";
}
echo "Program devam ediyor.
";
?>Bu örnekte, bol fonksiyonu sıfıra bölme durumunda bir InvalidArgumentException fırlatır. try bloğu bu fonksiyonu çağırır ve istisna oluştuğunda kontrol catch bloğuna geçer. finally bloğu ise istisna fırlatılsa da fırlatılmasa da çalışır.
Örnek 2: Birden Fazla catch Bloğu ile Spesifik İstisnaları Yakalama
 2) {
        throw new OutOfRangeException("Mod değeri 0 ile 2 arasında olmalıdır.");
    }
    switch ($mod) {
        case 0: return strtoupper($veri);
        case 1: return strtolower($veri);
        case 2: return strrev($veri);
    }
    return $veri; // Bu satıra asla ulaşılmamalı
}
try {
    echo islemYap("Merhaba", 1) . "
";
    echo islemYap("", 0) . "
"; // InvalidArgumentException fırlatır
    echo islemYap("Dunya", 5) . "
"; // Bu satıra ulaşılamaz
} catch (InvalidArgumentException $e) {
    echo "Geçersiz argüman hatası: " . $e->getMessage() . "
";
} catch (OutOfRangeException $e) {
    echo "Aralık dışı hata: " . $e->getMessage() . "
";
} catch (Exception $e) { // Tüm diğer istisnaları yakalar
    echo "Genel bir hata oluştu: " . $e->getMessage() . "
";
} finally {
    echo "İşlem denemesi sona erdi.
";
}
?>Bu örnek, farklı istisna türlerini yakalamak için birden fazla catch bloğunun nasıl kullanılacağını gösterir. PHP, istisna hiyerarşisinde en spesifik olandan en genele doğru sıralama yapılmasını önerir. Bu şekilde, önce InvalidArgumentException ve OutOfRangeException gibi özel durumlar yakalanır, ardından Exception ile diğer tüm istisnalar ele alınır.
Spesifik İstisnaları Yakalayın: Mümkün olduğunca spesifik istisna sınıflarını yakalayın (örn. InvalidArgumentException yerine Exception kullanmak yerine). Bu, hata koşullarını daha doğru bir şekilde tanımlamanıza ve işlemenize olanak tanır.
İstisna Hiyerarşisi: Birden fazla catch bloğu kullanırken, en spesifik istisnaları önce, en genel istisnayı (Exception) ise en sona yerleştirin. Aksi takdirde, genel istisna bloğu tüm istisnaları yakalayabilir ve daha spesifik bloklara asla ulaşılamaz.
finally Bloğunu Kullanın: Kaynakları serbest bırakmak (örn. dosya tanıtıcıları, veritabanı bağlantıları) veya temizlik işlemleri yapmak için finally bloğunu kullanın. Bu, kodun hem başarıyla tamamlandığı hem de bir istisna fırlatıldığı durumlarda tutarlılık sağlar.
Kendi İstisna Sınıflarınızı Oluşturun: PHP'nin öntanımlı istisnaları çoğu durumu kapsasa da, uygulamanıza özgü hata durumları için Exception sınıfından türeyen kendi istisna sınıflarınızı oluşturmanız, kodunuzu daha anlamlı ve yönetilebilir hale getirebilir.
Hata Mesajlarını Açık Tutun: İstisnaları fırlatırken, sorunun ne olduğunu ve nasıl düzeltilebileceğini açıklayan net ve bilgilendirici hata mesajları sağlayın. Bu, hata ayıklama sürecini büyük ölçüde hızlandırır.
İstisnaları Yutmaktan Kaçının: Bir istisnayı yakalayıp hiçbir şey yapmamak (boş bir catch bloğu) yaygın bir hatadır. Bu, hataların göz ardı edilmesine ve uygulamanızda gizli sorunlara yol açabilir. Her zaman yakaladığınız bir istisnayı işleyin (örn. loglayın, kullanıcıya bildirin veya yeniden fırlatın).
                JavaScript, web sayfalarını etkileşimli hale getirmek için kullanıcı eylemlerine veya tarayıcı olaylarına tepki verme yeteneği sağlar. Bu tepkiler, 'olaylar' (events) aracılığıyla yönetilir. Bir kullanıcı bir düğmeye tıkladığında, bir form gönderdiğinde veya fare imlecini bir öğenin üzerine getirdiğinde, JavaScript bu olayları dinleyebilir ve tanımlanan işlevleri çalıştırabilir. Bu makale, JavaScript olaylarının temel kullanımını, sözdizimini ve pratik uygulamalarını detaylandıracaktır.
JavaScript'te bir DOM öğesine olay dinleyicisi eklemenin en yaygın ve önerilen yolu EventTarget.addEventListener() metodunu kullanmaktır. Bu metod, belirli bir olay türü gerçekleştiğinde çalıştırılacak bir işlevi (handler) kaydeder.
target.addEventListener(event, listener, [options]);
EventTarget.addEventListener() metodu üç ana argüman alır:
target: Olay dinleyicisinin ekleneceği DOM öğesidir. Örneğin, bir düğme, bir metin alanı veya belge kendisi olabilir.
event: Dinlenecek olayın adını belirten bir stringdir. Örnekler arasında 'click', 'mouseover', 'keydown', 'submit' bulunur. Olay adları büyük/küçük harfe duyarlıdır ve genellikle küçük harfle yazılır.
listener: Belirtilen olay gerçekleştiğinde çağrılacak olan işlevdir (callback fonksiyonu). Bu işlev, olayın kendisi hakkında bilgi içeren bir Event nesnesini argüman olarak alabilir.
options (isteğe bağlı): Olay dinleyicisinin davranışını yapılandıran bir nesnedir. En yaygın seçenekler şunlardır:
capture: Bir boolean değeridir. true ise, olay yakalama (capturing) aşamasında, false ise olay kabarcıklanma (bubbling) aşamasında tetiklenir. Varsayılan değer false'tur.
once: Bir boolean değeridir. true ise, olay dinleyicisi olay bir kez tetiklendikten sonra otomatik olarak kaldırılır. Varsayılan değer false'tur.
passive: Bir boolean değeridir. true ise, dinleyicinin event.preventDefault() çağrısı yapmayacağını belirtir. Bu, özellikle kaydırma (scrolling) olaylarında performansı artırabilir. Varsayılan değer false'tur.
Aşağıdaki örnekler, JavaScript olaylarının çeşitli kullanım senaryolarını göstermektedir.
Bir HTML düğmesine tıklandığında konsola bir mesaj yazdıran basit bir örnek.
Bir metin giriş alanındaki değer her değiştiğinde bu değişikliği yakalayan bir örnek.
Girilen Değer: 
Bir öğenin üzerine fare imleci geldiğinde ve ayrıldığında farklı işlevleri çalıştıran bir örnek.
    Fareyi Üzerime Getir
Dinleyiciyi Kaldırma: Performans ve bellek sızıntılarını önlemek için, özellikle tek seferlik olaylarda veya bileşenler kaldırıldığında EventTarget.removeEventListener() metodunu kullanarak olay dinleyicilerini kaldırmak önemlidir. addEventListener ile aynı argümanlar kullanılmalıdır (aynı fonksiyon referansı dahil).
Olay Nesnesi: Olay dinleyici fonksiyonuna otomatik olarak geçirilen Event nesnesi, olayın türü (event.type), hedefi (event.target), tuş bilgisi (event.key, event.keyCode) gibi değerli bilgiler içerir.
event.preventDefault(): Bazı olayların varsayılan tarayıcı davranışları vardır (örneğin, bir bağlantıya tıklamak sizi başka bir sayfaya götürür veya bir form göndermek sayfayı yeniler). Bu varsayılan davranışları durdurmak için olay nesnesi üzerindeki event.preventDefault() metodunu kullanabilirsiniz.
Olay Kabarcıklanması ve Yakalama: Olaylar, DOM ağacında yukarı (kabarcıklanma) veya aşağı (yakalama) doğru yayılır. addEventListener metodunun üçüncü argümanı (veya options nesnesindeki capture özelliği) bu davranışı kontrol etmenizi sağlar. Çoğu durumda, varsayılan kabarcıklanma davranışı yeterlidir.
this Anahtar Kelimesi: Bir olay dinleyicisi içinde this anahtar kelimesi, olayın gerçekleştiği DOM öğesini (event.currentTarget) ifade eder. Ancak, arrow fonksiyonlar kullanıldığında this, tanımlandığı kapsayıcı kapsamı korur.
                SQL (Yapısal Sorgu Dili), veritabanlarından bilgi almak ve manipüle etmek için kullanılan standart bir dildir. Bu güçlü dilin temel bileşenlerinden biri olan AVG() fonksiyonu, belirli bir sayısal sütundaki değerlerin ortalamasını hesaplamak için kullanılır. Veri analizi ve raporlama süreçlerinde vazgeçilmez bir araç olan AVG(), büyük veri kümelerinden anlamlı istatistikler çıkarmayı sağlar. Bu makalede, AVG() fonksiyonunun sözdizimini, detaylı kullanımını ve pratik örneklerini inceleyeceğiz.
AVG() fonksiyonunun genel sözdizimi aşağıdaki gibidir:
SELECT AVG(sütun_adı)
FROM tablo_adı
WHERE koşul;Alternatif olarak, tüm benzersiz değerlerin ortalamasını almak için DISTINCT anahtar kelimesi ile birlikte kullanılabilir:
SELECT AVG(DISTINCT sütun_adı)
FROM tablo_adı
WHERE koşul;SELECT: Sorgunun anahtar kelimesidir ve veritabanından veri almak için kullanılır.
AVG(): Ortalamayı hesaplamak için kullanılan SQL toplama (aggregate) fonksiyonudur.
sütun_adı: Ortalaması alınacak sayısal sütunun adıdır. Bu sütun INTEGER, DECIMAL veya FLOAT gibi sayısal bir veri tipine sahip olmalıdı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 satırlar üzerinde ortalama hesaplaması yapılmasını sağlar. Bu olmadan, tüm tablodaki ilgili sütunun ortalaması hesaplanır.
DISTINCT: İsteğe bağlı bir anahtar kelimedir. Eğer kullanılırsa, AVG() fonksiyonu yalnızca belirtilen sütundaki benzersiz değerlerin ortalamasını hesaplar. Tekrar eden değerler hesaplamaya dahil edilmez.
Aşağıdaki örneklerde, bir Urunler tablosunun olduğu varsayılmaktadır. Bu tabloda UrunID (INTEGER), UrunAdi (VARCHAR), Fiyat (DECIMAL) ve StokAdedi (INTEGER) gibi sütunlar bulunmaktadır.
Örnek 1: Tüm Ürünlerin Ortalama Fiyatını Hesaplama
Bu sorgu, Urunler tablosundaki tüm ürünlerin ortalama fiyatını döndürecektir.
SELECT AVG(Fiyat) AS OrtalamaFiyat
FROM Urunler;Örnek 2: Belirli Bir Koşula Göre Ortalama Fiyatı Hesaplama
Bu örnek, fiyatı 50 TL'den yüksek olan ürünlerin ortalama fiyatını bulur.
SELECT AVG(Fiyat) AS YuksekFiyatliOrtalama
FROM Urunler
WHERE Fiyat > 50.00;Örnek 3: Farklı Ürün Kategorilerine Göre Ortalama Fiyatı Hesaplama
Eğer Urunler tablosunda bir Kategori sütunu olsaydı, her kategori için ortalama fiyatı aşağıdaki gibi hesaplayabilirdik. (Bu örnekte Urunler tablosuna Kategori sütununun eklendiği varsayılmıştır.)
SELECT Kategori, AVG(Fiyat) AS KategoriOrtalamaFiyat
FROM Urunler
GROUP BY Kategori;Örnek 4: Benzersiz Stok Adetlerinin Ortalamasını Hesaplama
Bu sorgu, StokAdedi sütunundaki benzersiz değerlerin ortalamasını hesaplar. Eğer aynı stok adedine sahip birden fazla ürün varsa, bu değer yalnızca bir kez hesaba katılır.
SELECT AVG(DISTINCT StokAdedi) AS BenzersizStokOrtalamasi
FROM Urunler;NULL Değerler: AVG() fonksiyonu, hesaplamalarına NULL değerleri dahil etmez. Yani, bir sütunda NULL değerler varsa, bunlar ortalama hesaplamasından otomatik olarak çıkarılır.
Sayısal Olmayan Sütunlar: AVG() fonksiyonu yalnızca sayısal veri tipleriyle çalışır. Sayısal olmayan bir sütun üzerinde kullanılmaya çalışılırsa hata döndürebilir veya beklenmeyen sonuçlar üretebilir.
GROUP BY ile Kullanım: AVG() genellikle GROUP BY yan tümcesiyle birlikte kullanılır. Bu, verileri belirli gruplara ayırarak her grup için ayrı ayrı ortalama hesaplamaları yapılmasına olanak tanır.
DISTINCT Kullanımı: DISTINCT anahtar kelimesi, yalnızca benzersiz değerlerin ortalamasını almak istediğinizde faydalıdır. Ancak, bu kullanımı sorgu performansını etkileyebilir, bu nedenle dikkatli kullanılmalıdır.
Sıfıra Bölme Hatası: Eğer ortalaması alınacak hiçbir satır yoksa (örneğin, WHERE koşulu hiçbir satırı eşleştirmiyorsa), AVG() fonksiyonu bazı veritabanı sistemlerinde NULL döndürebilirken, bazılarında sıfıra bölme hatasına benzer bir durumla karşılaşılabilir. Genellikle NULL döndürmesi beklenen davranıştır.
                Python, okunabilirliği ve sadeliği ile bilinen güçlü bir programlama dilidir. Birçok programlama görevinde tekrarlayan işlemler, döngüler aracılığıyla etkin bir şekilde gerçekleştirilir. Python'da, belirli bir dizi (liste, demet, dize, küme, sözlük veya diğer yinelenebilir nesneler) üzerinde yineleme yapmak için for döngüsü kullanılır. Bu makale, Python'daki for döngüsünün temel yapısını, kullanımını ve pratik örneklerini detaylı bir şekilde açıklamaktadır.
Python'da for döngüsünün genel sözdizimi aşağıdaki gibidir:
for eleman in yinelenebilir_nesne:
    # Döngü bloğu
    # Her yinelemede çalışacak kod buraya yazılır
    # 'eleman' değişkeni her adımda yinelenebilir_nesnenin bir sonraki öğesini alır
Yukarıdaki sözdiziminde yer alan her bir bileşenin işlevi şöyledir:
for: Python'da bir döngü başlatmak için kullanılan anahtar kelimedir.
eleman: Her yinelemede, yinelenebilir_nesne'den alınan mevcut öğeyi temsil eden bir değişkendir. Bu değişkenin adı isteğe bağlıdır ve genellikle döngü içinde işlenecek öğenin anlamını yansıtır.
in: eleman değişkeninin hangi yinelenebilir_nesne içinde aranacağını belirtmek için kullanılan bir anahtar kelimedir.
yinelenebilir_nesne: Üzerinde yineleme yapılacak olan bir koleksiyon veya dizidir. Bu, bir list, tuple, string, set, dictionary veya özel olarak yinelenebilir hale getirilmiş herhangi bir nesne olabilir.
: (İki nokta üst üste): for döngüsü başlığının sonunu işaret eder ve döngü bloğunun başladığını belirtir.
Döngü bloğu (girintili kod): for döngüsünün her adımında çalıştırılacak kod satırlarıdır. Python'da kod blokları girintileme ile tanımlanır. Tüm döngü bloğu aynı seviyede girintili olmalıdır.
Aşağıdaki örnekler, for döngüsünün farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Örnek 1: Liste Öğeleri Üzerinde Yineleme
Bir liste içindeki her bir sayıyı ekrana yazdırma.
sayilar = [1, 2, 3, 4, 5]
for sayi in sayilar:
    print(sayi)
Çıktı:
1
2
3
4
5
Örnek 2: Bir Dize Üzerinde Yineleme
Bir dizedeki her karakteri tek tek yazdırma.
kelime = "Python"
for karakter in kelime:
    print(karakter)
Çıktı:
P
y
t
h
o
n
Örnek 3: range() Fonksiyonu ile Belirli Sayıda Yineleme
range() fonksiyonu, belirli bir aralıkta sayı dizileri oluşturmak için kullanılır ve for döngüleriyle sıkça tercih edilir.
# 0'dan 4'e kadar (5 dahil değil) sayılar
for i in range(5):
    print(i)
Çıktı:
0
1
2
3
4
Örnek 4: Sözlük Öğeleri Üzerinde Yineleme
Bir sözlüğün anahtarları, değerleri veya hem anahtarları hem de değerleri üzerinde yineleme yapılabilir.
ayarlar = {"kullanici": "admin", "dil": "Türkçe", "tema": "koyu"}
print("Sözlük Anahtarları:")
for anahtar in ayarlar: # Varsayılan olarak anahtarları yineler
    print(anahtar)
print("\nSözlük Değerleri:")
for deger in ayarlar.values():
    print(deger)
print("\nSözlük Öğeleri (Anahtar-Değer çiftleri):")
for anahtar, deger in ayarlar.items():
    print(f"{anahtar}: {deger}")
Çıktı:
Sözlük Anahtarları:
kullanici
dil
tema
Sözlük Değerleri:
admin
Türkçe
koyu
Sözlük Öğeleri (Anahtar-Değer çiftleri):
kullanici: admin
dil: Türkçe
tema: koyu
Örnek 5: enumerate() Fonksiyonu ile İndeks ve Değere Erişim
Bazen bir koleksiyonun öğeleri üzerinde yinelerken hem öğenin kendisine hem de indeksine ihtiyaç duyulur. enumerate() fonksiyonu bu durumu kolaylaştırır.
meyveler = ["elma", "muz", "çilek"]
for indeks, meyve in enumerate(meyveler):
    print(f"{indeks}: {meyve}")
Çıktı:
0: elma
1: muz
2: çilek
Girintileme Önemlidir: Python'da kod blokları girintileme ile tanımlanır. for döngüsünün altına yazılan tüm kod satırlarının aynı girinti seviyesinde olması gerektiğini unutmayın. Yanlış girintileme IndentationError hatasına yol açacaktır.
Yinelenebilir Nesneler: for döngüsü sadece yinelenebilir (iterable) nesneler üzerinde çalışır. Sayılar veya boolean değerler gibi yinelenebilir olmayan nesneleri doğrudan for döngüsünde kullanamazsınız.
Döngü Kesme (break): Bir döngüyü belirli bir koşul sağlandığında tamamen sonlandırmak için break anahtar kelimesini kullanabilirsiniz.
Döngü Atlatma (continue): Bir döngünün mevcut yinelemesini atlayıp bir sonraki yinelemeye geçmek için continue anahtar kelimesini kullanabilirsiniz.
Performans: Büyük veri kümeleri üzerinde çalışırken, for döngüleri yerine list comprehension veya generator ifadelerini kullanmak performansı artırabilir. Ancak, temel kullanım için for döngüleri oldukça etkilidir.
                Nesne yönelimli programlama (OOP) prensipleri, modern yazılım geliştirmede kodun yapısını, okunabilirliğini ve sürdürülebilirliğini sağlamak için kritik öneme sahiptir. PHP, bu prensipleri desteklemek adına arayüzler (interfaces) ve soyut sınıflar (abstract classes) gibi güçlü yapılar sunar. Bu yapılar, sınıflar arasında belirli davranış sözleşmeleri tanımlayarak veya ortak bir temel sağlayarak esnek ve genişletilebilir sistemler oluşturulmasına olanak tanır. Bu makale, PHP'deki arayüzlerin ve soyut sınıfların detaylı kullanımını, sözdizimini ve pratik örneklerini ele alacaktır.
PHP'de arayüzler ve soyut sınıflar, belirli anahtar kelimeler kullanılarak tanımlanır ve diğer sınıflar tarafından uygulanır veya miras alınır. Aşağıda temel sözdizimleri gösterilmektedir.
ozellik = $ozellik;
    }
    // Soyut metot: Gövdesi yoktur, alt sınıflar tarafından uygulanmalıdır.
    abstract public function soyutMetot(): string;
    // Somut metot: Gövdesi vardır, alt sınıflar tarafından miras alınır veya geçersiz kılınabilir.
    public function somutMetot(): string {
        return "Somut metot çalıştı: " . $this->ozellik;
    }
}
// Arayüz Uygulayan Sınıf
class SomutSinifA implements ArayuzAdi {
    public function metotBir(string $parametre): bool {
        // Metot uygulamasını buraya yazın
        return true;
    }
    public function metotIki(): void {
        // Metot uygulamasını buraya yazın
    }
}
// Soyut Sınıfı Miras Alan Sınıf
class SomutSinifB extends SoyutSinifAdi {
    public function soyutMetot(): string {
        return "Soyut metot SomutSinifB tarafından uygulandı: " . $this->ozellik;
    }
}
?>
Arayüzler ve soyut sınıflar, farklı senaryolar için tasarlanmış olsalar da, her ikisi de soyutlama ve polimorfizm prensiplerini destekler.
Bir arayüz, bir sınıfın sahip olması gereken metotları tanımlayan bir "sözleşme" görevi görür. Arayüzler, bir sınıfın dış dünyaya hangi davranışları sergileyeceğini belirtir, ancak bu davranışların nasıl uygulanacağını belirtmez.
Tanım: Bir arayüz interface anahtar kelimesiyle tanımlanır. İçerisinde yalnızca metot imzaları ve sabitler bulunabilir.
Metotlar: Arayüzdeki tüm metotlar otomatik olarak public ve soyuttur (yani gövdeleri yoktur). Metot imzaları, parametre tiplerini ve dönüş tiplerini (PHP 7.0 ve sonrası) içerebilir.
Özellikler: Arayüzler herhangi bir özellik (member variable) tanımlayamaz.
Sabitler: Arayüzler sabitler tanımlayabilir. Bu sabitlere ArayuzAdi::SABIT_ADI şeklinde erişilebilir.
Uygulama: Bir sınıf, bir arayüzü implements anahtar kelimesiyle uygular. Bir sınıf birden fazla arayüzü uygulayabilir (örneğin: class MyClass implements InterfaceA, InterfaceB).
Zorunluluk: Bir arayüzü uygulayan sınıf, arayüzdeki tüm metotları belirtilen imzalarla (public olarak) uygulamak zorundadır. Aksi takdirde bir fatal hata oluşur.
Soyut sınıflar, bir veya daha fazla soyut metot içerebilen veya içermeyen, doğrudan örneği oluşturulamayan sınıflardır. Genellikle, bir grup ilgili sınıf için ortak bir temel (base class) sağlamak amacıyla kullanılırlar.
Tanım: Bir soyut sınıf abstract class anahtar kelimesiyle tanımlanır.
Örneklenme: Soyut sınıfların doğrudan bir örneği (objesi) oluşturulamaz. Yalnızca alt sınıfları (concrete classes) örneklenebilir.
Metotlar: Soyut sınıflar hem soyut metotlar (abstract public function metotAdi();) hem de somut metotlar (gövdesi olan metotlar) içerebilir. Soyut metotların gövdesi yoktur ve alt sınıflar tarafından uygulanması zorunludur. Somut metotlar ise alt sınıflar tarafından miras alınır ve isteğe bağlı olarak geçersiz kılınabilir.
Erişim Belirleyiciler: Soyut metotlar public veya protected olabilir ancak private olamaz. Alt sınıflar soyut metotları uygularken aynı veya daha az kısıtlayıcı bir erişim belirleyici kullanamazlar (yani protected soyut metot public olarak uygulanabilir ama private olarak uygulanamaz).
Özellikler: Soyut sınıflar özellikler (member variables) tanımlayabilir. Bu özellikler public, protected veya private olabilir.
Kalıtım: Bir sınıf, bir soyut sınıfı extends anahtar kelimesiyle miras alır. PHP tekli kalıtımı desteklediği için bir sınıf yalnızca bir soyut sınıfı miras alabilir.
Zorunluluk: Soyut bir sınıfı miras alan alt sınıf, soyut sınıftaki tüm soyut metotları uygulamak zorundadır. Aksi takdirde, alt sınıfın kendisi de soyut olarak tanımlanmalıdır.
Aşağıdaki örnekler, arayüzlerin ve soyut sınıfların gerçek dünya senaryolarında nasıl kullanılabileceğini göstermektedir.
Farklı loglama mekanizmalarını (dosyaya, veritabanına, konsola) destekleyen bir sistem düşünelim. Tüm loglama sınıflarının aynı log() metoduna sahip olmasını bir arayüz ile sağlayabiliriz.
filePath = $filePath;
    }
    public function log(string $message): void {
        file_put_contents($this->filePath, date('Y-m-d H:i:s') . " - " . $message . PHP_EOL, FILE_APPEND);
        echo "Dosyaya loglandı: " . $message . "
";
    }
}
class DatabaseLogger implements Logger {
    public function log(string $message): void {
        // Veritabanına loglama işlemleri burada yapılır
        echo "Veritabanına loglandı: " . $message . "
";
    }
}
class ConsoleLogger implements Logger {
    public function log(string $message): void {
        echo "Konsola loglandı: " . $message . "
";
    }
}
// Loglama işlemini gerçekleştiren bir fonksiyon
function processLog(Logger $logger, string $message): void {
    $logger->log($message);
}
// Kullanım
$fileLogger = new FileLogger('application.log');
$dbLogger = new DatabaseLogger();
$consoleLogger = new ConsoleLogger();
processLog($fileLogger, "Uygulama başlatıldı.");
processLog($dbLogger, "Kullanıcı girişi başarılı.");
processLog($consoleLogger, "Hata oluştu.");
// Çıktı:
// Dosyaya loglandı: Uygulama başlatıldı.
// Veritabanına loglandı: Kullanıcı girişi başarılı.
// Konsola loglandı: Hata oluştu.
?>
Bu örnekte, Logger arayüzü, loglama yeteneğine sahip tüm sınıfların log() metodunu içermesi gerektiğini garanti eder. Bu sayede, processLog() fonksiyonu herhangi bir Logger tipindeki objeyi kabul edebilir, bu da esneklik ve kod tekrarı önleme sağlar.
Bir e-ticaret uygulamasında farklı ödeme geçitleri (Kredi Kartı, PayPal, Havale) olabilir. Bu geçitlerin hepsinin ortak bazı işlevleri (örneğin işlem ücreti hesaplama) ve kendine özgü işlevleri (ödeme onayı) bulunur. Ortak işlevleri soyut bir sınıfta toplayabiliriz.
transactionFeeRate = $rate;
    }
    // Ortak somut metot
    public function calculateFee(float $amount): float {
        return $amount * $this->transactionFeeRate;
    }
    // Soyut metot: Her alt sınıfın kendi ödeme işlemini tanımlaması gerekir
    abstract public function processPayment(float $amount): bool;
    // Soyut metot: Her alt sınıfın kendi geri ödeme işlemini tanımlaması gerekir
    abstract public function refundPayment(string $transactionId): bool;
}
class CreditCardGateway extends PaymentGateway {
    public function __construct() {
        parent::__construct(0.025); // %2.5 işlem ücreti
    }
    public function processPayment(float $amount): bool {
        echo "Kredi kartı ile " . $amount . " TL ödeme işlemi başlatıldı. Ücret: " . $this->calculateFee($amount) . " TL.
";
        // Kredi kartı API'si ile ödeme mantığı
        return true;
    }
    public function refundPayment(string $transactionId): bool {
        echo "Kredi kartı işlemi " . $transactionId . " için geri ödeme yapıldı.
";
        // Kredi kartı API'si ile geri ödeme mantığı
        return true;
    }
}
class PayPalGateway extends PaymentGateway {
    public function __construct() {
        parent::__construct(0.03); // %3 işlem ücreti
    }
    public function processPayment(float $amount): bool {
        echo "PayPal ile " . $amount . " TL ödeme işlemi başlatıldı. Ücret: " . $this->calculateFee($amount) . " TL.
";
        // PayPal API'si ile ödeme mantığı
        return true;
    }
    public function refundPayment(string $transactionId): bool {
        echo "PayPal işlemi " . $transactionId . " için geri ödeme yapıldı.
";
        // PayPal API'si ile geri ödeme mantığı
        return true;
    }
}
// Kullanım
$creditCard = new CreditCardGateway();
$paypal = new PayPalGateway();
$creditCard->processPayment(100.00);
$paypal->processPayment(250.00);
$creditCard->refundPayment("CC12345");
$paypal->refundPayment("PP67890");
// Çıktı:
// Kredi kartı ile 100 TL ödeme işlemi başlatıldı. Ücret: 2.5 TL.
// PayPal ile 250 TL ödeme işlemi başlatıldı. Ücret: 7.5 TL.
// Kredi kartı işlemi CC12345 için geri ödeme yapıldı.
// PayPal işlemi PP67890 için geri ödeme yapıldı.
?>
Burada PaymentGateway soyut sınıfı, tüm ödeme geçitleri için ortak olan calculateFee() metodunu ve her geçidin kendi içinde uygulaması gereken processPayment() ve refundPayment() soyut metotlarını tanımlar. Bu, kod tekrarını azaltır ve ödeme geçidi eklemeyi standartlaştırır.
Bir soyut sınıfın bir arayüzü uygulaması ve bu soyut sınıfı miras alan somut sınıfların arayüzdeki metotları uygulaması da mümkündür. Bu, hem bir sözleşme sağlamak hem de belirli bir varsayılan uygulama veya ortak davranış seti sunmak için güçlü bir kombinasyondur.
sender = $sender;
    }
    // Soyut metot: Arayüzden miras alınır ve alt sınıflar tarafından uygulanmalıdır
    abstract public function send(string $recipient, string $message): bool;
    // Ortak bir somut metot: Tüm bildirim sistemlerinde bulunabilir
    public function getSender(): string {
        return $this->sender;
    }
}
// Somut sınıf: E-posta ile bildirim gönderen bir sistem
class EmailNotifier extends AbstractNotifier {
    public function send(string $recipient, string $message): bool {
        echo "E-posta gönderiliyor: Kimden: " . $this->getSender() . ", Kime: " . $recipient . ", Mesaj: '" . $message . "'
";
        // Gerçek e-posta gönderme mantığı buraya gelir
        return true;
    }
}
// Somut sınıf: SMS ile bildirim gönderen bir sistem
class SmsNotifier extends AbstractNotifier {
    public function send(string $recipient, string $message): bool {
        echo "SMS gönderiliyor: Kimden: " . $this->getSender() . ", Kime: " . $recipient . ", Mesaj: '" . $message . "'
";
        // Gerçek SMS gönderme mantığı buraya gelir
        return true;
    }
}
// Kullanım
$emailNotifier = new EmailNotifier("info@example.com");
$smsNotifier = new SmsNotifier("5551234567");
$emailNotifier->send("john.doe@example.com", "Hesabınız başarıyla oluşturuldu.");
$smsNotifier->send("5559876543", "Siparişiniz yola çıktı.");
// Çıktı:
// E-posta gönderiliyor: Kimden: info@example.com, Kime: john.doe@example.com, Mesaj: 'Hesabınız başarıyla oluşturuldu.'
// SMS gönderiliyor: Kimden: 5551234567, Kime: 5559876543, Mesaj: 'Siparişiniz yola çıktı.'
?>
Bu örnekte, Notifier arayüzü tüm bildirim sistemlerinin send() metoduna sahip olmasını sağlayan bir sözleşme sunar. AbstractNotifier soyut sınıfı ise bu arayüzü uygulayarak send() metodunu soyut bırakır, ancak tüm bildirim sistemleri için ortak bir gönderen özelliği ve getSender() metodu sağlar. EmailNotifier ve SmsNotifier sınıfları, AbstractNotifier'ı miras alarak hem Notifier arayüzünün gereksinimlerini yerine getirir hem de ortak getSender() metodunu kullanır.
Amaç Farkı: Arayüzler "ne yapılması gerektiğini" tanımlayan sözleşmelerdir. Soyut sınıflar ise "kim olduğunu" ve "neyin ortak olduğunu" tanımlayan kısmi uygulamalardır.
Çoklu Uygulama vs. Tekli Kalıtım: Bir sınıf birden fazla arayüzü uygulayabilir (implements InterfaceA, InterfaceB), bu PHP'de çoklu kalıtımı simüle etmenin bir yoludur. Ancak bir sınıf yalnızca bir soyut sınıfı miras alabilir (extends AbstractClass).
Metot Erişim Belirleyicileri: Arayüz metotları her zaman public olmak zorundadır. Soyut sınıf metotları ise public veya protected olabilir, ancak private olamaz.
Özellikler (Properties): Arayüzler özellik tanımlayamaz. Soyut sınıflar ise özellik tanımlayabilir ve bu özellikler public, protected veya private olabilir.
Sabitler: Hem arayüzler hem de soyut sınıflar sabitler tanımlayabilir.
Yapıcı Metotlar (Constructors): Soyut sınıflar yapıcı metotlara sahip olabilir. Arayüzler ise PHP 8.1 öncesinde yapıcı metot tanımlayamazdı. PHP 8.1 ve sonrası için arayüzler de yapıcı metot tanımlayabilir, ancak bu metotlar yine soyut olmak zorundadır.
Soyut Metotların Uygulanması: Bir soyut sınıfı miras alan veya bir arayüzü uygulayan somut sınıf, tüm soyut metotları veya arayüz metotlarını uygulamak zorundadır. Aksi takdirde, bu alt sınıfın da soyut olarak tanımlanması gerekir.
Kullanım Seçimi: Eğer sadece bir davranış sözleşmesi tanımlamak ve sınıflar arasında hiçbir ortak kod paylaşımı yoksa arayüz kullanın. Eğer sınıflar arasında ortak kod ve özellikler paylaşılıyorsa ve bu sınıfların aynı "tip" olduğunu belirtmek istiyorsanız soyut sınıf kullanın. Her ikisi de gerektiğinde birlikte kullanılabilir.
                JavaScript, web geliştirmenin temel taşlarından biri olmasının yanı sıra, Node.js ile sunucu tarafı uygulamalardan mobil uygulamalara (React Native) ve hatta masaüstü uygulamalarına (Electron) kadar geniş bir alanda kullanılan dinamik ve çok yönlü bir programlama dilidir. Bu kılavuz, JavaScript ile programlama yapmanın temel yapı taşlarını, sözdizimini ve yaygın kullanım senaryolarını adım adım açıklayarak, sağlam bir temel oluşturmanızı hedeflemektedir.
JavaScript kodları, tarayıcılarda veya Node.js gibi çalışma zamanı ortamlarında yorumlanan bir dizi ifade ve deyimden oluşur. Her JavaScript programı, değişken tanımlamaları, operatör kullanımları, kontrol akışı yapıları ve fonksiyon çağrılarının birleşimidir. Temel bir JavaScript programının genel yapısı aşağıdaki gibidir:
// Tek satırlık yorum
/* 
 * Çok satırlı yorum
 */
// Değişken tanımlamaları
let degiskenAdi = deger;
const sabitDeger = baskaDeger;
// İfadeler ve operatörler
let sonuc = degiskenAdi + 5;
// Kontrol akışı (koşullu ifadeler, döngüler)
if (sonuc > 10) {
    // Koşul doğruysa çalışacak kod
} else {
    // Koşul yanlışsa çalışacak kod
}
for (let i = 0; i < 5; i++) {
    // Döngü içinde çalışacak kod
}
// Fonksiyon tanımlamaları ve çağrıları
function fonksiyonAdi(parametre1, parametre2) {
    // Fonksiyonun yapacağı işlemler
    return parametre1 + parametre2;
}
let toplam = fonksiyonAdi(10, 20);
Yukarıdaki sözdiziminde yer alan her bir bileşenin ne anlama geldiğini ve nasıl kullanıldığını detaylı olarak inceleyelim:
Değişkenler: JavaScript'te verileri depolamak için değişkenler kullanılır. Değişkenler, var, let veya const anahtar kelimeleriyle tanımlanır.
let: Blok kapsamlı bir değişken tanımlar. Değeri daha sonra değiştirilebilir.
const: Blok kapsamlı, sadece bir kez değer atanabilen sabit bir değişken tanımlar. Atandıktan sonra değeri değiştirilemez.
var: Fonksiyon kapsamlı bir değişken tanımlar. Modern JavaScript'te genellikle let ve const tercih edilir.
Veri Tipleri: JavaScript, farklı türde verileri işleyebilir. Başlıca veri tipleri şunlardır:
Primitive (İlkel) Tipler: string (metin), number (sayı), boolean (mantıksal doğru/yanlış), null (boş değer), undefined (tanımsız), symbol, bigint.
Reference (Referans) Tipler: object (nesneler, diziler, fonksiyonlar).
Operatörler: Değişkenler ve değerler üzerinde işlemler yapmak için kullanılır. Önemli operatör türleri şunlardır:
Aritmetik Operatörler: +, -, *, /, % (modül).
Atama Operatörleri: =, +=, -=, *=, /=.
Karşılaştırma Operatörleri: == (değer eşitliği), === (değer ve tip eşitliği), !=, !==, >, <, >=, <=.
Mantıksal Operatörler: && (VE), || (VEYA), ! (DEĞİL).
Kontrol Akışı: Programın hangi koşullarda hangi kod bloğunu çalıştıracağını belirler.
if...else if...else: Belirli koşullara göre farklı kod bloklarını çalıştırmak için kullanılır.
switch: Tek bir ifadenin birden çok olası değeri için farklı kod blokları tanımlar.
for, while, do...while: Belirli bir koşul karşılanana kadar veya belirli sayıda tekrarlamak için döngü yapıları.
Fonksiyonlar: Belirli bir görevi yerine getiren yeniden kullanılabilir kod bloklarıdır. Parametre alabilir ve bir değer döndürebilirler. function anahtar kelimesiyle veya ok fonksiyonu (arrow function) sözdizimiyle tanımlanabilirler.
Yukarıda açıklanan kavramları pekiştirmek için çeşitli kod örneklerini inceleyelim:
Örnek 1: Değişken Tanımlama ve Aritmetik İşlem
let fiyat = 150;
const KDV_ORANI = 0.18; // Sabit değer
let KDVtutari = fiyat * KDV_ORANI;
let toplamFiyat = fiyat + KDVtutari;
console.log("Ürün Fiyatı:", fiyat); // Çıktı: Ürün Fiyatı: 150
console.log("KDV Tutarı:", KDVtutari); // Çıktı: KDV Tutarı: 27
console.log("Toplam Fiyat:", toplamFiyat); // Çıktı: Toplam Fiyat: 177
Örnek 2: Koşullu İfade (if-else)
let kullaniciYasi = 20;
if (kullaniciYasi >= 18) {
    console.log("Ehliyet başvurusunda bulunabilirsiniz.");
} else {
    console.log("Ehliyet başvurusu için yaşınız uygun değil.");
}
let puan = 75;
let not;
if (puan >= 90) {
    not = "A";
} else if (puan >= 80) {
    not = "B";
} else if (puan >= 70) {
    not = "C";
} else {
    not = "D";
}
console.log("Öğrencinin Notu:", not); // Çıktı: Öğrencinin Notu: C
Örnek 3: Döngü Kullanımı (for)
let meyveler = ["elma", "armut", "muz", "çilek"];
for (let i = 0; i < meyveler.length; i++) {
    console.log("Benim favori meyvem: " + meyveler[i]);
}
/* Çıktı:
Benim favori meyvem: elma
Benim favori meyvem: armut
Benim favori meyvem: muz
Benim favori meyvem: çilek
*/
Örnek 4: Fonksiyon Tanımlama ve Çağırma
// İki sayıyı toplayan bir fonksiyon
function topla(sayi1, sayi2) {
    return sayi1 + sayi2;
}
let sonuc1 = topla(5, 7);
console.log("5 + 7 =", sonuc1); // Çıktı: 5 + 7 = 12
// İki sayıyı çarpan bir ok fonksiyonu
const carp = (sayi1, sayi2) => {
    return sayi1 * sayi2;
};
let sonuc2 = carp(4, 6);
console.log("4 * 6 =", sonuc2); // Çıktı: 4 * 6 = 24
Noktalı Virgül (;) Kullanımı: JavaScript'te ifadelerin sonunda noktalı virgül kullanmak genellikle iyi bir pratiktir, ancak bazı durumlarda JavaScript motoru otomatik olarak ekleyebilir (Automatic Semicolon Insertion - ASI). Yine de belirsizliği önlemek ve kodunuzu daha okunur kılmak için manuel olarak eklenmesi önerilir.
let ve const Tercihi: Modern JavaScript'te değişken tanımlarken her zaman var yerine let veya const kullanın. Bu, kapsam (scoping) sorunlarını azaltır ve kodunuzu daha öngörülebilir hale getirir. Değeri değişmeyecekse const, değişecekse let kullanın.
Tip Zorlaması (Type Coercion): JavaScript, esnek bir dile sahip olduğundan, bazı durumlarda farklı veri tipleri arasında otomatik dönüşümler yapar. Örneğin, "5" + 2 ifadesi "52" sonucunu verirken, "5" - 2 ifadesi 3 sonucunu verir. Bu durum, beklenmedik hatalara yol açabileceği için dikkatli olunmalıdır. Kesin tip karşılaştırmaları için === (üç eşit) operatörünü kullanın.
Yorum Satırları: Kodunuzu açıklamak için yorum satırlarını kullanın. Tek satırlık yorumlar için //, çok satırlık yorumlar için /* ... */ kullanabilirsiniz. Bu, kodunuzun başkaları (ve gelecekteki siz) tarafından daha kolay anlaşılmasını sağlar.
Hata Ayıklama (Debugging): Kodunuzdaki hataları bulmak için console.log() fonksiyonunu sıkça kullanın. Bu, değişkenlerin değerlerini, fonksiyonların çağrılıp çağrılmadığını veya bir kod bloğuna girilip girilmediğini kontrol etmenize yardımcı olur.
                SQL veritabanlarında, belirli bir desene uyan metin değerlerini aramak, veri filtreleme işlemlerinin temel bir parçasıdır. LIKE operatörü, bu tür desen tabanlı aramaları gerçekleştirmek için kullanılır. Bu operatör, tam eşleşme yerine kısmi eşleşmeleri veya belirli kalıpları içeren metinleri bulmak gerektiğinde devreye girer ve esnek sorgular oluşturmaya olanak tanır.
LIKE operatörünün genel sözdizimi aşağıdaki gibidir:
SELECT kolon_adi(lar)
FROM tablo_adi
WHERE kolon_adi LIKE desen;LIKE operatörü, WHERE yan tümcesi ile birlikte kullanılarak belirtilen bir sütundaki değerlerin belirli bir desene uyup uymadığını kontrol eder. Bu deseni tanımlamak için iki özel joker karakter (wildcard character) kullanılır:
% (Yüzde İşareti): Sıfır veya daha fazla karakter dizisini temsil eder. Örneğin, 'A%' ile başlayan tüm değerleri, '%A' ile biten tüm değerleri ve '%A%' ile A içeren tüm değerleri bulabilirsiniz.
_ (Alt Çizgi): Tek bir karakteri temsil eder. Örneğin, 'A_C', 'ABC', 'AEC' gibi üç karakterli ve ortasında herhangi bir karakter olan değerleri bulur.
Bu joker karakterler, arama desenini oluşturmak için birleştirilebilir.
Aşağıdaki örnekler, LIKE operatörünün farklı senaryolarda nasıl kullanıldığını göstermektedir. Bu örneklerde, bir Urunler tablosunun UrunAdi sütununda arama yaptığımızı varsayalım.
Örnek 1: Belirli Bir Harf Dizisiyle Başlayan Değerler
'Bilgisayar' kelimesiyle başlayan tüm ürün adlarını bulmak için:
SELECT UrunAdi
FROM Urunler
WHERE UrunAdi LIKE 'Bilgisayar%';Örnek 2: Belirli Bir Harf Dizisiyle Biten Değerler
'Mouse' kelimesiyle biten tüm ürün adlarını bulmak için:
SELECT UrunAdi
FROM Urunler
WHERE UrunAdi LIKE '%Mouse';Örnek 3: Belirli Bir Harf Dizisi İçeren Değerler
Ürün adında 'USB' ifadesi geçen tüm ürünleri bulmak için:
SELECT UrunAdi
FROM Urunler
WHERE UrunAdi LIKE '%USB%';Örnek 4: Belirli Bir Karakter Deseniyle Eşleşen Değerler
İkinci harfi 'a' olan ve toplamda en az üç karakterli ürün adlarını bulmak için:
SELECT UrunAdi
FROM Urunler
WHERE UrunAdi LIKE '_a%';Örnek 5: NOT LIKE Kullanımı
Belirli bir desene uymayan değerleri dışlamak için NOT LIKE operatörü kullanılır. Örneğin, 'Telefon' kelimesiyle başlamayan tüm ürün adlarını bulmak için:
SELECT UrunAdi
FROM Urunler
WHERE UrunAdi NOT LIKE 'Telefon%';Büyük/Küçük Harf Duyarlılığı: LIKE operatörünün büyük/küçük harf duyarlılığı, kullanılan veritabanı sistemine (örneğin, PostgreSQL, MySQL, SQL Server) ve sütunun harmanlama (collation) ayarlarına bağlıdır. Bazı sistemler varsayılan olarak duyarsızken, bazıları duyarlı olabilir veya harmanlama ayarları ile bu durum değiştirilebilir. Büyük/küçük harf duyarlılığından bağımsız arama yapmak için genellikle LOWER() veya UPPER() fonksiyonları ile birlikte kullanılır: WHERE LOWER(kolon_adi) LIKE LOWER('%desen%').
Performans: Özellikle '%' ile başlayan desenler (örneğin, LIKE '%desen') indeks kullanımını zorlaştırabilir ve büyük tablolarda sorgu performansını olumsuz etkileyebilir. Mümkünse, deseni bir harf veya karakter dizisiyle başlatmak (LIKE 'desen%') daha performanslı olabilir.
Kaçış Karakterleri (Escape Characters): Eğer aradığınız desende % veya _ gibi joker karakterler varsa ve bunları literal olarak aramak istiyorsanız, bir kaçış karakteri (escape character) kullanmanız gerekir. Çoğu SQL veritabanı, LIKE '%50\_%' ESCAPE '\' gibi bir sözdizimine izin verir, bu da '50_' ifadesini içeren değerleri arar.
Regular Expressions (Regex): Daha karmaşık desen eşleştirme ihtiyaçları için, birçok veritabanı REGEXP veya RLIKE gibi düzenli ifade operatörlerini destekler. Bu operatörler, LIKE operatörüne göre çok daha güçlü ve esnek desen eşleştirme yetenekleri sunar.
                Python'da fonksiyonlar, belirli bir görevi yerine getiren, yeniden kullanılabilir kod bloklarıdır. Bu yapısal elemanlar, kodun modülerliğini artırır, okunabilirliği iyileştirir ve aynı kod bloğunu birden fazla kez yazma ihtiyacını ortadan kaldırarak geliştirme sürecini hızlandırır. Fonksiyonlar, karmaşık problemleri daha küçük, yönetilebilir parçalara ayırmak için temel bir araçtır ve her programlama dilinde olduğu gibi Python'da da etkin kod yazımının vazgeçilmez bir parçasıdır.
Python'da bir fonksiyon tanımlamanın temel sözdizimi aşağıdaki gibidir:
def fonksiyon_adi(parametre1, parametre2=varsayilan_deger):
    """
    Bu bir docstring'dir. Fonksiyonun ne iş yaptığını açıklar.
    """
    # Fonksiyon gövdesi (işlemlerin yapıldığı yer)
    if kosul:
        islem1
    else:
        islem2
    return deger
def: Python'da bir fonksiyon tanımlamak için kullanılan anahtar kelimedir. Her fonksiyon tanımı bu kelime ile başlar.
fonksiyon_adi: Fonksiyonunuza verdiğiniz isimdir. Fonksiyon isimleri, işlevlerini yansıtmalı ve snake_case (küçük harflerle ve kelimeler arasına alt çizgi konularak) kuralına uygun olmalıdır. Örneğin: veri_isleme, toplama_yap.
(parametre1, parametre2=varsayilan_deger): Fonksiyonun dışarıdan alacağı giriş değerlerini (argümanları) temsil eden parametre listesidir. Parantezler boş bırakılabilir (parametre almayan fonksiyonlar için), veya virgülle ayrılmış bir ya da daha fazla parametre içerebilir. Parametrelere varsayılan değerler atanabilir; bu durumda, fonksiyon çağrılırken bu parametreler için bir değer sağlanmazsa varsayılan değer kullanılır.
: (İki Nokta Üst Üste): Fonksiyon başlığının sonuna gelir ve fonksiyon gövdesinin başladığını belirtir.
"""Docstring""": Fonksiyonun hemen altında üç tırnak (tek veya çift) içinde yer alan isteğe bağlı bir dizedir. Bu, fonksiyonun ne işe yaradığını, aldığı parametreleri ve döndürdüğü değeri açıklayan bir belgeleme metnidir. Kodun anlaşılırlığını büyük ölçüde artırır ve help() fonksiyonu ile erişilebilir.
# Fonksiyon gövdesi: Fonksiyonun ana mantığını ve çalıştıracağı komutları içeren bloktur. Bu bloktaki tüm satırlar, def anahtar kelimesi ile aynı hizada başlayan satıra göre girintili (genellikle 4 boşluk) olmalıdır. Python'da girintileme, kod bloklarını tanımlamak için kullanılır ve sözdiziminin önemli bir parçasıdır.
return deger: Fonksiyonun çalışmasını sonlandıran ve çağıran yere bir değer döndüren anahtar kelimedir. Bir return ifadesi kullanıldığında, fonksiyonun yürütülmesi durur ve belirtilen değer geri döndürülür. Eğer bir return ifadesi kullanılmazsa veya boş bir return kullanılırsa, Python otomatik olarak None değerini döndürür.
Aşağıdaki örnekler, fonksiyonların Python'da nasıl tanımlandığını ve kullanıldığını göstermektedir.
Örnek 1: Parametre almayan ve değer döndürmeyen basit bir fonksiyon.
def selamla():
    """
    Kullanıcıyı selamlayan basit bir fonksiyon.
    """
    print("Merhaba, Python dünyasına hoş geldiniz!")
# Fonksiyonu çağırma
selamla()
Örnek 2: Parametre alan ve değer döndüren bir fonksiyon.
def topla(sayi1, sayi2):
    """
    İki sayıyı toplayıp sonucu döndüren fonksiyon.
    Args:
        sayi1 (int/float): Toplanacak birinci sayı.
        sayi2 (int/float): Toplanacak ikinci sayı.
    Returns:
        int/float: İki sayının toplamı.
    """
    sonuc = sayi1 + sayi2
    return sonuc
# Fonksiyonu çağırma ve döndürülen değeri kullanma
toplam_sonucu = topla(10, 5)
print(f"10 ve 5'in toplamı: {toplam_sonucu}")
farkli_toplam = topla(2.5, 7.3)
print(f"2.5 ve 7.3'ün toplamı: {farkli_toplam}")
Örnek 3: Varsayılan parametre değeri olan bir fonksiyon.
def hesapla_indirim(fiyat, indirim_orani=0.10):
    """
    Belirtilen fiyata indirim uygulayarak yeni fiyatı döndüren fonksiyon.
    Args:
        fiyat (float): Ürünün orijinal fiyatı.
        indirim_orani (float, optional): Uygulanacak indirim oranı. Varsayılan %10'dur.
    Returns:
        float: İndirimli fiyat.
    """
    indirim_miktari = fiyat * indirim_orani
    indirimli_fiyat = fiyat - indirim_miktari
    return indirimli_fiyat
# Fonksiyonu varsayılan indirim oranıyla çağırma
urun_fiyati_1 = 100
yeni_fiyat_1 = hesapla_indirim(urun_fiyati_1)
print(f"100 TL'lik ürünün %10 indirimli fiyatı: {yeni_fiyat_1}")
# Fonksiyonu özel bir indirim oranıyla çağırma
urun_fiyati_2 = 250
yeni_fiyat_2 = hesapla_indirim(urun_fiyati_2, 0.25) # %25 indirim
print(f"250 TL'lik ürünün %25 indirimli fiyatı: {yeni_fiyat_2}")
Girintileme (Indentation): Python'da kod blokları (fonksiyon gövdeleri, döngüler, koşullu ifadeler) girintileme ile tanımlanır. Yanlış girintileme IndentationError hatasına yol açar.
return Anahtar Kelimesi: Bir fonksiyonun bir değer döndürmesini sağlar. Eğer bir fonksiyon return ifadesi içermiyorsa, otomatik olarak None döndürür. print() fonksiyonu ekrana çıktı verirken, return bir değeri fonksiyonun çağrıldığı yere geri verir.
Değişken Kapsamı (Scope): Fonksiyon içinde tanımlanan değişkenler yereldir ve yalnızca o fonksiyon içinde erişilebilirler. Fonksiyon dışında tanımlanan değişkenler ise globaldir ve fonksiyon içinde de erişilebilirler (ancak global anahtar kelimesi kullanılmadan doğrudan değiştirilemezler).
Fonksiyon İsimlendirme Kuralları: Fonksiyon isimleri genellikle küçük harflerle ve kelimeler arasına alt çizgi konularak yazılır (snake_case). Fonksiyonun amacını açıkça belirtmelidir.
Docstring Kullanımı: Her fonksiyon için açıklayıcı bir docstring yazmak iyi bir programlama pratiğidir. Bu, kodunuzu başkaları (veya gelecekteki siz) için daha anlaşılır hale getirir. help(fonksiyon_adi) komutu ile bu belgelere erişebilirsiniz.
Fonksiyon Çağırma: Bir fonksiyonu çalıştırmak için adını ve ardından parantezleri () kullanmanız gerekir (örneğin, selamla()). Parantezler olmadan sadece fonksiyon adını yazmak, fonksiyonun kendisine bir referans verir, onu çalıştırmaz.
                PHP 8 ile tanıtılan öznitelikler (attributes), kodunuza yapısal, meta verisel bilgiler eklemenin modern ve deklaratif bir yolunu sunar. Bu özellik, docblock yorumlarının sunduğu sınırlı yeteneklerin ötesine geçerek, sınıflara, yöntemlere, özelliklere, fonksiyonlara, sabitlere ve parametrelere doğrudan programatik meta veriler eklemenize olanak tanır. PHP çekirdeği tarafından sunulan ön tanımlı öznitelikler, geliştiricilere sıkça karşılaşılan senaryolarda kodlarını daha net, güvenli ve yönetilebilir hale getirme imkanı sağlar. Bu makale, PHP'de ön tanımlı özniteliklerin temel kullanımını ve pratik uygulamalarını detaylandıracaktır.
Ön tanımlı öznitelikler, hedeflenen kod öğesinin hemen üzerine, #[ ile başlayıp ] ile biten bir yapı içinde yerleştirilir. Her öznitelik, bir sınıf gibi davranır ve isteğe bağlı olarak parametreler alabilir. Birden fazla öznitelik aynı öğeye uygulanabilir ve bunlar virgül ile ayrılarak aynı #[...] bloğunda veya ayrı bloklarda belirtilebilir.
Genel sözdizimi aşağıdaki gibidir:
Sözdiziminde yer alan ana bileşenler ve anlamları şunlardır:
#[ ve ]: Öznitelik bloğunu tanımlayan sınırlayıcılardır. Tüm öznitelikler bu işaretler arasına yerleştirilmelidir.
AttributeAdi: Uygulanacak özniteliğin adıdır. Bu isim, genellikle PHP çekirdeği veya kütüphaneler tarafından sağlanan ön tanımlı bir öznitelik sınıfının adıdır. Örneğin, #[Deprecated] veya #[Override].
(parametre1: deger1, parametre2: deger2): Bazı öznitelikler, davranışlarını özelleştirmek için parametreler alabilir. Bu parametreler, öznitelik sınıfının kurucusuna (constructor) geçirilen argümanlardır. Parametreler adlandırılmış argümanlar olarak veya konumlarına göre verilebilir. Ön tanımlı özniteliklerde genellikle adlandırılmış argümanlar tercih edilir.
Hedef Konum: Öznitelikler bir sınıfın, bir sınıf özelliğinin (property), bir sınıf metodunun, bir fonksiyonun, bir sınıf sabitinin veya bir metodun/fonksiyonun parametresinin hemen üzerine yerleştirilmelidir.
PHP'nin çekirdeği tarafından sunulan bazı önemli ön tanımlı öznitelikler şunlardır:
#[AllowDynamicProperties]: PHP 8.2'den itibaren dinamik özelliklerin bildirilmemiş sınıflarda kullanılması önerilmez ve ileride hata fırlatabilir. Bu öznitelik, bir sınıfa dinamik özellikler eklenmesine izin verildiğini açıkça belirtir ve bir uyarının (DeprecationWarning) önüne geçer.
#[Override]: PHP 8.3 ile tanıtılan bu öznitelik, bir metodun üst sınıftaki veya uyguladığı arayüzdeki bir metodu geçersiz kıldığını (override ettiğini) açıkça işaretler. Eğer üst sınıfta veya arayüzde böyle bir metod yoksa, çalışma zamanında bir hata fırlatılır. Bu, yazım hatalarını veya refactoring sonrası oluşabilecek hataları engellemeye yardımcı olur.
#[Deprecated]: Bu öznitelik, bir kod öğesinin (sınıf, metot, özellik vb.) kullanımının artık önerilmediğini ve gelecekte kaldırılabileceğini belirtir. Bu, geliştiricilere eski API'leri kullanmaktan kaçınmaları için bir uyarı sağlar.
Örnek 1: #[AllowDynamicProperties] Kullanımı
Bu örnek, bir sınıfa dinamik özellikler eklenmesine izin vermek için #[AllowDynamicProperties] özniteliğinin nasıl kullanılacağını göstermektedir. PHP 8.2 ve sonraki sürümlerde, bu öznitelik olmadan dinamik özellikler kullanıldığında bir öneri (deprecate) uyarısı alırsınız.
 $value) {
            $this->$key = $value; // Dinamik özellik ataması
        }
    }
    public function getAyari(string $key)
    {
        return $this->$key ?? null;
    }
}
$ayarlar = new Ayarlar(['veritabani' => 'mysql', 'host' => 'localhost']);
echo $ayarlar->getAyari('veritabani'); // Çıktı: mysql
// Dinamik olarak yeni bir özellik eklemek
$ayarlar->cache = true;
echo "
";
echo "Önbellek aktif mi? " . ($ayarlar->cache ? "Evet" : "Hayır");
Yukarıdaki kodda, Ayarlar sınıfı #[AllowDynamicProperties] ile işaretlendiği için, constructor içinde döngü ile veya sonradan dışarıdan dinamik özellikler eklenmesi herhangi bir uyarıya neden olmaz.
Örnek 2: #[Override] Kullanımı
Bu örnek, bir alt sınıfın üst sınıftaki bir metodu doğru bir şekilde geçersiz kıldığını doğrulamak için #[Override] özniteliğinin nasıl kullanılacağını göstermektedir.
ad = $ad;
        $this->fiyat = $fiyat;
    }
    #[Override]
    public function getFiyat(): float
    {
        return $this->fiyat;
    }
    #[Override]
    public function getAd(): string
    {
        return $this->ad;
    }
    // Eğer burada yanlışlıkla `getFiyat` yerine `getFiyatX` yazsaydık
    // ve #[Override] kullansaydık, PHP çalışma zamanında hata verirdi.
    // #[Override]
    // public function getFiyatX(): float
    // {
    //     return $this->fiyat;
    // }
}
$kitap = new Kitap("PHP Başlangıç Rehberi", 49.99);
echo "Ürün Adı: " . $kitap->getAd() . "
";
echo "Fiyat: " . $kitap->getFiyat();
Yukarıdaki örnekte, Kitap sınıfındaki getFiyat() ve getAd() metotları #[Override] ile işaretlenmiştir. Bu, bu metotların TemelUrun sınıfındaki karşılık gelen metotları geçersiz kıldığını açıkça belirtir. Eğer TemelUrun sınıfında böyle bir metot olmasaydı veya yazım hatası yapılsaydı, PHP bir hata fırlatırdı.
Örnek 3: #[Deprecated] Kullanımı
Bu örnek, bir metodun artık kullanılmaması gerektiğini belirtmek için #[Deprecated] özniteliğinin nasıl kullanılacağını gösterir.
eskiIslem() . "
"; // Bu satır bir "Deprecated" uyarısı verir
echo $obj->yeniIslem();
eskiIslem() metodunu çağırdığınızda, PHP bir "Deprecated" uyarısı verir. Bu uyarı, geliştiricilere bu metodun kullanımından kaçınmaları ve yerine yeniIslem() metodunu kullanmaları gerektiğini bildirir. reason parametresi, uyarının içeriğini özelleştirmek için kullanılır.
Versiyon Uyumluluğu: Öznitelikler PHP 8.0 ve sonraki sürümlerde mevcuttur. #[Override] ise PHP 8.3 ile eklenmiştir. Kullanacağınız özniteliklerin PHP versiyonunuza uygun olduğundan emin olun.
Okunabilirlik ve Bakım: Öznitelikler, kodun amacını ve davranışını daha açık bir şekilde ifade ederek okunabilirliği artırır ve gelecekteki bakımı kolaylaştırır.
Hata Yakalama: #[Override] gibi öznitelikler, derleme zamanında (veya PHP'nin çalışma zamanı öncesi kontrolünde) hataları yakalayarak geliştirme sürecinde potansiyel sorunları erkenden tespit etmenizi sağlar.
Performans Etkisi: Özniteliklerin doğrudan çalışma zamanı performansına önemli bir etkisi yoktur. Genellikle yansıma (reflection) API'leri aracılığıyla okunur ve işlenirler.
Kendi Özniteliklerinizi Tanımlama: PHP, ön tanımlı özniteliklerin yanı sıra kendi özel özniteliklerinizi tanımlamanıza da olanak tanır. Bu, framework'ler ve kütüphaneler için güçlü bir meta programlama aracıdır.
                HTML (HyperText Markup Language), web sayfalarının iskeletini oluşturan temel işaretleme dilidir. Bu yapının içinde, elementlere belirli özellikler atamak ve onları gruplandırmak için class niteliği kritik bir rol oynar. class niteliği, bir veya daha fazla HTML elementine stil vermek, JavaScript ile manipüle etmek veya belirli elementleri mantıksal olarak gruplandırmak amacıyla kullanılır. Bu makalede, class niteliğinin temel sözdizimi, detaylı açıklaması ve pratik kullanım örnekleri adım adım incelenecektir.
class niteliği, neredeyse tüm HTML elementlerinde kullanılabilir ve bir elemente bir veya daha fazla sınıf adı atamak için kullanılır. Genel sözdizimi aşağıdaki gibidir:
İçerik Yukarıdaki sözdiziminde yer alan her bir bileşen, class niteliğinin işlevselliğini anlamak için önemlidir:
Sınıf adları, büyük/küçük harf duyarlıdır ve genellikle bir harfle başlamalıdır. Rakamlar, kısa çizgiler ( Aşağıdaki örnekler,  Örnek 1: CSS ile Stil Uygulama Bu paragraf kırmızı renkte olacaktır. Bu paragraf mavi renkte olacaktır. Örnek 2: Birden Fazla Sınıf Kullanımı Bu bir uyarı mesajıdır ve orta boyutta gösterilecektir. Örnek 3: JavaScript ile Etkileşim Bu kutucuk JavaScript ile kontrol ediliyor. Büyük/Küçük Harf Duyarlılığı: Sınıf adları büyük/küçük harf duyarlıdır. Örneğin,  Anlamlı Adlandırma: Sınıf adlarını, elementin görünümünden ziyade işlevini veya içeriğini yansıtacak şekilde seçmeye çalışın (örn.  Boşlukla Ayırma: Bir elemente birden fazla sınıf atamak için sınıf adlarını boşluk karakteriyle ayırın (örn.  ID ile Farkı:  Performans: Çok fazla sınıf kullanmak veya çok karmaşık CSS seçiciler oluşturmak, özellikle büyük projelerde performans sorunlarına yol açabilir. Temiz ve optimize edilmiş CSS kuralları kullanmaya özen gösterin.: Bu, , , ,  gibi herhangi bir HTML elementini temsil eder. Neredeyse tüm görsel HTML elementleri bu niteliği destekler.
    class: Bu, HTML'de önceden tanımlanmış bir niteliktir (attribute). Bir elemente bir veya daha fazla sınıf atamak için kullanılır."sınıf_adı_1 sınıf_adı_2 ...": Bu, elemente atanan sınıf adlarını içeren bir değerdir. Bir elemente birden fazla sınıf atamak mümkündür. Her sınıf adı, boşluk karakteri ile ayrılmalıdır. Örneğin, "menu-item aktif" değeri, elemente hem menu-item hem de aktif sınıflarını atar.
-) ve alt çizgiler (_) içerebilirler. Sınıf adlarının anlamlı ve açıklayıcı olması, kodun okunabilirliğini ve sürdürülebilirliğini artırır.
Pratik Kullanım Örnekleri
class niteliğinin farklı kullanım senaryolarını göstermektedir:
Bu örnekte, iki farklı  etiketine farklı sınıflar atanmış ve bu sınıflara CSS aracılığıyla farklı stiller uygulanmıştır. Bu, aynı türdeki elementleri farklı görsel özelliklerle sunmak için yaygın bir yöntemdir.
Bir elemente birden fazla sınıf atayarak, o elementin hem uyarı hem de orta-boyut sınıflarının tanımladığı stilleri alması sağlanır. Bu, CSS kurallarını daha modüler hale getirmeye yardımcı olur.
JavaScript, class niteliğini kullanarak belirli elementleri seçebilir ve üzerlerinde dinamik işlemler yapabilir. Aşağıdaki örnekte, gizle-goster sınıfına sahip bir butona tıklandığında, kutucuk sınıfına sahip bir 
Önemli Notlar
    
                    .myClass ve .myclass CSS'te farklı olarak ele alınır..error-message yerine .red-text).class="btn btn-primary").id niteliği bir sayfada yalnızca bir kez kullanılabilirken, class niteliği birden çok elementte tekrar tekrar kullanılabilir. id daha spesifik bir element seçimi için, class ise grup seçimi için idealdir.
                CSS'de max-width özelliği, bir elemanın genişliğinin belirli bir değeri asla aşmamasını sağlamak için kullanılır. Bu özellik, özellikle duyarlı web tasarımlarında, içeriğin farklı ekran boyutlarına uyum sağlaması ve taşma sorunlarını önlemesi açısından kritik bir rol oynar. Bir elemanın doğal genişliği ne olursa olsun, max-width tanımlanan değeri bir üst sınır olarak kabul eder ve elemanın genişliğinin bu sınırı geçmesine izin vermez. Bu sayede, elemanlar mevcut alanlarına dinamik olarak uyum sağlayabilirken, aşırı genişlemesi engellenir.
max-width özelliğinin temel sözdizimi aşağıdaki gibidir:
selector {
    max-width: value;
}Yukarıdaki sözdiziminde yer alan bileşenler ve value için kullanılabilecek değerler aşağıda açıklanmıştır:
selector: Bu, CSS kuralının uygulanacağı HTML elemanını veya eleman grubunu hedefleyen bir CSS seçicisidir. Örneğin, .container, img veya #main-content olabilir.
max-width: Uygulanacak CSS özelliğidir.
value: Elemanın genişliğinin aşamayacağı maksimum değeri belirler. Aşağıdaki değer tiplerini alabilir:
length: Piksel (px), yüzde (%), em, rem, vw (viewport width) gibi mutlak veya göreceli uzunluk birimleri kullanılabilir. Örneğin, 600px, 80%, 50em.
none: Bu, max-width özelliğinin varsayılan değeridir. Elemanın maksimum genişlik sınırı yoktur; genişliği doğal içeriğine veya tanımlanmış width özelliğine göre belirlenir.
initial: Özelliği, tarayıcının varsayılan değerine ayarlar (genellikle none).
inherit: Elemanın max-width değerini doğrudan ebeveyn elemanından miras almasını sağlar.
Aşağıdaki örnekler, max-width özelliğinin farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
Bu örnek, bir görselin kapsayıcısının genişliğini aşmamasını ve böylece duyarlı bir şekilde boyutlanmasını sağlar.
    
/* CSS Kodu */
.image-container {
    width: 100%; /* Kapsayıcı tam genişlikte */
    max-width: 800px; /* Kapsayıcının maksimum genişliği */
    margin: 0 auto; /* Ortalamak için */
}
.image-container img {
    max-width: 100%; /* Resim kapsayıcısının genişliğini aşmaz */
    height: auto; /* Oranları korur */
    display: block; /* Alt boşluğu kaldırmak için */
}Yukarıdaki CSS,  Bir web sayfasının ana içerik alanının çok genişlemesini engelleyerek okunabilirliği artırmak için kullanılır. Bu, sayfanın ana içeriğidir. Geniş ekranlarda bile belirli bir genişliği aşmayarak okunabilirliği artırır. ... diğer içerikler ... Bu örnekte,  Geniş form alanlarının küçük ekranlarda taşmasını önlerken, büyük ekranlarda da aşırı genişlemesini engeller. Burada, metin giriş alanları ve  Duyarlı Tasarımın Temeli:  Taşma Sorunlarını Önleme: Metin içeriği veya diğer elemanlar bir kapsayıcıdan taştığında ortaya çıkan yatay kaydırma çubukları gibi sorunları önlemede etkilidir..image-container sınıfına sahip bir 800px genişliğe sahip olmasını sağlar. İçindeki  etiketi ise, kapsayıcısının genişliğinin %100'ünü geçmeyecek şekilde ayarlanmıştır. Bu, ekran boyutu küçüldüğünde resmin otomatik olarak küçülmesini, ancak geniş ekranlarda 800px'ten daha geniş olmamasını garanti eder.
Örnek 2: İçerik Kapsayıcısını Sınırlama
/* CSS Kodu */
.main-content {
    width: 90%; /* Kapsayıcı %90 genişlikte */
    max-width: 1200px; /* Maksimum 1200 piksel genişlik */
    margin: 0 auto; /* Ortalamak için */
    padding: 20px;
    background-color: #f0f0f0;
}.main-content sınıfına sahip eleman, ekran genişliğinin %90'ını kaplar, ancak asla 1200px'i aşmaz. Bu, içeriğin geniş ekranlarda bile çok yayılmamasını sağlayarak kullanıcı için daha rahat bir okuma deneyimi sunar.
Örnek 3: Form Elemanları İçin Kullanım
/* CSS Kodu */
input[type="text"],
textarea {
    width: 100%; /* Eleman kapsayıcısının genişliğini doldurur */
    max-width: 400px; /* Maksimum 400 piksel genişlik */
    padding: 8px;
    margin-bottom: 10px;
    border: 1px solid #ccc;
    box-sizing: border-box; /* Padding ve border'ı genişliğe dahil eder */
}, kapsayıcılarının genişliğini dolduracak şekilde ayarlanmıştır, ancak maksimum 400px genişliğe sahiptirler. Bu, form elemanlarının hem küçük hem de büyük ekranlarda uygun boyutlarda görünmesini sağlar.
Önemli Notlar
    
                    width ve max-width Farkı: Bir elemana hem width hem de max-width tanımlandığında, max-width daha yüksek önceliğe sahiptir. Eğer width değeri max-width değerinden büyükse, eleman max-width değerini kullanır. Bu, elemanların esnekliğini korurken aşırı genişlemesini engellemek için idealdir.max-width: 100%;, görsellerin, videoların ve diğer medya öğelerinin duyarlı web tasarımlarında kapsayıcılarını aşmamasını sağlamak için yaygın olarak kullanılan temel bir tekniktir.min-width ile Kombinasyon: max-width, min-width (minimum genişlik) ile birlikte kullanılarak bir elemanın genişliği için bir aralık tanımlanabilir. Örneğin, min-width: 300px; max-width: 800px; elemanın genişliğinin 300 pikselden az, 800 pikselden fazla olmamasını sağlar.box-sizing Etkileşimi: max-width özelliğini kullanırken box-sizing: border-box; özelliğini de eklemek, padding ve border değerlerinin elemanın toplam genişliğine dahil edilmesini sağlayarak daha öngörülebilir bir düzen elde etmenize yardımcı olur.
                LIKE operatörü ile birlikte kullanılarak, arama desenlerinin tanımlanmasında güçlü bir rol oynar. Bu kılavuz, SQL Wildcards'ın temel kullanımını, sözdizimini ve pratik örneklerini detaylandırmaktadır.LIKE operatörü ile birlikte kullanılır ve bir WHERE koşulunun parçası olarak bir sütundaki değerlerin belirli bir desene uyup uymadığını kontrol eder. Temel sözdizimi aşağıdaki gibidir:SELECT sütun_adları
FROM tablo_adı
WHERE sütun_adı LIKE desen;desen, bir veya daha fazla joker karakter içeren bir karakter dizisidir.
% (Yüzde İşareti): Sıfır veya daha fazla karakterle eşleşir. Bu joker karakter, bir metin dizisinin herhangi bir yerinde herhangi bir sayıda karakterin bulunabileceğini belirtmek için kullanılır. Örneğin, 'A%' 'A' ile başlayan herhangi bir metinle eşleşirken, '%A' 'A' ile biten herhangi bir metinle eşleşir ve '%A%' 'A' karakterini içeren herhangi bir metinle eşleşir.
_ (Alt Çizgi): Tam olarak tek bir karakterle eşleşir. Bu joker karakter, belirli bir pozisyonda herhangi bir karakterin olabileceğini, ancak o pozisyonun mutlaka dolu olması gerektiğini belirtmek için kullanılır. Örneğin, 'A_Z', 'A' ile başlayıp 'Z' ile biten ve ortasında tam olarak tek bir karakter bulunan metinlerle (örneğin 'AAZ', 'ABZ', 'A1Z' gibi) eşleşir.
Bazı veritabanı sistemleri (örneğin, MS Access ve SQL Server), LIKE operatörü ile birlikte [], [^] ve [-] gibi ek joker karakterler sunabilir. Ancak bu kılavuz, tüm SQL standartlarında yaygın olarak desteklenen % ve _ karakterlerine odaklanmaktadır.
Musteriler tablosunda (MusteriID, Ad, Soyad, Sehir, Eposta sütunlarına sahip) joker karakterlerin nasıl kullanıldığını göstermektedir.Örnek 1: 'A' harfi ile başlayan müşteri adlarını bulma.
SELECT Ad, Soyad
FROM Musteriler
WHERE Ad LIKE 'A%';Bu sorgu, Ad sütunundaki değeri 'A' harfi ile başlayan tüm müşterileri getirir. Örneğin, 'Ayşe', 'Ali', 'Ahmet' gibi adlar eşleşecektir.
Örnek 2: 'n' harfi ile biten müşteri adlarını bulma.
SELECT Ad, Soyad
FROM Musteriler
WHERE Ad LIKE '%n';Bu sorgu, Ad sütunundaki değeri 'n' harfi ile biten tüm müşterileri listeler. Örneğin, 'Can', 'Asuman', 'Gülşen' gibi adlar eşleşecektir.
Örnek 3: Adında 'or' karakter dizisi geçen müşteri adlarını bulma.
SELECT Ad, Soyad
FROM Musteriler
WHERE Ad LIKE '%or%';Bu sorgu, Ad sütununda 'or' karakter dizisini herhangi bir konumda içeren tüm müşterileri getirir. Örneğin, 'Ozan', 'Doruk', 'Burak' gibi adlar eşleşebilir.
Örnek 4: Tam olarak 5 harfli ve 'e' ile biten müşteri adlarını bulma.
SELECT Ad, Soyad
FROM Musteriler
WHERE Ad LIKE '____e';Her bir alt çizgi (_) tek bir karakteri temsil ettiğinden, bu sorgu tam olarak 5 harfli olan ve son harfi 'e' olan adları (örneğin 'Emine', 'Ayşe') bulur.
Örnek 5: Soyadı 'B' ile başlayan, ikinci harfi herhangi bir şey olan ve üçüncü harfi 'l' olan müşterileri bulma.
SELECT Ad, Soyad
FROM Musteriler
WHERE Soyad LIKE 'B_l%';Bu sorgu, soyadı 'B' ile başlayıp, ikinci harfi herhangi bir karakter olup, üçüncü harfi 'l' olan ve sonrasında herhangi bir karakter dizisi (veya hiçbir şey) gelebilen soyadlarını eşleştirir. Örneğin, 'Balcı', 'Bilen', 'Bilgin' gibi soyadları eşleşebilir.
Örnek 6: Belirli bir e-posta domaininden olmayan müşterileri bulma.
SELECT Ad, Soyad, Eposta
FROM Musteriler
WHERE Eposta NOT LIKE '%@example.com';NOT LIKE operatörü, belirtilen desene UYMAYAN kayıtları seçmek için kullanılır. Bu örnek, e-posta adresi '@example.com' ile bitmeyen tüm müşterileri getirir.
LIKE Operatörü: Wildcards, yalnızca LIKE veya NOT LIKE operatörleri ile birlikte kullanıldığında özel anlam taşır. Diğer operatörlerle (örneğin =) kullanıldığında, joker karakterler literal karakterler olarak yorumlanır.
Büyük/Küçük Harf Duyarlılığı: Wildcard desen eşleştirmesinin büyük/küçük harf duyarlılığı, kullanılan veritabanı sistemine ve sütunun kolaj ayarlarına bağlıdır. Bazı sistemler varsayılan olarak duyarsızken (örneğin SQL Server), bazıları duyarlıdır (örneğin PostgreSQL, MySQL). Duyarlılığı ayarlamak için genellikle COLLATE anahtar kelimesi veya veritabanı yapılandırmaları kullanılır.
Joker Karakterleri Literal Olarak Kullanma: Eğer deseninizde gerçekten bir % veya _ karakterini aramak istiyorsanız (yani joker karakter olarak değil, gerçek bir karakter olarak), ESCAPE anahtar kelimesi ile özel bir kaçış karakteri tanımlamanız gerekir. Örneğin: LIKE '50\% indirim' ESCAPE '\', '50% indirim' metnini arar.
Performans Etkileri: Bir desenin başında joker karakter kullanılması (örneğin '%kelime'), veritabanının indeksleri etkin bir şekilde kullanmasını engelleyebilir ve bu da büyük tablolarda sorgu performansını olumsuz etkileyebilir. Mümkün olduğunda, desenleri bir joker karakterle başlatmaktan kaçınmak daha iyi bir uygulama olabilir.
Gelişmiş Desen Eşleştirme: Bazı veritabanları (örneğin PostgreSQL, MySQL) daha karmaşık desen eşleştirme ihtiyaçları için düzenli ifadeleri (Regular Expressions) destekleyen REGEXP veya SIMILAR TO gibi operatörler sunar. Bu operatörler, LIKE'tan daha güçlü desen eşleştirme yetenekleri sağlar.
                Python programlama dilinde, belirli bir aralıkta sayı dizileri oluşturmak ve özellikle döngülerde bu dizileri kullanmak için sıklıkla başvurulan temel yapı taşlarından biri range() fonksiyonudur. Bu fonksiyon, liste veya tuple gibi tüm sayıları bellekte tutmak yerine, gerektiğinde sayıları üreten bir "range nesnesi" döndürerek bellek verimliliği sağlar. Genellikle for döngüleriyle birlikte kullanılarak belirli sayıda tekrar eden işlemler gerçekleştirmek için idealdir.
range() fonksiyonunun üç farklı kullanım şekli bulunmaktadır:
range(stop)
range(start, stop)
range(start, stop, step)range() fonksiyonunun parametreleri şu anlamlara gelmektedir:
start (isteğe bağlı): Dizinin başlayacağı tam sayıyı belirtir. Eğer belirtilmezse, varsayılan değeri 0'dır.
stop (zorunlu): Dizinin biteceği tam sayıyı belirtir. Bu sayı, üretilen diziye dahil edilmez. Yani, dizi stop - 1 değerinde sona erer.
step (isteğe bağlı): Dizideki ardışık sayılar arasındaki artış miktarını belirtir. Eğer belirtilmezse, varsayılan değeri 1'dir. Negatif bir değer de olabilir, bu durumda dizi azalan sırada üretilir.
range(), bir iterable nesne döndürür, doğrudan bir liste değil. Bu nesne, üzerinde iterasyon yapılabilir ancak tüm elemanları aynı anda bellekte tutmaz.
Örnek 1: Tek Parametre Kullanımı (stop)
Bu kullanım, 0'dan başlayıp stop değerine kadar (hariç) bir dizi oluşturur.
# 0'dan 4'e kadar (5 hariç) sayılar üretir
for i in range(5):
    print(i)
# Çıktı:
# 0
# 1
# 2
# 3
# 4Örnek 2: İki Parametre Kullanımı (start, stop)
Bu kullanım, start değerinden başlayıp stop değerine kadar (hariç) bir dizi oluşturur.
# 2'den 6'ya kadar (7 hariç) sayılar üretir
for i in range(2, 7):
    print(i)
# Çıktı:
# 2
# 3
# 4
# 5
# 6Örnek 3: Üç Parametre Kullanımı (start, stop, step)
Bu kullanım, start değerinden başlayıp stop değerine kadar (hariç), step miktarı kadar artarak bir dizi oluşturur.
# 0'dan 10'a kadar (11 hariç), 2'şer artarak sayılar üretir
for i in range(0, 11, 2):
    print(i)
# Çıktı:
# 0
# 2
# 4
# 6
# 8
# 10Örnek 4: Negatif step Kullanımı (Geriye Doğru Sayma)
step parametresine negatif bir değer verilerek azalan bir dizi oluşturulabilir. Bu durumda start değeri stop değerinden büyük olmalıdır.
# 10'dan 0'a kadar (0 hariç), 1'er azalarak sayılar üretir
for i in range(10, 0, -1):
    print(i)
# Çıktı:
# 10
# 9
# 8
# 7
# 6
# 5
# 4
# 3
# 2
# 1Örnek 5: range Nesnesini Bir Listeye Dönüştürme
range nesnesinin içeriğini görmek veya bir liste olarak kullanmak isterseniz, list() fonksiyonunu kullanabilirsiniz.
# 0'dan 5'e kadar bir range nesnesi oluştur
my_range = range(5)
print(my_range)
# Range nesnesini listeye dönüştür
my_list = list(my_range)
print(my_list)
# Çıktı:
# range(0, 5)
# [0, 1, 2, 3, 4]range() fonksiyonu, kayan noktalı sayılar (float) ile çalışmaz. Yalnızca tam sayılar (integer) için geçerlidir.
stop parametresi daima üretilen dizinin dışında kalır. Bu, Python'daki birçok slicing ve aralık belirleme işlemine benzer bir davranıştır.
Büyük sayı aralıkları için bile range() kullanmak bellek açısından verimlidir, çünkü tüm sayıları belleğe yüklemez. Yalnızca o anki sayıyı ve bir sonraki sayıyı hesaplamak için gereken bilgiyi tutar.
range() tarafından döndürülen nesne, doğrudan bir liste olmasa da, len() fonksiyonu ile uzunluğu alınabilir ve üzerinde indeksleme yapılabilir (örneğin, my_range[0]).
Sonsuz döngüden kaçınmak için step değerinin doğru ayarlandığından emin olun. Özellikle negatif step kullanırken start ve stop değerlerinin mantıklı bir sıra izlemesi önemlidir (örneğin, azalan dizide start > stop).
                PHP geliştiricileri için harici kaynaklarla etkileşim, genellikle dosya sisteminden veri okuma, ağ istekleri yapma veya özel protokollere erişim gibi işlemleri içerir. Bu tür işlemlerin davranışını detaylı bir şekilde kontrol etmek, özellikle ağ isteklerinde zaman aşımı, kimlik doğrulama, vekil sunucu ayarları gibi özelleştirmeler yapmak kritik öneme sahiptir. PHP'nin bağlam (context) mekanizması, bu etkileşimleri yapılandırmak için güçlü ve esnek bir yol sunar. Bağlamlar, bir akış (stream) işlemi sırasında kullanılacak protokole özgü seçenekleri ve kullanıcı tanımlı bağımsız değişkenleri (parameters) bir araya getiren bir kapsayıcı görevi görür. Bu makale, PHP'de bağlam seçeneklerinin ve bağımsız değişkenlerinin nasıl tanımlandığını ve kullanıldığını detaylı bir şekilde inceleyecektir.
PHP'de bir bağlam oluşturmak ve yapılandırmak için başlıca iki fonksiyon kullanılır: stream_context_create() ve stream_context_set_option(). Bağımsız değişkenleri (parameters) ayarlamak için ise stream_context_set_params() fonksiyonu mevcuttur.
Bağlam Oluşturma:
$context = stream_context_create(
    array $options = [],
    array $params = []
);Seçenek Ayarlama:
bool stream_context_set_option(
    resource $context,
    string $wrapper,
    string $option,
    mixed $value
);
// Alternatif olarak, stream_context_create() sırasında da ayarlanabilir:
// $context = stream_context_create([
//     'wrapper' => [
//         'option' => 'value'
//     ]
// ]);Bağımsız Değişken Ayarlama:
bool stream_context_set_params(
    resource $context,
    array $params
);PHP'deki akış bağlamları, belirli bir akış işlemi sırasında davranışını değiştirmek için kullanılan anahtar-değer çiftlerinden oluşan koleksiyonlardır.
stream_context_create() fonksiyonu, yeni bir akış bağlamı kaynağı (resource) döndürür. Bu fonksiyon, isteğe bağlı olarak iki dizi parametresi alır:
$options: Bu dizi, çeşitli akış sarmalayıcıları (wrapper) için protokole özgü seçenekleri içerir. Yapısı ['wrapper_adı' => ['seçenek_adı' => 'değer']] şeklindedir.
$params: Bu dizi, bağlam için kullanıcı tanımlı bağımsız değişkenleri içerir. Genellikle bir bağlamın yaşam döngüsü boyunca bir akışa özel veri veya geri çağırma fonksiyonları (callback functions) eklemek için kullanılır.
Seçenekler (Options):
Seçenekler, belirli bir sarmalayıcının (wrapper) davranışını özelleştirmek için kullanılır. Örneğin, http:// sarmalayıcısı için zaman aşımı (timeout), kullanıcı aracısı (user agent) veya HTTP başlıkları gibi ayarlar yapılabilir. Her sarmalayıcının desteklediği seçenekler farklıdır. Yaygın olarak kullanılan bazı sarmalayıcılar ve seçenek kategorileri şunlardır:
http / https: method, header, user_agent, timeout, proxy, follow_location, content vb.
ftp: overwrite, resume_pos, timeout vb.
file: throw_exceptions (PHP 8.0+)
ssl: verify_peer, cafile, local_cert, passphrase vb.
stream_context_set_option() fonksiyonu, mevcut bir bağlama tek bir seçenek eklemek veya değiştirmek için kullanılır. Parametreleri şunlardır:
$context: Seçeneğin ekleneceği veya değiştirileceği bağlam kaynağı.
$wrapper: Seçeneğin ait olduğu akış sarmalayıcısının adı (örneğin, 'http' veya 'ssl').
$option: Ayarlanacak seçeneğin adı (örneğin, 'timeout' veya 'method').
$value: Seçeneğin değeri.
                HTML (HyperText Markup Language) belgelerinde, elemanları benzersiz bir şekilde tanımlamak için kullanılan temel niteliklerden biri id niteliğidir. Bu nitelik, bir web sayfasındaki belirli bir elemana özel bir kimlik atayarak, o elemanın CSS ile stilize edilmesini, JavaScript ile manipüle edilmesini veya sayfa içi bağlantılar (çapa bağlantıları) için hedef olarak kullanılmasını sağlar. Her id değeri, tüm HTML belgesi içinde benzersiz olmalıdır; bu, bir kimlik kartı numarası gibi, her elemanın kendine özgü bir tanımlayıcısı olduğu anlamına gelir.
id niteliği, herhangi bir HTML etiketine aşağıdaki genel sözdizimi ile eklenir:
İçerik Burada;
Benzersizlik Zorunluluğu: Bir HTML belgesinde her  Değer Kuralları: Bir  Bir harf (A-Z veya a-z) ile başlamalıdır. Alfasayısal karakterler (A-Z, a-z, 0-9), kısa çizgi ( Boşluk karakteri içermemelidir. Büyük/küçük harfe duyarlıdır (örneğin,  Kullanım Alanları: CSS ile Stil Uygulama: Belirli bir elemanı hedefleyerek sadece o elemana özel stil kuralları uygulamak için kullanılır. CSS'te  JavaScript ile Eleman Manipülasyonu: JavaScript kullanarak belirli bir HTML elemanına erişmek ve onunla etkileşim kurmak (içeriğini değiştirmek, olay dinleyicileri eklemek vb.) için en yaygın yöntemlerden biridir.  Çapa Bağlantıları (Fragment Identifiers): Bir web sayfasının içinde belirli bir bölüme doğrudan bağlantı vermek için kullanılır. Bağlantının  Form Elemanları ve Erişilebilirlik:  Aşağıdaki örnekler,  Örnek 1: CSS ile Stil Uygulama Bu paragraf, sadece kendisine özel stillere sahiptir. Örnek 2: JavaScript ile Eleman Seçimi Burada bir mesaj belirecek. Örnek 3: Çapa Bağlantısı (Fragment Identifier) Bu bölüm, yukarıdaki bağlantı tıklanarak doğrudan erişilebilir. Örnek 4:  Bu örnekte,  Her  Bir eleman, yalnızca bir  Birden fazla elemana aynı stil veya davranışı uygulamak istendiğinde,  HTML5 standartlarına göre, : Kimlik atanan HTML elemanını (örneğin, , ,  vb.) temsil eder.
    id: Elemana benzersiz bir kimlik atayan niteliktir."değer": Elemana atanan benzersiz kimlik değeridir. Bu değer tırnak işaretleri içinde belirtilmelidir.
Detaylı Açıklama
id niteliği ve atanan değeri, web geliştirme süreçlerinde birden fazla kritik rol oynar:
    
id değeri yalnızca bir kez kullanılabilir. Bu kurala uyulmaması tarayıcının beklenen davranışları göstermemesine veya JavaScript kodlarının hatalı çalışmasına neden olabilir. Tarayıcılar bu kuralı zorunlu kılmazken, standartlara uygun ve öngörülebilir davranış için bu kurala titizlikle uyulmalıdır.id değeri aşağıdaki kurallara uymalıdır:
    
        
-) ve alt çizgi (_) içerebilir."myId" ve "myid" farklı kimlikler olarak kabul edilir).
    
    
        
id seçicisi, # sembolü ile başlar (örneğin, #anaBaslik { color: blue; }).document.getElementById("değer") metodu ile elemana erişilir.href niteliği, # sembolü ile başlayan id değerini işaret eder (örneğin, Bölüm 2'ye Git). etiketi ile bir form elemanını ilişkilendirmek için for niteliği ile id değeri kullanılır, bu da erişilebilirliği artırır.
    
Pratik Kullanım Örnekleri
id niteliğinin farklı bağlamlarda nasıl kullanıldığını göstermektedir:
Bölüm İki'ye Atla
Sayfanın İkinci Bölümü
 ile Form Elemanını İlişkilendirme
 etiketi for="kullaniciAdi" niteliği ile id="kullaniciAdi" olan  elemanına bağlanmıştır. Bu sayede, kullanıcı etikete tıkladığında ilgili giriş alanı otomatik olarak odaklanır, bu da erişilebilirliği artırır.
Önemli Notlar
    
                    id değeri, bir HTML belgesi içinde benzersiz olmalıdır. Aynı id değerinin birden fazla elemana atanması, beklenen davranış hatalarına yol açabilir ve standartlara aykırıdır.id değerleri büyük/küçük harfe duyarlıdır. JavaScript ve CSS'te id seçicilerini kullanırken bu duruma dikkat edilmelidir.id niteliğine sahip olabilir. Birden fazla id ataması geçersizdir.id yerine class niteliği tercih edilmelidir. id, tekil ve benzersiz elemanlar için ayrılmıştır.id değerleri geçerli bir harfle başlamalı ve boşluk karakteri içermemelidir. Geçersiz id değerleri, bazı tarayıcılarda veya eski HTML sürümlerinde sorunlara neden olabilir.
                CSS'te elementlerin belge akışı içindeki yerleşimini ve görsel konumlandırmasını belirleyen temel özelliklerden biri position'dır. Bu özellik, geliştiricilere elementleri normal belge akışından çıkararak veya akış içinde belirli kurallara göre hareket ettirerek karmaşık düzenler oluşturma imkanı sunar. Web arayüzlerinde hassas kontrol sağlamak ve dinamik görsel efektler yaratmak için position özelliğinin farklı değerlerini anlamak esastır.
position özelliği, bir elementin konumlandırma türünü belirtmek için kullanılır. Aşağıdaki değerlerden birini alabilir:
position: static | relative | absolute | fixed | sticky;Her bir position değeri, elementin konumlandırma mantığını farklı şekillerde etkiler:
static: Bu, elementlerin varsayılan konumlandırma değeridir. Elementler, belgenin normal akışı içinde yer alır. top, right, bottom, left ve z-index özellikleri bu durumda hiçbir etki yaratmaz.
relative: Element, normal konumuna göre konumlandırılır. top, right, bottom veya left özellikleri kullanılarak normal konumundan uzaklaştırılabilir. Ancak, elementin orijinal konumu belgede hala yer kaplar ve diğer elementlerin yerleşimini etkiler.
absolute: Element, normal belge akışından çıkarılır ve en yakın konumlandırılmış (static olmayan) üst öğesine göre konumlandırılır. Eğer konumlandırılmış bir üst öğe yoksa, başlangıçtaki kapsayıcı bloğa (genellikle  elementi) göre konumlanır. absolute konumlandırılmış bir element, diğer elementlerin yerleşimini etkilemez.
fixed: Element, tarayıcı penceresine (viewport) göre konumlandırılır. Sayfa kaydırılsa bile ekranın aynı yerinde kalır. absolute gibi, normal belge akışından çıkarılır ve diğer elementlerin yerleşimini etkilemez. Navigasyon çubukları veya "başa dön" butonları için idealdir.
sticky: Bu değer, relative ve fixed konumlandırmanın bir karışımıdır. Element, belirli bir kaydırma eşiğine ulaşana kadar relative olarak davranır, eşik aşıldığında ise fixed olarak davranmaya başlar. top, right, bottom veya left özelliklerinden en az biri belirtilmelidir.
Aşağıdaki örnekler, position özelliklerinin farklı kullanım senaryolarını göstermektedir.
Örnek 1: relative Kullanımı
Bu örnekte, bir kutu normal akışında konumlandırılır ancak left ve top değerleri ile hafifçe kaydırılır.
  Relative Kutu
Örnek 2: absolute Kullanımı
Burada, iç kutu dış kutuya göre konumlandırılır ve sağ üst köşeye sabitlenir.
  Absolute Kutu
Örnek 3: fixed Kullanımı
Bu örnek, sayfa kaydırılsa bile ekranın sağ alt köşesinde sabit kalan bir butonu gösterir.
Bu sayfa kaydırılabilen içerik içerir.
  Aşağıya kaydırın ve fixed butonu görün.
Örnek 4: sticky Kullanımı
Bir başlık, belirli bir kaydırma noktasından sonra ekranın üst kısmına yapışık kalır.
  Bu içerik sticky başlığın üzerindedir.
  Aşağıya doğru kaydırın.
  ...
  ...
  Yapışkan Başlık
  ...
  ...
  ...
  ...
  Daha fazla içerik.
Yalnızca konumlandırılmış (static olmayan) elementler için z-index özelliği etki eder. z-index, elementlerin üst üste binme sırasını belirler.
absolute ve fixed konumlandırılmış elementler, normal belge akışından tamamen çıkarılır. Bu, diğer elementlerin onların varlığından habersizce yerleşeceği anlamına gelir.
relative konumlandırılmış bir element, normal akışta yer kaplamaya devam eder. Yalnızca görsel olarak kaydırılır.
sticky konumlandırmanın çalışabilmesi için top, right, bottom veya left özelliklerinden en az birinin tanımlanması gereklidir.
absolute konumlandırılmış bir elementin referans noktası, en yakın static olmayan üst elementidir. Bu üst elementin position özelliği relative, absolute, fixed veya sticky olmalıdır.
                Herkesin hayallerini süsleyen, macera filmlerine konu olan bir senaryo vardır: Issız bir adada tek başına kalmak. Çoğu kişi için bu, kısa süreli bir kaçış, bir fantezi olarak kalır. Benim içinse, bir yıl boyunca süren gerçek bir yaşam deneyimine dönüştü. Okyanusun ortasında, medeniyetten uzakta, tamamen kendi başıma geçirdiğim bu 365 gün, bana sadece hayatta kalmayı değil, aynı zamanda kendimi ve insan doğasını da öğretti. Bu yolculukta neler öğrendiğimi sizinle paylaşmak istiyorum.
Adaya ilk ayak bastığım anı asla unutamam. Bir gemi kazasının ardından kendimi bu yeşil cennetin kumsallarında bulduğumda, başlangıçta hissettiğim şey heyecandan çok saf bir korkuydu. En yakın yerleşim yerine binlerce mil uzakta olduğumu biliyordum. İlk günler, tamamen temel ihtiyaçlarımı karşılamaya odaklandım. Su, yiyecek ve barınak. Bu üçlüyü güvence altına almak, hayatta kalmamın anahtarıydı.
Tatlı Su Kaynağı Bulmak: En öncelikli meseleydi. Adanın iç kısımlarını keşfederek, şans eseri bir tatlı su kaynağına ulaştım. Bu, hayata tutunmam için bir umut ışığı oldu.
Yiyecek Avı ve Toplayıcılık: Balık tutmayı, deniz ürünleri toplamayı ve adada yetişen yenilebilir bitkileri ayırt etmeyi hızla öğrendim. Her öğün, doğanın bana sunduğu bir lütuftu.
Barınak İnşa Etmek: İlk başta derme çatma bir kulübe kurdum. Zamanla, bambu ve büyük yaprakları kullanarak, beni yağmurdan ve rüzgardan koruyacak daha sağlam bir yapı inşa ettim.
Bu ilk haftalar, insan beyninin kriz anında ne kadar hızlı adaptasyon gösterebildiğini, içgüdülerin ne kadar güçlü olduğunu bana net bir şekilde gösterdi. Her gün yeni bir meydan okumaydı ve her meydan okuma beni daha da güçlendiriyordu.
İlk şoku atlattıktan sonra, adanın ritmine ayak uydurmaya başladım. Güneşin doğuşuyla uyanıyor, batışıyla günü sonlandırıyordum. Zaman kavramı değişmişti; artık saatler değil, gelgitler, ayın evreleri ve mevsimsel değişiklikler rehberimdi. Doğayla böylesine iç içe yaşamak, daha önce hiç deneyimlemediğim bir huzuru beraberinde getirdi.
Günlerim belirli bir rutine oturmuştu: Sabah erkenden uyanıp su kaynağımı kontrol etmek, odun toplamak, ateş yakmak, balık ağı kurmak veya yiyecek aramak. Öğleden sonraları genellikle barınağımı onarmak, aletler yapmak (keskin taşlar, ip için lifler) veya adayı keşfetmekle geçerdi. Akşamları ise yaktığım ateşin başında oturup, yıldızları izlemek ve sessizliğin sesini dinlemek en büyük keyfimdi.
Bu süreçte, doğanın bir parçası olduğumu, onunla uyum içinde yaşamanın ne kadar önemli olduğunu anladım. Her canlı, her bitki, ekosistemin vazgeçilmez bir parçasıydı ve ben de onlardan biriydim. Bu farkındalık, hayata bakış açımı kökten değiştirdi.
Fiziksel hayatta kalma mücadelesi kadar, belki de daha fazlası, zihinsel dayanıklılığımı test eden bir süreçti. Issız bir adada tek başına olmak, yalnızlık ile yalıtılmışlık arasındaki ince çizgiyi bana öğretti. Başlangıçta derin bir yalnızlık hissi beni ele geçirse de, zamanla bu durum yerini huzurlu bir yalıtılmışlığa bıraktı.
Kendimle yüzleşmek, geçmişi sorgulamak, geleceği düşünmek için bolca vaktim oldu. Hiçbir dış uyaran olmadan, zihnim berraklaştı. Önceliklerim değişti. Materyalist dünyanın dayattığı değerlerin ne kadar anlamsız olduğunu, gerçek zenginliğin iç huzurunda ve doğayla bağlantıda yattığını fark ettim. Kendi iç sesimi dinlemeyi, kendi kendime yetmeyi öğrendim. Bu, hayatımın en yoğun kişisel gelişim süreciydi.
Zihinsel sağlığımı korumak için kendime küçük ritüeller yaratmıştım: Her gün denizde yüzmek, adanın en yüksek noktasına tırmanıp manzarayı seyretmek, kumsala şekiller çizmek. Bunlar, monotonluğu kırmanın ve ruhumu beslemenin yollarıydı. Bir yıl sonra, adaya ayak basan o korkmuş insandan çok farklı, daha sakin, daha bilge ve daha dayanıklı biri olmuştum.
Issız adadaki bir yıl, bana paha biçilmez dersler verdi. Bu dersler sadece hayatta kalma teknikleriyle sınırlı kalmadı, aynı zamanda insan olmanın, yaşamanın ve var olmanın derin anlamlarını kavramamı sağladı. İşte o adadan yanımda getirdiğim en önemli öğretiler:
Minimalizmin Gücü: Gerçekten neye ihtiyacımız olduğunu, neyin sadece bir arzu olduğunu anladım. Bir avuç alet, doğal yiyecekler ve basit bir barınakla yaşanabileceğini deneyimledim. Azla yetinmek, aslında çok daha fazlasına sahip olmak demekmiş.
Anın Kıymeti: Geçmişin pişmanlıkları ve geleceğin kaygıları olmadan, sadece "şimdi"de yaşamanın ne demek olduğunu öğrendim. Her nefes, her gün batımı, her taze su damlası bir mucizeydi.
Problem Çözme Yeteneği: Her gün yeni bir sorunla karşılaştım ve her birine kendi başıma çözüm bulmak zorundaydım. Bu, yaratıcılığımı ve pratik zekamı inanılmaz derecede geliştirdi.
Doğanın Bilgeliği: Hava durumunu okumayı, bitkilerin iyileştirici gücünü, hayvanların davranışlarını gözlemlemeyi öğrendim. Doğa, dünyanın en büyük öğretmenidir.
İnsan Bağlantısının Önemi: Paradoxik bir şekilde, en yalnız olduğum yerde insan bağlantısının değerini anladım. Bir gülümseme, bir sohbetin, sevgi ve dostluğun ne kadar kıymetli olduğunu fark ettim. Medeniyete döndüğümde, bu bağlantılara daha önce hiç olmadığı kadar değer verecektim.
Psikolojik Dayanıklılık ve Umut: Umutsuzluğa kapıldığım anlar oldu ama her zaman küçük bir umut ışığı buldum. İnsanın ne kadar dayanıklı olabileceğini, ruhunun her koşulda hayata tutunabileceğini gördüm. Umut, en güçlü hayatta kalma aracıdır.
Issız adada geçirdiğim bir yıl, hayatımın en zorlu ama aynı zamanda en öğretici dönemiydi. Bu deneyim, beni değiştirdi, dönüştürdü ve dünyaya yepyeni bir gözle bakmamı sağladı. Belki siz de bir gün kendinizi böyle bir durumda bulmazsınız, ama umarım benim öğrendiklerim, günlük hayatınızdaki önceliklerinizi sorgulamanıza ve doğayla daha derin bir bağ kurmanıza yardımcı olur. Unutmayın, en büyük macera, her zaman kendi içimizde saklıdır.
                JavaScript, sürekli gelişen bir programlama dilidir ve bu gelişim, ECMAScript (ES) standartları aracılığıyla tanımlanır. ECMAScript, dilin temel özelliklerini, sözdizimini ve semantiğini belirleyen standarttır; JavaScript ise bu standardın en bilinen uygulamasıdır. Geliştiricilerin modern web uygulamaları oluşturabilmesi için, dilin farklı versiyonlarında sunulan yeni özellikleri anlaması ve bunları etkin bir şekilde kullanması kritik öneme sahiptir. Bu makale, ECMAScript versiyonlarının JavaScript geliştirme üzerindeki etkilerini ve modern özellikleri projelerinizde nasıl uygulayacağınızı detaylandırmaktadır.
JavaScript'in sözdizimi, ECMAScript standartlarının her yeni sürümüyle birlikte evrimleşmektedir. Bu evrim, daha okunaklı, verimli ve güçlü kod yazma imkanı sunar. En belirgin değişikliklerden biri, değişken tanımlama mekanizmasında yaşanmıştır. ES6 (ECMAScript 2015) öncesinde sadece var anahtar kelimesi kullanılırken, ES6 ile birlikte let ve const anahtar kelimeleri tanıtılmıştır. Bu yeni anahtar kelimeler, blok kapsam (block-scoping) ve yeniden atama kısıtlamaları gibi önemli iyileştirmeler getirmiştir.
// ES5 (veya öncesi) değişken tanımlama
var degiskenAdet = 10;
if (true) {
  var degiskenAdet = 20; // Aynı kapsamda yeniden tanımlanabilir, beklenen davranışı değiştirebilir.
  console.log(degiskenAdet); // Çıktı: 20
}
console.log(degiskenAdet); // Çıktı: 20 (Beklenenden farklı olabilir)
// ES6+ ile değişken tanımlama
let sayac = 0;
const PI = 3.14;
if (true) {
  let sayac = 1; // Yeni bir blok kapsamlı değişken
  console.log(sayac); // Çıktı: 1
  // PI = 3.14159; // Hata: const ile tanımlanan bir değişken yeniden atanamaz.
}
console.log(sayac); // Çıktı: 0 (Blok dışındaki orijinal değişken)
ECMAScript, her yıl yeni bir sürümle güncellenerek dile yeni özellikler ekler. Bu sürümler genellikle ES5 (2009), ES6/ES2015, ES2016, ES2017 ve devam eden yıllık güncellemeler şeklinde adlandırılır.
ECMAScript Nedir? ECMAScript, Ecma International tarafından standardize edilen bir betik dili belirtimidir. JavaScript, JScript ve ActionScript gibi diller bu standardın uygulamalarıdır.
Sürüm Evrimi ve Özellikler: Her yeni sürüm, dile yeni sözdizimi ve API'lar ekler. Örneğin, ES6 ile ok fonksiyonları (=>), sınıf sözdizimi (class), şablon dizeleri (template literals), destructuring atama ve modüller (import/export) gibi önemli özellikler gelmiştir. Daha sonraki sürümlerde ise async/await (ES2017), nesne yayma operatörü (object spread operator) ve dinamik içe aktarmalar (dynamic imports) gibi özellikler eklenmiştir.
Uyumluluk Sorunları: Yeni ECMAScript özellikleri her tarayıcı veya Node.js ortamında hemen desteklenmeyebilir. Eski tarayıcılar, modern JavaScript kodunu anlayamayabilir ve bu durum hatalara yol açabilir.
Transpilasyon ve Polyfiller: Bu uyumluluk sorununu çözmek için iki ana yöntem kullanılır:
Transpilasyon: Modern JavaScript kodunu, eski JavaScript versiyonlarına dönüştürme işlemidir. En popüler transpilatör Babel'dir. Bu sayede geliştiriciler yeni özelliklerle kod yazabilirken, sonuçta ortaya çıkan kod geniş bir yelpazedeki eski ortamlarla uyumlu olur.
Polyfiller: Eski tarayıcılarda eksik olan modern JavaScript özelliklerini (örneğin, Promise veya Array.prototype.includes gibi API'lar) taklit eden kod parçacıklarıdır. Transpilasyon sözdizimini dönüştürürken, polyfiller API'ların eksik işlevselliğini sağlar.
Aşağıdaki örnekler, farklı ECMAScript versiyonlarında tanıtılan özelliklerin kullanımını ve bunların eski yaklaşımlarla karşılaştırmasını göstermektedir.
Örnek 1: Ok Fonksiyonları (Arrow Functions) - ES6
Ok fonksiyonları, daha kısa ve daha sezgisel bir fonksiyon sözdizimi sunar ve this bağlamının nasıl işlediği konusunda önemli değişiklikler yapar.
// ES5 fonksiyon tanımı
function sumES5(a, b) {
  return a + b;
}
console.log("ES5 Toplam:", sumES5(5, 3)); // Çıktı: ES5 Toplam: 8
// ES6 Ok Fonksiyonu
const sumES6 = (a, b) => a + b;
console.log("ES6 Toplam:", sumES6(5, 3)); // Çıktı: ES6 Toplam: 8
// 'this' bağlamı farkı
function CounterES5() {
  this.count = 0;
  setInterval(function() {
    // 'this' burada Global/Window nesnesine işaret eder (strict mode'da undefined)
    // Bu yüzden 'self = this' gibi bir yaklaşıma ihtiyaç duyulur.
    console.log("ES5 Counter:", this.count++);
  }, 1000);
}
// new CounterES5(); // Çalıştırıldığında hata verebilir veya beklenenden farklı çalışır
function CounterES6() {
  this.count = 0;
  setInterval(() => {
    // Ok fonksiyonları, tanımlandıkları kapsamdaki 'this' değerini korur (lexical this).
    console.log("ES6 Counter:", this.count++);
  }, 1000);
}
// new CounterES6(); // Beklendiği gibi çalışır
Örnek 2: Asenkron İşlemler için async/await - ES2017
async ve await anahtar kelimeleri, Promise tabanlı asenkron kodu senkron koda benzer bir şekilde yazmayı sağlayarak okunabilirliği artırır.
// Bir Promise döndüren örnek fonksiyon
function veriGetir() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve("Veri başarıyla alındı!");
    }, 2000);
  });
}
// ES5/ES6 Promises ile asenkron işlem
veriGetir().then(mesaj => {
  console.log("Promise ile:", mesaj); // 2 saniye sonra çalışır
});
// ES2017 async/await ile asenkron işlem
async function veriyiIsle() {
  console.log("Veri bekleniyor...");
  const mesaj = await veriGetir(); // Promise tamamlanana kadar bekler
  console.log("Async/Await ile:", mesaj); // Promise tamamlandıktan sonra çalışır
  console.log("İşlem tamamlandı.");
}
veriyiIsle();
Hedef Ortam Farkındalığı: Kodunuzu yazarken, hedeflediğiniz tarayıcılar ve Node.js sürümleri gibi çalışma ortamlarının hangi ECMAScript özelliklerini desteklediğini daima göz önünde bulundurun. caniuse.com gibi kaynaklar bu konuda size yardımcı olabilir.
Babel ve Webpack Kullanımı: Büyük ölçekli projelerde veya geniş tarayıcı desteği gerektiren durumlarda, Babel gibi bir transpilatör ve Webpack gibi bir bundler kullanmak neredeyse zorunludur. Bu araçlar, modern kodunuzu eski ortamlara uyumlu hale getirirken, aynı zamanda kodunuzu optimize etmenize ve modülleri yönetmenize olanak tanır.
Polyfiller'ı Doğru Kullanın: Transpilatörler sözdizimsel değişiklikleri yönetirken, yeni API'lar için polyfiller'lara ihtiyaç duyulur. Yalnızca projenizin ihtiyaç duyduğu polyfiller'ları dahil ederek paket boyutunu minimumda tutun.
Progressive Enhancement (Aşamalı Geliştirme): Mümkün olduğunda, en yeni özelliklerle kod yazın ve eski ortamlara düşüş (fallback) sağlayın. Bu, modern tarayıcılarda daha zengin bir deneyim sunarken, eski tarayıcılarda temel işlevselliği korur.
Güncel Kalın: ECMAScript standartları her yıl yeni özelliklerle güncellendiği için, dilin en son yeniliklerini takip etmek ve bunları projelerinizde nasıl kullanabileceğinizi öğrenmek önemlidir.
                Veritabanı yönetim sistemlerinde (DBMS) veri sorgulama, belirli kriterlere uyan kayıtları seçmek için kritik bir işlemdir. SQL IN operatörü, bir sütundaki değerin, belirtilen bir değer listesi içinde veya bir alt sorgu tarafından döndürülen sonuç kümesi içinde olup olmadığını kontrol etmek için kullanılan güçlü ve esnek bir araçtır. Bu operatör, birden fazla OR koşulunu tek bir ifadeyle ele alarak sorguların okunabilirliğini ve yazım kolaylığını önemli ölçüde artırır.
IN operatörünün temel sözdizimi iki ana biçimde incelenebilir: doğrudan bir değer listesiyle kullanım ve bir alt sorgu ile kullanım.
-- Değer listesiyle kullanım:
SELECT kolon_adi_1, kolon_adi_2, ...
FROM tablo_adi
WHERE hedef_kolon_adi IN (deger_1, deger_2, deger_3, ...);
-- Alt sorguyla kullanım:
SELECT kolon_adi_1, kolon_adi_2, ...
FROM tablo_adi
WHERE hedef_kolon_adi IN (SELECT alt_sorgu_kolonu FROM diger_tablo WHERE kosul);
SELECT kolon_adi_1, kolon_adi_2, ...: Sorgu sonucunda hangi sütunların döndürüleceğini belirtir. Standart SQL SELECT ifadesidir.
FROM tablo_adi: Verilerin hangi tablodan çekileceğini belirtir.
WHERE hedef_kolon_adi: IN operatörü ile karşılaştırılacak olan sütunu ifade eder.
IN: Bu anahtar kelime, hedef_kolon_adi değerinin parantez içindeki listede veya alt sorgu sonucunda bulunup bulunmadığını kontrol eder.
(deger_1, deger_2, deger_3, ...): Virgülle ayrılmış bir dizi sabit değerdir. hedef_kolon_adi, bu listedeki herhangi bir değere eşitse koşul doğru kabul edilir. Metin değerleri tek tırnak (') içinde, sayısal değerler ise tırnaksız yazılmalıdır.
(SELECT alt_sorgu_kolonu FROM diger_tablo WHERE kosul): Bu, bir alt sorgudur. IN operatörü, hedef_kolon_adi değerinin bu alt sorgunun döndürdüğü tek sütunlu sonuç kümesinde olup olmadığını kontrol eder. Bu yöntem, dinamik bir değer listesi oluşturmak için idealdir.
NOT IN: IN operatörünün tam tersidir. hedef_kolon_adi değerinin belirtilen listede veya alt sorgu sonucunda OLMADIĞINI kontrol eder.
Aşağıdaki örneklerde, bir Urunler tablosu (UrunID, UrunAdi, Kategori, Fiyat) ve bir Siparisler tablosu (SiparisID, MusteriID, UrunID, SiparisTarihi) ile Musteriler tablosu (MusteriID, MusteriAdi, Sehir) olduğunu varsayalım.
Bu örnek, Urunler tablosundan 'Elektronik' veya 'Ev Gereçleri' kategorilerine ait tüm ürünleri getirir.
SELECT UrunAdi, Kategori, Fiyat
FROM Urunler
WHERE Kategori IN ('Elektronik', 'Ev Gerecleri');
Belirli MusteriID'lere sahip siparişleri listeler.
SELECT SiparisID, MusteriID, SiparisTarihi
FROM Siparisler
WHERE MusteriID IN (101, 105, 112);
Bu örnek, 'Ankara' veya 'İzmir' şehirlerinde ikamet eden müşterilerin tüm siparişlerini getirir. Burada Musteriler tablosundan dönen MusteriID'ler, Siparisler tablosundaki filtreleme için kullanılır.
SELECT S.SiparisID, M.MusteriAdi, M.Sehir, S.SiparisTarihi
FROM Siparisler AS S
JOIN Musteriler AS M ON S.MusteriID = M.MusteriID
WHERE S.MusteriID IN (SELECT MusteriID FROM Musteriler WHERE Sehir IN ('Ankara', 'Izmir'));
Bu örnek, 'Giyim' ve 'Kitap' kategorileri dışındaki tüm ürünleri listeler.
SELECT UrunAdi, Kategori, Fiyat
FROM Urunler
WHERE Kategori NOT IN ('Giyim', 'Kitap');
Performans: Çok uzun değer listeleri veya karmaşık alt sorgular içeren IN operatörleri, bazı durumlarda performans sorunlarına yol açabilir. Özellikle listeler binlerce değer içeriyorsa veya alt sorgu büyük miktarda veri döndürüyorsa, sorgu optimizasyonunu gözden geçirmek (örneğin JOIN kullanmak) gerekebilir.
NULL Değerler: IN operatörü, listedeki NULL değerleriyle karşılaştırıldığında özel bir davranış sergiler. Eğer listede NULL varsa, hedef_kolon_adi IN (deger_1, NULL) ifadesi, hedef_kolon_adi'nın NULL olmasına rağmen NULL ile eşleşmez. NOT IN durumunda ise, alt sorgu veya değer listesi NULL bir değer içeriyorsa, NOT IN koşulu asla doğru (TRUE) değerini döndürmez. Bu nedenle, NULL değerlerinin varlığına dikkat edilmelidir.
Alternatifler: Basit ve kısa değer listeleri için IN operatörü idealdir. Ancak, çok sayıda OR koşulu yazmak yerine IN kullanmak okunabilirliği artırır. Eğer performans endişeleri varsa ve alt sorgunun döndürdüğü veri kümesi büyükse, JOIN işlemleri veya EXISTS operatörü gibi alternatifler değerlendirilebilir.
Veri Tipi Tutarlılığı: IN operatörü içinde kullanılan değerlerin veya alt sorgunun döndürdüğü değerlerin, karşılaştırıldığı sütunun veri tipiyle uyumlu olması önemlidir. Aksi takdirde, beklenmedik sonuçlar veya hata mesajları alınabilir.
Dinamik Listeler: IN operatörünü bir alt sorgu ile kullanmak, koşulların dinamik olarak belirlenmesini sağlar. Bu, özellikle bir tablodaki veriye dayanarak başka bir tablodaki kayıtları filtrelemek gerektiğinde çok kullanışlıdır.
                Python programlama dilinde, veri koleksiyonlarını depolamak için çeşitli yapılar bulunur. En yaygın kullanılanlardan biri list olsa da, özellikle sayısal verilerle çalışırken bellek verimliliği ve performans açısından array modülü önemli bir alternatif sunar. Bu makale, Python'ın array modülünü kullanarak tip-belirli dizilerin nasıl oluşturulduğunu, yönetildiğini ve günlük programlama görevlerinde nasıl kullanılabileceğini teknik detaylarıyla açıklamaktadır.
array modülünü kullanmak için öncelikle bu modülün içe aktarılması gerekmektedir. Dizi oluşturma işlemi, dizinin depolayacağı veri tipini belirten bir "tip kodu" ve başlangıç elemanlarını içeren bir iterable nesne ile gerçekleştirilir.
from array import array
dizi_adi = array('tip_kodu', [eleman1, eleman2, ...])array modülünün temel yapısı iki ana bileşenden oluşur:
tip_kodu (Type Code): Bu tek karakterlik string, dizinin depolayacağı veri tipini belirtir. Her tip kodu, belirli bir C veri tipine karşılık gelir ve dizideki tüm elemanların bu tipte olmasını sağlar. Bu sayede bellek kullanımı optimize edilir. Yaygın kullanılan bazı tip kodları şunlardır:
'b': İşaretli küçük tam sayı (signed char)
'B': İşaretsiz küçük tam sayı (unsigned char)
'h': İşaretli kısa tam sayı (signed short)
'H': İşaretsiz kısa tam sayı (unsigned short)
'i': İşaretli tam sayı (signed int)
'I': İşaretsiz tam sayı (unsigned int)
'l': İşaretli uzun tam sayı (signed long)
'L': İşaretsiz uzun tam sayı (unsigned long)
'q': İşaretli uzun uzun tam sayı (signed long long) (Sadece belirli sistemlerde mevcuttur)
'Q': İşaretsiz uzun uzun tam sayı (unsigned long long) (Sadece belirli sistemlerde mevcuttur)
'f': Kayan nokta (float)
'd': Çift hassasiyetli kayan nokta (double)
iterable: Bu, dizinin başlangıç elemanlarını içeren bir koleksiyondur. Genellikle bir list kullanılır, ancak tuple veya başka bir iterable nesne de olabilir. Dizi oluşturulurken bu iterable içindeki elemanlar belirtilen tip_kodu'na dönüştürülür. Eğer eleman tipi, tip_kodu ile uyumlu değilse TypeError hatası alınır.
Aşağıdaki örnekler, Python array modülünün farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
'i' tip kodu ile işaretli tam sayılardan oluşan bir dizi oluşturalım ve elemanlarına erişelim.
from array import array
# 'i' tip kodlu (işaretli tam sayı) bir dizi oluşturma
int_array = array('i', [1, 2, 3, 4, 5])
print("Oluşturulan Dizi:", int_array)
print("Dizinin Boyutu:", len(int_array))
# İndeks kullanarak elemanlara erişim
print("İlk Eleman:", int_array[0])
print("Son Eleman:", int_array[-1])
# Elemanı güncelleme
int_array[2] = 10
print("Güncellenmiş Dizi:", int_array)Kayan noktalı sayılar için 'f' tip kodunu kullanarak bir dizi oluşturalım.
from array import array
# 'f' tip kodlu (float) bir dizi oluşturma
float_array = array('f', [1.0, 2.5, 3.7, 4.2])
print("Float Dizi:", float_array)
# Eleman ekleme
float_array.append(5.9)
print("append() sonrası:", float_array)
# Eleman kaldırma
float_array.remove(2.5) # Değere göre kaldırır
print("remove() sonrası:", float_array)
# Yeni bir dizi ile genişletme
another_float_array = array('f', [6.1, 7.3])
float_array.extend(another_float_array)
print("extend() sonrası:", float_array)array nesneleri, özellikle büyük ikili veri setleriyle çalışırken doğrudan dosya işlemleri için de kullanılabilir.
from array import array
import os
# Bir dizi oluştur
data = array('i', [10, 20, 30, 40, 50])
file_name = "array_data.bin"
# Diziyi ikili dosyaya yazma
with open(file_name, 'wb') as f:
    data.tofile(f)
print(f"Dizi '{file_name}' dosyasına yazıldı.")
# Dosyadan geri okuma
read_data = array('i') # Boş bir dizi oluştur
with open(file_name, 'rb') as f:
    read_data.fromfile(f, len(data)) # Orijinal boyutu kadar oku
print("Dosyadan okunan dizi:", read_data)
# Dosyayı temizle
os.remove(file_name)
print(f"'{file_name}' dosyası silindi.")Bellek Verimliliği: array.array, list nesnelerine göre daha az bellek kullanır çünkü tüm elemanları aynı tipte tutar ve bu elemanlar arka planda kompakt bir C dizisi olarak depolanır. Büyük sayısal veri setleriyle çalışırken bu önemlidir.
Tip Kısıtlaması: array nesneleri yalnızca belirtilen tip_kodu'na uygun verileri depolayabilir. Farklı tiplerde eleman eklemeye çalışmak TypeError hatasına yol açar. Bu, list'in esnekliğine kıyasla bir kısıtlamadır.
Performans: Tip-belirli olması ve doğrudan bellek erişimine izin vermesi nedeniyle, özellikle sayısal işlemler ve dosya G/Ç (I/O) operasyonlarında array nesneleri list'lere göre daha hızlı performans sergileyebilir.
list ile Farkı: Python'da list, farklı veri tiplerini aynı anda barındırabilen genel amaçlı, dinamik bir dizi gibidir. array.array ise belirli bir veri tipine sıkı sıkıya bağlıdır ve genellikle büyük, homojen sayısal veri koleksiyonları için tercih edilir. Eğer esnekliğe ihtiyacınız varsa list kullanın; bellek ve performans kritikse ve verileriniz homojense array düşünün.
Modül İçe Aktarma: array modülü standart kütüphanenin bir parçasıdır ve ek kurulum gerektirmez. Kullanmadan önce from array import array veya import array şeklinde içe aktarmalısınız.
Diğer Operasyonlar: array nesneleri, append(), extend(), insert(), pop(), remove() gibi list'e benzer birçok yöntemi destekler. Ayrıca tofile(), fromfile(), tobytes(), frombytes() gibi ikili dosya ve bayt işlemleri için özel yöntemleri de vardır.
                z-index özelliği, üç boyutlu bir düzen hissi yaratmada kritik bir rol oynar. Bu özellik, çakışan öğelerin hangi sırayla görüntüleneceğini belirleyerek görsel hiyerarşiyi yönetir.
z-index özelliği, bir öğenin yığılma sırasını belirlemek için bir tamsayı değeri alır.
element {
  position: ; /* required */
  z-index:  | auto;
}
  z-index özelliğinin doğru şekilde çalışabilmesi için, hedef öğenin mutlaka position özelliği değerinin static dışında (yani relative, absolute, fixed veya sticky) bir değere sahip olması gerekir. Aksi takdirde, z-index'in hiçbir etkisi olmayacaktır.
Değerler aşağıdaki gibidir:
: Bu, öğenin yığılma bağlamı içindeki dikey sırasını belirleyen bir tamsayıdır. Daha yüksek bir değer, öğenin diğerlerine göre daha önde görünmesini sağlar. Negatif değerler de kullanılabilir ve bu durumda öğe, varsayılan akıştaki öğelerin arkasına yerleşebilir. Örnek: 1, 100, -5.
auto: Bu, öğenin yığılma sırasının ebeveyninin yığılma sırasıyla aynı olmasını sağlar. Bu, varsayılan değerdir ve yeni bir yığılma bağlamı oluşturmaz.
Aşağıdaki örnek, çakışan iki kutunun z-index kullanılarak nasıl sıralandığını göstermektedir. Kutulardan biri diğerinin üzerinde görünecektir.
Z-index Örneği 
  Kutu 1
  Kutu 2
Yukarıdaki örnekte, .box2 sınıfına sahip öğe, z-index: 2; değeri sayesinde .box1 sınıfına sahip öğenin (z-index: 1;) üzerinde görüntülenecektir. Eğer z-index değerleri eşit olsaydı veya hiç belirtilmeseydi, HTML yapısındaki sıraya göre daha sonra gelen öğe daha üstte olurdu.
Negatif z-index kullanımı ile bir öğeyi diğer öğelerin veya arka planın arkasına yerleştirmek mümkündür. Bu, özellikle sabit başlıkların veya menülerin içeriğin arkasına geçmesi istenen durumlarda faydalıdır.
Negatif Z-index Örneği 
  Sabit Başlık (Z-index: -1)
  
    Bu içerik, başlığın üzerinde görünecektir.
    
    Aşağı kaydırarak başlığın içeriğin arkasına geçtiğini görebilirsiniz.
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  
position Gerekliliği: z-index özelliği yalnızca position değeri static olmayan (relative, absolute, fixed veya sticky) öğeler üzerinde etkilidir.
Yığılma Bağlamı (Stacking Context): Her z-index değeri, bir yığılma bağlamı içinde değerlendirilir. Bir öğe yeni bir yığılma bağlamı oluşturduğunda, onun içindeki tüm alt öğeler, ebeveynlerinin z-index değeri tarafından belirlenen o bağlam içinde sıralanır. Ebeveynin z-index değeri, alt öğelerin kendi aralarındaki sıralamadan önce gelir.
Yeni Yığılma Bağlamı Oluşturan Durumlar: position değeri static olmayan ve z-index değeri auto dışında olan öğeler yeni bir yığılma bağlamı oluşturur. Ayrıca, opacity değeri 1'den küçük olan, transform, filter, perspective gibi belirli CSS özelliklerini içeren öğeler de yeni yığılma bağlamları oluşturabilir.
Sıra Belirleme: Aynı yığılma bağlamında ve aynı z-index değerine sahip iki öğe arasında, HTML belgesinde daha sonra tanımlanan öğe görsel olarak daha üstte görünür.
Negatif Değerler: Negatif z-index değerleri, bir öğeyi genellikle varsayılan akıştaki öğelerin arkasına, hatta bazen body veya html arka planının arkasına bile yerleştirebilir. Ancak bu, tarayıcı ve diğer stillere bağlı olarak dikkatle kullanılmalıdır.
                JavaScript, ES6 (ECMAScript 2015) ile birlikte nesne yönelimli programlama (OOP) ilkelerini daha net ve tanıdık bir sözdizimi ile uygulamak için sınıfları (classes) tanıttı. Sınıflar, prototip tabanlı kalıtım üzerine inşa edilmiş sentaktik bir şeker (syntactic sugar) olup, nesne oluşturmak ve kalıtımı yönetmek için daha anlaşılır bir yapı sunar. Bu makale, JavaScript sınıflarının temel kullanımını, sözdizimini ve pratik uygulamalarını detaylı bir şekilde ele alacaktır.
class SınıfAdı {
  constructor(parametre1, parametre2) {
    this.özellik1 = parametre1;
    this.özellik2 = parametre2;
  }
  metotAdı(argüman) {
    // Metot içeriği
    return this.özellik1 + argüman;
  }
  get getterAdı() {
    return this.özellik1;
  }
  set setterAdı(yeniDeğer) {
    this.özellik1 = yeniDeğer;
  }
  static statikMetot() {
    return "Bu bir statik metottur.";
  }
}
JavaScript sınıfları, bir nesnenin nasıl oluşturulacağını tanımlayan bir şablon görevi görür. Temel bileşenleri şunlardır:
class Anahtar Kelimesi: Bir sınıf tanımlamak için kullanılır. Sınıf adı genellikle büyük harfle başlar (PascalCase).
constructor() Metodu: Bir sınıfın özel bir metodudur. Sınıftan yeni bir nesne (instance) oluşturulduğunda otomatik olarak çağrılır. Nesnenin başlangıç durumunu (özelliklerini) ayarlamak için kullanılır. Eğer bir sınıf için açıkça bir constructor tanımlanmazsa, JavaScript varsayılan, boş bir constructor ekler.
Özellikler (Properties): Sınıf örneklerinin sahip olduğu verilerdir. constructor içinde this.özellikAdı = değer; şeklinde tanımlanır ve her örnek için benzersiz olabilir.
Metotlar (Methods): Sınıf örneklerinin gerçekleştirebileceği eylemleri tanımlayan fonksiyonlardır. metotAdı(argümanlar) { ... } şeklinde tanımlanır ve sınıfın prototipine eklenir.
Getter ve Setter Metotları: Özelliklerin değerlerine kontrollü erişim sağlamak için kullanılırlar. Bir özelliğin değerini okumak için get, değiştirmek için set anahtar kelimeleriyle tanımlanırlar. Bunlar aslında birer fonksiyon olmasına rağmen, özellik gibi erişilirler.
Statik Metotlar (Static Methods): Bir sınıfın kendisine ait olan, ancak sınıfın örneklerine ait olmayan metotlardır. Bu metotlar, sınıfın adıyla doğrudan çağrılır ve genellikle sınıfın örneklerine özgü olmayan yardımcı fonksiyonlar veya fabrika metotları için kullanılır. static anahtar kelimesiyle tanımlanır.
Örnek 1: Temel Sınıf Tanımlama ve Kullanımı
Aşağıdaki örnek, bir Kişi sınıfının nasıl tanımlandığını ve bu sınıftan nasıl nesneler oluşturulduğunu göstermektedir. Ayrıca sınıfın metotlarının nasıl çağrıldığını da içerir.
class Kişi {
  constructor(ad, soyad, yaş) {
    this.ad = ad;
    this.soyad = soyad;
    this.yaş = yaş;
  }
  tamAdGetir() {
    return `${this.ad} ${this.soyad}`;
  }
  yaşınıArtır() {
    this.yaş++;
    console.log(`${this.tamAdGetir()} şimdi ${this.yaş} yaşında.`);
  }
}
// Sınıftan yeni bir nesne oluşturma
const kişi1 = new Kişi("Ali", "Can", 30);
console.log(kişi1.tamAdGetir()); // Çıktı: Ali Can
const kişi2 = new Kişi("Ayşe", "Yılmaz", 25);
kişi2.yaşınıArtır(); // Çıktı: Ayşe Yılmaz şimdi 26 yaşında.
Örnek 2: Kalıtım (Inheritance) Kullanımı
Sınıflar, extends anahtar kelimesiyle başka bir sınıftan kalıtım alabilir. Bu, alt sınıfın üst sınıfın özelliklerini ve metotlarını miras almasını sağlar.
class Çalışan extends Kişi {
  constructor(ad, soyad, yaş, pozisyon) {
    super(ad, soyad, yaş); // Üst sınıfın constructor'ını çağırır
    this.pozisyon = pozisyon;
  }
  çalışmaDurumu() {
    return `${this.tamAdGetir()} ${this.pozisyon} pozisyonunda çalışmaktadır.`;
  }
}
const çalışan1 = new Çalışan("Deniz", "Ak", 35, "Yazılımcı");
console.log(çalışan1.tamAdGetir()); // Çıktı: Deniz Ak (Kişi sınıfından miras alındı)
console.log(çalışan1.çalışmaDurumu()); // Çıktı: Deniz Ak Yazılımcı pozisyonunda çalışmaktadır.
çalışan1.yaşınıArtır(); // Çıktı: Deniz Ak şimdi 36 yaşında. (Kişi sınıfından miras alındı)
Örnek 3: Getter, Setter ve Statik Metot Kullanımı
Bu örnek, bir sınıf içinde getter, setter ve statik metotların nasıl tanımlanıp kullanılacağını göstermektedir.
class Ayarlar {
  constructor(tema) {
    this._tema = tema; // Özel bir özellik gibi davranır
  }
  get tema() {
    return this._tema;
  }
  set tema(yeniTema) {
    if (yeniTema === "açık" || yeniTema === "koyu") {
      this._tema = yeniTema;
      console.log(`Tema ${yeniTema} olarak ayarlandı.`);
    } else {
      console.warn("Geçersiz tema değeri. 'açık' veya 'koyu' kullanın.");
    }
  }
  static uygulamaBilgisi() {
    return "Uygulama Adı: MyWebApp v1.0";
  }
}
const kullanıcıAyarları = new Ayarlar("koyu");
console.log(kullanıcıAyarları.tema); // Çıktı: koyu (getter çağrıldı)
kullanıcıAyarları.tema = "açık"; // setter çağrıldı
console.log(kullanıcıAyarları.tema); // Çıktı: açık
kullanıcıAyarları.tema = "mavi"; // Geçersiz tema uyarısı
console.log(Ayarlar.uygulamaBilgisi()); // Çıktı: Uygulama Adı: MyWebApp v1.0 (statik metot çağrıldı)
Hoisting Yok: Fonksiyon bildirimlerinin aksine, JavaScript sınıfları "hoist" edilmezler. Yani, bir sınıfı tanımlamadan önce kullanamazsınız. Önce sınıfı tanımlamalı, sonra örneğini oluşturmalısınız.
Tek Sorumluluk Prensibi: Her sınıfın tek bir sorumluluğu olmaya özen gösterin. Bu, kodunuzu daha okunabilir, sürdürülebilir ve test edilebilir hale getirir.
this Anahtar Kelimesi: Sınıf metotları içinde this anahtar kelimesi, o metodu çağıran sınıf örneğine (instance) referans verir. this'in bağlamı (context) fonksiyonun nasıl çağrıldığına bağlı olarak değişebilir, bu nedenle özellikle callback fonksiyonlarında dikkatli olun (gerekirse arrow fonksiyonları veya .bind() kullanın).
super() Kullanımı: Alt sınıfların constructor metodunda, üst sınıfın constructor metodunu çağırmak için super() kullanılmalıdır. super() çağrılmadan önce this anahtar kelimesine erişilemez.
Sınıflar Fonksiyondur: JavaScript sınıfları aslında özel bir tür fonksiyondur. typeof SınıfAdı ifadesi "function" döndürür. Bu, JavaScript'in prototip tabanlı doğasının bir yansımasıdır.
                SQL, ilişkisel veritabanlarını yönetmek ve sorgulamak için kullanılan güçlü bir dildir. Veri tabanlarından belirli koşullara uyan kayıtları çekmek, analitik ve raporlama süreçlerinin temelini oluşturur. Bu bağlamda, belirli bir aralıktaki değerleri filtrelemek için kullanılan BETWEEN operatörü, sorguları daha okunabilir ve etkili hale getiren önemli bir araçtır. Bu makale, BETWEEN operatörünün sözdizimini, detaylı kullanımını ve pratik örneklerini ele alacaktır.
BETWEEN operatörünün temel sözdizimi aşağıdaki gibidir:
SELECT kolon1, kolon2, ...
FROM tablo_adi
WHERE kolon_adi BETWEEN deger1 AND deger2;Yukarıdaki sözdiziminde yer alan her bir bileşenin anlamı aşağıda açıklanmıştır:
SELECT kolon1, kolon2, ...: Sorgu sonucunda gösterilmesini istediğiniz kolonları belirtirsiniz. Tüm kolonları seçmek için * kullanabilirsiniz.
FROM tablo_adi: Verilerin çekileceği tablonun adını belirtir.
WHERE kolon_adi: Filtreleme koşulunun uygulanacağı kolonu belirtir. Bu kolon, sayısal, metin veya tarih/saat veri tipinde olabilir.
BETWEEN: Belirtilen aralığın başlangıcını ve sonunu dahil ederek bir koşul oluşturduğunu belirten anahtar kelimedir.
deger1: Aralık başlangıç değeridir. Bu değer, kolon_adi ile aynı veri tipinde olmalıdır.
AND: BETWEEN operatörü ile birlikte kullanılan ve aralık bitiş değerini belirten mantıksal operatördür.
deger2: Aralık bitiş değeridir. Bu değer de kolon_adi ile aynı veri tipinde olmalıdır.
BETWEEN operatörü, deger1 ve deger2 dahil olmak üzere, bu iki değer arasındaki tüm kayıtları döndürür. Mantıksal olarak, kolon_adi >= deger1 AND kolon_adi <= deger2 ifadesine eşdeğerdir.
Aşağıdaki örnekler, BETWEEN operatörünün farklı veri tipleriyle nasıl kullanılabileceğini göstermektedir. Örneklerde Urunler adında bir tablo varsayılmıştır.
Örnek 1: Sayısal Değerler Arasında Sorgulama
Fiyatı 50 ile 100 (dahil) arasında olan ürünleri listeleme.
SELECT UrunAdi, Fiyat
FROM Urunler
WHERE Fiyat BETWEEN 50 AND 100;Örnek 2: Tarih Değerleri Arasında Sorgulama
2023 yılının Mart ayı içinde (1 Mart 2023 ile 31 Mart 2023 dahil) eklenen ürünleri listeleme.
SELECT UrunAdi, EklenmeTarihi
FROM Urunler
WHERE EklenmeTarihi BETWEEN '2023-03-01' AND '2023-03-31';Örnek 3: Metin Değerleri Arasında Sorgulama (Alfabetik Sıraya Göre)
UrunAdi 'A' ile 'C' arasında (alfabetik olarak 'A' ve 'C' dahil, 'D'den küçük) olan ürünleri listeleme.
SELECT UrunAdi, Fiyat
FROM Urunler
WHERE UrunAdi BETWEEN 'A' AND 'C';Not: Metin değerlerinde BETWEEN kullanımı, veritabanının harf duyarlılığı (case sensitivity) ayarına göre farklı sonuçlar verebilir. Bazı sistemlerde 'C' ile 'Czzzz' arasındaki tüm değerleri kapsarken, bazılarında sadece 'C' ile başlayanları veya 'C' harfini kapsar. Genellikle belirtilen üst değerin ilk harfini takip eden değerlere kadar kapsar.
Örnek 4: NOT BETWEEN Kullanımı
Fiyatı 50 ile 100 arasında OLMAYAN ürünleri listeleme.
SELECT UrunAdi, Fiyat
FROM Urunler
WHERE Fiyat NOT BETWEEN 50 AND 100;Dahil Edicilik: BETWEEN operatörü, belirtilen başlangıç ve bitiş değerlerini sorgu sonucuna dahil eder. Yani, deger1 <= kolon_adi <= deger2 koşulunu sağlar.
Veri Tipi Tutarlılığı: BETWEEN operatörü ile kullanılan değerlerin (deger1 ve deger2) sorgulanan kolonun veri tipiyle uyumlu olması önemlidir. Aksi takdirde hatalı sonuçlar veya tip uyumsuzluğu hataları oluşabilir.
Tarih ve Saat Hassasiyeti: Tarih ve saat değerleriyle çalışırken dikkatli olunmalıdır. Örneğin, BETWEEN '2023-01-01' AND '2023-01-31' ifadesi, 31 Ocak 2023'ün sadece başlangıcını (00:00:00) kapsar. Eğer o günün tüm saatlerini dahil etmek istiyorsanız, bitiş değerini '2023-01-31 23:59:59.999' (veritabanı hassasiyetine göre) gibi bir değere ayarlamanız gerekebilir veya < operatörünü kullanarak WHERE EklenmeTarihi >= '2023-01-01' AND EklenmeTarihi < '2023-02-01' şeklinde bir yaklaşım tercih edebilirsiniz.
Sıralama Önemi: BETWEEN deger1 AND deger2 ifadesinde deger1 genellikle deger2'den küçük veya eşit olmalıdır. Çoğu veritabanı yönetim sistemi (DBMS), deger1'in deger2'den büyük olması durumunda boş bir sonuç kümesi döndürecektir.
Alternatif Kullanım: BETWEEN operatörünün alternatifi olarak >= ve <= operatörleri ile AND mantıksal operatörü kullanılabilir. Örneğin, WHERE Fiyat >= 50 AND Fiyat <= 100 ifadesi, WHERE Fiyat BETWEEN 50 AND 100 ile aynı sonucu verir. BETWEEN genellikle sorgunun okunabilirliğini artırır.
                Python'da iterators (yineleyiciler), verimli ve bellek dostu bir şekilde veri koleksiyonları üzerinde gezinmek için temel bir mekanizma sunar. Bu kavram, listeler, demetler, dizeler gibi standart koleksiyon türlerinin ve özel veri yapılarının nasıl döngülenebildiğini anlamak için hayati öneme sahiptir. Bir iterator, bir dizi veri üzerinde adım adım ilerlemeyi sağlayan bir nesnedir ve Python'ın for döngülerinin arkasındaki gücü temsil eder. Bu makale, Python iterators kavramını, temel sözdizimini ve pratik uygulama yöntemlerini detaylı bir şekilde açıklayacaktır.
Python'da bir iterator oluşturmak ve kullanmak için temel olarak iki ana fonksiyon ve özel metotlar bulunur:
iter(): Bir nesneden bir iterator elde etmek için kullanılır.
next(): Bir iteratörden bir sonraki öğeyi almak için kullanılır.
Kendi iterator'ınızı tanımlamak istediğinizde, sınıfınızda aşağıdaki özel metotları (`dunder metotlar`) uygulamanız gerekmektedir:
__iter__(self): Bu metot, bir iteratör nesnesi döndürmelidir. Genellikle, bu metot çağrıldığında `self` (nesnenin kendisi) döndürülür.
__next__(self): Bu metot, bir sonraki öğeyi döndürmelidir. Tüm öğeler tüketildiğinde, StopIteration istisnasını yükseltmelidir.
Bir iterable (yinelenebilir) nesne, üzerinde döngü yapılabilecek herhangi bir nesnedir; yani, bu nesneden bir iterator elde edilebilir. Listeler, demetler, dizeler ve sözlükler Python'daki yaygın yinelenebilir nesnelerdir. Bu nesneler, __iter__() metodunu uygularlar ve bu metot çağrıldığında kendilerinden bir iterator nesnesi döndürürler.
Bir iterator ise, bir iterable nesneden elde edilen ve durumu hatırlayabilen bir nesnedir. Iterator nesnesinin __next__() metodu vardır. Bu metot her çağrıldığında, iterator'ın temsil ettiği veri dizisinden bir sonraki öğeyi verir. Dizide başka öğe kalmadığında, __next__() metodu otomatik olarak StopIteration istisnasını yükseltir. Bu istisna, döngü mekanizmalarına (örneğin for döngüsüne) öğelerin tükendiğini bildirir.
for döngüsü, perde arkasında bu mekanizmayı kullanır: Öncelikle, döngü yapılacak nesne üzerinde iter() fonksiyonunu çağırarak bir iterator elde eder. Ardından, her döngü adımında bu iterator üzerinde next() fonksiyonunu çağırır. StopIteration istisnası yükseltildiğinde döngüyü sonlandırır.
Aşağıdaki örnekler, Python iterators'ın nasıl çalıştığını ve nasıl kendi iterator'ınızı oluşturabileceğinizi göstermektedir.
Bir liste üzerinde iter() ve next() fonksiyonlarının doğrudan kullanımını inceleyelim.
# Bir iterable liste tanımlayın
my_list = [10, 20, 30, 40]
# Listeden bir iterator elde edin
my_iterator = iter(my_list)
# next() fonksiyonunu kullanarak öğeleri tek tek alın
print(next(my_iterator)) # Çıktı: 10
print(next(my_iterator)) # Çıktı: 20
print(next(my_iterator)) # Çıktı: 30
print(next(my_iterator)) # Çıktı: 40
# Tüm öğeler tüketildiğinde StopIteration istisnası yükselir
# print(next(my_iterator)) # Hata: StopIteration
Belirli bir aralıktaki sayıları üreten özel bir iterator sınıfı tanımlayalım.
class MyRangeIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end
    def __iter__(self):
        # Iterator nesnesinin kendisini döndürür
        return self
    def __next__(self):
        if self.current < self.end:
            # Mevcut değeri döndür ve bir sonraki adıma hazırla
            value = self.current
            self.current += 1
            return value
        else:
            # Aralık bittiğinde StopIteration yükselt
            raise StopIteration
# Kendi iterator sınıfımızı kullanarak bir nesne oluşturalım
my_custom_range = MyRangeIterator(1, 5)
# for döngüsü ile iterator'ı kullanalım
print("For döngüsü ile:")
for num in my_custom_range:
    print(num)
# Çıktı: 1 2 3 4
# Iterator bir kez tüketildikten sonra tekrar kullanılamaz (yeni bir nesne oluşturulmalı)
print("\nManuel next() ile (yeni iterator):")
my_custom_range_manual = MyRangeIterator(1, 3)
print(next(my_custom_range_manual)) # Çıktı: 1
print(next(my_custom_range_manual)) # Çıktı: 2
# print(next(my_custom_range_manual)) # Hata: StopIteration
Iterable ve Iterator Farkı: Bir iterable, üzerinde döngü yapılabilecek bir nesnedir (__iter__() metoduna sahiptir). Bir iterator ise, bu iterable'dan elde edilen ve bir sonraki öğeyi döndürme yeteneğine sahip olan (__next__() metoduna sahip) bir nesnedir. Her iterator bir iterable'dır, ancak her iterable bir iterator değildir.
Bellek Verimliliği: Iteratorlar, tüm veri kümesini belleğe yüklemek yerine, öğeleri talep edildiğinde birer birer ürettikleri için özellikle büyük veri kümeleriyle çalışırken bellek dostu bir çözüm sunar. Bu, "lazy evaluation" (tembel değerlendirme) prensibine dayanır.
StopIteration İstisnası: Bu istisna, bir iterator'ın tüm öğelerini tüketmesi durumunda __next__() metodu tarafından otomatik olarak yükseltilir. Bu, Python'daki döngü mekanizmalarının döngüyü güvenli bir şekilde sonlandırmasını sağlar.
Tek Kullanımlık Yapı: Çoğu iterator, öğeleri bir kez tükettikten sonra sıfırlanmaz ve tekrar kullanılamaz. Eğer aynı veri kümesi üzerinde tekrar döngü yapmak isterseniz, iterable nesneden yeni bir iterator elde etmeniz gerekir.
Generator'lar ile İlişkisi: Python'da generator'lar, iterator oluşturmanın daha basit ve kısa bir yoludur. yield anahtar kelimesi kullanılarak tanımlanan generator fonksiyonları veya generator ifadeleri, otomatik olarak bir iterator döndürür ve __iter__() ile __next__() metotlarını sizin yerinize yönetir.
                overflow özelliği, bu tür içerik taşmalarını yönetmek için güçlü bir mekanizma sunar. Bu özellik, bir elementin içeriği, belirtilen boyutlarından daha büyük olduğunda ne olacağını kontrol etmeyi sağlar. Doğru kullanıldığında, overflow özelliği web sayfalarının düzenini korurken kullanıcı deneyimini önemli ölçüde iyileştirebilir. Bu makale, overflow özelliğinin sözdizimini, değerlerini ve pratik kullanım senaryolarını detaylı bir şekilde inceleyecektir.overflow özelliği, bir elementin içeriğinin kutusunun dışına taştığı zaman ne olacağını belirler. Bu özellik hem yatay (overflow-x) hem de dikey (overflow-y) taşmaları ayrı ayrı kontrol etmek için kullanılabilir, veya kısa yol olarak overflow tek başına her iki yönü de aynı anda etkileyebilir.
selector {
  overflow: visible | hidden | scroll | auto | initial | inherit;
  overflow-x: visible | hidden | scroll | auto | initial | inherit; /* Yatay taşmayı kontrol eder */
  overflow-y: visible | hidden | scroll | auto | initial | inherit; /* Dikey taşmayı kontrol eder */
}
overflow özelliğinin alabileceği anahtar kelime değerleri ve bunların anlamları aşağıda açıklanmıştır.visible: Varsayılan değerdir. İçerik, elementin kutusunun dışına taşsa bile görünür kalır. Bu durum, diğer elementlerin üzerine binebilir ve sayfa düzenini bozabilir.
hidden: İçeriğin elementin kutusunun dışına taşan kısımlarını gizler. Kullanıcı bu gizli içeriğe erişemez.
scroll: Hem yatay hem de dikey yönlerde kaydırma çubukları ekler, içerik taşsın veya taşmasın. Bu, her zaman kaydırma çubuklarının görünür olacağı anlamına gelir, bu da bazen görsel tutarsızlığa neden olabilir.
auto: Yalnızca içerik taştığında kaydırma çubuklarını ekler. Yatay veya dikey taşma varsa, ilgili kaydırma çubuğu görünür hale gelir. Bu genellikle en esnek ve kullanıcı dostu seçenektir.
overlay: scroll ile benzerdir ancak kaydırma çubukları içeriğin üzerine biner, bu da içeriğin boyutunu küçültmez. Modern tarayıcılarda bu genellikle auto ile aynı şekilde davranır, ancak eski tarayıcılarda farklılık gösterebilir.
initial: Özelliği varsayılan değerine ayarlar (visible).
inherit: Özelliği üst elementinden miras alır.
overflow özelliğinin farklı değerlerinin nasıl çalıştığını göstermektedir. Her örnekte, .container sınıfına sahip bir  elementi, belirli bir genişlik ve yüksekliğe sahip olup, içine sığmayan uzun bir metin içerir.
Örnek 1: overflow: visible; (Varsayılan Davranış)
Bu örnekte, içerik elementin dışına taşacak ve görünür kalacaktır.
  Bu metin, kabın belirlenen boyutlarından çok daha uzundur. overflow: visible; değeri nedeniyle, metin kabın dışına taşacak ve tamamen görünür kalacaktır. Bu, diğer sayfa elementleriyle çakışmalara neden olabilir ve genel düzeni bozabilir. Web sayfalarında bu varsayılan davranışı kontrol etmek önemlidir.
/* CSS Kodu */
.visible-example {
  width: 200px;
  height: 100px;
  border: 2px solid #ccc;
  overflow: visible; /* Varsayılan değer */
}
Örnek 2: overflow: hidden;
İçeriğin taşan kısımları gizlenecektir. Kullanıcı bu kısımları göremez veya erişemez.
/* CSS Kodu */
.hidden-example {
  width: 200px;
  height: 100px;
  border: 2px solid #ccc;
  overflow: hidden;
}
Örnek 3: overflow: scroll;
Taşma olsun olmasın, her zaman kaydırma çubukları görünecektir.
  Bu metin, kabın belirlenen boyutlarından çok daha uzundur. overflow: scroll; değeri sayesinde, içeriğe erişmek için her zaman kaydırma çubukları görünecektir, içerik taşsa da taşmasa da. Hem yatay hem de dikey kaydırma çubukları her zaman mevcuttur. Bu, tutarlı bir kullanıcı arayüzü sağlayabilir ancak bazen gereksiz kaydırma çubuklarına yol açabilir.
/* CSS Kodu */
.scroll-example {
  width: 200px;
  height: 100px;
  border: 2px solid #ccc;
  overflow: scroll;
}
Örnek 4: overflow: auto;
Yalnızca içerik taştığında kaydırma çubukları görünecektir. Bu, genellikle en iyi uygulamadır.
  Bu metin, kabın belirlenen boyutlarından çok daha uzundur. overflow: auto; değeri en esnek çözümü sunar; sadece içerik taştığında ilgili kaydırma çubukları (yatay veya dikey) görünür hale gelir. İçerik sığıyorsa, kaydırma çubukları görünmez. Bu, kullanıcı deneyimini optimize eder.
/* CSS Kodu */
.auto-example {
  width: 200px;
  height: 100px;
  border: 2px solid #ccc;
  overflow: auto;
}
Örnek 5: overflow-x ve overflow-y kullanımı
Bu örnekte, yatay taşma gizlenirken dikey taşma için kaydırma çubuğu eklenecektir.
  Bu metin, özellikle yatayda çok uzun, dikeyde ise normalden biraz daha uzundur. overflow-x: hidden; ve overflow-y: scroll; değerleri ile yatay taşma gizlenecek, ancak dikey taşma için kaydırma çubuğu her zaman görünür olacaktır. Bu, farklı yönlerde farklı taşma davranışları gerektiğinde faydalıdır.
/* CSS Kodu */
.specific-example {
  width: 150px;
  height: 100px;
  border: 2px solid #ccc;
  white-space: nowrap; /* Metnin yatayda taşmasını sağlamak için */
  overflow-x: hidden;
  overflow-y: scroll;
}
Önemli Notlar
overflow özelliğini kullanırken, elemente mutlaka bir width veya max-width ile height veya max-height değeri atamanız önemlidir. Aksi takdirde, element içeriğine göre genişleyip daralacağı için taşma durumu oluşmayabilir.
 
overflow: hidden; kullanırken dikkatli olun. Önemli içeriğin kullanıcıdan gizlenmesine neden olabilir ve erişilebilirlik sorunları yaratabilir.
 
overflow: scroll; her zaman kaydırma çubukları göstereceği için, içeriğin taşmadığı durumlarda bile gereksiz görsel öğeler yaratabilir. Genellikle overflow: auto; daha iyi bir kullanıcı deneyimi sunar.
 
Satır içi elementler (,  vb.) için overflow özelliği doğrudan uygulanamaz. Bu elementlerin display özelliği block, inline-block veya flex gibi bir değere ayarlanmalıdır.
 
position: absolute; veya position: fixed; ile konumlandırılmış alt elementler, üst elementlerinin overflow özelliğinden etkilenmeyebilir. Bu durum, taşma bağlamını (stacking context) anlamayı gerektirir.
 
Özellikle mobil cihazlarda kaydırma çubuklarının görünümü ve davranışı tarayıcılar arasında farklılık gösterebilir. Kaydırma çubuklarını özelleştirmek için tarayıcı önekli CSS özellikleri kullanılabilir (örneğin, Webkit tabanlı tarayıcılar için ::-webkit-scrollbar).
 
                    
                    
                        
                        
                            11                        
                        
                        
                            0                        
                    
                
                SQL (Yapısal Sorgu Dili), veritabanlarından bilgi almak, yönetmek ve değiştirmek için kullanılan güçlü bir dildir. Büyük ve karmaşık veritabanlarıyla çalışırken, sorguların anlaşılırlığı ve bakımı kritik öneme sahiptir. İşte bu noktada SQL Aliases (takma adlar) devreye girer. Aliases, tablolara veya sütunlara geçici olarak farklı bir ad atamanıza olanak tanır. Bu sayede sorgularınız daha kısa, daha okunabilir ve aynı zamanda daha yönetilebilir hale gelir. Özellikle uzun tablo adları, karmaşık sütun ifadeleri veya birden fazla tablonun birleştirildiği durumlarda aliases kullanımı, sorgu mantığını netleştirmek için vazgeçilmez bir araçtır.
SQL Aliases kullanımı iki ana formda incelenebilir: sütun aliases ve tablo aliases.
Sütun Aliases:
SELECT column_name AS alias_name
FROM table_name;veya
SELECT column_name alias_name
FROM table_name;Tablo Aliases:
SELECT alias_name.column_name
FROM table_name AS alias_name;veya
SELECT alias_name.column_name
FROM table_name alias_name;Her iki alias türü de sorgunun kapsamı içinde geçerli olan geçici isimler atar ve veritabanındaki gerçek tablo veya sütun adlarını değiştirmez.
AS Anahtar Kelimesi: Sütun veya tablo aliases tanımlarken AS anahtar kelimesi isteğe bağlıdır. Ancak, sorgu okunabilirliğini artırdığı için genellikle kullanılması tavsiye edilir. Örneğin, SELECT column_name AS alias_name ifadesi, SELECT column_name alias_name ifadesine göre daha açıklayıcıdır.
Sütun Aliases: Bir sütuna veya bir sütun ifadesine (örneğin, iki sütunun birleştirilmesi veya bir matematiksel işlem sonucu) geçici bir ad vermek için kullanılır. Bu, özellikle raporlama amacıyla daha anlamlı ve kullanıcı dostu başlıklar oluşturmak veya hesaplanmış değerlere kolayca referans vermek istediğinizde faydalıdır. Eğer takma ad boşluk içeriyorsa veya özel karakterler barındırıyorsa, çift tırnak (") veya köşeli parantez ([]) içine alınması gerekebilir (veritabanı sistemine göre değişir).
Tablo Aliases: Bir tabloya geçici bir ad vermek için kullanılır. Bu, genellikle karmaşık sorgularda, özellikle JOIN işlemleriyle birden fazla tablo birleştirildiğinde veya bir tablonun kendi kendine birleştirildiği (self-join) durumlarda sorguyu kısaltmak ve sütun adları arasındaki belirsizliği ortadan kaldırmak için çok kullanışlıdır. Tablo takma adları, sorgunun FROM veya JOIN bölümlerinde tanımlanır ve sorgunun geri kalanında tabloya bu takma ad ile referans verilir.
Aşağıdaki örnekler, SQL Aliases'ın farklı senaryolarda nasıl kullanıldığını göstermektedir. Örneklerde Musteriler (MusteriID, Ad, Soyad, Email) ve Siparisler (SiparisID, MusteriID, SiparisTarihi, ToplamTutar) adında iki tablonun var olduğu varsayılmıştır.
Örnek 1: Sütun Takma Adı ile Daha Okunabilir Çıktı
Müşterilerin ad ve soyadını tek bir sütunda 'Tam Adı' olarak görmek isteyelim.
SELECT
    Ad AS MusteriAdi,
    Soyad AS MusteriSoyadi,
    Ad || ' ' || Soyad AS TamAdi
FROM
    Musteriler;Bu sorgu, Ad sütununu MusteriAdi, Soyad sütununu MusteriSoyadi ve Ad ile Soyad'ı birleştirerek oluşan ifadeyi TamAdi olarak döndürür.
Örnek 2: Tablo Takma Adları ile JOIN Sorgusunu Kısaltma
Müşteri adlarını ve yaptıkları siparişlerin toplam tutarlarını listelemek isteyelim.
SELECT
    m.Ad,
    m.Soyad,
    s.SiparisID,
    s.ToplamTutar
FROM
    Musteriler AS m
JOIN
    Siparisler AS s ON m.MusteriID = s.MusteriID
WHERE
    s.ToplamTutar > 100;Burada Musteriler tablosuna m, Siparisler tablosuna ise s takma adı verilmiştir. Bu sayede sorgu içindeki referanslar (örneğin m.Ad yerine Musteriler.Ad) daha kısa ve nettir.
Örnek 3: Hesaplanan Sütuna Takma Ad Verme
Her siparişin ortalama tutarını hesaplayıp, bu ortalamayı 'Ortalama Sipariş Tutarı' olarak adlandıralım.
SELECT
    AVG(ToplamTutar) AS "Ortalama Sipariş Tutarı"
FROM
    Siparisler;Bu örnekte, hesaplanan AVG(ToplamTutar) değerine "Ortalama Sipariş Tutarı" adını verdik. Takma ad boşluk içerdiği için çift tırnak kullanılmıştır.
Örnek 4: Self-Join (Kendine Birleştirme) ile Takma Ad Kullanımı
Aynı şehirden iki farklı müşteriyi bulmak isteyelim (Musteriler tablosunda bir de Sehir sütunu olduğunu varsayalım).
SELECT
    m1.Ad AS Musteri1_Ad,
    m1.Soyad AS Musteri1_Soyad,
    m2.Ad AS Musteri2_Ad,
    m2.Soyad AS Musteri2_Soyad,
    m1.Sehir
FROM
    Musteriler AS m1
JOIN
    Musteriler AS m2 ON m1.Sehir = m2.Sehir AND m1.MusteriID <> m2.MusteriID;Musteriler tablosunu iki farklı takma ad (m1 ve m2) ile kendi kendine birleştirerek, aynı şehirden farklı müşterileri bulabiliyoruz. Takma adlar, hangi sütunun hangi 'versiyon'dan geldiğini netleştirmeye yardımcı olur.
Geçici Kapsam: Aliases, yalnızca oluşturuldukları sorgunun yürütülmesi boyunca geçerlidir. Veritabanının şemasını kalıcı olarak değiştirmezler.
AS İsteğe Bağlıdır: Çoğu SQL veritabanında AS anahtar kelimesi, hem sütun hem de tablo takma adları için isteğe bağlıdır. Ancak, sorgunun okunabilirliğini artırmak için kullanılması şiddetle tavsiye edilir.
Boşluklu veya Özel Karakterli Takma Adlar: Eğer bir takma ad boşluk içeriyorsa veya özel karakterler barındırıyorsa (örneğin, "Toplam Satışlar"), veritabanı sisteminize bağlı olarak çift tırnak ("), köşeli parantez ([]) veya ters tırnak (` `) içine alınması gerekebilir.
Kullanım Kısıtlamaları: Sütun takma adları genellikle SELECT, ORDER BY ve GROUP BY yan tümcelerinde kullanılabilir. Ancak, çoğu veritabanı sisteminde WHERE yan tümcesinde doğrudan kullanılamazlar. Bunun nedeni, WHERE yan tümcesi işlenirken sütun takma adlarının henüz tanımlanmamış olmasıdır. Bu tür durumlarda, takma adı içeren ifadeyi tekrar yazmanız veya bir alt sorgu (subquery) kullanmanız gerekebilir.
Okunabilirlik ve Karmaşıklık: Aliases, sorguları kısaltarak ve anlaşılır hale getirerek okunabilirliği artırır. Ancak, aşırı kısa veya anlamsız takma adlar (örneğin, a, b gibi) kullanmak, sorguyu başka bir geliştiricinin anlamasını zorlaştırabilir. İyi adlandırılmış takma adlar seçmek önemlidir.
                Python programlama dili, kodun yeniden kullanılabilirliğini ve projelerin düzenini sağlamak amacıyla modül kavramını benimsemiştir. Modüller, Python kodunun organize edilmiş birimleridir ve fonksiyonlar, sınıflar, değişkenler gibi yapıları içerebilir. Bu yaklaşım, büyük ölçekli uygulamaların geliştirilmesini kolaylaştırır, kodu daha okunabilir hale getirir ve hata ayıklama sürecini optimize eder. Bir modül, esasen .py uzantılı bir dosyadır ve başka Python programları tarafından içe aktarılarak kullanılabilir. Bu rehber, Python dilinde modüllerin nasıl tanımlandığını, nasıl içe aktarıldığını ve etkin bir şekilde nasıl kullanıldığını adım adım açıklayacaktır.
Python'da bir modülü veya modül içindeki belirli bileşenleri içe aktarmak için çeşitli sözdizimleri mevcuttur. Her bir sözdizimi, farklı kullanım senaryolarına hizmet eder.
Tüm modülü içe aktarma:
import module_nameModülü bir takma ad (alias) ile içe aktarma:
import module_name as alias_nameModülden belirli nesneleri içe aktarma:
from module_name import object_name_1, object_name_2Modülden belirli bir nesneyi takma ad ile içe aktarma:
from module_name import object_name as alias_nameModüldeki tüm nesneleri içe aktarma (önerilmez):
from module_name import *import module_name: Bu ifade, belirtilen modülün tamamını mevcut kapsam içine alır. Modül içindeki fonksiyonlara, sınıflara veya değişkenlere erişmek için her zaman modül adını önek olarak kullanmak gerekir. Örneğin, math modülündeki sqrt fonksiyonuna math.sqrt() şeklinde erişilir.
import module_name as alias_name: Bu yöntem, özellikle uzun modül adlarına sahip modüller için veya farklı modüllerden aynı isimde nesneler içe aktarılırken isim çakışmalarını önlemek amacıyla kullanılır. Modüle daha kısa veya daha açıklayıcı bir takma ad verilir. Kullanım örneği: alias_name.object_name.
from module_name import object_name_1, object_name_2: Bu sözdizimi, bir modülün tamamını değil, yalnızca belirli fonksiyonlarını, sınıflarını veya değişkenlerini içe aktarır. İçe aktarılan nesneler doğrudan kendi isimleriyle kullanılabilir; modül adını önek olarak kullanmaya gerek kalmaz. Bu, kodun daha kısa ve okunabilir olmasını sağlayabilir.
from module_name import object_name as alias_name: Bu, belirli bir nesneyi içe aktarırken ona bir takma ad atamanın yoludur. Özellikle içe aktarılan nesnenin adı mevcut kapsamdaki başka bir isimle çakışıyorsa veya daha kısa bir isimle kullanılmak isteniyorsa faydalıdır.
from module_name import *: Bu ifade, belirtilen modüldeki tüm genel nesneleri (alt çizgi ile başlamayanlar) mevcut kapsam içine aktarır. Kodun kısalmasını sağlasa da, isim çakışmalarına (namespace pollution) neden olabileceği ve kodun okunabilirliğini azaltabileceği için genellikle önerilmez. Hangi nesnelerin içe aktarıldığını açıkça görmek zorlaşır.
math Modülünü KullanmaBu örnek, Python'ın yerleşik math modülünü kullanarak basit matematiksel işlemlerin nasıl gerçekleştirileceğini gösterir.
import math
# Pi sayısına erişim
print(f"Pi sayısı: {math.pi}")
# Karekök hesaplama
sayi = 16
karekok = math.sqrt(sayi)
print(f"{sayi}'nin karekökü: {karekok}")
# Faktöriyel hesaplama
fakt = math.factorial(5)
print(f"5'in faktöriyeli: {fakt}")random Modülünü Takma Ad ile Kullanmarandom modülünü rnd takma adıyla içe aktararak rastgele sayı üretimini gösteren bir örnektir.
import random as rnd
# 1 ile 100 arasında rastgele bir tam sayı üretme
rastgele_sayi = rnd.randint(1, 100)
print(f"Üretilen rastgele sayı: {rastgele_sayi}")
# Rastgele bir eleman seçme
liste = ["elma", "armut", "kiraz", "muz"]
secilen_meyve = rnd.choice(liste)
print(f"Seçilen meyve: {secilen_meyve}")datetime Modülünden Belirli Nesneleri İçe Aktarmadatetime modülünden sadece date ve timedelta sınıflarını içe aktararak mevcut tarih ve gelecekteki bir tarihi hesaplama örneği.
from datetime import date, timedelta
# Bugünün tarihini alma
bugun = date.today()
print(f"Bugünün tarihi: {bugun}")
# 7 gün sonraki tarihi hesaplama
gelecek_tarih = bugun + timedelta(days=7)
print(f"7 gün sonraki tarih: {gelecek_tarih}")Bu örnek, kendi .py dosyanızı (modülünüzü) oluşturup başka bir Python betiğinde nasıl kullanacağınızı gösterir.
İlk olarak, my_module.py adında bir dosya oluşturalım:
# my_module.py
def selamla(isim):
    """Belirtilen ismi selamlayan bir fonksiyon."""
    return f"Merhaba, {isim}!"
def topla(a, b):
    """İki sayıyı toplayan bir fonksiyon."""
    return a + b
Şimdi bu modülü main_app.py adında başka bir dosyada kullanalım (aynı dizinde olmalılar):
# main_app.py
import my_module
# my_module'deki selamla fonksiyonunu kullanma
mesaj = my_module.selamla("Dünya")
print(mesaj)
# my_module'deki topla fonksiyonunu kullanma
sonuc = my_module.topla(10, 20)
print(f"Toplam: {sonuc}")
# Belirli bir fonksiyonu doğrudan içe aktarma
from my_module import selamla
print(selamla("Python"))İsim Çatışmaları (Namespace Pollution): from module import * ifadesi, modüldeki tüm nesneleri doğrudan mevcut ad alanına getirir. Bu, kendi kodunuzdaki değişken veya fonksiyon isimleriyle çakışmalara yol açabilir ve hatalara neden olabilir. Bu nedenle, bu kullanım genellikle kaçınılması gereken bir pratiktir.
Modül Arama Yolu (sys.path): Python, import ifadesiyle bir modül ararken belirli dizinlere bakar. Bu dizinler sys.path listesinde bulunur. Kendi modüllerinizin bulunabilmesi için ya mevcut çalışma dizininde olmaları ya da sys.path'e eklenmiş bir dizinde yer almaları gerekir.
Göreceli İçe Aktarmalar (Relative Imports): Büyük projelerde, bir paketin içindeki alt modüller arasında içe aktarma yaparken göreceli içe aktarmalar (örneğin, from . import other_module veya from .. import parent_module) kullanılır. Bu, kodun taşınabilirliğini artırır.
Modül Yeniden Yükleme: Bir modülü değiştirdikten sonra, Python yorumlayıcısını yeniden başlatmadan değişiklikleri görmek için importlib.reload(module_name) kullanılabilir. Ancak bu, genellikle geliştirme aşamasında kullanılır ve üretim kodunda nadiren ihtiyaç duyulur.
Modül Adlandırma Kuralları: Python topluluğunda kabul görmüş adlandırma standartlarına (PEP 8) uymak önemlidir. Modül adları genellikle küçük harflerle ve alt çizgilerle ayrılmış kelimelerle (snake_case) yazılır (örneğin, my_utility_module.py).
Döngüsel İçe Aktarmalar (Circular Imports): İki veya daha fazla modülün birbirini doğrudan veya dolaylı olarak içe aktarması durumunda döngüsel içe aktarma oluşur. Bu durum, çalışma zamanı hatalarına yol açabilir ve kodun anlaşılmasını zorlaştırır. Tasarımda bu tür döngülerden kaçınılmalıdır.
                Web belgeleri içerisinde harici kaynaklara, örneğin görsellere, stil sayfalarına veya JavaScript dosyalarına referans vermek, modern web geliştirmenin temelini oluşturur. Bu referanslar, tarayıcının belirtilen kaynağı doğru bir şekilde bulabilmesi için dosya yolları (file paths) aracılığıyla tanımlanır. HTML'de dosya yollarının doğru kullanımı, sitenizin işlevselliği, performans kalitesi ve sürdürülebilirliği açısından kritik öneme sahiptir.
HTML'de dosya yolları temelde iki ana kategoriye ayrılır: göreceli (relative) yollar ve mutlak (absolute) yollar. Her iki yol türünün de kendine özgü kullanım senaryoları ve sözdizimleri mevcuttur.
Göreceli Yollar: Mevcut HTML dosyasının konumuna bağlı olarak hedeflenen kaynağın konumunu belirtir. Sözdizimi, mevcut dizine göre ileri, geri veya aynı dizin içinde gezinmeyi içerir.
        Mutlak Yollar: İki alt kategoriye ayrılır: kök-göreceli (root-relative) yollar ve tam URL (full URL) yollar.
Kök-Göreceli Yollar: Web sitesinin kök dizininden (root directory) başlayarak kaynağın konumunu belirtir. Bir eğik çizgi (/) ile başlar.
                Tam URL Yollar: Protokol (http:// veya https://), alan adı ve kaynağın tam yolu dahil olmak üzere, kaynağın internet üzerindeki tam adresini belirtir. Genellikle harici kaynaklar veya CDN'ler için kullanılır.
Dosya yollarındaki çeşitli gösterimlerin anlamları aşağıdaki gibidir:
dosya.html veya resim.jpg: Bu gösterim, referans verilen dosyanın mevcut HTML dosyasının bulunduğu aynı dizinde olduğunu belirtir. Örneğin, index.html ve resim.jpg aynı klasördeyse,  yeterlidir.
klasor/dosya.html veya css/stil.css: Bu gösterim, referans verilen dosyanın mevcut dizin içindeki belirtilen alt dizinde olduğunu ifade eder. Örneğin, index.html'den css adlı bir alt klasördeki stil.css dosyasına erişmek için href="css/stil.css" kullanılır.
./klasor/dosya.html: Başındaki ./, mevcut dizini (current directory) temsil eder. Bu, klasor/dosya.html ile aynı anlama gelir ancak bazen okunabilirliği artırmak veya mevcut dizini açıkça belirtmek için kullanılır. Çoğu durumda isteğe bağlıdır.
../klasor/dosya.html: ../ gösterimi, mevcut dizinin bir üst dizinini (parent directory) ifade eder. Kaynak, mevcut dosyanın bulunduğu dizinin bir seviye yukarısındaki bir dizinde veya onun alt dizinlerinde yer alıyorsa kullanılır. Örneğin, proje/sayfalar/alt_sayfa.html dosyasından proje/resimler/foto.jpg'ye erişmek için src="../resimler/foto.jpg" kullanılır.
/klasor/dosya.html: Başlangıçtaki /, web sitesinin kök dizinini (root directory) temsil eder. Bu tür yollar, sitenin herhangi bir yerinden kaynağa sabit bir şekilde erişim sağlar ve genellikle büyük sitelerde veya kalıcı bağlantılar için tercih edilir. Örneğin, /img/logo.png, web sitesinin kök dizinindeki img klasörünün içindeki logo.png dosyasını işaret eder.
https://www.example.com/klasor/dosya.html: Bu, kaynağın tam URL'sini ifade eder. Web üzerindeki herhangi bir konumu işaret edebilir ve genellikle harici sitelerden veya CDN'lerden kaynak yüklemek için kullanılır.
Aşağıdaki örnekler, farklı senaryolarda dosya yollarının HTML içerisinde nasıl kullanıldığını göstermektedir:
Örnek 1: Aynı Dizin İçindeki Resim
index.html ve banner.jpg aynı dizinde:
Örnek 2: Alt Dizin İçindeki Stil Dosyası
index.html, css klasörü ve css/main.css:
Örnek 3: Üst Dizin İçindeki JavaScript Dosyası
Dizin yapısı: proje/pages/hakkinda.html ve proje/js/script.js
Örnek 4: Kök-Göreceli Yolla Resim ve Bağlantı
Web sitesinin kök dizininde img ve pages klasörleri var. img/logo.png ve pages/iletisim.html:
Örnek 5: Harici Kaynak (Tam URL)
Bir CDN'den (Content Delivery Network) alınan bir JavaScript kütüphanesi:
Dizin Yapısı: Projenizin dizin yapısını iyi organize etmek, dosya yollarının yönetimini büyük ölçüde kolaylaştırır. Kaynakları mantıksal klasörlere ayırın (örn. img, css, js).
Büyük/Küçük Harf Duyarlılığı: Bazı web sunucuları (özellikle Linux tabanlı olanlar) dosya adlarında ve yollarında büyük/küçük harf duyarlıdır. Örneğin, Resim.jpg ile resim.jpg farklı dosyalar olarak algılanabilir. Tutarlılık için genellikle küçük harf kullanılması tavsiye edilir.
Kök-Göreceli Yolların Avantajları: Kök-göreceli yollar, sayfanın konumu değişse bile (örn. URL yeniden yazma veya sayfa derinliği) kaynaklara erişimi sabit tutar. Bu, büyük ve karmaşık sitelerde bağlantı yönetimini basitleştirir.
Göreceli Yolların Dezavantajları: Göreceli yollar, HTML dosyasının konumu değiştiğinde bozulabilir. Geliştirme ortamında çalışırken pratik olsa da, dinamik URL yapılarına sahip sitelerde sorunlara yol açabilir.
Boşluk ve Özel Karakterler: Dosya ve klasör adlarında boşluk veya özel karakterler (örn. #, &, %) kullanmaktan kaçının. Bu durumlar URL kodlaması gerektirebilir ve hatalara yol açabilir. Bunun yerine kısa çizgiler (-) veya alt çizgiler (_) tercih edin.
Test Etme: Her zaman tüm dosya yollarınızı farklı tarayıcılarda ve farklı sunucu ortamlarında test edin. Geliştirme ortamınızda çalışan bir yol, üretim sunucusunda çalışmayabilir.
                JavaScript, doğası gereği tek iş parçacıklı (single-threaded) bir dildir. Bu durum, uzun süren veya dış kaynaklara bağımlı işlemleri (örneğin, ağ istekleri, dosya okuma/yazma) doğrudan ana iş parçacığında yürütmenin kullanıcı arayüzünü kilitlemesine ve uygulamanın donmasına neden olacağı anlamına gelir. Bu tür senaryolarda uygulamanın yanıt verebilirliğini korumak ve verimli çalışmasını sağlamak için asenkron programlama teknikleri kullanılır. Bu kılavuz, JavaScript'te asenkron işlemlerin nasıl yönetildiğini, özellikle modern async/await sözdizimi ve altında yatan Promise mekanizmasını adım adım açıklamaktadır.
Modern JavaScript'te asenkron kod yazmanın en yaygın ve okunabilir yolu async ve await anahtar kelimelerini kullanmaktır. Bu sözdizimi, Promise tabanlı asenkron kodun senkron koda benzer bir şekilde yazılmasını sağlar.
async function fetchData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    console.log(data);
  } catch (error) {
    console.error('Veri çekme hatası:', error);
  }
}
fetchData();
async Anahtar Kelimesi:
    Bir fonksiyonun önüne async anahtar kelimesini eklemek, o fonksiyonu her zaman bir Promise döndüren asenkron bir fonksiyon yapar. Eğer fonksiyon açıkça bir Promise döndürmüyorsa, JavaScript otomatik olarak döndürülen değeri bir Promise içine sarar. Bu, asenkron fonksiyonların zincirleme (chaining) bir şekilde veya await ile kullanılabilmesini sağlar.
await Anahtar Kelimesi:
    Sadece async olarak işaretlenmiş bir fonksiyonun içinde kullanılabilen await anahtar kelimesi, bir Promise'in çözülmesini (yani başarılı bir şekilde tamamlanmasını veya reddedilmesini) bekler. await kullanılan satırda kodun yürütülmesi duraklatılır ve Promise çözüldüğünde devam eder. Eğer Promise başarılı olursa, await ifadesi Promise'in değerini döndürür. Eğer Promise reddedilirse, await bir hata fırlatır ve bu hata try...catch bloğu ile yakalanabilir.
Promise Nesnesi:
    async/await sözdiziminin temelinde Promise nesnesi yatar. Bir Promise, asenkron bir işlemin nihai sonucunu (başarı değeri veya hata nedeni) temsil eden bir JavaScript nesnesidir. Üç ana durumu vardır:
    
pending (beklemede): Asenkron işlem henüz tamamlanmadı.
fulfilled (tamamlandı/çözüldü): Asenkron işlem başarıyla tamamlandı ve bir değer döndürdü.
rejected (reddedildi): Asenkron işlem bir hata nedeniyle başarısız oldu.
Promise'ler, .then() metodu ile başarılı sonuçları, .catch() metodu ile hataları ve .finally() metodu ile her iki durumda da çalışacak kod bloklarını yönetmek için kullanılır.
  Bu örnek, bir ağ isteğini simüle eden bir fonksiyonun async/await ile nasıl çağrıldığını ve sonucunun nasıl işlendiğini göstermektedir.
function simulateNetworkRequest(url) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`Veri ${url} adresinden başarıyla çekildi.`);
      resolve({ id: 1, data: `Veri ${url} için` });
    }, 2000); // 2 saniye gecikme
  });
}
async function getDataFromApi() {
  console.log('API\'den veri çekiliyor...');
  const result = await simulateNetworkRequest('https://api.example.com/users');
  console.log('Çekilen veri:', result);
  console.log('Veri çekme işlemi tamamlandı.');
}
getDataFromApi();
// Beklenen Çıktı:
// API'den veri çekiliyor...
// (2 saniye sonra)
// Veri https://api.example.com/users adresinden başarıyla çekildi.
// Çekilen veri: { id: 1, data: 'Veri https://api.example.com/users için' }
// Veri çekme işlemi tamamlandı.
Asenkron işlemlerde hata yönetimi kritik öneme sahiptir. try...catch blokları, await ile tetiklenen Promise reddedilmelerini yakalamak için kullanılır.
function simulateFailedNetworkRequest(url) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (Math.random() > 0.5) { // Rastgele hata simülasyonu
        reject(new Error(`Hata: ${url} adresinden veri çekilemedi.`));
      } else {
        resolve({ id: 2, data: `Başarılı veri ${url} için` });
      }
    }, 1500);
  });
}
async function fetchDataWithErrorHandling() {
  console.log('Hata yönetimi ile veri çekiliyor...');
  try {
    const data = await simulateFailedNetworkRequest('https://api.example.com/products');
    console.log('Çekilen veri:', data);
  } catch (error) {
    console.error('Bir hata oluştu:', error.message);
  } finally {
    console.log('Veri çekme girişimi sonlandı.');
  }
}
fetchDataWithErrorHandling();
// Beklenen Çıktı (başarılı olursa):
// Hata yönetimi ile veri çekiliyor...
// (1.5 saniye sonra)
// Çekilen veri: { id: 2, data: 'Başarılı veri https://api.example.com/products için' }
// Veri çekme girişimi sonlandı.
// Beklenen Çıktı (hata olursa):
// Hata yönetimi ile veri çekiliyor...
// (1.5 saniye sonra)
// Bir hata oluştu: Hata: https://api.example.com/products adresinden veri çekilemedi.
// Veri çekme girişimi sonlandı.
Birden fazla asenkron işlemi aynı anda başlatmak ve hepsinin tamamlanmasını beklemek için Promise.all() kullanılabilir. Bu, bekleme sürelerini optimize eder.
function fetchResource(resourceName, delay) {
  return new Promise(resolve => {
    setTimeout(() => {
      console.log(`${resourceName} çekildi.`);
      resolve(`${resourceName} verisi`);
    }, delay);
  });
}
async function fetchMultipleResources() {
  console.log('Kaynaklar paralel olarak çekiliyor...');
  const [users, products, orders] = await Promise.all([
    fetchResource('Kullanıcılar', 3000), // 3 saniye
    fetchResource('Ürünler', 1000),    // 1 saniye
    fetchResource('Siparişler', 2000)   // 2 saniye
  ]);
  console.log('Tüm kaynaklar çekildi.');
  console.log('Kullanıcılar:', users);
  console.log('Ürünler:', products);
  console.log('Siparişler:', orders);
}
fetchMultipleResources();
// Beklenen Çıktı:
// Kaynaklar paralel olarak çekiliyor...
// (1 saniye sonra) Ürünler çekildi.
// (2 saniye sonra) Siparişler çekildi.
// (3 saniye sonra) Kullanıcılar çekildi.
// Tüm kaynaklar çekildi.
// Kullanıcılar: Kullanıcılar verisi
// Ürünler: Ürünler verisi
// Siparişler: Siparişler verisi
await Kullanımı: await anahtar kelimesi yalnızca async olarak işaretlenmiş fonksiyonların içinde kullanılabilir. Global kapsamda veya senkron fonksiyonlarda doğrudan await kullanmaya çalışmak sözdizimi hatasına yol açacaktır.
async Fonksiyonların Dönüş Değeri: Her async fonksiyon, döndürdüğü değeri otomatik olarak bir Promise içine sarar. Eğer bir değer döndürülmezse, Promise.resolve(undefined) döndürülür.
Hata Yönetimi: async/await ile hata yönetimi için try...catch blokları kullanmak, senkron koddaki hata yönetimine benzer bir yapı sunarak kodu daha okunabilir hale getirir. Promise reddedildiğinde, await bir hata fırlatır ve bu catch bloğu tarafından yakalanır.
Promise.all() ve Paralellik: Birden fazla bağımsız asenkron işlemi paralel olarak yürütmek ve hepsinin sonucunu beklemek için Promise.all() kullanın. Bu, toplam yürütme süresini önemli ölçüde azaltabilir. Eğer işlemlerden herhangi biri reddedilirse, Promise.all() hemen reddedilerek hatayı döndürür.
Bloke Edici Olmayan (Non-blocking) Yapı: Asenkron işlemler, uzun süren görevlerin ana iş parçacığını bloke etmesini engeller. Bu sayede uygulamanız kullanıcı etkileşimlerine yanıt vermeye devam eder ve daha akıcı bir kullanıcı deneyimi sunar.
Callback Hell'den Kaçınma: async/await, iç içe geçmiş yoğun geri çağırma (callback) fonksiyonlarından kaynaklanan "callback hell" sorununu çözmek için modern ve daha temiz bir alternatif sunar. Bu, kodun okunabilirliğini ve bakımını büyük ölçüde iyileştirir.
                İlişkisel veritabanları, veri bütünlüğünü sağlamak ve yedekliliği azaltmak amacıyla ilgili verileri genellikle birden fazla tabloda saklar. Eksiksiz bir bilgi kümesi elde etmek, bu farklı tabloların verilerini birleştirmeyi sıkça gerektirir. SQL Joins, aralarındaki ilgili bir sütuna dayanarak iki veya daha fazla tablodan satırları bağlayarak bu işlemi gerçekleştirmek için temel bir mekanizma sunar. Karmaşık veritabanı şemalarında farklı SQL Join türlerini anlamak, verimli ve doğru veri çekimi için hayati öneme sahiptir.
SQL Join operatörlerinin genel sözdizimi aşağıdaki gibidir:
SELECT
    kolon1, kolon2, ...
FROM
    tablo1
[INNER | LEFT | RIGHT | FULL] JOIN tablo2
    ON tablo1.ortak_kolon = tablo2.ortak_kolon
WHERE
    kosul;Yukarıdaki sözdiziminde yer alan her bir bileşen, belirli bir amaca hizmet eder:
SELECT kolon1, kolon2, ...: Sorgu sonucunda gösterilecek sütunları belirtir. Bu sütunlar birleştirilen tablolardan herhangi birinden seçilebilir.
FROM tablo1: Sorgunun ana tablosunu belirtir. Birleştirme işlemi bu tablodan başlar.
[INNER | LEFT | RIGHT | FULL] JOIN tablo2: Birleştirme türünü ve ikinci tabloyu belirtir. Dört ana Join türü vardır:
INNER JOIN: İki tabloda da eşleşen değerlere sahip satırları döndürür. Eğer her iki tabloda da bir eşleşme yoksa, o satır sonuç kümesine dahil edilmez. En yaygın kullanılan Join türüdür.
LEFT JOIN (veya LEFT OUTER JOIN): Sol tablodaki tüm satırları döndürür ve sağ tablodan eşleşen satırları getirir. Sol tablodaki bir satır için sağ tabloda eşleşme bulunamazsa, sağ tablonun sütunları için NULL değerleri döndürülür.
RIGHT JOIN (veya RIGHT OUTER JOIN): Sağ tablodaki tüm satırları döndürür ve sol tablodan eşleşen satırları getirir. Sağ tablodaki bir satır için sol tabloda eşleşme bulunamazsa, sol tablonun sütunları için NULL değerleri döndürülür.
FULL JOIN (veya FULL OUTER JOIN): Her iki tablodaki tüm satırları döndürür. Bir tabloda eşleşme olmasa bile, diğer tablodan gelen eşleşmeyen satırlar da dahil edilir ve eşleşmeyen taraftaki sütunlar için NULL değerleri döndürülür.
ON tablo1.ortak_kolon = tablo2.ortak_kolon: Join koşulunu belirtir. Bu koşul, iki tablo arasındaki hangi sütunların eşleştirilmesi gerektiğini tanımlar. Genellikle bu, birincil anahtar (Primary Key) ve yabancı anahtar (Foreign Key) ilişkisi olan sütunlardır.
WHERE kosul: İsteğe bağlı olarak, birleştirme işlemi tamamlandıktan sonra sonuç kümesini daha da filtrelemek için kullanılır.
Aşağıdaki örnekler için iki tablo kullandığımızı varsayalım:
-- Calisanlar Tablosu
CREATE TABLE Calisanlar (
    CalisanID INT PRIMARY KEY,
    Ad VARCHAR(50),
    Soyad VARCHAR(50),
    DepartmanID INT
);
INSERT INTO Calisanlar (CalisanID, Ad, Soyad, DepartmanID) VALUES
(1, 'Ayşe', 'Yılmaz', 101),
(2, 'Mehmet', 'Demir', 102),
(3, 'Zeynep', 'Kaya', 101),
(4, 'Ali', 'Can', 103),
(5, 'Elif', 'Tekin', NULL);
-- Departmanlar Tablosu
CREATE TABLE Departmanlar (
    DepartmanID INT PRIMARY KEY,
    DepartmanAdi VARCHAR(50)
);
INSERT INTO Departmanlar (DepartmanID, DepartmanAdi) VALUES
(101, 'İnsan Kaynakları'),
(102, 'Muhasebe'),
(103, 'Pazarlama'),
(104, 'Ar-Ge');Bu örnek, sadece hem Calisanlar hem de Departmanlar tablolarında eşleşen DepartmanID değerlerine sahip çalışanları ve departman adlarını döndürür.
SELECT
    C.Ad,
    C.Soyad,
    D.DepartmanAdi
FROM
    Calisanlar AS C
INNER JOIN
    Departmanlar AS D ON C.DepartmanID = D.DepartmanID;Çıktı Açıklaması: DepartmanID değeri NULL olan 'Elif Tekin' ve Departmanlar tablosunda eşleşmesi olmayan 'Ar-Ge' departmanı sonuç kümesine dahil edilmez. Sadece eşleşen veriler listelenir.
Bu örnek, Calisanlar tablosundaki tüm çalışanları ve varsa ilgili departman adlarını döndürür. Departmanı olmayan çalışanlar için departman adı NULL olarak görünür.
SELECT
    C.Ad,
    C.Soyad,
    D.DepartmanAdi
FROM
    Calisanlar AS C
LEFT JOIN
    Departmanlar AS D ON C.DepartmanID = D.DepartmanID;Çıktı Açıklaması: 'Elif Tekin' (DepartmanID'si NULL olan) listede yer alır ve DepartmanAdi sütunu için NULL değeri gösterilir. Departmanlar tablosunda olup Calisanlar tablosunda eşleşmesi olmayan 'Ar-Ge' departmanı sonuçta yer almaz.
Bu örnek, Departmanlar tablosundaki tüm departmanları ve varsa bu departmanlarda çalışan kişilerin adlarını döndürür. Çalışanı olmayan departmanlar için çalışan adları NULL olarak görünür.
SELECT
    C.Ad,
    C.Soyad,
    D.DepartmanAdi
FROM
    Calisanlar AS C
RIGHT JOIN
    Departmanlar AS D ON C.DepartmanID = D.DepartmanID;Çıktı Açıklaması: 'Ar-Ge' departmanı (DepartmanID'si 104) listede yer alır ve Ad ile Soyad sütunları için NULL değerleri gösterilir. Calisanlar tablosunda olup Departmanlar tablosunda eşleşmesi olmayan 'Elif Tekin' sonuçta yer almaz.
Bu örnek, her iki tablodaki tüm satırları döndürür. Eşleşme olmayan yerlerde NULL değerleri görünür.
SELECT
    C.Ad,
    C.Soyad,
    D.DepartmanAdi
FROM
    Calisanlar AS C
FULL JOIN
    Departmanlar AS D ON C.DepartmanID = D.DepartmanID;Çıktı Açıklaması: Hem departmanı olmayan 'Elif Tekin' (DepartmanAdi NULL) hem de çalışanı olmayan 'Ar-Ge' departmanı (Ad ve Soyad NULL) sonuç kümesinde yer alır. Diğer tüm eşleşen satırlar da gösterilir.
Tablo Takma Adları (Aliases): Join işlemlerinde, tablo adları yerine AS anahtar kelimesiyle takma adlar (örneğin Calisanlar AS C) kullanmak sorguları daha kısa ve okunabilir hale getirir. Bu, özellikle birden fazla tabloyla çalışırken veya bir tabloyu kendiyle birleştirirken (self-join) çok faydalıdır.
Performans: Büyük tablolar üzerinde karmaşık Join işlemleri performans sorunlarına yol açabilir. Uygun indeksleme ve sorgu optimizasyonları, bu sorunların önüne geçmede kritik öneme sahiptir.
NULL Değerler: LEFT, RIGHT ve FULL JOIN kullanırken, eşleşme olmayan taraftaki sütunlar için NULL değerlerinin döndürüldüğünü unutmayın. Bu durum, veri analizi yaparken dikkat edilmesi gereken önemli bir noktadır.
Birden Fazla JOIN: Bir sorguda ikiden fazla tabloyu birleştirmek için birden fazla JOIN ifadesi art arda kullanılabilir.
JOIN Koşulu: ON anahtar kelimesiyle belirtilen koşul, tablolar arasındaki ilişkinin doğru bir şekilde tanımlanmasını sağlar. Yanlış veya eksik bir koşul, hatalı veya eksik sonuçlara yol açabilir.
                Beslenme dünyasında ultra işlenmiş gıdalar (UİG'ler) genellikle şeytanlaştırılır. Haklı olarak da, çoğu zaman yüksek şeker, tuz ve sağlıksız yağ içerikleriyle obezite, kalp hastalıkları ve diyabet gibi sağlık sorunlarıyla ilişkilendirilirler. Ancak bir gazeteci ve SEO yazarı olarak, konulara her zaman daha derinlemesine bakmayı severim. Peki, gerçekten de tüm ultra işlenmiş gıdalar tamamen zararlı mıdır? Yoksa bu geniş kategorinin içinde, belirli koşullar altında fayda sağlayabilecek bazı "gri alanlar" var mı?
Bugün, beslenme uzmanlarının bile şaşırtıcı bulabileceği bir konuyu ele alacağız: Hangi ultra işlenmiş gıdalar faydalı olabilir? Bu, kolay bir soru değil ve cevabı da basit "evet" veya "hayır" şeklinde değil. Unutmayalım ki "ultra işlenmiş" terimi, gıdanın ne kadar endüstriyel işlemden geçtiğini ve genellikle katkı maddeleri içerdiğini ifade eder. Bu, her zaman besin değerinin düşük olduğu anlamına gelmeyebilir, ancak çoğu zaman böyle olur. Ancak bazı istisnalar, özellikle modern yaşamın getirdiği ihtiyaçlar ve beslenme eksiklikleriyle mücadele etmek adına önemli roller üstlenebilir.
Öncelikle, ultra işlenmiş gıdanın tanımını netleştirelim. NOVA sınıflandırmasına göre, ultra işlenmiş gıdalar (Grup 4), genellikle evde bulunmayan endüstriyel içerikler ve çoklu işleme aşamaları içeren ürünlerdir. Şekerleme, fast food, paketli atıştırmalıklar, gazlı içecekler bu kategoriye girer. Genellikle lezzetli, ucuz ve uzun raf ömrüne sahip olmaları için tasarlanmışlardır. Bu özellikler onları cazip kılarken, besin değerlerinin düşük olması ve aşırı tüketim eğilimi nedeniyle sağlık için risk oluştururlar.
Peki, bu kötü ünün arkasında yatan nedenler nelerdir? Çoğu UİG, doğal lif, vitamin ve mineral açısından fakirdir. Bunun yerine, enerji yoğunluğu yüksek, ancak besin değeri düşük "boş kalori" sağlarlar. Ayrıca, tatlandırıcılar, renklendiriciler, emülgatörler gibi katkı maddeleri de içerirler ki bunların uzun vadeli etkileri hala tartışılmaktadır. Ancak tüm bunlara rağmen, bazı UİG'ler, belirli beslenme ihtiyaçlarını karşılamak üzere özel olarak tasarlanmıştır ve bu bağlamda faydalı olabilir.
İşte size şaşırtıcı gelebilecek, ancak dikkatli bir bakış açısıyla faydalı sayılabilecek ultra işlenmiş gıda örnekleri:
Zenginleştirilmiş Kahvaltılık Gevrekler (Düşük Şekerli ve Tam Tahıllı Seçenekler): Evet, birçoğu şeker yüklüdür ve kaçınılması gereken ürünlerdir. Ancak, bazı kahvaltılık gevrekler, özellikle tam tahıllı olanlar ve ilave şeker oranı düşük tutulanlar, demir, B vitaminleri (özellikle folik asit) ve lif gibi önemli besin maddeleriyle zenginleştirilmiştir. Özellikle hamile kadınlar için folik asit takviyesi, çocuklarda demir eksikliği anemisi riskini azaltmak veya vegan/vejetaryen bireylerin B12 vitamini alımını desteklemek adına pratik ve etkili bir yol olabilir. Burada anahtar kelime "düşük şekerli" ve "tam tahıllı" olmasıdır.
Bitkisel Süt Alternatifleri (Zenginleştirilmiş Olanlar): Badem sütü, soya sütü, yulaf sütü gibi ürünler, laktoz intoleransı olanlar, süt alerjisi olanlar veya vegan beslenenler için harika alternatiflerdir. Bu ürünlerin çoğu, inek sütünde bulunan kalsiyum, D vitamini ve B12 vitamini gibi önemli besin maddeleriyle zenginleştirilmiştir. Doğal hallerinde bu vitamin ve mineralleri içermezler, bu yüzden endüstriyel işlemle "ultra işlenmiş" kategorisine girseler de, beslenme eksikliklerini gidermek adına kritik bir rol oynarlar. Etiket okuma burada çok önemlidir; zenginleştirilmiş olup olmadığını kontrol edin ve ilave şekerden kaçının.
Bebek Mamaları: Anne sütünün yerine geçemese de, bazı durumlarda anne sütünün yetersiz kaldığı veya hiç verilemediği durumlarda bebek mamaları hayati öneme sahiptir. Bu mamalar, bebeklerin sağlıklı gelişimi için gerekli olan tüm besin maddelerini (protein, karbonhidrat, yağ, vitaminler ve mineraller) içerecek şekilde bilimsel olarak formüle edilmiş ultra işlenmiş ürünlerdir. En titizlikle düzenlenmiş gıda ürünlerinden biridir ve milyonlarca bebeğin yaşamını kurtarmış veya sağlıklı büyümesine olanak sağlamıştır.
Sporcu Besinleri (Özellikle Protein Tozları ve Bazı Barlar): Yoğun antrenman yapan sporcular, kas onarımı ve gelişimi için normal beslenmeyle alamayacakları kadar yüksek miktarda proteine ihtiyaç duyabilirler. Protein tozları, peynir altı suyu (whey), kazein veya bitkisel bazlı (bezelye, pirinç vb.) olabilir ve hızlı ve konsantre bir protein kaynağı sunar. Benzer şekilde, bazı sporcu barları, özellikle ilave şeker içermeyen ve yüksek protein/lif oranına sahip olanlar, antrenman sonrası toparlanma veya öğün yerine geçebilecek pratik çözümler sunabilir. Bunlar ultra işlenmiş kategorisine girse de, belirli bir ihtiyaca yönelik olarak optimize edilmişlerdir.
Tıbbi Beslenme Ürünleri (Örn. Besin Takviyeli İçecekler): Hastanelerde, yaşlı bakım evlerinde veya evde yeme güçlüğü çeken, iştahsız veya özel beslenme gereksinimleri olan bireyler için kullanılan besin takviyeli içecekler (örneğin, Ensure, Boost gibi markalar), beslenme yetersizliğini önlemek veya tedavi etmek için tasarlanmış ultra işlenmiş ürünlerdir. Bu ürünler, tüm makro ve mikro besinleri dengeli bir şekilde içerir ve hastaların sağlığını sürdürmeleri için kritik öneme sahiptir.
Bu örneklerde de görüldüğü gibi, ultra işlenmiş gıdaların faydalı olabilmesinin temel nedenleri şunlardır:
Besin Zenginleştirmesi (Fortifikasyon): Vitamin ve mineral eksiklikleriyle mücadele etmek için gıdalara eklenen besin maddeleri, özellikle hassas popülasyonlar için büyük önem taşır.
Erişilebilirlik ve Kolaylık: Bazı ultra işlenmiş gıdalar, özellikle yoğun yaşam tarzına sahip bireyler veya kısıtlı mutfak imkanları olanlar için, dengeli bir öğün veya besin takviyesi sağlamanın en pratik yolunu sunar.
Özel Beslenme İhtiyaçları: Alerjiler, intoleranslar, hastalıklar veya sporcu beslenmesi gibi özel durumlar, belirli ultra işlenmiş gıdaların vazgeçilmez olmasını sağlayabilir.
Raf Ömrü ve Güvenlik: İşlenmiş gıdalar, bozulma riskini azaltarak gıda güvenliğini artırır ve gıda israfını önlemeye yardımcı olabilir.
Bu istisnalar olsa da, ultra işlenmiş gıda tüketimine yaklaşımımızda dikkatli olmalıyız. Çoğu ultra işlenmiş gıda hala ana beslenme kaynağımız olmamalıdır. İşte dikkat etmeniz gerekenler:
Etiket Okuma: Her zaman besin etiketlerini kontrol edin. Şeker, tuz ve doymuş yağ oranının düşük, lif, vitamin ve mineral içeriğinin yüksek olduğundan emin olun.
İçerik Listesi: İçerik listesi ne kadar kısa ve anlaşılırsa o kadar iyidir. Bilmediğiniz, telaffuzu zor katkı maddelerinin çokluğu genellikle iyiye işaret değildir.
Bütünsel Beslenme Odaklılık: Bu "faydalı" ultra işlenmiş gıdalar bile, taze meyve, sebze, tam tahıllar, baklagiller ve yağsız protein kaynaklarından oluşan dengeli bir diyetin sadece küçük bir parçasını oluşturmalıdır.
Bağlam Önemlidir: Bir sporcu için protein tozu faydalıyken, hareketsiz bir birey için gereksiz kalori kaynağı olabilir. Tüketim kararınızı kişisel ihtiyaçlarınıza ve yaşam tarzınıza göre verin.
Sonuç olarak, ultra işlenmiş gıdalar dünyası siyah ve beyaz değildir. Evet, büyük bir kısmı sağlığımız için risk taşıyor ve mümkün olduğunca kaçınmalıyız. Ancak, modern gıda mühendisliği ve beslenme biliminin birleşimiyle, belirli ultra işlenmiş ürünler, özellikle besin eksikliklerini gidermek, özel diyet ihtiyaçlarını karşılamak veya hayat kurtarıcı çözümler sunmak adına önemli bir rol oynayabilir. Önemli olan, bilinçli seçimler yapmak, etiketleri okumak ve genel beslenme düzenimizin büyük bir kısmını işlenmemiş veya minimum işlenmiş gıdalardan oluşturmaktır. Her zaman olduğu gibi, denge ve bilgi anahtardır.
                Python, tarih ve saat verilerini işlemek için güçlü ve esnek bir modül olan datetime modülünü sunar. Bu modül, tarihleri, saatleri veya her ikisini birden temsil eden nesnelerle çalışmayı kolaylaştırır. Bir uygulamanın olayları zaman damgasıyla kaydetmesi, randevuları planlaması veya belirli bir zaman dilimindeki verileri analiz etmesi gerektiğinde, datetime modülü temel bir araç haline gelir.
datetime modülü, farklı ihtiyaçlar için çeşitli sınıflar sunar. En yaygın kullanılanları şunlardır:
date: Yıl, ay ve gün bilgilerini içerir.
time: Saat, dakika, saniye ve mikrosaniye bilgilerini içerir.
datetime: Hem tarih hem de saat bilgilerini içerir.
timedelta: İki tarih veya saat arasındaki farkı temsil eder.
Bu sınıfları kullanmak için öncelikle modülün içe aktarılması gerekir:
from datetime import date, time, datetime, timedeltaHer bir sınıfın temel kullanımını ve nesne oluşturma yöntemlerini inceleyelim:
date SınıfıBir date nesnesi oluşturmak için date(yıl, ay, gün) yapısı kullanılır. Yıl dört haneli, ay 1-12 arası, gün 1-31 arası bir değer olmalıdır.
from datetime import date
bugun = date(2023, 10, 26)
print(bugun)
# Çıktı: 2023-10-26Mevcut tarihi almak için date.today() metodu kullanılır.
from datetime import date
bugun_an = date.today()
print(f"Bugünün tarihi: {bugun_an}")
# Örnek Çıktı: Bugünün tarihi: 2023-10-26time SınıfıBir time nesnesi oluşturmak için time(saat, dakika, saniye, mikrosaniye) yapısı kullanılır. Mikrosaniye isteğe bağlıdır. Saat 0-23, dakika 0-59, saniye 0-59, mikrosaniye 0-999999 aralığında olmalıdır.
from datetime import time
su_an_saat = time(14, 30, 0, 500000) # 14:30:00.500000
print(su_an_saat)
# Çıktı: 14:30:00.500000datetime SınıfıHem tarih hem de saat bilgilerini içeren en yaygın kullanılan sınıftır. Bir datetime nesnesi oluşturmak için datetime(yıl, ay, gün, saat, dakika, saniye, mikrosaniye) yapısı kullanılır. Saat, dakika, saniye ve mikrosaniye parametreleri isteğe bağlıdır.
from datetime import datetime
belirli_zaman = datetime(2023, 10, 26, 15, 45, 30)
print(belirli_zaman)
# Çıktı: 2023-10-26 15:45:30Mevcut tarih ve saati almak için datetime.now() metodu kullanılır.
from datetime import datetime
su_an = datetime.now()
print(f"Şu anki tarih ve saat: {su_an}")
# Örnek Çıktı: Şu anki tarih ve saat: 2023-10-26 15:45:30.123456timedelta Sınıfıİki date, time veya datetime nesnesi arasındaki farkı temsil eder. Ayrıca, bir tarih veya saate belirli bir süre eklemek veya çıkarmak için de kullanılabilir.
from datetime import datetime, timedelta
bugun = datetime.now()
gelecek_hafta = bugun + timedelta(weeks=1)
gecen_ay = bugun - timedelta(days=30)
print(f"Bugün: {bugun}")
print(f"Gelecek hafta: {gelecek_hafta}")
print(f"Geçen ay: {gecen_ay}")strftime)strftime() metodu, datetime nesnelerini belirli bir formatta string'e dönüştürmek için kullanılır. Format kodları, tarih ve saat bileşenlerini temsil eder.
from datetime import datetime
simdi = datetime.now()
print(f"Varsayılan format: {simdi}") # Örnek: 2023-10-26 15:45:30.123456
# Özel formatlama
formatli_tarih_saat = simdi.strftime("%Y-%m-%d %H:%M:%S")
print(f"Formatlı (YYYY-MM-DD HH:MM:SS): {formatli_tarih_saat}") # Örnek: 2023-10-26 15:45:30
formatli_tarih_turkce = simdi.strftime("%d %B %Y, %A")
print(f"Formatlı (DD Ay YYYY, Gün): {formatli_tarih_turkce}") # Örnek: 26 Ekim 2023, Perşembe
formatli_saat_am_pm = simdi.strftime("%I:%M %p")
print(f"Formatlı (HH:MM AM/PM): {formatli_saat_am_pm}") # Örnek: 03:45 PMYaygın strftime format kodları:
%Y: Dört haneli yıl (örn. 2023)
%m: İki haneli ay (01-12)
%d: İki haneli gün (01-31)
%H: 24 saat formatında saat (00-23)
%M: İki haneli dakika (00-59)
%S: İki haneli saniye (00-59)
%f: Mikrosaniye (000000-999999)
%A: Haftanın tam adı (örn. Perşembe)
%B: Ayın tam adı (örn. Ekim)
%a: Haftanın kısa adı (örn. Per)
%b: Ayın kısa adı (örn. Eki)
%j: Yılın günü (001-366)
%w: Haftanın günü (0 Pazar, 6 Cumartesi)
%x: Yerel tarih formatı
%X: Yerel saat formatı
%c: Yerel tarih ve saat formatı
%I: 12 saat formatında saat (01-12)
%p: AM/PM göstergesi
strptime)strptime() metodu, belirli bir formatta string bir ifadeyi datetime nesnesine dönüştürmek için kullanılır. Bu, özellikle dış kaynaklardan alınan tarih verilerini işlerken önemlidir.
from datetime import datetime
tarih_string = "26-10-2023 16:00:00"
format_string = "%d-%m-%Y %H:%M:%S"
donusturulen_tarih = datetime.strptime(tarih_string, format_string)
print(f"String'den dönüştürülen datetime nesnesi: {donusturulen_tarih}")
# Çıktı: String'den dönüştürülen datetime nesnesi: 2023-10-26 16:00:00
# Farklı bir format
diger_tarih_string = "2023/10/26 4:00 PM"
diger_format = "%Y/%m/%d %I:%M %p"
donusturulen_tarih_2 = datetime.strptime(diger_tarih_string, diger_format)
print(f"İkinci örnek: {donusturulen_tarih_2}")
# Çıktı: İkinci örnek: 2023-10-26 16:00:00strptime metodunda kullanılan format string'in, dönüştürülecek string ile tam olarak eşleşmesi gerektiğini unutmamak önemlidir; aksi takdirde bir ValueError hatası alınır.
datetime nesneleri, standart karşılaştırma operatörleri (<, >, <=, >=, ==, !=) kullanılarak kolayca karşılaştırılabilir.
from datetime import datetime
simdi = datetime.now()
gelecek_zaman = datetime(2024, 1, 1, 0, 0, 0) # Yeni Yıl
gecmis_zaman = datetime(2023, 1, 1, 0, 0, 0) # Geçen Yıl Başlangıcı
print(f"Şimdi < Gelecek Zaman: {simdi < gelecek_zaman}")
print(f"Şimdi > Geçmiş Zaman: {simdi > gecmis_zaman}")
print(f"Gelecek Zaman == Geçmiş Zaman: {gelecek_zaman == gecmis_zaman}")Zaman Dilimleri (Timezones): datetime modülü varsayılan olarak zaman dilimi bilgisini içermez (naive datetime nesneleri). Zaman dilimi farklarını yönetmek için pytz gibi üçüncü taraf kütüphaneler veya Python 3.9 ve sonrası için zoneinfo modülü kullanılması önerilir.
Performans: Büyük ölçekli zaman serisi işlemleri veya çok sayıda tarih hesaplaması yapılıyorsa, pandas kütüphanesi gibi daha optimize edilmiş araçlar değerlendirilebilir.
Hata Yönetimi: strptime() kullanırken, geçersiz bir tarih string'i veya uyumsuz bir format verilirse ValueError hatası fırlatılır. Bu durumları try-except blokları ile yönetmek önemlidir.
Modül İçe Aktarımı: Genellikle from datetime import datetime, date, time, timedelta şeklinde belirli sınıfları içe aktarmak daha yaygındır. Ancak tüm modülü import datetime olarak içe aktarıp datetime.datetime.now() gibi kullanmak da mümkündür.
                Web tasarımında elementlerin yerleşimi ve düzeni, kullanıcı deneyimi açısından kritik bir öneme sahiptir. CSS'in display özelliği, elementlerin tarayıcı tarafından nasıl işleneceğini belirler. Bu özellik, yaygın olarak kullanılan block ve inline değerlerinin yanı sıra, bu ikisinin avantajlarını birleştiren inline-block değerini de sunar. Bu makalede, inline-block'un ne olduğunu, nasıl kullanıldığını ve web sayfalarınızda esnek düzenler oluşturmak için sunduğu faydaları detaylıca inceleyeceğiz.
Bir HTML elementine inline-block özelliklerini uygulamak için aşağıdaki CSS sözdizimi kullanılır:
.element-adi {
  display: inline-block;
}CSS'te elementler genellikle ya block seviyesinde ya da inline seviyesinde davranır:
Bir  Bir  Aşağıdaki örnekler,  Örnek 1: Temel Kutu Düzeni Üç adet  Bu örnekte, her bir  Örnek 2: Yatay Navigasyon Menüsü Bir navigasyon menüsündeki liste öğelerini ( Burada,  Örnek 3: Form Elemanlarını Düzenleme Form etiketlerini ( Bu örnekte, etiketler ve giriş alanları yan yana gelmiş ve etiketlere belirli bir genişlik verilerek giriş alanlarının daha düzenli görünmesi sağlanmıştır. Boşluk Sorunu (Whitespace Issue):  Dikey Hizalama ( Genişlik ve Yükseklik Kontrolü:  Tarayıcı Uyumluluğu:  Alternatif Düzen Modelleri: Karmaşık ve duyarlı (responsive) düzenler oluşturmak için block elementler: Tüm mevcut genişliği kaplar, yeni bir satırda başlar ve altındaki diğer elementleri de yeni bir satıra iter. Genişlik (width), yükseklik (height), üst/alt kenar boşluğu (margin-top, margin-bottom) ve dolgu (padding) değerleri uygulanabilir. Örnek: , .
    inline elementler: Sadece içeriği kadar yer kaplar, yeni bir satırda başlamaz ve diğer inline elementlerle aynı satırda yer alır. Genişlik ve yükseklik değerleri genellikle göz ardı edilir; üst/alt kenar boşluğu ve dolgu değerleri elementin düzenini etkilemez. Örnek: , , .
inline-block, bu iki davranışın en iyi yönlerini birleştirir:
    
inline element gibi diğer elementlerle aynı satırda yan yana durabilir.block element gibi genişlik (width), yükseklik (height), kenar boşluğu (margin) ve dolgu (padding) değerleri uygulanabilir.vertical-align özelliği ile dikey olarak hizalanabilir, bu da esnek düzenler oluşturmada büyük kolaylık sağlar.
Pratik Kullanım Örnekleri
inline-block'un farklı senaryolarda nasıl kullanılabileceğini göstermektedir.
div elementini yan yana konumlandırmak ve onlara belirli boyutlar vermek için inline-block kullanabiliriz.
/* CSS Kodu */
.kutu {
  display: inline-block;
  width: 150px;
  height: 100px;
  margin: 10px;
  padding: 20px;
  background-color: #f0f0f0;
  border: 1px solid #ccc;
  text-align: center;
  line-height: 100px; /* İçeriği dikey ortalamak için */
}.kutu elementi hem yan yana dizilmiş hem de kendine ait genişlik, yükseklik ve kenar boşluklarına sahip olmuştur.
) yatay olarak hizalamak için inline-block sıklıkla tercih edilir.
/* CSS Kodu */
nav ul {
  list-style: none; /* Liste işaretlerini kaldır */
  margin: 0;
  padding: 0;
  background-color: #333;
  overflow: hidden; /* float kullanıldığında parent'ı temizlemek için */
}
nav li {
  display: inline-block;
}
nav li a {
  display: block; /* Bağlantının tüm li alanını kaplaması için */
  color: white;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
}
nav li a:hover {
  background-color: #555;
} elementlerine display: inline-block; uygulanarak yan yana sıralanmaları sağlanmıştır.  etiketine ise display: block; verilerek tıklanabilir alanın genişletilmesi ve padding uygulamasının doğru çalışması sağlanmıştır.
) ve giriş alanlarını () yan yana hizalamak için de inline-block kullanılabilir.
/* CSS Kodu */
.form-grup label {
  display: inline-block;
  width: 90px;
  text-align: right;
  margin-right: 10px;
}
.form-grup input {
  display: inline-block;
  padding: 5px;
  margin-bottom: 10px;
}
Önemli Notlar ve İpuçları
    
                    inline-block elementler arasında HTML kodunda bırakılan boşluklar (satır sonları, boşluklar) tarayıcı tarafından küçük bir boşluk olarak yorumlanabilir. Bu istenmeyen boşlukları gidermek için CSS (font-size: 0; parent elementte, sonra çocukta tekrar ayarla), HTML (etiketleri birleştirme yorumları), veya nadiren margin-left: -4px; gibi teknikler kullanılabilir. Ancak modern yaklaşımlarda flexbox veya grid gibi alternatifler bu sorunu doğal olarak çözmektedir.vertical-align): inline-block elementler, inline elementler gibi davranarak vertical-align özelliği ile dikey olarak hizalanabilir. Bu, aynı satırdaki farklı yükseklikteki elementlerin üst, orta veya alt hizalanmasında oldukça kullanışlıdır.inline-block elementlere doğrudan width ve height değerleri atanabilir, bu da düzen kontrolünü önemli ölçüde artırır. Bu, inline elementlerde mümkün değildir.display: inline-block; özelliği oldukça eski bir özelliktir ve tüm modern tarayıcılar tarafından geniş çapta desteklenir. Bu nedenle, genel uyumluluk konusunda endişe etmenize gerek yoktur.inline-block hala geçerli bir seçenek olsa da, günümüzde flexbox ve CSS Grid gibi daha güçlü ve esnek düzen modelleri mevcuttur. Bu modern yaklaşımlar, özellikle boşluk sorunları gibi inline-block'un bazı sınırlamalarını aşar.
                İlişkisel veritabanı yönetim sistemlerinde (RDBMS) veriler genellikle normalize edilmiş birden fazla tabloda saklanır. Bu tablolar arasındaki ilişkileri kullanarak anlamlı bir veri kümesi elde etmek için birleştirme (JOIN) işlemleri kritik öneme sahiptir. Bu makale, SQL'deki en yaygın ve temel birleştirme türlerinden biri olan INNER JOIN operatörünün kullanımını, sözdizimini ve pratik örneklerini teknik bir bakış açısıyla detaylandırmaktadır.
INNER JOIN, iki veya daha fazla tablodan ortak bir kolondaki eşleşen değerlere dayanarak satırları birleştirir. Yalnızca her iki tabloda da bir eşleşme bulunduğunda satırları sonuç kümesine dahil eder.
SELECT
    kolon1,
    kolon2,
    ...
FROM
    tablo1
INNER JOIN
    tablo2 ON tablo1.ortak_kolon = tablo2.ortak_kolon;
SELECT kolon1, kolon2, ...: Sonuç kümesinde görüntülemek istediğiniz kolonları belirtir. Bu kolonlar birleştirilen tablolardan herhangi birine ait olabilir. Kolon adları çakışıyorsa, tablo_adı.kolon_adı formatında belirtilmelidir.
FROM tablo1: Birleştirme işlemine başlayacağınız ilk tabloyu belirtir. Bu genellikle "sol" tablo olarak adlandırılır.
INNER JOIN tablo2: tablo1 ile birleştirmek istediğiniz ikinci tabloyu (sağ tablo) belirtir.
ON tablo1.ortak_kolon = tablo2.ortak_kolon: Bu kısım, birleştirme koşulunu tanımlar. Her iki tablodaki hangi kolonların eşleşmesi gerektiğini belirtir. INNER JOIN yalnızca bu koşulun doğru olduğu satırları döndürür. Kolonlar genellikle tablolar arasındaki birincil ve yabancı anahtar ilişkilerini temsil eder.
Aşağıdaki örneklerde, bir eğitim veritabanı senaryosu üzerinden INNER JOIN kullanımını inceleyeceğiz. Veritabanımızda Ogrenciler ve Kayitlar adında iki tablo olduğunu varsayalım.
Ogrenciler Tablosu:
CREATE TABLE Ogrenciler (
    OgrenciID INT PRIMARY KEY,
    Ad VARCHAR(50),
    Soyad VARCHAR(50)
);
INSERT INTO Ogrenciler (OgrenciID, Ad, Soyad) VALUES
(1, 'Ayşe', 'Yılmaz'),
(2, 'Mehmet', 'Demir'),
(3, 'Zeynep', 'Kaya'),
(4, 'Ali', 'Can');
Kayitlar Tablosu:
CREATE TABLE Kayitlar (
    KayitID INT PRIMARY KEY,
    OgrenciID INT,
    KursAdi VARCHAR(100),
    FOREIGN KEY (OgrenciID) REFERENCES Ogrenciler(OgrenciID)
);
INSERT INTO Kayitlar (KayitID, OgrenciID, KursAdi) VALUES
(101, 1, 'Veritabanı Yönetimi'),
(102, 2, 'Programlamaya Giriş'),
(103, 1, 'Web Geliştirme'),
(104, 3, 'Veri Analizi');
Hangi öğrencinin hangi kursa kayıtlı olduğunu görmek için Ogrenciler ve Kayitlar tablolarını OgrenciID kolonu üzerinden birleştirelim.
SELECT
    O.Ad,
    O.Soyad,
    K.KursAdi
FROM
    Ogrenciler AS O
INNER JOIN
    Kayitlar AS K ON O.OgrenciID = K.OgrenciID;
Açıklama: Bu sorgu, Ogrenciler tablosundaki her OgrenciID ile Kayitlar tablosundaki eşleşen OgrenciID değerlerini bulur. Sonuç olarak, kayıtlı her öğrencinin adı, soyadı ve aldığı kursun adını listeler. AS O ve AS K takma adlar (aliases) kullanarak sorguyu daha okunabilir hale getirdik.
Şimdi üçüncü bir tablo, KursDetaylari ekleyelim ve bir öğrencinin aldığı kursun detaylarını (örneğin, ders saati) görmek isteyelim.
KursDetaylari Tablosu:
CREATE TABLE KursDetaylari (
    KursAdi VARCHAR(100) PRIMARY KEY,
    DersSaati INT,
    KrediSayisi INT
);
INSERT INTO KursDetaylari (KursAdi, DersSaati, KrediSayisi) VALUES
('Veritabanı Yönetimi', 45, 3),
('Programlamaya Giriş', 60, 4),
('Web Geliştirme', 50, 3),
('Veri Analizi', 75, 5);
Öğrencilerin hangi kurslara kayıtlı olduğunu ve bu kursların ders saatlerini listeleyen bir sorgu oluşturalım:
SELECT
    O.Ad,
    O.Soyad,
    K.KursAdi,
    KD.DersSaati
FROM
    Ogrenciler AS O
INNER JOIN
    Kayitlar AS K ON O.OgrenciID = K.OgrenciID
INNER JOIN
    KursDetaylari AS KD ON K.KursAdi = KD.KursAdi;
Açıklama: Bu sorgu, Ogrenciler, Kayitlar ve KursDetaylari tablolarını zincirleme bir şekilde birleştirir. İlk olarak öğrencilerle kayıtları, ardından kayıtlarla kurs detaylarını eşleştirerek her öğrencinin aldığı kursun adını ve ders saatini getirir.
Sadece 50 ders saatinden fazla olan kurslara kayıtlı öğrencileri görmek isteyelim:
SELECT
    O.Ad,
    O.Soyad,
    K.KursAdi,
    KD.DersSaati
FROM
    Ogrenciler AS O
INNER JOIN
    Kayitlar AS K ON O.OgrenciID = K.OgrenciID
INNER JOIN
    KursDetaylari AS KD ON K.KursAdi = KD.KursAdi
WHERE
    KD.DersSaati > 50;
Açıklama: Önceki sorguya bir WHERE koşulu eklenerek, sadece DersSaati 50'den büyük olan kurslara kayıtlı öğrenciler filtrelenmiştir. INNER JOIN işlemi tamamlandıktan sonra filtreleme uygulanır.
ON ve WHERE Koşulları: ON koşulu, tabloların nasıl birleştirileceğini tanımlarken, WHERE koşulu birleştirilmiş sonuç kümesini daha da filtrelemek için kullanılır. ON koşulundaki eşleşmeyen satırlar hiçbir zaman sonuç kümesine dahil edilmezken, WHERE koşulu birleştirme sonrası sonuçları etkiler.
Kolon Adı Çakışmaları ve Takma Adlar: Farklı tablolarda aynı ada sahip kolonlar varsa (örneğin, her iki tabloda da bir ID kolonu), sorguda bu kolonları belirtirken tablo adı ön eki (tablo_adı.kolon_adı) veya takma adlar (alias.kolon_adı) kullanmak zorunludur. Bu, "ambiguous column name" (belirsiz kolon adı) hatasını önler ve sorgunun okunabilirliğini artırır.
Performans İpuçları: Büyük tablolarda INNER JOIN performansı için birleştirme koşulunda kullanılan kolonlarda indekslerin bulunması kritik öneme sahiptir. İndeksler, veritabanı motorunun eşleşen satırları çok daha hızlı bulmasına yardımcı olur.
NULL Değerler: INNER JOIN, ON koşulunda NULL değerlerle eşleşme yapmaz. Eğer bir tabloda eşleşme kolonu NULL ise, bu satır INNER JOIN sonucunda yer almaz. NULL değerleri de dahil etmek isterseniz, LEFT JOIN veya RIGHT JOIN gibi farklı JOIN türlerini değerlendirmeniz gerekebilir.
Veri Bütünlüğü: INNER JOIN kullanırken, birleştirme koşulunda kullanılan kolonlardaki veri bütünlüğünün doğru olduğundan emin olun. Tutarsız veriler veya yanlış eşleşme koşulları hatalı veya eksik sonuçlara yol açabilir.
                Python'ın standart kütüphanesinin bir parçası olan math modülü, temel ve gelişmiş matematiksel fonksiyonlara erişim sağlar. Bu modül, bilimsel hesaplamalar, mühendislik uygulamaları ve karmaşık matematiksel problemlerin çözümü için vazgeçilmez bir araçtır. math modülü, çoğu durumda kayan noktalı sayılar (float) üzerinde işlem yapmak üzere tasarlanmıştır ve sabitler, trigonometrik fonksiyonlar, logaritmik fonksiyonlar, üs alma işlemleri ve daha fazlasını içerir.
math modülünü kullanmak için öncelikle onu Python programınıza dahil etmeniz gerekmektedir. Bu işlem, genellikle dosyanın başında import anahtar kelimesi kullanılarak yapılır. Modül dahil edildikten sonra, içerdiği fonksiyonlara ve sabitlere math. öneki ile erişilir.
import math
# Bir fonksiyona erişim
sonuc = math.sqrt(25)
# Bir sabite erişim
pi_degeri = math.pi
Yukarıdaki sözdizimi, math modülünün nasıl kullanılacağına dair temel prensipleri ortaya koymaktadır. Her bir bileşenin işlevi aşağıdaki gibidir:
import math: Bu ifade, Python'a math adlı modülü yüklemesini söyler. Modül yüklendikten sonra, içinde tanımlı tüm fonksiyonlar, sınıflar ve değişkenler programınızda kullanılabilir hale gelir.
math.fonksiyon_adı(argümanlar): Modül içindeki bir fonksiyona erişmek için kullanılır. math. öneki, fonksiyonun math modülüne ait olduğunu belirtir ve aynı ada sahip diğer fonksiyonlarla olası ad çakışmalarını önler. Örneğin, math.sqrt(25) ifadesi 25'in karekökünü hesaplar.
math.sabit_adı: Modül içinde tanımlanmış matematiksel sabitlere erişmek için kullanılır. Örneğin, math.pi sabiti pi (π) değerini, math.e sabiti Euler sayısını (e) temsil eder.
Aşağıdaki örnekler, math modülünün çeşitli fonksiyonlarının gerçek dünya senaryolarında nasıl kullanılabileceğini göstermektedir.
Örnek 1: Temel Sabitler ve Karekök Hesaplama
import math
# Pi ve Euler sabitlerini kullanma
print(f"Pi değeri: {math.pi}")
print(f"e değeri: {math.e}")
# Bir sayının karekökünü bulma
sayi = 144
karekok = math.sqrt(sayi)
print(f"{sayi}'nin karekökü: {karekok}")
# Bir sayının üssünü alma (2^3)
us_alma = math.pow(2, 3)
print(f"2 üzeri 3: {us_alma}")
Bu örnek, math.pi ve math.e gibi sabitlerin nasıl kullanıldığını ve math.sqrt() ile bir sayının karekökünün, math.pow() ile de bir sayının üssünün nasıl hesaplandığını göstermektedir.
Örnek 2: Trigonometrik Fonksiyonlar
import math
# Açı değerini radyana çevirme (trigonometrik fonksiyonlar radyan bekler)
derece = 90
radyan = math.radians(derece)
print(f"{derece} derece radyan olarak: {radyan}")
# Sinüs, Kosinüs ve Tanjant hesaplama
sinus_degeri = math.sin(radyan)
cosinus_degeri = math.cos(radyan)
tanjant_degeri = math.tan(radyan)
print(f"sin({derece}°): {sinus_degeri}")
print(f"cos({derece}°): {cosinus_degeri}")
print(f"tan({derece}°): {tanjant_degeri}")
Bu örnek, math.radians() fonksiyonunun dereceleri radyanlara dönüştürmek için nasıl kullanıldığını ve ardından math.sin(), math.cos(), math.tan() gibi trigonometrik fonksiyonların nasıl uygulandığını göstermektedir.
Örnek 3: Logaritmik ve Tavan/Taban Fonksiyonları
import math
# Doğal logaritma (ln) ve 10 tabanında logaritma (log10)
sayi_log = 100
dogal_log = math.log(sayi_log)
taban10_log = math.log10(sayi_log)
taban2_log = math.log2(sayi_log) # Python 2.6 ve sonrası
print(f"{sayi_log}'un doğal logaritması: {dogal_log}")
print(f"{sayi_log}'un 10 tabanında logaritması: {taban10_log}")
print(f"{sayi_log}'un 2 tabanında logaritması: {taban2_log}")
# Tavan (ceil) ve Taban (floor) değerleri
ondalikli_sayi = 4.7
tavan_degeri = math.ceil(ondalikli_sayi)
taban_degeri = math.floor(ondalikli_sayi)
print(f"{ondalikli_sayi}'nin tavan değeri: {tavan_degeri}")
print(f"{ondalikli_sayi}'nin taban değeri: {taban_degeri}")
Bu örnek, math.log(), math.log10(), math.log2() fonksiyonlarının farklı tabanlarda logaritma hesaplamak için kullanılışını ve math.ceil() ile bir sayıyı yukarı, math.floor() ile aşağı tam sayıya yuvarlamanın nasıl yapıldığını açıklamaktadır.
Kayan Noktalı Sayılar (float): math modülündeki fonksiyonların çoğu, kayan noktalı sayılarla (float) çalışmak üzere tasarlanmıştır. Tam sayı (int) argümanları genellikle otomatik olarak kayan noktalı sayılara dönüştürülür.
Açı Birimleri: Trigonometrik fonksiyonlar (sin, cos, tan vb.) açıları radyan cinsinden bekler. Derece cinsinden bir açıyı kullanmak için math.radians() fonksiyonunu kullanarak önce radyanlara dönüştürmeniz gerekmektedir.
Hata Yönetimi: Geçersiz argümanlar (örneğin, negatif bir sayının karekökü math.sqrt(-1)) ValueError hatasına neden olabilir. Bu tür durumları ele almak için uygun hata yönetimi (try-except blokları) kullanılmalıdır.
math.pow() ve ** Operatörü: Python'da üs alma işlemi için hem math.pow() fonksiyonu hem de ** operatörü bulunur. math.pow() her zaman kayan noktalı bir sonuç dönerken, ** operatörü, işlenenlerin türüne bağlı olarak bir tam sayı veya kayan noktalı sonuç döndürebilir.
math.fabs() ve abs(): Mutlak değer almak için math.fabs() ve yerleşik abs() fonksiyonları mevcuttur. math.fabs() her zaman kayan noktalı bir sonuç dönerken, abs() işlenenle aynı türde bir sonuç döner.
                Web geliştirme sürecinde, etkili ve erişilebilir bir kullanıcı deneyimi sunmanın temelini, iyi yapılandırılmış bir HTML düzeni oluşturur. HTML layout, bir web sayfasının içeriğini mantıksal ve hiyerarşik bir şekilde organize etmek için kullanılan elemanları ve teknikleri ifade eder. Doğru layout kullanımı, arama motoru optimizasyonu (SEO) için kritik öneme sahip olduğu gibi, ekran okuyucular gibi yardımcı teknolojilerle etkileşimde bulunan kullanıcılar için de sayfa içeriğinin anlaşılabilirliğini artırır. Bu kılavuz, HTML'in yapısal elemanlarını kullanarak modern web sayfaları oluşturmanın temel prensiplerini detaylandıracaktır.
HTML layout oluştururken kullanılan temel yapısal ve semantik elemanlar, bir web sayfasının ana bölgelerini tanımlar. Aşağıdaki kod bloğu, tipik bir HTML sayfa düzeninin temel sözdizimini göstermektedir.
    Web Sitesi Başlığı
    
 
    
        Ana İçerik Bölümü
        Bu bölümde sayfanın ana içeriği yer alır.
     
    
 
HTML5 ile tanıtılan semantik etiketler, geliştiricilere içeriğin amacını tarayıcılara ve arama motorlarına daha net bir şekilde iletme imkanı sunar. Bu etiketlerin her biri, belirli bir içeriğin türünü ve rolünü belirtir.
: Bir dokümanın veya bölümün giriş içeriğini temsil eder. Genellikle başlıklar, logolar, navigasyon menüleri ve arama formları gibi ögeleri içerir.
: Sayfadaki diğer bölümlere veya farklı sayfalara bağlantı sağlayan navigasyon linklerini içerir. Genellikle birincil navigasyon menüleri için kullanılır.
: Dokümanın veya uygulamanın baskın içeriğini temsil eder. Bir HTML dokümanında yalnızca bir adet  etiketi bulunmalıdır.
: Bağımsız, kendi kendine yeten bir içerik parçasını temsil eder. Bir blog yazısı, haber makalesi veya kullanıcı yorumu gibi içerikler için idealdir.
: Geniş bir belgeyi veya uygulamayı mantıksal tematik gruplara ayırmak için kullanılır. Genellikle bir başlık (-) ile başlar.
: Ana içeriğin dışında kalan ancak ana içerikle ilişkili olan içeriği temsil eder. Genellikle yan paneller, reklamlar veya alıntı blokları için kullanılır.
: Bir dokümanın veya bölümün altbilgisini temsil eder. Genellikle telif hakkı bilgileri, yazar bilgileri, iletişim bilgileri ve ilgili linkler bulunur.
Aşağıdaki örnekler, yukarıda açıklanan HTML layout elemanlarının farklı senaryolarda nasıl kullanılabileceğini göstermektedir. Örnek 1: Temel Web Sayfası Düzeni Bu, sitemizin ana içeriğidir. Sayfamızı keşfetmek için yukarıdaki menüyü kullanın. Örnek 2: Blog Yazısı Düzeni Yazar: Jane Doe • Tarih: 15 Kasım 2023 Bu makale, HTML layout prensiplerini detaylıca inceler. Web sayfalarının düzeni, kullanıcı deneyimi için kritik öneme sahiptir. Etkili ve sürdürülebilir bir HTML layout oluşturmak için aşağıdaki ipuçlarını göz önünde bulundurmak önemlidir: Semantik Etiket Kullanımı: Her zaman içeriğin anlamına en uygun semantik HTML5 etiketlerini ( CSS ile Ayırma: HTML, içeriğin yapısını tanımlarken, içeriğin görsel sunumu ve yerleşimi tamamen CSS (Cascading Style Sheets) ile yönetilmelidir. HTML markup'ınıza stil bilgisi eklemekten kaçının. Erişilebilirlik: Semantik etiketler, ekran okuyucular gibi yardımcı teknolojilerin web sayfasını daha iyi anlamasına yardımcı olur. Bu da web sitenizin daha geniş bir kitleye ulaşmasını sağlar. Mobil Uyumluluk: Modern web layout'ları genellikle responsive tasarım ilkeleriyle birleştirilir. HTML yapınızı oluştururken, farklı ekran boyutlarına uyum sağlayabilecek esnek bir temel oluşturmaya özen gösterin. Web tasarımında estetik ve kullanıcı deneyimi açısından düzenli bir yerleşim, bir sayfanın başarısı için kritik öneme sahiptir. CSS (Cascading Style Sheets), öğelerin konumlandırılması ve hizalanması konusunda güçlü araçlar sunar. Bu kılavuz, metinlerden kutu modellere kadar çeşitli web öğelerini etkili bir şekilde hizalamak için kullanabileceğiniz CSS özelliklerini teknik bir yaklaşımla ele almaktadır. Sayfa düzeninizi optimize etmek ve görsel hiyerarşiyi güçlendirmek için bu özelliklerin nasıl kullanılacağını detaylı bir şekilde inceleyeceğiz. CSS'te hizalama işlemleri, genellikle bir seçiciye uygulanan özellik-değer çiftleri şeklinde ifade edilir. Hizalama özelliği, belirli bir bağlama veya kapsayıcıya göre öğenin konumunu belirler. Temel sözdizimi aşağıdaki gibidir: Burada  CSS'te hizalama, farklı bağlamlarda çeşitli özellikler aracılığıyla sağlanır. İşte en yaygın kullanılan hizalama yöntemleri ve özellikleri: Metin ve Satır İçi Öğelerin Hizalanması ( Dikey Hizalama ( Blok Öğeleri Yatay Ortalamak ( Flexbox ile Hizalama: CSS Grid ile Hizalama: Aşağıdaki örnekler, farklı hizalama senaryolarını göstermektedir. Bir paragraf içindeki metni ortalamak için  Bu metin ortalanmış olacaktır. Belirli bir genişliğe sahip bir  Bu blok öğe ortalanmıştır. Bir kapsayıcı içindeki öğeleri hem yatay hem de dikey olarak ortalamak için Flexbox kullanılır. Bir grid kapsayıcısındaki öğeyi veya öğeleri hem yatay hem de dikey olarak ortalamak için Grid özellikleri kullanılır. Bağlama Duyarlılık: Hizalama özellikleri, uygulandıkları kapsayıcının veya öğenin  Genişlik Kısıtlaması: Bir blok öğeyi  Dikey Ortalamada Zorluklar: Geleneksel CSS yöntemleriyle (Flexbox veya Grid olmadan) dikey ortalama genellikle daha karmaşıktır.  Flexbox ve Grid Ekseni Anlayışı: Flexbox ve Grid'de hizalama yaparken, ana eksen (main-axis) ve çapraz eksen (cross-axis) kavramlarını iyi anlamak kritiktir.  Tarayıcı Uyumluluğu: Özellikle Flexbox ve Grid gibi modern layout modülleri, güncel tarayıcılarda geniş çapta desteklenmektedir. Ancak eski tarayıcıları hedefliyorsanız, ön ekler (vendor prefixes) veya alternatif yöntemler kullanmanız gerekebilir. Web sayfaları, tarayıcılar tarafından yüklenirken bir Belge Nesne Modeli (DOM) olarak yapılandırılır. Bu model, HTML belgesinin mantıksal yapısını temsil eder ve JavaScript'in web sayfasının içeriğine, yapısına ve stiline dinamik olarak erişmesini ve bunları değiştirmesini sağlayan bir API (Uygulama Programlama Arayüzü) sunar. Bu makale, JavaScript kullanarak HTML DOM ile nasıl etkileşim kuracağınızı, elementleri nasıl seçeceğinizi, içeriklerini ve stillerini nasıl değiştireceğinizi ve olayları nasıl yöneteceğinizi adım adım açıklayacaktır. JavaScript'in DOM ile etkileşim kurmasının temelinde, belgedeki HTML elementlerini seçmek ve ardından bu elementlerin özelliklerine veya metotlarına erişmek yatar. Aşağıdaki sözdizimleri, en yaygın DOM seçim ve manipülasyon yöntemlerini özetlemektedir: Element Seçim Metotları: Element Özellikleri ve Metotları: Aşağıdaki örnekler, JavaScript'in DOM ile nasıl etkileşim kurduğunu göstermektedir. Örnek 1: Bir HTML Elementinin İçeriğini Güncelleme Bu örnekte, bir paragraf elementinin metin içeriği JavaScript ile değiştirilmektedir. Merhaba Dünya! Örnek 2: Bir Elementin Stilini Değiştirme Bu örnek, bir  Örnek 3: Yeni Bir Element Oluşturma ve Ekleme Bu örnek, dinamik olarak yeni bir liste öğesi oluşturup mevcut bir listeye ekler. Örnek 4: Bir Olay Dinleyicisi Ekleme Bu örnek, bir butona tıklanma olayını dinler ve tıklandığında bir paragrafın içeriğini günceller. Henüz tıklanmadı. Betik Yerleşimi ve Yükleme: JavaScript kodunuzun HTML DOM elementlerine erişmeye çalışmadan önce, bu elementlerin tarayıcı tarafından yüklenmiş ve DOM'a eklenmiş olması gerekir. Bu genellikle  Performans İpuçları: Kapsamlı DOM manipülasyonları performans maliyetli olabilir. Büyük değişiklikler yaparken, elementleri DOM'dan kaldırın, değişiklikleri yapın ve sonra tekrar ekleyin. Ayrıca, birden fazla stil değişikliği için  Güvenlik (XSS): Kullanıcı girdilerini  SQL veritabanlarında, farklı tablolar arasında ilişkisel veri kümelerini birleştirmek temel bir işlemdir.  Aşağıdaki örneklerde,  Bu sorgu, tüm müşterileri ve onların mevcut siparişlerini listeler. Eğer bir müşterinin hiç siparişi yoksa,  Birden fazla tabloyu birleştirmek için zincirleme  Sol Tablo Önceliği:  Performans Etkisi: Büyük tablolarda  Alias Kullanımı: Tablo isimleri için kısa takma adlar ( 2025 © Tüm Hakları Saklıdır.: Pratik Kullanım Örnekleri
Bu örnek, tipik bir web sayfasının ana hatlarını, header, navigasyon, ana içerik ve footer kullanarak nasıl oluşturulacağını gösterir.Web Sitem
    
Hoş Geldiniz!
        
Bir blog yazısı gibi kendi içinde bağımsız bir içeriği () ve bununla ilgili ek bilgileri () içeren bir düzen örneği.Blog Başlığı
    
HTML Layout Kullanımı
        Giriş
            İpuçları/Önemli Notlar
    
, , , , , , ) tercih edin. Bu, hem SEO hem de erişilebilirlik açısından faydalıdır.
                
Temel Sözdizimi
selector {
    alignment-property: value;
}
selector, stillerin uygulanacağı HTML öğesini veya öğe grubunu temsil eder. alignment-property, hizalama türünü belirleyen CSS özelliğidir (örneğin, text-align, justify-content) ve value ise bu hizalamanın nasıl gerçekleştirileceğini (örneğin, center, flex-start) tanımlar.
Detaylı Açıklama
    
text-align):
Bu özellik, bir blok öğesinin içindeki metni ve satır içi (inline) öğeleri yatay olarak hizalamak için kullanılır. Yaygın değerleri left, right, center ve justify'dir.vertical-align):inline, inline-block veya table-cell öğelerinin dikey hizalamasını kontrol eder. Genellikle metin ve ikonların aynı satırda dikey olarak hizalanmasında kullanılır. Değerleri arasında top, middle, bottom, baseline ve yüzde değerleri bulunur.margin: auto):
Belirli bir genişliğe sahip blok seviyesi öğeleri (örneğin, margin-left ve margin-right özelliklerini auto olarak ayarlamak yaygın bir yöntemdir. Bu, genellikle margin: 0 auto; şeklinde kullanılır.
    
CSS Flexbox, öğeleri tek boyutlu bir eksen boyunca (yatay veya dikey) hizalamak için güçlü bir model sunar.
        
            
justify-content: Ana eksen boyunca (varsayılan olarak yatay) öğelerin nasıl dağıtılacağını kontrol eder. Değerleri: flex-start, flex-end, center, space-between, space-around, space-evenly.align-items: Çapraz eksen boyunca (varsayılan olarak dikey) öğelerin nasıl hizalanacağını kontrol eder. Değerleri: flex-start, flex-end, center, stretch, baseline.align-self: Tek bir flex öğesinin çapraz eksendeki hizalamasını, kapsayıcının align-items değerini geçersiz kılarak ayarlar.
CSS Grid, öğeleri iki boyutlu (hem yatay hem dikey) bir ızgara içinde hizalamak için tasarlanmıştır.
        
            
justify-items: Bir grid kapsayıcısının içindeki öğelerin satır içi (inline) eksende nasıl hizalanacağını kontrol eder. Değerleri: start, end, center, stretch.align-items: Bir grid kapsayıcısının içindeki öğelerin blok (block) eksende nasıl hizalanacağını kontrol eder. Değerleri: start, end, center, stretch.place-items: align-items ve justify-items için bir kısaltmadır.justify-self: Tek bir grid öğesinin satır içi eksendeki hizalamasını, kapsayıcının justify-items değerini geçersiz kılarak ayarlar.align-self: Tek bir grid öğesinin blok eksendeki hizalamasını, kapsayıcının align-items değerini geçersiz kılarak ayarlar.place-self: align-self ve justify-self için bir kısaltmadır.
Pratik Kullanım Örnekleri
Metin Hizalama
text-align özelliği kullanılır.
.centered-text {
    text-align: center;
    color: #333;
    font-size: 1.2em;
}
Blok Öğeyi Yatay Ortalamak
margin: auto kullanılır.
.centered-block {
    width: 60%; /* Ortalamak için genişlik gerekli */
    margin: 0 auto;
    padding: 20px;
    background-color: #f0f0f0;
    border: 1px solid #ccc;
    text-align: center; /* İçindeki metni de ortalar */
}
Flexbox ile Öğeleri Ortalamak
.flex-container {
    display: flex;
    justify-content: center; /* Yatayda ortala */
    align-items: center;     /* Dikeyde ortala */
    height: 200px;           /* Kapsayıcıya yükseklik verilmeli */
    background-color: #e0f2f7;
    border: 1px solid #a7d9ed;
}
.flex-item {
    padding: 15px 30px;
    background-color: #007bff;
    color: white;
    font-weight: bold;
    border-radius: 5px;
}
Grid ile Öğeleri Ortalamak
.grid-container {
    display: grid;
    place-items: center; /* Hem yatay hem dikeyde ortalar */
    height: 200px;       /* Kapsayıcıya yükseklik verilmeli */
    background-color: #e6ffe6;
    border: 1px solid #b3e6b3;
}
.grid-item {
    padding: 15px 30px;
    background-color: #28a745;
    color: white;
    font-weight: bold;
    border-radius: 5px;
}
Önemli Notlar
    
                    display özelliğine göre farklılık gösterir. Örneğin, text-align yalnızca blok seviyesi kapsayıcıların içindeki metin ve satır içi öğeler üzerinde etkilidir; bir blok öğeyi kendi başına ortalamaz.margin: auto; ile yatay olarak ortalamak için öğeye mutlaka bir genişlik (width) değeri atanmalıdır. Aksi takdirde, öğe tüm mevcut genişliği kaplayacak ve ortalanmayacaktır.vertical-align sadece satır içi öğeler veya tablo hücreleri için etkilidir. Blok öğeleri dikey olarak ortalamak için Flexbox, Grid veya mutlak konumlandırma (position: absolute; top: 50%; transform: translateY(-50%);) gibi modern teknikler tercih edilmelidir.flex-direction veya grid-template-columns/rows gibi özellikler, bu eksenlerin yönünü belirler ve dolayısıyla justify-content ve align-items'ın davranışını doğrudan etkiler.
                
Temel Sözdizimi
// Element seçimi
document.getElementById("elementId");
document.getElementsByClassName("className");
document.getElementsByTagName("tagName");
document.querySelector("cssSelector");
document.querySelectorAll("cssSelector");
// Element özellikleri ve metotları
element.innerHTML;
element.textContent;
element.style.propertyName;
element.setAttribute("attributeName", "value");
element.classList.add("className");
element.addEventListener("eventName", functionHandler);
document.createElement("tagName");
parentElement.appendChild(childElement);
parentElement.removeChild(childElement);Detaylı Açıklama
    
document Nesnesi: DOM'a erişimin ana giriş noktasıdır. Tüm HTML belgesini temsil eder.
            
    document.getElementById("elementId"): Belirtilen id niteliğine sahip tek bir elementi döndürür. id'ler bir sayfada benzersiz olmalıdır.document.getElementsByClassName("className"): Belirtilen sınıf adına sahip tüm elementleri içeren bir HTMLCollection döndürür. Canlı bir koleksiyondur, yani DOM'daki değişiklikler koleksiyonu otomatik olarak günceller.document.getElementsByTagName("tagName"): Belirtilen etiket adına sahip tüm elementleri içeren bir HTMLCollection döndürür.document.querySelector("cssSelector"): Belirtilen CSS seçici ile eşleşen belgedeki ilk elementi döndürür.document.querySelectorAll("cssSelector"): Belirtilen CSS seçici ile eşleşen tüm elementleri içeren bir NodeList döndürür. Statik bir koleksiyondur.
            
    element.innerHTML: Bir elementin HTML içeriğini (alt elementler dahil) alır veya ayarlar. HTML etiketlerini yorumlar.element.textContent: Bir elementin ve tüm alt elementlerinin metin içeriğini alır veya ayarlar. HTML etiketlerini metin olarak ele alır.element.style.propertyName: Bir elementin CSS stil özelliklerine erişim sağlar. Örneğin, element.style.backgroundColor = "red";.element.setAttribute("attributeName", "value"): Bir elementin belirtilen niteliğini ayarlar veya günceller. Örneğin, element.setAttribute("href", "https://example.com");.element.classList: Bir elementin CSS sınıflarını yönetmek için bir dizi metot (add, remove, toggle, contains) sunar.element.addEventListener("eventName", functionHandler): Bir elemente olay dinleyicisi ekler. Örneğin, bir butona tıklama olayını dinlemek için "click" kullanılır.document.createElement("tagName"): Belirtilen etiket adıyla yeni bir HTML elementi oluşturur.parentElement.appendChild(childElement): Belirtilen bir çocuğu, belirtilen ana elementin son çocuğu olarak ekler.parentElement.removeChild(childElement): Belirtilen ana elementten belirtilen çocuğu kaldırır.
Pratik Kullanım Örnekleri
    
Önemli Notlar
    
                     etiketini  etiketinin kapanışından hemen önce yerleştirerek veya defer/async niteliklerini kullanarak sağlanır. Alternatif olarak, document.addEventListener("DOMContentLoaded", function() { /* kodunuz */ }); kullanarak kodunuzun DOM tamamen yüklendikten sonra çalışmasını sağlayabilirsiniz.id Benzersizliği: document.getElementById() metodu için kullanılan id nitelikleri, HTML belgesi içinde benzersiz olmalıdır. Aynı id'ye sahip birden fazla element bulunması durumunda, metot yalnızca ilk eşleşeni döndürecektir.HTMLCollection ve NodeList: getElementsByClassName ve getElementsByTagName metotları HTMLCollection, querySelectorAll ise NodeList döndürür. Bu koleksiyonlar dizi benzeri nesnelerdir ancak tüm dizi metotlarına (map, filter vb.) doğrudan sahip değildirler. Üzerlerinde döngü kurmak için for...of veya Array.from().forEach() kullanabilirsiniz.element.style.cssText özelliğini kullanabilir veya CSS sınıflarını (classList) manipüle edebilirsiniz.innerHTML ile doğrudan DOM'a eklerken dikkatli olun. Kötü niyetli kullanıcılar, bu yöntemle sitenize Cross-Site Scripting (XSS) saldırıları yapabilirler. Güvenliğiniz için genellikle textContent kullanmak veya girdileri sanitize etmek daha iyidir.null Kontrolü: DOM elementlerini seçerken, bazen elementin sayfada var olmayabileceği durumlar olabilir. Bu tür durumlarda, döndürülen değer null olacaktır. Kodunuzun beklenmedik hatalar vermesini önlemek için element üzerinde işlem yapmadan önce bir null kontrolü yapmak iyi bir pratiktir (örneğin, if (element) { ... }).
                LEFT JOIN (sol dış birleşim) işlemi, iki veya daha fazla tabloyu belirli bir koşul üzerinden birleştirirken, sol tablodaki tüm kayıtları, sağ tablodaki eşleşen kayıtlarla birlikte döndürür. Sağ tabloda eşleşme bulunamayan durumlarda, sağ tablonun sütunları için NULL değerleri döndürülür. Bu makale, LEFT JOIN'in sözdizimini, detaylı açıklamasını ve pratik kullanım örneklerini sunmaktadır.Temel Sözdizimi
LEFT JOIN komutunun genel sözdizimi aşağıdaki gibidir:
SELECT
    sutun1, sutun2, ...
FROM
    sol_tablo
LEFT JOIN
    sag_tablo
ON
    sol_tablo.eslesme_sutunu = sag_tablo.eslesme_sutunu;Detaylı Açıklama
SELECT sutun1, sutun2, ...: Sorgu sonucunda döndürülmesini istediğiniz sütunları belirtirsiniz. Bu sütunlar hem sol hem de sağ tablodan gelebilir.FROM sol_tablo: Birleşimin sol tarafında yer alacak ana tabloyu belirtir. Bu tablodaki tüm kayıtlar sonuç kümesine dahil edilecektir.LEFT JOIN sag_tablo: Birleşimin sağ tarafında yer alacak tabloyu belirtir. Sol tablodaki kayıtlarla eşleşen kayıtlar bu tablodan alınır.ON sol_tablo.eslesme_sutunu = sag_tablo.eslesme_sutunu: İki tablo arasındaki eşleşme koşulunu tanımlar. Bu koşul genellikle birincil anahtar (PRIMARY KEY) ve yabancı anahtar (FOREIGN KEY) ilişkisi üzerinden kurulur.
Pratik Kullanım Örnekleri
Musteriler ve Siparisler adında iki tablo kullandığımızı varsayalım. Musteriler tablosunda MusteriID, Ad, Soyad sütunları; Siparisler tablosunda ise SiparisID, MusteriID, SiparisTarihi, Tutar sütunları bulunmaktadır.
Örnek 1: Tüm Müşterileri ve Varsa Siparişlerini Listeleme
Siparisler tablosuna ait sütunlar için NULL değerleri döndürülür.
SELECT
    M.MusteriID,
    M.Ad,
    M.Soyad,
    S.SiparisID,
    S.SiparisTarihi,
    S.Tutar
FROM
    Musteriler AS M
LEFT JOIN
    Siparisler AS S ON M.MusteriID = S.MusteriID;
Örnek 2: Henüz Sipariş Vermemiş Müşterileri Bulma
LEFT JOIN ile birlikte WHERE koşulu kullanarak, sağ tabloda eşleşme bulunamayan kayıtları filtreleyebiliriz. Bu örnekte, henüz sipariş vermemiş müşteriler listelenir.
SELECT
    M.MusteriID,
    M.Ad,
    M.Soyad
FROM
    Musteriler AS M
LEFT JOIN
    Siparisler AS S ON M.MusteriID = S.MusteriID
WHERE
    S.SiparisID IS NULL;
Örnek 3: Birden Fazla LEFT JOIN Kullanımı
LEFT JOIN kullanılabilir. Örneğin, müşterilerin siparişlerini ve bu siparişlerin detaylarını görmek isteyebiliriz. SiparisDetaylari adında bir üçüncü tablo olduğunu varsayalım.
SELECT
    M.Ad,
    S.SiparisID,
    SD.UrunAdi,
    SD.Miktar
FROM
    Musteriler AS M
LEFT JOIN
    Siparisler AS S ON M.MusteriID = S.MusteriID
LEFT JOIN
    SiparisDetaylari AS SD ON S.SiparisID = SD.SiparisID;
Önemli Notlar
                    LEFT JOIN, sol tablonun tüm kayıtlarını garanti eder. Sağ tabloda eşleşme bulunmasa bile sol tablodaki kayıtlar sonuç kümesinde yer alır.NULL Değerleri: Sağ tabloda eşleşen kayıt bulunamadığında, sağ tablodaki sütunlar için NULL değerleri döndürülür. Bu durum, eşleşmeyen kayıtları filtrelemek (örneğin, WHERE sag_tablo.anahtar_sutun IS NULL kullanarak) için kullanılabilir.JOIN işlemleri performans üzerinde etkili olabilir. İndeksli sütunlar üzerinde birleştirme yapmak sorgu hızını artırır.AS M, AS S gibi) kullanmak, sorguyu daha okunaklı hale getirir ve yazım hatalarını azaltır.INNER JOIN ile Farkı: INNER JOIN yalnızca iki tabloda da eşleşen kayıtları döndürürken, LEFT JOIN sol tablonun tüm kayıtlarını döndürür ve sağ tablodaki eşleşmeyenler için NULL kullanır.