Javascript’te Değişkenler,Kapsam ve Hoisting

wallpaper-2641851
Standard

Açıkcası bu yazı boyunca scope ve variable’ın türkçe karşılıklarını kullanıp kullanmamak konusunda oldukça karasız kaldım.Hatta birkaç kez yazıyı baştan sona değiştirmek zorunda kaldım.Scope için kapsam ifadesinin oldukça yetersiz kaldığına inanıyorum.Ancak her iki kelimeyi türkçe kullanmak tutarlı olacaktır.

Javascript’te kapsamı basit görebilirsiniz ancak düşündüğümüzden farklı sonuçlar görmeye hazır olun.

Javascript’te kapsam

Javascriptte kapsamı ele almadan ilk olarak bir örneği inceleyelim.

var isim = "Hakan ERSU";
function merhaba(){
	var isim = "Çilem ERSU";
	console.log("Merhaba "+isim);
}
merhaba();
console.log("Merhaba "+isim);

Bu script bloğumuzun sonucunda çıktı olarak aşağıdaki sonucu alacağız.

"Merhaba Çilem ERSU"
"Merhaba Hakan ERSU"

Sonucumuzun beklediğimiz gibi olduğunu söyleyebiliriz.Bunun nedeni javascript’te fonksiyon seviyesinde kapsama ( function scope‘a ) sahip olmasıdır.Bunun tersine birçok programlama dilinde block-level kapsam bulunmaktadır.

Yazımın ilerleyen kısımlarında bu kavramlardan bahsedeceğim için biraz olsun bu kavramları açıklamak istiyorum.

Block-Level Scope

Blok seviyesinde kapsam genel olarak akış kontrolü ifadeleri ( if,else,while,for,foreach vs ) arasında tanımlanan değişkenlerin sadece bu kontroller içinde kullanılmasını sağlayan yöntemdir.Bu gibi dillere örnek olarak C ailesi dilleri gösterebiliriz.

#include <stdio.h>
#include <string.h>
main() {
    char *isim="Hakan ERSU";
	printf("%s, ", isim); // 1
	if (1) {
		char *isim="Cilem ERSU";
		printf("%s, ", isim); // 2
	}
	printf("%s\n", isim); // 1
}

Sonuç olarak aşağıdaki gibi çıktı alacağız.

"Hakan ERSU"
"Cilem ERSU" 
"Hakan ERSU"

Aynı örneği javascript ile incelersek;

var isim = "Hakan ERSU";
console.log(isim);
if(true){
	var isim = "Çilem ERSU";
	console.log(isim);
}
console.log(isim);

Sonucumuz aşağıdaki gibi olacaktır;

"Hakan ERSU"
"Çilem ERSU"
"Çilem ERSU"

Javascript’te blok seviyesinde kapsam olmadığını söyleyebiliriz.( Non Block-Level Scope )

Function-Level Scope

Fonksiyon seviyesinde kapsam değişkenlerin global kapsamından etkilenmeden fonksiyon kapsamında kullanılabilmesi demektir.İlk örneğimizde bunu görmüştük ancak başka bir örnek ile inceleyelim.

var isim = "Hakan ERSU";
console.log(isim);
function merhaba(){
	var isim = "Çilem ERSU";
	console.log("Merhaba "+isim);
}
function gulegule(){
	var isim = "Mehmet ERSU";
	console.log("Güle güle "+isim);
}
merhaba();
gulegule();
console.log(isim);

Sonuç;

"Hakan ERSU"
"Merhaba Çilem ERSU"
"Güle güle Mehmet ERSU"
"Hakan ERSU"

Javscript Kapsamı Hakkında Detaylar ( Hoisting )

var isim = "Hakan ERSU";
function merhaba(){
	if(!isim){
		var isim = "Çilem ERSU";
	}
	console.log("Merhaba "+isim);
}
merhaba();

Yukarıda garip ama javascriptin güçlü yanlarından biri kabul edilen bir davranışa tanık olmaktasınız.Yukarıdaki ifade sonuç olarak “Merhaba Çilem ERSU” yanıtını verecektir.Ama JSHint kullanıyorsanız aşağıdaki uyarıları alacaksınız ;

Line 4: var isim = "Çilem ERSU"; --- 'isim' is already defined.
Line 6: console.log("Merhaba "+isim); --- 'isim' used out of scope.

