2020-07-29

Reklamlar, reklam engelleyiciler ve paranın etiğe etkisi

İlk başta internet reklamları vardı. Sonra reklam engelleyiciler geldi. Bir tarafta ürünlerini satmak için reklam bütçesi ayıran firmalar, diğer yanda da internette reklamlar aracılığıyla ücretsiz sunulan hizmetleri kullanan ama reklam görmek istemeyen kullanıcılar. Evet, ortada bir dengesizlik var. Ama dengesizliğin ilk çıktığı yerin reklam aracı kuruluşları olduğunu düşünüyorum.

Yeni okuduğum bir habere göre reklamlarının hedef kitlelere ulaşmadığını gören büyük reklam verici firmalar çözümü Adblock'a gizli gizli para yedirmekte bulmuşlar. "Kabul edilebilir reklamlar" adı altında "bazı" reklamlar artık kullanıcılar adına "beyazlisteye" alınmaya başlanmış. Amerikalı senatör Ron Wyden da bu beyazlisteyi inceleme konusunu gündeme getirmiş. Perdeler arkasında neler oluyor...

2020-07-28

Windows'da stderr akışını yönlendirme

Konsolda çalışan uygulamalar için 3 temel akış vardır:
  1. Standart Giriş (stdin)
  2. Standart Çıkış (stdoout)
  3. Standart Hata (stderr)
Bir program standart bilgilendirmesini stdout'a yapar. Microsoft'un örneği üzerinden gidelim. Eğer olmayan bir dosyayı dir ile listelemek ve çıktısını bir dosyaya yazmak istersek:

C:\> dir abc.def > dosya.txt
File Not Found

hala "File Not Found" hatasını ekranda görürüz. Üstelik bu çıktı dosya.txt'ye de yazılmaz. Çünkü dosyaya yazılan kısım stdout'a gönderilen, "File Not Found" ise stderr'a gönderilen bilgidir.

Bu durumda "File Not Found" mesajını hata.txt dosyasına, geri kalan tüm stdout'ları da dosya.txt dosyasına göndermeyi seçebiliriz:

C:\> dir abc.def 2>hata.txt > dosya.txt

Ya da hataları görmek istemiyorsak stderr'u nul'a yönlendirebiliriz. Dikkat, Windows'da nul tek "l" ile yazılır.

C:\> dir abc.def 2>nul > dosya.txt

Bunlar Linux'ta, Windows komut satırında (cmd.exe) ve Powershell'de de geçerli.

Linux ve Powershell'de geçerli olup da Windows komut satırında geçerli olmayan stderr'un stdout'a yönlendirilmesi. Bunu Linux ve Powershell'de şu şekilde yapabiliriz:

C:\> dir abc.def 2>&1

ya da linux'ta

 $ ls abc.def 2>&1

Bunun sonucunda olmayan bir dosyayı listeleme girişimimizde oluşturulan tüm çıktı stdout'a gitmiş olur. Bunu da toplu olarak bir dosyaya yazabiliriz:

C:\> dir abc.def 2>&1 > dosya.txt

Ama bu iş Windows komut satırında olmadı.

Şu sitede belirtilene göre hem stdout hem stderr'u aynı dosyaya yazmak için bir sıra değişikliği yapmak gerek:

C:\> dir abc.def > dosya.txt 2>&1

Bu durumda şöyle bir genelleme yapılabilir; çıktısı ile ilgilendiğimiz komut sonrasında önce stdout'u yönlendireceğimiz komut yer almalı. Stderr'un yönlendirmesi sonra gelmeli.

Tüm bunlar nerden aklıma geldi; ffprob'u kullanırken üretilen çıktıların tümü stderr'a gönderiliyor; garip bir şekilde. Bunları bir dosyaya yazdıramadım. Ama stderr yönlendirmesi başarılı oldu.

[1]'e göre bir de console çıktımız varmış.
[2]'ye göre powershell 7'de daha da fazlası varmış.
---
[1] https://www.robvanderwoude.com/battech_redirection.php
[2] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-7

Komut satırından toplu resim kırpma

