Gerçek Hava'yı daha önce burada paylaşmıştım; projeyi hatırlayanlar olacaktır. 🌦️

v10.7.75

O zamandan beri epey değişti, geliştirme devam etti ve yeni sürümle birlikte tekrar paylaşmak istedim.

👉 https://gercek-hava.netlify.app/

Projeyi yapma sebebim aslında basit: Aynı konum için farklı hava durumu servisleri bazen birbirinden tamamen farklı şeyler söylüyor. Birisi yağmur gösteriyor, diğeri açık; biri %80 bulutlu diyor, dışarı bakıyorsun gökyüzü masmavi. 🙂

Gerçek Hava'da tek bir servise güvenmek yerine birden fazla kaynağı birlikte değerlendiriyorum.

Şu anda temel olarak:

• ECMWF IFS
• DWD ICON
• NOAA GFS
• Open-Meteo
• EUMETSAT uydu verileri
• WTTR ve bazı yardımcı kaynaklar

birlikte kullanılıyor.

Burada önceki sürümleri kullananların fark edebileceği önemli bir değişiklik var: RainViewer radar entegrasyonunu kaldırmak zorunda kaldım.

RainViewer'ı yalnızca harita göstermek için değil, radar tile'larını analiz ederek yağışın gerçekten sahada olup olmadığını kontrol etmek için de kullanıyordum. Yani radar, bazı durumlarda tahmin motorunun kararlarından birine dönüşüyordu.

Ancak RainViewer ile yaptığımız görüşmede, 2025'te değişen API kullanım şartlarından sonra servislerinin yalnızca kişisel ve eğitim amaçlı kullanım kapsamında kullanılabildiğini; başka kullanıcılara sunulan bir web sitesi veya uygulamadaki kullanımın, proje tamamen ücretsiz, reklamsız ve ticari olmasa bile bu kapsama girmediğini açıkça belirttiler.

Gerçek Hava'nın istemci tarafında çalışması, API anahtarı kullanmaması veya radar verisini kendi sunucumda depolamıyor olmam da bunu değiştirmiyor. Radar metadata/tile verisini okuyup otomatik analiz yapmak yine API kullanımı kabul ediliyor.

RainViewer'ın izin verdiği embedded radar haritasını yalnızca görsel olarak göstermek mümkün; ancak bu durumda haritadaki radar verisini Gerçek Hava'nın karar motorunun okuyup otomatik yağış teyidinde kullanması mümkün değil.

Bu nedenle RainViewer'ı sessizce veya şartları zorlayarak kullanmaya devam etmek yerine entegrasyonu kaldırmayı tercih ettim. Sistem de radar kaynağı yokluğunu yanlışlıkla “yağış yok” diye yorumlamaması için yeniden düzenlendi.

Ama amaç hâlâ aynı:

“olabildiğince çok veri göstermek” değil. Tam tersine, bunları mümkün olduğunca anlaşılır biçimde yorumlayıp gerçekte dışarı çıktığınızda göreceğiniz havaya yaklaşmak.

Örneğin yalnızca modeller yağmur diyor diye hemen şemsiye çıkarmıyor; model uzlaşması, uydu/bulut verileri ve diğer gerçeklik kontrolleri devreye giriyor.

Site PWA olarak da kullanılabiliyor ve tamamen ücretsiz.

Projeyi hâlâ aktif olarak geliştiriyorum. Özellikle farklı şehirlerden kullanıp:

“Burada açık gösteriyor ama aslında kapalı”
“Yağmur başladı ama yakalayamadı”
“Tahmin modelleriyle gerçek hava uyuşmuyor”

gibi örnekler yakalarsanız benim için altın değerinde.

Önceki sürümü kullananlar özellikle yeni sürümdeki farkları da yazarsa çok sevinirim.

Kurcalayın, bozun, eleştirin. Özellikle teknik taraftan gelecek geri bildirimlere açığım. 😄

👉 https://gercek-hava.netlify.app/

Gerçek Hava Durumu

Core 3, EUMETSAT uydu yağış gölge ölçümü, ECCC radar mozaiği ve global model yedeği destekli pratik hava durumu karar ekranı.
BeğenFavori PaylaşYorum yap

ValiDrive: 500 liraya satılan 2TB USB stick vs. şeyleri test etmek için bir yazılım aracı.

https://www.grc.com/validrive.htm

GRC | ValiDrive  

ValiDrive, Fraudulent and Fake Drive Detection
BeğenFavori PaylaşYorum yap