Bu garip davranışın temelinde aslında basit bir neden yatmakta.Eğer bir fonksiyonda global kapsamda bir değişken kullanmaya çalışırsak bunda herhangi bir sorun yoktur.

var isim = "Hakan ERSU";
function merhaba(){
	console.log("Merhaba "+isim); // İsim global kapsamda.
}
merhaba();

Ancak fonksiyon içerisinde konsola yazdırma işleminden sonra aynı isimde bir değişken tanımlarsak konsol çıktımız “Merhaba undefined” olacaktır.Bunun başlıca nedeni siz bir değişkene fonksiyon içerisinde değer tanımladığınızda javascript bu değeri sizin için fonksiyonun en başında oluşturmuş olacaktır.Yani aşağıdaki gibi bir kodunuz varsa ;

var isim = "Hakan ERSU";
function merhaba(){
	console.log("Merhaba "+isim); // İsim global kapsamda.
    var isim = "Çilem ERSU";
}
merhaba();

Javascript kodunuzu şöyle görecektir.

var isim = "Hakan ERSU";
function merhaba(){
    var isim;
    console.log("Merhaba "+isim);
    isim = "Çilem ERSU";
}

Artık detaylar başlığı altında verdiğimiz fonksiyonumuz biraz daha anlamlı hale gelmiş olmalı.Javascript verdiğimiz örnek kodu aşağıdaki gibi görecektir

var isim = "Hakan ERSU";
function merhaba(){
    var isim;
	if(!isim){ // isim artık tanımsız yani if işlemi doğru
		isim = "Çilem ERSU";
	}
	console.log("Merhaba "+isim);
}
merhaba();

Sanırım artık oldukça mantıklı görünmekte ve bu davranışa hoisting denilmektedir.Bu davranış fonksiyon içinde tanımlanan başka fonksiyonlarda da geçerlidir ancak detayına şuan girmeyeceğim.

Umarım javascript kapsam hakkında kafanızı daha da karıştırmamışımdır.

Linux Üzerinde İzinler (Permissions)

wallpaper-749003
Standard

Linux üzerinde izinler kafanızı karıştırıyor olabilir.Özellikle bir yanda uzun karışık semboller bir yanda ise rakamlardan oluşan ifadeler.Ancak umarım bu yazıdan sonra daha anlaşılır olacaktır.

İlk olarak bir dosyanın iznine bakarak ne ile karşı karşıya olduğumuza bakalım.

ls -l
-rwxrw-rw- 1 xuma xuma 580 May  5 16:45 first.py

Peki bunlar bizim için ne ifade ediyor ?

first.py adlı dosyamız hakkında bu ifadenin ne anlam ifade ettiğine bakalım.

  1. first.py adlı dosya xuma kullanıcısına ait.
  2. xuma kullanıcısı okuma,yazma ve çalıştırma yetkisine sahip.
  3. Dosya xuma grubuna ait.
  4. xuma grubundaki kullanıcılar okuma ve yazma yetkisine sahip.
  5. Ve bütün kullanıcılar okuma ve yazma yetkisine sahip.

Peki bu harfler ne anlama geliyor ?

d : Bir dizin olduğu anlamına geliyor.
w : İzin sahibinin yazma iznine sahip olduğunu gösterir.
r : İzin sahibinin okuma iznine sahip olduğunu gösterir.
x : İzin sahibinin çalıştırma iznine sahip olduğunu gösterir.

 

izinler

Birde rakamlar vardı değil mi ?

Rakamsal izin değerleri yukarda bahsettiğimiz izin gruplarının ikili sayı sistemde değerlerinin karşılıklarının belirlenmesiyle oluşmakta.

Yukarıdaki dosyamızın izinleri üzerinden incelemeye devam edersek;

- rwx rw- rw-
0 111 110 110
111 = 7
110 = 6
110 = 6

Temel linux izinleri için sanırım bu kadarı yeterli olacaktır , umarım yararlı bir yazı olmuştur.

Neden Linux Mint

linux-mint-wallpaper-hd-wallpapers-technology-picture-linux-hd-wallpaper
Standard

Nedir Linux Mint