Elimde aynı yerinden kırpılması gereken çok sayıda resim var. Kırpılan resimleri de başka bir klasöre kaydetmem gerek. Bunu komut satırından nasıl yapabilirim diye düşünürken aklıma ffmpeg geldi. Resim kırpma için şu sayfada bulduğum bilgileri poweshell ile birleştirerek aşağıdaki satırı yazdım. Resimlerin asılları D:\kaynak klasöründe resimxxx.png ismiyle bulunuyor (xxx: 3 haneli ardışıl sayılar). Kırpılan resimleri D:\kirpilmis klasörüne kaydedeceğim.

PS> dir D:\kaynak\resim*.png |
% {ffmpeg -i $_ `
-vf "crop=200:200:200:0" `
(Join-Path -Path "D:\kirpilmis" -ChildPath `
(Split-Path $_ -Leaf))}

Burada crop parametresi ile verilen sayılar kırpma işleminin yerini ve boyutlarını tarif ediyor:
crop=genişlik:yükseklik:x:y
x ve y, kırpmanın x ve y koordinatı olarak başlangıç noktası.

Blog sayfasında güzel gözüksün diye satırı backtick (`) karakteri kullanarak böldüm, tek satır yapmak için bu karakterleri çıkarmak gerek. İlk satırda kullanmadım, çünkü dikey çizgi (|) karakteri kullanılabildiği durumlarda satır bölücü olarak iş görüyor.

ffmpeg, uzantıya göre formatı otomatik seçtiği için sadece dosya uzantısını değiştirerek jpg veya başka bir formatta da kayıt yapılabilir.

2020-07-21

vSphere client is no longer authenticated hatası

Bir süredir Chrome ve Firefox üzerinde yaşadığımız şu hata çok can sıkıcı olmaya başlamıştı.


Çözüm olarak Firefox'un "Private Windows" gibi gezinme bırakmayan güvenli kipleri ile açıyordum ama alışkanlıkları ve düzeni (!) olan biri için bu bile çok zor.

Neyse, bir süre önce bu konu ile ilgili arama yapmıştım ama doğru sonuçlara ulaşamamışım anlaşılan. Şimdi baktığımda daha güzel sonuçlar buldum. Örneğin şu sayfa. Çözüm olabilecek 3 olasılıktan bahsedilmiş:

1. Çok olası olmamakla birlikte ESX sunucu üzerinde /etc/vmware/vsphere-client/webclient.properties içindeki

session.timeout=120

değerini tekrar ayarlamaktan bahsedilmiş. Bu adımı doğrudan atladım, çünkü buraya bir müdahalem olmadı.

2. Daha da zayıf bir ihtimalle yerel ağda SSO hizmetinin çalışmasını sağlayan isim çözümleme sisteminin farklı bir DNS sunucu kullanımı ile bozulması olasılığından bahsedilmiş. Bunu da atladım.

3. Tarayıcıda cookie'lerin bozulmuş olması durumu. Hemen Firefox > Options'a (Firefox > Seçenekler) girdim. Oradan Privacy & Security (Gizlilik & Güvenlik) alt alanına geldim. Burada Cookies and Site Data (Çerezler ve Site Verisi) başlığı altındaki "Manage Data" (Verileri Yönet) düğmesine basarak tarayıcımdaki tüm çerezleri görüntüledim.


Bu çok karışık olduğu için vCenter Appliance sunucumun ismini yazarak listeyi sınırladım.


Gösterilen tüm çerezler benim hedefimdekiler olduğu için aşağıdaki "Remove All Shown" düğmesine tıklayarak tüm çerezleri sildim.

Bundan sonra herşey eskisi gibi oldu. Bu eskiye merak ne menem birşeyse...

2020-07-18

Firefox Containers

Arama motorlarının genel arama alışkanlıklarımız hakkında gereğinden çok fazla bilgiye sahip olmasına, alışveriş sitelerde incelediğimiz şeylerin daha sonra başka yerlerdeki Google reklamları ile de karşımıza gelmesine, kişisel verilerimizin sanal dünyanın malı haline gelmesine karşıyım. Bu sebeple alışveriş sitesinde aradıklarımın orda kalmasını, arama motorlarında aradıklarımın anında unutulmasını ve her girdiğim sitenin arka planda benim ile ilgili yüzlerce veri tutmasını istemiyorum.

Bu konular hakkında söylenecek çok şey var ama uzatmadan konuya girmek istiyorum. Firefox'un yeni bir özelliği var: Containers. Türkçe sürümünde kapsayıcı sekme olarak geçiyor. Ama ben bu yazıda Containers'ı kullanacağım.

Amaç şu: her siteye girdiğimizde çerezler kullanıyoruz. İşleyiş açısından çerezlerin kaçınılmaz olduğu durumlar var. Ama kesinlikle kaçınılabilir olduğu durumlar da var. Containers işte bu amaçla tarayıcı sekmelerini gruplayarak iki grubun birbirlerinin çerezlerine erişimlerini engelleyen bir yöntem. Bu özelliği kullanmak için bir eklenti yüklemek gerekiyor. Eklenti de Mozilla Vakfı'nın bir ürünü: Multi-Account Containers.

Yükledikten sonra örneğin sosyal medya siteleri için bir container yaratıp tüm sosyal medya sitelerini bu container içinde açarsanız diğer sitelerin sosyal medya sitelerinde açtığınız oturumlardan hiç haberi olmuyor. Veya alışveriş siteleri için bir container yaratıp tüm alışverişlerinizi bu siteler içinde yaparsanız diğer sitelerde bu alışveriş sitelerinde yaptığınız gezintiden hiç bilgisi olmuyor.
 
Firefox'u seviyorum. Bu tür gizlilik ilkelerine önem verip kullanıcıların verilerini koruyup rahatça gezinmelerini sağlayacak adımlar atıyor. Ama pazar payı gittikçe azalıyor. Bu durumda rakiplerinin karşısında bir gün "artık devam edemiyoruz" diyecekler diye de korkuyorum.

2023-07-05 Ek: Ya ilk kullanımda farketmemişim, ya da sonradan eklenmiş. Container sırasını değiştirmek mümkün. Bunun için araç çubuğunda yer alan simgesini tıkladıktan sonra (ya da Ctrl+. kısayolu ile) Manage Containers komutu ile açılan menüde container isimlerini tutup sürükleyerek istediğimiz sırayı elde edebiliriz. Her seferinde fare ile açmaktan kaçınanlar için ise eklenti seçeneklerinde kısayol tanımlamaları var. Varsayılan olarak Ctrl+Shft+<sayı> kısayolu kullanılıyor. <sayı> kısmı da varsayılan olarak container sırasına göre atanıyor. Yani ilk sıradaki container'ı klavye kısayolu ile açmak için Ctrl+Shft+1 kullanabiliriz.

2020-06-26

Windows'a çevrimiçi duvar kağıtları

Şu yazımda Bing'in günlük resimlerinin Fedora'da nasıl duvar kağıdı olarak kullanılabileceğini yazmıştım. Bu aslında internetten bulduğum bir içerikti.

Buradan esinlenerek bu işi Windows'da nasıl yapabilirim diye düşündüm. Powershell'de aynısını yapmaya karar verdim.

Önce gereken değişkenleri tanımlayalım:
$bing="www.bing.com"
$xmlURL="http://www.bing.com/HPImageArchive.aspx?format=xml&idx=0&n=1&mkt=en-US"
$saveDir="D:\wallpapers\"
$picExt=".jpg"
$desiredPicRes="_1440x900"
$fullstop = $false 
$saveDir ile belirtilen klasörün var olduğundan emin olmalıyız. Fedora için yaptığımız gibi var olsun olmasın yaratılması için
New-Item -ItemType Directory -Path $saveDir -ErrorAction SilentlyContinue | Out-Null
Ya da powershell'e özgü Test-Path ile kontrol edip daha sonra yaratmaya gidebiliriz.
if (-Not (Test-Path $saveDir))
{
    New-Item -ItemType Directory _path $saveDir
}
gibi.

Bing'in günlük duvar kağıdı bilgilerini paylaştığı bir xml çevrimiçi verisi var, $xmlURL değişkeni ile verilen adreste. Bu verinin içinde <urlbase> tag'inin içeriğini kullanarak istediğimiz çözünürlükte (varsa) resmi edinebiliriz. Her durumda bu olmayabiliyor. İstdediğimiz çözünürlükte resim yoksa varsayılanı kullanmayı deneyebiliriz.
[xml]$response = (New-Object System.Net.WebClient).DownloadString($xmlURL)

$defaultPicURL = $response.images.image.url
$desiredPicURL = $response.images.image.urlbase + $desiredPicRes + $picExt
<urlbase> tagından elde edilen dosya isimleri şu formatta oluyor:

/th?id=OHR.MontageJupiterIo_EN-US2310290045

Ben bunları şu formatta kaydetmek istiyorum:

MontageJupiterIo_EN-US2310290045_1440x900.jpg

Bunun için de aşağıdaki kırpma işlemlerine tabi tutuyorum:
 
$checkfile = $defaultPicURL.split("&")[0]
$checkfile = $checkfile.split(".")[1] + "." + $checkfile.split(".")[2]
 
Fedora için bu adımları orijinal olarak öneren kişi resimleri günlük olarak tutuyor, yenisini indirince siliyordu. Ben silmemeyi tercih ettim. Ama bu da bir resmin ikinciye indirilme girişimini kontrol etmemi gerektirdi. Bunun için yukarıdaki checkfile değişkeni içinde saklanan dosya adını biraz daha kırpıp dosya uzantısını yok ettim:

$checkfile = $checkfile.substring(0,$checkfile.length-4)

Bu aşamadan sonra bir if bloğunun içinde istenen çözünürlükte dosya var mı diye kontrol ediyorum.
 
if ((dir (Join-Path -Path $saveDir -ChildPath ($checkfile + "*"))).Count -eq 0)
 
Gerçekten bu kadar ayrıntılı bir if koşuluna gerek yoktu aslında, ama benim bu resimleri indirdiğim klasördeki isim karmaşası bunu gerektirdi. Neyse, yukarıdaki if koşulunun doğru olduğu durum için aşağıdaki gibi uzun bir kod var. Burada önce istenen çözünürlük var mı, onu kontrol ediyorum, iwr (Invoke-WebRequest) ile. Sadece dosyanın var olup olmadığını öğrenmek için HTTP HEAD yöntemini kullanması için de -Method parametresi ile head değerini gönderiyorum, ilk try bloğunun içinde. Yoksa iwr'in bir error throw etmesi için de -EA stop kullandım. Catch'in içinde de istenen çöznürlüğün yerine varsayılan çözünürlüğün kullanılmasını sağladım. İç içe iki try-catch ile varsayılan çözünürlükteki resmin de olup olmadığını kontrol ettim. finally bloğunun içinde de bulunan (istenen çözünürlük veya varsayılan) resmin download edilmesini, duvarkağıdı olarak ayarlanmasını sağlayan fonksiyonu çağırdım. Birkaç log tutma satırı ile birlikte.

try {
     $resp = iwr -Uri ($bing + $desiredPicURL) -EA Stop -Method Head

    # desired URL OK
     Write-Host "desired res OK."
    $picName = $desiredPicURL.split(".")[1] + "." +          $desiredPicURL.split(".")[2]
    $fullPath = Join-Path -Path $saveDir -ChildPath $picName
}

catch {
     # desired not available
    try {
        $resp = iwr -Uri ($bing + $defaultPicURL) -EA Stop -Method Head
        Write-Host "desired not found, falling back to default."
        $picName = $defaultPicURL.split("&")[0]
        $picName = $picName.split(".")[1] + "." +                 $picName.split(".")[2]
        $fullPath = Join-Path -Path $saveDir -ChildPath $picName
     }

    catch {
        # neither default available
        Write-Host "None available right now."
        $fullstop = $true
        Break
    }

}

finally {

    if ($fullstop) {
        # here means nothing found
        Add-Content -Path $logfile -Value "$bugun - nothing found."
    }
    else {
        # hear means something is found, either desired or default
        try {
            $resp = iwr -Uri ($bing + $defaultPicURL) -OutFile $fullPath
            Add-Content -Path $logfile -Value "$bugun - downloaded : $fullpath"
            Set-WallPaper $fullpath
        }

    catch {
        $hata = $PSItem.Exception.ToString()
        Write-Host "last stage error: $hata"
        Add-Content -Path $logfile -Value "$bugun - last stage error."
        }
    }
}

 
Bir adım önceki if'e ait else bloğunda da eğer dosya zaten varsa bir daha indirilmemesini ve işlem kaydı düşülmesini sağladım.

else {
    Write-Host "File is already downloaded:" (dir (Join-Path -Path $saveDir -ChildPath ($checkfile + "*")))[0]
    Add-Content -Path $logfile -Value "$bugun - file is already downloaded."
}

Hayatını kodlama ile kazananlar; yukarıdaki karmaşa için kusura bakmayın.

Sonrasında bunu Görev Zamanlayıcısıyla otomatik çalıştırmaya ayarlamak kalıyor. Bunun için Set-ExecutionPolicy ile çalıştırma politikasını uygun şekilde değiştirmek, ps1 dosyasını imzalamak ya da komut satırından powershell.exe ile birlikte -ExecutionPolicy anahtarını kullanmak gerekebilir.

28.06.2020 Düzenleme: Registry'deki anahtarı değiştirip daha sonra rundll32.exe'yi kullanarak UpdatePerUserSystemParameters çağrısı yeni sistemlerde pek işe yaramıyor. Bunun yerine şurada SystemParametersInfo API'sinin kullanılması önerilmiş. Bunu powershell'de nasıl yapabiliriz diye düşünürken önce Matt Graeber'in blog'unda yazdıklarına denk geldim. Çok faydalı olarak PInvoke.com sitesini önermiş. Ama burdan sonra yapılacak bir dünya iş vardı ve ben bu notasyona aşina değildim. Daha fazla aramayla Jose Espitia'nın bloguna denk geldim. Bu işte tam aradığım şeydi. SystemParametersInfo'nun Powershell'den çağrılabilir hale getirilmişi. Bunu kullanarak tam sonuca ulaştım.

Function Set-WallPaper($Image) {
<#
.SYNOPSIS
Applies a specified wallpaper to the current user's desktop
   
.PARAMETER Image
Provide the exact path to the image
.EXAMPLE
Set-WallPaper -Image "C:\Wallpaper\Default.jpg"
#>
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
public class Params
{
    [DllImport("User32.dll",CharSet=CharSet.Unicode)]
    public static extern int SystemParametersInfo (Int32 uAction,
                                                   Int32 uParam,
                                                   String lpvParam,
                                                   Int32 fuWinIni);
}
'@
$SPI_SETDESKWALLPAPER = 0x0014
$UpdateIniFile = 0x01
$SendChangeEvent = 0x02
$fWinIni = $UpdateIniFile -bor $SendChangeEvent
$ret = [Params]::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $Image, $fWinIni)
}

