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

Emin ALT.
Developer
 Biyografi: Elma veren ağacı taşlarlar.
SQL Dilinde BETWEEN Operatörü: Aralık Bazlı Veri Sorgulama

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.


Sözdizimi


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;

Detaylı Açıklama


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.


Örnekler


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;

Önemli Notlar


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

13
0
Python Dilinde Python Iterators Kullanımı

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.


Sözdizimi


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.


Detaylı Açıklama


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.


Pratik Kullanım Örnekleri


Aşağıdaki örnekler, Python iterators'ın nasıl çalıştığını ve nasıl kendi iterator'ınızı oluşturabileceğinizi göstermektedir.


Örnek 1: Standart Bir Iterable Üzerinde Iterator Kullanımı


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

Örnek 2: Kendi Iterator Sınıfınızı Oluşturma


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

Önemli Notlar


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


24
0
CSS Overflow Özelliği: İçerik Taşmasını Yönetme
Web tasarımında, bir elementin içeriğinin ayrılan alana sığmadığı durumlar sıkça karşılaşılır. CSS'in 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.

Sözdizimi


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 */
}

Detaylı Açıklama


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.

Pratik Kullanım Örnekleri


Aşağıdaki örnekler, 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.



Bu metin, kabın belirlenen boyutlarından çok daha uzundur. overflow: hidden; değeri nedeniyle, kabın dışına taşan kısımlar tamamen gizlenecektir. Kullanıcı bu gizli içeriğe hiçbir şekilde erişemez. Bu, içeriğin önemli bir bölümünün kaybolmasına yol açabilir.

/* 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


11
0
SQL Dilinde SQL Aliases Kullanımı

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.


Sözdizimi


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;

Detaylı Açıklama


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.


Pratik Kullanım Örnekleri


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.


Önemli Notlar


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


6
0
Python Dilinde Modüllerin Etkin Kullanımı

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.


Temel Sözdizimi


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_name

  • Modülü bir takma ad (alias) ile içe aktarma:


    import module_name as alias_name

  • Modülden belirli nesneleri içe aktarma:


    from module_name import object_name_1, object_name_2

  • Modülden belirli bir nesneyi takma ad ile içe aktarma:


    from module_name import object_name as alias_name

  • Modüldeki tüm nesneleri içe aktarma (önerilmez):


    from module_name import *

Detaylı Açıklama


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


Pratik Kullanım Örnekleri


Örnek 1: Standart math Modülünü Kullanma


Bu ö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}")

Örnek 2: random Modülünü Takma Ad ile Kullanma


random 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}")

Örnek 3: datetime Modülünden Belirli Nesneleri İçe Aktarma


datetime 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}")

Örnek 4: Kendi Modülünüzü Oluşturma ve Kullanma


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"))

Önemli Notlar


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

18
0
HTML Dilinde HTML Dosya Yollarının Kullanımı

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.


Temel Sözdizimi


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.


Detaylı Açıklama


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.


Pratik Kullanım Örnekleri


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:



Web Sitesi Banner

Ö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:



Şirket Logosu
İletişim

Örnek 5: Harici Kaynak (Tam URL)


Bir CDN'den (Content Delivery Network) alınan bir JavaScript kütüphanesi:





Önemli Notlar


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


9
0
JavaScript Dilinde Asenkron Programlama: Kapsamlı Bir Kılavuz

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.


Sözdizimi


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();

Detaylı Açıklama


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


Pratik Kullanım Örnekleri


Örnek 1: Temel Asenkron İşlem ve Veri Çekme


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

Örnek 2: Hata Yönetimi


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

Örnek 3: Paralel Asenkron İşlemler


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

Önemli Notlar


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

8
0
SQL Joins: İlişkisel Veritabanlarında Birleştirme İşlemleri

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


Sözdizimi


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;

Detaylı Açıklama


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.


Pratik Kullanım Örnekleri


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');

INNER JOIN Örneği


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.


LEFT JOIN Örneği


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.


RIGHT JOIN Örneği


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.


FULL JOIN Örneği


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.


Önemli Notlar


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

9
0
Ultra İşlenmiş Gıdaların Gizli Faydaları: Her Şey Kötü Mü?

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.


Ultra İşlenmiş Gıda Nedir ve Neden Kötü Bir Üne Sahiptir?


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


Gözden Kaçan Faydalı Ultra İşlenmiş Gıdalar (İstisnalar)


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


Neden Bu Gıdalar "Faydalı" Kategorisine Girebilir?


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.


Dikkat Edilmesi Gerekenler ve Altın Kurallar


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.


14
0
Python Dilinde Tarih ve Saat İşlemleri: `datetime` Modülü Kullanımı

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.


Temel Sözdizimi


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, timedelta

Detaylı Açıklama


Her 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-26

Mevcut 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-26

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

datetime 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:30

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

timedelta 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}")

Pratik Kullanım Örnekleri


Tarih ve Saat Formatlama (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 PM

Yaygı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


String'den Tarih ve Saate Dönüştürme (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:00

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


Tarih ve Saat Karşılaştırmaları


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}")

Önemli Notlar


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

9
0
CSS Dilinde Inline-block Kullanımı

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.


Temel Sözdizimi


Bir HTML elementine inline-block özelliklerini uygulamak için aşağıdaki CSS sözdizimi kullanılır:

.element-adi {
  display: inline-block;
}

Detaylı Açıklama


CSS'te elementler genellikle ya block seviyesinde ya da inline seviyesinde davranır:



inline-block, bu iki davranışın en iyi yönlerini birleştirir:


  • Bir inline element gibi diğer elementlerle aynı satırda yan yana durabilir.

  • Bir 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


Aşağıdaki örnekler, inline-block'un farklı senaryolarda nasıl kullanılabileceğini göstermektedir.


Örnek 1: Temel Kutu Düzeni


Üç adet div elementini yan yana konumlandırmak ve onlara belirli boyutlar vermek için inline-block kullanabiliriz.


Kutu 1
Kutu 2
Kutu 3
/* 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 */
}