Linux Mint 2006 yılında ortaya çıkmış bir Linux dağıtımıdır.Kullanıcı odaklı bir geliştirme sürecini benimsemeleri , Ubuntu (doğal olarak Debian) üzerinde kurulmuş olması ve performans olarak biraz daha iyi olması 2. en popüler linux dağıtımı olmalarını sağlamıştır.

Uzun süredir Ubuntu kullanıcısı olduğum ve Ubuntu’nun piyasadaki en popüler ve kullanıcı dostu dağıtımı olduğu iddaası nedeniyle yazımda birçok kez Ubuntu ile karşılaştırma yapacağım.Bunu Ubuntu’yu kötülemek amacıyla değil birçok linux masaüstü kullanıcısının Ubuntu’yu birşekilde kullandığı için yapıyorum.Evimde Mint kullansamda iş yerinde Ubuntu’dan henüz vazgeçmiş değilim.

Neden Linux Mint

Aslında nedenlerdPerformans olaraken birkaçını yukarda sıraladık ama biraz daha ayrıntılı olarak nedenlere gözatalım.

Hepsi bir arada

Linux Mint hepsi bir arada bir kurulum vaad ediyor.Benim gibi daha önce Ubuntu kullandıysanız bir çok codec  ve Flash opsiyonel olarak yükleniyor.Linux Mint’te ise bu paketler otomatik olarak yüklenmekle birlikte GIMP,VLC gibi eninde sonunda linux işletim sisteminde ihtiyaç duyacağınuz uygulamalar da otomatik olarak yüklenmekte.

Paket Yöneticisi

Linux Mint oldukça güzel kategorilenmiş ve hızlı bir paket yöneticisiyle birlikte gelmekte.Bildiğim kadarıyla Ubuntu Software Center üzerinde biraz daha çalışılarak oluşturulmuş bir paket yöneticisi.

Cinnamon

Tamamen Gnome 3 hayranı biri olarak Cinnamon ilk tercihim olmasada Gnome 2′den fork edildiği için sanırım biraz hızlı olması ilgi çekici.Nemo dosya yöneticisi oldukça güzel ve stabil çalışmakta.Hatta Nautilus’dan biraz daha stabil olduğu söylenebilir.

Windows benzeri sistem barlarını pek sevmediğim için Cinnamon ve KDE ilk tercihlerim değil.Unity’nin MacOS benzeri pencere headerlarını maksimum konumda sistem barıyla bütünleştirme özelliği çalışma alanını oldukça artırmakta ve buna hayranlık duymaktayım.Gnome 3 kullanıcısı olarak Unity’deki bu özelliği uzun süredir bekliyorum.Bunun yanında Unity Launcher pencerenin sağında veya solunda oto gizleme modunda değilse sistem çözünürlüğünü etkilemekte ve yine çalışma alanını küçültmekte.

Ubuntu’da Nemo Kullanmak

Küçük Şeyler

Linux Mint sistemde bulunan ufak uygulamalar sizi birçok dertten kurtarmakta.

USB Disk Formatlama

Ubuntu’da hiç USB diskinizi formatlamayı denedinizmi ? Eğer ileri seviyede linux kullanıcı değilseniz Ubuntu ile USB formatlamak başınıza bela olabilir.Linux Mint’te bulunan USB Disk Formatlama aracı ile bu işlem oldukça basittir.Ancak Nemo’da sağ tıklama menüsünde olmaması bir eksiklik.

Domain Blocker

Domain Blocker uygulaması ile engellemek istediğiniz siteleri oldukça kolay engelleyebilirsiniz.Ebeveyn denetimi açısından oldukça yararlı uygulama.

Tema Değiştirmek

Masaüstü teması değiştirmek birçok masaüstü yöneticisinde oldukça zor olsada Cinnamon ile oldukça basit bir hal almış.

Kurulum

Linux Mint kurulumu Ubuntu kurulumuyla neredeyse birebir aynı.Ubuntu kurulum ekranının piyasadaki en iyi kurulum ekranı olduğunu sanırım rahatlıkla söyleyebilirim.(Henüz MacOS kurulum ekranını görmedim.)

Sonuç

Eğer evinizde benim bilgisayarım gibi nispeten eski bir bilgisayar kullanıyorsanız , performans olarak iyi ancak görünüm ve kullanım olarak xfce’den biraz daha iyi bir masaüstü arıyorsanız ve Ubuntu sizin ilk linux deneyimizse Linux Mint tam size göre.