Linux'ta diskte yer açmak

Bir süredir hakkında kısa kısa bilgiler biriktirdiğim konuları hızlıca blog'a koymaya başladım. Sanırım anlatımlar biraz eksik kaldı. Umarım yakın zamanda tekrar üzerinden geçerim. Bu dil ile ilgili daha fazla beklentileri olanlardan özür niteliğinde olsun.

Son zamanlarda kullandığım dağıtımlar Fedora ve Arch/Manjaro'dan ibaret. Bu sebeple bu başlığın hedefleri bu dağıtımlar.

Bir süre kullanılan linux kurulumları gerek paket güncellemeleri gerekse loglar sebebiyle çok yer kaplamaya başlayabilir. Öncelikle paket ön belleğini konrol edebiliriz.

Fedora
Fedora'da paket önbelleği /var/cache/dnf klasörü altında tutulur. Kaç paket için önbellek olduğunu göremek için
ls -lR /var/cache/dnf | wc -l
ya da toplamda bu klasör ne kadar yer kaplıyor diye bakabilmek için
du -sh /var/cache/dnf
kullanılabilir. Bu klasörün en kapsamlı temizliği için
sudo dnf clean all
komutunu kullanabiliriz. Ama /var/cache/dnf klasörünün tüm içeriği cache verisi olmayabilir.
 
