Okumak ve Yazmak Üzerine

Bu konunun fikri aslında Schopenhauer’ın Okumak,Yazmak ve Yaşamak Üzerine adlı kitabında bahsettiği aşağıdaki satırlardan dolayı yazma ihtiyacı hissettim.

Okurken bir başka kimse bizim için düşünür: Biz sadece onun zihin sürecini takip etmekle yetiniriz. Nasıl ki yazmayı öğrenirken talebe öğretmen tarafından kalemle çizilmiş çizgileri takip eder: Okurken de tıpkı bunun gibidir; düşünme işinin büyük bölümü zaten bizim için bitirilmiştir.

Continue reading

Angular : Can’t Bind to ngModel since it isn’t a known property

Bu aralar JavaScript ve ilgili frameworkler ve kütüphanelerle aramı geliştirmeye çalışıyorum 🙂

Angular 9 sürümü gelmeye yakınken, geçmişe yönelik sürümlerden başladım. Geliştirme yaparken ngModel kullanımında aşağıdaki hata ile karşılaştım.

Can’t Bind to ngModel since it isn’t a known property

Bu hatanın çözümü , FormsModule class ını app.module.ts dosyasında import etmeniz gerekiyor.

import { FormsModule } from ‘@angular/forms’;
Daha sonrasında @NgModule decorator unu aşağıdaki şekilde güncelleme-niz gerekiyor.
 
@NgModule({                      
  declarations: [                
    AppComponent,                
    RecipeListComponent,         
    RecipeSummaryComponent       
  ],                             
  imports: [                     
    BrowserModule,               
    FormsModule                  
  ],                             
  providers: [],                 
  bootstrap: [AppComponent]      
})                               

 

 

JavaScript Array Methods

Array Iterator Methods
 
Methodları açıklamadan önce , bazı genellemeleri açıklamada fayda var. Bu yöntemlerin tümü function ilk parametre olarak kabul eder ve dizinin her bir elemanı veya bazı elemanları için
bu fonksiyonu bir kez çağırır. Eğer dizi sparse( seyrek ) ise parametre olarak kabul edilen function var olmayan öğeler için çağrılmaz. Çoğu durumda , bu function 3 argümanla birlikte çağrılır.
Dizinin değeri , dizinin indexi ve dizinin kendisidir.
 
FOREACH()
 
forEach() function ı, dizi boyunca her bir öğe için belirttiğiniz bir bir işlevi çağırır.

Continue reading

JavaScript Immutable Primitive Values And Mutable Object References

JavaScript te primitive değerler ve nesneler arasında (objects) temel farklılıklar vardır. Primitive tipler immutable ( değiştirilemezdir) :  Primitive bir değeri değiştirmenin
bir yolu yoktur. Bu sayılar ve boolean tipler içinde geçerlidir. Ancak string ifadeler için çok açık değildir. String ler karakter arrayi olduğu için herhangi bir dizindeki karakteri değiştirmeyi düşünebilirsiniz.
Aslında JavaScript buna izin vermez ve değiştirilmiş bir string döndüren tüm string methodları aslında yeni bir string döndürür.
let name = "engin";        
name.toUpperCase() // ENGİN
name //engin               
Primitive tipler değerlerle karşılaştırılır. İki değer yalnızca aynı değere sahiplerse aynıdır. Bu numbers,boolean, null ve undefined için aynı yola çıkarır.
String ifadeler için ise çok açık değildir. İki farklı string değeri karşılaştırılırsa , JavaScript bunları aynı uzunlukta ise ve her indexteki karakter aynı ise , aynı kabul eder.
Nesneler ( objects) primitive tiplerden farklıdır. İlk önce , mutable yani değiştirilebilirler.
let obj= { x:1 }
o.x = 34;       
o.y = 1;       
let arr =[1,2,3]
arr[0] = 0;     
Nesneler değerlerle karşılaştırılmaz. İki obje aynı property lere ve değerlere sahip olsalar bile eşit değillerdir. İki array aynı uzunlukta ve aynı sıralamada değerlere sahip olsa bile aynı değildir.
let first        = { "name":"engin" }
let second   = { "name":"engin" }    
first == second // false çıktısı verir.   
let arrFirst =[] ,arrSecond =[];          
arrFirst==arrSecond //false çıktısı verir.
Nesnelere bazen bunları JavaScript in primitive tiplerinden ayırmak için reference type denir. Bu terminoloji ile , nesne değerleri referanstır ve nesnelerin referans ile karşılaştırıldığını söyleriz.
İki nesne değeri , eğer sadece aynı temel nesneye atıfta bulunurlarsa aynıdır.
let first = [];                          
let second= first;                       
first[0] = 1;                            
second[0] // 1 çıktısı verir.            
first === second // true çıktısını verir.
Yukarıdaki örnekte görüldüğü gibi bir değişkene bir nesne atamak yalnızca referansı atar, nesnenin yeni bir kopyasını oluşturmaz. Bir nesneni kopyasını oluşturmak istiyorsanız , nesnenin özelliklerini
veya dizinin öğelerini açıkca kopyalamamız gerekiyor.
let first=[1,2,3];               
let second=[];                   
for(let i=0;i<first.length;i++){ 
    second[i]=first[i];          
}                                