Güzergaha göre hava durumu verecek bir uygulama var mı?
Örnek artvin denizli de 5 günlük hava durumu verecek

BeğenFavori PaylaşYorum yap
Önceki yorumları gör 8 / 9

Yeni araç: https://filesion.com/video-cutter/
Evet, 15 dakikada yaptım. AI çok güzel. 🙂
Tarayıcıda FFmpeg çalıştırıyor.

Video Cutter | Trim Video Online - Filesion

Trim and cut video files directly in your browser without re-encoding. 100% private and fast.
BeğenFavori PaylaşYorum yap
Önceki yorumları gör 14 / 34

https://archive.org/details/telegramdaki-bir-gruptaki-dosyalarin-isim-listesini-alma
gerekli düzenlemeleri notepad ++ ile yapın.Shift sağ klik ile powershell çalıştır. Python komutu ile bu belgeyi çalıstır.

Telegramdaki Bir Gruptaki Dosyaların Isim Listesini Alma : Free Download,...

Türkçe Reklam / Tanıtım Metni Telegram Grup Dosyalarını Anında Listele! – Süper Pratik Python Scripti Telegram'da bir grupta paylaşılan yüzlerce,...
BeğenFavori PaylaşYorum yap
  • DünyayaEcnebi @dunyayaecnebi

    import os
    import sqlite3
    from datetime import datetime, timezone
    import asyncio
    from telethon import TelegramClient
    from telethon.tl.types import DocumentAttributeFilename
    import time

    # Telegram bilgileri
    api_id = 106101
    api_hash = '7b0c7355ceaf469e5402'
    chat_link = 'https://t.me/+lB'

    # Yerel klasör
    YEREL_KLASOR = r"F:\Al1999-2024 part1"

    # Veritabanı dosyası
    DB_DOSYA = 'telegram_dosya_hafiza.db' # İstersen yolunu değiştir

    def veritabani_olustur():
    conn = sqlite3.connect(DB_DOSYA)
    cursor = conn.cursor()
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS dosyalar (
    isim TEXT,
    boyut INTEGER,
    PRIMARY KEY (isim, boyut)
    )
    ''')
    cursor.execute('''
    CREATE TABLE IF NOT EXISTS meta (
    anahtar TEXT PRIMARY KEY,
    deger TEXT
    )
    ''')
    conn.commit()
    conn.close()

    def son_tarama_tarihi_al():
    conn = sqlite3.connect(DB_DOSYA)
    cursor = conn.cursor()
    cursor.execute('SELECT deger FROM meta WHERE anahtar = "son_tarama"')
    sonuc = cursor.fetchone()
    conn.close()
    if sonuc:
    return datetime.fromisoformat(sonuc[0]).replace(tzinfo=timezone.utc)
    else:
    return datetime(2000, 1, 1, tzinfo=timezone.utc)

    def son_tarama_tarihi_kaydet(tarih):
    conn = sqlite3.connect(DB_DOSYA)
    cursor = conn.cursor()
    cursor.execute('INSERT OR REPLACE INTO meta (anahtar, deger) VALUES ("son_tarama", ?)',
    (tarih.isoformat(),))
    conn.commit()
    conn.close()

    def veritabani_kayit_sayisi():
    conn = sqlite3.connect(DB_DOSYA)
    cursor = conn.cursor()
    cursor.execute('SELECT COUNT(*) FROM dosyalar')
    sayi = cursor.fetchone()[0]
    conn.close()
    return sayi

    async def telegram_dosya_hafiza_guncelle(client):
    veritabani_olustur()
    conn = sqlite3.connect(DB_DOSYA)
    cursor = conn.cursor()

    try:
    entity = await client.get_entity(chat_link)
    print(f"Chat bulundu: {entity.title}")
    except Exception as e:
    print(f"Chat bulunamadı! Hata: {e}")
    conn.close()
    return

    baslangic_tarihi = son_tarama_tarihi_al()
    bitis_tarihi = datetime.now(timezone.utc)

    print(f"Sadece {baslangic_tarihi.strftime('%Y-%m-%d')} sonrası yeni dosyalar taranıyor...")

    eklenen_sayisi = 0
    en_son_tarih = baslangic_tarihi

    async for message in client.iter_messages(entity, limit=None):
    if message.date bitis_tarihi:
    continue

    if message.date > en_son_tarih:
    en_son_tarih = message.date

    if message.media and hasattr(message.media, 'document'):
    doc = message.media.document
    file_name = "İsim_Bulunamadı"
    for attr in doc.attributes:
    if isinstance(attr, DocumentAttributeFilename):
    file_name = attr.file_name
    break

    boyut = doc.size

    try:
    cursor.execute('INSERT OR IGNORE INTO dosyalar (isim, boyut) VALUES (?, ?)', (file_name, boyut))
    if cursor.rowcount > 0:
    eklenen_sayisi += 1
    except Exception as e:
    print(f"Ekleme hatası: {e}")

    conn.commit()
    conn.close()

    if eklenen_sayisi > 0:
    print(f"{eklenen_sayisi} yeni dosya hafızaya eklendi.")
    son_tarama_tarihi_kaydet(en_son_tarih)
    print("Son tarama tarihi güncellendi.")
    else:
    print("Yeni dosya bulunamadı.")

    print(f"Toplam hafızada kayıt: {veritabani_kayit_sayisi()}")

    def yerel_dosya_kontrol_et_ve_sil():
    if not os.path.exists(YEREL_KLASOR):
    print(f"Klasör bulunamadı: {YEREL_KLASOR}")
    return

    conn = sqlite3.connect(DB_DOSYA)
    cursor = conn.cursor()

    silinen_sayisi = 0
    for dosya_adi in os.listdir(YEREL_KLASOR):
    dosya_yolu = os.path.join(YEREL_KLASOR, dosya_adi)
    if not os.path.isfile(dosya_yolu):
    continue

    # Sadece .zip dosyalarını kontrol et (istersen kaldırabilirsin)
    if not dosya_adi.lower().endswith('.zip'):
    continue

    boyut = os.path.getsize(dosya_yolu)

    cursor.execute('SELECT 1 FROM dosyalar WHERE isim = ? AND boyut = ?', (dosya_adi, boyut))
    if cursor.fetchone():
    try:
    os.remove(dosya_yolu)
    gb = boyut / (1024**3)
    print(f"Silindi: {dosya_adi} ({gb:.2f} GB)")
    silinen_sayisi += 1
    except Exception as e:
    print(f"Silme hatası ({dosya_adi}): {e}")

    conn.close()
    print(f"\nİşlem tamamlandı. Toplam {silinen_sayisi} dosya otomatik silindi.")

    async def main():
    print("Telegram'a bağlanılıyor...")
    client = TelegramClient('session', api_id, api_hash)
    await client.start()
    print("Bağlantı başarılı!")

    await telegram_dosya_hafiza_guncelle(client)

    while True:
    print("\n" + "="*60)
    print(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - Yerel klasör kontrol ediliyor...")
    yerel_dosya_kontrol_et_ve_sil()
    print("60 saniye bekleniyor...\n")
    time.sleep(60)

    if __name__ == '__main__':
    asyncio.run(main())

  • DünyayaEcnebi @dunyayaecnebi

    import os
    import time
    import asyncio
    import sys
    from dotenv import load_dotenv
    from telethon import TelegramClient
    from telethon.errors import FloodWaitError

    # .env dosyasını yükle
    load_dotenv()

    # Yapılandırma Kontrolü
    try:
    API_ID = int(os.getenv("API_ID"))
    API_HASH = os.getenv("API_HASH")
    BOT_TOKEN = os.getenv("BOT_TOKEN")
    CHAT_ID = int(os.getenv("CHAT_ID"))
    except Exception as e:
    print(f"❌ .env dosyasında hata var veya eksik: {e}")
    input("Kapatmak için Enter'a basın...")
    sys.exit()

    # --- KLASÖR AYARLARI ---
    # ÖNEMLİ: Windows yollarını yazarken r"C:\Klasor" şeklinde 'r' harfi ekleyin
    # veya düz slash "/" kullanın.
    WATCH_DIRS = [".", r"C:\Users\Kullanıcı\Downloads"]
    WATCH_EXT = (".zip", ".rar", ".7z", ".mp4", ".mkv")
    MAX_PENCERE = 2

    semaphore = asyncio.Semaphore(MAX_PENCERE)

    def get_progress_bar(current, total, start_time, file_name):
    elapsed = time.time() - start_time
    if elapsed 15 else file_name
    print(f"\r📤 {short_name} | %{percent:.1f} | {speed:.2f} MB/s", end="")

    async def fast_upload(client, file_path):
    async with semaphore:
    file_name = os.path.basename(file_path)
    start_time = time.time()
    try:
    print(f"\n🚀 Yükleme Başladı: {file_name}")
    await client.send_file(
    CHAT_ID,
    file_path,
    caption=file_name,
    progress_callback=lambda c, t: get_progress_bar(c, t, start_time, file_name),
    part_size_kb=512
    )
    print(f"\n✅ Tamamlandı ve Siliniyor: {file_name}")
    os.remove(file_path)
    except Exception as e:
    print(f"\n❌ Yükleme Hatası ({file_name}): {e}")

    async def watcher():
    print("--- BAĞLANTI KURULUYOR ---")
    client = TelegramClient("speed_session", API_ID, API_HASH)

    try:
    await client.start(bot_token=BOT_TOKEN)
    print("✅ Bot Aktif.")
    except Exception as e:
    print(f"❌ Telegram Bağlantı Hatası: {e}")
    return

    # Geçerli klasörleri ayıkla (Hata almamak için)
    valid_dirs = []
    for d in WATCH_DIRS:
    if os.path.exists(d):
    valid_dirs.append(d)
    print(f"📂 İzleniyor: {os.path.abspath(d)}")
    else:
    print(f"⚠️ UYARI: Klasör bulunamadı, atlanıyor: {d}")

    if not valid_dirs:
    print("❌ İzlenecek hiçbir geçerli klasör bulunamadı!")
    return

    active_tasks = set()

    while True:
    for folder in valid_dirs:
    try:
    files = [
    os.path.join(folder, f) for f in os.listdir(folder)
    if f.endswith(WATCH_EXT) and os.path.isfile(os.path.join(folder, f))
    ]

    for file_path in files:
    if file_path not in active_tasks:
    active_tasks.add(file_path)
    # Dosya yazım kontrolü
    old_size = -1
    while old_size != os.path.getsize(file_path):
    old_size = os.path.getsize(file_path)
    await asyncio.sleep(1)

    task = asyncio.create_task(fast_upload(client, file_path))
    task.add_done_callback(lambda t, fp=file_path: active_tasks.remove(fp))
    except Exception as e:
    pass # Anlık klasör hatalarını görmezden gel

    await asyncio.sleep(3)

    if __name__ == "__main__":
    try:
    asyncio.run(watcher())
    except Exception as e:
    print(f"\n‼️ KRİTİK HATA: {e}")
    finally:
    print("\n--- PROGRAM DURDU ---")
    input("Kapatmak için Enter'a basın...")

  • DünyayaEcnebi @dunyayaecnebi

    ve aynı klasörde txt dosaysından .env dosyası oluştur bilgilerini gir. API_ID=1051
    API_HASH=7b5402
    BOT_TOKEN=81955387E4L5XU
    CHAT_ID=-1002062

Yeni ve güzel bir araç: Btop4win

Linux'daki Top uygulamasının Windows'a uyarlanmış hali.

https://github.com/aristocratos/btop4win

BeğenFavori PaylaşYorum yap

Favori rekoru kıracak o paylaşım.
https://www.youtube.com/watch?v=h-oTopZ7OZY

Windows'taki Tüm Garabetlerden Kurtulun: Winutil Rehberi

Windows 11'i kurduktan sonra sizi karşılayan gereksiz yazılımlardan, sisteminizi kasan telemetri servislerinden ve gizlilik endişelerinden sıkıldıysanız bu k...
BeğenFavori PaylaşYorum yap

Teamviewer'i gittikçe artan sınırlamaları ve öyle bir şey olmadığı halde arada "ticari kullanıyorsun" diye ağlaması nedeniyle bırakmıştım.

Anydesk ile kısa bir aşk yaşadık ama o da çok kısa sürede sınırlamalar falan koymaya başladı, hoş olmadı, bıraktık.

Bir süredir RustDesk ile uğraşıyorum. Biraz kafa karıştırıcı, uğraştırıcı yanları var ama idare ediyor. Açık kaynak ve ücretsiz. Bundan sonra RustDesk bende kalıcı olur gibi.

BeğenFavori PaylaşYorum yap
Önceki yorumları gör 4 / 26

Geçmişteki bütün cep telefonu modellerini görüp maziye gidebileceğiniz mobil telefon müzesi.

https://www.mobilephonemuseum.com/catalogue

Catalogue

We are a not-for-profit entity created to safeguard the rich history and design diversity of mobile devices which have been launched over the last four decades.
BeğenFavori PaylaşYorum yap

Telefondaki galeriyi fotoğrafları buluta değil de bilgisayardaki bir klasörle eşleyen bir program var mı otomatik. Hatta klasöre gelip bunları telefondan kaldır burada kalsın diyebileceğimiz bir opsiyon belki.

BeğenFavori PaylaşYorum yap