Gereksiz bağımlılıklardan kurtulmak için
sudo dnf autoremove
Arch/Manjaro
Arch türevlerinde ise paket önbelleği /var/cache/pacman/pkg altında tutulur. Kaç dosya var diye bakmak için
ls -lR /var/cache/pacman/pkg | wc -l
ya da burası diskte ne kadar yer kaplıyor diye bakmak için
du -sh /var/cache/pacman/pkg
Arch veya türevlerinde paket önbelleğini temizlemenin birkaç farklı yolu var. Kaldırılmış paketleri temizlemek için
sudo pacman -Sc
ya da kurulu olanları bile kaldırmak için
sudo pacman -Scc
veya daha ayrıntılı olarak sadece son 3 sürümü hariç eski sürümleri silmek için
sudo paccache -r
ve hatta sadece 1 sürüm bırakmak için
sudo paccache -ruk0
kullanılabilir. "Yetim" olarak adlandırılan gereksiz bağımlılıkları görmek için
pacman -Qtdq
ve bu gereksiz bağımlılıklardan kurtulmak için
sudo pacman -Rns $(pacman -Qtdq)
kullanılabilir.
 
Debian/Ubuntu
Kullanılmayan paketleri ve yapılandırma dosyalarını kaldırmak için
sudo apt autoremove --purge