JavaScript Lexical Structure

Lexical Structure, sözcüksel yapı anlamına gelir.
Programlama dilinin Lexical Structure yapısı , programların bu dilde nasıl yazılacağını belirten temel kurallar kümesidir. Değişken adlarının neye benzediği, yorum karakterlerinin hangi ayırıcı karakterler olduğu,
ve bir program ifadesinin diğerinden nasıl ayırt edileceğini belirtir.
Javascript, case-sensitive bir dildir. Bu dilde kullanılan identifierların , değişkenlerin , işlev adlarının ve diğer tanımlayıcıların her zaman harflerin tutarlı şekilde aynı şekilde yazılması gerektiği anlamına gelir.
Örnek olarak, while anahtar kelimesi , while olarak yazılması gerekir. While ve WHILE olarak yazılmaması gerekiyor. elma,Elma,ElMa,ELMA birbirinden farklı dört adet değişkendir.
Javascript , programlardaki belirteçler arasında görünen boşlukları yok sayar. Javascript, çoğu zaman satır sonlarını da yok sayar. Program yazarken boşlukları ve yeni satırları özgürce kullabildiğimiz için, programlarımızı kodun okunabilmesi ve anlaşılabilir olması için tutarlı bir şekilde biçimlendirebilir ve girintili bırakabilirsiniz.

Comments

Javascript iki şekilde yorum satırını destekler. // ile başlayan satırın başı ve sonu arasındaki herhangi bir metin yorum olarak kabul edilir ve Javascript tarafından dikkate alınmaz.
/* ve */ karakterleri arasındaki herhangi bir metin de yorum olarak kabul edilir; bu yorumlar birden fazla satıra yayılabilir ancak iç içe geçmeyebilir.
// Tek satırlık yorum
/* Bu da bir yorum satırı */
/*
  Bu da çok satırlı bir yorum satırı.
  Birden fazla satıra sahip olabilir.
*/

Literals

Literal programlama dillerindeki veri değerlerini ifade eder. Aşağıdakiler birer literal ifadedir.
33
3.3
"Selam sana"
'Selam'
true
false
null

Identifier ve Reserved Words

Identifier basit bir isimdir. JavaScript te sabitleri, değişkenleri , methodları ve sınıfları adlandırmak ve JavaScript kodundaki belirli döngüler için etiket sağlamak için kullanılır.
Bir JavaScipt identifier i bir harf , _ (underscore) veya $ işareti ile başlamak zorundadır. Sayılar ilk karakter olarak kullanılmasına izin verilmez.
i
degisken
degisken12
_temp
$str
Diğer programlama dillerinde olduğu gibi , JavaScript dilin kendisi tarafından kullanılmak üzere belirli tanımlayıcıları saklı tutar. Bu ayrılmış kelimeler normal tanımlayıcı olarak kullanılmaz.