Bu örnekte, her bir .kutu elementi hem yan yana dizilmiş hem de kendine ait genişlik, yükseklik ve kenar boşluklarına sahip olmuştur.


Örnek 2: Yatay Navigasyon Menüsü


Bir navigasyon menüsündeki liste öğelerini (

  • ) 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;
    }

    Burada,

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


    Örnek 3: Form Elemanlarını Düzenleme


    Form etiketlerini () 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;
    }

    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.


    Önemli Notlar ve İpuçları


    • Boşluk Sorunu (Whitespace Issue): 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.

    • Dikey Hizalama (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.

    • Genişlik ve Yükseklik Kontrolü: 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.

    • Tarayıcı Uyumluluğu: 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.

    • Alternatif Düzen Modelleri: Karmaşık ve duyarlı (responsive) düzenler oluşturmak için 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.

  • 9
    0
    SQL Dilinde INNER JOIN Kullanımı: Detaylı Rehber

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


    Sözdizimi


    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;
    

    Detaylı Açıklama


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


    Pratik Kullanım Örnekleri


    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');
    

    Örnek 1: İki Tabloyu Birleştirme


    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.


    Örnek 2: Birden Fazla Tabloyu Birleştirme


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


    Örnek 3: Belirli Koşullara Göre Birleştirme ve Filtreleme


    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.


    Önemli Notlar


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

    17
    0
    Python Dilinde Math Modülü Kullanımı

    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.


    Temel Sözdizimi


    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
    

    Detaylı Açıklama


    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.


    Pratik Kullanım Örnekleri


    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.


    Önemli Notlar


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

    21
    0
    HTML Dilinde HTML Layout Kullanımı: Yapısal Düzenleme Kılavuzu

    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.


    Temel Sözdizimi (Syntax)


    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.

    © 2023 Tüm Hakları Saklıdır.

    Detaylı Açıklama


    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.

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

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

    • : Herhangi bir semantik anlamı olmayan jenerik bir kapsayıcıdır. Genellikle CSS ile stillendirmek veya JavaScript ile manipüle etmek için kullanılır. İçeriğin semantik bir etikete uymadığı durumlarda tercih edilir.

    • :

      etiketinin satır içi (inline) karşılığıdır. Metnin bir bölümünü stillendirmek veya işaretlemek için kullanılır ve herhangi bir semantik anlam taşımaz.

    Pratik Kullanım Örnekleri


    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 ö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!

    Bu, sitemizin ana içeriğidir. Sayfamızı keşfetmek için yukarıdaki menüyü kullanın.

    © 2023 Tüm Hakları Saklıdır.

    Örnek 2: Blog Yazısı Düzeni
    Bir blog yazısı gibi kendi içinde bağımsız bir içeriği (

    ) ve bununla ilgili ek bilgileri (
    5
    0
    CSS Dilinde Hizalama (Align) Özelliklerinin Kapsamlı Kullanımı

    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.


    Temel Sözdizimi


    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:


    
    selector {
        alignment-property: value;
    }
    

    Burada 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


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

    • Dikey Hizalama (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.

    • Blok Öğeleri Yatay Ortalamak (margin: auto):
      Belirli bir genişliğe sahip blok seviyesi öğeleri (örneğin,

      ) yatay olarak ortalamak için margin-left ve margin-right özelliklerini auto olarak ayarlamak yaygın bir yöntemdir. Bu, genellikle margin: 0 auto; şeklinde kullanılır.

    • Flexbox ile Hizalama:
      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 ile Hizalama:
      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


    Aşağıdaki örnekler, farklı hizalama senaryolarını göstermektedir.


    Metin Hizalama


    Bir paragraf içindeki metni ortalamak için text-align özelliği kullanılır.

    
    

    Bu metin ortalanmış olacaktır.

    
    .centered-text {
        text-align: center;
        color: #333;
        font-size: 1.2em;
    }
    

    Blok Öğeyi Yatay Ortalamak


    Belirli bir genişliğe sahip bir

    öğesini sayfa içinde yatay olarak ortalamak için margin: auto kullanılır.

    
    

    Bu blok öğe ortalanmıştı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


    Bir kapsayıcı içindeki öğeleri hem yatay hem de dikey olarak ortalamak için Flexbox kullanılır.

    
    
    Ortalanmış Öğe
    
    .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


    Bir grid kapsayıcısındaki öğeyi veya öğeleri hem yatay hem de dikey olarak ortalamak için Grid özellikleri kullanılır.

    
    
    Ortalanmış Grid Öğe
    
    .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


    • Bağlama Duyarlılık: Hizalama özellikleri, uygulandıkları kapsayıcının veya öğenin 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.

    • Genişlik Kısıtlaması: Bir blok öğeyi 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.

    • Dikey Ortalamada Zorluklar: Geleneksel CSS yöntemleriyle (Flexbox veya Grid olmadan) dikey ortalama genellikle daha karmaşıktı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.

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

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

    4
    0
    JavaScript Dilinde HTML DOM Kullanımı: Detaylı Rehber

    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.


    Temel Sözdizimi


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

    • Element Seçim Metotları:

      • 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 Özellikleri ve Metotları:

      • 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


    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

    elementinin arka plan rengini ve yazı rengini değiştirmektedir.


    
    
    Bu bir kutu.

    Örnek 3: Yeni Bir Element Oluşturma ve Ekleme


    Bu örnek, dinamik olarak yeni bir liste öğesi oluşturup mevcut bir listeye ekler.


    
    
    • Mevcut Öğeler

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

    Önemli Notlar


    • 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