böylesi daha iyi bana göre . 1 defa indirirsin tüm bağımlılıklar ile birlikte format çektiğinde tekrar kurarsın deb paketinden. internet gerekmez . Öteki türlü her formatta bağımlılık indirmek zorundasın . Benim internetim Mobil veri benim gibiler için önemli .
Uygulamanın kendi simgesinde değilde yeni pencerede dişli şeklinde gözükme sebebini çözdüm inşâallâh .
Paket oluştururken dosya yollarını 2 örnek yol ile yaparak çözdüm . Orada karışıklık yapınca ikonu okuyamıyor tahminimce gidiyor yeni sekmede acayip bir ikonda açıyor
Klasör dizilimini hatalı yaptınmı sistem okuyamıyor tahminimce . Bu kendi tecrubeme göre yorum . Dep paketi yaparken aşağıdaki gibi yaptım
Ek öneri:
Başka bir bilgisayara daha (1366x768) kurduğumda, uygulama penceresi için belirlenmiş minimum yükseklik biraz fazla geldi, 700 piksele kadar küçülebilirse daha iyi olabilir…
Sadi hocam onu ayarlayım teşekkürler.
-
Önceki mesajınızda “sistem temizliği” konusundan bahsetmiştiniz bleachbit mantığı diyelim zaten dikkat ettiyseniz kısmi bir temizlik yapıyor, yani sisteminize zarar verecek herhangi bir dosyaya müdahele etmiyor.
-
Ping (ağ hız testi bölümü) sudo istediğinden malum yetki girişi istiyor ama çalışıyor.
Neden RAM Miktarı Daha Az Görünüyor?
- psutil.virtual_memory().total (kodunuzda kullanılan yöntem), Linux’ta sistemin kullanıma açtığı (usable) RAM miktarını verir.
- Fiziksel RAM’in bir kısmı şu nedenlerle rezerve edilir ve uygulamalara sunulmaz:
- Entegre GPU (iGPU) varsa (Intel/AMD işlemcilerde yaygın), BIOS/UEFI otomatik olarak 512 MB – 2 GB arası RAM’i grafik için ayırır (shared memory).
- Kernel, BIOS/firmware, ACPI tabloları, IOMMU ve diğer düşük seviye donanım ihtiyaçları için küçük miktarlar (genellikle 100-500 MB) rezerve eder.
- Bellek haritasında “holes” (boşluklar) olabilir, bunlar da toplamı düşürür.
- Sonuç: 40 GB takılı RAM’de 38-39 GB usable görmek tamamen normal. Örneğin:
- 16 GB takılı → ~15.7-15.8 GB gösterir.
- 64 GB takılı → ~62-63 GB gösterir.
Bu, bir hata değil; Linux kernel’in güvenli çalışması için tasarlanmış bir davranış.
Böyle bir durumdan ötürü ram birebir tutmaması normalmiş, ben de çok takılmadım ![]()
v1.1 yayında
Sistem Temizliğini daha gelişmiş, açık, anlaşılır ve kontrollü bir şekilde yapıyor. Tüm detayları kullanıcıya gösteriyor ve stabil çalışıyor. (Sisteme zarar verecek herhangi bir dosya vb müdahale etmeden güvenli temizlik yapıyor)
Usb Iso Yazdırıcı (rufus vb gibi), açıklamalar eklendi ve sistemin kendi penceresinde tüm işlemi gerçekleştiriyor, açık şeffaf ve kolay kullanımlı oldu. Herhangi bir iso imajını “dd” modda istediğiniz taşınabilir diske yazmakta
Pencere boyut sorunu daha küçük ekranlı cihazlarda rahat kullanım sağlanabilmesi amacı ile pencere boyutu küçültüldü, notebook gibi küçük ekranlarda daha kullanıcı dostu bir ekran olması sağlandı. @Sadi bey’in önerisiydi teşekkürler
Proje sürümlerini kendi sayfam tarikvardar.com.tr ve ya github sayfasından inceleyebilirsiniz, indirip kolaylık ile kurabilir / kullanabilirsiniz.
Artık minimum pencere yüksekliği görece daha küçük ekranlara da uygun hale gelmiş.
Daha önce yeterince açıklayamadığım bir husus: Sistem Asistanı uygulamasının parola gerektirmesi.
Gerek Debian 14 (deneme sürümü) gerekse Debian 13 (kararlı sürümü) / Pardus 25 KDE Plasma masaüstü ortamında uygulama açılırken parola sormuyor - ki bu güzel çünkü daha sonraki işlemlerin çoğu için bu gerekli değil - fakat sudo parolası gereken bazı işlemlerde soruyor. Benim kullandığı bu 2 sistemde bunun tek istisnası Ping oluyor. Yenilerde bu komut için de sudo parolası istenir oldu ve sanırım bu yüzden HATA veriyor (ilk paylaştığım ekran görüntüsündeki gibi). Ancak uygulamayı sudo sistem-asistani komutuyla başlatınca bu sorun olmuyor fakat bence mümkünse en iyisi (diğer bir iki tanesi gibi) uygulama içinde Ping testi yapmak istendiğinde parola sorulması olur.
@Sadi hocam kendim performans için xfce kullanıyorum. gnome, cinnamon vb sanal makinede denedim, ping attığımızda yani hız testinde sudo ile başlatsanız bile şifre soruyor ama, inceleyeceğim. Girişte sudo sormamması programın açılış stabilitesi için önemlive dediğiniz gibi şifre sormaz açılışta. Ama hız testi, temizlik vb müdahale edeceği yerlerde debian 13 pardus 25 şifre soruyor. yine de sıkıntı varsa haberleşelim özel mesajdan da bildirebilirsiniz
Ben konuyu çok net anladığımı söyleyemem. Ancak şunu anladım, program açılır açılmaz şifre mi soruyor? Bunun artıları da var, eksileri de var.
Programın yetkili açılarak, her işlemde ayrı ayrı parola sormaması bir yerde iyidir.
Programın normal açılarak her işlem için ayrı ayrı parola sorması da uygundur.
Sırf böyle bir değişiklik için yüzlerce satırı elden geçirmek zorunda kalacaksınız ve biraz boşa mesai gibi olacak. Yine de siz bilirsiniz. Ben duruma göre her ikisini de tercih edebiliyorum (nasıl bir program yaptığıma bağlı).
Bleachbit, “as root” seçeneğiyle başlatırsanız başlangıçta parola sorar. Normal başlatırsanız sormaz.
Pardus Başlangıç Onarma, parola sormadan açılır. Ama yetki gereken durumlarda sorar.
Her ikisi de aynı kapıya çıkıyor.
Şu andaki durum (yani, bir kez açılışta şifre sorup bir daha sormamak yerine, ancak birkaç gerekli durumda şifre sormak) bence en iyisi, çünkü Sistem Asistanı standart kullanıcı seviyesinde de kullanışlı özelliklerle dolu.
Hem Debian 14’te hem de Debian 13 ve Pardus 25’te benim karşılaştığım sorun şu: Ağ_DNS / Ağ ve Hız Testi sayfasındaki Ping testi şifre sormak yerine doğrudan “Hata” veriyor. Ancak Sistem Asistanı sudo ile başlatıldığında Ping testi çalışıyor - fakat bu tercih edilmeyen bir seçenek.
Bu konuları pek bilmiyorum şahsen fakat anlaşılan ping komutunun sudo olmadan kullanıma açık olması güvenlik açısından riskli bulunmuş ki böyle bir değişikliğe gidilmiş. Bu yüzden “Ping Testi” olayını gözden geçirmekte fayda var gibi görünüyor.
Ağ/İnternet bağlantısının kontrolü için artık başka yöntemleri kullanmak daha uygun olabilir belki.
Örneğin, nc -zvw3 1.1.1.1 443 ve curl -I https://google.com komutu bu bakımdan oldukça kullanışlı olabilir.
Düzeltme!! Ben yanlış anladım hocam kusura bakmayın;
Evet Ağ_Dns menüsü içerisinde ping, wifi tarama, dns değiştirme ve hız testi bulunmakta.
Evet sudo şifresi sormuyor ve bu şekilde ping komutunu çalıştırıyor.
Siz de direk çalışmadığı gibi “Hata” verip kapanıyor.
Sudo kontrolü Debian 14 te sorun çıkarıyor olabilir. Onun için bir güncelleme / sudo kontrolü yapayım umarım o zaman sorun çözülür.
Ancak bende Pardus 25 kullanmaktayım ve hata vermeden, sudo şifresi sormadan direk ping ve hız testi çalışıyor.
Bu arada @Sadi hoca ısrarla Debian 13, Debian 12 dediniz, ben kodların yoğunluğundan alışkanlık gereği 11, 12 yazmıştım github ve kendi web sitemde düzelttim. Teşekkürler.
Hala kullanmayıp, öneride bulunmayan bir çok kişi var sanırım. Yorum ve desteklerinizi bekliyorum!!
Buradaki set içinde benim en sık kullandığım İnternet Hız Testi oluyor genellikle.
Bu yüzden YZ’ye GitHub projesinin URL adresini ve ilgili sayfanın da sadece hız testi ile ilgili kısımlarını gösterip bana sadece tek tıkla İnternet hız testi yapacak bir Python betiği oluşturmasını rica ettim; sonuç tam istediğim gibi oldu.
Bence bunu da ayrı bir küçük proje olarak eklemek iyi fikir olabilir.
Hatta en iyisi bunun çok dilli (başlangıç olarak İngilizce, Türkçe) ve başka diller de eklenebilecek şekilde yapılması harika olur.
#!/usr/bin/env python3
"""
Internet Speed Test
PyQt6-based speed test tool that measures download and upload speeds
"""
from PyQt6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,
QGroupBox, QPushButton, QProgressBar, QMessageBox
)
from PyQt6.QtCore import Qt, QThread, pyqtSignal
from PyQt6.QtGui import QFont
import sys
import requests
import time
import threading
# --- NETWORK TASK WORKER ---
class NetworkTask(threading.Thread):
"""Background thread for network operations"""
def __init__(self, url, mode='dl', data=None):
super().__init__()
self.url = url
self.mode = mode
self.data = data
self.bytes_transferred = 0
self.running = True
self.daemon = True
def run(self):
try:
if self.mode == 'dl':
# Download mode
while self.running:
response = requests.get(self.url, stream=True, timeout=5)
for chunk in response.iter_content(chunk_size=8192):
if not self.running:
break
if chunk:
self.bytes_transferred += len(chunk)
elif self.mode == 'ul':
# Upload mode
while self.running:
response = requests.post(self.url, data=self.data, timeout=5)
if not self.running:
break
self.bytes_transferred += len(self.data)
except Exception:
pass
def stop(self):
self.running = False
# --- SPEED TEST WORKER ---
class SpeedTestWorker(QThread):
"""Worker thread for speed test"""
result_signal = pyqtSignal(str, str)
progress_signal = pyqtSignal(int, float)
def __init__(self):
super().__init__()
self.running = True
self.thread_count = 4
self.test_duration = 10
def run(self):
try:
# DOWNLOAD TEST
self.result_signal.emit("Status", "Measuring Download Speed...")
url = "http://speed.cloudflare.com/__down?bytes=50000000"
workers = []
for _ in range(self.thread_count):
task = NetworkTask(url, mode='dl')
task.start()
workers.append(task)
start_time = time.time()
last_bytes = 0
last_check = start_time
speed_samples = []
while time.time() - start_time < self.test_duration and self.running:
time.sleep(0.5)
now = time.time()
current_total_bytes = sum(w.bytes_transferred for w in workers)
bytes_delta = current_total_bytes - last_bytes
time_delta = now - last_check
if time_delta > 0:
instant_speed = (bytes_delta * 8) / (time_delta * 1000000)
if (now - start_time) > 2:
speed_samples.append(instant_speed)
progress = int(((now - start_time) / self.test_duration) * 100)
self.result_signal.emit("Download", f"{instant_speed:.1f} Mbps")
self.progress_signal.emit(progress, instant_speed)
last_bytes = current_total_bytes
last_check = now
for w in workers:
w.stop()
w.join(timeout=1)
final_dl_speed = 0.0
if speed_samples:
speed_samples.sort()
top_samples = speed_samples[int(len(speed_samples)*0.5):]
if top_samples:
final_dl_speed = sum(top_samples) / len(top_samples)
else:
final_dl_speed = max(speed_samples)
self.result_signal.emit("Download", f"{final_dl_speed:.2f} Mbps")
self.progress_signal.emit(100, final_dl_speed)
if not self.running:
return
time.sleep(1)
# UPLOAD TEST
self.result_signal.emit("Status", "Measuring Upload Speed...")
workers = []
data = b'0' * 524288
for _ in range(self.thread_count):
task = NetworkTask("http://speed.cloudflare.com/__up", mode='ul', data=data)
task.start()
workers.append(task)
start_time = time.time()
last_bytes = 0
last_check = start_time
speed_samples = []
while time.time() - start_time < self.test_duration and self.running:
time.sleep(0.5)
now = time.time()
current_total_bytes = sum(w.bytes_transferred for w in workers)
bytes_delta = current_total_bytes - last_bytes
time_delta = now - last_check
if time_delta > 0:
instant_speed = (bytes_delta * 8) / (time_delta * 1000000)
if (now - start_time) > 2:
speed_samples.append(instant_speed)
progress = int(((now - start_time) / self.test_duration) * 100)
self.result_signal.emit("Upload", f"{instant_speed:.1f} Mbps")
self.progress_signal.emit(progress, instant_speed)
last_bytes = current_total_bytes
last_check = now
for w in workers:
w.stop()
w.join(timeout=1)
final_ul_speed = 0.0
if speed_samples:
speed_samples.sort()
top_samples = speed_samples[int(len(speed_samples)*0.5):]
if top_samples:
final_ul_speed = sum(top_samples) / len(top_samples)
else:
final_ul_speed = max(speed_samples)
self.result_signal.emit("Upload", f"{final_ul_speed:.2f} Mbps")
self.progress_signal.emit(100, final_ul_speed)
self.result_signal.emit("Status", "Test Completed")
self.result_signal.emit("Done", "Done")
except Exception as e:
self.result_signal.emit("Error", str(e))
def stop(self):
self.running = False
# --- MAIN APPLICATION ---
class SpeedTestApp(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle("Internet Speed Test")
self.setMinimumSize(600, 400)
layout = QVBoxLayout(self)
layout.setSpacing(20)
layout.setContentsMargins(50, 50, 50, 50)
# Title
title = QLabel("<h1 style='color:#33AADD; text-align:center'>Internet Speed Test</h1>")
title.setAlignment(Qt.AlignmentFlag.AlignCenter)
layout.addWidget(title)
# Status label
self.lbl_status = QLabel("Ready to Start")
self.lbl_status.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.lbl_status.setStyleSheet("font-size: 14pt; color: #555;")
layout.addWidget(self.lbl_status)
# Progress bar
self.progress_bar = QProgressBar()
self.progress_bar.setTextVisible(False)
self.progress_bar.setFixedHeight(10)
self.progress_bar.setStyleSheet("""
QProgressBar {
border-radius: 5px;
background: #e0e0e0;
}
QProgressBar::chunk {
background-color: #33AADD;
border-radius: 5px;
}
""")
layout.addWidget(self.progress_bar)
# Speed display boxes
speed_layout = QHBoxLayout()
# Download box
box_download = QGroupBox("Download")
box_download.setStyleSheet("font-weight: bold; padding: 10px;")
dl_layout = QVBoxLayout(box_download)
self.lbl_download = QLabel("-")
self.lbl_download.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.lbl_download.setStyleSheet("font-size: 24pt; font-weight: bold; color: #27ae60;")
dl_layout.addWidget(self.lbl_download)
# Upload box
box_upload = QGroupBox("Upload")
box_upload.setStyleSheet("font-weight: bold; padding: 10px;")
ul_layout = QVBoxLayout(box_upload)
self.lbl_upload = QLabel("-")
self.lbl_upload.setAlignment(Qt.AlignmentFlag.AlignCenter)
self.lbl_upload.setStyleSheet("font-size: 24pt; font-weight: bold; color: #e74c3c;")
ul_layout.addWidget(self.lbl_upload)
speed_layout.addWidget(box_download)
speed_layout.addWidget(box_upload)
layout.addLayout(speed_layout)
# Start button
self.btn_start = QPushButton("🚀 START TEST")
self.btn_start.setFixedSize(220, 60)
self.btn_start.setStyleSheet("""
QPushButton {
background-color: #e67e22;
color: white;
font-size: 14pt;
border-radius: 30px;
font-weight: bold;
}
QPushButton:hover {
background-color: #d35400;
}
QPushButton:disabled {
background-color: #95a5a6;
}
""")
self.btn_start.clicked.connect(self.start_test)
layout.addStretch()
layout.addWidget(self.btn_start, alignment=Qt.AlignmentFlag.AlignCenter)
layout.addStretch()
def start_test(self):
self.btn_start.setText("Testing...")
self.btn_start.setEnabled(False)
self.progress_bar.setValue(0)
self.lbl_download.setText("-")
self.lbl_upload.setText("-")
self.worker = SpeedTestWorker()
self.worker.result_signal.connect(self.handle_result)
self.worker.progress_signal.connect(self.update_progress)
self.worker.start()
def update_progress(self, progress, speed):
self.progress_bar.setValue(progress)
def handle_result(self, result_type, value):
if result_type == "Done":
self.btn_start.setText("Restart Test")
self.btn_start.setEnabled(True)
self.progress_bar.setValue(100)
elif result_type == "Error":
QMessageBox.critical(self, "Error", value)
self.btn_start.setEnabled(True)
elif result_type == "Download":
self.lbl_download.setText(value)
elif result_type == "Upload":
self.lbl_upload.setText(value)
elif result_type == "Status":
self.lbl_status.setText(value)
def main():
app = QApplication(sys.argv)
# Set application style
app.setStyle('Fusion')
window = SpeedTestApp()
window.show()
sys.exit(app.exec())
if __name__ == '__main__':
main()
Aslında “benim için” bu kadarı yeterli - emeğiniz için çok teşekkürler.
Fakat “sizin için” GitHub platformunda oldukça popüler bir uygulama ortaya çıkabilir böylelikle diye düşünüyorum.
Şimdiye kadar ben https://www.speedtest.net adresindeki hız testini, daha doğrusu onun Linux kabuk betiğini kullanıyordum, fakat ona bu şekilde bir grafik arayüz eklemeyi becerememiştim.
Diğer işletim sistemlerini bilmiyorum fakat en azından Linux kullanıcıları için sizinki göze daha güzel görünüyor.