Ama önce nelerin kaldırılacağını görmek için

sudo apt autoremove --dry-run

Debian'da paket önbelleğinin konumu /var/cache/apt/archives/ ve bunun boyutunu kontrol etmek için

du -sh /var/cache/apt/archives/

Paket önbelleğini temizlemek için

sudo apt autoclean
Diskte en çok yer kaplayan paketleri görmek
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -rn | head
 
Kullanıcı önbelleği
Kullanıcı hesabınıza özel önbellek alanının boyutunu kontrol etmek için
du -sh ~/.cache/
temizlemek için
rm -rf ~/.cache/
kullanılabilir, dağıtımdan bağımsız olarak.

journal loglarını temizlemek
Bu işlem de dağıtım bağımsız olarak yapılabilir. Mevcut boyutu kontrol etmek için
 
journalctl --disk-usage
 
komutu kullanılabilir. Sonrasında örneğin en yeni 50 MB'lık veriyi bırakıp eskileri silmek için
journalctl --vacuum-size=50MB
ya da son 4 hafta hariç tüm kayıtları silmek için
journalctl --vacuum-time=4weeks
kullanılabilir.
 
Fedora'da kurulu programlardan en çok yer kaplayanları bulmak için:

rpm -qa --queryformat '%{name} %{size}\n' | sort -n -k 2 -r | head -n 20

Veya bir klasör içinde en çok yer kaplayan alt klasörleri bulmak için
 
du -d 1 /home/metin/Documents/Proje1 | sort -n
 
kullanılabilir. Burada -d 1 ile klasör derinliği 1 olarak seçilmiş, ardından sonuçlar -n ile nümerik olarak (küçükten büyüğe) varsayılan olarak ilk sütuna (sütunlar boşlukla ayrılmış alanlardır ve ikinci sütuna göre sıralama yapmak için -k 2 kullanılır) göre sıralanır. Bu şekilde en çok yer kaplayan klasör tespit edilebilir.
 
Aradığımız büyük bir dosyalar ise bir klasörün içindeki en büyük 5 dosyayı aşağıdaki gibi bulabiliriz.

ls -lRr | sort -n -k 5 | tail -5 | awk '{print $5 " - " $9}'
 
Bunların hepsi geçici yöntemlerdir. Bunları uyguluyorsak artık diski büyütme zamanı gelmiştir. Bunlar sadece biraz daha zaman kazandırabilir.
---