Unicode

JavaScript programları Unicode karakter kümesi kullanılarak yazılmıştır ve dizelerde yorumlarda herhangi bir Unicode karakterini kullanabiliriz. Portability ve düzenleme kolaylığı için , tanımlıyıcılarda
yalnızca ASCII harflerini ve rakamlarını kullanmak yaygındır. Ancak bu yalnızca bir programlama  kuralıdır ve dil, Unicode harflerine , rakamlarına ve ideograflarına tanımlıyıcılarda izin verir. Bu, programcıların İngilizce dışındaki dillerden değişken isimleri kullanmasına ve ayrıca matematiksel sembolleri kullanmasına izin verir.
const π = 3.14;

Unicode Escape Sequences

 
Bazı bilgisayar donanım ve yazılımları , Unicode karakterlerinin tam setini görüntüleyemez veya giremez veya doğru şekilde işleyemez. Eski teknolojiyi kullanan programcıları ve sistemleri desteklemek için
Javascript , yalnızca ASCII karakterlerini kullanarak Unicode karakterleri yazmamıza izin veren çıkış dizilerini tanımlar. Bu Unicode escapes \u ile başlar ve bunu tam olarak 4 hexadecimal rakam veya curly bracet içine alınmış bir ile 6 hexadecimal rakam izler. Bu Unicode escape JavaScript string literallerinde , regular expression larda ve tanımlıyıcılarda görünebilir.

Unicode Normalization

 
Eğer Unicode olmayan bir karakter kullanıyorsanız, Unicode un aynı karakteri kodlamanın birden fazla yoluna izin verdiğini unutmayın.

Optional Semicolon

 
JavaScript diğer programlama dillerinde olduğu gibi , ifadeleri birbirinden ayırmak için “;” kullanır. Bu kodunuzunun okunabilirliğini ve anlamını netleştirmek için önemlidir. “;” olmadan bir ifadenin sonu bir ifadenin başlangıcı olarak görünebilir. JavaScript te ayrı satırlara yazılan iki ifade varsa “;” kullanmayabiliriz.
Aşağıdaki ifadeler iki satıra yazıldığı için ilk “;” gözardı edilebilir.
a =  "engin" ;
b =  "isa";
Yukarıdaki ifade aşağıdaki gibi yazılırsa ilk “;” zorunludur.
a = "engin" ; b = "isa" ;
JavaScript her satır sonunu noktalı virgül olarak nitelendirmez, genellikle satır sonlarını noktalı virgül olmadan kodu ayrıştıramazsa noktalı virgül olarak algılar . Bir sonraki boşluksuz karakter mevcut
ifadenin devamı olarak yorumlanmazsa , JavaScript bir satır sonunu noktalı virgül olarak değerlendirir.
let name 
 name 
  =
"engin isa"
console.log(name)
Yukarıdaki kodu düşündüğümüzde JavaScript kodu aşağıdaki gibi yorumlar  :
let name ; name = "engin isa" ; console.log(name);
Bu ifade sonlandırma kuralı bazı şaşırtıcı durumlara yol açmaktadır. Aşağıdaki kod yeni satır ile ayrılmış iki ifadeye benziyor.
let count = x + f
 (a+b).toString();
Ancak ikinci kod satırındaki parantezler ,f nin ilk satırından itibaren fonksiyon çağrısı olarak yorumlanabilir ve JavaScript bu kodu şöyle yorumlar :
let count = x + f(a+b).toString();
Burada tasarlanmak istenen kod parçacığı muhtemelen bu şekilde olmadığından dolayı , iki ayrı ifade olarak çalışabilmesi için ilk satırda “;” ifadesi gerekir.
Genel kuralın , JavaScript te satır sonlarını ikinci satır ile birinci satırı bir bütün ifade olarak görmediği ve “;” yorumlandığı 3 durum vardır. return , yield , break , continue ifadeleridir.
Bu ifadeler genellikle tek başına durur, ancak bazen bu ifadelerden sonra bir tanımlayıcı veya ifade yer alır. Bu sözcüklerden herhangi birisinde bir satır sonu görürse JavaScript “;” olarak
yorumlar.
Örneğin ;
return
true;
Yukarıdaki kod return ; true; olarak yorumlanabilir. Ama kodu yazan kişi muhtemelen aşağıdaki gibi bir blok yazmak istemiştir.
return true;

Docker Kitematic VirtualBox is not installed Hatası

Eğer aşağıdaki hatayı alıyorsanız.C:\Users\username\AppData\Roaming\Kitematic dosya yolundan localStorage ve Cache folder larını silerseniz hata kalmayabilir.Neden kalmayabilir :),her zaman her sorun aynı çözüm yolu çözülemeyebiliyor.

There seems to have been an unexpected error with Kitematic:
VirtualBox is not installed. Please install it via the Docker Toolbox.

Git Başlangıç

Bu yazımda temel git komutlarını açıklamaya çalışacağım.

İlk olarak,git init komutu ile başlangıç repository si oluşturalım.

git init
Initialized empty Git repository in .git/

Git klasörün boş ve dosyalarla dolu olmasını dikkate almaz.Dizininizin bir Git repository si olduğunu belirtmek için,projenizin en üst seviyesinde gizli bir .git klasörü oluşturur.

index.html adında boş bir dosya oluşturalım.

git init komutu yeni bir Git repository si oluşturur.Başlangıçta,her Git repository si boştur.İçeriğinizi yönetmek için dosyalarınızı repository de açıkça tutmanız gerekmektedir.

git add index.html

git add “filename” dosyayı eklemeye yarar.Eğer birçok klasör ve dosyalarınız varsa git add .. komutu ile tüm dosya ve klasörlerinizi ekleyebilirsiniz.
Add komutundan sonra git index.html dosyasının repository de kalacağını bilir.Ancak şu ana kadar git kalıcı bir taahhütten önce geçici bir aşamada hazırladı.Git değişkenliği,stability i sağlamak için add ve commit aşamalarını birbirinden ayırır.

Git status komutunu çalıştırarak repository mizin son durumunu görebiliriz.

Continue reading

Git Nasıl Ortaya Çıktı

Git,Linus Torvald tarafından the information manager from hell olarak adlandırılan bir araçtır.

Oluşumunun,Linux kerneli topluluğu içerisindeki tartışmalardan doğmasına rağmen,çıkan sonuç dünya genelinde yazılım geliştirmesini sağlayan iyi tasarlanmış bir sürüm kontrol sistemidir.(version control system)

Linux kerneli,git ten önce,şu anda mevcut olmayan RCS ve CVS (concurrent version system) gibi özgür yazılım VCS lerinde mevcut olmayan karmaşık işlemleri sağlayan ticari Bitkeeper VCS kullanılarak geliştirildi.Bitkeeper a sahip olan şirket free sürümüne kısıtlamalar koyduğunda Linux topluluğu Bitkeeper in artık uygulanabilir çözüm olmadığında karar verdi.

Continue reading

Adapter Pattern Nedir

Bu yazımda Adapter Pattern i açıklamaya çalışacağım.Decorator patternde,objelerimizi sarıp onlara yeni sorumluluklar veriyorduk.Amerika dan aldığımız laptop vs priz girişlerinin farklı olduğu dikkatinizi çekmiştir.Bu prizleri Türkiye de kullanabilmek için adaptör alırız.Bu gerçek yaşamdan kısacası bu örneği verebiliriz.Peki design pattern de kulanımı nasıl,bir interface i uygularlar ve client in beklediği duruma adapte ederler diyebiliriz.

Var olan bir uygulamanız var ve yeni bir kütüphanenin api sini vs kullanmak istiyorsunuz ama bu yeni kütüphanenin interface leri eski kütüphanelere nazaran farklı tanımlamış.

Burada adapter priz örneğinde olduğu gibi firmanın yazdığı kod ile kodunuzun arasına girip,firmanın interface lerini sizin beklediğiniz interface tanımlamalarına çeviriyor.

Continue reading