İnaloğulları, 1098-1183 tarihleri arasında Amid (Diyarbakır) ve çevresinde küçük bir bölgede hüküm süren Türk beyliğidir.
1092 yılında Büyük Selçuklu Sultanı Melikşah'ın ölümünden sonra bölgedeki Türkmen beylerini yenerek Amid şehrinin valisi olan Sadr tarafından kuruldu. Sadr'ın ölümünden sonra oğlu İnal bağımsızlığını ilan etti. Beylik böylece, İnaloğulları adını aldı. Ancak İnal'ın kısa bir süre sonra ölmesi üzerine beylik varlığını çevredeki büyük ve güçlü Türk beyliklerinin hakimiyeti altında devam ettirdi. İl-Aldı döneminde beylik tekrar bağımsızlığına kavuştu. İl-Aldı, Ahlatşahlar Beyliği ile savaşarak topraklarını genişletti. 1124 yılında da İsmaililerle savaştı. 1133 yılında Zengilerle yapılan savaşın İl-Aldı'nın yenilmesiyle sonuçlanmasına rağmen beylik varlığını devam ettirdi.
İl-Aldı'nın 1142 yılında ölmesinden sonra beylik, topraklarının çoğunu ele geçiren Artukluların hakimiyetini kabul etmek zorunda kaldı. Beyliğe, 9 Mayıs 1183 tarihinde Selahaddin Eyyûbî tarafından son verildi.

Sadr Bey - 1095-1096
İnal Bey - 1096-1098
İbrahim Bey - 1098-1110
Sadidevle İl-Aldı Bey - 1110-1142
Mahmud Bey - 1142-1183

Dilimleyici, bir nesnenin 3B modelini 3B yazıcının anlayabileceği katmanlara dönüştürür.
Birçok dilimleyici kolaylık özellikleri içerir. Yaygın bir örnek olarak yazıcı ve malzeme ön ayarları verilebilir. Bazı FFF dilimleyiciler, karmaşık geometri ve baskı güvenilirliğine yardımcı olan sıra dışı özellikler içerir.
SLA dilimleyiciler, FFF dilimleyicilerden farklı destek yapıları üretir.

Dolgu, baskının iç kısmındaki malzeme miktarını belirler.
3B dolgular ve derece derece değişen dolgular gibi çeşitli yaratıcı dolgu desenleri farklı amaçlar için kullanılabilir.

Birçok 3B yazıcı, çalışma talimatları için GCode kullanır. Ancak üretilen tüm GCode'lar aynı değildir.
GCode odaklı bir dizi yazılım paketi vardır. Bazı yazılımlar GCode'u analiz eder ve baskı hakkında yararlı bilgiler sağlar. GCode son işlemcileri baskı hızını ve kalitesini artırabilir. Düzlemsel olmayan GCode, 3B baskı sonuçlarını da iyileştirebilir.

Bazı dilimleyiciler değişken katman yüksekliğini destekler ve bu sayede yazıcının daha iyi kalite için ayrıntılı alanlarda baskıyı yavaşlatmasına, daha az ayrıntılı alanlarda ise baskıyı hızlandırmasına olanak tanır.

Bazı dilimleyiciler, kullanıcıların malzemeyi yarıda değiştirebilmeleri ya da baskının iç kısımlarına mıknatıs gibi şeyler ekleyebilmeleri için baskının duraklatılmasına olanak tanır.

FFF 3B yazıcılar genellikle belirli bir çaptaki teli kabul eder.
Bazı FFF 3B yazıcılar geri dönüştürülmüş malzemeyi kullanma kolaylığı sağlamak için topak kullanacak şekilde modifiye edilmiştir.

PLA yaygın bir 3B baskı malzemesidir. Ucuzdur ve kullanımı kolaydır, bu da onu yeni başlayanlar için başlangıç malzemesi ve daha ileri düzey kullanıcılar için genel malzeme olarak iyi bir seçim haline getirir.
PLA kullanan tipik bir FFF yazıcının, ABS kullanımına kıyasla daha az parçacık yayması gerekir.

ABS ucuz ve sağlamdır ancak iyi baskı yapabilmek için doğru ortama ihtiyaç duyar.
ABS kullanan tipik bir FFF yazıcının PLA kullanımına kıyasla daha fazla parçacık yayması gerekir. ABS baskı yapılırken havalandırma kullanılmalıdır.

HIPS, kullanım kolaylığı ve pahalı olmaması nedeniyle iyi bir başlangıç malzemesidir.

PETG baskıları, farklı kimyasal yapılarına rağmen dışarıdan ABS baskılarına benzer. PETG, ABS'den daha az değişkendir ve daha geniş bir baskı ortamı aralığında kararlıdır.
PETG doğrudan cam yatak üzerine basılamaz. Bant gibi bir ara malzeme kullanılması gerekir.

Naylon 3B baskıların esnek ve dayanıklı olduğu bilinmektedir.
Naylon aynı zamanda boyanarak farklı renklerde malzemeler elde edilebilir.
Naylon, değişken doğalı ve işlenmesi zor bir malzeme olabilir.

Esnek teller pahalıdır ve kullanımı da zordur, ancak baskılara benzersiz özellikler kazandırır ve hafifçe biçimsizleşmelerine olanak tanır. Bu teller sıkışabilir ve doğrudan tahrikli yazıcılarda en iyi şekilde kullanılır.

PVA suda çözünür, dolayısıyla PVA malzemesi suda erirken birincil plastiği sağlam bırakır. Destekler elle çıkarılmak yerine çözülebildiğinden, çift sıkmaçlı ya da çok malzemeli bir yazıcıda kullanıldığında destek malzemesi olarak idealdir.

Bileşik malzemeler, basılabilir bir malzemeyi normalde basılamayan bir malzemeyle birleştirerek, ona benzersiz özellikler ve aynı zamanda benzersiz zorluklar kazandırır.

Manyetik Demir PLA - Güçlü mıknatısları çekebilir ve paslanabilir.
İletken PLA - Baskılar elektriksel olarak iletkendir ve basit elektronikler için veya parçaların dokunmatik ekranları tetiklemesini sağlamak için küçük akımları taşıyabilir.

SLA yazıcılar tel yerine sıvı reçine kullanır.
Bu reçineler genellikle boya ile renklendirilebilir.

Egzotik malzemelere doğrudan baskı yapmaya yönelik 3B yazıcılar mevcuttur. 
Genellikle geleneksel bir malzemeden bir kalıp 3B yazdırmayı deneyip daha sonra bu kalıbı kullanarak son ürünü üretmek daha iyi bir fikirdir.
Özellikle 3B gıda baskısının kendine özgü zorlukları vardır, çünkü gıdanın mikrop bulaşmadan ve yenmesi güvenli bir şekilde basılması gerekir.

Yiyecek
Çikolata
Pizza Malzemeleri (Hamur, Sos ve Peynir)
Metal
Kumtaşı

Mümkünse FFF teller nem ve tozdan dolayı malzemenin kirlenmesini önlemek için kuru bir kutuda saklanmalıdır. Eğer bu mümkün olmuyorsa, tel beslemesinde toz filtresi de kullanılabilir.

Standart 3B yazılımları kullanarak 3B baskı için sıfırdan bir 3B model tasarlamak mümkündür.

Fotogrametri gibi teknikler kullanılarak 3B tarama, gerçek dünyadaki nesnelerin kopyalanmasında kullanılabilir.

3B tarama ile oluşturulanlar gibi bazı modellerin, yazdırılmadan önce temizlenmesi gerekir.
Bilgisayardaki 3B modeller gerçekte yeniden oluşturulması imkansız olan şeyleri temsil edebilir. Bu nedenle bir modelin 3B yazdırılabilir olması için, gerçek bir nesneyi temsil etmesi gerekir, bir nesnede hatalar olmadan, modelin iç kısmının su geçirmez olmamasına neden olur.

.stl birçok 3B yazıcı dilimleme programı için fiili bir standart haline gelmiştir.

3MF, .stl formatına göre hataya daha dayanıklı olması ve renk bilgisi içermesi gibi bir dizi iyileştirme sunan açık kaynaklı bir formattır.

Çağdaş 3B Baskı, 1982 yılında Dr. Hideo Kodama tarafından tasarlandı.
Charles Hull 1984 yılında stereolitografiyi icat etti. Scott Crump, 1989 yılında FDM (FFF) baskıyı icat etti.
2004 yılında başlayan açık kaynak RepRap (Replicating Rapid Prototyper, hızlı ön modelleyiciyi çoğaltma) projesi, önceki ürünlerden daha uygun fiyatlı bir dizi benzer ticari yazıcının üretilmesiyle sonuçlandı.

Makerbot tarafından sunulan o zamanki ucuz ve açık kaynaklı 3B yazıcılar, 2010 yılı civarında halkın ilgisini çekti. Makerbot 2012 yılında donanımların açık kaynaklı üretimini durdurdu ve kısa süre sonra Stratasys tarafından satın alındı; şirket 2016 yılında da kendi yazıcılarının üretimini durdurdu.
3B yazıcı pazarı 2015 yılında bir miktar daraldı. Bu dönemde bütçe dostu Creality yazıcılar popülerlik kazandı.
2010'larda hem LulzBot hem de Prusa, ticari 3B yazıcıları için parçalar üretmek amacıyla kendi ticari ölçekli yazıcı çiftliklerini işletiyordu.
2020 yılında COVID-19 salgını sırasında üreticiler, tedarik hatları kesintiye uğradığında milyonlarca kişisel koruyucu donanım parçası üretmek için 3B yazıcılar gibi araçlar kullandılar.

Prototip oluştururken, kağıt üzerinde veya bilgisayar modellerinde hemen net görülemeyen bir çalışmanın yönlerini tespit etmek için hızlı ve elle tutulur geri bildirimler almak büyük önem taşır.

Sadece bir veya birkaç ürün üretildiğinde, 3B baskının doğasında var olan verimsizlikler çok daha az önem taşır, özellikle de 3B yazdırılmış malzemelerin özellikleri yeterliyse ya da üretime başlamak için gereken zaman sınırlıysa (modelin hazır olduğu varsayılarak sadece birkaç saat ya da gün sürer).

Görme engelliler için sanat eserleri ya da haritalar gibi görsel ortamın dokunmalı sürümlerini oluşturmak için 3B baskı kullanılabilir.

Acil bir durumda tedarik zincirleri kesintiye uğradığında, yerel 3B yazıcı sahipleri düşük miktarlarda hayati önem taşıyan malzeme ve parça üretebilir ve bu sayede sürekli, çok küçük olsa bile, yeni malzeme akışı sağlanırken lojistik zorluklar giderilir. Bu senaryo, COVID-19 salgınının ilk günlerinde, 3B yazıcı kullanıcılarının hastane personeli için KKD ve vantilatör parçaları ürettiğinde görüldü. Aynı zamanda bazı afet hazırlık stratejilerinde başvurulan bir stratejidir.

FFF yazıcılar, bir sıkmaçtan gelen malzemeyi eriterek 3 boyutlu bir nesne üreterek çalışır.
FFF yazıcılar, işletim için kısmen daha az güvenlik ekipmanı gerektirmesi nedeniyle, diğer baskı teknolojilerine göre kullanımı daha kolay olmalarıyla bilinmektedir. Kartezyen FFF 3B yazıcılar, bir sıkmacın X, Y ve Z eksenleri boyunca hareket ettirilmesiyle çalışır.
Stratasys 3B yazıcılarda aynı teknik için FDM ismi kullanılmaktadır.

SLA yazıcılar özel bir sıvıyı katılaştırmak için ışık kullanır.
FFF yazıcıların aksine, SLA yazıcıların oluşturma süresi baskı sayısına veya nesne karmaşıklığına değil yüksekliğe dayanır, bu nedenle x ve y oluşturma alanının tamamı yazdırma süresi üzerinde hiçbir etki olmaksızın yazdırma için kullanılabilir. FFF yazıcıların aksine, SLA yazıcılar genellikle ters yazdırır, ancak bunun nihai baskı üzerinde elle tutulur bir etkisi yoktur. SLA yazıcıların çalıştırılması zor olabilir.

SLS, 3B nesneler oluşturmak için tozları bir lazerle birleştirerek çalışır.
Özel olarak, SLS yazıcılar karmaşık geometriler için özel destek yapılarına ihtiyaç duymaz.

Haberlerde 3B yazıcıların matbaalar, arabalar veya insan organları gibi inanılmaz şeyler yapabileceğini okumuş olabilirsiniz. Bunlar mümkün olsa da, hem 3B yazıcının kullandığı teknolojiye hem de operatörün becerisine bağlıdır. 2020 itibarıyla çoğu tüketici 3B yazıcısı, son teknolojide çeyrek metreküpe kadar yüksek kaliteli plastikler yazdırmada zirveye ulaşmıştır.
Bununla birlikte, bir 3B yazıcıda yazdırmayı daha kolay, daha hızlı ve daha keyifli hale getirebilecek bir dizi etken vardır. Dahası, yavaş ama istikrarlı bir şekilde ilerleme kaydeden bir teknoloji olarak, yazıcıların yetenekleri zamanla gelişmeye devam etmektedir. Birçok yazıcının açık yapısıyla, alanda derin bir anlayışa sahip olanlar yazıcıları beklenen yeteneklerinin ötesine taşıyabilir ve üstün sonuçlar elde edebilir.

Isıtılmış bir muhafaza, belirli malzemelerin basılmasına yardımcı olabilir.

Muhafazalı 3B yazıcılar genellikle operatörün maruz kaldığı parçacık miktarını azaltır. Muhafazalar ayrıca hareketli ya da sıcak parçalarla yanlışlıkla temas olasılığını azaltmaya yardımcı olur.

3B yazıcılar, dahili yazıcı işlemini hassas bir şekilde kontrol etmek için yerleşik bir bilgisayar kullanır. Bilgisayarı içeren kart, yazıcının bir ağa bağlanma yeteneği, genişletme başlıkları ve yazıcıda hangi aygıt yazılımının çalıştırılabileceği gibi şeyleri belirleyecektir.
3B yazıcı mikrodenetleyicileri genellikle ya basit ve güvenilir 8-bitlik mikrodenetleyiciler ya da daha yetenekli ve karmaşık 32-bitliktir. 
Özelliklerini artıran bir yazılımla birlikte kullanılan daha yetenekli bir denetleyici, 3B yazıcının daha fazla görevi bir ana bilgisayardan bağımsız olarak gerçekleştirmesini sağlayabilir ve ayrıca daha yüksek baskı kalitesi elde ederken 3B yazıcıyı daha hızlı çalıştırabilir.

Birçok 3B yazıcı kontrol kartında dahili sürücüler bulunurken, bazıları harici sürücüler kullanır. Yüksek kaliteli sürücüler, motor çalışmasını daha verimli hale getirebilir ve böylece yazıcı gürültüsünü azaltabilir.

Çoğu 3B yazıcı, parçaları hassas bir şekilde hareket ettirebilmek için tekleyerek çalışan motorları kullanır.
Nadiren, özel 3B yazıcılarda kontrol sistemlerine geri bildirim sağlamak amacıyla servo motorlar kullanılır. Ancak yüksek maliyetleri, artan karmaşıklıkları ve azalan güvenilirlikleri, tekleyerek çalışan motorlarının çoğu 3B yazıcıda tercih edilmesini sağlar.

Kullanılan ağızlık baskı çözünürlüğünü etkiler.
Bazı ağızlıklar dayanıklılıklarını artırmak için yakut gibi egzotik malzemelerden yapılır.

Manyetik plakalar, esnek yataklar ve yatak kaplamaları bunların basılmasını kolaylaştırabilir, ancak bunların iyi çalışmasını sağlamak için özel bakıma da ihtiyaç duyarlar.

Bazı 3B yazıcılar, baskı öncesinde baskı yatağını yoklayıp otomatik olarak düzeyini ayarlayabilir. Bu, kurulumu daha basit ve çok daha az sıkıcı hale getirir.

Isıtılmış yatak, ısıtılmamış yatakta baskı yaparken sıkça karşılaşılan bir sorun olan parça eğilmesini azaltmak için kullanışlıdır.

Tel sensörleri, yazıcının sıkışmaları, boş tel makaralarını ve diğer kalite kontrol özelliklerini algılamak için kullanılır.

Özel bir yazılımla kullanıldığında, bir kamera baskıların zaman aralıklı görüntülerini oluşturabilir.

ASP.NET sunucu taraflı bir web programlama teknolojisidir. Aslında ASP.NET tam anlamıyla bir dil değil, interaktif web siteleri oluşturabilmek amacıyla farklı dillerin kullanılabilmesini sağlayan bir teknolojidir. ASP'den türemiş gibi gözükse de aslında ASP'yle arasında dağlar kadar fark vardır. ASP.NET, .Net altyapısını kullanır. Dolayısıyla ASP.NET ile .Net Framework kütüphanesini kullanabiliriz. ASP.NET ile web siteleri hazırlamak için Visual Web Developer yazılımını kullanabilirsiniz. ASP.NET teknolojisi ile web siteleri oluşturabilmek için C# ya da Visual Basic.NET dillerinden birini biliyor olmamız gerekir. Bu kitapta C# kullanılmıştır.
ASP.NET dosyalarının uzantısı aspx'tir. Bu dosya sunucudan istendiğinde IIS devreye girer. IIS, aspx dosyasının içinde .NET kodları gördüğünde bu kodları işlemesi için .NET Framework'a gönderir. .NET Framework, .NET kodlarını işler ve kodların cevabını metin olarak IIS'e gönderir. Son olarak IIS, .NET Framework'un cevaplarını ve sayfa içinde gömülü HTML kodlarını birleştirerek istemciye gönderir. Son tahlilde IIS'in istemciye gönderdiği kod sadece istemci taraflı dillerin (HTML, CSS, JavaScript) kodlarıdır.

ASP.NET ile değişik şekillerde web sayfaları oluşturabiliriz:

.NET kodlarıyla HTML kodlarını aynı dosyada (aspx) tutabiliriz.
.NET kodlarını ayrı bir cs dosyasında, HTML kodlarını aspx dosyasında tutar; aspx dosyasına ilgili cs dosyasını kullanacağımızı belirten bildirim ekleriz.
.NET kodlarını derlenmiş hâlde bir DLL dosyasında tutar, aspx dosyasından (gerekli bildirimi ekleyerek) bu DLL dosyasındaki bir sınıfı kullanabiliriz.
Şimdi isterseniz bu yöntemleri teker teker görelim.

Aşağıdaki kodu inceleyiniz:

En başında, bu sayfanın içinde sunucu tarafında çalıştırılacak dinamik kodlar olduğunu ve bu kodların C#'la yazıldığını belirten bildirimi ekliyoruz. Sonra klasik HTML kodlarımızı yazıyoruz. Kodun içinde geriye string bir değer döndüren .NET kodlarını <%= ve %> arasına alıyoruz. Bu .NET kodunun döndürdüğü değer IIS tarafından istemciye salt metin olarak gönderilecektir.

Cs dosyasının içeriği

Bu dosyaya program.cs adını verip web sunucu klasörümüze koyalım. Sınıfı public olarak belirtmeliyiz. Çünkü bu sınıfa bu dosyanın dışından erişeceğiz. Şimdi aspx dosyamızı yazalım:

Bu web sayfası ekrana 56 yazacaktır. Gördüğünüz gibi aspx dosyasında .NET kodu çalıştıracağımız yerleri <script> etiketiyle çevreliyoruz. Page_Load() metodu sayfa açıldığında çağrılacak özel metodumuz. Metoda başka bir isim verirsek veya parametreler değişik olursa sayfa açıldığında çağrılmaz.

Şimdi aspx dosyasını şöyle yazın:

Aspx dosyamız bu şekilde. Önceki yazdığımız cs dosyasında değişiklik yapmadan .NET Framework'un csc.exe derleyicisiyle DLL olarak derleyip web sunucumuzun bin klasörüne kopyalıyoruz.

Normalde sayfadaki HTML kontrolleri ASP.NET için salt metindir. Bu yüzden onlara varsayılan durumda erişemeyiz. Bu kontrollere erişebilmek için ek kodlama yapmalıyız. Aşağıdaki kodu inceleyiniz:

Koddan da görebileceğiniz üzere ASP.NET'le HTML kontrollerine erişebilmek için

Bütün kontrollerin <form> etiketi içinde olması lazım.
form etiketine runat="server" seçeneği eklenmiş olması lazım.
Her form kontrolüne id="id" ve runat="server" seçenekleri eklenmiş olması lazım. Bu kontrollere ASP.NET'ten bu id aracılığıyla erişeceğiz.
Örnek bir ASP.NET programı:

Bu programla, kullanıcı birinci metin kutusuna adını yazıp butona bastığında ikinci metin kutusuna o ada hitaben karşılama metni yazılacaktır.

MSSQL veri tabanları için:

SqlConnection con=new SqlConnection("Data Source=bilgisayar;Initial Catalog=veritabani;Integrated Security=True");

MS Access için:

OleDbConnection con=new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=dosya.mdb");

Connection nesnesi oluşturduktan sonra yapmamız gereken, veri tabanına bağlantılı şekilde mi yoksa bağlantısız şekilde mi bağlanacağımızı belirlemektir.

Bu bağlantı türünde veri tabanıyla ilgili işlem yaparken veri tabanına sürekli bağlı olmamız gerekir.
MSSQL veri tabanları için:

con.Open();
SqlCommand cmd=new SqlCommand("select * from tablo",con);

MS Access için:

con.Open();
OleDbCommand cmd=new OleDbCommand("select * from tablo",con);

Bu adımdan sonra gerek MSSQL gerekse de Access için yapılacak işlem aynıdır. Aşağıdaki satırlardan biriyle SQL cümlesi çalıştırılır.

cmd.ExecuteNonQuery(); //Geriye herhangi bir şey döndürmeyen SQL cümleleri için. Geriye int tipinde etkilenen kayıt sayısı döndürülür.
cmd.ExecuteScalar(); //Geriye tek bir değer döndüren SQL cümleleri için. (Object tipinde döndürülür.)
cmd.ExecuteReader(); //Geriye bir tablo döndüren SQL cümleleri için. Veri tabanının tipine göre geriye ya SqlDataReader ya 
                     //ya da OleDbDataReader nesnesi döndürür.

Bu sınıflar SqlCommand veya OleDbCommand sınıfının ExcuteReader() metodu ile oluşan nesneleri temsil ederler. Yani bu sınıflar bir tablo temsil ederler. Tablodaki satırlar arasında dolaşmak için OleDbDataReader veya SqlDataReader sınıflarına ait olan static olmayan Read() metodu kullanılır. Her Read() metodu aktif kaydı bir birim öteler ve true döndürür. Eğer aktif kayıt ötelenemiyorsa geriye false döndürür.

OleDbDataReader rdr=cmd.ExecuteReader();
while(rdr.Read())
   Label1.Text=rdr[0]+" - "+Label1.Text;
con.Close();

Bağlantısız veri tabanında veri tabanındaki veriler bir kere çekilir. İşlemler bu çekilmiş veriler üzerinde yapılır. En sonda değiştirilmiş veriler tekrar veri tabanına yazılır. Bağlantısız yöntemde veriler çekildikten sonra veri tabanıyla bağlantının kopması programın işleyişine engel değildir. Veri tabanı türüne göre önce bir DataAdapter nesnesi oluşturmalıyız:

OleDbDataAdapter adp=new OleDbdataAdapter("select * from tablo",con);
//veya
SqlDataAdapter adp=new SqlDataAdapter("select * from tablo",con);

Daha sonra bir GridView DataAdapter'daki verilerle doldurulabilir:

DataSet ds=new DataSet();
adp.Fill(ds);
GridView1.DataSource=ds.Tables[0];
GridView1.DataBind();

Stored prosedürler Access'te desteklenmez. Stored prosedürleri kullanabilmemiz için yalnızca MSSQL gibi bir veri tabanı gereklidir.

create procedure isim @degisken1 nvarchar(10), @degisken2 nvarchar(10)
as
begin
   select * from tablo
end
go

SqlCommand cmd=new SqlCommand("exec isim 'değer1', 'değer2'",con);
SqlDataAdapter adp=new SqlDataAdapter(cmd);
//Geri kalan kısım tahmin ettiğiniz gibi

-- ekleme
sqlcommand cmd... satırından sonra
cmd.CommandType=CommandType.StoredProcedure;  // eklenmesi gerekir ki daha sonra procedür bir parametre istiyorsa 
cmd.parameters.AddWithValue("@parametretanımı",--parametenin alınacağı/uygulanacağı yer--)

Response.Redirect("dosya.htm");

Başka bir dosyadan aspx dosyamıza http://.../default.aspx?ad=bekir&soyad=oflaz şeklinde bir link verildiğinde aspx dosyamıza koyacağımız aşağıdaki satırla bu URL'deki verileri alabiliriz.

Label.Text=Request.QueryString["adi"].ToString();

Bu satır sonucunda Label'ın Text'i bekir olacaktır.

Bunun için sayfamıza bir FileUpload nesnesi getiriririz ve aşağıdaki kodu yazarız.

if(FileUpload1.HasFile) //Kullanıcının bir dosya upload etmek için halihazırda bir dosya seçip seçmediği kontrol ediliyor.
   FileUpload1.SaveAs(Server.MapPath(FileUpload1.FileName)); //Burada dosya, aspx dosyamızın bulunduğu klasöre orijinal
                                                             //adıyla kaydediliyor.

[WebMethod]
public int topla(int a,int b)
{
   return a+b;
}

ASP.NET Core 5'te bir action'ın geri dönüş tipi aşağıdakilerden biri olabilir:

ViewResult
PartialViewResult
JsonResult
EmptyResult
ContentResult
ViewComponentResult
ActionResult
IActionResult

Bir view dosyasını render etmemizi sağlar. Bir action'ın bir view'ı render etmesi için Controller sınıfından devralınan View() metodunu çağırması yeterlidir.

Bir partial view'ı döndürmeye yarar. Partial view'lar client tabanlı yapılan Ajax istekleri ile kullanıma yatkındır. Çünkü normal view'lar _ViewStart.cshtml tabanlıdır. Her normal view render edileceğinde bu view da render edilir. Halbuki partial view'larda böyle bir durum söz konusu değildir. Bir action metodunun geriye PartialViewResult döndürmesi için Controller sınıfından devralınan PartialView() metodunun çağrılması yeterlidir.

Geriye Json türünde bir veri göndermek istiyorsak kullanılır. Bir JsonResult nesnesi oluşturmak için Controller sınıfından devralınan Json() metodunu kullanırız. Bu metoda herhangi bir tipte nesneyi parametre olarak verebiliriz. Metot, ilgili nesnein Json karşılığını üretecektir.

Geriye boş sonuç döndürür. İsteğin başarılı bir şekilde alındığını ve gerekenin yapıldığını ama geriye veri döndürmeye gerek olmadığını belirtir. Geri dönüş tipi EmptyResult olan metotların new EmptyResult() ile boş sonuç nesnesi oluşturup geriye bu nesneyi döndürmeleri gerekmektedir. Ana sınıftan devralınan bir metot yoktur. Geri dönüş tipi void olan action metotları da aynı işlevi görür.

İstek sonucunda geriye HTML değil de metinsel bir veri döndürmek istiyorsak bu geri dönüş tipi kullanılır. Ana sınıftan devralınan Content() metodu kullanılır. Bu metot parametre olarak string alır.

Geriye bir ViewComponent döndürmemizi sağlar.

Geriye döndürülecek sonuç belli olmadığında kullanılır. Yukarıda gördüğümüz bütün sonuç türlerini kapsar.

ActionResult tarafından implement edilmiş olan arayüzdür. Dolayısıyla bir action'ın geri dönüş tipi IActionReasult ise yukarıda bahsettiğimiz bütün geri dönüş tiplerinde nesne döndürebilir.

Bir ASP.NET Core 5 boş şablonunu MVC'ye çevirmek için;
1) Startup.cs dosyasındaki ConfigureServices metoduna aşağıdaki satırı ekleyin:

2) Startup.cs dosyasındaki Configure metodunun içindeki

kodlarını silin ve bunların yerine:

yazın.
3) Proje klasörüne Controllers, Models ve Views klasörlerini ekleyin. Views klasöründe her controller için ayrı bir alt klasör oluşturun.

Bir action metodu direkt View() metodunu çalıştırırsa Views klasöründeki ilgili controller'a karşılık gelen klasördeki ilgili action'a karşılık gelen view döndürülür. Farklı bir klasördeki ve/veya farklı bir isimdeki view'ı döndürmek için;

View() metoduna parametre olarak view ismi verilir (eğer view, çalışması gereken normal view'la aynı klasördeyse),
Yolla beraber view ismi verilir (eğer view, çalışması gereken normal view'la aynı klasörde değilse). Yol belirtimi mutlak ve göreli olarak iki şekilde yapılır. Göreli yol gösterimi:
../Product/Index

Çalışması gereken normal view'ın bulunduğu klasörün bir üst klasöründeki Product klasöründeki Index view'ını döndürür.

/Views/Product/Index.cshtml

Mutlak yol gösterimi. Mutlak yol gösteriminde view'ın uzantısının belirtilmesi zorunludur.

ASP.NET Core'da HtmlHelper'ların yerini TagHelper'lar almıştır. Ancak yine de tamlık açısından HtmlHelper'lar da verilecektir.

Bir view içinde başka bir view'ı render etmemizi sağlar. Örnek:

Burada Index2 view'ının içeriği şu anda bulunulan view'a arkaplanı gri olarak basılacaktır. Burada aklınıza bir soru takılabilir. Eğer Index2.cshtml view'ı dışarıdan veri kabul ediyorsa bu veriyi nasıl göndereceğiz. Cevap: ana view'ın controller'ından. Yani A view'ı içine bir B view'ını gömerse A'nın controller'ından A view'ına gönderilen veriler (model bazlı ve diğer veriler) otomatik olarak B view'ına da gönderilir. Bu A view'ını oluşturan diğer bütün alt view'lar için de geçerlidir. Alt view model bazlı veri alacaksa bunun alt view'ın başlığında @Model IsimAlani.Sinif şeklinde belirtilmesi opsiyoneldir, ancak kafa karışıklığının önlenmesi açısından belirtilmesi tavsiye edilir.
İstersek yukarıda bahsedilen varsayılan durumu değiştirebiliriz. Yani alt view'a, ana view'a gönderilen verilerden başka veriler gönderilmesini sağlayabiliriz.Örnek:

Burada ana view'a gelen nesne yerine bir User nesnesi alt view'a gönderilmektedir. Bu durumda alt view'ın @model deklarasyonuyla ilgili tipte nesne kabul ettiğini belirtmesi gerekir. Elbetteki bu durumda model yoluyla ana view'a gönderilen nesne alt view'a gönderilmez.
Partial metoduna ikinci parametreyi vererek aynı model bazlı verinin alt view'a gönderilmesinin engellenmesi diğer yollarla (ViewBag, ViewData, TempData) gönderilen verilerin gönderilmesini engellemez.

İşlevsel olarak Partial metoduyla aynıdır. Ancak RenderPartial() metodunun mutlaka bir C# kod bloğu içinde (küme parantezleriyle çevrelenen) çağrılması gerekir. Çünkü Partial() metodu string döndürürken, RenderPartial() void döndürür. Ayrıca RenderPartial() metodu, Partial() metoduna göre daha hızlı çalışmaktadır. Örnek:

URL oluşturur ve linki oluşturmak için oluşturulan HTML kodunu döndürür. Örnek:

Bu örnekte sayfanın ilgili yerinde "Tıkla" metinli bir link belirecek ve bu linke tıklandığından Home controller'ının Index action'ına talep yapılacaktır.

HtmlHelper'lara istersek seçenekler ve bu seçenekler için değerler belirtebiliriz. Örnek:

@Html.TextBox("txtAdi",null,new {style="background:yellow; color:red})

İstersek de belirli bir HTML kodunu döndürecek sözde bir HTML etiketi oluşturabiliriz.

Razor, HTML ve C# kodlarının nasıl birbirinin içine geçebileceğini düzenleyen bir teknolojidir. ASP.NET Core'da view dosyalarının oluşturulmasında kullanılır.

Razor @* ve *@ arasına yazılmış her şeyi yorum sayar.

@{ ve } arasına isteğimiz gibi C# kodları yazabiliriz. Örnek:

Farklı kod bölgelerindeki kodlar tek bir dosyada sayılır. Dolayısıyla daha önce farklı bir kod bölgesinde tanımlanmış değişkenlere erişebiliriz. Örnek:

HTML içinde C# kullanımını zaten az önce gördük. Şimdi C# içinde HTML kullanımına sıra geldi. C# içinde HTML kullanabiliriz. Bunu ilgili yerde sayfaya çıktı vermek amacıyla kullanırız. Razor, C# kodu içinde HTML etiketleri içine alınmış bir metin gördüğünde bunu sayfaya basar. Örnek:

Eğer sayfaya HTML kodu çıktısı vermek istemiyorsak, ilgili yere salt metin çıktısı vermek istiyorsak ilgili metni <text> ve </text> etiketleri arasına alırız:

İlgili yerde tek satırlık C# kodu yazacaksak ve bu kodun sonucu ekrana çıktı olarak verilecekse bunun için küme parantezli notasyonu kullanmaya gerek yoktur. Örnek:

Ayrıca bu tür durumlarda C# kodunu noktalı virgül ile de sonlandırmayız.

İlgili yerde boşluk içermeyen tek satırlık C# kodu yazacaksak ve bu kodun sonucu ekrana çıktı olarak verilecekse normal parantezli notasyonu da kullanmayız. Yalnızca C# ifadesinin başına @ koyarız. Örnek:

Yine burada da komutu noktalı virgül ile sonlandırmayız.

Koşullar ve döngüler zaten kendisi kod bloğu oluşturduğu için ayrıca kod bloğu oluşturmaya gerek kalmadan koşullar ve döngüleri kullabilmektedyiz. Örnek:

Bildiğiniz üzere C# programlama dilinde koşul yapıları ve döngüler tek komut içeriyorsa bunları küme parantezleri içine almaya gerek yoktur. Ancak eğer yukarıdaki örnekteki gibi küme paraztezleri C# kodu değil de HTML kodu içeriyorsa bunları küme parantezleri içine almak zorundayız.

Bu tür karmaşık durumlar çok olasıdır. Zaten Razor'un gücü buradan gelmektedir. Örnek:

Burada önemli olan nokta for döngüsünün içindeki <text> etiketinin içinde C# kullanabilmek için @ sembolünü kullanmamız gerektiğidir. Çünkü bir içeriği herhangi bir HTML etiketiyle veya <text> etiketiyle sarmaladığımız zaman artık orası HTML olmuştur. Tekrar C#'a dönmek için @ sembolünü kullanmalıyız

Verilen controller ve action'a ait URL'i oluşturur. Örnek:

Yukarıdaki url değişkeninin tuttuğu değer /Home/Index/5 olacaktır. Yani üretilen URL domain'i içermemektedir. Ayrıca controller ve action dışındaki parametreler anonim tip nesnesi üretimi yoluyla verilmektedir. Üretilen URL Startup.cs dosyasındaki rota tanımlamasıyla uyumlu olacaktır.

Kullanımı Action() metoduyla aynıdır. Tek farkı tam URL'yi üretmesidir. Örnek:

Benim bilgisayarımda burada üretilen URL http://localhost:5000/Home/Index/5 olmaktadır. Kuşkusuz projenizi bir sunucuya yüklediğinizde gerçek URL üretilecektir.

Aktif olan talep için belirli bir rota şablonuna uygun URL oluşturur. Örnek:

Örneğin bu talep Home controller'ının içindeki Index action'ını tetiklemişse ve ekstra olarak id için 5 parametresi verilmişse üretilen URL /Home/Index/5 olacaktır. Diğer metotlar belirtiğimiz URL'i döndürürken bu metot aktif URL'le işlem yapar.

Aktif URL'e ait bilgi alabildiğimiz özelliktir. Örnek:

Url.ActionContext.RouteData.Values bir sözlük döndürür. Bu sözlüğün her bir ögesi bir KeyValuePair'dır. İstersek foreach döngüsü ile bu sözlük üzerinde dönerek her bir anahtar-değer çiftini ayrı ayrı da elde edebiliriz. Kuşkusuz bir URL'deki parametreleri her zaman ezbere bilemeyebiliriz. Bütün parametrelerin parametre ismiyle birlikte bir anahtar-değer çifti kümesinde tutulması, istediğimiz zaman bu kümedeki tek bir parametreyi almak işimizi çok kolaylaştırcaktır. İstersek bir parametrenin URL'de olup olmadığını şöyle anlayabiliriz:

View'lar web uygulamalarının kullanıcıya görünen yüzüdür. ASP.NET Core'da view'lar Views klasöründe ve her controller için ayrı klasör olacak şekilde tutulur. Normal şartlar altında her action'a bir view karşılık gelir. View dosyalarının uzantısı cshtml'dir. Bir view dosyası esasında C# kodu içerebilen bir HTML dosyasıdır. İlgili view render edildiğinde view'ın içindeki C# kodları sunucu tarafında çalıştırılır ve kullanıcıya salt HTML gönderilir. View'ın içindeki C# kodları çoğunlukla controller'dan gelen verinin sayfada uygun yere yerleştirilmesi amacıyla kullanılır. View dosyalarında HTML ile C# kodları bir arada aşağıdaki gibi kullanılır:

Buradaki C# kodunun pek bir işlevselliği yoktur. Yalnızca HTML içinde C# kodunun çalışabildiğini göstermek için kullanılmıştır. Eğer algoritmik pek bir şey yapmayacaksak, sadece bir değişkenin değerini sayfada ilgili yere yazdıracaksak küme parantezleri açmadan ilgili değişkene @ ön ekini ekleyerek kullanabiliriz. Bu durumda komutun sonlandığını göstermek amacıyla noktalı virgül kullanmayız:

Aşağıdaki kodda ise C# kodunun içinde HTML kullanılmıştır:

Bu kod 0'dan 4'e kadar olan sayıları, her sayı bir liste ögesi olacak şekilde ekrana basmaktadır. Razor sentaksı çok çetrefilli olabilmektedir. Şimdilik bu konuyu burada bırakalım. İleride Razor sentaksına geri döneceğiz. Şimdilik controller'dan view'a nasıl veri taşıyabileceğimize bakalım.

Controller'dan view'a model bazlı, ViewBag ile, ViewData ile ve TempData ile veri taşınabilmektedir.

Controller'dan view'a model bazlı veri taşıma şöyle yapılır:

Burada öncelikle ilk satırda hangi tipte verinin taşınacağı belirtilmiştir. Burada ilgili view dosyasının bir ürün listesi alacağını belirttik. Şimdilik Urun sınıfını isim alanlarıyla belirtmek zorundayız. C# kodunda ise her bir ürünün adını ekrana bastık. C# kodunda modele Model anahtar sözcüğü ile eriştik.
Controller tarafında ise view'a veriyi şöyle gönderdik:

Yani sadece ilgili View() metoduna modeli parametre verdik.

ViewBag türü dynamic olan bir değişkendir. Dolayısıyla ViewBag'e istediğimiz üye eleman varmış gibi davranabiliriz. View tarafında eğer controller tarafında ViewBag'e eklemlendirilen alanı kullanırsak veriyi de elde etmiş oluruz. Örnek (controller tarafında):

View tarafında:

ViewData yöntemi ViewBag yöntemine benzer. Ancak ViewBag yönteminden farklı olarak sözlük formatındaki bir yapıyla veriyi taşır. Örnek (controller tarafında):

View tarafında:

ViewData ile veri taşımaya çok benzer. Veri yine sözlük formatında taşınır. ViewData ile arasındaki fark ise veriyi cookie'lerle taşımasıdır. Bunun faydası ise bir action direkt view'ını döndürmek yerine akışı başka bir action'a yönlendirdiğinde ortaya çıkar. Diğer veri taşıma yöntemlerinde akış başka bir action'a geçtiğinde gönderilen veriler kaybolur. Halbuki TempData verileri tutmaya devam eder. Örnek (controller tarafı):

View tarafı (Index2'nin view'ı):

TempData'nın diğer veri taşıma yöntemlerine kıyasla zayıf tarafı ise sadece string gibi basit tipleri taşıyabilmesidir. Halbuki model, ViewData ve ViewBag yöntemleriyle karmaşık tipte veriler de taşıyabiliriz.

Karmaşık veriyi TempData ile taşıyabilmemiz için serileştirmemiz gerekmektedir (controller tarafı):

Burada Index2 kendi view'ına veriyi ViewBag ile göndermektedir. TempData sayesinde iki action arasında verinin kaybolması önlenmiştir. Bundan sonrası ViewBag ile veri taşıma olduğu için view tarafındaki kodlar gösterilmemiştir.

Diğer veri taşıma yöntemlerine kıyasla model bazlı veri taşıma yöntemi en avantajlısıdır. Çünkü model bazlı veri taşıma iki taraflı olması için tasarlanmıştır. Yani model bazlı veri taşıma ile hem controller'dan view'a, hem de view'dan controller'a veri taşıyabiliriz. Diğer veri taşıma yöntemleri ise yalnızca controller'dan view'a veri taşımak için tasarlanmıştır. Nasıl view'dan controller'a veri taşıyabileceğimiz, diğer bir deyişle nasıl kullanıcıdan veri alabileceğimiz sonraki bölümlerde açıklanacaktır.

Controller'dan view'a Tuple nesnesi gönderilebilir. Tuple'lar birden fazla nesne tutabilen sınıflardır. Ayrıca C# programlama dili Tuple'lar için özel sektaksa sahiptir. Controller'dan view'a Tuple gönderme (controller tarafı):

View tarafı:

Bu örnekte Tuple'ın bileşenleri isimsizdir. Bu durumda Tuple bileşenlerine Item1, Item2, ... diğerek erişebiliriz. İstersek Tuple bileşenlerine isim de verebiliriz:

Middleware'ler ve Request Pipeline
Endpoint'ler ve Routing Mekanizması
Servisler ve Dependency Injection
Yapılandırma Ayarlarının Kullanımı
Loglama Servisinin Kullanımı
Statik İçeriğin ve İstemci Taraflı Kütüphanelerin Kullanımı
Cookie'ler
Oturum Yönetimi
HTTPS Bağlantılarla Çalışma
İstisna ve Hata Yönetimi
İstekleri Başlığına Göre Filtreleme
Cache'leme
Entity Framework Core Kullanımı
Web Servisleri
Örnek Projemiz
Minimal API'yi Kullanarak Web Servis Oluşturma
Controller Kullanarak Web Servis Oluşturma
Web Servislerini Geliştirme
İlişkili Veriyle Çalışma
HTTP Patch Metodu Desteği
İçerik Biçimlendirme
Web Servislerini Belgeleme ve Araştırma
MVC
Razor Sentaksı
Controller'dan View'a Veri Taşıma
Layout'lar
Partial View'lar
İçerik Biçimlendirme
Razor Sayfaları
Rotalama
Razor Sayfasının Kod Kısmı
Razor Sayfasının Görünüm Kısmı
View Component'lar
Tag Helper'lar
Kendi Tag Helper Sınıflarımızı Yazma
Dahili Tag Helper'lar
Form Tag Helper'ları
Model Binding
Doğrulama
Filtreler

Cache'lemek programlama dünyasında yaygın kullanılan bir şeydir. Üretilmesi maliyetli olan verilere sık erişim gerekiyorsa cache'lenmesi mantıklıdır. Bu sayede aynı verinin tekrar istenmesi durumunda en baştan tekrar üretilmesi yerine cache'lenmiş veri direkt sunulur. Üretilmesi maliyetli veri uygulamadan uygulamaya değişebilir. Bu derste 1'den belirli bir sayıya kadar olan sayıların toplamını maliyetli veri sayacağız. Şimdi Projemize Toplam.cs isimli bir sınıf ekleyelim ve içeriği şöyle olsun:

Şimdi bu endpoint'i rota yapılandırmasına ekleyelim (Program.cs dosyası):

Programımız /sum/<sayi> path'ına gelen isteklere Toplam endpoint'i ile karşılık vermektedir. Path'ın ikinci segmenti int'e dönüştürübilen bir metin olmalıdır. Path'ın tek segmentten oluştuğu durumda sayı değeri varsayılan olarak 1.000.000.000 alınır. Endpoint sınıfımız path'daki count segmentindeki sayıyı int'e dönüştürmekte, daha sonra 1'den bu sayıya kadar olan sayıların toplamını bulup response'a yazmaktadır. Response'a yazarken geçerli zamanı iki kere yazmaktadır.
Programı çalıştırıp sum parametresi için 10 değerini verdiğimizde sayfaya şöyle bir çıktı verilir:

(19:49:50) 1'den 10 sayisina kadar olan sayilarin toplami: 
(19:49:50) 55

Burada iki zaman damgasının da aynı olması iki verinin de sıfırdan üretildiğini, cache'lenmediğini gösterir. Sayfayı birkaç kez yenilerseniz zaman geçtikçe zaman damgasının değiştiğini göreceksiniz. Bu da verilerin tekrar hesaplandığını gösterecek.

Üretilmesi maliyetli bir veriyi cache'lemek için IDistributedCache servisini kullanırız. Örnek (Toplam.cs dosyası):

Bu kodumuz önceki versiyonla aynı işi yapmaktadır. Tek fark 1'den kendisine kadar olan sayıların toplamı hesaplanacak sayı cache'te varsa tekrar hesaplama yapmadan cache'ten alıp vermektedir. Eğer cache'te yoksa veriyi hesaplamakta, daha sonra cache'e yazmaktadır. Bir cache değişkeninin cache'te kalma süresi 2 dakikadır. Eğer veri cache'ten alındıysa sayfanın verdiği çıktıdaki birinci satırdaki zaman ile ikinci satırdaki zaman birbirinden farklı olacaktır. IDistributedCache arayüzündeki önemli üyeler şunlardır:
GetString(key): Belirtilen anahtarla temsil edilen cache değerini string olarak döndürür. Böyle bir cache değişkeni yoksa null döndürür.
GetStringAsync(key): GetString(key) metodunun asenkron versiyonudur.
SetString(key,value,options): Belirtilen anahtarla temsil edilecek cache değeri belirtilir. Bir DistributedCacheEntryOptions nesnesiyle ilgili cache değişkeniyle ilgili ayarlamalar yapılabilir.
SetStringAsync(key,value,options): SetStringAsync(key,value,options) metodunun asenkron versiyonudur.
Refresh(key): Anahtarla temsil edilen cache değişkeninin ömür sayacını sıfırlar.
RefreshAsync(key): Refresh(key) metodunun asenkron versiyonudur.
Remove(key): Anahtarla temsil edilen cache değişkenini siler.
RemoveAsync(key): Remove(key) metodunun asenkron versiyonudur.
Varsayılan durumda cache değişkenleri cache'te sonsuza kadar kalır. Ancak SetString() ve SetStringAsync() metotlarının üçüncü parametresine bir DistributedCacheEntryOptions nesnesi verilerek bu varsayılan durum değiştirilebilir. DistributedCacheEntryOptions sınıfının önemli özellikleri şunlardır:
AbsoluteExpiration: Tam olarak hangi zamanda cache değişkeninin öleceğini belirtiriz.
AbsoluteExpirationRelativeToNow: Cache değişkeninin ömrünü belirtiriz (ne kadar süre yaşayacak)
SlidingExpiration: Cache değişkenine ne kadar süre erişilmediği zaman silineceğini belirtmeye yarar.
Cache servisinin çalışması için aşağıdaki şekilde AddDistributedMemoryCache servisini ayağa kaldırmalıyız (Program.cs dosyası):

Bu kodumuzda cache değişkenlerini RAM bellekte tutacağımızı söyledik. Aşağıdaki altenatif servisler vasıtasıyla cache değişkenlerini başka yerlerde de tutabiliriz:
AddDistributedMemoryCache(): Cache değerlerini RAM bellekte tutar.
AddDistributedSqlServerCache(): Cache değrlerini SQL Server'da tutar.
AddStackExchangeRedisCache(): Cache değerlerini Redis veritabanında tutar.
Örneğimizde RAM bellekte cache değişkenlerini depolamak için AddDistributedMemoryCache() servisi kullanılmıştır. Bu servis MemoryDistributedCacheOptions sınıfı ile konfigüre edilir. Bu sınıfın önemli özellikleri şunlardır:
ExpirationScanFrequency: Belirli aralıklarla cache değişkenlerinin ömrünün dolup dolmadığı kontrol edilir. Ömrü dolan bir cache değişkeni tespit edilirse cache'ten silinir. İşte buradaki "belirli aralık"ı belirtir.
SizeLimit: Cache'teki maksimum değişken sayısını belirtir. Bu sayı aşılırsa cache'ten silme yapılır.
CompactionPercentage: SizeLimit'e ulaşıldığında cache'in boyutunun ne kadar azaltılacağını belirtir.
Örneğimizde maksimum 200 değişken olabilir. Programımızı çalıştırdığımızda zaman damgalarının bir tanesinin sürekli güncel değeri gösterdiğini, diğerinin ise eğer cache'lenmiş veriye erişiyorsak sabit kaldığını görürüz.

Bir önceki örneğimizde cache'lemeyi RAM belleğe yaptık. İki açıdan RAM belleğe cache'leme yapmanın dezavantajı vardır:

RAM belleğe yazılan veriler geçicidir. Sunucu yeniden başladığında veriler silinir.
Bazen uygulamamızı birden fazla sunucuya dağıtabiliriz. Bu durumda sunucular birbirlerinin cache'lerini kullanamazlar. Uygulamanın birden fazla sunucuya dağıldığı durumlarda cache'lemeyi düzgün bir şekilde yapabilmek için cache'lemeyi kalıcı belleğe yapmalıyız.
Bu bölümde cache'lemeyi SQL Server'a yapacağız. Bunun için öncelikle SQL Server Management Studio'yu açın ve CacheDb isimli bir veritabanı oluşturun. Daha sonra bu veritabanına bir tablo ekleyeceğiz. Ancak bu tabloda ihtiyaç duyulacak sütunları otomatik oluşturmak için bir araç kullanacağız. Visual Studio'da "Geliştirici PowerShell" pencereciğine gelin, cd komutuyla .csproj dosyasının olduğu klasöre geçin ve aşağıdaki komutu verin:

dotnet sql-cache create "Server=DESKTOP-J5SDIAM;Database=CacheDb;Trusted_Connection=True;" dbo DataCache

Bu komuta verilen parametreler SQL Server'a bağlanmak için kullanılacak connection string'i, tablonun şeması ve tablo ismidir. Tabloda Id, Value, ExpiresAtTime, SlidingExpirationInSeconds ve AbsoluteExpiration sütunları bulunmaktadır ve cache değişkeni ismini, cache değerini ve cache değişkeninin ne kadar süreyle cache'te tutulacağını belirten bilgiler içermektedir. Bu sütunları yine SQL Server Management Studio ile görebilirsiniz.

Veritabanımız hazır olduğuna göre şimdi programımıza geçebiliriz. Şimdi SQL Server'a cache'leme yapacak NuGet paketini kurmalıyız. Paketin ismi Microsoft.Extensions.Caching.SqlServer. Bu örnek için 6.0.0 versiyonunu kurmalıyız.
Şimdi SQL server için connection string'i aşağıdaki şekilde appsettings.json dosyasına ekleyelim:

Şimdi Program.cs dosyasını AddDistributedMemoryCache() servisi yerine AddDistributedSqlServerCache() servisini kullanacak şekilde değiştirelim:

Burada cache'leme için SQL Server kullanacağımızı belirtik, ayrıca veritabanına bağlantı için kullanılacak string'i, veritabanında cache değişkenlerini tutacak tabloyu ve tablonun şemasını da belirttik. AddDistributedSqlServerCache() servisi SqlServerCacheOptions sınıfı aracılığıyla konfigüre edilmektedir. Bu sınıfın önemli özellikleri şunlardır:
ConnectionString: Veritabanına bağlantı için kullanılacak string.
SchemaName: Cache'leme için kullanılacak tablonun şeması.
TableName: Cache'leme için kullanılacak tablo.
ExpiredItemsDeletionInterval: Tablo hangi sıklıkla ömrü dolan değişken var mı diye kontrol edilecek? Varsayılan: 30 dakika.
DefaultSlidingExpiration: Bir cache değişkenine maksimum ne kadar süre erişilmezse cache değişkeni silinecek? Varsayılan: 20 dakika
Programı çalıştırdığınızda çalışmasında hiçbir fark olmadığını göreceksiniz. Ancak önceki versiyonun aksine ASP.NET Core yeniden başlatıldığında da cache değişkenlerine erişebildiğinizi göreceksiniz. Ayrıca uygulamanın veritabanındaki tabloya yazdığı verileri SQL Server management Studio'yu kullanarak görebilirisniz.
NOT: Cache'lemenin mantığı birden fazla kullanıcı aynı verilere erişmeye çalıştığında optimizasyon sağlamaktır. Cache'lemenin amacı kullanıcıya özgü hassas verileri tutmak değildir. Kullanıya özgü verileri tutmak için oturum servisini kullanın.

Şimdiye kadar hep bir response'un içindeki birtakım verileri cache'ledik. Bu bölümde response'un tamamını bir bütün halinde cache'leyeceğiz. Örnek (Program.cs dosyası):

UseResponseCaching() middleware'inin diğer middleware ve endpoint'ler tarafından oluşturulan response'ları cache'leyebilmesi için request pipeline'da ilk tanımlanan middleware'lerden birisi olması gerekmektedir. Ayrıca UseResponseCaching() middleware'i cache'leme yapabilmesi için bellek veya SQL Server tablosuna ihtiyaç duymaz. O yüzden koddan AddDistributedSqlServerCache() servis çağrısı kaldırılmıştır.
Şimdi Toplam.cs dosyasının içeriğini şöyle değiştirelim:

Evet, kod çok karmaşık gibi gözüküyor. Ancak bizin için burada önemli olan

satırı. Response caching middleware'i sadece "Cache-Control" header'ını ve bu header'ın içinde "public" direktifini içeren response'ları cache'ler. max-age direktifi saniye cinsinden ne kadar süreyle response'un cache'leneceğini belirtir.
Response caching'i etkinleştirmek basittir, sadece "Cache-Control" header'ını ayarlamak yeterlidir. Ancak çalıştığını görmek için dikkat etmemiz gereken şeyler var. F5 tuşuna basmamız, tarayıcının araç çubuğundaki yenile butonuna basmamız veya adres çubuğuna tıklayıp enter tuşuna basmamız response caching'in çalışmamasına yol açar. Response caching'in tek çalışabileceği senaryo bir link üzerinden ilgili talebin yapılmasıdır. Zaten bu yüzden oluşturulan çıktıya LinkGenerator servisini kullanarak link ekledik. Bu linke tıkladığımızda aynı URL'ye talep yapılır, ancak veri cache'lenmiş response'tan gelir. Bunu, response'taki zamanın değişmemesinden anlayabiliriz. İlk yaptığınız talepten sonra 2 dakika geçtikten sonra tekrar talep yapmanız durumunda belirtilen zamanın değiştiğini göreceksiniz.
Cache-Control header'ının direktiflerindeki public direktifi ilgili cache'in kullanıcıya özgü olmadığını belirtir. Diğer bir deyişle bir kullanıcı ilgili URL'ye t

Varsayılan durumda HTTP protokolü stateless bir protokoldür, diğer bir deyişle hafızası yoktur. Sunucu her gelen talebe aynı muameleyi çeker. HTTP protokolünün bu eksikliği cookie'ler aracılığıyla giderilir. Cookie'ler sayesinde sunucu belirli bir istemciden gelen ardışık istekleri birbiriyle ilişkilendirip daha daha sonraki isteklerde yapılan işlemlerin daha önceden yapılan isteklerden etkilenmesine imkan tanır. Bir alışveriş sitesinde oturum açmamış olsanız bile belirli bir kategorideki ürünleri ziyaret ettikten sonra sonraki sayfalarda benzer ürünlerin önerilmesi bu yüzdendir.
Cookie'ler çok basit bir mantıkla çalışır. İstemci sunucuyu ilk kez ziyaret ettiğinde sunucu istemciye cookie denilen metin bazlı bir dosya verir. Bu dosyada istemciyi diğer istemcilerden ayıran bilgiler vardır. İstemci daha sonraki her talebinde cookie'yi sunucuya tekrar gönderir. Sunucu kendi tarafında dağıttığı cookie'lerin bir kaydını tutar. Kaydını tuttuğu bir cookie tekrar geldiğinde ilişkilendirmeyi yapar.
Cookie'leri nüfus cüzdanına benzetebiliriz. Doğduğunuzda devlet size nüfus cüzdanı verir. Daha sonra devletle her işiniz olduğunda nüfus cüzdanınızla devlet dairesine başvurursunuz ve devlet sizi hatırlar.

ASP.NET Core'da cookie'lere endpoint'ler ve middleware'ler tarafından HttpContext nesnesi üzerinden erişilen HttpRequest ve HttpResponse nesneleri üzerinden erişilir. Örnek (Program.cs dosyası):

Bu programda şunlar yapılmaktdır:

"/cookie" path'ı talep gelirse:
Eğer counter1 isimli bir cookie varsa bu cookie'nin değerinin 1 artırılmışını counter1 değişkenine ata. Eğer counter1 isimli bir cookie yoksa 1 değerini counter1 değişkenine ata.
counter1 değişkeninin değerini counter1 isimli cookie'ye yaz. Böyle bir cookie yoksa oluşturup yaz.
Eğer counter2 isimli bir cookie varsa bu cookie'nin değerinin 1 artırılmışını counter2 değişkenine ata. Eğer counter2 isimli bir cookie yoksa 1 değerini counter2 değişkenine ata.
counter2 değişkeninin değerini counter2 isimli cookie'ye yaz. Böyle bir cookie yoksa oluşturup yaz.
counter1 ve counter2 değişkenlerinin değerlerini ekrana yaz.
"/clear" path'ına bir talep gelirse bütün cookie'leri temizle ve akışı / path'ına yönlendir.
Yapılan işlem aslında basitçe cookie değişkenini almak, 1 artırmak, sonra tekrar cookie'ye yazmaktır. Diğer bir deyişle her gelen talepte cookie'nin değerini 1 artırmaktır. İlk gelen talepte cookie olmadığı için başlangıç değerini 0 olarak ele alır.
İstemci tarafından gönderilen cookie'lere HttpRequest nesnesi üzerinden erişilir. İstemciye cookie göndermek için HttpResponse nesnesi kullanılır. HttpResponse sınıfının Cookies özelliğinin Append() metodu belirtilen cookie varsa değerini değiştirir, cookie yoksa ekleme yapar. Burada üretilen her iki cookie'nin de ömrü 30 dakikadır. 30 dakika sonra tarayıcı cookie'leri siler. Cookie'lerin ömrünü ayarlamak için kullanılabilecek CookieOptions sınıfının benzer özellikleri şunlardır:
Domain: Tarayıcının cookie'yi göndereceği hostları (sunucuları) belirtir. Varsayılan durumda cookie'yi ilk hangi sunucu göndermişse daha sonraki taleplerde cookie sadece o sunucuya gönderilir.
Expires: Cookie'nin belirli bir tarih-zamandan sonra ömrünün dolmasını sağlar.
HttpOnly: Değeri true yapıldığında yalnızca tarayıcı tarafından açık talep yapıldığında cookie gönderilir. Arkaplanda JavaScript tarafından yapılan taleplerde cookie gönderilmez.
IsEssential: Cookie'leri esas cookie'ler ve yardımcı cookie'ler olmak üzere ikiye ayrılır. Bu özelliğin true olması cookie'nin esas olduğu anlamına gelir.
MaxAge: Cookie'nin ne kadar süre yaşayacağını belrtir.
Path: Eğer belirli bir path değeri ayarlanırsa host'un sadece belirli bir path'ına yapılan taleplerde cookie gönderilir.
SameSite: Çapraz site taleplerinde cookie'nin gönderilip gönderilmeyeceğini belrtir. Olası değerler Lax, Strict ve None'dır. Varsayılanı None'dır.
Secure: true yapılırsa cookie yalnızca HTTPS bağlantılarında gönderilir.
Çoğu tarayıcı belirli bir web sayfasındayken ilgili web sayfasının gönderdiği cookie'leri görmemize izin verir. Örneğin Chrome'da açık olan web sayfasının gönderdiği cookie'leri görmek için Chrome menüsünü açarız, menüdeki "Diğer araçlar" altındaki "Geliştirici araçları"na tıklarız, açılan pencerede sol taraftaki "Storage" grubunun altındaki "Cookies" ögesinin altındaki host adresine tıklarız. Web sayfasının gönderdiği tüm cookie'ler tüm özellikleriyle beraber gözükür. İşte biraz önce CookieOptions sınıfı aracılığıyla belirttiğimiz özellikler bu özelliklerdir. Bu pencerede cookie'leri silebilir ve değerlerini değiştirebiliriz.

Çoğu sitede ilgili sitenin cookie kullandığı belirtilir ve cookie'lere izin verip vermeyeceğimizi belirttiğimiz kutucuklar bulunur. ASP.NET Core'un da kullanıcının rıza verip vermediği bilgisini tutma, kullanıcı rıza vermemişse esas olmayan cookie'leri devredışı bırakma, kullanıcı rıza vermişse bütün cookileri'i serbest bırakma yeteneği vardır. Örnek (Program.cs dosyası):

Options pattern'i aracılığıyla UseCookiePolicy middleware'i konfigüre edilir. UseCookiePolicy middleware'inin ayar sınıfı olan CookiePolicyOptions sınıfının önemli özellikleri şunlardır:
CheckConsentNeeded: Tipi, paramtere olarak HttpContext alan ve geriye bool döndüren bir temsilcidir. Belirtilen fonksiyon her gelen request'te çalıştırılır ve geri dönüş değeri cookie rızası gerekip gerekmediğini belirtir. Fonksiyon geriye true değer döndürüyorsa cookie rızası gerekiyordur, geriye false değer döndürüyorsa rıza gerekmiyordur. Varsayılan durumdaki fonksiyon (bu özelliğe fonksiyon atanmadığındaki durum) her request'te false döndürür.
ConsentCookie: Rıza cookie'sidir. Kullanıcının cookie'lere izin verip vermediği bilgisi de cookie aracılığıyla tutulur.
HttpOnly: Cookie'lerin HttpOnly özelliği için varsayılan değeri belirtir.
MinimumSameSitePolicy: Cookie'lerin SameSite özelliği için olası en düşük güvenlik seviyesini belirtir. 
Secure: Cookie'lerin Secure özelliği için varsayılan değeri belirtir.
Örneğimizde

koduyla her gelen istek için rıza gerektiğini belirtmekteyiz. Ayrıca kodumuza

satırını ekleyerek cookie'ler için rıza kontrolü yapan middleware'i eklemiş bulunmaktayız. Sonuç olarak bu middleware yapılandırıldığı şekilde her gelen istekte rıza kontrolü yapmaktadır. Henüz rıza verilmediği için IsEssential olarak işaretlenmemiş cookie'lerin gönderilmesini engellemektedir. Programı çalıştırdıktan sonra ilk iş "clear" path'ına talepte bulunarak cookie'lerin silinmesini sağlayın. Programımızda counter1 cookie'si IsEssential olarak işaretlendiği, counter2 cookie'si IsEssential olarak işaretlenmediği için sadece counter1'in sayacı artacaktır.

Programımızda mevcut durumda IsEssential olarak işaretlenmemiş cookie'ler kullanılamamaktadır. Eğer kullanıcı rıza vermişse esas olmayan cookie'lerin de kilidini açabilmeliyiz.
Rıza yönetimi bir request feature'ı aracılığıyla yapılmaktadır. Request feature'larına HttpContext sınıfının Features özelliği aracılığıyla erişilir. Request feature'ları nadir ihtiyaç duyulan alt seviye request-response işlemlerini bize sağlar. HttpContext.Features özelliğiyle erişilen her bir feature geriye bir arayüz nesnesi döndürür. Cookie rızası işlemleriyle ilgilenen arayüz ITrackingConsentFeature'dır. Bu arayüz aşağıdaki özellik ve metotları içerir:
CanTrack: Esas olmayan cookie'lere izin veriliyorsa true döndürür. İki şekilde true döndürür. Ya kullanıcı esas olmayan cookie'lere izin vermiştir ya da cookie rızası gerekmiyordur.
CreateConsentCookie(): Rıza cookie'si üretir. JavaScript istemcileri bu cookie'yi rıza belirtme amacıyla kullanabilir.
GrantConsent(): Esas olmayan cookie'lere izin verir. Bunu response'a bir cookie koyarak yapar.
HasConsent: Esas olmayan cookie'lere izin verilip verilmediği bilgisini tutar.
IsConsentNeeded: Geçerli request için esas olmayan cookie'ler için rıza gerekip gerekmediği bilgisini tutar.
WithdrawConsent(): Rızayı kaldırır. Bunu rıza cookie'sini silerek yapar.
Şimdi projemize ConsentMiddleware.cs isminde ve içeriği aşağıdaki gibi olan bir sınıf ekleyelim:

Bu middleware "/consent" path'ına gelen taleplere cevap verir. Kullanıcı cookie izni vermemiş gözüküyorsa cookie izni verilir, eğer kullanıcı izin vermiş gözüküyorsa izin kaldırılır. Diğer bir deyişle izin durumunu ters çevirir. Bu middleware'i request pipeline'a UseCookiePolicy() metot çağrısından hemen sonra ekleyin. 
Programın çalışmasını görmek için öncelikle /clear path'ına talepte bulunarak cookie'leri temizleyin. Ardından /cookie path'ına talepte bulunun, sadece ilk sayacın ilerlediğini görün, daha sonra cookie'lere izin vermek için /consent path'ına talepte bulunun, bu aşamadan sonra tekrar /cookie path'ına talepte bulunduğunuzda iki sayacın da ilerlediğini göreceksiniz. Daha sonra tekrar /consent path'ına talepte bulunun, bu sefer ikinci sayacın durduğunu tekrar göreceksiniz.
Rızayı kaldırdıktan sonra cookie'nin değerinin sıfırlanmadığına dikkat edin. Rızayı kaldırmak mevcut cookie'yi silmez. Sadece sunucunun cookie'yi istemciye göndermesini engeller. İstemci yine kendindeki cookie'yi sunucuya göndermye devam eder. Ancak sunucu kendisine gelen cookie'nin değerini 1 artırıp tekrar istemciye gönderemediği için istemcideki cookie sabit kalır.

Bu bölümde geçen bölümde gördüğümüz middleware'lere benzer yapıda olan, ancak bazı konularda middleware'lerden ayrışan endpoint dediğimiz yapıları ve endpoint'lerin beraber çalıştığı ASP.NET Core tarafından sağlanan routing mekanizmasını göreceğiz.

Bu bölümde kullanılacak örnek projenin ismi Routing. "ASP.NET Core Empty" şablonunu kullanarak projeyi oluşturun. Projeye ismi Population.cs olan ve içeriği aşağıdaki gibi olan dosyayı ekleyin:

Bu middleare "population/<city>" şablonundaki path'lara karşılık vermektedir. Buradaki <city> değeri london, paris veya monaco olabilir. Eğer <city> bu üç şehirden birisi değilse veya path'ın ilk segmenti "population" değilse akış -varsa- sıradaki middleware'e yönlendirilir. Eğer path'ın ilk segmenti "population" ise ve ikinci segmenti biraz önce bahsettiğimiz üç şehirden biriyse bu şehirlerin nüfuslarını response'a yazar ve request pipeline'a kısa devre yaptırır. Middleware, gelen request'in kendisi için olup olmadığını anlamak için request path'ını "/" karakterine göre parçalara böler ve segmentleri teker teker inceler. Şimdi buna benzer şekilde projemize Capital.cs dosyasını ekleyelim. İçeriği şöyle olsun:

Bu middleware bir önceki middleware ile benzer mantıkta çalışır. Tek fark şehirlerin nüfusları yerine ülkelerin başkentini vermesidir. Eğer gelen talepteki ülke "monaco" ise başkentini yazmak yerine /population/monaco" path'ına tekrar talepte bulunulmasını sağlar. Şimdi bu iki middleware'i request pipeline'a ekleyelim (Program.cs dosyası):

Programı bu haliyle çalıştırdığımız zaman beklediğimiz gibi çalıştığını görürüz. Örneğin "population/london" path'ına talepte bulunduğumuzda londra'nın nüfusunu ekrana yazdığını görürüz.

Projemizde iki middleware var. Birisi "population/<city>" path'ına karşılık verirken, diğeri "capital/<country>" path'ına karşılık veriyor. İkisi de request'in kendisi için olup olmadığını anlamak için aynı işlemleri yapıyor, path string'ini parçalara ayırıp segmentleri inceliyor. Bu ideal durumdan uzaktır. Bunun için daha otomatik bir yola ihtiyacımız var. Ayrıca her middleware'in hangi path'a karşılık geldiği bariz değil. Her bir middleware'in hangi path'a karşılık geldiğini anlamak middleware'in içindeki kodları okumak zorundayız. Ayrıca ikinci middleware ilk middleware'i işaret eden URL'yi elle oluşturmuştur. Bu hataya açık bir durumdur. Çünkü ilk middleware ileride kaynak kodunu değiştirebilir, farklı bir URL şemasına geçebilir. Örneğin ileride ilk middleware "population/<city>" yerine "size/<city>" path'ına karşılık vermeye başlayabilir.
URL routing mekanizaması bütün bu sorunları çözmektedir. Sistem tarafından tanımlanan routing middleware'i devreye girmekte, gelen path'a göre akışı belirli bir endpoint'e yönlendirmektedir. Endpoint'ler bazı açılardan middleware'lere benzerler. Örneğin ikisi de HttpContext nesnesi üzerinde çalışır, request'i inceler ve response'a yazar. Ancak endpoint'lerde akışın yönlendirilebileceği sıradaki bir endpoint yoktur. Programda birden fazla endpoint olabilir ve her request'te request'in path'ına göre tek bir endpoint çalışır. Geçen derste request pipeline'ı görmüştük. Endpoint'leri de hesaba kattığımızda request pipeline şöyle gözükecektir:

Endpoint adı üstünde uç noktada bulunur. Esasında request'i inceleyerek response'a yazan asıl birim endpoint'tir. Middleware'ler çoğunlukla endpoint'e çeşitli konularda yardım ederler. Middleware'ler, response'a yazdıkları nadir zamanlarda da request pipeline'a kısa devre yaptırıp sıradaki middleware'lerin süreci devralmasını engellerler. Birden fazla middleware'ın ortaklaşa bir şekilde response'a yazması çok çok nadir bir durumdur.
Her bir path'a (veya path şablonuna) karşılık gelen endpoint'i belirtme Program.cs dosyasında yapılır. Program.cs dosyasında her bir path ve ona karşılık gelen endpoint ikilisine bir rota (route) denir. Routing middleware'inin Program.cs dosyasındaki rotalara bakarak gelen request'i belirli bir endpoint'e yönlendirmesine rotalama (routing) denir.

Routing middleware, request pipeline'a iki sistem middleware'i aracılığıyla eklenir. Bunlar UseRouting() ve UseEndpoints()'tir. UseRouting, rotalama yapacak middleware'i request pipeline'a ekler. UseEndpoints ise rotaları belirtmeye yarar. Şimdi Program.cs dosyasını şöyle değiştirelim:

IApplicationBuilder arayüzüne ait olan UseEndpoints() metodu parametre olarak IEndpointRouteBuilder alan ve geriye değer döndürmeyen bir fonksiyon alır. Fonksiyon parametresi (endpoints) kullanılarak rotalar oluşturulur. MapGet() metodu IEndpointRouteBuilder arayüzünde tanımlı bir eklenti metodudur ve belirli bir path'a gelen GET request'lerini lambda fonksiyonu şeklinde tanımlanmış endpoint'e yönlendirir. Aynı arayüzde tanımlı MapGet metodunun farklı versiyonları şunlardır:
MapGet(pattern, endpoint): Pattern'e gelen GET request'lerini belirtilen endpoint'e yönlendirir.
MapPost(pattern,endpoint): Pattern'e gelen POST request'lerini belirtilen endpoint'e yönlendirir.
MapPut(pattern,endpoint): Pattern'e gelen PUT request'lerini belirtilen endpoint'e yönlendirir.
MapDelete(pattern,endpoint): Pattern'e gelen DELETE request'lerini belirtilen endpoint'e yönlendirir.
MapMethods(pattern, methods, endpoint): Belirtilen metotlarla pattern'e gelen request'lerini belirtilen endpoint'e yönlendirir.
Map(pattern,endpoint): Pattern'e gelen tüm request'leri belirtilen endpoint'e yönlendirir.
Programı çalıştıdığımız zaman http://localhost:5000/routing adresine gelen talepler lambda ifadesi şeklinde belirtilen endpoint'e yönlendirilecek ve ekrana "Request was Routed" yazacaktır. Routing middleware'i bu şekilde rota belirtimi yapıldığı zaman request pipeline'a kısa devre yaptırır ve sıradaki middleware'ın çalışmasını engeller. Yukarıdaki örneğimizde ekrana "Terminal Middleware Reached" çıktısı eklenmeyecektir. Eğer rota eşleşmeseydi terminal middleware çalışacaktı. Şimdi Program.cs dosyasını şöyle değiştirelim:

Gördüğünüz gibi middleware olarak kullanılan iki bileşen endpoint'e dönüştürülmüştür. Bir middleware sınıfının Invoke() metodu RequestDelegate temsilcisi tipinde olmalıdır, bu aynı zamanda MapGet() metodunda rota belirtirken kullanılan temsilcidir. Benzerliklerinden dolayı endpoint'ler ve middleware'ler birbirine çok kolayca dönüştürülebilirler.

Daha eski ASP.NET Core sürümlerinde Program.cs dosyasında rotalama tam olarak böyle yapılıyordu. Ancak ASP.NET Core 6 sürümünden itibaren Microsoft otomatik olarak UseEouting ve UseEndpoints middleware'lerini otomatik olarak request pipeline'a eklemektedir. Şimdi Program.cs dosyamızı şöyle değiştirelim:

Gördüğünüz gibi Program.cs dosyasında UseRouting() ve UseEndpoints() middleware çağrıları yok. Rotalar direkt IEndpointRouteBuilder arayüzünü uygulamış olan WebApplication nesnesi (app) üzerinden tanımlanıyor. Zaten de MapGet() ve MapPost() gibi rota oluşturmaya yarayan metotlar bu arayüzdeydi. Ayrıca bu şekilde rota tanımlaması yapıldığı zaman rota eşleşsin veya eşleşmesin akış sıradaki middleware'lere devredilir. Bu yüzden terminal middleware tanımı pasifize edilmiştir.

Şimdilik güzel gidiyoruz, ama bazı sorunlarımız var. Birincisi routing middleware endpoint'lerin desteklediği her URL için yönlendirme yapmıyor, sadece "capital/uk" ve "population/paris" path'ları için yönlendirme yapıyor. İkinci olarak routing middleware görevini yapmasına ve sadece URL'si uygun request'leri nedpoint'lere yönlendirmesine rağmen endpoint'lerin içinde yeniden URL işleme yapılıyor. Şimdilik elde ettiğimiz tek fayda endpoint'lerin kodunu incelemek zorunda kalmadan endpoint'lerin hangi path'a karşılık verdiğini görebilmek.
Şimdlik endpoint'ler request'in path'ındaki segmentleri incelemek zorundalar. Çünkü gelen request'in kendisine geldiğinden emin olsa bile path'daki ülke veya şehir bilgisini bir şekilde almak zorunda. Sorun aslında aşırı katı bir rotalama yapmamız. Sadece "capital/uk" ve "population/paris" path'ları için rotalama yapıyoruz. Segment sayısının daha az veya daha fazla olması veya birinci veya ikinci segmentlerin farklı olması routing middleware'in yönlendirme yapmamasına neden oluyor. İşte bu noktada segment değişkenleri devreye giriyor.

Biraz önceki örneğimizdeki URl pattern'lerindeki literal segment'ler kullanmaktadır. Bunun anlamı sadece tam olarak o path'a gelen talepler için yönlendirme yapılmasıdır. Şimdi Program.cs dosyasını şöyle değiştirelim:

Gördüğünüz gibi segment değişkenleri rota tanımlaması yaparken { ve } karakterleri arasında belirtiliyor. Endpoint'in içinde ilgili segment değişkenine de context nesnesi üzerinden erişebiliyoruz. Bu örneğimizde segment'lerin içeriği ne olursa olsun path'ında üç tane segmenti olan her request ilgili endpoint'e yönlendirilmektedir. action, area, controller, handler ve page isimleri segment değişkenleri için kullanılamaz. HttpContext sınıfının Request özelliği ile erişilen HttpRequest sınfına ait RouteValue özelliği geriye RouteValuesDictionary tipinden nesne döndürür. RouteValuesDictionary tipinin önemli üyeleri şunlardır:
[key]: İndeksleyici vasıtasıyla herhangi bir segmentin değerine erişmeyi sağlar. (object)
Keys: Segment değişken isimlerini döndürür. (ICollection<string>)
Values:: Segment değerlerini döndürür. (ICollection<object>)
Count:: Segment sayısını döndürür. (int)
ContainsKey: URL'de belirrli bir isimli segmentin olup olmadığını döndürür. (bool)
RouteValuesDictionarı bir IEnumerable'dır ve üzerinde foreach döngüsü ile dönülebilir. Her bir dönüşte KeyValuePair<string,object> döndürür.

Artık routing middleware sayesinde yalnızca endpoint'lerin ilgilendiği talepleri endpoint'e yeteneğine sahibiz. Endpoint'e dönüştüreceğimiz middleware sınıfları artık gelen talebin kendisine geldiğinden emin ve segment değişkenlerini kullanabildiği direkt URL işlemesine gerek yok. Şimdi Capital.cs dosyamızı şöyle değiştirebiliriz:

Bu kod URL'nin path'ının ilk segmentinin "capital" olduğuna güvenerek "country" isimli ikinc, segmenti almaktadır. Diğer işlemler bildiğiniz gibidir. Artık bu bir endpoint olduğu için akışı bir sonraki middleware'e yönlendi

Entity Framework Core Microsoft'un sunduğu bir ORM (object-relational mapping) çözümüdür. Veritabanında ilişkisel olarak tutulan verilerin .NET ortamında .NET nesneleriyle nesne tabanlı olarak görülebilmesini, bu nesneler üzerinde değişiklik yapılabilmesini, depoya yeni nesne eklenebilmesini ve sonucun tekrar ilişkisel veritabanına yazılmasını sağlar. Entity Framework Core sayesinde büyük ölçüde veritabanına direkt SQL gönderme zahmetinden kurtulmuş oluruz. Ancak Entity Framework Core bizi SQL bilme zorunluluğundan kurtarmamaktadır. Sadece kodun daha güzel, düzenli, basit ve sade olmasını sağlamakta ve dahili .NET nesneleriyle veritabanı arasında geçişin kolay olmasını sağlamaktadır. Direkt veritabanına SQL yazdığımız durumda veritabanına sıkı bir şekilde bağlı oluyorduk. Entity Framework Core bizi bu sıkı bağdan kurtarmaktadır ve dahili .NET nesnelerinden veritabnına geçişi tek satır kod değişimine indirgemektedir.
Bazen Entity Framework Core LINQ sorgularını güzel bir şekilde SQL'e dönüştüremeyebilir. Çünkü birisi nesne tabanlı, birisi ilişkisel çalışmaktadır. Her İngilizce kelimenin bir Türkçe karşılığı olmadığı gibi bazı LINQ sorgularının basit bir SQL karşılığı yoktur. Bazen LINQ kötü SQL sorgusuna dönüştürülmekte, dönüştürülen SQL sorgusu önce çok fazla verinin çekilmesini, sonra bu verilerin büyük kısmının atılmasını gerektirmektedir. İşte böyle bir durumda üretilen SQL sorgusunu görme ve müdahale etme imkanımız vardır. Bunun için tabii ki çok iyi SQL bilmek zorundayız.
Şimdi "ASP.NET Core Empty" şablonuyla yeni bir proje oluşturalım. Projeye Veritabani ismini verelim.

Öncelikle Entity Framework Core araç paketini kurmamız gerekiyor. Model sınıfından veritabanı şemasına dönüşüm (migration) araç paketi aracılığıyla olmaktadır. Araç paketini kurmak için "Geliştirici PowerShell" pencereciğinde .csproj dosyasının olduğu klasöre geçin ve aşağıdaki iki komutu verin:

dotnet tool uninstall --global dotnet-ef
dotnet tool install --global dotnet-ef --version 6.0.0

İlk komut ilgili araç paketi varsa silmekte, ikinci komut araç paketinin 6.0.0 versiyonunu kurmaktadır. Araç paketini kurduktan sonra NuGet paket yöneticisini kullanarak Microsoft.EntityFrameworkCore.Design ve Microsoft.EntityFrameworkCore.SqlServer paketlerinin 6.0.0 versiyonlarını kuralım.

Şimdi projenizde Models isimli bir klasör oluşturun, içinde Ogrenci.cs isminde bir sınıf oluşturun, sınıfın içeriği şöyle olsun:

Kuşkusuz daha karmaşık model sınıfları da olabilir. Ben Entity Framework Core'a odaklanmak istediğim için olabilecek en basit model sınıfını seçtim.

Artık elimizde modelimiz var. Şimdi bu modeli veritabanına bağlayacak olan sınıfı yazmaya sıra geldi. Şimdi Models klasöründe OgrenciContext.cs isimli bir sınıf oluşturun ve sınıfın içeriği şöyle olsun:

Sınıfımız model sınıfı ile veritabanı arasında köprü görevi görecektir. Biz .NET nesneleri üzerinde modifikasyon yapıp depoya yazdığımızda bu sınıf, sonuçları SQL'e dönüştürüp veritabanına gönderecektir. Sınıfımız DbContext sınıfından türetilmiştir. Yapıcı metot DbContextOptions<OgrenciContext> tipinde tek bir parametre almakta ve bu parametreyi olduğu gibi ana sınıfın yapıcı metoduna göndermektedir. Şimdilik sınıfımızda depodaki bütün öğrencileri döndürmeye yarayan Ogrenciler isimli bir özellik vardır. İleride kendimiz de Ogrenciler tablosunda seçim yapan ve Ogrenciler tablosunda değişiklik yapan çeşitli özellik ve metotları bu sınıfa ekleyebileceğiz.

Şimdi veritabanına erişim için servis ekleyerek bağlam sınıfını yapılandırmaya sıra geldi. Şimdi Program.cs dosyamızı şöyle değiştirelim:

Burada Entity Framework Core için bir servis tanımlaması yapılmaktadır. Burada veritabanına bağlantı için kullanılacak köprü sınıfının OgrenciContext olduğunu, veritabanının Sql Server olduğunu ve veritabanına bağlanmak için kullanılacak connection string'i belirttik. Şimdi appsettings.json dosyasında connection string'i tanımlamaya sıra geldi:

Burada Microsoft.EntityFrameworkCore kategorisinin log seviyesini Information'a çektik. Bu sayede LINQ'ten SQL'e dönüştürülen sorguları sunucu konsolunda görebileceğiz. Bu aşamada veritabanında Ogrenci diye bir veritabanı yok, ancak oluşturmaya da gerek yok. Migrate işlemi veritabanını ve tabloyu bizim yerimize oluşturacak.

Şimdi ASP.NET Core tarafında gerekli olan her şeyi tamamladık. Şimdi bir tuşa basıp bu işlemleri veritabanına uygulamaya sıra geldi. .NET tarafında mantıksal olarak tanımlanan sınıfların veritabanı ortamında fiziksel veritabanı ve tablolara dönüştürülmesine Migration (göç) denir. Migrate işlemi dersin başında yüklediğimiz araç komutu ile yapılır. Migrate işlemi ilk aşamada .NET sınıflarından veritabanı tablolarına dönüşümü için veya ileriki aşamalarında model sınıflarında yapılan değişikliklerin veritabanı şemasına yansıtılması için kullanılır. Şimdi projede bir hata olup olmadığını görmek için solution'ı bir kere build edin. Hata yoksa "Geliştirici PowerShell" pencereciğinde .csproj dosyanızın olduğu klasöre geçin ve eşağıdaki komutu verin:

dotnet ef migrations add Initial

Bu aşamada henüz veritabanına bir şey yazılmadı. Sadece veritabanına yazma yapacak .NET sınıfı oluşturuldu. Bu sınıfın Migrations klasöründe ve <zaman_damgası>_Initial.cs isminde olması gerekiyor. Initial ilk migration'a verilen geleneksel isimdir. Veritabanında yapılacak işlemleri görmek için ilgili Initial dosyasının içine bakabilirsiniz. Şimdi migration'ı uygulamanın zamanı geldi:

dotnet ef database update

Bu komut migration sınıfındaki komutları çalıştırmaktadır. Komutun çalıştığını SQL Server Management Studio'dan teyit edebilrsiniz. Ayrıca Microsoft.EntityFrameworkCore kategorisi için log seviyesini Information olarak ayarladığımız için komut girdiğiniz "Geliştirici PowerShell" pencereceğinde de çalıştırılan SQL komutlarını görebilirsiniz.

Elimizde bir veritabanı ve bu veritabanının içinde bir tablo var, ancak tablonun işi boş. Şimdi bu tabloyu doldurmaya sıra geldi. Şimdi projenizin Models klsörüne SeedOgrenci.cs isimli bir dosya ekleyin. Dosyanın içeriği şöyle olsun:

Bu kodda öncelikle bekleyen bir Migration olup olmadığını kontrol ediyoruz. Aslında bekleyen bir migration olmadığını biliyoruz. Çünkü biraz önce dotnet ef database update kodunu uyguladık. Ancak işimizi garanti alrına almak için bekleyen bir migration olup olmadığını kontrol ediyoruz. Eğer bekleyen bir migration varsa Migrate işlemi yapıyoruz.
Eğer veritabanında hiç öğrenci yoksa öğrenci nesnelerini oluşturup veritabanına ekliyoruz. context üzerinde çalışan SaveChanges() metoduyla context üzerindeki .NET nesnelerinde yapılan değişimin veritabanına yansıtılmasını sağlıyoruz. SeedOgrenci sınıfının kullanılmasını sağlamak için Program.cs dosyamızı şöyle değiştirmeliyiz:

Bu kod biraz karmaşık gibi gözüküyor, ama aslında karmaşık değil. Öncelikle

kodlarıyla OgrenciContext sınıfına servis aboneliği yapıyoruz, daha doğrusu OgrenciContext sınıfını servis olarak kullanmak istediğimizi belirtiyoruz. Artık nerede bir sınıf yapıcı metot yoluyla bir OgrenciContext nesnesi istese, ilgili sınıf nesnesi ASP.NET Core tarafından oluşturuluyorsa OgrenciContext nesnesi otomatik olarak enjekte edilecek.

Burada da SeedOgrenci sınıfını servis olarak kullanıyoruz. SeedOgrenci servisi de yapıcı metot yoluyla OgrenciContext servisine bağlı. Biz bir SeedOgrenci nesnesi istediğimizde çözümlemeler zincir şeklinde otomatik yapılacak.

Burası biraz kafanızı karıştırabilir. Ancak aslında son derece basittir. Burada eğer uygulama Development sürecinde değilse (Production veya Staging sürecinde) ve INITDB komut satırı argümanının değeri true değilse veya böyle bir komut satırı argümanı hiç yoksa veritabanı seed'lenmemektedir. Diğer bütün durumlarda veritabanı seed'lenmektedir. Uygulamamız varsayılan durumda Development aşamasında olacağı için her halükarda seed'lenecektir. Eğer Production aşamasında olsaydı seed'lenmesinin tek yolu INITDB komut satırı argümanının değerinin true olması olacaktı. İkinci if'te eğer INITDB komut satırı true değilse veya hiç yoksa sunucuyu çalıştır, aksi halde çalıştırma diyoruz.
NOT: Bu kodumuzda daha önce Servisler ve Dependecy Injection dersinde gördüğümüz bir tekniği uyguladık, app değişkeni üzerinden bir transient veya scoped servise eriştik. Varsayılan durumda app değişkeni üzerinden transient veya scoped servislere erişemezsiniz. app değişkeni üzerinden bir transient veya scoped servise erişmek için öncelikle CreateScope() metoduyla scope oluşturduk, daha sonra oluşan bu nesne üzerinden servise eriştik. 
Bazen sunucuyu çalıştırmadan veritabanını veri ile doldurmak isteyebiliriz. Bu durumda Geliştirici PowerShell pencereciğinde aşağıdaki komutu veririz:

dotnet run INITB=true

Bu komut uygulamamız hangi geliştirme sürecinde olursa olsun çalışacaktır. Eğer veritabanını silmek istiyorsanız Geliştirici PowerShell pencereciğinde

dotnet ef database drop --force

komutunu çalıştırabilirsiniz. Bu aşamadan sonra tekrar veritabanını, tabloyu ve tablodaki verileri oluşturmak istiyorsanız aşağıdaki komutu vermeniz yeterlidir:

dotnet run INITDB=true

Bu komut Initial migration'ındaki komutları uygulayacak ve veritanındaki tabloyu verilerle dolduracaktır.

Veritabanını ve tabloyu oluşturup örnek verileri veritabanına yükledikten sonra sıra, veritabanındaki verilere bir endpoint'ten erişmeye geldi. Şimdi projemizin ana klasörüne OgrenciEndpoint.cs isminde bir endpoint sınıfı ekleyelim. İçeriği şöyle olsun:

Şimdi bu endpoint'i rota yapılandırmasına ekleyelim. Kolaylık olması açısından bu endpoint'i / path'ına ekleyeceğim:

Endpoint sınıfımız basitçe veritabanındaki tüm öğrencileri çekmekte, bunların bilgilerini ekrana yazmakta, daha sonra Haydar isimli bir öğrenciyi veritabanına eklemektedir.

Entity Framework Core'un yaptığı her SQL sorgusunu sunucunun konsol ekranında görebilmekteyiz. Ancak gizliliği korumak adına Entity Framework Core SQL sorgularındaki parametreleri [Parameters=[@p0='?' (Size = 4000), @p1='?' (Size = 4000)] şeklinde gizlemektedir, parametreler yerine soru işareti koymaktadır. Kon

Günümüzde web siteleri büyük ölçüde HTTPS protokolünü kullanmaktadır. HTTPS protokolü daha hassas verilerin sunuculara gönderilebilmesi ve sunucuların da benzer hassas verileri istemcilere gönderebilmesini sağlamak üzere tasarlanmıştır. Ancak hassas veri göndermesin-göndermesin çoğu web sitesi günümüzde HTTPS protokolünü kullanmaktadır.

HTTPS bağlantılarını etkinleştirmek için launchSettings.json dosyası kullanılır. Örnek:

Bu yapılandırma ayarına göre sunucumuz hem HTTP hem de HTTPS isteklerine cevap verecektir. HTTP isteklerine 5000 portundan, HTTPS isteklerine ise 5500 portundan cevap verecektir. Normalde profesyonel web sitelerinde HTTPS'i etkinleştirmek daha karmaşık bir süreçtir, ancak neyse ki ASP.NET Core geliştirme aşamasında kullanmak üzere bizim için bir test sertifikası sağlamaktadır. Aşağıdaki komutları "Geliştirici PowerShell"i kullanarak .csproj dosyasının olduğu klasörde çalıştırın:

dotnet dev-certs https –-clean
dotnet dev-certs https --trust

ASP.NET Core bu komutlardan sonra uyarı pencereleri çıkarabilir. İlk komut mevcut güvenilen sertifikayı silmektedir. Eğer bu komuttan sonra uyarı penceresi çıkarsa "Yes" diyerek geçin. İkinci komut ise yeni bir güvenilen sertifika yüklemektedir. Bu komutta da uyarı penceresi çıkabilir. Bu pencerede de "Yes" diyebilirsiniz.

HttpContext üzerinden erişilen HttpRequest sınıfının IsHttps özelliği geçerli isteğin HTTPS protokolü üzerinden yapılıp yapılmadığını belirtir. Örnek (Program.cs dosyasındaki fallback endpoint eşlemesi):

UseHttpsRedirection() middleware'i bir istek HTTP protokolü üzerinden geldiğinde request pipeline'a kısa devre yaptırır ve geriye aynı URL'in HTTPS versiyonuna yönlendirme içeren bir cevapla geri döner. UseHttpsRedirection() middleware'i kullanıldığı zaman ilk kullanılan middleware'lerden biri olmalıdır. UseHttpsRedirection() middleware'i aşağıdaki şekilde konfigüre edilebilir:

UseHttpsRedirection() middleware'inin HTTP talepler için HTTPS versiyonlara yönlendirme cevabıyla geri döndüğünü söylemiştik. İşte bu yönlendirme cevabının durum kodunu RedirectStatusCode özelliğiyle belirtiriz. Varsayılan durumda sunucu HTTPS portunu launchSettings.json dosyasından almaktadır. Ancak bazen projemizi sunucuya deploy ettiğimizde sunucunun başka portu dinlediğini görebiliriz. Böyle bir durumda portu örnekteki gibi elle girebiliriz.

UseHttpsRedirection() middleware'i kullanılarak HTTP'yi HTTPS'e yönlendirmenin bir dezavantajı kullanıcının istediği an HTTP ile istek göndermesine müsaade etmemizdir. Bir istemci HTTP ile istek gönderdiğinde HTTP protokolünü kullanarak HTTPS'e bir yönlendirme cevabı göndeririz. Tarayıcı tekrar HTTPS üzerinden talepte bulunur, bu ikinci talebin cevabı HTTPS ile verilir. Kullanıcı yine HTTP ile talep gönderdiğinde aynı prosedür devam eder. Tekrar HTTPS'e yönlendirme cevabı göndeririz, istemci tekrar HTTPS ile talepte bulunur, vs. En kötü durumda istemcinin sunucumuzla yaptığı iletişimin %50'si güvenli olmayan HTTP protokolü üzerinden olacaktır. Bu güvenlik riski oluşturabilir.  
HTTPS Strict Transport Security (HSTS) protokolü bu riski ortadan kaldırmak için tasarlanmıştır. HSTS protokolü her tarayıcı talebine verilen cevabın "bu hosta talep gönderirken yalnızca HTTPS kullan" anlamına gelen bir header içermesini sağlar. Bu aşamadan sonra aynı tarayıcının aynı hosta gönderdiği diğer bütün talepler HTTPS protokolü üzerinden yapılır. Diğer bir deyişle ilk request dışındaki diğer bütün request'lerde HTTP-HTTPS dönüşümlerini tarayıcı yapar. Örnek (Program.cs dosyası):

UseHsts() middleware'i UseHttpsRedirection() middleware'iyle beraber kullanılabilir. Ancak ilk request dışındaki diğer request'lerde UseHttpsRedirection() middleware'ine iş düşmeyecektir. Örnek kodumuzda UseHsts() middleware'i options pattern'iyle konfigüre edilmektedir. UseHsts() middleware'inin ayar sınıfı HstsOptions'tır ve aşağıdaki özellikleri içerir:
ExcludedHosts: Bu hostlara HSTS header'ı gönderilmez. Varsayılanında localhost ve IPv4 ve IPv6'nın loopback adresleri vardır.
IncludeSubDomains: Sunucunun subdomain'lerine yapılan taleplere verilen cevaplarda da HSTS başlığı olup olmayacağını belirtir. Varsayılanı false'tur.
MaxAge: Tarayıcının ne kadar süre boyunca HTTP'den HTTPS'e dönüşüm yapması gerektiğini belirtir. Varsayılanı 30 gündür.
Preload: Sunucuya ilk request'te bile HTTP ile talep gönderilememesini amaçlar. Tarayıcılar HSTS preload şemasındaki domain'lere talepleri mutlaka HTTPS üzerinden yaparlar. Tabii bunun için söz konusu domain'lerin tarayıcılara kodlanması gerekir. Örneğin wikipedia.org domain'i bu şemada bulunmaktadır. Dolayısıyla hiç kimse wikipedia.org adresine HTTP ile talep gönderemez, HTTP talepleri tarayıcıda HTTPS'e dönüştürülüp öyle Wikipedia sunucusuna gönderilir. Herhangi bir domain'in bu şemaya girmesinin uygun olup olmadığına https://hstspreload.org/ adresinden bakabilirsiniz. Ayrıca söz konusu site şemaya girmek için gerekli şartlar ve tavsiyeleri de içerir.
HSTS dikkatli kullanılmalıdır, HTTP ve HTTPS protokolleri için varsayılan portlar kullanılmadığında sorunlar çıkabilir. Örneğin sunucumuzun domain'i host.com olsun ve HTTP için 5000, HTTPS içinse 5500 portunu dinlediğini varsayalım. Kullanıcı ilk talebini HTTP protokolü üzerinden http://host.com:5000 URL'sine yapsın. Bu aşamada sunucu içinde HSTS header'ı olan bir cevapla geri döner. Tarayıcı aynı sunucuya tekrar istek göndereceği zaman HTTP şeklinde olan URL'yi HTTPS'e dönüştürür. Ancak bazı tarayıcılar basit yolu izlerler ve sadece HTTP'yi HTTPS'e çevirip, portta değişiklik yapmadan yeniden talepte bulunurlar. Sunucu hem HTTP'yi hem de HTTPS'i aynı portta dinleyemediği için istemci talebine cevap veremez. Çözüm uygulama canlıya geçtiğinde HTTP ve HTTPS için varsayılan portları kullanmaktadır. HTTP için varsayılan port 80, HTTPS için 443'tür. HTTP ve HTTPS için varsayılan portlar kullanıldığında istemcinin sunucuya talep göndermesi için port belirtimi yapmasına gerek kalmaz.

Web geliştirmede loglama önemli bir konudur. Uygulamanın durumunu, uygulama üzerinde yapılan işlemleri izlemek için loglama kullanılabilir. Log mesajları uygulama tarafında log sağlayıcılara gönderilir. Log sağlayıcıları ise görülebileceği, depolanabileceği ve işlenebileceği yerlere gönderir. ASP.NET Core'un sağladığı dahili log sağlayıcıları olduğu gibi mesajları logging framework'lara gönderen üçüncü parti sağlayıcılar da vardır. Bu framework'lar mesajları toplama ve analiz etme gibi karmaşık görevlere sahip olabilirler.

ASP.NET Core tarafından sağlanan üç log sağlayıcı bulunmaktadır. Bunlar konsol, debug ve EventSource'tur. Debug sağlayıcısı tarafından gönderilen mesajlar System.Diagnostics.Debug sınıfı tarafından işlenebilir. EventSource sağlayıcısı mesajları PerfView gibi olay izleme araçlarına gönderir. Bu bölümde konsol sağlayıcısı kullanılacaktır. Diğer bir deyişle log kayıtları direkt konsol ekranına verilecektir. Örnek:

Bu adı üstünde bir endpoint sınıfıdır. Sadelik olması açısından bu sınıfın Program.cs dosyasında rota belirtiminde kullanılması gösterilmeyecektir. Loglama yapabilmemiz için mesajın hangi kategoride olduğunu belirtmemiz gerekir. Mesajın hangi kategoriye ait olduğu ILogger servisine verilen tip parametresiyle belirtilir. Geleneksel olarak log mesajını hangi sınıf üretiyorsa o kategoriye konulması tavsiye edilir. LogDebug() benzeri log mesajlarının önem seviyesini ve amacını gösteren başka metotlar da vardır. Bunlar aşağıda gösterilmiştir:
LogTrace(): Trace seviyesinde bir mesaj üretir, geliştirme sürecinde düşük seviye hata tespiti için kullanılır. Önem seviyesi: düşük
LogDebug(): Debug seviyesinde mesaj üretir, geliştirme sürecinde düşük seviye hata tespiti için ve production sürecinde oluşan sorunların sebebini tespit etmek için kullanılır. Önem seviyesi: orta 
LogInformation(): Uygulamanın durumu hakkında bilgi üretir. Önem seviyesi: orta 
LogError(): Uygulama tarafından yakalanmayan hataları ve istisnaları kaydetmeye yarar Önem seviyesi: yüksek 
LogCritical(): Uygulama tarafından yakalanmayan kritik hataları ve istisnaları kaydetmeye yarar. Önem seviyesi: yüksek
Bu metotların önem seviyesi azaldıkça detay miktarı artar.  Bu metotlar string parametre yanında Exception tipinde de parametre alabilir. Bu metotların verdiği çıktılar sunucunun konsol ekranında gözükür. Eğer gözükmüyorsa appsettings.Development.json dosyasının şöyle değiştirmeniz gerekir:

Benim sistemimde varsayılan olarak loglama seviyesi Default için Information'dı. Dolayısıyla gönderdiğim log mesajı konsol ekranında gözükmüyordu. Burada Default için log seviyesini en önemsiz seviye olan Trace'e çektim. Bu sayede ürettiğim log mesajları konsol ekranında gözüküyor. Burada Default, diğer kategorilerdeki log mesajlarını belirtirken Microsoft.AspNetCore ilgili kategorideki log mesajlarını belirtir. Ekrana log mesajları basan örnek bir konsol çıktısı aşağıdaki gibidir:

dbug: Microsoft.Extensions.Hosting.Internal.Host[1]
      Hosting starting
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5271
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Users\bekir\OneDrive\Masaüstü\kitap\Loglama\Loglama\
dbug: Microsoft.Extensions.Hosting.Internal.Host[2]
      Hosting started
dbug: Loglama.EndpointSinifi[0]
      EndpointSinifi sınıfı içindeki Endpoint metodu

Burada her bir mesajın log tipi, kategorisi ve içeriği gözükmektedir.

Program.cs dosyasında loglama yapabilmemiz için bir şekilde loglama servisine ulaşılması gerekir. Bunun için WebApplication sınıfı üzerindeki Logger özelliğini kullanabiliriz. Örnek:

Bu şekilde loglama yapıldığı zaman log mesajının kategorisi uygulama adı olur. Belirli bir kategori de log mesajı üretmek içinse ILoggerFactory servisini kullanırız. Örnek:

LogDebug() ve benzeri metotların bir alternatifi attribute kullanmaktadır. Örnek:

Attribute yoluyla log mesajı üretme daha ziyade birden fazla yerde belirli bir şablona göre log mesajı üretmemiz gerekiyorsa faydalıdır.

Aslında bu kısmı bölümün başında daha önce görmüştük. Burada bazı tamamlayıcı bilgiler verilecektir. Mevcut durumda appsettings.Development.json dosyasının içeriği şöyledir:

Burada her bir kategorinin önem seviyesi belirtilmiştir. Bir kategori olarak sınıf kullanılmışsa isim alanıyla beraber belirtilmelidir. Belirli bir isim alanının altındaki bütün sınıflar için bir önem seviyesi de belirtebiliriz. Kategori olarak bir isim alanı belrttiğimiz zaman bu isim alanının altındaki alt isim alanları da aynı loglama seviyesine sahip olacaktır. Ancak elbetteki istersek daha alt isim alanlarının (veya direkt sınıfların) önem seviyesini üst isim alanından farklı bir önem seviyesine çekerek üst isim alanının belirttiği değerin geçersiz kılınmasını sağlayabiliriz. Yani burada da kategori/alt kategori mantığı vardır.
Örneğimizde Microsoft.AspNetCore isim alanının altındaki bütün sınıf kategorilerinin önem seviyesi Warning'dir. Belirtilen kategoriler dışında kalan tüm kategorilerin önem seviyesi Default girdisi ile belirtilir. ASP.NET Core'da kullanılabilecek farklı log seviyeleri ve bu log seviyelerinde log üretmek için kullanılacak metotlar önemsizden önemliye doğru aşağıdaki tabloda gösterilmiştir:

6. seviyede log mesajı üretilemez. Bu seviye, yapılandırma dosyasında "hiçbir log mesajını gösterme" anlamında kullanılır.

İstersek sunucuya gelen her isteği ve sonucunda döndürülen her cevabı da loglayabiliriz. Örnek (Program.cs dosyası):

Yukarıdaki kod request pipeline'a UseHttpLogging isimli middleware'i ekler. Bu middleware gelen request'i ve giden response'u inceler ve bu request ve response hakkındaki bilgileri loglar. Bu middleware'in ürettiği loglar Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware kategorisinde ve Information önem seviyesindedir. Bu middleware'in ürettiği logları görmek için direkt bu kategoriyi, ya da üst kategorilerden birini en az Information seviyesine çekmelisiniz.
Request ve response hakkında loglanacak detaylar options pattern'iyle UseHttpLogging middleware'inin konfigure edilmesiyle belirtilebilir. Örnek (Program.cs dosyası):

Bu örneğimizde sadece request'in verb'ünün, path'ının ve response'un durum kodunun loglanmasını sağladık.

MVC, ASP.NET Core tarafından desteklenen bir tasarım desenidir. Eski öneminden azalma olsa da günümüzde ASP.NET Core'da web geliştirme için kullanılan en popüler framework'tur. Aslında MVC'nin bazı bileşenlerini daha önce görmüştük. İlk bileşeni olan modeli Entity Framework Core kullanımı konusunda görmüştük. Web servisleri konusunda da controller bileşenini gördük. Ancak web servislerdeki controller'lar JSON döndürüyordu. MVC'nin ortasındaki "V" view anlamına gelmektedir ve controller'ların JSON tipinde veri yerine bir view döndürmesini sağlar. Web servis yaklaşımında uygulama sadece veriyi oluşturmakla sorumlu iken, verinin güzel bir formatta gösterilmesinden servis tüketicisi sorumluyken MVC yaklaşımında veritabanından sunuma kadar tam bir uçtan uca geliştirme söz konusudr. Model veritabanındaki nesneleri, bu nesneler üzerinde yapılabilecek işlemleri, yeni sağlanacak nesnelere uygulanacak kısıtları, vs. sağlar. Geliştiriciye veritabanına direkt SQL sorgusu göndermektense daha uygulamanın iş mantığına uygun bir geliştirme ortamı sağlar. Controller istemci tarafından gönderilen istekleri karşılar, mantıksal işlemler yapar, modelden veri alır, aldığı verileri render'lanmak üzere bir view'a gönderir. View'ın görevi ise controller'dan aldığı veriyi uygun bir şekilde kullanıcıya göstermek ve formlar aracılığıyla kullanıcıdan aldığı verileri tekrar controller'a iletmektir.
MVC'yi en güzel bir restoran analojisi açıklar. Restoranın sahibi olan patron kasada bekler, müşterileri karşılar, müşteriden siparişleri alır ve siparişleri mutfakta yemekleri hazırlayacak olan aşçıya iletir. Aşçı yemeği yapar ve geri patrona verir. Bu aşamada yemek sunuma pek uygun değildir. Tabak, çanak, çatal, tepsi, ekmek, sos, vs. yoktur. Patron yemeği bir haliyle garsona verir. Garson yemeği süsler. Tuzu azsa tuz atar, sos sıkar, yemeği güzel bir tabağa koyar, yanına nizami olarak çatal, bıçak, kaşık koyar, yanına birkaç dilim ekmek koyar ve müşteriye servis eder. Daha sonrasında müşteriden gelen her türlü şikayeti, isteği ve geri bildirimi patrona iletir. Patron, garsondan gelen bilgilere göre yeni kararlar alır. Bu analojide patron controller, aşçı model, view ise garsondur. Aslında bu modelde olmayan bir katman da veritabanıdır. Veritabanı aşçının malzeme temin ettiği tedarikçidir.
Bu bölümde geçen bölümden kalan örneği kullanacağız. Öncelikle Program.cs dosyamızı şöyle sadeleştirelim:

Bu Program.cs dosyamızda veritabanıyla çalışmamızı sağlayan kodlar, statik içeriğe erişime izin veren kodlar ve controller şeklinde olan web servis sınıflarını kullanabilmemizi ve bu sınıflara ve içindeki action'lara rotalama yapabilmemizi sağlayan kodlar bulunmaktadır. Uygulamamızı yavaş yavaş web servisten MVC'ye çevireceğiz.

Web servis uygulamamızı MVC'ye çevirmek çok kolaydır. Şimdi Program.cs dosyamızı şöyle değiştirelim:

Bu kod önceki versiyona yalnızca iki satır kod eklemektedir. Öncelikle AddControllers() servis çağrısı yerine AddControllersWithViews() servis çağrısı kullanılmıştır. Bunun anlamı controller ve view'ların beraber kullanılacağıdır, ki bu da MVC'ye tekabül etmektedir. İkinci değişiklik ise request pipeline'a MapControllers() yerine MapControllerRoute() middleware'ini ekler. Bu değişiklik rotalamayı MVC'ye göre ayarlar. Bu rotalama mekanizmasına convention routing denir ve rotalama için controller ve action'ların atrribute'ları yerine isimleri kullanılır. MVC'deki rotalama mekanizması birazdan detaylı olarak ele alınacaktır.

MVC controller'ları web servis controller'ına büyük ölçüde benzer, ancak arada bazı farklar da vardır. Şimdi projemizdeki Controllers klasörüne HomeController isimli bir controller ekleyelim ve içeriği şöyle olsun:

MVC için olan controller sınıfları ControllerBase yerine Controller sınıfından türemektedir. Controller sınıfı da ControllerBase sınıfından türemiştir ve view'larla çalışmamıza izin verecek ekstra üyeler içerir. Ayrıca MVC controller'larındaki action'lar kafalarına göre nesne döndüremezler, asenkron çalışıyorlarsa Task<IActionResult> tipinde nesne döndürebilirler, yani tip parametresi ya IActionResult'tır ya da IActinResult arayüzünü uygulamış bir sınıftır. Eğer action senkron çalışıyorsa IActionResult veya IActionResult'ı uygulamış herhangi bir sınıfla geri dönmelidir.
Örneğimizde View() metodu çağrılmakta ve metoda parametre olarak veritabanından çekilen bir nesne verilmektedir. Bu metot çağrısının anlamı action için varsayılan view'ın render'lanması ve view'a model olarak ilgili Product nesnesinin verilmesidir. Buradaki View() metodu Controller sınıfından devralınan bir metottur. View() metodu IActionResult arayüzünü uygulamış olan ViewResult tipinden bir nesne oluşturur, bu nesne bir view'ı ve view'ın model nesnesini kapsüller ve bir action'ın geri dönüş nesnesi olarak kullanıldığında "bu view'ı bu model nesnesiyle beraber render'la" anlamını taşır. Örneğimizde şimdilik herhangi bir view yoktur ve programı bu haliyle çalıştırırsanız bir çalışma zamanı hatası oluştuğunu görürsünüz.
Bu örneğimizde controller sınıfı için ApiController attribute'u, action'lar için Route ve HTTP metot attribute'ları kullanılmamıştır. Bu attribute'lar gelen isteğin path'ına göre hangi controller ve action'ın seçileceğini belirtmek için kullanılmaktadır. MVC'de bu süreç farklıdır.

MVC'deki rotalama mekanizması web servisten farklıdır. Web servis attribute'lar üzerine kurulu bir rotalama mekanizması kullanılır. MVC ise controller ve action isimlerine dayalı bir rotalama mekanizması kullanılır. Az önce Program.cs dosyasına eklediğimiz

ile Default isimli yeni bir rota oluşturmaktayız. Bu rotaya göre gelen request'in path'ındaki ilk segment controller değişkenine atanır. Controller MVC'de segment değişkenleri için özel bir isimdir ve ilgili isimli controller'ı sonunda "Controller" takısı olmadan seçmeye yarar. İkinci segment değişkeninin ismi action'dır ve ilgili controller'daki bir action'ı seçmeye yarar. Üçüncü segment ilgili action'a verilecek id isimli parametredir. Controller kullanılmadığı zaman HomeController, action kullanılmadığı zaman Index seçilir, id parametresi opsiyoneldir. Bu yüzden sunucumuza hiç path kısmı olmadan bir talep gönderirsek HomeController controller'ının Index action'ına talep gider. Bu tür bir rotalama mekanizmasına convention routing denir. Yukarıda belirttiğimiz rota MVC'de sık kullanıldığından MapControllerRoute() metot çağrısı yerine ilgili yere

Bu kod ASP.NET Core'a "MVC için varsayılan rotayı kullan" demektedir ve yukarıda elle oluşturduğumuz rotaya denktir. Bir MVC uygulaması istediği kadar rota tanımlayabilir.
Bir MVC uygulaması bir controller sınıfının içindeki bütün peblic metotları action varsayar ve bu action'lar bütün HTTP taleplerine metodu fark etmeksizin cevap verir. Bir controller'daki bir metodun action olmadığını belirtmek için ya private yaparız veya NonAction attribute'u ile işaretleriz. Ayrıca bir action'ın yalnızca belirli bir tipteki HTTP isteklerine cevap vrebilmesini sağlamak için ilgili action'ı HttpGet, HttpPost, vb. attribute'lar ile işaretleriz.

Örneğimizde Home controller'ındaki Index action'ı return View(await context.Products.FindAsync(id)); satırıyla varsayılan view'ı aramakta, ama bulamamaktadır. İlk aradığı yer Views/<controller> klasörüdür. Örneğin Home controller'ının içindeki Index action'ı varsayılan view olarak Views/Home klasöründe Index.cshtml isimli bir dosyayı arar. Eğer bu konumda ilgili dosya bulunamazsa bu sefer Views/Shared klasöründeki Index.cshtml isimli dosyayı arar. Örneğimizde aranan dosya iki konumda da bulunamadığı için çalışma zamanı hatası oluşmuştur.

Uygulamamızın istediği view'ı oluşturmak için öncelikle Views isimli bir klasör, bu klasörün içinde Home isimli bir alt klasör oluşturalım. Daha sonra Home klasörünün içinde Index.cshtml isimli bir view oluşturalım. Bu dosyanın içeriği şöyle olsun:

İlk bakışta standart bir HTML dosyası gibi gözüküyor. Ancak @ ile başlayan direktifler controller'dan view'a gönderilen veriye ulaşmayı sağlıyor. Örneğimizde Index action'ı return View(await context.Products.FindAsync(id)); satırıyla view'a bir Product nesnesi göndermiştir. View bu Product nesnesinin adını ve para birimi formatlamasında fiyatını HTML kodundaki ilgili yere basmaktadır.

Bazen bir action'da varsayılan view'ı render'lamak yerine belirli bir view'ı render'lamak isteyebiliriz. Bu durumda view'ı açık bir şekilde belirtmek gerekir. Örneğin Home controller'ındaki Index action'ını şöyle değiştirin:

Bu action eğer gelen ürünün CategoryId'si 1 ise Watersports isimli view'ı, değilse varsayılan view'ı render'lamaktadır. Her iki view'a da model verisi olarak ilgili Product nesnesi verilmektedir. Watersports view'ı da yine öncelikle Views/Home klasöründe, sonrasında Views/Shared klasöründe aranacaktır.

Yukarıdaki yöntemde belirli bir view'ın aranmasını işlemini ASP.NET Core'a delege ederiz. ASP.NET Core daha önce de belirttiğimiz şekilde önce ilgili Views klasörünün ilgili controller klasöründe arama yapar, burada alamazsa Views/Shared klasöründe arama yapar. Eğer ASP.NET Core'un bu arama sürecini devralmasını istemiyorsak, view için kendimiz kesin bir yol belirtip ilgili view'ı adeta elimizle koymuş gibi bulabiliriz. Örnek:

Bu tür bir belirtimde view'ın uzantısının belirtilmesi zorunludur. Ayrıca gördüğünüz üzere view'lara model verisi gönderilmek zorunda değildir.

View'lar hem HTML hem de C# kodu içerebilir. View'daki C# kodu içeren ifadeler sunucu tarafında çalıştırılarak sonuçları HTML koda gömülür. İstemciye salt HTML gönderilir. Esasında view'lar da RazorPage sınıfından türeyen birer sınıftır. View sınıfının yaptığı iş aslında kendinde bulunan HTML kodlarını response'a yazmaktır. Bu response'a yazma işlemi yapılırken HTML kodları direkt response'a yazılırken C# kodları ise çalıştırıldıktan sonra sonuçları response'a yazılır.
Varsayılan durumda view sınıfları direkt DLL'e derlenir, ara bir C# kodu oluşturulmaz. Oluşturulan ara C$ kodunu görmek istiyorsanız projenizin proje dosyasının iöeriğine aşağıdaki girdiyi ekleyin:

Proje

Controller'dan view'a çok çeşitli şekillerde veri taşınabilir. En popüler veri taşıma yolu model nesnesi üzerindendir ve daha önceki derslerimizde görmüştük. Bu bölümde model dışında kalan veri taşıma yolları işlenecektir.

Kulanımı aşağıdaki gibidir:

ViewBag, Controller sınıfından devralınan dynamic tipinde bir özelliktir. Dolayısıyla bu özelliğe her tipten özellik atanabilir. Bu veriye view'dan da aynı şekilde erişilebilir. Örnek:

ViewBag'de taşınan veri sadece bir request'liktir. Bir verinin birden fazla request-response ikilisi boyunca geçerli olmasını istiyorsak TempData kullanabiliriz. TempData verisi eğer oturum middleware'i etkinleştirilmemişse varsayılan olarak cookie'ler üzerinde depolanır, oturum middleware'i etkinleştirilmişse oturum üzerinde depolanır. Oturum verisinden farklı olarak TempData verileri okunduğu an silinmek üzere işaretlenir, request işleme tamamlandığında da silinir. Dolayısıyla oturum yönetimi yerine kullanılmaması tavsiye edilir. Daha çok yönlendirme yapıldığında ilgili veriye yönlendirilen sayfadan ulaşılabilmesi amacıyla kullanılır. Şimdi projemize CubedController isimli yeni bir controller ekleyelim ve içeriği şöyle olsun:

Bu controller son derece basittir. Cube action'ı model binding yoluyla double tipinde num isimli bir parametre almaktadır. Bu parametreyi ve küpünü TempData üzerinde saklamakta ve istemcinin aynı controller'daki Index action'ına tekrar talepte bulunmasını istemektedir. Index action'ı Cubed isimli bir view'ı render'lamaktadır. Şimdi projemize Cubed.cshtml isimli bir view ekleyelim ve içeriği şöyle olsun:

Bu örneğimizde kullanıcı ilk önce Index action'ına talepte bulunduğu zaman bu aşamada TempData sözlüğü boş olacağı için form boş gelmektedir ve formun altında herhangi bir yazı olmayacaktır. Kullanıcı formda ilgili yere sayıyı girip "Submit" butonuna bastığında veri Cube action'ına gidecektir. Cube action'ı ilgili sayıyı ve küpünü TempData sözlüğüne yazıp Index action'ına yönlendirme yapmaktadır. İşte bu noktada TempData kullanılmasaydı veri silinecekti. Ancak TempData'da silinmediği için yönlendirme sonrası Index action'ının renderladığı Cubed view'ı ilgili TempData verilerine ulaşacak ve formda ve formun altındaki yazıda TempData verilerini gösterecektir. Kullanıcı bu aşamada forma yeni bir sayı yazıp tekrar "Submit" butonuna bastığında artık TempData verileri silindiği için süreç en başına dönmektedir.
TempData verileri okunur okunmaz silinmez. Sadece okunduktan sonra silinmek üzere işaretlenir. TempData verisinin kullanıldığı view render'landıktan ve kullanıcıya gönderildikten sonra kullanıcı tarafından yeni request gönderildiğinde artık TempData verileri silinmiş olacaktır. Örneğin kullanıcı yukarıdaki örneğimizde Cubed view'ında sayıyı ve küpünü gösteren metni gördükten sonra sayfayı yenilerse bu bilgiler artık sayfada olmayacaktır.
TempData özelliği üzerinde çalıştırılacak Peek() metodu bir TempData sözlüğünden veriyi silinmek üzere işaretlemeden alır. Keep() metodu ise daha önce normal yolla alınan TempData verisinden sonra ilgili sözlük üzerinde yapılan silinecek işaretini kaldırır. Ancak Keep() metot çağrısından sonra normal yolla tekrar ilgili TempData verisine erişildiyse ilgili TempData verisi tekrar silinmek üzere işaretlenir.
Controller'lar TempData verisine kolayca ulaşmak için özellikleri için TempData attribute'unu kullanabilirler. Örnek:

Bu örneğimizde Cube action'ının TempData'ya yazması için direkt Value ve Result özelliklerine yazması yeterlidir. TempData sözlüğüne view tarafında erişilmede herhangi bir farklılık yoktur.

Layout'lar web geliştirme için çok önemli bir konudur ve view tarafındaki kod tekrarını önler. Çoğu web sitesi, sayfaları için genel bir şablon kullanır. Örneğin sol tarafta navigasyon menüsü olur; üst tarafta ana menü linklerinin, arama kutusunun, oturum açma ve yeni kullanıcı kaydı için butonların olduğu bir şerit olur. Sayfanın sonunda telif hakları, vb. uyarıların olduğu footer kısmı olur. Sayfada tek değişen orta kısımdır ve sayfanın asıl içeriğini belirtir. İşte bu tür bir senaryoda layout'lar biçilmiş kaftandır ve view'ların yalnızca sayfanın ortasını belirtmesini, geri kalanın layout tarafından oluşturulmasını sağlar. Web sitemizde hiç bu tür bir bölümleme yapmayacak olsak bile layout'lar faydalıdır. Çünkü bir HTML sayfasının asıl içerik üreten kısmı <body> kısmıdır. Layout'lar view'ların sadece <body> kısmının içeriğini belirtmesini, HTML sayfasının genel iskeletinin ve <head> kısmının layout tarafından oluşturulmasını sağlayabilir.
Layout'lar büyük ölçüde standart view'lara benzerler. Çoğunlukla bütün controller'ların action'ları tarafından kullanılabilmesi için Views/Shared klasörüne konulurlar. Layout isimleri alt tire (_) karakteriyle başlar ve varsayılan layout çoğunlukla _Layout.cshtml ismine sahip olur. Layout'ta asıl içeriğin yazılacağı kısmı RenderBody() metoduyla belirtiriz. Örnek:

Bir view ilgili layout'u kullanmak için sayfanın başında aşağıdaki kod bloğunu eklemelidir:

@{
  Layout = "_Layout";
}

Layout belirtimlerinde bir özelliğe değer atandığı için C# kod bloğu açılması kaçınılmazdır.

Daha önce bir HTML sayfasının <head> kısmında çoğunlukla aynı şeyler bulunduğu için bu kısmı bir layout'a atayabileceğimizi söylemiştik. Ancak bir sayfanın <head> kısmında da sayfaya özgü HTML kodları bulunabilir. Sayfanın başlığını belirten <title> etiketi buna verilebilecek en yaygın örnektir. İşte bu tür senaryolarda layout'u kullanan view'ın layout'a veri göndermesi, layout'un da kendisine gönderilen bu veriye dayanarak içeriğini modifiye etmesi gerekir. Örneğin view dosyamızı şöyle değiştirelim:

@{
  Layout = "_Layout";
  ViewBag.Title = "Sayfa Başlığı";
}

Layout'u ise şöyle değiştirelim:

Action, view ve layout'un çalışma sırası şöyledir: action > view > layout. Action view'ı renderlar, view layout'u render'lar, sonra layout'un ilgili kısmına kendini koyar.

Daha önce _ViewImports.cshtml dosyasını görmüştük ve her view'ın başında kullanılan @using deyimlerini _ViewImports.cshtml dosyasına koyup bütün view'ların aynı isim alanlarını import etmesini sağlamıştık. _ViewStart.cshtml dosyası da benzer işleve sahiptir. Her view render'lanmadan önce _ViewStart view'ı render'lanır ve her view'ın başına eklenecek kodları belirtir. Ancak kullanım amacı olarak _ViewImports ile _ViewStart farklılaşır. ViewImports'ta bir şeyleri import ederiz. Örneğin @using ile kullanacağımız isim alanlarını import ederiz ve ilgili isim alanındaki bütün sınıflara erişim hakkı kazanırız veya daha sonra göreceğimiz addTagHelper ile belirli bir kümedeki tag helper'ları import ederiz ve ilgili kümedeki bütün tag helper'ları kullanım hakkı elde ederiz. _ViewStart ise daha genel amaçlıdır. Şimdi projemizin Views/Shared klasörüne _ViewStart.cshtml isimli bir view ekleyelim ve içeriği şöyle olsun:

@{
  Layout = "_Layout";
}

Bu kod projemizdeki bütün view'lar için layout'un _Layout.cshtml olduğunu belirtmektedir ve her bir view'ın layout belirtimi yapmasını gereksiz kılmaktadır. Bu aşamada Views/Shared klasörüne eklenen layout dosyası projedeki bütün view'lar için kullanılacaktır. Eğer belirli bir controller'ın view'ları için farklı layout kullanmak istiyorsak aynı isimli ve içeriği farklı olan layout'u Views/<controller> klasörüne koyabiliriz. Çünkü layout arama süreci view arama süreciyle aynıdır. Bir klasördeki view layout'unu da ilk önce kendi klasöründe arayacaktır. Veya aynı amaçla Views/<controller> klasörüne layout seçimi yapacak _ViewStart.cshtml dosyasını koyabiliriz. Bu _ViewStart.cshtml dosyası yalnızca ilgili controller'ın view'ları için çalışacaktır.
Benzer şekilde her bir view yine de kendi layout'unu belirtebilir veya Layout özelliğine null atayarak bir layout kullanmak istemediğini belirtebilir.

Section'lar layout'ların daha gelişmiş bir özelliğidir ve view'lara layout'a daha fazla müdahale etme imkanı sağlar. Layout, view'larca değiştirilemeyecek sabit kısımları ve içeriği view'lar tarafından doldurulacak değişken kısımları barındırır. Bu değişken kısımlara section denir ve içeriği layout'u kullanan view tarafından doldurulur.
Bazen web sitelerinde görürüz. Üst menü bütün sayfalar için aynıdır. Ancak soldaki navigasyon kısmında listelenen linkler sayfaya göre değişmektedir. Ancak bu navigasyon kısmının formatı aynıdır ve sayfada aynı bölgeyi kaplamaktadır, tek değişen linklerdir. Veya sayfanın footer kısmında sayfanın son güncelleme tarihi gibi her sayfada değişecek bilgiler bulunmaktadır. Benzer şekilde bu footer kısmının da formatı aynıdır. Kısaca section'lar formatın sabit kaldığı ama içeriğin view'dan view'a değişebildiği durumlar için kullanılabilir. Şimdi projenizin Views/Shared klasöründeki _Layout.cshtml dosyasını şöyle değiştirin:

Bu layout klasik bir layout'tur. Sayfanın üstünde her sayfada sabit olacak "www.websitem.com" yazısı olacaktır. Sol taraftaki menüde sitedeki farklı sayfalara giden linkler olacaktır. Sayfanın altında sayfanın son güncelleme bilgisinin olduğu bir footer olacaktır. Sayfanın asıl içeriği ise tam ortaya yazılacaktır. Sayfanın header kısmı bütün site boyunca sabittir. Menü ve footer'ı formatı sabittir ama içeriği view'dan view'a değişebilmektedir. Formattan kastımız ilgili bölgenin genişliği, yüksekliği, arkaplan rengi, font büyüklüğü, sayfadaki konumu, vs.dir. Diğer bir deyişle sadece _Layout.cshtml dosyasını değiştirerek web sitesinin bütün görünümünü değiştirebileceğiz. Tamamlandığında web sitemizin görünümü şuna benzeyecek:

Şimdi Views/Home klasöründeki Index.cshtml dosyasını şöyle değiştirin:

Programı çalıştırdığınızda yukarıdaki resimdekine benzer bir görünüm almanız lazım. View'daki section'lar bir view'ın içerebileceği şekilde C# ve HTML kodu karışımını içerebilirler. View'da herhangi bir section'a yazılmamış kodlar ana section'da sayılır ve layout'ta RenderBody() ile işaretlenen yere konulur.
Bir view sadece kullandığı layout'ta tanımlanan section'lar için section belirtebilir. Aksi durumda çalışma zamanı hatası oluşur.

Varsayılan durumda bir view layout'taki bütün section'lar için içerik belirtmelidir. Aksi durumda çalışma zamanı hatası oluşur. Bu varsayılan durumu değiştirmek için layout'ta @RenderSection() metodu ikinci parametresi false olacak şekilde değiştirilir. Örnek (_Layout.cshtml):

Artık footer section'ı opsiyoneldir ve bir view layout'a footer section'ının içeriğini vermezse sayfada footer olmayacaktır.

Bazen bir layout kendisini kullanan view'ın bir section için içerik belirtip belirtmediğini öğrenmek isteyebilir. Bu tür bir kontrol olası çalışma zamanı hatalarının önüne geçecektir. Şimdi _Layout.cshtml dosyasındaki footer sınıfına ait olan div'in içeriğini aşağıdaki gibi değiştirin:

Bu örneğimizde view'ın bir section için içerik sağlamaması durumunda footer'a yazılacak bir fallback değeri belirttik.

Layout'lar layout kullanabilirler. Örneğin web sitenizin header kısmı bütün site için ortak olsun, ama sol taraftaki navigasyon linkleri controller'dan controller'a değişsin. Müşteri hizmetlerinin yürütüldüğü controller'daki bir view görüntülendiğinde müşteri hizmetleriyle ilgili linkler olsun, stok yönetimiyle ilgili bir controller'a ait view görüntülendiğinde stok yönetimiyle ilgili linkler olsun. Böyle bir durumda her bir Views/<controller> klasörüne ayrı bir layout dosyası koyarız. Bu layout dosyalarının da layout olarak ana layout'u kullanmasını sağlarız.

Partial view'lar layout'larla aynı amaca hizmet eder, view'lardaki kod tekrarını önlerler. Ama tam ters mantıkla çalışırlar. Layout mantığında bir view kendini layout'taki RenderBody() ile işaretlenen yere yerleştirir, partial view'da ise başka bir view'ın içeriği asıl view'ın belirli bir yerine yerleştirilir.
Partial view'lara web geliştirmede çok ihtiyaç duyarız. Aslında günümüzdeki web sitelerine dikkatlice bakarsanız hepsi birer partial view karışımıdır. Örneğin bir haber sitesinin ana sayfasına girdiğinizde çok fazla içerikle karşılaşırsınız. Çeşitli kategorilerdeki haberler, videolu haberler, dönen bir son dakika bildirgeci, borsa kurları, hava durumu, galeriler, en çok okunanlar bölümü, burç yorumları, vs. Bütün bunların direkt tek bir view tarafından üretilmesi çok zordur. Bunun yerine ana view devasa bir veri kümesi alır, aldığı bu verileri partial view'lara dağıtır. Verilerin uygun formatta kullanıcılara gösterilmesinden partial view'lar sorumludur. Partial view'ların göreceli olarak küçük bir veri kümesi üzerinde çalıştığı için artık işini yapması daha kolaydır. Ana view'ın tek görevi partial view'ların üreteceği içeriğin yerini ayarlamaktır.
Partial view'ların bir başka önemli işlevi ise tekrar eden görüntüleme görevlerini kolaylaştırmasıdır. Örneğin blog sitesinin ana sayfasında blog postlarının görüntülenmesi bir partial view'la çok rahat yapılabilir. Bütün blog postları aynı formatta görüntülenmektedir. Postun üstünde postun başlığı, ortada içerik, içeriğin sağ altında postu yayınlayan kullanıcı, postun tarihi vs. olur. Bütün bu bilgilerin partial view'a verilip partial view'ın verilen bilgileri güzel bir HTML'e çevirmesini sağlayabiliriz. Daha sonra her blog gönderisi görüntülenmesi gerektiğinde ilgili partial view'ı ihtiyaç duyduğu bilgilerle çağırıp kod tekrarının önüne geçeriz. Dahası partial view'da değişiklik yaparak sitedeki bütün postların görüntülenme şeklini değiştirebiliriz. Örneğin yazar adını sağ alttan sol alta alabiliriz.
Partial view'ların tıpkı normal view'larda olduğu gibi bir model verisi olur ve bu modeli düzgün bir şekilde görüntülemeye yararlar. Normal view'lardan farkı içeriğin direkt istemciye gönderilmek yerine başka bir view'ın içine katıştırılmasıdır.
Partial view'ları kullanabilmek için tag helper'ları etkinleştirmemiz gerekiyor. Şimdi _ViewImports.cshtml dosyasının içeriğini aşağıdaki gibi değiştirin:

@using WebApp.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

Burada Microsoft.AspNetCore.Mvc.TagHelpers isim alanındaki bütün tag helper sınıflarına erişim hakkı elde ediyoruz. Tag helper konusu ileride işlenecektir.

Şimdi projenizin Views/Home klasörüne _RowPartial.cshtml isminde bir view ekleyin ve içeriği şöyle olsun:

Bu partial view model olarak bir Products nesnesi almakta ve ilgili Product nesnesinin ismini ve fiyatını bir tablo satırı şeklinde görüntülemektedir.

Şimdi projenizin Views/Home klasöründe List.cshtml isimli bir view oluşturun ve ismi şöyle olsun:

Bu view model olarak bir Product ardılı almakta ve _RowPartial isimli partial view'ı kullanarak tüm ürünlerin isim ve fiyat bilgilerini tabloya eklemektedir. <partial> etiketi ile belirli bir partial view seçimi yapılmakta ve bu partial view'a model nesnesi sağlanmaktadır. <partial> etiketinin önemli seçenekleri şunlardır:
name: Partial view'ın ismi. Arama süreci normal view arama süreciyle aynıdır. Ana view'ı hangi controller render'ladıysa arama ilk önce o controller'ın klasöründe olur.
model: Partial view'ın modelini belirtmeye yarar.
for: Partial view'ın model nesnesi ilgili ifade sonucu belirlenir. Birazdan kullanımı örneklendirilecektir.
view-data: Partial view'a model dışında ekstra veri göndermeye yarar.

Bazen direkt partial view'a model nesnesi vermektense modelin bir ifade sonucu oluşturulmasını isteyebiliriz. Şimdi Views/Home klasörüne _CellPartial.cshtml isimli bir view ekleyelim ve içeriği şöyle olsun:

Bu partial view basitçe bir string almakta ve bu stringi bir tablo hücresi şeklinde sayfaya basmaktadır. Şimdi _RowPartial.cshtml dosyasını şöyle değiştirelim:

Gördüğünüz gibi bir partial view alt işlerini başka bir partial view'a delege edebiliyor. Buradaki for seçeneği partial view'ın aldığı Product nesnesindeki bir özellik çağrısıdır. Partial view aldığı bütün Product nesnesini göndermek yerine sadece Product nesnesinin Name özelliğinin değerini _CellPartial partial view'ına göndermiştir.

Partial view'lara karşı kullanılabilecek bir alternatif şablonlu temsilcilerdir ve bir şablona göre HTML üretmeye yararlar. Örnek (List.cshtml):

Burada foreach döngüsünün her bir iterasyonunda row temsilcisine ilgili Product nesnesi verilmekte ve ilgili temsilci ilgili nesneyi belirli bir şablona göre HTML'e dönüştürmektedir. Şablonun içinde @item ile belirtilen şeyler ilgili Product nesnesidir. Kimine göre bu yaklaşım yeni view oluşturmayı gerektirmediği için daha basittir ancak ilgili işlevin tekrar kullanımına zarar vermektedir. Başka bir view'ın aynı işleve ihtiyacı olduğunda kendi kod bloğunda benzer temsilci nesnesi oluşturması gerekecektir.

Daha önce de söylediğimiz gibi view'lar C# ve HTML kodu içerirler. HTML kodları direkt istemciye gönderilir; C# kodları çalıştırılır, sonucu ilgili yere basılarak istemciye gönderilir. Razor, C# ve HTML kodlarının nasıl birbirine katıştırılacağını belirleyen teknolojidir.

Razor direktifleri sadece view'larda kullanılabilir ve view'lara özel anlamları ve işlevleri vardır. Aşağıdaki tabloda en önemli direktifler verilmiştir:

Direktifler soyut belirtimler yapar. Razor'da gerçekten iş yapan ve sayfaya çıktı veren ifadeler içerik ifadeleridir. En önemli içerik ifadeleri aşağıdaki tabloda verilmiştir:

Şimdi sırasıyla bu tabloda gördüğümüz içerik ifadelerini son ikisi dışında teker teker işleyeceğiz.

Razor'da yapılabilecek en basit işlem basit bir C# ifadesinin çıktısının sayfada ilgili yere basılmasıdır. Örnek:

Bu örneğimizde model nesnesinin Name ve Price özellikleri sayfada ilgili yere basılmıştır. Eğer ilgili C# ifadesi boşluk içeriyorsa bütün ifadenin parantez içine alınması gerekmektedir. Örnek:

HTML etiketlerinin içerikleri yanında attribute değerleri de C# ifadesi olabilir. Örnek:

Örnek:

Bu örneğimizde eğer model nesnesinin fiyatı 200'den fazlaysa farklı bir içerik, 200'den azsa farklı bir içerik sayfaya verilecektir. Sayfaya verilecek içeriğin içinde de @ ile başlamak şartıyla C# ifadesi kullanılabileceğine dikkat edin. İstenirse elseif şeklinde yeni koşullar da eklenebilir. Örnek:

C# programlama dilinde bir if, else if veya else ifadesi tek satır C# kodu içeriyorsa bu içeriğin kümeli parantezler içine alınmasına gerek yoktur. Ancak Razor'da if, elseif ve else ifadelerinin karşılanması durumunda sayfaya verilecek içeriğin belirtilmesi için mutlaka küme parantezleri kullanılmalıdır. Razor'da C#'ta olduğu gibi elseif ve else ifadeleri opsiyoneldir.

C#'ta olduğu gibi daha karmaşık koşullu yapularda switch ifadesi kullanılabilir. Örnek:

C#'ta IEnumerable arayüzünü uygulamış herhangi bir nesne üzerinde foreach döngüsüyle dönülebilir. Aynısı Razor için de geçerlidir ve bir ardılın her bir elemanını sayfaya belirli bir formatta yazdırmaya yarar. Örnek:

Bu örneğimizde modelin bir Product ardılı olduğu varsayılmıştır. Örneğimiz Product ardılındaki her bir Product'ın Name ve Price özelliklerini tabloda yeni bir satırda olacak şekilde ekrana basmaktadır.

Bazen view tarafında basit bir C# ifadesinin sayfaya basılması dışında şeyler de yapmak isteyebiliriz. Örneğin değişken tanımlamaları, değişkenlere değer atanması, vs. sadece kod bloklarında yapılabilir. Daha genel bir ifadeyle sayfaya çıktı vermeyecek, mantıksal işlem yapacak bütün C# kodları için kod bloğu açmak zorundayız. Örnek:

Bu kodumuz model olarak Product ardılı alındığını varsaymaktadır. C# kod bloğunda average ve count olmak üzere iki değişken tanımlanmış, bu değişkenlerin değerleri daha sonraki HTML kodunda kullanılmıştır.

Bazen C# kodu içinde belirli bir yere salt bir metin çıktısı vermek isteyebiliriz. Çoğunlukla verilecek çıktı HTML etiketleri arasında olduğu için şimdi göreceğimiz ifadeyi kullanmaya gerek kalmaz. Ancak bazen bu ifadeyi kullanmak zorunda kalabiliriz. Örneğin daha önce yazdığımız şu kodu göz önüne alalım:

Burada tek değişen <td>'lerin içindeki ifade olmasına rağmen biz aynı <tr>, <th> ve <td>'leri tekrar tekrar yazdık. En önemlisi Name sütununu her seferinde tekrar yazdık. Bu ideal bir durum değildir, böyle bir durumda koşulu sadece verinin değiştiği yere taşımak daha mantıklıdır. Şimdi kodumuzu şöyle değiştirelim:

Diğer bir deyişle @: ifadesi manuel olarak C# modundan HTML moduna geçmeye yarar.

Bu bölümde MVC'nin sağladığı iki farklı işlevi göreceğiz. İlk olarak kullanıcının verdiği string'in geçerli bir HTML verisi olmamasını sağlamak için encode işleminin nasıl yapılacağını, ikinci olarak da JSON formatında nasıl veri üretebileceğimizi göreceğiz.

Varsayalım veritabanında depolamak için kullanıcıdan bir form kontrolü kullanarak bir string veri alıyorsunuz. Aldığınız bu verinin HTML olarak yorumlanmaması gerekir. Eğer herhangi bir encoding işlemi yapılmadan veriyi direkt veritabanına kaydederseniz aynı veriyi başka bir kişiye sunduğunuzda bu veride HTML ve dahası HTML içinde JavaScript varsa bu JavaScript kodu veriyi sunduğunuz bu kişinin bilgisayarında çalışacak ve kullanıcıya özgü özel bilgileri herhangi bir yere (örneğin saldırganın bilgisayarına) gönderebilecektir. Neyse ki bu encoding işlemi ASP.NET Core tarafından otomatik yapılmaktadır.
Şimdi projenizdeki Home controller'ına aşağıdaki action'ı ekleyin:

Burada View() metoduna verdiğimiz stringi ASP.NET Core view ismi olarak algılamasın diye object'e çevirdik. Şimdi Views/Home klasöründe Html.cshtml isimli bir view ekleyelim ve içeriği şöyle olsun:

View basitçe kendisine verilen stringi ekrana basmaktadır. Programı çalıştırıp /Home/Html path'ına talepte bulunduğunuzda View() metoduna verilen string'in doğru bir şekilde encode edildiğini ve HTML olarak algılanmadığını görürsünüz. Çoğunlukla bu istediğimiz şeydir. Ancak bazen verinin gerçekten HTML olarak algılanmasını isteyebiliriz. Bunun için Html yardımcısı üzerinden erişilen Raw() metodunu kullanırız. Şimdi Html view'ının body'sini şöyle değiştirelim:

Artık Model stringi HTML olarak algılanacak ve modelin içindeki "string" metni eğik ve <h3> biçimlendirmesine göre sayfaya basılacaktır.

MVC içinde de veriyi web servislerde yaptığımız gibi JSON'a serialize edebiliriz. Bunun yapmamızın temelde iki nedeni olabilir. İlk neden zaten sunduğumuz bir web sayfası JavaScript üzerinden sunucumuzdan yeni nesneler talep ettiğinde bunları JSON ile gönderebiliriz. İkinci neden debug amaçlıdır ve geliştirme aşamasında sorun çıktığında sorun çıkan nesnenin içeriğini görmek amaçlı nesneyi JSON'a serialize edebiliriz. Her view'ın view sınıfında Json isimli bir özellik vardır, bu özellik üzerinden Serialize() metodunu çağırarak JSON2a serialize yapabiliriz. Örneğin Home controller'ına Json isimli bir action ve bu action'a karşılık Json.cshtml isimli bir view ekleyelim. Action şöyle olsun:

View da şöyle olsun:

Bu örneğimiz debug amaçlıdır ve ilgili nesnenin JSON karşılığını tarayıcı ekranında göstermektedir.

Bu bölüm temelleri inşa etmektedir. Bu bölümde temel anlamda ASP.NET Core’un nasıl çalıştığını göreceğiz. MVC ve Razor Pages gibi daha üst framework’lar burada öğreneceğimiz temeller üzerine kuruludur.

Bir resim bir cümleye bedeldir derler. O yüzden aşağıdaki şekli inceleyelim.

Burada MW ile gösterilenler middleware’lerdir. Her bir middleware bir program parçasıdır, kendisine gelen talebi (request) alır ve cevaba (response) bir şeyler yazar. Her bir middleware hem request’i hem response’u değiştirebilir. Her bir middleware’in bir geliş yolu vardır, bir de dönüş yolu vardır. ASP.NET Core’da bütün üst seviye işlemler request pipeline’a koyulan middleware’ler vasıtasıyla yapılır. Kendi middleware’lerimizi de yazıp request pipeline’a koyabiliriz.
ASP.NET Core’a bir talep geldiğinde ASP.NET Core bir nesne oluşturur. Bu nesnenin içinde request ve response vardır. İşte middleware’ler arasında dönen şey bu nesnedir. Her middleware response'a yazmaz. Bazı middleware’ler diğerlerine yardımcı olmak için oradadır. Eğer hiçbir middleware gelen request'e karşılı response'a bir şeyler yazmazsa sonuçta geriye HTTP 404 Not Found cevabı döndürülür.
Başka bir bakış açısına göre middleware'leri birbirini çağıran fonksiyonlar olarak düşünebiliriz. Örneğin aşağıdaki kodu inceleyin:

MW1(request,response)
{
    // MW1'in geliş yolu
    MW2(request,response);
    // MW1'in dönüş yolu
}
 MW2(request,response)
{
    // MW2'in geliş yolu
    MW3(request,response);
    // MW2'in dönüş yolu
}
 MW3(request,response)
{
    // MW3'ün geliş ve dönüş yolu
}

Servisler middleware'lere dışarıdan enjekte edilen canlı .NET nesneleridir. Bazı servisler kütüphane mantığıyla sık yapılan işleri daha kolay yapmaya odaklanmışken bazı servisler middleware'ler arası koordinasyon sağlar. Servisler middlware'lere dependency injection dediğimiz bir teknikle enjekte edilir. Dependency injection konusu kitabın ileriki bölümlerinde detaylı bir şekilde işlenecektir. Servisleri de işin içine kattığımızda request pipeline şöyle gözükür:

Burada servis1 MW1 ve MW2 tarafından, servis2 MW2 ve MW3 tarafından ortak kullanılmaktayken servis3 servisi yalnızca MW3 middleware'i tarafından kullanılmaktadır.

Program.cs dosyası bir ASP.NET Core uygulamasının başladığı yerdir. Konsol uygulamalarındaki Main() metodu gibi düşünebiliriz. Bu dosya sunucu çalıştığı zaman çalışacak kodları içerir. Temel yapılandırma ayarlarını, servis ayağa kaldırmalarını ve request pipeline’a middleware eklemelerini içerir. Bu dosya bir ASP.NET Core projesinde top level statement’leri içerebilecek tek dosyadır, Visual Studio tarafından "ASP.NET Core Empty" şablonuyla bir web uygulaması oluşturulduğunda oluşan Program.cs dosyasının içeriği şöyle olacaktır:

Birinci satırda WebApplication sınıfının CreateBuilder metodu çağrılmaktadır ve sonuç WebApplicationBuilder tipindeki builder değişkenine atanmaktadır. Burada sunucunun ayağa kalkması için temel yapılandırmalar yapılmaktadır. Uygulamaya servis eklemeler builder değişkeni üzerinden olur.
İkinci satırda, oluşan builder nesnesi üzerinden Build metodu çağrılmaktadır ve sonuç WebApplication tipindeki app değişkenine atanmaktadır. Burada bir önceki satırda yapılan yapılandırma ayarları gerçekleştirilmektedir. Ayrıca oluşan app değişkeni aracılığıyla middleware’ler request pipeline’a eklenmektedir.
Üçüncü satır bir rota tanımını içermektedir. Bu rota, kök dizine gelen istekleri response'a “Merhaba Dünya!” yazan lambda ifadesi şeklinde tanımlanmış bir endpoint'e eşlemektedir. Endpoint'ler ve routing mekanizması kitabın ilerleyen bölümlerinde işlenecektir. MapGet() IEndPointRouteBuilder arayüzüne ait bir metottur. Bu arayüz WebApplication sınıfı tarafından da kullanılmaktadır. Dolayısıyla MapGet() metodu bir WebApplication nesnesi üzerinden de çağrılabilmektedir.
Son satır sunucuyu çalıştırmaktadır.

Çoğunlukla Microsoft tarafından oluşturulan hazır middleware'leri request pipeline'a ekleriz. Ancak istersek kendi middleware'lerimizi de request pipeline'a ekleme imkanımız vardır. Bu bölümde sık sık kendi middleware'lerimizi request pipeline'a ekleme ihtiyacı duyacağımızdan değil, request pipeline'ı ve çalışmasını daha iyi anlamak için kendi middleware'lerimizi oluşturup request pipeline'a ekleyeceğiz.
İlk göreceğimiz middleware oluşturma ve request pipeline'a ekleme yöntemi Use() metodunu kullanmaktır. Örnek (Program.cs dosyası):

Use() metodunun içindeki labmda ifadesinin ilk parametresi (context) HttpContext tipindedir. Bu HttpContext nesnesi üzerinden gelen request'e ulaşabilir ve response'a yazabiliriz. HttpContext sınıfı Microsoft.AspNetCore.Http isim alanı içinde tanımlıdır ve aşağıdaki üyeleri içerir:
Connection: Bu özellik HTTP request'inin altyapısını sağlayan bağlantı hakkında bilgi verir. Örneğin bağlanan (istemci) ve host bilgisayarın IP adresleri, port numaraları vs. Geri dönüş tipi ConnectionInfo'dur.
Request: Biraz önce örnek kullanımını görmüştük. Gelen request hakkında bilgi verir.
RequestServices: Servislere erişim sağlar.
Response: Biraz önce örnek kullanımını görmüştük.Gelen request'e karşılık olarak verilecek Response'u oluşturmaya yarar.
Session: Mevcut oturum hakkında bilgi verir.
User: Request'i yapan kullanıcı hakkında bilgi verir.
Features: Request özelliklerine erişim sağlar. Request yönetiminin daha düşük seviye yönleriye ilgilenir.
HttpContext sınıfının Request özelliğiyle erişilen HttpRequest sınıfının önemli üyeleri şunlardır:
Body: Request'in gövdesini döndürür.
ContentLength: Request'in ContentLength başlığının değerini döndürür.
ContentType: Request'in ContentType başlığının değerini döndürür.
Cookies: Request'in içinde cookie'ler varsa onları döndürür.
Form: Request'in body'sinin form karşılığını döndürür.
Headers: Request'in başlıklarını döndürür.
IsHttps: Gelen request HTTPS bağlantısı üzerinden yapılmışsa true döndürür.
Method: Request'in verb'ünü döndürür. (GET, POST, vs.)
Path: Request URL'sinin path kısmını döndürür.
Query: Request URL'sinin query string kısmını döndürür. (anahtar-değer çiftleri şeklinde)
HttpContext sınıfının Response özelliğiyle erişilen HttpResponse sınıfının önemli üyeleri şunlardır:
ContentLength: Response'un ContentLength başlığını ayarlar.
ContentType: Response'un ContentType başlığını ayarlar.
Cookies: İstemciye cookie gönderilmesini sağlar.
HasStarted: Önemli bir özelliktir. Eğer true döndürmüşse sunucu response'un başlıklarını istemciye göndermeye başlamıştır. Bu noktadan sonra response'un durum kodu ve başlıkları değiştirilemez.
Headers: Response'un başlıklarını oluşturmaya/değiştirmeye yarar.
StatusCode: Response'un durum kodunu ayarlamaya yarar. (404, vs.)
WriteAsync(data): Response'un gövdesine string şeklinde veri yazar. 
Redirect(url): Başka bir URL'ye yönlendirme yapmaya yarar.
Yukarıdaki örneğimizde HttpContext nesnesi üzerinden request'e ve response'a erişilmektedir. Eğer request bir GET request'i ise ve "custom" query string'i varsa ve değeri "true" ise response'a "Custom Middleware" stringini yazmakta ve akışı bir sonraki middleware'e devretmektedir.
Yukarıdaki koddaki lambda ifadesinin ikinci parametresi next'tir ve sıradaki middleware'i çağırmaya yarar. Dikkat ettiuseniz next() metodu çağrılırken argüman verilmemiştir. Çünkü ASP.NET Core next() metoduna argümanları arkaplanda kendisi verir.
Kendi belirtiğimiz middleware ve request pipeline'daki diğer middleware'ler asenkron çalışır. Bu yüzden kendi yazdığımız middleware'i async ile işaretledik, ayrıca sıradaki middleware'i de await ile çağırdık.

Yukarıdaki örnekte lambda ifadesi kullanarak kendi middleware'imizi oluşturduk, ama bu yaklaşım gereksiz yere Program.cs dosyamızı kalabalıklaştıracak ve middleware'in yeniden kullanılabilirliğine zarar verecektir. Şimdi sınıf tabanlı bir middleware yazalım. Projenize içeriği aşağıdaki gibi olan yeni bir sınıf dosyası ekleyin.

Sınıf tabanlı bir middleware yazdığımız zaman sıradaki middleware'i sınıfımızda RequestDelegate tipinde bir field olarak tutarız. Invoke() metodunda parametre olarak HttpContext nesnesini alır ve üzerinde işlem yaparız. Yapıcı metotta request pipeline'daki bir sonraki middleware'i temsil eden metodu parametre olarak alır ve aynı sınıftaki field'a atarız. Invoke metodu içinde akışı sıradaki middleware'e devretmek istiyorsak RequestDelegate temsilcisi türünden olan ilgili field'ı HttpContext değişkenini parametre olarak vererek çağırırız. Program.cs dosyasında bu middleware kullanıldığı zaman önce bu sınıf türünden nesne oluşturulur, nesne oluşturulurken request pipeline'daki bir sonraki metot yapıcı metot parametresi olarak verilir. Daha sonra sunucuya her talep geldiğinde bu nesne üzerinden Invoke metodu çağrılır. Her request'te bu Invoke() metodu çağrılırken geçerli context'i temsil eden ve içinde HttpRequest ve HttpResponse nesnelerini barındıran HttpContext nesnesi bu metoda parametre olarak verilir. Sınıf tabanlı middleware'ler request pipeline'a şöyle eklenir:

Gördüğünüz gibi sınıf tabanlı middleware'ı request pipeline'a eklemek için middleware'i eklemek istediğimiz yerde UseMiddleware() metodunu çağırmalı ve tip parametresine middleware sınıfımızı koymalıyız.
Program.cs dosyasındaki kodlar sunucu ayağa kalkarken yalnızca bir kez çalıştırılır. ASP.NET Core Program.cs dosyasındaki middleware eklemelerine bakarak bir request pipeline inşa eder. Pipeline inşa edildikten sonra her gelen talep bu pipeline'dan geçer. Middleware'leri temsil eden metotları çağırmek için gerekli olabilecek HttpContext ve RequestDelegate nesnelerini ASP.NET Core otomatik sağlar.  

Daha önce de söylediğimiz gibi middleware'lerin bir geliş kısımları, bir de geri dönüş kısımları vardır. Biz şimdiye kadar middleware'lerin hep geliş kısımlarına bir şeyler yazdık, geri dönüş kısımlarına bir şey yazmadık. Şimdi geri dönüş kısımlarına da bir şeyler yazacağız. Örnek:

Program.cs dosyasındaki ilgili yerine eklenen bu middleware akışı ilk önce sıradaki middleware'e yönlendirmekte ve sadece dönüş yolunda response'a yazmaktadır. Middleware'ler sıradaki middleware'e yönlendirme yapmadan önc

Daha önceki dersimizde FormController sınıfının SubmitForm() action metodu şöyleydi:

Koddan da göreceğiniz üzere SubmitForm action'ı form verilerine ulaşmak için ana sınıftan devralınan Request özelliği üzerinden Form özelliğini çağırıyor. Elbetteki bu şekilde direkt form verilerini işleyebilirsiniz. Benzer şekilde rota değişkenlerine ve query string değerlerine de daha önce gördüğümüz şekilde direkt erişebiliriz. Ancak bu yol uğraştırıcı, hataya açık, bakımı zor, okunabilirliği düşük kod üretmemize neden olacaktır. Daha şık bir yol model binding'i kullanmaktır. Model binding, gelen request'i inceler, request'teki bilgilerden C# değişkenini oluşturur ve action metotta veya Razor sayfası handler'ında söz konusu değişkene direkt erişmemize imkan sağlar. Söz konusu request verisine ulaşmak için action'da ve Razor sayfası handler'ında aynı isimli bir parametre tanımlarız.
Model binding, action ve Razor sayfası handler'ında belirli bir isimli bir parametre gördüğü zaman aynı isimli parametreyi sırasıyla request'in şu kısımlarında arar:

Form verisi
Request'in gövdesi (sadece ApiController attribute'u ile işaretlenmiş controller'larda)
Rota değişkenleri
Query string

Model binding sürecinde basit tipler ve karmaşık tipler bağlanabilir. Bu bölümde basit tiplerin nasıl bağlanacağı anlatılacaktır. Model binding sürecinde parse edilebilecek basit tipler nümerik tipler (int, float, vb.), bool, tarihler ve string olabilir. Basit veri tiplerinin bağlanması sürecinde request'ten tek bir değer alınır, bu değer C#'taki ilgili temel tipe dönüştürülür. Şimdi yukarıdaki SubmitForm() metodunu şöyle değiştirelim:

Artık foreach döngüsüyle form kontrollerinin üzerinde dönmeye gerek kalmadı. İstediğimiz belirli bir isimli form kontrolünün değerine direkt erişebiliyoruz. Bu form kontrollerinin değerleri metodumuza direkt name ve price isimli değişkenler olarak geliyor, tür dönüşümü model binding süreci tarafından otomatik yapılıyor.

Razor sayfalarında da basit veri tiplerinin bağlanması benzer şekilde yapılır. Ancak dikkat etmemiz gerekir ki Razor sayfalarının görünüm kısımları model olarak PageModel nesnesi alır. Razor sayfasının görünüm kısmındaki form kontrolleri asıl modele aşağıdaki şekilde bağlanır:

Kodu bu şekilde bıraktığımızda form kontrollerinin isimleri "Product.Name" ve "Product.Price" olacaktır ve mevcut haliyle bu form kontrollerinin değerlerine Razor sayfasının handler metodundan erişemezsiniz. Çünkü C#'ta nokta işaretinin özel anlamı vardır. Bu sorundan kurtulmak için Razor sayfasının görünüm kısmındaki form kontrollerini şöyle değiştirmeliyiz:

Artık form kontrollerinin değerlerine name ve price değişkenleri üzerinden Razor sayfasının handler metodunda erişebileceğiz. Şimdi aynı Razor sayfasının kod kısmındaki form verilerini işleyecek handler metodu şöyle değiştirelim.

Model binding, bir action veya handler metodun istediği isimde bir değeri request'te bulamazsa hata döndürmez, action veya handler'ı ilgili parametre tipinin varsayılan değeriyle çalıştırır. Varsayılan değerler sayısal tipler için 0, bool için false, referans tipleri için null'dur. Çoğunlukla model binding'in bu varsayılan davranışı istediğimiz bir şey değildir ve istenmeyen sonuçlara yol açar. Bu sorunun üç şekilde üstesinden gelebiliriz.

Örnek:

Bu action model binding mekanizmasından id isimli bir değer alamadığında id parametresi için 1 değerini kullanmaktadır.

Eğer model binding ilgili değeri bir rota değişkeninden alacaksa rota belirtiminde varsayılan değerli segment kullanılması mantıklı olabilir. Bu sayede aynı rota segmentine birden fazla action veya handler erişecekse her action veya handler'da aynı varsayılan değeri belirtme zahmetinden kurtuluruz. Örnek (Program.cs dosyası):

veya bir Razor sayfasının başında

Üçüncü bir yol olarak metot gövdesinde, varsayılan değerli bir parametre aldığında yapacağı şeyi kendisi belirtebilir. Örnek:

Bu action id için 0 değerini aldığı durumla kendisi baş etmektedir. LINQ'teki FirstOrDefaultAsync() metodu eğer istenilen öge veritabanında bulunamadıysa geriye Product tipinin varsayılan değeri olan null'u döndürür, dolayısıyla view'a null değer gider. Form tag helper'ları modelin değerinin null olması durumunda form kontrollerine bir şey yazmaz.
Bazen gerçekten model binding mekanizması request'ten 0 değerini alabilir. Örneğin kullanıcı bir rota değişkenine 0 yazabilir veya form kontrolüne 0 değerini girebilir. Böyle bir durumda kullanıcının 0 verdiği durumla değer vermediği durumu ayırt etmek için nullable tipler kullanılabilir. Örnek:

Bu örneğimizde model binding mekanizması id için bir değer bulamazsa null değerini id değişkenine yazacaktır. Bu sayede kullanıcının id için bilinçli bir şekilde 0 verdiği durumla değer vermediği durum ayırt edilebilecektir. LINQ sorgusu da güncellenmiştir. LINQ sorgusuna göre id değeri verilmemişse veritabanındaki ilk kayıt, verilmişse belirtilen id'li kayıt veritabanından çekilecektir. Eğer belirtilen id'li kayıt veritabanında yoksa null değer view'a gönderilecektir.

Model binding basit tipler için kullanılabilir. Ancak model binding'in asıl faydası karmaşık tiplerin bağlanmasında ortaya çıkmaktadır. Karmaşık tipin bağlanması sürecinde request'teki birden fazla veriden tek bir karmaşık tip nesnesi üretilir. Request'teki her bir veri karmaşık tipin aynı isimli public bir özelliğine eşlenir. Örnek:

Örneğimizde SubmitForm action'ına verilen Product nesnesi model binding süreci tarafından üretilmektedir. Gelen request'teki Name ve Price isimli form verileri Product nesnesinin Name ve Price özelliklerinin değerleri olmaktadır. Model binding sürecinin çalışması için request'in ilgili tipin her bir public özelliğine veri sağlamasına gerek yoktur. Request'te verisi olmayan özellikler varsayılan değerine atanır.

Kuşkusuz Razor sayfalarındaki handler metotlar da parametre yoluyla karmaşık tip nesnesi alabilir. Örnek:

Kuşkusuz bu kod çalışacaktır. Ancak Razor sayfalarında çoğunlukla asıl modeli temsil eden ve PageModel sınıfında bir özellik olarak tanımlanan modeli kullanırız. Yukarıdaki örneğimizde PageModel sınıfında zaten üzerinde çalıştığımız Product tipinde bir özellik vardır. Bu kodu şöyle değiştirsek daha güzel olacaktır:

Bu örneğimizde OnPost() handler metodu request'teki veriye aynı sınıftaki Product özelliği aracılığıyla erişmektedir. Bir Razor sayfasına her gelen request'te yeni bir model sınıfı nesnesi oluşturulur. Bu model sınıfı nesnesi oluşturulurken model sınıfının BindProperty attribute'u ile işaretlenmiş özelliğine request'teki veriler aktarılır. Daha sonra handler metot tarafından model binding süreci tarafından oluşturulmuş bu özelliğe erişilebilir. Başka bir örnek:

Gördüğünüz gibi BindProperty attribute'u ile birden fazla özelliği işaretleyebiliyoruz, bütün bu özelliklerin değerleri request'ten sağlanacaktır. Özelliğe bağlama tekniği controller'larda da kullanılabilir. Örnek:

Burada Index action'ı form kontrollerini gösterecek olan action'dır. Index action'ının render'ladığı Index view'ı model olarak string kabul etmekte ve form kontrollerini içermektedir. İlk seferinde form kontrolleri render'lanacağı zaman Index view'ına veri gitmemektedir, böyle bir durumda view'da model nesnesinin gösterileceği yer boş kalacaktır. Index view'ında form kontrolleri doldurulup submit butonuna basıldığında  <form> etiketinin asp-action seçeneği ile belirtilen VeriAl action'ı form verilerini Name ve Price özellikleri aracılığıyla alacak ve aynı Index view'ına model nesnesi olarak gönderecektir. Bu durumda Index view'ında model nesnesinin içeriğinin yazılacağı yer dolu olarak gelecektir.
Varsayılan durumda özellik bazlı model bağlama yalnızca POST request'lerinde kulanılabilir. Örneğin yukarıdaki GET request'iyle erişilen Index action'ı, gelen request'te Name ve Price isimli veriler olsa bile model binding ile özelliklere değer ataması yapılmadığı için bu verilere özellikler üzerinden erişemeyecektir. Bu, controller'daki her action veya Razor sayfasındaki her handler metot çağrısının model binding gibi maliyetli olabilecek bir süreç başlatmaması bakımından faydalıdır. Ancak bazen yine de GET request'lerinde de özellik bazlı model binding'i etkinleştirmek isteyebiliriz. Bunun için tek yapmamız gereken özelliğe uygulanan BindProperty attribute'unun SupportsGet argümanını true yapmaktır. Örnek:

Artık Index action'ı da özelliklere bağlanan request verilerine erişebildiği için aldığı söz konusu verileri kendi view'ına gönderebilmektedir. Index action'ına veriler query string halinde gönderilebilir.
Bir controller veya Razor sayfası model sınıfındaki bütün public özelliklerin model binding sürecine dahil edilmesini istiyorsak direkt controller sınıfı veya Razor sayfası model sınıfı BindProperties attribute'u ile işaretlenebilir. Bu sayede ilgili controller veya Razor model sınıfında bütün public özellikleri BindProperty attribute'u ile işaretleme zahmetinden kurtulmuş oluruz.
Eğer BindProperties attribute'u ile işaretlenmiş bir controller veya Razor model sınıfındaki bir özelliği model binding sürecinden çıkarmak istiyorsak ilgili özellik BindNever attribute'u ile işaretlenir. BindNever attribute'unun bir kullanımı da karmaşık tipe bağlama esnasında karmaşık tipin belirli bir özelliğinin model binding sürecine dahil edilmemesidir. Örnek:

Bu Product modelinin bir controller'da şöyle kullanıldığını varsayalım:

Örneğimizde request'de Id isimli bir veri olsa bile bu veri Product nesnesinin üretiminde kullanılmayacaktır. 

Kuşkusuz bir karmaşık tipin belirli bir özelliğinin tipi de karmaşık olabilir. Şimdi aşağıdaki gibi Product model sınıfına yeni bir özellik ekleyelim:

Şimdi Category isimli yeni bir model sınıfı oluşturalım ve içeriği şöyle olsun:

Şimdi daha önceki formu render'layan view'ı şöyle değiştirelim:

Home controller'ındaki form view'ını render'layacak Index action'ını ve form verilerini işleyecek SubmitForm action'ını şöyle değiştirelim:

Şimdi SubmitForm action'ının render'layacağı view'ı şöyle oluşturalım:

Programı çalıştırıp Index view'ındaki forma bir şey

Oturum yönetimi de bir önceki derste gördüğümüz cookie'lerle aynı işi yapar. Aynı istemci tarafından gönderilen ardışık istekleri birbiriyle ilişkilendirir. Ancak cookie yaklaşımının sorunu oturumla ilgili bütün verilerin sürekli sunucu ve istemci arasında gidip gelmesidir. Bir önceki dersteki örnekte tarayıcınızla cookie değişkenlerini incelerseniz cookie'lerin değerlerini görebilirsiniz. Halbuki buna gerek yoktur. İstemcinin kimliğini tespit etmek için tek bir cookie kullanılması, onun dışındaki kullanıcının oturumla ilgili bütün verilerinin sunucu tarafında tutulması daha mantıklıdır. Bu hem gereksiz veri alışverişini engeller hem de bir güvenlik zaafiyetini ortadan kaldırır. Bütün oturum verilerinin istemci ve sunucu arasında gidip geldiği durumda istemci bu cookie'lere istediği gibi müdahale edebilir. Örneğin kullanıcının bir sayfaya erişme yetkisinin olup olmadığı bilgisi cookie'ler üzerinde tutuluyorsa istemci bu cookie'leri değiştirebildiği için yetkisi olmayan bir sayfayı görebilir.
Oturum yönetimi kullanıldığı zaman istemci ve sunucu arasında gidip gelen şey tek bir cookie'dir. Bu cookie kullanıcıyı diğerlerinden ayırt etmeye yarar ve esasında uzunca bir sayıdır. Şimdi şunu merak edebilirisiniz, sunucuya gönderdiğim cookie'de başka bir kullanıcının kimliğini tespit etmek için kullanılan sayıyı göndersem sunucuyu kandırabilir miyim? Bu çok çok düşük bir ihtimaldir ve brute-force tekniğiyle rastgele birisi için kullanılan bir sayıyı denk getirme ihtimaliniz çok düşüktür. Bunun yerine klasik usulde kullanıcı adı ve şifre denemek daha mantıklıdır. Ayrıca çoğu sunucu aynı istemciden kısa aralıklarla çok fazla sayıda gelen talepleri tespit eder ve bloklar (veya captcha doğrulaması ister).
Oturum yönetiminden bir middleware sorumludur. Kimlik tespiti için kullanılan cookie'yi her response'ta response'a ekler. Her request'te cookie'yi inceler, cookie'deki kimlik tespiti için kullanılan sayıyı bulur, daha sonra bu sayıya karşılık gelen ve sunucu tarafında saklanan kullanıcı verilerini diğer middleware ve endpoint'ler tarafından kolayca erişilebilecek şekilde tutar.

Örnek (Program.cs dosyası):

Oturum yönetiminde cookie yaklaşımından farklı olarak sunucu tarafında bir şeyler saklamamız gerekiyor. İşte

satırında oturumla ilgili verilerin RAM bellekte saklanacağı belirtiliyor. Bu en basit yaklaşımdır, ancak sunucu kapanırsa veya yeniden başlatılırsa depolanan oturumla ilgili bilgilerin kaybolacağı anlamına gelir. Bunun gibi başka servisler de vardır ve oturum verilerini başka yerlerde saklamaya yararlar. Bunlar:
AddDistributedMemoryCache(): Oturum verilerini RAM bellekte depolar.
AddDistributedSqlServerCache(): Oturum verilerini SQL Server'da saklar.
AddStackExchangeRedisCache(): Oturum verilerini Redis isimli veritabanı yönetim sisteminde saklar.
Bir sonraki adım oturum middleware'inin yapılandırılmasıdır ve aşağıdaki kodlarla olur:

Oturum middleware'inin ayar sınıfı SessionOptions'tır ve önemli özellikleri aşağıda belirtilmiştir:
Cookie: Oturum cookie'sinin özelliklerini almaya/değiştirmeye yarar.
IdleTimeout: Oturumun atıl kalma süresini belirtmeye yarar. Kullanıcı belirtilen süre boyunca sunucuya talepte bulunmazsa oturum cookie'si silinir ve kullanıcının yeniden oturum açması gerekir.
Cookie özelliğinin oturum cookie'sinin özelliklerini değiştirmeye yaradığını söylemiştik. Bu özellik CookieBuilder tipinde bir nesne döndürür. Bu sınıfın önemli özellikleri şunlardır:
HttpOnly: Eğer değeri true yapılırsa yalnızca HTTP protokolü üzerinden gelen isteklerde oturum değişkenleri korunur. Aynı istemci tarafından gelse bile JavaScript tarafından istek gönderildiği zaman oturum değişkenleri korunmaz. Örneğin Ajax teknolojisi kullanılarak JavaScript üzerinden arkaplanda sunucunun veritabanından birtakım verilerin çekilmeye çalışıldığı durumda kimlik doğrulanamayacağı için başarısız olunur. Varsayılanı true'dur.
IsEssential: İlgili cookie'nin esas bir cookie olduğunu belrtir. Varsayılanı false'tur.
SecurityPolicy: Cookie'nin güvenlik politikasını belirtir. CookieSecurityPolicy enumu aracılığıyla değer verilir. Bu enumdaki sözcükler şunlardır:

Always: Cookie sadece HTTPS bağlantılarında gönderilir. HTTP bağlantılarında cookie kullanılamaz.
SameAsRequest: İlk request HTTPS üzerinden yapılmışsa diğer iletişimin de HTTPS üzerinden yapılmasını gerektirir. Aksi durumda cookie kullanılamaz.
None: Herhangi bir kısıtlama yapılmaz. Cookie hem HTTP hem de HTTPS bağlantılarda kullanılabilir. Varsayılanı None'dır.
Örneğimize geri dönersek örneğimizdeki oturum cookie'si için yapılan tek ayar cookie'nin esas bir cookie olduğunun belirtilmesidir. Son olarak yapılan işlem oturum middleware'inin request pipeline'a eklenmesidir. Oturum middleware'inin request pipeline'a eklenmesi sayesinde kullanıcı ilk kez sunucuya talepte bulunduğunda istemciye kullanıcıyı ayırt etmeye yarayan cookie gönderilir, daha sonra cookie gönderdiği her bir kullanıcı için RAM bellekte tablo tutar. Diğer middleware ve endpoint'ler bu tabloya yazdığında tabloyu günceller, her gelen request'te request'i gönderen kullanıcının tablosunda veriler varsa request'i temsil eden HttpContext nesnesinin Session özelliğini bu tablodaki değerlerle doldurur.
Diğer middleware ve endpoint'lerin bu tabloya yazıp okumasına imkan tanır.

Şimdiye kadar bir oturum başlattık ama oturuma yazıp okumadık. Oturum middleware'i sayesinde oturuma yazıp okumak çok kolay olacak. Oturuma yazıp okumak HttpContext nesnesinin Session özelliği aracılığıyla olur. Session özelliği ISession arayüzünü uygulamış bir sınıf nesnesi döndürür. ISession arayüzünün önemli üyeleri şunlardır:
Clear(): Oturumu siler.
CommitAsync(): Oturuma yazılmak üzere bekleyen değişiklikleri oturuma yazar.
GetString(key): key anahtarıyla temsil edilen oturum değişkenini string olarak döndürür.
GetInt32(key): key anahtarıyla temsil edilen oturum değişkenini int olarak döndürü.
Id: Geçerli oturumun id'sini döndürür.
IsAvailable: Oturum verisi okunmaya müsaitse true döndürür.
Keys: Oturum değişkenlerinin anahtarlarını döndürür.
Remove(key): İlgili anahtarla temsil edilen oturum değişkenini siler.
SetString(key,val): key anahtarıyla belirtilen oturum değişkeninin değerini string olarak belirtir.
SetInt32(key,val): key anahtarıyla belirtilen oturum değişkeninin değerini int olarak belirtir.
string ve int olmak üzere iki tip oturum değişkeni saklanabilir. Oturum değişkenlerine string tipindeki anahtarlar vasıtasıyla erişilir ve yazılır. Örnek (Program.cs dosyası):

Bu kod tahmin ettiğiniz işi yapmaktadır. "/session" path'ına gelen her request'te oturumda tutulan counter1 ve counter2 isimli oturum değişkenlerini 1 artırmakta ve response'a yazmaktadır. İlk gelen request'te ilgili oturum değişkenleri olmayacağı için başlangıç değerini 0 almakta ve 1 artırmaktadır. Oturum değişkenlerine yapılacak bütün değişiklikler response'a yazmadan önce yapılmalıdır. Ayrıca oturum middleware'i request pipeline'a eklenmeden HttpContext nesnesi üzerinden Session özelliği çağrılmamalıdır. Çünkü bu özelliği dolduracak middleware oturum middleware'idir.
Yukarıdaki programı çalıştırdığımızda her sayfayı yenilediğimizde counter değerlerinin arttığını göreceğiz. Daha da güzeli tarayıcı üzerinden cookie'lere baktığınızda "AspNetCore.Session" isminde tek bir cookie göreceksiniz. Ben de bu cookie'nin değeri CfDJ8EGa2GuHVCVBpx5dzK3LgefaxsctRjL6mDzr+4woSaNgb5vFsUJpKQ9Z9frx2LT2n3oV/UBwTjavLX4sdEFMPCpZsvn9czEDZzQRVscXini3rwCl5t9fbZjNueJ+rz0yu8P+p+DJJOGT/zSFQU4c0hpWKwP1Zlqe+wYCxOF2I3RN idi. Teyit edeceğiniz üzere bir kişinin hasbelkader bu değeri denk getirmesi düşük bir ihtimal gibi gözüküyor.

Razor Pages (Razor Sayfaları) MVC benzeri bir web geliştirme framework'udur. MVC'yle aralarındaki farkları bir tabloda vermek daha doğru olacaktır.

Bu tablo daha da uzatılabilir. Kısaca Razor Pages eski Web Forms ruhunu yakalamayı amaçlamaktadır. MVC, Web'in arkaplandaki çalışma mantığına daha uygundur, Razor Pages ise kullanıcıların Web'i kullanma şekline daha uygun olduğundan daha sezgiseldir. Sonuçta kullanıcılar web sitelerini birer sayfa yığını olarak görmektedir. Geliştirdiğiniz web sitesini de sayfa sayfa geliştirmek çok da mantıksız görünmüyor.
Razor Pages'ta uygulamamızı sayfa sayfa geliştiririz. Her bir sayfanın bir görünüm, bir de kod kısmı vardır. Sayfanın kod kısmında sayfaya gelen GET taleplerini karşılayacak ve sonucunda görünüm kısmını render'layacak handler metot olduğu gibi POST, PUT, vs. diğer HTTP metotlarını karşılayan handler metotlar da olabilir. Sayfaya talep gelmesi durumunda önce sayfanın kod kısmı, ardından görünüm kısmı çalışır. Görünüm kısmından kod kısmında tanımlanan özelliklere erişilebilir. Razor Pages'ı her controller'ın tek bir action içerdiği, action'ın da yalnızca kendi view'ını renderladığı, view'a model nesnesi olarak da kendini verdiği versiyonu olarak düşünebiliriz. Bu anlatımdan MVC ve Razor Pages'ın birbirine çok benzediği sonucu çıkarabilsek de uygulama geliştirme deneyimi açısından oldukça farklıdırlar. MVC ve Razor Pages beraber aynı projede aynı projenin farklı kısımlarını geliştirmek üzere kullanılabilir. Uygulamanın daha karmaşık ve geliştirmeye açık kısımları MVC ile geliştirilirken ve daha basit, daha stabil ve kendi kendine yeten (self-contained) kısımları Razor Pages ile geliştirilebilir.

Razor Pages, Program.cs dosyasına iki satır kod ekleyerek etkinleştirilebilir:

Program.cs dosyamızdaki yeni olan iki satır builder.Services.AddRazorPages(); ve app.MapRazorPages(); satırlarıdır. İlk komut Razor Pages tarafından kullanılan servisi ayağa kaldırır. İkinci komut rota yapılandırmasına Razor Pages'ı ekler.

Razor sayfaları proje klasörünün Pages klasöründe oluşturulur. Bu klasörde yeni bir Razor sayfası oluşturun ve ismini Index.cshtml verin, içeriği şöyle olsun:

@page direktifi ilgili dosyanın bir Razor sayfası olduğunu belirtir. Model olarak kendinin kod kısmı olan IndexModel sınıfını kullanmak zorundadır. Bu sayfaya bir talep geldiğinde önce IndexModel tipinde nesne oluşturulur, nesne oluşturulurken varsa bağımlılıklar çözülür, bu nesne üzerinden OnGetAsync() metodu çalıştırılır. OnGetAsync() metodunun aldığı parametre model binding süreciyle metodun içine enjekte edilir. Metot bu enjekte edilen değeri kullanarak Product özelliğini ayarlamaktadır. Daha sonra görünüm kısmında bu Product özelliğine erişilmekte ve Name özelliğinin değeri ekrana basılmaktadır.
Varsayılan durumda Razor sayfaları Pages klasöründedir. Bu klasördeki dosyalara kullanıcı direkt dosya adını vererek talepte bulunabilir. Örneğin Index.cshtml dosyasını çalıştırmak için http://localhost:5000/Index adresine talepte bulunmak yeterlidir. Eğer dosya Pages klasöründe Deneme alt klasöründe olsaydı dosyaya erişim için gerekli link http://localhost:5000/Deneme/Index olacaktı.

Bu bölümde bir Razor sayfasının görünüm kısmını işleyeceğiz. Bir Razor sayfasının görünüm kısmı da esasında bir view'dır ve MVC'deki view'larla hemen hemen aynı özelliklere sahiptir. Sadece daha önce gödüğümüz @page direktifi gibi özel direktifleri ve sadece kendi model sınıfını model olarak belirtebilme gibi kısıtları vardır.
Layout'lar ve partial view'lar Razor sayfalarında da MVC'yle aynı mantıkta çalışır. Tek fark geleneksel olarak Layout ve partial view'ların Views/Shared klasörü yerine Pages/Shared klasöründe tanımlanmasıdır
Esasında layout'lar ve partial view'lar Pages klasöründe ve bu klasörün herhangi bir alt klasöründe tanımlanabilir. Razor Pages'ta view arama süreci önce ilgili klasör, sonra üst klasörler, sonra Shared klasörü, sonra MVC'deki Shared klasörüdür. Örneğin Pages/Deneme klasöründeki bir Razor sayfası bir partial view'ı kullanmak isterse ilgili partial view önce Pages/Deneme klasöründe, sonra Pages klasöründe, sonra Pages/Shared klasöründe, en son Views/Shared klasöründe aranır. Bu da MVC tarafında tanımlanan layout ve partial view'ların Razor Pages tarafında da kullanılabileceği anlamına gelir.
Bir Razor sayfasının bir layout'u kullanması için tıpkı MVC'de olduğu gibi Razor sayfasının görünüm kısmının başında Layout özelliğine değer ataması yeterlidir. Razor sayfalarında da _ViewImports.cshtml ve _ViewStart.cshtml dosyaları tanımlanabilir. Bu iki dosya da Pages klasörüne konulmalıdır ve MVC'dekiyle aynı işleve sahiptir. Bütün Razor sayfalarının aynı layout'u kullanmasını sağlamak için _ViewStart.cshtml dosyasında Layout özelliğine değer ataması yaparız.

Bir Razor sayfasının görünüm kısmına bir servis enjekte edebiliriz. Bu durumda ilgili servis nesnesi sayfanın görünüm kısmında kullanılabilecektir. Örnek:

Örneğimizde view'a DataContext servisi enjekte edilmekte ve bu servis nesnesi üzerinden Categories özelliğine erişilmektedir.
NOT: Razor sayfalarının kod kısmı olmadan sadece görünüm kısmı olabilir. Bu durumda sadece ilgili view render'lanacaktır. Ancak bu durumda view'a veri gitmeyeceği için view'ın kendi verisini kendisi üretmesi gerekecektir (örneğimizdeki gibi).

Daha önce bir Razor sayfasının bir kod, bir de görünüm kısmı olduğunu söylemiştik. İşte bu bölümde Razor sayfalarının kod kısımlarını inceleyeceğiz. Razor sayfalarının kod sınıfları PageModel sınıfından türer. PageModel sınıfının önemli üyeleri aşağıda verilmiştir:
HttpContext: Geçerli request'in HttpContext nesnesini verir.
ModelState: Forma girilen verilerin geçerli olup olmadığını anlayacağımız ModelState nesnesini verir.
PageContext: Geçerli sayfa hakkında bilgi verir.
HttpRequest: Geçerli request'in HttpRequest nesnesini verir.
HttpResponse: Geçerli request'in response'unu verir.
RouteData: Geçerli rota segmentlerine erişim sağlar.
TempData: TempData verisine erişim sağlar.
User: Geçerli request'i yapan kullanıcıyı döndürür.

Önceki derslerdeki örneğimizde sayfanın kod kısmını görünümle aynı dosyada tutmuştuk. Sayfanın kod kısmını belirtmek için @functions direktifini kullanmıştık. Sayfanın kod kısmını görünümle aynı dosyada saklamak pratik olmasına karşın yönetilebilirlik bakımından dezavantajlıdır. Şimdi Page klasöründeki Index.cshtml dosyasını şöyle değiştirelim:

Burada bazı değişikliklikler var. Öncelikle @functions direktifi ile belirtilen kod kısmını kaldırdık. Artık gerek olmadığı için @using direktiflerini kaldırdık. Artık model sınıfımız aynı dosyada olmadığı için @model direktifinde sınıfın isim alanıyla beraber tam yolunu kullanmalıyız.
Sayfanın kod kısmını barındıracak dosyanın ismi geleneksel olarak görünüm kısmını temsil eden dosyaya .cs takısı eklenmesiyle elde edilir. Örneğimizde görünüm kısmını temsil eden dosya Index.cshtml olduğu için kod kısmını temsil edecek dosyanın ismi Index.cshtml.cs olacaktır. Kod dosyaları da görünüm dosyalarında olduğu gibi Pages klasörüne konulur. Eğer Visual Studio'da Razor sayfası eklemek için "Razor Page" şablonunu kullandıysanız sayfanın kod kısmı görünüm kısmının altına otomatik eklenecektir. View dosyasının solundaki küçük oka tıklayarak kod dosyasını görebilirsiniz. Şimdi bu kod dosyasını açın ve içeriğini şöyle değiştirin:

Bu dosya önceki derslerde gördüğümüz, görünümle aynı dosyada tanımlanan ve @functions direktifi içinde belirtilen sınıfın aynısını içermektedir.

MVC'dekiyle aynı mantıkla _ViewImports.cshtml dosyası eklenebilir ve view'da model olarak model sınıfını belirtirken sınıfın isim alanıyla beraber tam yolunu belirtme zorunluluğundan kurtarır. Şimdi Pages klasörüne _ViewImports.cshtml isminde yeni bir view ekleyelim ve içeriği şöyle olsun:

@namespace WebApp.Pages
@using WebApp.Models

Burada Pages klasöründeki bütün view'ları WebApp.Pages isim alanına koyuyoruz. Sayfaların kod kısımları da aynı isim alanında olduğu için artık sayfaların görünüm kısımları kod kısımlarına direkt erişebilecek. Ayrıca WebApp.Models isim alanındaki sınıflara da direkt erişim hakkı kazanıyoruz. Artık Index.cshtml dosyasını aşağıdaki gibi değiştirebiliriz:

Oluşturduğumuz model sınıfını incelerseniz OnGetAsync() metodunun Task döndürdüğünü görürsünüz. OnGetAsync()'in senkron versiyonu ise void geri dönüş tipine sahiptir. Bunun anlamı Razor sayfalarındaki action'ların bir şey döndürmediği anlamına gelir. Bu mantıklıdır, çünkü handler metotların yapacağı iş kendi bünyesindeki özellikleri ayarlayıp view kısmının bu özelliklere erişmesini sağlamasıdır. Ancak esasında işler bir tık farklıdır ve MVC'ye daha yakındır. Yukarıdaki model sınıfını (Index.cshtml.cs) şöyle değiştirebiliriz:

Bu kod da tamamen geçerlidir ve Razor Pages'ın arkaplanda nasıl uygulandığına dair ipucu vermektedir. PageModel sınıfından devralınan Page() metodu geriye IActionResult arayüzünü uygulamış bir PageResult nesnesi döndürür ve ASP.NET Core'a ilgili model sınıfının bağlı olduğu view'ı renderlamasını söyler. Ayrıca Page() metodu parametre almaz. Bu mantıklıdır. Çünkü başka bir view seçme imkanı veya kendinden başka bir model nesnesi gönderme imkanı yoktur. PageModel sınıfı, değişik sonuçlar döndürmek için Page() metoduna benzer ve geriye IActionResult arayüzünü uygulamış bir sınıf nesnesi döndüren metotlar da içermektedir. Bu metotlar aşağıdaki listede verilmiştir:
Page(): HTTP 200 koduyla beraber sayfanın görünüm kısmı renderlanır.
NotFound(): Geriye HTTP 404 kodunu döndürür.
BadRequest(state): Geriye HTTP 400 kodunu döndürür. Opsiyonel bir model state nesnesi alabilir, model state nesnesi request'in neden neden kabul edilmediğine dair istemciye bilgi verebilir.
File(name, type): Geriye HTTP 200 koduyla beraber belirtilen isimli ve belirtilen tipli dosyayı döndürür. Response'ın Content-Type header'ı type parametresine göre belirlenir.
Redirect(path), RedirectPermanent(path): Sırasıyla HTTP 302 ve HTTP 301 kodlarını döndürürler. Belirtilen path'a yönlendirme yaparlar.
RedirectToAction(name), RedirectToActionPermanent(name): Sırasıyla HTTP 302 ve HTTP 301 kodlarını döndürürler. Belirtilen action'a yönlendirme yaparlar.
RedirectToPage(name), RedirectToPagePermanent(name): Sırasıyla HTTP 302 ve HTTP 301 kodlarını döndürürler. Belirtilen Razor sayfasına yönlendirme yaparlar. Eğer parametre verilmezse geçerli sayfaya yönlendirme yapılır.
StatusCode(code): Belirtilen durum kodunu döndürmeye yarar.
Bu metotlar burada yalnızca tamlık amacıyla verilmiştir. Gerçekte Razor sayfaları servis tüketicileri tarafından değil, gerçek insanlar tarafından tüketildiği için salt bir durum kodu döndürmektense istenen mesajı kullanıcıya verecek bir sayfaya yönlendirme yapmak daha doğrudur.

Şimdiye kadar model sınıfına OnGetAsync() isimli GET request'lerine karşılık veren bir handler metot ekledik. Başka HTTP metotlarına karşılık gelen başka metotlar da ekleyebiliriz. Şimdi projenizin Pages klasörüne Editor isimli bir Razor sayfası ekleyin. Razor sayfasının view dosyası şöyle olsun:

Bu view'ı inceleyerek EditorModel sınıfında bir Product özelliği olduğunu ve Product nesnesi içerdiği çıkarımında bulunabiliriz. View'ımız ilgili Product'ın Name ve Price özelliklerini ekranda görüntülemekte ve Price özelliğinin değiştirilme imkanını sağlamaktadır. Formun action'ı olmadığına göre formdaki veriler "Submit" butonuna tıklandığında view'ı sunan sayfanın OnPostAsync() metoduna gidecektir. Bu metodun price isimli bir parametre tanımlayarak bu fiyat bilgisini alması gerekmektedir. @Html.AntiForgeryToken() metot çağrısı Cross-Site Request Forgery (CSRF) saldırısı için alınmış bir önlemdir ve forma gizli bir kontrol eklemektedir. Sunucu bu gizli kontrolün verileri olmayan POST isteklerini kabul etmemektedir. Dolayısıyla teknik olarak OnPostAsync() metoduna gönderilen POST request'lerinin başarılı olması ve veritabanına yazım yapabilmesi için  form verilerini, daha önce sunucunun bu view'ı gönderdiği istemcinin göndermesi gerekir.
Şimdi bu view dosyasını genişletelim ve Editor.cshtml.cs dosyasını görelim. Bu dosyayı açalım ve içeriğini şöyle değiştirelim:

Kodda da gördüğünüz üzere model sınıfına OnPostAsync() metodu eklenmiştir. Kod oldukça açık gözüküyor. Ancak burada OnPostAsync() metodunun id parametresini nereden aldığını sorabilirsiniz. Cevap: rota segmentinden. Sayfa en başında görüntülendiğinde id isimli bir rota parametresi verilmesi zorunluydu. Dolayısıyla ilk formu sunan URL http://localhost:5000/editor/1 gibi bir şeydi. Daha sonra aynı URL'e POST request'i yapıldığında yine aynı http://localhost:5000/editor/1 URL'sine POST request'i yapıldı. Dolayısıyla OnPostAsync() metodu id parametresini alabildi. Ayrıca burada RedirectToPage() metot çağrısının kritik bir önemi vardır. İstemciye aynı sayfaya bir yönlendirme cevabı gönderir. İstemci bunun üzerine OnGetAsync() metoduna yeniden talepte bulunur. Burada direkt return Page(); satırını kullanmıyoruz. Eğer yönlendirme yapmadan direkt sayfayı render'lasaydık istemci bu sayfayı aldıktan sonra sayfayı yenilemesi durumunda form verilerini tekrar gönderecekti.

Şimdiye kadar bir handler metot gelen HTTP request'inin metoduna göre seçiliyordu. Örneğin gelen request POST request'i ise OnPostAsync() metodu çalışıyordu. Şimdi bu avrsayılan durumu değiştirebiliriz. BÖrneğin IndexModel model sınıfımız aşağıdaki gibi iki handler içersin:

Bu sayfanın URL'sine yapılan GET request'leri varsayılan durumda OnGetAsync() metodu tarafından karşılanır. OnGetRelatedAsync() metodu tarafından karşılanmasını istiyorsak URL'yi /Index?handler=related path'ıyla oluşturmalıyız. Query string parametresi handler olmak zorundadır. Query string değeri ise On[Get|Post|...] ön ekleri ve Async son eki olmadan metot ismidir. Rota parametresi kullanarak da benzer işlevsellik sağlanabilir. Ancak bu sefer ilgili Razor sayfasının başında @page "{id:long?}/{handler?}" direktifiyle handler isimli bir rota değişkeni tanımlamamız gerekirdi.

Daha önce de söylediğimiz gibi Razor Pages'ta varsayılan rotalama uzantı olmadan Pages klasöründeki dosya isimlerine dayanır. Pages klasöründeki alt klasörler request'in path'ındaki segmentlere karşılık gelir. İsternirse bu varsayılan rotalama mekanizması değiştirilebilir.

Eğer uygulamamızda hem MVC hem de Razor Pages yapılandırması varsa varsayılan durumda taleplerin çakışması durumunda Razor sayfası çalışacaktır. Çünkü Razor sayfalarının öncelik puanı daha düşüktür. Bu varsayılan durumu değiştirmek için Program.cs dosyasında şu değişikliği yapabilirsiniz:

Varsayılan durumda Razor Pages'ın öncelik puanı 0, MVC'nin 1'dir. Razor Pages'ın öncelik puanı daha düşük olduğu için çakışma olması durumunda Razor Pages seçiliyordu. Bu yapılan değişiklikle çakışma olması durumunda MVC'nin seçilmesi sağlanacak. Bu sayede örneğin http://localhost:5000 adresine yapılacak talepler Index Razor sayfası tarafından değil, Home controller'ının Index action'ı tarafından karşılanacak.

Varsayılan rota tanımlaması basittir, iş görür, ancak eksiklikleri de vardır. Örneğin bir önceki dersteki örnekte OnGetAsync() metodunun model binding süreciyle id parametresini almasının tek yolu query string'tir. İlgili handler metoduna parametre geçmenin tek yolu sunucuya http://localhost:5000/Index?id=1 gibi bir istek göndermektir. Bir handler metodun parametresini segment değişkeni üzerinden göndermek için ilgili Razor sayfasındaki @page direktifini şöyle değiştirebiliriz:

@page "{id:long?}"

Artık http://localhost:5000/Index/1 gibi bir istekle de handler metoda parametre gönderebiliyoruz. Daha önce gördüğümüz rota pattern'i belirtme kuralları burada da geçerlidir. Örneğimizde id parametresi long tipine dönüştürülebilen bir değer olmalıdır ve opsiyoneldir. OnGetAsync() metot tanımına bakarsak id parametresi sağlanmadığı durumda 1 değeri varsayılan olarak alınacaktır.
@page direktifi Razor Pages'ın sağladığı varsayılan rota yapılandırmasını belirli bir sayfa için devredışı bırakmak için de kullanılabilir. Örnek:

@page "/lists/suppliers"

Bu direktifin eklendiği sayfa artık dosya ismine değil, /lists/suppliers path'ına karşılık verecektir. Buradaki path belirtiminde de yine segment değişkenleri kullanılabilir.

Sayfanın başına konulan @page direktifi ile belirtilen rota, sayfanın dosya ismine göre belirlenen varsayılan rotasını geçersiz kılar. Belirli bir sayfa için hem varsayılan rotanın korunması hem de yeni rota eklenmesini istiyorsak Program.cs dosyasına aşağıdaki servis yapılandırmasını ekleyebiliriz:

Bu servis yapılandırmasının çalışabilmesi için Program.cs dosyasındaki using bildirimlerine using Microsoft.AspNetCore.Mvc.RazorPages; satırını ekleyin. Ayrıca bu servis yapılandırmasını Program.cs dosyasındaki builder.Services.AddRazorPages(); servis çağrısından daha sonraki bir konuma eklemelisiniz. Burada Razor Pages'ın ana dosyası olan Index sayfasına /extra/page/<id> path'ı ile de talepte bulunulabilmektedir. Sağlanan üçüncü parametre OnGetAsync() metoduna parametre olarak gidecektir.

Web uygulamamızın birçok yerinde sık kullanılan birtakım işlevlere ve verilere ihtiyaç duyabiliriz. Bunlar veritabanına erişme ve veri yazma, loglama yapma, konfigürasyon verilerine erişme gibi işleri içerir. Bunlar ASP.NET Core tarafından sağlanan hazır servislerle sağlanır. Ancak istersek kendi servislerimizi yazıp daha sonra uygulamamızın istediğimiz yerinde kullanabiliriz. İstediğimiz her sınıfı servis yapabiliriz. Kendi yazdığımız servislerin sağlayacağı işlevsellik konusunda herhangi bir kısıtlama yoktur.
Servisler dependency injection dediğimiz bir teknikle yaratılır ve tüketilir. Dependency injection sayesinde servisi kullanan sınıf (veya metot) servise bir arayüz üzerinden erişir, gerçek implementasyon sınıfını bilmez. Bunun avantajı programımız içindeki tek bir satırı değiştirerek program içindeki tüm servis implementasyonlarını da değiştirebilmemizdir. Örneğin çoğunlukla geliştiriciler geliştirme aşamasında gerçek veritabanına okuyup yazmazlar, bunun yerine dahili .NET nesneleriyle çalışırlar. Programın kend içinde tam bir tutarlılıkla çalıştığından emin olduktan sonra, deploy sürecine yakın bir aşamada veritabanı bağlantısı yapılır. Veya yine oturum da veritabanı gibi fiziksel bir kaynaktır. Geliştirme ve test sürecinde direkt oturuma okuyup yazmamamız gerekir. Bunun yerine oturum değişkenlerini taklit edecek dahili .NET nesnelerini kullanmamız gerekir. Eğer dependency injection ve servis kavramı olmasaydı programımızın veri kaynağını dahili .NET nesnelerinden gerçek veritabanına çevirmek için programımız içindeki dahili veri kaynağına olan erişimleri tek tek bulup bunları veritabanına işaret edecek şekilde değiştirmemiz gerekecekti.
Yukarıda verdiğimiz örnekte programımız veritabanı (veya oturum) bileşenine gevşek bağlıdır denir. Dependency injection gevşek bağlı bileşenler oluşturmaya yarar. Bu sadece veritabanı ve oturum gibi fiziksel kaynaklarla kısıtlı değildir. Kendi programımızı da bileşenlere bölebiliriz. Bu sayede bir bileşenin çok fazla değişiklik yüzünden bakımının zorlaştığı durumlarda o bileşeni tamamen çöoe atıp aynı işlevselliği çok daha bakımı kolay, temiz ve sade kodlarla sağlamaya çalışabiliriz. Eğer programımız tam bir bütün olsaydı benzer durumda bütün programı çöpe etmamız gerekecekti.
Servisleri sınıf kütüphaneleri gibi düşünebiliriz. Ancak servisler sınıf kütüphanelerinin aksine canlı .NET nesneleridir. Bir servise ihtiyaç duyduğumuz yerde ASP.NET Core ilgili sınıf nesnesini oluşturup bir arayüz üzerinden bize verir. Biz nesne oluşturma süreciyle ilgilenmeyiz ve oluşturulan nesnenin hangi implementasyon kullanılarak oluşturulduğunu da bilmeyiz.
Bu bölümde neden servislere ve dependency injection'a ihtiyaç duyduğumuz, servisler ve dependency injection olmadan önce benzer işlevselliği hangi yapılarla sağlamaya çalıştığımız anlatılacaktır. Daha sonra ASP.NET Core'da servis tanımlamarının ve tüketiminin nasıl yapılacağı gösterilecektir. Ancak öncelikle üzerinde çalışacağımız örnek projenin oluşturulması gerekli.

ASP.NET Core Empty şablonunu kullanarak ismi "Servisler" olan yeni bir ASP.NET Core projesi oluşturun. Bu projeye IResponseFormatter.cs isminde ve içeriği aşağıdaki gibi olan yeni bir arayüz ekleyin:

Bu arayüze bir implementasyon oluşturmak için projeye TextResponseFormatter.cs isminde ve içeriği aşağıdaki gibi olan yeni bir sınıf ekleyin:

Bu sınıfın Format() metodu HttpContext ve string türünde iki parametre almaktadır. Yaptığı iş basitçe kendisine verilen stringi kendisine verilen HttpContext nesnesi üzerinde response'a yazmaktır. Ayrıca response'a yazmak için bir önceki TextResponseFormatter nesnesiyle aynı nesnenin kullanılıp kullanılmadığını belirlemek için bir responseCounter değişkeni tutmaktadır.
Şimdi projeye WeatherMiddleware.cs isminde ve içeriği aşağıdaki gibi olan yeni bir sınıf ekleyin:

Bu middleware basitçe eğer gelen request'in path'ı "/middleware/class" ise response'a yazma yapmakta, değilse hiçbir şey yapmadan akışı sıradaki middleware'e yönlendirmektedir. Şimdi projeye ismi WeatherEndpoint.cs olan ve içeriği aşağıdaki gibi olan bir sınıf ekleyelim:

Şimdi Program.cs dosyasının içeriğini aşağıdaki kodlarla değiştirelim:

Bu Program.cs dosyasında biraz önce tanımladığımız WeatherMiddleware middleware'i request pipeline'a eklenmektedir. Ayrıca çeşitli path'lara karşılık üç tane endpoint eşlemesi yapılmaktadır. Bunlardan ikisi lambda ifadesi şeklinde, biri sınıf şeklindedir. Burada dikkat etmemiz gereken nokta IResponseFormatter formatter = new TextResponseFormatter(); şeklindeki değişken tanımlamasının en üst blokta yapılmış olmasıdır. Program.cs dosyasındaki kodlar sunucu ayağa kalkarken yalnızca bir kez çalışır. ASP.NET Core, Program.cs dosyasındaki kodlara bakarak bir request pipeline ve endpoint eşleme tablosu inşa eder. En üst blokta tanımlanan değişkenler middleware ve endpoint blokları tarafından kullanılabilir. Daha da önemlisi bu değişkene değişiklik yapıldığı zaman sunucunun hafızesında tutulan aynı değişkene değişiklik yapılmış olur. Bu da değişkenlerin birden fazla request-response zincirinin ardından da canlı kalacağı anlamına gelir.
Bu şekilde projeyi çalıştırdığınızda ve "endpoint/1" path'ına talepte bulunduğunuzda şöyle bir çıktı alırsınız:

Response 1:
Endpoint-1: It is snowing in Chicago

Eğer tarayıcıyı yenilerseniz Response-2, Response-3,... şeklinde response sayacının arttığını görürsünüz. Çünkü aynı TextResponseFormatter nesnesi üzerinden Format() metodu çağrılmakta ve Format() metodu da bağlı olduğu nesnein sayacını bir artırmakta ve ekrana basmaktadır. Aynı TextResponseFormatter nesnesi sunucunun belleğinde tutulmaktadır.

Servisler ve dependency injection yaklaşımı iki temel sorunu çözmektedir. Bu sorunlar servislere ulaşım için standart bir yol oluşturulması ve zayıf bağlılıktır.

Servis benzeri yapılara dependency injection kavramı hayatımıza girmeden önce de aşinaydık. Ancak işlemler daha farklı şekilde yürütülüyordu. Burada projemizdeki TextResponseFormatter sınıfını bir servis olarak ele alalım. Programımızın birçok yerinde bu sınıfın nesnesine ihtiyaç duyduğumuzu ve bu nesneye kolayca erişmek istediğimizi düşünelim. Bu servis nesnesine programımızın istediğimiz bir yerinden erişmek için nesnenin kaynağı olan noktadan kullanmak istediğimiz noktaya kadar metotlar ve yapıcı metotlar vasıtasıyla elden ele metot ve yapıcı metot parametreleri aracılığıyla taşımaktır. Ancak bu yaklaşım çok kötü bir yaklaşımdır, programımızın karmaşıklığının gereksiz yere artırır. Başka bir yaklaşım (ve burada örneğini vereceğimiz yaklaşım) singleton pattern'idir. Singleton pattern'inin TextResponseFormatter sınıfı için kullanımını görmek için TextResponseFormatter.cs dosyasını şöyle değiştirin:

Singleton pattern'i basitçe eğer nesne oluşturulmuşsa o nesneyi verir, eğer nesne oluşturulmamışsa oluşturup verir. Her halükarda programın her yerinde tek bir nesne dolaşır. Singleton pattern'iyle oluşturulan bu servise nasıl erişildiğini görmek için Program.cs dosyasını şöyle değiştirin:

Bu örnekte eğer ilk önce tarayıcıya "endpoint/1" path'ına daha sonra "endpoint/2" path'ına talepte bulunursa sayacın arttığını görürüz.
Singleton patter'i basit ve kullanışlıdır. Zaten bu yüzden dependency injection kavramı hayatımıza girmeden önce yaygın şekilde kullanılmaktaydı. Ancak singleton pattern'i servislere standart bir yolla erişimi sağlamaz. Her sınıf singleton pattern'ini farklı bir yolla uygulayabilir. Bu örneğimizde nesneye ulaşmayı sağlayan metodun ismi Singleton'dır. Farklı servisler bu metoda farklı bir isim koyabilir. Servisi kullanacak bütün sınıflar bu sınıfta Singleton isminde bir metot olduğunu ve bu metodun daima tek olacak olan TextResponseFormatter nesnesini döndürdüğünü bilmek zorundadır. En önemlisi TextResponseFormatter sınıfı hem servisin kendisinden hem de servisin dağıtımından sorumludur. Eğer dağıtım sorumluluğunu servis sınıfına yüklersek her servis dağıtımı farklı şekilde yapabilir.

Biraz önce TextResponseFormatter servisine ulaşmak için TextResponseFormatter sınıfının içinde tanımlanan Singleton() metoduna ulaştık. Bu durumda IResponseFormatter arayüzünü hiç kullanmadık. Ama biz istiyoruz ki servise bir arayüz üzerinden ulaşalım. Bu sayede tüketici kod servise zayıf bağlı olsun, asıl işi yapacak implementasyon kodu kolayca değişebilsin. Bu sorunu çözmek için de çeşitli pattern'ler vardır. Bu pattern'lerden biri de "Type Broker"dır. Şimdi projemize ismi TypeBroker.cs olan ve içeriği aşağıdaki gibi olan yeni bir sınıf ekleyelim:

Şimdi Program.cs dosyasını şöyle değiştirelim:

Bu örneğimizde TextResponseFormatter servisine TypeBroker sınıfının statik Formatter özelliği ile arayüz üzerinden erişmekteyiz. Bu sayede implementasyonu TypeBroker sınıfı üzerinden yapacağımız tek satırlık bir kod değişikliği ile değiştirebiliriz. Bu durum servise zayıf bağlılık sağlar. TypeBroker pattern'i servislere standart bir yolla erişme sorunu çözmeden zayıf bağlılık sorununu çözmektedir. Çünkü servis kullanıcıları servisi kullanabilmek için TypeBroker isimli bir ayrı bir sınıf olduğunu ve bu sınıfın içindeki Formatter özelliği ile servise erişildiğini bilmek zorundadır. Her servis bu pattern'i uygulamayabilir.

Dependency injection'a neden ihtiyacımız olduğunu gördükten sonra şimdi dependency injection'ın ASP.NET Core'da nasıl kullanıldığını görelim. Şimdi IResponseFormatter arayüzü için yeni bir implementasyon yazalım. İmplementasyonun ismi HtmlResponseFormatter.cs ve içeriği şöyle:

Bir önceki implementasyon içeriği response'a text olarak yazmaktaydı. Bu implementasyon HTML olarak yazmaktadır. Bunun için ContentType'ı "text/html" olarak değiştirmekte ve kendisine gelen string'i bir HTML şablonu içine yerleştirmektedir. IResponseFormatter servisi için programımız içinde her yerde HtmlResponseFormatter implementasyonunu kullanmak için Program.cs dosyasını şöyle değiştirmeliyiz:

Burada servis eklemesi builder.Services.AddSingleton<IResponseFormatter, HtmlResponseFormatter>(); satırıyla yapılır. Eklenen bu servis ise endpoint fonksiyonlarına eklenen p

Web uygulamalarında gelen bir talebe statik içerikle cevap verilmesi yaygın bir durumdur. Statik içeriğe resimler, CSS ve Javascript dosyaları ve statik HTML sayfaları örnek verilebilir. ASP.NET Core uygulamalrında statik içerik geleneksel olarak wwwroot klasöründe depolanır.
Web uygulamamızdaki statik içeriği sunacak middleware UseStaticFiles'tır ve aşağıdaki şekilde request pipeline'a eklenir (Program.cs dosyası):

Programımıza http://localhost:5000/statik_dosya.html şeklinde bir talep geldiğinde UseStaticFiles middleware'i wwwroot klasöründeki statik_dosya.html dosyasıyla geri döner ve request pipeline'a kısa devre yaptırır. UseStaticFiles middleware'i çoğunlukla request pipeline'a ilk eklenen middleware'lerdendir.

UseStaticFiles middleware'inin çalışması UseStaticFiles() metoduna StaticFileOptions tipinde parametre verilerek özelleştirilebilir. StaticFileOptions sınıfının önemli özellikleri şunlardır:
ContentTypeProvider: Sunulacak dosyanın tipini belirleyecek sağlayıcıyı belirtmeye yarar. Varsayılan sağlayıcı dosyanın uzantısına bakarak tipini belirler.
DefaultContentType: Eğer belirtilen sağlayıcı (veya varsayılan sağlayıcı) dosyanın tipini belirleyemiyorsa kullanılacak bir fallback dosya tipi belirtmeye yarar.
FileProvider: İstenen dosyanın nerede aranacağını belirtmeye yarar. Aşağıda örnek kullanımı verilmiştir. 
OnPrepareResponse: Statik içeriğin sunulmasından hemen önce çalışacak metodu belirtmeye yarar. 
RequestPath: Middleware'in hangi path'a gelen request'lere cevap vereceğini belirtir. Aşağıda örnek kullanımı gösterilmiştir.
ServeUnknownFileTypes: Varsayılan durumda tipi belirlenemeyen dosyalar sunulmaz. Bu varsayılan davranışı değiştirmeye yarar.
Örnek (Program.cs dosyası):

Burada yapılan ayar şudur: /files path'ına gelen isteklerdeki dosyaları bulmak için /staticfiles klasörüne bak. Bu örneğimizde mevcut UseStaticFiles middleware'i de korunmuştur. Bunun anlamı / pathîna gelen dosya isteklerinin bulunması için halen wwwroot klasörüne bakılacağıdır. Parametre almayan UseStaticFiles() metodu daha önce çağrılmıştır. Bunun anlamı wwwroot kalsöründeki files isimli klsördeki dosya.html isimli dosyanın staticfiles klasöründeki dosya.html isimle dosyaya göre öncelikli olacağıdır. Böyle bir durumda parametre almayan UseStaticFiles middleware'i request pipeline'a kısa devre yaptırmakta ve sıra kendisine gelmesi durumunda çalışabilecek durumda olan parametre alan UseStaticFiles middleware'inin çalışmasını engellemektedir.
NOT: UseStaticFiles() metodunun tek bir string parametre alan bir versiyonu da vardır. Bu string paremetre RequestPath özelliğini ayarlar ve ilgili path'a gelen dosya isteklerinin wwwroot klasöründeki dosyalarla karşılanmasını sağlar.

Uygulama geliştirirken JQuery ve Bootstrap gibi istemci taraflı kütüphanelere ihtiyaç duyabiliriz. Uygulamamıza istemci taraflı kütüphane yüklemek için Visual Studio'da projemize sağ tıklarız. Açılan bağlam menüsünden "Add" kategorisinin altındaki "Client-Side Library" seçeneğini tıklarız. Açılan "Add Client-Side Library" penceresinde "Library" alanına istediğimiz istemci taraflı kütüphanenin adını yazarız. Örneğin bootstrap paketinin 5.1.3 sürümün kurmak istiyorsak "bootstrap@5.1.3" yazarız. Daha sonra "Install" düğmesine tıklarız. Ayrıca burada paketin yükleneceği klasörü de belirtebiliriz, ancak bu klasörü değiştirmemenizi tavsiye ediyorum. İstemci taraflı kütüphaneler varsayılan durumda wwwroot/lib/paket_ismi klasörüne kurulur. wwwroot klasörü dışında bir yere paketin kurulması durumunda UseStaticFiles middleware'i varsayılan yapılandırma ile request pipeline'a eklendiyse paketi bulamayacaktır.

Kurulan istemci taraflı kütüphaneyi kullanmak için HTML içinden ilgili pakete referans veririz. Örneğin bir bootstrap dosyasını HTML içinde kullanmak için HTML dosyasının <head> bölümüne aşağıdaki ifadeyi yazarız:

Burada adres belirtirken wwwroot klasörünün belirtilmediğine dikkat edilmelidir.

Tag helper'lar layout'lar, partial view'lar ve view component'larla aynı amaca hizmet ederler. View'larda kod tekrarını önlerler. Ancak tag helper diğerlerinden çok daha güçlü ve esnek bir yapıdır. Diğerlerinde sayfada nihai olarak görüntülenecek HTML, view'lar aracılığıyla belirtilir. Bu da üretilecek HTML konusunda esneklik kaybı olacağı anlamına gelir. Örneğin HTML'de 3 satırlı ve 2 sütunlu, her bir hücrede ilgili satır ve sütun numaralarını gösterecek bir tablo oluşturmak için aşağıdaki kodu yazabilirsiniz:

Bu tabloyu çıktı vermek istediğinizi belirtmek için ilgili view'da sadece

yazmak ister misiniz? Cevabınız evetse kullanacağınız şey tag helper'dır. Tag helper'lar esasında kullanıldıkları view'da HTML koduna benzeyen şeyi karşılık geldikleri gerçek HTML koduna dönüştürürler. Elbetteki HTML standardında <table> etiketinin satir veya sutun isimli seçenekleri yoktur. Ama görünüm HTML şeklindedir, bu sayede bu sektaks kullanıldığı view'da sırıtmaz, arkaplanda gerçek HTML koduna dönüştürülür ve istemciye öyle gönderilir. Tag helper kullanıldığı view'dan parametrelerini normal HTML seçenekleriymiş gibi duran seçenekler vasıtasıyla alır. Bu bilgileri kullanarak gerçek HTML kodunu döndürür.
Tag helper'ların tek kullanım alanı uzun HTML kodlarının daha kısa yazılmasını sağlamak değildir. Daha da önemlisi HTML etiketlerine dinamiklik sağlarlar. Gerçek HTML, C# kodu kullanılarak üretilir ve üretim esnasında kullanılan view'dan sağlanan parametreler yanında programımızın mevcut durumundan da faydalanılabilir, veritabanındaki verilere bakılabilir, vs. Diğer bir deyişle HTML kodu üretimi esnasında her türlü iş mantığı kuralı işletilebilir. Örneğin daha sonra göreceğimiz üzere dahili tag helper'lar HTML formlarının oluşturulması amacıyla kullanılabilir. Bir HTML formu oluştururken şöyle bir <form> etiketi kullanabiliriz:

Burada submit butonuna tıklandığında form verilerinin gönderileceği controller ve action belirtilmektedir. Bu kod tag helper tarafından aşağıdaki HTML koduna çevrilebilir:

Diğer bir deyişle tag helper asp-action ve asp-controller seçenekleri için sağlanan değerlere bakarak gerçek HTML kodundaki <form> etiketinin action seçeneğini ayarlamaktadır. Bunu yaparken programın mevcut rota yapılandırmasını kullanmaktadır. Bu bölüm 3 alt kısma ayrılmıştır. İlk olarak kendi tag helper sınıflarımızı yazmayı, daha sonra ASP.NET Core tarafından sağlanan hazır tag helper'ları kullanmayaı, daha sonrasında ise HTML formları oluştururken kullanabileceğimiz tag helper'ları göreceğiz.

Kendi Tag Helper Sınıflarımızı Yazma
Dahili Tag Helper'lar
Form Tag Helper'ları

Bu bölümde ASP.NET Core'un sunduğu dahili tag helper'ları göreceğiz. Kendi tag helper sınıflarımızı oluşturabilmemize rağmen çoğunlukla işlerimizi ASP.NET Core'un sunduğu dahili tag helper'larla görürüz.

Microsoft'un sunduğu dahili tag helper'lar Microsoft.AspNetCore.Mvc.TagHelpers isim alanındadır. Bu isim alanındaki tüm tag helper sınıflarına erişim hakkı elde etmek için aşağıdaki direktifi ilgili view'a, Views klasöründeki _ViewImports.cshtml dosyasına veya Pages klasöründeki _ViewImports.cshtml dosyasına koyabiliriz.

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<a> etiketi HTML'de link oluşturmaya yarar. <a> etiketine uygulanan tag helper'lar sayesinde <a> etiketinin href seçeneğinde belirtilen URL'nin statik olarak değil de, uygulamanın rota yapılandırmasına göre dinamik oluşturulmasını sağlayabiliriz. Bu sayede uygulamanın rota yapılandırması değişse bile üretilen linkler de ona göre değişeceği için linkler sorunsuz bir şekilde çalışmaya devam edecektir. <a> etiketine uygulanabilen tag helper sınıfı AnchorTagHelper'dır. AnchorTagHelper sınıfının desteklediği HTML seçenekleri aşağıda verilmiştir:
asp-action: Linke basıldığında tetiklenecek olan action.
asp-controller: Linke basıldığında tetiklenecek olan action'ı içeren controller. Eğer controller belirtilmezse aktif view'ı hangi controller render'ladıysa o controller seçilir.
page: Linke basıldığında gidilecek olan Razor sayfası. / karekteri ile başlamalıdır.
asp-page-handler: Linke basıldığında gidilecek olan Razor sayfasının handler metodu. Daha önce gördüğümüz üzere Razor sayfaları GET request'leri için birden fazla handler metot içerebilir.
asp-fragment: HTML'de linkin sonuna eklenen ve # karekteriyle başlayan kısmı belirtir. Belirli bir sayfanın belirli bir yerine gitmeye yarar.
asp-host: Üretilecek URL'nin host kısmını belirtir.
asp-protocol: Üretilecek URL'nin protokol kısmını belirtir.
asp-route: URL'yi üretmek için kullanılacak rota ismini belirtir.
asp-route-*: Farklı rota değişkenleri için değer sağlamaya yarar. Örneğin asp-route-id ile id rota değişkeni için değer sağlanır.
asp-all-route-data: Bütün rota değişkenleri için tek bir seferde değer belirtmeye yarar.

<a> etiketine uygulanan tag helper'lar URL oluştururken aynı zamanda link oluştururlar. Link oluşturmadan URL oluşturmak için Url yardımcısı kullanılabilir. Url yardımcısına controller'lardan, sayfa modellerinden ve view'lardan direkt erişilebilir. Bir view'dan bir örnek:

Bu örnek Pages/Suppliers klasöründe bulunan List Razor sayfasına URL oluşturur.

Burası bir controller veya Razor sayfası model sınıfıdır ve Home controller'ının List action'ına URL üretmektedir.

HTML'deki <script> etiketlerini oluşturmak için ScriptTagHelper sınıfının temsil ettiği tag helper kullanılabilir. Bu tag helper'ın HTML etiketine eklenebilecek seçenekler aşağıda verilmiştir:
asp-src-include: View'a eklenecek JavaScript dosyalarını belirtmek için kullanılır.
asp-src-exclude: View'dan çıkartılacak JavaScript dosyalarını belirtmek için kullanılır.
asp-append-version: Cache busting amacıyla kullanılır. Kullanımı ileride verilecektir.
asp-fallback-src: JavaScript dosyası bir CDN'den alınıyorsa ve bir sorun nedeniyle alınamadıysa bir fallback JavaScript dosyası belirtmeye yarar.
asp-fallback-src-include: CDN'deki bir sorun nedeniyle JavaScript dosyası alınamadığında kullanılacak JavaScript dosyalarını belirtmeye yarar.
asp-fallback-src-exclude: CDN'deki bir sorun nedeniyle JavaScript dosyası alınamadığında çıkartılacak JavaScript dosyalarını belirtmeye yarar.
asp-fallback-test: CDN'in düzgün çalışıp çalışmadığını ve ilgili JavaScript dosyalarının CDN'den alınıp alınamadığını test etmek amacıyla kullanılır. İlgili CDN'in düzgün çalıştığını gösterecek bir JavaScript kodu içerir.

JavaScript dosyalarının eklenmesi için çoklu seçim desenleri kullanılabilir. Bu desenler aşağıda verilmiştir:

Örnek:

Projemizin wwwroot/lib/jquery klasöründe jquery.js, jquery.min.js, jquery.slim.js ve jquery.slim.min.js olmak üzere 4 dosyanın olduğunu varsayarsak bu kod jquery.min.js ve jquery.slim.min.js'i sayfaya ekleyecektir. Eğer bu kod yerine

Kodunu yazarsak daha önceki seçimden ".slim." ibaresini içeren dosyalar çıkartılacaktır. Bu durumda tek seçilen dosya jquery.min.js olacaktır.

İstemciye gönderilen JavaScript ve CSS dosyaları çoğu zaman cache'lenir. Çok çeşitli caching mekanizamaları vardır ve bunların çoğu programcının kontrolü dışındadır. Çoğunlukla cache'lenen dosyaların belirli bir süresi vardır, bu süre dolduktan sonra sunucudan yeni CSS veya JavaScript dosyası istenir. Ancak bazen bu süre dolmadan uygulamanın kullandığı CSS veya JavaScript dosyasının versiyonu değişebilir. Eski versiyonla bir süre içerik sunmaya devam etmek sorunlara yol açabilir. Bu sorunun üstesinden gelmek için cache busting denen bir yaklaşım kullanılır. Örnek:

Bu kod tag helper tarafından şuna benzer bir koda çevrilir:

Buradaki query string daha önce sunulan dosyanın checksum'ıdır. Sunucuda daima güncel dosyanın checksum'ı tutulur ve link oluşturulurken bu checksum kullanılır, JavaScript dosyası ise bir cache'ten sunulabilir. Örneğin JavaScript dosyalarının bir CDN cache'inde tutulduğunu varsayalım. CDN, URL'ye göre cache'leme yapar. Eğer daha önce talepte bulunduğunuz URL'yle aynı URL'ye talepte bulunursanız CDN cache'lenmiş içeriği döndürecektir. Örneğin 9. taleple 10. talep arasında JavaScript dosyasının güncellendiğini düşünelim. 10. talepte sunucu güncel JavaScript dosyasının checksum'ını HTML dosyasının içine gömüp gönderecektir. İstemci bu sefer yeni checksum ekli bu URL için talepte bulunacaktır. CDN böyle bir URL'yi tanımadığı için akışı sunucuya yönlendircektir. Sunucu güncel JavaScript dosyasını sunacaktır. Sunulan bu JavaScript dosyası CDN'e de kaydedilecektir. Daha sonraki değişmeyen JavaScript dosyası talepleri yine CDN'den karşılanacaktır.
Sonuçta sunucudaki JavaScript dosyası güncellenmişse güncel dosya, güncellenmemişse cache'lenen dosya sunulacaktır.

Cache'lemenin çok farklı şekillerde yapılabileceğini daha önce söylemiştik. İstemciye yakınlığına göre üç farklı cache'leme şeklinden bahsedebiliriz:

Tarayıcıda cache'leme: Tarayıcının daha önce aldığı bir içeriği tekrar alması gerektiğinde tekrar İnternetten alması yerine kendi lokalinde tuttuğu kopyayı kullanmasıdır.
CDN'de cache'leme: İçeriğin asıl sunucu yerine istemciye coğrafi olarak daha yakın bir sunucuda tutulmasıdır.
Sunucuda cache'leme: İçerik yine sunucuda tutulur. Ancak içerik üretilme sürecinden geçmez. Daha önce üretilmiş içerik statik olarak sunulur.
Bu bölümde daha ara bir çözüm olan CDN'lerden (content delivery network - içerik dağıtım ağı) bahsedilecektir. Resimler, JavaScript ve CSS dosyaları gibi statik içerikler sıklıkla CDN'lerde tutulabilir. CDN'lerin temelde iki faydası vardır. İlki, içerik istemciye daha yakın bir sunucudan sunulduğu için web sitesi daha hızlı çalışacaktır, kullanıcının web sitesini kullanma deneyimi daha olumlu olacaktır. İkinci olarak ise sunucu ilgili statik içeriği sunmak için kaynak kullanmadığı için kaynakları daha verimli kullanmış olacaktır. CDN'lerin bu avantajından faydalanmak için örneğin JQuery paketini yüklemek için <script> etiketinin src seçeneğine aşağıdaki linklerden birini koyabilirsiniz.

https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.js
https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js
https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.map
https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.slim.js
https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.slim.min.js
https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.slim.min.map
jquery.js dosyası kütüphaneninin kendisir. jquery.min.js normal jquery paketiyle aynı işlevselliğe sahiptir, ancak boyutu küçültmek adına beyaz boşluklar ve fonksiyon adları gibi identifier'lar minimum uzunluk seviyesine çekilmiştir. jquery.slim.js standart jquery paketinin sık kullanılmayan bazı işlevlerinin çıkartıldığı daha kompakt bir versiyonudur. jquery.slim.min.js jquery.slim paketiyle aynı işlevselliğe sahip olup dosya boyutunun küçültülmesi adına beyaz boşlukların ve fonksiyon adları gibi identifier'ların minimum uzunluğa çekildiği versiyonudur. Uzantısı .map olan dosyalar aynı paketin asıl versiyonuyla min versiyonu arasında eşleme yaparlar. Dosyanın min versiyonu kullanılmasına rağmen debug sürecinde tam fonksiyon isimlerinin kullanılmasını sağlarlar.

Elbetteki JQuery dışında CDN'den yükleyebileceğiniz başka JavaScript kütüphaneleri de vardır. Bunlar görmek için https://cdnjs.com adresine gidebilirsiniz. Örneğin şimdi jquery.min.js paketini bir view'a yükleyelim:Burada CDN'den jquery.min.js paketinin 3.6.0 versiyonu view'a yüklenmektedir. Eğer CDN'den dosya çekilemiyorsa dahili jquery paketi kullanılacaktır. asp-fallback-test seçeneğine verilen JavaScript ifadesi false döndürürse ilgili kütüphanenin yüklenemediği anlaşılacak ve belirtilen dahili JavaScript dosyasının kullanılması sağlanacaktır. JQuery paketinin doğru yüklenip yüklenmediğinden emin olmak için gönül rahatlığıyla window.jQuerykodunu kullanabilirsiniz. Eğer CDN'deki JavaScript dosyasının yüklenememesi durumunda çoklu seçim desenleriyle birden fazla lokal JavaScript dosyası yüklememiz gerekecekse asp-fallback-src-include ve asp-fallback-src-exclude seçenekleri kullanılabilir.

CSS tag helper'ı JavaScript tag helper'ıyla aynı mantıkla çalışır. LinkTagHelper sınıfı HTML'deki <link> etiketine uygulanır ve <script> etiketindediyle benzer aşağıdaki seçenekleri içerir:
asp-href-include: Eklenen CSS dosyalarını belirtmeye yarar.
asp-href-exclude: Çıkartılacak CSS dosyalarını belirtmeye yarar.
asp-append-version: Cache busting uygulamaya yarar.
asp-fallback-href: Eğer CDN'deki bir sorun nedeniyle CSS dosyası yüklenemiyorsa dahili CSS dosyasını belirtmeye yarar.
asp-fallback-href-include: Eğer CSS dosyası CDN'den yüklenemiyorsa çoklu seçim desenleriyle birden fazla CSS dosyası belirtmeye yarar.
asp-fallback-href-exclude: asp-fallback-href-include seçeneğinin

Form tag helper'ları view'larda HTML formlarını render'lamak için kullanılan bir tag helper kümesidir. İlgili form kontrollerine girilen verilerin hangi action'a veya Razor sayfası handler'ına gönderileceğinin belirtimi ve model özellikleri ile form kontrolleri arasındaki eşleme form tag helper'ları ile yapılabilir. Form kontrollerine uygulanan tag helper'lar sayesinde ilgili <input> etiketinin type, value ve name seçeneklerinin değerleri otomatik olarak belirlenir.

Form tabanlı sayfaların işlevini yerine getirmesi için çoğunlukla get-post-redirect-get deseni kullanılır. Bütün bu aşamalar aşağıdaki listede verilmiştir:

GET: Kullanıcı, verileri girebilmesi için öncelikle GET request'ini kullanarak ile form sayfasını getirir.
POST: Formdaki veriler bir POST request'i aracılığıyla bir action veya sayfa handler'ına gönderilir.
REDIRECT: Action veya handler metot verileri veritabanına yazdıktan sonra ilgili verilerin veritabanına yazıldığını gösterecek bir web sayfasına yönlendirme içeren bir cevapla geri döner.
GET: İstemci son olarak verilerin veritabanına yazıldığını gösteren sayfaya talepte bulunur.
3. aşamada sunucunun direkt verilerin veritabanına yazıldığını gösteren bir içerikle geri dönmemesinin sebebi böyle yapılması durumunda istemci sayfayı yenilediğinde aynı form verilerinin tekrar sunucuya gönderilecek olmasıdır.

Bu bölümde controller kullanarak form verilerini işlemeyi göreceğiz. Şimdi projenizin Controllers klasöründe içeriği aşağıdaki gibi olan ve ismi FormController.cs olan dosyayı oluşturun:

Bu controller sınıfındaki Index action'ı formu belirtilen id'li kaydın bilgileriyle doldurarak render'layacak olan action'dır. Kullanıcı formdaki bilgileri güncelleyip submit butonuna bastığında SubmitForm() metodu tetiklenir. Bu action HttpPost attribute'u ile işaretlenmiştir, dolayısıyla sadece POST request'lerine karşılık verecektir. Controller sınıfından devralınan Request özelliği HttpRequest tipindedir ve geçerli request'i tutmaktadır. HttpRequest sınıfının Form özelliği gelen request'in body'sindeki form kontrollerine erişim sağlar. Bu özellik bir IFormCollection nesnesi döndürür. IFormCollection tipinde tanımlı Keys özelliği bir string kolleksiyonu döndürür ve formdaki kontrollerin isimlerini içerir. İsmi alt tire (_) ile başlayan kontroller ASP.NET Core tarafından oluşturulmuş arkaplan kontrolleridir ve bizim ilgimizi çekmemektedir.  Belirli bir form kontrolünün değerine IFormCollection tipinde tanımlı indeksleyici ile erişilmektedir. Bu indeksleyici geriye bir StringValues nesnesi döndürür. StringValues tipini bir string dizisi gibi düşünebiliriz, birden fazla string içerebilir. Örneğimizde form kontrolünün değerinin birden fazla string içermesi durumunda string'ler virgülle ayrılarak tek bir string'e çevrilmektedir. Kuşkusuz textbox gibi HTML kontrollerinin çoğu tek bir string değer içermektedir. Ancak ileride göreceğimiz bazı kontroller birden fazla değer içerebilmektedir. İşte bu kontrollerin de ihtiyaçlarının karşılanması için kontrol değerlerini tutan tip StringValues seçilmiştir. Ancak değeri gönderecek kontrolün tek bir değer içereceğinden eminseniz rahatlıkla Request.Form[key][0] şeklinde ilgili form kontrolünün değerlerinin ilkine erişebilirsiniz.
Örneğimizde ayrıca ilgili form kontrolünün değerleri form kontrolüyle aynı isimli bir TempData değişkenine atanmaktadır. Bu sayede form değişkenlerinin değerlerine Results action'ının render'ladığı view'da erişebileceğiz. Sonuç olarak form verilerini işleyen SubmitForm() action'ı form verileriyle yapacağı işlemleri bitirdiğinde aynı controller'daki Results() action'ına yönlendirme cevabıyla geri dönmektedir. Results action'ı ise kendi view'ını render'lamaktadır. Şimdi Index action'ının render'layacağı Form action'ı oluşturalım (Views/Form klasöründeki Form.cshtml dosyası):Burası view'ın bir kısmıdır. Gerisi layout'tan gelecektir. View, aldığı model nesnesine ait Name özelliğinin değerini bir textbox'a yazmakta, kullanıcının yaptığı güncellemeyi /form/submitform path'ına göndermeketdir. Şimdi form verileri işlendikten sonra Results action'ı tarafından render'lanacak olan view'ı şöyle oluşturalım (Views/Form klasöründeki Results.cshtml dosyası):Bu view, TempData'daki verileri bir tablo halinde göstermektedir.

Form verileri controller'lardaki aynı mantıkla Razor sayfaları tarafından da işlenebilir. Razor sayfaları yaklaşımında bir form sayfasını gösterecek ve form verilerini işleyecek bir Razor sayfası, bir de form işleme sonucunu gösterecek ayrı bir Razor sayfası oluşturacağız. Öncelikle projenizin Pages klasöründe FormHandler.cshtml isminde bir Razor sayfası oluşturun, içeriği şöyle olsun:Bu Razor sayfası hem form sayfasını görüntülemek hem de form verilerini işlemekle görevlidir. Şimdi form işleme sonucunu gösterecek olan Razor sayfasını ekleyelim (Pages klasöründeki FormResults.cshtml Razor sayfası):

Şimdiye kadar öğrendiklerimizi tazelemek için bir controller ve Razor sayfasında nasıl form verilerini işleyebileceğimizi gördük, Ancak formları oluştururken giç tag helper kullanmadık. Şimdi asıl konumuz olan form tag helper'larına sıra geldi.

<form> etiketine uygulanabilecek tag helper sınıfı FormTagHelper'dır. Bu tag helper aşağıdaki seçenekleri desteklemektedir. Bu seçeneklerin tamamı HTML <form> etiketindeki action seçeneğinin değerinin belirlenmesinde kullanılmaktadır.
asp-controller: Form verileri hangi controller'a gidecek? Eğer bu seçenek atlanırsa veriler view'ı render'layan controller'a gider.
asp-action: Form verileri hangi action'a gidecek? Eğer bu seçenek atlanırsa veriler view'ı render'layan action'a gider.
asp-page: Form verileri hangi Razor sayfasına gidecek?
asp-page-handler: Form verileri Razor sayfasının hangi handler metoduna gidecek?
asp-route-*: <form> etiketinin action seçeneğindeki URL ayarlanırken kullanılacak rota değişkenlerini belirtmek için kullanılır. View'dan contoller'a (veya Razor sayfasına) taşınan form verilerine ilave veri taşımak için kullanılabilir. Örneğin asp-route-id seçeneği id rota değişkeni için değer belirtir.
asp-route: URL oluşturulurken hangi rotanın kullanılacağını belirtmeye yarar.
asp-antiforgery: Kullanıldığı view'a anti-forgery bilgisini eklenip eklenmeyeceğini kontrol eder. Anti-forgery konusu ileride işlenecektir.
asp-fragment: HTML'de linkin sonuna eklenen ve # ile başlayan kısmı belirtmek için kullanılır.
Örnek kullanım:

Bu örneğimizde formdaki veriler formu'u render'layan controller'ın submitform action'ına gidecektir. Bir <form> etiketi için method seçeneği belirtilmezse varsayılan olarak post değeri kullanılacaktır. Başka bir örnek:

Bu örneğimizde ise form verileri FormHandler Razor sayfasına gidecektir.

Form verilerini sunucuya gönderecek buton formun dışında tanımlanabilir. Bu durumda <button> etiketinin form seçeneği butonun ilişkili olduğu formu; asp-controller, asp-action, asp-page, vb. seçenekler ise form verilerinin gönderileceği action veya Razor sayfasını belirtmeye yarar. Örnek:

<button> etiketine biraz önce gördüğümüz <form> etiketinin action HTML seçeneğinin değerini oluşturmak için kullandığımız bütün tag helper seçenekleri eklenebilir. Formun dışında oluşturulan buton, çoğunlukla form verilerini varsayılan action veya Razor sayfası dışında bir yere göndermek istediğimiz zaman kullanılır.

HTML'deki <input> etiketi kullanıcıdan genel anlamda veri almak için kullanılır ve HTML'deki en yaygın form kontrolüdür. type seçeneğinde belirtilen değerlerle form kontrolünün tipi belirtilir. <input> etiketine etki eden tag helper sınıfı InputTagHelper'dır. Aşağıdaki iki seçenek <input> etiketlerine eklenebilir:
asp-for: Bu <input> etiketine hangi model özelliğine bağlanacak?
asp-format: <input> etiketinin içinde gösterilecek model özelliğinin değerinin hangi formatta gösterileceğini belirtmeye yarar.
asp-for seçeneğinde eklenen model özelliğinin ismi, tipi ve değerine bakılarak üretilecek HTML kodunun name, id, type ve value özelliklerinin değerleri belirlenir. Örnek:

Bu örneğimizde <input> etiketi için üretilen HTML kodu şöyle bir şey olacaktır:

Buradaki data-val ve data-val-required seçenekleri bu aşamada bizi ilgilendirmiyor. Burada dikkat etmemiz gereken nokta model özelliğinin ismiyle id ve name seçeneklerinin değerlerinin, model özelliğinin değeriyle value seçeneğinin değerinin belirlenmesi. Ayrıca model özelliğimiz bir string olduğu için <input> etiketinin type seçeneğinin değeri text olarak ayarlandı. Aşağıdaki tablo hangi C# tiplerinin hangi tip <input> etiketi oluşturacağını belirtmektedir:

Bu tablodaki değerler sadece varsayılan değerlerdir ve istenirse <input> etiketi için bir type seçeneği belirtilerek bu varsayılan değerlerin geçersiz kılınması sağlanabilir. Ancak böyle bir senaryoda farklı view'larda aynı model özelliği için oluşturulan bütün form kontrollerinde aynı type seçeneğinin belirtilmesi gerekmektedir. Daha şık bir çözüm model sınıfında ilgili özellik için hangi form kontrolünün oluşturulacağının şöyle belirtilmesidir:

Soldaki attribute'lar ilgili C# model sınıfındaki özelliğe attribute olarak eklenir. Sağdakiler ise tag helper tarafından ilgili özellik için üretilecek <input> etiketinin type seçeneğinin değeridir.
NOT: Eğer model özelliğinin tipi yukarıdaki tabloda listelenen C# tiplerinden birisi değilse ve tip belirtici herhangi bir attribute ile işaretlenmediyse <input> etiketinin type seçeneğinin değeri text olacaktır.

Bir <input> etiketi için format seçeneğiyle belirli bir format belirtilmezse ilgili kontrolün içinde gösterilecek model özelliğinin değeri için varsayılan formatlama yapılır. Örnek:

kodu sonucunda üretilen HTML şöyle bir şey olacaktır:

Burada konumuz için önemli olan value seçeneğinin değeridir. Değerde noktadan sonra iki basamak gözükmektedir. Bu iki basamağın sebebi model sınıfında ilgili özelliğe eklenen şu attribute'tur:

Bu attribute veritabanı tarafından ilgili özelliğin ne şekilde depolanacağını belirtmektedir. Attribute sayesinde veritabanındaki Price değerlerinin ondalık kısım dahil toplam 8 basamağı olacaktır, virgüld

Bu bölümde kendi tag helper sınıflarımızı nasıl yazacağımızı ve bu tag helper'ları nasıl istediğimiz view'da kullanacağımızı göreceğiz. Tag helper sınıfları geleneksel olarak TagHelpers klasörüne konulur. Şimdi ismi DivTagHelper.cs olan ve içeriği aşağıdaki gibi olan dosyayı TagHelpers klasöründe oluşturun.

Bu tag helper <div bg-color="renk">...</div> şeklinde belirtilen HTML kodlarını <div style="background:renk">...</div> şekline çevirecektir. Örneğimizde de gördüğünüz üzere tag helper sınıfları Microsoft.AspNetCore.Razor.TagHelpers isim alanındaki TagHelper sınıfından türerler. Kullanıldığı view'dan HTML seçeneği olarak alacağı seçenekleri birer özellik olarak belirtir. Hangi HTML etiketi üzerinde çalışacaksa ismini ona göre alacaktır. Bu örneğimizde <div> etiketleri üzerinde çalışacağı için ismi DivTagHelper olmuştur. Daha sonra göreceğimiz üzere bir tag helper'ın üzerinde çalışacağı HTML etiketleri kümesi attribute'lar vasıtasıyla genişletilip daraltılabilir. HTML etiketi üzerinde yapılacak modifikasyonlar ana sınıftan devralınan Process() metodu override edilerek belirtilir. Bu metodun ikinci parametresi olan TagHelperOutput tipindeki output değişkeniyle çıktı etiketin bir seçeneği ayarlanmaktadır. Bu aşamada view'da ilgili HTML etiketine eklenen sahte seçenekler kaldırılmıştır. Sonuçta örneğimizde <div> etiketine eklenen tek seçenek style olacak ve değeri de background:renk olacaktır. Eğer halihazırda ilgili <div> etiketinin style seçeneği varsa değeri belirtilen değerle değiştirilecektir.

Az önceki örneğimizde Process() metodunun ilk parametresi olan TagHelperContext tipindeki context değişkenini kullanmadık. TagHelperContext sınıfı, view'da kullanılan etiket hakkında bağlam bilgisi sağlar ve aşağıdaki üyeleri içerir:
AllAttributes: İlgili HTML etiketine eklenen bütün seçenekleri anahtar-değer çiftleri şeklinde tutar. Seçeneklere indeks veya isim yoluyla erişilebilir.Items: Birden fazla tag helper arasında koordinasyon sağlamak amacıyla kullanılır.UniqueId: İlgili HTML etiketini benzersiz olarak tanımlayan id bilgisini döndürür.
İlgili HTML etiketinin seçeneklerine AllAttributes özelliği ile erişilebilmesine rağmen bunları tag helper sınıfında özellik olarak tanımlamak daha kullanışlıdır. Tag helper bir view'da kullanıldığı zaman sağlanan seçenek değerleri tag helper sınıfında tanımlanan özelliklere otomatik olarak atanır. Tag helper sınıfındaki özellikler string olmak zorunda değildir; int, bool, vb. temel veri tipleri de olabilir. Bu durumda ASP.NET Core tarafından otomatik dönüşüm yapılır. Tag helper sınıfında olup da HTML etiketinde karşılığı olmayan özellikler varsayılan değerine atanır, HTML etiketinde olup da tag helper sınıfında karşılığı olmayan seçenekler ise göz ardı edilir, ancak HTML etiketinden silinmez. Bir HTML etiketinin seçenekleri asp- ile veya data- ile başlayamaz. asp- ön eki dahili tag helper'lar için ayrılmıştır. data- ön eki ise web geliştirmede custom seçenekler oluşturmak için yaygın olarak kullanıldığı için yasaklanmıştır.
Varsayılan durumda tag helper sınıfındaki özellik adları HTML etiketindeki seçenek adlarına karşılık gelir. HTML kodundaki "bg-color" C# kodundaki "BgColor"a karşılık gelir. Ancak istenirse bu varsayılan durum değiştirilebilir. Bir tag helper sınıfındaki bir özelliğin hangi HTML seçeneğine karşılık geleceği ilgili özelliğe eklenen HtmlAttributeName attribute'u ile belirtilebilir.

Bir tag helper'ın üreteceği çıktı Process() metodunun içinde TagHelperOutput tipindeki output değişkeni kullanılarak belirtilir. Bu değişken ilk olarak HTML etiketinin mevcut durumuyla doldurulur, üzerinde aşağıda belirtilen TagHelperOutput sınıfının üyeleri kullanılarak modifikasyon yapılır ve sonuç çıktı üretilir.
TagName: İlgili HTML etiketinin etiket ismini almak ve değiştirmek için kullanılır.Attributes: Çıktının seçeneklerini oluşturmak için kullanılabilecek bir sözlük döndürür.Content: Çıktının içeriğini oluşturmak için kullanılabilecek bir TagHelperContent nesnesi döndürür.GetChildContentAsync(): HTML etiketinin mevcut içeriğine erişmek için kullanılır.PreElement: Tag helper'ın kullanıldığı yerin hemen öncesine içerik eklemek için kullanılır.PostElement: Tag helper'ın kullanıldığı yerin hemen sonrasına içerik eklemek için kullanılır.PreContent: Tag helper'ın içeriğinden hemen öncesine içerik eklemek için kullanılır.PostContent: Tag helper'ın içeriğinden hemen sonrasına içerik eklemek için kullanılır.TagMode: Üretilecek HTML etiketinin modunu belirtmek için kullanılır.SupressOutput(): Bir HTML etiketinin view'dan çıkartılmasını sağlar.

Bir tag helper'ın bir view'da kullanılabilmesi için öncelikle @addTagHelper direktifi ile kaydettirilmesi gerekmektedir. Bu direktif direkt ilgili view'da kullanılacağı gibi daha çok yerde etkili olabilmesi amacıyla _ViewImports.cshtml dosyalarına da koyulabilmektedir. Örneğimizde @addTagHelper direktifini şöyle kullanırız:

@addTagHelper *, WebApp

Burada WebApp projemizin ismidir ve kodumuz WebApp projesindeki hangi isim alanında olursa olsun bütün tag helper sınıflarına erişim hakkı kazandırmaktadır. Bu kodu, controller view'larında tag helper sınıflarına erişim hakkı kazanmak için Views klasöründeki _ViewImports.cshtml dosyasına, Razor sayfalarında tag helper sınıflarına erişim hakkı kazanmak için Pages klasöründeki _ViewImports.cshtml dosyasına koyabiliriz. Ayrıca:

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

kodu ile Microsoft'un sunduğu bütün dahili tag helper sınıflarına erişim hakkı kazanırız.

Tag helper'ı kullanma hakkı elde ettikten sonra herhangi bir view'da kullanmak son derece basittir. Örnek:

Yazdığımız tag helper sınıfının ilgili div'in içeriğini değiştirmediğine dikkat ediniz. Tag helper sınıfımızın adını DivTagHelper yaptığımız için yapılan değişiklikler bg-color seçeneği belirtsin-belirtmesin bütün <div> etiketlerini etkileyecektir. bg-color seçeneği belirtmemiş bütün <div> etiketlerinin arkaplanı tag helper sınıfındaki varsayılan değer olan yeşil olacaktır. Eğer tag helper sınıfında bir varsayılan değer belirtmeseydik bütün div'ler <div style="background:">...</div> şeklinde modifiye edilecekti. İkisi de eşit şekilde kötüdür. Yapmamız gereken şey tag helper'ın etki ettiği etiketleri tag helper sınıf isminden bağımsız hale getirmektir -ki bu da bir sonraki konumuzdur.

Varsayılan durumda bir tag helper'in kapsamı ismine göre belirlenir ve isminde belirtilen bütün HTML etiketlerini kapsar. Bu varsayılan durum HtmlTargetElement attribute'u ile değiştirilebilir. Örnek:Bu tag helper sadece bg-color attribute'u olan ve üst etiketi <body> olan etiketleri hedeflemektedir. Attribute'ların birden fazla olması durumunda virgül ile ayrılması gerekir. Eğer etiketin attribute'unun belirli bir ön ekle başlamasını yeterli sayıyorsak yıldız işaretini kullanabiliriz. Örnek:Bu tag helper yalnızca bg-color ve text-color attribute'larını içeren <div> etiketlerine uygulanacaktır. Başka bir örnek:Bu tag helper bg- ön ekiyle başlayan herhangi bir attribute içeren bütün <div> etiketlerine uygulanacaktır. HtmlTargetElement attribute'unun TagStructure özelliği ile HTML etiketinin kapatılma cinsine göre de seçim yapılabilir. TagStructure enumu 3 farklı değer alabilir:
Unspecified: TagStructure seçeneğinin belirtilmediği duruma denktir. NormalOrSelfClosing değeri ayarlanır.
NormalOrSelfClosing: Normal HTML etiketleri veya kendi kendini kapatan HTML etiketleri seçilir. (<div>...</div> veya <br />)
WithoutEndTag: Yalnızca ayrı bir bitiş etiketi olmayan etiketler seçilir. (<br> veya <br />)
CSS seçicileri bir tag helper'ın etki edeceği etiketleri seçmek için kullanılabilir. Bu seçici belirtimi yine Attributes özelliğine değer olarak verilir. Örneğin [bgcolor] ile sadece bg-color seçeneği olan etiketler seçilir,[bgcolor=primary]ile bgcolor seçeneğinin değeri primary olan etiketler seçilir, [bg-color^=p]ile bg-color seçeneğinin değeri p ile başlayan etiketler seçilir.

Örnek:Bu örneğimizde tag helper bg-color ve text-color seçeneklerini içeren bütün etiketlere uygulanacaktır. Bir tag helper'a birden fazla HtmlTargetElement attribute'u uygulanabilir. Örnek:Bu tag helper bg-color ve text-color seçeneği olan <tr> etiketlerine veya bg-color seçeneği olan <td> etiketlerine uygulanacaktır.

Bir etikete birden fazla tag helper uygulanabilir. TagHelper sınıfında devralınan Order özelliğiyle ilgili tag helper'ların hangi sırada uygulanacağı belirtilebilir. Order değeri daha düşük olan tag helper daha önce uygulanacaktır.

Bu kısımda biraz daha detaya gireceğiz ve "Çıktı üretme" kısmında gördüğümüz üyelerin kullanımını göreceğiz. Öncelikle hayali bir HTML etiketini gerçek HTML etiketine dönüştüren bir tag helper yazalım:Bu tag helper sayesinde bir view'da <kod> ve </kod> ile çevrelediğimiz her metnin gri renkli bir arkaplanı, siyah renkli bir çerçevesi olacak; ilgili aralığa girilmiş metindeki bütün beyaz boşluklar korunacak ve her bir karakterin sabit genişlikte olduğu kod yazımına uygun font stili kullanılacaktır. Kuşkusuz bu tag helper daha da geliştirilebilir. Dışarıdan etiket seçenekleri şeklinde seçenekler alıp, bunları sınıfta özelliklerde tutup üretilen çıktıya etki etmesi sağlanabilir. Örneğin kullanıcı kod bloğunun çerçeve rengini veya arkaplan rengini belirtebilir. Ayrıca sahte HTML etiketinin içeriğindeki kodlar olduğu gibi çıktı <div> etiketinin içine yazılmaktadır. Çıktı <div> etiketinin içine içeriği yazmadan önce veya sonra bir şeyler de yazılıp kod bloğu süslenebilir.
Eğer HTML spesifikasyonunda olmayan bir etikete uygulanacak tag helper yazıyorsak tag helper sınıfına mutlaka HttpTargetElement attribute'unu eklemeliyiz. Örneğimizde 8. satırda <kod> etiketi <div> etiketine dönüştürülmüştür. 9. satırda <div> etiketinin <div>...</div> şeklinde başlangıç ve bitişi olacağını belirtiyoruz. 10. satırda ilgili <div> etiketinin style seçeneğinin değerini ayarlıyoruz. 11. satırda <kod> etiketinin mevcut içeriğini alıyoruz. output değişkeni üzerinden çağrılan GetChildContentAsync() metodu mevcut etiketin içeriğini bir TagHelperContent olarak dö

View component'lar layout'lar ve partial view'larla aynı amaca hizmet ederler. View'lardaki kod tekrarını önlerler. Özellikle partial view'lara benzerler, ancak partial view'larla aralarında önemli farklar da vardır. Daha önce karmaşık bir web sayfasının içeriğini üretmek için ana view'ın devasa bir veri kümesi aldığını, bu verileri partial view'lara dağıttığını söylemiştik. Bu aslında çok da tavsiye edilen bir durum değildir. Karmaşık web sayfalarında sunulan içerikler sıklıkla değişebilir. Örneğin bir haber sitesinde ana sayfada belirli bir bölgede son dakika haberleri yerine kullanıcı yorumlarının gösterilmesi istenebilir. Bu durumda ana view'a gönderilen verilerin değişmesi gerekmektedir. Bu değişiklik ilgili view'ı renderlayan bütün action'ları da etkileyecektir. Yazılım geliştirmede ana mottolardan biri yapılan bir değişikliğin yazılımda en az yeri etkilemesini sağlamaktır. Ana view'daki partial view'lar gönderilen veriye bağımlı olmazsa karşılaşacağımız sorun büyük ölçüde ortadan kalkacaktır. Elbette ki partial view'ın ana view'a gönderilenlerden başka bir datayı render'laması teknik olarak mümkündür. Partial view C# kod bloklarında kendi iş mantığını içerebilir. Ancak bu, ana view'ın model tipini değiştirmekten daha da yanlış bir tercih olacaktır. View'lar kesinlikle iş mantığı içermemelidir. Yalnızca kendine gönderilen verileri gösterme amacıyla minimal seviyede C# kodu içermelidir.
Ayrıca bazen view component'lerin kullanılması kaçınılmazdır. Örneğin bir alışveriş sitesi geliştirdiğimizi düşünelim. Her sayfada sağ üstte sepetteki ürün sayısı ve ürünlerin toplam tutarı yazması gereksin. Bunu nasıl yapabiliriz? Kuşkusuz bu sepet bilgisini gösterecek header bir layout'ta tutulacaktır. Layout'ların kesinlikle iş mantığı içermemesi gerekir. View component'ları seçenekler arasından çıkardığımızda tek seçenek ilgili layout'u kullanan her view'ın layout'ta section olarak tanımlanan kısma ilgili içeriği göndermesidir. Bu, kod tekrarı açısından korkunç bir şeydir. İşte burada view component'lar imdada yetişiyor. View component'lar partial view'ların iş mantığı içerebilen versiyonlarıdır. Partial view'lar esasında sadece bir view'dır ve kendisine verilen veriyi göstermekle mükelleftir. View component'lar Razor sayfalarında olduğu gibi hem iş mantığı hem de view içerirler. Diğer bir deyişle kendi verilerini kendileri oluştururlar ve kendi view'larını render'larlar. Kullanıldıkları ana view'dan veri almazlar.
Şimdi projenizdeki Models klasörüne ismi City.cs olan ve içeriği aşağıdaki gibi olan model sınıfını ekleyin:

Bu, basit bir model sınıfıdır ve şehir bilgilerini içermektedir. Şimdi projenizin Models klasöründe CitiesData.cs isimli dosyayı oluşturun ve içeriği şöyle olsun:

Bu sınıf ise model verilerine erişim ve değiştirme amacıyla kullanılacak sınıftır. Bu sınıfı programımızın her yerinden kolayca erişilebilmesi için servis olarak tanımlamalıyız. Şimdi aşağıdaki servis çağrısını Program.cs dosyasındaki servis aboneliklerinin yapıldığı kısma ekleyiniz:

Burada servisin singleton bir servis olarak tanımlanması önemlidir. Bu sayede hep aynı City kolleksiyonu üzerinde çalıştığımız için bir request'te bu koleksiyona yaptığımız eklemeleri daha sonraki request'lerde de görebileceğiz. Şimdi Pages klasörüne içeriği aşağıdaki gibi olan ve ismi Cities.cshtml olan bir view ekleyelim.

Burada ilgili view'ın sadece bir kısmı gözükmektedir. View, geri kalan kısmını _ViewStart.cshtml dosyasında belirtilen layout'tan almaktadır. View basitçe servisten aldığı şehir bilgilerini sayfaya yazmaktadır.

İsmi ViewComponent ile bitip Invoke() veya InvokeAsync() metotlarını içeren veya ViewComponent ana sınıfından türeyen veya ViewComponent attribute'u ile işaretlenen sınıflar view component sayılır. View component'lar teknik olarak proje içinde herhangi bir yerde tanımlanabilmesine rağmen geleneksel olarak Components klasöründe tanımlanır. Şimdi Components klasöründe CitySummary.cs isimli bir dosya oluşturalım ve içeriği şöyle olsun:

Bu sınıf bir view component'tır. Çünkü ViewComponent sınıfından türemiştir. View component'larda da controller'larda olduğu gibi yapıcı metot yoluyla servis enjeksiyonu yapılabilmektedir. Bu view component CitiesData servisindeki verilerdeki şehir sayısını ve şehirlerin toplam nüfusunu düz metin olarak üretmektedir. View component'ın ürettiği bu metin herhangi bir view'da rahatça kullanılabilecektir.

View component'ı herhangi bir view'da aşağıdaki şekilde kullanabiliriz:

View'da bu kodu kullandığımız yere "4 cities, 20187537 people" çıktısı verilecektir. Burada aslında CitySummary isimli view component'ın Invoke() metodu çalıştırılmaktadır. ASP.NET Core view component'ta InvokeAsync() metodu olmaması durumunda InvokeAsync() metot çağrılarını Invoke() metoduna yönlendirir. Ancak böyle bir durum da metodun @await direktifiyle beraber çalıştırılması gerekir. Direkt Invoke() metodunu çağırarak view component'lar kullanılamaz. Dolayısıyla bir view component'ta ya Invoke() ya da InvokeAsync() metodu olmalıdır. İkisi beraber olamaz. Ayrıca söz konusu view component'a kullandığımız view'da direkt erişebilmeniz için aşağıdaki satırı ilgilin view'ın kullandığı _ViewImports.cshtml dosyasına veya view'ın kendisine ekleyin:

@using WebApp.Components

Tag helper vasıtasıyla view component'a erişebilmek için öcelikle aşağıdaki satırı view'ın kullandığı _ViewImports.cshtml dosyasına veya view'ın kendisine ekleyin

@addTagHelper *, WebApp

Bu kodla WebApp isim alanının ve altındaki isim alanlarında tanımlanan bütün view component'ları tag helper vasıtasıyla kullanabileceğiz. Şimdi ilgili view'da view component'ı kullanmak istediğiniz yere aşağıdaki kodu yazın:

<vc:city-summary />

Bu kod InvokeAsync() metot çağrısıyla aynı işleve sahiptir. View component sınıf ismi olan "CitySummary"nin "city-summary"ye nasıl değiştiğine dikkat edin.

Şimdiye kadar Invoke() metodu string döndürdü, biz döndürülen string'i ilgili view'a yerleştirdik. Ancak view component'lar bundan çok daha fazlasıdır. View component'lardaki Invoke() veya InvokeAsync() metotları IViewComponentResult arayüzünü uygulamış bir sınıfla geri dönebilirler. Bu arayüzü uygulamış dahili üç sınıf vardır. Bu sınıflar ve bu sınıf türünden nesne üretmek için çağrılması gereken metotlar aşağıdaki listede verilmiştir:
ViewViewComponentResult: Bir view render'lamak için kullanılır. Bu sınıf türünden nesne üretmek için opsiyonel bir model nesnesi parametresiyle beraber View() metodu kullanılır.ContentViewComponentResult: Düz string döndürmek için kullanılır. Düz string'deki HTML kodları HTML olarak algılanmayacak şekilde kodlanır. Bu sınıf türünden nesne oluşturmak için Content() metot çağrısı kullanılır. Bir Invoke() veya InvokeAsync() metodunun string döndürmesi durumunda arkaplanda bu sınıf ve metot kullanılır.HtmlContentViewComponentResult: HTML kodlarının HTML olarak algılandığı, dolayısıyla ekstra bir kodlamanın yapılmadığı düz string oluşturmak için kullanılır. Bu sınıf türünden nesne oluşturabilecek ViewComponent sınıfından devralınmış herhangi bir metot yoktur. new anahtar sözcüğüyle yeni sınıf nesnesi oluşturulmalıdır.

Kuşkusuz yukarıdaki listedeki sınıf ve metotlardan en faydalı olanı ViewViewComponentResult sınıfı ve View() metodudur. View() metodunun aşırı yüklenmiş aşağıdaki versiyonları bulunmaktadır:
View(): View component'ın varsayılan view'ı render'lanır. Bir model nesnesi sağlanmaz.View(model): View component'ın varsayılan view'ı parametrede verilen model nesnesiyle render'lanır.View(viewName): Belirtilen view render'lanır. Model nesnesi sağlanmaz.View(viewName, model): Belirtilen view belirtilen model nesnesiyle beraber render'lanır.
Bir view component istediği view'ı seçebilir ve model olarak da view'ın kabul ettiği model nesnesini gönderebilir. Bu bakımdan bir controller action'ının view seçmesi ve model göndermesiyle arasında büyük benzerlik vardır. Ancak view component'ların view arama süreci controller'lardan biraz farklıdır. Aşağıda bu süreç verilmiştir.

View component'ların view arama süreci bir MVC view'ı veya Razor sayfasında kullanılıp kullanılmadığına göre değişmektedir. Eğer bir view component View() metodunda parametre vermeden varsayılan view'ı çağırdıysa ve eğer view component bir controller tarafından çağrılmış bir view'da kullanıldıysa sırasıyla şu konumlar aranır:

/Views/<controller>/Components/<viewcomponent>/Default.cshtml
/Views/Shared/Components/<viewcomponent>/Default.cshtml
/Pages/Shared/Components/<viewcomponent>/Default.cshtml
Eğer bir view component View() metodunda parametre vermeden varsayılan view'ı çağırdıysa ve eğer view component bir Razor sayfasında kullanıldıysa sırasıyla şu konumlar aranır:

/Pages/Components/<viewcomponent>/Default.cshtml
/Pages/Shared/Components/<viewcomponent>/Default.cshtml
/Views/Shared/Components/<viewcomponent>/Default.cshtml
Razor sayfalarında ilgili Razor sayfasının direkt Pages klasöründe değil de bir alt klasörde tanımlanması da söz konusudur. Eğer view component bir Razor sayfasında kullanıldıysa ve bu Razor sayfası örneğin /Pages/Deneme/Deneme2 klasöründe tanımlandıysa sırasıyla şu konumlar aranır:

/Pages/Deneme/Deneme2/Components/<viewcomponent>/Default.cshtml
/Pages/Deneme/Components/<viewcomponent>/Default.cshtml
/Pages/Components/<viewcomponent>/Default.cshtml
/Pages/Shared/Components/<viewcomponent>/Default.cshtml
/Views/Shared/Components/<viewcomponent>/Default.cshtml
View() metodunu bir view ismi belirtecek şekilde çağırırsak yine aynı konumlarda arama yapılır. Ancak bu sefer aranılan view'ın ismi Default değil, belirtilen isim olur.

Daha önce de söylediğimiz gibi view component'lar bir view yanında direkt HTML de döndürebilirler. Örnek (CitySummary.cs):

Gördüğünüz gibi HtmlContentViewComponentResult sınıfının yapıcı metoduna bir HtmlString nesnesi vermeliyiz. Bu örneğimizdeki HtmlString yapıcı metot çağrısındaki string gerçekten HTML olarak ele alınır. Encoding yapılmaz.

View component'lerin türediği ViewComponent sınıfı bizim için faydalı olabilecek özellikler içerme

Web servisleri yalnızca JSON formatında veri üretir ve istemcinin JSON formatında ürettiği verileri alıp üzerinde işlem yapar (örneğin veritabanına yazar). Web servisleri verinin kullanıcıya gösterilmesiyle ilgilenmez. Bunu Angular, Vue, vb. JavaScript framework'ları yapar. Ayrıca web servisleri mobil uygulamaların backend'leri için de kullanılabilir. Web servisleri istemciyle HTTP protokolü üzerinden iletişim kurar. 
Bir web servis bir URL ve metot kombinasyonuna karşılık verir. Metot işlemin tipini, URL ise ilgili veriyi temsil eder. Örneğin /api/products/1 URL'si GET metodu üzerinden gönderildiği zaman id'si 1 olan ürünün alınmak istendiğini belirtir. GET'e benzer başka metotlar da vardır. Bunlar şunlardır:

Bu bölümün alt kısımları aşağıda verilmiştir.

Örnek Projemiz
Minimal API'yi Kullanarak Web Servis Oluşturma
Controller Kullanarak Web Servis Oluşturma
Web Servislerini Geliştirme
İlişkili Veriyle Çalışma
HTTP Patch Metodu Desteği
İçerik Biçimlendirme
Web Servislerini Belgeleme ve Araştırma

Bu bölümde controller sınıfı ve action metodu kullanarak web servis oluşturacağız.

Web servislerini controller ve action'lar üzerinden tanımlayabilmemiz için öncelikle MVC framework'unu etkinleştirmemiz gerekmektedir. Şimdi Program.cs dosyanızı şöyle değiştirin:

Buradaki builder.Services.AddControllers(); satırı MVC framework'u tarafından kullanılan servisleri ayağa kaldırır, app.MapControllers(); satırı ise rota yapılandırmasını MVC framework'una göre yapar.

Action denen metotları içeren sınıflara controller denir. Sunucunun belirli bir path'ına talep gelmesi durumunda ilgili controller sınıfının nesnesi oluşturulur, bu nesne üzerinden ilgili action metodu çağrılır. Gelen request'in path'ına göre hangi controller ve hangi action'ın seçileceği biraz önce eklediğimiz app.MapControllers(); satırı sayesinde MVC Framework'u tarafından belirlenir. Controller sınıfları geleneksel olarak Controllers klasöründe tutulur ve isimlerinin Controller ile bitmesi zorunludur. Şimdi Controllers klsörünü ve bu klasörin içindeki ProductsController.cs sınıfını oluşturun. ProductsController.cs dosyasının içeriği şöyle olsun:

Controller'lar Microsoft.AspNetCore.Mvc isim alanındaki ControllerBase sınıfından türerler. Bu controller, eklenen Route attribute'u sayesinde "api/<controller>" path'ına karşılık verecek şekilde yapılandırılmıştır. Controller'ın ismi Products olduğuna göre bu controller "api/products" path'ına karşılık verecektir. Controller'da iki tane action bulunmaktadır. Birisi GET talebine karşılık verecek olan GetProducts() action'ı, diğeri yine GET talebine karşılık verecek olan GetProduct() action'ıdır. GetProduct() action'ı id isimli bir parametre almaktadır. Bu parametre birazdan da göreceğimiz üzere request'te api/products/<id> şeklinde verilmelidir. Controller basit olması açısından veritabanıyla iş yapmamakta, dahili .NET nesneleriyle çalışmaktadır. Bu controller'daki action'lardan birincisi tam olarak "api/products" path'ına karşılık vermekteyken, ikinci action "api/products/<<id>" path'ına karşılık vermektedir.
Web servis oluştururken kullanılan action metotlarına herhangi bir isim verilebilir. Action metodun isminin cevap verdiği path'la bir ilgisi yoktur. Web servislerde bir action metodun hangi path'a ve hangi metoda cevap vereceği yalnızca controller ve action'a atanan attribute'lar vasıtasıyla belirtilir. Action'ların cevap verdiği HTTP metodunun belirtilmesi için kullanılabilecek bütün attribute'lar şunlardır:
HttpGet: İlgili action yalnızca GET request'lerinde tetiklenir.
HttpPost: İlgili action yalnızca POST request'lerinde tetiklenir.
HttpDelete: İlgili action yalnızca DELETE request'lerinde tetiklenir.
HttpPut: İlgili action yalnızca PUT request'lerinde tetiklenir.
HttpPatch: İlgili action yalnızca PATCH request'lerinde tetiklenir.
HttpHead: İlgili action yalnızca HEAD request'lerinde tetiklenir.
AcceptVerbs: Action metodun belirtilen birden fazla HTTP metodunda tetiklenebileceğini belirtir.
Bu attribute'lar string tipinde parametre alabilir. Alınan parametre controller sınıfına eklenen Route attribute'unun belirttiği rota argümanına / karakteri ile eklenir ve metodun cevap verdiği path'ı oluşturur. Örneğimizde sonuç olarak ikinci action'ın cevap verdiği path "/api/products/{id}" olacaktır. id değerinin süslü parantezler içinde olması ilgili path segmentinin bir path değişkeni olacağı anlamına gelir.

ControllerBase bütün controller'ların türediği sınıftır ve controller'ın içindeki action'lar tarafından direkt erişilebilecek çok güzel üyelere sahiptir. Bu üyelerden önemli olanları şunlardır:
HttpContext: Geçerli request'ın HttpContext nesnesini döndürür.
ModelState: Forma girilen verilerin validasyonu yapılırken kullanılır. Bu özellik üzerinden erişilen çeşitli özellikler vasıtasıyla forma girilen verilerin geçerli olup olmadığı anlaşılabilir.
Request: Geçerli request'in HttpRequest nesnesini döndürür.
Response: Geçerli request'in response'unu döndürür.
RouteData: Geçerli request'in rota verisini döndürür.
User: Geçerli request'i yapan kullanıcıyı döndürür.
Her request'te yeni bir controller nesnesi oluşturulur, dolayısıyla bu özellikler sadece ilgili request hakkında bilgi verir.
NOT: ASP.NET Core tarafından bir sınıfın controller sınıfı olarak ele alınması için isminin Controller ile bitmesi veya ismi Controller ile biten bir sınıftan türemesi veya Controller attribute'ile işaretlenmesi yeterlidir. Bir sınıfın controller olarak ele alınması için Controllers isimli klasörde tanımlanması, ControllerBase veya Controller sınıfından türemesi gerekli değildir. Controller olma şartlarını taşıyan bir sınıfın controller olmadığını belirtmek için NonController attribute'u ile işaretleriz.

Web servisleri için controller kullanılmasının bir avantajı istemciye gönderilecek nesnelerin elle JSON'a dönüştürülme zorunluluğunu ortadan kaldırmasıdır. Örneğimizde GetProduct() action'ının geri dönüş tipi direkt Product'tır. Bu action'a bir talep gelmesi durumunda otomatik olarak response'a ilgili Product nesnesinin JSON karşılığı yazılacak, header'lar otomatik olarak doldurulacak ve gönderilecektir. Örneğimizde api/products/1 path'ına talep gönderdiğinizde GetProduct() action'ı tetiklenecek, bu action'ın döndürdüğü Product nesnesi otomatik olarak JSON'a çevrilip istemciye gönderilecektir. Benzer şekilde api/products path'ına talepte bulunduğunuzda GetProducts() action'ı tetiklenecek, oluşturulan iki adet Product nesnesinden oluşan dizi bir JSON metni şeklinde serileştirilecek ve istemciye gönderilecektir.

Controller sınıflarına dependency injection yöntemiyle servis enjekte etmek çok kolaydır. Sunucuya gelen her istekte Controller sınıfı türünden nesne oluşturulup bu nesne üzerinden ilgili action metodunun çalıştırıldığını söylemiştik. İşte controller sınıfının yapıcı metodu parametre olarak bir servis tipi alırsa bu servis otomatik olarak çözümlenir. Ayrıca action'lar da kendilerine servis enjekte edebilirler. Şimdi ProductsController.cs dosyamızı şöyle değiştirelim:

Örneğimizde hem yapıcı metot hem de action metodu üzerinden servis enjeksiyonu yapılmaktadır. Buradaki servisler request tabanlı olarak HttpContext nesnesi üzerinden enjekte edilir. Dolayısıyla her türlü servise gönül rahatlığıyla erişebiliriz. Bildiğiniz üzere transient ve scoped servislere Program.cs dosyası üzerinden app değişkenini kullanarak erişemiyorduk.
Varsayılan yapılandırmada veritabanı context nesnelerine scoped olarak erişilir. Her request'te oluşturulan controller nesnesinin bağımlı olduğu context nesnesi de her request'te ayrı olarak oluşturulur. Bu oluşturulan context nesnesini request'ler arasında taşımaya çalışmamalı ve başka controller'lara göndermemeliyiz. Bir controller'ın işi bitip response'u döndürdükten sonra context nesnesinin de işi bitmeli.
GetProduct() action'ı ILogger<> servisine bağımlıdır. Dolayısıyla programın çalışabilmesi için Program.cs dosyasında ILogger<> servisine abonelik yapmalısınız.
Bir metoda parametre yoluyla servis enjekte ediliyorsa ilgili parametrenin FromServices attribute'u ile işaretlenmesi gerekir. Bu attribute ilgili parametrenin normal bir parametre olmadığını belirtir. Daha sonra göreceğimiz üzere normal parametreler request'ten veri almaya yararlar.

Model binding daha sonra göreceğimiz ileri bir konudur. Bu bölümde sadece kısa bir giriş yapacağız. Şimdi ProductsController.cs sınıfımızı şöyle değiştirelim:

Burada GetProduct() metodu, ilk parametresi olan id değişkeninin değerini aynı isimli rota segmentinden almaktadır. Çünkü attribute'unun parametresinde küme parantezleri içine alınmış bir id değişkeni vardır. Bu sayede GetProduct() metodunun gövdesi içinde direkt rota segmentleri ile uğraşma zorunluluğundan kurtuluruz.

Yukarıda model binding aracılığıyla bir rota değişkeninin değerini direkt metot içinde kullanabildik. Model binding bundan çok daha fazlasıdır. Model binding ile gelen request'in body'sinden de otomatik .NET nesneleri oluşturulmasını ve bu nesnenin action metodunun içinde kullanılabilir olmasını sağlayabiliriz. Üstelik bunu etkileştirmek için hiçbir şey yapmamıza gerek yok. Sadece metodun aldığı parametre tipini ilgili karmaşık tip yapmamız yeterli. Şimdi ProductsController.cs dosyasını şöyle değiştirelim:

Burada yapılan ekleme SaveProduct() action'ıdır. Bu action, "api/products" path'ına bir POST request'i geldiğinde tetiklenecektir. FromBody attribute'u ilgili parametrenin request'i body'siyle doldurularacağı belirtmektedir. SaveProduct() action'ına bir talep geldiğinde request'in body'sindeki JSON deserialize edilerek Product nesnesine otomatik olarak dönüştürülür. Sonra ilgili Product nesnesi metot gövdesinde istenildiği şekilde kullanılabilir.

Şimdi ProductsController.cs sınıfını şöyle değiştirelim:

Bu örneğimizde controller sınıfımıza iki yeni action eklenmiştir. Eklenen action'lardan biri var olan kaydı güncellemekte, ikincisi silmektedir.

Daha önce güncelleme işlemlerini PUT metoduyla yaptık. Ancak PUT metodu esasında var olan nesneyi silme, yerine yeni bir nesne koyma mantığında çalışır. Ancak PUT metodu her zaman uygulanabilir değildir. Bazen bir nesnenin çok fazla özelliği olabilir. Nesneyi tamamen silip yeni baştan üretmek maliyetli olabilir. Veya istemci nesnenin sadece bazı özelliklerini almıştır, diğer özelliklerinden haberi yoktur, ve aldığı özelliklerden birini değiştirmiştir, ve değiştirdiği özelliği geri veritabanına yazmak istiyordur. Böyle bir senaryoda ciddi bir sorun oluşur. Böyle bir durumda istemcinin sağlamadığı özellikler mecburen null olacaktır veya güncelleme girişi doğrulama sürecine takılacak ve hiç güncelleme yapılmayacaktır. Çözüm sunucuya PATCH isteği göndermektir. PATCH isteğinde istemci bir nesnenin sadece değişen özelliklerini gönderir, ilgili nesnenin değişen özellikleri güncellenir, veritabanındaki diğer özelliklere dokunulmaz.

JSON, PATCH işleminin nasıl yapılacağını belirtmek için standart bir sözdizimi sağlamaktadır. Örnek:

Bu JSON verisi Supplier sınıfının iki özelliği için yeni değer belirtmektedir. Özellikler Name ve City'dir, bu özellikler için verilecek yeni değerler ise "Surf Co" ve "Los Angeles" olarak belirtilmiştir. PATCH metoduyla talebi alacak olan action, ilgili Supplier'ın id'sini rota değişeninden alacak, ilgili id'li supplier'ın Name ve City özelliklerini belirtilen değerlerle değiştirecek, ilgili supplier'ın diğer özelliklerine dokunmayacaktır.

ASP.NET Core Empty şablonuyla yeni bir proje oluştuduğumuzda varsayılan durumda PATCH desteği olmaz. Uygulamamıza PATCH desteğini eklemek için NuGet Paket Yöneticinden Microsoft.AspNetCore.Mvc.NewtonsoftJson paketinin 6.0.0 versiyonunu kurmalıyız. İlgili paketi kurduktan sonra Program.cs dosyamızı şöyle güncelleyelim:

Bu program JSON'a serileştirme için standart kütüphane yerine JSON.NET serileştiricisini kullanmaktadır. Ayrıca ilgili serileştirici options pattern ile konfigüre edilmiş ve değeri null olan özelliklerin üretilen JSON'a dahil edilmemesi sağlanmıştır.

Şimdi SuppliersController sınıfını şöyle değiştirelim:

Kod son derece basittir. PatchSupplier() action'ı ilgili supplier'ın id'sini rotadan almaktadır. Daha sonra bu id'li supplier'ı veritabanından getirmekte, gelen request'in gövdesinde JSON formatında dersin başında belirttiğimiz şekilde gönderilen değişiklikleri patchDoc nesnesi içinde tutmakta, daha sonra bu değişiklikleri ilgili Supplier nesnesine uygulamakta, sonra değiştirilmiş nesneyi geri veritabanına yazmaktadır. Ayrıca teyit amacıyla değiştirilmiş nesneyi olduğu gibi geri döndürmektedir.

Bu bölümde minimal API'yi kullanarak web servis oluşturacağız. Şimdi projenizin Program.cs dosyasını şöyle değiştirin:

Aslında burada bilmediğimiz bir şey kullanmadık. Programımızda üç farklı rota var. Bunlar GET metoduyla yapılan "api/products/<id>", GET metoduyla yapılan "api/products" ve POST metoduyla yapılan "api/products" isteğine karşılık veriyor. İlk rotada ilgili id'ye sahip kayıt veritabanından çekilerek JSON olarak istemciye gönderiliyor, ikinci rotadan veritabanındaki bütün ürünler çekilerek istemciye gönderiliyor, üçüncü rotada request'in body'sinde bulunan JSON verisi deserialize edilerek Product nesnesine dönüştürülüp veritabanına yazılıyor.
İlk iki rotayı test etmek kolaydır. Yalnızca tarayıcı üzerinden ilgili path'a talep yapmak yeterlidir. Üçüncü rotayı test etmek için suncuya bir POST isteği göndermek için Geliştirici PowerShell pencereciğinde aşağıdaki komutu verebilirisniz:

Invoke-RestMethod http://localhost:5000/api/products -Method POST -Body (@{Name="Swimming Goggles"; Price=12.75; CategoryId=1; SupplierId=1} | ConvertTo-Json) -ContentType "application/json"

Burada özellikleri verilen Product nesnesini JSON'a çevirerek POST metoduyla sunucunun "api/products" path'ına gönderiyoruz. Şimdi tarayıcı üzerinden sunucuya http://localhost:5000/api/products talebini tekrar gönderin ve az önceki komutla eklediğiniz nesnenin veritabanına eklendiğini görün.

Bu bölümde yazdığımız web servislerinin üçüncü parti yazılımlar tarafından nasıl kullanılacağını belirteceğiz. Web servislerimiz için yazdığımız bu dokümantasyonlara gelişticiler programatik olarak erişebilecek. Servislerimizi belgelemek için OpenAPI'yı kullanacağız.

OpenAPI'ın düzgün çalışabilmesi için action metotlarımızın karşılık verdiği path ve HTTP metodu bakımından çakışma olmaması gerekmektedir. Bir önceki dersteki ContentController sınıfındaki SaveProductJson() ve SaveProductXml() action'larının ikisi de POST request'i üzerinden tetiklenmekte ve ikisi de "api/content" path'ına karşılık vermektedir. ASP.NET Core yönünden bir çakışma yoktur. Çünkü birisi JSON taleplerine, diğeri XML taleplerine cevap vermektedir ve bu ayrım Consumes attribute'u üzerinden yapılmaktadır. Ancak OpenAPI'ın attribute seviyesinde ayrım yapma imkanı yoktur. OpenAPI'ın tek baktığı path ve HTTP metodudur. Bu bakımdan bir önceki dersteki ContentController sınıfındaki SaveProductXml() action'ını silelim.

Swashbuckle paketi OpenAPI standardının bir ASP.NET Core implementasyonudur. Şimdi NuGet Paket Yöneticisini kullanarak Swashbuckle.AspNetCore paketinin 6.2.3 versiyonunu kuralım. Daha sonra Program.cs dosyasını aşağıdaki gibi değiştirelim:

Kodumuza eklediğimiz bu servis ve middleware çağrıları ile programımıza bazı yetenekler kazandırdık. İlk olarak programı çalıştırdıktan sonra http://localhost:5000/swagger/v1/swagger.json adresine talepte bulunduğunuzda uygulamanızdaki bütün action'lar, bu action'ların hangi path'a karşılık verdiği, parametreleri, vs. hakkında detaylı bilgi alabilirsiniz. Aldığınız bu bilgiler JSON formatındadır ve pek de human-readable değildir.
İkinci olarak da http://localhost:5000/swagger adresine talepte bulunabilirsiniz. Bu adreste de yine bir önceki linkteki aynı bilgiler vardır, ama daha okunaklıdır.

Swagger, otomatik olarak uygulamamızın desteklediği path'ları, HTTP metotlarını, her bir action'ın hangi HTTP durum kodlarını döndürebileceğini, vs. belirtmektedir. Ancak sağladığı verilerde bazen hata yapabilmektedir. Örneğin ProductsController sınıfındaki GetProduct() action'ının kaynak koduna bakalım:

Kodumuzda gördüğümüz gibi GetProduct() action'ı hem HTTP 404, hem de HTTP 200 kodunu döndürebilmektedir. Ancak Swagger üzerinden bakarsanız bu action'ın sadece 200 kodunu döndürebileceğini söylediğini görürsünüz. Elbette ki Swagger kodumuzu satır satır incelemez, bazen kolaycılığa kaçar, veya tahminlerde bulunur. Bir üçüncü parti yazılım geliştiricisi için bu kötü bir şeydir. Yazdığı programı HTTP 404 hatalarıyla baş edebilecek şekilde yazması gerekirken Swagger'ın verdiği bilgilere güvenerek bu ihtimalin önlemini almayabilir.

API analizcisi web servisimizi inceler ve servisimizdeki olası sorunları -biraz önce bahsettiğimiz sorunu dahil- ortaya koyar. Şimdi proje dosyanızı şöyle değiştirin:

Bu XML tabanlı dosyadaki biri hariç bütün içerik ASP.NET Core tarafından otomatik oluşturulmuştur. Bizim tek eklediğimiz <PropertyGroup> etiketi ve içindeki <IncludeOpenAPIAnalyzers> etiketidir. Proje dosyanızı böyle değiştirdikten sonra artık ASP.NET Core GetProduct() action'ındaki return NotFound(); satırının altını yeşil ile çizecek ve action'ın döndürebileceği response kodlarının bariz olmadığını söyleyecek. Bu sorunun üstesinden gelmek için GetProduct() action'ını şöyle değiştirebilirsiniz:

Örnekte de anlaşıldığı gibi ProducesResponseType attribute'u bir action'ın geri dönrüebileceği HTTP kodlarını belirtmek için kullanılabilir. Artık Swagger doğru bir şekilde ilgili action metodumuzun hangi HTTP kodlarını döndürebileceğini servisimizi kullanacak geliştiriciye söyleyebilecek.

Bu derste bir önceki derste yaptığımız controller tabanlı web servisini geliştireceğiz.

varsayılan durumda bir web sayfasını ilk olarak kim sunduysa JavaScript üzerinden sadece aynı sunucuya istek gönderilebilir. Örneğin başka bir sunucudan sunulan bir web sayfasının içindeki javaScript kodu varsayılan durumda bizim servisi kullanamaz. Bu güvenlik amacıyla alınmış bir önlemdir. Ancak bazen bu önlemi gevşetmek faydalı olabilir. CORS politikasını servis aboneliği ve middleware kaydı yaparak gevşetebiliriz. Şimdi Program.cs dosyanızı şöyle değiştirin:

Bu örneğimizde artık http://example.com ve http://www.contoso.com web sitelerinin sayfaları bizim servisimize JavaScript üzerinden talep gönderebilecek.

Action'ları asenkron kullanabiliriz. Örnek (ProductsController.cs):

Asenkron action kullanmanın faydası daha az thread kullanarak çok daha fazla sayıda isteği eş zamanlı karşılayabilmektir. Action'ların senkron versiyonlarında bir thread action'ın başından sonuna kadar action'ın yürütülmesinden sorumludur. Her action'a bir thread atanır ve action'ın yürütülmesi esnasında thread başka amaçla kullanılamaz. Halbuki action'lar veritabanı erişimi gibi potansiyel olarak vakit alıcı ve işlemciye yüklenmeyen işlerle ilgilenebilirler, bu tür bir durumda işlemci boşta kalır ve thread başka bir amaçla kullanılabilir hale gelir. Senkron action'lar esasında zamanlarının büyük kısmını çevresel bileşenin işini yapmasını beklemekle geçirirler. Böyle bir durumda thread'in veritabanını beklemektense yeni request karşılamakla ilgilenmesi daha mantıklıdır. Veritabanı veriyi hazırlayıp action'a verdiğinde thread eski görevine geri döner.
ASP.NET Core'da veritabanıyla ilgili işlem yapan her metodun asenkron versiyonu yoktur. Örneğin kodmuzda Remove() ve Update() metotları senkron kullanılmak zorunda kalınmıştır.

Bazen istemciler sunucuya gerekenden daha fazla veri gönderebilirler, bu durum çalışma zamanı hatası oluşmasına neden olabilir. Bu durumun önüne geçmeliyiz. Örneğin yukarıdaki SaveProduct() action'ında istemcinin Product için ProductId değeri göndermemesi gerekir. Çünkü veritabanına yeni kayıt eklenmesi işleminde ProductId değeri otomatik atanmaktadır. Eğer kullanıcı ProductId değeri gönderirse çalışma zamanı hatası oluşur. Over-binding'den sakınmanın bir yolu sadece bind edilecek özellikleri tutan yeni bir sınıf oluşturmaktır. Projenizin Models klasörüne ismi ProductBindingTarget.cs olan ve içeriği aşağıdaki gibi olan dosyayı ekleyin:

Bu sınıf bind'lanacak özellikler yanında Product sınıfına dönüşümü yapacak metodu da içermektedir. Şimdi controller sınıfındaki SaveProduct() metodunu şöyle değiştirelim:

Artık SaveProduct() metodu parametre olarak ProductBindingTarget kabul etmektedir. Gelen JSON verisinde ProductId için bir girdi olsa bile ProductBindingTarget sınıfında bu isimde bir özellik olmadığı için gelen ProductId verisi atılacaktır. Daha sonra ASP.NET Core tarafından oluşturulan ProductBindingTarget nesnesi Product nesnesine dönüştürülerek veritabanına yazılacaktır. Veritabanına gönderilirken ilgili Product'ın ProductId özelliğinin değeri 0 olacaktır, bu sayede veritabanına yazılırken herhangi bir sorun çıkmayacaktır.

Bir action metodun işi bittiğinde ASP.NET Core olası gönderilecek değerlerle beraber uygun gördüğü bir HTTP durum kodunu gönderir. ASP.NET Core'un gönderdiği durum kodları çoğunlukla mantıklıdır, ancak bazen istediğiniz durum kodunu alamayabilirsiniz. Örneğin GetProduct() action'ından veritabanında olmayan id'li bir kayıt istediğinizde ASP.NET Core geriye HTTP 204 kodunu gönderir. Bu, başarılı bir request yapıldığını ancak request'e karşılık bir response döndürülmediğini belirtir. Böyle bir durumda HTTP 404 kodunu döndürmek daha mantıklı olabilir. Benzer şekilde normalde değer döndürmeyen action'ların değer döndürmesini isteyebiliriz. Örneğin SaveProduct() action'ının veritabanına yeni yazılan Product'ın id'siyle geri dönmesini isteyebiliriz.
Bir action metodu IActionResult arayüzünü uygulayan bir sınıf nesnesiyle geri dönebilir. ControllerBase sınıfından devralınan ve hepsi IActionResult döndüren aşağıda verilen metotlar action'ın vereceği cevabı belirtmek amacıyla kullanılabilir.
Ok(): HTTP 200 kodu gönderilir. Opsiyonel olarak herhangi bir parametre de verilebilir. Bu durumda ilgili nesnenin JSON karşılığı response'a yazılır.
NoContent(): HTTP 204 kodunu gönderir. Talebin başarılı bir şekilde alındığını ve ilgili işlemin yapıldığını ama sonuçta veri göndermeye gerek olmadığını belirtir.
BadRequest(): HTTP 400 kodunu gönderir. Request'in uygun bir formatta yapılmadığına işaret eder. Opsiyonel olarak request'in neden kabul edilmediğini gösterecek bir ModelState nesnesi gönderilebilir.
File(dosya): HTTP 200 kodunu gönderir. Content-Type header'ını dosyanın uzantısına göre belirler ve belirtilen dosyayı istemciye gönderir.
NotFound(): HTTP 404 kodunu gönderir. Aranılan kaynağın bulunamadığını belirtir.
Redirect(url), RedirectPermanent(url): Bu iki metot belirtilen URL'ye yönlendirme mesajı gönderir.
RedirectToRoute(rota), RedirectToRoutePermanent(rota): Yönlendirmeler uygulamanın rota yapılandırması kullanılarak yapılır.
LocalRedirect(url), LocalRedirectPermanent(url): Bu iki metot uygulamanın içinde lokal yönlendirme yapar. Yönlendirme URL ile olur.
RedirectToAction(action), RedirectToActionPermanent(action): Belirtilen action'a yönlendirme yaparlar.
RedirectToPage(page), RedirectToPagePermanent(page): Belirtilen Razor sayfasına yönlendirme yaparlar.
StatusCode(kod): Belirtilen durum kodunu döndürür.
Bir action'ın bu metotları kullanmadan bir nesne döndürmesi Ok() metodunu çalıştırıp parametre olarak ilgili nesneyi vermesine eşdeğerdir. Bir action metodun null değer döndürmesi NoContent() metot çağrısına denktir. Şimdi ProductsController.cs dosyasını şöyle değiştirelim:

Programımızda iki tane action'da değişiklik yapılmıştır. Artık GetProduct() action'ının aradığı ürün veritabanında yoksa geriye 404 kodunu gönderecektir. Eğer ürün varsa 200 kodunu ve ürünü gönderecektir. Ayrıca SaveProduct() action'ı yeni kaydettiği Product nesnesiyle geri dönmektedir.

Biraz önce gördüğümüz action sonuç metotlarının büyük bir kısmı yönlendirmeler için ayrılmıştır. En basit yönlendirme yöntemi Redirect() metodunu kullanmaktır. Örnek:

Bu action uygulamamızın "api/products/1" path'ına yönlendirme yapmaktadır. Bu şekilde yapılan yönlendirmeye statik yönlendirme denir. Uygulamamızın rota mekanizması değiştiğinde yönlendirme çalışmaz hale gelir.

Aşağıdaki action aynı controller'daki GetProduct() action'ına yönlendirme yapmaktadır:

Bu tür bir yönlendirmede uygulamamızın rota yapılanması değiştirilse bile yönlendirme çalışmaya devam edecektir. Eğer örneğimizdeki gibi sadece action'ın belirtildiği RedirectToAction() metodunu kullanırsak controller geçerli controller varsayılır. İstersek controller'ı da belirtebiliriz. Örnek:

Action'a yönlendirme, arkaplanda yönlendirme için rota değişkenlerini kullanır. MVC'nin rota yapılandırmasında controller ve action isimli iki rota değişkeni bulunur. İstersek bu rota değişkenlerini elle de girebiliriz:

LocalRedirect() ve LocalRedirectPermanent() metotlarıyla yapılan yerel yönlendirmelerin Redirect() metodu ile yapılan klasik yönlendirmeden tek farkı eğer uygulama içinde olmayan bir URL'ye yönlendirme yapılıyorsa çalışma zamanı hatası fırlatmasıdır.

Kullanıcı tarafından servisimize gönderilen verilen istediğimiz kriterleri sağlamıyor olabilir. Bu durumda bir doğrulama işlemi yapmamız gerekir. Doğrulama konusu kapsamlı bir konudur, burada sadece bir giriş yapılacaktır. Şimdi ProductBindingTarget.cs sınıfını şöyle değiştirelim:

Burada ProductBindingTarget sınıfındaki bütün özelliklerin gerekli olduğunu belirttik. Bu kısıtların geçerli olması için ProductsController.cs dosyasındaki SaveProduct() action'ını şöyle değiştirmeliyiz:

Bir controller sınıfına ApiController attribute'unun eklenmesi ilgili controller sınıfının davranışını değiştirir. Bir controller sınıfında ApiController attribute'unun kullanılması actionların parametrelerinde FromBody attribute'unu kullanmasını ve yukarıda if (ModelState.IsValid) şeklinde yaptığınız veri kontrolünü gereksiz kılar. Bu sayede kod daha okunaklı ve sade hale gelir. Bu bilgiler eşliğinde ProductsController.cs dosyamızı şöyle değiştirelim:

Örneğimizde SaveProduct() ve UpdateProduct() action'ları oldukça sadeleşmiştir.

Uygulamamızda Getproducts() ve GetProduct() action'larının döndürdüğü Product'ların bazı özellikleri daima null olmaktadır. Bunlar Product sınıfına navigasyon amacıyla koyduğumuz Category ve Supplier özellikleridir. Bunlar ileride Entity Framework Core tarafından doldurulacak ve ilgili ürünün hangi kategoride olduğunu ve hangi tedarikçi tarafından sağlandığını kolayca görmemizi sağlayacaktır. Şimdilik değerlerinin null olmasında herhangi bir sakınca yoktur. Ancak ne zaman istemciye bir Product veya Product kolleksiyonu göndersek oluşan JSON'ın içinde değeri daima null olan bu özellikler de olacaktır. Bu sorunun birden fazla çözümü var.

En basit yaklaşım içinde daima değeri null olacak özellikler barındıran bir tipi değeri daima null olacak bu özellikleri çıkararark başka bir tipe projekte etmektir. Örnek:

Bu yöntem basittir. Ancak bazı dezavantajları vardır:

Sunucu tarafındaki geliştirici anonim tipe eklenecek özellikler bakımından kısıtlanmadığı için servisi tüketecek geliştirici aldığı nesnede hangi özelliklerin olup hangilerinin olmadığı konusunda emin olamaz.
Sunucu tarafındaki geliştirici eklenmesi gereken bir veya birden fazla özelliği eklemeyi unutabilir.
Sunucu tarafındaki geliştirici her Product nesnesi göndereceği zaman aynı anonim tip tanımını ve projeksiyonunu yapmak zorunda olduğu için kod tekrarı oluşur ve kodun bakımı zorlaşır.

Daha güzel bir yaklaşım JSON serileştiricisini konfigüre etmektir. Şimdi Product.cs dosyamızı şöyle değiştirelim:

Product sınıfımızdaki Supplier özelliğine uygulanan attribute sayesinde artık Supplier özelliğinin değeri null ise JSON serileştiricisi tarafından serileştirmeye dahil edi

Bu kısımda kitabın Web Servisleri bölümü için kullanılacak örnek proje oluşturulacaktır. Şimdi ASP.NET Core Empty şablonuyla WebApp isimli bir proje oluşturalım. Projenin launchSetting.json dosyasında profiles:WebApp:applicationUrl girdisinde değişiklik yaparak sunucunun 5000 portunda dinlemesini sağlayalım. Ayrıca profiles:WebApp:launchBrowser girdisini false yapalım ki sunucuyu başlattığımızda tarayıcı otomatik olarak açılmasın.

Projemiz veritabanına okuyup yazacak. Öncelikle NuGet Paket Yöneticisinden Microsoft.EntityFrameworkCore.Design ve Microsoft.EntityFrameworkCore.SqlServer paketlerinin 6.0.0 versiyonlarını kuralım. Şimdi model sınıflarımızı oluşturalım. Projenizin ana klasöründe Models isimli bir klasör oluşturun ve içinde ismi Category.cs olan aşağıdaki sınıfı oluşturun:

Şimdi Models klasöründe Supplier.cs isimli bir sınıf oluşturun ve içeriği şöyle olsun:

Şimdi Models klasörüne Product.cs isimli bir sınıf ekleyelim ve içeriği şöyle olsun:

Burada Price özelliği için veritabanında seçilecek tipi decimal(8, 2) olduğunu belirttik. Yani ilgili sayı 8 haneden oluşacak ve ondalık kısmı 2 haneli olacak diyoruz. Her .NET tipinin veritabanı kısmında tam bir karşılığı olmayabilir. Bu tür durumlarda ilgili özelliğin veritabanı tipini elle belirtiriz. Her bir sınıfta Id değerleri vardır. Bunlar elle girilmeyecektir. Veriler veritabanına gönderildikten sonra veritabanı tarafından otomatik atanacaktır. Her bir sınıfta navigasyon özellikleri vardır. Bunlar iki karmaşık tip arasında bağlantı kurmaktadır. Örneğin Category sınıfındaki Products özelliği ilgili kategorideki ürünleri verecektir.

Şimdi .NET nesneleriyle veritabanı arasında köprü görevi görecek olan bağlam sınıfını şöyle oluşturalım (Models klasöründe ve ismi DataContext.cs olsun):

Şimdi Models klsörüne ismi SeedData.cs olan ve içeriği aşağıdaki gibi olan sınıfı ekleyin:

Bu kod her zamankş gibi bekleyen bir migration varsa migrate yapmakta ve sonra veritabanında ürün, kategori ve tedarikçi yoksa verileri oluşturup veritabanına yazmaktadır.

Model sınıflarımız, bağlam sınıfımız ve veri beslemesi yapacak sınıfımız hazır olduğuna göre şimdi Entity Framework'u etkileştirerek yapılandırmaya sıra geldi. Şimdi Program.cs dosyasını şöyle değiştirelim:

Burada SeedData sınıfının SeedDatabase() metodunun ihtiyaç duyduğu context nesnesini oluşturup SeedDatabase() metoduna verdik. Şimdi appsettings.json dosyasını şöyle güncelleyelim:

Burada veritabanına bağlantı için connection string'i belirtme yanında Microsoft.EntityFrameworkCore için loglama seviyesini Information yaptık. Bu sayede Entity Framework Core tarafından oluşturulan SQL sorgularını görebileceğiz.

Şimdi "Geliştirici PowerShell" pencereciğinde aşağıdaki iki komutu sırayla verin:

dotnet ef migrations add Initial
dotnet ef database update

İlk komut migration'ı yapacak olan sınıfı oluşturmakta, ikinci komut ise migration'ı uygulamaktadır.

Aslında programımız şu anda hazır. Ama programımızın çalışıp çalışmadığını test etmemiz gerekiyor. Bunun için bir test middleware'i yazacağız. İsmi TestMiddleware.cs olan ve içeriği aşağıdaki gibi olan dosyayı projenizin ana klasöründe oluşturun:

Bu middleware "/test" path'ına karşılık vermekte ve veritabanındaki ürün, kategori ve tedarikçi sayılarını ekrana yazmakatdır. Şimdi bu middleware'i request pipeline'a ekleyelim (Program.cs dosyası):

Programı çalıştırıp /test path'ına talepte bulunduğunuzda aşağıdaki gibi bir çıktı görmeniz lazım:

There are 9 products
There are 3 categories
There are 3 suppliers

Daha önceki derslerde Product, Supplier ve Category sınıflarının navigasyon özellikleri içerdiğini görmüştük. Bu navigasyon özellikleri Category sınıfındaki Products, Supplier sınıfındaki Products ve Product sınıfındaki Category ve Supplier özellikleridir. Şimdiye kadar bu özellikler hep null gelmişti. Şimdi bu özellikleri doldurmaya sıra geldi. Şimdi projenizin Controllers klasörüne SuppliersController.cs isimli bir controller ekleyin. İçeriği aşağıdaki gibi olsun:

Bu controller veritabanından belirli bir tedarikçiyi çekmeye yaramaktadır. ProductsController sınıfındaki veritabanından veri çeken metotlardan farkı Include() metodudur. Include() metodu parametre olarak sonuca hangi özelliğin de dahil edileceğini belirten bir fonksiyon almaktadır. Bu örneğimizde ilgili tedarikçinin Products özelliğini sonuca dahil ediyoruz. Entity Framework Core veritabanındaki ilişkileri takip ederek supplier nesnesinin ilgili Products özelliğini doldurur.
Programı bu şekilde çalıştırıp api/suppliers/1 path'ına talepte bulunursanız bir çalışma zamanı hatası oluştuğunu görürsünüz. Bunun sebebi dairesel bir başvuru zinciri oluşmasıdır. Supplier sınıfının Products özelliği IEnumerable<Product> tipindedir, Product sınıfının Supplier özelliği ise Supplier tipindedir. Yani bu iki sınıf birbirine karşılıklı olarak bağımlıdır.
Aslında burada ilginç bir durum söz konusudur. Biz burada sadece ilgili supplier'ın Products özelliğinin doldurulmasını istedik. ThenInclude() metoduyla her bir ürünün Supplier'ının doldurulmasını istemedik. Aslında Entity Framework Core'un varsayılan davranışı budur, sadece istenen özellikleri doldurur, ThenInclude() metodu çağrılmadıkça özelliğin özelliğine gitmez. İşte burada veritabanına olabildiğince az sorgu gönderme amacı taşıyan Entity Framework Core'a aslında iyi niyetle eklenmiş bir özellik devreye giriyor. Entity Framework Core çektiği verideki bir navigasyon özelliğinin değeri halihazırda aynı context nesnesiyle daha önce çekilmiş veride varsa navigasyon özelliğini otomatik doldurur, ThenInclude() metodunu beklemez. Örneğimizde belirli bir Supplier'ın Product'ları çekilmiştir, bu çekilen Product'ların da Supplier'ı halihazırda çekilmiş Supplier olduğu için Product'ların da Supplier'ını ayarlamaktadır. Bu, eğer veri bellekte tutuluyorsa sorun oluşturmaz, Entity Framework Core yeterince zekidir ve ilgili Supplier'ın Product'larının Supplier olarak en baştaki Supplier'ı işaret ettiğini bilir, yeniden Supplier oluşturmaya çalışmaz. Ama JSON oluştururken sonsuz döngü oluşur. JSON'a önce supplier'ın ilk product'ı supplier'a bir alt girdi olarak girilir. Sonra bu product'ın supplier'ı product'a alt girdi olarak girilir. Sonra bu supplier'ın productları bu supplier'a alt girdi olarak girilir, derken sonsuz dallanma oluşur.

İlişkili verideki dairesel başvurudan kaçınmanın basit bir yolu ne yazık ki yok. Ya modeli en başından dairesel başvuru oluşturmayacak şekilde tasarlayacaksınız ya da veriyi veritabanından çektikten sonra JSON'a dönüştürmeden önce dairesel başvuru içeren özellikleri null yapacaksınız. Aşağıda ikinci yol örneklenmiştir (SuppliersController.cs):

Bu örneğimizde ilgili supplier veritabanından çekildikten sonra ilgili supplier'a ait ürünler üzerinde foreach döngüsüyle dönülmekte ve her bir ürünün Supplier özelliği null yapılmaktadır.

Şimdiye kadar action metotlarımız sadece JSON döndürdü. Ancak bu tek seçenek değildir. Action metotlarımız JSON, XML ve ham metin döndürebilir. Bir action metodun belirli bir biçimde veri döndürmesi demek basitçe Content-Type header'ını ilgili biçime göre ayarlaması ve asıl veriyi de gövdeye yazması demektir. Elbette Content-Type header'ının ayarlanması ve response'un gövdesine bir şeyler yazılması arkaplanda ASP.NET Core tarafından yapılır. Biz sadece yaptığımız ayarlarla action metotların belirli bir biçimde veri döndürmesini sağlarız.
Bir action metodun döndürdüğü veri biçiminin belirlenmesi 4 parametreye bağlıdır:

İstemcinin kabul ettiği biçimler
Sunucunun üretebildiği biçimler
Action metodun tabi olduğu içerik politikası
Action'ın döndürdüğü veri tipi

Yukarıda saydığımız 4 faktörün hep beraber biçime nasıl etki ettiğini irdelemek kafa karıştırıcı olabilir. Şimdilik en basit senaryoyla ilerleyelim. İstemci her türden veri kabul etsin, sunucu her türden veri gönderebilsin ve varsayılan içerik politikası kullanılsın. Bu durumda belirlenecek biçime tek karar veren faktör metodun geri dönüş tipi olacaktır. Böyle bir durumda eğer metodun geri dönüş tipi string ise bu string olduğu gibi istemciye gönderilir. Content-Type header'ı "text/plain" olur. Eğer metodun geri dönüş tipi string değilse belirlenen biçim JSON olur. Bu durumdaki tipler karmaşık tipler veya int, double, vb. gibi temel veri tipleri olabilir.
String tipi diğer tiplere göre özel bir muamele görmektedir. ASP.NET Core diğer temel veri tiplerinin değerlerini çift tırnak içine alarak JSON formatında istemciye göndermektedir. Eğer aynısı string tipinde olacak olsaydı ""metin"" gibi tuhaf bir sentaks oluşurdu. Her istemci bu tür bir JSON değeriyle nasıl başa çıkılacağını bilemeyebilir. O yüzden olası sorunları en başından elimine etmek için ASP.NET Core stringleri direkt tırnak eklemeden text/plain olarak göndermektedir.
Şimdi projemizin Controllers klasörüne ContentController.cs isimli bir controller ekleyelim ve içeriği şöyle olsun:

Bu örnekteki GetString() action'ına talepte bulunursanız geriye "text/plain" biçimde "This is a string response" cevabı alırısnız. Eğer GetObject() action'ına talepte bulunursanız JSON tipindeki Product nesnesine ulaşırsınız.

Çoğu durumda istemci ile sunucu içeriğin hangi biçimde sunulacağı konusunda bir uzlaşmaya varırlar. İstemci belirli bir biçimde veri ister, sunucu o biçimde veri veremeyeceğini söyler, istemci "ondan veremiyorsan bari şundan ver" der. En sonunda ortak bir karar alırlar ve veri o biçimde gönderilir. Bir nevi istemci ile sunucu pazarlık yapar. Bu bölümde uygulamanın içerik politikası ve action metodun geri dönüş tipi sabit kalacak, istemcinin kabul ettiği veri biçimleri değişecektir.
İstemci sunucuya bir talep gönderdiğinde istemcinin hangi biçimlerde veri kabul ettiği Accept header'ında belirli bir formatta belirtilir. Örnek bir Accept header'ı aşağıdaki gibidir:

Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

Accept header'ında belirtilen kabul edilen biçimler virgül ile ayrılmaktadır. Bu örneğimizde istemci HTML, XHTML, XML veri biçimlerini; avif, webp, apng resimlerini ve signed-exchange biçimindeki veriyi kabul etmektedir.
Bir içerik biçiminden noktalı virgül ile ayrılan q değeri o içeriğin biçiminin önceliğini belirtmektedir. q için 1 değeri maksimum öncelik demektir ve hiç q parametresi kullanılmayan duruma denktir. 1'den aşağı doğru inildikçe önceliğin azalacağı anlamına gelir. Yani istemci 1'den küçük q değerli içerik biçimleri için "bu içerik biçimini kabul ediyorum, ancak çok tercih etmiyorum, mümkünse önceliği daha yüksek olan bir tipte gönder" demektedir. Bu örneğimizde header XML'i kabul etmekte ama mümkünse HTML ve XHTML'i tercih etmektedir.
*/* değeri istemcinin herhangi bir tipte veri kabul edebileceğini belirtir. Ancak örneğimizde bunun önceliği düşüktür (0.8). Bir fallback (son çare) içerik tipi belirtimidir.
Bütün bunları birleştirdiğimizde istemcinin kabul ettiği tipler öncelik sırasına göre aşağıda verilmiştir:

HTML, XHTML, avif, webp, apng (puan: 1)
XML, signed-exchange (puan: 0.9)
Diğer biçimler (puan:0.8)
Şimdi bu aşamada istemcinin gönderdiği Accept header'ında değişiklik yaparak istemcinin istediği biçimde veri alabileceğini düşünebilirsiniz. İstemcinin Accept header'ında belirttiği değerler alacağı biçimin belirlenmesinde etkilidir, ancak istemcinin istediği biçimde veri almasını garantilemez. Örneğin bir request sadece XML alabileceğini ASP.NET Core sunucusuna iletse şu aşamada sunucunun yine de string dışındaki tipler için JSON döndürdüğünü görürüz.
Varsayılan durumda ASP.NET Core string dışındaki tipler için yalnızca JSON döndürür. ASP.NET Core'un XML de döndürebilmesi için uygulamamızda birtakım yapılandırmalar yapmamız gerekir.

İçerik biçimi uzlaşmasının çalışması ve XML biçiminde içerik üretebilmek için Program.cs dosyanızı şöyle değiştirin:

Bu kodumuzla uygulamanın kullandığı servislere AddXmlDataContractSerializerFormatters() servisi eklenmiştir. Şimdi ContentController.cs dosyamızı şöyle değiştirelim:

Artık programımızdaki GetObject() action'ı eğer request sadece XML alabileceğini belirtmişse geriye XML veri döndürecektir. Diğer bir deyişle istemcinin seçimine saygı duymaktadır.

Artık uygulamamız istemcinin tercihlerine saygı duyuyor ama tam anlamıyla da saygı duymuyor. İstemci sadece XML alabileceğini belirttiğinde XML gönderiyor. Ama örneğin istemci düşük öncelikli de olsa */* tipine izin vermişse uygulamamız sonucu JSON ile gönderecektir. İstemci isterse JSON'a 0.1, XML'e 1 puan versin, gelen seçenekler arasında doğrudan veya dolaylı olarak JSON varsa sonucu JSON olarak göndermektedir. Bu saygı eksikliğinin bir başka sonucu da eğer istemci gönderilecek JSON verisi için uygun olmayan bir içerik tipi belirttiyse sunucunun geriye hata kodu döndürmek yerine yine JSON göndermesidir. Örneğin istemci Accept header'ında sadece "img/png" tipine izin vermişse ve JSON (veya XML)'e uygun veri döndüren bir action'a talepte bulunuyorsa geriye JSON dönecektir. Sunucunun istemcinin içerik biçimi tercihlerine tam anlamıyla saygı duyması için Program.cs dosyamızı şöyle değiştiririz:

Bu kodumuza MvcOptions ayar sınıfı ile uygulamamız yapılandırılmaktadır. Bu sınıfın RespectBrowserAcceptHeader özelliği ile sunucunun istemcinin Accep header'ındaki tercihlere tam olarak saygı duyması sağlanmaktadır. ReturnHttpNotAcceptable özelliği ile de eğer istemci uygun olmayan bir tipte talepte bulunuyorsa geriye HTTP 406 kodu döndürülecektir.

Şimdiye kadar bir metodun geri dönüş tipiyle veya istemcinin gönderdiği Accept header'ındaki değerler ile içerik biçimlendirmesi belirlendi. Şimdi ASP.NET Core tarafında elle içerik biçimlendirmesini belirleyeceğiz. ASP.NET Core tarafında içerik biçimi belirlendiği zaman Accept header'ındaki değerler geçersiz olur. Örnek (ContentController.cs dosyası):

Burada Produces attribute'u ile GetObject() action'ının JSON üreteceğini belirttik. Produces attribute'u için birden fazla değer belirtebiliriz. Bu durumda istemcinin Accept header'ındaki tercihler geçerli olacaktır.

Varsayılan kabul edilen biçimin belirtilmesi işlemi Accept header'ı ile olur. Ama URL üzerinden de bu tercih yapılabilir. Örnek:

Bu örneğimizde GetObject() action'ı 3 tane attribute almaktadır. HttpGet attribute'u "object/<format>" path'ına yapılan GET request'lerini GetObject() action'ına yönlendirmektedir. Buradaki format parametresi opsiyoneldir. Produces attribute'u ilgili action'ın JSON veya XML üretebileceğini belirtmektedir. FormatFilter attribute'u ise hangi biçimlendirmenin seçileceğini request'in path'ındaki format isimli segment değişkeninin değerine göre yapmaktadır. Eğer request'in path'ı "api/content/object/xml" olursa GetObject() action'ı geriye XML döndürür. Eğer request'in path'ı "api/content/object/json" olursa GetObject() action'ı geriye JSON döndürür. Eğer request'in path'ı api/content/object" olursa geriye döndürülecek biçim Accept header'ındaki değerlere göre belirlenir.

Şimdiye kadar hep bir action'ın geri döndürdüğü verinin biçimini belirtmeye çalıştık. Şimdi action'ın kabul ettiği veriyi belirteceğiz. Esasında bir action'ın kabul ettiği veri biçimlerinin geniş olmasında herhangi bir sıkıntı yoktur. Program.cs dosyasına eklenen servisler sayesinde action'lar hangi tipte veri üretebiliyorsa aynı tipte verileri deserialize etme yeteneğini de kazanmış olur. Aslında bir action'ın kabul ettiği veri biçimlerini kısıtlama ihtiyacı pek hissetmeyiz. Çünkü bütün süreç arkaplanda bizim yerimize yapılır. Eğer XML geldiyse XML deserializasyonu, JSON geldiyse JSON deserializasyonu yapılır. Ancak yine de ASP.NET Core bize bir metodun kabul ettiği içerik biçimini belirtme imkanı sağlamaktadır. Örnek (ContentController.cs):

Bu sınıfa eklenen iki action sırasıyla yalnızca JSON ve yalnızca XML'e cevap vermektedir. İkisi de "api/content" path'ına yapılan POST request'lerine cevap vermektedir. Request'i karşılayacak action request'in Content-Type header'ına göre belirlenecektir. Eğer "api/content" path'ına Content-Type header'ı "application/xml" veya "application/json" olmayan bir POST request'i gelirse geriye HTTP 415 kodu döndürülür.

Bu bölümde programımızın yapılandırma ayarlarının nasıl yapıldığı ve programımızdan yapılandırma ayarlarına nasıl erişildiği anlatılacaktır. Şimdi ASP.NET Core Empty şablonuyla yeni bir proje oluşturun ve projeye Yapilandirma ismini verin.
Programımızın yapılandırma ayarları genel anlamda appsettings.json ve appsettings.Development.json dosyalarında tutulur. ASP.NET Core Empty şablonuyla oluşturulan projenin appsettings.json dosyası şöyle olacaktır:

Projedeki tek yapılandırma dosyası appsettings.json değildir. appsettings.json genel amaçlı yapılandırma ayarlarını içerir. Programımız farklı geliştirme aşamasında olabilir. Bunlar Development, Staging ve Production'dır. Development programımızın geliştirme aşamasında olduğunu belirtir, Staging programımızın büyük ölçüde tamamlandığını, ancak henüz canlıya geçilmek için hazır olmadığını belirtir (geçiş aşaması). Production ise programımızın tam olarak tamamlandığını ve canlıya geçilebileceğini belirtir.
Başlattığımız projenin geliştirme durumunda herhangi bir değişiklik yapmadıysak varsayılan durumda Development'ta demektir. Programımız çalışırken ilk önce appsettings.json dosyasındaki ayarları, sonra geliştirme ortamına özgü json dosyasındaki ayarları kullanır. ASP.NET Core Empty şablonuyla oluşturulan projenin appsettings.Development.json dosyası şöyle olacaktır:

Eğer appsettings.Development.json dosyası ile appsettings.json dosyası aynı yapılandırma için ayarlar içeriyorsa daha spesifik olan appsettings.Development.json dosyasının dediği geçerlidir. Örneğimizde appsettings.Development.json dosyası appsettings.json dosyasının ayarlarını değiştirmiyor, yaptığı ayarlarda appsettings.json dosyasıyla tam olarak aynı ayarları kullanıyor. Ayrıca appsetting.json dosyası appsettings.Development.json dosyasına "AllowedHosts" ayarı konusunda ekleme yapıyor.

Projemizdeki appsettings.json ve appsettings.Development.json dosyaları esasında tek bir sanal yapılandırma dosyası inşa ederler. Daha doğrusu yapılandırma servisi iki dosyayı üzerine yazma kurallarını da hesaba katarak birleştirir ve bu birleşimden yapılandırma ayarlarını alır. Yapılandırma servisinin tek yapılandırma ayarı kaynağı bu iki dosya değildir. Yapılandırma servisi komut satırı argümanlarına ve çevre değişkenlerine de erişebilir. Örnek (Program.cs dosyasındaki uygun bir yere ekleyebilirsiniz):

IConfiguration servisi Microsoft.Extensions.Configuration isim alanında bulunmaktadır. Lambda ifadesi şeklinde tanımlanan bir endpoint'ten yapılandırma servisine eriştikten sonra şimdi nasıl direkt Program.cs dosyası üzerinden yapılandırma servisine erişeceğimizi görelim. WebApplication ve WebApplicationBuilder sınıflarının Configuration özelliği aracılığıyla da yapılandırma servisine erişilebilir. Örnek:

Daha önceki derslerimizde options pattern'ini kullanarak nasıl middleware'lerin yapılandırılabileceğini görmüştük. O zaman middleware'in yapılandırma ayarını direkt Program.cs dosyasında belirtmiştik. Şimdi bir middleware'in yapılandırma ayarının nasıl appsettings.json dosyasından alınacağını göreceğiz. Şimdi appsettings.json dosyasını şöyle değiştirelim:

Burada basitçe middleware'in kullanacağı ayarları ekledik. Şimdi Program.cs dosyasını şöyle değiştirelim:

Bu kod daha önceki bölümlerde yazdığımız sınıflara bağlıdır. Ancak koda bakarak yapılan işi anlayacağınızı öngörüyorum. Öncelikle appsettings.json dosyasındaki "Ayarlar" kısmı alınmaktadır, daha sonra bu kısımdaki girdiler kullanılarak bir MiddlewareAyarlari nesnesi oluşturulmaktadır. LocationMiddleware isimli sınıf tabanlı middleware, yapıcı metot yoluyla IOptions<MiddlewareAyarlari> servisini kendine enjekte etmekte ve kendi çalışmasını eriştiği MiddlewareAyarlari nesnesine göre manipule etmektedir. Sonuç olarak bir middleware kendi ayarlarını bir yapılandırma dosyasından almıştır.

launchSettings.json dosyası Properties klasörü altına gizlenmiştir. Bu dosya sunucu ayağa kalkarken yapılacak teknik yapılandırmaları içermektedir. Benim sistemimde ASP.NET Core Empty şablonu kullanılarak oluşturulan projenin launchSettings.json dosyasının içeriği şöyle olmaktadır:

iisSettings kısmı ASP.NET Core IIS Express üzerinden başlatıldığında geçerli olacak ayarları içerir. IIS Express artık göreceli olarak geride kalmıştır. Sunucunuz IIS Express üzerinden ayağa kalkmıyorsa buradaki ayarların herhangi bir işlevselliği yoktur.
profiles kısmı sunucu için farklı çalışma profilleri tanımlamaya yarar. Dosyamızda da gördüğümüz gibi Yapilandirma ve IIS Express olmak üzere iki profil bulunmaktadır. Sunucunun hangi profilden başlatılacağı Visual Studio üzerinden belirtilebilir. Visual Studio'da araç çubuğunda bulunan sunucuyu başlatmak için kullandığımız yeşil okun yanında hangi profilde olduğumuz yazar. Sunucuyu farklı bir profilde çalıştırmak için profil isminin yanındaki aşağı bakan küçük oku tıklayabiliriz.
Her iki profilde de çevre değişkenleri belirtilebilmektedir. Daha önce programın bulunduğu geliştirme sürecine göre farklı appsettings.json dosyalarının kullanılabileceğini söylemiştik. İşte geliştirme sürecinin belirtildiği yer burasıdır. Ayrıca yine sunucunun çalıştırıldığı zaman hangi portu dinleyeceği, sunucu çalıştırıldığı zaman tarayıcının otomatik çalıştırılıp çalıştılmayacağı yine buradaki ayarlardan yapılır.

Biraz önceki launchSettings.json dosyasındaki tek çevre değişkeni "ASPNETCORE_ENVIRONMENT" idi. Ancak istenirse bu çevre değişkenlerinin sayısı artırılabilir. Ayrıca programımız üzerinden bu çevre değişkenlerine ulaşılabilir. Çevre değişkenlerine ulaşmak da yapılandırma dosyalarına olduğu gibi yine IConfiguration servisi üzerinden olur. Örnek:

Visual Studio üzerinden programda kullanılan çevre değişkenlerine erişilebilir ve bu çevre değişkenleri değiştirilebilir. Bunun için;

Menü çubuğundaki Debug menüsü açılır.
"Proje_Ismi Debug Properties" menü ögesi tıklanır. Bizim projemizin ismi Yapilandirma olduğu için burada "Yapilandirma Debug Properties" yazar.
Açılan "Launch Profiles" penceresi aslında launchSettings.json dosyası için bir arayüzdür. launchSettings.json dosyası üzerinden yapılan ayarlar bu pencere üzerinden de yapılabilir. Burada çevre değişkenleri eklenebilir, silinebilir, değiştirilebilir.

IConfiguration servisi üzerinden çevre değişkenlerine ulaşabiliriz. Ancak üzerinde bulunduğumuz geliştirme sürecinin öğrenilmesi çok sık başvurduğumuz bir şey olduğu için ASP.NET Core bunun için özel bir servis tanımlamıştır. Çevre değikenlerine IWebHostEnvironment servisi üzerinden erişilebilir. Bu arayüzde bulunan önemli üyeler şunlardır:
EnvironmentName: Geçerli ortamı döndürür.
IsDevelopment(): Geçerli ortam Development ise true döndürür.
IsStaging(): Geçerli ortam Staging ise true döndürür.
IsProduction(): Geçerli ortam Production ise true döndürür.
IsEnvironment(env): Geçerli ortam belirtilen ortam ise true döndürür.
NOT: Yukarıdaki metotlar esasında IWebHostEnvironment arayüzü üzerinde çalışan ancak Microsoft.Extensions.Hosting isim alanında bulunan eklenti metotlarıdır.
Eğer geçerli ortama servisleri ayağa kaldırırken erişmek istiyorsak WebApplicationBuilder.Environment özelliğini kullanırız, eğer geçerli ortama request pipeline'a middleware eklerken erişmek istiyorsak WebApplication.Environment özelliğini kullanırız. Eğer geçerli ortam bilgisine bir endpoint veya middleware içinden erişmek istiyorsak IWebHostEnvironment servisini enjekte ederiz.

Kullanıcı sırları adı üstünde gizli kalması gereken bilgilerdir. Bu bilgiler API anahtarları, veritabanı bağlantı şifreleri, admin şifresi, vb. olabilir. Ayrıca bu tür bilgiler sık değişebilir. Bu tür bilgilerin hem gizli kalması gerektiğinden hem de sık değişebileceğinden kaynak koda gömülmesi pek tavsiye edilmez. Kaynak kod dosyaları, appsettings.json ve launchSettings.json dosyaları Git benzeri bir versiyon kontrol sistemine dahil edilebilir, bu da kaynak koda erişebilen her geliştiricinin gizli kalması gereken bu bilgilere erişebileceği anlamına gelir.
Kullanıcı sırları servisi bu tür bilgileri projede tutmaz. Bu yüzden proje bir versiyon kontrol sistemine gittiğinde gizli bilgiler gitmemiş olur.

Kullanıcı sırlarını depolayabilmemiz için öncelikle bir araca ihtiyacımız var. Öncelikle Visual Studio'da menü çubuğundaki View menüsü altındaki "Terminal" ögesine tıklayın. Alt kısımdaki "Error List" ve "Output" pencereciklerinin yanına "Geliştirici Powershell" pencereciği de gelecektir. Bu pencereciğe geçin. Terminalde varsayılan durumda solution dosyasının olduğu klasörde olacaksınız. .csproj uzantılı proje dosyanızın olduğu klasöre cd komutunu vererek geçin. Şimdi aşağıdaki iki komutu verin:

dotnet tool uninstall --global dotnet-user-secrets
dotnet tool install --global dotnet-user-secrets --version 3.0.0-preview-18579-0056

Bu komutlar öncelikle user-secrets isimli bir araç varsa bunu silmektedir, daha sonra aynı aracı belirttiğimiz versiyonda kurmaktadır. Şimdi bu aracı ilklendirelim:

dotnet user-secrets init

Kullanıcı sırlarını saklamak istediğimiz her bir proje için ilklendirme işlemi gereklidir. Şimdi aşağıdaki iki komutu çalıştıralım:

dotnet user-secrets set "WebService:Id" "MyAccount"
dotnet user-secrets set "WebService:Key" "MySecret123$"

Burada gizli bilgi deposuna iki gizli bilgi saklanmaktadır. Birisi bir servise bağlanmak için kullanabileceğimiz kullanıcı adı, diğeri şifredir. Gizli bilgiler anahtar-değer çiftleri şeklinde depolanır. Birbiriyle ilgili olan gizli bilgiler : ile ayrılan ön ekler alabilirler. Bu girdiğiniz gizli bilgileri görmek için aşağıdaki komutu kullanabilirsiniz:

dotnet user-secrets list

Visual Studio kullanıcı arayüzünü kullanarak kullanıcı sırlarını görebilir ve değiştirebiliriz. Bunun için "Solution Explorer" pencereciğindeki projeye sağ tıklayın. Açılan bağlam menüsünden "Manage User Secrets" ögesini tıklayın. JSON formatında kullanıcı sırlarını görüp değiştirebileceğiniz, ekleyebileceğiniz secrets.json isimli bir dosya açılır. Bu dosyada değişiklik yapıp kaydederek kullanıcı sırlarını değiştirebilirsiniz.

Kuşkusuz program içinden kullanıcı sırlarına erişemiyor

Her HTTP isteği bir host başlığı içerir. Aynı hostun aynı portuna giden istekler bu başlığın değerine göre sunucuda farklı muamele görebilir. Request pipeline'a varsayılan durumda eklenen UseHostFiltering() middleware'i sadece onay verilen host değerlerinden biri istekte varsa isteği işleme, istekte onay verilen host değerlerinden biri yoksa isteği göz ardı etme yeteneğine sahiptir. Varsayılan durumdaki appsettings.json dosyası değeri "*" olan bir "AllowedHosts" girdisi içerir. "*" değeri host değeri ne olursa olsun bütün isteklerin işleneceği anlamına gelir. Kabul edilen host değerleri burada belirtilebilir veya program içinden options pattern'i kullanılarak değiştirilebilir. Örnek:

UseHostFiltering() middleware'inin ayar sınıfı HostFilteringOptions'tır. Önemli özellikleri aşağıda belirtilmiştir:
AllowedHosts: İzin verilen host değerlerini belirtir (List<string>). Belirtimde joker karakterler kullanılabilir. Örneğimizde example.com hostunun bütün alt domain'lerine izin verilmektedir.
AllowEmptyHosts: Host başlığı olmayan isteklere izin verilip verilmeyeceğini belirtir. Varsayılanı true'dur. 
IncludeFailureMessage: Eğer talep reddedildiyse geriye reddedilme gerekçesini içeren bir mesaj döndürülüp döndürülmeyeceğini belirtir. Varsayılanı true'dur.
Eğer host ismi sebebiyle talep reddedilirse UseHostFiltering() middleware'i geriye HTTP 400 hata kodunu döndürür.

Bu bölümde uygulamamızın çalışması esnasında meydana gelen çalışma zamanı hatalarında uygulamamızın ne yapacağını belirleyeceğiz. Şimdi yeni bir proje oluşturun ve projenin Program.cs dosyası şöyle olsun:

Bu program bilinçli bir şekilde hata oluşturmaktadır. Programımızı çalıştırdığımızda ASP.NET Core'un oluşan hata hakkında detaylı bilgi verdiğini görürüz. Bu bilgiler arasında hatanın hangi satırda meydana geldiği, fırlatılan hatanın tipi ve metni, hatayı oluşturan request'in query string'i, cookie'leri, rotası ve hata oluştuğu esnada yürütülmekte olan endpoint bulunmaktadır. Kuşkusuz bu bilgiler geliştirici açısından çok değerlidir.
Ancak uygulamanın geliştirme süreci launchSettings.json dosyası üzerinden Development'tan Production'a çekilirse aynı hatada sunucunun sadece HTTP 500 hata kodu döndürdüğünü görürüz. Bu mantıklıdır, çünkü eğer uygulama canlıya geçtiyse kullanıcıların oluşan hata hakkında detaylı bilgi sahibi olmasına gerek yoktur, dahası güvenlik riski oluşturabilir.

Production aşamasında uygulamamızda bir çalışma zamanı hatası olduğunda ASP.NET Core sadece HTTP 500 kodunu döndürür. Uygulamamızda bir çalışma zamanı hatası olduğunda sadece durum kodu döndürmek yerine kendi yazdığımız bir hata sayfasının gösterilmesini sağlayabiliriz. Örnek (Program.cs dosyası):

Bu kod eğer aktif geliştirme süreci Development değilse belirli bir html dosyasının hata durumunda gösterilmesini sağlamaktadır. Programımız Development aşamasındaysa geliştirici dostu hata sayfası kullanılacaktır. Hata sayfasını wwwroot klasöründe ve error.html isminde oluşturun, içeriği şöyle olsun:

Bu, olabilecek en basit HTML sayfalarından biridir. Hata sayfasında bootstrap stilleri ve resimler olabilir. Ancak daha karmaşık ASP.NET Core özellikleri kullanılmamalıdır. Hataya neden olan şey hata sayfasının gösterilmesine engel olmamalıdır. Ayrıca uygulamanın tamamında oluşan hataları yakalayabilmesi için UseExceptionHandler() middleware'inin request pipeline'ın en başında tanımlanan middleware olması gerekmektedir.

Uygulamamızın hata döndürdüğü durumlar yalnızca uygulamamızda meydana gelen çalışma zamanı hataları olmak zorunda değildir. Bazen çalışma zamanı hatası oluşmamasına rağmen geriye bir hata döndürmek isteyebiliriz. Örneğin kullanıcının aradığı bir kaynak bulunamadığı zaman veya ilgili kaynağa erişim yetkisinin olmadığı zaman da bir hata döndürebiliriz. Ayrıca UseExceptionHandler() middleware'i bir çalışma zamanı hatası oluştuğunda ilgili html dosyasına bir yönlendirme cevabıyla geri döner. Kullanıcı tekrar ilgili html sayfasına talepte bulunur ve hata oluştuğunu söyleyen HTML sayfası ekranda belirir. Bu kullanıcı açısından mantıklıdır, nihayetinde hata oluştuğunu söyleyen sayfayı ekranda görmektedir.
Ancak web uygulamamız web servis mantığında kullanılıyorsa yukarıdaki hata belirtme yaklaşımı yanlıştır. Servisi tüketen program ilk önce yönlendirme cevabı (HTTP 307), ardından başarılı (HTTP 200) cevabı alacaktır. Bu da programın servisten yapmasını istediği işlemin yapıldığı kanısına ulaşmasına yol açabilir. Yapmamız gereken şey çalışma zamanı hatası olmayan bir hata oluştuğunda yönlendirme yapmadan istediğimiz hata kodunu döndürebilmek ve sayfanın içeriğini de istediğimiz gibi ayarlayabilmektedir. Bu sayede hem servis tüketicilerine hem de gerçek insanlara doğru mesaj vereceğiz. Şimdi projemize ResponseString.cs isminde ve içeriği aşağıdaki gibi olan bir sınıf ekleyelim:

Bu sınıf DefaultResponse alanı üzerinden erişilen bir HTML şablon string'i içermektedir. HTML kodu kullanıcıyı bir hata oluştuğuna dair bilgilendirmektedir. Hata kodu, {0} yazan yere dışarıdan enjekte edilecektir. Şimdi Program.cs dosyasını şöyle değiştirelim:

Bu programda /error path'ına bir talep gelmesi durumunda ilgili middleware geriye HTTP 404 kodunu göndermekte ve request pipeline'a kısa devre yaptırmaktadır. Gönderilen 404 kodu dönüş yolunda UseStatusCodePages() middleware'i tarafından tespit edilir. Bu middleware döndürülen durum kodunu değiştirmeden ilgili değişkenle belirtilen HTML kodlarını response'a yazar, ilgili string değişkende {0} ile belirtilen yere durum kodunu yazar, response'un ContentType özelliğini "text/html" olarak ayarlar. Elde ettiğimiz şey servis tüketicileri ve gerçek insanlar tarafından anlaşılan hata mesajlarıdır. Bir endpoint veya middleware'in bir hata belirtmesi için tek yapması gereken response'un durum kodunu ayarlamaktır. Gerisi UseStatusCodePages() middleware'i tarafından halledilmektedir.
UseStatusCodePages() middleware'i;

yalnızca durum kodu 400-600 arasında olan response'lara müdahale etmektedir.
Durum kodu 400-600 arasında olsa bile zaten response'a yazma yapılmışsa response'a dokunmamaktadır.
Çalışma zamanı hatası sonucu oluşan durum kodlarıyla ilgilenmemektedir. Bu amaç için UseExceptionHandler() middleware'i kullanılmalıdır.
Yalnızca bizim tarafımızdan gönderilen hata kodlarında değil, sistem tarafından gönderilen hata kodlarında da devreye girmektedir. Örneğin hiçbir endpoint veya middleware tarafından response'a yazma yapılmamışsa ASP.NET Core otomatik olarak geriye HTTP 404 hata kodunu gönderir. Böyle bir durumda da UseStatusCodePages() middleware'i devreye girmekte ve daha şık bir hata sayfasının gönderilmesini sağlamaktadır.

ActionScript, Flash geliştiricilerinin sunum seviyesi mantığını tasarlamak için kullandıkları bir betik dilidir. Actionscript ECMAscript üzerine inşa edilmiştir, ECMAscript JavaScript'in esasını oluşturduğu için birçok geliştirici için Actionscript'i anlamak kolaydır. Actionscript Flash içerik yazarlığı esnasında kullanılan özel aksiyonları destekleyen bazı ek ECMAscript özellikleri de içermektedir
ActionScript Macromedia Flash ile karşımıza çıkan Acitonscript1, Acitonscript2, Acitonscript3 versiyonları olan bir dildir. C tabanlı bu dil Flash programında animasyonlara hükmetmemizi sağlar. Sadece var olan animasyonları değil olmayan nesneleri yaratma ve kendine has özel yapısı ve yenilikleri ile nesne tabanlı programlama yapabilmemizi sağlar.
Actionscript 2 ve 3 ile gelen yenilikler devrim niteliğinde olup Flash ortamını bir programlama ortamına hemen hemen çevirmeyi başarmıştır.
Bir programlama ile yapabileceğiniz birçok şeyi bu scriptle de yapabiliriz.

The overall incidence of symptomatic acoustic neuromas is 1/100,000 persons, however, autopsy results have shown that subclinical acoustic neuromas are present in up to 1% of people.  Acoustic neuromas account for ~8% of intracranial tumors and 80-90% of CPA tumors.  Most people with symptomatic acoustic neuromas will present between the ages of 30 and 50.  
They are almost always unilateral; bilateral acoustic neuromas are limited to patients with NF-2.

Acoustic trauma: OR of 2.2 if 10 years exposure to extremely loud noise, OR of 13.1 if 20 or more years of exposure.
Parathyroid adenoma: OR of 3.4 for actousic neuromas.
NF-2: Accounts for 10% of patients with acoustic neuroma, typically bilateral.  Recall that NF2 gene is a tumor suppressor gene on chromosome 22 that encodes a membrane cytoskeletal protein called merlin or schwannomin that appears to be involved in actin-cytoskeleton organization.  NF2 associated with bilateral ANs, gliomas, meningiomas, cataracts, and neurofibromas.

Acoustic neuromas arise from the Schwann cell perineural elements of the affected nerve and occur with equal frequency on the superior and inferior branches of the vestibular nerve (rarely affect the cochlear portion of CN VIII).  They arise at the junction of the central myelin produced by glial cells and peripheral myelin produced by Schwann cells (Obersteiner-Redlich zone).  On light microscopy one will see zones of alternately dense and sparse cellularity called Antoni A and B areas, respectively.  Acoustic neuromas will also stain positive for the S100 protein. 

The natural history of acoustic neuromas is variable.  The average growth rate is 1.9mm/year.  40% of tumors overall (higher for smaller tumors) will show no growth or even shrinkage on serial images.   However, there is no predictive relation between growth rate and size of tumor at presentation.

The symptoms involved with acoustic neuroma are due to cranial nerve involvement and tumor progression.  

Acoustic nerve: Symptomatic involvement in 95% of patients, major symptoms being hearing loss and tinnitus.  Hearing loss present in 95%, but only about 66% were actually aware of this deficit.  The hearing loss is usually chronic (over years).  Tinnitus is present in 63% of patients.
Vestibular nerve: Involved in 61% of patients and manifests as mild to moderate unsteadiness while walking.  True spinning vertigo is uncommon due to the slow growing nature of these tumors.
Trigeminal nerve: Disturbance occurs in 17% of patients with symptoms such as facial numbness, hypesthesia, and pain.  These symptoms usually occur after hearing loss is present for more than two years, and vestibular symptoms for more than one year.
Facial nerve: Involved in 6% of patients.  Seen as facial paresis and taste disturbances.
Posterior fossa:  Compression on the cerebellum or brainstem results in ataxia.  May also see serious complications such as brainstem compression, cerebellar tonsillar herniation, hydrocephalus, and death.

Physical Exam:
Confirm sensorineural hearing loss with Rinne test (tuning fork on mastoid bone, AC>BC) and Weber test (vibratory sound louder on the “good” side)
Also check for other CN deficits (absent corneal reflex, facial twitching, hypesthesia)
Audiometry:
The best initial screening test
Typically shows asymmetric SHL, usually more prominent in the higher frequencies. Functional hearing typically described as <50 dB and >50% speech discrimination
Hearing loss does not necessarily correlate with tumor size.
Brainstem auditory evoked potentials: Delay in conduction time on the affected side.
Imaging: MRI with gadolinium can detect tumors as small as 1-2mm.  Seen as an enhancing lesion “ice cream cone” in the region of internal acoustic canal or a “dumbbell” extending into the foramen magnum.

The three treatment options for acoustic neuroma are surgery, radiation therapy, and observation.

Typically performed by an otologist and a neurosurgeon.  The learning curve is very steep, on the order of 20-60 cases.  There are three surgical approaches used in the removal of acoustic neuromas.  

Retromastoid suboccipital: An incision is made behind the ear and the mastoid bone and some inner ear structures are removed.  Advantages to this approach include decreased risk of facial nerve damage and ability to attempt hearing preservation.  A disadvantage is that using this approach, if the tumor extends distally into the IAC, complete removal may not be possible.
Middle fossa: This approach involves an incision just anterior to the ear with removal of the underlying bone to expose the area of interest.  Hearing preservation is attempted with this approach, but depending on location of the tumor complete removal may not be feasible.
Translabyrinthine: This approach goes directly through the inner ear and invariably sacrifices hearing.
Results: Anatomic preservation of the facial nerve is achieved in 93% of patients and of the cochlear nerve in 68%.  Hearing preservation rate for surgery is 47%.
Complications of surgery: Death (1%), hemiparesis (1%), CN palsey (5%), hematomas (2.2%), CSF fistulas (9.2%), hydrocephalus (2.3%), bacterial meningitis (1.2%), wound revisions (1.1%).
(Samii, Neurosurgery 1997 Jan;40(1):11-21)

GKS--Patient’s head is fixed in MRI compatible Leksell stereotactic frame and 1-1.5mm slice MRI is obtained.  Prescribe dose of 12.5-13.0 Gy to the 50% isodose line.  TV defined as macroscopic tumor seen on MRI/CT.  Evaluate dose fall-off to cochlea and brain stem.  Tumor control rate (97%), Normal facial function (>99%), Trigeminal function (97%), Hearing preservation (up to 77%). (Lunsford, J Neurosurg 2005 Jan;102 Suppl:195-9)
Proton Beam Radiosurgery--Now only used for pts with non-serviceable hearing and tumors <2.0cm.  Use 3 fiducial markers in the outer table of the cranium, as well as placement of head in a stereotactic frame.  A 3D CT based planning system is used.  160 MeV proton beam is used to administer 3 converging beams to a max dose of 13 cobalt Gray equivalents to TV.   Evaluate dose fall-off to brainstem and cochlea.   Excellent tumor control (95%) and preservation of CNs V (89%) and VII (91%)  Hearing preservation: 33%. (Weber, Neurosurgery 2003 Sep;53(3):577-86)
Fractionated stereotactic radiotherapy--Patient’s head is immobilized in a mask and linear accelerator is used to apply the radiation.  Dose: 50-55 Gy in 25-30 fractions to the 80% isodose line.  The data for FSR has shown excellent tumor control, preservation of hearing/CN function, and reduced treatment related toxicity. (Combs, IJROBP 2005 Sep 1; 63 (1):75-81)

In certain cases it may be feasible to observe the patient and his/her VS with MRI scans every 6-12 months.  Problems with this approach include ongoing hearing loss, and possible mass effects with large tumors.

Thomas Jefferson; 2009 PMID 19042095 -- "Toward dose optimization for fractionated stereotactic radiotherapy for acoustic neuromas: comparison of two dose cohorts." (Andrews DW, Int J Radiat Oncol Biol Phys. 2009 Jun 1;74(2):419-26. Epub 2008 Nov 29.)
Retrospective. 89 patients. Two dose levels: 50.4 Gy vs 46.8 Gy. Median F/U 4.4 and 5.4 years
Outcome: Tumor control 100% both groups.
Toxicity: Raw 3-year hearing preservation 46.8 Gy 79% vs. 50.4 Gy 68% (SS). Pure tone hearing better in low-dose cohort 46.8 Gy 33db vs. 50.4 Gy 40 db (SS). Actuarial hearing preservation rate significantly longer for low-dose group 3.2 years vs. 1.5 years (SS). Predictors for hearing dose cohort and pretreatment hearing class
Conclusion: Lower dose of 46.8 Gy had 100% local control with better hearing preservation rate
 

France, (Regis, J Neurosurgery. 2002 Nov;97(5):1091-100).  Non-randomized prospective series using pre- and post-operative questionnaires to evaluate functional outcomes after GKS or microsurgery.  The minimum follow-up was 3 years, the GKS group had 97 patients and the microsurgery group had 110 patients.  Outcomes in table below:

Baylor, 2002 (1993-2000) - PMID 12459364 — "Treatment of acoustic neuroma: stereotactic radiosurgery vs. microsurgery." Karpinos M et al. Int J Radiat Oncol Biol Phys. 2002 Dec 1;54(5):1410-21.
Retrospective. 75 pts with Gamma Knife, 25 with microsurgery.
No difference in tumor control. RS more effective in: preservation of measurable hearing (57% vs 14%). Microsurgery had higher rate of: facial neuropathy (35%/6%) and trigeminal neuropathy (22%/12%). Also no difference in: serviceable hearing, tinnitus, imbalance, dysarthria, dysphagia, and headache. Longer hospital stay and more perioperative complications (47% vs 4%) for microsurgery.

Amsterdam; 2003 (Meijer, IJROBP 2003 Aug; 56 (5):1390-1396).  129 patients with ANs from 1992-1999 were prospectively selected for SRS or FSRT based on whether or not they had teeth.  All treatments were linac based.  The dentate patients received FSRT (20Gy/5fx and 25Gy/5fx) and the edentate patients received SRS (10Gy and 12.5Gy).  Mean follow-up was 33 months.  Results in table below.

Conclusion: Comparable rate of tumor control and preservation of hearing, CN V, and CN VII.
Thomas Jefferson; 2001 (1994-2000) PMID 11483338 -- "Stereotactic radiosurgery and fractionated stereotactic radiotherapy for the treatment of acoustic schwannomas: comparative observations of 125 patients treated at one institution." (Andrews, IJROBP.  2001 Aug 1;50(5):1265-78).
Retrospective. 122 patients (GKS 69, fractionated 52). GKS dose 12 Gy, fractionated dose 50/25. Mean F/U 2.3 years
Outcome: tumor control SRS 98% vs. FSRT 97% (NS)
Toxicity: CN V preservation 95% vs. 93% (NS), CN VII preservation 98% vs. 98% (NS); functional hearing 33% vs. 81% (SS)
Conclusions: Comparable rates of tumor control and CN preservation, improvement in servicable hearing

Loma Linda; 2002 (1991-1999) PMID 11844261 -- "Fractionated proton beam radiotherapy for acoustic neuroma." (Bush DA, Neurosurgery. 2002 Feb;50(2):270-3; discussion 273-5.)
Retrospective. 31 ANs in 30 patients. Me

Algoritma; belirli bir problemi çözmek için bir bilgisayar dili kullanılarak yazılmış deyimler dizisidir.

Problemin farkına varmak,
Problemi analiz etmek,
Çözüm yolları düşünmek,
İyi çözüm yolları seçip algoritma oluşturmak,
Akış diyagramı çizmek,
Uygun bir dilde kodlamak,
Programı test etmek,
Programı dağıtmak.
Programı başka programlarla karşılaştırıp farklı çözüm yolları bulmak,

Problem iyice anlaşılmalı ve mümkün olduğu kadar küçük parçalara ayırılmaladır. Descartes tarafından 'discourse on method' isimli kitabında anlatılan problem çözme teknikleri şunlardır:

Doğruluğu kesin olarak kanıtlanmadıkça, hiçbir şeyi doğru olarak kabul etmeyin; tahmin ve önyargılardan kaçının.
Karşılaştığınız her güçlüğü mümkün olduğu kadar çok parçaya bölün.
Düzenli bir biçimde düşünün; anlaşılması en kolay olan şeylerle başlayıp yavaş yavaş daha zor ve karmaşık olanlara doğru ilerleyiniz.
Olaya bakışınız çok genel, hazırladığınız ayrıntılı liste ise hiçbir şeyi dışarıda bırakmayacak kadar kusursuz ve eksiksiz olsun. Kolay gelsin

Program işini doğru yapmalı
Mümkün olduğunca hızlı çalışmalı
Sistem kaynaklarını gereksiz yere harcamamalı
Program kodu okunabilir ve anlaşılabilir olmalı
Birbirinden bağımsız modüllerin minimum inter aktivitesinden oluşmalı
Bakım ve güncellenmesi kolay olmalı
Hatalar lokal olmalı. (Bir bölümde oluşacak bir hata tüm programı etkilememeli)
Verilen süre içinde tamamlanmalı
Gerekli yazılı dokümanlar hazırlanmış olmalı. (Kullanma kılavuzu, yardım dosyaları vs.)

Algoritma, herhangi bir sorunun çözümü için izlenecek yol anlamına gelmektedir. Çözüm için yapılması gereken işlemler hiçbir alternatif yoruma izin vermeksizin sözel olarak ifade edilir. Algoritma hazırlanırken,çözüm için yapılması gerekli işlemler,öncelik sıraları gözönünde bulundurularak ayrıntılı bir biçimde tanımlanmalıdırlar.
Algoritmalar, matematikte ve bilgisayar biliminde bir işi yapmak için tanımlanan, bir başlangıç durumundan başladığında, açıkça belirlenmiş bir son durumunda sonlanan, sonlu işlemlerdir .
Algoritma verilerin bilgisayara hangi çevre biriminden girileceğinin,problemin nasıl çözüleceğinin,hangi basamaklardan geçirilerek sonuç alınacağının,sonucun nasıl ve nereye yazılacağının sözel olarak ifade edilmesi biçiminde tanımlanabilir.

Sözderastsal sayı üreteci,
Sıralama Algoritmaları,
Kütük İşlemleri,
Grafik Algoritmaları,
Arama Algoritmaları,
Birleştirme Algoritmaları,
Kripto Algoritmaları,
Dijital Sinyal İşleme Algoritmaları,
Kombinasyon Algoritmaları.

Girdi: Sıfır veya daha fazla değer dışarıdan verilmeli,
Çıktı: En azından bir değer üretilmeli,
Açıklık: Her işlem (komut) açık olmalı ve farklı anlamlar içermemeli,
Sonluluk: Her türlü olasılık için algoritma sonlu adımda bitmeli,
Etkinlik: Her komut kişinin kalem ve kağıt ile yürütebileceği kadar basit olmalıdır.
NOT:  Bir program için 4. özellik geçerli değil. İşletim sistemleri gibi programlar sonsuza dek çalışırlar.
Ek bilgi:  Algoritma sözcüğü Ebu Abdullah Muhammed İbn Musa el Harezmi adındaki İranlı âlimden kaynaklanır. Bu âlim 9. yüzyılda cebir alanındaki algoritmik çalışmalarını kitaba dökerek matematiğe çok büyük bir katkı sağlamıştır. "Hisab el-cebir ve el-mukabala (حساب الجبر و المقابلة)" kitabı dünyanın ilk cebir kitabı ve aynı zamanda ilk algoritma koleksiyonunu oluşturur. Latince çevirisi Avrupa'da çok ilgi görür - âlimin ismini telaffuz edemeyen Avrupalılar "algorizm" sözcüğünü "Arap sayıları kullanarak aritmetik problemler çözme kuralları" manasında kullanırlar. Bu sözcük daha sonra "algoritma"ya dönüşür ve genel kapsamda kullanılır,

Mutfakta değilsen mutfağa git.
Çayı kontrol et, çay yoksa
Markete git çay al
Çaydanlığa bak dolu değilse su doldur
Çakmak veya kibritin olup; olmadığını kontrol et
Ocağı yak.
Ve çaydanlığı ateşin üstüne koy,
Suyun kaynamasını bekle.
Su kaynadıktan sonra,çaydanlıkta kaynayan sudan arzu edilen miktarda demliğe koy
Çaydanlıktaki suyun üzerine su ekle ve tekrar ateşin üzerine koy
Demliği çaydanlığın üzerine koy
Demlikteki çayın oturması için 20 dakika bekle.
Su kaynadığında ateşi kapat.
Çay bardağını al çayını doldur.
Çayına istediğin kadar şeker at ve karıştır.
Geldiğin odaya geri dön
Ve çayı yudumla…

Evden, stadın bulunduğu bölgeye ulaşmak,
Stada girip, numaralı koltuğa ulaşmak,
Maçı izlemek,
Stattan çıkmak,
Eve ulaşmak
Bu örnekte bazı işlemlerin sırası değişemez durumdayken bazılarının sırası değişebilmektedir. Örneğin "evden, stadın bulunduğu bölgeye ulaşmak," maddesi ile "stada girip, numaralı koltuğa ulaşmak," maddesi asla yer değiştiremez, zira stadın bulunduğu bölgeye ulaşmadan stada giremeyiz. Oysa "bilet almak," maddesi ile "evden, stadın bulunduğu bölgeye ulaşmak," maddesinin sıraları değişebilir, zira bileti önceden almak yerine stadın bulunduğu yerdeki gişelerden de alabiliriz.

Yataktan kalk
Pijamalarını çıkar
Banyoya git
Duş al
Kurulan
Giyin
Mutfağa git
Kahvaltı yap
Lavoboya git
Dişlerini fırçala
İşe doğru yola çık
Şimdi de aynı işlemlerin farklı bir sırada uygulanacağını düşünelim.

Yataktan kalk
Pijamalarını çıkar
Giyin
Duş al
Kahvaltı yap
İşe doğru yola çık
Bu algoritma uygulanırsa işe ıslak elbiselerle gidilir. Bir programda, yapılacak işlemlerin sırasını belirlemeye program kontrolü denir.

Bu işe yönelik işlemler şunlar olabilir:

başla, (Algoritma başlangıcını ifade eder)
A sayısını al, (Bilgisayara, kullanıcıdan sayı bilgisi istediğini belirtmesi ve A'ya aktarması isteniyor)
B sayısını al,
C sayısını al,
D = A + B + C
yaz D, (toplam sonucunu barındıran D değerini ekrana yazması isteniyor)
dur (Algoritma sonunu ifade eder)
Bir önceki örneğimizde her sayı için bir değişken (bilgisayarın işlemleri yapması sırasında kullandığı hafıza bölgesini simgeleyen harfler) kullanıldı ve toplam sonucu da D isimli diğer bir değişkene aktarıldı. Oysa bilgisayar sayı bilgisini aldıktan sonra toplam değeri tutacağı D değişkenine aktarabilir ve aynı değişken ile ikinci ve üçüncü sayı değerlerini de isteyebilirdi. Örneğin;  değişkenleri birer su kovasına ve bilgileri de kovalara doldurulan suya benzetirsek, D kovasına toplanacak suları A kovası ile kullanıcıdan isteyebilir ve her aldığımız suyu (bilgiyi) D kovasında biriktirebiliriz.
Şimdi aynı örneği iki değişkenle yapma yöntemine bakalım.

başla,
A sayısını al,
D = D + A (D değişkenine D nin önceki değeri ve A toplanır, yani D değerine A değeri eklenir)
A sayısını al,
D = D + A
A sayısını al,
D = D + A
yaz D,
dur
Bu örnek yine bir öncekinde olduğu gibi aynı sonuca ulaşır ancak dört yerine iki tane değişken kullanılmıştır. Az sayıda değişken kullanımı bilgisayar belleğinin de verimli kullanımı anlamına gelmektedir zira çok değişken çok sayıda bellek bölgesini işgal etmek demektir. Eğer toplanması gereken sayı değeri çok daha fazla olsaydı 2. ve 3. adımdaki işlemleri o miktarda çoğaltmak gerekirdi. Bu durumda satır sayısı çok artacak, kontrol etmek ve düzenlemek güç belki de olanaksız hale gelecektir. Bu tür durumlarda aynı işlem çok sayıda tekrar ediyorsa "döngü" dediğimiz bir yöntemle bu sorunu aşabiliriz.
Döngü: Tekrar eden işlemleri belirli kurallar ve kontroller çerçevesinde otomatik olarak yaptıran programlama mantığıdır. Döngü işleminde karar verme noktası vardır. Bu noktada bir mantıksal karşılaştırma yapılarak döngünün devam edip etmeyeceği kararı verilir.
Yukarıda verilen toplama örneğini üçüncü bir yöntemle, döngü kullanarak yapalım.

başla,
K = 0 (K kontrol değişkenidir ve döngünün tekrar sayısını hesaplamak için kullanılır)
A sayısını al,
D = D + A
K = K + 1 (Her sayı alma ve toplama işlemini sayar, yani değerini bir artırır)
K < 3 ise git 3 (K değeri 3 ten az ise üzere 3. satıra yönlendirir.)
yaz D,
dur
Bu örneğimizdeki kontrol değişkeninin değerini test ettiğimiz 6. satır döngü tekrar sayısını belirleyen satırdır. Burada K < 40 şeklinde bir koşul belirlemiş olsaydık döngü tekrar sayımız 39 olacaktı.

Sahte Kodlar, bir programcının algoritma yazmada kullandığı yapay ve mantıksal dildir. Her gün konuştuğumuz dile oldukça yakındır. Bu kodlar programcıya, program hakkında düşünme fırsatını verir. Sahte kodlar sadece işlem ifadelerini içerir. İşlem ifadeleri, sahte kodlar C’ye çevrildiğinde, C’de çalıştırılabilecek ifadelerdir. Bildirimler, çalıştırılabilir ifadeler değildir. Bunlar, derleyiciye gönderilen mesajlardır. Örneğin;

int i;
bildirimi, derleyiciye i değişkeninin tipini bildirir ve derleyiciden, hafızada bu değişken için yer almasını ister. Ancak bu bildirim, program çalıştırıldığında giriş, çıkış ya da hesaplama gibi bir işleme sebep olmaz.

Algoritmanın görsel olarak simge ya da sembollerle ifade edilmiş şeklidir. Akış şemalarının algoritmadan farkı, adımların simgeler şeklinde kutular içine yazılmış olması ve adımlar arasındaki ilişkilerin ve yönünün oklar ile gösterilmesidir.
Programın saklanacak esas belgeleri olan akış şemalarının hazırlanmasına, sorun çözümlenmesi sürecinin daha kolay anlaşılır biçime getirilmesi, iş akışının kontrol edilmesi ve programın kodlanmasının kolaylaştırılması gibi nedenlerle başvurulur. Uygulamada çoğunlukla, yazılacak programlar için önce programın ana adımlarını (bölümlerini) gösteren genel bir bakış akış şeması hazırlanır. Daha sonra her adım için ayrıntılı akış şemalarının çizimi yapılır.

Adım 1- Başla
Adım 2- Birinci sayıyı oku
Adım 3- İkinci sayıyı oku
Adım 4- İki sayıyı tut
Adım 5- Son
Algoritma hazırlanırken, çözüm için yapılması gerekli işlemler, öncelik sıraları gözönünde bulundurularak ayrıntılı bir biçimde tanımlanmalıdırlar. Yanda algoritma hazırlanmasına ilişkin bir örnek yer almaktadır. Verilen iki sayının toplamının bulunmasının algoritması yandaki gibi  yazılır. Algoritmaya dikkat edilirse işlemlerin sıralanmasında, işlem önceliklerinin göz önünde bulundurulduğu görülür. Ayrıca algoritma yazımı sorun çözümünün başladığını gösteren "BAŞLA" ifadesi ile başlamakta ve işlemlerin bittiğini belirten "DUR" ifadesi ile sona ermektedir.
Akış şemalarının hazırlanmasında aşağıda yer alan simgeler kullanılır.
Başla/Dur: Programın başladığı ve bittiği konumu gösterir. Her programda başla ve dur şemaları mutlaka olmalıd

Kitaplık:Dil
Almanca öğrenmek için ücretsiz ders kitabı Almanca Vikikitap'a hoş geldiniz. Bu kitap hâlâ geliştirme aşamasında olduğundan tartışma sayfamızda bilinen sorunları/önerileri bildirmeye davetlisiniz. Katkıda bulunmak isterseniz geliştiricinin sayfasına bakmaktan çekinmeyiniz.

Herzlich willkommen!
Almanca öğrenmek için ne lâzımsa burada bulabilirsiniz. Şu an için belki biraz az olabilir; ama kitabımız bittikten sonra bilmek istediğiniz her şeyi kolaylıkla bulabileceksiniz.
Sie finden hier, was Sie zum Deutschlernen brauchen. Es kann im Moment etwas wenig sein, aber nachdem unser Buch fertiggestellt ist, werden Sie alles, was Sie suchen, leicht wiederfinden.
Bu kitap bir grup çalışmasıdır ve sizi de davet ediyoruz. İsterseniz siz de yazabilir ya da hataları düzeltebilirsiniz.
Dieses Buch ist eine Gruppenarbeit und wir laden auch Sie ein. Wenn Sie wollen, können auch Sie schreiben oder korrigieren.

Giriş
Almanca alfabesi
Dil reformu

İsimler ve tanımlıklar (Nomen und Artikel)
İsmin hâlleri (Deklination der Substantive)
Sıfatlar (Adjektive)
Fiiller (Verben)
Zamanlar (Tempus)
geçmiş zaman (I und II Vergangenheit)
şimdiki zaman (Gegenwart)
gelecek zaman (Zukunft - Futur I und II)
Soru kelimeleri (Fragewörter)
Kim? (Wer?)
Nasıl? (Wie?)
Nerede ? (Wo?)
Ne? (Was?)
Neden? Niçin? (Wieso?, Weshalb? Warum?)
Zamir (Pronomen)
Zaman (Zeitangaben)
Belirtme sıfatları (Ortsangaben)

Aile fertleri
Artikel (belirli ve belirsiz)
Fiil örnekleri
Günler ve aylar
Meslekler
Renkler
Sayılar
Ülke isimleri, vatandaşlık ve diller

Giriş
Verben - Fiiller
Almanca kelimeler
Almanca temel sözcükler
Almanca Cümle Deposu

Aile (die Familie) bireylerine seslenilirken şu ifadeler kullanılır:

die Eltern (ebeveyn/anne-baba)
der Vater (baba)
die Mutter (anne)
der Grossvater (büyükbaba)
die Grossmutter (büyükanne)
der Opa (dede)
die Oma (nine)
die Grosseltern (büyük anne-baba)
der Bruder (erkek kardeş)
die Schwester (kızkardeş)
die Geschwister (kardeşler)
der Sohn (erkek evlat)
die Tochter (kız evlat)
die Kinder (çocuklar)
der Onkel (amca/dayı)
die Tante (hala/teyze)
der Neffe (erkek yeğen)
die Nichte (kız yeğen)
der Enkel: (erkek torun)
die Enkelin: (kız torun)
der Cousin (amca/dayı/hala oğlu) Erkek kuzen
die Cousine (amca/dayı/hala kızı)Kız kuzen
der Bräutigam (damat)
die Braut (gelin)
der Schwager (enişte/bacanak/kayınbirader)
die Schwägerin (yenge/baldız/görümce)
der Schwiegervater (kayınpeder)
die Schwiegermutter (kayınvalide)
die Verwandte (akrabalar)
der Zwillingsbruder: ikiz kardeş (erkek)
die Zwillingsschwester: ikiz kardeş (kız)
das Baby: bebek

Almancanın toplam 30 harfi vardır, 29 harfi büyük ve küçük yazılır. Gelecekte harflerin nasıl okunduklarına dair ses kayıtları eklenecektir.

A, I, O ve U harfleri Türkçedeki gibi okunur. E harfi ses tonu olarak biraz I harfine benzer.

Sessiz harflerin okunuşu biraz farklıdır. Sessiz harfin bazılarının önünde (e-), bazılarının arkasında (-e) okunur.
Parantez içindeki kelimeler okumanıza biraz yardımcı olabilir. Parantez içinde okunuşu gösterilmeyen harfler Türkçedeki gibi okunur.

Ü ve Ö aynen Türkçedeki gibi okunur.
Ä Türkçe'deki 'özlem' veya 'gel' kelimelerindeki e sesleri gibi açık şekilde okunur, 'ev' veya 'gelin' kelimelerindeki gibi kapalı şekilde değil.

ei, beraber Türkçe'deki 'ay' şeklinde okunur. Örnek: Das Eis (buz) ays okunur. Die Türkei (Türkiye) Türkay okunur.
eu beraber 'oy' olarak okunur. äu da aynıdır. Europa (Avrupa) oyropa olarak okunur.
au 'av' gibi okunur. Das Haus (ev)
sch → 'ş' olarak okunur. Örneğin der Tisch (masa) 'tiş' şeklinde okunur.
tsch → ç Tschüs (bay bay/görüşürüz) 'çüs' şeklinde okunur.
ie beraber uzun i olarak okunur
ch → Kalın H (sadece h iki ünlü arasında 'y' gibi okunur. Ich gehe)
ck → Kalın K
Kelime başında st ve sp, şt ve şp olarak okunur.

V harfi başta olursa 'f' olarak okunur.
Der Vogel (kuş) fogıl okunur.

Almancaya ait olan ß harfi, normal "s" gibi okunur. Eski bir harf olup ve artık az kullanılmaktadır.
Özellikleri:

ß harfi hiçbir zaman kelimenin başında yer almaz.
Küçük harfi yoktur, her zaman büyük yazılır.
ß yerine kelimeyi iki tane 's' kullanarak da yazabilirsiniz. (Straße ya da Strasse)

s, ß ve ss aralarındaki fark
Straße: içindeki ß harfi, a harfini uzun okutur.
Fass: içindeki çift s, a harfini kısa okutur.
Not: 1996 yapılan reformda, Almanca bazı değişikliklere uğradı. Almancanın yazılışını kolaylaştırmak amacıyla yapılan bu reformlar, 2004 ve 2006'da yeniden biraz değiştirildi.
Reformun sayesinde ß harfi bazı kelimelerde, mesela Fluss (nehir) ve Fass (Fıçı) gibi kelimelerinde ss'ye çevrildi.
Almanca dil reformu üzerine detaylı bilgi için, dil reformu kısmına bakınız.

Almanca/Almanca temel sözcükler

abbrechen: kırmak
der Abend: akşam
die Abende: akşamlar
das Abendessen: akşam yemeği
die Abenteuer: macera
aber: ama, fakat
die Abfahrt: hareket
abwarten: beklemek
achten: saymak
die Adresse: adres
ähneln: benzemek
die Ahnung: fikir
alle: bütün, hepsi, herkes
allein: tek başına, yalnız
alles: hepsi
alt: eski, yaşlı
der Alte: yaşlı (erkek)
die Alte: yaşlı (kadın)
das Alter: yaş
am Abend: akşamleyin
die Ampel: lamba
an: yanında
anbauen: dikmek, ekmek
das Andenken: hatıra
ander-: başka
andere: başka
ändern: değişmek
anders: başka, değişik
aneinander: birbirine
anfangen: başlamak
angenehm: hoş
anhalten: durmak
ankommen: varmak
die Ankunft: varış
anmachen: açmak
anmelden: başvurmak
anrufen: telefon etmek
anschauen: bakmak
ansehen: bakmak, görmek, seyretmek
antworten: cevap vermek
der Anzug: elbise
die Anzüge: elbiseler
der Apfel: elma
die Äpfel: elmalar
der Apparat: alet
die Apparate: aletler
der Appetit: iştah
die Arbeit: iş
arbeiten: çalışmak
arbeitslos: işsiz
der Arbeitsplatz: işyeri
die Arbeitsplätze: işyerleri
die Arbeitsstelle: işyeri
die Arbeitsstellen: işyerleri
arm: fakir, yoksul
der Arm: kol
die Arme: kollar
die Armee: ordu
die Armeen: ordular
der Arzt: doktor
die Ärzte: doktorlar
der Aschenbecher: sigara tablası
die Aschenbecher: sigara tablaları
der Ast: dal
die Äste: dallar
auf: üstünde, üstüne
die Aufgabe: ödev
die Aufgaben: ödevler
aufgeben: bırakmak
aufgeregt: heyecanlı
aufhängen: asmak
aufmachen: açmak
Aufnahme machen: resim çekmek
aufräumen: temizlemek, toplamak
aufschreiben: yazmak
aufstehen: kalkmak, uyanmak
aufsteigen: binmek
der Auftrag: görev, ödev
die Aufträge: görevler, ödevler
aufwachen: uyanmak
das Auge: göz
die Augen: gözler
der Augenblick: an, saniye
die Augenblicke: anlar, saniyeler
der Ausflug: gezinti
die Ausflüge: gezintiler
ausgehen: çıkmak
die Auskunft: bilgi
die Auskünfte: bilgiler
auslachen: alay etmek, gülmek
der Ausländer: turist, yabancı (erkek)
die Ausländer: turistler, yabancılar (erkekler)
die Ausländerin: turist, yabancı (kadın)
die Ausländerinnen: turistler, yabancılar (kadınlar)
ausmachen: kapamak
ausreichend: kâfi
aussteigen: inmek
das Auto: araba, otomobil
die Autos: arabalar, otomobiller
der Autobus: otobüs
die Autobusse: otobüsler
das Automobil: otomobil
die Automobile: otomobiller

das Bad: banyo
die Bäder: banyolar
der Bahnhof: gar, istasyon
die Bahnhöfe: garlar, istasyonlar
bald: hemen
die Banane: muz
die Bananen: muzlar
die Bank: sıra
die Bänke: sıralar
der Bart: sakal
die Bärte: sakallar
der Bau: yapı
die Bauten: yapılar
bauen: inşa etmek, yapmak
der Bauernhof: çiftlik
die Bauernhöfe: çiftlikler
der Baum: ağaç
die Bäume: ağaçlar
die Baumwolle: pamuk
der Bazar: pazar
die Bazare: pazarlar
beachten: dikkat etmek
beantworten: cevaplandırmak
bedeuten: anlamına gelmek, demek
bedeutend: önemli
die Bedeutung: önem
die Bedeutungen: önemler
befehlen: emretmek
begegnen: karşılaşmak
beginnen: başlamak
die Behandlung: tedavi
die Behandlungen: tedaviler
bei: yanında
beide: her ikisi
beides: her ikisi
beilegen: eklemek
das Bein: bacak
die Beine: bacaklar
das Beispiel: örnek
die Beispiele: örnekler
bekannt: tanınmış
bekommen: almak
bequem: rahat
beleben: canlandırmak
bellen: havlamak
die Belohnung: ödül
die Belohnungen: ödüller
benachrichtigen: haber vermek
benutzen: kullanmak
der Berg: dağ
die Berge: dağlar
berichten von: haber vermek
der Beruf: meslek
die Berufe: meslekler
berühmt: meşhur
besann: düşünmek
Bescheid geben: haber vermek
der Besen: fırça
die Besen: fırçalar
besichtigen: dolaşmak, gezmek
besinnen: hatırlamak
besonders: özel
besonders: özellikle
besonnen: düşünmek
besser: daha iyi
das Besteck: sofra takımı
die Bestecke: sofra takımları
bestellen: ısmarlamak
bestimmt: muhakkak
der Besuch: ziyaret
die Besuche: ziyaretler
besuchen: gezmek, ziyaret etmek
der Besucher: misafir
die Besucher: misafirler
beten: dua etmek
betreten: girmek
das Bett: yatak
die Betten: yataklar
bewegt: hareketli
die Bewegung: hareket
die Bewegungen: hareketler
bezahlen: ödemek
der Bezirk: kasaba, mahalle
die Bezirke: kasabalar, mahalleler
das Bier: bira
die Biere: biralar
das Bild: resim, tablo
die Bilder: resimler, tablolar
billig: ucuz
die Birne: armut
die Birnen: armutlar
bis: kadar
bitte: buyurun, lütfen
bitten: rica etmek
blank: parlak
blau: mavi
blau: mavi
bleiben: kalmak
die Blume: çiçek
die Blumen: çiçekler
die Bluse: bluz
die Blusen: bluzlar
der Boden: toprak, yer
die Böden: topraklar, yerler
der Bort: güverte
die Borte: güverteler
der Bosporus: Boğaziçi
die Börse: borsa
die Börsen: borsalar
böse: fena, kötü
brauchen: ihtiyacı olmak, kullanmak
die Braut: gelin
die Bräute: gelinler
brechen: kırmak
breit: geniş
brennen: yakmak
das Brett: tahta
die Bretter: tahtalar
der Brief: mektup
die Briefe: mektuplar
die Briefmarke: pul
die Briefmarken: pullar
brillant: parlak
die Brille: gözlük
die Brillen: gözlükler
bringen: getirmek
die Broschüre: broşür
die Broschüren: broşürler
das Brot: ekmek
die Brote: ekmekler
der Bruder: erkek kardeş
die Brüder: erkek kardeşler
der Brunnen: çeşme
die Brunnen: çeşmeler
die Brücke: köprü
die Brücken: köprüler
das Buch: kitap
die Bücher: kitaplar
die Bude: büfe
die Buden: büfeler
der Bulle: boğa
die Bullen: boğalar
der Bus: otobüs
die Busse: otobüsler
die Butter: tereyağı
das Bücherregal: kitaplık
die Bücherregale: kitaplıklar
die Bühne: sahne
die Bühnen: sahneler
das Büro: büro
die Büros: bürolar
die Bürste: fırça
die Bürsten: fırçalar

da: burada, için, o zaman, orada
dabei: aynı zamanda, bu arada, yanında
dahin: oraya
damals: eskiden, o zamanlar
die Dame: bayan
die Damen: bayanlar
danach: sonra
der Dank: teşekkür
danke: teşekkür
danken: teşekkür etmek
dann: o zaman, sonra
die Dardanellen: Çanakkale Boğazı
das: bu
dasein: bulunmak
das Datum: tarih
die Daten: tarihler
dauern: devam etmek, sürmek
das Deck: güverte
die Decks: güverteler
die Decke: örtü, tavan
die Decken: örtüler, tavanlar
denken: düşünmek
das Denkmal: anıt
die Denkmäler: anıtlar
denn: çünkü
deutsch: Alman
der Deutsche: Alman (erkek)
die Deutschen: Almanlar
die Deutsche: Alman (kadın)
die Dichterin: şair (kadın)
die Dichterinnen: şairler (kadın)
der Dichter: şair (erkek), yazar
die Dichter: şairler (erkek), yazarlar
dick: kalın, şişman
die beiden: her ikisi
dies: bu
der Direktor: müdür
die Direktoren: müdürler
diskutieren: tartışmak
doch: ama
das Dorf: köy
die Dörfer: köyler
dort: orada
dorthin: oraya
drehen: çevirmek
dringend: acil
du: sen
dumm: aptal
durchgehen: geçmek
die Dusche: duş
die Duschen: duşlar
dünn: zayıf
dürfen: -ebilmek (izin)

eben: demin, şimdi
echt: gerçek
ehrlich: dürüst
das Ei: yumurta
die Eier: yumurtalar
eifrig: çalışkan
ein bißchen: biraz
einander: birbirine
einfach: basit, kolay, sade
einfallen: hatırlamak
einige: birkaç
einladen: davet etmek
die Einladung: davet
die Einladungen: davetler
einsperren: hapsetmek
einsteigen: binmek
eintreten: girmek
die Eintrittskarte: bilet
die Eintrittskarten: biletler
der Einwohner: sakin
die Einwohner: sakinler
einzel: tek
einzig: tek
das Eis: buz
das Eisen: demir
die Eisenbahn: demiryolu, tren
die Eisenbahnen: demiryolları, trenler
die Eisenindustrie: demir endüstrisi
elegant: şık
die Eltern: ebeveyn
empfehlen: tavsiye etmek
das Ende: son
die Enden: sonlar
endlich: artık, nihayet
entdecken: keşfetmek
die Entscheidung: karar
die Entscheidungen: kararlar
entschuldigen: affetmek
die Erde: dünya, toprak, yer
die Erden: dünyalar, topraklar, yerler
erfahren: öğrenmek
erfinden: bulmak
Erfolg haben: başarmak
erhalten: almak
die Erinnerung: anı, hatıra
die Erinnerungen: anılar, hatıralar
erkundigen: sormak
erledigen: bitirmek
der Ernst: ciddiyet
ernst: ciddi
eröffnen: açmak
erreichen: yetişmek
erst: daha, ilk, önce
erste: ilk
erwidern: cevap vermek
erzählen: anlatmak
essen: yemek
das Essen: yemek
etwas: biraz, daha

die Fabrik: fabrika
die Fabriken: fabrikalar
fahren: gitmek
die Fahrkarte: bilet
die Fahrkarten: biletler
das Fahrrad: bisiklet
die Fahrräder: bisikletler
die Fahrt: seyahat, yolculuk
die Fahrten: seyahatler, yolculuklar
fallen: düşmek
fällen: kesmek
falsch: yanlış
die Familie: aile
die Familien: aileler
die Farbe: renk
die Farben: renkler
fast: hemen hemen
der Fehler: yanlış
die Fehler: yanlışlar
das Feld: alan, tarla
die Felder: alanlar, tarlalar
das Fenster: pencere
die Fenster: pencereler
die Ferne: uzak
fertig haben: bitirmek
fertig machen: bitirmek
fertig: hazır, tamam
das Feuer: ateş
die Feuer: ateşler
das Fieber: ateş (hastalık)
die Fieber: ateşler (hastalık)
der Film: film
die Filme: filmler
finden: bulmak
die Firma: firma, şirket
die Firmen: firmalar, şirketler
der Fisch: balık
die Fische: balıklar
die Flasche: şişe
die Flaschen: şişeler
der Fleck: leke
die Flecke: lekeler
das Fleisch: et
fleißig: çalışkan
fliegen: uçmak
fliehen: kaçmak
fließen: akmak
das Flugzeug: uçak
die Flugzeuge: uçaklar
der Fluß: ırmak, nehir
die Flüsse: ırmaklar, nehirler
das Fotografieren: fotoğraf çekme
die Frage: soru
die Fragen: sorular
fragen: sormak
Frankreich: Fransa
der Franzose: Fransız (erkek)
die Franzosen: Fransızlar (erkek)
die Französin: Fransız (kadın)
die Französinnen: Fransızlar (kadın)
französisch: Fransızca
die Frau: bayan, kadın
die Frauen: bayanlar, kadınlar
frech: yaramaz
frei: boş, hür, serbest
fremd: yabancı
der Fremdenführer: rehber (erkek)
die Fremdenführer: rehberler (erkek)
die Fremdenführerin: rehber (kadın)
die Fremdenführerinnen: rehberler (kadın)
der Fremde: yabancı (erkek)
die Fremden: yabancılar (erkek)
die Fremde: yabancı (kadın)
die Fremden: yabancılar (kadın)
freuen über: sevinmek
der Freund: arkadaş (erkek)
die Freunde: arkadaşlar (erkek)
die Freundin: kız arkadaş
die Freundinnen: kız arkadaşlar
freundlich: nazik
der Friede: barış
der Frieden: barış
der Friedhof: mezarlık
die Friedhöfe: mezarlıklar
frisch: taze
der Friseur: berber (erkek)
die Friseure: berberler (erkek)
der Frisör: berber (erkek)
die Frisöre: berberler (erkek)
die Friseurin: berber (kadın)
die Friseurinnen: berberler (kadın)
die Frisörin: berber (kadın)
die Frisörinnen: berberler (kadın)
froh: memnun, neşeli, sevinçli
fröhlich: neşeli, sevinçli
früh: erken
früher: daha erken, eskiden
der Frühling: ilkbahar
das Frühstück: kahvaltı
das Frühstücke: kahvaltılar
furchtbar: korkunç
der Fuß: ayak
die Füße: ayaklar
fühlen: duymak, hissetmek
führen: götürmek
für: için

die Gabel: çatal
die Gabeln: çatallar
ganz gut: fevkalâde
ganz: bütün, çok, tam
die Garage: garaj
die Garagen: garajlar
die Gardine: perde
die Gardinen: perdeler
der Garten: bahçe
die Gärten: bahçeler
der Gast: misafir
die Gäste: misafirler
das Gasthaus: lokanta
die Gasthäuser: lokantalar
das Gebäude: bina, yapı
die Gebäude: binalar, yapılar
geben: vermek
das Gebiet: bölge
die Gebiete: bölgeler
der Gebrauch: gelenek
die Gebräuche: gelenekler
das Geburtsdatum: doğum tarihi
die Geburtsdaten: doğum tarihleri
der Geburtstag: yaş günü
die Geburtstage: yaş günleri
geschlossen: kapalı
das Gedächtnis: akıl, hafıza
die Gedächtnisse: akıllar, hafızalar
der Gedanke: fikir
die Gedanken: fikirler
das Gedicht: şiir
die Gedichte: şiirler
gefährlich: tehlikeli
gefallen: beğenmek, hoşuna gitmek
gehen: gitmek
gehören zu: ait olmak
gehören: ait olmak
Geht in Ordnung!: tabii
der Geist: akıl, ruh
die Geister: akıllar, ruhlar
Gelb: sarı
gelb: sarı
das Geld: para
die Gelder: paralar
der Geldbeutel: cüzdan, para çantası
die Geldbeutel: cüzdanlar, para çantaları
die Geldbörse: para çantası
die Geldbörsen: para çantaları
die Geldtasche: para çantası
die Geldtaschen: para çantaları
gelingen: başarmak
das Gemälde: tablo
die Gemälde: tablolar
das Gemüse: sebze
die Gemüse: sebzeler
genau: tam
genug: kâfi
das Gepäck: bagaj, yük
geradeaus: doğru
das Gerät: alet
die Geräte: aletler
das Geräusch: gürültü
die Geräusche: gürültüler
gern haben: sevmek
das Geschäft: dükkan, iş, mağaza
die Geschäfte: dükkanlar, işler, mağazalar
geschehen: olmak
das Geschenk: hediye
die Geschenke: hediyeler
die Geschichte: hikâye, tarih
die Geschichten: hikâyeler, tarihler
das Geschirr: sofra takımı
die Geschirre: sofra takımları
geschlossen: kapalı
die Gesellschaft: şirket, toplum
die Gesellschaften: şirketler, toplumlar
das Gesetz: yasa
die Gesetze: yasalar
das Gesicht: yüz
die Gesichter: yüzler
gespannt: heyecanlı, meraklı
gestern: dün
gesund: sağlıklı
die Gesundheit: sağlık
die Getränke: içecek
die Getränke: içecekler
giftig: zehirli
das Glas: bardak, cam
die Gläser: bardaklar, camlar
glauben: inanmak, sanmak, tahmin etmek
gleich: eşit, hemen, şimdi
gleichzeitig: aynı zamanda
das Gleis: demiryolu, peron
die Gleise: demiryolları, peronlar
das Glück: şans
glücklich: mutlu
das Gold: altın
die Golde: altınlar
das Grab: mezar
die Gräber: mezarlar
das Grabmal: mezar
die Grabmäler: mezarlar
das Gramm: gram
die Gramme: gramlar
die Grenze: sınır
die Grenzen: sınırlar
groß: büyük
die Grundschule: ilkokul
die Grundschulen: ilkokullar
Grün: yeşil
grün: yeşil
gut: iyi

haben: sahip olmak
der Hafen: liman
die Häfen: limanlar
der Hahn: musluk
die Hähne: musluklar
halb: buçuk, yarım
die Hälfte: yarım
die Hälften: yarımlar
der Hals: boğaz
die Hälse: boğazlar
halten: durmak
die Haltestelle: durak
die Haltestellen: duraklar
die Hand: el
die Hände: eller
der Handel: ticaret
die Handels: ticaretler
der Handschuh: eldiven
die Handschuhe: eldivenler
das Handtuch: havlu, mendil
die Handtücher: havlular, mendiller
hängen: asmak
hart: sert, zor
häßlich: çirkin
der Hauptbahnhof: gar
die Hauptbahnhöfe: garlar
die Hauptstadt: başkent
die Hauptstädte: başkentler
das Haus: ev
die Häuser: evler
die Hausfrau: ev kadını
die Hausfrauen: ev kadınları
die Haut: deri
die Häute: deriler
heben: kaldırmak
das Heft: defter
die Hefte: defterler
heil: aydınlık
die Heilung: tedavi
die Heilungen: tedaviler
heiraten: evlenmek
heiraten: evlenmek
heiß: sıcak
heiß: sıcak
heiter: canlı, hareketli, neşeli
die Heizung: kalorifer
die Heizungen: kaloriferler
helfen: yardım etmek
die Helligkeit: aydınlık
die Helligkeiten: aydınlıklar
das Hemd: gömlek
die Hemden: gömlekler
der Herbst: sonbahar
die Herbste: sonbaharlar
der Herr: bay
die Herren: baylar
herrlich: harika, harikulade
herstellen: yapmak
herumlaufen: gezmek
das Herz: kalp, yürek
die Herzen: kalpler, yürekler
heute abend: bu akşam
heute: bugün
hier: burada, buraya
hierher: buraya
die Hilfe: yardım
die Hilfen: yardımlar
der Himmel: gök
die Himmel: gökler
hineingehen: içeri girmek
hinlegen: koymak
hinten: arkada
hinzufügen: eklemek
das Hobby: hobi
die Hobbys: hobiler
hoch kommen: çıkmak
hoch: yüksek
hochhalten: kaldırmak
das Hochhaus: gökdelen
die Hochhäuser: gökdelenler
die Hochzeit: düğün
die Hochzeiten: düğünler
holen: almak, getirmek
das Holz: tahta
die Hölzer: tahtalar
das Hotel: otel
die Hotels: oteller
höflich: nazik
hören: dinlemek, duymak, işitmek
der Hörer: dinleyici
die Hörer: dinleyiciler
das Huhn: tavuk
die Hühner: tavuklar
der Hund: köpek
die Hunde: köpekler
hungrig: aç
der Hut: şapka
die Hüte: şapkalar
hübsch: hoş

der Kaiser: imparator
die Kaiser: imparatorlar
kalt: soğuk
kämpfen: savaşmak
kaputt: bozuk
der Karren: araba (el arabası)
die Karren: arabalar (el arabaları)
die Karte: bilet, harita, kart
die Karten: biletler, haritalar, kartlar
die Kartoffel: patates
die Kartoffeln: patatesler
der Käse: peynir
die Käse: peynirler
das Kasino: gazino
die Kasinos: gazinolar
die Kasse: kasa, vezne
die Kassen: kasalar, vezneler
die Katze: kedi
die Katzen: kediler
kaufen: satın almak
das Kaufhaus: mağaza
die Kaufhäuser: mağazalar
kehren: dönmek
kennen: tanımak
der Kilometer: kilometre
die Kilometer: kilometreler
das Kind: çocuk
die Kinder: çocuklar
das Kino: sinema
die Kinos: sinemalar
der Kiosk: büfe
die Kioske: büfeler
klar: açık
Klar!: evet, tabii
die Klasse: sınıf
die Klassen: sınıflar
klauen: çalmak
das Kleid: elbise, giysi
die Kleider: elbiseler, giysiler
die Kleidung: giysi
klein: küçük
die Kleinstadt: kasaba
die Kleinstädte: kasabalar
die Klinge: jilet
die Klingen: jiletler
die Klinik: klinik
die Kliniken: klinikler
klopfen: vurmak
klug: akıllı
kochen: pişirmek
der Koffer: bavul
die Koffer: bavullar
kolossal: çok büyük
komisch: komik
kommen: gelmek
die Konkurrenz: yarış
die Konkurrenzen: yarışlar
das Konzert: konser
die Konzerte: konserler
der Kopf: baş, kafa
die Köpfe: başlar, kafalar
die Kopfschmerzen: baş ağrısı
der König: kral
die Könige: krallar
die Königin: kraliçe
die Königinnen: kraliçeler
können: -ebilmek (yapabilmek)
der Krach: gürültü
krank: hasta
der Kranke: hasta (erkek)
die Kranken: hastalar (erkek)
die Kranke: hasta (kadın)
die Kranken: hastalar (kadın)
das Krankenhaus: hastane
die Krankenhäuser: hastaneler
die Krawatte: kravat
die Krawatten: kravatlar
Krieg führen: savaşmak
der Kuchen: pasta
die Kuchen: pastalar
die Kuh: inek
die Kühe: inekler
die Kultur: kültür
die Kulturen: kültürler
der Kunde: müşteri (erkek)
die Kunden: müşteriler (erkek)
die Kundin: müşteri (kadın)
die Kundinnen: müşteriler (kadın)
die Kunst: sanat
die Künste: sanatlar
kurz: kısa
die Küche: mutfak
die Küchen: mutfaklar
der Kühlschrank: buzdolabı
die Kühlschränke: buzdolapları
küssen: öpmek

lachen: gülmek
der Laden: dükkan
die Läden: dükkanlar
die Ladung: yük
die Lagen: durumlar
die Lampe: lamba
die Lampen: lambalar
das Land: kara, memleket, ülke
die Landkarte: harita
die Landkarten: haritalar
lang: uzun
langsam: yavaş
lassen: bırakmak
die Laune: hava
das Leben: hayat
leben: yaşamak
lebendig: canlı, sağ
das Leder: deri
leer: boş
legen: koymak
der Lehrer: öğretmen (erkek)
die Lehrer: öğretmenler (erkek)
die Lehrerin: öğretmen (kadın)
die Lehrerinnen: öğretmenler (kadın)
das Lehrstück: ders
die Lehrstücke: dersler
leicht: hafif, kolay
leider: maalesef
die Leiter: merdiven
die Leitern: merdivenler
lernen: öğrenmek
lesen: okumak
lästern: alay etmek
letzt-: geçen, son
die Leute: halk, kişiler
das Licht: ışık
lieb: sevgili
lieben: sevmek
lieber: daha iyi
das Lied: şarkı
die Lieder: şarkılar
liegen: bulunmak, yatmak
die Linie: çizgi
die Linien: çizgiler
links: sol, solda
die Literatur: edebiyat
die Lokomotive: lokomotif
die Lokomotiven: lokomotifler
der Löffel: kaşık
die Löffel: kaşıklar
lösen: çözmek
der Löwe: aslan
die Löwen: aslanlar
die Luft: hava
die Lust: istek

machen: yapmak
das Mädchen: kız
die Mädchen: kızlar
der Mai: Mayıs
mal: defa
der Maler: ressam (erkek)
die Maler: ressamlar (erkek)
die Malerin: ressam (kadın)
die Malerinnen: ressamlar (kadın)
die Mama: anne
man: insan, kişi
manchmal: bazen
der Mann: adam
die Männer: adamlar
der Mantel: manto, palto
die Mäntel: mantolar, paltolar
die Mappe: çanta
die Mappen: çantalar
das Märchen: masal
die Märchen: masallar
die Mark: mark
der Markt: pazar
die Märkte: pazarlar
die Marktwirtschaft: piyasa ekonomisi
die Marmelade: reçel
die Maschine: makine
die Maschinen: makineler
die Mauer: duvar
die Mauern: duvarlar
die Medizin: tıp
das Meer: deniz
die Meere: denizler
mehr: artık
melden: haber vermek
die Menge: miktar
die Mengen: miktarlar
der Mensch: insan
die Menschen: insanlar
merkwürdig: ilginç, tuhaf
die Messe: fuar
die Messen: fuarlar
das Messer: bıçak
die Messer: bıçaklar
der Meter: metre
die Meter: metreler
die Miete: kira
die Milch: süt
das Militär: ordu
der Minister: bakan (erkek)
die Minister: bakanlar (erkek)
die Ministerin: bakan (kadın)
die Ministerinnen: bakanlar (kadın)
die Minute: dakika
die Minuten: dakikalar
mit: birlikte, ile
mitnehmen: götürmek
das Mittagessen: öğle yemeği
die Mittagessen: öğle yemekleri
die Mitte: orta
das Mittelmeer: Akdeniz
die Mittelreife: ortaokul (bitirme sınavı)
die Mittelschule: ortaokul
die Mittelschulen: ortaokullar
der Mittwoch: çarşamba
modern: modern
der Moment: an
die Momente: anlar
der Monat: ay
die Monate: aylar
der Mond: ay
die Monde: aylar
der Montag: pazartesi
die Morgen: sabah
der Morgen: yarın
morgens: sabahları
die Moschee: cami
die Moscheen: camiler
mögen: istemek, rica etmek
möglich: mümkün
der Mund: ağız
die Münder: ağızlar
das Museum: müze
die Museen: müzeler
die Musik: müzik
der Musiker: müzisyen (erkek)
die Musiker: müzisyenler (erkek)
die Musikerin: müzisyen (kadın)
die Musikerinnen: müzisyenler (kadın)
die Mutter: anne
die Mütter: anneler
die Mutti: anne
die Muttis: anneler
müde: yorgun
der Mythos: efsane
die Mythen: efsaneler

der Nachbar: komşu (erkek)
die Nachbarn: komşular (erkek)
die Nachbarin: komşu (kadın)
die Nachbarinnen: komşular (kadın)
die Nachricht: haber
die Nachrichten: haberler
nächst-: ertesi, gelecek
die Nacht: gece
die Nächte: geceler
nächtlich: geceleyin
nähen: dikmek
der Name: ad, isim
die Namen: adlar, isimler
nämlich: çünkü
die Nase: burun
die Nasen: burunlar
naß: ıslak
die Natur: doğa
natürlich: tabii
neben: yanında
nehmen: almak
nein: hayır
nennen: adlandırmak
nett: hoş
neu: yeni
neugierig: meraklı
nicht: değil
nichts: hiç
nie: asla, hiç
niedrig: alçak
niemals: asla
noch besser: daha iyi
noch früher: daha erken
noch immer: hala
noch weniger: daha az
noch: daha, hala, henüz
der Norden: kuzey
normal: normal
die Note: not
die Noten: notlar
der Notfall: acil durum
die Notfälle: acil durumlar
die Notiz: not
die Notizen: notlar
die Nummer: numara, sayı
die Nummern: numaralar, sayılar
nun: şimdi
nur: yalnız
nutzen: kullanmak
nützen: ihtiyacı olmak

das Paar: çift
die Paare: çiftler
das Paket: paket
die Pakete: paketler
das Papier: kağıt
die Papiere: kağıtlar, belgeler
der Park: park
die Parks: parklar
parken: park etmek
der Passagier: yolcu (erkek)
die Passagiere: yolcular
der Pass: pasaport
die Pässe: pasaportlar
passieren: geçmek, olmak
der Patient: hasta (erkek)
die Patienten: hastalar (erkek)
die Patientin: hasta (kadın)
die Patientinnen: hastalar (kadın)
die Pension: pansiyon
die Pensionen: pansiyonlar
die Person: kişi
die Personen: kişiler
die Pfeife: pipo
die Pfeifen: pipolar
das Pferd: at
die Pferde: atlar
die Pflanze: bitki
die Pflanzen: bitkiler
der Pyjama: pijama
die Pyjamas: pijamalar
die Pille: hap
die Pillen: haplar
der Pinsel: fırça
die Pinsel: fırçalar
das Plakat: afiş
die Plakate: afişler
die Platte: plak
die Platten: plaklar
der Platz: alan, meydan, yer
die Plätze: alanlar, meydanlar, yerler
plötzlich: aniden
die Polizei: polis
der Polizist: polis (erkek)
die Polizisten: polisler (erkek)
die Polizistin: polis (kadın)
die Polizistinnen: polisler (kadın)
das Portemonnaie: cüzdan
die Portemonnaies: cüzdanlar
die Post: posta, postane
das Postamt: postane
die Postämter: postaneler
die Postkarte: kartpostal
die Postkarten: kartpostallar
die Praxis: muayenehane
die Praxen: muayenehaneler
der Preis: fiyat, ödül
die Preise: fiyatlar, ödüller
privat: özel
probieren: denemek
das Problem: problem
die Probleme: problemler
der Prospekt: broşür
die Prospekte: broşürler
der Pullover: kazak
die Pullover: kazaklar
putzen: temizlemek

das Radio: radyo
die Radios: radyolar
der Radioapparat: radyo
die Radioapparate: radyolar
die Rasierklinge: jilet
die Rasierklingen: jiletler
raten: tahmin etmek, tavsiye etmek
rauchen: sigara içmek
der Raum: oda, salon
die Räume: odalar, salonlar
rauskommen: dışarı çıkmak
die Rechnung: hesap
die Rechnungen: hesaplar
Recht haben: haklı olmak
das Recht: hak
die Rechte: haklar
rechts: sağ, sağda
reden: konuşmak
rege: canlı, hareketli
der Regen: yağmur
die Regenjacke: yağmurluk
die Regenjacken: yağmurluklar
der Regenmantel: yağmurluk
die Regenmäntel: yağmurluklar
reich: zengin
die Reihe: sıra
die Reihen: sıralar
rein: temiz
reinigen: temizlemek
reinkommen: içeri girmek
die Reise: gezi, seyahat, yolculuk
die Reisen: geziler, seyahatler, yolculuklar
der Reiseleiter: rehber (erkek)
die Reiseleiter: rehberler (erkek)
die Reiseleiterin: rehber (kadın)
die Reiseleiterinnen: rehberler (kadın)
der Reisende: yolcu (erkek)
die Reisenden: yolcular
die Reklame: reklam
die Reklamen: reklamlar
der Rektor: müdür (erkek)
die Rektoren: müdürler (erkek)
die Rektorin: müdür (kadın)
die Rektorinnen: müdürler (kadın)
reparieren: tamir etmek
der Rest: artık
die Reste: artıkları
das Restaurant: lokanta, restoran
die Restaurants: lokantalar, restoranlar
richtig: doğru
riesig: çok büyük
der Ring: yüzük
die Ringe: yüzükler
der Rock: etek
die Röcke: etekler
der Roman: roman
die Romane: romanlar
die Rose: gül
die Rosen: güller
rot: kırmızı
die Rotar: rötar
rufen: çağırmak
die Ruhe: rahat, sessizlik
ruhen: dinlenmek
ruhig: sakin, sessiz
der Rundgang: gezinti, tur
die Rundgänge: gezintiler, turlar
runtergehen: aşağı inmek
der Rücken: sırt
die Rücken: sırtlar
die Rückfahrt: dönüş yolculuğu
die Rückfahrten: dönüş yolculukları
die Rückkehr: dönüş
rückkehren: dönmek

die Sachen: eşya
säen: ekmek
die Sage: efsane
die Sagen: efsaneler
sagen: demek, söylemek
der Salat: salata
die Salate: salatalar
der Salon: salon
die Salons: salonlar
das Salz: tuz
sammeln: toplamak
der Samstag: cumartesi
die Samstage: cumartesiler
sauber: temiz
die Sauce: sos
die Saucen: soslar
schaffen: başarmak
der Schal: atkı, şal
die Schals: atkılar, şallar
die Schallplatte: plak
die Schallplatten: plaklar
der Schatten: gölge
die Schatten: gölgeler
schauen: bakmak
das Schaufenster: vitrin
die Schaufenster: vitrinler
schenken: hediye etmek
schick: şık
schicken: göndermek
schieben: sürmek
schießen: vurmak
das Schiff: gemi, vapur
die Schiffe: gemiler, vapurlar
der Schinken: jambon
der Schlafanzug: pijama
die Schlafanzüge: pijamalar
schlafen: uyumak
das Schlafzimmer: yatak odası
die Schlafzimmer: yatak odaları
schlagen: vurmak
schlank: zayıf
schlau: akıllı
schlecht: fena, kötü
schließlich: nihayet
schlimm: fena
das Schloß: saray
die Schlösser: saraylar
der Schlüssel: anahtar
die Schlüssel: anahtarlar
der Schmerz: sancı, ağrı
die Schmerzen: sancılar, ağrılar
schmecken: beğenmek
der Schmuck: takı
der Schnee: kar
schneiden: kesmek
der Schneider: terzi (erkek)
die Schneider: terziler (erkek)
die Schneiderin: terzi (kadın)
die Schneiderinnen: terziler (kadın)
schneien: kar yağmak
schnell: çabuk, hemen, hızlı
schon: artık, daha
schön: güzel, hoş
der Schrank: dolap
die Schränke: dolaplar
schrecklich: korkunç
schreiben: yazmak
schreien: bağırmak
der Schuh: ayakkabı
die Schuhe: ayakkabılar
die Schuld: borç
die Schulden: borçlar
schuldig: suçlu
die Schule: okul
die Schulen: okullar
der Schüler: öğrenci (erkek)
die Schüler: öğrenciler (erkek)
die Schülerin: öğrenci (kadın)
die Schülerinnen: öğrenciler (kadın)
schwach: zayıf
schwarz: kara, siyah
das Schwein: domuz
die Schweine: domuzlar
schwer: ağır, zor
die Schwester: kız kardeş
die Schwestern: kız kardeşler
schwierig: zor
die Schwierigkeit: güçlük
die Schwierigkeiten: güçlükler
das Schwimmbad: havuz
die Schwimmbäder: havuzlar
schwimmen: yüzmek
der See: deniz, göl
die Seen: denizler, göller
sehen: görmek
sehr: çok
die Seide: ipek
die Seifen: sabun
sein: olmak
die Seite: sayfa
die Seiten: sayfalar
die Sekunde: saniye
die Sekunden: saniyeler
selber: kendi
selbst: kendi
seltsam: tuhaf
senden: göndermek
die Serviette: peçete
die Servietten: peçeteler
der Sessel: koltuk
die Sessel: koltuklar
sich amüsieren: eğlenmek
sich ändern: değişmek
sich anmelden: başvurmak
sich ausruhen: dinlenmek
sich bedanken: teşekkür etmek
sich befinden: bulunmak
sich drehen: dönmek
sich erinnern an: hatırlamak
sich freuen: sevinmek
sich hinlegen: yatmak
sich legen: yatmak
sich niederlassen: oturmak
sich setzen: oturmak
sich stellen: durmak
sich treffen: buluşmak, karşılaşmak
sich verspäten: gecikmek, rötar yapmak
sich waschen: yıkanmak
sicher sein: emin olmak
die Sicherheit: emniyet, güven, güvenlik
sie: onlar
Sie: siz
das Silber: gümüş
singen: şarkı söylemek
der Sinn: akıl, anlam
die Sinne: akıllar, anlamlar
die Situation: durum
die Situationen: durumlar
sitzen: oturmak
der Skorpion: akrep
die Skorpione: akrepler
die Skulptur: heykel
die Skulpturen: heykeller
so: böyle
die Socke: çorap
die Socken: çoraplar
das Sofa: kanepe, koltuk
die Sofas: kanepeler, koltuklar
sofort: derhal, hemen
der Sohn: oğul
die Söhne: oğullar
solch-: böyle
der Soldat: asker (erkek)
die Soldaten: askerler (erkek)
die Soldatin: asker (kadın)
die Soldatinnen: askerler (kadın)
der Sommer: yaz
die Sommer: yazlar
der Sonnabend: cumartesi
die Sonnabende: cumartesiler
die Sonne: güneş
die Sonntage: pazarlar
sonst: başka
die Soße: sos
die Soßen: soslar
spät: geç
später: sonra
spazieren: gezmek
der Spaziergang: gezinti
die Spaziergänge: gezintiler
der Spiegel: ayna
die Spiegel: aynalar
das Spiel: oyun
die Spiele: oyunlar
spielen: çalmak, oynamak
der Sport: spor
sprechen: konuşmak
der Spruch: söz
die Sprüche: sözler
der Staatsminister: devlet bakanı (erkek)
die Staatsminister: devlet bakanları (erkek)
die Staatsministerin: devlet bakanı (kadın)
die Staatsministerinnen: devlet bakanları (kadın)
die Stadt: kent, şehir
die Städte: kentler, şehirler
der Bahnhof: gar
die Bahnhöfe: garlar
die Station: istasyon
die Stationen: istasyonlar
die Statue: heykel
die Statuen: heykeller
der Staub: toz
stecken: koymak
stehen: ayakta durmak, durmak
stehen bleiben: ayakta kalmak
stehlen: çalmak
steigen: binmek, inmek
der Stein: taş
die Steine: taşlar
die Stelle: yer
die Stellen: yerler
stellen: koymak
sterben: ölmek
der Stier: boğa
die Stiere: boğalar
still: sessiz
die Stimme: ses
die Stimmen: sesler
das Stockwerk: kat
die Stockwerke: katlar
stoßen: çarpmak
der Strand: kıyı
die Strände: kıyılar
die Straße: cadde, sokak
die Straßen: caddeler, sokaklar
die Straßenbahn: tramvay
die Straßenbahnen: tramvaylar
streichen: çizmek
streng: sert
der Strich: çizgi
die Striche: çizgiler
der Strumpf: çorap
die Strümpfe: çoraplar
der Student: öğrenci (erkek)
die Studenten: öğrenciler (erkek)
die Studentin: öğrenci (kadın)
die Studentinnen: öğrenciler (kadın)
die Stunde: saat
die Stunden: saatler
der Sturm: fırtına
die Stürme: fırtınalar
das Stück: parça
die Stücke: parçalar
suchen: aramak
die Summe: miktar, toplam
die Summen: miktarlar, toplamlar
die Suppe: çorba
die Suppen: çorbalar
der Süd: güney
der Süden: güney
die Süßigkeit: tatlı
die Süßigkeiten: tatlılar
die Süßspeise: tatlı
die Süßspeisen: tatlılar
die Szene: sahne
die Szenen: sahneler

die Tablette: hap
die Tabletten: haplar
der Tag: gün
die Tage: günler
täglich: günlük, her gün
das Taxi: taksi
die Taxis: taksiler
die Tante: hala, teyze
die Tanten: halalar, teyzeler
der Tanz: dans
tanzen: dans etmek
die Tasche: cep, çanta
die Taschen: cepler, çantalar
das Taschentuch: mendil
die Taschentücher: mendiller
die Tasse: fincan
die Tassen: fincanlar
die Tat: iş, eylem
die Taten: işler, eylemler
der Tee: çay
der Teich: göl, havuz
die Teiche: göller, havuzlar
das Telefon veya das Telephon: telefon
die Telefone veya die Telephone: telefonlar
telefonieren veya telephonieren: telefon etmek
der Teller: tabak
die Teller: tabaklar
der Termin: randevu
die Termine: randevular
teuer: pahalı
das Theater: tiyatro
die Theater: tiyatrolar
die Therapie: tedavi
die Therapien: tedaviler
tief: derin
das Tier: hayvan
die Tiere: hayvanlar
der Tisch: masa
die Tische: masalar
die Tochter: kız evlat
die Töchter: kız evlatlar
der Tod: ölüm
toll: harika
die Tomate: domates
die Tomaten: domatesler
der Ton: ses
die Töne: sesler
die Tour: tur
die Touren: turlar
der Tourismus: turizm
der Tourist: turist (erkek)
die Touristen: turistler (erkek)
die Touristin: turist (kadın)
die Touristinnen: turistler (kadın)
die Tradition: gelenek
die Traditionen: gelenekler
tragen: taşımak
der Traum: rüya
die Träume: rüyalar
traurig: üzgün
treffen: buluşmak
treiben: yapmak
die Treppe: merdiven
die Treppen: merdivenler
trinken: içmek
tropfen: damlamak
das Tuch: atkı, örtü, şal
die Tücher: atkılar, örtüler, şallar
tun: yapmak
die Tour veya der Tur: gezi
die Touren veya die Turen: geziler
turen: gezinti yapmak
der Turm: kule
die Türme: kuleler
die Tür: kapı
die Türen: kapılar
der Türke: Türk (erkek)
die Türken: Türkler (erkek)
die Türkin: Türk (kadın)
die Türkinnen: Türkler (kadın)
türkisch: Türkçe

der Vagon veya der Wagen: vagon
die Vagone veya die Wagen: vagonlar
die Vase: vazo
die Vasen: vazolar
der Vater: baba
die Väter: babalar
die Verabredung: randevu
die Verabredungen: randevular
verbessern: düzeltmek
das Verbot: yasak
die Verbote: yasaklar
verboten: yasak
verbrennen: yakmak
vergessen: unutmak
verheiratet: evli
verkaufen: satmak
der Verkäufer: satıcı (erkek)
die Verkäufer: satıcılar (erkek)
die Verkäuferin: satıcı (kadın)
die Verkäuferinnen: satıcılar (kadın)
der Verkehr: trafik
verlieren: kaybetmek
vermissen: aramak, özlemek
vermuten: sanmak, tahmin etmek
verrückt: deli
verschieden: çeşitli
verschwinden: kaçmak, kaybolmak
die Verspätung: rötar, gecikme
die Verspätungen: rötarlar, gecikmeler
verstehen: anlamak
das Vertrauen: güven
die Verwandten: akrabalar
der Verwandte: akraba (erkek)
die Verwandten: akrabalar (erkek)
die Verwandtin: akraba (kadın)
die Verwandtinnen: akrabalar (kadın)
verwenden: kullanmak
verzeihen: affetmek
viel: birçok, çok
vielleicht: belki, galiba
das Viertel: çeyrek
die Viertel: çeyrekler
der Vogel: kuş
die Vögel: kuşlar
das Volk: halk
die Volksschule: ilkokul
die Volksschulen: ilkokullar
voll: dolu
vollenden: bitirmek
voller Leben: hareketli
vorbeifahren: geçmek
vorführen: göstermek
der Vorhang: perde
die Vorhänge: perdeler
vorig-: geçen, önceki
der Vormittag: sabah
die Vormittage: sabahlar
vorne: önde
Vorsicht haben: dikkat etmek
vorstellen: takdim etmek
der Vorteil: avantaj
die Vorteile: avantajlar

wachsen: büyümek, yetişmek
der Wagen: araba
die Wagen: arabalar
der Waggon: vagon
die Waggons: vagonlar
wahr: doğru, gerçek
die Wahrheit: gerçek
wahrscheinlich: muhtemel
der Wald: orman
die Wälder: ormanlar
die Wand: duvar
die Wände: duvarlar
wandern: gezinti yapmak
die Wanderung: gezi
die Wanderungen: geziler
die Wange: yanak
die Wangen: yanaklar
wann: ne zaman
die Ware: mal
die Waren: mallar
warm: sıcak
die Wärme: sıcaklık
warten: beklemek
warum: niçin
was: ne
die Wäsche: çamaşır
waschen: yıkamak
das Wasser: su
der Wasserhahn: musluk
die Wasserhähne: musluklar
die Watte: pamuk
wecken: uyandırmak
der Weg: sokak, yol
die Wege: sokaklar, yollar
wegen: yüzünden
weil: çünkü, için
der Wein: şarap
die Weine: şaraplar
weinen: ağlamak
weiß veya weiss: beyaz
weit: uzak
weiter machen: devam etmek
die Weize veya der Weizen: buğday
welch-: biraz, birkaç, hangi
die Welt: dünya
die Welten: dünyalar
wenig: az
weniger: daha az
wer: kim
werden: olmak
das Werk: eser, fabrika
die Werke: eserler, fabrikalar
der West veya der Westen: batı
der Western: western
die Western: westernler
das Wetter: hava
die Wetter: havalar
das Wettrennen: yarış
die Wettrennen: yarışlar
wichtig: önemli
wie: kadar, nasıl
wieder: gene, tekrar, yeniden
wiegen: tartmak
die Wiese: çayır
die Wiesen: çayırlar
wieso: niçin
wieviel: kaç
der Winter: kış
die Winter: kışlar
wir: biz
wirklich: doğru, gerçek
die Wirklichkeit: gerçek
die Wirkungen: etki
das Wissen: bilgi
wissen: bilmek
wo: nerede
die Woche: hafta
die Wochen: haftalar
woher: nereden
wohin: nereye
wohl: galiba
die Wohnanlage: site, toplu konut
die Wohnanlagen: siteler, toplu konutlar
wohnen: ikamet etmek, oturmak
die Wohnung: ev
die Wohnungen: evler
die Wolke: bulut
die Wolken: bulutlar
der Wolkenkratzer: gökdelen
die Wolkenkratzer: gökdelenler
wollen: istemek
das Wort: söz, sözcük
die Wörter: sözler, sözcükler
wunderbar: fevkalâde, harika, harikulade
wunderschön: harikulade
der Wunsch: dilek, istek
die Wünsche: dilekler, istekler

die Zahl: sayı
die Zahlen: sayılar
zählen: saymak
der Zahn: diş
die Zähne: dişler
der Zahnarzt: diş doktoru (erkek)
die Zahnärzte: diş doktorları (erkek)
die Zahnärztin: diş doktoru (kadın)
die Zahnärztinnen: diş doktorları (kadın)
die Zahnbürste: diş fırçası
die Zahnbürsten: diş fırçaları
die Zahnpasta veya die Zahnpaste: diş macunu
zeichnen: çizmek
zeigen: göstermek
der Zeiger: akrep (saat)
die Zeiger: akrepler (saat)
die Zeit: saat, vakit, zaman
die Zeitschriften: dergi
die Zeitung: gazete
die Zeitungen: gazeteler
zentral: merkezî
die Zentralheizung: kalorifer
das Zentrum: merkez
die Zentren: merkezler
ziemlich: oldukça
die Zigarette: sigara
die Zigaretten: sigaralar
das Zimmer: oda
die Zimmer: odalar
der Zoll: gümrük
die Zollstellen: gümrük (yeri)
der Zoo: hayvanat bahçesi
die Zoos: hayvanat bahçeleri
zu Bett gehen: yatmak
zu Hause: evde
zumachen: kapamak
zu: kapalı
der Zucker: şeker
zuerst: önce
zufrieden: memnun
der Zug: tren
die Züge: trenler
zuhören: dinlemek
der Zuhörer: dinleyici (erkek)
die Zuhörer: dinleyiciler (erkek)
die Zuhörerin: dinleyici (kadın)
die Zuhörerinnen: dinleyiciler (kadın)
die Zukunft: gelecek
zum Beispiel: örneğin
zurückkehren: dönmek, geri dönmek
zurückkommen: dönmek, geri gelmek
zusammen: birlikte
zusammentreffen: buluşmak
zuschauen: seyretmek
der Zuschauer: seyirci (erkek)
die Zuschauer: seyirciler (erkek)
die Zuschauerin: seyirci (kadın)
die Zuschauerinnen: seyirciler (kadın)
der Zweig: dal
die Zweige: dallar
zwischen: arasında

Almancada fiillerin sonu -en ya da -n şeklinde biter. Cümlede her zaman asıl fiil ikinci sıradadır özne fiilden önce ya da sonra gelir. Her fiilin özneye göre çekimlenmesi vardır.
örnek: Kaufen (Satın almak)
Ich kaufe
Du kaufst
Er/Sie/Es kauft
Wir kaufen
Ihr kauft
Sie kaufen
örnek: Lehren (Öğretmek)
Ich lehre
Du lehrst
Er/Sie/Es lehrt
Wir lehren
Ihr lehrt
Sie lehren
örnek: Studieren (Eğitim görmek)
Ich studiere
Du studierst
Er/Sie/Es studiert
Wir studieren
Ihr studiert
Sie studieren
Düzenli fiillerin hepsi bu şekilde çekimlenir. Düzensiz fiillerde ses farklılıkları olur
Örnek: Essen (Yemek)
Ich esse
Du isst
Er/Sie/Es isst
Wir essen
Ihr esst
Sie essen
Örnek: Fahren (Taşıt sürmek)
Ich fahre
Du fährst
Er/Sie/Es fährt
Wir fahren
Ihr fahrt
Sie fahren
Örnek : Sprechen (Konuşmak)
Ich spreche
Du sprichst
Er/Sie/Es spricht
Wir sprechen
Ihr sprecht
Sie sprechen
Haben (sahip olmak) ve Sein (olmak) fiillerinin çekimleri

Modal Filler
Ayrılabilen Filler

Almanca İngilizceden sonra, internet ortamında en yaygın olarak kullanılan dildir. Alman edebiyatı da son derece gelişmiştir ve köklüdür. Goethe, Schiller, Kafka gibi büyük yazarların eserleriyle renklenmiştir. Felsefe, edebiyat, mühendislik dallarında önem arz eder.
Genel olarak bakıldığında, öğrenilmesi kolay bir dil olmasına rağmen her ismin dişi, erkek ya da cansız varlık olarak sınıflandırılmasından kaynaklanan zorluklar ortaya çıkar. Dil bilgisinde yaşanan en büyük sıkıntı az önce bahsi geçen ve Artikel olarak adlandırılan harfitariflerden kaynaklıdır. Özel isim, cins isim ayrımı gözetmeksizin bütün isimlerin baş harfleri büyük olmalıdır.

Der: eril belirteç        -  Der Vater: Baba
Die: dişil belirteç          - Die Mutter: Anne
Das: yansız belirteç      - Das Buch: Kitap
"der Wagen" ve "das Auto" aynı anlama (araba) gelmelerine rağmen artikelleri farklıdır. Yani artikel cisme değil, kelimeye aittir. Bu yüzden, isimler öğrenilirken artikeliyle birlikte öğrenmek gereklidir. Türkçedeki ismin hâlleri gibi, harfitarifler de aşağıdaki gibi hâller alırlar. Yukarıdan aşağıya doğru Nominativ (der) harfitarifi, Akkusativ'de "den" olur. Değişimler bu şekilde aşağıdaki gibi verilmiştir.
Nominativ   der   die   das  die(çoğul)
Akkusativ   den   die   das  die(çoğul)
Dativ       dem   der   dem  den(çoğul)
Genitiv     des   des   der  der(çoğul)

Nominativ: Yalın hâl: Özne konumundaki isimler için veya sein (olmak) fiilinin tamlayıcısı olan fiiller için kullanılır     -
Mein Vater ist ein Lehrer.: (Benim) babam (bir) öğretmendir.
Akkusativ:-i hâli: Eylemden direkt olarak etkilenen kişiyi/şeyi belirtir.        -
Kennst du meinen Vater?: (Benim) Babamı tanıyor musun?
Dativ: -e hâli: Eylemin yöneldiği kişiyi/şeyi bildirir.           -
Ich helfe meinem Vater.: (Benim) Babama yardım ediyorum.
Genitiv: aitlik belirtir
Das ist der Tisch meines Vaters.: Bu (benim) babamın masasıdır.
İlgeçler (Präpositionen)

Hem akkusativ, hem dativ ile kullanılan ilgeçler
in+Akk (içine)
ins (in das) Kino: sinemaya
in den Garten: bahçeye
in die Schule: okula
in+Dat (içinde)
im (in dem) Kino: sinemada
im (in dem) Garten: bahçede
in der Schule: okulda
auf+Akk (üstüne)
auf den Tisch: masanın üstüne
auf das Paket: paketin üstüne
auf die Zeitung: gazetenin üstüne
auf+Dat (üstünde)
auf dem Tisch: masanın üstünde
auf dem Paket: paketin üstünde
auf der Zeitung: gazetenin üstünde

Aktör = der Schauspieler
Araba Tamircisi = der Automechaniker
Artist = der Künstler
Aşçı = der Koch
Avukat = der (Rechts)anwalt
Bahçıvan = der Gärtner
Banka Memuru = Bankangestellter
Berber = der Friseur
Bilgisayar uzmanı = der Computerfachmann
Boyacı = der Maler
Çiçekçi = der Florist
Çiftçi = der Landwirt / der Bauer
Doktor = der Arzt
Diş Hekimi = der Zahnarzt
Eczacı = der Apotheker
Elektrikçi = der Elektriker
Emekli = der Rentner
Erkek Hemşire = der Krankenpfleger
Fırıncı = der Bäcker
Fotoğrafçı = der Fotograf
Garson = der Kellner
Gazeteci = der Journalist
Hakim = der Richter
İnşaat çalışanı = Bauarbeiter
İş adamı = der Geschäftsmann
İşçi =  der Arbeiter
İş kadını = die Geschäftsfrau
İtfaiyeci = der Feuerwehrmann
Kasap = der Metzger
Kasiyer = der Kassierer
Kadın Hemşire = der Krankenschwester
Kimyacı = der Chemiker
Kuaför = der Friseur
Marangoz = der Tischler
Memur = Beamter
Mimar = der Architekt
Mühendis = der Ingenieur
Müzisyen = der Musiker
Okul Müdürü = der Schuldirektor
Öğrenci = der Student
Öğretmen = der Lehrer
Otobüs şoförü = der Busfahrer
Pilot = der Pilot
Polis = der Polizeibeamte/Polizist
Politikacı = der Politiker
Postacı = der Briefträger
Profesör = der Professor
Programcı = der Programmierer
Satıcı =  der Verkäufer
Sekreter = der Sekretär
Sporcu = der Sportler
Şarkıcı = der Sänger
Şoför = der Fahrer
Taksici = der Taxifahrer
Tamirci = der Mechaniker
Temizlik görevlisi = der Putzmann
Terzi = der Schneider
Tüccar = der Kaufmann
Veteriner = der Tierarzt
Yazar = der Schriftsteller/Autor

Almanca'da model fiiller(Modalverben) zorunluluk yapabilmek vb. anlamlara gelmektedir. Almanca'da 6 Model Fiil vardır
1.Können:
Können model fiili yapabilmek anlamına gelmektedir.
Ich kann
Du kannst
Er/sie/es kann
Wir können
Ihr könnt
sie/Sie können
Şeklinde çekimlenir
2.Müssen:
Müssen modal fiili zorunda olmak anlamına gelmektedir.
Ich muss
Du musst
Er/sie/es muss
Wir müssen
Ihr müsst
sie/Sie müssen
Şeklinde çekimlenir.
3. Wollen:
Wollen modal fiili istemek anlamına gelmektedir.
Ich will
Du willst
Er/sie/es will
Wir wollen
Ihr wollt
sie/Sie wollen
Şeklinde çekimlenir.
4. Sollen:
Sollen modal fiili –meli / –malı (tavsiye, gereklilik) anlamına gelmektedir.
Ich soll
Du sollst
Er/sie/es soll
Wir sollen
Ihr sollt
sie/Sie sollen
Şeklinde çekimlenir.
5. Dürfen:
Dürfen modal fiili izinli olmak anlamına gelmektedir.
Ich darf
Du darfst
Er/sie/es darf
Wir dürfen
Ihr dürft
sie/Sie dürfen
Şeklinde çekimlenir.
6. Mögen:
Mögen modal fiili sevmek / hoşlanmak anlamına gelmektedir.
Ich mag
Du magst
Er/sie/es mag
Wir mögen
Ihr mögt
sie/Sie mögen
Şeklinde çekimlenir.

I.0: Giriş – bu seviye hakkında, bu seviye nasıl kullanılır, Almanca hakkında temel zorluklar, gerçekler ve bitirme seviyeleri
Bölüm I.A
 Ders I.1: Wie heißt du? (1. Teil) – merhabalar/hoşçakallar, Mr. and Mrs., "Wie geht's?" .
 Ders I.2: Wie heißt du? (2. Teil) – "Sie" ve "du", özne zamirleri, isimler, önemli fiiller.
 Ders I.3: Bitte buchstabieren Sie – alfabe, sorular, articles.
 Gözden geçirme Bölümü I.A – 1-3 derslerin gözden geçirilmesi
Bölüm I.B
 Ders I.4: Freizeit – spor ve aktiviteler, tercihler, sayılar
 Ders I.5: Geburtstag – zamanı, saatleri, tarihleri ve mevsimleri söyleme.
 Ders I.6:Essen  – yiyeceğe giriş, yemekle ilgili fiiller, kiplere giriş & möchten, kein-kelimeleri, kibar/resmi konuşma dili ve "Schmeckt's?".
 I.B Bölümünün Gözden Geçirilmesi – 4-6 derslerinin gözden geçirilmesi
Bölüm I.C – Berlin, Almanya
 Ders I.7: Kleidung – giyim eşyası, alışveriş, giysi tanımlama, renkler, ayrılabilir fiillere giriş.
 Ders I.8: Familie und Nationalität – aile üyeleri, sahipleniciler, insanları tanımlama ve favorileri ifade etme.
 Ders I.9: Schule – okul konuları, Alman okullarının tanımı, okulun sınıflarındaki temel kelimeler (matematik, coğrafya, vb.) ve okul malzemeleri.
 Gözden geçirme Bölümü I.C – 7-9 derslerin gözden geçirilmesi
Bölüm I.D – Viyana, Avusturya
 Ders I.10: Das Fest – dative case yazıları ve zamirleri, hediye verme, parti davetleri, atıştırmalık yiyecekler ve es gibt.
 Ders I.11: Privileg und Verantwortung – planlar yapmak, gidilecek yerler, görevler ve işler, daha fazla modal kelimeleri, emirler, ve weil & denn.
 Ders I.12: Wetter – hava durumu, ulaşım yöntemleri, yerlere nasıl gidilir, yol tarifi nasıl verilir ve alınır,ve weil gibi wo kullanma.
 I.D Bölümünün Gözden Geçirilmesi – 10-12 Derslerin Gözden Geçirilmesi
Bölüm I.E – Bern, İsviçre
 Ders I.13: Zu Hause Essen – bir süpermarkette bulabileceğiniz yiyecekler, yemek yapmak, Almanya'da günün yemekleri.
 Ders I.14: Filme – filmler, film türleri, "Was für...?", tercihleri ifade etmek için mögen kullanma.
 Ders I.15: Das Haus – mobilya, açıklama II, mobilyada kullanılan farklı malzemeler, konum (acc./dat.) edatları.
 I.E Gözden Geçirme Bölümü – 13-15 derslerinin gözden geçirilmesi
Şablon:Almanca/İçindekiler/Altbilgi

Ders I.3: Bitte buchstabieren Sie

Bu ders Alman alfabesi hakkındadır. Ayrıca sorularda ve makalelerde kelime sırasına daha yakından bakıyoruz.

Bu kısa telefon görüşmesini okuyun ve dinleyin. Yüksek sesle okumaya çalışın. Sözcük ve deyimlerin çevirisi metnin altında verilmiştir.

Almanca ve İngilizce olarak 26 harf yukarıda gösterilmiştir. Bir, bitişik harf ß (eszett veya scharfes s), büyük harfle yazılırsa SS olarak yazılır; ancak, normal bir s gibi telaffuz edilir. Yalnızca önceki sesli harf uzun olduğunda kullanılır, örneğin: der Fuß (ayak). İsviçre'de ß kullanılmadığını unutmayın. Orada uzun ünlülerden sonra bile bunun yerine her zaman çift s yazarsın. Örneğin: der Fuss (ayak).
Almanca ve İngilizce arasındaki diğer bir fark da umlaut. a, o ve u sesli harfleri bir çift nokta (yukarıdaki çift nokta) alarak ä, ö ve ü haline gelebilir. . Çift nokta, sesli harfin sesini değiştirir. Tüm harflerin telaffuzları için telaffuz kılavuzu'na gidin.
Notlar: 

İngilizce'de umlaut kelimesi iki noktayı ifade eder. Almanca Umlaut kelimesi genellikle ä, ö veya ü sesli harflerinden birini ifade eder.
Almanca'da ä, ö ve ü ünlüleri yazım sırasında bile kullanılır; yani, "o umlaut" demek yerine bir "ö" ("turn"daki "u" gibi) sesini çıkarırsınız. Belirli bir harfi açıklığa kavuşturmak için kullanılan yaygın kelimeler Ärger (öfke), Ökonomi (ekonomist) ve Übermut (keyif). Harften sonra "çift nokta" demek, Almanca kelimeleri İngilizce olarak yazarken kullanılan bir İngiliz geleneğidir.
Üst nokta işaretinin yazılması mümkün değilse, ä, ö ve ü ünlüleri ae, oe ve ue ile değiştirilmelidir. Bu yazım ör. Goethe, ya da crosswords'deki gibi bazı isimlerde de kullanılır.
Çoğu arama motorunda ve çevrimiçi sözlükte, çift noktalı bir sesli harf, basit sesli harf veya sesli harf artı e biçiminde girilebilir. Örneğin, Ärger bulmak istiyorsanız, şu üç arama dizisinden herhangi birini girebilirsiniz: Ärger, Aerger, hatta yanlış Arger.
Özel Almanca harflere sahip bir Almanca klavyeniz yoksa, çift noktalı harfleri yazmak için aşağıdaki yollardan birini kullanmanız gerekecektir.
Macintosh'ta Option tuşunu basılı tutun ve “u” yazın (bu bir çift nokta oluşturur), ardından Option tuşunu bırakın ve çift noktayı koymak istediğiniz sesli harfi yazın. Option tuşu ve s, ß üretecektir.
Windows'ta klavyenizin sağ tarafında bulunan Alt tuşunu ve sayıları kullanmanız gerekecektir. Windows kullanıcıları ayrıca klavye ayarlarını "İngilizce-uluslararası" olarak ayarlama seçeneğine de sahiptir; bu, çift noktalı sesli harfin önüne bir tırnak işareti koyarak çift noktalı harfler oluşturmalarına olanak tanır.
Linux kullanıcıları genellikle sistem ayarlarındaki klavye yapılandırma seçeneklerini kullanarak bir "Oluştur" tuşu atayabilir (veya alternatif olarak böyle bir menü yoksa xmodmap veya setxkbmap komut satırı programlarını kullanabilir), bundan sonra kullanıcının umlaut girmesine izin verir. "Oluştur" tuşuna artı "Çift Tırnak İşareti" tuşuna ve ardından belirtilen harfe basarak harfleri seçin. ß, Oluştur tuşuna basılarak ve ardından “s” tuşuna iki kez basılarak da oluşturulabilir.

Şablon:German/Exercise

Ders I.6: Yemek yemek

Section Problems >>

Giriş'den bildiğiniz gibi, Almanca'da dört durum vardır. Üçü sıklıkla kullanılır. İlki, Nominative Case, Ders 1'de öğrendiniz. özne'yi ve yüklem ismini ("O (tekil eril isim) dur. "da), (isim) yüklem ismidir) kapsar. 
İkincisi, Accusative Case, şimdi öğreneceksiniz. direkt nesne ve birkaç edatın nesnesi'ni kapsar.
Üçüncüsü, Dative Case daha sonra öğretilecektir. indirekt nesne ve diğer birçok edatın nesnesini kapsar.
Bir cümlenin nesnesi accusative durumda olacaktır. "Beni incittin." deki "ben" -i halindedir.
Not: Accusative Case ve Dative Case İngilizce'de aynıdır; bu yüzden Almanca'da fazladan bir durum vardır.

* Çoğullar için belirsiz artikel mevcut değildir. Ancak bu dersten sonra öğreneceğiniz iyelik ekleri ve anahtar kelimeler gibi ilgili kelimeler çoğul için “eine” ile bitecektir.
Artikellerde, akusativ durum için bellek kancası "Der den'e gider ("dane" Şablon:Audio) olarak telaffuz edilir) ve gerisi aynı kalır." Eril belirsiz artikeli “einen”e gider ve diğer her şey orada aynı kalır. Bu nedenle yukarıda, "der" Hamburger "den" Hamburger'e ve "ein" Hamburger, "Er hat einen Hamburger" ("Bir hamburgeri var.") gibi hamburger doğrudan nesne olduğunda "einen" Hamburger'e gider.
Kafan karıştıysa, sorun değil. Bu konu, İngilizce konuşanlar için kavraması en zor olanlardan biridir. İşte bazı çözümler:
Bir şeyin durumunu bulmak için önce fiili bulun. Fiil cümleyi yönetir. Her şey onun etrafında döner. Sonra cümlenin konusunu bulursunuz. Özne, fiili "yapan" şey/kişidir. Konu her zaman Nominative Case içindedir, bu nedenle der, die, das, die veya ein, eine, ein alır.
Şimdi fiile tekrar bakıyorsun. Eğer bir varlık fiili ise (am, are, is, vb.), fiilden sonraki isim yüklem adıdır. Bunu anlamanın kolay bir yolu bir denklem yazmaktır. Fiil eşittir işareti (=) ile değiştirilebiliyorsa, izleyen  isim bir yüklem ismidir. Eşittir işaretiyle değiştirilemezse, sonraki paragrafa bakın. 
Yüklem adı her zaman Nominative Case'dadır, dolayısıyla aynı kurallar onun için de geçerlidir.

Ich bin ein Junge.
Sie ist eine Frau.

Cümlenin fiili eylem fiili ise (oynamak, fırlatmak, yapmak, yemek yemek), öznenin fiili ne yaptığını bulun. Örneğin, fiil "yapıyor" (macht) ise, neyin yapıldığını ararsınız. Doğrudan nesne budur. Doğrudan nesne her zaman Accusative Case'ndadır, bu nedenle den, die, das, die veya einen, eine, ein'ı alır.

Sie haben den Cheeseburger.
Habt ihr einen Salat?

Belirsiz artikeller, sadece sonlarına baktığınızda, yalın durum( nominative) için e, -, e'yi ve nominative için en, e, -, e'yi seçin.
Unutmayın, yalın ve accusative arasındaki tek üçüncü şahıs değişikliği erkeksi biçimdedir.
Section Problems >>

Zamirler, artikellerden çok daha büyük bir değişim yaşar. Bu, İngilizcede de geçerlidir, çünkü (a, an, the) artikelleri hiç değişmez ama ben bana, biz bize vb değişir vb.
Ama her şey aynı değildir. ben  mich ve  biz  uns  iken, ikinci ve üçüncü kişiler farklı değişikliklere uğrarlar. Üçüncü şahısta ise yazılarda olduğu gibi tek değişiklik eril tekildedir. "der den'e gider" kuralına göre, akuzatif durumda "er", "ihn" e gider.
İngilizce'deki ikinci kişi asla değişmez. Almanca'da du, dich ve ihr, euch' anlamına gelir. Her ikisinin de resmi versiyonu olan Sie aynı kalır. Unutmayın, Sie (2. resmi şahıs) ve sie (3. çoğul şahıs) sadece anlamlarında farklılık gösterir ve birincisinin büyük harfle yazılması ve ikincisinin büyük olmaması gerçeğinde farklılık gösterir. Bu, Almanca dilbilgisinde doğru kalır.
İşte yukarıdakilerin tablo şeklinde bir temsili.

Section Problems >>

Not: Bu sadece Almanca'ya uygulanan İngilizce gramer konusunda hızlı bir derstir. İngilizce'deki öncüller hakkında zaten her şeyi biliyorsanız, ilk paragrafı atlayın.
Bir zamir kullanırken, işe yaraması için ne olduğunu bilmelisiniz. Gizemler veya drama gibi bazı nadir istisnalar vardır, ancak bunun dışında bu her zaman doğrudur. Bazen diyalogda bu, işaret ederek veya başka bir jest yaparak halledilir, ancak çoğu zaman zamir daha önce bahsedilen bir şeyi değiştirir. Önceden bahsedilen, sonradan zamire dönüşen nesne/kişiye öncül denir.
Almancada bu çok kullanışlıdır. Artık basitçe 'o' diyemezsiniz. Birçok yemek kelimesi eril ve dişildir ve onları zamirlere çevirdiğinizde, her zaman 'it' değil, 'he', 'she', 'him' ve 'her'e dönüşürler. 
Örneğin, "The cheeseburger tastes good. It's very crunchy." "Çizburgerin tadı güzel. Çok gevrek." cümlesi "Çizburgerin tadı güzel. O' "Çok gevrek" olur "The cheeseburger tastes good. He's very crunchy." cümlesine dönüşür.
Not: Bunu Almanca olarak nasıl söyleyeceğinizi bu derste daha sonra öğreneceksiniz.
Neden "o"? Burada öncül devreye giriyor. Almanca'da eril ve dişil olan yiyecekler olduğu için, 'es' kabul edemezsiniz. Bir önceki cümleye, "der Cheeseburger"e bakmalısınız. "Der Cheeseburger", "er" ile değiştirilir (özne olduğu için ve dolayısıyla Nominative Case'de). Bu nedenle, bilmeniz gereken tek şey şu bağlantılar: der/den-er/ihn, die-sie, das-es, die-sie.
Section Problems >>

I.A: I.1 ‘den I.3’e Dersleri Gözden Geçirme Bölümü 

Kelime bilgisi

*Her ifadeyi sonraki yıldız işaretiyle (*) bilmeniz gerekir. Diğerleri, elbette, kullanıldıkları bölgelere seyahat ettiğinizde bilmek faydalı olacaktır. (Görebildiğiniz gibi, farklı Almanca konuşulan bölgelerin genellikle kendi merhaba ve hoşçakal deme yolları vardır. Ancak, herhangi bir sorun veya test için bu daha az yaygın ifadelerden herhangi birini bilmeniz gerekmeyecektir.)

*Daha resmi şekil Wie geht es Ihnen? dir

*Sie is the formal (polite) version of du and ihr.

*Hatırlayın, birisine adını sormanın resmi yolu Wie heißen Sie? diye sormaktır

*Sizin için fiillerin formu (nazik) — Sie, çoğul ile tamamen aynıdır, 3. şahıs zamiri onlar — sie.

*Formun sizin için olduğunu unutmayın  (nazik) — Sie, çoğul ile tamamen aynıdır, 3. şahıs zamiri onlar — sie.

*This is also the form for you (polite) — Sie.

*Mädchen ‘in nötr olduğuna dikkat ediniz. (Aslında,  -chen ile biten neredeyse tüm kelimeler nötürdür.)

*Note that Mädchen is neuter.

Lesson I.2: Wie heißt du? (2. Teil)

Bu dersin diyalogu iki kişi arasındaki bir konuşmadır: Franz ve Bay Schwarz. Franz, Bay Schwarz'a hitap etmek için resmi "Sie"yi kullanırken, ikincisi Franz'a hitap etmek için gayri resmi "du"yu kullanır. Ayrıca bazı gramerleri de tartışıyoruz: “özne zamirleri” ve şimdiki zamanda bazı önemli fiiller.

Bu kısa diyalogda Bay Schwarz, gayri resmi “siz” – “du” biçimini kullanıyor.
Franz ise "siz" - "Sie"nin resmi çevirisini kullanıyor. Diyaloğu dinlerken “Sie” kelimesinin nasıl telaffuz edildiğini bulmaya çalışın.

Şablon:Almanca/Egzersiz

Bay Schwarz neden resmi olmayan "siz" - "du" formunu kullanırken Franz "siz" - "Sie"nin resmi biçimini kullanıyor?
Öncelikle şunu anlamalısınız ki Franz Bay Schwarz'a soyadıyla hitap ederken, Bay Schwarz Franz'a ilk adıyla hitap etmektedir. Bu muhtemelen en önemli kuraldır: Eğer birine soyadıyla hitap edecekseniz, resmi "Sie" kullanmalısınız. Öte yandan, ilk adı kullanıyorsanız “du” kullanmalısınız. Başka bir şey kulağa komik gelebilir.
Sie kibar şeklidir. Bay ve Bayan ile muhatap olacağınız kişiler için yabancılarla konuşurken ve muhataba karşı saygıyı ifade etmek için kullanılır.
Peki, Almanlar ne zaman diğer insanlara ilk adlarıyla hitap edip "du" derler?

Bazı durumlar çok açıktır: çocuklara, akrabalara ve arkadaşlara her zaman “du” ile hitap edilir. (Bay Schwarz “du” kullanır çünkü Franz hala bir çocuktur. Aksi takdirde Bay Schwarz ya “Sie” kullanırdı ya da Franz “du” kullanırdı.)
Öğrenciler (üniversitelerde vb.) genellikle diğer öğrencilere ve kendi yaşlarında veya daha küçük olan herkese “du” derler.
Şirketlerdeki meslektaşlar için durum çok net değildir. Neyse ki, büyükler için başka bir kural daha var: Herhangi iki yetişkin birbirine "du" veya "Sie" ile aynı şekilde hitap eder, ancak hiçbir zaman yalnızca biri "du" ve diğeri Sie kullanmaz. Böylece, şüpheniz varsa, diğer kişinin size nasıl hitap ettiğini kopyalayabilirsiniz.
Diğer tüm durumlarda Sie kullanmalısınız. Bir Alman “du” demenin daha uygun olacağını düşünüyorsa, “du” demeyi önermekten memnuniyet duyacaktır. Öte yandan, "du"dan "Sie"ye geçmek neredeyse her zaman kabalık olarak kabul edilir; bu nedenle birini "du" yerine "Sie" kullanmayı önereceği bir konuma sokmamalısınız.
Çoğunlukla kibar formun kullanımının daha kolay olduğunu unutmayın. Sadece yardımcı ve modal fiillerin birkaç biçimini öğrenmeniz gerekiyor. Ana fiil genellikle mastardır. Tanıdık hitapla ne yazık ki daha birçok düzensiz fiil düşünmek zorundasınız.

"İsim", bir şeyi veya varlığı tanımlayan bir kelimedir, ör. "elma", "kadın", "adam" vb. "Zamirler" daha önce bahsedilen isimlere atıfta bulunan küçük kelimelerdir, ör. "o", (ingilizce "it", "she", "he" olarak üç farklı şekilde söylenir), hatta "biz", "ona" vb.
Bir cümlenin "konusu", cümlenin ilgili olduğu isim veya zamirdir. Genellikle cümlenin en aktif şeyi veya varlığıdır. Örneğin, "Kadın elma yedi." cümlesinde hem "kadın" hem de "elma" isimdir, ancak cümle kadının yaptığı eylemle ilgili olduğu için "kadın" cümlenin öznesi olur. (Merak ediyorsanız: "elma" cümlenin doğrudan nesnesidir.)
Örneğin isimlerini zamirlerle değiştirirsek, cümle şöyle olur: "O yedi." Bu örnekte, "o" ve "o(nu)" zamirlerdir. Bu cümlenin öznesi "o" zamiridir ve bu nedenle bu tür zamirlere "özne zamiri" denir.
Artık İngilizce özne zamirlerini bildiğinize göre, onların Almanca karşılıklarıyla birlikte bir tablosunu burada bulabilirsiniz. Bir veya daha fazla kişiye hitap edip etmediğinize ve onlara daha resmi veya daha tanıdık bir hitap şekli kullanıp kullanmadığınıza bağlı olarak, "siz" kelimesinin Almanca'da üç farklı kelimeye karşılık geldiğini unutmayın.

*Sie, du ve ihr kelimelerinin resmi (kibar) versiyonudur.

Şablon:German/Exercise

Birinin veya bir şeyin adını söylemek için  çağrılmak  -  heißen  kullanabilirsiniz. “heißen” fiilinin bazı biçimlerini zaten gördünüz. Şimdiki zamandaki tüm formları içeren daha sistematik bir tablo. Cümleye başladıkları için özne zamirlerinin büyük harfle yazıldığını unutmayın.

*Unutmayın, birinin adını sormanın resmi yolu Wie heißen Sie? sormaktır.
'Not: Almanca'da  iyelik zamirleri vardır (örneğin, "benim", "sizin", "onun", onun", ...) sadece burada geçerli değiller. , anadili konuşanlar genellikle Mein Name ist... (Benim adım...dır) demezler.

Fiiller, bir cümlenin eylemini tanımlayan kelimelerdir, ör. koş(mak), çağır(mak), ol(mak) vb. Fiil çekimi cümlenin öznesine göre fiilin şeklini değiştirmeyi ifade eder. Örneğin, olmak - sein fiilinin birkaç farklı biçimi vardır: (Ben) im..., (sen) sin..., (o) ) dur..., vb. Bununla birlikte, çoğu İngilizce fiilin şimdiki zamanda sadece iki formu vardır, örneğin, ingilizce'de (I/you/we/they) olarak söylenen ((Ben/sen/biz/onlar)) koşar ve (o erkek/o kız /o)) koşar. Almanca fiillerin ise şimdiki zamanda genellikle birkaç formu vardır.
Çağrılmak – heißen Almanca fiilin biçimlerini zaten öğrendiniz.

*Sen (kibar) - Sie fiillerinin biçimi, çoğul 3. şahıs zamiri onlar - sie ile tamamen aynıdır.

Son derece yaygın iki fiil "olmak" - "sein" ve "sahip olmak" - "haben". Bu şekilde çekilirler:

*Unutmayın ki siz (kibar) - Sie şekli, çoğul 3. şahıs zamiri onlar - sie ile aynıdır.

*Bu aynı zamanda siz (kibar) - Sie biçimidir.

Test üç bölümden oluşur: dilbilgisi, kelime bilgisi ve çeviri. Dilbilgisi kısmı çekimle ilgilidir; yani, farklı özne zamirleri için farklı fiil biçimleri. Kelime ve çeviri sorunlarının tümü İngilizce'den Almanca'yadır çünkü Almanca iletişim kurmak istiyorsanız öğrenmeniz gereken şey budur.
Şablon:Almanca/Egzersiz

Şablon:Almanca/Egzersiz

Şablon:German/Level I/Footer

II.0 Önsöz –  giriş, bu seviye nasıl kullanılır, Seviye I ve Seviye II arasındaki farklar
Section II.A – Salzburg, Avusturya
 Ders II.1: Einfache Gespräche unter Freunden – Almanca dilbilgisi (giriş), tanıdık konuşmalar, sorularda kelime sırası, zamirler (giriş)
 Ders II.2: Fremde und Freunde – fiiller (giriş), yalın durumda zamirler, resmi konuşmalar, zamir cinsiyet
 Ders II.3: Die Zahlen – Sayma (tema), 1'den 12'ye kadar sayılar, zamanı anlatma, isimler (giriş), belirli artikeller ve isim cinsiyeti, belirsiz artikeller.
 Ders II.4: Eine Geschichte über Zürich –  sıfatlar (giriş), ismin ve zamirlerin sıfat ve datif, soru cümleleri
 Ders II.5: Wiederholung – II.1-5 derslerinin gözden geçirilmesi
Section II.B – Zürih, İsviçre
 Ders II.6: Die Wohnung – çekim fiilleri (şimdiki zaman), komutlar
 Ders II.7: Mathematik – basit matematik, 13-100 arası sayılar, zamanı söyleme: dakikalar ve saniyeler, haftanın günleri, aylar ve mevsimler
 Ders II.8: Mein, Dein, und Sein – iyelik sıfatları ve tamlama durumu, ein-grubu, çoğullar, bağlaçlar
 Ders II.9: Einkaufen gehen – giyim eşyaları, ayrılabilir fiiller, renkler
 Ders II.10: Wiederholung – II.6-10 derslerinin gözden geçirilmesi
Section II.C – Hannover, Almanya
 Ders II.11: Verbtempus und Wortstellung – ters kelime sırası, geçmiş ve gelecek zaman fiilleri
 Ders II.12: Fragewörter – Almanca'da kullanılan soru kelimeleri, deyimler ve örnekleri ve kullanımları
 Ders II.13: Mein Arm schmerzt –
 Ders II.14: Hayvanlar –
 Ders II.15: Wiederholung – II.11-14 derslerinin gözden geçirilmesi

Şablon:German/Contents/Footer

Bölüm 1 ~ Bonn, Almanya

Ders 1: Markus Studiert ~ Kısa bir hikaye, şahıs zamirleri, eksik cümleler.
Ders 2: Gespräche Unter Geschäftsmännern ~ Kibar konuşma, kelime kökleri, yalın durumda şahıs zamirleri, bazı Almanca/İngilizce fiil formları.
Ders 3: Mach Dir Keine Sorgen! ~ Sıra sayıların cinsiyeti, zaman söyleme detayları.

Bölüm 2 ~ Innsbruck, Avusturya

Ders 4: Die Geschäftsleute ~ Personal pronouns in the accusative case, personal pronouns in the dative case.
Ders 5: ~ Der Engländer in Österreich ~ Personal pronouns in the genitive case.
Ders 6: ~ Fransa Turu
Section 3 ~ Bavaria, Almanya

Ders 7: ~ Gelişmemiş
Ders 8: ~ Gelişmemiş
Ders 9: ~ Gelişmemiş
Section 4 ~ Ruhrgebiet, Almanya

Lesson 10: ~ Das Ruhrgebiet ~ Kesin ve belirsiz artikeller, Çoğullar
Ders 11: ~ Undeveloped
Ders 12: ~ Undeveloped
Şablon:German/Contents/Footer

gehen (gitmek) ve fahren (sürmek, araçla gitmek) fiillerinin öznelere göre çekimi şu şekildedir.
Stellen

ich ->  gehe    (fahre)
du ->   gehst   (fährst)
er/sie/es   ->   geht (fährt)
wir   ->  gehen (fahren)
ihr  ->   geht (fahrt)
sie/Sie ->  gehen (fahren)
Kısaca: fiil sonundaki -en veya -n harflerini(harfini) atınız ve kalıp olarak

ich        -e
du         -st
er,sie,es  -t
wir        -en
ihr        -t
Sie    -en
şeklindedir.

Fiil kökü -d, -t, -dn, -tm, -chn, -fn, -gn harfleriyle bitiyorsa 2. ve 3. tekil şahıs ve 2. çoğul şahısta kökten sonra -e harfi eklenir.
Fiil kökü -ß, -s, -tz, -z, -ss, -x harfleriyle bitiyorsa, 2. tekil şahısta -s- sesi düşer.
Fiil kökü -eln harfleriyle bitiyorsa 1. tekil şahısta -e sesi düşer.

reden (konuşmak)
-Fiilin kökü red. -d sesiyle bitiyor. 1. özel durum
ich -> rede
du -> red(e)st
er/sie/es -> red(e)t
wir->reden
ihr->redet
sie/Sie->reden

sitzen (oturmak)
-Fiil kökü sitz. 2. özel durum
ich -> sitze
du -> sitzt
er/sie/es -> sitzt
wir -> sitzen
ihr -> sitzt
sie/Sie -> sitzen

sammeln (biriktirmek)
ich -> sammle
du -> sammelst
er/sie/es -> sammelt
wir -> sammeln
ihr -> sammelt
sie/Sie -> sammeln
-Sie ile sie arasındaki fark resmiyettir.
Daha fazla örnek vermek gerekirse:
rennen: koşmak
ich renne
ben koşuyorum
wir rennen
biz koşuyoruz
sie rennt
o (dişi) koşuyor
Sie rennen
siz (nazik) koşuyorsunuz
ihr rennt
siz koşuyorsunuz
Bu arada küçük bir bilgi verelim; Bir cümlenin öznesi illa da bir şahıs zamiri olmak zorunda değildir. Herhangi bir varlık da cümleye özne olabilir. Şimdi değişik öznelerle cümleler yapalım;
Ahmet rennt
Ahmet koşuyor
Ayşe rennt
Ayşe koşuyor
die Katze rennt
kedi koşuyor
sprechen : konuşmak
ich spreche
ben konuşuyorum
ihr spricht
siz konuşuyorsunuz
Ali spricht
Ali konuşuyor
das Kind spricht
çocuk konuşuyor
ein Kind spricht
bir çocuk konuşuyor
die Kinder sprechen
çocuklar konuşuyorlar
der Lehrer spricht
öğretmen konuşuyor
die Lehrer sprechen
öğretmenler konuşuyorlar
ein Lehrer spricht
bir öğretmen konuşuyor

Almancada her ismin cinsiyetini belirten bir tanımlığı vardır. Üç çeşit tanımlık vardır.
der (eril/maskulin)
die (dişil/feminin)
das (nötr/neutral)
Hangi ismin hangi tanımlığı aldığının belirli bir kuralı yoktur. Kelimeyi öğrenirken tanımlığıyla birlikte öğrenmeye çalışın, çünkü tanımlıklara göre ismin özellikleri değişir.
Örnek: Schule okul demektir. Tanımlığı diedir. Die Schule
Tisch masa demektir. Tanımlığıyla: der. Der Tisch
Gesicht yüz demektir. Tanımlığıyla: Das Gesicht
Not: Almancada bütün isimler büyük harfle başlar.
Çoğul yaparken belli bir kuralı yoktur. Genelde ismin sonuna -en, -n, -r, -e, -s eklerinden biriyle ya da aynı bırakarak çoğul yapılır. Her ismin çoğulu farklıdır. Çoğul yaparken başta biraz zorlanabilirsiniz ama zaman ilerledikçe çoğulları siz de tahmin edebilirsiniz.
Not: Çoğul yapılan ismin tanımlığı die olur.
Örnek: Der Tisch - Die Tische (masalar)
Die Zeitung - Die Zeitungen (gazeteler)
Das Bild - Die Bilder (resimler)
Bazen u üye o, öye a, äye dönüşür
Der Ball - Die Bälle (balolar/toplar)
Der Stuhl - Die Stühle (sandalyeler)
Das Buch - Die Bücher (kitaplar)
Başka dilden gelen kelimelerin çoğulları -s eki alır.
Der Cousin - Die Cousins (kuzenler)
Das Baby - Die Babys (bebekler)
Çoğulunda sadece tanımlık değiştiren isimler vardır.
Das Zimmer - Die Zimmer (odalar)
Das Mädchen - Die Mädchen (kızlar)

İsmin hâlleri her dilde farklı bulunur. Türkçede ismin sonuna eklenen eklerle kullanılır. İngilizce ve İtalyanca gibi dillerde isim hâli yoktur, bizim isim hâlleriyle kullandığımız yapıları edatlarla sağlarlar. Almancada isim hâli 4 tane vardır.
Nominativ (Yalın hâl) Akkusativ (-i hâli) Dativ (-e hâli) Genitiv (iyelik eki)

Nominativ ismin yalın hâlidir. Öznelerde ve sein (olmak) fiiliyle birlikte nominativ kullanılır.
Das Fenster ist zu (Pencere kapalı) / Sein fiilinin çekimlenmiş hâli ist
Mein Name ist Thomas (Benim adım Thomas)
Kalın yazılanlar nominativ'dir. Nominativ yani yalın hâlde artikelleri das ve der olan kelimeler için kein (hiç) ve ein (bir) de kullanılır. Artikeli die olan kelimeler için eine ve keine kullanılır.
Das Buch Kitap (Kitap belirli bir kitap)
Ein Buch Bir kitap (Burada kitap belirsizdir)
Dieses Buch Bu kitap
Das ist ein Buch Bu bir kitaptır.
Eine Frau kommt Bir kadın geliyor (Hangi kadın? Belli değil)
Die Frau kommt Kadın geliyor (Hangi kadın olduğu belli)
Keine Frau kommt Hiçbir kadın gelmiyor.
Aynı şekilde artikeli die olan isimler için nominativ durumda sahiplik eklerinin sonuna da -e gelir.
mein - meine (benim)
dein - deine (senin)
sein - seine (onun - eril)
ihr - ihre (onun - dişi)
sein - seine (onun - nötr)
unser - unsere (bizim)
euer - eure (sizin)
ihr - ihre (onların)
Ihr - Ihre (sizin - nazik)
Das ist mein Schlüssel (Bu benim anahtarım)
Das ist meine Zeitung (Bu benim gazetem)
Şablon:Tr

Akkusativ Türkçe olarak ismin -i hâlidir. Direkt nesne akkusativle kullanılır. Eylemin etkilediği öğedir.
Türkçede ek olarak kullanılırken Almancada artikel değişikliğiyle sağlanır.

Tabloda görüldüğü gibi akkusativde sadece artikeli der olan isimler değişiklik gösterir.
Elmayı yiyorum demek istersek nasıl deriz?
Elma: Der Apfel
Yemek: essen
Daha önceki derslerde çekimlemeyi de öğrendiğimize göre artık bu cümleyi kurabiliriz. Artikeli der olduğuna göre değişime uğrar ve cevap Ich esse den Apfel
Nominativ kısmında söylediğim gibi iyelik zamirleri, ein ve kein ismin artikeline göre değişiklik gösterir. Der ve das olduğunda bir ek almıyor ama die olunca ek alıyordu. Akkusativde de aynısı geçerli ama bu sefer ekstradan bir artikelimiz daha var! Den'de de değişikliğe uğrar ve den (belirtili) yerine einen (belirsiz), keinen (hiç), meinen (benim), deinen (senin), seinen (onun eril ve nötr için), ihren (onun dişil için ve onların), unseren (bizim), euren (sizin) ve Ihren (sizin nezaketen) kullanılabilir. Akkusativ olarak kullanılan die ve das nominativdeki gibi bir değişikliğe uğramaz.
Yani ich esse den Apfel yerine, belirsiz bir elmadan bahsetseydik;
Bir elma yiyorum (hangi elma belirsiz): Ich esse einen Apfel
Die Birne: Armut
Ich esse einen Apfel
Ich esse eine Birne
Egzersizler
Haben fiilinin çekimlerini öğrenmiştik. Sahip olmak nesne alan bir fiildir. Yani sahip olmak fiilini akkusativle kullanacağız. Şimdi cevaba bakmadan siz tahmin etmeye çalışın:
Bir elmaya sahibim Ich habe einen Apfel
Senin elmanı yiyorum Ich esse deinen Apfel
Bir elmaya sahip değilim (Hiç elmam yok) Ich habe keinen Apfel
Bir kediye sahibim / Bir kedim var (Kedi: Die Katze) Ich habe eine Katze
Onun (eril) elmasını yiyorsunuz Ihr esst seinen Apfel
Özge bir kediye sahip değil / Özge'nin kedisi yok Özge hat keine Katze
Bir kitabı okuyoruz (okumak: lesen / kitap: das buch) Wir lesen ein Buch
Kitapları okuyorum (Buch pl.: Bücher / hangi kitaplar belli) Ich lese die Bücher

Dativ Türkçedeki ismin -e halidir. Eylemin kime yapıldığını belirtir. Artikel değişikliğiyle elde edilir.

Akkusativde bildiğimiz gibi sadece der değişiyordu şimdi ise hepsinde bir değişikliğe uğruyor. Çoğul die'de artikel den olur ve ismin çoğul hâlinin sonuna 'n' eklenir. (İsmin çoğulu zaten sonu n ile bitiyorsa eklemeye gerek yok)
Die Katze: Kedi/Kediyi
Der Katze: Kediye
Der Freund: Arkadaş (erkek)
Die Freunde: Arkadaşlar
Den Freund: Arkadaş-ı
Die Freunde: Arkadaşlar-ı
Dem Freund: Arkadaş-a
Den Freunden: Arkadaşlar-a
Yine son ekleri iyelik zamirleri, ein ve kein'a göre eklenir. Yukarıda yaptığımızı bu sefer sahiplik eki mein (benim) ile yapalım:

İşte bu kadar. Dativle kullanabilceğimiz fiiller genelde Türkçedekilerle aynıdır. Fakat bazı istisnalar vardır
erreichen: Türkçede dativle kullanmamıza rağmen (Ona ulaştım) Almancada akkusativle kullanılır. (Ich erreiche den Kollegen, meslektaşımı ulaştım gibi gözükse de meslektaşıma ulaştım anlamındadır)
fragen: Türkçede dativle kullanmamıza rağmen (Ona sordum) Almancada akkusativle kullanılır. (Ich frage den Lehrer, öğretmeni soruyorum gibi gözükse de öğretmene soruyorum anlamındadır)
haben: Türkçede yine dativle kullanırız (Bir köpeğe sahibim) ama Almancada akkusativle kullanılır. (Wir haben einen Hund)
heiraten: Evlenmek fiili akkusativle kullanılır.
brauchen (ihtiyaç duymak) ve anrufen (telefon etmek) Türkçede dativle kullanılmasına rağmen Almancada akkusativle kullanılan diğer önemli fiiller.
folgen (takip etmek) ve gratulieren (tebrik etmek) ise tam tersi Türkçede akkusativle kullanılırken Almancada dativle kullanılır.
Şimdi biraz örnekler verelim:
helfen: Yardım etmek bildiğimiz gibi dativle kullanılır. Babama yardım ediyorum demek istersek: Ich helfe meinem Vater. (Baba'nın artikeli der olduğu için dem'e dönüştü.)
gehören: Ait olmak. Kitap bir kadına aittir: Das Buch gehört einer Frau (Kadın'ın artikeli die olduğu için dativde der'ya dönüştü)
Şimdi de hem akkusativ hem de dativ kullanalım bir cümlede:
geben: vermek hem akkusativ hem dativ kullanabileceğimiz bir fiil. Wir geben unserem Hund das Fleisch (Eti köpeğimize veriyoruz) Hund yani köpek dativ olarak ve Fleisch ise akkusativ olarak kullanılmıştır.
schenken: hediye etmek, adam çocuklara bir top hediye ediyor diyelim: Der Mann schenkt einen Ball den Kindern. Kind çocuk demek. Kinder çocuklar demek ve sonuna n ekleyerek onu dativ yaptık.
Şimdi zamirlerin akkusativ ve dativ durumlarına göre bir tablo verelim:

Bunları ezberlemenin kolay yolu: eğer artikellerin durumlara göre nasıl değiştiğini biliyorsanız; sie öznesi dişiler için kullanılır die de dişiler içindir. Die akkusativde değişmediği için sie de akkusativde değişmez. Dativde die, der olduğu için sie dativde ihr olur. Aynı şekilde es de akkusativde değişmez (das gibi) dativde ihm olur (dem). Er akkusativde ihn (den) olur ve dativde ihm (dem) olur. Ihr ve wir hem akkusativde hem de dativde aynı kalır. Çoğul sie ise yine tekil sie gibi akkusativde değişmez dativde -en geitirilerek çoğul yapılır. Çünkü sie de çoğul olarak kullanılıyor. Böyle aklınızda tutabilirsiniz.

Ich liebe dich: Seni seviyorum
Ihr helft mir: Bana yardım ediyorsunuz

Almancada, diğer dillerin aksine çok fazla zaman kipi bulunmamaktadır. Şimdiki zaman veya Almancasıyla Präsens, sadece o an gerçekleşen olayları anlatmakla kalmayıp, aynı zamanda geniş zaman ve ara sıra gelecek zaman işlevi de görmektedir. Bu sebeple şimdiki zaman, Almanca öğrenmek isteyenin öğreneceği en önemli konulardan birisi olacaktır.
Şimdiki zaman, fiilin köküne özneye göre birtakım ekler getirerek çekimlenir. Bir avuç fiilde de kök Umlaut olayından geçerek ünlüsünü değiştirir. Türkçenin ve başka bazı dillerin aksine fiilin özneye göre çekimlenmesine rağmen özneyi gizlemek, bazı istisnai durumlar hariç mümkün değildir.

Almancadaki fiillerin büyük bir çoğunluğu, sadece fiilin köküne birtakım eklerin getirilmesiyle çekimlenir, kök değişime uğramaz. Örnek olarak yapmak manasına gelen machen fiiline bakalım:

Gündelik konuşmada 1. tekil şahsın "-e" eki sık sık telaffuz edilmemektedir.
Telaffuzu kolaylaştırmak için T, D, bir ünsüz + N ve bir ünsüz + M ile biten fiil kökleri için bir kaynaştırma E'si kullanılmaktadır. Örnek olarak warten (beklemek) fiiline bakalım:

S, X, Z ve ß ile biten, yani telaffuzu s ile biten fiillerde 2. tekil şahsın S'si düşer. Örnek olarak sitzen (oturmak) fiiline bakalım:

Son olarak da -el' ve -er ile biten köklerin, ve bazı uzun ünlüyle biten köklerin mastar hâlinde E bulunmaz. Bu tarz köklerde 1. ve 3. çoğul şahıslarda da E bulunmaz, mesela wandern (dolaşmak) fiilinde: 

Bazı fiiller ise çekimlenirken 2. ve 3. tekil şahısta kökündeki ünlüyü değiştirir. Bunu yapan fiillerin istisnasız her biri, geçmiş zamanda da düzensizlik gösterdiğinden bu durumu geçmiş zamanla birlikte öğrenmek mantıklıdır. İki tane ses değişimi yaygındır:

-e-'yi -i- (veya -ie-) yapan fiiller
-a-'yı -ä- yapan fiiller
İçinde kısa -e- bulunan fiiller bunu -i- yapar, ve uzun -e- bulunan fiiller bunu çoğu zaman -ie- yapar. Örnek olarak messen (ölçmek), sehen (görmek) ve essen (yemek) fiillerine bakalım:

İçinde -a- bulunan fiiller de bunu -ä- yapar. Bunu yaparken uzunluk korunur. Bazı fiillerde de -au- bulunur, ve bu -äu-'ya dönüşür. Örnek olarak fahren (sürerek gitmek), laufen (yürümek) ve wachsen (büyümek) fiillerine bakalım

geben (vermek), nehmen (almak) ve treten (adım atmak) fiilleri düzensiz olarak ünlüsünü kısaltmaktadır.

İki fiil de başka örneği bulunmayan bir ünsüz değişimi geçirir; erlöschen (sönmek) ve stoßen (çarpmak)

Dikkat etmekte yarar vardır ki, eğer bir kökte ünlü değişimi oluyorsa, kök T veya D ile bitse bile 2. ve 3. tekil şahısta kaynaştırma ünsüzü gelmez, ancak 2. çoğul şahısta gelir. Halten (durmak) ve laden (yüklemek) fiillerine bakalım:

-dt ünsüz dizisi sadece t varmış gibi /t/ diye okunur.

Çok kullanılan 7 tane fiil, tekil şahıslarda yukarıdaki ekleri kullanmaz. Bu fiiler tarihsel olarak geçmiş zaman çekimlerinin anlam kaymasıyla şimdiki zaman olmasıyla oluşmuştur. Bu fiiller;

wollen (istemek)

mögen (sevmek)

sollen (gerekli olmak)

müssen (zorunda olmak)

können (yapabilmek)

dürfen (izinli olmak)

wissen (bilmek)

fiillerinden oluşmaktadır.

'haben (sahip olmak) fiili, neredeyse düzenli çekimlenip 2. ve 3. şahısta -a-sını kısaltıp -bsini düşürmektedir. Gelecek zaman ve edilgen oluşumlarda kullanılan werden fiili ise Umlaut geçiren fiillere ait olmakla birlikte aynı şekilde 2. şahısta -dsini düşürmektedir.

Son olarak, sein (olmak) fiili tamamen düzensizdir.

Almancada şimdiki zaman, en temel zaman kipi olup bir sürü farklı durumda kullanılabilir.
Mesela tam konuşma anında devam eden olaylar için şimdiki zaman kullanılır;

Ich fahre jetzt mit der U-Bahn. Şu anda metroyla gidiyorum.
Ich studiere an der TUM. TUM'de okuyorum.
Ama geniş zamanda gerçekleşen olaylar için de şimdiki zaman kullanılır:

Mittwochs habe ich keinen Unterricht. Çarşambaları hiç dersim yok.
Ich fahre in die Schule mit der Straßenbahn. Okula tramvayla gidiyorum.
Eğer açık bir zaman ifadesiyle belirtilmişse gelecek zaman anlamı dahi taşıyabilir:

Morgen fahre ich heim. Yarın evime dönüyorum.
Benzeri bir sürü durumda da Türkçede özel çekimler kullanılırken Almancada şimdiki zaman işi görür. Bu ayrımları yapmak için açık bir şekilde bir zarfın bulunması gerekir:

Ich fahre jetzt mit der U-Bahn. Şu anda metroyla gidiyorum.
Ich fahre jeden Tag mit der U-Bahn. Her gün metroyla giderim.
Ich fahre morgen mit der U-Bahn. Yarın metroyla gideceğim.

/src klasörü altındaki .java dosyasını açarsanız, programınızın kodlarını görebilirsiniz. İlk aşamada class'ınız ve onCreate metodunuz oluşturulmuş durumdadır.

Uygulamanızda oluşturduğunuz layout'taki nesneleri kullanmak için önce tanımlama yapmanız gerekir. Örneğin,

Burada R.id.num1, layout'ta o düğmeye verdiğimiz isim, sayi1 ise bu programda kullanacağımız ismidir. EditText ise nesnenin türüdür. (Tanımlamları ilk önce onCreate metodu dışında yapın.)
IDEniz; Button, EditText, vs. için hata verecektir. Hatanın üzerinde bekleyip "Import 'Button' (android.widget)" seçerek, Button kütüphanesini eklemeniz gerekir.

Programın tıklamalara cevap vermesini sağlamak için Listener eklememiz gerekir. onCreate metoduna ekle.setOnClickListener(this); yazarak bunu sağlayabiliriz. Bunu yazdığımızda program hata verir. onCreate metodunun ismine gelip, implements OnClickListener yazmamız gerekir. Bu şekilde tıklamaları dinlemeye başlarız.
onCreate metodunun hemen altına bir onClick metodu oluşturun. Sağ fareye tıklayıp, Source kısmından, Override/Implement methods'u seçerek boş bir metod ekleyebilirsiniz.
onClick metodunuz tüm tıklamaları kaydedeceği için, tıklamanın kaynağına göre işlemi seçmemiz gerekir. Bir if kalıbıyla x.getId() == R.id.ekle gibi bir koşul koyarak ekle düğmesine tıklandığını belirleyebiliriz.
EditText'ten sayı okumak için parseInt metodunu kullanabilirsiniz: Integer.parseInt(sayi1.getText().toString());.
TextView'i değiştirmek için toString metodunu kullanabilirsiniz: sonuc.setText(Integer.toString(s1+s2));.

Oluşturduğunuz layouttaki düğmelere tıklandığında sayıları toplayıp çıkaracak kodları yazın.

Uygulamanıza, arayüz tanımlamak için "Layout"lar tanımlayabilirsiniz. /res klasörü altındaki /layout klasörü altında tanımlanmış ilk layout'unuz yer alır.

Layout'unuzun xml dosyasına açıp, "Graphical Layout" sekmesinden sürükle bırak ile yeni nesneler ekleyebilirsiniz.
xml görünümüne geçip, layout'un xml kodunu görebilirsiniz.
Eklediğiniz nesneleri programda kullanmak istiyorsanız bir id tanımlamanız gerekir.
android:id="@+id/button1" gibi bir isim verebilirsiniz.

Farklı cihazlar için farklı layoutlar oluşturabilirsiniz. Örneğin; /res klasörü altında layout-land/ adında bir klasör tanımlarsanız, buradaki layout'unuz cihaz yatık konumdayken görüntülenir. layout-large/ adında bir klasör oluşturursanız, bu layout büyük ekranlarda (tablet gibi) görüntülenir.
Uygulamanızdaki farklı ekranlar için farklı isimlerde Layout'lar oluşturabilirsiniz.
Uygulamanızın farklı ekranlarda nasıl göründüğüne bakmak için Graphical Layout görünümündeyken "Preview All Screen Sizes" ya da "Preview Representative Sample" seçerek farklı cihazlardaki görünümüne bakabilirsiniz. Yine, cihaz adına tıklayarak, manual olarak varsayılan cihaz görünümünü değiştirebilirsiniz.

Layout'unuz içinde LinearLayout kullanarak gruplar oluşturabilirsiniz. Örneğin alt alta iki metin kutusu, onların altında 3 düğmeden oluşan bir görünüm yapmak istiyorsanız, 3 düğmeyi LinearLayout'un içine sürüklemeniz yeterlidir. RelativeLayout, TableLayout gibi başka Layout'lar da seçebilirsiniz. Horizontal Layout yapmak için LinearLayout'un orientation'ını değiştirmeniz gerekir: android:orientation="horizantal".
Xml dosyasını açarak layout'un boyutunu ayarlayabilirsiniz. Veya; android:layout_width="fill_parent" ve android:layout_height="wrap_content" seçerek ekranı doldurmasına veya içeriği kadar yer kaplamasına izin verebilirsiniz.

Layout'unuza metin eklediğinizde, IDE size uyarı verecektir. Bu uyarılar programın çalışmasına engel değildir. Android'de çoklu dil desteği sağlamak için metin eklemeniz gereken yerlere metin yerine android:text="@string/hello_world" gibi id'ler verebilirsiniz. Bu idleri /res klasörü altındaki /values klaösründeki string.xml dosyasında tanımlamanız gerekir.
Uygulamanıza başka bir dilde destek vermek için, bu string.xml dosyasından yeni dil için bir kopya oluşturmanız yeterlidir. Yeni dosyanızı, /values-tr /values-es gibi bir klasöre kopyalarsanız Türkçe ve İspanyolca sürümleriniz olur. /values-pt-rBR /values-pt-rPT gibi adlandırarak Brezilya Portekizcesi, Portekiz Portekizcesi gibi yerel sürümünü seçebilirsiniz.
Layout'unuzu grafik görünümde açıkken, dünya simgesine tıklarsanız, var olan dizileriniz ile kolayca başka bir dil oluşturabilirsiniz. Var olan dillere tıklayarak, bu dilde uygulamanızın nasıl göründüğünü görebilirsiniz.
Klasörü adlandırmak yerine xml dosyasını da adlandırabilirsiniz: string-tr.xml gibi.

Alt alta iki satır metin kutusu ve altında yan yana iki tane düğme ekleyin. Düğmeleri "Topla" ve "Çıkar" olarak adlandırın. Altına bir etiket (TextView) ekleyin.

http://developer.android.com/training/basics/firstapp/building-ui.html
http://developer.android.com/training/basics/supporting-devices/languages.html

Android ile programlama yapmak için Java veya diğer diller kullanılabilmektedir. Ancak Google tarafından önerilen yöntem Eclipse IDE'si kullanılarak Java ile programlamadır. Bu kitapta Windows üzerinde Eclipse ve Java kullanılacaktır.

Eclipse.org sitesinden Eclipse IDE'sinin son sürümünü indirin. (Eclipse IDE for Java Developers)
Eclipse kurulum gerektirmeyen bir programdır. İndirdiğiniz zip dosyasını hard diskinize açın.
Eclipse.exe'yi tıklayarak Eclipse'i çalıştırabilirsiniz.
İsterseniz sitedeki "Babel" kısmından Türkçe dil paketini indirebilirsiniz.

Eclipse'deki "Help" menüsünden "Install New Software"i seçin.
"Add"e tıklayarak, name kısmını doldurun (ADT plugin yazabilirsiniz).
Location kısmına "https://dl-ssl.google.com/android/eclipse/" yazın, OK dedikten sonra ekrandaki yönergeleri izleyin.

http://developer.android.com/sdk sitesinden SDK'nın son sürümünü indirin. Zip dosyasını hard diskinize açın.
Eclipse'i çalıştırdığınızda "Use existing SDKs"yı seçip, SDK'yı indirdiğiniz yeri gösterin.
Ardından Android SDK Manager'ı açarak kurmak istediğiniz öğeleri seçin.
Tüm dosyaları seçmeniz durumunda dosyaların boyutu birkaç GB olacaktır. Bu nedenle sadece ihtiyacınız olanları indirin.
Seçeceğiniz API ile ilgili "SDK Platform" dosyasını ve Tools menüsündeki itemleri de indirin. (API 14'den sonrası için ARM System image dosyasını da indirmeniz gerekir.)

Gerçek bir Android cihazıyla çalışacaksanız sanal makine kurmanız gerekmez.

AVD Manager'i açın.
New'u seçerek yeni bir makine oluşturun. Device kısmından bir cihaz seçerseniz gerekli alanlar otomatik doldurulur.
Start'a tıklayıp sanal makinenizi başlatabilirsiniz.

eclipse'in resmî sahifesi (İngilizce)
eclipse plugin'ini yerleştirme (İngilizce)

Eclipse'den File > New > Project'i seçin.
Android'in altında "Android Application Project"i seçin.
Application name uygulamanızın görünen adıdır.
Project name uygulama adınızla aynı olabilir, boşluk kullanılamaz.
Package name uygulamanızın tanımlayıcısıdır. Google Play'de url'sinde bu ad görünür.

Minimum SDK uygulamanızı çalıştıracak asgari Android sürümünü belirtir. Yüksek bir SDK seçerseniz, eski Android sürümleri uygulamanızı yükleyemez. Düşük bir SDK seçerseniz, yeni SDK'larla gelen API'leri kullanamayabilirsiniz.
http://developer.android.com/about/dashboards/index.html sayfasını ziyaret ederek, hangi Android sürümünün ne kadar kullanıldığını ögrenebilir, buna göre SDK'nızı da seçebilirsiniz.

Kendi ikonlarınızı seçebileceğiniz gibi Android'in kendisiyle gelen ikonları kullanabilirsiniz. Ya da metin girişi yaparak uygulamanızın ikonlarını yapabilirsiniz.
Uygulamanız için dört adet ikon seçmeniz gerekir. "ldpi", "mdpi", "hdpi", "xhdpi" farklı ekran çözünürlüğündeki Android cihazları için kullanılacak çözünürlüğü belirler.
İkonları daha sonra da /res/drawable klasörü altından değiştirebilirsiniz.

Create Activity'yi seçerek boş bir aktivite oluşturulmasını sağlayabilirsiniz.
BlankActivity'yi seçerek, boş bir "Merhaba Dünya" aktivitesi oluşturabilirsiniz.
Finish'e tıkladığınızda, "Merhaba Dünya" uygulamanız oluşturulmuş olur.

/src : Java dosylarınızın bulunduğu yerdir.
/gen : Otomatik oluşturulan dosyalardır.
/Android x.x : SDK sürümünüzün dosyalarıdır.
/Android dependencies : Admob gibi yardımcı jar dosyalarının bulunduğu yerdir.
/res/drawable : Farklı çözünürlükteki resimler bu alt-klasörlerde yer alır.
/res/layout : Programınızın UI'sini tanımlandığı xml dosyaları yer alır.
/res/values : Dil dosyaları gibi değerler burada yer alır.
/res/raw : Ses dosyalarını koyabileceğiniz bir yerdir.
AndroidManifest.xml : Uygulamanızın manifestosudur. Uygulama izinleri, aktivite tanımlanması gibi birçok tanımlama buradan yapılır.

http://developer.android.com/training/basics/firstapp/creating-project.html

Anensefali iki alt tipe ayrılır.

Meroakrani: Hafif formudur. Kranial kılıfta serebrovasküler yapıyla kaplı küçük bir defekt vardır.
Holoakrani: Ağır formudur. Beyin tamamen yoktur.
Anensefali; beyin, kafatası ve skalpin önemli bir kısmının konjenital yokluğudur. Prenatal deönemde en sık saptanabilen nöral tüp defektidir. Beyin hemisferleri gelişebilir, ancak bazı etkilerle yıkılır. Nöronlar ve gliaların fibrotik kitlelere dönüşmesi ve hemoraji ile fonksiyonel korteksin ortadan kalkar. Beyin sapı ve serebellum korunabilir. Beynin bu ciddi anomalilerine karşın, yüz kemikleri ve kafatası tabanı hemen hemen normaldir. Tüm vakalarda frontal kemik yoktur ve beyin dokusu anormaldir.

Tüm doğumların %0.03'ünde anensefali görülür. Prenatal ultrason ve maternal serum taramalarının yaygınlaşması ile anensefalik doğum insidensi giderek azalmaktadır.
Dişi fetüslerde daha sık görülmektedir. Dişi fetüste 3-4 kat daha sıktır. Hispanik kadınların bebeklerinde de insidens daha yüksektir. Anensefali, maternal hipotermi, folik asid, bakır ve çinko eksikliğine bağlı olabilir.

Ultrasonografik tanısı kraniumun üst kısmının bulunmamasına dayanır. Gözlerin üzerindeki düzeyden itibaren serebral hemisferler hafifçe görülebileceği gibi; sinirsel doku hiç görülmeyebilir veya hastalıklı bir kitle olarak izlenebilir. Bu kitle göz hizasının üzerinde ekojenik görünümdedir. Anensefali en iyi fetal yüzün koronal kesitte izlendiği planda gösterilebilir. Ultrasonografik görüntü çok tipiktir ve yalancı pozitifliğe rastlanmaz.
Anensefalik fetusların vücut ağırlıkları haftasına göre normaldir. İzole anensefalide intrauterin gelişme geriliği sıklıkla görülmez. Diğer bir ultrasonografi bulgusu da polihidramniyozdur.
14. haftadan sonra yapılan ultrasonografide tüm vakalara tanı konabilir.

Eşlik eden anomaliler
Konjenital kalp hastalıkları
Tek umblikal arter
Patent foramen ovale
Patent duktus arteriozus
Dominant sağ ventriküler çıkış
Hipoplastik akciğer
Konjenital diyafram hernisi
Barsak malrotasyonu
Renal malformasyonlar: Polikistik displastik böbrek
Adrenal bez hipoplazisi
Omfolosel

Ayırıcı tanıda en önemli nokta, anensefalik olgularda amniyotik band sendromu varlığını saptamaktır. Çünkü tekrarlama oranları çok farklıdır. Anensefalinin her zaman simetrik olduğu akıldan çıkarılmamalıdır. Amniyotik band sendromunda kol, parmak ampütasyonu, asimetrik karın ön duvarı defekti ve spinal defektler gibi bulgular vardır. Amniyotik band sendromu sıklıkla oligohidramniyozla birliktedir.
Kafatası kemiğinin demineralizasyonu da dahil olmak üzere kafatası kapanma lezyonlarından ayırıcı tanı yapılmalıdır.
Ayırıcı tanıda diğer önemli hastalıkla rüptüre ensefalosel ve iniensefalidir.
Anensefali ile ilişkili hastalıklar:

Folat yetmezliği
Maternal hipotermi
13 trizomi
18 trizomi
Turner sendromu
Triploidi
Amniyotik band sendromu
Ekstremite ve karın duvarı defektleri
Walker-Warburg Sendromu

Anensefalik fetusların çoğu intrauterin dönemde ölür. İlginç olan erken dönem abortlarında anensefali nadir iken ensefalosel sıktır, geç dönem abortlarında anensefali sıklığı artar.
İnsanlardaki nöral tüp defeklerini en iyi açıklayan hipotez, birden fazla odaklı nöral tüp kapanmasıdır. Farklı kapanma bölgeleri embriyojenez sırasında eksprese olan farklı genlerle olur. Nöral tüp defektlerinin çoğu kapanma odaklarından birinin veya ilgili nöroporun kapanamamasına bağlıdır. 2. kapanma alanında yetersizlik varsa meroakrani, 2 ve 4. kapanma alanında yetersizlik varsa holoakrani meydana gelir. Folat yetersizliği her iki kapanma alanını etkiler. Bu hipotez, birden fazla alanda nöral tüp defekti olan olgularda kanıtlanabilmiştir.

Anensefali olgularının %90'ında maternal serum AFP'i artmıştır. MS-AFP artışı saptanan olgularda 2. düzey ultrasonografi ile anensefali tanısı konabilir. Anensefalik bebek taşıdığı saptanan bir anne adayı ayrıntılı tanı ve fetal anomalilerin tanısı açısından tecrübeli bir üçüncü basamak merkeze nakledilmelidir. Ek fetal yapısal anomaliler saptanırsa prenatal karyotipleme yapılmalıdır. Anensefali izole ise prenatal karyotipleme yapılıp yapılmayacağı doğumdan sonra değerlendirilmelidir.
Fetus için prognoz hemen hemen her zaman fatal olduğundan tanı 24 haftadan önce konursa gebeliğin sonlandırılması seçeneği aileye sunulmalıdır. Polihidramniyoz sıkça görüldüğünden erken doğum sıkça görülür. Doğumda prezentasyon anomalileri sık olduğundan travay disfonksiyonu ve buna bağlı postpartum kanama sıklığı artmıştır. Ablasyo plasenta sıklığı yüksektir.
Anensefali, fetus için her zaman ölümcüldür. Ancak ölüm antenatal olabildiği gibi postpartum da olabilir. Postpartum ölüm, olguların %5'inde 1 haftaya kadar uzayabildiğinden aileye bebeğin hemen doğumdan sonra öleceği şeklinde bir bilgi verilmemelidir.

Anensefalide fetüse yapılacak herhangi bir müdahale yoktur.

Anensefalik infantların doğumu ortalama 37. gebelik haftasında gerçekleşir. Doğum ağırlığı, beyin ağırlığı çıkarılarak hesaplanırsa normal sınırlardadır. Anensefali tanısı kafatasında görülen geniş bir defekt, üzerinde kafatası cildinin olmaması, beyin yerine hemorajik ve fibrotik bir doku görülmesi ile kesinleştirilir. Serebral hemisferler izlenemez.
Anensefalik bebeklerde serebral korteks olmadığından bilinç yoktur, ancak beyinsapı fonksiyonları farklı derecelerde mevcuttur. Fetüsler komada değildir. Bebek, ekstremitlelerini spontan hareket ettirebilir. Korkutulduğunda myoklonik tepki verir. Kas tonusları ve derin tendon refleksleri artmıştır. Tipik davranış paterni alt ve üst ekstremitede ekstensor tonusun arttığı, spontan veya uyarıyla ortaya çıkan aksial myoklonustur. Tehlikeli uyaranlara yanıt olarak beslenme ve solunumla ilgili ilkel refleksler gösterir.
Bebekler doğumdan kısa süre sonra ölür. Nadiren bir haftaya kadar yaşar. En uzun 2 ay yaşayan anensefalik bebek bildirilmiştir.

Anensefalide uygulanabilen bir cerrahi tedavi yoktur.

Uzun dönemli gelişim konusunda en önemli kaynak organ vericisi olarak kullanılan anensefalik bebeklerdir. Anensefali, her zaman fatal olduğundan bu bebekler potansiyel organ vericisidir. Organ vericilerinde geleneksel olarak beyin ölümü olması gerekliliği önemli bir sınırlamadır. Anensefalik bebeklerde serebral korteks olmadığından beyin ölümünün saptanması için kullanılan serebral kan akımı ve elektroensefalogram bu bebeklerde anlamsızdır. Anensefalik bebeklerde beyin ölümüne beyin sapı fonksiyonlarına bağlı olarak ortaya çıkan spontan solunum ve ekstremite hareketlerinin kaybı ile tanı konur.
Anensefalik fetüslerden transplantasyon için organ alma konusunda dört ayrı strateji bulunur:

Anensefalik fetüsü doğar doğmaz yaşam desteğine alıp beyinsapı fonksiyonlarına bakılmaksızın teknik olarak mümkün olduğu anda organları almak.
Anensefalik fetüsü doğar doğmaz yaşam desteğine alıp beyinsapı fonksiyonları sonlanana kadar izlemek.
Anensefalik fetüsü kardiyorespiratuvar yetmezlik gelişene kadar izleyip sonra yaşam desteğine almak. Bu yöntemde organların çoğu zarar görmektedir.
Anensefalik fetüs ölüme kadar izlenip sonra organlarının alınması. Çoğu merkez bu yöntemi uygulamaktadır.
Anensefalik fetüslerde tüm organlar vücuda göre daha küçük ve malformasyon olasılıkları daha yüksektir.

Anensefali vakaları multifaktöriyel modellerle açıklanmaya çalışılır. Diyabetik anne bebeklerinde anensefali ve diğer nöral tüp defeklerinin insidensi yüksektir. Nöbetli bir hastalığa bağlı olarak valproik asid kullanan olgularda konsepsiyon öncesi ve ilk trimestrde kullanıma devam edilirse anensefali insidensi yüksektir. Multifaktöriyel nedene bağlı olgularda tekrarlama oranı %2-5'tir.
Anensefali dışında multipl sonografik anomalisi saptanan olgularda prenatal karyotip analizi yapılmamışsa postnatal yapılmalıdır. Aynı kromozom bozukluğuna bağlı tekrarlama riski olabilir.
Anensefali kendi içinde sıkça evlenen İran Yahudilerinde otozomal resesif olarak kalıtılmaktadır.
Reprodüktif yaşta ise nöral tüp defektinden korumak için günde en az 400 µgr folik asid verilmelidir. Daha önce anensefalik bebek doğuran bir kadında konsepsiyondan en az 1 ay önce günde 4000 µgr folik aside başlanmalıdır. Sonraki gebelik sırasında sonografik muayene veya MS-AFP ile prenatal tarama yapılmalıdır.

Anime "Osamu Tezuka" önceliğinde çıkarılmıştır. Anime bir çeşit Japon sanat eseridir. Kendine özgü çeşit çizim teknikleri vardır. Genelde mangaların televizyona ya da sinemaya uyarlanmasıyla oluşur. 2000'lerde tüm ülkelerde popüler olmuştur. Anime karakterlerinin gözleri ve boyları büyük çizilir.
Birkaç türü vardır;
Kodomo: Genellikle küçük çocuklar için hazırlanmış olan kısa süreli skeç tarzında animelerdir. Ahlak, iyi, doğru kavramlarını aktarmak genel amaçlarıdır.
Örnek: Death note.
Chibi:(Super Deformed): Bunlar ya küçük çocuklar için yapılmıştır ya da komedi unsurudur. Diğer türlere göre bu türde yapılmış pek anime veya manga yoktur. Genelde TV serilerinde bölümün sonunda çıkarlar. 
Örnek: Record of Lodoss War, Dash Dash Bashi
Shounen: Kelime anlamı "genç"tir. Genellikle genç erkekler, delikanlılar için hazırlanan animelerdir. Çoğunlukla ana karakterleri erkeklerdir. Dövüş sahneleri ve komedi unsurları sık sık kullanılır. Kızlar için olanı "Shoujo"dur.
Örnekler: Inuyasha, Naruto, One Piece, Dragon Ball, Death Note, Yu Yu Hakusho, Yu-Gi-Oh!, Tengen Toppa Gurren-Lagann, Great Teacher Onizuka, FullMetal Alchemist, School Rumble vs...
Seinen: 18-30 yaş arası erkekler için hazırlanmış olan anime/mangalardır. Hedef kitlesi daha da genişleyerek 30'lu yaşlarını geçmiş kişileri de kapsayabilir. Vahşet, kanlı sahneler, pornografik temalara kadar uzanan erotizm, çıplaklık vs sıkça görülür. Bayanlar için olan karşılığı "Josei"dir.
Örnekler: Elfen Lied, Berserk, Hellsing, Chobits, Monster, Code Geass:Hangyaku no Lelouch, Seirei no Moribito vs..
Shoujo: 10-18 yaşları arasındaki kızlar için hazırlanmış olan bu animeler genellikle romantik olaylar ve duygusal temaları içerir. Genellikle baş karakteri bir kız/kızlardır. Erkekler için olanı "Shounen"dir.
Örnekler: Ouran Koukou Host Club, Lovely Complex, Card Captor Sakura, Sailor Moon, Fruits Basket, Whisper of the Heart, Kaleido Star vs...
Josei: Genellikle gündelik yaşamla alakalı, baş karakterleri olan bayanların etrafında dönen hikâyelere sahiptir. Romantizm, kadın erkek ilişkileri anlatılır. Erkeklerdeki karşılığı "Seinen"dir.
Örnekler: Nodame Cantabile, NANA, Honey and Clover, Junjou Romantica vs...
Tabii ki tür olarak, bir Shounen içinde aksiyon ya da komedi elementleri olmaması beklenemez. Ya da bir Seinen olan Code Geass, macera, dram dışında Mecha (dev robotlar) barındırmaktadır. Shoujo olan Sailor Moon ve Card Captor Sakura animeleri, komedi ve romantizm yanında, alt tür olan Magical Girl'ü (büyü gücüne sahip kızlar) de kapsayabilir.
Mecha: Dev robotların içine girilerek ve onların yönetimiyle yapılan savaşlar bulunmaktadır. Özellikle oyuncak sektörü ile yakından ilgilidir. Batıda da kullanıldığı görülebilir (Star Wars). Robot boyutları animeye göre değişir. Bazıları normal apartman boyutunda olabilirken bazıları çok daha büyük boyutlara erişebilir. Örnekler: Gundam serisi, Voltron, Code Geass, Eureka 7, Tengen Toppa Gurren-Lagann vs..
Shounen-Ai: Kelime anlamı olarak shounen erkek, ai de aşk demektir yani erkekler arası aşkı, ilişkiyi anlatan anime/mangalar. Yaoi ise cinsellik veya çıplaklık içerir. Shounen-ai ile arasındaki fark budur.
Her ne kadar cinsellik içeriyor olsa da aşk ön plandadır.
Shoujo-ai: Shounen-ai'nin kız versiyonudur. Yani kızlar arası aşkı anlatır. Yuri'den farkı cinsellik içermemesidir.

Korpus kallozum beynin iki hemisferini bağlayan temel yoldur. Korpus kallozumun gelişimi fetal yaşamın beşinci haftasında primitif lamina terminalisin oluşumuyla başlar. Primitif lamina terminalis kalınlaşarak komissural plağı oluşturur. Glial hücreler birleşerek köprü benzeri bir yapı meydana getirir. Bu yapı longitudinal fissürü geçip beynin karşı yarısındaki yerine giden kallozal liflere kılavuzluk eder. Korpus kallozum gebeliğin onyedinci haftasında matür hale gelir. Korpus kallozum agenezisinde (KKA) komissural lifler orta hattı geçemez. Kalın bir band yerine lateral ventriküllerin medialinde Probst band adıyla arkaya doğru ilerleyen kör bir band meydana getirir. Bu bandlar, lateral ventriküllerin ön boynuzlarını ayırır.
KKA, izole bir bulgu olabilir. Ancak genellikle başka malformasyonlar, kromozomal aberasyon ve metabolizma bozukluklarını içeren genetik sendromlarla ilişkilidir.
İlişkili anomalileri

Santral sinir sistemi anomalileri
Chiari malformasyonları
Sinir migrasyon anomalileri
Lizensefali
Şizensefali
Pakigiri
Polimikrogiri
Ensefalosel
Dandy-Walker malformasyonu
Holoprozensefali
Olivopontoserebellar dejenerasyon
Yüz anomalileri
Kardiyovasküler anomaliler
Genitoüriner anomaliler
Gastrointestinal anomaliler
Respiratuvar anomaliler
Muskuloskeletal anomaliler

KKA, genel populasyonun %0,3-0,7'sinde ve gelişimsel bozukluğu olan populasyonun %2-3'ünde görülür. Tüm santral sinir sistemi anomalilerinin %4,1'ini oluşturur.  KKA vakalarının %17'sinde metabolik bir hastalık saptanmıştır.

Korpus kallozum, beynin midsagital ve midkoronal kesitlerinde görüntülenir. Bu planlar, abdominal ultrasonografi ile makat prezentasyon veya transvers pozisyonda elde edilebilir. Verteks prezentasyonundaki fetuslarda transvajinal ultrasonografi tercih edilir.
Sagittal planda korpus kallozum üst ve altta iki ekojenik çizgi ile sınırlanmış sonolüsent bir band olarak izlenir. Üstteki çizgiyi perikallozal sistern oluşturur. Alt çizgiyi ise kavum septum pellusidumun forniks ve tavanı oluşturur. Renkli Doppler ultrasonografide perikallozal arter de gösterilebilir. Bu arter, anterior serebral arterin bir dalıdır ve korpus kallozum üzerinde sirküler bir patern oluşturur.
Koronal planda korpus kallozum, kavum septum pellusidum ve frontal hornların tavanını oluşturur.
Davidoff ve Dyke kriterleri:

Korpus kallozumun yokluğu
Kavum septum pellusidumun yokluğu
Lateral ventrikülerin frontal hornu ve cisimlerinin birbirinden uzaklaşması
Lateral ventriküllerin oksiputal hornunun rölatif dilatasyonu
Lateral ventriküllerin medial sınırının konkav görünümü. Probst bandın basısına bağlı olarak görülür.
Üçüncü ventrikülün dilatasyonu ve yukarı kayması
Medial serebral girusların anormal radial oryantasyonu
Serebral ventrikülomegalilerin %11'inde, ılımlı ventrikülomegalilerin %9'unda KKA görülür. Rutin prenatal ultrasonogrfi taraması sırasında ılımlı ventrikülomegali saptanırsa korpus kallozumun varlığı teyid edilmelidir.
KKA'nin prenatal tanısı, postnatal tanısından daha zordur. Prenatal tanısı en erken 19. haftada konabilir. Korpus kallozum 18. haftada oluştuğundan KKA olgularının çoğuna üçüncü trimestrde tanı konur. Genellikle elde edilebilen aksial plan ventriküler anomalilerin tanısını koymakta zor bir plan olduğundan KKA tanısı da gecikir. Ventriküler anomalilerin tanısında en etkin planlar olan sagittal ve koronal planlar prenatal ultrasonda genellikle zor elde edilir.
Fetal beynin incelenmesinde genellikle kullanılan aksial planda korpus kallozum görüntülenemez. Fakat bu planda lateral ventriküllerin atriumundaki genişleme değerlendirilebilir. KKA olgularında lateral ventrikül atriumları 10 mm.'den daha geniştir. Bu yüzden atrial genişleme saptanan olgularda diğer bulgular KKA tanısını koydurabilir. En tutarlı ve tanımlanabilir bulgu, lateral ventriküllerin gözyaşı damlası görünümüdür. Aksial planda atrium ve oksiputal hornların genişlemesi ile cisimlerin birbirinden uzaklaşmasından doğan görünüm tanı koydurucudur. Gözyaşı damlası görünümü KKA dışında herhangi bir durumda ortaya çıkmadığı gibi KKA tanısı için spesifik bir bulgudur. KKA'yı dokümante edebilmek için dilate atrium ve gözyaşı görünümü saptanan olgularda koronal veya sagittal planlarda görüntü alınmalıdır.
Parsiyal KKA olguları bildirilmiş olmakla birlikte sayısı çok azdır. Parsiyal KKA olgularının serebral bulguları oldukça örtülüdür. Bazı olgulara prenatal tanı konmasının mümkün olmadığını kabul etmek gerekir. KKA olgularında kavum septum pellusidum görülemediği halde parsiyel agenezilerde görüntülenebilir. Rutin tarama sırasında görülen belirtiler, doktoru sagittal ve koronal görüntülerle korpus kallozumu daha iyi incelemeye iter. Olguların yarısında interhemisferik fissürde genişleme ve üçüncü ventrikülün yukarı yer değiştirmesi  belirtileri izlenir.
Medial serebral sulkusların radial yerleşimi, ancak üçüncü trimestrde görülür. Çünkü ikinci trimestrde hemisferlerin yüzeyi düzgün olup, sekonder sulkuslar üçüncü trimestrin başında meydana gelir. Bazı olgularda ultrasonografi yalnızca şüphelendirir ve tanı için prenatal MR yapılması önerilir. MR ile olguların çoğuna tanı konabilir.

Atrium ve oksiputal hornun dilatasyonu en önemli belirtidir. Bu yüzden hidrosefaliye neden olan herşey KKA ayırıcı tanısında dikkate alınır. KKA'nde oksiputal ventriküldeki dilatasyon diğer ventriküllerden daha fazladır. Oysa hidrosefalide tüm ventriküllerde yaygın bir dilatasyon izlenir. Üçüncü ventrikül dilatasyonu varsa, ayırıcı tanıya orta hat kistik yapıları dahil edilir. Orta hat kistik yapıları:

Kavum septum pellusidum
Kavum vergae
İnterhemisferik araknoid kist
Medial porensefalik kist
KKA'nin eşlik ettiği durumlar

Sendromlar
Aicardi sendromu
Andermann Sendromu
Akrokallozal Sendrom
Apert Sendromu
Shapiro Sendromu
Oküloserebrokutanöz Sendrom
Orofasiodijital Sendrom
Lens Displazisi
Frontal Nazal Displazi
Kromozom Anomalileri
18 trizomi
8 trizomi
13 trizomi
Metabolizma Hastalıkları
Nonketotik hiperglisinemi
Zellweger Sendromu
Adenilosüksinaz yetmezliği
Pirüvat dehidrogenaz yetmezliği
Neonatal adrenolökodistrofi
Menkes hastalığı
Leigh Sendromu
Glutarik asidüri tip II
Teratojenlere maruz kalma
Alkol
Valproat
Kokain
Rubella
İnfluenza

Antenatal tanısı geç konabildiğinden ve az sayıda olgu bulunduğundan obstetrik hikaye ile ilgili bilgi yetersizdir. İzole KKA varlığının gebeliğin seyrini etkilediğine dair bir bulgu yoktur. Ölümlerin hepsi postnatal periyodda olur.

KKA saptanan olgularda intrakranial ve ekstrakranial anomaliler dikkatle araştırılmalıdır. Olguların %70'inde 18, 8 ve 13 trizomi sık görüldüğünden ve 8 trizominin tek bulgusu KKA olduğundan ek anomali olmasa bile tüm olgulara amniyosentez yapılmalıdır.
KKA izole bir bulgu ve kromozom anomalisi yoksa standart obstetrik bakımı değiştirmeye gerek yoktur. Bu tanı, üçüncü basamakta doğum yaptırmayı gerektiren bir anomali değildir. Doğum sonrası genetik ve pediatrik nöroloji uzmanı tarafından konsülte edilmelidir. Eşlik eden başka anomaliler varsa üçüncü basamakta doğum sağlanmalı ve anomalinin görüldüğü ilgili branşta pediatrist tarafından konsülte edilmelidir.
Hidrosefali veya makrosefali yoksa vajinal doğum önerilir. Obstetrik endikasyon yok ise erken doğum yaptırılması gerekmez.

Korpus Kallozum Agenezisinde fetüse yapılacak herhangi bir müdahale yoktur.

Yenidoğanın ayrıntılı muayenesi gereklidir. Yenidoğana MR yapılmalıdır. MR ile eşlik eden diğer SSS anomalileri ayrıntıları ile saptanabilir. Bu konuda MR, BT ve USG'den daha iyidir. Yenidoğanda metabolik hastalıklardan şüpheleniliyorsa araştırma yapılmalıdır.

İzole KKA için cerrahi tedavi yapılmaz. Eşlik eden intrakranial ve ekstrakranial anomaliler için cerrahi gerekli olup olmadığı değerlendirilmelidir. Progresif ventriküler dilatasyon ve artmış kafa büyümesi durumunda ventriküloperitoneal şant gerekebilir.

KKA ile birlikte multipl major konjenital anomalileri ve özellikle de kraniofasial anomalileri olan çocuklar nörodevolopmental retardasyon riski taşır. Neonatal veya infantil nöbet, kötü prognostik işarettir. Bu bebeklerde ciddi retardasyon ve gelişme geriliği görülür. Ek intraserebral anomalileri olanlarda da prognoz kötüdür ve gelişme geriliği görülür. KKA agenezisi konmuş bir bebekte klinisyen ciddi nörodevelopmental gelişme geriliği ve nöbetler açısından uyanık olmalıdır.
Olgularda epilepsi, entellektüel yetersizlik ve psikotik bozukluklar görülebilir.
Ebeveyni KKA'li çocuklarının nörolojik gelişimi konusunda bilgilendirmek için elimizdeki veriler yetersizdir. Sağ kalan olguların çoğunda normal ya da sınırda nörolojik gelişim izlenmiştir. Olguların psikiyatrik bozukluklarla ilişkisi tam saptanamamıştır.

KKA'nin tekrarlama riski, metabolik hastalık veya genetik sendroma eşlik etmesi veya izole olmasına bağlıdır. Eğer KKA, anöploidiye bağlı ise tekrarlama riski %1 veya anne yaşına bağlıdır. Hangisi daha yüksekse gerçek tekrarlama riski odur. KKA izole ise tekrarlama riski %2-3'tür.
KKA, bazı sendromların tanısı için bilinen bir kriterdir.

Aicardi Sendromu
Andermann Sendromu
Akrokallozal Sendrom
KKA genellikle sporodik olarak bilinse de ailesel vakalar yayınlanmıştır.

Araknoid kistler serebrospinal sıvının pia araknoid aralıkta birikmesidir. Araknoid hücreler ve kollajenle kaplıdır. Araknoid kistler uniloküler olup yuvarlak, oval veya hilal şeklindedir. Arankoid kistler dördüncü ventrikül veya vallekuladan ayrılabilir. Serebellar vermis, hemisferler ve beyin sapı araknoid kist basısı yoksa normaldir. Araknoid kistler leptomeninkslerin gelişimsel bozukluğudur. İki araknoid membran arasında yerleşir. Subaraknoid aralıkla ilişki içinde olup bu yüzden büyüme potansiyeli taşır. Sıvı kist içine check-valv sistemi ile dolar. Kist duvarı içinde koroid pleksus benzeri doku vardır. Bu doku, serebrospinal sıvı salgılayarak kistin büyümesine neden olur.
İki tip araknoid kist vardır:

Konjenital tip: Leptomeningeal gelişim bozukluğuna bağlıdır.
Edinsel tip: Kanama, travma veya enfeksiyona bağlı olarak oluşur.
Konjenital olguların üçte ikisi supratentorial yerleşimli iken üçte biri posterior fossada yerleşmiştir. Edinsel olgularda ise tümü posterior fossaya yerleşir. Supratentorial interhemisferik araknoid kistlerinin %5'i korpu kallozum agenezisi ile ilişkilidir.
Araknoid kist duvarını normal araknoid membrandan ayırmaya yarayan özellikler:

Araknoid membran kistin kenarında kesintiye uğrar.
Kist duvarında çok kalın bir kollayen tabakası vardır.
Kist duvarı içinde çaprazlaşan trabeküler çıkıntılar yoktur.
Kist duvarında hiperplastik hücreler vardır. Bunlar kollajen sentezler.
Elektron mikroskopik çalışmalar, araknoid kist ile normal araknoid sistern arasında daima bağlantı olduğunu kanıtlamıştır. Araknoid kistler araknoid aralıkla ilişkili olduğundan intraaraknoid nitelikli kistlerdir. Retroserebellar kistler, dördüncü ventrikülün kalıcı divertikülleri olup gerilemezler. Araknoid kist gelişiminin temel nedeni bilinmemektedir. Normal subaraknoid sisternin oluşmasını sağlayan faktörler, kist içinde de araknoid membranın oluşmasından sorumludur. Bu divertikül veya kapalı kistik alan oluşumuna neden olur. Araknoid kistler subaraknoid sisternin gelişimsel anomalileridir.

Araknoid kistlerin insidensi net olarak bilinmez. Prenatal dönemin nadir anomalilerindendir. Çocukluk çağında beyinde yer kaplayan oluşumların %1'i araknoid kistlerdir. Otopsi çalışmalarında %0,5 oranında rastlanır. Araknoid kistler, erkek fetuslerde dişilerden daha sıktır. Beynin sol yarısı, sağdan daha sık etkilenir.

Araknoid kistin sonografik bulguları beyinde düzgün ve ince kenarlı sonolüsent kitleye dayanır. Kist, lateral ventriküllerle bağlantılı değildir. Ancak bası etkisine bağlı olarak hidrosefaliye neden olabilir. Bu durumda serebellar vermis normal boyutlardadır. Ortada kist ve kenarda iki adet dilate ventrikül görünümüne tavşan kafası görünümü adı verilir.
Tüm olgulara 20 haftadan sonra tanı konmuştur. Araknoid kistlere ekstrakranial anomraliler sıklıkla eşlik etmez.

Araknoid kistin ayırıcı tanısı:

Megasisterna magna
Dandy-Walker Malformasyon
Normal varyant
Alobar holoprozensefali
Porensefalik kist
Ependimal kist
Şizensefali
İnfarkt
Tümör
Araknoid kistle karışan durumlardan biri Megasisterna magnadır. Megasisterna magnada serebellar hemisferlere bası etkisi ve hidrosefali yoktur. Orta hatta serebellumdan geriye doğru uzanan araknoid kistleri megasisterna magnadan ayırmak zordur.
Ayırıcı tanıda diğer önemli kondüsyon Dandy-Walker malformasyonudur. Dandy-Walker malformasyonunda ventriküler sistemden ayrı bir posterior fossa kistidir. Serebellar hemisferlerden öne doğru uzanan araknoid kistlerde Dandy-Walker malformasyonunu dışlamak kolaydır. Ancak bu ayırım her zaman çok kolay olmayabilir. Çünkü posterior fossa antenatal ultrasonda her zaman güzel görüntülenemeyebilir. İyi bir tanı için dördüncü ventrikülün büyüklük, şekil ve pozisyonunu düzgün bir şekilde belirlemek önemlidir. Korpus kallozum agenezisi bulunması, Dandy-Walker malformasyonunu düşündürebilir.
Postnatal dönemde araknoid kisti Dandy-Walker maldormasyonu, megasisterna magna, varyantları ve  siyah poş kistinden ayırmak için ventriküler sisteme kontrast madde instile edilerek sisternogram çekilebilir.
Ayırıcı tanıda postnatal anjiografi yapılabilir. Araknoid kistte inferior serebellar arter ve vermian dalı normal genişlikte olup yukarı ve öne yer değiştirmiş olabilir. Dandy-Walker malformasyonunda ise inferior serebellar arter minyatür olup vermian dalı ve inferior vermian ven yoktur.
Ayırıcı tanıda önem taşıyan bir başka durum da normalin varyantı olup olmadığıdır. Subaraknoid alanda araknoid trabekülasyonun konsantre olmasına bağlı olarak subaraknoid septa görünümü ortaya çıkabilir.
İntrahemisferik araknoid kistler, alobar holoprozensefalide görülen dorzal kistlerle karışabilir.
Ayırıcı tanının diğer bir unsuru da porensefalik kistlerdir. Porensefalik kistler beyin dokusunda yer alır, ventriküler sistem ile bağlantılıdır ve kitle etkisi oluşturmaz. Genellikle prenatal veya postnatal beyin yaralanması ile ilişkilidir.
Ayırıcı tanıda son önemli tanı ise ependimal kisttir. Ependimal kistler araknoid kistten daha nadir görülür ve frontal veya temporoparietal lobun beyaz cevheri içinde yerleşmiştir. Ependimal kistteki protein içeriği araknoid kisttekinden daha yoğundur.

Araknoid kistlerin antenatal gidişi hakkında bilgi çok kısıtlıdır. Bazılarının küçülüp bazılarının büyüdüğü bilinmektedir. Bazen MS-AFP artabilir. Bunun etiyoloji ile ilişkili veya rastlantısal olup olmadığı net olarak bilinmiyor. Foramen Monroe'nun tıkanması veya bazal sisternaların bloke olması ile akuaduktusun geriye doğru itilmesinden kaynaklanan hidrosefali görülebilir.

Araknoid kiste eşlik eden resesif kalıtılan nadir bir sendrom:

Tibia yokluğu
Polidaktili
Yarık damak
Retroserebellar kist
Araknoid kist saptanan olgular fetal anatominin iyi değerlendirilebileceği bir merkeze nakledilmelidir. Kistin büyümesi ve ventrikülomegali açısından seri ultrasonografik izleme alınmalıdır. Araknoid kist multipl malformasyon sendromunun bir parçası olabileceğinden ilişkili malformasyonlar araştırılmalıdır.
Fetal karyotipleme için amniyosentez yapılmalıdır. Bir vakada 9 numaralı kromozom uzun kolu parsiyel trizomisi ve X kromozomu uzun kolu monozomisi saptanmıştır.
Aile pediatrik nörolog, beyin cerrahı ve tıbbi genetik uzmanı ile görüştürülmelidir.
Araknoid kistle ilişkili olan anomaliler:

Fallot tetralojisi
Nörofibromatozis tip I
İzole araknoid kist sezaryen endikasyonu değildir. Hidrosefali eğilimi olduğundan fetal kafa çapı seri ultrasonlarla izlenip vajinal doğu yapıp yapamayacağı belirlenmelidir. Normal doğuma karar verilirken kistin travma ve kanama olasılığı dikkate alınmalıdır.

Araknoid kist için fetusa herhangi bir girişim önerilmez.

Doğumdan önce araknoid kist saptanan bir bebek doğumdan sonra pediatrik nörolog ve tıbbi genetik uzmanı tarafından kontrol edilmelidir. Kistin yerine de bağlı olmak üzere MR veya BT ile varlığı doğrulanmalıdır. Yenidoğanın baş çevresi dikkatle ölçülmeli ve kafatasında bir asimetri varlığı araştırılmalıdır. Yenidoğan baş çevresi dikkatle izlenmeli ve doğum esnasında kist içine kanama veya venlerin kopmasından kaynaklanabilecek büyümeler araştırılmalıdır. Doğumdaki karakteristik belirtiler kistin çapına bağlıdır. Olguların %30-100'ünde hidrosefali eşlik eder. Yenidoğan döneminde makrosefali varlığı, daha önceden saptanmamış araknoid kisti akla getirebilir. Genellikle krizler izlenir. Nadiren kafa içi basıncı artması belirtileri ortaya çıkar.

Araknoid kistin cerrahi tedavisinde uygulanan yöntemler, kistin çıkarılması, pencere açılması veya drenajıdır. Drenaj, komşu sisternaya, abdominal kaviteye veya atriuma yapılabilir. Cerrahi eksizyon, intrakranial bası belirtisi veren nadir vakalarda uygulanır. Kraniotomi ciddi komplikasyonlarla sonuçlanır. En sık uygulanan yöntem peritona drenaj olup nadiren tekrarlar veya komplike olur. Şantın tıkanması veya bebeğin büyümesine bağlı olarak değiştirilmesi gerekir. Beyin cerrahları mümkün olduğunca fenestrasyonu tercih eder. Endoskopik yaklaşımla kistin obliterasyonu da tanımlanmıştır.

Uzun dönemli izlemde en sık görülen sorunlar, hidrosefali, krizler ve nörolojik anomalilerdir. Bazı olgular asemptomatik devam edebilir. Araknoid kist doğrudan ölüme neden olmaz. Prognoz, operasyon yaşına bağlıdır. Operasyon yöntemi prognozu etkilemez.

Tüm olgular sporodik olarak ortaya çıkar. Nadir olgular tek gen mutasyonuna bağlı multipl konjenital anomaliler veya nörofibromatozis tip I'e eşlik edebilir. Önceki gebeliğinde araknoid kist saptanıp karyotip anomalisi izlenen olgularda yineleyen gebeliklerde karyotip araştırması yapılmalıdır.
Nadiren bazı ailelerde araknoid kist tekrarlamalarına rastlanabilir. Bu, genetik bir miras olduğunu düşündürmektedir.

Originally described by Luschka and Virchow in the mid 1800s, AVMs are abnormal communications between arteries and veins without the normal capillary flow.
The incidence in the US population is 0.14% (140 cases per 100,000 persons or 1 case per 700 persons). This is approximately one fifth to one seventh the incidence of intracranial aneurysms.
Abnormal communication between artery and vein, with disproportionate and unbalanced hydrodynamic stress across them. The direct connection between the arterial and venous systems exposes the venous system to abnormally high pressures and results in the formation of enlarged feeding vessles and enlarged draining venous structures.
Point of abnormal communication is known as the nidus
Annual risk of hemorrhage 2-6%, with associated fatality rate 10-20%
Primary treatment approach is typically surgical rebaşlık
Risk evaluated by Spetzler-Martin score (PMID 3760956) (size, location, pattern of venous drainage), which estimates post-op morbidity and mortality
SRS typically used if surgery is considered too risky: surgical inaccessibility, expected high morbidity due to eloquent location or large size, medically inoperable
Goal of SRS treatment is to eliminate risk of catastrophic intracranial hemorrhage
Probability of obliteration ("cure") is ~80% for smaller lesions, and depends on dose
There is a definite associated between AVM and aneurysm with about 8% of AVM patients developing a cerebral aneurysm and about 1% of patients with an aneurysm found to have an AVM. Aneurysms are most commonly found on arteries feeding the AVM.
AVMs are congenital lesions that result from the failure of the embryonic vascular plexus to fully differentiate and develop a mature capillary bed. While the structure may change or grow postnatally, they are thought to only be seen in the presence of a prenatally lesion. Tissues adjacent to the AVM may be mildly hypoxic due to “stealing” blood from adjacent healthy tissue. This may lead to expression of pro-angiogenic factors such as VEGF and bFGF.
Hemorrhage is the most common reason for presentation (~50%). It is often associated with the acute onset of a severe headache that may be described as “the worst headache of my life”. Depending on the location, it may also be associated with a new neurologic deficit. Seizure can be seen in about 45% of patients, headache in 33%, neurologic deficit in 20%.
Pediatric patients can present with heart failure, macrocephaly, and/or prominent scalp veins.

Surgery - Cure is immediate and permanent after complete rebaşlık. Is generally recommended for grade 1, 2, and (sometimes) 3 lesions. One of the primary risks is that of hemorrhage into healthy parts of the brain.
Endovascular neurosurgery -- Involves the obliteration of vessels with glues or particles delivered via arterial catheter. Its main use is “neoadjuvantly” prior to crainiotomy to decrease intraoperative bleeding. It can also be used prior to SRS to decrease the size of an AVM. Embolization can be curative for lesions <1cm that are fed by a SINGLE artery. The main risk involves occluding a vessel that also supplies normal brain. The pathologic vessels usually recanalize over time, so this is rarely used by itself.
Stereotactic radiosurgery -- Can be used if surgery is considered too risky: inaccessible location, expected high morbidity due to location, large size, medically inoperable. The goal of SRS is to eliminate the risk of catastrophic intracranial hemorrhage. Some groups have used staged or fractionated SRS to treat larger lesions. It can take 2 or more years for a full destructive effect and the risk for hemorrhage is not reduced during this time. Cure rates for lesions <3cm are 80-90%.
Ondra 1990 J Neurosurgery PMID 2384776  -- Retrospective series on 160 patients with untreated symptomatic AVMS with a mean follow-up of 23.7 years (seen between 1942 and 1975 at Helsinki University). The rate of major rebleeding was 4% per year and the mortality rate was 1% per year. Nearly 25% of patients were dead from AVM hemorrhage. There was no significant difference based on whether a patient presented with hemorrhage, seizure, or other.
Friedman 1995 J Neurosurgery PMID 7815144  -- Report of 158 patients at UF treated between 1988 and 1993. Mean dose of 1560 cGy to the periphery with mean volume of 9 mls. Mean f/u of 33 months during which patients were followed with MRI until findings suggested complete thrombosis at which time an arteriogram was performed to verify occlusion. If a persistent nidus was found at 36 months, patients were re-treated. The goal was to relate size to outcome. Only 56 patients had “definitive endpoints” (death related to hemorrhage, retreatment, angiographic cure) so this data may be quite biased. Due to the significant selection of whom they reported on, the more interesting data may be their complications.  Seizure within 48 hrs of SRS was seen in 4.6% of patients (all of these initially presented with seizure). Hemorrhage was seen in 4% of patients between 2 and 11 months after treatment. Transient delayed complications (HA, dysphasia) was seen in 2% of patients with resolution after steroids.
Flickinger 1996 IJROBP PMID 8960516 -- Retrospective review of 216 patients (1987-1992) with gammaknife radiosurgery for AVM at U Pitt. Of these, 197 had angiographic followup with a median treated volume of 4.1 ml. Complete obliteration was seen in 72% of patients. On multivariate analysis, a correlation with minimum dose was seen, but not with volume or maximum dose. Very few patients were treated with <15 Gy or >25 Gy. Very nice figures in the paper.
Flickinger 2000 IJROBP PMID 10725624 -- Review from 85 AVM patients who developed symptomatic complications and 337 control patients without complications to develop a method to better predict permanent complications from AVM radiosurgery. Essentially, the risk of developing complications is related to the location and volume receiving 12 Gy. History of prior hemorrhage and marginal dose did not significantly predict injury.
Maruyama 2005 NEJM PMID 15647577 -- Retrospective analysis of 500 patients treated with gammaknife RS to assess the effects of RS on rates of hemorrhage. RS dose was 20 Gy with use of the 50% isodose line. RESULTS: 42/500 patients had a hemorrhage before radiosurgery. 23/458 patients had a hemorrhage during the latency period (the interval between RS and angiographic obliteration). 6/250 patients had hemorrhages after obliteration. The annual rate of repeated hemorrhage prior to radiosurgery was about 6% among those patients who presented with hemorrhage.
Controversies-- Given the increased use of cranial imaging estimates are that 50-60% of newly diagnosed AVMs are detected incidentally. Although the traditional stated risk of hemorrhage is 2-3% per year, this is typically calculated from the time of diagnosis. More recent estimates place the risk of hemorrhage at closer to 1%. Predictors of AVM hemorrhage include increasing age, deep brain location, associated aneurysms, and deep venous drainage.  This has led to: ARUBA (A Randomized Trial of Unruptured Brain Arteriovenous Malformations), an ongoing multicenter randomized trial enrolling 800 patients, that is comparing treatment (sugery, radiation, or both, physician decision) of unruptured lesions with conservative management.

2007 PMID 17596605 -- "Clinical practice. Arteriovenous malformations of the brain." (Friedlander RM, N Engl J Med. 2007 Jun 28;356(26):2704-12.)

Harvard; 2003 (1965-1993) PMID 12924697 -- "Dose-volume prediction of radiation-related complications after proton beam radiosurgery for cerebral arteriovenous malformations." (Barker FG 2nd, J Neurosurg. 2003 Aug;99(2):254-63.)
Retrospective. 1,250 patients. DVH information reviewed. Median size 33.7 cm3, 23% <10 cm3, largest 927 cm3. Median dose 10.5 Gy. Median F/U 6.5 years
Toxicity: permanent late toxicity 4% (hemiparesis 2%, visual field defects 1%, other <1%: cognitive dysfunction, ataxia, speech deficits, hemisensory deficits, hearing loss). Median time-to-complication 1.1 years (0.2 - 6.8 years)
Predictors: Median dose complications 17 Gy vs no complications 10 Gy. If dose <12 Gy, complication rate 0.5% but a complication also occurred at 5 Gy. Complication rate related to dose, volume, thalamic/brainstem location, and age (median age 31). Significantly more complications than predicted by Kjellberg's model (e.g expected 2-2.5% complication bin had 34% actual complications)
Conclusion: Estimate of risks after proton SRS for AVM; dose-volume model developed

AutoIt, Microsoft Windows için ücretsiz bir otomasyon yazılımıdır. Yazılımın ilk versiyonları tamamen otomasyona yönelik hazırlanmış olsa da sonradan kapsamı genişletilerek hemen her türlü uygulamanın geliştirilebileceği bir programlama aracı haline gelmiştir.
Versiyon 3 sürümüyle birlikte söz dizimi BASIC türevi dillere benzer şekilde yeniden yapılandırılmıştır. Dizinleri de kapsayan değişik tipteki verileri saklayabilen Varyant tipindeki değişkenlerin kullanıldığı üçüncü nesil bir programlama dilidir. Windows 95, 98, NT4, XP, 2003, Vista, Windows 7 ve Windows 10 ile uyumludur. Ancak 3.3.0.0 versiyonundan sonra Windows 2000'den öncekilere destek verilmemeye başlamıştır. Dolayısıyla Windows'un eski versiyonlarına yönelik olarak AutoIt'in eski versiyonları ile kod yazılabilir.
Bir AutoIt betiği, AutoIt yorumlayıcısının yüklü olmadığı bilgisayarlarda çalışabilecek şekilde, sıkıştırılmış bir EXE programı haline getirilebilir. Derleyici AutoIt kodunu byte koda çevirip bunu AutoIt yorumlayıcısı ile ciltleyerek tek bir EXE dosyası haline getirir ve bu dosya UPX ile sıkıştırılır; böylece birçok program 1 MB'tan daha küçük bir EXE dosyası şeklinde son kullanıcılara teslim edilebilmektedir. UDF (User Defined Functions "Kullanıcı Tanımlı Fonksiyonlar") olarak bilinen geniş bir fonksiyon kütüphanesi standart olarak programla birlikte gelir veya bazıları AutoIt internet sitesinden indirilebilir. AutoIt aynı zamanda ücretsiz SciTE editör tabanlı bir IDE ile birlikte dağıtılmaktadır. Derleyici ve yardım metinleri de AutoIt kullanan geliştiriciler için tamamen bu birime entegre edilmiştir.
AutoIt'in özellikleri kendi yayımcısı tarafından şöyle sıralanmıştır:

Öğrenmesi kolay BASIC-vari söz dizimi.
Tuş vuruşlarını ve fare hareketlerini simüle edin
Tüm standart pencere kontrolleri ile etkileşime geçin
Betikler bağımsız çalıştırılabilirler halinde derlenebilir
Grafik Kullanıcı Arayüzleri (GUI'ler) oluşturun
COM desteği
Düzenli ifadeler
Doğrudan harici DLL ve Windows API fonksiyonlarını çağırın
Betiklenebilir ...olarak çalıştır (RunAs) fonksiyonları
Tafsilatlı yardım dosyası ve geniş topluluk tabanlı destek forumları
Windows XP SP3 / 2003 SP2 / Vista / 2008 / Windows 7/2008 R2 / Windows 8/2012 R2 ile uyumludur
Unicode ve x64 desteği
İç huzuru için dijital olarak imzalanmış
Windows Kullanıcı Hesabı Denetimi (UAC) ile çalışır
AutoIt, sunucularda güvenli kullanılmasını sağlamak için harici .dll dosyaları veya kayıt defteri girdileri gerektirmeden mümkün olduğu kadar küçük ve tek başına olacak şekilde tasarlanmıştır. Komut dosyaları Aut2Exe ile tek başına çalıştırılabilirler (stand-alone) halinde derlenebilir.
Ayrıca, AutoIt'ın benzersiz özelliklerini kendi komut dosyalarınıza veya programlama dillerinize eklemenizi sağlayan AutoIt'ın birleşik COM ve DLL sürümü de bulunur.

AutoIt ile yazılabilecek en basit örnek kodlardan biri üzerinde "Hello World!" yazısı bulunan bir mesaj kutusu oluşturan tek satırlık koddur.

Avidemux, çok amaçlı video düzenleme ve işleme işlemleri için geliştirilmiş özgür ve açık kaynaklı bir programdır, neredeyse bütün 
işletim sistemlerinde ve bilgisayar platformlarında kullanılabilir. Bu kitapta bu programı indirme, kurma, yapılandırma ve kullanma hakkında bol miktarda bilgi bulabilirsiniz.

Basit makale: Linux'a Avidemux 2.4.x'i kurma
Basit makale: Linux'a Avidemux 2.5.x'i kurma
Basit makale: Linux'a Avidemux 2.6.x'i kurma
Ayrıntılı rehber: Windows ve Linux'a Avidemux'u derleyerek kurma

Hata izleme/hata raporlama
Desteklenen format ve kapsayıcılar (container)
Girdi formatları
Çıktı formatları
Video okumak için mevcut olan kodekler
Video çözücüleri
Ses çözücüleri
Video üretmek için mevcut kodekler
Video kodlayıcıları
Ses kodlayıcıları
Sık Sorulan Sorular (SSS)
Yaygın efsaneler
Kaynak dosya notları
Özellik istekleri

Kullanıcı arayüzü
Ana pencere - GTK+ versiyonu (GNOME, Xfce veya LXDE'li Linux/BSD için)
Ana pencere - Qt versiyonu (Microsoft Windows veya KDE 4'lü Linux/BSD için)
Kesme
MPEG dosyalarını kesme
Proje dosyaları, özel betikler
İş listesi
Komut satırı kullanımı
Betik yazımı
VBR MP3
Çift kanallı ses
B-frame'ler
Video filtreleri
Ses filtreleri
Multithreading işlemci teknolojisi
Avidemux'taki ayarlar
ffv1rec ile analog video yakalama
AVSProxy'yi kullanma, AviSynth betiklerini okuma

Videoyu deinterlace etme
DVD'ye dönüştürme
DVD/MPEG'i AVI'ye dönüştürme
Bağımsız MPEG-4 çalıcılar
Sadece sesi kaydetme
Sadece videoyu kaydetme
Ön ayarlar - kodek ayarlarını nasıl kaydederim
Türlere kodlama rehberi
Animasyonu Xvid kullanarak kodlama
MPEG yakalamasını düzeltme (DVB veya IVTV)
MPEG dosyalarını ProjectX ile onarma
Betik dilini kullanma kılavuzu
Kendi filtrenizi yazma (Avidemux 2.4)
x264 ile H.264/AVC'ye kodlama rehberi
Toplu işleme

Kitabın bu sayfası, Avidemux'un GTK+ arayüzlü versiyonunun ana penceresini anlatmaktadır. GTK+ versiyonunu GNOME, Xfce veya LXDE'li Linux veya BSD kullanıcıları tercih edebilir. Microsoft Windows kullananlar Qt versiyonunu kullanmalıdırlar. Qt, Avidemux'un resmi Microsoft Windows build'lerinin varsayılan GUI'sidir.

Ana araç çubuğu sık kullanılan işlemlere kolay erişim sağlar:
 Bir dosya açar. Sağdaki küçük oka tıklayarak son kullanılan dosyaları listeleyebilirsiniz.
 Aktif video dosyasını kaydeder
 Dosya bilgisini gösterir (ses/video formatı, çözünürlük vb.)

 Bit oranı/dosya boyutu hesaplayıcısını açar. Video boyutu, 2-pass kodlamasına göre hesaplanır. Çünkü videonun boyutu (ses olmadan) 2-pass kodlama ayarlarında gereklidir. Apply butonuna tıklayarak seçili kodlayıcıya göre 2-pass video boyutu hesaplanır.
 Ön izleme modu:

Input - ana pencerede, açılan video filtre uygulanmamış haliyle gösterilir
Output - ana pencerede, filtrelenmiş (kaydedilecek) video gösterilir
Side - ana pencerede, yatay olarak dizilmiş halde hem açılan video hem de çıkışa hazır (output) video gösterilir
Top - input ve output üst üste yığılmış halde gösterilir
Separate - ana pencerede input, ayrı bir pencerede output gösterilir
 Ses kontrolü

Video içi dolaşım (navigasyon) kutusundaki düğmeler aktif video üzerinde ileri-geri gitmek, aktif videoyu çalmak, dosyanın belirli bir kısmını seçmek,  zaman bilgisi almak, vb. için kullanılır.

 Dosyayı çalmaya başla
 Çalmayı durdur
 Önceki frame'e git
 Sonraki frame'e git
 Önceki keyframe'e git
 Sonraki keyframe'e git
 Önceki black frame'e git. Black frame'leri aramak biraz zaman alabilir ve % 100 doğru sonuç vermeyebilir
 Sonraki black frame'e git
 İlk frame'e git (videonun başlangıcına)
 Son frame'e git (videonun sonuna)
 Yavaşla/hızlan, sürgüyü hareket ettirerek hızlı bir şekilde ileri veya geri git, sürgü ne kadar uzağa hareket ettirilirse hız o kadar artar; keyframe'e göre dolaşılır

Videonun seçtiğiniz bir kısmını kesebilir veya kaydedebilirsiniz.
 Aktif frame'i A noktası (seçimin başlangıcı) olarak ayarlar
 Aktif frame'i B noktası (seçimin sonu) olarak ayarlar
 A işaretinin konumunu gösterir
 B işaretinin konumunu gösterir

 Aktif frame'i ve toplam frame sayısını gösterir. Aktif frame'in yazdığı yere başka bir frame yazıp Enter'a basarsanız Avidemux o frame'e gidecektir.
 Videodaki şu anki ve toplam zamanı gösterir
 Aktif frame'in türünü belirtir (I-frame, P-frame veya B-frame olabilir). Parantezler içindeki sayı, gösterilen resmi kodlamak için ne kadar quantizer gerektiğini belirtir. (yalnızca MPEG kodekleri gibi quantizer tipteki kodeklerde anlamlıdır)

Soldaki araç çubuğu ses ve video kodlayıcılarını, filtreleri ve çıktı formatlarını ayarlamak için kullanılabilir.
Ses ve video kodlayıcıları "format (kodlayıcı)" biçiminde listelenir. Buradaki "format" spesifikasyon, standarttır. Kodlayıcı ise belirli bir yazılım kütüphanesi, implementasyondur ve akımı seçili formata kodlar. Örneğin, "MPEG-4 ASP (Xvid4)" üretilecek videonun formatının MPEG-4 ASP ve MPEG-4 ASP'yi üretmek için kullanılacak yazılım kütüphanesinin Xvid olduğunu belirtir. "MP3 (LAME)" üretilecek sesin formatının MP3 olduğu ve MP3'ü üretmek için LAME kullanılacağını belirtir.
"Format" menüsü genelde çıktının kapsayıcısını belirtmek için kullanılır. Bir kapsayıcı tek bir dosyaya hapsedilmiş ses ve video akımlarını içerir. Audio ve Video menülerinde seçilmiş olan ses ve video akım türleriyle uyumlu bir kapsayıcı formatı seçmek önemlidir. Örneğin, MPEG-2 (DVD, SVCD) veya MPEG-1 (VCD) videoları AVI kapsayıcısının içine konmamalıdır. Bazı popüler ses/video format/kapsayıcı kombinasyonları şöyledir:

video: MPEG-1, ses: MP2, kapsayıcı: MPEG-PS (VCD ile uyumludur, bilgisayarların ve işletim sistemlerinin (örneğin Microsoft Windows) çoğunda ek bir kodek kurmaya gerek kalmadan çalınabilir)
video: MPEG-2, ses: MP2/AC3, kapsayıcı: MPEG-PS (DVD'ler ile uyumludur)
video: MPEG-4 ASP, ses: MP3, kapsayıcı: AVI (popüler bir formattır, "DivX ile uyumlu" diye tabir edilen her türlü platformda oynatılabilir, Linux'ta MPlayer, VLC veya xine; Windows tabanlı sistemlerde de bir DivX, Xvid veya ffdshow gibi bir MPEG-4 ASP çözücüsü kuruluysa oynatılabilir)
video: H.264 (MPEG-4 AVC), ses: AAC, kapsayıcı: MP4 (MPEG-4 standardı)
video: H.264 (MPEG-4 AVC), ses: Vorbis, kapsayıcı: Matroska (bilgisayarlarda çalmak için verimli bir özgür yazılım seçimi, MPlayer veya VLC bu kombinasyondaki dosyaları çalabilir, Windows Media Player'da çalabilmek içinse ffdshow gibi bir H.264 çözücüsü ve Haali Media Splitter gibi bir Matroska bölücüsü gerekir)

 Çıktı formatı buradan seçilir; varsayılan S/V kapsayıcısı AVI'dir

Kitabın bu sayfası Qt arayüzlü Avidemux'un ana penceresini anlatmaktadır. Qt, Avidemux'un resmi Microsoft Windows build'lerinin varsayılan GUI'sidir.  GNOME, Xfce veya LXDE kullanıcıları GTK+ versiyonunu tercih etmelidir.

Ana araç çubuğu sık kullanılan işlemlere kolay erişim sağlar:
 Bir video dosyası açar
 Video dosyasını kaydeder
 Dosya bilgisini gösterir (ses/video formatı, çözünürlük vb.)
 Bir proje açılır ve çalıştırılır
 Projeyi kaydeder

 Bit oranı/dosya boyutu hesaplayıcısını açar. Video boyutu, 2-pass kodlamasına göre hesaplanır. Çünkü videonun boyutu (ses olmadan) 2-pass kodlama ayarlarında gereklidir. OK butonuna tıklayarak seçili kodlayıcıya göre 2-pass video boyutu hesaplanır.

 Input – ana pencerede, açılan video filtre uygulanmamış haliyle gösterilir
 Output – ana pencerede, filtrelenmiş (kaydedilecek) video gösterilir
 Side – ana pencerede, yatay olarak dizilmiş halde hem açılan video hem de çıkışa hazır (output) video gösterilir
 Top – input ve output yığılmış ve dikey halde gösterilir
 Separate – ana pencerede input, ayrı bir pencerede output gösterilir

Video içi dolaşım (navigasyon) kutusundaki düğmeler aktif video üzerinde ileri-geri gitmek, aktif videoyu çalmak, dosyanın belirli bir kısmını seçmek, zaman bilgisi almak, vb. için kullanılır. Mavi dikdörtgen seçimi belirtir.

 Çalmaya başla
 Çalmayı durdur
 Önceki frame'e git
 Sonraki frame'e git
 Önceki keyframe'e git
 Sonraki keyframe'e git
 Önceki black frame'e git. Black frame'leri aramak biraz zaman alabilir ve %100 doğru sonuç vermeyebilir
 Sonraki black frame'e git
 İlk frame'e git (videonun başlangıcı)
 Son frame'e git (videonun sonu)
Yavaşla/hızlan, sürgüyü hareket ettirerek hızlı bir şekilde ileri veya geri git, sürgü ne kadar uzağa hareket ettirilirse hız o kadar artar; keyframe'e göre dolaşılır

Videonun seçtiğiniz bir kısmını kesebilir veya kaydedebilirsiniz.
 Aktif frame'i A noktası (seçimin başlangıcı) olarak ayarlar
 Aktif frame'i B noktası (seçimin sonu) olarak ayarlar

 Aktif frame'i ve toplam frame sayısını gösterir. Aktif frame'in yazdığı yere başka bir frame yazıp Enter'a basarsanız Avidemux o frame'e gidecektir.
 Videodaki şu anki ve toplam zamanı gösterir. Orada yazan zamanı değiştirip enter'a basarsanız Avidemux videoda o zamana gidecektir.
 Aktif frame'in türünü belirtir (I-frame, P-frame veya B-frame olabilir). Parantezler içindeki sayı, gösterilen resmi kodlamak için ne kadar quantizer gerektiğini belirtir. (yalnızca MPEG kodekleri gibi quantizer tipteki kodeklerde anlamlıdır)
 Ses kontrolü

Soldaki araç çubuğu ses ve video kodlayıcılarını, filtreleri ve çıktı formatlarını ayarlamak için kullanılabilir.
Ses ve video kodlayıcıları "format (kodlayıcı)" biçiminde listelenir. Buradaki "format" spesifikasyon, standarttır. Kodlayıcı ise belirli bir yazılım kütüphanesi, implementasyondur ve akımı seçili formata kodlar. Örneğin, "MPEG-4 ASP (Xvid4)" üretilecek videonun formatının MPEG-4 ASP ve MPEG-4 ASP'yi üretmek için kullanılacak yazılım kütüphanesinin Xvid olduğunu belirtir. "MP3 (LAME)" üretilecek sesin formatının MP3 olduğu ve MP3'ü üretmek için LAME kullanılacağını belirtir.
"Format" menüsü genelde çıktının kapsayıcısını belirtmek için kullanılır. Bir kapsayıcı tek bir dosyaya hapsedilmiş ses ve video akımlarını içerir. Audio ve Video menülerinde seçilmiş olan ses ve video akım türleriyle uyumlu bir kapsayıcı formatı seçmek önemlidir. Örneğin, MPEG-2 (DVD, SVCD) veya MPEG-1 (VCD) videoları AVI kapsayıcısının içine konmamalıdır. Bazı popüler ses/video format/kapsayıcı kombinasyonları şöyledir:

video: MPEG-1, ses: MP2, kapsayıcı: MPEG-PS (VCD ile uyumludur, bilgisayarların ve işletim sistemlerinin (örneğin Microsoft Windows) çoğunda ek bir kodek kurmaya gerek kalmadan çalınabilir)
video: MPEG-2, ses: MP2/AC3, kapsayıcı: MPEG-PS (DVD'ler ile uyumludur)
video: MPEG-4 ASP, ses: MP3, kapsayıcı: AVI (popüler bir formattır, "DivX ile uyumlu" diye tabir edilen her türlü platformda oynatılabilir, Linux'ta MPlayer, VLC veya xine programlarıyla; Windows tabanlı sistemlerde de DivX, Xvid veya ffdshow gibi bir MPEG-4 ASP çözücüsü kuruluysa Windows Media Player'la oynatılabilir)
video: H.264 (MPEG-4 AVC), ses: AAC, kapsayıcı: MP4 (MPEG-4 standardı)
video: H.264 (MPEG-4 AVC), ses: Vorbis, kapsayıcı: Matroska (bilgisayarlarda çalmak için verimli bir özgür yazılım seçimi, MPlayer veya VLC bu kombinasyondaki dosyaları çalabilir, Windows Media Player'da çalabilmek içinse ffdshow gibi bir H.264 çözücüsü ve Haali Media Splitter gibi bir Matroska bölücüsü gerekir)

 Çıktı formatı buradan seçilir; varsayılan S/V kapsayıcısı AVI'dir

Bu sayfada Xvid (versiyon 1.xx) kodeğini kodlama için nasıl yapılandıracağınız anlatılmaktadır. Buradaki ayarlar özellikle animasyonları (çizgi filmler, animeler, vb.) kodlama içindir. Burada anlatılan kodlama ayarları Xvid kodlayıcısının kurulu olduğu her türlü işletim sisteminde mevcuttur.
Koyu olarak gösterilen ayarlar yapılması tavsiye edilen ayarlardır. İtalik metinler ise ayar hakkında verilen ek bilgilerdir.
MAIN:

Encoding Type: Two Pass
Target size (MBytes): ??? (İstediğiniz video boyutunu girin)
Quantizer: ?.? (Sadece single pass quantizer'i seçtiyseniz kullanışlıdır)
[ ] Interlaced (Sadece deinterlace yapmaya ihtiyaç duyuyorsanız kullanışlıdır - ancak yine de pek kullanmayın; deinterlace için filtreler daha iyidir)
[ ] Cartoon mode (Sadece çok düz renkler kullanan çizgi filmler içindir, pek kullanmayın)
[X] Turbo Mode (2pass modunda ikinci geçişteki hızı artırır)
[ ] Greyscale
[X] Chroma Optimizer
[ ] Packed bitstream
MOTION ESTIMATION:

Motion Search Precision: "6 - Ultra High"
VHQ Mode: "4 - Wide search"
[X] Chroma Motion
[X] 4MV
[X] HQ AC
I-frame interval - Min: 1  Max: 300
YAPILANDIRMA NOTU - Frame oranı için sayılar
NTSC (Amerika & Japonya) = 300
PAL (Avrupa) veya FILM (bazı DVD'ler) = 240
HDTV = 1200
Advanced Simple Profile
Numberof B-frames: 3 (Minimum sayı olarak üçü kullanın, video kalitesini oldukça artırır)
[ ] Qpel ("Quarter pixel"in kısaltımı)
[X] GMC (Eğer videoyu sadece bilgisayarda çalacaksanız bunu seçin, eğer videonun dvd oynatıcı cihazlarıyla uyumlu olmasını istiyorsanız seçmeyin.)
[X] BVHQ (Daha güzel gözüken B-frame'ler üretir)
QUANTIZATION:

[X] H.263 (Çizgi film ve animeler için iyidir)
[ ] MPEG (Çizgi film dışındaki videolar [gerçek hayat videoları] için iyidir)
[X] Trellis quantization
Quanitization restrictions
I-frame quantizer Min : 2 (veya tam CD için 1 yapın, deneme-yanılma gerektiriyor)
I-frame quantizer Max : 31
P-frame quantizer Min : 2 (veya tam CD için 1 yapın, deneme-yanılma gerektiriyor)
P-frame quantizer Max : 31
B-frame quantizer Min : 2 (veya tam CD için 1 yapın, deneme-yanılma gerektiriyor)
B-frame quantizer Max : 31
SECOND PASS:

Two pass tuning
I-frame Boost (%): 10
I-frame closer than... (frames): 1
... are reduced by (%): 20
Max overflow improvement (%): 5 (default)
Max overflow degradation (%): 5 (default)
Curve compression
High bitrate scenes (%): 0
Low bitrate scenes improvement (%): 0
Overflow control strength (%): 5  (20, tam filmler için iyidir - daha fazla deneme-yanılma gerektirir)

Bu madde SVN depolarından veya sıkıştırılmış dosyadan edindiğiniz kaynak kodun işletim sisteminiz için derlenmesini anlatmaktadır. Tahmin edebileceğiniz gibi otomatik bir derleme değil, tamamen el ile yapılan bir derlemeden bahsediyoruz. Bu tür bir derleme, her işletim sistemine uygulanabilir ve otomatik derlemeye oranla birçok seçeneği değiştirebilme imkanı verir. Burada rehberler, paket açıklamaları ve derlemenin başarılı olması için yapılması gereken dağıtıma özgü ayarlardan bahsedeceğiz.

Avidemux'u kurmanız için önce bazı bağımlılıkları kurmanız gerekiyor. İsim olarak vermek gerekirse, çeşitli geliştirme paketlerini kurmanız (veya bilgisayarınızda zaten kurulu olması) gerekiyor. Bu paketlerin isimleri ve kısa açıklamaları:

SpiderMonkey: Betiklerin çalışması için gerekli (yalnızca 2.3 ve daha eski versiyonlar için).
GTK+: Avidemux 2.1-2.3'ün GTK+ 2.6'ya veya daha üst bir versiyonuna ihtiyacı vardır. Bu paket aynı zamanda ayrı olarak kurulabilen pkg-config paketini de içerir. Avidemux 2.4 ve üst versiyonları GTK+, Qt 4 veya komut satırıyla kullanılabilir. GTK+ versiyonu Cairo'yu içeren GTK+ 2.10 veya daha üst versiyonunu gerektirir. Bazı eski Linux dağıtımları (Fedora Core 4 gibi) Cairo'suz olan GTK+ versiyonlarını içerir.
libxml2: XML kütüphanesi, 2. versiyon. Tanımları ve ~/.avidemux/config'i filtrelemek için kullanılır.
GCC: Avidemux'u derleyeceğiniz kaynak kod derleyicisi.

Ses:

libmad: MP3 ve MP2'yi çözme için gerekli.
LAME: MP3 olarak kodlama için gerekli.
libvorbis: Vorbis türünü çözme ve kodlama için gerekli.
FAAD: AAC ses çözücüsü.
FAAC: AAC ses kodlayıcısı.
a52dec: AC3 sesi için ses çözme desteği (DVD'ler ve diğerleri için).
libdca: DTS için ses çözme desteği (DVD ve diğerleri için).
Video:

Xvid: MPEG-4 SP/ASP kodlayıcısı.
x264: MPEG-4 AVC (H.264) kodlayıcısı.
Çeşitli:

FreeType: Altyazı filtresi için gerekli.
OSS: "Open Sound System". 2.6 ve daha yeni olan Linux çekirdekleri seçimli OSS emülasyonu ile birlikte ALSA'yı kullanır.
ALSA: "Advanced Linux Sound Architecture". ALSA sesi çıktısı Tercihler'den ayarlanabilir.
SDL: SDL ses ve video çıktısı için kullanılabilir. Linux ve BSD'de gerekli değildir.
XVideo: Çalma esnasında donanım görüntü hızlandırıcısı (overlay). Daha az işlemci kullanımı sağlar.
ESD: ses çıktısı daemon'ı. Artık kullanılmıyor ve gerekli değil.
aRts: KDE 3.x ses sistemi daemon'ı. KDE 4 için gerekli değil, tavsiye edilmez.

Bu rehber iki türlü derleme hakkında bilgi içerir. İki yöntem de aslında aynıdır. Tek fark nereden indirmek istediğinizi belirten en baştaki komuttur.

Derleyeceğiniz dosyalarınızı indirebileceğiniz iki farklı konum var. 

Buradan sıkıştırılmış dosya içinde son kararlı sürümü indirebilirsiniz. Bu bilgisayarında kararlı ve genellikle hata içermeyen sürümü bulundurmak isteyenler içindir.
svn://svn.berlios.de/avidemux/branches/avidemux_2.4_branch/

SVN deposundan son versiyonun kararlı olmayan kaynak dosyalarını indirebilirsiniz. SVN versiyonu bazı hata düzeltmeleri ve yeni özellikler eklenmiş son sürümdür. Kararsız veya test sürümü olarak sınıflandırılır, ancak genel anlamda oldukça kararlıdır. Ancak yine de bu versiyonu ciddi işlerde kullanmanız için önermiyoruz - İnternet sitesinden edineceğiniz sıkıştırılmış dosyayı kullanın. Şu komutu kullanarak SVN'den kaynak kodu indirebilirsiniz:
svn://svn.berlios.de/avidemux/tags/avidemux_2.5.1

cd avidemux (kaynak kodun bulunduğu klasöre girin)

2.4'ler CMake'i birincil komut olarak kullanır. 2.4 veya daha yeni sürümlerde Avidemux'u derlemek için kaynak kodun bulunduğu klasörde şu komutları kullanın:

cmake . (nokta zorunlu değil)
make
Daha fazla bilgi için Avidemux forumundaki Switch to CMAKE in progress konusuna bakın.

make -f Makefile.dist (SVN versiyonunu derlemek için gerekli, resmi sürüm için gerekli değil)
./configure --with-jsapi-include=xxxx [--with-newfaad for Gentoo or Ubuntu] (xxxx --> SpiderMonkey'in kurulu olduğu klasör - Avidemux 2.3 ve önceki versiyonlarını SpiderMonkey olmadan kuramazsınız, version 2.4 ve sonrası kurulum için harici SpiderMonkey gerektirmiyor)
make (Avidemux'u derleme komutu)
make install (Avidemux'u kurma komutu - komutun çalışması için root olmalısınız, bunun için su komutunu kullanın)
'locate jsapi.h' komutu büyük ihtimalle jsapi.h dosyasıyla ihtiyaç duyacağınız klasörü bulacaktır. Eğer locate komutu bulamazsa, 'updatedb' komutuyla location veri tabanını güncellemeniz ve sonra 'locate jsapi.h' komutunu tekrar denemeniz tavsiye edilir.
Bazı insanlar sistemlerinde Avidemux'un tüm özelliklerinin kurulu olmasını istemiyorlar. Burada programın bazı özelliklerinin derlenmemesi için kullanabileceğiniz ./configure argümanları var:
Ses

OSS: --without-oss (oss olmadan)
aRts: --without-arts (arts olmadan)
ESD: --without-esd (esd olmadan)
Video

XV: --disable-xv (xv pasif)

Şu an Debian'a Subversion'dan (SVN) Avidemux'un son sürümünün derlenmesini anlatan belirli bir rehber yok. Ancak, bu sayfadaki Ubuntu/Kubuntu için SVN'den kurma hakkında anlatılanlar Debian için de geçerli olacaktır.
Debian'da kullanabileceğiniz deb paketleri şurada:
http://debian-multimedia.org/

Berkano Overlay'in 2.3 subversion kısmından Avidemux'u derlemek için gerekli ebuild'leri edinebilirsiniz. (ayrıca burası bir çift daha ebuild içeriyor, faydalı olabilir). Üçüncü parti ebuild'leri nasıl kullanacağınız hakkında bilgi için Gentoo Wikisi'ndeki nasıl sayfasını okuyun.
Bazı Gentoo sistemleri derleme için ./configure komutuyla birlikte --with-newfaad argümanını istiyor.

apt kaynakları listenizdeki "universe"i etkinleştirin. root konsolundan veya sudo komutu ile nano/vim/gedit veya başka istediğiniz bir metin editörüyle /etc/apt/sources.list dosyasını açın. repository satırlarının birisinde "universe"in enabled olması gerekir.
apt kaynakları dosyanızdaki "universe" deposunun etkin olduğundan emin olduktan sonra bir root konsolundan veya sudo komutuyla şu komutu çalıştırın:

sudo apt-get update

Sırada derleme bağımlılıklarını kurmak var. Avidemux'u çeşitli ekstra özelliklerle birlikte derleyebilmek için gerekli bağımlılıkların çoğunu root konsolundan veya su veya sudo komutlarından birini kullanarak aşağıdaki komutu vererek kurabiliriz.

 sudo apt-get install automake1.9 g++ gcc liba52-0.7.4 \
liba52-0.7.4-dev libfaac-dev libfaad-dev \
libstdc++6 libgtk2.0-dev libglib2.0-dev \
libsdl-console-dev libxv-dev pkg-config \
liblame-dev libmad0-dev libvorbis-dev \
libxml2-dev libxvidcore4-dev subversion

libmad0'a artık gerek yok ancak kurulmasında da bir sakınca yok.

Avidemux'un kaynak kod dosyalarını indirmek istediğiniz klasöre gidin. Subversion'un kurulu olduğundan emin olun. Eğer önceki adımı geçmişseniz durum iyi olmalıdır. Kararlı 2.4 kısmını veya kararsız 2.5 geliştirici kısmını kullanmayı seçebilirsiniz. Normal bir kullanıcı olarak konsolda şu komutu çalıştırın:

svn co svn://svn.berlios.de/avidemux/branches/avidemux_2.4_branch/

Artık Avidemux'un son sürümünün kaynak kod dosyalarını SVN depolarından, aktif klasörünüzdeki avidemux_2.x_kısım ('x' indirdiğiniz programın versiyonunu gösteriyor) klasörüne yüklediniz. Bu klasöre geçin ve şu komutları çalıştırarak yapılandırma betiğini oluşturun:

cd avidemux_2.x_branch #x --> indirdiğiniz programın versiyonu
make -f Makefile.dist

make kurduktan sonra şu komutu çalıştırın:

make

Şimdi avidemux_2.x_kısım/avidemux klasöründe avidemux2 isminde çalıştırılabilir bir dosya derlediniz. Bu Avidemux'un yeni versiyonu. Şimdi bunu çalıştırabilirsiniz veya başka istediğiniz bir yere de kurabilirsiniz.
Opsiyonel: make install
Tam anlamıyla işinizin bitmesi için şu komutu verin:

sudo make install

Red Hat'te derleme için genel prosedürleri izlemeniz yeterli olacaktır ancak eğer ./configure komutu esnasında bir problemle karşılaşırsanız, şu değişkeni kullanmayı deneyin:

--with-jsapi-include=/usr/local/include/js

Fedora Core 5 için yum'u kullanarak js ve js-devel'ı kurun:

yum install js js-devel

Sonra yapılandırmayı şu komutla çalıştırın:

--with-jsapi-include=/usr/include

SpiderMonkey'i derleme maddesine bakın.

Fedora'da jsapi SpiderMonkey'i derlerken sorunla karşılaşırsanız ./configure komutundan önce şunu deneyin:
export LD_LIBRARY_PATH="/path/to/libjs.so"

Slackware'de derleme için genel prosedürü izlersiniz ancak ./configure komutunda şuna ihtiyacınız var:

--with-jsapi-include=xxxx

Burada xxxx Spidermonkey'in kurulu olduğu klasörü gösteriyor. Spidermonkey'i kurmanın en kolay yolu Mozilla Slackware paketini kurmaktır. Bu, uygun js dosyalarını /usr/lib/mozilla-1.7.13/ gibi bir klasöre yükleyecektir.
Ek olarak, Mozilla klasöründeki *js* dosyaları klasör yolunuzda (örn. /usr/lib) olmalıdır, bu sayede çok kolayca onları oraya sembolik olarak bağlayacaktır. Bitti!
Bazı Slackware kullanıcıları GTK+'yla derleme hakkında problem bildirdiler. Onlara şu seçeneği denemelerini tavsiye ediyoruz. Bu yardım edecek gibi gözüküyor

./configure --without-libsdl

'make -f Makefile.dist' komutu esnasında aşağıdaki hatayı alırsanız:

aclocal:configure.in:117: warning: macro `AM_GNU_GETTEXT' not found in library
*** Creating configure
configure.in:117: error: possibly undefined macro: AM_GNU_GETTEXT

gettext-tools Slackware paketini kurmanız gerekiyor anlamına gelir.
'make install' komutu esnasında bir hatayla karşılaşırsanız:

/bin/sh @MKINSTALLDIRS@ /usr/local/share
/bin/sh: @MKINSTALLDIRS@: No such file or directory

aşağıdakini deneyin:

to be filled in

Buradaki bilgi SUSE'nin 10.1 versiyonuna özeldir, ancak öteki versiyonlarda da işe yarayabilir. Çekirdek 2.6.16'da test edildi ancak öteki versiyonlarda da çalışabilir.
SUSE'de genel derleme prosedürünü izlersiniz ancak ./configure komutunda şuna ihtiyacınız var:

--with-jsapi-include=/usr/include/js

Kullanmak istediğiniz kütüphanelerin BÜTÜN geliştirici RPM'lerini (paket_adi-devel) kurduğunuzdan emin olun, özellikle spider monkey'in.
64-bit kullanıcıları, derlemeye başlamadan önce şu komutu çalıştırmalılar:

 export LDFLAGS="-L/usr/X11R6/lib64"

Burada SVN'den edindiğiniz kaynak kodu Microsoft Windows'ta derleme anlatılmaktadır. Buradaki

Bu sayfa Avidemux'un "Preferences" penceresindeki ayarları anlatmaktadır.

Message level - Buradan Avidemux'taki ileti kutularının gösterilme oranını ayarlarsınız. Bu ayar, kullanıcıya en az iki seçenek sunan ve bu seçeneklerden birinin seçilmesini isteyen ileti kutularını etkilememektedir:
No alerts - hiçbir başarı veya başarısızlık bildirimi iletisi gösterilmez..
Display only error alerts - yalnızca sorun veya başarısızlık bildiren iletiler gösterilir.
Display all alerts - bütün iletiler gösterilir.
Swap marks A and B if A > B - Eğer A işaretçisi B işaretçisinden sonra bir yere konursa A ve B işaretçilerinin yerleri değişir.
Go to systray when encoding - Avidemux, kodlama başladığında kendisini sistem tepsisine küçültür, kodlama bittiğinde de eski yerine döner.

Automatically index MPEG files - Eğer gerekliyse MPEG dosyaları sorulmadan indekslenir. Ancak halen çoklu mpeg dosyalarının art arda eklenip eklenmeyeceği sorulacaktır.
Disable NuppelVideo resync - Varsayılan olarak Avidemux, nuv dosyalarının (ses PCM ise) sesini ve videosunu senkronize etmeye çalışacaktır. Bu seçenek seçilirse herhangi bir senkronizasyon işlemi yapılmayacaktır.
Use libavcodec MPEG decoder - Bu seçeneğin seçilmesi MPEG-1/MPEG-2 dosyalarını çözmek için mpeg2dec yerine libavcodec'in kullanılmasını sağlayacaktır. Bu ayar daha çok mpeg2dec'de HW hızlandırması sağlamayan işlemci mimarileri içindir. libavcodec MPEG-2 çözücüsü hatalı akımlarla çalışırken avantajlıdır, iyi bir hata gizleme mekanizması vardır (örneğin DVB kayıtlarındaki hatalar için).
Set Default Postprocessing Level - Kodlamadan sonra uygulanan bazı filtrelerin varsayılanları ayarlanır.

MPEG auto split (MB) - Büyük dosyaları kaydederken MPEG dosyalarının otomatik bölünmesinde her bir MPEG dosyasının olması gereken boyutu buradan ayarlayın.
Use OpenDML (don't split large AVI files) - Çıktı formatı AVI'yse dosyayı eski AVI yerine OpenDML formatında kaydeder. Çünkü eski AVI'nin dosya boyutu limiti vardır. Bu sayede 4 GB'dan büyük dosyaları bölmek zorunda kalmadan kaydedebileceksiniz.

Audio output:

Dummy: Herhangi bir ses aygıtı ayarlanmaz, bu yüzden sesler çalınamaz.
Win32: Windows ses sistemini kullan (yalnızca Windows'ta).
CoreAudio: CoreAudio ses sistemini kullan (yalnızca Mac OS X'te).
OSS: Open Sound System. Modern Linux sistemleri varsayılan olarak ALSA'yı kullanır, ancak OSS halen eski UNIX türevi sistemlerde kullanılabilir.
ARTS: Analog Real time synthesizer (aRts). KDE/Linux altında analog bir synthesizer'i simüle eden bir uygulama. aRts'ın ana bileşenlerinden biri gerçek zamanlı olarak çeşitli ses akımlarını karıştıran ses sunucusudur. aRtsd isimli bu ses sunucusu ("d" Daemon'dan [daemon = arkaplanda sürekli çalışan program] gelir) aynı zamanda KDE'nin standart ses sunucusudur. aRts'ın KDE'de kullanımı tavsiye edilir.
ALSA: Advanced Linux Sound Architecture. Linux'un yeni ses sistemidir (kernel modülüdür). Çoklu ses uygulamalarını ve akım karıştırmayı yönetir. KDE 3 için aRts ve GNOME için ESD daha iyi olmasına karşın Linux için genel anlamda tavsiye edilir.
Varsayılan ALSA aygıtı plughw:0,0'dır. Bu çalışmazsa hw:0'ı deneyin.
ESD: Enlightened Sound Daemon (ESD veya EsounD). Enlightenment ve GNOME için ses sunucusudur. Çeşitli ses akımlarını çıktı için birleştirir. Ayrıca açık-ağ seslerini de yönetebilir. GNOME için tavsiye edilir.
Local Playback Downmixing - Çeşitli ses ortamları için ses kanalı düşürme veya ses değişimini etkinleştirmeye yarar. Çok kanallı bir sesin Avidemux'ta çalınırken ses kanalı sayısının nasıl düşürüleceğini buradan ayarlarsınız. 5.1 hoparlör sisteminiz ve bu sistemi destekleyen ses aygıtınız varsa "no-downmixing" seçeneğini seçebilirsiniz. Diğer durumlarda çok kanallı sesin Dolby Pro Logic 1 veya 2'yle kanal sayısının düşürülmesi gerekir.
Volume bar controls:

PCM: Sisteminizin master olmayan sesi. Birçok program PCM sesini kontrol arayüzü olarak kullanır. Buradaki ayar sistemin tamamını etkilemeyecektir. Buradaki mevcut ayarı değiştirmemeniz genel olarak tavsiye edilir (Avidemux'un genel sistem sesini değiştirmek isterseniz bu ayarı değiştirin -ki böyle bir şeye nadiren ihtiyaç duyarsınız-). PCM genellikle karıştırıcınızdaki Wave kanalıdır.
Master: Sisteminizin master sesi. Bu ayar sisteminizdeki her uygulamayı etkileyecektir. Buradaki ayarı değiştirmeniz gerekebilir, ancak değiştirmemeniz de tehlikeli de değildir.

GTK+: Video çalımı için donanım hızlandırması kullanılmaz. Video, dalgalı veya pürüzlü çalınabilir. Mümkünse SDL yi veya daha iyi bir görüntü için Xvideo accel i seçin.
SDL accel: Video çalımını iyileştirmek için yazılımınız ve donanımınız arasında soyut bir yazılım katmanı sistemi kullanır. Avidemux'ta video çalımını düzgünleştirecek ve daha güvenilir bir çalışma ortamı sağlayacaktır. Bu seçenek hızlandırma sağlamayan normal GTK+'dan daha iyidir. Ancak mümkünse XVideo accel i kullanmanız daha iyidir.
XVideo accel: Video çalımını iyileştirmek için sistem video ortamının kendisini kullanır (donanımı değil). Avidemux'ta video çalımını düzgünleştirecek ve daha güvenilir bir çalışma ortamı sağlayacaktır. Eğer bu seçenek varsa bu seçeneği seçin.

Video frame'leri oluşturulduktan sonra postprocessing işlemi uygulanır. Bazı kullanıcılar interlacing ve noise gibi filtreler başta olmak üzere daha karmaşık işlemleri engellediği gerekçesiyle bu seçeneklerin tamamının pasifleştirilmesini önermektedirler.

Horizontal Deblocking: Bozuk video piksel blokları için yatay minimal denetim etkinleştirilir.
Vertical Deblocking: Bozuk video piksel blokları için dikey minimal denetim etkinleştirilir.
Deringing: Videodaki kenar çizgileri etrafındaki göze çarpmayan renk bozulma daireleri için minimal denetim etkinleştirilir.

Multithreading işlemci teknolojisi sayfasına bakın.

Bu sayfa B-frame işlemeye giriş niteliğindedir. B-frame'lere aşinaysanız bu sayfayı atlayabilirsiniz.
Video frame'leri 3 türe ayrılabilir:

I-Frame: Intra frame veya keyframe olarak da bilinirler; referans frame'leri yoktur ve tek başlarına çözülürler; JPEG resimleri gibi düşünülebilirler.
P-Frame: Predicted frame'in (tahmin edilen frame) kısaltılmışıdır. Dosyada tam anlamıyla saklı değildirler. Çözülme işlemi esnasında kendinden hemen önce gelen frame'e (I veya P) göre inşa edilirler; çözülmesi için öncelikle kendinden önceki frame'in çözülmüş olması gerekir.
B-Frame: Kendinden önceki ve sonraki frame'lere (I-P) göre inşa edilirler. Başka frame'ler için referans frame'i olamazlar.
B-frame'ler iki bakımdan ilginçtir. İlk olarak biraz daha iyi tahmine sahiptirler. İkinci ve önemli olan ise -referans frame'i olamadıkları için- kendinden sonra gelen frame'lerin kalitesini etkilemezler, bu sayede diğer frame'leri etkilemeden düşük kaliteyle kodlanabilirler.
B-frame'ler hem önceki, hem de sonraki resme bağlı olduklarından, çözücünün çözme işlemine başlaması için ilgili frame'den sonraki frame'i de (I-P) bilmesi gerekir. Bu noktada PTS/DTS sistemi devreye girer.
Presentation Time Stamp (PTS - Görüntülenme Zamanı Damgası) görüntülenme zamanıyla ilgilenir, her bir frame'in tam olarak kaçıncı sırada gösterileceği bilgisini PTS tutar. Decoder Time Stamp (DTS - Çözülme Zamanı Damgası) ise frame'lerin çözülme zamanıyla ilgilenir.
Şöyle kısa bir videoya sahip olduğumuzu varsayalım:
I-0 B-1 B-2 P-3 
Buradaki harfler normal frame'leri, sayılar ise PTS'in tuttuğu gösterim zamanı damgalarını temsil ediyor. Buradaki B-1 ve B-2 hem I-0'a hem de P-3'e bağlıdır (bir B-frame başka bir frame'in referans frame'i olamaz). Bu videonun DTS sırası şöyledir:
I-0 P-3 B-1 B-2 
Yani daha önce çözülmesi gereken frame'ler daha öne getiriliyor. Dosyalar PTS sırasıyla değil DTS sırasıyla kodlanır.
İşte burada aklımıza bir soru takılıyor. Frame'ler DTS sırasıyla kodlandığına göre çözücü frame'leri nasıl düzgün sırada gösterecek? Normalde içinde B-frame olmayan videoları açmak kolaydır. Çözücü bir frame'i alır, aldığı frame bir P-frame ise önceki frame'den inşa eder, sonra bu frame'i çıktıya verir. Halbuki içinde B-frame olan dosyalarda çözücü aldığı her frame'i direkt olarak çıktıya vermeye kalksa frame'ler DTS sırasıyla  (PTS sırasıyla değil) gösterileceği için frame'ler yanlış sırayla gösterilecektir. Bu sorunu çözmenin iki farklı yöntemi vardır:
1. MPEG yöntemi
Bu yöntemde yapılan şey gösterilen (çıktı) frame'lerin 3 frame miktarında geciktirilmesidir. Şimdi bu durumu hayalimizde canlandıralım:
   Çözülen frame: 0 3 1 2 - - -
Gösterilen frame: - - - 0 1 2 3
Burada ilk üç frame okunur ama çözücü herhangi bir çıktı vermez. Dördüncü frame'i okuduğunda birinci sırada gösterilmesi gereken frame'i gösterir. Bütün frame'ler bu mantıkla çözülüp gösterilirken çözücünün elinde daima ilgili zamanda gösterilecek frame çözülmüş halde hazır bulunacağından frame'ler düzgün sırada gösterilir. Çözücü hangi frame'in hangi sırada gösterileceğini ilgili frame'in PTS damgasından anlar.
2. DivX yöntemi
Az önceki akımları anlamayan uygulamalarla PTS/DTS'i kullanmak için DivX kodeki (ve uyumluluk modunda Xvid) farklı bir hile kullanır.
Bu yöntemde PB frame'lerin biraz değişiği kullanılır ve birden fazla frame tek bir frame olarak paketlenir. Uygulama paketlenmiş frame'leri tek bir frame olarak görür. Uygulamanın böyle görmesini kodek sağlar.
Az önceki örneği göz önüne alırsak DivX şöyle bir dosya üretir, () arasındaki frame'leri uygulama tek bir frame olarak görür:
   Çözülen frame: (0 3 1 2) - - - 
Gösterilen frame: 0 1 2 3
Paketlenen frame'lerin yerlerine null frame'ler konur. Kodek, paketlenmiş bir frame'den sonra null frame geldiğini görürse o paketteki frame'leri çıkaracağını anlayacaktır.
Olaya programcı gözüyle bakacak olursak giriş ve çıkış arasında bir gecikme olmaması ve AVI dosyalarının, çözücüyü/oynatıcıyı özel durum hakkında bilgilendirmek için PTS/DTS bileşenlerine sahip olmaması ilginçtir. İlk yöntemin aksine, ikinci yöntemde çözücünün hiçbir rolü yoktur, bütün işi kodek yapar.
Her iki yöntem Avidemux'un frame doğruluğu ilkesine terstir. MPEG yönteminde giren ve çıkan frame'ler arasında gecikme vardır. Bu Avidemux kullanıcısı için kabul edilemezdir. Çünkü Avidemux kullanıcısı tam olarak hangi frame'i işlediğini bilmelidir. DivX/Xvid yönteminde ise 2, 3, 4. frame'ler aslında null olmadığı halde null gibi gözükmektedir. Bu da Avidemux'un frame doğruluğu ilkesine terstir.
Neyse ki Avidemux PTS/DTS sistemiyle tek başına baş eder, ve kodekten frame'leri direkt olarak çıkarmasını zorlar. Avidemux'un editör kısmı frame'lerin DTS/PTS sırasını bilir ve çözücüye doğru frame'leri getirir. Avidemux sayesinde B-frame'leri kendi konumunda görürsünüz.
DivX ve Xvid frame'leri paketleyerek frame'lerin türünün gözükmesini engellerler. Avidemux 2.0.24 ve daha üstü sürümlerinde bu sorunu yükleme esnasında paketlenmiş akımı açarak çözer. Ancak bu durum yalnızca AVI/OpenDML için geçerlidir, eğer kaynak OGM ise önce OGM'yi AVI olarak kaydedip sonra bu AVI'yi açın.

I-frame'ler - I-frame'ler ve dijital video dünyasında rolleri.

Bu sayfa videonuzun bağımsız MPEG-4 DVD çalıcılarda (DivX onaylı veya değil) oynatılabilmesi için ne yapmanız gerektiğini anlatmaktadır.

B-frame'ler iyidir ancak bir frame'lik bir gecikmeye neden olurlar, çünkü B-frame'lerin çözülebilmesi için hem kendinden önce, hem de kendinden sonra gelen I/P frame'in çözülmüş olması gerekir. Bu yüzden b-frame'ler VFW (Video for Windows) ile pek uyumlu çalışamazlar. Çünkü VFW, bir frame alır, bir frame verir. Bu sorunu çözmek için DivX Şirketi AVI'de PB frame'leri icat etmiştir. Bu konunun ayrıntısını öğrenmek için B-frame'ler sayfasını okuyun. Ancak basit olarak anlatmak gerekirse bu yöntemde hem P hem de B frame'i içeren bir frame'den sonra kodlanmamış bir resim eklenir. Bu yöntem, yapay ek bir frame ürettiği için bazı oynatıcılar, bu yöntemle oluşturulmuş videoları çalarken büyük veya küçük takılmalar yaşayabilmektedir. Ayrıca bunun tespit edilebilmesi için MPEG-4 akımının kullanıcı veri bölümüne özel bir işaretçi de konulmaktadır. Bazı oynatıcılar bu bilgiyi paketlenmiş frame moduna geçmek için kullanmaktadırlar, ancak bu %100 güvenilir değildir. Ayrıca akım da %100 ISO uyumlu değildir.

Kural 1: Paketlenmiş frame'leri kullanmayın. Avidemux'la zaten paketlenmiş frame üretemezsiniz ancak başka yazılımlar üretebilir.
Kural 2: Eğer elinize içinde paketlenmiş frame olan bir video geçerse frame'leri paketten çıkartın. Bunu yapmak için, Avidemux ilgili frame'leri çıkarıp çıkarmayacağınızı sorduğunda "yes" deyin. Avidemux, her frame'i alacak ve her bir frame'in içinde başka frame'ler olup olmadığını bulmaya çalışacaktır. Bulduğunda paketlenmiş frame'leri paketten çıkaracak ve karşılığı olan kodlanmamış frame'leri silecektir. Ancak henüz kullanıcı verisindeki işaretçi kalacaktır. Bunu da silmek için çıktı formatı olarak normal "AVI" yerine "AVI, unp. VOP"u seçip videoyu kaydedin. Bunun sonucunda işaretçi taranıp düzeltilecek ve akım "paketlenmemiş" olacaktır. Bu işlem bütün DivX ile kodlanmış paketli videoların sorununu çözer, ancak bazı Xvid ile kodlanmış videoların sorunlarını çözemeyebilir.
Uyarı: Eğer dosyanın VBR sesi varsa, dosyayı açtıktan sonra "Audio->Build VBR Time Map" yapmayı unutmayın.
Eğer yukarıda anlatılanı birçok dosyaya uygulamak istiyorsanız şöyle bir betik kullanabilirsiniz:

#!/bin/bash
export SRC=/tmp/fma2
export TGT=/tmp/fma3
perl foreach.pl $SRC/*.avi "avidemux2 \
--force-unpack  --load $SRC/%f  \
--audio-map  --save-unpacked-vop \
$TGT/fixed_%f --quit"

Xvid ve libavcodec MPEG-4, DivX'ten daha eksiksiz olan GMC ve Qpel modelllerini kullanabilir. Bunları kullanırken videoyu yeniden kodlamak ve aynı boyutu korumak için 2-pass kullanmalısınız. Ancak 1-pass'i kullanarak da hemen hemen aynı boyutu elde etmenin bir yolu vardır. Videonun doğru yapıldığını var sayarsak, önceki kodlama zaten quantizer ve bit oranlarını belirli bir boyutta iyi bir kalite elde etmek için dağıtmıştır. Haydi bu bilgiyi yeniden kullanalım!
Bunu yapmak için Xvid (veya libavcodec MPEG-4)'ü "Same Qz as input" modunu kullanacak şekilde ayarlayın. Bu modda her bir frame daha önce kullanılan quantizer ile kodlanacaktır. Sonuçta orijinaliyle hemen hemen aynı boyutta/kalitede video elde edilmekte ama 1-pass kullanılmaktadır.
Bu işlem ayrıca komut satırında da (tek seferde birden fazla video işlemek için) yapılabilir:

#!/bin/bash
export SRC=/tmp/fma2
export TGT=/tmp/fma3
perl foreach.pl $SRC/*.avi "avidemux2 \
--force-unpack  --load $SRC/%f \
--audio-map  --video-process --video-codec xvid4 \
--video-conf follow=1000  --save $ TGT/fixed_%f \
--quit"

Nandub'un bazı versiyonları gibi bazı yazılımların ses ve videoyu doğru birleştiremediklerini fark ettim. Bu sorun, takılma ve donmaya neden oluyor. Çözüm basit: dosyayı Avidemux'la açıp kaydedin.

Bu sayfa Avidemux'la nasıl betik kullanılacağını anlatmaktadır.
Avidemux'un kullandığı betik motoru SpiderMonkey'dir, ve SpiderMonkey bir ECMAScript/JavaScript motorudur. Bu sayfada bir klasörün içindeki bütün video dosyalarının paketlenmiş frame'lerini paketlerden çıkaran basit bir betik yazacağız.

Aşağıdaki iki satır hemen hemen bütün Avidemux betiklerinin ilk iki satırıdır:

//AD  <-
  var app = new Avidemux();

İlk satır Avidemux'un dosyayı tanıması içindir ve her Avidemux betiğinde bulunmalıdır (en azından ilk dört karakter: //AD).
İkinci satırda Avidemux sınıfı türünden bir nesne oluşturulur. Hemen hemen bütün Avidemux fonksiyonlarına bu nesne üzerinden ulaşılır. Bu örneğimizde nesnenin adı "app"dır. Nesneye istediğiniz ismi verebilirsiniz.

Şimdi bazı değişkenler tanımlayacağız ve kaynak ve hedef klasörleri belirleyeceğiz.

//AD  <-
/*
      orgDir klasörünü tarayıp
      AVI dosyalarının paketlenmiş frame'lerinin paketlerini çıkaran basit bir betik
      Sonuçta üretilen dosya destDir klasörüne koyuluyor
 
      Yeni directorySearch API'si kullanılıyor
 
*/
var app = new Avidemux();
var ds = new DirectorySearch();
var orgDir;
var destDir;
var reg =new RegExp(".$");
/*
      Bu Unix için.
      Windows için sep="\\"; yazın
*/
var sep="/";
var extension;
var target;

Eğer betiğinizdeki dosya yollarını direkt kullanıyorsanız son / işaretini silmeyi unutmayın. Yani /dosya/bar/ yerine /dosya/bar olması gerekiyor.
Haydi şimdi kaynak ve hedef klasörleri kullanıcıdan isteyelim. Bunu yapmak için kullanıcıdan dosya isteyeceğiz ama bu dosyanın sadece klasör kısmını saklayacağız.

orgDir=fileReadSelect();
destDir=fileWriteSelect();
orgDir=pathOnly(orgDir);
destDir=pathOnly(destDir);
orgDir=orgDir.replace(reg,"");
destDir=destDir.replace(reg,"");    

Bu kodda sondaki / veya \ işaretini silmek için reg düzenli ifadesini kullandık.

Şimdi klasörler belirlendi, şimdi bu klasörlerin içine bakabiliriz. Şimdi ilgili dosyaları alalım:

if(ds.Init(orgDir))
{
 // Sadece istediğimiz (AVI) dosyaları işlemek için
  if(!ds.isNotFile && !ds.isDirectory && !ds.isHidden && !ds.isArchive && !ds.isSingleDot && !ds.isDoubleDot)
      {
          extension=ds.GetExtension();
          if(extension == "avi")
          {
              target=ds.GetFileName();
              target=destDir+sep+target;
              processFile(orgDir+sep+ds.GetFileName(),target);
              }
      }

Şimdi sadece klasör olmayan ve avi uzantısına sahip dosyalara sahibiz, diğerlerini eledik. Elbetteki ihtiyaçlarınıza göre uzantıyı değiştirebilirsiniz. Şimdi ise sırada yolu silmek için reg2 düzenli ifadesini kullanmak var.
Eğer kaynak dosya /dump/icinde oldugunuz klasor/foo.avi, ve hedef klasör /tmp ise aşağıdaki meydana gelir:
target=foo.avi
target=/tmp +/+foo.avi=/tmp/foo.avi
Bir sonraki işlem hedef klasörü başa eklemek ve kaynak ve hedef dosyayla işleme dosyasını çağırmaktır.
Örnek:
source=/dump/icinde_oldugunuz_klasor +/+foo.avi=/dump/icinde_oldugunuz_klasor/foo.avi
target=/tmp+/+foo.avi=/tmp/foo.avi

Ana döngümüz bitti. Şimdi asıl işi yapan fonksiyona geliyoruz. Fonksiyonumuz her bir dosyayı işleyecek ve ana döngümüz tarafından her bir dosya için çağrılacak.

function processFile(filename, targetfile)
{
      // Dosyayı çağırma
      app.forceUnpack();
      app.load(filename);
      app.rebuildIndex();
      app.audio.delay=0;
      app.audio.mixer("NONE");
      app.audio.scanVBR();
      app.setContainer("AVI_UNP");
      app.save(targetfile);
      return 1;
}

Burada paketlenmiş bit akımlarını yok etmek için forceunpack ve sesin VBR MP3 olması ihtimalini göz önünde bulundurarak scanVBR fonksiyonlarını çağırdık. Daha sonra çıktı formatını AVI_UNP olarak belirledik ve kaydetmeyi tamamladık.
Elbetteki bu basit bir örnek. Eğer bir dosyayı işlemiş ve aynı işlemlerin bir dosya grubuna da yapılmasını istiyorsanız şunları yapın:

Dosyada istediğiniz değişiklikleri yapın
Projeyi kaydedin. (örnek: /tmp/prj.js)
/tmp/prj.js dosyasının içeriğini processFile fonksiyonunun içine kopyalayıp yapıştırın
filename ve targetfile'ı kaynak ve hedef dosyalar olacak şekilde değiştirin.
Burada ses ve video filtreleri ekleyebilme, kodeği değiştirebilme gibi birçok yapabileceğiniz şey vardır.

Bütün betik şunun gibi gözükür:

//AD  <-
/*
      orgDir klasörünü tarayıp
      AVI dosyalarının paketlenmiş frame'lerinin paketlerini çıkaran basit bir betik
      Sonuçta üretilen dosya destDir klasörüne koyuluyor
      Yeni directorySearch API'si kullanılıyor
*/
var app = new Avidemux();
var ds = new DirectorySearch();
var orgDir;
var destDir;
var reg =new RegExp(".$");
/*
      Bu Unix için
      Windows için sep="\\"; koyun
      reg2=new RegExp("\\.*\\");
*/
var sep="/";
var reg2 =new RegExp("\/.*\/");
var extension;
var target;
//
//
//
//      kaynak ve hedef klasörlerden dosyaları seçme
//
      orgDir=fileReadSelect();
      destDir=fileWriteSelect();
      orgDir=pathOnly(orgDir);
      destDir=pathOnly(destDir);
//
//      son \\ veya // karakter dizisini silme
//
      orgDir=orgDir.replace(reg,"");
      destDir=destDir.replace(reg,"");
      print("orgDir : <"+orgDir+">");
      print("destDir : <"+destDir+">");
//
// Başlıyoruz
//
if(ds.Init(orgDir))
{
  while(ds.NextFile())
  {
      // Yalnızca istediğimiz (AVI) dosyaları işleme
      if(!ds.isNotFile && !ds.isDirectory && !ds.isHidden && !ds.isArchive && !ds.isSingleDot && !ds.isDoubleDot)
      {
          extension=ds.GetExtension();
          if(extension == "avi")
          {
              target=ds.GetFileName();
              target=destDir+sep+target;
              print("***"+ds.GetFileName()+"-->"+target);
              processFile(orgDir+sep+ds.GetFileName(),target);
              }
          //print("File: "+ds.GetFileName()+" is "+ds.GetFileSize()+" bytes, extension "+extension);
      }
  }
  print("We just searched in directory \"" + ds.GetFileDirectory() + "\"");
  ds.Close();
}
else
  displayError("Error initializing the directory search");
displayInfo("Finished !");
function processFile(filename, targetfile)
{
      // Load the file
      app.forceUnpack();
      app.load(filename);
      app.rebuildIndex();
      app.audio.delay=0;
      app.audio.mixer("NONE");
      app.audio.scanVBR();
      app.setContainer("AVI_UNP");
      app.save(targetfile);
      return 1;
}

Betik yazımı

Avidemux 2.1 sürümünden beri betik yönetimi için SpiderMonkey ECMAScript dilini kullanır. Proje dosyaları ECMAScript tabanlıdır.
Özel betiklerinizi üretmek için ECMAScript'i kullanabilirsiniz. Bu sayfa Avidemux komutlarını anlatacaktır.

Dikkat edeceğiniz ilk şey bir Avidemux ECMAScript projesinin "//AD" ile başlamasıdır. Örneğin şunun gibi:

//AD
//--automatically built--
//--Project: /tmp/l.js
var app = new Avidemux();

Muhtemelen Avidemux sınıfının bir nesnesini yaratmak isteyeceksiniz, bu nesne sayesinde dahili Avidemux fonksiyonlarına erişebileceksiniz.
Bu işlem new Avidemux() komutuyla yapılmaktadır. Artık bütün örneklerde app değişkeni nesneyi temsil ediyor.
Uyarı: Sayı olmayan parametrelerin çoğu çift parantez arasına alınmalıdır.
Bir proje dosyası kaydedip bu dosyayı özel betiklerimiz için başlangıç noktası kabul etmek genel anlamda iyi bir fikirdir.

Betiğimizin standart baş kısmını yazdıktan sonra (baş kısmını yukarıda yazmıştık) bütün fonksiyonları tanımladığımız değişkenin sonuna '.' (nokta) işareti koyarak çağırabiliriz. Örneğin, var app = new Avidemux(); satırı sayesinde artık app.fonksiyon satırını kullanabiliriz. Buradaki fonksiyon çağırmak istediğimiz fonksiyonun adıdır. Avidemux'taki bütün fonksiyonları listelemek için bu sayfanın sonraki bölümlerine bakın.
Bazı örnek fonksiyon çağrıları:

app.load("/home/user/Video.mpg.idx");
app.clearSegments();
app.addSegment(0,0,20084);
app.markerA=4898;
app.markerB=4902;
app.video.addFilter("crop","left=10","right=0","top=4","bottom=4");
app.video.addFilter("resize","w=704","h=468","algo=0");
app.video.addFilter("fluxsmooth","temporal_threshold=7","spatial_threshold=7");

Buradaki komutlar Avidemux sınıfının parçası değildir. Direkt olarak (nesne oluşturmadan) erişilebilirler.

Ayrıca değiştirmek isteyebileceğiniz iki değişken daha vardır: 

markA: A işaretçisi ayarlanır (örn: app.markA=100; A işaretçisini 100. frame'e koyar)
markB: B işaretçisi ayarlanır

Eğer nesne app=new Avidemux() ile oluşturulmuşsa yukarıdaki gibi değiştirebileceğiniz iki değişken daha var demektir. Bunlara  app.audio.xxx=yyy ile erişebilirsiniz:

normalize: 1 (normalize aktifleştirilir), 0 (aktifleştirilmez)
downsample: downsample yapılır (48 kHz 44.1 kHz'e düşürülür)
resample: yeni frekans ayarlanır
delay: ms cinsinden gecikme ayarlanır
film2pal: 1 (film2pal aktifleştirilir), 0 (aktifleştirilmez)
mono2stereo: mono stereo'ya dönüştürülür

Betik dilini kullanma kılavuzu

LoRd_MuldeR tarafından oluşturulmuş interaktif ve yönergeleri adım adım anlatan bir rehber http://mulder.dummwiedeutsch.de/etc/adm_wink/avi2dvd.htm adresinde mevcuttur (Flash gereklidir).

Şimdi isterseniz derine dalmadan önce bazı bilgileri hatırlayalım.

Avidemux sizin için MPEG dosyasını oluşturur.
MPEG'i DVD dosya hiyerarşisine dönüştürmek için bir DVD yazma programına ihtiyacınız var. Bu programlardan çoğu dvdauthor'u kullanıyor. Örneğin Varsha, KDvdAuthor ve benzerlerinin hepsi dvdauthor'u kullanıyor.

Auto->DVD menü yolunu izleyin. Bu sayede ayarların birçoğu mantıklı varsayılanlarla ayarlanacaktır.
Sizin yapmanız gereken tek şey video kodeğini 2pass modu ile ayarlamanız ve istenen final boyutunu girmenizdir.

DVD'yle uyumlu olması için çözünürlük şöyle olmalıdır:

NTSC için 352*480 veya 720*480 veya 704*480
PAL/SECAM için 352*576 veya 720*576 veya 704*576
Bir videonun PAL mı, yoksa NTSC mi olduğunu nasıl anlarım?
Info butonuna tıklayın (veya File->Properties menü yolunu izleyin). Eğer "Frame Rate" alanı 25 ise video PAL veya SECAM'dır. Eğer 23.976 veya 29.97 ise bu bir NTSC'dir.
Eğer bu değerlerden biri değilse PAL veya NTSC'nin frame oranını elde etmek için Resample fps filtresini kullanmanız gerekiyor demektir.
Şimdi videonun tipini belirlediniz, şimdi videoyu düzgün genişlik/yüksekliğe getirmelisiniz. Bunu yapmanın en kolay yolu "Video Filter Manager" penceresindeki "DVD res" butonunu kullanmaktır, bu sayede video DVD için uygun en-boy boyutlarına getirilecektir.
Uyarı: Boyutu gözü kapalı 720*480 ve benzeri olarak ayarlayamazsınız. Boyutu düzgün ayarlayabilmek için en-boy oranını hesaba katmalısınız. En-boy oranı PAL veya NTSC ile aynı değilse en iyi çözüm "DVD res"i kullanmaktır.

Avidemux'ta DVD'ye uyumlu iki kodek ailesi vardır: "DVD (lavc)" libavcodec'i, "DVD" libmpeg2enc'i kullanır. Her ikisinin de artıları ve eksileri vardır:

DVD (lavc): Daha hızlıdır, iyidir, DVD için, yalnızca 2-pass modunda kullanılabilir.
DVD: Daha yavaştır, iyidir, CQ veya CBR modunda gönül rahatlığıyla kullanılabilir.
DVD için, toplam bit oranı 9.8 Mb/s'ın altında olmalıdır. Yani basit olarak anlatmak gerekirse bit oranının maksimum 9 Mb civarında olduğu bir video iyidir. DVD (lavc)'ı 2-pass moduyla kullanıyorsanız sadece videonun (ses olmadan) final boyutunu girmelisiniz. Bunun için önce hesaplayıcıyı kullanırsınız, hesaplayıcı final boyutundan video boyutunu hesaplayacaktır.

DVD için, ses 48 kHz ve aşağıdakilerden biri olmalıdır:

AC3 (FFmpeg AC3)
MP2 (FFmpeg MP2 veya TwoLAME)
LPCM (WAV LPCM)
Eğer kaynak videodaki ses DVD'ye uyumluysa en iyi yol sesi olduğu gibi (Copy modunda) kullanmaktır. Ancak yine de sesi istediğiniz bir formata değiştirebilirsiniz (benim favorim TwoLAME).
Ses filtreleriyle oynamaktan çekinmeyin. Gerekliyse kanal sayısını düşürün. Sesin 48 kHz olması gerektiğini unutmayın. Gerekliyse resampling'i değiştirin.
Örnek bir ses seçimi şöyledir: kanal sayısı: Dolby Prologic 2; resampling: 48 kHz; kodlayıcı: TwoLAME; bit oranı: 160kb/s.

İstediğiniz sesi seçtiniz ve herhangi bir alt yazı ayarlamadıysanız en iyi çıktı formatı seçimi "MPEG PS A+V"dir. Bunu format menüsünü kullanarak ayarlarsınız. Sonuçta üretilen MPEG dosyası DVD'ye yazılmaya uygun olacaktır. "Save" butonuna basın ve dosya.mpeg dosyanızı elde edin. Artık bu dosyayı herhangi bir DVD yazma programıyla DVD'ye yazabilirsiniz.

Videonun sesini çok kanallı yapmak biraz daha farklıdır, ancak karmaşık değildir. Öncelikle sesi Audio->Save menü yolunu izleyerek kaydedin, (elbette ki daha önce yukarıda anlattıklarımızdan gerekli olanları yapın.) Sonuçta dosya_1.mp2 gibi bir dosya elde edeceksiniz.
Ses parçasını Audio->Main Track yolunu izleyerek dönüştürmek istediğiniz bütün parçalara aynı işlemi uygulayın. Sonuçta dosya_1.mp2, dosya_2.mp2 gibi dosyalar elde edeceksiniz.
Şimdi çıktı kapsayıcısı olarak "MPEG video"yu seçin ve "Save" butonuna basın, dosya.m2v gibi bir dosya elde edeceksiniz.
Bütün dosyaları elde ettikten sonra MPEG dosyasını üretmek için mplex'i çalıştırabiliriz. Söz dizimi şöyledir:
mplex -f 9 -i final.mpg foo.m2v foo_1.mp2 foo_2.mp2
Ses dosyalarının sayısını artırabilirsiniz. Sonuçta üretilen dosya.mpg DVD'ye uyumlu olacaktır.

Bu sayfa, bir MPEG-1 veya MPEG-2 DVD dosyasının bir AVI dosyasının içindeki MPEG-4 ASP videosuna dönüşümünü anlatacaktır. MPEG-4 ASP videosu genellikle yanlış bir biçimde "DivX" veya "Xvid" olarak adlandırılır - bu yanlış adlandırma hakkında daha fazla bilgi için Yaygın efsaneler sayfasına bakın.
İnternetten indirebileceğiniz, MEncoder gibi araçları kullanarak DVD'leri MPEG-4 AVI'ye dönüştüren çeşitli programlar vardır. Avidemux ve bu programlar arasındaki fark Avidemux'un videoyu dönüştürmeden önce videoda değişiklik yapmaya ve ne yaptığınızı anlamanız için görsel kontrole imkan vermesidir.

m1v, MPEG-1 videosu anlamına gelir. Sadece basit video akımı (Elemantary Stream) içerir, ses içermez.
m2v MPEG-2 videosu anlamına gelir.
mpg, video ve ses akımlarının birleştirilmesiyle elde edilen program akımıdır.
vob; video, ses ve diğer ek bilgileri içeren DVD sistem akımıdır, tıpkı mpg gibi bu da program akımıdır.
vdr, video ve ses(ler) içeren taşıma akımıdır (Transport Stream). Avidemux'ta desteklenir ancak senkronizasyon düzeltme yapılmaz.

mplayer dvd://1 -dumpstream -dumpfile rippeddvd.vob
Bu komut aktif klasörde rippeddvd.vob isminde bir dosya oluşturacaktır. Bu dosya Avidemux'la, MPEG formatında, içerisindeki bütün ses akımlarıyla birlikte açılabilir. Ayrıca modern dağıtımlar konsolda komut yazmaya gerek kalmadan, dosya yöneticisini kullanarak DVD'deki istediğiniz *.vob dosyasını istediğiniz bir klasöre kopyalama imkanı da vermektedirler.

Avidemux'ta rippeddvd.vob dosyasını araç çubuğundaki "Open" butonuna basarak veya "File->Open" menü yolunu izleyerek açın.
Şimdi karşınıza içinde ses akımı seçenekleri olan bir açılır listeli iletişim kutusu açılacaktır. Burada videonuzda kullanmak istediğiniz sesi DVD'deki sesler arasından seçersiniz. Genelde varsayılan seçenek veya listedeki ilk seçenek en iyi seçimdir. MPEG'i indekslemeye başlamak için "OK"e basın. Bu işlem bilgisayarınızın hızına bağlı olarak birkaç dakika sürebilir.
Not: Avidemux normalde MPEG akımlarını okuyamaz. İndeskleme sonucunda MPEG akımı indeks dosyası oluşur ve bu sayede Avidemux ilgili MPEG'i okuyabilecek hale gelir. MPEG akımı indeks dosyası, MPEG dosyasının tanım bilgilerinin ve akımdaki bütün frame'lerin yerlerinin tutulduğu düz bir metin dosyadır. Bu dosya Avidemux'un herhangi bir frame'e direkt olarak erişebilmesine ve frame doğruluğunu korumasına imkan verir.

Bazı DVD'ler 23.976 fps ile kodlanırlar, bunlara FILM denir, sinema filmlerinin çoğu bunu kullanır. Diğer bazıları ise 29.96 fps ile kodlanırlar, bunlara NTSC denir, televizyon dizilerinin çoğu bunu kullanır. FILM DVD'lerde, DVD oynatıcı filmi çalım esnasında NTSC'ye dönüştürür. Yani MPEG başlığı her zaman 29.96'yı gösterir, 29.96 her zaman son oynatılan fps'tir.
Avidemux MPEG akımlarını çözmek için bazı yerleri yamalanmış mpeg2dec'i kullanır. mpeg2dec, FILM'den NTSC'ye dönüşüm yapmaz (zaten de yapmaması iyidir).
Yani Avidemux hangi videonun FILM, hangisinin NTSC olduğunu söyleyemez. Eğer MPEG progresif (interlace modunda olmayan) gözüküyorsa ve bariz senkronizasyon problemi varsa, Video->Frame Rate yolunu izleyerek değeri 23.976'ya ayarlayın.
PAL MPEG için herhangi bir problem yoktur, PAL MPEG daima 25 fps'tir.
Eğer ses sunulmuşsa Avidemux, videonun 23.976 olup olmadığını ses ve video sürelerini karşılaştırarak bulmaya çalışacaktır.

Kırpma işlemi, widescreen'e göre hazırlanmış DVD'lerdeki üst ve alt kısımlardaki siyah çerçeveleri yok eder. Bu sayede asıl resim bilgisi kodlanırken daha fazla verinin kullanılması sağlanır. Kırpma olmadan keskin sınırlar, bu bölgelerdeki resim kalitesini belirgin bir şekilde düşürür. MPEG tabanlı kodekler bunlarla iyi uğraşamaz. Daima bütün kenar çizgilerini sildiğinizden emin olun (yarı siyah olsalar veya tek renk olmasalar bile).

Videoyu kırpmak için video filtrelerini kullanmalıyız. Ancak filtre seçmeden önce aşağıdaki sürgü çubuğunu kullanarak videonun ortasında bir nokta seçin. Çünkü otomatik kırpma özelliği kırpmayı aktif frame'e göre ayarlayacaktır.
Şimdi videonun "Filters" butonuna basın. Bu sayede ekrana video filtrelerinin listelendiği bir pencere gelecektir.
Transform -> Crop filtresini ekleyin.
Şimdi "AutoCrop" butonuna tıklayın. Şimdi videodaki siyah bölgeler yeşil olarak gösterilecektir. Bu yeşil bölgeler kırpılacaktır.
Eğer kırpılmayı onaylıyorsanız "OK" butonuna tıklayın ve video filtreleri penceresini kapatın.

Videoyu daha küçük olacak şekilde yeniden boyutlandırmak isteyebilirsiniz. Daha düşük çözünürlük daha yüksek bit/piksel oranı demektir, bu sayede daha düşük bit oranlarında kalite artabilir. Bu duruma MPEG-4'te sıkça rastlanır.
AVI dosyaları en-boy oranı bilgisini saklamaz, ancak MPEG-4 akımında saklanabilir. Yani doğru en-boy oranını elde etmek için kırptıktan sonra videoyu yeniden boyutlandırmalısınız. En-boy oranı bir pikselin şeklidir. PC'de bu şekil genelde karedir, ancak DVD'de 4:3 veya 16:9 olabilir.
Şimdi video filtreleri penceresini yeniden açın.

Transform -> Resize filtresini açın.
Açılan pencerede girdi en-boy oranını (16:9, DVD'ler için en yaygın olandır) ve çıktı en-boy oranını (AVI için 1:1) belirtin.
Sonra boyutlandırma yöntemini seçin – bilinear, bicubic veya lanczos kadar keskin değildir, ancak daha çok sıkıştırma imkanı sağlar. Aslında bu durum bit oranına (daha keskin yöntemler daha fazla bit oranı gerektirir), kaynak videonun sıkıştırılabilirliğine ve kişisel tercihlerinize (bazı insanlar sıkıştırma kaynaklı -yuvarlaklaşma gibi- bozulmalar daha fazla olmasına rağmen daha keskin videoyu tercih ederler) bağlıdır.
Son genişlik ve yüksekliğin 16'nın katı olduğundan emin olmak için "Round to the Nearest Multiple of 16" onay kutusunu işaretleyebilirsiniz.
Sonra sürgüyü istediğiniz genişliği elde edene dek sürükleyin.

Kaynağa bağlı olarak daha fazla filtre eklemek isteyebilirsiniz (subtitler, denoise, deinterlace, IVTC vb.).
Bu noktada video, her türlü düzenleme/kesme işlemleri için hazırdır.

Şimdi açılır listeden video kodlayıcısını seçin. Avidemux tarafından desteklenen iki MPEG-4 kodlayıcısı Xvid ve FFmpeg (libavcodec) MPEG-4'tür. Her ikisi de son derece iyidir, herhangi birisini kullanmakta özgürsünüz. Avidemux'ta daha iyi desteklendiği için bu sayfadaki örnekte Xvid'i kullandık, sizin de Xvid'i kullanmanızı tavsiye ediyoruz.

"Configure" butonuna tıklayın, karşınıza Xvid Configuration penceresi çıkacaktır. 2 pass kodlamasını seçmeniz şiddetle tavsiye edilir, bu sayede videonun son boyutunu belirleme imkanına sahip olacaksınız. Son boyut hakkında telaşlanmayın ve ayarları istediğiniz gibi yapın ve ayarları kaydetmek için OK butonuna basın.

Şimdi "Calculator"ı açın, formatın AVI olduğundan emin olun, medium'u seçin (yani son dosya boyutunu belirtin) ve "OK" düğmesine basın. Bu işlem otomatik olarak Xvid Configuration penceresindeki dosya boyutu bilgisini dolduracaktır. Hesap sonuçları pencerede gösterilecektir. Şimdi bu pencereyi kapatabilirsiniz.

İlk yapmanız gereken şey hangi ses parçasının kodlanacağını seçmektir. Varsayılan olarak DVD'deki seçili olan ilk parça DVD'nin orijinal dilidir.  (örneğin Bölge 1 için İngilizce). Başka bir sesi kodlamak için "Audio->Main Track" menü yolunu izleyip, açılan penceredeki açılır menüden istediğiniz ses parçasını seçin. Eğer isterseniz harici bir ses kaynağı da seçebilirsiniz. Eğer kodlanmasını istediğiniz ikinci bir parça varsa "Audio->Second Track" menü yolunu izleyin.

Şimdi sesin senkronizasyonunu kontrol ediyoruz. Çıktı ön izlemesini gösterin ve sesin senkronize olduğundan emin olun, eğer senkronize değilse Shift özelliğini kullanarak düzeltin.

Şimdi ses için hangi kodlayıcının kullanılacağını seçiyoruz. MP3 (LAME kodlayıcısı ile) en çok desteklenen formattır. Varsayılan AC3 sesini korumak da 5.1 ses sistemleri için son derece iyidir. Zaten kayıpla sıkıştırılmış bir formatı tekrar sıkıştırırsak beklediğimiz ses kalitesini elde edemeyebiliriz, başka bir kodek kullandığımızda o kadar da çok dosya boyutu tasarrufu sağlayamayabiliriz, ancak kesin olan şudur ki sesin formatında oynama yapmazsak en azından zaman kazanırız.

Son olarak eklemek istediğiniz ses filtrelerini sese ekleyin.

Şimdi File->Save->Save Video menü yolunu izleyin ve bekleyin. Avidemux, önce 1. pass'i sonra 2. pass'i (sesle birlikte) yapacaktır. Sonuçta içinde MPEG-4 ASP videosu ve MP3 sesi olan bir AVI dosyası oluşacaktır.

Deinterlacing, aslında hileli bir durumdur ve Avidemux'un bünyesindeki çeşitli interlacing/deinterlacing filtreleri bu hileli durumu daha hünerli kullanmanızı sağlar. Bu sayfa, bu işlem için size sunulan filtrelerden hangilerinin size daha faydalı olduğunu ve bu filtreleri nasıl kullanacağınızı anlatacaktır.

Basit konuşmak gerekirse interlacing, bir videonun her bir frame'inin field adında iki parçaya ayrılmasıdır. Bildiğiniz gibi videolar piksellerden oluşur. 200 x 300 boyutlarındaki bir videonun genişliği 200 piksel, yüksekliği 300 piksel demektir. Yani videodaki yatay çizgi sayısı 300, dikey çizgi sayısı da 200'dür. Interlacing işlemi ile yatay çizgilerden tek numaralı olanlar bir field'ı, çift numaralı olanlar da başka bir field'ı oluştururlar. Deinterlace işlemi, interlace edilmiş videonun interlace modundan kurtarılmasıdır. Interlace moddaki videolar rahatsız edici ve hatta çalınamaz halde olabilirler. İşte bu yüzden interlace moddaki videoları DVD oynatıcı, bilgisayar, vb. ile izlemek için deinterlace etmeliyiz.

Önemli:

Eğer bir videoyu deinterlace edecekseniz deinterlace filtreleri videoya daima ilk uygulanan filtre olmalıdır.
Tools -> Preferences -> Video menü yolunu izleyerek "Horizontal Deblocking" ve "Vertical Deblocking" onay kutularının seçili olmadığından emin olun. Eğer kullandığınız diğer filtreler ve video kodekleri doğru ayarlanmışsa bunu yapmanıza gerek yoktur.

DVD video için en sık kullanılan deinterlacing filtresi Decomb Telecide'dir. Bu filtreyi videoya eklemeye çalıştığınızda çıkan penceredeki Strategy açılır menüsünden bir strateji seçmelisiniz. "No strategy" seçeneğini seçerseniz etkin bir biçimde videodan bütün interlace edilmiş satırlar silinecektir ve ortaya güzel bir resim çıkacaktır. Varsayılan durumda "No strategy" seçeneği tavsiye edilir, ancak diğer seçenekler de bazen uygun olabilmektedir. İlgili filtrenin sayfasına veya aşağıya bakarak bu filtre hakkında daha fazla bilgi alabilirsiniz.

Eğer kaynak video 29.97 fps (veya 30 fps) ise, ve bu frame oranını korumak istiyorsanız, tek ihtiyacınız olan şey videoyu Decomb Telecide ile deinterlace etmektir. Başka hiçbir şey yapmanıza gerek yoktur.

Önce Decomb Telecide filtresini ekleyin.
Filtre yapılandırmasındaki Strategy seçeneğini No Strategy olarak ayarlayın. Bu sayede video deinterlace edilecek ve frame oranı değişmeyecektir.
Decomb Decimate filtresini eklemenize gerek yoktur, çünkü videodaki frame sayısını düşürmeye çalışmıyorsunuz.

Eğer kaynak video 29.97 fps (veya 30 fps), ve bu değeri 23.976 fps'e (veya 24 fps'e) çevirmek istiyorsanız aşağıdakileri yapın:

Önce Decomb Telecide filtresini ekleyin.
Filtre yapılandırmasındaki Strategy seçeneğini 3:2 Pulldown olarak ayarlayın. Bu sayede video deinterlace edilecek ve frame oranını 24 fps olmaya hazırlayacaktır, ancak henüz yapmayacaktır.
Ayrıca son olarak Decomb Decimate filtresini de kullanmalısınız, bu sayede frame oranının 24'e düşürülmesi tam olarak yapılacaktır. Decomb Decimate için varsayılan ayarları kullanmanız yeterlidir.

MythTV içinde dahili olarak video deinterlace etmek her zaman en verimli veya en yüksek kaliteli seçim olmayabilir. Bazen videoyu deinterlace edilmeyen modda kaydetmek, daha sonra Avidemux'taki daha güçlü ve özelleştirilebilir bir filtreyle deinterlace etmek daha iyi olabilir. Yadif filtresi, varsayılan ayarlarla birçok durumda son derece iyi çalışacaktır.

Avidemux ham MPEG akımlarını açamaz. Bunun yerine indekslenmiş MPEG akımlarını açabilir. İndeks, navigasyon bilgilerini içeren bir metin dosyasıdır. İndeks dosyası, frame'lerin doğru oluşturulması için gereklidir.
Bir MPEG dosyası açtığınızda Avidemux size bir indeks dosyası oluşturmak isteyip istemediğinizi sorar. Eğer seçilen dosya dosya1.xxx gibi gözüküyorsa Avidemux dosya2.xxx, dosya3.xxx gibi dosyaları da eklemeyi deneyecektir. Bu otomatik olarak yapılacaktır ancak dosyanın ismi *[0-9].xxx biçiminde olmalıdır.
Avidemux bir MPEG dosyasındaki ses akımlarından aynı anda yalnızca bir tanesini işleyebilir. 2.2 sürümü ve daha yenilerinde ise bütün ses akımları işlenebiliyor (Audio->Main Track yolunu kullanarak), ses parçasını herhangi bir zamanda değiştirebilirsiniz.
Elbetteki, ilgili sesi çalabilmek için o sesin kodekinin olması gerekiyor. (MP2 için MAD, AC3 için a52dec ve DTS için libdca).
MPEG PS ve TS'in sorunsuz olduğu varsayılmaktadır, zarar görmüş dosyalar için bir düzeltme mekanizması mevcut değildir.
Bütün zaman bilgisi yok sayılmaktadır.
Yani, yakalanmış akımınız sorunluysa, senkronizasyon sorunları yaşayacağınız anlamına gelir. Böyle bir durumda yapılacak en iyi şey akımdaki ProjectX'i çalıştırmaktır.

MPEG akımlarının tersine, bir NuppelVideo dosyası için harici bir indeks dosyası oluşturulmasına gerek yoktur.
Avidemux, bunu yükleme esnasında otomatik olarak hazırlayacaktır (biraz zaman alabilir).
Avidemux, ses/video senkronizasyonunu korumaya çalışacaktır, ancak bu bazen "cup" sesine yol açabilir. Kişisel tecrübelerime dayanarak söyleyebilirim ki, bu daha iyidir (8 saat uzunluğunda bir nuppel_gatos dosyasıyla sorun olmadan çalışabildim).
Eğer menülerle çalışıyorsanız (komut satırıyla değil) yükleme esnasında indeksi kaydetmek isteyip istemediğiniz sorulacaktır. Eğer "yes" deyip kaydederseniz, bu indeksin yüklenmesi aynı nuv dosyasının çok hızlı açılmasını sağlayacaktır.
WinTV PVR x50 veya benzer kartlı MythTV kullanıcıları için nuv dosyaları aslında düz MPEG dosyalarıdır, yukarıya bakın.

Avidemux aynı zamanda sıkıştırılmamış BMP (RGB) veya JPEG veya PNG dosya setlerini bir akım olarak açabilir.
isimleri xx0000.bmp, xx00001.bmp ( m harf + n rakam + .bmp) şablonuna uymalıdır. Eğer dosya JPEG'se şablondaki .bmp'yi .jpg'ye çevirin.

Avidemux'un son sürümü genellikle WMV/ASF kapsayıcılarını açabilir, ancak ara sıra açma veya çalma esnasında bazı dosyalarda sorun olabiliyor. Eğer bu sorunla yüzleşirseniz WMV'nin içeriğini bir AVI kapsayıcısına taşımanız sorunu çözecektir. 
Bu kapsayıcıyı oluşturmak için copy modunda MEncoder'ı kullanabilirsiniz, örn:	 
mencoder [wmv dosyasi] -oac copy -ovc copy -cache 8192 -ofps 100.0 -o [avi dosyasi]	 
Şu an itibarıyla, çıktı dosyasının frame oranını 100.0 fps'e zorlamanız da gerekmektedir, aksi halde videonuzda büyük oranda frame kaybına uğrayacaksınız, çünkü WMV/ASF değişken fps'li formatlardır.	 
Çıktı dosyanızı, oluşturduktan sonra Avidemux'la düzenlemek için açabilirsiniz.

Bu sayfa H.264'ün ne demek olduğunu, Avidemux'a nasıl H.264'e kodlama yeteneği kazandırılacağını ve Avidemux'taki x264 ayarlarını anlatmaktadır. Bu sayfa x264 kodlayıcısnın rehberi gibi düşünülebilir.

"MPEG-4 Part 10" veya "MPEG-4 Advanced Video Coding" (AVC) olarak da bilinen H.264, çok yüksek oranda veri sıkıştırmaya izin veren bir video  sıkıştırma standardıdır. H.264 videoları, eski MPEG-4 Part 2 standardındaki (Xvid ve DivX bu standarda kodlarlar) videolara oranla oynatılmaları için daha fazla işlemci gücüne ihtiyaç duymalarına rağmen çok daha yüksek oranda sıkıştırma verimi sağlarlar. Yani H.264/AVC ile MPEG-4 ASP'ye oranla eşit dosya boyutunda daha yüksek video kalitesi veya aynı video kalitesinde daha küçük dosya boyutu elde edersiniz. H.264'ün sıkıştırma verimi MPEG-4 Part 2'den daha yüksek olduğuna göre elbetteki MPEG-2'den hayli hayli yüksektir.
H.264 hakkında daha ayrıntılı bilgiyi ilgili Vikipedi maddesinde ve H.264'ün çeşitli kodekleri ile MPEG-4 Part-2 ve MPEG-2 gibi formatların çeşitli kodeklerinin kıyaslamasını http://mirror05.x264.nl/Dark/website/compare.html adresinde bulabilirsiniz.

Avidemux, H.264'ü çözmek için FFmpeg'den tümleşik libavcodec'i kullanırken H.264'e kodlamak için ek (harici) bir kütüphaneye ihtiyaç duyar. Avidemux bu amaç için x264'ü kullanabilir. x264, H.264/AVC akımları üretmeye yarayan özgür lisanslı bir kütüphanedir. x264, Laurent Aimar, Loren Merritt, Eric Petit (OS X), Min Chen (VfW/asm), Justin Clay (VfW), Måns Rullgård, Radek Czyz, Christian Heine (asm), Alex Izvorski (asm) ve Alex Wright tarafından sıfırdan yazılmış ve GPL ile lisanslanmıştır. Yani olayı basitleştirmek gerekirse kodlamaya yarayan kütüphaneye x264, kodlama sonucunda üretilen videonun formatına H.264 (veya MPEG-4 AVC) denir. Şu unutulmamalıdır ki x264 özgür ve ücretsiz bir yazılım olmasına rağmen gerek üretilen videonun kalitesi ve gerekse kodlama hızı konularında diğer ticari H.264 kodlayıcılarıyla ciddi bir rekabet içindedir. İnternetteki Youtube ve Facebook gibi birçok büyük şirket H.264 videolarını üretmek için x264'ü kullanmaktadırlar.

Eğer Avidemux'un elinizdeki versiyonunda x264 mevcut değilse, x264'ü nasıl indirip derleyeceğiniz kitabın x264'ü derleme bölümünde anlatılmıştır.
x264'ü derledikten sonra ilgili x264 kodlarını Avidemux'a gömmek için Avidemux'u yeniden derlemelisiniz. Bu işlem için de kitabın Avidemux'u derleme bölümüne bakabilirsiniz.
Eğer Avidemux'un Microsoft Windows için önceden derlenmiş build'lerini kullanıyorsanız, x264 kütüphanesi zaten Avidemux'la paketli gelecektir. Bu yüzden herhangi ek bir yazılım kurmanıza gerek yoktur. "Codec Pack", "VFW Codecs" veya "DirectShow Filters" gibi isimlere sahip programlar Avidemux'la çalışmayacaktır! Ancak yine de isterseniz Avidemux için en güncel x264 kütüphanesi burada bulunur (en güncel sürümü bulmak için en son gönderilen mesaja gidin!). Bu build'ler genellikle Avidemux'la paketli gelenlere oranla daha yeni ve daha az test edilmiştir.

Avidemux, x264 kütüphanesinin sahip olduğu ayarların çoğunu içerir. Avidemux'a henüz eklenmemiş x264 ayarları için bu sayfanın "Mevcut olmayan ayarlar" bölümüne bakın.

Encoding Mode:
Single Pass - Constant Quantizer: "QP Mode" olarak da bilinen bu mod videonuzu sabit bir quantizer'e kodlayacaktır. Bu durumda hedef bit oranını değil, hedef quantizer'i seçeceksiniz. Quantizer kaybedilen verinin miktarını göstermektedir. Yüksek quantizer daha fazla kaybedilen veri, daha fazla sıkıştırma, daha küçük dosya boyutu ve daha kötü görüntü kalitesi demektir. Düşük quantizer ise daha az kaybedilen veri, daha iyi görüntü kalitesi, daha az sıkıştırma ve daha büyük dosya boyutu demektir. H.264 için 0'dan 52'ye kadar bir quantizer değeri belirlenebilir. Varsayılan quantizer değeri 26'dır. Eğer belirli bir görüntü kalitesi hedefliyorsanız, sonuçta oluşacak dosyanın boyutu sizi ilgilendirmiyorsa QP modu sizin için uygun demektir. Ancak belirli bir dosya boyutu veya belirli bir ortalama bit oranı istiyorsanız QP modundan uzak durun. Çünkü bu modda sonuçta oluşan dosyanın boyutu ve ortalama bir oranı tahmin edilemez.
NOT: CRF modu QP modundan daha fazla avantaja sahiptir. CRF modunda varsayılan olarak aktif olan Adaptive Quantization (AQ) (Uyarlanabilen Kuantizasyon) QP modunda pasif durumdadır.
Single Pass - Constant Rate Factor: "CRF Mode" veya "Constant Quality" (sabit kalite) modu olarak da bilinen bu mod az önce gördüğümüz QP moduna benzer şekilde çalışır, bu moddaki tek fark videoların sabit bir quantizer yerine ortalama bir quantizer'le kodlanmasıdır. Yani daha açık konuşmak gerekirse bu modda videolar belirtilen quantizer'i baz alan sabit oran faktörüyle (rate factor) kodlanır. Avidemux'taki CRF modu x264'ün ABR moduyla aynı oran kontrol algoritmasına sahiptir, aradaki tek fark CRF'de hedef bit oranı olmamasıdır. CRF modunun avantajı, QP moduna oranla insan algısına çok daha iyi hitap etmesidir. Örneğin CRF, kayıp verinin çok fazla dikkat çekmediği hızlı sahnelerde quantizer'leri artırıp, yavaş sahnelerde azaltır. Bu sayede CRF modu, QP moduyla aynı subjektif (insanın gözüyle belirlediği) görüntü kalitesi vermesine rağmen önemli oranda daha fazla sıkıştırma sağlar. CRF biraz daha yavaş olsa da QP modu yerine CRF modunu kullanmanız tavsiye edilir. Kodlama modunu QP'den CRF'ye değiştirirken quantizer'i biraz azaltmak isteyebilirsiniz. Bu sayede öncekiyle yaklaşık olarak aynı dosya boyutunu, ama daha iyi görüntü kalitesi elde edeceksiniz. CRF'nin diğer önemli bir avantajı ise uyarlanabilir kuantizasyondan (adaptive quantization) yararlanmasıdır -ki QP'de böyle bir imkan yoktur.
NOT: CRF modu halen "mükemmel" bir sabit kalite vermez. Sabit bir CRF değeri, diğer ayarları değiştirmediğiniz müddetçe çeşitli kaynaklara benzer kalite dağıtır. Aynı CRF değeriyle birlikte "daha yavaş" ayarları kullanmanız aynı kalitede daha küçük dosya boyutu veya aynı dosya boyutunda daha yüksek kalite elde etmenizi sağlar. Ayrıca hem dosya boyutunun ve hem de kalitenin artırılması da mümkündür. Boyut başına düşen kalite bir şekilde artırılabilir.
Açıklamalar: CRF veya QP kodlaması için düzgün bir quantizer ayarı seçmek önemsiz değildir. Çünkü görsel kalite son derece subjektifitir. Bir videonun görsel kalitesini birisi beğenirken bir başkası beğenmeyebilir. Ayrıca quantizer ayarları videonuzun içeriğine de bağlıdır. Ancak yine de 16 ile 32 arasında bir değer çoğunlukla tatminkar sonuçlar verecektir. 16'dan daha düşük bir quantizer değeri ayarlamak -öğrenme amaçlı yapmıyorsanız- çoğunlukla israftır. 32'den daha yüksek bir quantizer değeri ise neredeyse izlenemeyecek derecede düşük kaliteli bir video üretecektir. Quantizer değerini 22'ye ayarlamak çoğu durumda makul sonuçlar üretir. Ancak yine de çizgi filmler gibi içeriğinde çok fazla doku olmayan videolarda quantizer değeri artırılabilir. Ancak içeriğinde çok fazla doku olan gerçek hayat videolarında daha düşük quantizer (özellikle karanlık sahnelerde) daha uygun olacaktır. Ayrıca bir pratik kural vardır: CRF değerini 6 birim düşürmek dosya boyutunu ikiye katlayacak, 1 birim düşürmek dosya boyutunu yaklaşık % 12.5 oranında artıracaktır. Bununla ilgili yaygın pratik şöyledir: 16 gibi düşük bir CRF değeriyle başlayın. Sonra bu değeri 1'er 1'er artırın. Her artırışınızda videonun kalitesine bakın. Videonun kalitesi kabul edilemez olduğu anda deneyi bırakın ve en son kabul edilebilir değeri seçin. Bu sayede kalitesi sizi tatmin eden en yüksek CRF değerini elde edeceksiniz. İlgili değeri bulduktan sonra gelecekte yapacağınız diğer bütün kodlamalar için de aynı değeri kullanabilirsiniz.
Single Pass - Bitrate: Bu modda videonuz tek geçişte ve ortalama bir bit oranıyla kodlanır. Yani bu mod, "Two Pass" kodlamasının gerektirdiğinin yarı zamanını gerektirir. CRF ve QP modunun aksine sonuçta oluşan dosyanın ortalama bit oranı önceden bellidir. Böylece sonuçta oluşacak dosyanın boyutu basit bir matematiksel hesaplamayla anlaşılabilir. Yüksek bit oranı daha iyi görüntü kalitesi ve daha büyük dosya boyutu, düşük bit oranı daha küçük dosya boyutu ve daha kötü görüntü kalitesi anlamına gelir. Bu modda tek geçiş yapıldığı için kodlayıcı videonun içeriğini önceden bilmemektedir. Bundan dolayı kodlayıcının içeriğe göre bit oranını ayarlama yeteneği son derece sınırlıdır. Yalnızca yerel iyileştirmeler yapılır. Bu modda bir "Two Pass" kodlamasına oranla daha kötü video kalitesi elde edilir (özellikle orta ve düşük bit oranlarında). Bu yüzden bu modu -tek geçiş yapmak zorunda değilseniz- kullanmamanız tavsiye edilir.
Two Pass - Average Bitrate: Bu modda videonuz iki geçişte ve ortalama bir bit oranıyla kodlanır. Bu nedenle bu mod bir "Single Pass" modun gerektirdiğinden yaklaşık olarak bir kat daha fazla zaman gerektirir. CRF ve QP modunun aksine sonuçta oluşacak olan dosyanın ortalama bit oranı (ve dolayısıyla dosya boyutu) önceden bellidir. Yüksek bit oranı daha yüksek kalite ve daha büyük dosya boyutu, düşük bit oranı daha düşük kalite ve daha küçük dosya boyutu demektir. İlk geçişte kodlayıcı videonun detaylı bir analizini yapar ve "stats" isminde bir dosya üretir. Sonra ikinci geçişte asıl kodlama yapılır ve sonuçta oluşacak dosya üretilir. İki geçişin avantajı kodlayıcının ikinci geçişte, ilk geçişte elde ettiği verilere güvenebilmesidir. Bu sayede kodlayıcı videonun her bir kısmına yalnızca gerekli bit oranlarını dağıtır (ne eksik ne fazla). Örneğin hareketli sahnelere, sabit sahnelere oranla daha fazla bit oranı verilir. Bu işlem, videonun tamamında sabit kalite elde etmek için yapılır. "Single Pass" kodlamalarında hızlı/spontane sahnelerde gözüken çirkin bloklar bu modda olmaz. Bu sayede "Two Pass" kodlamaları verilen ortalama bit oranında (veya dosya boyutunda) maksimum görüntü kalitesi sağlar. Eğer belirli bir ortalama bit oranı istiyorsanız bu modu kullanmanız tavsiye edilir.
Two Pass - File Size: Bu mod aslında "Two Pass - Average Bitrate" modunu kullanır. Bu moddaki tek ve en önemli fark Avidemux'un otomatik olarak gereken bit oranını sizin yerinize hesaplamasıdır. Bu sayede belirli bir dosya b

Kitabın bu sayfasının amacı dışarıdaki ve içerideki programcılara herhangi bir yama veya özelliğin nereye yazılması gerektiğini anlatmak ve genel anlamda kaynak kod dosyaları ve amaçları konusunda bilgi vermektir. Avidemux'taki dosyalar birden fazla iş yapma eğilimindedir, bu yüzden buradaki bilgiler her zaman dosyanın fonksiyonlarının tamamını anlatmayabilir.

Avidemux C++ dili ile yazılmış ancak STL kullanılmamıştır, ancak bu genel anlamda çok önemli bir şey değildir. Avidemux, GTK+ grafik kütüphaneleriyle inşa edilmiştir. Avidemux'un son sürümünde proje yönetimi için SpiderMonkey ECMAScript betik motoru Avidemux'a eklenmiştir. Şimdilik bu Avidemux tarafından direkt olarak çağrılamıyor. Avidemux'a kod eklemek veya mevcut kodunu değiştirmek için bu dilleri ve kütüphaneleri anlamak zorundasınız. ECMAScript, birkaç spesifik fonksiyon dışında nadiren kullanıldı, yani amacınız kodu değiştirmekse (yeni şeyler yazmak değilse) ECMAScript'i bilmek zorunda değilsiniz. Ancak C/C++ ve GTK+'ı ise bilmeniz gerekiyor.
Avidemux'u yazarken çok biçimlilik (polymorphism) ve sınıf türetme sıkça kullanılmıştır.

Herhangi bir işlem 3 parçadan oluşur:

Demuxer: Bütün demuxer'lar vidHeader sınıfından türetilmiştir ve bilgi ve erişim imkanları sağlarlar. Bu imkanlar arasında ardışık taramaya gerek kalmadan herhangi bir frame'e ve ilgili bayraklara erişmek de vardır.
Editör: Editörün görevi kodekleri demuxer'ın çıktısında sunulan akımlara eşlemektir. Editörün başka bir görevi de düzenlemeyi (ekleme, kesme, vb...) ve B-frame sıralama mantığını yönetmektir. GUI editörden bir frame ister, ve editör bütün mantığı tek başına yönetir. Genelde, yeni bir dosya formatı eklemek editörde değişiklik yapmaz.
Çıktı muxer'i: Bütün çıktı muxer'leri oplug_ ile başlayan klasörlerdedir ve her biri yalnızca bir dosya çıktı formatıyla ilgilenir.

ADM_pp.cpp: Filtreyi postprocess etme kodu.
ADM_pp.h: Filtreyi postprocess etme kodu başlıkları.
gtk_gui.cpp: GUI'nin tamamını kontrol eder. Diğer çeşitli GUI diyalog ve girdilerine çağrılar yapar.

QuickTime, MP4, 3GPP girdi yönetimini içerir

ADM_3gp.cpp: Diğerleri arasında, QuickTime, MP4, 3GPP girdi formatlarını yönetir (demuxing, değişkenler).
ADM_3gp.h: Diğerleri arasında, QuickTime, MP4, 3GPP girdi formatlarını yönetir (demuxing, değişkenler).

Mixer'le birlikte Ses filtre dosyalarını içerir (genelde ses kodeklerinin kendisinin kaynak kodunu içermez).
Enkode (kodlama) işlemi bir filtre olarak gözükür,ses enkoderlerine (kodlayıcılarına) arayüzler de bu klasördedir.

audioencoder.cpp: Avidemux'taki genel ses işleme kodları
audioencoder.h: audioencoder.cpp dosyasının başlık kodları
audioencoder_faac.cpp: FAAC ses enkoderi kaynak kodu
audioencoder_faac.h: FAAC enkoderinin başlık kodu
audioencoder_lame.cpp: LAME ses enkoderi kaynak kodu
audioencoder_lame_param.h: LAME ses enkoderi için parametre başlık dosyası, ADM_dialog/DIA_lame.cpp'de kullanılmış ve #included edilmiştir
audioencoder_lavcodec.cpp:
audioencoder_lavcodec.h:
audioencoder_pcm.cpp: PCM ses enkoderi kaynak kodu
audioencoder_pcm.cpp: PCM ses enkoderi kaynak kodu için başlık kodu
audioencoder_twolame.cpp: TwoLAME ses enkoderi kaynak kodu
audioencoder_twolame.h: TwoLAME enkoderi için başlık
audioencoder_vorbis.cpp: Vorbis ses enkoderi kaynak kodu
audioencoder_vorbis.h: Vorbis ses enkoderi kaynak kodu için başlık kodu
audioencoder_vorbis_param.h: Vorbis ses enkoderi için parametre başlık dosyası, büyük ihtimalle ADM_dialog/DIA_vorbis.cpp'de kullanılmış ve #included edilmiştir.
audiofilter_mixer.cpp: Ses filtre mixer'i

Çeşitli ses kodeklerine kodlama için dosyalar (sadece çözücü, kodlayıcılar için bu sayfanın bağlantı listesine bakın)

ADM_codecac3.cpp: AC3 ses yönetimi, Dolby'yi içeriyor
ADM_codecwma.cpp: WMA ses yönetimi

Çeşitli video kodekleriyle kodlama için dosyalar

ADM_codecs.cpp: libavcodec ile video kodlarken/çözerken kullanım için bazı FourCC kodlarını saklar
ADM_ffmpeg.cpp: FFmpeg kodeklerinin kaynak kodları
ADM_x264.cpp: x264 kodlayıcısı
ADM_x264.h: x264 kodlayıcısı için bir başlık dosyası
ADM_xvid4.cpp: Xvid kodlayıcısı
ADM_xvid4.h: Xvid kodlayıcısı için bir başlık dosyası
ADM_ffmp43.cpp : FFmpeg libavcodec kütüphanesiyle ilgili çözücüler

GUI diyalogları ve filtreler, kodek yapılandırmaları, tercihler, vb. için pencereler. GUI'yle ilgili şeylerin çoğu bu klasörde bulunur.

DIA_calculator.cpp: Bit oranı hesaplayıcı diyaloğu
DIA_crop.cpp: Kırpma video filtresi diyaloğu
DIA_defaultAudio.cpp: Ses kodekleri için varsayılan kullanıcı arayüzü diyaloğu
DIA_DVDff.cpp: FFmpeg MPEG-2 DVD diyaloğu
DIA_encoding.cpp: Kodlama bilgisi diyaloğu/penceresi
DIA_jobs_save.cpp: "Save to Joblist" diyaloğu
DIA_jobs.cpp: "Joblist" diyaloğu
DIA_lame.cpp: LAME ses kodlayıcısı diyaloğu
DIA_mcdeint.cpp: mcDeinterlace video filtresi diyaloğu
DIA_ocr.cpp: "OCR (VobSub -> srt)" alt yazıları diyalog penceresi
DIA_prefs.cpp: Tercihler diyaloğu
DIA_preview.cpp: Video ön izleme diyaloğu
DIA_properties.cpp: Video özellikleri diyaloğu
DIA_srt.cpp: Alt yazı filtresi diyaloğu
DIA_vcodec.cpp: Eski kodlama kodeki listesi açılır menüsü gibi gözükmektedir. Süresi geçmiş olabilir.
DIA_vobsub.cpp: VobSub alt yazı diyaloğu
DIA_vorbis.cpp: Vorbis ses kodeki açılır menüsü
DIA_working.cpp: Video kodlama durum penceresi
DIA_x264.cpp: x264 yapılandırma diyaloğu
DIA_xvid4.cpp: Xvid yapılandırma diyaloğu

Yüksek seviye video kodlayıcılarını yöneten kaynak dosyaları içerir. Yüksek seviye kodlayıcılar, kullanılan kodek ne olursa olsun çekirdeğe aynı arayüzü sunarlar, 2-pass kodlaması için olan ayarları içsel yönetirler, bir soyutlama tabakası olarak görülebilirler.

ADM_encCodecDesc.h: Başlangıçta çalıştırılan varsayılan kodek değer ayarlarını içerir (GUI diyalogları için).
ADM_vidEncode.hxx: Kodek diyaloğu seçenekleri (2-pass dosya boyutu, 2-pass bit oranı, quantizer gibi). Başka fonksiyonlara parametre olarak geçerken kullanılacak kodek adlarını içerir.
adm_encffmpeg1.cpp: FFmpeg MPEG-1 kodlayıcısı
adm_encx264.cpp: x264 kodlayıcısının C++ implemantasyonu; kodlama, loglama ve bit oranı hesaplama gibi diğer fonksiyonlara yapılan bütün dahili Avidemux fonksiyon çağrılarını içerir.

Video filtreleri için yönetim kodunu (yükleme ve GUI'ler) içerir. Asıl video filtre dosyaları için bakınız: ADM_video.

filter_declaration.cpp: Dosyaların yükleme/bildirim işlemlerinin bazılarını yönetir.
video_filter.h: Video filtre adlarının, tanımlarının, yapılandırmalarının yükleme ve bildirim işlemlerinin bazılarını yönetir.

libavcodec ve ilgili kodekler tarafından yönetilen birçok çeşitli kodek içerir.

FFmpeg'den dosya format kütüphanesidir. Tam olarak yalnızca MP4 olarak kaydederken kullanılır. MPEG(nbsp)TS çıktısı verirken kullanılan bazı ölü kodlar da vardır.

mov.c: QuickTime/MP4/3GP/... için okuma kısmı. Avidemux'la kullanılmamaktadır ancak bazı kodlar movenc.c ile paylaşılmaktadır. (movenc.c Avidemux'ta kullanılmaktadır.)
movenc.c: MP4 yazma kodunun birçoğu buradadır, MP3'ün saklandığından birazcık farklı saklanır.

Frame'ler, resimler, dosya I/O, FourCC bilgisi ve RIFF ayrıştırıcı gibi çeşitli küçük ve büyük görevler için dosya koleksiyonu içerir

default.h: AMD64 fallback typedef ayarları hakkında bilgi içerir.

Ses muxlama ve demuxlama ve ses akım bilgisi ve yönetimi için dosyalar ve genel ses yönetimiyle ilgili çeşitli kod parçaları içerir.

ADM_mthread.cpp: Bazı multithreaded multiplexing işlemleri
ADM_mthread.h: Yukarıdaki dosya için başlık
interact.cpp:

ECMAScript/JavaScript scripting dosyaları ve kaynak kodu içerir.

ADM_JSAvidemuxAudio.cpp: yöneten kod

Çoğunlukla GTK+'la ilgili olan faydalı fonksiyonları içerir. UNIX fonksiyonlarını win32'de emüle etmek için bazı kodlar da vardır.

ADM_threads.cpp: Güvenilmez multithreading kodu
ADM_threads.h: Güvenilmez multithreading kodu
eggtray_win32.c: Win32 için animasyonlu simge
TLK_filesel.cpp: Dosya seçim fonksiyonları (okuma/yazma)

Betikleri kontrol eder (çoğunlukla ECMAScript .js betiklerini).

Video filtreleri için asıl kaynak dosyalarının çoğunu içerir.
Her filtre bir C++ sınıfı olarak belirtilmiştir. Bunların hepsi aynı sınıftan türetilmiştir. Hepsi bir girdi ve bir çıktı kullanırlar ve birlikte zincirlenmişlerdir.
Bir parametrenin ismi ve değeri arasında dönüşüm yapan Couples sınıfı aracılığıyla dış dünyayla yapılandırmalarını paylaşırlar. Filtrelerin çoğu  MPlayer veya Avisynth'ten port edilmiştir. Avidemux'un internal'leri bu ikisine yakındır. Ayrıca Avisynth'e bir C emülasyon katmanı sağlayan kodlar da vardır, bu sayede port etme kolaylaşır.

ADM_vidMcDeint.cpp : mcDeinterlace filtresi için asıl kaynak kod

Bu sayfada kendi filtrenizi nasıl yazacağınız anlatılmaktadır.

Öncelikle Avidemux'un kaynak koduna ihtiyacınız var (eğer eklentileri derlemişseniz Avidemux'un kendisini derlemenize gerek yok demektir, ancak halen Avidemux'un kaynak koduna ihtiyacınız var).
Windows için MinGW GCC/g++ (v4.x) veya cygwin GCC/g++ (v4.x) gerekiyor. Bazı C++ bağlantıları olacağı için MSVC çalışmayacaktır. Ayrıca MSVC C++, g++ ile uyumsuzdur.

Avidemux'taki bütün filtreler AVDMGenericVideoStream sınıfından türetilmiştir. Yalnızca birkaç metodun tanımlanması gerekir:

Yapıcı metot 2 argüman alır:

Zincirdeki bir önceki filtre, bu filtre "_in"in içine kopyalanacaktır.
CONFcouple * yapılandırmayı içerenleri eşleştirir. Bu eğer "null"sa varsayalın değerinizi kullanmanız gerektiği anlamına gelir.
Yapıcı metodun çıktı formatının açıklamasını içeren _info özelliğini güncellemesi gerekir. Eğer fps veya genişlik/yüksekliği değiştirmiyorsanız _in->getInfo() kodunu kullanarak bir önceki filtreninkini kopyalayabilirsiniz.
Sınıfınızın, parametrelerinizi tanımlayan bir yapı olan _param ismine sahip bir özelliği olmalıdır. Örneğin:

typedef struct rotateParam
 {
   uint32_t angle;
 }rotateParam;

CONFcouple'dan parametre almak için yapıcı metotta kullanışlı *GET* ön ekini kullanabilirsiniz. Örnek: GET(angle);

Bir sonraki metot printConf'tur, filtre diyalog kutusundaki yapılandırmayı yazdırmak için kullanılır.

char *yourClassName::printConf (void)
{
  static char buf[[50]];
  sprintf ((char *) buf, " My rotate filter, angle :%d",_param->angle);
  return buf;
}

Kafa karıştırıcı olabilecek tahsis etme/boşaltmadan kaçınmak için buffer statiktir.

Bu metot aktif yapılandırmayı almak için kullanılır. En basit yol aşağıdaki gibi CSET ön ekini kullanmaktır:

uint8_t sinifIsminiz::getCoupledConf (CONFcouple ** couples)
{
  ADM_assert (_param);
  *couples = new CONFcouple (1); // Yapınızdaki parametre sayısı
  #undef CSET
  #define CSET(x)  (*couples)->setCouple(#x,(_param->x))
  CSET (angle);
  return 1;
}

getCoupledConf ve yapıcı metot birer çifttir. Bunların aynı parametre sayısına ve aynı parametre adlarına sahip olmaları gerekir. Aksi takdirde "asserts popping" yaşarsınız.

uint8_t yourClassName::configure (AVDMGenericVideoStream * in)
Bu metot filtreyi yapılandırmak için kullanılır. Parametresi yapıcı metotla aynıdır. Ancak bununla "_in"i güncellemek daha güvenlidir. Hem GTK+ ve hem de Windows (Qt) ile çalıştığından ve kullanması oldukça kolay olduğundan dialogFactory'yi kullanmanız şiddetle tavsiye edilir.
Bazı bilgiler:

0 döndürmesi hiçbir şey değişmediği anlamına gelir.
1 döndürmesi bazı değişikliklerin yapıldığı ve filtre zincirinin yeniden inşa edilmesi gerekebileceği anlamına gelir.
Önemli: Yapılandırmadaki değişiklik hemen yapılmalıdır!

İş burada yapıldığı için bu metot merkezi metottur.

uint8_t sinifIsminiz::getFrameNumberNoAlloc (uint32_t inframe,
                              uint32_t * len,
                              ADMImage * data, uint32_t * flags)

len çıktı resminin bayt olarak boyutudur.
flags ihmal edilebilir.
inframe renderlemek zorunda olduğunuz frame'dir.
data frame renderlemek zorunda olduğunuz zamandaki yerdir.
Filtreler bir zincirdir, bu durumda her bir filtre selefinden frame isteyebilir. Birçok durumda yapıcı metotta geçici bir tampon tahsis etmek isteyecek (bu genellikle _uncompressed olarak isimlendirilir) ve önceki filtrenin sizin için doldurmasını isteyeceksiniz. Örneğin verticalFlip aşağıdaki gibi kolaylaştırılabilir:

uint8_t sinifIsminiz::getFrameNumberNoAlloc (uint32_t inframe,
                              uint32_t * len,
                              ADMImage * data, uint32_t * flags)
{
  ADM_assert(inframe<_info.nb_frames); // Sınırlardan çıkmadığımıza emin olun
  // Önceki için frame'leri okuma
  ADM_assert(_in->getFrameNumberNoAlloc(inframe,len,_uncompressed,flags)); // Şimdi _uncompressed frame'i içeriyor
  // _uncompressed'den son resmi tutan veriye çevirme
  Return 1; // bitti
}

Bazı notlar:

Bütün resimler YV12 formatındadır.
Eğer birkaç resmi bir resim halinde render etmek için (3:2 pulldown, noise removal,...), VideoCache sınıfı türünden bir nesne oluşturmalısınız.

Filtrenizi tanımlamanın 2 yolu vardır: paketli veya eklenti. Her ikisini aynı anda, aynı dosyada kullanabilirsiniz.

Bu birazcık daha karmaşıktır. Bunun için şunları yapmak zorundasınız:

ADM_filter/video_filters.h dosyasındaki filtreniz için bir etiket tanımlayın.
Aşağıdaki kodu kullanarak ADM_filter/filter_declaration.cpp dosyasındaki filtrenizi kaydettirin.
REGISTERX("rotate","Rotate","Rotate the picture by 90, 180 or 270 degrees.",VF_ROTATE,1,rotate_create,rotate_script);

İlk parametre dahili isimdir (tek olmalı).
İkinci ve üçüncü parametreler a,d özetini göstermek için kullanılırlar.
Dördüncü parametre yukarıda tanımladığınız etikettir. VAR OLAN BİR ETİKETİ YENİDEN KULLANMAYIN. Büyük sorunlarla karşılaşacaksınız, bana inanın.
Son iki parametre aşağıdaki tanımlanan fonksiyonunkiyle aynı olmalıdır.
Şimdi filtre C++ dosyamıza geri gidelim.
Öncelikle aşağıdaki gibi gözüken bir sabit tanımlamalısınız

static FILTER_PARAM filtreniz_param =  { 1,"angle"};
İlk parametre param yapınızdaki parametre sayısı, ikinci parametre ise ilgili parametrelerin adıdır, kesinlikle yapınızdaki gibi olmalıdır. Sonra aşağıdaki iki makroyu kullanın:

BUILD_CREATE (rotate_create, sinifIsminiz);
SCRIPT_CREATE (rotate_script, sinifIsminiz, filreniz_param);

Bu iki makronun ilk parametrelerinin REGISTERX'te kullandıklarınızla eşleştiğinden emin olun.
Bu kadar :-).

Bu daha kolaydır. Halen aşağıdaki gibi gözüken sabiti tanımlamak zorundasınız:

static FILTER_PARAM filtreniz_param =  { 1,"angle"};
Sonra

extern "C"
{
  SCRIPT_CREATE(FILTER_create_fromscript,sinifIsminiz,filtreniz_param);
  BUILD_CREATE(FILTER_create,sinifIsminiz);
  char *FILTER_getName(void)
  {
    return "DynRotate";  // Filtrenizin ismi. Tek olmalı!
  }
  char *FILTER_getDesc(void)
  {
    return "Blah blah"; // Filtrenizin kısa tanımı
  }
  uint32_t FILTER_getVersion(void)
  {
    return 1;  // Filtrenizin versiyonu
  }
  uint32_t FILTER_getAPIVersion(void)
  {
    return ADM_FILTER_API_VERSION; 
  }
}

Bu kod, bütün gerekli şeyleri halledecektir, sadece bir eklenti yazdığımızı düşünürsek ADM_filter/xxx klasöründe herhangi bir şeyi değiştirmek zorunda değilsiniz. Her iki tanımı aynı dosyada yapabilirsiniz, böylece filtre Avidemux'un içine paketlenecek veya eklenti filtresi olarak derlenecektir.

En basit yöntem ADM_filter/ADM_vidDummyFilter.cpp dosyasından başlamaktır. Bu, çok basit bir filtredir, bunu aşağıdaki kod ile inşa edebilirsiniz
sh builddummy.sh (Unix'te)
veya
sh builddummy_win32.sh (Windows'ta) (gcc'niz için yolu/adları değiştirmeniz gerekebilir).
Avisynth'le ana farklar şunlardır:

Resim formatı her zaman YV12 olmalıdır.
stride=width
Frame'i döndürmezsiniz, bu size argüman olarak çağırıcı tarafından verilmiştir.

Sesi değişken bit oranına sahip olan bir video düzenliyorsanız, herhangi bir şey yapmadan önce Audio->Build VBR Time Map menü yolunu izleyin. Aksi halde sesin video ile olan senkronizasyonu bozulacaktır.

Video düzenlemeleri yalnızca işaretçiler ile seçilmiş aralığa uygulanır. A ve B işaretçileri, seçilecek bölümün sırayla başlangıcını ve sonunu belirtmek için kullanılır. A ve B noktalarını  ve  düğmelerini kullanarak ayarlarsınız.
A ve B noktalarına Go->Jump to Marker A veya Go->Jump to Marker B menüleriyle gidebilirsiniz.
İşaretçilerin konumları ekranın altında Selection bölümünde de gösterilmektedir:

A işaretçisi B'den sonra gelemez. Eğer B işaretçisini A'dan sonraya getirmeye çalışırsanız Avidemux B'nin olması gereken yerden bir frame sonrasına A'yı; A'nın olması gereken yere de B'yi yerleştirecektir. Yani örneğin A; 0. frame'de, B de 10. frame'deyken A'yı 20. frame'e taşırsanız Avidemux A'yı 11. frame'e, B'yi de 20. frame'e koyacaktır.

Akımın istediğiniz bir kısmını File->Save->Save Video menüsünü izleyerek kaydedebilirsiniz. A'dan B'ye kadar olan tüm frame'ler kaydedilecektir (A'nın olduğu frame dahil, ancak B'nin olduğu frame hariç). Matematik diliyle konuşacak olursak [A,B) aralığı kaydedilecektir.

Edit->Delete menüsü akımdan [A,B) aralığındaki frame'leri silecektir. Bu özellik, yakalanmış bir TV dizisinden reklamları silmek için kullanılabilir. Videoya eklenmiş harici bir ses kaynağı yoksa Avidemux sesin videoyla senkronizasyonunu koruyacaktır.

Videonun harici bir ses kaynağı varsa kesme ve silme işlemlerinde Avidemux harici ses kaynağında kesme/silme yapmayacak, dolayısıyla sesle videonun senkronizasyonu bozulacaktır.
Harici ses kaynağı eklenmiş videolarda kesme/silme yaparken senkronizasyonu korumak için iki seçeneğiniz var:

Ses dosyasını kendiniz düzenleyebilirsiniz. Yani bir ses düzenleme programında ses dosyasında kesme işlemi yapabilirsiniz.
Başka ve daha kullanışlı bir yöntemse videoyu Avidemux'la iki kere düzenlemektir.
İlk olarak Avidemux'la sesi videoya ekleyip videoyu kaydedin.
Şimdi harici ses videoya gömülmüş ve "harici ses kaynağı" artık "dahili ses kaynağı" olmuştur. Kaydettiğiniz videoyu Avidemux'la açın. Artık videoda yaptığınız kesme/silme işlemlerinde senkronizasyon bozulmayacaktır.

Bu bölüm yalnızca video Copy modundaysa (kodlayıcı Copy'ye ayarlanmışsa) geçerlidir. İşleme modunda (kodlayıcı için bir kodlayıcı seçildiğinde) Avidemux internalleri her şeyin yolunda olduğu sonucuna varacaktır.
Uyarı: Format "AVI, unpack VOP" olarak ayarlanmışsa Avidemux kodlama için bir video kodlayıcısı seçilmiş olsa bile copy modunu bütün frame'lere uygulayacaktır ("bozuk" olanlar da dahil). SmartCopy modu bu durumda çalışmayacaktır, çünkü SmartCopy bozuk frame'lerin yeniden kodlanmasını gerektirir.
Genelde bir videodaki bir frame, kendinden hemen önceki frame'den pek farklı değildir. Bir adamın ağzı biraz oynar, arkaplan biraz kayar, vb. Birçok video kodeki bu özelliği kullanarak videoların boyutlarını düşürür. Bu kodekler birkaç saniyede bir tam bir frame alırlar, öteki frameleri referans frame'indeki farklarla belirtirler. Bu sayede her frame'in tam olarak dosyada depolanmasına gerek kalmaz. Tam frame'ler Intra frame, I-frame veya keyframe olarak adlandırılır.
İşaretçiler key frame'lere koyulmak zorunda değildir. Örnek bir akım şöyle gözükebilir:
abAdeIghBjklInop
Buradaki küçük harfler ara frame'leri, A ve B işaretli frame'leri ve I de intra frame'leri belirtmektedir. Burada kesme işlemi uyguladığınızda (yani [A,B) aralığındaki frame'leri aldığınızda):
abjklInop
gibi bir şey ortaya çıkacaktır. Burada jkl frame'leri artık olmayan bir frame'den farkları belirtmektedir. Bu frame'lere bozuk frame denir. Bununla baş etmenin iki yolu vardır:

B işaretçisinin bir I-frame'de olduğundan emin olun.
Eğer dosyanız MSMPEG-4 (DivX 3) veya MPEG-4 videosu kullanıyorsa, smart copy modunu kullanabilirsiniz. Smart copy frame'lerin çoğunu değiştirmez, ancak sabit bir quantizer ile, referansını kaybeden frame'leri yeniden kodlar. Yani örneğimizde ab ve nop değişmeden kalacak, ancak jkl frame'leri farklı bir referans frame'i kullanacak şekilde yeniden kodlanacaktır. Smart copy, quantizer'in kullanacağı değeri soracaktır - 4 veya 5 genelde iyidir.

Frame'ler CTRL+C ve CTRL+V tuş bileşimleriyle kopyalanıp yapıştırılabilir. Kopyalama yaparken ilk frame'in bir I-frame olduğundan emin olun; yapıştırmayı ise bir I-frame'den hemen önce bir yere yapın. Smart copy, bu durumda da çalışmaktadır (ancak ilgili akımın B-frame içermemesi gerekir).

1. Değişken bit oranına sahip ses içeren bir dosya düzenliyorsanız herhangi bir şey yapmadan önce Audio->Build VBR Time Map menüsünü izleyin. Aksi durumda sesinizin videoyla senkronizasyonu bozulacaktır.

2. Düzenlemek istediğiniz aralığın başına  düğmesiyle A işareti koyun.
3. Düzenlemek istediğiniz aralığın sonuna  düğmesiyle B işareti koyun.
Başlangıç ve bitiş noktalarından emin olmak için ekranın alt kısmındaki Selection kısmına bakın:

4. Edit->Delete menüsü, akımdan [A,B) aralığındaki frame'leri silecektir.

5. File->Save->Save Video menüsü aracılıyla videoyu bazı istediğiniz kısımları silinmiş halde kaydedersiniz. Bu değişikliği (silme işlemini) yapabilmek için bazen Video Copy ve Audio Copy modları yeterli olabilirken, bazen de illaki kodlama yapmanız gerekebilmektedir.

File->AVI Muxer Options menüsünü kullanarak megabyte olarak bir dosya boyutu belirtebilirsiniz. Dosyada ilgili dosya boyutuna ve bir intra frame'e her varıldığı anda Avidemux yeni bir dosya oluşturacaktır. Ortaya dosya.avi.1, dosya.avi.2 gibi dosyalar çıkacaktır.
Oluşturulan her dosya bir I-frame'le başlaması gerektiğinden oluşturulan her dosyanın belirttiğiniz dosya boyutunda olması garantisi verilemez, aşağı yukarı 5 MB oynar.

Avidemux birçok argümanla çalıştırılabilir. En basit olanı avidemux Dosya.avi dir, bu komutla Dosya.avi dosyası Avidemux'la açılır.
Avidemux başka argümanlarla da çalıştırılabilir, bu argümanların hepsi - ile başlar ve hepsi farklı bir işe yarar. Ancak komut satırında grafik arayüzle yaptığınız her şeyi yapamazsınız
Uyarı: Komut satırında bütün ileti kutuları atlanacak ve bütün sorulara "NO" cevabı verilmiş varsayılacaktır.
Uyarı: İndeksler kaydedilmemektedir. Örneğin avidemux2 dosya.nuv komutu verdiğinizde indeksin kaydedilip kaydedilmeyeceği sorulmayacaktır.
Argümanlar soldan sağa doğru alınır ve tek seferde işlenir. Komut satırı grafik arabirimin güvenilirliğinden uzaktır, çünkü grafik arabirimde birçok kontrol yapılır.
Workbench dosyaları birer proje dosyalarıdır. Workbench terimi programdaki geçerli video ve ayarlarını belirtir. Workbench'i kaydettiğinizde bir proje dosyası elde etmiş olursunuz.

Kullandığınız Avidemux'un komutlarını ve parametrelerini öğrenmek için Avidemux'u --help argümanıyla çalıştırın.

Sesi libavcodec ile kodlama:

avidemux2 --load input.avi --audio-process \
--audio-normalize --audio-resample 44100 --audio-codec MP2 \
--audio-bitrate 224 --output-format PS --video-process \
--vcd-res --video-codec VCD --save output.mpg --quit

Sesi TWOLAME ile kodlama:

avidemux2 --load input.avi --audio-process \
--audio-normalize --audio-resample 44100 \
--audio-codec TWOLAME --audio-bitrate 224 \
--output-format PS --video-process --vcd-res \
--video-codec VCD --save output.mpg --quit

Önce sesi WAV formatında kaydedin:

avidemux --load input.avi --audio-process \
--audio-normalize --audio-resample \
--save-uncompressed-audio /tmp/videocd.wav

Sonra WAV'ı Lame ile ayrıca kodlayın:

lame /tmp/videocd.wav -vbr -v -V 4 \
/tmp/videocd.mp3

MP3'ü yeniden açın ve AVI'yi kaydedin:

avidemux --load input.avi --external-mp3 /tmp/videocd.mp3 \
--audio-map --save /tmp/new.avi

Bir VBR MP3 ürettiğimiz için ses haritası çok önemlidir. Aksi takdirde senkronizasyonda çok büyük kaymalar meydana gelir.
Bu sadece bir örnekti. Öbür türlü bu işlemi komut isteminde yapmak pek mantıklı değildir. Grafik arayüzlü versiyonu kullanarak MP3 VBR'a direkt olarak kodlayabilirsiniz.

Bu örnek, MP4 dosyasını güvenlice açacaktır (eğer H.264 videosu veya başka bir şey içeriyorsa önemli değil). Sonra dosya, bir AVI kapsayıcısına kaydedilecektir, video ve sese bir değişiklik yapılmayacaktır. Genel komut şudur:

avidemux2 --force-alt-h264 --load "video.mp4" \
--save "video.avi" --output-format AVI --quit

Aktif klasördeki bütün MP4 dosyalarını işleyen küçük bir betik şöyledir:

#!/bin/bash
VAR="dosya.txt"
ls *.mp4 | sort > $VAR # Aktif klasördeki dosyaları toplama
cat $VAR | while read line; do  # Döngü dosyadan dosya adlarını okur
  INPUT=$(echo ${line}) # Sonraki yeni dosya adını tutar
  OUTPUT=${INPUT%.*4} # Stringin sonundaki '. ' ve '4' arasındaki en kısa karakter eşleri silinir
  OUTPUT+=".avi" # Yeni ilave sona eklenir
  avidemux2 --force-alt-h264 --load "$INPUT" --save "$OUTPUT" --output-format AVI --quit 
done
rm $VAR # Metin dosyası, dosya adlarıyla birlikte silinir

Avidemux'u derlemeden önce kaynak koddan kurulum yapabilmenizi sağlayan bazı programları ve Avidemux'un bağımlılıklarını kurmanız gerekmektedir. Ayrıca Avidemux'un kaynak kodunu da edinmelisiniz.

Herhangi bir derlemeye başlamadan önce bazı araçlara ihtiyacınız var. Ubuntu (ve Kubuntu, Mythbuntu gibi bütün türevleri) ve Debian gibi birçok Linux dağıtımı build-essential isminde bir paket içerir. Bu paket kaynak kodları derlemeye başlamadan önce derleme için gerekli programları kurmanızı sağlar.
Bu paketi kurmak için Uçbirim'de aşağıdaki komutu verin:

apt-get install build-essential

Eğer dağıtımınızda apt-paket sistemi varsa, derleme için gerekli birçok bağımlılığı kolayca kurabilirsiniz. Ubuntu (ve Kubuntu, Mythbuntu gibi bütün türevleri) Debian ve diğer bazı dağıtımlar apt sistemini kullanır. Redhad ve benzerleri ise apt-rpm sistemini kullanır, ancak sonuçta yine aynı yola çıkar.
Eğer dağıtımınızın apt depolarında Avidemux paketi varsa şu komut çalışacaktır.

sudo apt-get build-dep avidemux

Bu komut Avidemux'un ihtiyaç duyduğu birçok paketi kuracaktır.

Aşağıdaki komut Ubuntu için anlatılmıştır, ancak Debian ve diğer benzer sistemlerde de çalışabilir. Buradaki liste kapsamlı değildir. Bu komut Avidemux'un derlenmesi için birçok gerekli ve ek bağımlılık paketlerini kuracaktır. Şu komutu komut satırında çalıştırın:

sudo apt-get install \
 build-essential \
 cmake \
 gettext \
 liba52-0.7.4 \
 liba52-0.7.4-dev \
 libasound2-dev \
 libarts1-dev \
 libfaac-dev \
 libfaad-dev \
 libgtk2.0-dev \
 libglib2.0-dev \
 libmad0-dev \
 libqt4-dev \
 libvorbis-dev \
 libx264-dev \
 libxv-dev \
 libxml2-dev \
 libxvidcore4-dev \
 pkg-config \
 subversion \

Avidemux'un kaynak kodunun içinde bulunduğu kaynak arşivini (*.tar.gz formatında) buradaki yansılardan birinden indirebilirsiniz. Kaynak kodu derlemek için ilgili dosyaları *.tar.gz dosyasından çıkartmalısınız.
Opsiyonel olarak "kararlı SVN kaynak kod" bölümünden kaynak kodu indirebilirsiniz.

svn co svn://svn.berlios.de/avidemux/tags/avidemux_2.5.1

Not: Bunu yapabilmek için subversion'dan indirme programına sahip olmanız gerekiyor.

2.5.x sürümüyle birlikte Avidemux otomatik olarak derleme yapmanızı sağlayan bir betik içeriyor. (Bu yapıldı, çünkü Avidemux birçok farklı platformda kullanılıyordu, bu yüzden de kullanıcılar oldukça karmaşık derleme işlemleriyle muhatap olmak zorunda kalıyordu. Bu betik sayesinde herkes kolayca Avidemux'u derleyebilecek).
Komut satırında, Avidemux kaynak kodunu çıkardığınız/indirdiğiniz klasöre geçin. Otomatik derleme için komut satırında aşağıdaki komutu verin.

sudo ./bootStrap.sh

Derlemenin geri kalanının otomatik ve sorunsuz olması gerekir.

Avidemux'u daha modüler bir program yapmaya çalışıyoruz. Bunun bir ürünü olarak çekirdek programdan farklı birçok eklenti var. Avidemux'u tüm yetenekleriyle kullanabilmeniz için eklentileri de kurmalısınız.
İlk aşamada Avidemux'un kendisini, ikinci aşamada da eklentilerini kuracaksınız.

2.4.x için, kurulum klasörünüzü oluşturun, sonra 

 cmake  *kaynak kod klasörünüzün yolu*
 make
 make install

Eklentileri kurabilmek için şu bilgilere ihtiyacınız var:

Programın kaynak ağacı
Kütüphanenin yolu
Ana program kurulurken oluşturulan config_xxx.h dosyalarının yolu.
Ve bitti. Ana programın tam kurulum ağacına asla ihtiyacınız yok.
Sonra kurulum klasörünüzü yaratın

 cmake -DAVIDEMUX_LIB_DIR=/usr/lib -DAVIDEMUX_SOURCE_DIR=/home/foobar/avidemux 
 -DAVIDEMUX_CORECONFIG_DIR=/home/foobar/avidemux/build/config PATH_TO_PLUGIN_DIR
 make

Not: Kullanılan yollar göreceli olmamalıdır. Örneğin ../../xx/yy gibi bir kullanım çalışmayacaktır.

svn veya 2.5.0'dan daha yeni bir versiyon kullanıyorsanız öncelikle bootStrap.sh betiğini çalıştırmanız tavsiye edilir. Bu betik derlemeyi yapacak ve Avidemux'u sisteminize kuracaktır.
Burada Ubuntu'da Avidemux 2.5'i nasıl derleyeceğinize dair bir örnek bulunmaktadır. Burada ek kütüphanelere, kodek paketlerine halihazırda sahip olduğunuz (kurulu olarak), ayrıca Avidemux 2.5'in kaynak kodunu indirdiğiniz (SVN veya sıkıştırılmış dosya yoluyla) varsayılmaktadır. Kaynak kod dosyanızın /home/kullanici_adi/avidemux_2.5_grunster klasöründe bulunduğunu varsayalım.
İlk adım Avidemux'un kendisini kurmak.

 cd /home/user_name/avidemux_2.5_grunster # veya kaynak kod dosyasını nereye kaydettiyseniz orayı belirtin
 mkdir build
 cd build
 cmake ..
 make
 sudo make install
 sudo ldconfig # Bu adım Ubuntu için gerekli

İkinci adım Avidemux'un eklentilerini kurmak, ilk adımda kaldığımız yerden devam ediyoruz.

 cd /home/user_name/avidemux_2.5_grunster/plugins/
 mkdir build
 cd build
 cmake -DAVIDEMUX_LIB_DIR=/usr/lib -DAVIDEMUX_SOURCE_DIR=/home/user_name/avidemux_2.5_branch_gruntster \
  -DAVIDEMUX_CORECONFIG_DIR=/home/user_name/avidemux_2.5_branch_gruntster/build/config \
  -DAVIDEMUX_INSTALL_PREFIX=/usr/local .. # Avidemux /usr/local yoluna kurulacaktır
 make
 sudo make install
 sudo ldconfig # Bu adım Ubuntu için gerekli

Avidemux, indekslenmiş MPEG dosyalarını okuyabilir, Elementary Stream (basit akım), Program Stream (program akımı) ve Transport Stream'i (taşıma akımı) destekler.
Avidemux'ta MPEG dosyalarının sahte bir kodek (MPEG kodeki) sayesinde frame'ler halinde gözükmesi sağlanır.
Dosyayı Copy modunda kaydederseniz, formatın AVI olarak ayarlanmadığından emin olun, aksi takdirde yaygın olmayan ve birçok uygulamanın oynatamadığı MPEG-in-AVI dosyası elde etmiş olursunuz.
Genellikle format olarak aşağıdakilerden birini seçersiniz:

MPEG PS A+V: En yaygın MPEG formatıdır, VCD, SVCD ve DVD için kullanılır.
MPEG TS A+V: DVB-S ve DVB-T tarafından kullanılır. Üretilen dosya global olarak desteklenir, ancak bazı ekipmanları bu formatı "boğar".
MPEG video: Sadece düz, basit video akımını saklar (.m1v/.m2v), başka bir muxlama uygulaması kullanıyorsanız kullanışlıdır.
PS ve TS'in her ikisi de ses ve video içeren bir MPEG dosyası üretir.

Her zamanki gibi üzerinde çalışmak istediğiniz kısmı  ve  düğmelerini kullanarak seçin. 
Eğer henüz okumamışsanız Kesme sayfasını okuyun. 
Format "MPEG PS A+V" ise Avidemux, libmplex'i kullanarak bir MPEG-2 program akımı (PS) yazacaktır. Akım, formata bağlı olarak VCDImager'ı kullanarak VCD/SVCD veya dvdauthor'u kullanarak DVD yazımına uygun olacaktır.

DVD için, ses 48 kHz ve MP2 veya AC3 olmalıdır (yani günümüz itibarıyla libavcodec AC3, Aften AC3, libavcodec MP2 veya TwoLAME).
SVCD için, ses 44.1 Khz stereo MP2 olmalıdır (FFMP2 veya TwoLAME).
VCD için, ses 44.1 Khz stereo MP2 ve 224 kb/s olmalıdır (FFMP2 veya TwoLAME).
Ses copy veya işleme modundan olabilir (örneğin bir PVR yakalama dosyasını düzenleme).

Video elbette ki MPEG olmalıdır. Ses ise copy modunda (düzenlenmiş PVR veya DVD) veya işleme modunda (AVI'den veya başka formatlardan dönüştürülmüş) olabilir.

Çıktı formatı "MPEG PS A+V" olarak ayarlanmış olmalıdır. Sesle video senkronize değilse A/V shift onay kutusunu kullanabilirsiniz (copy modunda bile).

Göz önünde bulundurmamız gereken iki önemli şey var:

Muxlama varsayılan olarak sesle video arasında 40 ms senkron kaymasına neden olur. Senkronizasyonda bir sorun görmüyorsanız bu değeri önemsemeyebilirsiniz.
MPEG PS olarak kaydederken düzenlenmiş PVR akımlarındaki atlamadan kaçınmak için GOP tarih damgası yeniden hesaplanır.

Her zamanki gibi üzerinde çalışmak istediğiniz kısmı  ve  düğmelerini kullanarak seçin. Eğer henüz okumamışsanız Kesme sayfasını okuyun.

Dikkat edilecek özel bir durum yok. Sadece sesi copy modunda Audio->Save menüsünü izleyerek kaydedin. dosya.mp2 veya dosya.ac3 gibi dosyalar elde edeceksiniz.

Video için çıktı formatını "MPEG video" olarak ayarlayın ve sonucu kaydedin. Bu işlem MPEG çözme işlemini atlayarak, demuxer'a düz veriyi soracaktır. Ayrıca uygun bir MPEG akımı elde etmek için PTS/DTS mantığını yeniden inşa edecektir.
Şimdi dosya.m1v veya dosya.m2v isminde MPEG-1/MPEG-2 basit akımı elde edersiniz, dosya.mp2 ile senkronize edilmesi tavsiye edilir.

Şimdi dosya.mpg dosyası elde etmek için her iki akımı birleştirme zamanı geldi. İlk seq_header ilk kesilmemiş frame'in zaman damgasına sahiptir. Ancak bu Mplex'i şaşırtabilir ve birçok hata/uyarı mesajı alabilirsiniz.
Eğer sorunla karşılaşırsanız Transcode'dan tcmplex'i, akımları birlikte geri muxlama için kullanın.

Bu sayfada yakalanmış MPEG dosyalarını düzenleme hakkında ipuçları bulunmaktadır. Bu yakalanmış MPEG'ler genelde DVB S/T'den (MPEG TS formatında),  IVTV tabanlı kartlardan veya MPEG PS formatında MPEG-2 kaydeden diğer kartlardan yakalanmıştır.

Bu yakalamalar sıklıkla kayıp veya bozuk frame'ler olarak ortaya çıkan iletim hatalarını içerir. MPlayer, xine veya VLC gibi oynatıcılar, akıma gömülü olan zamanlama bilgisini kullanarak sık sık akımı senkronize ederler. Ancak Avidemux bunu yapmaz.
Timeshift filtresiyle kolayca halledilebilen basit ses kaymasını bir kenara bırakırsak ayrıca bir de kodlama veya format değiştirme esnasında ortaya çıkan bir senkronizasyon problemi de oluşacaktır. Yeniden kodlama yapmadan kaydetme bile bu senkronizasyon bozukluğunu engellemeyecektir.
MythTV kayıtları bu sorunun en önemli örnekleridir. Eğer aşağıdaki işlem yapılmazsa ses videodan yaklaşık 330 ms önde olacaktır. Ancak bütün MythTV kayıtlarında aynı sorun bulunmayabilir. Sorunun ortaya çıkıp çıkmaması yazılım ve donanım yapılandırmasına bağlıdır.

Bu sorunun tek %100 güvenilir çözümü ProjectX'tir (bkz: ProjectX öğreticisi). ProjectX biraz zaman alır ama kolay betiklendirilir. Örnek bir betik burada mevcuttur. Şimdi MPEG TS formatında ve 2537_20060819203500.mpg isminde yakalanmış bir DVB dosyanız (DVB-T) olduğunu varsayalım.
Öncelikle dosyadan sesi ve videoyu basit akımlar elde edecek şekilde ayıracağız (ancak senkronize basit akımlar).

projectx 2537_20060819203500.mpg

Bu kod sonucunda her bir basit akım için aşağıdaki uzantılara sahip birer dosya oluşacaktır:

m2v: video akımı için
mp2: MPEG ses akımı için
ac3: Dolby Digital (yani AC3) akımı
Şimdi bu akımları PS formatı elde edecek şekilde birleştirmeliyiz. Komut şu şekilde:

mplex -f 8 -o olusan_dosya.mpg 2537_20060819203500.ac3 2537_20060819203500.m2v 2537_20060819203500.mp2

Oluşan dosya (olusan_dosya.mpg) Avidemux'la düzenlenebilir (örneğin reklamları silmek amacıyla) veya senkronizasyon problemi olmadan başka bir formata kodlanabilir.
ProjectX, akımları senkronize etmek için son derece güvenilirdir, kayıp ses frame'leri kopyalama yoluyla oluşturur ve kayıp video frame'leri yerine boş frame koyar.
Win32 sistemler için olan mplex'in güncel sürümlerini bulmak zordur, ancak ImagoMPEG-Muxer bu programın yerini alabilir.

Eğer MPEG-4 gibi başka bir formata kodlama yaparsanız, muhtemelen "Preferences" penceresindeki "Input" sekmesinden "Use libavcodec MPEG decoder" ayarını etkinleştirmek isteyeceksiniz. libavcodec, çözme hatalarını gizlemeye yarayan kodlar içerir. Yani yeşil bir blok elde etmektense büyük oranda doğru ama bulanık bir blok elde edeceksiniz. Yeşil bir blok görmektense bulanık bir blok görmek izleyiciyi daha memnun edecektir.

Basit konuşmak gerekirse multithreading bilgisayarın herhangi bir işini birden fazla parçaya bölmesidir. Eğer bilgisayarınızın işlemcisinin birden fazla çekirdeği varsa (veya bilgisayarınızın birden fazla işlemcisi varsa) işler parçaya bölünüp paralel olarak işlenebilir, bu sayede işler daha kısa sürede sona erer.
Günümüzdeki bilgisayarların çoğu birden fazla çekirdeğe sahiptir. Avidemux, multithreading teknolojisini çeşitli derecelerde destekler.

Avidemux'un bazı multithreading yetenekleri olmasına rağmen, Avidemux'un kendisi, grafik arabirim, betik motoru ve çeşitli packing & unpacking, muxing & demuxing programcıklarının multithreading destekleri yoktur. Ancak bu üzülünecek bir şey değildir. Avidemux'un kendisinin yaptığı iş çok küçüktür, Avidemux asıl işi çeşitli kodeklere yaptırır (örneğin libavcodec kodekleri, Xvid, ve x264). Kodlama işlemi birçok durumda toplam işlemin en az % 60'ı kadar işlemci harcar.
Bazı kodekler multithreading desteğine sahiptir. Aşağıdakiler, Avidemux'taki multithreading desteğine sahip kodeklerdir:
Kodlama

x264
libavcodec MPEG-1/MPEG-2
libavcodec MPEG-4
Xvid
Çözme

libavcodec MPEG-1/MPEG-2
libavcodec MPEG-4

Multithreading desteği Avidemux'un sadece son sürümünde etkinleştirilebilir (>=2.2 veya SVN). Avidemux'un 2.2 sürümünü veya daha üstünü kurduktan sonra Avidemux'u başlatın. Sonra "Tools->Preferences" menü yolunu izleyin, açılan pencerede "MultiThread" sekmesinde programın kaç tane çekirdek/işlemci kullanacağını ayarlayabilirsiniz.
Olası değerler:

0: Multithreading pasifleştirilir - CPU gücü ve zamanının yönetimi işletim sistemine bırakılır.
1: 0 ile aynıdır.
2: İki tane işlemcisi veya bir tane çift-çekirdekli işlemcisi olan bilgisayarlar içindir.
3: Üç işlemcisi veya duble çift-çekirdekli işlemcisi olan bilgisayarlar içindir.
4: Dört işlemcisi veya iki tane çift-çekirdekli işlemcisi veya bir tane dört-çekirdekli işlemcisi olan bilgisayarlar içindir.
Varsayılan durumda multithreading pasiftir (0'a ayarlıdır). Kullanıcılar multithreading'in kullanmak zorunda değildir ve multithreading istenilen zamanda kapatılıp açılabilir.

Avidemux, işlemciyi çok fazla sömürmez, yani Avidemux'la video kodlama/çözme yaparken sistemde ciddi bir yavaşlama hissetmemeniz gerekir. Bazı kodekler multithreading'i diğerlerinden daha iyi kullanır. Bu, tamamen kodeklerle ilgili bir konudur. Avidemux'la kodlama/çözme yaparken performansın düşük/yüksek olması Avidemux'la değil, kodekle ilgili bir konudur.
Kullanıcılar, çift çekirdekli işlemcili bilgisayarlarda multithreading desteğiyle Xvid'i kullanırken tek çekirdekli işlemle arasında bir fark olmadığını belirtmişlerdir. Yani Xvid multithreading'i destekler, ancak multithreading modunda hiçbir performans artışı sağlanmaz.
Ancak kullanıcılar x264'ü multithreading teknolojisi ile kullandıklarında ciddi performans artışı olduğunu bildirmişlerdir. Yani durum gösteriyor ki kodeklerin multithreading teknolojisiyle kullanımındaki performans kazancı değişebilmektedir. Kodeklerin multithreading modunda daha hızlı veya yavaş çalışması Avidemux'la değil, kodekin kendisiyle ilgilidir.

Avidemux'un bünyesindeki kodeklerin hiçbiri Avidemux programcıları tarafından yazılmamıştır. Avidemux programcıları bu kodeklerin gelişimine katkıda bulunmamışlar ve kaynak kodunda hiçbir değişiklik yapmamışlardır.
Kodeklerin multithreading teknolojisi destekleri kodek geliştiricilerinin sorumluluğundadır. Multithreading desteği olan kodeklerin çoğunun multithreading destekleri Avidemux arayüzüyle açılıp kapanabilir.
Eğer herhangi bir kodekin multithreading desteği kazanmasını istiyorsanız ilgili isteğinizi, kodeki yazan kişi(ler)/şirket(ler) ile iletişime geçerek bildirebilirsiniz. Multithreading desteği kazanmış ama Avidemux'ta -henüz- multithreading desteği olmayan versiyonu kullanılan bir kodeke rastlarsanız lütfen bu durumu Avidemux topluluğuna bildirin. Avidemux topluluğuyla Avidemux forumu aracılıyla iletişim kurabilirsiniz.

Bir Avidemux proje dosyası aslında sadece bir ECMAScript (JavaScript olarak da bilinir) metin dosyasıdır. Bu dosya, aktif düzenlemenin bütün ayarlarını (kesme ve filtreler de dahil) içerir. Dosya ECMAScript olduğu için bu dosyayı düzenleyebilir ve güçlü betik dilini kullanabilirsiniz. Örneğin bir klasörün içindeki bütün videolara aynı işlemi uygulayabilirsiniz.
Manuel olarak veya --force-unpack komut satırı anahtarıyla yapılmak zorunda olan unpack işlemi dışındaki ayarların çoğu proje dosyasında kaydedilir.
Betik dilini kullanma sayfasında ek ECMAScript fonksiyonlarını inceleyebilirsiniz.

İşler de aslında birer ECMAScript'tir. Bu dosyalar klasik proje dosyalarından en sondaki fazladan "app.save(dosyaadi);" satırıyla ayrılır. Bu dosyalar $HOME/.avidemux/jobs/ klasöründe tutulur.

Özel betikler de birer ECMAScript dosyalarıdır. $HOME/.avidemux/custom klasöründe tutulurlar. Bir proje dosyasının içerebileceği her şeyi içerebilirler, ancak bu dosyaların kullanışlılığı başka bir yerdedir. Bunlar; video kodlayıcısı seçimi ve konfigürasyonunu, video filtrelerini, ses kodlayıcısı seçimi ve konfigürasyonunu, ses filtrelerini ve format seçimini tek seferde, ayrı ayrı veya herhangi bir kombinasyonda içerebilirler.
Örneğin, aynı kodlayıcı konfigürasyonunu özel matrikslerle veya filtre setiyle birlikte çok sıkça kullanma ihtiyacı duyabilirsiniz.
Bu durumda, bunu manuel olarak yapın ve proje dosyasını kaydedin. Sonra proje dosyasını açıp ilgilendiğiniz kısım olan filtreler veya kodlayıcı dışındaki her şeyi silin. Dosyayı özel (custom) betikler klasörüne koyun. Betiğin Custom menüsünde gözükmesi için dosya adının .js ile bitmesi gerekmektedir.
Şimdi Avidemux'u başlattığınızda ilgili betik Custom menüsünde gözükecektir. Bu betiği menüden seçerek özel kodek ve/veya filtreleri tek tıkla uygulayabilirsiniz.
Daha fazla ayrıntı için Ön ayarlar sayfasına bakın.

ProjectX, birçok akım türünü işleyip onarabilir ve istenirse neyin yanlış gittiğini söyleyebilir. ProjectX, MPEG dosyalarını onarmak için (özellikle ses/video senkronizasyonunu düzeltmek için) son derece kullanışlıdır.

ProjectX'i çalıştırabilmek için Java'nın kurulu olması gerekir. Java'nın kurulumu sistemden sisteme değişebilmektedir. Burada çeşitli işletim sistemlerinde Java'nın kurulumu anlatılmıştır.

apt-source listenizdeki universe deposunu etkinleştirin. Bir root konsolundan veya sudo ile nano, vim, gedit, vb. bir metin editörüyle /etc/apt/sources.list dosyasını açın. Dosyadaki repository satırlarından birinde "universe"i etkinleştirin.
apt-sources dosyanızdaki "universe" deposunun etkinleştirildiğinden emin olduktan sonra bir root konsolundan veya sudo ile şu komutu verin:

sudo apt-get update

Şimdi ise Java'nın kendisini yüklüyoruz. Şu komutu root konsolundan su veya sudo'nun biriyle çalıştırın:

sudo apt-get install sun-java6-bin

ProjectX, Java dili ile yazılmıştır ve hemen hemen her platformda çalıştırılabilir. Doom9.org'un Downloads bölümünden çalıştırılabilir jar dosyalarını indirebilirsiniz.

ProjectX'in zip dosyasını indirdikten sonra bu zip dosyasının içeriğini çıkarmanız gerekiyor. Bunu nasıl yapacağınız işletim sisteminize bağlıdır. Birçok Linux/BSD sisteminde unzip komutu işe yarar. Örnek komut:

unzip ProjectX_0.90.4.zip

ProjectX'i indirdikten sonra kolayca çalıştırabilirsiniz. Tam olarak nasıl çalıştıracağınız işletim sisteminize bağlıdır.

Linux ve BSD türevi sistemlerde eksiksiz ve işe yarayan konsol ortamı mevcuttur. ProjectX'i konsoldan çalıştırabilirsiniz. Konsolda komut vermeden önce konsoldaki aktif klasörün ProjectX'in .jar dosyasının olduğu klasör olsun veya .jar dosyası sistem yolunuzda olsun. Sonra şu komutu verin:

java -jar ProjectX.jar

ProjectX şimdi açılacaktır.

Eğer Windows kullanıyorsanız genellikle .jar dosyasına çift tıklamak programı çalıştırmak için yeterlidir. Alternatif olarak dosyayı sağ tıklar, açılan menüden Açı seçersiniz. Java düzgün kurulmuşsa ve ayarları oynanmamışsa Java uygulamayı sizin yerinize çalıştıracaktır.

Eğer Ubuntu kullanıyorsanız ve ProjectX'i konsoldan çalıştırmaya çalışırken hatayla karşılaştıysanız, Java'yı yapılandırmak için aşağıdaki komutu vermeniz gerekebilir (root olarak veya sudoyu kullanarak):

sudo update-alternatives --install /usr/bin/java java /usr/local/java/bin/java 3
sudo update-alternatives --config java

Bu komut, çalıştırma esnasında oluşan sorunu çözmediyse, lütfen buradaki Java kurulum sayfasına başvurun.

ProjectX, bir SourceForge projesidir. Programla ilgili haber ve güncellemeler http://sourceforge.net/projects/project-x adresinde bulunabilir. Bu site, derlenmiş dosyayı içermez ve buradaki versiyonu kullanmak istiyorsanız bu dosyayı sizin oluşturmanız gerekebilir. Genellikle normal çalıştırılabilen dosyalar oldukça günceldir.

Help > About yolunu izleyin. Burada büyük.küçük versiyonu ve tam revizyon numarasını göreceksiniz (rXXXX). Bu yazının yazıldığı tarihte (28 Temmuz 2009) Avidemux'un son sürümü 2.5 (r5152) idi.

Avidemux, dosya uzantısını otomatik olarak eklemez. "Videom" isminde bir AVI dosyası kaydedeceğiniz zaman, dosyanın adını "Videom.avi" yapın. Eğer yanlışlıkla "Videom" olarak kaydetmişseniz dosya yöneticinizle ismini "videom.avi" olarak değiştirin. Her çıktı formatının kullandığı uzantıların listesini Desteklenen çıktı formatları bölümünde bulabilirsiniz.

Bu genellikle videoyu "Copy" olarak ayarladığınızda oluyor, bu beklenen bir davranış. Copy modunda girdi dosyası, çıktı dosyasına olduğu gibi kopyalanır (copy), herhangi bir fitre veya altyazı eklenmez. Video açılır menüsünde "Copy" seçili olduğu zaman, "Filters" butonu pasif haldedir ve "Video > Filters" yolu izlendiğinde "Video filters cannot be used in copy mode" uyarısı çıkar. Bu sorunu çözmek için "Copy" yerine bir kodlayıcı (encoder) seçmeli, filtreleri eklemeli, sonra tekrar "copy" moduna almalısınız. Bu sayede filtreniz uygulanacak ancak enkode işlemi (türler arasında dönüşüm) olmayacaktır.
Videoya fitre(ler) eklemek için video açılır menüsünden uygun bir encoder (kodlayıcı) (ihtiyaçlarınıza en çok uyan) ardından format ve dosya uzantısını seçin.
UYARI: Avidemux'un eski versiyonları copy modundayken "Video > Filters" yolunu izlediğinizde herhangi bir uyarı yapmıyor ve "Filters" butonunu da pasifleştirmiyor. Ayrıca format "AVI, unpack VOP" (bu format videoyu paketten çıkarıp çıkarmamak istediğinizi soran bir soruya "yes" karşılığını verdiğinizde işlemi otomatik yapıyor) olarak ayarlandığında, video copy modunda kaydediliyor, yani fitreler uygulanmıyor.

Öncelikle, geçerli oturum için "Video > Post processing ..." menüsünü izleyerek post-processing'in kapalı olduğuna emin olun. Ayrıca elbetteki bu işlemi "Tools > Preferences" menüsünü izleyip Video sekmesine gelerek de yapabilirsiniz. Sonraki adım, eğer yeniden boyutlandırma fitresi eklemişseniz bu fitreyi Bilinear veya Bicubic yerine Lanczos3 metodunu kullanarak eklemelisiniz. Lanczos3 en doğru çalışan yeniden boyutlandırıcıdır. Ancak doğal olarak yeniden boyutlandırma detayları öldürür, bunun bir çözümü yok. Ancak bazen ne yapmak istediğinize bağlı olarak yeniden boyutlandırma daha keskin görüntü sağlayabilir. Son olarak kodlayıcı ayarlarında ince ayarlar yapın. Ancak burada her kodlayıcı için en iyi kaliteyi nasıl elde edeceğinizi anlatmayacağız. Kodlayıcıya bağlı ayarlar hakkında geniş bilgiyi Avidemux forumundan veya web'den bulabilirsiniz.

Medya oynatıcınızın ilgili formatı desteklediğinden emin olun. Örneğin Windows Media Player kullanıyorsanız ve videoyu MPEG-4'e (ASP veya AVC) kodlamışsanız, sisteminizde bir üçüncü parti MPEG-4 çözücüsü kurulu olmalıdır, çünkü Microsoft Windows ilk kurulduğunda MPEG-4 çözücüsü yoktur. Buradan modern ses ve video formatlarının çoğu için çözücüler indirebilirsiniz.

Tercihlerden (Preferences->Audio->Audio output) doğru ses çıktısının ayarlı olduğundan emin olun. Microsoft Windows'ta, bu win32, Linux'ta ise ALSA, OSS, ESD veya aRts olabilir. Eğer sadece belirli formatların sesini duyamıyorsanız, bu Avidemux'un o formatı desteklemediği veya o format desteği veren çözücünün Avidemux'la derlenmediği anlamına gelir. Help->Built-in Support yolunu izleyerek Avidemux'un hangi formatları desteklediğini öğrenebilirsiniz.

2-pass ayarlarında hedef video için yazdığınız boyut sadece video içindir. Ses parçaları bu belirttiğiniz boyutu artırırlar. Sadece videonun boyutunu hesaplamak için Avidemux'taki hesap makinesini kullanın; buraya hedef dosya boyutunu, formatı ve sesin bit oranını girin, Apply düğmesine basın (seçili çözücüde 2-pass video boyutu saklanacaktır) ve kapatın.
Not: Benzer bir problemle Avidemux'un 2.4.4'ten önceki sürümlerinde Windows'ta hedef klasör adresinde ANSI olmayan karakterler (örn. éàùôèí vb.) mevcut olduğunda ve Xvid kodekini kullanıyorsanız yüzleşirsiniz. Böyle bir durumda, stats dosyası oluşturulamaz ve Xvid "fixed quantizer mod"a (quantizer 2 ile) girer. Eğer Avidemux'u güncelleyemeyecek durumdaysanız, bu sorunu aşmak için dosyayı adresi sadece ANSI karakterleri içeren bir klasöre kaydedin.

Daha küçük dosya boyutu dosyanın zaten kalitesinin düşük olduğu anlamına gelir, Avidemux en büyük kaliteyi elde edecek şekilde kodlamıştır. Videonun ayarlarıyla oynamadan (örneğin çözünürlüğü artırmadan veya daha az sıkıştıran bir kodlayıcı ayarı seçmeden) dosyanın boyutunu artıramazsınız. Bu aslında son derece zararsızdır, dosyanın boyutunu normalinden fazla artırmak istemek mantıksızlıktır. Bir dosyanın en büyük kalitede doğru şekilde kodlanıp kodlanmadığından videoyu Avidemux'la açıp frame type bilgisine bakarak emin olabilirsiniz: Dosya:Frame type.png. Eğer parantez içindeki sayı her frame için 2'yse (veya B-frame'ler için 4'se) bu, dosyanın gerçekten de en düşük quantizer (2) yani en yüksek kalite ile kodlandığı anlamına gelir.

Varsayılan olarak, Avidemux 4 GB dosya limiti olan standard AVI dosyaları üretir. OpenDML dosyalarının böyle bir limiti yoktur. Avidemux'ta OpenDML çıktısını etkinleştirmek için tercihlerden "Create OpenDML files"ı işaretlersiniz.

Kütüphaneler için geliştirme paketlerinin kurulu olduğuna emin olun. Örneğin FAAC desteği için ayrıca (lib)faac-dev veya (lib)faac-devel paketini kurmalı ardından Avidemux'u yeniden derlemelisiniz.

Avidemux, şu an itibarıyla yalnızca type-2 DV dosyalarını açabiliyor. type 1 ve type 2 olmak üzere İki tip DV dosyası var (aralarındaki farkları öğrenmek için: buraya bakın). Ancak, bazı kameralar type-1 DV videosu üretiyor. type 1'i type-2 DV'ye dönüştürmek için, Canopus'un bu aracını veya Ulead'ınki ni kullanabilirsiniz.

log dosyası (admlog.txt), Avidemux göçtüğünde oluşturulan proje göçme dosyası (crash.js) ile birlikte %APPDATA%/avidemux klasöründe bulunur. Windows Explorer adres çubuğuna %APPDATA%/avidemux/admlog.txt adresini direkt olarak girmeniz durumunda log dosyası açılacaktır (genellikle notepad ile).

İş dosyalarınızı %APPDATA%/avidemux/jobs klasöründe, .js dosyaları olarak bulabilirsiniz. Herhangi bir düz metin editörüyle değiştirilebilirler.

Copy modunda Avidemux ses kaynağını (haricî, dâhilî, vb.) olduğu gibi çıktı dosyasına kopyalayacaktır. Copy modunda sesteki çalışan tek işlem ses kaydırma (Shift - ses ve video arasında doğru senkronizasyon için) işlemidir.

DRC: Audacity'den sıkıştırıcı kod kullanır. Düşük ses seviyesini yükseltir.
Timeshift: Ses/video senkronizasyonunu değiştirir. Birim milisaniyedir.

None: Sese değişiklik yapmaz
Resample to: Örnekleme frekansını değiştirir. Belirli bir frekans isteyen formatlar için gereklidir (örneğin DVD, 48 kHz ses ister).

Bu filtreler mutlaka elle video frame oranı değişiminde kullanılmalıdır, aksi takdirde bu filtreler senkronizasyonu değiştirebilirler.

Film to PAL: Videonun frame oranını 23.976'dan 25'e yükselttiğinizde kullanın.
PAL to Film: Videonun frame oranını 25'ten 23.976'ya düşürdüğünüzde kullanın.

Sesin ortalama şiddetini düşüren ve yükselten dinamikleri ayarlar. Bu seçeneği aktifleştirmek için Gain'i kontrol edin.

Otomatik (max - 3 dB)
Manuel (dB): Sesin ne kadar yükseleceğini ve düşeceğini buradan ayarlayın. Bu ayar amplifikasyon seviyesindedir, yani son derece güçlüdür.

Mixer duymak istediğiniz kanalların sayısını değiştirir. En yaygın kullanım 5.1'den stereo'ya geçmektir. Dolby Pro Logic II downmixing yapmak isteyebilirsiniz. Bunu yaparken ayarın verimli olmasına özen gösterin, Dolby Pro Logic sesi düşük bir bit oranıyla (~ < 160 kb/s) kodlanamaz.

Açık kaynak dünyasında çeşitli ses kodekleri mevcuttur. AVI dosyaları üretmek için genelde LAME MP3 kodeki kullanılır. Çünkü mp3 çok kalitelidir ve birçok video oynatıcı tarafından desteklenir. Eğer mp3'ün patent sorunları hakkında endişeleriniz varsa veya daha kaliteli bir kodek kullanmak istiyorsanız Vorbis'i tercih edebilirsiniz.
Avidemux, sesleri Audio açılır menüsünde bulunan ses kodekleriyle kodlayabilir. Kodekinizi seçin, sonra Audio -> Save yolundan ses dosyanızı kaydedin.
NOT: Ham Vorbis sesleri çalınamaz, Ogg veya Matroska gibi bir kapsayıcıya ihtiyaç duyarlar.
NOT: Paket isimleri Debian/Ubuntu sisteminden alınmıştır. Bu yüzden bu paket isimleri, diğer Linux dağıtımlarında -düşük ihtimal de olsa- farklı isimlerde olabilir. Birçok Debian paketi burada bulunabilir.

MPEG-1 Layer 3 (MP3) ses akımlarını üretir. liblame0 paketi tarafından sağlanan libmp3lame.so kütüphanesine ihtiyacı vardır.
Bu kodekin kaynak kodu LAME paketinden GPL lisansı altında edinilebilir, bkz: http://www.mp3dev.org/. Bu paketin Debian dağıtımında bulunmasını engelleyen bazı patent sorunları vardır. Debian'ın LAME'i içerip içermemesi gerektiği hakkında yapılan bir tartışma için http://www.debian.org/devel/wnpp/unable-to-package adresine bakabilirsiniz.
Desteklenen modlar: Mono, Stereo ve Joint Stereo. Desteklenen bit oranları: 48-384 kb/s CBR, ABR ve Ekstrem (aggressive VBR).

Vorbis seslerini üretir. libvorbisenc2 paketindeki libvorbisenc.so.2 kütüphanesine ihtiyaç duyar. Bu format MP3'ün özgür yazılımdaki karşılığı olması amacıyla geliştirilmiştir, ancak bunda da bazı patent sorunları vardır. Ses kalitesi MP3'ten daha iyidir. Müzik çalarların desteği pek iyi değildir, ancak gün geçtikçe artmaktadır.
Desteklenen modlar: Stereo ve Joint Stereo. Desteklenen bit oranları: 48-384 kbits. Avidemux'ta bu format için CBR veya VBR modlarını kullanabilirsiniz.
Vorbis sesini AVI'nin içine koymayın! Videonun oynatılamamasına yol açacaktır, AVI yerine OGM'yi seçin.

AAC ses dosyalarını üretir. AAC sesinin MP4 dışında bir videoda (veya kapsayıcı içinde) kullanılması tavsiye edilmez. Ancak MP4 kapsayıcısı için en iyi seçim AAC'dır, AAC dışındaki tek seçenekse MP3'tür. Ancak AAC sesinin videolarda (MP4 videolarında bile) kullanılması sonucu çeşitli platformlarda birçok video oynatıcının hata verdiği gözlemlenmiştir.
Araştırmalara göre AAC, 96 kb/s veya  altında en düşük dosya boyutu karşılığında en iyi ses kalitesi veren formattır. Ancak 96 kb/s'tan büyük AAC dosyalarında ise (ki bu durumda ses kalitesi Ogg Vorbis'in 128 kb/s olanına eşit hale gelir), Vorbis'in ses kalitesi aynı dosya boyutunda daha iyi olmaktadır.
Yani özet olarak düşük boyutlu olması gereken dosyalarda en verimli format AAC'dır. Ayrıca ses kalitesi olarak şu formülü verebiliriz: 96 kb/s AAC = 128 kb/s Ogg Vorbis = ~160-192 kb/s MP3. Yani elinizde bit oranı 96'dan büyük bir AAC dosyası veya bit oranı 128 veya daha küçük bir Ogg dosyası veya herhangi bir MP3 dosyası varsa zarardasınız demektir :)
AAC libfaac.so.0 (kodlama) ve libfaad.so.0 (çözme) kütüphanelerini gerektirir. Bu kütüphaneler libfaac0 ve libfaad2-0 paketlerinde bulunur. Sitesi http://www.audiocoding.com/'dur. Kaynak kodu GPL veya LGPL lisansıyla korunur, yani özgür bir yazılımdır ancak bazı patent sorunları bu formatta da vardır.
Desteklenen modlar: Stereo ve Joint Stereo. Desteklenen bit oranları: 48-384 kbits. CBR.

MPEG-1 layer 2 (MP2) dosyalarını üretir. libavcodec kütüphanesini kullanır, ek bir paket indirmeye gerek yoktur. Kaynak kodu FFmpeg projesi kapsamında buradan edinilebilir. LGPL lisansı ile korunmaktadır. Diğer MPEG kökenli bir kodek olarak bazı patent sorunları bu formatta da mevcuttur. Ayrıntılı bilgi için: http://ffmpeg.sourceforge.net/legal.php.
Birçok FFmpeg kodeki en iyi performansı sağlanması ve kodun yeniden kullanılabilirliğini sağlamak amacıyla anonim olarak yazılmıştır. Desteklenen modlar: Stereo ve Joint Stereo. Desteklenen bit oranları: 48-384 kb/s. CBR

AC-3 ses akımlarını üretir. Birçok DVD'nin sesi bir AC-3 türeviyle kodlanmıştır. libavcodec kütüphanesi bu formata destek verir. Ek bir paket kurmanıza gerek yoktur. FFmpeg projesi hakkında bazı notlar için FFmpeg MP2'ye bakın.

MPEG-1 layer 2 (MP2) dosyalarını üretir. Destek yerleşiktir. TooLAME, Layer 3 kodlayıcısını saran patent sorunları ve birçok MPEG ses çalıcısında layer 2'nin çalınabiliyor olması göz önünde bulundurularak, LAME veya diğer layer 3 kodlayıcıların yerine geçmesi düşünülen bir kodektir.  VCD/SVCD ve hatta DVD ses parçaları için en iyi seçimdir.
Desteklenen modlar: Stereo ve Joint Stereo. Desteklenen bit oranları: 48-384 kb/s CBR.

Sıkıştırılmamış Microsoft RIFF WAV PCM ses dosyalarını üretir. Sıkıştırılmamıştır, kayıpsızdır ancak çok büyük boyutludur, hiçbir ses kaybı olmayacağı garantisi verir. MPEG dosyalarında normal PCM yerine LPCM kullanılır.

Linear Pulse Code Modulation (veya LPCM) müzik üretiminde kullanılan en popüler formattır. 8 kanala kadar ses, 48 veya 96 kHz örnekleme frekansı ve örnekleme başına 16, 20 veya 24 bit desteği verir. Maksimum bit oranı 6.144 MB/s'tır. Ses verisini sıkıştırmadan, eş zamanlı olarak örnekler, analog sinyalleri yakalar ve dijital sinyallere dönüştürür.
Yalnızca MPEG dosyalarıyla kullanılabilir. MPEG'de LPCM'in kullanılmasıyla kayıpsız bir ses elde edilir, ancak çok fazla yer kaplar.

Bu sayfa toplu işlemenin Avidemux'ta nasıl yapıldığını anlatmaya çalışacaktır. "Toplu işleme" derken birden fazla video dosyasının aynı ayarlarla kaydedilmesi ve bir dosyanın işi bittiğinde diğer dosyaya geçmek için kullanıcının herhangi bir müdahalesinin gerekmemesini kastediyoruz. Örneğin birden fazla dosyanın formatını belirli bir formata değiştirmek istediğinizde burada anlatacaklarımız son derece faydalı olacaktır.

AVIdemux hem komut satırı kullanımını ve hem de betik yazımını (ECMAScript) desteklediği için Avidemux'ta toplu işlemenin birden fazla yolu vardır:

Kabuk betiği/.bat dosyası veya benzer bir yöntem aracılığıyla sadece komut satırı toplu işlemesi
Sadece JS betiği (ECMAScript) toplu işlemesi
Komut satırı ve JS betiğinin her ikisini de kullanarak toplu işleme

AVIdemux komut satırı sınırlı sayıda ayarın değiştirilmesine imkan verir. Ancak basit format dönüşümleri için uygundur. Ek komut satırı araçları kullanmanıza izin verir, bu sayede YouTube'a dosya yüklemenizi AVIdemux dosyaları işledikten sonra otomatikleştirebilirsiniz. Farklı işletim sistemleri ve kabuklar farklı dosya ismi kısıtları, farklı komutlar, vb. içerebildiği için aşağıdaki komut örneklerinden bazıları tüm sistemlerde/kabuklarda çalışmayabilir.
Aşağıdaki Win32 örneği (.bat dosyası) aktif klasör içindeki bütün .mp4 dosyalarını .avi'ye (Xvid+MP3) dönüştürür. Asıl dosyalar değiştirilmeyecektir. Yeni dosyaların ismi onceki_isim.mp4.avi formatında olacaktır.

set avidemux="C:\Program Files\Avidemux 2.5\avidemux2.exe"
set videocodec=Xvid
set audiocodec=MP3
for %%f in (*.mp4) do %avidemux% --video-codec %videocodec% --audio-codec %audiocodec% --force-alt-h264 --load "%%f" --save "%%f.avi" --quit

(eğer AVIdemux sizde farklı bir klasörde kuruluysa "C:\Program Files\Avidemux 2.5\avidemux2.exe" satırını değiştirin)
Bu metni yeni bir metin dosyası oluşturup içine kopyalayın. Sonra metin dosyasının ismini bir_sey.bat olarak değiştirin. Daha sonra bu dosyayı işleyeceğiniz videoların olduğu klasöre taşıyın. Son olarak bir_sey.bat dosyasına çift tıklayın. İşleme başlayacaktır.
Bash kabuğu kullanan Linux/Unix türevi sistemlerde benzer betik şöyle olacaktır

#!/bin/bash
VIDEOCODEC="Xvid"
AUDIOCODEC="MP3"
for FIL in `ls *mp4 | sort` ; do
  avidemux2 --video-codec $VIDEOCODEC --audio-codec $AUDIOCODEC --force-alt-h264 --load "$FIL" --save ${FIL%.*}.avi --quit
done
 
(bu komutlar sonucunda bir_sey.mp4 dosyasından bir_sey.avi dosyası oluşacaktır.)
Win32'de ses ve video için belirli bir bit oranını zorlamak istiyorsanız aşağıdakileri yapın 

set avidemux="C:\softa\avidemux_r6854\avidemux2.exe"
set videocodec=Xvid
set videobitrate=cbr=512
set audiocodec=MP3
set audiobitrate=64
for %%f in (*.mp4) do %avidemux% --video-codec %videocodec% --video-conf %videobitrate% --audio-codec %audiocodec% --audio-bitrate %audiobitrate% --force-alt-h264 --load "%%f" --save "%%f.avi" --quit

Bash kabuğu kullanan Linux/Unix türevi sistemlerde benzer betik şöyle olacaktır

#!/bin/bash
VAR="batchfiles.txt"
VIDEOCODEC="Xvid"
AUDIOCODEC="MP3"
VIDEOBITRATE="cbr=512"
AUDIOBITRATE="64"
for FIL in `ls *mp4 | sort` ; do
  avidemux2 --video-codec $VIDEOCODEC --video-conf $VIDEOBITRATE --audio-codec $AUDIOCODEC --audio-bitrate $AUDIOBITRATE --force-alt-h264 --load "$FIL" --save ${FIL%.*}.avi --quit
done
 
(bu komutlar sonucunda bir_sey.mp4 dosyasından bir_sey.avi dosyası oluşacaktır.)

AVIdemux JS betiğini (ECMAScript) betik yöntemini kullanarak da işinizi otomatikleştirebilirsiniz. Bu betikler komut satırından (--run) veya grafik arayüzden (File -> Load/Run project...) çalıştırılabilir. Arayüz bütün platformlarda aynı olduğu için betikler oldukça geneldir. Tek sorun teşkil edebilecek nokta slash işaretidir. Bazı işletim sistemleri klasör ayracı olarak / işaretini kullanırken bazı işletim sistemleri de \ işaretini kullanmakatdır.
JS betikleri (ECMAScript) aracılığıyla ek grafik arayüz elemanları (dosya ve klasör seçim diyalogları) kullanılabildiği için yeni kullanıcıların rahatlıkla kullanabileceği betikler yazılabilir.
İlk yazacağımız betik bir_sey.js olacak. Bu betiği çalıştırdığınızda önce girdi klasörü ve dosya tipini (ilk diyalog), ardından çıktı klasörü ve dosya ismini soracak (ikinci diyalog). Betik girdi klasöründeki belirtilen türdeki bütün dosyaları alacak ve bu dosyaları XviD+MP3 AVI olarak çıktı klasörüne kopyalayacak.

//AD  <-
/*
  orgDir klasörünü tarayacak
  sonra bütün .xyz dosyalarını açacak, daha sonra bunları Xvid+MP3 AVI olarak kodlayacak
  Sonuç dosyalar destDir klasörüne koyulacak
 
  Using new directorySearch API
*/
var app = new Avidemux();
var ds = new DirectorySearch();
var srcDir;
var dstDir;
var reg = new RegExp(".$");
var extReg = new RegExp(".*[.](.+)$"); 
 
//bu WINDOWS için klasör ayracı! *nix için bu sep = "/"; olmalı
var sep = "\\";
var fileExt;
var pickedExt;
var dstPath;
 
var filesDone = 0;
var filesSkip = 0;
var filesErrd = 0;
 
displayInfo("Kaynak klasörde bir dosya seçin. Seçtiğiniz dosyanın türündeki (.xyz) bütün dosyalar işlenecektir. Dosya ismi ihmal edilecek ama dosya uzantısı kullanılacaktır! \r\n\r\nörneğin AVI'leri işlemek istiyorsanız bir .avi dosyası seçtiğinizden emin olun!");
 
//Kaynak dosyayı seçmenizi isteyen bir diyalog açar. Dosya ismini silecek, sadece klasörü bırakacağız
srcDir = fileReadSelect();
 
//extReg düzenli ifadesini kullanarak sadece dosyanın uzantısını alıyoruz
pickedExt = srcDir.replace(extReg, "$1").toLowerCase();
 
displayInfo(pickedExt + "Hedef klasörü seçin ve rastgele bir dosya ismi girin. Dosya ismi ihmal edilecektir");
 
//Hedef klasörü seçmenizi isteyen bir diyalog açar. Dosya ismini silecek, sadece klasörü bırakacağız 
dstDir = fileWriteSelect();
 
//her seçili dosyanın sadece yol kısmını alıyoruz
srcDir = pathOnly(srcDir);
dstDir = pathOnly(dstDir);
 
//eğer yol klasör ayracı karakteri ile bitiyorsa bu karakteri sil
//bu normal şartlar altında birden fazla çalışmaz, ancak bir while döngüsü bunu yapabilir
//böylelikle c:\temp\\\\ kodunu sonundaki \ lar silinerek c:\temp yapılabilir
while(srcDir.charAt(srcDir.length-1) == sep){
  srcDir=srcDir.replace(reg,"");
}
while(dstDir.charAt(dstDir.length-1) == sep){
  dstDir=dstDir.replace(reg,"");
}
 
//directory search'e klasörü vererek ilklendir
if(ds.Init(srcDir))
{
  //klasördeki dosya listesinin sonuna erişene kadar
  // --> her ds.NextFile() çağrısı aktif bir sonraki dosyaya geçilmesini sağlar
  // --> döngü ds.NextFIle() false döndürene kadar devam eder (bu, dosya listesinin bittiği anlamına gelir)
  while(ds.NextFile())
  {
    //dosya ismini al (yol yok)
    dstPath=ds.GetFileName();
 
    //yalnızca klasör olmayan geçerli dosyaları işle
    if(!ds.isNotFile && !ds.isDirectory && !ds.isSingleDot && !ds.isDoubleDot)
    {
      //şimdi de uzantıyı alıyoruz
      ext=ds.GetExtension();
 
      //bu dosyanın uzantısı seçtiğimizle aynı mı?
      if(ext.toLowerCase() == pickedExt)
      {
        //çıktı dosya ismini oluştur. Kaynak dosyanın üzerine yazmayı engellemek için, klasör aynı a _ önekiyse        
        if(srcDir.toLowerCase() == dstDir.toLowerCase()){
          dstPath = dstDir + sep + "_" + ds.GetFileName() + ".avi";
        }else{
          dstPath = dstDir + sep + ds.GetFileName() + ".avi";
        }
 
        //kaynak dosya yolunu oluştur
        srcPath = srcDir + sep + ds.GetFileName();
 
        //öncelikle bu seçeneği ayarlıyoruz. Avidemux'un unpacking/time mapping işlemlerini yapmaya gerek görme ihtimaline karşı
        //bu seçeneği ayarlayarak dosyayı açtığımızda bu işlemin yapıldığına emin oluyoruz
        app.forceUnpack();
 
        //dosyayı aç. bu işlem ayrıca bütün video filtrelerini ve kodek ayarlarını temizler
        app.load(srcPath);
 
        //sesin VBR olup olmadığına bak. VBR'sa zaman haritası inşa et. VBR değilse hiçbir şey yapma
        app.audio.scanVbr();
 
        //eğer forceUnpack belirtilmişse bu gerekli olmayabilir. Yapılabileceğini düşünmüyorum
        //ancak ek olarak burada tekrar etmek güvenli
        app.rebuildIndex();
 
        //bu bölümdeki bütün kodlar app tarafından oluşturulmuştur. eğer bir betik yazmak ve filtreler kullanmak istiyorsanız
        //zor işi yapmak için app'ı edinebilirsiniz; şöyle:
        // betik yazacağınız dosyalardan birini açın
        // istediğiniz bütün video ve ses seçeneklerini ayarlayın
        // file menüsünde "Save Project as"i seçin (not: avi dosyasını kaydetmeyin!!)
        //kaydettiğiniz iş dosyası filtreler hakkında bilgi veren bir bölüm içerecektir. burayı kopyalayın
 
        //xvid 2 pass'e yeniden kodlayın, bit oranı = 1000 (ayrıca ses için 128 = 1128 kbps, saat başına 507.6 mega)
        //tüm seçenekler basite ayarlanmıştır, GMC yok, Qpel yok, vb. bu sayede bağımsız basit oynatıcılar tamamdır
       app.video.codecPlugin("92B544BE-59A3-4720-86F0-6AD5A2526FD2", "Xvid", "2PASSBITRATE=1000", "<?xml version='1.0'?><XvidConfig><XvidOptions><threads>0</threads><vui><sarAsInput>false</sarAsInput><sarHeight>1</sarHeight><sarWidth>1</sarWidth></vui><motionEstimation>high</motionEstimation><rdo>dct</rdo><bFrameRdo>false</bFrameRdo><chromaMotionEstimation>true</chromaMotionEstimation><qPel>false</qPel><gmc>false</gmc><turboMode>false</turboMode><chromaOptimiser>false</chromaOptimiser><fourMv>false</fourMv><cartoon>false</cartoon><greyscale>false</greyscale><interlaced>none</interlaced><frameDropRatio>0</frameDropRatio><maxIframeInterval>300</maxIframeInterval><maxBframes>2</maxBframes><bFrameSensitivity>0</bFrameSensitivity><closedGop>false</closedGop><packed>false</packed><quantImin>1</quantImin><quantPmin>1</quantPmin><quantBmin>1</quantBmin><quantImax>31</quantImax><quantPmax>31</quantPmax><quantBmax>31</quantBmax><quantBratio>150</quantBratio><quantBoffset>100</quantBoffset><quantType>h.263</quantType><intraMatrix><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value><value>8</value

Bu sayfada video kodlama türleri için kullanılan terimler açıklanmaktadır.

Bu yöntemde videonun üzerinden iki kere geçilir. İlk geçişte video dikkatlice incelenir, her bir frame'in ve sahnenin karmaşık analizleri yapılır ve videonun daha az ve daha fazla bit oranına ihtiyaç duyan kısımları belirlenir. İkinci geçişte ise video önceki geçişte elde edilen bilgiler kullanılarak kodlanır.
İki geçiş gereklidir. Çünkü kodek geleceği göremez, bu yüzden aktif frame'ler için ne kadar bit gerektiğini bilemez.
Şimdi Quantizer*Kodlanmış boyutun daha az veya daha fazla olduğunu varsayalım. Birinci geçişi quantizer=2 ile yaparsanız bir boyut (buna S diyelim) elde edeceksiniz. Şimdi istenen ve S'den az olması gereken son boyutu (F) biliyorsunuz. Zaten F, S'den küçük olmazsa yaptığımız şeyin bir anlamı kalmıyor.
O halde Ortalama quantizer Q=(2*S)/F dir, bu sayede quantizer baştan itibaren bütün sahnelerden büyük fark yapan sahnelere daha fazla bit, bit sayısının azalması kaliteyi etkilemeyen sahnelere de daha az bit verecek şekilde ayarlanacaktır.
Sonuçta, 2-pass modunu kullanmak size aşağıdakileri verecektir:

Belirli bir dosya boyutu
Bitlerin iyi dağılımı
Kalite: Çok yüksek kalite
Zaman: Kodlama için daha fazla zamana ihtiyaç duyar, çünkü iki geçiş yapılır. İlk geçiş bir şekilde daha hafif olduğu için ikinci geçişten daha hızlı olabilir. Hesabın yapılabilmesi için tam doğru sayılara ihtiyaç yoktur.
Video boyutu: Eğer video hedef boyutu seçeneğini kullanırsanız hedef boyut %2'lik yanılma payıyla elde edilir.
Tavsiye edilir: Evet, harcadığı ek zamana değer.

Bir dosyayı hızlıca yeniden kodlamak için bir yöntemdir. Bu yöntemde her bir frame, kendini daha önce kodlamış olan quantizer'le kodlanır. Çıkan dosya, orijinal dosyayla benzer bit oranı/dosya boyutuna sahip olacaktır. Bu yöntem, bazı oynatıcıların desteklemediği QPel gibi kodek seçenekleri olmadan MPEG-4 videosuna yeniden kodlamak, vb. için son derece kullanışlıdır (ancak şunu unutmayın ki kayıpsız bir hedef format seçmediğiniz müddetçe yeniden kodlama ile bir kalite kaybı yaşarsınız). Bu yöntem, video frame'lerinde zaten bulunan 1-pass analiz bilgilerini alacak ve yeniden kullanacaktır. Bu sayede bütün bir geçiş yapmaktan kurtulunarak vakit kazancı sağlanmış olunacaktır.

Not: Bu yöntem son dosya boyutu/bit oranının orijinaliyle aynı olacağı garantisini vermez, ancak orijinaliyle yakın değerler elde edilir ve bu yöntem 2-passten daha hızlıdır.
Kalite: Genellikle orijinal dosyaya son derece yakındır.
Zaman: Dosyanın uzunluğuna bağlı doğrusal zaman. Yaklaşık olarak 2-pass kodlamasının gerektirdiği zamanın yarısını gerektirir, genelde oldukça hızlıdır.
Video boyutu: Genelde orijinal dosyayla aynıdır (ancak her zaman değil).
Tavsiye edilir: Yalnızca zaten kodlanmış bir dosyayı değiştirirken faydalıdır.

Bu yöntemde bütün sahneler için, bu sahnelerin daha az veya daha çok bit oranı gerektirdiğine bakılmaksızın, sınırlı bir video bit oranı aralığı kullanılarak video bir kerede kodlanır. Ancak şunu unutmayın ki bu, sabit bit oranı kodlaması değildir.

Kalite: En düşük kaliteli videolar.
Time: Kodlama için en az zamanı gerektirendir.
Video boyutu: Videoların boyutları değişebilmektedir, boyut kesin olarak tahmin edilemez.
Tavsiye edilir: Bu yöntem tavsiye edilmez, çünkü bu yöntemde en düşük kaliteli videolar üretilir. 2-pass tavsiye edilir.

Sabit quantizer veya sabit kalite modu olarak da bilinir. Bir sayı seçilir ve her frame aynı sıkıştırma oranıyla sıkıştırılır. Hızlı ve basit sıkıştırma için iyidir, ancak istenen video boyutu elde edilemeyebilir. Düşük seviyeler daha az sıkıştırmayı ve dolayısıyla daha yüksek kaliteli bir video elde edileceğini; yüksek seviyeler daha yüksek sıkıştırmayı ve dolayısıyla daha düşük video kalitesi elde edileceğini belirtir. Bu yöntem, basit bir değer sistemini baz alarak hızlıca sıkıştırma yapmak için son derece uygundur.

Kalite: Değişken, quantizer'e bağlı.
Zaman: Dosyanın uzunluğuna bağlı doğrusal zaman. Genelde hayli hızlı.
Video boyutu: Quantizer'e bağlı, kolay tahmin edilemez.
Tavsiye edilir: Basit ve hızlı sıkıştırma istendiğinde veya en yüksek kaliteli kodlama istendiğinde tavsiye edilir. En yüksek kaliteli kodlama için videonun tamamını quantizer=2 ile kodlayın.

Avidemux bir sesin offset'ini ve uzunluğunu genelde boyut=zaman*bit oranı formülüyle hesaplar. Bu formül bütün CBR akımlarda doğru sonuç verir. VBR akımlarda ise sabit bir bit oranı olmadığı için doğru sonuç vermez.

Başlangıç offset/boyutu hesaplamak için Avidemux bit oranının nasıl değiştiğini bilmelidir. Bunun için Audio->Build VBR Time Map menü yolu izlenir.
Avidemux, bu aşamada sıkıştırılmış haldeki akımın tamamını sıkıştırılmamış hale getirecek (çözecek) ve akımı yönetirken kullanacağı zaman haritasını inşa edecektir. Bu işlem için libmad kütüphanesinin kurulu olması gerekir, aksi takdirde zaman haritası oluşturulamayacaktır.
Zaman haritası inşa edildiğinde Avidemux, zaman ve offset arasında bir dönüşüm tablosu elde edecek, ve siz de AVI'yi VBR şeklinde bölebilecek/kaydedbileceksiniz.
Eğer bunu yapmazsanız, senkronizasyonu kötü (potansiyel olarak sesi çok kısa süren) bir AVI elde edeceksiniz (sadece açıp kaydetseniz bile).
Bu işlemi VBR MP3 dosyalarıyla çalışırken mutlaka yapmalısınız.

İki kanallı sese sahip bir AVI'yi kaydederken ikinci ses akımı VBR olamaz.

Video filtreleri videoda çeşitli türlerde değişiklikler yaparlar. Bu filtrelerin etkinlik gösterebilmesi için videonun copy modunda olmaması gerekir. (Copy "videonun değişmemesi gerekiyor" anlamına gelir), yani video filtrelerini uygulayabilmek için yapmanız gereken ilk şey bir video kodlayıcısı seçmektir (video için varsayılan "Copy" seçeneğinin dışında bir seçenek seçin). Daha sonra ana penceredeki "Filters" butonu "Video Filter Manager" iletişim kutusunu açar. Bu iletişim kutusunu kullanarak videoya filtre ekleyebilirsiniz.
Eğer video için Copy dışında bir kodlayıcı seçilmişse işleme zinciri şu şekilde olacaktır:

[A,B] aralığını çıkarma
Frame'leri çözme
Gerekliyse postprocess işlemi uygulama
İlkinden başlayarak bütün filtreleri uygulama
Seçili kodlayıcıyı kullanarak videoyu sıkıştırma
Seçili çıktı formatına göre yazma
Filtreler çeşitli türlere ayrılırlar:

Başka filtrelerin birleşimiyle elde edilen veya tek başına bir etkisi olmayıp başka bir filtrenin etkisinde değişiklik yapan filtrelere meta filtre denir. Bunlardan bazıları şunlardır:

Bu meta filtreler videoyu VCD/DVD/SVCD ile uyumlu olacak şekilde boyutlandırır. Bunlar dahili siyah çerçeve ekleme ve boyutlandırma filtrelerini kullanır.

Bu filtre başka bir filtrenin videonun yalnızca bir kısmına etki etmesini sağlar. Örneğin videonun sadece bir kısmını deinterlace etmek istiyorsanız önce Deinterlace filtresini seçer, sonra Partial butonuna basar, daha sonra başlangıç ve bitiş frame'lerini girersiniz.

Crop
Resize/MPlayer resize
Add black borders
Blacken borders
Vertical flip
Rotate
Resample fps

Yadif
Deinterlace
KernelDeint
TDeint
libavcodec deinterlacer
Decomb Telecide
Decomb Decimate
Pulldown
DGBob
PAL field shift
PAL smart
Drop
Swap fields
Smart swap fields
Keep even fields
Keep odd fields
Seperate fields
Merge fields
Stack fields
Unstack fields

MPlayer eq2
MPlayer hue
Contrast
Luma equalizer
Swap U and V
Chroma shift
Luma only
Chroma U only
Chroma V only
Luma delta
ColorYUV

MPlayer denoise3d
MPlayer hqdn3d
FluxSmooth
Temporal Cleaner
Denoise
Stabilize
Cnr2
MSmooth by Donald Graft
Soften

Sharpen
MSharpen
asharp
Gauss smooth
Mean
Median
Median (5x5)
Forced postprocessing

Subtitler
VobSub

Blend remover
Hard pulldown removal
Whirl
Mosaic
MPlayer delogo
Logo

Video dünyasında basit terimlerin ve standart endüstri çalışmalarının yanlış anlaşılmasına ve bilgi eksikliğine yol açan birçok efsane var. Bu bölümde Avidemux'la bir şekilde ilgili olan en yaygın efsanelerden bazılarını anlatacağız.

2007'de Avidemux'un bir Qt arayüzlü versiyonu çıktı. Bunun sonucunda insanlar yanlış bir şekilde "Acaba GTK+'ı bırakıp Qt sürümüne mi geçsem?" diye düşündü. Bu yanlış bir düşünce, biz hiçbir zaman insanların böyle bir şey yapmasını istemedik. Her iki versiyon da halen Avidemux'un resmi bir parçasıdır. Qt versiyonunu Microsoft Windows, Linux veya BSD kullanıcıları tercih edebilir, bunun hakkında da "şunu tercih edin" gibi bir şey söyleyemeyiz. Ancak GNOME veya Xfce kullanıcıları GTK+ versiyonunu, KDE 4 kullanıcıları Qt GUI'sini kullansalar daha iyi olur.
Not: Bir zamanlar Qt arayüzlü versiyon gelişim aşamasında olduğu için GTK+ sürümüne göre daha kullanışsızdı. Ancak 2.4.4 sürümünden beri Qt sürümü GTK+ sürümüyle eşit kullanışlılığa sahip. 2.5 sürümünden beri Windows kurucusu sadece Qt arayüzüyle geliyor, ancak hâlen GTK+ versiyonu zipli versiyonda mevcut.

Genel anlamda Avidemux dosya okuma ve yazma için harici bir yazılıma ihtiyaç duymaz. Bazı insanlar Avidemux'un kodlama için MEncoder, Transcode, FFmpeg veya MJPEG gibi araçları kullandığını sanıyor. Bu tamamen yanlış, Avidemux bu projelerden sadece bazı ödünç kodları kullanıyor.
Avidemux bir MEncoder önyüzü değildir. Avidemux MEncoder için grafik arayüz değildir, Avidemux video düzenleme, okuma ve yazma için kendi kodlarını kullanan bağımsız bir programdır. Avidemux sadece MPlayer'dan port edilmiş çeşitli fitreler (denoise3d gibi), libavcodec ve diğer bazı kütüphaneleri (MPlayer/MEncoder gibi hemen hemen bütün özgür video yazılımlarının kullandıkları) kullanır.
Avidemux harici bir video çözücü kullanmaz. İşte bu yüzden, Avidemux'un video çözerken kullanması ümidiyle video kodeki (örneğin DivX veya Xvid) yüklemek boşa bir çabadır (ancak Avidemux bir videoyu Xvid'e kodlamak için kodek kullanır). Microsoft Windows için olan resmi Avidemux paketleri bütün harici kodlayıcıları (Xvid gibi), çözücüleri ve diğer kütüphaneleri içerir, yani Avidemux'un bunlara bağımlılığı yoktur. Özellikle bir çapraz-platform uygulaması olarak Avidemux'un Microsoft Windows'a özgü bir DirectShow veya VfW çözücü veya kodlayıcısı kullanması mümkün değildir.
Avidemux harici bir FFmpeg kullanmaz. FFmpeg'den yerleşik bir libavcodec kütüphanesi (Avidemux, libavcodec'in kodunun kopyasını kendi kodunda içerir, harici FFmpeg kullanmaz) birçok formatın çözülmesi ve kodlanması için kullanılır.

Popüler efsanenin aksine kodekle format aynı şey değildir. Ses veya video, kodlamak için kullanılan kodekin aynısıyla çözülmez. Örneğin, LAME kodekiyle bir MP3 kodlamışsanız, kodlanan dosyaya, dosyanın formatına veya sesine LAME diyemeyiz; yalnızca kodlayıcıya LAME deriz, dosyaya MP3 deriz. MP3 dosyasını çözmek için bize bir LAME çözücüsü değil, bir MP3 çözücüsü gerekir.
Ancak, dijital video dünyasındaki yaygın eğilim bu terimler için aynı markaları kullanmaktır. Bu kanımca vahşi kapitalizmin bir ürünüdür. Bu terimlerin aynı anlama geldiğini inandırarak şirketler aynı format için bir kodlayıcı veya çözücü üreten başka birisinin önünü keserler. Bu sayede sadece kendi ürünlerini satarlar. Örneğin A şirketi X formatını üretsin. Bu A şirketi, ürettiği dosyanın formatına da X diyor, bu formata kodlayan kodlayıcıya da X diyor, bu formattan sıkıştırılmamış türe dönüştüren çözücüye de X diyor. Bunun sonucunda insanlar A şirketinin ürettiği bu ürünleri alıyorlar. Başka birisi X formatına kodlayan çok daha verimli bir kodlayıcı bulduğunda ise bunu bir türlü insanlara anlatamıyor ve piyasadaki tekel şirket tekelliğini koruyor. Ayrıca dergiler ve web siteleri bu yanlış anlaşılmaya katkıda bulunmuşlardır. Çünkü doğru terimleri kullanırlarsa okuyucuların kafasının karışacağını düşünmüşlerdir. Bu yanlış anlaşılmaların ardında yatan başka bir sebep de AVI dosyalarındaki FourCC'nin hatalı kullanımıdır. AVI dosyalarındaki FourCC kısmı kodeki belirtir.
MPEG-1, MPEG-2 ve MPEG-4 gibi standartlar var. Bunlar spesifikasyonlardır. Geliştiriciler ses-video kodlama-çözme yazılımlarını veya donanım uygulamarını bu spesifikasyonlara göre geliştirirler. Farklı insanlar tarafından geliştirilmiş birden fazla kodek aynı sıkıştırma formatını kullanabilir. Örneğin MPEG-2 (DVD'lerde kullanılan) veya MPEG-4 ASP. Kodek, herhangi bir veriyi herhangi bir formata kodlayan/çözen bir yazılım (veya donanım) uygulamasıdır. İlgili veri hedef türe kodlandıktan/çözüldükten sonra üzerinde başka bir kodekle işlem yapılır. Yazılımla format aynı şey değildir.

DivX, dijital video dünyasındaki tartışmasız en yanlış bilinen terim. Avidemux DivX'i desteklemez. Avidemux DivX yazılımıyla kodlanmış videoları destekler.
DivX şu anlamlara gelebilir:

Bir şirket (DivX AŞ.)
DivX AŞ. tarafından üretilen ticari yazılım ürünlerinin markası (örneğin: e.g. DivX Plus Player veya DivX Pro Codec).
Bir MPEG-4 ASP kodeki – DivX Kodeki (DivX Pro Codec gibi çeşitli türevlerde) DivX AŞ. tarafından üretilmiş bir yazılım ürünüdür.
DivX AŞ'nin ticari markası. (bundan dolayı kendi ürünlerinizin isminde DivX ismini kullanamazsınız)
DivX şunlar değildir:

Jenerik bir isim değildir. (bundan dolayı sadece DivX'in kendisi DivX olarak adlandırılabilir).
MPEG-4, AVI veya başka bir şeyin eş anlamlısı değildir.
Açık kaynak veya özgür yazılım değildir.
DivX kodeki MPEG-4 ASP videosu kodlayan/çözen yazılımın ticari bir parçasıdır (yeni versiyonlar ayrıca MPEG-4 AVC'yi de destekler, diğer adıyla H.264). Yazılım bir format değildir - "DivX desteği" "DivX kodekiyle kodlanmış videoları destekliyor" anlamına gelmez, DivX AŞ. tarafından üretilmiş yazılım ürünlerini desteklediği anlamına gelir, örneğin bir video düzenleyicisinin kodlama/çözme için DivX kodekini kullanmasına izin verildiği anlamına gelir.
DivX günümüzde Windows ve Mac OS ile uyumludur. Avidemux bir çoklu platform programdır, ancak öncelikle Linux için geliştirilmiştir ve kullandığı bütün kodekler açık kaynaklı ve özgürdür. DivX'in, artık Linux desteği yoktur ("resmi olmayan" bir sürümü 2006'da geliştiriciler için yayınlanmıştır) ve özgür değildir. Eski Linux versiyonu düzgün çalışmamaktadır, 3 yıl boyunca DivX şirketinden bakım/geliştirme görmemiştir. İşte bu yüzden Avidemux DivX'i desteklemez.
Ancak, DivX'in MPEG-4 ASP video sıkıştırmasını kullanmasından ötürü, diğer MPEG-4 ASP kodekleriyle uyumludur. Avidemux tarafından kullanılan iki açık kaynak ve özgür MPEG-4 ASP kodeki FFmpeg MPEG-4 (tümleşik, kodlama ve çözme için kullanılıyor) ve Xvid (harici, opsiyonel olarak kodlama için kullanılabiliyor) kodekleridir. Her ikisi de iyidir, zengin özelliklere sahiptirler ve DivX ile yüksek oranda uyumludurlar (ancak %100 değil), MPEG-4 standartlarına teşekkürler.
Özet:

DivX kodekiyle kodlanmış videoya MPEG-4 ASP videosu denir.
Avidemux, DivX ve diğer MPEG-4 ASP kodekleriyle kodlanmış videoları çözebilir, ancak bunun için DivX'i kullanmaz. Avidemux, MPEG-4 ASP videolarını çözmek için FFmpeg'den tümleşik libavcodec'i kullanır.
Avidemux tarafından kodlanmış MPEG-4 ASP videoları DivX veya Xvid, 3ivx ve ffdshow gibi diğer MPEG-4 ASP çözücüleriyle çözülebilir. Avidemux'un oluşturduğu videoya "DivX videosu" denmez. Yani "DivX'e kodlayamazsınız" veya "DivX üretemezsiniz"), ürettiğiniz bir MPEG-4 ASP videosudur ve bu video da AVI kapsayıcısı ve diğer kapsayıcılar içerisinde tutulur. Kapsayıcı için Avidemux'un varsayılanı AVI'dir.

Xvid, açık kaynak bir MPEG-4 ASP videosu kodekidir. Avidemux, opsiyonel olarak kodlama için harici bir Xvid kütüphanesini kullanabilir (eğer Avidemux Xvid desteğiyle derlenmişse).
Xvid şu anlamlara gelebilir:

Bir yazılım parçası (bir kütüphane).
Bir kodek (kodek bir yazılımdır).
MPEG-4 Advanced Simple Profile (ASP)'ın uygulaması (implementasyonu).
Xvid şunlar değildir:

Bir format değildir. "Xvid videosu" diye bir şey yoktur – MPEG-4 ASP videosu diye bir şey vardır (veya AVI/MPEG-4 videosu diye bir şey vardır ve AVI kapsayıcısında saklanan MPEG-4 ASP akımı anlamına gelir). "Xvid'e kodlamaz" veya "Xvid'i oynatmazsınız".
MP3'ün video karşılığı değildir. AVI dosyaları "MP3 sesi ve Xvid video kodeki içeren dosyalar" değildirler. AVI dosyaları ses ve video akımı içerir (kodek değil). Ayrıca MP3 bir formattır, halbuki Xvid bir yazılım ürünüdür.
MPEG-4, AVI veya başka bir şeyin eş anlamlısı değildir.
Özgür patenlidir. Özgür bir yazılımdır, ancak MPEG-4 patentleri Xvid ve diğer tüm MPEG-4 kodeklerini ilgilendirir.
Avidemux'ta çözme için kullanılmaktadır. Ancak her ne kadar opsiyonel olsa da eğer tek ihtiyacınız Xvid ile kodlanmış videoları okumak ve çözmekse Xvid'i kurmak gereksizdir. Avidemux, MPEG-4 videolarını çözmek için FFmpeg MPEG-4'ü kullanır.
Tek açık kaynaklı MPEG-4 kodeki değildir. Genel inanışın aksine FFmpeg MPEG-4 gibi başka özgür MPEG-4 kodekleri de vardır. FFmpeg MPEG-4; MPlayer, xine, VLC, ffdshow ve diğer başka projelerde varsayılan olarak kullanılır.

x264 özgür bir MPEG-4 AVC/H.264 kodlayıcısıdır (H.264-MPEG-4 AVC ilişkisi hakkında bilgi almak için Wikipedia'daki H.264/MPEG-4 AVC maddesine bakın). Avidemux H.264 kodlaması için x264'ü kullanabilir.
x264 şu anlamlara gelebilir:

Bir yazılım kütüphanesi.
MPEG-4 AVC spesifikasyonunun uygulaması (implementasyonu).
x264 şunlar değildir:

Bir format değildir. "x264 videosu" veya "x264 dosyaları" oluşturamazsınız, "x264'e" kodlayamazsınız. x264, H.264 (MPEG-4 AVC) videosu oluşturur.
Bir çözücü değildir. FFmpeg H.264, H.264'ü çözmek için kullanılır, ancak x264 ile kodlanmış video diğer uyumlu H.264 çözücüleriyle de çözülebilir. x264 sadece bir kodlayıcıdır.
Özgür patentlidir. MPEG-4 patentleri x264'ü de ilgilendirir.

Avisynth, birçok eklentisi olan bir betik dilidir. Kötü olan ise sadece Windows'ta kullanılabilir olmasıdır. Avisynth 3 hem Windows'ta hem de Linux'ta çalışabilecektir, ancak henüz çok erkendir.
Hakkında daha fazla bilgi avisynth2.sf.net'te bulunabilir.

AvsProxy, Windows'ta veya Wine altında Linux'ta çalışabilen küçük bir çalıştırılabilir dosyadır. Microsoft Visual C++ araçlarıyla derlenmelidir (Avisynth C++ ile). GNU C++ hiçbir şekilde VC++'yı sevmez. Ancak çok şükür ki Microsoft, VC++'nın Visual Studio Express adında ücretsiz bir sürümüne sahiptir.
AvsProxy, isminden de anlaşılabileceği üzere, Avisynth ve Avidemux arasındaki bir proxy'dir. Avisynth'ten frame'leri ister ve bu frame'leri bir soket arayüzünde mevcut hale getirir, bu sayede Avidemux bu frame'leri okuyabilir.
Söz dizimi basitçe şöyledir
avsproxy dosya.avs
veya
wine avsproxy.exe dosya.avs (eğer Wine çalıştırıyorsanız)
Not:

Hem 32 hem de 64 bit Linux altında, hem 32 bit hem de 64 bit Avidemux'la çalışır, SMP olup olmaması önemli değildir.
AvsProxy'yi başlatırken hatayla karşılaşmanız, Avisynth veya Wine altında Avisynth'in eksik-hatalı yüklendiği anlamına gelir.

AvsProxy'yi başlattıktan sonra AvsProxy, soketinin komutları almasına hizmet edecektir. Şimdi Avidemux'a o soketi baştan başa okuması gerektiğini anlatmalıyız. Bunu yapmak için aşağıdakileri içeren sahte bir video dosyası oluşturuyoruz:

ADAP
lkmlfdkmdlkdmlkdmflfkmkfmfdlkmflkfdmldkf
lkmlfdkmdlkdmlkdmflfkmkfmfdlkmflkfdmldkf
lkmlfdkmdlkdmlkdmflfkmkfmfdlkmflkfdmldkf
lkmlfdkmdlkdmlkdmflfkmkfmfdlkmflkfdmldkf
lkmlfdkmdlkdmlkdmflfkmkfmfdlkmflkfdmldkf
lkmlfdkmdlkdmlkdmflfkmkfmfdlkmflkfdmldkf
lkmlfdkmdlkdmlkdmflfkmkfmfdlkmflkfdmldkf

Bizim için sadece ADAP önemlidir. Geri kalan metin dosyanın aşırı şekilde küçük gözükmesini engellemek içindir. İlgili dosya okunurken Avidemux soket üzerinden AvsProxy'ye bağlanmaya çalışacaktır.

fx@dave64 /tmp $ wine avsproxy.exe 2mn.avs
AvsSocket Proxy, derivated from avs2yuv by  Loren Merritt
Loading Avisynth.dll
Avisynth.dll loaded
Env created
Importing..
23976023 / 1000000
Info
Width   :512
Height  :384
Fps1K   :23977
NbFrame :4592
Initializing WinSock
WinSock ok
Socket bound to port 9999
Waiting for client to connect...

Şimdi Avidemux sahte dosyayı okuduktan sonra bağlanıyor...

Client connected.
Received get info...
Get frame 0 (old:4294901760)

Bu örnek 64 bit SMP bir sistemde yapılmış ve sorun yaşanmamıştır.

AvsProxy, Loren Merritt tarafından yazılmış olan avs2yuv'un türevidir.

Avisynth Proxy GUI - LoRd_MuldeR tarafından yazılmış AvsProxy için bir grafik arayüzü (Windows için)

ffv1rec, NuppelVideo'nun değiştirilmiş (veya ayrı bir proje altında geliştirilmeye başlanmış) bir kopyasıdır, nuppelrec ile aynı kapsayıcıyı kullanır, MJPEG ve HuffYUV'un da aralarında bulunduğu çeşitli formatlarda video yakalamak için kullanılabilir. Video düzgün senkronizasyona sahip olacak ve NuppelVideo kapsayıcısının içine kaydedilecektir.

ffv1rec, video yakalamak için GATOS sürücü arayüzünü, YUV  4:2:0P renk tablosu  dönüşümü için YUV 4:2:2'yi kullanır. İyi çalışır ancak boyut/kalite oranı o kadar iyi değildir. nuppelrec için orijinal ayarlar:

Using nuppel: senkronizasyon mükemmel, boyut çok büyük, RTjpeg formatıyla sınırlı
Using AVI: diğer kodekleri kullanabilir ancak senkronizasyon problemi olacaktır
Interlaced modda Xvid kodeğini kullanarak video kodlamak için, orijinal kod Nuppel GATOS'tan değiştirilerek elde edilmiştir. O andan sonra değişikliklerden geçti, birçok problemle karşılaştı, yeniden yazıldı ve FFmpeg projesinden yardım alındı.

Çoklu işlemden çoklu iş parçacığına dönüşüm.
Ses frekansını belirleyebilme, örneğin -b anahtarını kullanarak daha sonra DVD'ye dönüşüm için 48000 ayarlanabilir.
Ayarları $HOME/.ffv1recrc'de saklayabilme (Configuration & Settings bölümü).
-C anahtarını kullanarak video kodeğini seçebilme. Tavsiye edilen: Xvid veya HuffYUV.
-M x anahtarını kullanarak hareket aramasını seçebilme. Tavsiye edilen: 0 veya 1.
-q x anahtarını kullanarak quantizer'i seçebilme. Tavsiye edilen: 5.
-d x anahtarını kullanarak keyframe'ler arasındaki mesafeyi seçebilme. Tavsiye edilen: 200.

Avidemux'un 2.0.22 ve üstü sürümlerinde ffv1rec'e kısmi Xvid 1.x desteği eklenmiştir, ancak bu desteği alabilmek için ffv1rec'den önce Avidemux'u (veya en azından ./configure'u) derlemelisiniz.

ffv1rec'in, kaynak kod dosyaları web'de veya SVN'de bulunabilir. İndirdiğiniz sıkıştırılmış dosyayı çıkardığınız yerde (veya SVN dosyalarını indirdiğiniz yerde), 'addons' isminde bir klasör olacaktır. Konsolda bu klasöre geçin. Bir './configure' yapmanıza gerek yoktur, basit bir 'make' komutu, programı derlemek için yeterlidir. Çalıştırılabilir bir 'ffv1rec' dosyası elde edeceksiniz.

home klasörünüzdeki .ffv1recrc dosyası ffv1rec ayarlarınızın saklandığı dosyadır. Bu dosyadaki ayarlar komut satırıyla geçersiz kılınabilir.
Söz dizimi şöyledir:

# → Açıklama yazıları (yorumlar) için
opt → -opt ile aynı vazifeli
opt=val → -opt val ile aynı vazifeli
Örnek bir .ffv1recrc dosyası şunun gibidir:

C=XVID
q=4
M=1
d=200
S=1
b=48000
s
W=768
H=576
x=200

Gentoo Linux:
x264 için, kararlı ağacında, "x264-svn" isminde bir ebuild vardır. Sadece emerge edin.
Linux, BSD ve benzerlerinin çeşitli dağıtımlarında x264 için mevcut paketler olmamasının ötesinde çeşitli paket sistemlerini kullanarak program ve kütüphaneleri kurmayı anlatan bir rehber de yoktur. x264'ü SVN deposundan kurup derlemeniz tavsiye edilir.
Eğer x264 için paketler oluşturulursa bu sayfaya ilgili paketlerin nasıl kullanılacağını yazmaya çekinmeyin.

Konsolda dosyaları indirmek istediğiniz klasöre geçin. Sonra root olarak aşağıdaki komutu verin (root olmak için "su" veya "sudo"yu kullanın).

svn co svn://svn.videolan.org/x264/trunk x264

Dosyaları indirdiğiniz klasöre geçin. Sonra aşağıdaki komutları root olarak verin (root olmak için "su" veya "sudo"yu kullanın).

cd x264
make -f Makefile.dist
./configure --prefix=/usr --enable-debug --enable-pthread
make
make install

Bu komutlar sonucunda x264'ün sisteminize kurulumu tamamlanacaktır. Şimdi Avidemux'la H.264 videoları kodlayabilirsiniz.

Bazı insanlar sistemlerine x264'ü kurarken sorunla karşılaşıyorlar. Bu bölümde SVN indirmesiyle birlikte gelen makefile dosyasında değişiklik yaparak kurulum sorunlarını nasıl gidereceğiniz anlatılmıştır.
Öncelikle x264'ü normal yolla kurmaya çalışmanız önerilir. Eğer normal yolla kurulumu tamamlayamazsanız bu yazıyı okumaya devam edin.

Bazen (ancak artık sık değil) x264'ün sisteminize düzgünce kurulabilmesi için Makefile dosyasında değişiklik yapmanız gerekir. Makefile dosyası SVN dosyalarını indirdiğiniz yerdeki x264 isimli alt klasörün içindedir. Makefile dosyasını istediğiniz bir metin editörüyle açın.
Aşağıdaki bölümün sonuna:

libx264.a: .depend $(OBJS) $(OBJASM)
ar rc libx264.a $(OBJS) $(OBJASM)
ranlib libx264.a

Aşağıdaki satırı koyun:

$(CC) -shared -o libx264.so $(OBJS) $(OBJASM)
Aşağıdaki bölüme:

install: x264
   install -d $(DESTDIR)$(bindir) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
   install -m 644 x264.h $(DESTDIR)$(includedir)
   install -m 644 libx264.a $(DESTDIR)$(libdir)
   **->(satırı buraya yerleştirin)<-**
   install x264 $(DESTDIR)$(bindir)

Şu satırı yerleştirin:

install -m 644 libx264.so $(DESTDIR)$(libdir)
Aşağıdaki bölümün sonuna:

uninstall:
   rm -f $(DESTDIR)$(includedir)/x264.h $(DESTDIR)$(libdir)/libx264.a
   rm -f $(DESTDIR)$(bindir)/x264 $(DESTDIR)$(libdir)/pkgconfig/x264.pc

Şu satırı koyun:

rm -f $(DESTDIR)$(libdir)/libx264.so
Makefile dosyasını kaydedin.

Avidemux, aktif sesin/videonun kodlayıcı ve filtre ayarlarını kaydetme imkanı verir. Bu sayede birden fazla dosyaya aynı ayarları tek tıkla uygulayabilirsiniz.

Kodlayıcı ayarlarını kaydetmek için bir özel betik dosyası oluşturmalısınız. Değişikliklerin tamamını içeren proje dosyalarından farklı olarak özel betikler, sadece ilgilendiğiniz ayarları içerebilirler. İstediğiniz kodlayıcı ayarlarını içeren bir özel betik oluşturmanın en kolay yolu grafik arayüzde ayarları yapmak, projeyi kaydetmek, sonra proje dosyasını düzenlemektir (proje dosyaları birer ECMAScript betiğidir). Proje dosyasından gerekli olmayan her şeyi silin, betikte sadece kodlayıcı ayarları kalsın. Sonra proje dosyasını Avidemux'un özel betiklerinin tutulduğu yere taşıyın:

Linux/BSD: ~/.avidemux/custom (".avidemux" klasörü ev dizininizdedir ve gizlidir, yani bu klasörü görebilmeniz için dosya yöneticinizi gizli dosyaları gösterecek şekilde ayarlamanız gerekiyor)
Windows 2000 ve XP: \Documents and Settings\KULLANICI ADI\Local Settings\Application Data\avidemux\custom
Windows Vista: \Users\KULLANICI ADI\AppData\Roaming\avidemux\custom
Özel betik dosyalarının uzantıları .js olmalıdır. Daha sonra betiği Avidemux'un "Custom" menüsünden çağırabilirsiniz.

Şimdi x264 kodlayıcınızın sık kullandığınız ayarlarını kaydedelim:

Bir video dosyası açın.
Video kodlayıcısı olarak x264'ü seçin ve yapılandırmanızı yapın.
File->Save Project menü yolunu kullanarak ayarları bir proje dosyası olarak kaydedin.
Proje dosyasını bir metin editörüyle açın (örneğin Windows'ta Notepad, GNOME'da gedit, KDE'de Kate). Şunun gibi bir şeyler göreceksiniz:
//AD  <- Needed to identify//
//--automatically built--
//--Project: /home/user/x264.js

var app = new Avidemux();

//** Video **
// 01 videos source 
app.load("/home/user/video.mpeg");
//01 segments
app.clearSegments();
app.addSegment(0,0,1863);
app.markerA=0;
app.markerB=1862;

//** Postproc **
app.video.setPostProc(0,0,0);

app.video.setFps1000(28000);

//** Filters **

//** Video Codec conf **
app.video.codec("X264","AQ=26","188 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 1e 00 00 00 3c 00 00 
00 0a 00 00 00 33 00 00 00 04 00 00 00 03 00 00 00 28 00 00 00 19 00 00 00 32 00 00 00 00 00 00 00 01 00
00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 10 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5a 00 00 00 ");

//** Audio **
app.audio.reset();
app.audio.codec("aac",128,4,"80 00 00 00 ");
app.audio.normalizeMode=0;
app.audio.normalizeValue=0;
app.audio.delay=0;
app.audio.mixer("NONE");
app.setContainer("MP4");
setSuccess(1);
//app.Exit();

//End of script
İhtiyacımız olan aşağıdaki iki satır:

var app = new Avidemux();yukarıdaki satırda bir Avidemux nesnesi oluşturuluyor
app.video.codec("X264","AQ=26","188 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 1e 00 00 00 3c 00 00 
00 0a 00 00 00 33 00 00 00 04 00 00 00 03 00 00 00 28 00 00 00 19 00 00 00 32 00 00 00 00 00 00 00 01 00
00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 10 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5a 00 00 00 ");burada da kodlayıcı olarak x264 ayarlanıyor ve x264'ün yapılandırmaları yapılıyor (gördüğünüz gibi betiği grafik arayüzden almak sıfırdan elle betik yazmaktan çok daha kolay)
Şimdi özel betiğimiz şöyle gözüküyor:

var app = new Avidemux();
app.video.codec("X264","AQ=26","188 00 00 00 00 00 00 00 00 00 00 00 00 28 00 00 00 1e 00 00 00 3c 00 00 
00 0a 00 00 00 33 00 00 00 04 00 00 00 03 00 00 00 28 00 00 00 19 00 00 00 32 00 00 00 00 00 00 00 01 00
00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 01 00 00 00 04 00 00 00 10 00 00 00 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5a 00 00 00 ");

Dosyayı Avidemux'un "custom" klasörüne x264.js olarak kaydedin. Avidemux'u başlattığınızda x264.js "Custom" menüsünde gözükecektir. Artık Custom->x264 menü yolunu izleyerek ilgili ayarları istediğiniz zaman uygulayabileceksiniz.

İş listesi, Avidemux'ta birden fazla projeyi (iş olarak da bilinir) daha sonra veya toptan yapmak için kuyruğa sokmaya yarayan bir özelliktir.

İş listesine ekleme için, kaydedilecek bir video veya proje hazırlayın. "File->Add to Joblist..." menü yolunu izleyin.

İş listesini görmek için CTRL+J klavye kısayolunu veya "File->Show Joblist" menü yolunu kullanın.
İş listesindeki ögeler .js uzantısına sahiptir, çünkü bu ögeler aslında ECMAScript/JavaScript proje dosyalarıdır. Ancak bu, çıktı dosyalarınızın adını etkilemeyecektir.

Listeye iş(ler) eklediğinizde muhtemelen ilk isteyeceğiniz şey iş listesini açmaktır. Bunun için hemen yukarıdaki bölüme bakın. İş listesini açtıktan sonra, iş listesindeki bütün işleri çalıştırmak içinse Run All Jobs butonuna tıklayın. İstediğiniz herhangi bir işi çalıştırmak için önce ilgili işi seçin, sonra Run Job butonuna tıklayın.

İş listesini temizlemek için önce iş listesini açın. Nasıl açacağınız bu sayfada İş listesini görüntüleme başlığında anlatılmıştır. Sonra silmek istediğiniz işi seçip Delete Job  butonuna tıklayın. Listedeki bütün işleri silmek için Delete All Jobs butonuna tıklayın.

2 dilim Ayvalık tost ekmeği
4 dilim kaşar peyniri
1 tatlı kaşığı sıvı yağ
6 adet kokteyl sosis
5 dilim sucuk
3 dilim salam
2 dilim domates
2 adet kornişon salatalık turşusu
1 tatlı kaşığı tereyağı

Sosis ve salamları jülyen şeklinde doğrayın. Sucukları halka halka kesin.
Tavada az miktarda sıvı yağ ile sırayla pişirip kenara alın.
Ayvalık tost ekmeğini tost makinesine yerleştirin ve iz çıkması için elinizle bastırın.
Kaşar peynirini dilimleyip ekmeklerin üzerine ekleyin.
Pişen sucukları peynirin üzerine yerleştirip salam ve sosisleri de ekleyin.
Diğer ekmek dilimiyle üzerini kapatın ve tost makinesinde 3 dakika pişirin.
Ardından dilimlemiş domatesleri ekleyin ve ekmeğin üzerine tereyağı sürüp 1 dakika daha pişirin.
Eriyen kaşarlarla dilim kornişon turşu, ketçap ve mayonez ilavesiyle sıcak servis edin. Afiyet olsun!

Azerbaycan Türkçesinde ismin halleri Türkiye Türkçesindekine benzer. Yalnız belirtme hâlinde bir sesli harfi takiben araya yardımcı sessiz olarak n girer. Başında d bulunan eklerin t'li biçimleri yoktur. Aşağıdaki tabloda örnek olarak qız kız, qapı kapı, ev ev ve iş iş kelimelerinin çekimleri verilmektedir:

Not: Sorularda ve ünlemlerde +dIr eki +dI biçimine geçebilir: Yoxdu! yoktur, yoxdu? yok mu?. (Eğer yoktu diyecekseniz bunu yox idi biçiminde söyleyiniz.)

Azerbaycan Türkçesinde yapım ekleri bazen küçük ses farklılıkları olmakla beraber genelde Türkiye Türkçesindekilerle aynıdır.

-lıq, -lik, -luq, -lük: dağlıq, çәrçilik, ucuzluq, düzlük
-ça, -çә: qazança, dәftәrçә
-laq: duzlaq, çaylaq
-çı, -çi, -çu, -çü: yazıçı, çörәkçi, odunçu, üzümçü
-lı, -li, -lu, -lü: dadlı, evli, duzlu, sözlü
-daş: yoldaş, әmәkdaş, vәtәndaş
-cıq, -cik, -cuq, -cük, -cığaz, -ciyәz: anacıq, evcik, yavrucuq, gözcük, qızcığaz, nәnәciyәz

-ıq, -ik, -uq, -ük: qatıq, bilik, qoruq, hörük
-ış, -iş, -uş, -üş: qaçış, gәliş, uçuş, görüş
-ma, -mә: vuruşma, süzmә
-aq, -әk, -q, -k: yataq, sürәk, daraq, әlәk
-caq, -cәk: sancaq, yellәncәk
-ım, -im, -um, -üm: yığım, içim, udum, ölüm
-qa, -gә: qovurqa, süpürgә
-ar, -әr: açar, gülәr
-tı, -ti, -tu, -tü: qışqırtı, göyәrti, gurultu, üzüntü
-qın, -kin, -qun, -gün, -ğın, -ğun: basqın, kәskin, tutqun, süzgün, dalğın, vurğun
-qı, -ki, -qu, -gü, -ğı, -ğu: asqı, seçki, pusqu, bölgü, çalğı, sorğu
-ın, -in: axın, biçin
-ı, -i, -u, -ü: yazı, çәki, pozu, ölçü
-ıcı, -ici, -ucu, -ücü: satıcı, bilici, sorucu, bölücü
-ınc, -inc, -unc, -ünc: qaxınc, sevinc, qorxunc, gülünc
-acaq, -әcәk: yanacaq, silәcәk
-cә: düşüncә
-gәc: süzgәc
-ac,-әc: tıxac, döyәc
-ir: gәlir
-ıc: ayrıc
-ıntı, -inti, -untu, -üntü: qazıntı, әzinti, ovuntu, çöküntü
-maz, -mәz: solmaz, sönmәz

-la-, -lә-: duzla-, işlә-, qarala-, cütlә-, ikilә-, yarıla-
-laş-, -lәş-: ayaqlaş-, birlәş-, şirinlәş-, sözlәş-, hazırlaş-
-lan-, -lәn-: yollan-, güclәn-, evlәn-, süslәn-, xumarlan-, dillәn-
-al-, -әl-, -l-: boşal-, düzәl-, çoxal-, saral-, dincәl-, durul-
-ar-, -әr-: otar-, göyәr-, yaşar-, qızar-
-a-, -ә-: yaşa-, boşa-, әlә-, dilә-
-ı-, -i-, -u-, -ü-: acı-, bәrki-, turşu-, tәngi-
-var-: suvar-
-sa-: susa-
-imsә-, -ümsә-: mәnimsә-, qәribsә-, gülümsә-, özümsә-
-ılda-, -ildә-, -ulda-, -üldә-: pıçılda-, cingildә-, xorulda-, cürüldә-
-ıq-, -ıx-, -ik-, -uq-, -ux-: darıx-, gecik-, yolux-, karıx-

Türkiye Türkçesindekinden farklı olan yalnızca 1.teklik şahıs zamiridir. 
mən, sən, o, biz, siz, onlar
Azerbaycan Türkçesinde birinci ve ikinci teklik şahısların yönelme durumlarında ince ünlü bulunur: mənə, sənə

Azerbaycan Türkçesinde 'şu' işaret zamiri yoktur. Bu, o işaret zamirlerinin yanında, aynı anlamlara gelen həmən ve həmin zamirleri vardır.

Azerbaycan Türkçesinde Türkiye Türkçesinden farklı bâzı belgisiz zamirler vardır. Bunlardan özellikle kimsə biri ve nəsə bir şey zamirleri ismin hallerine göre değişiklik gösterir.

Fakat kimsə hiç kimse anlamında kullanılıyorsa çekimi Türkiye Türkçesindekinden farklı değildir: kimsə, kimsəyə, kimsəni, kimsədə, kimsədən, kimsənin.

-(y)ır-, -(y)ir-, -(y)ur-, -(y)ür Şimdiki Zaman Eki + Kişi Ekleri

-(y)ar-, -(y)ər- Geniş Zaman Eki + Şahıs Ekleri

-(y)acaq-, -(y)əcək- Gelecek Zaman Eki + Kişi Ekleri

-dı-, -di-, -du-, -dü- Geçmiş Zaman Eki + Kişi Ekleri

-mış-, -miş-, -muş-, -müş- Geçmiş Zaman Eki + Kişi Ekleri

-(y)ıb-, -(y)ib-, -(y)ub-, -(y)üb- Geçmiş Zaman Eki + Kişi Ekleri

Notlar:
Öğrenilen geçmiş zamanda 1. ve 2. şahıslar için -mış, 3. şahıslar için ise -(y)ıb ekinin kullanımı yaygındır. 2. teklik ve çokluk şahısta -mış ekindeki /ş/ sesi düşmektedir. Böylece öğrenilen geçmiş zaman daha çok şu biçimde karşımıza çıkmaktadır: gəlmişəm, gəlmisən, gəlib, gəlmişik, gəlmisiz, gəliblər.
Azerbaycan Türkçesinde öğrenilen geçmiş zaman sık sık görülen geçmiş zaman yerine kullanılmaktadır. Yani gəlmişəm diyerek geldim, gəlib diyerek geldi anlamı kastedilebilir.
Tek heceli fiillerden et- ve get- ile /t/ sesiyle biten bütün çok heceli fiiller ünlü ile başlayan bir ek aldıklarında sondaki /t/ sesi /d/'ye dönmektedir: edər, gedər, unudar, qayıdar, v.b.

1. Sözcük başındaki kalın k sesleri, Azericede q olur:
qardaş, qadın, qız
2. Çok heceli bazı sözcüklerin sonundaki kalın k sesleri q olur, fakat x veya ğ gibi okunur.
yazdıq, yazacaq, bayraq
2.1. Aşiq, layiq, natiq gibi sözcüklerin sonundaki q yazıldığı gibi okunur.
3. Ortada kalın k sesleri bazen x, bazen -q ikizleşip- qq olur:
oxumaq; doqquz
İkizleşme ince k seslerinde de olabilir:
səkkiz
. Batı dillerinden alınma sözcüklerde k sesi değişime uğramaz:
krem, maska
4. Tek heceli sözcüklerin sonundaki kalın k sesleri bazen x, bazen ğ olur:
yox, çox; ağ
5. Sözcük sonundaki ince k vokalle başlayan bir ek gelince y olur:
çiçək-çiçəyə
6. Sözcük sonundaki q vokalle başlayan bir ek gelince ğ olur: 
torpaq-torpağı
7. d sesi ile başlayan eklerin t'li şekilleri yoktur:
gəlmişdim, həyatda
8. Arapça ve Farsça kökenli sözcüklerde kısa a sesi çoğunlukla ə olur:
qəlb, vətən
9. Arapça ve Farsça kökenli bazı sözcüklerde i sesi e olur:
e'lan, e'tiraf
10. Sözcük başındaki bazı y sesleri Azericede bulunmaz:
ildırım, ulduz
11. Sözcük başlarında ı sesi kullanılmaz:
 işıq
Not: Tüm bu farklılıkların istisnaları olabilir.

Standart dilde bulunmayıp günlük konuşma dilinde kullanılan Rusça sözcükler:

aşipka: hata
atkaz: reddedilme
atval: ret
avtoş: trafik magandası, otoş
davay: haydi
fiso: işte o kadar (< Rusça всё /vsyo/)
qatıqlamaq: kıllatmak, abartmak
padxod: yaklaşma, yürüme (ilişkilerde)
padruqa: arkadaş (bir hanımın hanım arkadaşı)
prosto: sadece
rasxod: gider, masraf
skoro: yakında
sroçnı: acil
uje: artık
vabşe: genellikle
vızov veya vızıv: çağrı
Konuşma dilinde rastlanan kısaltılmış (ses veya hece düşmesine uğramış) sözler:

adə (< ay gədə): Erkek çocuklara ve gençlere hitaben kullanılan bir söz.
ağəz / az (< ay qız): Kızlara hitaben kullanılan bir söz. Genellikle hanımlar kendi aralarında kullanılır. Erkeklerin hanımlara hitaben kullanması hakaret gibi anlaşılabilir.
əşi (< ay kişi): Erkeklere hitaben kullanılan bir söz.
Ağızlarda kullanılan sözler:

dırığın: bisiklet
naqaracuqa? ne yapacağız? (~ nə qayıracağıq a?)

am: am
amcıq: amcık
bambılı: hoppa
blet: fahişe, kahpe
blin: fahişe, kahpe («blet»e göre biraz daha yumuşak bir ifade)
civi: cıvır, hatun, yavru
çalmaq: sakso çekmek
çuşka: kıro
dombalmaq: domalmak
göt: göt
kruşka: fahişe, orospu
qəhbə: fahişe, orospu
qələt: halt
oğraş: pezevenk
petux: eşcinsel, ibne
peysər: deyyus
pəzəvəng: hödük
pox: bok
sik: sik
sikdir / idi na xuy: siktir
siki durmaq: siki kalkmak
sikişmək: sikişmek
sikmək: sikmek
suka: kancık, fahişe, hain
tökmək: boşalmak

duduş: pipi
nanay: nonoş
suxoy: mastürbasyon, otuzbir
suxoy vurmaq: mastürbasyon yapmak, otuzbir çekmek
qaluboy / mavi: eşcinsel
qayırmaq: yapmak (sikmek anlamında)

aslan: aslan
at: at
ayı: ayı
əqrəb: akrep
balıq: balık
böcək: böcek
buğa: boğa
camış: manda
ceyran: ceylan
cücə: civciv
çaqqal: çakal
çəyirtkə: çekirge
dana: dana
dələ: sansar
dəvə: deve
donuz: domuz
dovşan: tavşan
durna: turna
fil: fil
göyərçin: güvercin
hörümçək: örümcek
xoruz: horoz
ilan: yılan
inək: inek
it, köpək: it, köpek
kəpənək: kelebek
kərtənkələ: kertenkele
keçi: keçi
keyik: geyik
küçük: enik
qaranquş: kırlangıç
qarışqa: karınca
qartal: kartal
qaz: kaz
qısraq: kısrak
qoyun: koyun
qu quşu: kuğu
qurbağa: kurbağa
qurd, canavar: kurt
quş: kuş
quzğun: kuzgun
quzu: kuzu
leylək: leylek
meymun: maymun
öküz: öküz
ördək: ördek
pələng: kaplan
pişik: kedi
siçan: fare, sıçan
sincab: sincap
soğulcan: solucan
şahin: şahin
tazı: tazı
təkə: teke
tırtıl: tırtıl
tısbağa: kaplumbağa, tosbağa
toyuq: tavuk
tülkü: tilki
ulaq: eşek
yarasa: yarasa
yapalaq: puhu
zürafə: zürafa

Haberlerde ve sosyal medyada, akademik makalelerde vb. karşılaşılabilen bazı kısaltmalar:

ABŞ: Amerika Birləşmiş Ştatları (ABD: Amerika Birleşik Devletleri)
AMEA: Azərbaycan Milli Elmlər Akademiyası (Azerbaycan Ulusal Bilimler Akademisi)
ATƏT: Avropada Təhlükəsizlik və Əməkdaşlıq Təşkilatı (AGİT: Avrupa Güvenlik ve İş Birliği Teşkilatı)
AZƏRTAC: Azərbaycan Dövlət Teleqraf Agentliyi (Azerbaycan Devlet Telgraf Ajansı) [ismi Azərbaycan Dövlət İnformasiya Agentliyi olarak değişmekle birlikte kısaltması aynı kalmıştır.]
CM: Cinayət Məcəlləsi (Ceza Kanunu)
ÇXR: Çin Xalq Respublikası (Çin Halk Cumhuriyeti)
DİN: Daxili İşlər Nazirliyi (İç İşleri Bakanlığı)
DYP: Dövlət Yol Polisi (Trafik Polisi)
XİN: Xarici İşlər Nazirliyi (Dış İşleri Bakanlığı)
XTN: Xarici Ticarət Nazirliyi (Dış Ticaret Bakanlığı)
KİV: Kütləvi İnformasiya Vasitələri (Kitle İletişim Araçları)
MDB: Müstəqil Dövlətlər Birliyi (BDT: Bağımsız Devletler Topluluğu)
MİQ: Müəllimlərin İşə Qəbulu (Öğretmenlerin İşe Kabulü)
PPX: Post-Patrul Xidməti (Devriye)
TQDK: Tələbə Qəbulu Dövlət Komissiyası (Öğrenci Kabulü Devlet Komisyonu) [ÖSYM'ye benzer]
UNO: Uçan Naməlum Obyekt (UFO: Tanımlanamayan Uçan Cisim)

ADMP: Azərbaycan Demokratik Maarifçilik Partiyası (Azerbaycan Demokratik Aydınlanma Partisi)
AXCP: Azərbaycan Xalq Cəbhəsi Partiyası (Azerbaycan Halk Cephesi Partisi)
AİP: Azərbaycan İslam Partiyası (Azerbaycan İslam Partisi) [kapatılmıştır]
AVP: Ana Vətən Partiyası (Ana Vatan Partisi)
DİP: Demokratik İslahatlar Partiyası (Demokratik Reformlar Partisi)
MP: Müsavat Partiyası (Eşitlik Partisi)
SDP: Sosial-Demokrat Partiyası (Sosyal Demokrat Parti)
VHP: Vətəndaş Həmrəyliyi Partiyası (Vatandaş Dayanışması Partisi)
YAP: Yeni Azərbaycan Partiyası (Yeni Azerbaycan Partisi) [1993'ten bu yana iktidarda olan siyasi partidir.]

This page is for treatment of CSF-positive disease.

Neoplastic meningitis affects 4-15% of pts with solid tumors (carcinomatous meningitis), 5-15% of pts with leukemia or lymphoma, and 1-2% of pts with primary brain tumors. Adenocarcinoma is the most common histology. Breast, lung, and melanoma are the most likely to metastasize to the meninges. Small cell lung cancer also has a high chance of leptomeningeal involvement, but its overall incidence is lower.
Tumor most commonly involves the base of the brain (basilar cisterns) and the dorsal surface of the spinal cord, usually the cauda equina.

CN VI involvement is the most common cranial nerve affected, followed by III and IV. Trigeminal (sensory or motor), cochlear, and optic neuropathy are also common. Spinal symptoms include weakness, dermatomal pain or sensory loss.  Nuchal rigidity is rare.

CSF examination is the most useful. Positive findings are: increased opening pressure (>200 mm H2O), increased leukocytes (>4 per mm^3), elevated protein (>50 mg/dL), or decreased glucose (<60 mg/dL). Diagnosis is confirmed by the presence of malignant cells in the CSF.  Yield of finding malignant cells is increased by a 2nd lumbar puncture with a yield of >80% (up to 45% are negative on initial exam).
MRI with contrast of the brain and spine.  Radionuclide studies to evaluate CSF flow.

Prognosis for all pts is extremely poor, with a median survival on the order of 4 months.

Treatment may be intrathecal chemotherapy (through lumbar puncture or intraventricular, such as by Ommaya reservoir), radiotherapy, or systemic chemotherapy. Radiotherapy is indicated for bulky disease (chemotherapy only penetrates to 3mm depth of tumor nodules) and CSF flow abnormalities. Radiotherapy also indicated for palliation of symptoms, such as cauda equina syndrome or cranial nerve abnormalities.
Intra-CSF chemotherapy: methotrexate, cytarabine, and thiotepa. Sustained-release liposomal form of cytarabine (DepoCyt) results in cytotoxic levels in CSF for > 10 days. Usually given 2-3x/week for induction, then weekly x 4 weeks (consolidation), then once a month (maintenance).
Systemic chemotherapy can penetrate into the CSF in areas of leptomeningeal metastasis where the blood-brain barrier is disrupted and will therefore reach a therapeutic level throughout the CSF, not just locally.  Also, high-dose systemic MTX or ara-C can penetrate adequately into the CSF.
Radiation therapy:
30 Gy in 10 fractions recommended to symptomatic and bulky disease.
Guidelines:
Since prognosis is poor and systemic progression of disease is common, aggressive CNS treatment should not be offered for many patients.  However, breast cancer patients often have extended survival and should be offered aggressive treatment.

Helmet field:
Technique: place isocenter 2 cm posterior to lens marker. This allows for quasi half-beam technique to reduce divergence to the lens. Inferior field edge at bottom of C2. 5 mm margin at cribriform plate and temporal lobe.

PMID 11286856, 2001 — "Does the standardized helmet technique lead to adequate coverage of the cribriform plate? An analysis of current practice with respect to the ICRU 50 report." Weiss E et al. Int J Radiat Oncol Biol Phys. 2001 Apr 1;49(5):1475-80.

PMID 16215819, 2005 — "Leptomeningeal metastases from solid malignancy: a review." Tallibert S et al. J Neurooncol. 2005 Oct;75(1):85-99.
PMID 15908671, 2005 — "Neoplastic meningitis." Chamberlain MC. J Clin Oncol. 2005 May 20;23(15):3605-13.
PMID 9696379, 1998 — "Current diagnosis and treatment of leptomeningeal metastasis." DeAngelis LM. J Neurooncol. 1998 Jun-Jul;38(2-3):245-52.

Programlama dilinin detaylarına geçmeden önce ne kadar kolay olduğunu merak edenler için kod örneği görelim.
Aşağıdaki kod başlığı "Merhaba dünya!" olan basit bir pencere oluşturmak içindir:

BaCon sitesinde çeşitli Linux dağıtımları için hazırlanmış paketler bulunmaktadır. Ancak kullandığınız dağıtım için hazırlanmış paket bulunmuyorsa bile şu şekilde kurulum yapabilirsiniz:
1. BaCon-x.x.x.tar.gz dosyasını indirin (versiyon numarası yerine x yazılmıştır).
2. Eğer tar.gz dosyasını açmak için grafik arayüzlü bir program yoksa komut satırına tar xvfz bacon-x.x.x.tar.gz (indirdiğiniz tar.gz dosyasının ismi, terminal dosyanın bulunduğu dizinde değilse ~/Downloads/bacon-x.x.x.tar.gz vb. şeklinde dosya yolunu da yazınız.)
3. Dosya açıldıktan sonra cd bacon.x.x.x şeklinde dizine giriniz.
4. Root olarak şu komutları sırayla çalıştırınız:
./configure
make
make install
Eğer herhangi bir problem çıkmazsa kurulum tamamlanacaktır.
Kurulumda enscript ile ilgili hata alırsanız bu paketi yükledikten sonra kurulumu tekrar deneyebilirsiniz.

ATTACH(pencere, araç, x, y)
Tür: yönerge
Bu işlev, pencereye <x>, <y> konumundaki bir pencere aracı (widget) ekler. Pencerenin sol üst köşesi referans olarak alınır (0, 0).
Bu yönerge, bir pencerenin ekranda konumlandırılması için de kullanılabilir. Bu durumda pencere adı yerine 0, araç adı yerine pencere adı yazılır: ATTACH(0, pencere adı, x, y)
ATTACH kullanarak araçların pencere üzerinde konumlandırılmasına örnek:

BUTTON('başlık', xboyut, yboyut)
Tür: fonksiyon
Bir başlığı ve <xboyut> genişliği ve <yboyut> yüksekliği olan bir düğme oluşturur. Oluşturulan düğmenin kimliğini (ID) döndürür.

CALLBACK(araç, fonksiyon)
Tür: yönerge
<araç> için bir olay gerçekleştiğinde HUG'un atlayacağı <fonksiyon> bu yönerge ile ayarlanır.

CALLBACKX(araç, fonksiyon, değer)
Tür: yönerge
CALLBACK gibidir ancak farklı olarak tanımlanan <değer>, <fonksiyon> tarafından yakalanabilir.

CANVAS(xboyut, yboyut)
Tür: fonksiyon
<xboyut> genişliği ve <yboyut> yüksekliği olan bir kanvas (tuval) oluşturur. Sol üst köşe konumu (0, 0) olarak tanımlanır. En son oluşturulan tuval, çizimin yapıldığı varsayılan tuval olarak kabul edilir. Varsayılan tuval DRAW fonksiyonu ile değiştirilebilir.
Sistemde GtkGlArea kitaplığı veya GtkGlext kitaplığının bulunması koşuluyla tuval aynı zamanda bir OpenGL tuvali olarak da oluşturulabilir. Bunu yapmak için, tuvali oluşturmadan önce HUGOPTIONS'daki CANVAS seçeneğini kullanın.

CHECK("başlık", xboyut, yboyut)
Tür: fonksiyon
<xboyut> genişliği ve <yboyut> yüksekliği olan etiketli bir onay düğmesi (check button) oluşturur. Oluşturulan onay düğmesinin kimliğini (ID) döndürür.

CIRCLE("renk", xkonum, ykonum, genişlik, yükseklik, doldurma)
Tür: yönerge
Tuval üzerinde çevreleyen kutunun sol üst koordinatının <xkonum> ve <ykonum>da yerleştiği bir çember çizer. Çemberin toplam boyutu <genişlik> ve <yükseklik> ile belirlenir. Eğer <doldurma> sıfır değilse o zaman çember bir tam daire olacaktır. Bu yönerge bir GL tuval için de geçerlidir.
Renk, onaltılık sayı sisteminde bir üçlü olan "#rrggbb" formatında olur. RGB İngilizce Red "kırmızı", Green "yeşil" ve Blue "mavi" sözcüklerinin baş harfleridir. Bilgisayardaki bütün renkler bu üç rengin karışımından elde edilmektedir. Mesela "#FF0000" kırmızının, "#00FF00" yeşilin, "#0000FF" mavinin renk kodudur. FF onaltılık sayı sisteminde iki basamaklı en büyük sayıdır ve onluk sistemdeki karşılığı 255'tir. 00 ile birlikte bir renk için 256 seçenek bulunur ve böylece üç rengin karışımından 256 * 256 * 256 = 16.777.216 renk elde edilebilir.

CLIPBOARD
Tür: fonksiyon
Pano nesnesini alır. Oluşturulan panonun kimliğini (ID) döndürür.

COMBO("metin", xboyut, yboyut)
Tür: fonksiyon
Bir girisi olan ve genişliği <xboyut>, yüksekliği <yboyut> olan bir açılan kutu oluşturur. Oluşturulan açılan kutunun kimliğini (ID) döndürür.

DISABLE(araç)
Tür: yöntem
Bir aracı dondurur, böylece kullanılamaz.

DISPLAY
Tür: yönerge
Ana olay döngüsünü çalıştırmaya başlar. Bu fonksiyon GUI oluşturmada en son fonksiyon olarak çağrılacaktır.

DRAW(tuval)
Tür: yönerge
Çizimin gerçekleştiği varsayılan tuvali tanımlar.
GL_FREEZE'in etkin olduğu bir OpenGL tuvalinin (bkz. HUGOPTIONS) veya HUG olmayan çizimin kullanılması yağdayında, çizim tamponunu hazırlarken önce bu fonksiyon çağrılacaktır. Ardından, mevcut çizim tamamlandıktan sonra, GL tuvali SYNC yönergesi kullanılarak güncellenecektir.
Her durumda DRAW yönergesi mevcut düşük seviyeli çizim alt aracını döndürür.

EDIT(xboyut, yboyut)
Tür: yönerge
<xboyut> genişliğinde ve <yboyut> yüksekliğinde çok satırlı bir metin aracı tanımlar. Metin aracının kimliğini (ID) döndürür. Bu araçtaki metin düzenini ayarlamak için HUGOPTIONS içindeki MARKUP özelliğine de bakınız.

ENABLE(araç)
Tür: yöntem
(DISABLE ile dondurulmuş) bir aracı serbest bırakır, böylece kullanılabilir.

ENTRY("metin", xboyut, yboyut)
Tür: fonksiyon
<xboyut> genişliğinde ve <yboyut> uzunluğunda boş veya biraz metin içeren bir metin girisi oluşturur. Oluşturulan metin girisinin kimliğini (ID) döndürür.

FILEDIALOG("metin", "başlık", xboyut, yboyut, davranış)
Tür: fonksiyon
Dosya gezginli bir iletişim kutusu oluşturur. İletişim kutusu <davranış>a bağlı olarak "Dosya Aç" (0), "Dosya Kaydet" (1), "Klasör Seç" (2) veya "Klasör Oluştur" (3) için kullanılabilir.
Varsayılan olarak iletişim kutusu gizli olacaktır. Onu görülebilir yapmak için SHOW fonksiyonunu kullanınız. Oluşturulan iletişim kuüusunun kimliğini (ID) döndürür.

FOCUS(araç)
Tür: yöntem
Odağı bir araca yerleştirir.

FONT(araç, "Font adı")
Tür: yönerge
Bir araç için font tanımlar. Örnek:
FONT(pencere, "Luxi Mono 12")
FONT(dugme, "Arial 15")

FRAME(xboyut, yboyut)
Tür: fonksiyon
<xboyut> genişliğinde ve <yboyut> uzunluğunda bir çerçeve tanımlar. Oluşturulan çerçevenin kimliğini (ID) döndürür.

GET(araç)
Tür: yöntem
Araca bağlı olarak, araçtan bir değer alır. Geçerli davranış aşağıdaki tabloda gösterilmektedir.

GETPROPERTY(araç, "özellik", değişken)
Tür: yönerge
Bir aracın özelliğinin değerini değişkene döndürür. Örnek:
DECLARE t$
GETPROPERTY(pencere, "title", ADDRESS(t$))

GRAB$(araç)
Tür: yöntem
Araca bağlı olarak, metni alır.  Geçerli davranış aşağıdaki tabloda gösterilmektedir.

HIDE(araç)
Tür: yöntem
Bir aracı gizler ve o araç görünmez olur.

HSEPARATOR(boyut)
Tür: fonksiyon
<boyut> uzunluğunda yatay bir ayırıcı çizgi oluşturur. Oluşturulan ayırıcının kimliğini (ID) döndürür.

HSLIDER(xboyut, yboyut, başla, bitir, adım)
Tür: fonksiyon
<xboyut> genişliğinde ve <yboyut> yüksekliğinde yatay bir kaydırıcı oluşturur. Değer aralığı, <adım> adım ölçüsü ile <başla> ve <bitir> tarafından belirlenir. Oluşturulan kaydırıcının kimliğini (ID) döndürür.

HUGLIB$("tip")
Tür: fonksiyon
HUG tarafından kullanılmakta olan gerçek arka uç kütüphanesini döndürür. Bağımsız değişkenler aşağıdakilerden biri olabilir:

"gtk" - geçerli GTK kitaplığı sürümü
"gdk" - geçerli GDK kitaplığı sürümü
"glib" - geçerli Glib kütüphanesi sürümü
"gobject" - geçerli Gobject kitaplığı sürümü
"pango" - geçerli Pango kütüphanesi sürümü
"glarea" - geçerli GtkGlArea kitaplığı sürümü
"glext" - geçerli GtkGlExt kütüphanesi sürümü

Bash bir "Unix kabuğudur". Başka bir değişle işletim sistemi ile etkileşime geçmeye yarayan bir komut satırı arayüzüdür. Çoğu GNU/Linux dağıtımında ve MacOS'in eski sürümlerinde varsayılan kabuk olmasıyla gayet yaygındır. Bash, 80'lerde Özgür Yazılım Vakfı'nda çalışan Brian Fox isimli yazılımcı tarafından Richard Stallman'ın isteği üzerine geliştirilmiştir. Amacı Unix'in o zamanki kapalı kaynak Bourne kabuğuna özgür ve açık kaynak bir alternatif olmaktı ve o kabuğun tüm özelliklerine sahip olmasının yanında tamsayı aritmetiği ve iş kontrolü gibi yeni özellikleri de barındırmaktadır.
	

Etkileşimli modun yani kullanıcıların her seferinde tek satır komut yazıp tam zamanlı sonuç alabildiği kabuk arayüzünün yanında Bash (birçok öbür kabuk gibi) "Bash kabuk betikleri" ("Bash betiği" veya kısaca "betik" de denir) isimli birden çok komutu içinde barındıran betikleri çalıştırabilme kabiliyetine de sahiptir. Bir betik çok basit birkaç komutu içeren bir listeden hatta tek bir komuttan oluşabildiği gibi fonksiyon, döngü, koşullu yapılar ve imperative programlamanın öbür yapı taşlarını içerebilir. Neticede bir Bash betiği, Bash yazılım dilinde yazılmış bir bilgisayar yazılımıdır.
	
Kabuk betikleme, bu tarz betikleri oluşturma ve geliştirme sanatıdır.
	
Kabuk betikleri, yukarıda bahsedilen etkileşimli komut satırı arayüzünde veya sistemin başka parçaları tarafından çalıştırılabilir. Bir betik sistem başlatıldığı sırada çalıştırılabilirken başka bir betik saat 2.30'da veya kullanıcı sisteme giriş yaptığında çalıştırılmaya ayarlanabilir.
	
Kabuk betikleri genellikle disk yedeği almak, sistem kayıtlarını incelemek gibi sistem yöneticiliği görevlerinde kullanılır. Kabuk betikleri ayrıca karmaşık yazılımların kurulumunda sıklıkla kullanılır. Betiklerin bu gibi işlerde kullanılmasının sebebi kendi başlarına karmaşık olmamakla beraber karmaşık işlere izin vermeleridir. Örneğin bir betiğin yalnızca iki program çalıştırması gerekiyorsa o betik yalnızca 2 satırdan oluşabilir. Öte yandan Turing makinesine uyumlu imperatif bir yazılım dilinin gücü ve karar alma kabiliyetini gerektiren bir işlem gerekirse betik bunu da sağlayabilir.

Basit bir komut, boşluk veya tab ile ayrılmış kelimelerden oluşur. İlk kelime komutun ismiyken geri kalan kelimeler komutun argümanları olarak tanımlanır. Önceki başlıkta bazı basit komut örnekleri görmüştük. Burada birkaç tane daha var:

cd ..
Bu komut cd ("change directory" = dizin değiştir; dosya sistemi içerisinde yolculuk yapmak için kullanılır)'yi bir dizin üste çıkmak için kullanmaktadır.
.. işareti "üst dizin" anlamına gelir. Örneğin /foo/bar/../baz.txt ile belirtilen konum, /foo/baz.txt konumunun eş anlamlısıdır.
rm foo.txt bar.txt baz.txt
rm komutunun yüklü geldiğini varsayarsak bu program mevcut dizindeki foo.txt, bar.txt ve baz.txt isimli dosyaları siler.
Bash, harici olan rm programını yapılandırılabilir dizin listesinde rm isimli çalıştırılabilir bir dosya arayarak bulur.
/foo/bar/baz bip.txt
Bu komut, /foo/bar/baz konumunda bulunan programı çalıştırır ve bip.txt'de bulunan argümanı kullanır.
/foo/bar/baz çalıştırılabilir olmalıdır.
Dikkat: Eğik çizgi ve dosya isimleri arasında BOŞLUK OLMAMASINA dikkat edin. Eğer rm -r / foo gibi boşluk nedeniyle kök dizini hedef alan bir komutu yönetici haklarıyla çalıştırırsanız bilgisayarınızın kök dizini silinebilir ve ayvayı yersiniz.
Eğer /foo/bar/baz ikili program yerine bir metin dosyasıysa ve ilk satırı #! ile başlıyorsa o satırın hatırlatıcısı bu dosyayı çalıştırmak için gerekli olan yorumlayıcıyı (interpreter) belirler. Örneğin eğer /foo/bar/baz konumunda bulunan dosyanın ilk satırı #!/bin/bash ise üstteki komut /bin/bash /foo/bar/baz bip.txt ile eş anlamlıdır.
/foo/bar/baz ile yapılan örnek, herhangi bir program gibi çalışabilen Bash betiklerinin yapılabileceğini gösteren özel bir not içeriyor. Yalnızca #!/bin/bash ifadesinin bir betiğin ilk satırına konulması ve okunup çalıştırılabilmesi için doğru dosya izinlerine sahip olması o betiğin bir program gibi çalışması için yeterli. Bir hatırlatma olarak bu kitaptaki tamamlanmış tüm kabuk betikleri #!/bin/bash ile başlayacaktır.

İlk örnekte gördüğümüz üzere cd komutu belirtilen argümanlar ile gezinmeye yarar. Unix ve GNU/Linux gibi Unix benzeri sistemlerde göreceli ve mutlak olmak üzere iki yol türü vardır. Göreceli yollar bulunduğunuz yola göre konumlanırken mutlak yollar nettir. Bu örnekte belirtilen mutlak yola gidiliyor:

Göreceli yol gezinmesi için çeşitli kısayolları mümkün kılan belirli argümanlar vardır. 2 dizin üste çıkmak için şu argümanı kullanmalısınız:

Mevcut konumunuzdan önce bulunduğunuz konuma dönmek için şu argümanı kullanabilirsiniz:

Şu an üzerinde olduğunuz yolu öğrenmek için yaygın Unix araçlarından pwd komutunu kullanabilirsiniz.

Yukarıda rm foo.txt bar.txt baz.txt komutunun foo.txt, bar.txt, ve baz.txt isimli üç dosyayı sildiğini gördük. Bu, Bash'in komutları boşluğa göre 4 farklı kelimeye ayırmasından ve o 3 kelimenin rm programının argümanlarına dönüşmesinden kaynaklanıyor. Peki ya isminde boşluk olan bir dosyayı silmek istersek ne yapmalıyız?

Bash bu durumda işe yarayabilecek bazı alıntılama tekniklerine sahiptir. Bu teknikler arasında tek tırnak işaretleri ' ve çift tırnak işaretleri " en yaygın olanlardır. Bu iki komut da bu dosya.txt isimli bir dosyayı silecektir:

Tırnak işaretleri içindeki boşluk karakterleri, kelime ayırma özelliklerini kaybeder. Normalde yukarıdaki gibi tüm kelime tırnak içine alınsa da yalnızca boşluğu this' 'file.txt veya this" "file.txt olarak tırnak içine almak da işe yarar.
Öbür sıklıkla kullanılan bir alıntılama mekanizması da ters eğik çizgi \ ifadesidir ancak yalnızca bir karakteri alıntıladığı (veya "atladığı") için tırnaklardan biraz farklı çalışır. Alttaki komut üstteki örneklerle aynı işlevi görür:

Tüm bu durumlarda görülebildiği üzere alıntılama karakterleri programa dahil edilmemiştir. (Buna alıntı silimi denir.) Bu nedenle rm komutu bu alıntıların çalıştırıldığına dair bilgi sahibi değildir. Örneğin rm foo.txt veya rm 'foo.txt' komutları rm için aynıdır.

Bash yaygın kullanılan argümanları programlara geçirmek için uzantı olarak bilinen bazı özel işaretleri destekler.
Bu işaretlerden birisi, *.txt gibi bir desenin bu desene uyan tüm dosyalara tekabül etmesini sağlayan dosya ismi uzantısıdır. Örneğin mevcut dizin foo.txt, bar.txt, bu dosya.txt, ve başka bir.şey gibi dosyaları barındırıyorsa şu komut:

bu komut ile aynı görevi görecektir:

Burada * ifadesi "sıfır veya daha fazla karakter" anlamına gelir. Başka özel desen karakterleri (örneğin "tam olarak tek karakter" anlamına gelen soru işareti ?) ve desen eşleştirme kuralları da vardır ancak * ifadesinin bu kullanımı desenlerin en yaygın kullanımıdır.
Dosya isim uzantısı mevcut dizindeki dosyalarla sınırlı değildir. Örneğin eğer /usr/bin dizini içindeki t*.sh desenine uyan tüm dosyaları sıralamak istiyorsak şu komutu yazabiliriz:

Bu komutu şu şekilde genişletebiliriz:

Eğer hiçbir dosya belirtilen desene uymuyorsa herhangi bir ikame yaşanmaz. Örneğin şu komut yalnızca asfasefasef*avzxv çıktısı verecek:

Peki ya eğer ismi *.txt olan bir dosyayı belirtmek istiyorsak ne yapmalıyız? (Evet, dosya isimleri yıldız içerebilir!) O halde daha önce bahsettiğimiz alıntılama tekniklerinden tırnak işaretlerini kullanabiliriz:

İki komut da .txt uzantısını içeren dosyalar yerine *.txt isimli dosyanın içeriğini çıkartacaktır.
Başka benzer bir uzantı da yaklaşık uzantısıdır. Yaklaşık uzantısı çok daha fazla özelliğe sahiptir ancak en önemli özelliği yalnızca yaklaşık işaretine ~ veya eğik çizgi ile yaklaşık işaretine ~/ sahip bir kelimede yaklaşık işaretini dosyanın mevcut kullanıcının ev dizinine kadar olan konumuyla değiştirmesidir. Örneğin şu komut, mevcut kullanıcının ev dizininde *.txt desenine uyan tüm dosyaları yazdıracaktır:

Ayraç uzantısı, dosya uzantısına benzer şekilde birden fazla benzer argümanı belirtmek için kullanılır. Aşağıdaki 4 komut birbirinin aynısıdır:

İlk komut her bir argümanı açıkça sıralar. Öbür üç komut belirtilen argümanları kısaca ifade etmek için ayraç uzantısı kullanır. İkinci komutta 1'den 5'e kadar olan ifadeler virgülle ayrılarak verilmiş. Üçüncü komutta ise numaralı bir sıra (1'den 5'e kadar, 1 arttırılarak) verilmiş. Dördüncü komut üçüncü komut ile aynı ancak ..1 ifadesi örtük.
Dosyaları ayrıca tersten de sıralayabiliriz.

Son değer başlangıç değerinden düşük olduğu için örtük ifade -1 olmalıdır.
Bash'de bir komutun ilk kelimesi çalıştırılacak program olduğundan komutu şu şekil de yazabiliriz:

Ayraç uzantıları aynı dosya ismi uzantıları gibi '{', "{", or \{ gibi alıntılama mekanikleriyle devre dışı bırakılabilir.

Bash bir komutun standart çıktısının konsol yerine bir dosyaya gönderilmesine izin verir. Örneğin yaygın bir araç komutu olan cat

bir dosyanın içeriğini standart çıktı olarak yazdırır. Eğer bu standart çıktıyı bir dosyaya yönlendirirsek bu durumda bir dosyanın içeriğini başka bir dosyaya kopyalama işlemini gerçekleştirmiş oluruz.

Eğer hedef dosyanın içeriğinin komut çıktısı tarafından üstüne yazılmasını istiyorsak şu ifadeyi kullanmalıyız:

Eğer hedef dosyanın içeriğinin korunup komut çıktısını dosyanın sonuna iliştirmek istiyorsak şu ifadeyi kullanacağız:

Ancak bir programın konsola yazdığı her şey standart çıktı formatında olmayabilir. Çoğu program hata çıktısı ve "giriş" veya "yan-kanal" mesajları için standart hata formatını kullanıyor. Eğer standart hata formatının da standart çıktıya dahil edilmesini istiyorsak şu ifadelerden birini kullanabiliriz:

Eğer hata çıktısının standart çıktıdan ayrı bir dosyaya yazılmasını istiyorsak şu ifadeyi kullanmalıyız:

Aslında standart çıktıya dokunmayıp yalnızca hata çıktısını da yönlendirebiliriz:

Yukarıda gösterilen tüm örneklerde çıktıyı yönlendirme hedefindeki içeriğe iliştirmek yerine üstüne yazmak için >> ifadesini > ile değiştirebiliriz.
İlerleyen bölümlerde bu çıktı yönlendirmesiyle yapılabilecek daha gelişmiş örneklere bakacağız.

Bash bir programın çıktısının dosyaya yönlendirilmesine izin verdiği gibi program girdisini de dosyadan yönlendirebilir. Örneğin araç komutu olan cat aşağıdaki örnekte belirtilen dosyadaki girdiyi çıktısına kopyalayıp girdi.txt içeriğini konsola yazdırıyor:

Halihazırda gördüğümüz gibi cat zaten girilen dosyanın içeriğini yazdırmak için kulllanılabilen bir komut olduğundan yönlendirme bu örnekte gerekli değildir ve aynı komut şu şekilde de yazılabilir:

Bu bir istisnadan ziyade kuraldır. Konsoldan girdi alabilen çoğu sık kullanılan Unix aracı girdilerini belirtilen dosyadan alma özelliğine sahiptir. Doğrusu cat de dahil olmak üzere birçok komut birden fazla dosyayı girdi olarak alarak yukarıdaki örnekten daha esnek kullanıma sahip olabilir. Aşağıdaki örnek sırasıyla girdi1.txt ve girdi2.txt'yi yazdırıyor:

Bununla beraber girdi yönlendirmenin önemli olduğu kullanım alanları vardır ve onları ileriki örneklerde göreceğiz.

Bu bölümün kapsamının dışında olmasına karşın artık bağlantı hatlarına bakmak için gerekli bilgiye sahibiz. Bir bağlantı hattı (pipeline), bağlantı karakteri | ile ayrılarak yazılmış komutlar serisidir. Serideki her bir komut aynı anda çalışır ve her bir komutun çıktısı bir sonrakinin girdisi olarak kullanılır.
Örneğin şu bağlantı hattını inceleyelim:

cat aracını daha önce görmüştük. cat girdi.txt komutu basitçe girdi.txt dosyasını standart çıktısı olarak yazdırıyor. grep programı belirtilen şablona uygun olan ifadeleri filtreleyen (Unix konuşma dilinde "grepleyen") yaygın bir Unix aracıdır. Yukarıdaki örnekte de grep foo komutu belirtilen girdide foo ifadesini taşıyan satırları yazdıracaktır. grep -v bar komutu ise şablonu tersine çeviren -v argümanına sahiptir yani komut girdide bar ifadesini taşımayan tüm satırları yazdıracaktır. Her komutun girdisi bir önceki komutun çıktısı olduğuna göre bağlantı hattı girdi.txt dosyasındaki satırlardan sadece foo ifadesini taşıyan ve bar ifadesini taşımayanları yazdıracaktır.

Bash betiklerinde değer barındırabilen birtakım parametreler vardır. Değişkenler de isimlendirilmiş parametre anlamına gelen önemli bir parametre türüdür. Herhangi bir imperative programlama diline (C, BASIC, Fortran, veya Pascal gibi) hakimseniz değişkenlerin ne olduğunu zaten biliyorsunuz demektir. Aşağıdaki basit betikte konum isimli değişken dünya değerini barındırır ve o ünlü "Merhaba, dünya!" mesajını yazdırır:

Gördüğünüz gibi ikinci satırdaki ${konum} ifadesi dünya ile değiştirildi. Bu ikame işlemi değişken uzantısı (variable expansion) olarak bilinir ve deminki örnekten daha esnek durumlarda dahi kullanılabilir. Bir örnek vermek gerekirse çalıştırılacak komutun ismi bile değişken olarak tutulabilir:

Yukarıdaki iki örnekte de ${değişken_ismi} ifadesini değişken uzantısı olarak kullandık. Parantez kullanılmadan yazılan $değişken_ismi ifadesi de yukarıdaki örneklerde aynı işlevi görecektir, ancak bazı nadir durumlarda parantez gereklidir. Mesela ${foo}bar ifadesi code>$foobar olarak yazılamaz çünkü son örnek ${foobar} olarak yorumlanacaktır.
Tabii ki söylemeye gerek olmaksızın yukarıdaki örnekler çok da gerçekçi değil. Bu örnekler yalnızca değişkenlerin nasıl kullanılacağını gösteriyor ancak niçin veya ne zaman kullanılacaklarına değinmiyor. Eğer öbür imperative programlama dillerine aşinaysanız değişkenlerin hangi amaç ve zamanda kullanılacağını zaten az çok biliyorsunuz. Eğer bilmiyorsanız endişelenmeyin çünkü bu kitabı okuyup değişkenleri daha gerçekçi durumlarda kullanan örnekleri gördükçe aşinalık kazanacaksınız.
Tek tırnak ' yerine çift tırnak " kullandığımızı fark etmiş olabilirsiniz. Bunun sebebi tek tırnağın değişken uzantısını engellemesinden kaynaklı. echo '${konum}' gibi bir komut, konum isimli değişkenin barındırdığı değer yerine ciddi ciddi ${konum} ifadesini mesaj olarak yazdıracaktır.
Değişken uzantılarını çift tırnak içinde yazmak genelde iyi bir fikirdir, çünkü öbür türlü değişken uzantısının sonucu dosya ismi uzantısı olarak algılanacaktır ve kelime ayrıştırmasına (boşlukla ayrılan argümanların farklı komutlar olarak algılanması) maruz kalacaktır. Örneğin aşağıdaki betik örneğinde çıktı büyük ihtimalle istemediğimiz şekilde a ba.txt bd.sh olarak yazdırılma ihtimaline sahiptir:

Gerçek hayatta kullanılan betiklerde çift tırnaklı ifadeleri gerekmedikçe kullanılmaz, ancak pratikte bu tercih bazı kafa karıştırıcı bug'lara yol açabilir.

Birtakım değişkenin özel anlamı vardır. Örneğin PATH (yol) değişkeni, Bash harici bir program çalıştırırken araması gereken dizinlerin sırasını belirler. Eğer bu değişken /usr/bin:/bin yolunu barındırıyorsa cp src.txt dst.txt komutu çalıştırılmak için /usr/bin/cp veya /bin/cp konumuna bakacak. HOME (ev) değişkeni mevcut kullanıcının ev dizininde hâlihazırda belirlenmiştir ve yaklaşık uzantıların davranışını belirler. Örneğin eğer bir betik ev dizinini HOME=/foo olarak ayarlarsa echo ~/bar komutu ev dizininin konumunu /foo/bar olarak çıkartacaktır. (Ancak bu işlem, sistemin varsayılan ev dizinini değiştirmez.)

Sisteminizde Bash yüklü olmalıdır. Halihazırda içinde Bash kabuğu yüklü gelen Ubuntu, Manjaro vs. gibi bir GNU/Linux dağıtımı kullanmanız önerilir.
Eğer FreeBSD, MacOS ve öbür Unix benzeri işletim sistemlerini kullanıyorsanız ve Bash kabuğu yüklü gelmediyse paket yöneticileri aracılığıyla Bash'i indirebilir veya Bash dilini destekleyen ve yüklü gelen kabuk programlarını kullanabilirsiniz.
Eğer Windows 10 veya Windows 11 sistemini kullanıyorsanız Windows Subsystem for Linux (Linux için Windows Alt Sistemi) yazılımını indirebilirsiniz. Eğer daha eski bir Windows sürümü kullanıyor ve bir GNU/Linux veya Unix benzeri başka bir sisteme erişiminiz yoksa Cygwin gibi Bash ve çoğu öbür kabuk aracına sahip bir runtime ortamı kullanmanız işinizi kolaylaştıracaktır. Eğer Cygwin kullanıyorsanız Bash araçlarını içeren dizinin (genelde C:\Cygwin\bin konumunda olur) Windows dizin ağacında sıralandığından emin olun.
Android'de Termux isimli uygulamayı yükleyebilirsiniz.

Bash betiğinin neler için kullanıldığını görmek için bazı örneklere bakacağız. Eğer şu an bu komutları anlamıyorsanız üzülmeyin.

Basit bir "merhaba dünya" programıyla başlayalım:

Bu komutu doğrudan Bash komut istemciye girebiliriz veya bir dosyaya (örneğin hello_world.sh) kaydedip istemciye bash hello_world.sh veya ./hello_world.sh yazarak çalıştırabiliriz. İki durumda da Merhaba, dünya! yazdırılacaktır:

$ echo 'Hello, world!'
Merhaba, dünya!

Burada Bash komut istemcisini belirtmek için $ işaretini kullandık. $ işaretinin yanındaki satır girdiğimiz komutu, sonraki satır ise komutun sonucunu göstermektedir.

Şimdi daha karmaşık bir betiğe bakalım:

Bu betik, mevcut dizinde readme.txt isimli bir dosyanın var olup olmadığını kontrol eder ve if sorgusunu kontrolün sonucuna göre hangi komutların çalıştırılacağını belirlemek için kullanır. Bu betik de doğrudan komut istemciye girilebilirdi ancak bu durumda pek işe yaramazdı.
Yukarıdaki örneklerin hepsi tamamen "Bash içinde" yazıldı yani herhangi bir haricî program gerektirmedi. (echo, if … then … else … fi, ve [[ -e … ]] komutları Bash'in yerleşik komutlarıdır.) Ancak bir kabuk betikleme dili olmasının yanında Bash'in kullanım alanının büyük kısmı haricî programları çalıştırmaktır. Alttaki betik bu beceriyi göstermektedir:

Buradaki diff ve cp komutları Bash'de yerleşik olarak bulunmasalar da Bash içeren sistemlerde yüklü gelen yaygın araç programlarıdır. Yukarıdaki betik config-varsayılan.txt isimli varsayılan konfigürasyon dosyasını farzediyor ve config.txt isimli başka bir konfigürasyon dosyasının varlığını kontrol ediyor. Eğer config.txt varsa betik diff isimli haricî programı kullanarak bir "diff" ("difference" = fark) yani iki dosya arasındaki farkı hesaplıyor, böylece kullanıcı varsayılan olmayan konfigürasyon dosyasında nelerin farklı olduğunu görebiliyor. Eğer config.txt isimli dosya bulunamıyorsa betik cp ("copy" = kopyalamak) isimli haricî programı kullanarak varsayılan konfigürasyon dosyasını config.txt ismiyle kopyalıyor.
Gördüğünüz gibi haricî programlar da aynı yerleşik komutlar gibi benzer sözdizimi kullanılarak çalıştırılabiliyor, çünkü iki tip de birer "komut".
Yukarıdaki betik fazla "ayrıntılı". Tipik bir betik, kullanıcılar bu kadar bilgiye ihtiyaç duymayacağı için echo komutunu çok kullanmaz. Aşağıdaki örnekte Bash tarafından yoksayılan # işaretini kullanarak betiğe yorum ekleyeceğiz. Bu tarz yorumlar kullanıcıdan ziyade betiği inceleyen kişiler için bilgilendirici olacaktır.

Bu tarz bir yorumlama yalnızca bu örnek için yapıldı, çünkü normalde bu kadar basit bir betik hiçbir yoruma ihtiyaç duymaz.

Yukarıdaki çoğu komutta (hem dahili hem de harici program çalıştıranlar) komutun ne yapması gerektiğini belirten bir ya da daha fazla argüman sağladık. Örneğin yaygın bir Unix aracı olan mkdir (make directory = dizin oluştur) yeni bir dizin oluşturmak için çağırdığımız zaman şöyle bir komut kullanırız:

Bu komutta tmp oluşturmak istediğimiz dizinin ismidir.
Ve daha önce de gördüğümüz gibi Bash betiklerinin kendileri çalıştırılabilir programlardır. Yani söylemeye gerek olmadan anlaşılacağı üzere betikler de aynı öbür programlar gibi argümanlara sahip olabilir. Bu argümanlar programda konumsal parametreler olarak kullanıma müsaittir. Konumsal parametreler argümanlar ile çok benzerlerdir, ancak kelime yerine sayı ile tanımlanırlar. Örneğin $1 (veya ${1}) betiğin ilk argümanı olarak uzantılanabilir. Mesela diyelim ki dosyayrt.sh isminde, bir dosya ismi ile metin içeren iki argüman alan ve belirtilen dosya ile belirtilen dosyayı oluşturan basit bir betik oluşturmak istiyoruz. Bu betiği şu şekil yazabiliriz:

(Fark ettiyseniz #!/bin/bash satırı dosyanın başında. Bu satıra Basit komutlar bölümünde değinmiştik. Bu kodu çalıştırdığınız vakit bu satır betiğin Bash kabuğu tarafından çalıştırılacağını garantileyecek.)
Betiği chmod +x dosyayrt.sh komutunu çalıştırarak program olarak çalıştırılabilir hale getirdikten sonra şu komut ile programımızı çalıştırabiliriz:

Tüm argümanlara bir seferde değinmek için tüm konumsal parametrelere sırayla uzantılanabilen $@ ifadesini de kullanabiliriz. "$@" şeklinde çift tırnak içine alındığı takdirde her argüman ayrı bir kelimeye dönüşür. (Not: alternatif olarak kullanılabilen $* büyük ihtimalle daha yaygın, ancak "$*" şeklinde tırnak içine alındığında orijinal parametreler ile arasında boşluk olmasıyla tek kelime sayılıyor. Bir argümanın arada boşluk olması kaydıyla birden fazla kelimeye bölünmesine izin veren "$@" ifadesi neredeyse her zaman $@ veya $* ifadelerine karşı tercih edilir.) Bu kullanım shift gibi ilk konumsal parametreyi silen, örneğin $2'nin $1 ve $3'ün $2'ye falan dönüştüğü dahili komutlarda işe yarar. Örneğin eğer daha önce oluşturduğumuz dosyayrt.sh programını aşağıdaki gibi değiştirirsek:

programı şu şekil çalıştırabiliriz:

ve dosya ismi hariç tüm argümanlar dosyaya yazılır.

Bash komutlarının dili Turing makinesine uygun bir programlama dilidir, yani teorik olarak bir programlama diliyle çalıştırılabilen her şey Bash'de de çalıştırılabilir. Üstelik Bash'de bazı aşırı sofistike şeyler yapmak mümkündür. Yine de Bash bir "programlama dili" yerine "kabuk betikleme dili" olarak tanımlanır, ve Bash'de yazılan programlar "Bash programı" yerine "Bash kabuk betiği" olarak anılır. Bu tanımlamaya bu kitapta uyacağız ve Bash dili ile yazılanlara betik, Bash betiğinin harici olarak çağırdıklarına program diyeceğiz.
Ayrıca araç kelimesini de sıklıkla kullanacağız. Bu terim biraz öznel olmakla beraber değişken bir kullanım alanına sahiptir ancak genel olarak insan etkileşimine ihtiyaç duymadan öbür yazılımlarla uyum içinde çalışan harici yazılımları tanımlamak için kullanılır. Tüm araçlar birer yazılımdır, bu yüzden iki terimi karışık kullanacağız. Bir "aracın" zıttı uygulamadır. Bu terim de özneldir ancak genelde insan etkileşimine ihtiyaç duyan, gelişmiş bir GUI'si (kullanıcı arayüzü) olan yazılımları tanımlar. Uygulamalar genellikle Bash betikleri ile çağırılmadıkları için bu terimi çok sık kullanmayacağız. Çoğu yazılım "araç" veya "uygulama" değildir, ve bazı yazılımlar iki tipin de özelliklerini içlerinde barındırabilir.
Bash betiğindeki birçok öğenin bazılarına komut denirken bazılarına da sorgu denir. Bu farkı bu kitapta inceleyeceğiz ancak bunun üzerine çok kafa yormanıza gerek yok. Normalde "komut", haricî yazılımların çağrılması için kullanılırken bir "sorgu" if … then … else … fi gibi yazılım yapıları veya değişken tanımlamaları için kullanılır.

Fotoğraf: Yunanca,(Phos):Işık ve Graphos:Çizmek, sözcüklerinin birleşiminden meydana gelen fotoğraf kelimesi, ışıkla çizmek anlamına gelir.
Fotoğraf çekme: belgelenmek istenen objeden yansıyan ışığın özel ve ışığa duyarlı yüzey üstüne düşürülmesi ve objenin o andaki görüntüsünün kaydedilmesi işlemidir. Görüntü çeşitli özelliklerdeki filmlere veya sayısal ortamlara kaydedilebilir (Örneğin: filmli makinelerde farklı tipteki filmlere, sensörlü makinelerde hafıza kartlarına). Kaydedilmiş görüntüler çeşitli şekillerde işlenip Fotoğraf haline getirilir (Örneğin: Kimyasal yöntemlerle ya da yazıcılarla kağıtlara işlenebilir, halılara dokunabilir veya ekranlarda gösterilebilir).
Fotoğraf Makinesi: Fotoğraf çekme işlemini gerçekleştirmeye yarayan özel düzeneklere Fotoğraf Makinesi denir. Farklı şekillerde çalışan birçok fotoğraf makinesi türü vardır, kitapta DSLR makineler ele alınacağı için diğerlerine değinilmeyecek.
DSLR Fotoğraf Makinesi, "Digital single-lens reflex" ya da Türkçesiyle "Sayısal Tek Mercek Yansımalı" makineler: Görüntüyü, sahip oldukları sensörler vasıtasıyla kaydedebilen ve objektifleri değiştirilebilen makinelerdir. Kaydettikleri görüntülerin işlenmesi kolay olduğundan ve sürekli geliştirildiklerinden fazlaca tercih edilmektedirler.

Günlük hayatın monotonluğundan ve sürekli aynı uğraşların sıkıcılığından uzaklaşmak insanın zihinsel ve psikolojik ihtiyaçlardandır, İnsanlar, zihinsel ve bedensel molalara olanak veren ve yapmaktan hoşlandıkları çeşitli hobiler edinirler. Fotoğrafçılık çoğu zaman bir iş olsa da bazı insanların hobileri arasındadır. Bu hobinin bir çok türü vardır, bazıları oldukça pahalı alet ve ekipmanlara, profesyonel bilgiye ve tecrübeye gereksinim duyarlar.
Fotoğrafçılık oldukça emek isteyen, bilgi ve tecrübeye dayanan, bazen cesaret bazen fedakarlık gerektiren bir sanattır/zanaattır. Ara Güler gibi bazı fotoğrafçılar tam olarak gerçeği yansıttıkları için sanatçı olmadıklarını savunmuşlardır.
Bu kitapta, kullanımları kolay olduğu için günümüzde en çok tercih edilen fotoğraf makinesi çeşidi olan DSLR tipi fotoğraf makineleri basitçe tanıtılacaktır.

Perde veya shutter, ayna'nın ardında, sensör'ün hemen önünde bulunan ve sensör'ün ışığa maruz kalma süresini kontrol etmeye yarayan bir bileşendir. Deklanşör'e basılınca açılır ve belirlenen süre sonunda kapanır. Açık kaldığı süre boyunca sensöre kadrajdan ışık gelir.
Perdenin açık kalma süresine perde süresi, perde hızı, enstantane veya pozlama süresi denir. 1/20 (bir bölü yirmi saniye), 1/800, 1‘‘ (bir saniye), 5‘‘ şeklinde gösterilir.

Perde hem sensörün soğurduğu ışık miktarını etkileyen, hem görüntünün yakalanma süresini etkileyen bir bileşendir.
Doğru ayarlanmamış ışık miktarı ve süresi istenilen fotoğrafın oluşmamasına neden olur.
Örneğin:

Az ışıklı ortamlarda kısa perde süreleri fotoğrafın karanlık çıkmasına neden olurken, ışıklı ortamlarda uzun perde süreleri fotoğrafta fazla ışıklı bölgelere veya fazla aydınlık fotoğraflara neden olur.
Uzun süreli pozlama yapılarak çekilmiş bir fotoğraftaki ışık yansıtan obje hareket ederse ışık yansıtan kısımlar fotoğrafta görülür.

Pozometre veya ışık ölçer, belirlenen koşullara göre (diyafram, enstantane, ISO ayarları gibi) makineye giren ışık değerini ölçüp en uygun pozlama hesaplarını yapar.
Pozometre makinelerde dâhilî olarak var olduğu gibi, daha doğru ölçümler yapabilmek için haricî pozometreler de kullanılabilir.
DSLR fotoğraf makinelerinde çeşitli fotoğraf çekim modları vardır. Üreticilere göre değişen isimlerdeki modların başlıcaları: Ayarların manuel olarak yapıldığı mod; Enstantane ayarının manuel yapıldığı, buna bağlı olarak diyafram ayarının otomatik yapıldığı mod ve diyafram ayarının manuel yapıldığı, buna bağlı olarak enstantanenin otomatik olarak yapıldığı modlardır. İlkinde pozometre ölçüm yapar ve kullanıcıyı yönlendirir, ona uyup uymamak kullanıcıya kalmıştır, diğer ikisinde ise otomatik ayarlar pozometrenin ölçümüne göre yapılır.
Işık ölçümünde dikkate alınacak bölgeyi seçmek isteyen kullanıcılar için ölçüm modları ayarı vardır. Bu ayar ile ölçümde dikkate alınacak bölge, kadrajın tüm alanı, orta alanı veya orta noktası olarak belirlenebilir. Manzara, portre veya makro çekimine göre farklı ayar kullanılır.

Sensör ya da algılayıcı, kadrajdan yansıyan ışığı algılayıp sayısal verilere dönüştürür ve verileri görüntü işlemcisine gönderir. Çeşitli tipleri vardır. Son zamanlarda genelde CMOS tipi sensörler kullanılmaktadır. Sensörler yarı iletkenler kullanılarak yapılan, ışığı ve renkleri algılayan cihazlardır. Analog makinelerden DSLR makinelere geçişte sensör teknolojisinin gelişimi büyük rol oynamıştır.
Sensörler çeşitli büyüklüklerde olabilirler. Full frame (tam çerçeve) sensör boyutu 36X25 mm'dir, üreticiler maliyetlerin azalması için sensörde küçülmeye gitmişlerdir. Üreticilere göre belli oranlarda küçülen sensörlere croplu sensörler (kırpılmış sensörler) denmektedir.
Full frame sensörler ile, croplu sensörlere göre daha kaliteli fotoğraflar elde edilir. Ayrıca kırpılma oranına göre, lenslerin odak uzaklıkları da değişmektedir.

Objektif veya lens, makinenin objektif yuvasına takılır ve optik elemanların büyük kısmını barındırır. Lensler Kadraj'dan yansıyan ışığı sensör'e iletirler. Özelliklerine göre ve kalitelerine göre farklı objektifler vardır. Yapımında kullanılan teknoloji, malzemelerde kullanılan hammade ve işleme yöntemleri, optik düzen gibi konular kaliteyi etkilemektedir. Objektifler genelde fotoğraflanacak konunun niteliğine göre seçilirler.
Lens çeşitlerine geçmeden önce bazı terimlerin açıklamasını yapalım.

Odak uzaklığı: Kadrajdan objektife gelen ışığın toplandığı merkeze denir. Odak uzaklığı kadrajın netliğini etkiler.

Objektif açısı: Kadrajdan objektife gelen ışığın açısıdır. Bu aşağıdaki diyagramda daha iyi anlaşılabilir.

Net ve flu: Fotoğrafın net olan kısımlarına net, net olmayan kısımlarına ise bulanık ya da flu denir.

Odak uzaklıkları sabit olmayan lenslerdir, lensin kabiliyeti dahilinde kullanıcının eklenen optik elemanlar aracılığıyla farklı mesafelerdeki objeleri yakınlaştırabildiği lenslerdir. Optik elemanların sayısı arttıkça ışığın sensöre iletilme oranı azalır. 

Sabit odak uzaklığına sahip lenslerdir, odaklama, makine objeye yaklaştırılıp uzaklaştırılarak yapılır. Zoom lenslerden daha az optik elemana sahiptirler ve diyafram açıklıkları daha fazla olabilmektedir, bundan dolayı genelde ışık iletimi daha iyidir ve net alan derinliği daha az olabilmektedir. Manzara ve portre fotoğrafçılığında kullanılırlar.

Fotoğraf makinesi gövdesiyle birlikte alınan lenslerdir, Genelde zoom lenslerdir.

Uzak mesafedeki objelerin fotoğrafını çekmek için kullanılırlar. Odak uzaklığı büyük objektiflerdir. Bu objektiflere tele objektifler de denir. 

Genelde manzara fotoğrafları çekerken kullanılırlar, bu objektiflerde net alan derinligi fazladır.

Böcekler gibi çok küçük objelerin fotoğraflarını çekerken kullanılan lenslerdir, ışık iletimleri çok iyidir. Çeşitli odak uzaklıklarında olabilmektedirler.

Bu objektifler konuyu normalden daha geniş bir açıyla kadrajlar. Fotoğraftaki çizgiler bozulur ve ovalleşir.

Kadrajdan gelen ışığı, kullanıcı tarafından ayarlanan bir açıyla sensöre odaklar ve böylece kadrajın belirlenen bir hattının net diğer alanların ise flu çıkmasına neden olur.

Mercek
Diyafram
Filtre
Parasoley

Tüp
Konvertör
Telekonvertör

Filtreler, fotoğraf çekerken çeşitli ayarlamaları yapmaya yardım eden elemanlardır, objektiflerin ucuna takılırlar. Işığın ayarlanmasından makro fotoğraf çekimine kadar bir çok amaca hizmet eden çeşitli filtreler vardır.

UV filtre: UV ışınlarını engellemeye yardımcı olur, Gözle görünmeyen UV ışınlarının sensördeki istenmeyen etkilerini engeller. Lensin ön camını çizilmelere karşı koruma amaçlı da kullanılır.
Polarize filtre: Yansımaları engeller ve ışık yoğunluğunu azaltır. Lineer ve Sirküler olarak ikiye ayrılır, sirküler olanının dönen kısmı vardır ve yansımanın yönüne göre ayarlanabilir.
ND filtre: Doğal yoğunluk filtresi, ışık yoğunluğunu azaltarak daha uzun pozlamaya veya aşırı parlaklıkları engellemede kullanılır, Farklı yoğunluklarda ND filtreler vardır, dereceli ND filtreler de mevcuttur.
Close-Up filtre: Yakın mesafe filtreler, lensin objeye minimum yakınlıktan daha yakın olabilmesini sağlar ve makro fotoğraflar çekmeye yardımcı olur. Makro lensi olmayanlar makro fotoğraf çekmek için bu filtreye başvurabilirler ancak bir makro lens kalitesi beklenmez. Tek bileşenli veya çift bileşenli olabilirler.

Konvertör ya da dönüştürücü: Üreticilere göre makinelerin objektif bağlanan kısmında değişikikler olabilmektedir, birbiriyle uyumsuz bazı makine ve objektifler dönüştürücü bir aparatla birbirlerine bağlanabilmektedir. Ayrıca konvertör, makro fotoğraflar çekmek için objektifi makineye ters bağlamaya yarayan bir aparattır. Bu yöntemle bağlanmış lensten bir makro lens kalitesi beklenmez. Bu yöntemde ışık kaybı çok olmaktadır, ışık kaybını en aza indirmek için diyafram en açık konuma getirilir, bu yüzden net alan derinliği oldukça azalır. Makine ile lens kontrolü yapılamamaktadır, bu yüzden manuel diyafram ayarı olmayan lenslerde zorluk yaşanabilir. Otomatik netleme de yapılamamaktadır, bu yüzden kullanıcı objeye yakınlaşıp uzaklaşarak odaklama yapabilir. Net alan derinliği azaldığından obje küçük de olsa en önü ve en arkası aynı anda net çıkmayabilir, objenin tamamının net olması için birden fazla fotoğraf çekilip, bilgisayar programı yardımıyla birleştirilebilmektedir, birleştirme yapılırken çekilen fotoğrafların uygun olması çok önemlidir, bu çekimler makine değerleri aynı iken makinenin objeye uzaklığındaki milimetrik değişimlerle yapılır, çekimlerde makro ray kullanılarak bu tarz çekimler yapılabilir. Lensler makineye ters bağlanabildiği gibi birbirlerine de bağlanabilirler.

2-)Etki Yasası
Bu yasa Thorndike'ın en önemli katkısıdır ve Skinner'in edimsel koşullanma kuramının temelini oluşturur.
Etki yasası organizmanın U-T bağı ile ilgilidir. Organizma yaptığı davranış sonucu olumlu bir tepkiyle karşılaşırsa U-T bağı güçlenir ama olumsuz bir tepkiyle karşılaşırsa bu bağ zayıflar. Bu fikri 1930'a kadar savunmuş ama 1930'dan sonra fikrini değiştirmiştir.
1930'dan sonra "Organizma yaptığı davranış sonucu olumlu bir tepkiyle karşılaşırsa U-T bağı güçlenir." düşüncesinde herhangi bir değişiklik yapmamıştır, olumsuz tepki yani cezanın U-T bağını zayıflatmayacağını söylemiştir. 1930'dan önceki düşüncesinin aksine cezanın davranış üzerinde zayıflatıcı etkisi olmadığını söylemiştir.
Beden Öğretmeni Mehmet Bey, takla atabilen öğrencilerin basket oynamalarına izin vermekte, atamayanlara ise şınav cezası vermektedir.
2008 yılında çıkmış soruyu inceleyelim.
Okula yeni başlayan öğrencilerine çalışma alışkanlığı kazandırmak isteyen bir sınıf öğretmeni verdiği ödevleri yapan öğrencileri çikolatayla ödüllendirmekte, yapmanyanları ise teneffüste dışarı çıkmayarak cezalandırmaktadır.
Öğretmenin öğrencilerine ders çalışma alışkanlığı kazandırmak için izlediği yol Thorndike'ın hangi ilkesiyle uyuşmamaktadır.
A)Tekrar Yasası
B)Etki Yasası
C)Tepki analojisi
D)Hazırbulunuşluk
E)Öğrenmede küçük adımlar ilkesi
Thorndike 1930'dan sonra cezanın davranış üzerinde ödül kadar etkili olmadığını savunmuştur, cezadan kaçınılması gerektiğini söylemiştir. Bu nedenle Thorndike'ın etki yasası ilkesiyle uyuşmamaktadır. Cevap=B

3-)Tekrar Yasası
Thorndike 1930'dan önce tekrarın U-T bağını güçlendirdiğini, tekrar olmadığında iste bu bağın zayıfladığını söylemiştir. Ancak 1930'dan sonra görme engelliler üzerinde yaptığı deney sonucu bu fikrinden vazgeçmiş ve tekrarın tek başına yeterli olmadığını yani tekrarın çok az etkilediğini savunmuştur.

Thorndike'ın üç tane temel yasası vardır. 
1-)Hazırbulunuşluk
2-)Etki
3-)Tekrar
Thorndike iyi bir bilim adamının, yaptığı yanlışları kabul etmesine dikkat çekmiş ve 1930 yılından önceki görüşlerinden bazılarının yanlış olduğunu belirtmiştir.
1-)Hazırbulunuşluk
Bir organizma eğer davranışı göstermeye istekliyse bu davranışı seve seve, istekli ve azimli bir şekilde yapar, istekliyse ve hedefe ulaşamazsa kızgınlık duyar, istemiyorsa ve yapmaya zorlanırsa yine kızgınlık duyar.

Bir çocuk bilgisayarda oyun oynamaya çok istekli ise ve izin verilirse oyunu çok dikkatli bir şekilde oynar ve mutlu olur.
Eğer bilgisayarda oynamaya çok istekli ise ve izin verilmezse kızgınlık duyar.
Diyelim ki canı sıkkın bizde morali düzelsin diye zorla bilgisayara oturtmaya çalıştık yine kızgınlık duyar.
Örneklerde de görüldüğü gibi organizmanın istekli olması daha fazla çabalamasına ve mutlu olmasına yol açarken isteksiz olması kızgınlığa yol açmaktadır.
Başta Thorndike'ın 1930'dan sonra bazı görüşlerini değiştirdiğini belirtmiştik. Ancak Thorndike bu yasasında herhangi bir değişiklik yapmamıştır.
Thorndike kediler üzerinde de deneyler yapmış ve onları aç bırakmıştır. Aç kalan kediler kafesten çıkmak için çok daha fazla çaba göstermişlerdir.
Araba kullanmayı çok seven biri sınava girmeden önce çok istekli bir şekilde çalışır. Ehliyeti alırsa hedefine ulaşmış olur ve mutluluk duyar. Alamazsa hedefine ulaşamaz ve kızgınlık duyar.
Çocukluğundan beri pilot olmak isteyen Ahmet büyüyünce pilot okuluna başvurmuş ancak mulakatta başarılı olamamıştır. İstekli olduğu halde başaramamış ve kızgınlık duymaya başlamıştır.
KPSS 2009'da çıkmış soruyu inceleyelim.
Bir ilköğretim okuluna bu yıl atanan Stajyer Öğretmen Mehmet Bey, müdür tarafından 2A şubesinin sınıf öğretmeni olarak görevlendirilir. Mehmet Öğretmen, öğrencilerinin ileriki yıllarda girecekleri önemli sınavları düşünerek sadece öğretim programındaki konuların yeterli olmayacağına inanmaktadır. Bu nedenle öğrencilerinden her hafta en az 50 sayfalık bir hikaye kitabı okumalarını ve bu kitabın özetini çıkarmalarını istemektedir.
Öğretmenin bu davranışı, Thorndike'ın öğrenme ve eğitimle ilgili görüşlerinden hangisine uygun değildir? 
A) Tekrar Yasası
B) Etki Yasası
C) Tepki Yasası
D) Ait Olma Yasası
E) Hazırbulunuşluk

Mehmet Öğretmen 2. sınıftaki çocukların ileride girebilecekleri sınavı düşünerek sınavlara hazırlamak istemesi öğrencilerde isteksizlik yaratacaktır. Bu yaştaki çocukların hazırbulunuşluk düzeylerine uygun değildir. Cevap=E

Başarı, istenen amaca türlü yollarla veya tek bir yolla istendiği gibi varılmasıdır, amacın gerçekleştirilmesidir. Başarıya ulaşmak için, 70 kural vardır.

Amaç, varmak istediğimiz, gerçekleştirmek istediğimiz olgu veya sonuçtur. Başarı, amaca varma durumudur. Başarısızlık ise,  her türlü yol veya tek bir yol ile denense de amaca ulaşamamaktır. Başarı ile başarısızlık, birbirlerini tamamlamaktadır. Dolayısıyla, başarı sağlamak için denen yollarda başarısızlık meydana gelebilir. Bu başarısızlık, kişiyi yıldırabilir. Bu nedenle; özel başarısızlıktan, genel başarısızlığa dönüşür.
Başarı sadece yetenek ispatı veya alanın hakkında söz sahibi olma hatta biraz daha genelleştirirsek zengin olmak, mutlu olmak diye söylenir. Gerçekten başarı bu ise neden bunları yapan insanlar hala mutlu değiller? Hani başarı mutluluk getirirdi? Belki de biz yanılıyoruz, başarı toplumun sapkın istekleri ya da empoze ettiği şeyleri yaptığımızda elde edebileceğimiz bir şey değildir. Başarı yalnızca gerçekten istediğimiz bir şeyi -mantıklı veya mantıksız- yapabildiğimizde ve evet, kimse ilgilenmese de, kötülese de, aşağılasa da; "yaptım, ben yaptım ve başardım!" denilebilecek yegane haz ve tatmin hissidir.

*Başarıya İnanmalıyız: Başarmak istediğimiz hedefe, varmak için inanmak zorundayız. Eğer ki başarıya inanmazsak; onun için yaptığımız çaba azalır ve sonuçta "başarısızlık" denen olay meydana gelir. Özel başarısızlık halinde, inancımızın önemli ölçüde azalması veya tamamen sona ermesi üzerine genel başarısızlık hâli ortaya çıkmaktadır.
*Başarı için Kararlı Olmalıyız: Başarmak istediğimiz amaca, tek bir yolla varmak kolay ama nadirdir. Dolayısıyla, önümüze birçok yol çıkabilir. Bu yolları denemekten, herhangi birini seçmekte büyük ölçüde kararsızlık veya endişe duymamız halinde, uzun süre çalışma devam edemez. Dolayısıyla, başarısızlık meydana gelir.
Başarmak için önce inanç sonra çalışma ve azim gereklidir. Başarmak istediğimiz hedef için yolu iyi seçmemiz gerekir her yol mübahtır diyerek inandığımız değerlerden vazgeçmemek gerekir.
Başarmak sadece tek bir yolla veya birçok yolla amaca hatasız bir şekilde ulaşmak olsa da, bir o kadar da başarının arkasında birden fazla başarısızlık vardır. Başarı başarısızlıklardan doğar.

Beyin Metastazları

ABD'de yıllık tahmin edilen yeni vaka 170,000 - 200,000
MR'ın daha yaygın kullanımı ve sistemik tedavideki gelişmelere bağlı olarak insidans artmakta
Otopside kanser hastalarının ~% 10-30'unda beyin metastazı mevcut
Akciğer Ca %34, meme Ca %30, melanoma %72[1]
Metastatik beyin tümörleri primer beyin tümörlerine göre 10 kat daha sık
Single metastaz = ekstrakranial durumdan bağımsız olarak beyinde tek lezyon
Soliter metastaz = hastalığın tek bölgesi olarak SSS metastazı

Resmi evreleme sistemi yok. Bununla birlikte, RTOG RPA çalışmalarını esas alarak 3 evreli bir sistem önermiştir. No official staging system exists.
1997 RTOG (1979-1993) - PMID 9128946 — "Recursive partitioning analysis (RPA) of prognostic factors in three Radiation Therapy Oncology Group (RTOG) brain metastases trials." Gaspar L et al. Int J Radiat Oncol Biol Phys. 1997 Mar 1;37(4):745-51.
Daha önceki RTOG beyin metastazı çalışmalarının (RTOG 79-16, 85-28, 89-05) değerlendirmesi. Hastaların yaklaşık yarısında soliter metastaz

RPA doğrulama çalışması RTOG 91-04 - PMID 10863071
RPA 4 ve üzeri beyin metastazının sağkalımını öngörmez (Germany) - PMID 12540980

Met sayısı

RTOG 7916 PMID 8420868 -- CT characteristics of patients with brain metastases treated in RTOG study 79-16. (Swift PS, Int J Radiat Oncol Biol Phys. 1993 Jan 15;25(2):209-14.)
Prognostik faktörler için tedavi öncesi ve sonrası CT analizi
Daha uzun sağkalım: <=3 metaztazda (özellikle RPA klas I hastalarda)

Semptomatik metastazı olanlarda sağkalım süreleri:

tedavisiz – 1 ay;
steroidlerle – 2 ay.

Semptomatik hastaların hepsinde kortikosteroidler kullanılmalı
Stabil ise, 8 mg BID deksametazon (veya eşdeğeri) ile başlanabilir
Tüm beyin RT uygulanacaksa, steroidler en az 48 saat öncesinden alınmış olmalı
İki doz şeması
8 mg BID ile başlanıp, RT'nin 2. haftasında her 5 günde 2-4 mg azaltılacak şekilde doz düşürülmesi. Tümörle ilgili semptomlar veya steroid withdrawal gelişirse 4-8 gün eski dozdan devam edip yeniden doz azaltılması. Semptomlar devam etmezse full rejime başlanır (Posner JB, Neurologic Complications of Cancer, Philadelphia: FA Davis, 1995:37, 77, 311)
4 gün 8 mg BID başlanıp sonrasında 4 mg BID 4 gün, sonra tedavi bitene kadar 2 mg BID - PMID 1726656

Nöbetler için proflaksi önerilmemektedir.
Bir metaanalizde nöbet proflaksisinin etkin olmadığı gösterilmiş
Mayo - PMID 15595331, 2004 — "Seizure prophylaxis in patients with brain tumors: a meta-analysis." Mayo Clin Proc. 2004 Dec;79(12):1489-94.

Beklenen sağkalım < 30 gün ve KPS <=60 ise RT düşünülmemelidir
Beklenen ortalama sağkalım < 3 ay ise
prostat: hormon rezistan
meme: 3. hat KT'de başarısızlık
akciğer: 1. hat KT'de başarısızlık
kolon: assit ya da karaciğer yetmezliği
karaciğer metastazı ve aylık olarak karaciğer fonksiyon testlerinde 2 kat yükselme
SVC (superior vena cava) sendromu (VKSS)
hiperkalsemi
CD4 < 25 ve RNA > 100K HIV
EF (ejeksiyon fraksiyonu) < %20 olan klas IV konjestif kalp yetmezliği
kreatinin > 8
pO2 < 55 ve pCO2 > 50

Wisconsin, 2007 PMID 17401015 -- "Regression after whole-brain radiation therapy for brain metastases correlates with survival and improved neurocognitive function." (Li J, J Clin Oncol. 2007 Apr 1;25(10):1260-6.)
PIII çalışmasının alt grup analizi. 135 hasta nörokognitif fonksiyon açısından değerlendirilmiş. Tümörde > %45 küçülme iyi cevap, < %45 küçülme ise kötü cevap olarak yorumlanmış
Sonuç: Tümör küçülmesi sağkalım ve nörokognitif fonksiyonların korunması ile koreledir. Uzun dönem sağkalanlarda nörokognitif fonksiyon sabit ya da daha iyi. Tümör progresyonu nörokognitif fonksiyonu tüm beyin RT'den daha fazla etkiler.

10 fraksiyonda 30 Gy tüm beyin RT standart tedavidir. Bununla birlikte, > 6 ay sağkalım beklenenlerde >=3 Gy/fx ile nörokognitif sekel şiddetli olabilir
Özellikle ekstrakranial hastalığı kontrolde olan tek metastazlı hastalarda SRS veya cerrahi gibi lokal tedaviler ve tüm beyin RT lokal kontrol ve sağkalıma katkı sağlar
Tek başına SRS'in rolü henüz belli değildir
Multipl metastazı olan hastalarda optimal menajman henüz ortaya konmamıştır
Beyin metastazlarında başlangıç tedavisi için algoritm - PMID 17673619
KPS <70: tüm beyin RT
KPS >=70
ekstrakranial hastalık
1 met: tüm beyin RT +/- SRS
2+ metastaz: tüm beyin RT
Ekstrakranial hastalık kontrolde
1 met: Cerrahi +/- tüm beyin RT veya SRS +/- tüm beyin RT
2-3 metastaz: tüm beyin RT +/- cerrahi ya da tüm beyin RT +/- SRS
>3 metastaz: Tüm beyin RT

PMID 9614957, 1998 — "Patterns of relapse and late toxicity after rebaşlık and whole-brain radiotherapy for solitary brain metastases." Nieder C et al. Strahlenther Onkol. 1998 May;174(5):275-8.
Retrospektif. 66 hasta cerrahi ile tedavi edilmiş -> tüm beyin RT. Relaps 1 yıl sonra %27, 2 yıl sonra %55. Melanomda, meme dışı adeno Ca, ve skuamoz hücreli Ca'da yüksek lokal relaps oranı. Beyinde başka bir yerde failure oranı sistemik hastalık aktivitesi ile ilgili. Lokal başarısızlıkla boyut arasında korelasyon bulunmadı.

Usually with radiosurgery, but few pts may require reirradiation of the whole brain or partial brain. 8 Gy in 2 weeks to 30.6 Gy in 3 weeks. 

See: PMID 7448697, PMID 2841266, PMID 8621282, PMID 2305074
Reirradiation after PCI:

Genellikle radyocerrahi, fakat az sayıda hastada parsiyel ya da tüm beyine reirradiasyon gerekebilir. 2 haftada 8 Gy’ den 3 haftada 30.6 Gy’ e kadar.

Institut Gustave-Roussy (1985-93) - trials PCI85 and PCI88
PMID 12075744, 2002 — "Patterns of failure after prophylactic cranial irradiation in small-cell lung cancer: analysis of 505 randomized patients." (Arriagada R, Ann Oncol. 2002 May;13(5):748-54.)
Başarısızlık paternine bakan iki randomize çalışma (+/- PCI)
5-yıllık toplam sağkalım (PCI-) için %59 ve (PCI+) için %43. PCI dozu 24-30 Gy (<= 3Gy/fx); sıklıkla 24 Gy (3Gy x 8) kullanıldı.
Her protokolde, beyin metastazı gelişen hastalar PCI yapılmadıysa 28 fraksiyonda 50 Gy, PCI yapıldıysa 22 fraksyonda 39 Gy (yaklaşık 1.77 Gy/fx)

Methylphenidate (d-MPH)

Wake Forest; 2007 PMID 17869448 -- "A Phase III, Double-Blind, Placebo-Controlled Prospective Randomized Clinical Trial of d-threo-methylphenidate HCl in Brain Tumor Patients Receiving Radiation Therapy." (Butler JM Jr, Int J Radiat Oncol Biol Phys. 2007 Sep 13; [Epub ahead of print])
Randomize. Primer ya da metastatik beyin tümörlü 68 hasta. 1. kol) proflaktik d-MPH 5mg BID -> 15mg BID vs. 2. kol) gözlem. QOL ve kognitif fonksiyon esas alınmış
Bulgular: Halsizlik, QOL veya kognitif fonksiyonda fark yok
Sonuç: Beyin tümörlü hastalarda proflaktik d-MPH faydalı değildir
1989 MSKCC PMID 2725874 -- Radiation-induced dementia in patients cured of brain metastases. (DeAngelis LM, Neurology. 1989 Jun;39(6):789-96.)
Retrospektif. Tüm beyin RT'nin geç komplikasyonları mevcut 12 hasta
Tüm beyin RT: total doz 25-39 Gy, fakat 3-6 Gy/fx
Komplikasyonlar (medyan 14 ay, 5-36 ay): progresif demans, ataksi, üriner inkontinans; 7/12 hastada ölüm (tümör rekürrensi değil, yan etkilerden). CT : kortikal atrofi, radionekrotik lezyonlar
Sonuç: tüm beyin RT'nin indüklediği şiddetli demans insidansı %2-5. Fraksiyon fazla yüksek

Pek çok retrospektif seride tek beyin metastazlı hastalarda tüm beyin RT'ye cerrahi eklenmesinin faydası gösterilmiştir
3 randomize çalışma yapılmış; 2'sinde katkı saptanmış, 1'inde fark bulunmamış
Sonuçta, cerrahi + tüm beyin RT'de lokal kontrol daha iyi, rekürrens daha az, muhtemelen sadece tüm beyin RT'ye göre daha iyi sağkalım
Aktif ekstrakranial hastalığı ya da performansı kötü olan hastalarda cerrahi sağkalıma katkı sağlamamıştır

Canada Multi-Institutional (1989-1993) -- WBRT 30/10 vs. Cerrahi + WBRT 30/10
o	Randomize. 84 hasta. Tek beyin metastazı, KPS > 50, lenfoma/KHAK hariç.  Deksametazon kurum tercihine bırakılmış 1. kol) tüm beyin RT 30/10 vs. 2. kol) Cerrahi + tüm beyin RT 30/10. CT’ den sonra 3 hafta içinde tedavi
1996 PMID 8839553 — "A randomized trial to assess the efficacy of surgery in addition to radiotherapy in patients with a single cerebral metastasis." (Mintz AH, Cancer. 1996 Oct 1;78(7):1470-6.)
Bulgular: Medyan OS tüm beyin RT'de 6 ay vs. cerrahi + tüm beyin RT'de 6 ay. QoL (hayat kalitesi)'nde fark yok
Sonuç: Tüm beyin RT'ye cerrahi eklemenin faydası yok
Yorum: Kentucky ve Hollanda çalışmalarına göre baseline KPS daha kötü
University Hospital Leiden (Netherlands)(1985-90) -- WBRT 40/20 BID vs. Cerrahi + WBRT 40/20 BID
o	Randomize. 63/66 hasta. Tek beyin metastazı. 1. kol) Hastalar rezeksiyon + tüm beyin RT vs sadece tüm beyin RT kollarına randomize edilmiş. Eksternal RT tüm beyne 2 haftada 2 Gy BID 40 Gy olarak uygulanmış. MR yok.
1993 PMID 8498838 — "Treatment of single brain metastasis: radiotherapy alone or combined with neurosurgery?" (Vecht CJ, Ann Neurol. 1993 Jun;33(6):583-90.)
Bulgular: Stabil ekstrakranial hastalık: medyan OS 7 ay vs. 12 ay. Progresif ekstrakranial hastalık: medyan OS iki grupta da 5 ay
Fonksiyonel bağımsızlık: Stabil ekstrakranial hastalık: 4 ay vs. 9 ay. Progresif ekstrakranial hastalık: her iki grupta da 2.5 ay. Cerrahi + RT'de daha uzun ve daha hızlı
1994 PMID 8040016 — "The choice of treatment of single brain metastasis should be based on extracranial tumor activity and age."  (Noordijk EM, Int J Radiat Oncol Biol Phys. 1994 Jul 1;29(4):711-7.)
Bulgular: medyan OS tüm beyin RT'de 6 ay vs. cerrahi + tüm beyin RT'de  10 ay. Stabil ekstrakranial hastalık (7 ay vs 12 ay), aktif ekstrakranial hastalık (iki grupta da 5 ay). Yaş bağımsız prediktör (60). Ölümlerin çoğunluğu sistemik progresyona bağlı
Sonuç: cerrahi + RT, tek başına RT'ye tercih edilmelidir. Bununla birlikte, aktif ekstrakranial hastalığı olanlarda RT yeterlidir
University of Kentucky / Patchell#1 (1985-1988) -- WBRT 36/12 vs. Surgery + WBRT 36/12
Randomize. 48 hasta. Şüpheli tek beyin metastazı. 4 saatte bir 4 mg deksametazon. 1. kol) biyopsi sonrası tüm beyin RT  2. kol) cerrahi + tüm beyin RT. Cerrahi randomizasyon sonrası 72 saat içinde. Tüm beyin RT cerrahi sonrası 14 gün içinde; randomizasyon ya da biyopsi sonrası 48 saat içinde; doz 36/12
1990 PM

Vikipedi Bilgisayar donanımı sayfası
Ortalama bir kişisel bilgisayarda genel olarak aşağıdaki donanımlar bulunur.

Anakart
Merkezi İşlem Birimi
Bios
Yonga seti
Bellek kartı
Veriyolları
PCI
AGP
USB

Bazı anakartlarda baskılı devre üzerine bağlı olarak bulunabilirler.

Giriş-çıkış denetleyicisi
Ağ denetleyicisi
Modem denetleyicisi
Ses denetleyicisi
Görüntü denetleyicisi

Anakart üzerinde iç denetleyicilerin bulunmaması ya da amaç için yeterli olmaması durumlarında, anakart üzerindeki veriyollarına takılarak kullanılırlar. 

Giriş-çıkış kartı
Grafik kartı
Ses kartı
Modem kartı
Ağ kartı
TV kartı
Video montaj kartı
Güç Kaynağı

Sabit disk(HDD)
Disket sürücü(3,44M)
Optik Sürücü
ZipDisk
Manyetik type
USB Bellek

Klavye
Mouse
Joystik
Sayısallaşırıcı
Duyarlı ekran
Tarayıcı
Kamera
Mikrofon
Parmak izi okuyucu

Monitör/Projektör
Hoparlör/Kulaklık
Yazıcı/Çizici

Kasanın en önemli özelliği bilgisayar parçalarını koruyacak bir kutu olmaktan daha çok parçalara elektrik sağlamasıdır. Güç kaynağı watt cinsinden yazılır. Normal bilgisayarlar için 200–250 watt yeterlidir. Fakat çift çekirdekli işlemci, cd yazıcı, DVD yazıcı, iki tane sabit disk, ekran kartı, televizyon kartı gibi birçok parça kullanacaksanız daha çok elektrik sağlayabilen güç kaynaklarına ihtiyaç duyarsınız. Böyle bir durumda ise gerçek 300 watt veya 350 watt'lık bir güç kaynağı ihtiyacınızı karşılar. Normal bilgisayarlar için gerçek 350 watt olduğu sürece 350 watt üzeri güç kaynaklarına gerek yoktur. Burada en önemli faktör güç kaynağının watt değerinin GERÇEK olmasıdır. “Gerçek 300 watt” “Gerçek 350 watt” olarak belirtilir. Bazı kasalarda bulunan basit güç kaynaklarından daha ağırdırlar. Güç kaynağı işlemciden bile önemli bir parçadır. Her elektrik dalgalanmasından etkilenecek, yeterli elektriği sağlayamayacak bir güç kaynağı bilgisayarın içindeki tüm parçaların yanmasına yol açabilir. Soğutucu fan güç kaynağı birimlerinin yanında, kasa içerisindeki tüm birimlerin soğutulmasına yardımcı olur. Isınan havayı dışarı atarak soğuk hava girişine yardımcı olur. Kasaların genelde üst bölümüne yerleştirilmesinin sebebi ısınan havayı dışarıya atabilmesini sağlamaktır. Soğutucu metaller güç kaynağı içerisindeki birimlerin ısınmasını engeller. İçindeki sigorta ise bilgisayarı korumak içindir. Yüksek voltaj geldiğinde bu sigorta yanarak diğer parçaların zarar görmesini engeller. Sigortalar gerektiğinde değiştirilebilir.
(Levent Emmungil'in Bilgisayar Donanımı e-kitabından alınmıştır.)

SES KARTLARI
Ses kartı, bilgisayarda analog ve dijital ses işlevlerini yerine getiren elektronik birimidir. Dâhilî olarak PCI- veya PCI-Express kart yuvalarına  takılan kart türleri olduğu gibi, haricî olarak USB bağlantı noktasına bağlanan, pcmcia yuvalarına takılan ve profesyonel alanlarda kullanılmak üzere Güvenlik duvarı girişine de bağlanabilen versiyonları mevcuttur. Eski ses kartları ISA yuvalarına takılabilirler. Ayrıca anakart üzerinde bütünleşik sunulan ses yongaları da mevcuttur.
Ses kartlarını kalite olarak birbirinden ayıran temel özellikler bit çözünürlüğü (örneğin 16 bit veya 24 bit), maksimum örnekleme kalitesi (örneğin 22, 44, 96 veya 192 kHz), gürültü filtresi, sıklık aralığı ve maksimum kanal sayısıdır.
İlaveten pek çok ses kartının desteklediği EAX, DTS-ES, ya da ASIO gibi çıkış kodlamaları da ses kartının kalitesini belirleyen bir faktördür. Normal ses kartları bütünleşiklerden farklı olarak hızlandırıcı yongalara sahiptir, bu sayede işlemcinin performansını düşürmezler. Bazı ucuz ses kartları bu hızlandırıcı yongalara sahip değildir.

VEREBİLECEĞİ SORUNLAR VE ÇÖZÜM YOLLARI

Sabit diske yeni format attıysan, önce anakartın sürücülerini sonra ses kartının sürücülerini yüklemen gerek.
Ses aygıtında bir sorun olduğundan Windows Media Player dosyayı yürütemiyor. Bilgisayarınızda bir ses aygıtı yüklü olmayabilir, başka bir program tarafından kullanılıyor veya doğru çalışmıyor olabilir.

Normal televizyonlara göre bazı açılardan avantajlı olması bilgisayarda kullanılan televizyon kartlarına olan ilgiyi arttırmıştır. Kayıt yapma, bazı durumlarda şifre çözme gibi özellikleri televizyon kartlarının yaygınlaşmasına neden olmuştur.
Yayın uyumluluğu: Yayınlar analog ve dijital olarak iki çeşittir. Dijital yayınlar daha kalitelidir. Önemli olan bu yayınların nasıl alındığıdır. İki tür yayın da karasal anten, karasal kablo ve uydu antenleriyle alınabilir. DVB (Dijital Video Broadcast) cihaz özelliklerinde karşılaşabileceğiniz bir terimdir. Televizyon kartlarında görebileceğiniz DVB-S Dijital uydu, DVB-T Dijital karasal, DVB-C Dijital kablolu yayınları alabildiğini göstermektedir. Kartı hangi amaçla kullanacaksanız ona uygun bir kart almanız gerekmektedir. Dijital karasal yayınlar hala deneme aşamasında olup yakın zamanda devreye girecektir. Devlet uydu yayınlarını denetlemekte zorlandığı için karasal yayınların kalitesini arttıracak olan dijital karasal yayınları desteklemektedir. Dijital uydu kartı alacaksanız düşük gürültü oranlı bir LNB ile kullanmanız yayınları daha rahat izleyebilmenizi sağlayacaktır. Kullandığınız işletim sisteminin de yayın kalitesine etkisi olduğunu unutmamalısınız.
Bağlantı arayüzü: Televizyon kartlarında bağlantı seçeneklerine baktığınızda PCI, PCMCI, USB, VGA gibi seçenekler karşınıza çıkacaktır. VGA arayüzü hariç diğerleri bilgisayara bağlı olarak çalışır. VGA televizyon kartlarını bilgisayarınızı çalıştırmaya ihtiyaç duymadan monitörden televizyon izlemek için kullanabilirsiniz. PCI boş genişleme yuvası bulunan kasalara takılarak kullanılır. Böyle bir kart almadan önce bilgisayarınızda boş genişleme yuvası olup olmadığını kontrol etmeniz gerekmektedir. PCI yuvası dizüstü bilgisayarlarda bulunmamaktadır. Bunun yerine PCMCI ara yüzlü kartlar dizüstü bilgisayarların genişleme yuvalarına takılarak kullanılmaktadır. Artık tüm bilgisayarlarda USB girişi bulunmaktadır. Bu nedenle USB kartları masaüstü ve dizüstü bilgisayarlarınızda kullanabilirsiniz. USB kartları tüm bilgisayarlara uyumlu oldukları için fiyatları diğerlerine göre biraz daha yüksektir.
Uzaktan Kumanda: Bilgisayara takılan televizyon kartları uzaktan kumanda ile kontrol edilebilmektedir. Her ne kadar bilgisayar başındayken klavye ve fare kullanarak işlem yapılabileceği düşünülse de, kartın kumandasının olması özellikle büyük ekranlı bilgisayarlarda kullanım açısından kolaylık sağlamaktadırlar. Bilgisayarınızın ekranı özellikle 19" ve üzeri büyüklükteyse uzaktan kumandası olan kartları tercih etmeniz daha uygun olacaktır.
Radyo alıcısı: Çoğu televizyon kartında radyo alıcısı bulunmaktadır. Uydu kartları dijital radyo kanallarını televizyon kanallarından ayrı olarak göstermekte ve dinletebilmektedir. Çoğu kartta radyo kartı standart hale gelmişti. Dijital kartlar ile normal radyo yayınlarını dinleyemeyeceğinizi unutmamanız gerekmektedir. Bu bölümde bilgisayarda kullanılan televizyon kartları tanıtılmıştır. Uydu kartlarının işlevini televizyona bağlayacağınız uydu alıcıları da yapabilmektedir. Bu cihazlarda da analog ve dijital ayrımı bulunmaktadır. Eski teknoloji olduğu için analog kartlar yerine dijital veya hybrid olarak geçen iki tür yayını da alan kartları tercih etmeniz yerinde olacaktır. Ayrıca çanak anten kullanma engeliniz yoksa dijital uydu (DVB-S) kartı kullanmanızdır. Dijital yayın daha kaliteli olmakla birlikte, karasal dijital yayına 2016 yılında tamamen geçilmesi planlanmaktadır. Bu da bir süre daha uydu yayınlarının daha zengin olmaya devam edeceğini göstermektedir.
(Levent Emmungil'in Bilgisayar Donanımı e-kitabından alınmıştır)

Çalışma mantığını kavramak için, bilgisayarın bir işi nasıl yaptığını ve bilgisayarın parçalarını incelemek gerekir.
Bilgisayar bir işi 3 aşamada gerçekleştirir.

Bilgi girişi
Bilginin işlenmesi ve sonucun üretilmesi
Sonucun gösterilmesi
Bilgisayarı oluşturan parçaları da yaptıkları işe göre 5 gruba ayırabiliriz.

GİRDİ ÜNİTELERİ: Bilgilerin bilgisayara aktarılmasını sağlar. Örneğin: Klavye, fare, tarayıcı, kamera ya da mikrofon.
MERKEZİ İŞLEM BİRİMİ: Veriyi işlemeyi sağlar. Bilgisayardaki sadece 1 tane merkezi işlem birimi vardır, o da işlemcidir.
ÇIKTI ÜNİTELERİ: İşlemcinin çıkan sonuçları dışarı aktarabilmesini sağlar. Örneğin: Monitör, yazıcı, sürücüler ya da hoparlör.
HAFIZA BİRİMİ: Bilgisayar tarafından işlenecek bilgileri, programları depolamayı sağlar. Örneğin: Ram bellek, sabit disk, CD ya da DVD.
VERİYOLU: Bilgisayarın bir bileşeninden diğerine veri aktarmak için kullanılan devrelerdir. Örneğin: Klavyeden basılan bir tuşun bilgisi işlemciye veriyolu vasıtasıyla iletilir.
Tüm modern bilgisayarlar temelde aynı yapısal özellikleri taşımaktadır. Bu yapı “von Neumann Mimarisi” olarak adlandırılmaktadır.

0 ve 1 komutlardan meydana gelir

Orhan Bey Dönemi
Osmanlı Devleti'nde bilim ilk olarak Orhan Bey zamanında 1330 yıllarında kurulan İznik Medresesi ile başlar. Bu medrese Selçuklu zamanındaki medreselerin ve bu bağlamdaki eğitim kurumlarının devamı niteliğindedir. Bu medresenin ilk baş müderrisi olan Davüt-ül Kayseri, eğitsel anlamda önemli çalışmaları olan bir şahsiyettir. Osmanlı tarihinin ikinci medresesi ise Basra'da kurulmuştur. Bu medreselerde fıkıh, kelam, tefsir, usul vb. dini alanlarda eğitim verilmekle beraber matematik ve mantık alanında da elle tutulur bir eğitim verilmekteydi. Bu döneme damgasını vurmuş en önemli şahsiyet hiç şüphesiz Molla Fenari'dir. Mısır'da tahsilini tamamlayıp, mantık ve pozitif bilimlerde ihtisas yapmıştır. Yine bu dönemde pozitif bilimlerde ihtisas yapmış önemli bir sima da Kadı Zade Rumi adı ile ün kazanmış bir Türk matematikçisi ve astronomu olan Musa Paşa'dır. Bilim adına yaptığı çalışmalarda çok istekli ve hevesli bir bilim insanıdır. Bu bilim insanına yardımcı olmuş biri dikkatimizi çeker. O da Kadı Zade'nin kız kardeşidir. Kız kardeşi, Kadı Zade'nin kitapları arasına mücevherlerini gizlice koyarak bu bilim insanının Horasan'a göçü ve oradaki tahsiline yardımcı olmuştur. Böylece dolaylı yoldan Kadı Zade'nin çalışmalarına katkıda bulunmuş ve tarihteki yerini almıştır. Kadı Zade'nin birçok eseri vardır. Kitab-ül usül'ünde geometri öncülleri ve üçgen niteliklerinden bahseder. Arapça yazdığı başka bir eserinde cebir, denklemler ve ölçmelerden bahseder. Son Türk tarihçilerinin ortak kanaati ile Osmanlı'nın birinci gerçek astronomu ve matematikçisi Kadı Zade'dir.
I. Murat ve Yıldırım Bayezit Dönemi
Bu dönemde ise tıp alanında bir hareketlenme görülmüştür. Yazılan ilk tıp eseri Murat Bin İshak tarafından bu dönemde yazılmıştır. Eserde bir takım ilaçların etkileri kısaca açıklanmış ve çok rastlanan hastalıkların tedavisinden bahsetmiştir. Yine bu dönemde Şair Ahmedi adında bir bilim insanı yetişmiştir. Bu zat tıp dışında astronomi, matematik ve eczacılık dallarında bilgi sahibidir.
I. Mehmet Dönemi
Bu dönemde de ansiklopedik eserlere rağbet başlamıştır. Mesela Zekeriya el-Kazvini'nin tanınmış eseri olan Acayib'ul Mahlûkat damgasını vurmuştur. Bu kitapta ilk defa arzın yuvarlak olduğu Osmanlı Türk eserlerine geçmiştir. 
Osmanlı eserlerinin kuruluş dönemindeki eserlerin çoğunluğunun Arapça olması bu dönemin önemli dezavantajları arasındadır. Çünkü halk Arapça metinlerden bir şey anlamadığı gibi bilimsel gelişmelerden de habersiz kalmıştır.
Fatih Sultan Mehmet Dönemi
15. yüzyıl denildiğinde akla gelen en önemli şahsiyet Fatih Sultan Mehmet oluyor. Fatih dönemi; Osmanlı'da, hem kültürel, hem bilimsel, hem de sahip olunan toprak bakımından en iyi seviyede bulunulan dönemdir. Osmanlı'da, Fatih okumayı ve yazmayı çok fazla sevmemesine rağmen tüm Osmanlı padişahları göz önüne alındığında en büyük ilim ve bilim koruyucusu olarak karşımıza çıkmaktadır.
Bilindiği gibi Osmanlı Devleti fethettiği yerlerin sadece maddi kısmıyla ilgilenmiyor, ayrıca kültür ve bilim yönünü de alma faaliyetlerine girişiyor. İşte bu faaliyetler 15. yüzyıl Fatih döneminde daha da fazlalaşarak bilim koruyuculuğu ve ilerlemeci yaklaşım apaçık gözler önüne seriliyor.
Osmanlı devletinde bilim alanında ilk olarak göze çarpan insan ilk önemli matematikçi ve astronom olan Musa Paşa'dır. Bursa'da doğduğu bilinen Musa Paşa Osmanlı tarihinde Kadı zade Rumi olarak geçmektedir.
Kadı zade, kaşi ve Ali Kuşçu gibi bilginler, Fatih döneminde bir şeyler yapmaya çalışmışlardır. Bu süreçte bilim adına yaşanan iki olay günümüz bilim insanlarına adeta ışık tutacak niteliktedir. İlk olay:
15. yüzyılda Fatih'in bilime verdiği önemi anlatan en önemli olay; Maveraünnehir'de yetişen alimlerin sonuncusu olan Ali Kuşçu'yu Akkoyunlu Devleti'nden Osmanlı'ya transfer etmesidir. Ali Kuşçu'nun Osmanlı'ya gelişiyle astronomi alanında büyük gelişmeler meydana gelmiştir. Ali Kuşçu'nun İstanbul'da yazdığı astronomi üzerine en önemli eseri; Astronomi Risalesi'dir. Ayrıca Ali Kuşçu bu esere Fatih Risalesi adını vererek Fatih'e ithaf etmiştir. Bununla birlikte yazar eserinin sonuna gök cisimlerinin dünyadan uzaklıkları ile ilgili bir bölüm eklemiştir. Ali Kuşçu'nun bu eserini Fatih'e sunmasının diğer bir nedeni ise eserinin tam da Otlukbeli savaşının kazanıldığı ana denk gelmesidir.
15. yüzyılın sonu ve 16. yüzyılın başına doğru Fatih Sultan Mehmet öldükten sonra devletin başına oğlu II. Bayezid geçmiştir. Bu dönemde özellikle Fatih döneminde olduğu gibi astronomi ve matematiğe değil, onun yerine tıp alanına önem verildiği görülmektedir.
Bu dönemde en önemli bilim insanı olarak tıp alanında eserleri bulunan Ahi Çelebi karşımıza çıkmaktadır. Ahi Çelebi böbrek ve mesane taşları üzerine bir eser yazmış ve taşın nerelerde olduğunu, belirtilerini, taşın idrar yolunu zedelediği ya da tıkadığı zaman yapılacak tedavi yöntemlerini anlatmıştır.  
Bu Osmanlı âlimi uzun ömrüyle de dikkat çekmiştir. II. Bayezid ile beraber 3 Osmanlı padişahına daha hizmet etmiştir. 
15. yüzyılın başı ve ortalarında Osmanlı hizmetinde görev yapmış, hem Türk hem de dünya çapında önemli matematik araştırmaları yapmış olan Uluğ Bey'e ayrı bir parantez açacağız. Çünkü hayatı ve çalışmaları göz önüne alındığında, bilimin şu anki aşamaya gelmesinde önemli etkileri görülmektedir.
Uluğ Bey
1344 yılında Semerkant'ta doğmuş ve 1449 yılında ölmüştür. Aslında o bir devletin hükümdarıdır ama ordusunu kurduktan sonra kendini tam olarak bilime adamıştır. En önemli çalışmaları ise şöyledir: Kübik denklemlerin doğru yaklaşık çözümleri için yöntemler, iki terimli teorem ile çalışma; Uluğ Bey'in sekiz ondalık kesre kadar doğru olan kesin sinüs ve kosinüs tabloları; küresel trigonometri formülleri ve özellikle önemli olan Batlamyus'unkinden beri ilk kapsamlı yıldız cetveli olan, Uluğ Bey'in Yıldızlar Cetveli…
Yaptığı çalışmalar sırasında sin 1 değerini bularak bunu gözlemevindeki çalışmalarına uyguladı ve gök cisimleriyle ilgili yaptığı çalışma ile Batlamyus'un gezegen sistemindeki bir dizi hatayı da ortaya çıkarmış oldu.
XVI. yy'da Avrupa ile sıkı temaslarımız olmasına rağmen matbaacılık ve büyük duvar saatleri Osmanlı Türkiyesine girmemiştir ve 200 yıl sonra bu topraklara girebilmiştir.
Şiir ve edebiyat bu devri tamamıyla doldurmuştur. Padişahlar ve şehzadeler şiir ve edebiyatla uğraşanları sürekli desteklemiş, bu tür eserler çoğu zaman daha çok ilgi görmüş ve bu yüzden dönemin batı buluşları dönemin Osmanlı Türkiyesinde yankı bulmamıştır. 
Kanuni Sultan Süleyman zamanında dünyanın mimarlık şaheseri olan Süleymaniye Medreseleri yapılmıştır. Bu medreselerin bir bölümü matematiğe, bir bölümü tıbba ayrılmıştır. Fakat dönemin asıl hâkimi bilim faaliyetleri adına deniz coğrafyacılığı olmuştur.

Osmanlı'nın duraklama döneminde üstesinden gelinemeyen problemlerle uğraşılmıştır. Batı'nın üstünlüğünü kabul etmek zorunda kalan Osmanlı Devleti bilimsel eserleri dışarıdan çevirilerle faydalanma yoluna gitmiş, böylece kendisine özgü ürünler ortaya koyamamıştır.
Bu dönemi düşündüğümüzde matbaanın daha yeni gelmiş olması o dönem için ne kadar geri kalındığının göstergesidir. Hattat sanatına zarar geleceğinin düşünülmesi, ayrıca bazı siyasi sebeplerden dolayı matbaa geç gelmekle kalmamış üstelik bir de kabullenilmesi aşaması ile uğraşılmıştır.

18. YIL SONU: TIP VE MATEMATİK
Osmanlı devletinde ilk askerî ıslahat, daha doğrusu yüzyılın gereklerine fen bilgisi subay kullanmak veya yetiştirme isteği, 18.yy'ın başlarında kendini göstermiştir. Türk kaynaklarına göre 1743 yılında Üsküdar'da “Hendesehane” adıyla bir matematik okulu açılmış olduğunu biliyoruz. Bu matematik okulunun ömrü pek kısa olmuş ve kumbaracıların yeni talimlerinden isyan çıkaracakları korkusu ile bu heyet dağıtılmıştır. Hendesehane'nin ilk hocası olan Yenişehir müftüsü-zade Mehmet Sait Efendi olduğu kaynaklardan anlaşılmaktadır. Bu zatın iki şeyin arasındaki uzaklığın, ölçü kullanılmadan, yani yanlarına gidilmeden, ölçülmesi için bir alet icat etmiştir. Bu alete ise rub-i müceyyib-i zül-kavseyn adını vermiştir. Bu aletle, üçgenin bir kenarı ve iki açısı bilinirse öteki kenarları ve açıları hesaplamak mümkün olduğunu söyler. Bu aleti şeyhülislam I. Mahmut'a sunuyor.
Osmanlı Türkiyesine modern matematiğin askerlik yolu ile girmeye başladığına kimsenin şüphesi yoktur. Modern matematik ve fizik yavaş yavaş, fakat sırf askerlik sanatının çağa uyması için, memlekete girmeye başlamıştır. Siirt'te Tellu köyünde oturan Erzurumlu İbrahim Hakkı Marifetname adında bir eser yayımlamıştır. Yazar bu eserinde, aritmetik ve geometriye dair basit fakat açık bilgiler veriyor. Ayrıca bu eserde dört elemanın açıklamasını yapar. Suyu açıklar, evvelce dünyanın suyla örtülü olduğunu, bazı taşlar kırılınca içinden deniz hayvanları parçaları (fosil) çıktığından bahseder. Toprak elementine geçerek, kıtalardan söz eder, kozmografya ya dair bilgiler verir. Marifetnamede, dünyanın hareketi aleyhine söylenen düşünceleri birer birer reddederken, mesela dünyanın hareketini hissedemeyeceğimizi, çünkü dünyanın etrafındaki maddey-i leyine (yumuşak madde) içinde, hepimizi birlikte sürüklediğini söyler. Bundan sonra da mevalid–i selase dediği maden, bitki ve hayvanların birleşme ve meydana gelme suretinden bahseder. İbrahim Hakkı, anatomi faslını, İbin-i Sina’nın Kanun'undan, biraz kısaltarak hemen olduğu gibi, Türkçeye çevirmiştir. Dinine ve tarikatına pek sadık olan bu zatın, herhalde müspet ilimler karşısında, mütecessis ve huzursuz bir ruhu olduğu meydandadır.
19. YÜZYIL VE YENİLEŞME HAREKETLERİ
Gerçekten, Avrupa ilim ve sanatı, özellikle o vakit Avrupa'yı sarsan Fransız büyük ihtilaliyle çok yakından ilgilenen III. Selim önce çağdaş ilme ve tekniğe uygun olarak yetiştirilen Avrupa ordularına karşı koyabilecek bir ordu kurmak için, Tophane'yi ıslahı düşünmüş, Fransa ve İsveç'ten mühendisler getirterek fabrikalar tesis etmiştir. Fakat daima yabancı mühendislerin ilim ve tekniğine muhtaç olmanın doğru olmadığını düşünen devlet, bilgi ve teknik alanında başarılı subaylar, askerî mühendisler yetiştirmek için, o zamana g

notasyon: gösterim, yazım şekli

Anahtar: Sıralama algoritmasında elemanın sıralanması için kullanılan üyesi (numaraya göre sıralama ada göre alfabetik sıralama, vs. Ad burada anahtar oluyor.)
Array: Dizi (bir tür veri yapısı)
Binary search: Bir tür arama algoritması
Buble sort: Bir sıralama algoritması
Constructor
Count: dizide kaç indisin dolu olduğunu tutar.
Front: kuyruk yapısında en baş elemanın indisini tutar.
Heap sort: Bir sıralama algoritması
Insert: kuyruk yapısında eleman ekleme fonksiyonu
Insertion sort: Bir sıralama algoritması
IsEmpty: stack yapısında boş mu sorgusunu yapan fonksiyon

Linear search: bir tür arama algoritması
Merge sort: Bir sıralama algoritması
Peek: kuyruk yapısında front'u stack yapısında temp'i okur
Pivot: quick sort sıralama algoritmasında seçilir kendinden küçükleri sola, büyükleri sağa taşınır.
Queue: kuyruk (ilk giren ilk çıkar)(bir tür veri yapısı)
Quick sort: Bir sıralama algoritması
Rear: kuyruk yapısında en son elemanın indisini tutar.
Remove: kuyruk yapısında eleman çıkarma fonksiyonu
Selection sort: Bir sıralama algoritması
Shell sort: Bir sıralama algoritması
Simple: kuyruğun en ilkel hali
Size: dizide toplam indis sayısını tutar
Stack: yığın (son giren ilk çıkar)(bir tür veri yapısı)
Swap: yer değiştirme
Tree: bir tür veri yapısı
Veri yapıları: Array, Stack, Queue, tree

Change implementation: değişikliğin uygulaması
Change requests: değişiklik gereksinimleri
Cost of change: değişiklik maliyeti
Fault repair: arıza onarımı
Impact analysis: etki analizi
Maintenance: yazılım bakımı
Platform adaptation: platform adaptasyonu
Proposed changes: önerilen değişiklikler
Refactoring: yeniden düzenleme
Release planning: sürüm planlanması
Requirements analysis: gereksinim analizi
Requirements updating: gereksinim güncellemesi
Software development: yazılım geliştirilmesi
System enhancement: sistem geliştirme
System release: sistem sürümü

Coherence: (Tutarlılık) Bir okuma ile hangi değerlerin döndürülebileceğini tanımlar.
Consistency: (Uyum) Bir okuma ile yazılı bir değerin ne zaman döndürüleceğini tanımlar.

Şu durumu düşleyin: Genç bir adam, adı Knut olsun, masasında oturmakta, psikoloji ödevini tamamlamak için gereksinim duyduğu birtakım makaleyi okumaktadır. Sağ elinde bir fincan kahve tutuyorken sol eliyle de makaleden göz odağını yitirmeksizin şeker kabına ulaşır. Birdenbire odasının tavanına gözlerini diker ve kendine şunu sorar:
"Neler oluyor burada?"
Olasılıkla herkes yukarıda anlatılana benzer deneyimler yaşamıştır. Her ne kadar ilk bakışta bu gündelik durumlarda yaşananlar heyecan verici görülmese de burada yaşananların pek çoğu özellikle Bilişsel (Kognitif) Psikoloji alanındaki öğrenciler ve araştırmacılar için ileri biçimde ilgi çekicidir. Farkında olmadığımız bu durumların yaşandığı inanılmaz biçimde büyüleyici pek çok süreci ilgilendiren çalışmalara katılmışlardır. Kabaca konuşacak olursak Knut'ın durumu bilişsel psikologlara şöyle görünürdü:
Knut'ın bir sorunu var, ödevini yapması gerekmektedir. Bu sorunu çözmek için bir sürü biliş işlevini yerine getirmelidir. Gözlerine ulaşan ışık, görsel korteksine çeşitli duraklardan geçen elektrik sinyallerine dönüştürülür. Bu sırada karmaşık sinir ağları; Knut'ın çevresindeki nesnelerin hareketlerini, boşluktaki konumlarını, biçimlerini, renklerini, kontrastlarını hesaplar ve bilgi akışını süzer. Ekrandaki lekeler ve çizgiler sözcüklere dönüşür, sözcükler anlam kazanır, anlamlar bağlama katılır, Knut'ın sorunuyla ilgisine göre irdelenir ve son olarak belki de Knut'ın belleğinde bunların bir bölümü depolanmış olur. Aynı zamanda şeker iştahı, organizmanın gereksinimlerinin kontrolünden sorumlu beyin bölgesi olan Knut'ın hipotalamusundan kabarmaya başlar. Sonunda bu iştah, Knut'ın şekerlerine ulaşmasıyla sonuçlanır.
Haydi, şimdi de bilişsel psikologların kendimizi beyin, davranış ve kuram temelinde yorumlama yöntemlerini ve bunların terminolojisini nasıl geliştirdiklerini görmek için geçmişe bir bakış atalım.

İlk görüşler, bilginin beyinde depolandığını ileri sürmekteydi.

17. yüzyılın Rönesans filozofları nativistlerle genel olarak aynı fikirdeydiler ve beynin ayrıntılı yapısını ve işlevlerini açığa çıkarmayı bile denemişlerdi. Bunun dışında deneyci düşünürlerin çok önemli fikirleri vardı. David Hume'e göre, bilginin içsel temsilleri belli kurallara uyarak biçimlenir. Bu yaratımlar ve dönüşümler emek ve zaman almaktadır. Doğrusunu söylemek gerekirse bu, bilişsel psikolojide güncel araştırmaların çoğunun temelidir. 19. yüzyılda Wilhelm Wundt ve Franciscus Cornelis Donders, 55 yıl sonra bilişsel psikolojiye daha ileri yorumlama olanağı sağlayan, bir yanıt için gerekli tepkiyi ölçmeye uygun düşen deneyler yaptılar.

20. yüzyılın ilk yarısı boyunca bilişin araştırmasında keskin bir dönüşüm meydana geldi. Burrhus Frederic Skinner gibi davranışçılar; düşünme, dikkat, bellek gibi zihnin içsel işlemlerinin kanıtlanmamış veya gözlemlenmemiş, yalnızca varsayımsal yapılar olduğunu ileri sürdüler. Bu nedenle Davranışçılar, zihinsel yapıların kimi uyarana yanıttaki araştırması ve davranışın deneysel çözümü (doğrudan gözlemlenebilir veri) kadar bağlantılı ve önemli olmadığını öne sürmüşlerdir. Watson ve Skinner'a göre insan, ancak bu yolla nesnel olarak çalışma yürütebilirdi. Psikoloji dünyasında Davranışçı Kuram'ın popülerleşmesi, yaklaşık 50 yıl sonra terk edilmek üzere zihinsel olayların ve süreçlerin incelemesine önderlik etti.
1950'lerde bilim dünyasının ilgisi yeniden bilinç, düşünme, dil işleme, imge, bellek ve dikkate yöneldi. Davranışçılığın başarısızlığa uğraması, biliş araştırmalarında "Bilişsel Devrim" adı verilen yeni bir dönemi müjdeledi. Bu durum, çeşitli iletişim kuramları gibi yeni fikirlerin doğuşu ve zaten var olan kuramların yeniden canlandırılması niteliğini taşımaktaydı. Bu kuramlar; daha önceleri oluşturulmuş bilgi kuramından ortaya çıkmış, iletişimin kuramsal ve uygulamalı anlayışını oluşturmak için dikkat ve sinyal belirlemede deneylere önayak olmuştur.
Çağdaş dil bilimciler, bilişsel süreçlerle ilişkili olan dil ve gramer yapısı üzerine yeni kuramlar önerdiler. Chomsky’nin Üretken Gramer ve Evrensel Gramer Kuramı, önerilen dil hiyerarşisi ve Skinner'ın "Sözel Davranış" eleştirisi, Bilişsel Bilim'in geçmişinde birer dönüm noktasıdır. Bellek kuramları ve bunların örgütlenme modelleri başka bilişsel süreçlerin modellerinin oluşmasını sağladı: Bilgisayar bilimi, özellikle de yapay zeka, yeniden gözden geçirilmiş temel problem çözme ve bellek işleme-depolama kuramları, dil işleme ve dil edinimi.
Açıklığa kavuşturmak için: Davranışçılığın geçmişi üzerine daha fazla tartışma
Yukarıdaki anlatım, davranışçılığın yükseliş ve düşüşünün en bilinen biçimini yansıtmasına karşın burada bir yanlış anlama söz konusudur. Bilişsel psikolojinin kuruluşunu daha iyi anlamak, doğru bir tarihsel bağlamda anlamış olmayı gerektirmektedir. Her bilim dalında kuramsal anlaşmazlıklar bulunmaktadır. Bununla birlikte, bu görüş ayrılıkları, karşıt görüşün dürüstçe yorumlanması üzerinde kurulmalıdır. Genel olarak Skinner ve Watson arasında yanlış bir eş değerlik çizilmeye bir eğilim bulunmaktadır. Watson'ın, insanların davranışında ruhsal veya bilinçli olayların oynadığı rolü reddettiği doğrudur. Şimdi geriye dönüp bakıldığında bunun bir yanılgı olduğu görülür. Bununla birlikte Watson'ın konumunu tarihsel bağlamda inceleyecek olursak Watson'ın neden böylesine uçlarda takıldığını daha iyi anlayabiliriz. Zamanının pek çok genç ruh bilimcileri (psikologları) gibi Watson'da da psikoloji biliminde pratik ilerlemeden yoksun olmaktan dolayı hayal kırıklığı gelişmişti. Bilince odaklanmak; tutarsız, güvensiz ve çelişen verilerden başka bir şey getirmiyordu. Açığa çıkardığı yanıtlarla Pavlov'un çalışmasından ve ilham almak adına doğa bilimlerini irdelemekten gelen ilerlemelerle heyecanlanmış Watson; gözlemlenebilir ruhsal olayların incelenmesini reddetmiş ve psikokojiyi, insan davranışını daha iyi anlamak için bir araç olarak kullanarak uyarı-yanıt ilişkilerini incelemeye itmişti. Bu yeni psikoloji ekolü "davranışçılık", çok popüler olmaya başlamıştı. Skinner'ın düşünce ekolü, Watson'dan ilham almasına karşın gözlemlenemez ruhsal olayların araştırılmasında oldukça farklı bir yaklaşım benimsemiştir. Skinner, "zihin" ile "vücut" arasında ayrımın uzlaşılamaz felsefi bagaj yüküyle birlikte geldiğini ileri sürmüştür. Önceleri zihinsel olaylar olarak anılan "derinin içinde" gerçekleşen olayların özel olaylar olarak adlandırılmasını önermiştir. Bu; düşünme akıl yürütme, hissetme ve benzeri özel deneyimleri psikolojinin bilim ocağına geri getirilmesini sağlayacaktı. Bununla birlikte Skinner bunların, kuramlaştırılmış zihinsel yerde gerçekleşen olaylardan çok bizim yaptığımız şeyler olduğunu ileri sürmüştür. Skinner için konu, zihinsel bir dünyanın varlığı ya da yokluğu değildi, kafamızın içinde yaşanan şeyleri açıklamak için zihinsel bir dünyanın varlığına başvurmaya gereksinimin olup olmadığıydı. Örneğin doğa bilimleri, doğal dünyada fenomenleri açıklamak için bizim bir yaratıcının var olduğu varsayımına gereksinim duyup duymadığımızı sorgulamaktadır. For Skinner, it was an error for psychologists to point to these private events (mental) events as causes of behavior. Instead, he suggested that these too had to be explained through the study of how one evolves as a matter of experience. For example, we could say that a student studies because she "expects" to do better on an exam if she does. To "expect" might sound like an acceptable explanation for the behavior of studying, however, Skinner would ask why she "expects". The answer to this question would yield the true explanation of why the student is studying. To "expect" is to do something, to behave "in our head", and thus must also be explained.
The cognitive psychologist Henry Roediger pointed out that many psychologists erroneously subscribe to the version of psychology presented in the first paragraph. He also pointed to the successful rebuttal against Chomsky's review of Verbal behavior. The evidence for the utility in Skinner's book can be seen in the abundance of actionable data it has generated, therapies unmatched by any modern linguistic account of language. Roediger reminded his readers that in fact, we all measure behavior, some simply choose to make more assumptions about its origins than others. He recalls how, even as a cognitive psychologist, he has been the focus of criticism for not making more assumptions about his data. The law of parsimony tells us that when choosing an explanation for a set of data about observable behavior (the data all psychologists collect), we must be careful not to make assumptions beyond those necessary to explain the data. This is where the main division lies between modern day behavior analysts and cognitive psychologists. It is not in the rejection of our private experiences, it is in how these experiences are studied. Behavior analysts study them in relation to our learning history and the brain correlates of that history. They use this information to design environments that change our private experience by changing our interaction with the world. After all, it is through our interaction with our relative world that our private experiences evolve. It is a far cry from the mechanical stimulus-response psychology of John Watson. Academic honesty requires that we make a good faith effort to understand what we wish to criticize. Henry Roediger pointed out that many psychologists understand a very stereotyped, erroneous version of psychology's history. In doing so they miss the many successful real world applications that Skinner's analysis has generated.
Neuroinformatics, which is based on the natural structure of the human nervous system, tries to build neuronal structures by the idea of artificial neurons. In addition to that, Neuroinformatics is used as a field of evidence for psychological models, for example models for memory. The artificial neuron network “learns” words and behaves like “real” neurons in the brain. If the results of the artificial neuron network are quite similar to the result

Biyoinformatik, biyolojik soruların yanıtlanmasına yardımcı olmak için bilgisayarların kullanımını sağlayan bir biyoloji dalıdır. Klasik biyoloji, bir hipotezin oluştuğu ve objektif olarak test edildiği deneylerin kullanımını içerir. Biyoinformatikçiler de deneyler yaparlar ancak ham verilerden faydalı bilgiler elde etmek için hesaplama modelleri oluşturmayı veya analizleri kullanmayı tercih edebilirler. Biyolojide bilgisayar kullanma olanakları çok fazladır: herhangi bir biyolojik problem bilgisayar kullanımını içerebilir .
Ancak, biyoinformatikten söz edildiğinde, bazı uygulamalar diğerlerinden daha sık ortaya çıkar. Bunlar, DNA, RNA veya protein dizi verilerini veya dizi örnekleri aramalarını içeren dizi hizalama işlemini içerebilir. Bunun nedeni, artan miktarda genom dizilim projesinin tamamlanmasının ve bilgisayarların, genom dizilerin analizine getirdiği faydadan kaynaklanmaktadır.
Biyoinformatik büyümekte olan bir disiplindir ve bilgisayarlar daha sofistike hale geldikçe, deneysel biyolojinin çok önemli bir tamamlayıcısı olacaktır.

Raul Isea The Present-Day Meaning Of The Word Bioinformatics, Global Journal of Advanced Research, 2015
Ilzins, O., Isea, R. and Hoebeke, J. Can Bioinformatics Be Considered as an Experimental Biological Science 2015

Biyoinformatik, moleküler biyolojiyi analiz etmek için bilgisayar teknolojisinin avantajını kullanan, hızla gelişen bir bilim alanıdır. Biyoinformatik alanındaki yöntem istatistik, dil bilimi, matematik, kimya, biyokimya ve fizikten türetilebilir. Nükleik asitlerin veya peptid zincirinin sekansı veya yapısal verileri ile deneysel veriler, biyoinformatik alanındaki bilim adamları tarafından veri olarak kullanılabilir . Spesifik olarak, biyoinformatiği içeren alan yapısal biyokimyası, dizi dizilimlerinin nasıl elde edildiğini ve sonunda dizilerin analizinin filogenetik ağaçlar üretmeye nasıl yardımcı olabileceğini ele almaktadır. Bu ilişkiler nihayetinde makromoleküllerin yapılarının nasıl ortaya çıktığı ve birbirleriyle karşılaştırıldığı hakkında bilgi sağlamaya yardımcı olabilir.

Makromoleküllerin en iyi bilinen yapılarından bazıları atomik koordinatlar olarak arşivlenir. Bunlar atomik koordinatlar moleküler yapıların üç boyutlu yapısını içeren veri dosyalarıdır. Atomik koordinatların bağlantısı ayrıca bu veri dosyalarının özelliklerini açıklar. Bir dizi moleküler yapı Protein Data Bank (PDB)' de depo edilir. PDB'nin bağlantısı, halka açık olarak verilen birçok koordinatı bulmak için kullanılan URL'dir. Makromoleküler yapılar üzerine sonuçlar yayınlayan birçok bilimsel dergi, artık araştırmacıların atomik koordinatları veritabanına yüklemelerini gerektirmektedir. Sonuç olarak, bu bankada proteinleri, nükleik asit leri ve karbonshidrat ları içeren neredeyse 20.000'den fazla makromoleküler yapı vardır. X-ışını kristalografisi, kırınım teknikleri, nükleer manyetik rezonans (NMR), elektron mikroskobu ve teorik modeller. Bu bankaya her yıl yaklaşık 2500 yeni yapı sunulduğundan, büyümektedir.
Bir yapı belirlenirken, makromoleküler yapı ile ilişkili dört karakterli bir tanımlayıcı Protein Veri Bankası kimlik kodu (Protein Data Bank identification code-PDBid) kullanılır. İlk karakter bir ile dokuz arasında bir rakam olmalıdır, kalan üç karakter büyük veya küçük harf olabilir. Örneğin, miyoglobin yapısı PDB'de 1MBO olarak kodlanmıştır. Bununla birlikte, tanımlayıcıların mutlaka makromolekülün adıyla bir ilişki kurması gerekmediğine dikkat etmek önemlidir.
İlk olarak, atom koordinat dosyası, incelenen molekülün kimliği ve özellikleri, dergi referansları, dosyanın gönderildiği tarih, makromolekülün elde edildiği organizma ve yapıyı beraberinde getiren yazar(lar) gibi bilgilerle başlar. Ayrıca, dosya yapının nasıl belirlendiğinin ve simetri ile araştırılmayan birimlerin bir tanımını içerir. Birçok zincirin sekansı, birbirleriyle heterogen grupları (HET) olarak adlandırılan bir açıklama ve formüllerle birlikte sunulur. HET, hem grubu organik moleküller gibi standart amino asit veya nükleotitler gibi olmayan moleküller, Hyp, diğer moleküllere bağlı metal iyonları ve su molekülleri ni içerir. Bu dosya, mevcut herhangi bir disülfür bağı ile birlikte ikincil yapının elemanlarını da sağlamayabilir. PDB dosyasının çoğunluğu iki seri içerir - ATOM olarak da bilinen standart birimler ve HETATM kayıt çizgileri olarak bilinen heterojenler. Bu serilerin her biri, ATOM ve HETATM, yapıdaki belirli bir atom için seri numarasına karşılık gelen koordinatlar sağlar. Serinin ardından, atomların kartezyen koordinatları (X, Y, Z), atom uzayının kapladığı alanların oranına göre sunulmaktadır. Ek olarak, izotropik bir sıcaklık tarif edilir, çünkü atomun termal hareketliliğini gösterebilir. Daha büyük miktarda izotropik sıcaklık, daha fazla hareket olduğu anlamına gelir. Yapı NMR yoluyla tespit edilirse, PDB, yapıyı bulmak için hesaplanan bir koordinat kümesinde en temsilci üye için ATOM ve HETATM serilerini içerecektir. Son olarak, PDB dosyası hidrojen bağları ve disülfit bağları gibi atomlar arasında standart olmayan varlıklar sunan bağlantı kayıtlarıyla (CONECT) sona erer.

Protein Veri Bankası'na benzer şekilde Nükleik Asit Veri Tabanı (Nucleic Acid Database-NDB), nükleik asitlerin atomik koordinatlarını içerir. NDB  linki veri tabanının direkt URL adresidir. Nükleik asitleri içeren dosyanın formatı PDB dosyalarının formatı gibidir. Ancak, NDB, nükleik asitlere özgü arama için zıt bir organizasyon ve algoritmalara sahiptir. Bu özellik özellikle önemlidir çünkü proteinler miyoglobin gibi isimlerle sınıflandırılırken, nükleik asitlerin kimlikleri dizilimleri ile tanımlanır.

Üç boyutlu yapının incelenmesi, bir makromolekülün fonksiyonlarıyla birlikte aktif bölgelere dair çok fazla bilgi sağladığı için nispeten önemlidir. Bir makromolekülün yapısını araştırmanın en açık yolu moleküler grafik programları kullanmaktır. Yararlı bir program olan PyMOL kullanılabilir. Link, PyMOL 'ün web sitesi ve üç boyutlu bir yapıyı görüntüleme yeteneklerini göstermektedir. PyMOL gibi programlar, kullanıcının, molekülü döndürerek ve molekülün iki boyutta görmekten ziyade moleküler anlayışı artırabilen bir izlenim elde ederek aktif olarak moleküler bir yapıya girmesine izin verir. PyMOL, RasMol gibi diğer birçok popüler programla birlikte, daha fazla görselleştirme için girdi olarak PDB dosyalarını kullanır.

Keşfedilen birçok protein yapısal olarak diğer proteinlerle ilişkilidir. Bu benzerlik, protein dizileri yerine protein yapılarını korumuş olan evrime bağlıdır. Aşağıdaki açıklama kümesi, protein yapılarını sınıflandırmak ve karşılaştırmak için hesaplama araçlarına sahip topluluğa yönelik pek çok web sitesinden bazılarıdır. Bu araçlar kullanarak, sıra karşılaştırmalarında normalde gösterilmeyen işlevler, uzak evrimsel ilişkiler, yapıların kestirilmesi için özel katlamaların özel kütüphanelerinin oluşturulması ve bazı yapıların neden birbirinden daha baskın olduğunu açıklanabilir.
Sınıf, Mimari, Topoloji ve Homolog süper aile (Class, Architecture, Topology and Homologous superfamily-CATH), dört konuyu kullanarak proteinleri kendi yapısal hiyerarşilerinde sınıflandırır. Birincisi, "Sınıf" en üst seviyedir ve dört ikincil yapı kategorisine sahiptir. Bunlar: Başlıca alfa, Başlıca beta, alfa / beta ve sırasıyla çok fazla ikincil yapıda olmayanlar. İkincisi, "Mimari", ikincil yapının topolojiden ayrı bir düzenlemesidir. Üçüncüsü, "Topoloji", proteinlerin bağlanabilirliği ve şeklinin bütünsel görüşünü ifade eder. Dördüncü olarak, "Homolog süper aile", seçilen proteine ​​homolog olan proteinlerdir. Ayrıca, proteinin etkileşimli veya hareketsiz bir görüntüsü gösterilebilir. Miyogolobin için bir CATH örneği Sınıf olacaktır: Esas olarak alfa; Mimari: ortogonal demet; Topoloji: globin benzeri; Homolog süper aile: globin. Sonuç olarak CATH, birçok yapısal hiyerarşinin karşılaştırmasını yapmak için veritabanına erişen kullanıcıların yukarı ve aşağı göz atmalarına izin verir.

Biyolojik veri tabanı elektriksel olarak depolanan ve yeniden canlandırılabilen organize biyolojik bilgidir. Örneğin, biyolojik bir veri tabanı adresinden izole edildiği organizmanın bilimsel adı adı, giriş sırası, adı olan bir nükleik asit dizisinin bir kaydı olabilir .
Bu bilgi işlem çağında, depolama veritabanı bilim insanları arasındaki iletişimi güçlendirir. E-kütüphanedeki veriler, bilim insanlarından, öğrencilere veya meslekten olmayan kişilere kadar birçok kişi tarafından yaygın olarak kullanılabilir.

Moleküler biyolojiyi analiz etmek, biyoinformatikteki ana alanlardan biri olan, biyoinformatik araştırmaları yeni araçlar yaratmaya, protein dizileri gibi malzemelerin depolanması, geri alınması ve analiz edilmesine yönelik yöntemler üzerine odaklanmaktadır.
Hedef örnekleri analiz etme yöntemleri genellikle araştırmacıların ilginç örneklem yapısını belirlemelerine yardımcı olacak ya da bilim adamlarının depolama verilerinden örnek için aile grubunu belirlemesine yardımcı olacak bilgisayar programlarıdır. Biyoinformatikte kullanılan yaygın bir program BLAST(Basic Local Alignment Search Tool), Temel Yerel Hizalama Arama Aracı' dır. BLAST araştırmasının sonucu, araştırmacıların, bilinen dizilerin  veritabanından örnek dizinin homolog dizilerini tanımlamasına yardımcı olacak bir dizi dizilimi listesidir .

Ortak bir ataya sahip olan proteinlerin,  amino asit dizileri birbirine benzeyecektir. Bu nedenle, dizilim ve yapısal veriler hakkında bilgi sahibi olan bilim adamları, bilinmeyen bir proteini gruplar halinde düzenleyebilir ve proteinin evrimini yeniden yapılandırabilir. Dizi hizalama yöntemi, homolog genleri veya proteinleri tespit etmek için bir tekniktir. İki genin veya proteinin evrim ilişkisi, skor matris veya ikame matrisi ile hesaplanarak belirlenir. Proteinlerin üçüncül yapısını karşılaştıran yapısal hizalama yöntemi, iki protein dizisinin evrim ilişkisini de keşfedebilir. O zaman, bilim adamları proteinler için olduğu kadar bu gezegendeki yaşam için de evrim ağacı yaratabilirler .

Biyoinformatik ile ilgili alanlar :
Biyofizik  - fizik bilimlerinde bulunan teknikler ve kavramları kullanılarak biyolojinin araştırıldığı bir alan.
Farmakogenomik  - tüm genomun farmakolojik ve genetik bilgilerini depolamak ve işlemek için biyoinformatik tekniklerinin kullanıldığı bir alan.
Farmakogenetik  - farmakogenomiklere benzer şekilde, bir ila birkaç gene odaklanmak ve genomların korelasyonlarını tanımlamak için biyoinformatik ve genomik teknikler kullanır.
Tıbbi bilişim  - algoritmalar ve yapılar gibi bilgisayar uygulamalarının tıbbi bilgilerin etkili bir şekilde iletilmesine ve işlenmesine yardımcı olmak için kullanıldığı bir disiplindir.
Matematiksel biyoloji  - biyolojinin süreçlerini temsil etmek, değerlendirmek ve modellemek için matematiksel araç ve yöntemleri kullanmaya odaklanan bir alandır.
Bilgisayarlı biyoloji  - biyoinformatik gibi, biyolojik problemleri çözmek için bilgisayar uygulamalarını ve istatistiksel yöntemleri kullanmayı içerir. Bunun gibi, biyolojik modelleme, simülasyon ve görüntüleme, RNA yapısı ve gen tahmini, dizi hizalama algoritmaları ve çoklu dizi hizalaması gibi teknikleri mümkün kılar.
Proteomik  - proteoma ait çalışmadır. Proteom, bir hücre, doku veya organizma tarafından ifade edilen proteinlerin tamamen toplanmasıdır. Proteinler belirli bir genom için tamamlayıcıdır.


Homoloji, iki farklı organizmanın nükleik asit veya protein dizileri arasında meydana gelen benzerlikleri dikkate alan bir kavramdır. 1948'de Richard Owen tarafından bilime kazandırlan homoloji kavramı, proteinlerde iki farklı amino asit dizisi örneği veya DNA'daki iki farklı DNA dizisi arasında meydana gelen eşleşmeleri karşılaştırarak ve hizalamada gerçekleşen eşleşmelere puan atayarak ölçülür.  Bu tür analizler, türler arasındaki ilişkilerin belirlenmesinde yararlıdır ve belirli bir tür kümesinde zaman içinde meydana gelen evrimsel değişikliklerin yanı sıra atasal kökenlerinin izlenmesine yardımcı olabilir. Bugün, iki organizmanın homolog olma olasılığını değerlendirmek için teknikler geliştirilmiştir ve bu teknikler büyük ölçüde dünyadaki biyoinformatikçiler için ana odak alanı haline gelmiştir.
Nükleik asitler arasındaki homoloji iki ana tiptedir: ortolog ve paralog.
Homologlar, türleşme denen bir olayla ayrıldıysa ortolog olarak adlandırılırlar. Ortolog genler, farklı türlerde bulunur, ancak aynı atalardan geldikleri için birbirlerine benzerler. Ortologlar genellikle aynı işleve sahiptir. Paralog, bir gen duplikasyon (çiftleşme) olayıyla ayrılan genlerdir. Paraloglar aynı organizmada bulunan, benzer fakat özdeş-olmayan işlevlere sahip homolog proteinlerdir. Hemoglobin ve miyoglobini kodlayan genler, paralog genleridir. Ayrıca hemoglobin A, 2A, B, F birbirlerinin paraloglarıdır.

“Homoloji” terimi  proteinleri veya nükleik asit dizilerini tanımlanırken, "homolojinin kalite kavramı olduğu ve “nicelendirilemediği” " düşünüldüğü için sıklıkla yanlış kullanılır. Son zamanlarda yapılan bir analizde, "homoloji" terimi, 2007 veri tabanında PubMed'de arandı ve, terimin bir protein veya prosedür adının bir parçası olanlar kullanılanıldığı yerler hariç tutulduğunda, 1966 başlık ya da özette homoloji kelimesini içeriyordu. Bu özetlerin %57'si (1128) terimi doğru kullanıyorken, %43'ü (828) terimi yanlış kullanıyor. Terimin yanlış kullanımından bazıları, yüzde değeri ile ilişkilendirme ve "yüksek", "düşük" ve "önemli" gibi terimlerin kulanımını içerir. 1986 veritabanındaki özetler için yapılan analiz, "homoloji" teriminin yanlış kullanılma sıklığının bir miktar azaldığını göstermektedir.
Terimin analizi, diller arasında da yapıldı. 1986 yılında homoloji içeren makaleleri araştırırken, terimi yanlış kullanan maddelerin toplam yüzdesi daha düşüktü. Bununla birlikte, diğer ülkeler bilimsel araştırmalara girerken, gelişen ülkelerden daha fazla makale üretildi ve bu makalelerin büyük bir kısmı homoloji terimini yanlış kullandı. "Homolojiye Gelince, Kötü Alışkanlıklar Zor Ölür" makalesi, gelişen ülkelerde terminoloji üzerine yeni araştırmacıların eğitiminin yanı sıra, bilimsel dergilerin ortak terminolojinin uygun kullanımına ilişkin kılavuz ilkelerini sağlamasını talep ederek bu soruna bir çözüm önermektedir.
Homoloji teriminin yanlış kullanılması, okuyucunun yazarın niyetini anlamaya çalışmasında neden olacağı karışıklıktan dolayı bir problem olarak kabul edilir. Örneğin, yazar iki proteinin homolog olduğunu belirtirken, aynı zamanda iki proteinin aynı evrimsel kökeni paylaşmadığına dair beyanda bulunsun. Bu beyan homolojinin tanımına ters bir beyandır, çünkü evrimsel köken tamamen görmezden gelinemez. Bunun yanında şunu da belirtmek önem ifade eder. İki proteinin yüksek benzerliğe sahip olması proteinlerin aynı atadan geldiğinin tam kanıtı değildir.
Homoloji ve benzerlik arasındaki farkın bir örneği, insan ve şempanze DNA'sı arasındaki karşılaştırma ile insan ve fare DNA'sının karşılaştırılması ile güzelce anlatılabilir. Fareler ve insanların DNA'larının yaklaşık %97,5'i aynıdır, bu aynı evrimsel kökene sahip oldukları anlamına gelmez. Çok benzer olsalar da, homolog olmazlar. İnsanlar ve şempanzeler, DNA'larının >%98,0'ını paylaşıyor ve aynı evrimsel kökenini paylaştığına inanılıyor. Bu nedenle, insan ve şempanze DNA zincirlerinin homolog olduğu doğru bir ifade olabilir.

Ortologlar, tamamen farklı iki tür arasında yakından ilişkili olan ancak genellikle aynı fonksiyonlara sahip olan spesifik gen dizileridir. Ortolog terimi, "öteki" anlamına gelen "orto" kökünden gelir ve 1970 yılında Walter Fitch tarafından ortaya atılmıştır.
Ortolog genlerin bir örneği, hem ineklerde hem de insanlarda hemoglobinleri kodlayan genlerdir. Ortologların haritalanması, biyologların çok daha ayrıntılı ve özel evrim ağaçları inşa etmesine yardımcı olabilir. Taksonomi ve filogenetik çalışmalar ortolog dizilerden yararlanır. Basit bir örnek bir yarasa ve bir kuş olabilir; bir kuş ve bir yarasa, iki farklı türün parçasıdır ve yine de kanatları aynı işleve sahiptir.

Paraloglar aynı türdeki organizmalar tarafından paylaşılan ancak farklı fonksiyonlar sergileyen gen sekanslarını belirtir. Paraloglar genellikle transpozonlar veya eşitsiz çapraz geçişler (cross-over) gibi çeşitli mekanizmaların neden olabileceği gen çoğalmasının ürünüdür. Bu kopyalanmış genler tipik olarak benzer fonksiyonlara sahiptir ve daha fazla sayıda mutasyon ile daha da farklılaşabilirler.
Farklılıkların veya yerdeğiştirme sayısı, genin kopyalanmasından bu yana geçen zamanla orantılıdır. Bu bilgi aracılığı ile, genomların evrimleşme yoluna ışık tutulabilir. Miyoglobin ve hemoglobin antik paraloglar olarak kabul edilir.
Bu şüpheli paraloglar, her ikisi de benzer protein yapılarına sahip olan ancak oksijen taşıma görevlerinde farklılık gösteren hemoglobin ve miyoglobini kodlayan genlerdir. Bilinen dört hemoglobin sınıfı (hemoglobin A, hemoglobin A2, hemoglobin B ve hemoglobin F) birbirlerinin paraloglarıdır. Diğer paralog örnekleri Actin ve Hsp-70'tir. Üçüncül yapıları benzer fakat işlevleri farklıdır; aktin hücre iskeletinin bir parçasıdır, Hsp-70 ise bir şaperondur proteinidir.

İki molekülün homolog olup olmadığını test etmek için, iki dizi arasında meydana gelen eşleşmeler için nükleik asit veya protein dizisinin incelenmesi önemlidir. Diğer sekanslama işlemlerinin de kullanıma uygun olmasına rağmen, protein sekanslama genellikle tercih edilir, çünkü 20 farklı yapı bloğundan (amino asitler) oluşur; DNA ve RNA ise her biri yalnızca dört nükleik asitten oluşur; bu yüzden protein diziliminde önemli sayıda eşleşmeye sahip olmak, nükleik asit hizalamasındansa  aynı soydan geliyor olmanın daha güçlü bir kanıtıdır. Aynı zamanda, farklı genlerin aynı amino asit için kodlayabildiği genetik kodların fazla olduğu sekanslarda (örn. GCU, GCC, GCA, GCG kodlarının hepsi alanını kodlar), protein fonksiyonlarındaki benzerliklerin belirlenmesinde protein sekansının kullanımı DNA veya RNA ile karşılaştırıldığında çok daha hassas ve yararlıdır.
İki farklı protein dizisi, amino asitlerin doğrudan üst üste hizalandığında veya bir dizilim diğerinin üzerine kaydırıldığında eşleştiği sayıların analizi ile karşılaştırılabilir. Örneğin, eşleşme sayısını değerlendirirken, üstteki iplikçikten birinin amino asidi, ikinci iplikçikten gelen birinci amino asitinin hemen üzerinde olabilir veya bunun soluna/sağına kayarak farklı amino asitlerin hizalanmasına neden olabilir. Eşleşmelerin sayısı daha sonra hangi eşleşmelerin gerçekleştiğini değerlendirmek için hizalamaya karşı dizilir. Çok sayıda eşleşmenin iki proteinin homolog olduğu anlamına gelmediğini anlamak önemlidir.
Ekleme ve silme gibi mutasyonları hesaba katmak için, daha iyi bir eşleşme oluşturmak üzere boşluklar eklenebilir. İki dizi karşılaştırmasının iyi bir eşleşme olduğu görülüyorsa, her iki karşılaştırmayı da içerecek şekilde boşluk eklemektir. Bilim insanları hizalamayı puanlar: her eşleşme için +10 puan ve uzunluktan bağımsız olarak her boşluk için -25 puan. Bu skor daha sonra, amino asit eşleşmelerinin sadece şansa bağlı olmadığından emin olmak için protein ipliklerinden birini rastgele karıştırıp elde edilen ve diğerleriyle karşılaştırarak elde edilen diğer skorların dağılımına karşı grafiğe dökülür. Eğer skor büyük ölçüde diğer puanların çoğundan saparsa, o zaman iki protein muhtemelen homologdur. Bununla birlikte, düşük bir puan homolojiyi reddetmez.

Skorlar, özdeşlik veya yerdeğiştirme matrisleri kullanılarak hesaplanabilir. Bu işlem, dizileri daha da iyi eşleştirmek için boşluklar ekleyen bir matris seçerek daha kesin sonuç verir hale geitirilebilir. Matriks örnekleri arasında PAM, BLOSSUM (bir yerdeğiştirme matrisi tipi) GONNET (spesifik olarak mesafeyi hedefleyen bir matris), DNA özdeşlik matrisi ve  DNA PUPY matrisi bulunur. Genel olarak, yerdeğiştirme matrisleri protein sekanslarına en duyarlı olanlardır. Bu matrisleri kullanarak, uzak evrimsel ilişkileri tespit etmek mümkündür. İki sekans en az% 25 özdeşse, bu iki proteinin homolog olduğu belirlenebilir. Bununla birlikte, yüzde 25'ten düşük yüzdelere sahip olan dizilerin mutlaka homolog olmaları gerekmez. Örneğin, A proteini B proteinine homolog ise (özdeşlik yüzdelerine dayanarak) ve B proteini C proteinine homolog ise, A ve C sadece% 15 oranında özdeş olsalar bile fonksiyonlarında benzerlik gösterebilirler. Özdeşlik matrisleri, sekanslar arasındaki eşleşmeler için bir değer atar ve eşleşmeyenler için sıfır(0) değerini atar. Bu yöntem, olası ve nadir mutasyonlar arasında ayrım yapmaz ve bu nedenle homolojiye açık bir cevap vermez. Yerdeğiştirme matrisleri, zararlı olma ihtimalinin düşük olan korunmuş mutasyonları veya glisin ve alanin gibi fonksiyonları ciddi şekilde değiştirmesi muhtemel olan mutasyonları ciddi bir pozitif puan vererek hesaba katar. Başka bir deyişle, yerdeğiştirme matrisleri sadece sekanslar aynıysa (onlara mümkün olan en yüksek puanı verir) değil, aynı zamanda özdeşlik matrislerinden farklı olarak, benzerleri olan başka bir amino asit tarafından "yerdeğiştirildiğinde" amino asit dizileri için de değerler tahsis eder. Amino asit sekansı ne kadar benzerse, aldığı "değer" o kadar büyük olur. Diziler ne kadar farklı olursa veya "nadir" olduğunda, A gibi belirli bir amino asit P ile yerdeğiştirdiğinde "negatif" değerler büyür. Bu matrisler farklı mutasyon tipleri arasında bir ayrım yapılarak daha iyi eşleştirmeler yapılabilir ve rastgele şansa dayalı hizalamalard

Deoksiribonükleik asit (DNA) ve ribonükleik asit (RNA), proteinlerin yapımı için bilgi depolama molekülleri ve çalışma şablonudur. Her canlı hücre ve virüs, genetik bilgisini DNA veya RNA kullanarak kodlar. Bir insanı üretmek için gereken büyük miktardaki bilginin hücrelere sığması gerçek bir evrim harikasıdır.
Friedrich Miescher 1869'da kullanılmış cerrahi bandajlardan DNA ve RNA izole etti. Bu DNA ve RNA' nın ilk kez izole edilişiydi. Sonra Oswald Avery, Colin MacLeod ve Maclyn McCarty tarafından 1944'te yapılan bir dizi deney, DNA'yı genetik bilgi olarak tanımladı. Bunu takiben A.D. Hershey ve Martha Chase'in 1952'deki çalışması DNA'nın genetik bilginin taşıyıcısı olduğunu yeniden doğruladı. Hershey ve Chase'in grubu iki faj içeren bir deney yaptı. Bu deney, DNA'nın tek başına yeni virüsler yapmak için yeterli olduğunu ve bu nedenle genetik bilgi olarak tanımlandığını gösterdi. Rosalind Franklin, Chargaff ve diğer kimyagerler de DNA'nın keşfedilmesine yol açan bilgiler sağladılar. Franklin, sarmal bir yapıya işaret eden kristalografik veriler sağladı. Chargaff'ın kuralı, adenin içeriğinin timin içeriğine eşit olduğunu ve sitozininkinin de guanine eşit olduğunu söyledi. James Watson ve Francis Crick, 1953'te DNA'nın yapısını (çift sarmal) keşfetti.

DNA, bir nükleotid polimeridir. Nükleotidler bir pentoz şekerinden (DNA için 2-deoksiriboz ve RNA için riboz), bir fosfat grubundan (
  
    
      
        
          H
          
            3
          
        
        P
        
          O
          
            4
          
        
      
    
    {\displaystyle H_{3}PO_{4}}
  
) ve nitrojen içeren bir bazdan oluşur. Beş nitrojen bazı vardır - adenin, guanin, timin, sitozin ve urasil. Tek nükleotidler, polinükleotidler oluşturmak için fosfodiester bağlarıyla birbirine bağlanır.

DNA, iki (2) polinükleotid ipliğinden oluşan bir çift sarmal olarak bulunur. Tamamlayıcılık ilkesine göre A (adenin) bazları, diğer iplik üzerindeki T (timin) veya U (RNA durumunda urasil) bazlarına bir hidrojen köprüsü ile bağlanır ve benzer şekilde C (sitozin) bazları kendilerini G (guanine) bazlarına bağlar. Bu ilke, DNA ve RNA replikasyonuna ve iplerden biri hasar gördüğünde genetik bilginin sınırlı onarım olasılıklarına izin verir.

DNA, çoğu canlı organizmanın çoğu hücresinin çekirdeğinde bulunan kalıcı genetik bilgi depolama ortamıdır. Ökaryotlarda RNA, genetik bilgiyi çekirdekten proteinlerin sentezlendiği sitoplazmaya aktaran ortamdır. Bir DNA molekülü ile bir RNA molekülü arasındaki en temel yapısal fark, DNA'nın 2 'karbonunda bir hidroksil grubuna sahip olmaması ve RNA'nın 2' karbonunda bir hidroksil grubuna sahip olmasıdır.
Üç ana RNA türü vardır:

mesajcı RNA (mRNA) - geçici olarak oluşturulmuş bu RNA, bilgileri çekirdekteki DNA'dan bilgilerin "okunduğu" veya çevrildiği ve bir proteinin sentezlendiği sitoplazmadaki ribozoma aktarılır. Hücrede belirli bir proteine ​​ihtiyaç duyulduğunda her gen ayrı bir mRNA molekülü üretir. Ek olarak, bir mRNA'nın boyutu, o belirli gendeki nukletidlerin sayısına bağlıdır.
transfer RNA (tRNA) - RNA moleküllerinin en küçüğüdür ve ribozom ile ilişkilidir.Büyüyen proteine ​​bağlanacak bir amino asit sağlar. Yalnızca tRNA genetik bilgiyi proteinler için amino aside çevirebilir.
Her tRNA, mRNA üzerindeki 3 bazı tamamlayan 3 bazlık bir dizi olan bir "antikodon" içerir.

ribozomal RNA (rRNA) - hem yapısal hem de katalitik özelliklere sahip ribozomun ana bileşenidir.
Ek olarak, 2005 yılına kadar, siRNA ve miRNA gibi diğer RNA türleri karakterize edilmiştir.
DNA yapısı tipik olarak uzun nükleotid zincirine sahip çift sarmallı bir moleküldür, RNA ise "çoğu biyolojik rolde" tek sarmallı bir moleküldür ve daha kısa nükleotid zincirine sahiptir. DNA'daki deoksiriboz şeker, karbon-hidrojen bağları nedeniyle daha az reaktiftir. DNA, enzimlerin DNA'ya saldırmasını önlemek için küçük oluklara sahiptir. Öte yandan RNA, karbon-hidroksil bağları nedeniyle daha reaktif olan riboz şekeri içerir. RNA, alkali koşullarda stabil değildir. RNA, DNA'nınkinden daha büyük oluklara sahiptir, bu da RNA'nın enzimler tarafından saldırıya uğramasını kolaylaştırır.
DNA, B-formundaki sarmal geometrisi nedeniyle benzersiz özelliklere sahiptir. Tersine, RNA'nın sarmal geometrisi A biçimindedir; RNA parçalanabilir ve yeniden kullanılabilir. RNA, ultraviyole ışınlarından zarar görmesine karşı daha dirençli iken, DNA ultraviyole ışınlarına maruz kalırsa zarar görebilir. DNA çekirdekte bulunabilir, RNA ise çekirdek ve sitoplazmada bulunabilir. DNA'nın bazları A, T, C ve G'dir; DNA, fosfat ve deoksiriboz omurgasına sahip uzun bir polimerdir. Buna karşılık, RNA bazları A, U, C ve G'dir, RNA omurgası riboz ve fosfat içerir. Hücre üzerindeki DNA'nın görevi genetik bilgiyi depolamak ve iletmektir. RNA'nın görevi, proteinlerin oluşturulması için gerekli olan genetik kodları çekirdekten ribozoma aktarmaktır, bu işlem DNA'nın çekirdekten çıkmasını engeller, böylece DNA güvende kalır.

Biyokimya, biyolojik organizmaların kimyasını inceleyen bilim dalıdır. Biyokimya, karmaşık kimyasal reaksiyonların ve kimyasal yapıların yaşam ve yaşamsal faaliyetlere nasıl yol açtığını inceleyerek biyoloji ve kimya arasında bir köprü kurar. Çoğu zaman biyokimya, canlı organizmalarda gerçekleşen kimyasal olay ve transformasyonlar konusunda uzmanlaşan bir organik kimya dalı olarak görülür. Ancak şu da bir gerçektir ki biyokimya ne tamamen "biyoloji" ne de tamamen "kimya"dır. Biyokimya, boyutu bir hücre ile molekül arasında olan her şeyi ve bunların arasındaki tüm etkileşimleri inceler.
Biyokimya esasen hücresel yapıların (enzimler ve hücre organelleri gibi) yapı fonksiyonlarını, organik markromoleküller (özellikle proteinler ve ayrıca karbonhidratlar, lipitler, nükleik asitler ve diğer biyomoleküller) tarafından yürütülen işlemleri inceler. Günümüzde çoğu insan tarafından tüm canlıların bir tek canlı soydan kollara ayrılarak oluştuğuna inanmakta ve bunun da tüm canlıların neden benzer biyokimyaya sahip olduğunu açıkladığını düşünmektedirler. Keyfi olduğu düşünülen konulara gelindiğinde bile - genetik kod ve kodonların anlamı gibi - şu bir reddedilemez bir gerçektir ki tüm kara ve deniz canlıları familya ve filumdan alem ve kalduslara, organizasyonların tüm aşamaları boyunca, değişmez modeller sunmuşlardır.
Biyokimya, kısaca, yaşamın kimyasıdır.

Kataliz, katalist olarak adlandırılan ve tepkime boyunca hiç değişmeyen bir madde tarafından gerçekleştirilen tepkimedeki hız değişimini temsil eder. Kataliz bilinen tüm yaşam formları için çok önemlidir; çünkü çoğu zaman kataliz, kimyasal tepkimeleri kendi kendilerine yapacaklarından, birkaç milyon kata kadar daha hızlı gerçekleştirir.
Kataliz hakkındaki sık karşılaşılan bir yanlış anlama da katalizin "tepkimeyi gerçekleştirdiği" aksi takdirde, ortalıkta bir katalist yokken tepkimenin yürümeyeceğidir. Fakat bir katalist, termodinamik olarak yatkın olmayan bir tepkimeyi yürütemez. Daha ziyade, katalist sadece, zaten termodinamik olarak yatkın olan tepkimeleri hızlandırır. Katalist olmasa bile bir tepkime, gözlenmesi veya belirli bir bağlamda yararlı olabilmesi için çok yavaş olmasına karşın büyük ihtimalle yine de gerçekleşecektir.
Katalistler, reaktanlar ve ürünler arasında düşük enerjili bir yolak oluşturarak kimyasal tepkimeyi hızlandırır. Bu genellikle, katalist olmadan oluşamayan bir orta ürünün oluşmasına yol açar. Bu orta ürünün ve daha sonraki tepkimenin oluşumu genellikle reaktanlardan ürünlere direkt yönde gerekenden daha düşük aktivasyon enerjisi bariyerine sahiptir.
Kataliz, çoğu endüstriyel olarak önemli kimyasalların üretimininde kataliz rol aldığından endüstriyel açıdan çok önemli bir süreçtir. Kataliz hakkındaki araştırmalar uygulamalı bilimlerde büyük bir çalışma alanı oluşturur, fizik ve kimyanın çoğu çalışma alanını kapsar.
Katalizin genelde ayırt edilen iki türü vardır. Homojen katalizde reaktanlar ve katalistler aynı haldedir. Mesela, asitler (H+ iyonu vericileri) çoğu sulu tepkimelerde yaygın katalistlerdir. Bu durumda katalist ve reaktanların her ikisi de sulu haldedir. Heterojen katalizde katalist, reaktan ve ürünlerden farklı haldedir. Genellikle, katalist bir katıdır ve reaktan ve ürünler de gaz ya da sıvıdır. Tepkimenin meydana gelebilmesi için reaktanların bir veya daha fazlasının katalist yüzeyine yayılması ve onun üzerinde emilmesi gerekir. Tepkimeden sonra ürünün, yüzeyden çıkarılması ve katı yüzeyden dışarı yayılması gereklidir. Sıklıkla, reaktanların ve ürünlerin bir fazdan diğerine olan bu taşınması tepkimenin hızını sınırlamada baskın bir rol oynar. Bu taşınım olaylarını anlama, heterojen katalist araştırmalarının önemli bir alanıdır.

Enzim (kökeni Yunanca,  maya  kelimesi), işlevi, hücrelerde gerçekleşen çoğu kimyasal tepkimeyi kolaylaştırmak veya diğer bir deyişle hızlandırmak olan özel protein moleküllerdir. Biyolojik hücrelerde birçok kimyasal tepkime gerçekleşir, ancak enzimler olmadan çoğu, biyolojik olarak amaca uygun bir tepkime için çok yavaştır.
Ayrıca, enzimler iki veya daya fazla tepkimeyi aynı anda gerçekleştirebilir, böylece termodinamik olarak yatkın bir tepkime, termodinamik olarak yatkın olmayan bir tepkimeyi "yürütmek" için kullanılabilir. Bu durumun en yaygın örneklerinden biri de, ATP defosforilasyonunu başka alakasız kimyasal tepkimeleri yürütmek için kullanan enzimlerdir.
Kimyasal tepkimelerin meydana gelmesi için belli bir miktarda aktivasyon enerjisi gereklidir. Enzimler, aktivasyon enerjisi düşük olan başka bir tepkime yoluna ayrıcalık tanıyarak tepkimenin hızını artırabilir (Şekil 1), böylelikle tepkimenin oluşması kolaylaşır. Enzimler, kimyasal tepkimeleri katalize eden (hızlandıran) büyük küresel proteinlerdir ve hücre işlevi için gereklidirler. Enzimler, tepkimelere dahil olan kimyasallar (substrat) ve tezleştirdikleri tepkimelere gelince çok spesifiktirler. Substratlar, enzimlere anahtarın deliğine uyduğu gibi uyarlar. Birçok enzim, bir birlik halinde hareket eden birçok proteinden oluşur. Enzimlerin çoğu parçası yapısal veya düzenleyici amaçlara sahiptir. Bir tezleştirilmiş tepkime, yaklaşık 2-20 amino asitten oluşan ve etkin nokta olarak adlandırılan yalnızca küçük bir parça enzim içerisinde gerçekleşir.

Yandaki şekilde, substratlar (CO2 ve H2O), geçiş durumuna gelebilmek için büyük miktarda enerjiye ihtiyaç duyar. Enzim, gereken enerji miktarını azaltarak CO2 ve H2O'nun geçiş durumuna daha kolay gelmesini sağlayan bir mikroçevre oluşturur. Sonuç olarak, tepkimenin gerçekleşme yatkınlığı, dolayısıyla tepkime hızı artar.
Enzimler saniyede birkaç milyon kadar katalitik tepkimeyi gerçekleştirebilir. Enzimatik bir tepkimenin maksimum hızını tespit etmek için, ürün üretimi hızı değişmez bir değere ulaşana dek substrat yoğunluğu artırılır (Şekil 3). Bu, enzimin maksimum hızıdır (Vmax). Bu aşamada, tüm enzim etkin noktaları substratlara doymuş olur. Bu, 1913 yılında Leonor Michaelis ve Maud Menten tarafından ileri sürülmüştü. Vmax'a erişildiğinde substrat yoğunluğu tam olarak ölçülemediği için, enzimler, maksimum tepkime hızının yarısındaykenki substrat yoğunluğuna göre karakterize edilir. Bu substrat yoğunluğu Michaelis-Menten sabiti (KM) olarak adlandırılır. Çoğu enzim Michaelis-Menten kinetiğine uygundur.

Birçok faktör tepkime hızına etki edebilir, katalitik aktivite veya bir enzimin belirliliği. De novo sentezinin (kataliz hızını artırmak maksadıyla daha fazla enzim molekülü üretimi) dışında, pH veya sıcaklık gibi ögeler enzimin doğasını (şeklini) değiştirebilir, ve bu da enzimin işlevini yitirmesine sebep olur. Daha spesifik düzenlemeler, enzimin çevrim sonrası değişimiyle (mesela fosforilasyon) ya da metal iyonlar veya organik moleküller (mesela NAD+, FAD, KoA veya vitaminler) gibi enzimle etkileşen kofaktörlerin eklenmesiyle sağlanabilir. Allosterik enzimler, birbirleriyle etkileşen ve dolayısıyla birbirlerinin katalitik etkinliklerini etkileyen birçok alt birimden (proteinler) oluşur. Enzimler yarışmalı (kompetitif) engelleyiciler, yarışmasız (non-kompetitif) engelleyiciler ve etkinleştiriciler (aktivatörler) aracılığıyla da düzenlenebilir. Engelleyiciler (inhibitör) ve etkinleştiriciler genellikle ilaç olarak kullanılır; ama bazı durumlarda zehirli de olabilirler.

Bir yarışmalı engelleyici, gerçek substratı gibi enzime oturur, hatta bazen enzime, gerçek substrattan daha iyi uyar. Engelleyici, substratın etkin noktadaki yerini kapar, enzimin bir substrat molekülüne bağlanmasını önlediğinden dolayı katalitik tepkime gerçekleşemez. Engelleyici enzime bağlıyken substratın bağlanamadığı gibi substrat enzime bağlıyken de engelleyici enzime bağlanamaz. Yandaki diyagramdan yarışmalı engellemenin nasıl gerçekleştiğini inceleyebilirisiniz. Bazı engelleyiciler, enzimle aralarında kovalent bağlar oluştururlar, böylelikle kendini de enzimi de kalıcı olarak devre dışı bırakırlar (intihar engelleyicileri). Yarışmalı engelleyicinin kinetiği koşullarında, Km artacaktır ama Vmax aynı kalacaktır.

Yarışmasız engelleyici/etkinleştiriciler (I), etkin noktaya bağlanmazlar, substratın (S) enzime (E) bağlandığı noktadan uzak olabilecek başka bir noktaya bağlanırlar. Enzim (E) konformasyonunu (üç-boyutlu yapısını) değiştirerek, enzimin (E) substrata (S) bağlanma ve hedeflenen tepkimeyi tezleştirme yeteneğini kontrol edebilirler. Yarışmasız engelleyici Vmax'ı düşürür ama Km'yi aynı bırakır.

Sınırlı yarışmalı (Ankompetitif) bir engelleyici yalnızca enzim-substrat kompleksine bağlanarak enzim-substrat-inhibitör (ESI) kompleksi oluşturur ve ek bir substrat tarafından atlatılamaz. ESI reaktif olmadığı için, Vmax etkin bir şekilde düşürülür. Sınırlı-yarışmalı engelleyici, ES'nin maksimum yoğunluğunun yarısına ulaşabilmek için gerekenden düşük substrat yoğunluğu nedeniyle Km'yi sırayla düşürecektir.

Geçen bölümde metabolik yolaklardan kısaca bahsetmiştik. Hücre içinde, enzimler de spesifik bir sırayla metabolik yolaklar oluşturarak çalışabilirler (mesela sitrik asit döngüsü, aerobik organizmaların hücrelerinde meydana gelen enzimatik bir tepkime serisi, hücre solunumu için önemlidir). Bu tür yolaklarda bir enzimin ürünü diğer enzimin substratı olur. Önceki bölümde de belirttiğimiz gibi bu metabolik yolaklarların ilk tersinmez aşamalarının kontrol edilebilmesiyle tüm yolağın hücre tarafından kontrol altına alınması sağlanabilir. Enzimli metabolik yolaklarda bu ilk tersinmez adımın kontrolü de bir engelleyici tarafından sağlanır aslında bu engelleyici yolağın son ürünüdür. Yolak işledikçe son ürün miktarı artar. Son ürün miktarı gereken seviyeyi geçince artık daha fazla ürün üretimi gereksiz olacağı için yolağın durdurulması gerekir. Yolağın son ürünü, enzime etkin nokta dışında bir yerden bağlanır ve (engelleme çelşitlerini hatırlayın) enzimin yarışmasız engelleyicisi olur. Etkin noktanın yapısı değiştiği için artık substrat bağlanamaz. Bu şekilde düzenlenebilecek olan enzimlere de allosterik enzimler denir. Aşağıdaki resimde temel geribildirimle engelleme mekanizmaları gösterilmiştir.

Ürünün, (P) ilk tersinmez adımı engellediği temel geribildirimle engelleme mekanizması (A⇀B).
Ardışık geribildirimle engelleme. P1 ve P2 son ürünleri, kendi yolaklarının ilk tersinmez adımını engeller (C ⇀ D veya C ⇀ F). Her iki ürünün de ortamdaki miktarı artınca, C'den ayrılan tüm yolaklar engellenir. Bu, C ürününün birikmesine neden olur, bundan dolayı da ilk ortak tersinmez adım olan A⇀B engellenir.
Enzim çeşitliliği. Her son ürün, kendi ilk tersinmez adımını ve o adımı uygulayan enzimlerden birini engeller.
Toplu geribildirimle engelleme. Her bir son ürün kendi ilk tersinmez adımını engeller. Daha sonra hep birlikte, kendi ortak ilk tersinmez adımlarını engellerler.
Birikimli geribildirimle engelleme. Her bir son ürün kendi yolağının ilk tersinmez adımını engeller. Ayrıca, her bir son ürün kısmen ilk ortak tersinmez adımı engeller.
Enzimlerin varlığı canlı varlıklar için olmazsa olmazdır, vücudumuzda hazır bulunan yaklaşık 2,000 enzimden tek bir tanesinde bile meydana gelecek bir arıza ağır veya ölümcül bir hastalığa neden olabilir. İnsanlarda bir enzimdeki işlev bozukluğundan kaynaklanan hastalıklara bir örnek de phenylketonuria (PKU) hastalığıdır. Bu hastalık, insan beslenmesi için gerekli bir amino asit olan fenilalanini tirozine dönüştüren fenilalanin hidroksilaz enziminin çalışmaması, fenilalaninin birikmesi sonucu meydana gelir ve zeka geriliğine sebep olur. İnsan vücudunda 

Kimyasal (ve dolayısıyla biyokimyasal) tepkimeler sadece enerjik olarak yatkınlarsa gerçekleşir. Eğer ürünler, reaktanlardan daha kararlıysa, genellikle tepkime gerçekleşir. Kül, odundan daha kararlıdır, bu nedenle aktivasyon enerjisi sağlanır sağlanmaz (örneğin kibritle), odun yanar. Elbette bu kuralın çok fazla istisnası olabilir, ancak genel olarak şunu diyebiliriz ki  eğer bir reaksiyonun ürünleri daha kararlı bir yapıdalar ise reaksiyon ileri doğrultuda ilerler.
Reaksiyonlarda, reaktanların ürünlere dönüştürmeye yatkın olup olmadığını tespit eden iki faktör vardır: Bu iki faktör entalpi ve entropi olarak adlandırılırlar.

Basit olarak entalpi bir maddenin ısı içeriğidir (H). Çoğu insan ısının ne demek olduğunu çok iyi hatırlar. Çocukken, mutfaktaki ocaklara yanarken dokunmamayı öğreniriz. Ancak Entalpi oradaki ısıyla aynı değildir. Maddenin taneciklerinin iç enerjilerinin hepsi ve hacminin basıncıyla çarpımının toplamına eşittir. Entalpi aşağıdaki denklemle tanımlanabilir:

  
    
      
        H
        =
        U
        +
        P
        V
        
      
    
    {\displaystyle H=U+PV\,}
  

H entalpidir
U iç enerjidir (joule cinsinden)
P dizgenin basıncıdır(Pascal cinsinden)
ve V hacimdir, (metre küp cinsinden)
Eğer reaktanlar ürünlere dönüşürken entalpi azalırsa (ΔH < 0) bu, ürünlerin entalpisinin reanktanlardan daha az olduğu anlamına gelir ve enerji ortama verilir. Bu reaksiyon türü ekzotermik olarak adlandırılır. Çoğu biyokimyasal olayların sürecinde hacim veya basınçta olan değişiklikler ufaktır, yani tepkime sırasında entalpide olan değişiklikler genellikle dizgenin iç enerjisindeki değişimi yansıtır. Bu nedenle, biyokimyadaki ekzotermik tepkimeler çıkanların (ürünler) enerjisinin girenlerin enerjisinden daha az olduğu süreçlerdir.
Mesela, glikoz ve oksijenin karbondioksit ve su veren tepkimesini düşünün. Reaktanlara bağlı olan dizgenin iç enerjisini düşürerek ürünlerde güçlü bağlar oluşur. Bu çok fazla ekzotermik (ısıveren) bir tepkimedir. Öyle ki yanan her mol glikozdan 2805 kJ enerji açığa çıkar (ΔH = -2805 kJ/mol). Bu enerji ısı enerjisi olarak ortama verilir.  

Entropi (sembolü S) düzensizliğin ölçüsüdür.  Bir dizgenin yüksek ihtimalli istatistiksel olasılıklarını gösterir, yani bu kavramın çok geniş kapsamlı uygulamaları vardır. Kimyanın tüm dallarında, entropi, reaksiyonun ilerleyip ilerlemeyeceğini tespit etmede önemli bir yere sahiptir. Bunu tespit ederken, düzenliliği seyrek olan dizgeler düzenliliği daha fazla olan dizgelerden istatistiksel olarak daha olasıdır, ilkesini temel alır.
Bu ne anlama geliyor? Eğer Mt. Vesuvius volkanı Roma İmparatorluğu dönemindeki bir Akdeniz kentinde patlasaydı, volkanın şehri yıkması mı yoksa bir çift gökdelen dikmesi mi daha muhtemel olurdu? Ne olacağı (ya da ne olduğu) çok bariz ortada; çünkü doğa olayları düzensizlik oluşturmaya (yıkım), sıraya koymadan (yapım, veya bu durumda, gökdelenler) daha yatkındır. Entropi sadece bu temel farklılıkları anlatmanın matematiksel bir yoludur.
Konu kimyaya geldiğinde, entropi kavramına dayalı üç temel kavram vardır:

İntramoleküler (Molekül içi) durum (Serbestlik derecesi)
Molekülün sahip olduğu ileri serbestlik derecesi (moleküllerin uzayda hareket edebilme derecesi); ileri düzensizlik derecesi ve dolayısıyla da daha fazla entropi anlamına gelir.
Moleküllerin uzayda hareket edebilmeleri için üç yol ve her birinin de bir ismi vardır: dönme = bir eksen etrafındaki hareket, titreşim = çift bağlı atomlar arasında birbiriyle bağlantılı olarak gerçekleşen molekül içi (intramoleküler) hareket, ve  öteleme = bir molekülün bir yerden başka bir yere hareketi.
İntermoleküler (Moleküllerarası) yapılar
Moleküller kovalent olmayan bağlar üreterek birbirleriyle etkileşebildiklerinde, çoğu zaman bir yapı oluşmuş olur.
Moleküller arasındaki böyle bir bağ, her iki tarafın hareketini stabilize ettiği ve rasgele dağılım ihtimallerini azalttığı zaman  bu yağılar düzensizliği (ve dolayısıyla entropiyi) azlatmaya yönelir.
İhtimallerin sayısı
Mevcut molekül sayısı daha fazla olunca, molekülleri uzayda dağıtmanın daha fazla yolu olur ve bu istatistiksel olasılıklara göre düzensizlik için daha fazla potansiyel olduğu anlamına gelir.
Ayrıca eğer uzayda, molekülleri dağıtmak için daha fazla kullanılabilir alan mevcutsa, düzensizlik aynı sebepten dolayı artar.
katı madde (en az entropi) << sıvılar << gazlar (en fazla entropi)
Entropideki değişiklikler ΔS olarak belirtilir. Yukarıda belirtilen nedenlerden dolayı (volkan olayı), entropinin artışı (ΔS > 0) genel olarak evreni ilgilendirdiği kadarıyla yatkın olarak kabul edilir. Tepkime dizgesindeki enerjik bir bölüm entropideki azalmayı telafi etmedikçe entropideki bir azalma genellikle yatkın değil olarak kabul edilir. (bknz: serbest enerji (aşağıda)).

Entalpi (ΔH) ve entropideki (ΔS) değişikliklerin ikisi birlikte bir tepkimenin ne kadar yatkın olduğuna karar verir. Örneğin, bir parça odun yanarken enerji verir (ekzotermik, yatkın) ve sonucunda seyrek yapılı maddeler oluşur (CO2 and H2O gazı, ikisi de katı odundan daha az 'düzenli'dir). Dolayısıyla, bir parça odun ateşe konulunca bitene kadar yanmaya devam eder, denilebilir. Bu gerçek de o maddenin Gibbs Serbest Enerjisindeki değişikliğe bağlanabilir. 
Bir tepkimenin, her yönden yatkınlığı ilk olarak seçkin bir kimyager olan Josiah Willard Gibbs tarafından bir tepkimenin serbest enerjisi

ΔG = ΔH - T ΔS (T sıcaklığı Kelvin sıcaklık ölçeğine göredir)
şeklinde tanımlanarak açıklanmıştır. Yukarıdaki formül basıncın ve sıcaklığın tepkime süresince sabit kaldığını varsayar. Bu hemen hemen her zaman biyokimyasal tepkimeler için geçerlidir ve bu nedenle bu kitap da aynı varsayımı uygulamaktadır.
SI sistemlerinde ΔG (Gibbs için) birimi "joule"dür; ancak "calori" birimi de suyun özellikleriyle yakın ilişkisi nedeniyle sıklıkla kullanılır. Bu kitap uygun olan iki birimi de kullanacaktır; ancak tercih SI birimlerinden yana olmalıdır.

Eğer ΔG < 0 ise reaktanlar ürünlere dönüşür (ileri yönde bir tepkime gerçekleşir). (Gibbs serbest enerjisi bir tepkimenin oranı hakkında hiçbir şey söylemez, sadece onun ihtimalini söyler) Benzer şekilde, eğer verilen bir tepkimede ΔG > 0 ise tepkime ters yönde gerçekleşmeye yatkındır. ΔG = 0 olan bir durum denge (equilibrium) olarak adlandırılır ve tepkimenin ileri ve ters yönde gerçekleşme oranları eşit olan, dolayısıyla dizgeye olan net etkiyi değiştirmeyen bir durumdur.

Denge durumu en iyi nasıl açıklanabilir? Pekala, en saf ve genç akrabanız (yeğen veya kuzeniniz işinizi görür) ile birlikte oturma odasındaki halıya oturun. Bir Monopoly setini çıkarın, kendinize bir tane on dolar alın ve geri kalanı küçük akrabanıza verin. Şimdi, ikiniz de birbirinize, sahip olduğunuzun 5%'ini verin. Sonra bunu tekrarlayın, ve yeniden, yeniden, yeniden-yeniden ta ki sonunda ikinizin de paraları eşit olana kadar. İşte bir tepkimenin denge durumu da tamamıyla böyledir, yine de nadiren, denge durumunda ürünler ve reaktanların dağılımının 50-50% olduğu düşünülür. 

 
ΔG reaktan ve ürünlerin dağılımına göre doğal olarak çeşitlilik gösterir.  ΔG sıfıra ulaştığında, daha fazla tepkime oluşmaz; bu durum kimyasal denge noktası olarak adlandırılır. Sizin ve küçük saf akrabanız, ayrı ayrı Monopoly parası kazanma ve kaybetmeyi kestiniz; ikiniz de her turda eşit miktarda para değişimi yapmaya devam edin.  
Küçük ΔG (bu, sıfıra yakın bir ΔG değeridir), bir tepkimenin bir noktaya kadar ters dönebilir olduğunu gösterir; tepkime, ürünleri reaktanlara dönüştürerek geri dönebilir. Çok büyük bir ΔG (bu ise, ΔG >> 0 veya ΔG << 0) demektir) ise bir öncekinin tam tersidir; çünkü bu durum verilen tepkimenin tersinmez olduğunu gösterir, diğer bir deyişle, reaktanlar ürünlere dönüştüğünde yeniden reaktanlara dönüşecek çok az molekül vardır.

Tükettiğimiz gıdalar hücremizin bir parçası (DNA, proteinler vb.) olabilmek için birtakım işlemlerden geçerler. Eğer biyokimyasal tepkimeler tersinir olsaydı, kısa bir süreliğine yemek yemeyi kesersek kendi DNA'mız yeniden gıda moleküllerine dönüşürdü. Bunun olmasını engellemek için, metabolizmamız, metabolik yolaklar olarak düzenlenmektedir. Bu yolaklar tamamıyla tersimez olan biyokimyasal tepkime dizilerinden oluşur. Bir yolağın tepkimeleri bir sırayla gerçekleşir ki bu sırada, birinci tepkimenin ürünleri ikinci tepkimenin reaktanları (tepkenleri) olur ve bu şekilde devam eder:

A ⇌ B ⇌ C ⇌ D ⇌ E
Bu tepkimelerin en az biri tersinmez olmak zorundadır, örneğin:

A ⇀ B ⇌ C ⇌ D ⇀ E
Tersinmez aşamaların (örneğin A → B) kontrol altında tutulması, bütün yolağın ve dolayısıyla da ortaya çıkan ürünlerin yanı sıra tepkimeye giren reaktan (tepken) sayısının da hücre tarafından kontrol edilebilmesine olanak tanır.  
Bazı metabolik yolaklar "dönüş yolu"na sahiptir; ancak geri dönüş, yolağın normal ilerleme yolunun tam olarak tersi değildir. Onun yerine, varolan yolağın tersinir aşamalarını kullanırken, tersinmez tepkimelerin en az biri, başka bir tersinmez tepkime tarafından E'den A'ya geri dönme yolunda köprülenir:

E ⇀ X ⇌ C ⇌ B ⇀ A
Bu tepkime, hücreye o an işleyen yolağın yönünü seçme izni vererek kendi kendine yönetilir.

ΔG için, bir tepkimenin serbest enerjisi, standart koşullar tanımlanmıştır:

1M'de reaktanların ve ürünlerin konsantrasyonu
25°C sıcaklık
asitlik derecesi, pH 7.0
Bu standart koşullar altında, ΔG0', standart serbest enerji değişimi olarak tanımlanmıştır.
Bir tepkime için

A + B ⇌ C + D
ürünlerin reaktanlara oranı keq' (7.0 pH'ta =keq) tarafından verilir:

  
    
      
        
          k
          
            e
            q
          
          
            ′
          
        
        =
        
          
            
              u
              r
              u
              n
              l
              e
              r
            
            
              r
              e
              a
              k
              t
              a
              n
              l
              a
              r
            
          
        
        =
        
          
            
          

Glikoliz, glikozun iki piruvat molekülüne parçalandığı süreçtir. Glikoliz yolağının iki aşaması vardır: enerji yatırım aşaması ve enerji üretim aşaması. Glikolizdeki ilk beş adım, gliseraldehit 3-fosfatın üretildiği enerji yatırımı "hazırlık aşaması" dır. Enerji üretim aşaması "ödeme fazı", ise sonunda iki piruvat molekül oluşan glikolizin son beş basamağı kapsar. Glikoliz sitoplazmada meydana gelir ve oksijen yokluğunda da gerçekleşebilir. Vücutta, glikoliz için glikoz kaynağı diyet disakaritlerinden ve monosakaritlerden gelir.
Glikoliz, süreci glukozun karbondioksit ve suya dönüşmesini kapsayan karbonhidrat metabolizmasının ilk adımdır. Glikozun karbondioksite tamamen yükseltgenmesi sona erdiğinde, büyük miktarda enerji ATP'ye dönüştürülmüş olur.
Glikoliz sırasında, iki NADH molekülü ve net iki ATP molekülü üretilir (yolağı başlatmak için iki ATP molekülü kullanılır, ancak daha sonra dört molekül sentezlenir). Böylece, iki piruvat molekülüne dönüştürülen her glikoz molekülü için iki ATP molekülünün net üretilmiş olur.
Glikoliz işlemin sonunda, tüm glikoz enerjisinin sadece küçük bir kısmı serbest bırakılır ve potansiyel enerjinin geri kalanı, piruvat moleküllerinde kalır. Pirüvat molekülleri ilk önce asetil-CoA'ya dönüştürülür. Daha sonra  asetil-CoA TCA döngüsüne girer. TCA' da NADH ve FADH2 üretiminin yanı sıra karbondioksit çıkışı gözlenir. TCA döngüsünden elde edilen NADH ve FADH2, oksidatif fosforilasyon yoluyla ATP üretmek için ETS (Elektron Taşıma Sistemi)' ye girer.  Bahsi geçen bu metabolik adımlar aerobik metabolizmayı, anaerobik  (oksijensiz) metabolizmadan çok daha verimli kılar. Bu verimlilikte bugün aerobik canlıların anaerobik canlılara kıyasla neden baskın konumda olduğunu açıklar vaziyettedir, ancak yine de belli fizyolojik koşullar altında hayvanlarda bile anaerobik reaksiyonlar gerçekleşmektedir.

Glikoliz, altı karbonlu şekerlerin, ADP' yi ATP'ye dönüştürmek için kullanılan enerjinin serbest bırakılmasıyla, üç karbonlu bileşiklere bölündüğü karbonhidratların katabolizmasının merkezi bir yolağıdır. Glikoliz, hem anaerobik hem de aerobik koşullar altında ilerleyebilir.
Glikoliz, glikozu 2 piruvat molekülüne dönüştüren 10 aşamalı bir yolaktır. Genel Glikoliz net bir denklem olarak yazılabilir:
Glikoz + 2ADP + 2NAD+ → 2Pirüvat + 2ATP + 2NADH

Adım 1: Glukokinaz (heksokinaz IV) veya diğer heksokinazların glikozu 6. karbonundan fosforlaması

Hücreye giren glukoz sadece bir kadere sahiptir: tipik bir kinaz reaksiyonu ile glikoz 6-fosfata dönüştürülür. Glikoz fosforile edildiğinde, hücrenin içinde tutulur çünkü 6. karbondaki fosforil fosfolipid membranı iter, böylece glukoz 6-fosfat plazma zarına yaklaşamaz bile.
ATP, fosforil grubu deposu olarak kullanılır. Mg2+ enzimin kofaktörü olarak görev alır. Mg2+ 'nın varlığı ATP' nin fosforili üzerindeki negatif yükü kapatır. Böylece bileşik ATP ile daha kolay bir şekilde yakınlaşır.
Reaksiyonda, bir pirofosfat bağı parçalanır (-7.5 kcal/mol) ve bir fosfat ester bağı oluşur (+3 kcal/mol), bu da net -4.0 kcal/mol enerji ile sonuçlanır. Buradan yola çıkarak, ürünün (glikoz 6-fosfat), reaktanttan (glikoz) daha az enerjiye sahip olduğu sonucuna varılabilir. Daha az enerji, daha fazla kararlılık anlamına gelir. Bu nedenle, ürün reaktandan daha kararlıdır. Bu durum reaksiyonu geri döndürülemez hale getirir yani reaksiyon tek yönlü çalışır.

Adım 2: Glukoz 6-fosfatın Fosfoglukozomeraz aracılığı ile izomerleştirilmesi

Bu dönüşüm geri dönüşümlüdür (çift yönlüdür). 6C siklik bileşiği 5C siklik bileşiğe dönüştürmek suretiyle, iki eşit sayıda karbon içeren (3C) bileşiğe bölünebilen bir molekül üretilmesi amaçlanmaktadır.

Adım 3: Fosfofruktokinaz ile katalize edilen ikinci fosforilasyon reaksiyonu:

Bu adımın yardımı ile fosforil grubu açısından da dengelenmiş iki eşit karbon içerikli (3C) bileşiğe bölünebilecek bir molekül elde edilmiş olunur.
Yine Mg2+, enzimin kofaktörü olarak görev alır ve 1. adımda bahsedildiği gibi çalışır.
Bu reaksiyon negatif δG0' ye sahiptir ve tek yönlü çalışır.

Adım 4: Aldolaz ile katalize edilen iki trioz fosfata bölünme:

Bu adımda iki tane 3C' li bir fosforlu bileşik üretilir.

Adım 5: Trioz fosfat izomeraz ile katalize edilen dihidroksiaseton fosfatın izomerleştirilmesi:

Bu adımdan sonra her reaksiyon iki kez meydana gelir çünkü daha ileri adımlar için 2 adet gliseraldehit-3-fosfat molekülü mevcuttur.

Adım 6: Gliseraldehit-3-fosfat dehidrogenazın katalizörlüğünde 1,3-bifosfolgliseratın üretilmesi:

Burada, daha sonraki adımda ATP' yi oluşturmak için ADP'ye aktarılacak olan fosforil grubunun yerleştirilmesi amaçlanmaktadır. Ayrıca bu adımda NADH üretimi de olur.

Adım 7: Fosfogliserat kinaz ile katalize edilen substrat düzeyinde fosforilasyon yoluyla 3-fosfogliserat üretimi:

ATP'nin üretildiği ilk adım 7. adımdır.

Adım 8: Fosfogliserat mutaz tarafından katalizlenen 3. karbondan 2. karbona 3-Fosfogliseratın fosfat transferi:

Bu reaksiyonun sayesinde 8. adım ürünü olan PEP' de rezonans elde edilir.

Adım 9: Enolaz tarafından katalize edilen fosfoenolpirüvatın sentezi:

Su çıkışı gözlenir.

Adım 10: Piruvat kinaz tarafından katalizlenen piruvat sentezi:

Substrat düzeyinde fosforilasyon ile ATP üretimi meydana gelir. Pirüvat enol formundan keto formuna çabucak ve enzim yardımı olmasızın tautomerize (bir tür rezonans) olarak kararlılık kazanır. Bu adım glikolizin son ve tek yönlü adımlarından biridir.

Nelson, D. L., & Cox, M. M. (2008). Glycolysis, gluconeogenesis, and the pentose phosphate pathway. Lehninger Principles of Biochemistry, 4, 521-559.
Berg JM, Tymoczko JL, Stryer L. Biochemistry. 5th edition. New York: W H Freeman; 2002. Chapter 16, Glycolysis and Gluconeogenesis.

Metabolizma (Şekil 1) yaygın tabirle besinin enerjiye, hücre yapılarına ve atık ürünlere dönüşümüdür.

Şekil 1: Metabolizmaya genel bakış
Yukarıdaki diyagram metabolizmanın farklı parçalarını göstermektedir:

enerji kaynağı, her şeyden önce, enerjisi fotosentez yoluyla kullanılan güneştir.
katabolizma, besinin kimyasal enerjiye yıkımıdır.
anabolizma, küçük çevresel moleküllerden kimyasal enerjiyi kullanarak karmaşık hücresel moleküllerin üretimidir.
Katabolik tepkimeler enerji açığa çıkartır, bu yüzden egzergonik (enerji veren) olarak tanımlanırlar; fakat anabolik tepkimeler enerjiyi tüketirler ve bu yüzden endergonik (enerji alan) olarak tanımlanırlar.

Besin bileşenlerinin çok çeşitli olması ve anabolizmada enerjiye ihtiyaç duyan biyokimyasal tepkime sayısının fazla olması sebebiyle belirli bir anabolik tepkimeyi, katabolizmadaki belirli bir enerji kaynağıyla eşleştirmek oldukça yetersiz olacaktır. Onun yerine hücre, bir ara bileşik, bir çeşit evrensel enerji birimi kullanır. Bu ara madde yüksek enerjili fosfat olarak adlandırılır.
Ancak bir fosfat rubu ne zaman "yüksek enerjili" olur, "düşük enerjili" fosfatla aralarındaki fark nedir? Açığa çıkan şey hidrolizin ΔG0'sidir. Hidroliz bir bileşikten su ekleyerek fosfatı ayırır:

   O                      O
R-OP-OH + H2O ⇌ R-OH + HO-P-OH
   O                      O

Düşük enerjili (inorganik) fosfatın ΔG0''ı (Pi olarak adlandırılır) 9-20 kJ mol-1'dir, fakat yüksek enerjili fosfatın (Ⓟ ile gösterilir) ΔG0''ı ~30 kJ mol-1'dir.

Ⓟ'ı bu kadar özel yapan şey nedir? Bunu açıklamak için, pH ve pKa değerlerininin ne olduğuna bakmalıyız. Bir fosfat grubu sıfırla üç arasında OH grubuna sahiptir. Bu da Ⓟ'a, içinde bulunduğu çözeltinin pH grubuna bağlı olarak dört farklı formda (0, 1, 2 ve 3 OH grubu içeren, Şekil 2) bulunma olanağı verir. pKa değeri ise moleküllerin yarısı bir formda (mesela bir OH grubu içeren) diğer yarısı da başka bir formda (mesela 2 OH grubu içeren) ikenki pH değeridir. Bu Henderson-Hasselbalch eşitliği ile ifade edilir:

  
    
      
        
          p
          H
        
        =
        
          
            p
            K
          
          
            a
          
        
        +
        l
        o
        g
        
          
            
              [
              b
              a
              z
              ]
            
            
              [
              a
              s
              i
              t
              ]
            
          
        
      
    
    {\displaystyle {pH}={pK}_{a}+log{[baz] \over [asit]}}
  

Şekil 2: Bir fosfat grubunun dört formu pKa2 hücre içindeki koşulları temsil eder.
Peki Ⓟ ve PPi' nin birbirlerinden farkı nedir? Bir ROⓅ'nin ester bağının kırılması, bir PPi bağının kopmasından daha fazla enerji açığa çıkarır (Şekil 3). Bunun sebepleri vardır:

PPi deki iki fosfat grubu arasındaki elektrostatik itme
PPi ile karşılaştırıldığında iki Pi grubunun rezonans stabilizasyonu (Şekil 4)

Şekil 3: Ⓟ ve PPi'nin hidrolizi

Şekil 4: Pi'nin rezonans stabilizasyonu
Rezonans stabilizasyonu, hem OH hem de =O'nun fosfat etrafında "hareket edebileceği" anlamına gelir. Elbette bu kaba bir benzetmedir; gerçekte hareket etmezler, elektronlar sadece fosfat atomunun etrafına "bulaşır". Bu aynı zamanda ⇌ yerine ↔ okunun kullanılmasıyla da gösterilir; üç form aslında gerçekte mevcut değildir, sadece kimyasal gerçekliği yazmanın bir yoludur.
Şekil 3'te görebileceğiniz gibi, PPi⇌2Pi için ΔG0 değeri ≪0'dır ve reaksiyonu 2Pi lehine kaydırır.

Hidroliz : ΔG0' = -49.3 kJ mol-1

Hidroliz : ΔG0' = -43.0 kJ mol-1

Örneğin, fosfoenolpiruvat
Hidroliz : ΔG0' = -61.9 kJ mol-1

Adenozin trifosfat, bir düşük enerjili ve iki yüksek enerjili fosfat bağı içerir:

Düşük enerji : ΔG0' = -14,2 kJ mol-1
Yüksek enerji : ΔG0' = -30.5 kJ mol-1

ATP, ADP (adenozin difosfat), Pi ve enerjiden (gıdalardan) yeniden üretilir; İşlem sırasında H2O salınır.
ATP, hücrenin kısa vadeli enerji "para birimi" dir.
Hücredeki ATP konsantrasyonu düşüktür (ATP: 2-8mM; ADP: 0,2-0,8mM). ATP döngüsü yüksek seviyelerde sürdülür.
ATP, kimyasal işini eşli reaksiyonlar yoluyla gerçekleştirir.
Eşli reaksiyonlar her zaman Ⓟ transferleridir, asla doğrudan hidroliz değildir.
Temel olarak, ATP kaynaklı herhangi bir reaksiyon tersine çevrilebilir ve süreçte ADP ve Pi'den ATP oluşturur. Ancak, bazı ATP kaynaklı reaksiyonlar asla tersine çevrilmemelidir; bunlar nükleotid ve protein sentezini içerir. Bunlar tersine çevrilirse, organizma enerji için kendi DNA'sını ve proteinlerini parçalara ayıracaktır, bu oldukça talihsiz bir strateji. Asla tersine çevrilmemesi gereken reaksiyonlar için ATP, AMP (adenozin monofosfat) ve PPi'ye -ve PPi'de 2×Pi'ye- bölünebilir. Bu reaksiyon, in vivo koşullar altında tamamen geri döndürülemez olan -65,7 kJ mol-1'lik bir 'G0' değerine sahiptir.
AMP'nin tekrar doğrudan ATP'ye dönüştürülemeyeceği unutulmamalıdır. Bunun yerine, AMP kinaz enzimi, bir ATP ve bir AMP'den iki ADP molekülü oluşturur. Ortaya çıkan ADP'ler daha sonra yukarıda açıklandığı gibi işlenir.

Kovalent bağların yok edilmesi büyük miktarda enerji gerektirir. Bir O 2 molekülünün iki oksijen atomuna parçalanması için ~ 460 kJ mol -1 gerekir. Bu nedenle, "canlı" biyokimyanın hiçbir yerinde kovalent bağlar gerçekten yok edilemez; biri kırılırsa bir başkası oluşturulur. Bununla birlikte, birçok biyokimyasal fonksiyon, zayıf/ ikincil/kovalent olmayan bağlar olarak adlandırılan bağları kullanmaktadır.
Zayıf bağlar, kovalent bağlardan çok daha kolay oluşturulur ve yok edilir. Zayıf bir bağı yok etmek için gereken tipik enerji aralığı 4-30 kJ mol-1'dir. Bu nedenle, zayıf bağların oluşumu enerji açısından elverişlidir, ancak bu bağlar aynı zamanda kinetik (termal) enerji (moleküllerin normal hareketi) tarafından da kolayca kırılır. Biyokimyasal etkileşimler genellikle geçicidir (örneğin, bir substrat, işlendikten hemen sonra bir enzimi terk etmelidir) ve zayıf bağların zayıflığı bu tarz etkileşimlerde çok önemlidir. Ayrıca, biyokimyasal özgüllük (örneğin enzimin substratı tanıması), zayıf bağların temel özelliklerinden ikisi kullanılarak elde edilir:

Bireysel zayıf bağlar zayıf olduklarından, birçoğunun aynı zamanda kabaca aynı yerde belirli bir modelde meydana gelmesi gerekir.
Zayıf bağlar kısa menzillidir.
Üç temel zayıf bağ türü ve dördüncü bir "sözde bağ" vardır:

İyonik bağlar, kalıcı olarak yüklü gruplar arasındaki elektrostatik çekimlerdir. İyonik bağlar yönlendirilmez. Misal:

X-CO2- ..... H3+N-Y
~ 20 kJ mol-1

Hidrojen bağları da elektrostatik çekimle kurulur, ancak kalıcı olarak yüklü gruplar arasında değil, bir grup içindeki atomların farklı elektronegatifliği 'nden kaynaklanan geçici olarak bir "dipol moment" ile yüklenen atomlar arasında oluşurlar. Hidrojen bağları iyonik bağlardan bile daha zayıftır ve genellikle düz bir çizgi boyunca oldukça yönlüdür. Biyokimyadaki en yaygın hidrojen bağları şunlardır:

X-OH ..... O-Y
X-OH ..... N-Y
X-NH ..... O-Y
X-NH ..... N-Y
Hidrojen bağları, 12-29 kJ mol-1 arasında bir enerjiye sahiptir.

Van der Waals etkileşimleri, elektron yoğunluğunun neden olduğu dipoller arasında kurulmuştur. İki atomun dış elektron kabukları neredeyse (ama tam olarak değil) temas ettiğinde oluşurlar. Bu zayıf etkileşimler için atomların uzaklığı çok önemlidir. Atomlar birbirinden çok uzaksa, etkileşimler kurulamayacak kadar zayıftır; atomlar birbirine çok yakınsa elektron kabukları birbirini iter. Van der Waals etkileşimleri oldukça belirsizdir; hemen hemen her iki atom arasında meydana gelebilirler. Enerjileri 4-8 kJ mol-1 arasındadır.

Hidrofobik kuvvetler gerçekte bağ değildir, bu nedenle bu listede dört öğe vardır, ancak yine de yalnızca üç bağ türü vardır. Su gibi polar bir çözünen madde için, polar olmayan bir molekülle olası bir hidrojen bağı kurmak enerjik olarak elverişsizdir. Bundan dolayı su, polar olmayan herhangi bir molekülün etrafında, o moleküle hiçbir hidrojen bağı göstermeyecek şekilde kendisini düzenler. Bu, "serbestçe" hareket eden suya kıyasla daha düzenli bir su ile sonuçlanır, bu da daha düşük bir entropi düzeyine yol açar. Bu durum enerji açısından elverişsizdir. Çözünen madde içinde birden fazla apolar molekül varsa, apolar moleküller tek bir yerde toplanarak su ile temas alanlarını minimize ederler. Ayrıca, proteinler gibi büyük moleküllerde, molekülün hidrofobik (apolar) kısımları içe doğru dönerken, polar kısımlar molekülün yüzeyine doğru dönme eğiliminde olur.

Cooke, Rosa-lee. Properties of Water. Lecture 10. Mountain Empire Community College. n.d. Web. http://water.me.vccs.edu/courses/env211/lesson10_print.htm
Kimball, John W.. Hydrogen Bonds. Kimball’s Biology Pages. Feb. 12, 2011. Web. http://users.rcn.com/jkimball.ma.ultranet/BiologyPages/H/Hbonds_water.gif
Lower, Stephen. States of matter: Water and hydrogen bonding. General Chemistry Virtual Textbooks. 2009. Aug. 26, 2010. Web. 
http://www.chem1.com/acad/webtext/states/water.html
n.p. Covalent vs. Non-Covalent Bonds. n.d. http://www.pearsonhighered.com/mathews/ch02/c02cv.htm
W. W. Norton & Company. Hydrogen Bonding in Water. Web. 2012.  http://www.wwnorton.com/college/chemistry/gilbert2/tutorials/chapter_10/water_h_bond/
WyzAnt Tutoring. WyzAnt Tutoring. Bonds. 2012. Web. http://www.wyzant.com/Help/Science/Chemistry/Bonds/

Proteinler biyolojinin temel moleküllerindendir.
Dünya'daki bütün yaşam formlarında ortaktır.
Yaşamı mümkün kılan çoğu karmaşık fonksiyonu vardır.
Canlıların yapılarının büyük bir kısmını oluşturur.
Bilgi DNA'dan RNA'ya oradan da proteine aktarılır bu moleküler biyolojinin Santral Dogma'sıdır.
DNA sentezlenecek proteinin gereken bilgisi için depolama alanı olarak işlev görür.
RNA bilginin translasyon ile proteine aktarılmasından sorumludur.
Canlı hücrelerde neredeyse bütün kimyasal fonksiyonlardan enzim adı verilen protein bazlı katalizörler sorumludur, örneğin kimyasal bağların kurulması ve yıkılması.
Protein enzimleri ile benzer özellik gösteren bir grup makromolekülden oluşan RNA bazlı enzimler, protein enzimleriyle karıştırılmamalıdır.
Hücreleri ve organelleri tutan çoğu yapı protein yapılıdır.
Proteinlerin katalitik fonksiyonlarının yanı sıra hücre dışı ortamdan sinyal alabilme ve bu ortama sinyal verebilme, genetik materyali eşleyebilme, şaşırtıcı bir verimle ışık ve kimyasallardaki enerjinin dönüştürülmesine yardım etme, kimyasal enerjiyi fiziki işe çevirme ve hücre kompartımanları arasında molekülleri taşıyabilme özellikleri vardır.

Sistem biyolojisi ağ biyolojisi veya entegre biyoloji, biyomedikal ve biyolojik bilimsel araştırmalara uygulanan yeni bir yaklaşımdır. Sistem biyolojisi, biyolojik ve biyomedikal araştırmalara daha geniş bir perspektif (daha geleneksel indirgemecilik yerine bütüncülük) yaklaşımı kullanarak, biyolojik sistemler içindeki karmaşık etkileşimlere odaklanan, biyoloji temelli disiplinlerarası bir çalışma alanıdır. Bu yaklaşıma göre, gen (veya ilgilenilen herhangi bir molekül) ve onun ürünü (veya kofaktörler, haberci moleküller ve metabolitler gibi daha küçük moleküller) “düğümler” olarak görülmektedir. Düğümler arasındaki bağlantı, fiziksel bir etkileşim, enzimatik reaksiyon veya fonksiyonel bir bağlantı olabilen bir ilişkiyi temsil eder. Bu sistem hem iç hem de dış kaynaklı bozulmaların fenotipi etkilediğini varsaymaktadır. Kütle spektrometresi (MS), protein etkileşimli ağlar gibi ağ kablolamasını tanımlamak için kullanılır. Özellikle 2000 yılından bu yana, bu yaklaşım konsept biyoloji bilimlerinde çeşitli bağlamlarda yaygın olarak kullanılmıştır. Sistem biyolojisinin yayılma hedeflerinden biri, ortaya çıkan özellikleri, hücrelerin özelliklerini, doku ve sistemlerin, teorik tanımlaması ancak sistem biyolojisi kapsamına giren teknikleri kullanarak mümkün olan, bir sistem olarak işleyen organizmalarını modellemek ve keşfetmektir. Bunlar tipik olarak metabolik ağları veya hücre sinyal ağlarını içerir. Sistem Biyolojisinin bazı önemli çıkarımları vardır: 1) biyolojik süreçlere bir bütün olarak bakılmasını gerektirir; 2) yeni fırsatlar sunar ve ileri hesaplamalı ve deneysel yaklaşımlar için teknolojiye bağlıdır.

Geçmişte, araştırmalar tipik olarak “moleküler biyoloji paradigması” olarak adlandırılan “bir gen-bir protein-bir fonksiyon” standardı içerisinde gerçekleştirilmiştir. 1) gen ve protein fonksiyonu arasında doğrudan bir bağ olduğunu ve genlerin ve bunların çeviri ürünlerinin biyolojik işlevi açıkladığını varsaymış bir zihniyettir 2) proteinlerin ayrı ayrı ve lineer bir formda (aşağı ve yukarı yönde) incelenir. Her ne kadar güçlü teknolojiler ve dikkat çekici teknik gelişmeler yapılmış olsa da, bir genotip-fenotip bağlantısı hala bir sorun olmaya devam ediyor

Proteomik çalışmaları için 'Kütle spektrometresi (mass spectrometry-MS'') kullanılır. Her bir biyolojik ihtiyacı ele almak için çeşitli stratejiler sunuldu; buradaki her bir strateji “toplam proteome alanının” sadece bir kısmıdır. Stratejiler:

• Shotgun / Keşif: bir örnekteki çok sayıda proteini tanımlayabilir, ancak en çok yalnızca en bol olanı saptayabilir
• Yönlendirilmiş: spesifik, önceden belirlenmiş protein setlerini tanımlar, tekrar edilebilirliği yüksektir
• Hedeflenen: yüksek tekrarlanabilirlik ve proteinlerin küçük, önceden seçilmiş bir kısmı için kesin, yüksek algılama hassasiyeti ve dinamik aralık sunar
• Veriye bağlı analiz (Data dependent analysis-DDA): yeni ortaya çıkmıştır, numunedeki tüm proteinleri tanımlamayı hedefler
Moleküllerin nicelendirilmesi ve tanımlanması için kullanılan teknolojilere ağların kenarlarının nicelendirilmesi ve tanımlanması ihtiyaç duyulmaktadır. Bu iki yolla hedeflenir: 1)doğrudan yaklaşım: kenarın, düğümün etkileştiği bir molekülü yüksek afinitesi ile yakalayarak ölçülmesi 2)dolaylı yaklaşım: molekül ve düğüm arasındaki bağı bir tahlil kullanarak anlamaya çalışan yaklaşım.

MS-tabanlı proteomiklerde iki tür ağ ayırt edilir: yönlendirilmemiş ağlar olan protein etkileşimli ağlar (protein interaction networks-PIN), yön tercihi yoktur ve protein sinyalleşme ağları (protein signaling networks-PSN), bunlar yönlendirilmiş ağlardır ve tercih edilen bir yöne sahiptir. PIN'ler, MS tabanlı temel proteomik ilgi alanlarından, protein-protein etkileşim ağlarından (protein-protein interaction networks-PPIN) ile örneklenebilir, çünkü bu ağlardaki düğümler ve kenarlar arasındaki doğrudan bağlantılar ölçülebilir. Bu tür ağları incelemek için, hedef proteinler ile etkileşen proteinleri yakalamak için hedef protein “yem molekülü” olarak kullanılır, yakalanan moleküller MS' te incelenir. PPIN'leri analiz etmek için, afinite saflaştırma kütle spektrometresi (affinity purification mass spectrometry/AP-MS) tercih edilir, çünkü PPIN'lerin çok yönlülük karmaşıklığını yansıtır. Daha sonra AP-MS verileri, iki veya daha fazla işlenmiş düğümün kenarlara bağlandığı, bir ağ oluşturduğu ve protein sinyalizasyon ağları (protein-signaling networks-PSN) çıkardığı yerde yorumlanır.
Pertürbasyon deneyleri, ücrede aktivasyon veya represyon gibi bir enzim aktivitesini değiştirmenin etkilerini görmek için yapılır. In vitro deneylerle karşılaştırma yeniden bağlanma ağına yeni bakış açıları kazandırabilir. İki tür Pertürbasyon vardır: çoğunlukla kenarları etkileyenler ve sonuç olarak kenarlarını etkileyen düğümleri etkileyenler. Fosforilasyon ağları bu deneyler ile yoğun bir şekilde çalışılmıştır, burada fosfateptidlerin bir kinaz inhibitörü ile negatif düzenlenmesi, ağın kinaza bağımlı olup olmadığını, ancak belki de kinazın aracılık ettiği sorusunu ortaya çıkarmaktadır.
Amaç, bir fenotip üretmek için ağların bu bilgiyi nasıl yakaladığını ve aldığını veya hücresel bir tepkiye neden olduğunu bilmektir. Ağ kablolarının fenotiplere bağlanması, statik PPIN'lerin birleştirilmesiyle yapılır.
Genel Yol Haritası
1) Önceki çalışmalardan başlatılan düğüm ağını tanımlanır.
2) Ağ bileşenleri dağıtılır ve deneysel verileri sunulur
3) Ağ modelini, ağdaki deneysel verileri ve fenotipleri geliştirmek için eldeki bilgiler kullanılır

Bu Z, Callaway DJ (2011). "Proteins MOVE! Protein dynamics and long-range allostery in cell signaling". Advances in Protein Chemistry and Structural Biology. Advances in Protein Chemistry and Structural Biology 83: 163–221
Bensimon A, Heck AJ, Aebersold R. Mass spectrometry-based proteomics and network biology. Annu Rev Biochem. 2012;81:379-405. Review. PubMed PMID 22439968.

Blender 3D: Çaylaktan Profesyonele sayısız takım arkadaşları ve anonim editorlerin  paylaştığı gayretlerin sonucu bir üründür.Amacı insanlara Blender kullanarak nasıl üç boyutlu bilgisayar grafiklerinin yaratılabileceğini öğretmektir.Blender bir özgür yazılımdır.
Kitabın, diğer çevrimiçi kaynaklarla birlikte kullanılması ve tamamlayıcı olması amaçlanmıştır:

Diğer Blender ile ilgili Wikikitapları mesela betik yazımı ve oyun tasarlama konuları
Blender Wiki teknik döküman.
Kullanıcı forumları, mesela Blender Artists Forum.
Sadece kitabı okuyabileceğiniz gibi, dersler aracılığıyla daha fazlasını öğrenebilirsiniz. Bunun için Blender kurulu bir bilgisayara erişiminiz olmalıdır.Blender'i Blender Vakfı websitesinden indirebilirsiniz. İlk ünitede daha detaylı bilgi verilmiştir.

Bu kitap temelde, giderek karmaşıklaşan ve her biri öncekilere eklenerek devam eden derslerden oluşmaktadır. Tecrübeli kullanıcılar bazı bölümleri atlayabilirler fakat yeni başlayanların dersleri sırayla takip etmeleri önerilir.
Temel serideki dersler dört üniteye ayrılmıştır:

Arka Plan — şunlarla ilgili basit bir ısınma:
Bilgisayar grafikleri
Blender kullanıcı arayüzü (UI)
Temel Modelleme ve Gölgeleme — 3d modelleri inşa etmek ve derlemek için temel teknikler
Ufukları Genişletmek
alternatif modelleme ve derleme teknikleri
Aydınlatma, modelleme ve oyun yapımına giriş
Kalkış
betik yazımı
modelleme, animasyon ve oyun yapımı için gelişmiş teknikler
Her ünite modüllerden oluşan bölümlere ayrılmıştır.
Ayrıca üç ek bölüm verilir:

Başvuru Materyali:
Sıkça-Sorulan-Sorular
Sözlük
Genel Tavsiye — Blender'dan daha fazlasını almak için ipuçları
Çeşitli Dersler — Ana serinin parçası olmayan dersler

Bu kitaba katkıda bulunmanızı şiddetle tavsiye ederiz! Yardım için yapabileceğiniz pek çok şey var:

Var olan modülleri değiştirmek (hataları düzeltmek, yazım şeklini geliştirmek ya da eklentiler yapmak)
Yeni modüller eklemek (dersler ya da referans materyali)
resim eklemek (ekran resimleri ya da örnekler)
Bu VikiKitaptan sorumlu takıma katılmak

Herhangi bir Wiki sayfasını değiştirmek için (bu dahil olmak üzere):

Sayfanın üst kısmındaki değiştir sekmesine tıklayın.
Büyük yazı kutusunda değişikliklerinizi yapın.
Aşağıdaki Özet kutusunda yaptığınız değişikliği açıklayın.
Özet kutusunun altındaki Önizlemeyi göster butonu ile değişikliklerinizi görün.
Sonuçtan memnunsanız, Sayfayı kaydet butonuna tıklayın.
Katkılarınız resmen yayınlanmadan önce kontrol edilecektir.
Modüllere eklememeniz gerekenler:

Modülle doğrudan alakalı olmayan dış bağlantılar
Yazıyla ilgili görüş ve sorularınız
Soru ve görüşleriniz için:

Sayfanın üzerindeki Tartışma Sekmesine tıklayın. Bu sizi ilgili konuşma sayfasına götürecek.
Eğer görüş veya sorunuz zaten tartışılıyorsa, ilgili bölümü düzenleyin.
Yeni bir konu açmak için, sayfanın üzerindeki Yeni konu ekle sekmesine tıklayın.
Mesajınızı, sonuna ~~~~ yazarak imzalayın.  (Bu sizin kullanıcı adınızı ve tarihi yazacaktır.)
Tamamladığınızda değişiklikleri kaydetmeyi unutmayın!
Vikikitap'a dönmek için, konuşma sayfasının üzerindeki Kitap sekmesine tıklayın.

Bu kitaba modül eklemek için (Ders veya referans sayfası gibi):

Aşağıdaki İçindekiler bölümüne and add açıklayıcı bir vikilink ile bir liste elemanı ekleyin.  (Bir ders oluşturuyor ve nereye ait olduğundan emin değilseniz, Diğer dersler bölümüne ekleyin.)
Değişikliklerinizi kaydettikten sonra, oluşturduğunuz kırmızı linke tıklayın ve modülünüzü oluşturup içerik eklemeye başlayın.
Kitabı okumayı kolaylaştırmak için, her modüle bir önceki ve bir sonraki modül için yünlendirme linkleri eklenir.  Bu linkleri, sayfanın başına ve sonuna (demo sayfasında belirtildiği gibi) NAV template yazarak oluşturabilirsiniz.  (Eğer modülünüzün sonradan taşınacağını düşünüyorsanız, bu aşamayı geçebilirsiniz.)
Sonucu önizleyin. Tatmin olduğunuzda Sayfayı keydet butonu ile modülünüzü Viki'ye ekleyin.
Eğer yönlendirme linklerini oluşturduysanız,(varsa) önceki ve sonraki sayfadakileri de düzenleyin.
Eğer oluşturmadıysanız, lütfen birinden modülünüzü doğru yere taşımasını isteyiniz. Örneğin bir tartışma sayfası açıp isteğinizi belirterek.

Resimler, Blender derslerinin çok önemli parçalarıdır. Tarifleri basitleştirirler, referans kaynağıdırlar ve öğrenme işlemini geliştirirler. Fakat, eğer resmin telif hakları doğru şekilde verilmemişse, kaldırmak zorundayız. Bu iyi bir dersin işe yaramaz hale gelmesine sebep olabilir. Hangi telif hakkını kullanacağınızı biliyor bile olsanız, Blender çıktısı telif hakları sayfasından faydalanınız. Lütfen eklediğiniz her resmin telif hakkına tabi olmadığından yahut sizin olduğundan emin olunuz.
Resim eklemeden önce:

Wikimedia Commons ya da the appropriate Commons category sayfalarına bakarak eklemek istediğiniz resmin önceden kullanılıp kullanılmadığını kontrol ediniz. (Aynı resmi eklemek kaynak israfıdır.)
Resim eklemeden önce (ikon ya da buton gibi) ya da bir resmi örnek olarak kullanmak istiyorsanız, resim portföyümüze bakınız.
If you use a Commons image in this WikiBook, please use one of the categories shown in the templates on proper Blender images copysağ to make it visible from the category links in the image portfolio.

Vikikitap takımımıza katılmak istiyorsanız, takım sayfasından bilgi edinebilirsiniz.

Yapmadan önce bilmek  ⇐ Burdan Başla
Blender neler yapabilir
Bölüm 1A: 3D Kavramları
3D Geometri 
Koordinat Dönüşümleri
Ortografik Görüntülemeler 
Perspektif Görüntülemeler 
Blender'da Koordinat Uzayları 
Bölüm 1B: Kullanıcı Arayüzü (UI)
Overview 
Keystroke, Button, and Menu Notation 
Non-standard Input Devices 
Operating System-specific Issues 
Blender User Interface 
Blender 2.5x User Interface
Blender Windowing System 
User Preferences Windows 
Buttons Windows 
3D View Windows 
Blender Memory Management

Section 2A:  Your First Mesh Models
Mesh nedir? 
Hızlı modelleme 
Hızlı render 
Kamera Prensibini anlama
Evini geliştirme
Section 2B:  Smooth Meshes (Simple Person with a Hat)
Extruding a Simple Person 
Smoothing Your Simple Person 
Improving Your Simple Person 
Spinning a Simple Hat 
Putting the Hat on the Person 
Section 2C:  Materials and Textures
Genel bakış  
Quickie Material 
Multiple Materials per Object
Görsel Dokuları 
Procedural Textures 
Quickie Texture 
Halo Materials 
Beyond Basics
A Common Pitfall in Older Tutorials (Align to View Issue)
Using Bones 
Mountains out of Molehills 
Modeling a Volcano 
Penguins from Spheres 
Die Easy 2 (Dice Modeling) 
Die Another Way (Dice Modeling for versions under 2.44) 
Model a Goblet
Model a Silver Goblet 
Model a Silver Goblet Another Way 
Spin a goblet
Light a Silver Goblet (Early look at lighting) 
Simple Vehicle 
Simple Vehicle: Wheel 
Simple Vehicle: Seat 
Simple Vehicle: Rocket Launcher 
Simple Vehicle: Body 
Simple Vehicle: Some Assembly Required 
Modeling a 3D Parachute in Blender 
Model a Low Poly Head 
Building a House 
Pipe joints 
Using Reference Photos
Aligning Vertices with a Guide Image 
Modeling a Fox from Guide Images  
Using Bezier Curve to Model a 3D logo from a 2D logo 
Curve and Path Modeling
overview  
Intro to Bezier Curves 
Curves in 3d 
Deforming Meshes using the Curve Modifier 
Modeling with Meta Balls 
Using Materials and Textures
Using Textures 
Using a texture to make a material partially transparent 
Creating Basic Seawater 
Mountains Out Of Molehills 2 
Basic Carpet Texture 
The Rusty Ball 
Procedural Eyeball 
Creating Pixar-looking eyes 
UV Maps
UV Map Basics 
Realistic Eyes In Blender 

Lighting
Beginning Lighting 
Understanding Real Lights 
Adding Lamps 
Faked Global Illumination with Blender internal 
Rendering
Render Settings  
Output Format Options 
OSA 
Looking All Around - Panorama Settings 
Other Important Render Options 
Yafray Render Options 
Stamping 
2D, Toon, & CAD Rendering  
Basic Animation
Overview
Screen Layout
Lattice Modifier 
Bouncing Ball with Lattice 
Creating Basic Water Animation 
Flying Through a Canyon 
Using the Sequencer to Compile Frames into an Animation 
External tutorial about regular 2D video editing, with lots of illustration. (keywords: sequencer, NLE)
Particle Systems
Overview
Fire 
Fur 
Fireworks 
Particles forming Shapes 
Billboard Animation 
Soft Bodies
Soft Body Animation 
Simple Cloth Animation
Soft Body with Wind 
Blender Game Engine
Blender Game Engine Basics 
Platformer: Controls and Movement 
Maze: Force and Multiple Levels 
Platformer: Improving the Physics 
How to Make an Executable 
Build a Skybox 
Basic Mouse Pointer 
Text in BGE 
Platformer: Creating the Engine with Python 

Python Scripting
Overview 
Introduction 
Blender 2.5x Scripting Introduction
Procedural Object Creation 
External Scripts
Creating a GUI for Your Script 
Export Scripts 
Import Scripts 
Scripts for Modifying Meshes 
Advanced Modeling
Overview
High Dynamic Range imaging (HDRi) 
Creating a Light Probe 
Landscape Modeling with Heightmaps 
Landscape Modeling I: Basic Terrain 
Landscape Modeling II: Texture Stenciling 
Landscape Modeling III: Exporting as a Heightmap 
Realistic Water using Fluid Sim and Yafray 
Advanced Materials and Textures
Bump Mapping 
Normal Mapping 
Texture Normals 
Color Map Normals 
Nodes: An Introduction 
Texture Nodes
Material Nodes
Compositing
Advanced Animation
Overview 
Introduction 
Guided Tour: 
Armature Object 
Armature Object in Object Mode 
Armature Object in Edit Mode 
Armature Object in Pose mode 
Mesh Object 
Connection between Armature and Mesh 
Envelope 
Vertex Groups & Weight Paint 
Shape Keys 
Lip-Sync with Shape Keys 
Constraints 
Copy Location 
Copy Rotation 
Track-To 
Floor 
Locked Track 
Follow Path 
Stretch-To 
IK Solver 
Timeline Window 
IPO Window 
Data Type 
NLA Window 
Introduction To NLA Editor 
The Stride feature 
Relative Vertex Keys 
Working Example: Bob 
Working example: Piston, Rod and Crank 
Working example: Cutting Through Steel 
Advanced Game Engine
Overview
Advanced Game Engine Techniques (GUI)
Creating Pop-Up Menus
Creating Dropping Menus
The "5-Layer" Button
Creating Object Outlines
Advanced Game Engine Techn

Blender 3B Viewport penceresi en çok vakit harcayacağınız yerdir. Blender 3B size dünyanızı nasıl göreceğinizin %100 kontrolünü verir. Buradaki bazı şeyler 3B Viewport'u nasıl kullanacağınızı öğretecektir.

Burada 3 boyutlu sahnenizi etrafta döndürebileceksiniz, dönen düzlemleri gördüğünüz gibi. Öntanımlı cismin aslında bir küp olduğunu göreceksiniz, yarısı X-Y düzleminin üstünde, diğer yarısı altında yer almaktadır.

Make sure the 3D Viewport window is active by placing the mouse pointer anywhere inside of it.
Hold down the MMB (Middle Mouse Button) and drag the mouse from side to side and up and down.
Hold ALT+LMB for the same effect (on some Window-managers on Linux this won't work, it'll only move the Window. You can change this behavior in most cases in the Window Manager's settings)
To rotate so that "upwards" stays "upwards", use CTRL+ALT+SCROLL
NOTE: if you have your own setting for the MMB in mouse configuration, you must reset this to use  the MMB as a real Middle Mouse Button (no Doubleclick or something else). Otherwise you must use the alternate ALT+LMB for the same effect.

If you're using a tablet pc or a graphics tablet, holding the ALT key while dragging your pen around will achieve the same effect.
The middle mouse button can be emulated on most Windows machines by simultaneously clicking the left and right mouse buttons. You'll need to set this up in the mouse settings in your Control Panel.
NOTE: for single button mouse users make sure that Emulate 3 Button Mouse is on in the View & Controls menu
It's a cube!  Holding down the MMB is the quickest and easiest way to rotate your view and get a new perspective on things.  Right now you're looking at the cube in what's known as Wireframe Mode.  Pressing ZKEY (yes, on your keyboard, the 'Z' key) will toggle back and forth between Wireframe Mode and Solid Mode. Pressing NUM5 while NUM LOCK is on will toggle between Orthographic and Perspective (perspective looks more natural).  This does not affect how your final product will appear, only the way you see your scene while you're creating it.
As you move the view around, you will see that there are three objects in your 3D scene by default:

Daha sonra bunların herbirini nasıl kullanacağınızı öğreneceksiniz.

[NOTE: If you are using a keyboard which doesn't have a numpad, e.g. a laptop, see laptop commands below.]
Holding the mouse over your 3D Viewport and pressing the NUM7, NUM1, and NUM3 buttons will bring you back to perfectly aligned top, front, and side views respectively. Pressing CTRL+NUM7, CTRL+NUM1, and CTRL+NUM3 will result in displaying the bottom, back, and other side views, respectively. Try each of these views, and watch the camera and light move around with respect to your new viewpoint (make sure your NUMLOCK is on.  Otherwise, this will not work).
Similarly, holding the mouse over a viewport and pressing NUM2, NUM4, NUM6, and NUM8 will rotate (by 15 degrees, which is customizable in the user preferences under "View & Controls") the view down, left, right, and up respectively.
The object the viewport orbits around can be changed to a new object by first selecting it with the RMB and then pressing NUM. (the period key on the numpad) or NUM, (the comma key on the numpad) on some keyboard layouts.
[NOTE: selecting an object with the RMB will only work if your viewport is set to 'Object Mode'. Press the TAB key to toggle between 'Edit Mode' and 'Object Mode'.]
Again, remember in Blender that there is a big difference between the number keys on your numberpad and the number keys along the top of the keyboard.  For example, NUM7 refers to the number 7 on the numberpad, while 7KEY refers to the number 7 that's above the YKEY and UKEY on the standard US keyboard.  If you accidentally pressed 1KEY, 3KEY, or 7KEY during this step and it appears that everything disappeared, you have been changing the layer that you are viewing instead, press the 'key (backtick key -- on US keyboards, this is the key to the left of the 1KEY) to return to viewing all the layers, or press the 1KEY to get back to viewing layer 1 which should have been originally active.
[NOTE: the 1KEY through 0KEY and alt-1KEY through alt-0KEY switch layers.  Hold shift to select more than one layer. `KEY selects all 20 layers.  Layers will be covered later.]

As previously mentioned in this tutorial, recent laptops (some PC and all recent Mac) have a set of regular keys (from M in the lower left to 9 in the upper right) with additional markings corresponding to a regular numpad. This behavior can be toggled with F6 or the key labeled num lock; this may require pressing FN+numlock key, for example FN+F11 on many notebooks.
If nothing else works, or as an alternative, you can temporarily activate the numpad behavior by holding the FN key (lower left corner of the keyboard) and using the keys as a numpad until you release FN. This allows convenient use of the numpad camera controls without interfering with the normal use of that set of keys.  Also you may pull down the User Preferences window, at the top (menu bar window), choose the "System and OpenGL" button, and click on "Emulate Numpad" to use the normal numbers as if they were the number keys on the pad (NUM0 == 0KEY at that point).
For simply rotating around the object, press Alt+LMB and drag.
If you envision using your laptop for this kind of work, or indeed any work involving numeric data inputting, it may be worth investing in a USB Numeric Keypad, as Blender uses the numeric keypad quite a bit.  Prices range from between $15 to $20 for a basic keypad.

To pan the view, you have your choice of alternatives:

SHIFT+MMB
SHIFT+ALT+LMB
—and move your mouse. Alternatively, if you have a scroll wheel you can use SHIFT+Scroll to pan up and down and CTRL+Scroll to pan left and right.
You also have choice of keyboard alternatives:

          CTRL+NUM8                NUM:      Up
CTRL+NUM4           CTRL+NUM6          Left      Right
          CTRL+NUM2                         Down

Panning is an important skill to master; try it now.
Note that you must press SHIFT before MMB, otherwise your view will rotate instead of panning.
Also note, that in Windows XP the simultaneous pressing of SHIFT+ALT is used to switch the keyboard layout (for example QWERTY becomes AZERTY and vice versa). So when you find your keyboard layout all messed up, press SHIFT+ALT again, until it fits.
Using SHIFT+MMB instead is recommended.

Zooming in and out the view is also important.  Again, Blender offers you several ways to do what you need to do:

If your mouse has a scroll wheel, scroll it.
CTRL+ALT+LMB and scroll up and down (not left or right)
CTRL+MMB
NUM+ and NUM-
Try these all out.  Can you see this being useful?

If you can, find a mouse with side buttons. Anything like Microsoft's Intellimouse, or Logitech's Mediaplay, that have back/forth buttons, will do. Map those buttons to the MMB. This makes camera control feel a LOT more intuitive (plus it frees up a finger).
Laptop users may also be able to configure the trackpad to act as a scroll wheel and middle mouse button while another mouse is plugged into the computer.  Something like this can be achieved on a Mac by enabling "Use two fingers to scroll" in the Keyboard and Mouse preference pane.

(Yet another reader: When you want the cursor back into the cube, just select the camera with RMB, put the cursor into the cube following the steps above, and re-select the cube with RMB.)
(Reader:- I've discovered it helps a lot if you are in Object Mode and not in Edit Mode. I wrote the following before discovering this:- The problem with this exercise, for me, is that left clicking on the cube selects the cube instead of moving the 3d cursor. If I click on the cube outside of its central white circle I can get the cursor to move there, but only to outside of this white circle, and even then this only works sometimes.)
(I failed at this until I had zoomed in close enough to the cube. When I was too far zoomed out I kept selecting the cube rather than creating an edit point. Another reader: I had the same problem and found it was because the cube was selected. I made sure I was in object mode, right clicked on the camera to select the camera instead of the cube, and I could then position the edit point in the cube. However, doing this messed up the next part of the tutorial because you cannot switch into edit mode with the camera selected! Perhaps the suggestion of trying to put the 3D cursor in the cube should be dropped as it raises too many questions at this stage.)
(Yet another reader: you can deselect all by pressing the AKEY or the select button in the 3D View)
(Reader-use wireframe mode works better to get the cursor in)
Reader - To get it back in the cube: 1. make sure you're in object mode 2. select the cube 3. Object -> Snap -> Cursor to selection (cursor refers to the 3D cursor here so it puts it right in the middle of the cube)
(Reader - I think it's an essential point to note that in order to place the cursor inside the cube, the cube must NOT be selected. AKEY was probably the best way to deselect the object.)
As with an ordinary text cursor (the vertical line that indicates where you type), the 3D cursor is the insertion point for new objects. It is represented as a red and white circle. It is just an 'editing point' in the 3D environment.
Click the LMB to the right of the cube, half-way between the edge of the window and the cube.  The red and white circle (the 3D cursor) moves to where you clicked.  Orbit the view again and notice that the 3D cursor marks a point in 3D space.
In any given rotational perspective, the set of possible 3D points where you can place the cursor is defined by the plane of your screen.  If you're looking at the standard plane straight-on (meaning the standard plane is exactly parallel to your screen), you will place the cursor at the same height above or below the standard plane no matter where you click.  Don

Şimdi, basit bir karakter yapacağız, extrusion ve polygon seçimi hakkında bilgi edineceksiniz. Extrusion en çok ve geniş çapta kullanılan modelleme araçlarından biridir.

Blender'ı başlatın, sahne default(varsayılan) olarak başlayacaktır.(Açıklamalar için tıklayın). Default başladığında küb olacaktır.
Hatırlatma:

Kübü RMB yani sağ tıklayarak seçilir (Mac kullanıcıları CMD+LMB kombinasyonu ile yapabilir).
Sahneye farklı açılardan bakmak için MMB orta tuş(top) basıp sürükleyerek bakabilirsiniz (Mac kullanıcılarıALT+LMB ile yapar).
NUM7 bastığınızda üstten görünüşü gösterir.
Edit Mode ve Object mode arasında seçim yapmak için TAB tuşu kullanılır; aşağıdaki resimde gösterilmektedir. TAB tuşunu kullanmadan da değişiklikleri yapabilirsiniz: 

Bu kısımda küpün üsteki dört noktayı seçmek için 6 metod önerilecektir. Sağda gösterilen resimde görüntü döndürülerek istenilen noktalar seçildi.

Öncelikle başlarken, nesnemizin nokta ve kenar gibi seçimleri rahat bir şekilde yapabilmek için Düzenleme kipinde nesnenin arka tarafta kalan kenar ve noktaların gözükmesini engellemek gerekmektedir. (Yandaki resimde küp şeklinde buton.) Bu sınırlı görünen bir seçim işlemi sağlar. (Blender 2.46'da Occlude background geometry olarak isimlendirilmektedir.) Düzenleme kipindeyken bu tuşa basın. Wireframe Mode da bulunmayabilir : eğer bulamadıysanız Z tuşuna basın. 3D View penceresinin altında, sağ tarafa doğru, Render butonundan önce görünecektir.
'Not:' In Blender 2.42 for Mac OS X running on a MacBook, there is a display problem with the box and circle selections: the selection box and circle do not appear on screen (this is valid for both the Intel and the PowerPC versions).
Varsayılan ayar Object Mode modudur. Küp seçilmiş olmalıdır; Object Mode modudan Edit Mode moduna geçilmelidir. (Listeden seçin.)

Bu araç bir kare çizmektedir böylelikle üsteki dört noktayı kare çizerek seçilir.

A-Tuşu ile seçili olan her şeyi seçimden çıkartın;
B-Tuşuna basıp aktif hale getirin.
Şimdi,LMB sol mouse tuşuna basılı tutup mouse'u hareket ettirin, seçim kenarları gözükecektir. Mouse butonunu bırakırken,noktalar içeride kalacak şekilde olmalıdır böylelikle seçilecektir. Üsteki dört noktayı seçin. Eğer hata yaptıysanız, A-Tuşuna basıp seçimi iptal edip noktaları seçmeye tekrar başlayabilirsiniz. Bir sonraki metodu denemeden önce şüphesiz bütün noktaların seçimi iptal edilmiş olmalıdır. (Noktaların seçimi iptal edilince pembe olurlar, sarı değil)
BKEY - Kutu-seçim aracı aktif hale getirir.

A-Tuşuna basarak seçili bütün noktaların seçimini iptal edin;
B-Tuşuna iki kez basıp Çember kenarlı seçim aracını aktif hale getirin.(V.2.69'da C-Tuşu)
Mouse kürsörü etrafında bir çember gözükecektir. SCROLL (mouse tekeri) ile çemberin boyutunu ayarlayabilirsiniz veya alternatif olarak NUM+/NUM- veya PgUp/PgDn tuşlarını kullanabilirsiniz.

LMB (mouse sol tuşu) ile sürükle bırak ile noktaların herbirini seçin veya birkaç kez tıklayarak seçin.
MMB (veya ALT+LMB) ile noktaları tıklayarak veya sürükleyerek noktaları seçimden çıkarabilirsiniz.
Not: Eğer ALT + LMB mevcut çalıştığınız pencereyi hareket ettirir, o sebepler CTRL+ALT+LMB veya MMB kullanarak noktaları seçimden çıkarabilirsiniz (Dikkat!!! sçim aracı aktif halde iken).
Çember Kenarlı Seçim aracı RMB, ESC veya SPACE basana kadar aktif halde olur.
B-Tuşu+B-Tuşu - Dairesel seçim. Eğer B-Tuşuna ikinci kez basıldıktan sonra sınırlı seçim yapabilirsiniz. NUM+ ve NUM- veya MW(mouse orta tuş) dairenin boyutunu ayarlar. RMB veya ESC ile dairesel seçimden çıkabilirsiniz.

Blender 3D sahip olduğu lasso seçim aracı çoğu grafiksel programlardakine benzer.

A-Tuşuna basarak bütün noktaları seçimden çıkarın;
CTRL+LMB basılı tutun ve noktaların etrafında çember çizerek istediğiniz gibi seçin. LMB (sol mouse tuşu) serbest bırakın.
Aynı şekilde lasso ile seçimi iptal etmek için, CTRL+SHIFT+LMB kullanılır.

Dört noktayı tek tekte seçebilirsiniz

A-Tuşu ile bütün noktaları seçimden çıkarın;
RMB (Mac mouse'u tek butonunda CMD+LMB) ile tek noktayı seçin;
SHIFT basılı iken RMB basarak noktaları tek tek seçin. Seçtiğiniz noktaların üzerine aynı şekilde tıklarsanız seçimden çıkarmış olursunuz.

Vertex seçim metoduna ek olarak, diğer opsiyonlarda mevcuttur. Viewport başlığının sağında seçim modlarını görebilirsin. Edge select mode yani kenar seçim modunu seçin (iki paralel çizgi) ve küpün bir kenarını RMB ile seçin -- Eğer bütün kenarları seçili gözüküyorsa A tuşuna basıp seçimden çıkarın. A aynı zamanda hepsini seçmeye yarar -- (CMD+LMB tek buton Mac mouse). Sonra SHIFT+RMB ile seçtiğiniz kenarın karşısındaki kenarı seçin. Vertex select modea geri dönün (dört nokta). Her bir kenarın iki noktadan oluşması ve sizin karşılıklı iki kenarı seçerek Vertex select modea geri dönmeniz halinde dört noktayı seçili olarak göreceksiniz (buna "selection transformation - seçim dönüşümü" denilmektedir). Ayrıca bir sonraki yüzey seçim moduna geçmeniz halinde yine dört nokta seçili olduğunda otomatikman yüzeyi seçmiş olacaksınız.

Vertex seçim metoduna ek olarak, diğer opsiyonlar da mevcuttur. Viewport başlığının sağında seçim modlarını görebilirsin. Face select mode yani yüzey seçim modunu seçin (içinde nokta olan üçgen) ve küpün yüzeyini RMB ile seçin (CMD+LMB tek buton Mac mouse). Vertex select modea geri tıklayın (dört nokta). Bir yüzeyi seçmeniz aynı zamanda onu oluşturan dört noktayı seçmeniz anlamına geliyor. Bu yüzden bir yüzey (polygon demek aynı zamanda başka 3d programı kullananlar bilir) seçmeniz halinde nokta seçimine geri döndüğünüz anda yüzeyi oluşturan dört noktayı seçilmiş olarak göreceksiniz. (bu "selection transformation - seçim dönüşümü" olarak isimlendirilmektedir.
Alternatif olarak, 3D viewport'ta mouse ucu ile, CTRL+TAB tuşuna basabilir ve açılır menüden Vertices (noktalar) veya Faces (yüzeyler) seçebilirsiniz.
A-Tuşuna basarak seçilmiş yüzeyi seçimden çıkarabilirsiniz.

Aşağıdaki resimler orthographic görüntüdedir. Blender versiyonuna göre değişmektedir, Ön ayarlı görüntü perspective veya orthographic görüntüden biridir. Eğer orthographic'ye değiştirmeye ihtiyacınız varsa, NUM5 basın (veya VIEW menüsünden seçin, resimde görüldüğü gibi). İki boyutlu görüntüden yani orthographic görüntüyü düzeltmek için NUM1 tuşuna basın yandan görünüşlerde tek bir yön gözükmeyip çevresinden bazı kenarlar görüyosanız. perspective görüntü modundadır.

Dört köşe seçip E-Tuşuna basın.(2 resim üste görünen şekli bakarak seçebilirsiniz) Çıkan menüden Region (bölge) seçin ve mouse hareket ettirin: Oluşacak dört yeni nokta daha önce seçmiş olduğunuz noktalar etrafında istediğiniz şekli vermenizi sağlayacak noktaları çıkartmış oldunuz böylelikle modelleme için gerekli nokta ve yüzey arttırımı ile ilgili bilgi sahbi oldunuz. İstediğniz kadar çekiştirmeden sonra bırakmak için LMB, SPACE, veya ENTER kullanabilirsiniz. Menüdeki herbir seçeneği deneyerek tecrübe edinin modellemede farklı durumlar için gerekli olabilir sonuçta çözüm üretmek bildiklerinizle olmaktadır
Notlar:

Eğer popup menü çıkmaz ise, büyük ihtimalle yüzey veya kenar seçim modundasınızdır. Nokta moduna geri dönerek menüyü çıkartabilirsiniz.
Eğer popup menüde Only Edges ve Only Vertices seçenekerli gözüküyorsa, bir yüzey oluşturan dört noktayı seçmediğiniz anlamına geliyordur. (Ayrıca bazı noktalarda iki kat nokta olabilir: Edit Mode durumunda iki bütün noktaları seçin --aynı köşede bulunan üst üste noktalar-- ve W-Tuşu basın Specials menü çıkacaktır. Menüden Remove Doubles seçin; Mesh Tools altında Rem Doubles dan da bu işlemi yaparak üst üste bulunan fazla noktaları silebilirsiniz).
Blender sürümlerine bağlı olarak işlemlerin yeri ve seçenekleri değişebilir. Bildiğiniz yoldan olmadığı takdirde sürüm bilgilerine inceleyin.
EKEY - Extrude seçimi

Editleme işlemleirnden geri almak için U-Tuşu veya CTRL+Z-tuşu (CMD+Z-tuşu Mac) basın. Blender'ı yeniden başlatıp küp seçili iken Edit moduna geçin üsteki dört nokta seçili değil ise seçin.
Şimdi E-Tuşuna basın. Region seçin. Extrude noktalarını taşıyın, CTRL tuşuna basılı tutarak hareket ettirin. Böylelikle CTRL basarak sadece belli mesafeye kadar taşıma işleminin sınırlandırıldığını görüceksiniz. Bu işleme snapping denilmektedir. snap noktaları önceden belirlenmiş pozisyonlara atlatır. Snap yani belirlenmiş pozisyonlar hakkında daha sonra anlatıcağız, fakat şimdilik, noktaları doğru pozisyonlarda ayarlar böylelik görüntü iki küpün üst üste binmiş haline benziyecektir.
Beş kutu üst üste duruyomuş gibi yaptığınız extrude olayını tekrar edin. Ve bu, my friend, is a very simple leg! ----Adamın arkadaşı :)) ----

A-tuşu'na basıp seçili noktalardan seçimi kaldırın. Üstteki küpün sağ yüzeyinde dört noktayı seçin. Daha iyi görmek için görüntüyü döndürmek isteyebilirsiniz, bu sebeple MMB ile (unutmadıysanız mouse'un orta butonu ya da topu) görüntüyü döndürebilirsiniz. Alternatif olarak, kutu seçim aracı ile görünen noktaların arksındaki noktalarıda seçebilirsiniz (B-Tuşu). İki kez extrude uygulayın.

Aynı hüneri bitirene kadar tekrarlayın ve basit gövdemizin kalanları yapılıp bitecektir.
Tek tıklama ile bir yüzeyin dört noktasını Face select mode anahtarı ile seçmek isteyebilirsiniz. Bu yol extrusion araçları extrude işleminde region otomatiktir, böylelikle yüzey extrude yaparken her seferinde Region seçmeniz gerekmeyecektir.
Bu noktada modeliniz görüntünüzde (ekranda)
Bu noktada modeliniz görüntünüzde (ekranda) sığacak kadar çok büyük görülebilir. Görüntüyü ayarlamak için:

CTRL tuşuna basılı tutun ve NUM4, NUM8, NUM6, NUM2 tuşlarına basın,
veya SHIFT basılı tutun ve MMB ile sürükleyin.

şimdi, drum kontrol: Z-Tuşuna basıp solid mode açın ve gövdeyi inceleyin. Eğer bazı yüzeyler kayıpsa, kolaylıkla düzeltilir. Dört nokta bir yüzey oluşturmaktadır, dört nokta seçin ve F-tuşuna basın (veya choose the Mesh → Make Edge/Face menu from the viewport header). Fazla noktaları kaldırmak için W-Tuşu basın ve menüden Remove Doubles seçin. Fazla noktaları kaldırmak için üst üste binen noktaların hepsini seçmeyi unutmayın.

Önemlit not: başı eklerken Edit Mode (resimdeki

This tutorial uses the simple person model from a previous tutorial.  If you didn't do it, go back and do it now---or find it pre-made just for you here.  Alternatively, if you just want to make the hat without putting it on a person at the end, you can go ahead and do that without having completed the other tutorial.

Şapka yapımının ilk adımı basit bir mesh daire oluşturmaktır.

Ortografik görünüm kullan(NUM5);
Modelin yan görüntüsüne geç (NUM3);
Basit adam model ile başlıyorsanız, (SHİFT + MMB) Modelin başını yukarı açıdan görünür şekilde sahnenin merkezine getirin.
Şapkayı ayrı bir nesne olarak eklemek için (TAB) ile nesne modunda (Object Mode) olduğunuzdan emin olun (Not:İşlemler için nesne moduna geçmezseniz problemlere neden olacaktır. )
Şimdi, sol tıklama (LMB)  ile 3D körsırı görüntünün merkezine yerleştirin ve en yakın grid noda (SHİFT + S sonra Cursor → Grid) seçerek yerleştiriniz.

SPACE → Add → Mesh → Circle seçimi ile 12 noktalı(köşeli-vertex) çokgen ekle. En son blender versiyonunda default 32 köşelidir fakat siz okları kullanarak köşe sayısını 12'ye düşürün: Değiştirmek için okları tıklayabilir veya tıklayıp sağa sola sürükleyebilir ya da sayı üzerine tıklayıp yeni bir sayı yazabilirsiniz. Çap değerini 1.41'e değiştir. OK  tıkla. Şimdi seçimli bir daire elimizdedir. Sol alt köşedeki link and materials bölümünde  seçili nesnenin Circle. olduğunu görmelisiniz.
Eğer bir çizgiden başka bir şey görmüyorsanız, daireye yan açıdan bakıyorsunuz. Daireyi farklı bir açıdan görmek için çeviriniz veya üstten görünüme geçiniz (NUM7).

Edit Mode da olduğunuzdan emin olun. Edge select mode (CTRL+TAB) seç. Resimde görüldüğü gibi üç kenarı seç(AKEY ile tüm noktalardan vazgeç,RMB tıkla, ikinci ve üçüncüleri seçerken SHIFT’i basılı tut).
XKEY → Edges’e basarak bu kenarları sil.

Edit mod da olduğunuzdan emin olun ve (CTRL+TAB → Vertices) ile Vertex select mode’a geçiniz ve çizinin sağda bir yerde görünmesine dikkat edin.

AKEY tüm noktaları seçmek/vazgeçmek için
RMB bir nokta seçmek/vazgeçmek için
SHIFT+RMB çoklu nokta seçmek/vazgeçmek için (veya BKEY ileBorder select toolu kullanabilirsiniz)
GKEY seçimi yer değiştirmek (Gezdirmek) için (yer değiştirme sırasında daha fazla kontrol için CTRL basılı tutabilirsiniz)
kullan

Dikkat: Proportional Edit Falloff düğmesinin is kapalı(off) olduğundan emin ol.  (portakal açık gri kapalı). Bu denetimi OKEY ile kontrol edebilirsiniz. Daha sonraki kılavuzlarda orantılı çizimi (propotional edit) öğreneceğiz fakat bu safhada kapalı olmalıdır. Böylece her nokta üzerinde yarı ayrı tam kontrolünüz olabilir.

Bu çizgiden şapka yapmak için spin aracını kullancağız.
Not: Diğer blender araçları gibi Spin aracı, çizgileri bulunduğunuz ya da görünen boyuta dik ve kursırdan geçen eksen etrafında çevirme   uygular.

3D körsırın en sağ noktaya yerleştirilmesi

En sağ noktayı seç (RMB),
Sonra SHIFT+SKEY  seç ve Cursor → Selection bas.
Sonra çevrilecek eğriyi seç ve döndürme eksenini seç:

En çok kullandığınız yolla tüm noktaları seçin (AKEY, BKEY, etc...),
Üstten görünüme(Top) geçin (NUM7).

Editing panele geç (F9, or CMD+F9 for Mac users). Mesh Toolsda tab ile the Spin, Spin Dup and Screw düğmelerini bul ve aşağıda gösterilen deperleri gir:

Degr: 360
Steps: 12
Turns: 1

Noob Note: Benzer isimlendirilmiş üç sekme bulunmaktadır. [Mesh], [Mesh Tools] and [Mesh Tools 1] (in Blender 2.46, [Mesh Tools More]).  Düzenleme sekmesinin altında [Mesh Tools] altında aranabilirler.
Şimdi Z ekseni çevresinde döndürme ile oluşacak yüzeyi yaratmak için Spintıkla.
Sorun çözümü: Birden fazla boyut görünümü ayanı anda açık ise mouse ? ne değişebilir. Döndürmek istediğiniz boyutu tıklamanız gerekebilir. (the top view window).
Not: Üst (top) görünümü seçtiğimiz için döndürme ekseni Z eksenine paraleldir.

Şimdi şapkanın önünde siperlik yapmak için çıkma oluşturacağız.

Üst görünümü kullan (NUM7),
Edge select mode u seç(CTRL+TAB),
En önde bulunan dört kenarı seç (RMB ile birinciyi , and SHIFT+RMB ile diğerlerini),
En son çıkma seçimini yap (EKEY → Region): ve onları aşağı uzat; YKEY basarak uzatma yönünü tek bir Y ekseninde hareket etmesini sınırlayabilirsiniz.

Editing düğmelerinde, Modifiers panelinden Add Modifier → Subsurf’ı seç. Görüntüyü döndürdüğünüzde şapkanın dikişlerinden ayrıldığınına dikkat edin. Kullandığımız spin aracı nedeniyle 3D uzyımızda aynı noktayı işgal eden nıktalar çifti mevcuttur. bunu gidermek için Edit mod da AKEY ile tüm noktaları seç sonra WKEY → Remove Doubles ile çit olanları uzeklaştır.
Artık gereksiz üstüste binen noktalar kaldırıldığından tüm birleşim yerleri düzgün görünecektir. Artık gözel bir şapkanız var. Arkan yaslan! İyi iş! Dah pürüssüz bir görünüm ile bitirmek için WKEY → Set Smooth seçebilirsiniz.

Çiftleri kaldırmazsanız bu şekilde görünebilir

Keep this simple person/simple hat file open because you'll need it in the next tutorial.
Şablon:B3D:N2P/NAV

These are some basic tips that are often asked for in one form or another.  Sometimes it is in reference to something completely different, but the basic methodology will work.

Genelde rehberler Blender'ı açınca karşınıza çıkan ön tanımlı küp ile başlar. Burada sahneyi uygulamadan çıkmadan sıfırdan başlatmak için iki yol vardır:

Ctrl-X ( Ctrl tuşuna basarken, X tuşuna basın);
veya menüden File -> New (Dosya -> Yeni).
Sonra, fare imleci altında izin isteyen OK? kutucuğunu göreceksiniz. Bunu Erase All seçeneğini seçerek (ya da dismiss ite getirip iptal ederek) onaylayarak şu anki sahneyi silebilirsiniz.
3B görüntü penceresinde bir küp kare gibi görünür. (Eğer fare orta tuşu ile görünüşü çevirirseniz, onun geçekten küp olduğunu görürsünüz.) Bu ön tanımlı seçilmiştir.
Not: Ön tanımlı sahneyi değiştirebilirsiniz. (Ctrl-X 'e basarak kişiselleştirilmiş olana dönebilirsiniz.) Sadece sahneyi düzenleyin ve ihtiyaçlarınıza göre diyalogları ayarlayın, sonra File > Save Default Settingse (Dosya > Ön Tanımlı Ayarlar tıklayın.) Bu aslında çok kullanışlıdır. Fabrika ayarlarına geri dönmek için, bu ayarların tutulduğu ev dizinindeki .B.blend dosyasını silin. Sürüm 2.44'den itibaren, File (Dosya) menüsündeki yeni Load Factory Settings (Fabrika Ayarlarını yükle) seçeneği bulunmaktadır.

Alt bölüm yüzeyleri, ya da alt yüzleme (subsurfing), 3B modellemede sık rastlanılan bir tekniktir. O matematik işlemleri kullanarak kontrol noktalarını ve köşelerine uygun olarak eğri düzlemi boşlukta canlandırır. Bunun anlamı düzgün yüzeyli bir nesne oluştururken göreceli olarak daha az köşe ile kontrol edebilirsiniz.

İlk, küp seçin. Şimdi panelden Editing (düzenleyi) seçin. Panel listesinden  ikonuna tıklayın.  veya F9a basın. (Eğer düğme görünüm panelinde (button view panel) bir grup pencere görmüyorsanız, Link and Materials (bağlantı ve malzemeler), Mesh (yığın), Multires, Modifiers (düzenleyiciler), Shapes (şekiller) gibi, büyük ihtimalle küpün kendisi seçili değildir. Bütün hepsi şartlara duyarlıdır. Bu nedenler Editing (düzenleme) paneli seçtiğiniz şeye göre ögeler gösterecektir.)
Sonra Modifiers (Düzenleyiciler) panelinden Add Modifier (Düzenleyici ekle) düğmesini bulun. (Fare tekerini çevirerek bulun.) Bu düğmeye basmak mümkün olan düzenleyicileri listeleyecektir, burdan Subsurf (alt yüzey) seçeneğini seçmelisiniz. Eski Blender sürümlerinde Subsurf (Alt yüzey) düğmesi Mesh (yığın) panelinde yer almaktadır.
Subsurf (alt yüzey) panelinin Modifiers (düzenleyiciler) panelinin içinde oluştuğunu göreceksiniz (resme bakın) ve görünüm penceresindeki küp düzenleyenin ön tanımlı ayarlarında olduğu gibi  kuşatılmış görünecektir.

Subsurf (Alt yüzey) paneli seçeneklerinde iki önemli seçenek bulacaksınız. Levels (Seviyeler) ve Render Levels (3B çıktı seviyeleri). Ne kadar yüksek Levels (seviyeler) ayarlarsanız, daha az pürüzlü algoritma uygulanacaktır ve sizin mesh'iniz daha pürüzsüz görünecektir. Levels (seviyeler) sadece küpün 3B görüntüsünü etkiler. Render Levels (3B çıktı seviyesini) belirleyerek 3B çıktı hazırlanırken uygulanacak seviyeyi görmelisiniz.
Levelsi (seviyeyi) 1'den 2'ye artırmanın küpü nasıl bozduğuna bakın.

Çoğu kez, bir çeşit subsurf (alt yüzey) açık iken 3B çıktı almak isteyeceksiniz. Gerçek yaşamdaki çoğu şeyin süper keskin hatları olmadığı gerçeği ile yüzleşmelisiniz. Gerçek dünyadaki çoğu durumda nesnelerin daha yumuşak hatları vardır. (Bıçak kenarı, makineden geçirilmiş dükkanlarda blok malzemeler hariç!) Bu insanların 3B'ye başlarken gözden kaçırdıkları bir gerçektir: 3B bazen imkansız derecede keskin, temiz ve iyi belirlenmiş hatlara sahip olduğundan çok mükemmel görünebilir.
Bu efekt Blender'a şunu söyleyerek düzeltilebilir. Biz küpün orijinalinden daha fazlasını istiyoruz. Biz bunu Edge Creasing (kenar kırıştırma) adı verilen bir araç ile yapacağız. Blender modelindeki her kenarın bir crease (kırıştırma) değeri vardır, Subsurf (alt yüzey) düzenleyicisine kenarların ne kadar keskin olacağını söylemek için kullanılır. Ön tanımlı olarak, bütün kenarların crease (kırışıklık) değeri 0'dır, bu bizim küpümüzün bütün keskin kenarlarını kaybetme nedenidir.

Şimdi, şunun hakkında daha önce ne dediğimizi hatırlayın Subsurf (alt yüzey) düzenleyicinin küpün orijinal şeklini hatırlıyor mu? TAB'a basarak düzenleme moduna geçin ve orijinal küpün tel çerçeve ile kuşatılmış düzgün bir küp olduğunu göreceksiniz.
Creasing (kırıştırma) ile değiştirmeden önce, Subsurf (alt yüzey) Levels (seviyesini) 4'e çıkarın böylece efekti daha net göreceksiniz.

3B görünümde, Face (yüz) moduna geçin. CTRL+TAB 'a basın (Faces (yüzleri) seçin) ya da bu ikona basın: 
RMB ile tel küpümüzün kenarlarından birini seçin. (Bu yüzün merkezindeki noktanın yanına tıklanarak yapılabilir.) Yüzlerin rengi griye döndüğünde seçildiğini anlayacaksınız ve seçtiğiniz aydınlatılacak.
Şunu not edin, her ne kadar Face (yüz) modunda olsak da, gerçekten creasing (kırıştırma) yaptığımız edges (kenarlar) bir yüzü hızlıca seçmek dört kenarı seçmek kadar kısa yoldur.

Şimdi SHIFT+E'ye (ya da Mesh > Edges > Crease SubSurf) basın ve şimdi fareniz noktalı bir çizgi ile küpe bağlanacak. Mesh üzerindeki efekt etkisini görmek için kibarca sağa sola hareket ettirin.
Değişiklikleri uygulamak için LMB'ye (sol fare tuşu) basın, RMB'ye (sağ fare tuşu) basarak son crease değişikliğinden vazgeçebilirsiniz.

RMB - Sağ fare tuşu (Right Mouse Button) 
LMB - Sol fare tuşu (Left Mouse Button)

Yukarıda kenar (edge) crease'den (kırıştırma) vazgeçin ya da başa dönüp yeniden basit subsurf'lü (alt yüzlü) küp çizin. Sonra A tuşuna iki kere basıp tüm yüzleri seçin. Daha önce yapıldığı gibi SHIFT+E basarak crease (kırıştırma) yapın. Sağdaki şekle benzeyene kadar yapın.
TAB tuşuna basıp düzenleme modundan çıkabilirsiniz. Düz küpünüze bakın.

Yeni başlayan kullanıcılar için not: Subsurf (alt yüz) seçeneği modelinizi daha düzgün yaparken, hesapladığınız temel mesh'inizi eğer. Bu çok miktarda kopya yüzey oluşumuna neden olabilir. Subsurf (alt yüz) yapılmadığı zaman çok karmaşık mesh olurlar. Bu seçeneği kullanırken çok dikkatli olun, eğer kaynak mesh'inizi izlemiyorsanız problemlere neden olabilir. Bu tarz yüzey hesaplaması ayrıca skinleri de (kabuk) eğer, sonra nesneye skin (kabuk) yapmayı çok zorlaştırır. Bu rehber boyunca uzun süre çalışmayacağınız bir şey, ama aklınızda bulunması iyi olur.

Blender arayüzü gözünüzü korkutmuş olabilir, fakat korkmayın. Blender pencere sistemlerinin esnekliğini ve gücünü keşfettikten sonra kolaylıkla uyum sağlayacaksınız. İlk olarak 3D Viewport ve Buttons Window pencerelerini kullanmasını öğreneceğiz.

3D Viewport's ızgarasını yani grid'i Blender Units (BU) bölümünden ayarlayabilirsiniz.BU ile istediğiniz ölçülendirme boyutunu ayarlayabilirsiniz: 1 inç, 1 santimetre, 1 mil veya 1 kübit.

Her pencere bir başlığa sahiptir. Pencere başlıkları altta, üstte ve gizli olabilir.  Şimdi 3D Viewport ve Buttons Window pencerelerine bir göz atın.

Aktif pencere klavye kısayollarına cevap vermektedir. Blender pencerelerinden biri muhakkak aktif olacaktır. Pencerelerden birini aktif etmek kolaydır. Tek yapmanız gereken mouse ile üzerine gelip tıklamaktır. Aktif ettiğiniz pencerenin başlığı bir önceki haline göre rengi açılacaktır.

3D View ve Buttons Window pencereleri dışında birçok pencere bulunmaktadır ve basit bir şekilde değiştirebilirsiniz.

Pencereleri ölçeklendirmek çok kolaydır.

Bu yolla pencerelerin boyutlarını artırıp azaltabilirsiniz. Blender pencerelerin üst üste gelmesine izin vermez.

Pencereleri bölmek aynı zamanda yeniden ölçeklendirmek, ya da yeni bir pencere tipi eklemek veya 3D View'dan yeni bir bakış eklemek için kullanılabilir.

Şu anda bir pencerenin dikine bölünmesini gördük. Blender pencereleri aynı zamanda yatay bölünebilmektedir. 1. adımdaki 2 pencere arasına geldiğinizde mouse değişme hali Blender'ın kenarlarında da olmaktadır. aynı şekilde sağ tıklayıp denemelisiniz.

Pencereleri ayırdığımız gibi tekrar birleştirebiliriz. Aynı şekilde sağ tıklayıp Join Area seçmek yeterli.

Birleştirme işleminde ok yönüne göre birleştirme tarafı seçilmektedir. Ok sol tarafa doğru olursa sol tarafı silersiniz, aynı şekilde sağ tarafa olursa sağ tarafı silersiniz. Unutmayın, bu birleştirme işlemi bütün pencere tipleri için geçerlidir.

Scriptler Blender'da fonksiyonların esnekliğini ve kullanılabilirliğini artırmada kolaylık sağlar. Script konusu başlı başına ileri seviye konusudur.

Shading butonu yani kaplama butonu nesnelere uygulayacağınız renkleri ve dokuları (texture), ışık ayarlarını ve dünya yani çevre faktörü arka planı ustaca kullanmanızı ve ayarlamanızı kolaylaştırır. (F5 tuşuna) basarak shading butonu altındaki uygulamaları ve butonlarını görebilirsiniz. Burada ışıklar, genel materyal ayarları, dokuları, radiosity (ışık hesaplaması) ve dünya ayarları (render yaparken arka planı ayarlamak için). F5 tuşuna basınca karşınıza çıkacak olanlar bunlar.

F7'ye bastığınızda Object-Nesne butonları ve uygulaması gözükecektir. Burada 3D penceresinde seçtiğiniz nesnenize yapacağınız işlemleri ayarlayabilirsiniz. F7 tuşu object mode kısmını işaret etmektedir. Tab tuşu ise Edit Mode ile Object Mode arasında geçiş sağlar. Bu iki tuşun yaptığı işlemler farklıdır. Dikkat edin!!!

Bu kısımda nesneleri düzenleme yani edit modu bulunmaktadır. F9'a basarak edit butonları gelir. 3D View penceresinde TAB tuşuna basarak edit mode geçebilirsiniz.

Temelde render (resim alma) ve animasyon ayarları bulunmaktadır. Bu konuya sonra döneceğiz.

Scriptleriniz için bir GUI yaratmak oldukça kolay ve değişiklikler yapmayı herkes için kolaylaştırı.
Grafik kullanıcı arayüz oluşturma komutu,
Blender.Draw.Register(draw,event,button)  dur.
Bu komut fonksiyonları kayıt eder

   * draw - GUI çizmek için
   * event - fare tuş tıklamalarına tepki için
   * button - düğme basma olayına GUI tepkisi için

Bu komut kendi kendine çaışmaz. Öncelikle bu üç fonksiyonu tanımlamalısınız.
İlk olarak Blender hazır kütühane fonksiyonlarını import edeceğiz.
import Blender
Sonra draw fonksiyonunu tarif edeceğiz.
def draw():
bu fonsiyonun içinde GUI çizeceğiz. Burada drawing fonksiyon örneği kullanabiliriz. Bu görünen pencereyi kaldırır.
	Blender.BGL.glClear(Blender.BGL.GL_COLOR_BUFFER_BIT)
Ve sonraki komut düğmeyi çizecek. komuttaki ilk numaraya dikkat edin. 1 düğmenin buton1 olduğunu tanımlar. Daha sonra bu düğmeye müracat edeceğiz.
	Blender.Draw.Toggle("Clear origin",1,10,20,100,20,0,"Tooltip")
Sonra event fonksiyonunu tanımlayacağız. Klavyede tuşa basıldığında çalışacak kod, foksiyona evt değişkeni olarak geçerilir.
def event(evt,val):
Şimdi escape tuşunun basılı olup olmadığını test edeğiz.
	if evt == Blender.Draw.ESCKEY:
Basılı olduğunda scriptten çıkar ve fonksiyondan return eder.
		Blender.Draw.Exit()
		return
sonraki adımda düğme fonksiyonunu tanımlayacağız. bu fonksiyon düğmeye basıldığında bir eylem yapacaktır.
def button(evt):
Şimdi önceki tanımladığımız düğme numarasını tutan evt değişkenini test edeceğiz.
	if evt == 1:
Eğer basılı ise 3D penceresinde seçili nesneyi merkeze hareket ettireceğiz. Ve ekranı yeniden çizeceğiz.
		Blender.Scene.GetCurrent().getActiveObject().loc = (0,0,0)
		Blender.Window.Redraw()
Son olarak komutu yazarak GUI yaratabiliriz.
Blender.Draw.Register(draw,event,button)
Olay budur. Kend kendinize scripte girmek için blender da text düzenleyici aşağıdakileri yazınız. Ve alt p basarak scriğti çalıştırınız. tüm scriğt buradadır.  # işaretinden sonraki açıklamadıri ve atılabilir.
import Blender  # This will import the library of blender functions we will use
def draw():     # Define the draw function (which draws your GUI).
	Blender.BGL.glClear(Blender.BGL.GL_COLOR_BUFFER_BIT) # This clears the window

       # Add here drawing commands to draw your GUI, for example:

	Blender.Draw.Toggle("Clear origin",1,10,20,100,20,0,"Tooltip")
	# The line above will draw a toggle button.
	# Note the first number, '1' means this is button number 1
def event(evt,val):  # Define mouse and keyboard press events
	if evt == Blender.Draw.ESCKEY: # Example if esc key pressed
		Blender.Draw.Exit()    # then exit script
		return                 # return from the function
def button(evt):     # Define what to do if a button is pressed, for example:
	if evt == 1: # If button '1' is pressed, set active object to centre:
		Blender.Scene.GetCurrent().getActiveObject().loc = (0,0,0)
		Blender.Window.Redraw() # This will redraw the 3d window.

You can now run the Graphical User Interface by typing the command:
Blender.Draw.Register(draw,event,button)

End of script
Noob Notu: Bu scripti çalıştırdığımda error aldım Attribute Error: 'Scene' object has no attribute 'getActiveObject'. I changed "Blender.Scene.GetCurrent().getActiveObject().loc = (0,0,0)" ifadesini "Blender.Scene.GetCurrent().objects.active.loc = (0,0,0)" a çevirdim ve çalıştı.

Buraya kadar geldiğimize göre artık butonları ve pencerelerini öğrendiğinizi düşünüyor olabilirsiniz, fakat daha birkaç pencereyi öğrenmeniz gerekecek. Sakın endişelenmeyin, her ne kadar karmaşık gibi görünse de aslında öğrendiğiniz her şeyi kullanarak hem öğrenecek hem de benimseyeceksiniz. Bu kitap size yol gösterecek ve yavaş yavaş seviyeniz yükselecektir. İhtiyacınız olan biraz daha ayarlardan bilgi sahibi olmak.

3D viewport penceresinde, gördüğünüz gibi pencere başlığında ızgaralı buton gözükmektedir. (Eğer başlık yoksa, pencerelerin ayrıldığı çizginin üstüne gelin mouse işaretçisi değişince RMB veya MMB tıklayın ve çıkan menüden "Add Header" seçin.) Bu butona tıkladığınız da bütün pencere tipleri liste şeklinde gözükecektir. Farklı pencere tiplerini görmek için listedekilere tıklayın ve inceleyin. Denemeler yaparak öğrenin.

Blender yalnızca tam animasyon yaratmada faydalı değil fakat iyi bir modelleyicidir de! Blender tam 3B sahneler kurabilirsiniz. Ve kullanışlı bir formatta da export edebilirsiniz.  Aslında daha ileri işler için de kullanabilirsiniz. Örneğin, başkasının yaptığı 2B freeware bir oyunda level editör olarak kullanıyordum. Oyunu bitirmeye kısa bir zor bölüm vardı. İki haftalık bir süre kalmış olmasına rağmen level editör yoktu. ASCII düzeyinde formatta materyallerin listesi noktalar üçgenler ve nesneler. Blender Python exporter'ı hatırladık. Blender için bir export scripti yazmak için cesaret verdim. Böylece level editör olarak kullanıldı. Çok iyi çalıştı. Halen blender bu oyun için tam bir level editör olarak kullanılmaktadır. 
Bu kılavuzda Blender için python export scripti yazmayı öğreneceğiz. Önceden python bilgisine sahip olmaksızın, sahnenizdeki objeleri nasıl sorgulayacağınızı ve onları bir dosyaya nasıl yazacağınızı açıklayacak. Aynı zamanda export script kullanmanın yararlarını, export esnasında verileri nasıl işleyeceğinizi gösterecek, var olan diğer formatları kullanılarak yapılamayacak işleri yapabileceksiniz.
Ve blender açın(2.44 veya daha üst), default sahnenin yüklendiğinden emin olun. Haydi başlayalım.
[edit]Sahne hakkındaki şeyleri ortaya çıkarmak
scripts penceresinde pencere tipini değiştirmek
Bir şey export etmeden önce, neyi export edeceğimizi bilmeliyiz. Bu bilgiyi almanın bir yolu Outliner penceresidir (SHIFT+F9). BLENDER a tanıtılmış her şeyin listesini gösterir. Şimdi bu bilgiyi scriptten alacağız. Scripts penceresini açın (yeşil yılan sembolü). Csripts isimli menüye tıklayın. Scripts → System → Interactive Python Console  a girin.
Şimdi büyük an için hazırsınız, ilk Blender script komutunu çalıştırmak üzeresiniz. Bunu yaz ve RETURN a bas. (Veya scripts penceresine en üste import Blender yaz alrtına şu satırları 'dir (x)' satırların başına print koy )file->Execute): seç.
[Not:t(" işareti olmaksızın) "import bpy" yazmışsan list functiondan önce (bpy.data.objects) kullanmalısın aksi halde blender da  "python error " alacaksın]
list(bpy.data.objects)
Sonuç olarak şunu göreceksiniz.
[[Object "Camera"], [Object "Cube"], [Object "Lamp"]]
Now, what just happened? The line "list(bpy.data.objects)" consists of three words, separated by two dots, The dots just separate different things. The first, "bpy", means to use a function from the bpy module. data is a sub-module of Blender. And finally objects is an iterator of bpy.data. The list() function is used to loop through all data in bpy.data.objects and return that as a list of all available objects. In our case, this is a Camera, a Cube, and a Lamp.
To get more information about an object, you can use the object name as a key in bpy.data.objects, and assign it to a variable, like this:
camera = bpy.data.objects["Camera"]
cube = bpy.data.objects["Cube"]
lamp = bpy.data.objects["Lamp"]
Be sure to import the bpy library first.
import bpy
We just assigned the three objects to three variables, camera, cube and lamp. To see the contents of a variable, type just its name:
cube 
[Object "Cube"]
camera 
[Object "Camera"]
lamp 
[Object "Lamp"]
Sometimes it's useful to use Python's dir() function to get more information about an object. For example
dir(cube)
will write the names of all functions and properties of the object. Quite a lot. But don't worry, soon you will know how to use all of them. You also may want to find out the type of something, which you can do like this:
type(cube)
In this case, just typing "cube" already displays the type, but from within an actual script, you would use type(). Something else which can be useful is viewing the documentation of Python objects. To do so, use the help() function on a variable or object.
help(bpy.data.objects)
This will print the documentation of the bpy.data.objects function we used. Of course, an easier way to view the documentation is the online HTML help. Click on Help->Python Scripting Reference. Hopefully now your browser opens and displays the online documentation of the Blender Python API. If not, you should find it also here:
http://www.blender.org/documentation/244PythonDoc/index.html
In the documentation, click on bpy, then on data and you can see more examples. Using the documentation will get absolutely vital whenever you need to do something in a script not covered in a tutorial. And you will need to do so, else you wouldn't want to learn scripting at all.
Another resource you will need, depending on how far you will go with scripting, is the Python reference:
http://docs.python.org/
For this tutorial, maybe read the "Tutorial" başlık in the python docs, but you will understand everything without doing so.
Now, let's try to find out more about our cube. Type:
cube.type
It will tell us that the cube really is a Mesh object in Blender. Look up "type" in the online docs. Since the variable cube holds an Object, and "type" is an attribute of that Object, click on Object. There you find its "type".
Now that we know that the cube is a mesh, let's find out more about the mesh.
mesh = cube.getData(mesh=1)
Every Blender object has data assigned to it, depending on the type. In the case of a mesh, the data are of type Mesh. In the documentation, go to the top again, and look for the Mesh module. It will contain documentation for the Mesh type. You can also try
dir(mesh)
to get an idea about the available functions and properties. Try these:
dir(mesh.verts)
dir(mesh.faces)
The first line will list the 8 vertices of the cube's mesh. The second line will list its 6 faces.
To get a member out of a list, you specify the index in square brackets, starting with 0. So:
v = mesh.verts[0]
This will assign the first vertex of the cube to the variable v. By now, you already know how to use dir() to get a list of possibly interesting things in v, find out about its type with type(), and where to look for the API documentation. It is in the module Blender/Mesh, when you click one "MVert" under "Classes".
v.co
This will display the 3D coordinates of the first vertex. Now, what if we want to know the coordinates of all vertices? We could of course assign them all to a variable, but the real way to do this is using a looping constructs. There are numerous ways to do this, but one simple way looks like this:
for v in mesh.verts: print v.co
The for variable in list: construct assigns each element of the list to the variable in turn, and then executes the commands after the colon with the variable having the value of one particular list element. In a real script, you will have much more than a single command after the colon - so you would write them in the following lines.
By now, you should know enough to try yourself at a real script in the next başlık.
[edit] Creating a script
You can write scripts either in an external text editor, or in Blender's built in text editor. The built in text editor can be hard to use if it doesn't have the standard shortcuts of your preferred text editor. To copy text to and from your clipboard in blender, you have to use CTR+SHIFT-C and CTR+SHIFT+V, otherwise it uses an internal clipboard. Otherwise, it is quite usable. You reach it over the window selector, or by pressing SHIFT+F10 (SHIFT+F11 for Blender 2.41 and up). If you want, you can enable line numbers and syntax coloring with the buttons at the bottom. Create a new script with File → New, paste the code below into it, and save it. Or alternatively, paste the code below into a file, and open that file with File → Open in Blender. As name choose something with the extension .py, for example wikibooks.py. Put it into Blender's user scripts path.
For different operating systems this is:

   * Linux: ~/.blender/scripts
   * Windows XP: C:\Program Files\Blender Foundation\Blender\.blender\scripts
   * Windows XP (alt): C:\Documents and Settings\USERNAME\Application Data\Blender Foundation\Blender\.blender\scripts
   * Windows Vista: C:\Users\USERNAME\AppData\Roaming\Blender Foundation\Blender\.blender\scripts
   * Mac OS X:
         o Under Mac OSX the path is actually hidden in the blender.app so to know the path you would have to know that the script folder is actually hidden in the blender.app itself. Assuming that Blender is in the applications directory the path would be "/Applications/blender/blender.app/Contents/MacOS/.blender/scripts" If you try to open the .app contents from the finder you will notice that .blender başlık of the path is not visible, while blender will still be able to navigate to this folder.
         o Right-click (or ctrl-click) the file "blender", and select "Show Package Contents" in the popup-menu. It will display all the hidden files under blender's folder, and select "scripts" folder inside it.
         o To see this folder from the OSX terminal use the ls -a command (lists all folders/files even hidden) in the MacOS folder of the listed path. It is probably a good idea to create an alias to the scripts folder in the "/Applications/blender-2.37a-OSX-10.3-powerpc" folder so that scripts can be easily manipulated through the finder. I know that its confusing that Blender should have its script folder buried inside the app but it is necessary to keep the app portable and not require an install.
         o A safer approach than the one above consists in keeping your scripts somewhere in your home folder: with this scheme, there is no risk of deleting your scripts when you upgrade your blender application, as they are not contained within its folder. A method that follows this principle is as follows: create a folder that will contain your scripts (or some of them) inside your own home directory; then, instead of putting your files directly in the .../.blender/scripts/ folder discussed above, simply add a link to your script directory in the .../.blender/scripts/ folder (for instance with the "ln -s" Unix command, or by doing "open /Applications/blender-2.37a-OSX-10.3-powerpc/blender.app/Contents/MacOS/.blender/

İlk modeliniz çok kolay olacaktır.

Ön tanımlı sahne ile başlayın. üç nesnesi vardır: Bir küp, bir ışık kaynağı ve bir kamera.
Küp seçilmiştir: Pembe kenarlıklar seçili nesneleri belirtir. A tuşuna basarak bütün nesneleri seçebilir sonra tekrar basarak seçimi kaldırabilirsiniz. Fare imleci görüş penceresi içinde olacaktır. Sağ tıklayarak tek bir nesne seçin. (Mac'de RMB veya CMD+LMB)

AKEY - Hepsi ile hiç birinin seçimi arasında değiştirir.
RMB - Bir nesne seçer.

Object Mode (Nesne modu) olarak bilinen yerdesiniz. Object Mode 3B çehresinde diğer nesnelerle göreceli olarak nesnenin çevresinde hareket edebilirsiniz. Seçili küp ile TAB'a tıklayın. Edit mode olarak bilinen yere getirir.
Not: Eğer küp yerine lamps (lamba) veya kamera seçerseniz, Edit Mode giremezsiniz. Kameralar ve lambalar farklı şekilde düzenlenir.
Düzenleme modundayken, küpün şeklini ve boyutunu değiştirebilirsiniz. TAB - Seçili aktif nesneyi düzenleme moduna sokar veya çıkarır.

Şu an düzenleme modundasınız ve ayrı ayrı köşelere ulaşma imkanınız var. Vertices (Köşeler) kenarlar oluşturmak ve yüzler oluşturmak için bağlanabileceğiniz kontrol noktalarıdır. Kenarlar iki köşenin birleşiminden oluşur ve yüzler ise üç ya da daha çok köşenin birleşiminden oluşur.
Köşeler seçili olmadıkları zaman pembe noktalar olarak görülmektedir, seçildiklerinde ise sarı noktalar olarak görünürler.
Eğer bütün köşeler sarı ise, AKEY'ye basın ve bütün köşelerin seçimini kaldırın. (Yukarıda görüldüğü gibi, bu tuş şu anki moda göre seçimi değiştirir) İlerleyin ve  (Mac'de ise CMD+LMB) köşelerin birinin üstünde sağ tıklayın ve sonra sarıya dönüştüğünü görmelisiniz. Bunun anlamı o seçilmiştir. Blender (2.4.4) Mac OS X sürümünde sol fare tuşu LMB seçer. Sağ fare tuşu (RMB) cross-hair'ı hareket ettirir. (Bu ayar View & Controls altından Kullanıcı tercihleri penceresinden değiştirilebilir.)
Eğer tek gördüğünüz büyük mavi nokta ise:

3D transform manipulator'un off (kapalı) olduğundan emin olun. Eğer değilse: Başlıktan el düğmesini (hand button) basılı konumdan kaldırın  . O kapalı olduğunda ikonun gösterdiği 3B eksen kaybolmasından anlayacaksınız.
Eğer bir köşe (vertex) seçmezseniz:

ZKEY tuşuna basın ve saydam modda (transparent mode) olduğunuza emin olun.
Eğer fare imlecinin (cursor) köşe (vertex) üzerine getiremiyorsanız, fare/trackpad'inizin hızını minimuma getirin. Köşe seçim modunda (vertex select mode) olduğunuzdan emin olun.
CTRL+TAB 'a basarak köşeleri ( Vertices ) seçmeyi tercih edebilirsiniz veya aşağıda gösterilen Köşe seçim modu (Vertex select mode) ikonunu  seçmeyi tercih edebilirsiniz.

Şimdi görüntüyü çevirerek, şu an neler olduğunu görebilirsiniz. ALT tuşuna basın ve sürükleyin (sol fare tuşuna basılı tutarak hareket ettirin) görüntünüzü döndürebilirsiniz. Onun yerine, orta fare tuşu (MMB) ( ALT tuşuna basmadan) Blender penceresini sürükler.
ZKEY - Sahnenin çizimini tel çerçeve ve katı mod arasında değiştirir.
CTRL-TAB - seçim modu menüsünü açar.
ALT+LMB(sol fare tuşu) veya MMB (orta fare tuşu) - Görüntüyü çevirir

Seçili bir köşe ile, GKEY 'ye basın ve fareyi etrafında dolaştırın. Köşenin imleç ile hareket ettiğini görmelisiniz! Şu anki noktasında Sol fare tuşunu tıklayın veya  ENTER ya da BOŞLUK tuşuna basın. Hareket ettirirken, hareketten vazgeçebilirsiniz ve sağ tıklama ile geldiği yerden köşeyi geri düşürebilirsiniz. (Mac'de CMD+LMB)
Bir seçimi sağ fare tuşuna basak seçebilirsiniz (Mac'de CMD+LMB) ve onu çevrede sürükleyerek arzu edilen noktada tuşu bırakın. Aynı tuşa tekrar basmak hareketi iptal eder.
Şimdi Orta Fare Tuşuna basarak, yaptığınız  görüntüyü çevreyi görüntülemek için döndürebilrsiniz küçük değişikliğin çarpıcı olmasını sağlayabilirsiniz.

Düzenleme moduyla ilgili videolar - Youtube.com

Importing objects into Blender is not that different from exporting. However, there are a few additional things to take care of. Firstly, all references to "export" in the header should be changed to "import". Secondly, instead of simply writing out data that Blender provides to us, we are responsible for giving data to Blender and ensuring that it is properly formatted. Although Blender is flexible, allowing us to ignore things like vertex indices, we do need to be careful that we do things in a sensible order.
Additionally, there is a bit of housekeeping to deal with. We should be in edit mode while modifying the mesh data. We also need to link up our newly created data to the scene, after it has been properly constructed, so that Blender can see it and maintain it. This makes it visible to the user, as well as ensuring that it gets saved along with the scene.
[edit] Importing a Mesh
Here is a simple script that can import an OBJ file created by the export script.
import Blender
def import_obj(path):

       Blender.Window.WaitCursor(1)
       name = path.split('\\')[-1].split('/')[-1]
       mesh = Blender.NMesh.New( name ) # create a new mesh
       # parse the file
       file = open(path, 'r')
       for line in file.readlines():
               words = line.split()
               if len(words) == 0 or words[0].startswith('#'):
                       pass
               elif words[0] == 'v':
                       x, y, z = float(words[1]), float(words[2]), float(words[3])
                       mesh.verts.append(Blender.NMesh.Vert(x, y, z))
               elif words[0] == 'f':
                       faceVertList = []
                       for faceIdx in words[1:]:
                               faceVert = mesh.verts[int(faceIdx)-1]
                               faceVertList.append(faceVert)
                       newFace = Blender.NMesh.Face(faceVertList)
                       mesh.addFace(newFace)
       
       # link the mesh to a new object
       ob = Blender.Object.New('Mesh', name) # Mesh must be spelled just this--it is a specific type
       ob.link(mesh) # tell the object to use the mesh we just made
       scn = Blender.Scene.GetCurrent()
       for o in scn.getChildren():
               o.sel = 0
       
       scn.link(ob) # link the object to the current scene
       ob.sel= 1
       ob.Layers = scn.Layers
       Blender.Window.WaitCursor(0)
       Blender.Window.RedrawAll()

Blender.Window.FileSelector(import_obj, 'Import')
This will load an OBJ file into Blender, creating a new mesh object. Let's take a look at the more interesting portions.
Blender.Window.WaitCursor(1)
Turn on the wait cursor so the user knows the computer is importing.
name = path.split('\\')[-1].split('/')[-1]
mesh = Blender.NMesh.New( name ) # create a new mesh
Here, we create a new mesh datablock. The name is made from the path only with the filename.
ob = Blender.Object.New('Mesh', name)
ob.link(mesh)
Next, we create a new object and link it to the mesh. This instantiates the mesh.
scn = Blender.Scene.GetCurrent()
scn.link(ob) # link the object to the current scene
ob.sel= 1
ob.Layers = scn.Layers
Finally, we attach the new object to the current scene, making it accessible to the user and ensuring that it will be saved along with the scene. We also select the new object so that the user can easily modify it after import. Copying the scenes layers ensures that the object will occupy the scenes current view layers.
Blender.Window.WaitCursor(0)
Blender.Window.RedrawAll()
Now the finishing touches. We turn off the wait cursor. We also redraw the 3D window to ensure that the new object is initially visible. If we didn't do this, the object might not appear until the user changes the viewpoint or forces a redraw in some other way.

Bu kısayollara dikkat edin, çünkü modelleme sırasında ve programı daha etkin kullanabilmek için kısayolları bilmeniz gerekir. Kısayollar Blender topluluğunu düzenlemiş olduğu bir standartdır. Buradaki anlatılan konu bütün kitap boyunca karşılaşacağınız kısayolları anlatmaktadır. Bazı kısayolları anlatılan örnek içinde öğreneceksiniz

Blender' dan bir not; Alfa-numeric ile numeric pad tuşlarının fonksiyonları farklıdır. Herbirine farklı bir özellik atanmıştır.
Laptop kullanıcıları için not: Numerik fonksiyonları rahat bir şekilde kullanabilmek için numerik tuşularına çevirimi yapabilmelisiniz.

En son Windows laptoplarında mavi Ctrl tuşunun yanında Fn tuşu bulunmaktadır. Fn tuşunu basılı tutarak NumLk (genellikle F11'dir) tuşuna basın. Eğer NumLk bulamadıysanız kılavuzunuza bakın. Eğer laptop'unuzda numerik tuş takımını etkinleştirmede sorun yaşıyorsanız. Blender'ın Emulate Numpad fonksiyonunu kullanarak ayarlayabilirsiniz. "File", "Add", "Timeline" "...." menu takımını sürükleyip bırakarak paneli açın. "System and OpenGL" butonuna basın. "Emulate Numpad" butonuna tıklayın, sonra da klavyeden düzgün bir şekilde ayarlayın.
Mac laptopları için, by default the F6 key without any modifiers turns on Keypad lock, wherein the right hand alpha keys emulate a numeric keypad.  However, depending on your settings, you may need to hold down the FN key while pushing F6.  You must be sure to use FN-F6 again in order to restore normal keyboard operation. You might find it a bit more convenient to instead hold the [fn] key on the bottom left of the keyboard to momentarily shift the keys to their number pad function.
Windows 2000/XP kullanıcıları için not: Windows'un yapışkan tuş özelliği açık iken sağdaki shift tuşu beş kez basıldığında sorun çıkarabilmektedir. Bu yüzden klavyenizi iyi bir şekilde kullanmalısınız. Yapışkan tuş özelliği açıksa kapamalısınız. Eğer erişebilirlik özelliklerine ihtiyacınız yoksa tabii ki bu daha iyi olur. Bu ayarı Denetim masasındaki erişebilirlik ayarlarından yapabilirsiniz.

ALT+LMB ipucu:

Eğer bu tuş kombinasyonunu kullanırken sorun çıkarsa, CTRL+ALT+LMB veya MMB tuşlarını kullanabilirsiniz.
Eğer programı Linux + KDE'de kullanıyorsanız, ana Blender penceresinde sağ-tıklayın, Configure Window Behavior seçin,   Actions → Window Actions kısmına gelin Inner Window, Titlebar and Frame bölümünde, Modifier tuşunu ALT seçin ve alt alta seçili olan bütün kutuları sıfırlayın.
Gnome kullanıcıları için not: 
Gnome'un mouse ayarlarında Find Pointer (işaretçi) kullanılmadığı belirtilmiştir. Eğer mouse işareti CTRL tuşuna basınca parlıyor ya da dikkat çekiyorsa (Linux kullanmadığım için bilmiyorum sanırım görünüp kaybolmaktan söz ediyor), Gnome'un Desktop Settings (Masaüstü Ayarları)'na bakın, İşaretsiz kutulardan Find Pointer kontrol edin. Aksi takdirde Blender'ın bazı araçlarını kullanmak imkansızlaşacak. Örneğin snap to grid özelliği veya lasso araçlarını kullanmak zorlaşacak.

Not: Çeviriyi yanlış yapmadıysam; Mac OS X işletim sisteminde Control ve Command tuşlarının kullanımı RMB ile aynı işlevi görmektedir, Mac OS X için yeni Blender versiyonlarının RMB için Command tuşu, MMB(orta tuş) için Option tuşu kullanılabilir. OSX Tips (OSX tiyoları) Mac versiyonları ile birlikte not edilmektedir.

  SPACE → Add  → Mesh → UVsphere

Anlamı:

   Klavyeden SPACE tuşuna basın ve açılan menüden sırasıyla Add, sonra Mesh,  sonra da UVsphereŞablon:'i seçin.

Mesh modelleme Blender'da en genel modelleme tipidir. Temelde üç boyutlu bir nesne noktaların bir araya gelmesiyle tanımlanmaktadır. Aşağıdaki örnekler mesh modelleme hakkında daha fazla açıklayıcı olacaktır.

Bir parça kağıt ve kalem alın.
Herbiri 2,5 cm'den (aşağı yukarı 1 inç) daha fazla uzakta olmamak kaydıyla üçgen oluşturacak şekilde üç nokta çizin.
Bu noktaların her birine vertex demekteyiz.
Şimdi noktaların ikisini bir çizgiyle birleştirin. Bu çizgiye edge demekteyiz.
Üç noktayı da edge yani çizgi ile birleştirin. Üçgen yapın aslında iki noktadan bir doğru geçer meselesi. Üçgenin içini boyayın. Boyadığımız kısma ise face demekteyiz.
Şimdi başka bir tane daha vertex (nokta) yapın. Bu noktadan aynı şekilde diğer iki noktaya doğru çizin. Başka bir üçgen oluşturacaksınız. Oluşan bu üçgenin yüzeyini belirtmek için içini boyayın.
Resminizi 3D boşluğundan hareketle benzer türde yapabildiniz mi? Aslında, mesh modelleme budur. Detaylar bu örnekten sonraki sayfalarda.
Eğer isterseniz daha çok vertex, edge ve face yapıp ilginç şekiller yapabilirsiniz. Blender da ise face (yüzeyler) dört nokta ile yapılmakta ve desteklenmektedir. Fakat yüzeyler beş veya daha fazlasıyla oluşturulamaz.
3D video oyun karakterlerine biraz yakından baktığımızda sandığımız gibi karakterin her parçası küçük üçgenlerin birleştirilmesinde oluşturulmaktadır. (Elbette, üçgenler daha yeni oyunlarda kullanılan daha detaylı teknolojiden dolayı hemen hemen daha zor görünmektedir).
Modelinizi yaparken, 3D boşluğunda yüzeylerinizi bütün kenar (edge) ve nokta (vertex) kontrol ederek modellemektesiniz. Sahneyi renderlarken sadece yüzeyler (face) görülmektedir. Bazı durumlarda herhangi bir kenar veya noktalar birleşmez veya bağlanmazsa yüzey gözükmeyebilir.

3D öğrenmenin en basit bölümü modellemedir. Çünkü modellemede birşeyler ortaya koymak, yapmak veya inşa etmek diyelim bunların hepsi eğlencelidir. Fakat eğlenmenin yanı sıra bazen uğraştırıcı olabiliyor. Bundan sonraki bölümde, ilk adımınız nasıl modelleme yapılır olacaktır. Şimdi heyecanlıysanız iyi, fakat korku varsa kötü; çok basit bir başlangıç olacak. Bundan sonra biraz zaman ve biraz da sabrederek, Pixar ve Dreamworks stillerinde iş çıkartabilirsiniz!
Modelleme öğrenmek size Blender programını yavaş yavaş daha etkin kullanmanızı sağlayacaktır. Böylelikle klavye ve mouse kullanmaya alışınca diğer işlemleri yapmak ve öğrenmek daha kolay gelecektir. İlk modelinizi yapıp resim olarak gördüğünüzde çok hoşunuza gidecektir, bir de buna ışıklandırma ve doku verdiğinizde artık bu işten kopmanız zor olacaktır. En azından hobi olarak devam ettireceğinizi garanti ederim.

Modelleme öğrenmek 
Başlama ipuçları 
Hızlı modelleme 
Şipşak render 
Mesh modelleme 
Basit bir karakter modellemek 
Basit bir karakter modellemede detaylandırma 1
Basit bir karakter modellemede detaylandırma 2
Basit bir şapka yapmak
Şapkayı karaktere yerleştirmek
Basit tepeler
Fotoğraf yardımı ile modelleme
Çörek adam modelleme
Küreden penguenler
Zar modelleme
Zar modelleme 2
Zar modelleme 3 '2.44 versiyonu için'
Gümüş kadeh modelleme
Silindirden gümüş kadeh modelleme
Basit araç
Basit araç: Tekerlek
Basit araç: Koltuk
Basit araç: Roket rampası
Basit araç: Araba gövdesi
Basit araç: Gerekli bileşenler
Model a Low Poly Head
Ev inşa etme
Curve and Path Modeling
2D resimden 3D modele 1
2D resimden 3D modele 2
Resim modelleme
Using Bones
Materyallar ve yazılar
Quickie Material
Quickie Texture
Procedural Textures
Creating Basic Seawater
Texturing Basic Seawater
Mountains Out Of Molehills 2
Light a Silver Goblet
Basic Carpet Texture
Procedural Eyeball
Image Textures
The Rusty Ball
Creating Pixar-looking eyes in Blender
UV Mapping
Quickie UV Map
UV Map Basics
Every Material Known to Man
Hot Keys
Beginning Modeling Final Project

Generating Elements with Python
A quick reference for commands to create elements through a Python script instead of manually. All of these scripts require the following code at the start:
import Blender
from Blender import NMesh
We will also, for the tutorial, be working with an object, known as obj. To work with obj, after the import sequence, add the line
obj = NMesh.GetRaw()
If the name in quotes of an existing object is entered into the parentheses instead of left blank, it will use that object's mesh as a template.
[edit] Vertices
The basic structure of the vertex generation command is:
v=NMesh.Vert(x.x,y.y,z.z)
Where v is the name of the vertex and x.x, y.y, and z.z are the X, Y, and Z coordinates of v, which must end in a decimal place.
For example, here is how one might create the three vertices of a triangle and attach them to obj's mesh:
v=NMesh.Vert(1.0,0.0,0.0)
obj.verts.append(v)
v=NMesh.Vert(0.0,1.0,0.0)
obj.verts.append(v)
v=NMesh.Vert(0.0,0.0,1.0)
obj.verts.append(v)
Or, for vertices not created under the same name (v), it can be written thusly:
a=NMesh.Vert(1.0,0.0,0.0)
b=NMesh.Vert(0.0,1.0,0.0)
c=NMesh.Vert(0.0,0.0,1.0)
obj.verts.append(a)
obj.verts.append(b)
obj.verts.append(c)
[edit] Faces
The basic structure of the face generation command is:
f=NMesh.Face()
Where f is the name of a given face to be created.
To append vertices (maximum 4) to a face, use the line
f.v.append(obj.verts[x ])
Where x is the order of the vertex around the perimeter (beginning with 0).
Let us mix the previous vertex assigning conventions in with our example of a creation and appendage of a face to more efficiently demonstrate the degree of flexibility had by the command. This code adds a square to Obj.
v=NMesh.Vert(1.0,1.0,0.0)
obj.verts.append(v)
v=NMesh.Vert(1.0,-1.0,0.0)
obj.verts.append(v)
a=NMesh.Vert(-1.0,-1.0,0.0)
b=NMesh.Vert(-1.0,1.0,0.0)
obj.verts.append(a)
obj.verts.append(b)
f.v.append(obj.verts[0 ])
f.v.append(obj.verts[1 ])
f.v.append(obj.verts[2 ])
f.v.append(obj.verts[3 ])
obj.faces.append(f)
[edit] Objects
All of this code hasn't so much modified or created a mesh. It's more like a blueprint for the changes. To actually construct the new object, insert the following line of code at the end of the blueprint:
NMesh.PutRaw(obj, "Square", 1)
The first argument is the name of the mesh to be used to create "square", the second argument, which is the name of the object. This can be anything you like. The third argument is the renormalization boolean. When set to 1 (true), this forces Blender to recalculate the mesh's normals before generating the object in 3D space. Finally, use this piece of code after all of your object creation and other visual modification scripts to tell Blender to refresh the screen:
Blender.Redraw()
[edit] Iterative Loops
Possibly the most important advantage of procedural object creation is the work it saves you when creating something with any sort of replicable quality. Here we will give the basic format of a loop in Python, then show some example scripts you can build on. The basic loop is thus:
for i in range(a,b,c):

   Four (more) spaces indentation marking all code contained in the loop

Same indententation level as "for i in range" line to exit loop
Where i is the iteration number, a is the start value of the iterations, b is the end value of the iterations, and c is the increment. Entering in c is not necessary if the increment is 1. If a is 0, b is 100, and c is 1, it will run the iterative loop 100 times, starting with the 1st iteration, where i=0. If c is 2, it will run the iterative loop, adding two to i each loop, until i=100.(50 times - for iteration 1 i=0, iteration 2 i=2, and iteration 50 i=98). Note that when i=b (end value of the iterations), the loop will end prior to executing the loop code.
If you nest loops, you can perform such tasks as placing a row of ten vertices in with one of the coordinates set to i, so that when i makes another iteration the nested loop makes another row of ten vertices in the new position given by i.
A loop that produces a vertex at the origin, (1,1,1), and (2,2,2)
for i in range(0,3,1):

   v=NMesh.Vert(i,i,i)
   obj.verts.append(v)

A square-producing loop:
for i in range(0,2,1):

   for j in range(0,2,1):
       v=NMesh.Vert(j,0,i)
       obj.verts.append(v)

A two-square-producing loop:
for i in range(0,2,1):

   for j in range(0,2,1)
       for k in range(0,2,1)
           v=NMesh.Vert(j,k,i)
           obj.verts.append(v)

[edit] Links

   * Blender tools:
         o http://www.makehuman.org/
         o http://www.geocities.com/blenderdungeon/lsystem/
   * Python:
         o http://www.alcyone.com/software/lsystem/
   * Other:
         o http://www.devx.com/Intel/Article/20333/2046 , "Procedural 3D Content Generation, Part 2"
         o ModelingCloudsShape --antont, Sun, 20 Mar 2005 03:33:07 +0200 reply http://www-evasion.imag.fr/Publications/2004/BN04/

Blender 3D: Noob to Pro internetten Blender 3D kullanımını öğrenmede en rahat bir şekilde ulaşılmasını sağlamayı amaçlamaktadır. Özellikle ülkemizde açık-kaynak yazılım kullanımını tanıtmaktır. Böylelikle lisanslı program sorunu ile karşılaşmadan eğlenceli bir hobi veya ileride bir iş olarak animasyon sektörü için ki ülkemizde gelişmesi durumunda işsizlik sorununa çözüm olarak katkı sağlayabilir. Özellikle nitelikli film, oyun ve benzer eğlenceli işler veya araştırma geliştirme yapan departmanlar için esnek değiştirilebilen bu programı tanıtmak ve öğrenmesini kolaylaştırmak bizim üstlendiğimiz bir görevdir.
Bundan dolayı yerine getirilmesi gereken bazı kurallarımız bulunmaktadır.

Blender 3D: Noob to Pro eğlenceli örnekler ile zevkli isimlendirme yapılacak.
Her bir örnek sonraki örnekler için yöntemler anlatmaktadır.
Talimatlara için anlatıma uygun resim tercih edilmektedir.
Güzel ekran görüntüleri ve renderlar eklencek.
Tablolar kesinlikle organize edilecektir. --İngilizce versiyonda yapılan her ekleme için tablo yenileme yapılacak. Ayrıca kendi örneğinizi ekleyebilirsiniz.

Şuanlık sadece çeviri yapılmaktadır. Eğer çeviride yardım edebilecek durumda iseniz isminizi takım listesine ekleyin ve bu görev durumu başlığı altında ne yaptığınızı belirtin. Böylelikle yaptığınız işe özellikle çevirinize kimse karışmamış olur.

Blender güçlü ve kompleks bir 3D modelleme ve derleme paketidir. Etkili bir şekilde kullanıp bir şeyler yapmadan önce, nasıl çalıştığıyla ilgili bazı şeyleri bilmeniz gerekir:

3D modelleme ve derleme işlemi (Blender ne yapar)
3D analitik geometrinin temelleri (açılar ve koordinatlar)
3 boyutlu bir objenin perspektif ve izdüşüm görünümü
bölgesel koordinat sistemleri ve çocuk objeler
Blender kullanıcı arayüzünün temelleri (kısayollar, pencereler ve menüler)
3 boyutlu bir sahneye farklı açılardan bakmak
Bu ünite tamamen bu tür arkaplan bilgiden oluşmaktadır. Bir sonraki üniteye kadar ilk Blender modelinizi oluşturmayacaksınız.
Buna dayanarak, ünite atlamak isteyebilirsiniz. Mevcut bilginize göre, bu sizde işe yarayabilir ya da yaramayabilir. Örneğin, eğer daha önce başka 3D paketler kullandıysanız, bu sayfayı gözden geçirip (ya da atlayıp) kullanıcı arayüzüne kadar geçebilirsiniz. Şüpheliyseniz, lütfen dersleri sırayla okuyunuz.
Blender, yolunuzu bulmadan açıp kullanabileceğiniz bir yazılım değildir. Yeni bir şehri keşfetmeye benzemez. Uzay gemisi kullanmaya benzer. Basit şeyleri bilmeden pilot koltuğuna geçerseniz, yerden kalkmanız bile şans olur, hedefe ulaşmanız da mucize.

Her konu gibi, 3D modellemenin de kendini jargonu vardır:  Bilgisayar grafikleri ile ilgili konu içinde kendi anlamları olan kelimeler.
Bu kitapta, yeni ve önemli kelimeler ilk görünüş için Şablon:B3D:N2P/FirstUse yazılmış ve hemen ardından anlamları açıklanmıştır. Bir kelimeyi kaçırdığınızdan (ya da unuttuğunuzdan) şüphe ederseniz, Glossary bölümüne bakınız.

Derslerle çalışmak için, Blender kurulu bir bilgisayara erişiminiz olmalıdır. ([1] adresinden en son kararlı sürümü indirebilirsiniz.).
Sisteminizde yüklü değilse, uygun Python sürümüne de ihtiyaç duyabilirsiniz. Blender'in her sürümü, yalnız belli bir Python sürümü ile çalışır ki bu sürüm genellikle Blender ile birlikte yüklenir.
Yüklemek için
Blender açık kaynak kodlu yazılım olduğu için, kodu indirip kendiniz kurabilirsiniz ama önceden kurulmuş bir paket indirmek daha kolaydır. Desteklenen şu işletim sistemleri için yükleme paketleri hazırdır:

Microsoft Windows (32-bit and 64-bit)
Linux (32-bit and 64-bit x86)
Apple Mac OS X (PowerPC and Intel)
FreeBSD (32-bit and 64 bit)
Solaris
Irix
Örneğin, Blender'i Debian temelli bir GNU/Linux dağıtımına (Ubuntu gibi) kurmak için: Terminale şu kodu girmeniz gerekir: sudo apt-get update && sudo apt-get upgrade && sudo apt-get install blender
Windows kullanıcıları, yükleme sihirbazı ile ZIP paketi arasında seçim yapma şansına sahiptir.
Yükleme işlemi bittiğinde, Blender bilgisayarınızın uygulamaları arasında belirecektir.
Ayrıca, bir 2 boyutlu görüntü işleyici yüklemek isteyebilirsiniz. Örneğin ([2] GIMP), ([3] Paint.NET) ya da Photoshop. Video dosyalarını görüntülemek için ise ([4] bir medya oynatıcı).
Eskiz yapmak ve not almak için hazırda kalem ve kağıt bulundurmak da iyi bir fikir olabilir. Öğreneceğ çok şey var. İlerlerken notlar almanın karşılığını ileride göreceksiniz.

Herhangi bir noktada takılırsanız, appendices bölümünde diğer Blender kullanıcılarından yardım isteyebilirsiniz.

Pek çok modülün alt kısmında yukarıda işlenen konulara dair linkler içeren, şu şekilde bir bölüm vardır:

Blender sistem gereksinimleri
GIMP VikiKitap
Windows'ta kurulum
Linux'ta kurulum
OSX'te kurulum
Python programlama dili ile ilgili
Önceki                                         Sonraki

Python Script - 6 ders
İleri seviye modelleme - 11 ders

Introduction 
Guided tour: 
Armature Object 
Armature Object in Object Mode 
Armature Object in Edit Mode 
Armature Object in Pose mode 
Mesh Object 
Connection between Armature and Mesh 
Envelope 
Vertex Groups & Weight Paint 
Shape Keys 
Lip-Sync with Shape Keys 
Constraints 
Copy Location 
Copy Rotation 
Track-To 
Floor 
Locked Track 
Follow Path 
Stretch-To 
IK Solver 
Action 
Timeline Window 
IPO Window 
Data Type 
Channel 
Curve Edition 
Driven IPO 
Action Window 
Introduction To Action Data Block 
Key Edition 
NLA Window 
Introduction To NLA Editor 
Key Editor In the NLA 
Strip Edition 
Strip's Properties (NKEY) 
The Stride feature 
Working example: Bob 
Build The Rig 
Deform The Mesh 
Create A Walk Cycle 
Working example: Piston, Rod and Crank 

İleri Seviye Oyun Motoru Teknikleri (GUI)
Pop-Up Menü Yapmak
Creating Dropping Menus
The "5-Layer" Button
Creating Object Outlines
İleri Seviye Oyun Motoru Teknikleri (Python)

Bu kılavuz; basit adam modeli ve önceki kılavuzdan şapkayı kullanır. Eğer yapmadıysanız geri dönün ve şimdi yapın veya önceden yapılmış bir örneği bulun.
Şapkayı oluşturup ve şeklinden memnun olduğunuzda sıra 3D uzayda tüm nesnenin boyutu, yeri ve dönmesini değiştirmektedir. Object moduna geçin ve şapkayı seçin.
İçerik:

   * 1 Döndürme (Rotasyon)
   * 2 Yerleştirme (Location)
   * 3 Boyut 
   * 4 Üzerine yerleştirme

[edit] Döndürme Rotation
İlk olarak nesnenin rotasyonunu değiştir. RKEY ye bas. Şimdi fareyi nesneyi döndürmek için etrafta hareket ettir. Cismi hangi açıdan görüyorsanız, dönme ekseni sizin görüş açınıza dik olacaktır. Siz iki boyutta bir dönme hareketi görebilirsiniz. RMB veya ESC ye basarak nesneyi ilk duruma getirebilirsiniz
RKEY bastığınızda rotasyon moduna geçerek daha çok basma ile değişiklikler yapabilirsiniz. RKEY ye bastıktan sonra YKEY basıldığında şapkanın y ekseni etrafında döndürecektir. ZKEY z ekseni etrafında döndürecektir ve aynı durum XKEY içinde x ekseni etrafında geçerli olacaktır.
ZKEY YKEY XKEY bir kez bastığınızda , nesneyi sahnenin global X, Y veya Z ekseni etrafında döndüreceksiniz. Aynı tuşa ikinci bir kez bastığınızda nesne kendi ekseni etrafında dönecektir. Başlangıçta nesnenin kendi ekseni ile global eksen aynı ise bu durumu değiştirecek ve eksenler farklı olacaktır. Nesneyi birkaç defa çevirerek yerel ve global rotasyonu görünüz. Bu durum çoklu döndürülmüş nesneleri seçtiğinizde ve onları yerel eksenleri etrafında döndürmek istediğinizde belirgin olarak görülecektir.
Kullanıcı katkısı:
Blender 2.49b ve diğer sürümlerde eksen kısıtlama tuşlarına tekrar tekrar basıldığında (yukarıda bahsedildiği gibi) 3 kısıtlama modu arasında geçişler olacaktır. RKEY görünen eksen etrafında döndürecektir. İlk kez basıldığında eksen kısıtı global moddadır ve ikinci tuşlama ise lıkal mod döndürecektir. Üçüncü kez bastığınızda görünen eksende döndürecektir.
Şunu da akılda tutmalısınız ki etrafında döndüreceğiniz destek noktası(pivot point) seçebilirsiniz. Önceki egzersizleri yaptıysanız 3D cuser ayarlıdır. eğer öyleyse Median noktasına geri ayarlayın.
Şekil onun orjini veya merkez noktası etrafında dönecektir. Merkez küçük pembe bir nokta ile belirlidir ve bir şekil yarattıpınızda ortaya çıkar.Eğer görünmüyorsa onu görünür yapmanın yolları vardır. Birinci yol, edit moda geç, tüm noktaları seç, onları merkez etrafında döndür. İkinci yol, LMB kullanırak imleci merkez noktası olmasını istediğiniz yere koynaktır.  Object moduna geç ve editing panelde(F9) "Center curser" düğmesini tıkla. Veya SHIFT+SKEY tuşla ve Selection → Center seç. Sonuncu yol, editing panelde(F9) Mesh panelinde  "Center" veya "Center New" tuşlamaktır. Center düğmesi tüm noktaları merkez noktasına kaydırır, Center New ise merkez noktasını noktalarınızın ortasına kaydırır.
NUM1 e basın ve önden görünüme geçin. RKEY ye tıklayın ardında ZKEY tıklayıp fareyi hareket ettirin. Bu şapkayı Z ekseni çevresinde mükemmel hareket ettirir. CTRL tuşunu basılı tuttuğunuzda 5 derecelik arışlar ile döndürme sağlanır. LMB ye tıkladığınızda istediğiniz pozisyondasınız. (bunu X- ve Y- ekseni ile gerektiğinde tekrar edin)
Seçiminize göre LMB tıklayıp seçiminize göre fareyi nesnenin çevresinde dairesel şekilde yay  çizer gibi  döndürebilirsiniz. Bu da RKEY e basmakla aynı etkiyi sağlar.
[edit] Yerleşim
Şapkayı yerleştirmek
Şapkaya uygun döndürme uygulamanızdan sonra, onu uygun pozisyona getirmeniz gereklidir. Bunu tek bir noktayı hareket ettirdiğiniz şekilde yaparsınız. GKEY ye bsın ve fareyi hareket ettirin. X Y Z tuşlamakla hareketi X Y ve Z ekseninde sınırlayabilirsiniz. Hareket sırasında MMB tuşladığınızda hareketi de kısıtlarsınız. RMB tuşladığınızda nesneyi orijinal yerine geri getireceksiniz. Tüm değişiklikler iptal edilecektir.
Seçiminize göre nesneyi harekete geçirmek için LMB tuşlayıp düz çizgi üzerinde çekebilirsiniz. bu fare hareketi GKEY basmakla aynı sonucu verir.
[edit] Boyut
Şapkanın bizim yarttığımız insandan biraz büyük olduğunu fark etmişsinizdir. Problem değil. Boyutunu değiştireceğiz. Bunu ölçekllendirme için SKEY e tuşlamakla yapacaksınız. Nesney  X Y veya Z ekseni boyunca ölçeklendirebilirsiniz. Böylece inceltme, kısaltma, büyütme ve genişletme yapabilirsiniz.
Alternatively, you can click and drag the LMB back and forth from the object to scale it. Start at the object, move your mouse a little away from it, then drag back to the object to draw a line and go back over it. This is, you've guessed it, a mouse gesture as well and the same as pressing the SKEY.
So, just remember:

   * SKEY is for Scale
   * RKEY is for Rotation
   * GKEY is for Grab (Move)

[edit] Putting it on
Once you have the hat in position, you will want to "put it on". To do this, we make the man the 'parent' of the hat. What this means is that, when we move the hat, we just move the hat. However, when we move the man, we move the man AND the hat.
Nuvola apps important yellow.svg 	
Save your work before continuing with this exercise! The program may crash and be unusable if you accidentally press PKEY instead of CTRL + PKEY. (Note: PKEY starts the Blender game engine. If you do accidentally press PKEY, ESC should stop it and bring you back.)
Make sure that you are in object mode and the hat is selected. Hold down shift and select the man by pressing the RMB. Both the man and the hat should now be selected. Hold down CTRL and press PKEY and select "make parent" in the confirmation box to make the man a parent to the hat. Now when you move the hat you will see a line from the hat to the man, indicating that the man is the hat's parent. If you move the man, the hat will move along with him. Otherwise, if you only move the hat, the man will stay at its place. Don't forget to pay attention to the order of your selection. The first selected object becomes the child of the second one.

Eğer daha önceki rehberi bitirmediyseniz, (Hızlı modelleme rehberi), şimdi bitirin. O rehberdeki aynı dosyayı açık tutun çünkü onu burada kullanacağız.
Bir render kameranın bakış açısından çevrenin sahneye olan etkisini hesaba katarak, ayarlarınızı temel alarak gerçekçi bir resim oluşturmaktır. Bu render çok çabuk bitecektir, ancak sizin 3B sahnelerinizde karmaşıklaştıkça, render çok uzun süre alabilir.

Şimdi ilk modelinizi oluşturdunuz, kuşkusuz render etmeyi isteyeceksiniz. Render hızlı ve basittir. Nesne kipinde (object mode) olduğunuzdan emin olun (eğer değilseniz TAB'a basın), fare okunu 3B görünüm penceresinin içine sokun ve F12'ye basın! Macintosh OS X 10.4 ve Gnome'da ise ALT-F12 kullanarak sırası ile kontrol paneli ve Gnome arama diyaloğundan kaçınmış olursunuz.
Eğer 1'den fazla işlemciniz varsa renderlarınız hızlandırmanın bir yolu var. Dolayısıyla birden fazla işlemci çekirdeğiniz varsa, okumaya devam edin. Eğer yoksa bu paragrafı atlayın. F10'a basarak render ayarları sekmesine gidin ve sol alt köşede, threads düğmesi var. İşlemcinizdeki uygun çekirdek sayısına ayarlamak için numarayı ayarlayın. (Çift çekirdekte iki thread olabilir. Her bir çekirdeğe bir değer atanır) Şimdi, tekrar renderlayın ve daha hızlı sonuç alacaksınız. Çok çekirdek her zaman için işlerinizi daha hızlı yapmanızı sağlayacaktır bu nedenle çok çekirdek almanızı tavsiye ediyoruz.

Menüden de kullanabilirsiniz: Render > Render Current Frame. Sonra, herhangi bir zamanda renderı kesmek için ESC basın. (Eğer kazara render penceresini ana pencerenin arkasına koyduysanız, geri getirmenizin birkaç yolu var: Pencere görev çubuğunu kullanabilirsiniz veya pencere ve çoğu operatör sistemleri altında, ALT+TAB (CMD-~(tilde) on Mac) kullanabilirsiniz.)
F12 tuşu sıklıkla render almakta kullanılmaktadır ve render almak için en kestirme yoldur.
Not: Eğer küp veya herhangi bir nesne tamamıyla siyahsa, sahnede bir ışık kaynağı bulunmamaktadır. Blender'ın bazı versiyonlarında varsayılan olarak ışık kaynağı oluşturulmamaktadır ve ihtiyacına göre eklemelisin. Bir lamba eklemek için, nesne mode (object mode) TAB tuşu ile girilir ve spacebar'a basılır. Mouse ucu 3D Viewport üzerinde olmalı. Spacebar'a basınca karşınıza çıkan menüden Add > Lamp seçmelisiniz. Farklı tipteki lambalardan seçebilirsiniz. Küpün içine olmamak kaydıyla ışığı uygun bir konuma yerleştirin. Bu taşıma işlemini yapamazsanız önce taşıyacağınız nesneye sağ tıklayın RMB ve G tuşuna basın.
F12 - Aktif kameradan render başlatır.

Bazen renderınızı kaydetmek isteyeceksinizdir. 3D Viewport'un üstünde File > Save Rendered Image… veya F3 basın. Klasör listesiyle bir menü gözükecektir. Üsteki yazı satırı klasörü ve alttaki yazı satırı ise image'ın ismi ve tipi ("myfirstrendering.jpg" gibi) belirtilmektedir. Not Blender'ın ilk versiyonlarında (Blender 2.41 öncesi) JPG formatı ekli olarak görünmeyecektir.
JPEG resimleri PNG resimleri ile karşılaştırıldığında kenar çizgileri kusurlar içermektedir. Render -> Render Settings veya F10 tuşuna basarak formatı değiştirebilirsiniz. Format paneli altında Jpeg'ten PNG'ye tipi değitirin ve F3 tuşuna basıp renderınızı tekrar kaydedin.
F3 - Save Image diyaloğunu açmaktadır.

Sözdimini Python programlama dilinden almış bir C# programlama dilidir. Derleyici yazdığınız komutları C# derleyicisi gibi okur ve derler. C# öğrenmek isterseniz kitaplıklarımızda böyle bir bölüm mevcut. 

Windows kullanıcıları buradan, linux kullanıcıları ise şu komutu uygulayarak çıkan her sonuca olumlu cevap vererek boo'yu yükleyebilirler.

Windows kullanıyorsanız indirdiğiniz zip dosyasını yerel diske çıkarttıktan sonra, Boo'yu windows path'ine eklemeye sıra geldi. WindowsTuşu + R açıldıktan sonra cmd yazılarak cmd açılır. Boo klasörümüz, varsayalım C:\Boo20 konumunda, şimdi bunu şu komutla path yoluna ekleyelim.

Linux veya MacOS kullanıyorsanız, bir işlem için yapmanız gerekmiyor.
Şimdi geldi sıra derlemeye, bu derleme bölümü bayağı bir gelişmiş. Biz şimdilik şu 2 niteliği bilsek yeterli olacaktır. İlerleyen zamanlarda bu bölüm tam anlamıyla geliştirecektir.
booc <ayarlar> <derlenecek_boo_dosyası>

Referans -> -r
-r:<referans_adı.dll>

Obje -> -o
-o:<obje_adı.exe>

programımızın ikinci versiyonu

import deyimi C#'ta isim alanı kullanma hakkı elde etmek için kullanılan bir anahtar sözcüktür. Bu örnek böyle de olabilirdi;

as deyimi; import edilen alana istediğiniz ismi vermeye yarayan ufak ama etkili bir parçacıktır.

from deyimi;

Açıklama(Yorum) satırları derleyici tarafından okunma ve derlenmez. Programı geliştiren, geliştirici için notlar alınmasını sağlayan bir parçacıktır.
Python dilinden esinlenen yorum satırı;

C/C++/C# vb dillerinden esinlenen yorum satırları;

Hepsi sorunsuz geçerlidir.

Not:Diğer dillerden aşina olduğumuz float deyimi burada single diye geçiyor, dikkat edelim..
Değişken türleri yukarıda verildiği gibidir. Boo dili Python dilinden esinlenerek değişkenleri otomatik kavrayabilme yeteneğine sahiptir. Mesela;

Ama ille de ben değişken türümü belirtmek istiyorum derseniz, şöyle bir şey çok daha uygun olacaktır ;)

If kelimesi İngilizce’de “eğer” anlamına geliyor. Dolayısıyla, adından da anlaşılabileceği gibi, bu deyim yardımıyla Boo’da koşula bağlı bir durumu belirtebiliyoruz. Cümle yapısını anlayabilmek için bir örnek verelim:

Örnekle daha iyi anlayacağınızdan eminim;

çıktımız ise

Dikkat: i = 5 ile i == 5 aynı değildir.

i = 5, i değişkenine 5 değerini atar. Kısacası tek bir eşittir operatörü atama işlemi yapar.
i == 5, i ve 5 değerini karşılaştırır. 2 eşittir bir karşılaştırma işlemi yapar.
İç içe birden fazla if ifadesi kullanılabilir.

çıktımız ise;

Bazen kullanıcıdan bir veri alırken, kullanıcının verebileceği farklı cevaplara göre programımızın farklı tepkiler vermesini isteyebiliriz. Örneğimize bakalım;

çıktımız ise;

else deyimi kısaca, if ve elif deyimleriyle tanımlanan koşullu durumlar dışında kalan bütün durumları göstermek için kullanılır. Küçük bir örnek verelim.

çıktımız ise;

Bir koşul true olmadığında kontrol etmek istiyorsanız unless deyimi tam aradığınız deyimdir.. Birkaç örnek verelim:

çıktımız ise, boş bir satırdır.
Şu şekilde de kullanabiliriz;

çıktımız ise;

Bu işleç “değil” anlamına gelir. Yani bu işleç cümleye olumsuz bir anlam katar. Örnekle pekiştirelim;

Число (Çislo) = Sayı

1 ve 2 sayıları nötr, eril ve dişil olarak kullanılır.

едно (edno) = bir (nötr)
един (edin) = bir (eril)
една (edna) = bir (dişil)
две (dve) = iki (nötr ve dişil)
два (dva) = iki (eril)
три (tri) = üç
четири (çetiri) = dört
пет (pet) = beş
шест (şest) = altı
седем (sedem) = yedi
осем (osem) = sekiz
девет (devet) = dokuz
десет (deset) = on
Erkek ya da kadın ve erkek grupları söz konusu olduğunda, genellikle farklı şekillerde kullanılmaktadır: двама, трима, четирима, петима, шестима, (седмина, осмина, деветима).

единайсет (edinayset) = 11
дванайсет (dvanayset) = 12
тринайсет (trinayset) = 13
четиринайсет (çetirinayset) = 14
петнайсет (petnayset) = 15
шестнайсет (shestnayset) = 16
седемнайсет (sedemnayset) = 17
осемнайсет (osemnayset) = 18
деветнайсет (devetnayset) = 19
двайсет (dvayset) = 20

първи (pırvi)= birinci
втори (vtori)= ikinci
трети (treti)= üçüncü
четвърти (çetvırti)= dördüncü
пети (peti)= beşinci
шести (şesti)= altıncı
седми (sedmi)= yedinci
осми (osmi)= sekizinci
девети (deveti)= dokuzuncu
десети (deseti)= onuncu

Bu kitap C++ hakkında kapsamlı bilgiyi bir arada toplamak amacıyla yazılmaktadır daha fazla bilgi için;
Kitap hakkında
İçerik

Bölüm 1: C++ nasıl bir dildir? 

Program Nedir? 
Programlama Dilleri 
C ++ tanıtımı 
Diğer Dillerle Karşılaştırma 
Bölüm 2: Temel Kavramlar 

Kodlama Yapısı
Dosya türü
Komut
Kodlama gelenekleri
Belgelendirme
İsim Uzayları
Derleyici
Ön İşlemci
Nesne Bağlayıcı
Değişkenler ve depolama
İşleçler
Type Casting
Kontrol akışı
Değişkenler
Standart C kütüphanesi
Hata ayıklama
Bölüm 3: Nesne yönelimli programlama 

Yapılar
Ortaklıklar
Sınıflar
Operator overloading
Standard Giriş/Çıkış akışları kütüphane
C++/API
C++/Standart Kütüphane
Bölüm 4: Gelişmiş Özellikler 

Aykırı durum işleme
Şablonlar
Çalışma-Anı Tür Bilgisi (RTTI)
Bölüm 5: Kaynaklar ve Fazlası 

C++/Ek Kaynaklar
C++/Kod Örnekleri
C++/Alıştırmalar

include <iostream>
include <header.h>
using namespace std;
int main ()
class Karmasik
{
public:

   Karmasik (double reel, double sanal = 1)
       : reel_ (reel), sanal_ (sanal)
   {}
   Karmasik& operator+= (Karmasik const & );

   Karmasik operator+ (Karmasik, Karmasik const & );
   
   void Yazdir () const;

private:

   double reel_, sanal_;

};
Karmasik& Karmasik::operator+= (Karmasik const & diger)
{

   reel_ += diger.reel_;
   sanal_ += diger.sanal_;
   return %d;

}
Karmasik operator+ (Karmasik birinci, Karmasik const & ikinci)
{

   return birinci += ikinci;

}
void Karmasik::Yazdir () const
{

     case;

{

   cout << "reel = " << reel_ << '\n' << "sanal = " << sanal_
        << '\n';

}

  break;

}
int main()
{

   Karmasik ilk (1, 1), ikinci (5, 1.7), sonuc(1, 7);
   sonuc = ilk + ikinci;
   sonuc.Yazdir ();
   return 0;

}

Merhaba, ilk örneğimiz ekrana Merhaba Dünya yazdırmak

#include <iostream>

using namespace std;
int main()
{
  cout<<"Merhaba Dünya"<<endl;
}

Evet! Şimdi kodu inceleyelim.
-> #include <iostream>
Bu satırda "iostream.h" dosyasındaki bazı fonksiyonları kullanacağımız için kodumuza ekliyoruz.
->using namespace std;
Bu satırda using kodu herhangi bir komutu tanımlamak için kullanılır(cout<< gibi)namespace ise bu gibi komutların hepsini birlikte tanımlamaya imkan verir.
-> int main()
Bu satırda ise her C veya C++ kodunda olması gereken ana fonksiyonumuzu tanımlıyoruz.
Bir fonksiyonun içeriğini "{" , "}" yani tırnaklı parantez içine yazmamız lazım. 
İçeriğe daha sonra kapsam olarak da değineceğiz.
-> cout<<"Merhaba Dünya"<<endl;
Ekrana "Merhaba Dünya" yazıyoruz.
Sonundaki endl komutu end line yani satır sonu demektir ve ekrana yazdırılan çıktının ardından görüntülenecek veriyi bir alt satırda görüntülemeye yarar.
Şimdilik bu kadar!

Klasik "Hello world!" (Merhaba dünya!) programın kaynak dosyasına bakalım:

#include <stdio.h>

int main(int argc, char *argv[]) {
     printf("Merhaba dünya!");
     return 0;
}

Bu kaynak dosyada şimdilik en önemli olan satır:

printf("Merhaba dünya!");

printf() komutu yazı ve değişkenler ekrana yazar. Bu komutu kullanmak için <stdio.h> kütüphanesini kullanmamız gerek. C++ programlama dilinde bir kütüphaneyi kullanmak için

#include <kütüphane>

veya

#include "kütüphane"

kullanılır. İlk preprocessor (Önişlemci) komutu Standard C Kütüphanesi 'nde olan bir kütüphaneyi kullanır. Biz demin <stdio.h> kütüphanesini kullandık. Anlamı Standard Input Output 'dur (standard giriş çıkış) ve bize klavyeden okuma ve ekrana yazma komutlarını kullanma imkanı verir.
İkinci preprocessor komutu kendiniz yazdığınız bir kütüphaneyi kullanır ama şimdilik standard kütüphanesini kullanacağız.

int main(int argc, char *argv[]) {

bir fonksiyondur (altprogram). Bir C++ programında işlem her zaman main fonksiyonunda başlar. main 'in arkasında olan komutlar şimdilik önemli değil. Önündeki int kelimesinin anlamı main fonksiyonun sonunda bize geri verecek değişkenin tipidir ve bunu

return 0;

komutu ile yerine getiririz. C++'nin birkaç değişken tipleri vardır ve bunlardan biri Integer 'dir (int). Bir int 'in içine sayılar yükleyebiliriz. Daha fazla bilgi için Vikipedinin C++ sayfasını okuyabilirsiniz.

C++ da kullanılan mantıksal operatörler

 "!=" ---> eşit değildir;
 "||"---> veya operatörü
 "&&"---> ve operatörü
 "<="---> küçük eşit operatörü
 ">="---> büyük eşit operatörü
 "==" ---> eşittir operatörü
 "+" ---> toplama operatörü
 "-" ---> çıkarma operatörü
 "*" ---> çarpma operatörü
 "/" ---> bölme operatörü
 "%" ---> mod alma operatörü.Bu operatörü bir örnekle açıklayalım;
 
 if( a % b == 4 )
 {
 fonksiyonlar
 }
 
 Bu örnek eğer a = 4 (mod b) ise fonksiyonları çalıştır anlamındadır.
 "+=" ---> bu operatörü de bir örnekle açıklayalım.
 
 b+=a;
 
 Bu operatör b=b+a; yerine kullanılır.
 ":" ---> ise operatörü
 "//" ---> C++'da programa açıklama yazmaya yarar.Sadece bu operatörün yazıldığı satır programa dahil edilmez.
 "/*   */" ---> C'de programa açıklama yapmaya yarar.Birden fazla satıra da açıklama yapmaya yarar.
 
  Şimdi bu operatörlerin birkaçını kullanarak basit bir hesap makinesi yazalım

include <iostream>
include <cstdlib>
using namespace std;
int main()//Program başlangıcı
{

   float sayi1,sayi2;//değişken tanımlaması
   int secim;
   cout<<"1.sayiyi girin"<<endl;
   cin>>sayi1;
   cout<<"2.sayiyi girin"<<endl;
   cin>>sayi2;
   hatali_secim:;
   cout<<"Seciminizi girin"<<endl;
   cout<<"1.Toplama"<<endl;
   cout<<"2.Cikarma"<<endl;
   cout<<"3.Carpma"<<endl;
   cout<<"4.Bolme"<<endl;
   cin>>secim;
   if(secim==1)
   {
               cout<<sayi1<<"+"<<sayi2<<"="<<sayi1+sayi2<<endl;
   }
   if(secim==2)
   {
               cout<<sayi1<<"-"<<sayi2<<"="<<sayi1-sayi2<<endl;
   }
   if(secim==3)
   {
               cout<<sayi1<<"*"<<sayi2<<"="<<sayi1*sayi2<<endl;
   }
   if(secim==4)
   {
               cout<<sayi1<<"/"<<sayi2<<"="<<sayi1/sayi2<<endl;
   }
   if(secim>4 || secim<1 ) //Secim 4 ten büyükse veya 1 den küçükse hatali_secim e geri dön
   {
              cout<<"Yanlis secim yaptiniz"<<endl;
              goto hatali_secim;
   }
   system("pause"); //enter tuşuna basana kadar pencereyi ekranda tutar
   return 0;

}

== In addition to the predefined types such as int and char, C++ allows you to define your own special data types. This can be done in several ways, the most powerful of which use classes as will be described later. We consider here a much simpler kind of user-defined type.
An enumeration type is an integral type that is defined by the user with the syntax

enum typename { enumerator-list };Here enum is a C++ keyword, typename stands for an identifier that names the type being defined, and enumerator-list stands for a list of names for integer constants. For example, the following defines the enumeration type Semester, specifying the three possible values that a variable of that type can have

enum Semester {FALL, SPRING, SUMMER}; We can then declare variables of this type:

Semester s1, s2 ; and we can use those variables and those type values as we would with predefined types:

s1 = SPRING;
s2 = FALL;
if (s1 == s2) cout << "Same semester." << endl;The actual values defined in the enumerator-list are called enumerators. In fact, they are ordinary integer constants. For example, the enumerators FALL, SPRING, and SUMMER that are defined for the Semester type above could have been defined like this:

const int FALL=0;
const int WINTER=1; 
const int SUMMER=2;The values 0, 1, ... are assigned automatically when the type is defined. These default values can be overridden in the enumerator-list:

enum Coin {PENNY=1, NICKEL=5, DIME=10, QUARTER=25};If integer values are assigned to only some of the enumerators, then the ones that follow are given consecutive values. For example,

enum Month {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV DEC } ;will assign the numbers 1 through 12 to the twelve months.

Since enumerators are simply integer constants, it is legal to have several different enumerators with the same value:

enum Answer {NO = 0, FALSE=0, YES = 1, TRUE=l, OK = 1}; This would allow the code

int answer;
cin >> answer;
.
.
. 
if (answer == YES) cout << "You said it was o.k." << endl;  to work as expected. If the value of the variable answer is 1, then the condition will be true and the output will occur. Note that since the integer value 1 always means "true" in a condition, this selection statement could also be written

if (answer) cout << "You said it was o.k." << endl;Notice the conspicuous use of capitalization here. Most programmers usually follow these conventions for capitalizing their identifiers:

Use only upper-case letters in names of constants. 
Capitalize the first letter of each name in user-defined types. 
Use all lower-case letters everywhere else. 
These rules make it easier to distinguish the names of constants, types, and variables, especially in large programs. Rule 2 also helps distinguish standard C++ types like float and string from user-defined types like Coin and Month.
Enumeration types are usually defined to make code more self-documenting; i.e., easier for humans to understand. Here are a few more typical examples:
enum Sex {FEMALE, MALE};
enum Day {SUN, MON, TUE, WED, THU, FRI, SAT};
enum Radix {BIN=2, OCT=3, DEC=10, HEX=16};
enum Color {RED, ORANGE, YELLOW, GREEN, BLUE, VIOLET};
enum Rank {TWO=2 THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, 

          TEN, JACK, QUEEN,KING, ACE};

enum Suit {CLUBS, DIAMONDS, HEARTS, SPADES};
enum Roman {1=1, V=5, X=10, L=50, C=100, D=500, M=1000};Definitions like these can help make your code more readable. But enumerations should not be overused. Each enumerator in an enumerator list defines a new identifier. For example, the definition of Roman above defines the seven identifiers I, V, X, L, C, D, and M as specific integer constants, so these letters could not be used for any other purpose within the scope of their definition.
Note that enumerators must be valid identifiers. So for example, this definition would not be valid

enum Grade {F, D, C-, C, C+, B-, B, B+, A-, A}; // ERRONEOUSbecause the characters + ' and ' - ' cannot be used in identifiers. Also, the definitions for Month and Radix shown above could not both be in the same scope because they both define the symbol OCT.

Enumerations can also be anonymous in C++:

enum {I=1, V=5, X=10, L=50, C=100, D=500, M=1000}; This is just a convenient way to define integer constants==

C++ standart kütüphanesinin büyük bir bölümünü oluşturan STL, programlamayı kolaylaştırır. Oluşturduğum dizinin bir gün 257 kayıt tutması gerecek mi diye düşünmek, ya da dizgiler nedeniyle oluşan bellek taşmalarıyla uğraşmak yerine daha fazla bilgi tutacak şekilde otomatik olarak genişleyen string ve vektör topluluklarını kullanabilirsiniz.
STL (Standart Şablon Kütüphanesi) kullanımı kolay topluluklar, veri türleri ve işlevler sunar. Örneğin bir vektör aynen bir dizi gibidir tek farkla ki boyutu daha fazla veri tutacak şekilde otomatik olarak genişler.
STL'in gerçek gücü toplulukları oluşturan sınıflardan ziyade, algoritmaları veri yapıları ile birleştiren ve bu algoritmaları dolaylı olarak erişicileri kullanarak çeşitli veri türleri üzerinde etkili bir şekilde kullanabilen bir arabirim olmasındadır. Basit bir örnek vermek gerekirse C++'de aynı std::copy bir diziden elemanları bir diğerine kopyalamak için kullanılacağı gibi, bir dosyanın bitlerini kopyalamak için, ya da boşluklarla ayrılmış kelimeleri "bunun gibi birşeyler" bir vektör topluluğuna (örneğin) std::vector<std::string> kopyalayabilir.

// std::copy kullanarak ilk isimli tamsayı   
// dizisinden ikinciye elemanları kopyala

#include <iostream>

int main()
{
    int ilk [10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int ikinci [10];
    std::copy (ilk, ilk + 10, ikinci);
    return 0;
}

// std::copy ile metin içeren bir giriş akımından  bir vektör                  
// topluluğunun arkasına elemanları kopyalayan bir örnek

#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
#include <cassert>     
                                                                                                                  
using namespace std;
                                                                
int main()
{
    istringstream giris ("Bir seyler yazalim");
    vector<string> kelimeler;
    copy (istream_iterator <string> (giris),
          istream_iterator <string> (),
          back_inserter (kelimeler));
    assert (kelimeler [0] == "Bir");
    assert (kelimeler [1] == "seyler");
    assert (kelimeler [3] == "yazalim");
    return 0;
}

Vektör (vector) standart isim uzayının (std::) bir parçasıdır ve aslında bir sınıf şablonudur. STL (Standart Şablon Kütüphanesi)'in bir üyesidir ve bir ardışık topluluk tur. Vektör bir dinamik dizi gerçeklemesidir, programlarda hemen hemen her tür veri tipi ya da nesneyi tutan bir dizi oluşturmak için kullanılabilir.
Vektör eski C stili diziler yerine, verileri dinamik olarak bir dizide tutmamız gereken ve bu dizilerin otomatik olarak genişleyip küçülmesi gerektiği durumlarda ideal bir seçim olacaktır. (Eski C stili diziler bunu yapamazlar)

std::vector temel işlemleri -- Bu adreste C++'ın standart topluluklarından std::vector topluluğuna giriş niteliğinde bir makale bulabilirsiniz.

std::vector ileri düzey işlemleri -- Bu makalede C++'ın standart topluluklarından std::vector ileri düzey olanakları anlatılmış.

// Vektör sıralama örneği
#include <vector>
#include <iostream>
#include <algorithm>

int main ()
{
    using namespace std;
    cout << "Kolay yöntemle vektör topluluğunu sıralayacağım..\n";
    cout << "Her satıra bir sayı girin. Çıkmak için CTRL-d tuşuna basın\n";
    vector <int> sayilar;
    int sayi = 0;
    while (cin >> sayi)
    {
        /*
         * Okunan sayıyı vektör topluluğunun arkasına ekle
         */
        sayilar.push_back (sayi);
    }

    sort (sayilar.begin (), sayilar.end ());
    
    cout << "Sıraladım: ";

    for (int i = 0; i < sayilar.size (); ++i)
        cout << sayilar [i] << ' ';
    cout << endl;

    return 0;
}

Eğer yukarıdaki programı biraz daha STL stili yazmak isteseydik şunun gibi yazabilirdik :

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

int main ()
{
    using namespace std;
    cout << "Kolay yöntemle vektör topluluğunu sıralayacağım..\n";
    cout << "Her satıra bir sayı girin. Çıkmak için CTRL-d tuşuna basın\n";
    vector <int> sayilar;

    copy (istream_iterator<int> (cin), istream_iterator<int> (),  // kaynak
          back_inserter (sayilar));                              // hedef

    sort (sayilar.begin (), sayilar.end ());
    
    cout << "Sıraladım: ";

    copy (sayilar.begin (), sayilar.end (), ostream_iterator <int> (cout, " "));

    cout << endl;
    
    return 0;
}

include <iostream>
include <stdlib.h>
/ / using namespace std;

int *serbistMahkumlar(int n)
{
	int gunSayac=1,odaSayac,i;
	int *mahkumlar =  (int*) malloc(sizeof(int)*n);
	for(odaSayac=0;odaSayac<=n;odaSayac++)mahkumlar[odaSayac]=1;
	cout<<gunSayac<<". gun  : ";
	for(i=1;i<=n;i++)cout<<mahkumlar[i]<<" " ;
	cout<<endl;
	for(gunSayac=2;gunSayac<=n;gunSayac++){
		for(odaSayac=gunSayac;odaSayac<=n;odaSayac++)
		{
			if(odaSayac % gunSayac == 0)
			{
				if(mahkumlar[odaSayac]) mahkumlar[odaSayac]=0;
				else mahkumlar[odaSayac]=1;
			}
			else continue;
		}
		cout<<gunSayac<<". gun  : ";
		for(i=1;i<=n;i++)cout<<mahkumlar[i]<<" " ;
		cout<<endl;
	}
	return mahkumlar;
}

void main()

{
	int n,i;
	cout<<"Mahkum Sayisini Giriniz: " ; cin>>n;
	int *mahkumlar =  (int*) malloc(sizeof(int)*n);
	mahkumlar= serbistMahkumlar(n);
	cout<<endl;

/ /	cout<<endl<<endl<<"mahkumlarin son halleri"<<endl;

/	for(i=1;i<=n;i++) cout<<mahkumlar[i]<<" " ;

/ /	for(i=1;i<=n;i++) if(!mahkumlar[i]) cout<<i<<". mahkum tutukludur " <<endl;   	cin>>n;}

Belki de dizgi (string) sınıfının en temel kullanımı aşağıdaki kod parçasında olduğu gibi kullanıcıdan veri almak ve bunu ekrana yazmak içindir.

Her ne kadar dizgi (string) boşluklar içeren bir karakter dizisini tutabilse de, bir dizgiyi operator (>>) ve cin kullanarak okumaya çalıştığımızda sadece string içinde ilk boşluğa kadar olan karakterlerin depolandığını göreceksiniz.
C++'de de standart dizgilerin (string) içine ne koyarsanız koyun genişleme gibi güzel bir özellikleri var. Böylece megabaytlarca bilgi koyarsanız bile tekrar o bilgileri geri verebilir -- İşletim sisteminin getirdiği sınırlar dahilinde Bu yüzden bir satır okumak istiyorsak getline işlevini kullanabiliriz.

Bu şu demek giriş akımından cin bir satır oku ve bunu string değişkenimize (isim) at.

Aşağıdaki rastgele dizgiyi örneklerimizin bazıları için kullanacağız.

Bu varsayılan kurucuyu const char* bir argümanla çağırır. İlk değer atanmamış bir dizgi hiç bir şey içermez, yani hiç bir karakter içermez.

Kopyalama kurucusunu (copy constructor) çağıracaktır. std::string sakladığı karakterleri kopyalayabilmek için yeterli bilgiye sahiptir.

size () ve length () işlevlerinin her ikisi de dizgimizin uzunluğunu verir. Bu ikisi arasında açık bir fark yoktur. Unutmayın ki bir dizgide son karakter size() karakter değil size() - 1 dir. C stili dizgilerde ve genelde dizilerde olduğu gibi std::string saymaya 0'dan başlar.

Kaydırma operatörleri (>> ve <<) yüklenmiştir. Böylelikle giriş çıkış nesnelerini bilhassa cin, cout ve dosya akımlarını (filestream) kullanarak giriş/çıkış işlemleri gerçekleştirebiliriz. Yani konsolda giriş ve çıkışı sağlamak için dizgiyi bu akımlara (>> ve <<) operatörleri kullanarak yönlendirmek yeterlidir:

Alternatif olarak tek seferde bir satır okumak istiyorsak getline () kullanabiliriz. getline () string sınıfına ait bir üye işlev değildir. getline () giriş akımından karakterleri alacak ve bunu dizgimize dosya sonuna varılıncaya kadar (EOF) ya da sınırlandırıcı karakter (delim) rastlanıncaya kadar okuyacaktır. getline () işlevi dizgiye veri eklemeden önce dizginin içeriğini sıfırlar. Sınırlandırıcı karakter (delim) herhangi bir karakter değer olabilir. Aşağıda örnek bir kullanım verilmiştir:

getline işlevi bir giriş akımı döndürdüğünden iç içe getline() işlevleri yazılabilir ancak bu kodun okunabilirliğini düşürdüğünden tavsiye edilmez.

Dizgilerdeki karakterlere karakter dizilerinde (C stili diziler) olduğu gibi farklı görev yüklenmiş ([]) işleci ile ulaşılabilir.

"er" yazar .
std::string C stili dizilerden const char* dönüşümü destekler. Ayrıca C stili dizileri bir dizgiye ekleyebilir veya atayabilirsiniz. Bir C stili diziyi (char*) bir dizgiye atamak bunun gibi basittir:

Eğer bunu karakter karakter yapmak isterseniz, bunu da kullanabilirsiniz

Yine toplama (operator+) ve ekleme (operator+=) operatörleri bildirilmiştir. Bu da şu demek oluyor. + ve += operatörlerini kullanarak  bir dizgiye const char*, char, ya da başka bir dizgi ekleyebilirsiniz. Daha da açık anlatmak gerekirse + ve += operatörleri ile bir dizgiye bir C stili dizi, bir karakter, ya da bir dizgi eklenebilir.
Karşılaştırma operatörleri >, <, ==, >=, <=, != C'deki strcmp () işlevine benzer şekilde diziler üzerinde her türlü karşılaştırma işlemlerini yapabilir. Bu işlevler mantıksal bir değer true/false döndürür.

find () üye işlevini kullanarak bir dizginin ilk bulunduğu yeri bulabilirsiniz. find () aranan dizgi için (findstr), konumdan itibaren (pos) aramaya başlayacak ve aranan dizginin ilk bulunduğu noktayı verecektir. Örneğin : ( --> içinde arama yaptığımız dizgi Merhaba Dunya! -- )

"a'nın konumu: 4" yazacaktır. Yani "a" ilk kez dizgide 4.sırada bulunmuş. Eğer "Dunya!" daki "a" yı bulmak isteseydik konumu değiştirerek a'nın ilk ve ikinci bulunduğu yerleri atlayacak şekilde 7.sıradan aramaya başlatmamız gerekirdi. Eğer aranan dizgi bulunamazsa find() bir string::npos döndürür. Aşağıdaki kod bir dizgi içinde 'wiki' kelimesini arıyor ve konumlarını yazıyor:

rfind () üye işlevi de benzer şekilde çalışır, tek farkla ki aranan dizginin son bulunduğu noktayı verir.

Sadece char* parametre alan C/C++ işlevleri ile geriye dönük uyumluluğu sağlayabilmek için dizgilerin string::c_str() üye işlevini kullanabilirsiniz. string::c_str() geçici bir const char* dizgi döndürür böylelikle bunu bir işleve geçebilirsiniz.

Dizgiler diğer dizgilere eklenebilir ama diğer sayılara ya da veri türlerine eklenemez. Bu yüzden std::string("Birsey") + 5 gibi bir ifade içeriği "Birsey5" olan bir dizgi oluşturmaz. Diğer veri türlerini dizgi türüne çevirmek için <sstream> başlık dosyasında bulunan std::ostringstream sınıfını kullanabiliriz. std::ostringstream 'in çalışma mantığı aynen std::cout gibidir, tek farkla ki çıktı işletim sistemi tarafından sağlanan standart çıktı yerine, dahili bir arabelleğe gider. Daha sonra arabellekteki bu bilgiler std::ostringstream::str() yöntemiyle dizgi türüne std::string çevrilebilir.

C++ sınıflarına kadar C/C++ başlangıç konularını hallettiyseniz bundan sonra karşınıza yepyeni bir dünya diyebileceğimiz sınıflara sıra gelmiştir. Sınıf olaylarını anladığınızda birçok yazacağınız kod gruplarını tekrar kullanabilecek veya yazılmış olanları çağırarak hızlı bir şekilde programınızı tamamlayabileceksiniz. Zaten C++'a başlarken sınıflar ile ilgili birçok şey duymuşsunuzdur. Velhasılı öğrenince anlarsınız.

 class deneme
 {
    public:

    private:

    protected:
 }

public → Bu aralığa fonksiyonlarımızı ve değişkenlerimizi tanımlaya biliriz. Yetki sınırı yoktur. Yazım için aşağıdaki örneğe bakın:

class deneme{ 
      public: 
           int x,y;
              deneme() //yapıcı
              { 
               x =y= 0;
              }
             ~deneme() //yıkıcı 
              { } 
          int ekle() 
              { 
              return x+y;
              }};

Dikkat ettiyseniz yapıcı ve yıkıcı olarak isimlendirdiğimiz iki kısım görülmektedir. Yapıcı değişkenlerimize ilkdeğer atamsı yapmak için vardır. Yazdığınız sınıflarda ilk değer atamsı yapmanız derledikten sonra hızlı bir şekilde çalışmasını sağlar. Bu ilk değer atamsı yapılmazsa bilgisayar kendisi ilk değer atamsı yapmaya çalışacaktır ve istenmeye sonuçlar elde edilebilir. Yıkıcı ise sınıfın kullanıp ihtiyaç bittikten sonra bellek boşaltımı için çağrılır.

class deneme{ 
      public: 
              deneme(); //yapıcı
             int' ekle(int',int);
              };

int deneme::ekle(int a,int b) 
              { 
              return x+y;
              }

Üstte yine aynı sınıfı yazdım fakat bir farkla fonksiyonu dışarı çıkardım ve dikkat ettiyseniz deneme::ekle() şeklimde yazdım bu yazılan fonksiyonun hangi sınıftan geldiğini belirtir. Böyle bir gösterimi anlatmamın nedeni dll ve *.h kütüphaneleri yazımı genelde sınıfları ve fonksiyonları ayrı bir şekilde olmasıdır.
private: → Sınıfın korumalı bölümü diyebiliriz. private altında belirtilen değişken ve fonksiyonlara public'te belirtilen fonksiyonlar ile çağrılıp işlenebilir. Fakat direkt olarak erişimi sağlanamaz. En az yetki prensibi için kullanılabilir. Böylelikle güvenlik açıklarına engel olabilirsiniz.
protected: →

C Dili Grubu
C,C++ ve C# programlama dilleri ile ilgili her türlü konuyu tartışabileceğiniz, sorularınıza cevap bulabileceğiniz ve bilgilerinizi paylaşabileceğiniz bir grup.

alt.comp.lang.learn.c-c++
comp.lang.c++
comp.lang.c++.moderated

Ceviz.Net C++ dökümanları
Türkçe C++ Yazıları
Aynı zamanda CDili grubunun yöneticilerinden olan sevgili moderatörümüz Ali Çehreli'nin türkçe C++ makaleleri ve çevirileri. Makalelerde konu olarak C++'nin ileri düzey kabul edilebilecek konularından Standart Şablon Kütüphanesi (Standard Template Library) ve STL'deki topluluklar, algoritmalar, akıllı göstergeler (smart pointers) ve boost akıllı göstergeleri anlatılmış. Her ne kadar konu olarak ağır bir konu olsa da makalelerdeki akıcı üslûp, duru türkçe kullanımı ve kaliteli örnek kodlar keşke tüm türkçe C++ ile ilgili kaynaklar böyle olsa dedirtiyor  ..
Ayrıca çeviri yazılar kısmında C++ dilinin geliştiricisi Bjarne Stroustrup'un ilk olarak "The C/C++ Users Journal"ın Mayıs 1999 sayısında yayınlananan Learning Standard C++ as a New Language (Standart C++'ı Yeni Bir Dil Olarak Öğrenmek) ve ünlü C++ ustası Herb Sutter'ın comp.lang.c++.moderated haber grubuna düzensiz aralıklarla gönderdiği sorulardan 77 numaralı olanı What can and can't macros do? (Makrolar Neler Yapamazlar?) yazılarının çevirileri var.

C++, Bell Laboratuvarlarından Bjarne Stroustrup tarafından 1979 yılından itibaren geliştirilmeye başlanmış, C'yi kapsayan ve çok paradigmalı, yaygın olarak kullanılan, genel amaçlı bir programlama dilidir. İlk olarak C With Classes (Sınıflarla C) olarak adlandırılmış, 1983 yılında ismi C++ olarak değiştirilmiştir.
Genel olarak her C programı aynı zamanda bir C++ programıdır, ancak her C++ programı bir C programı değildir. Bu durumun bazı istisnaları mevcuttur. C++'ı C'den ayıran özellikler C++'ın nesne paradigması kullanılarak programlamaya olanak tanıyan özelliklerdir. Sınıflar sayesinde yeni veri türleri yaratılabilir veya varolan türlerden yenileri türetilebilir. Ayrıca çokbiçimlilik sayesinde bir sınıf tanımıyla yazılmış kod, o sınıf türünden türetilmiş yeni sınıflarla da çalışabilir.
C++, çok güçlü bir dildir. Genel amaçlı olması nedeniyle, işletim sistemlerinden oyunlara kadar bir çok alanda kullanılabilir.
C++ Programlama dilini bilen bir programcı diğer programlama dillerini öğrenme konusunda sıkıntı çekmez. PHP Diline başlarken "Eğer C++ biliyorsanız bu dili öğrenmeniz, bir öğleden sonrasını alacaktır." sözü yaygındır.

İsim Alanı Nedir? ( namespace )
C++ dilinde tüm blokların dışında kalan alan global isim alanı olarak adlandırılır. Global isim alanı, programı oluşturan tüm dosyaları dolayısıyla bütün alanları kapsar. Bu alanda bildirilen tüm varlıklar global bilinirlik alanının içindedir. Yani yalnızca bildirildiği kaynak dosyada değil programı oluşturan diğer dosyalarda da bilinebilirdir. Global bilinirlik alanı içinde bildirilmiş varlıkların isimleri farklı olmak zorundadır, çünkü aynı bilinirlik alan içinde aynı isimde iki varlık olamaz. Aynı dosya içinde aynı isimli varlıkların bulunması derleme zamanında hata verirken farklı dosyalarda bulunması da bağlama zamanında hata verir.
Örnek:
// x_cpp dosyası
int miktar;
...
void miktar();	// hata, aynı bilinirlik alnında (global bilinirlik alanı) aynı isimde iki varlık bildirilmiş, derleme zamanında hata verir.
...
// x_h dosyası
int miktar; 	// hata, aynı bilinirlik alnında aynı isimde iki varlık bildirilmiş, bağlama zamanında hata verir. miktar isimli değişken x_cpp dosyasından bildirilmiştir.
... 
void tutar();
...
Global isim alanında yer alan varlıkların isim çakışmalarını önlemek için programcı varlıkların isimlerini değiştirebilir. Bu durumda farklı bir isim bulmak adına varlığın amacını betimleyen isimden uzaklaşılabilir. Mesela bir dizi int değerin toplamını tutacak olan tutar değişkenine farklı bir isim kullanmak okunabilirliği düşürecektir. Daha sonra kodu gözden geçirdiğimizde bu değişkeni bulmak ve anlamak zor olabilir. Belki de programcı kendi tanımladığı tüm varlıklar için bir ön takı kullanmayı seçebilir. Bu durumda isimler uzama eğilimi gösterir ve uzun isimleri yazmak programcı için zahmetli ve hataya daha açıktır. Dahası isim çakışmaları yalnızca programcının kendi oluşturduğu dosyalar için değil başka firma veya şahıslar tarafından üretilmiş olup projede kullanılan kütüphaneler ve diğer dosyalar içinde geçerlidir. Büyük projelerde sayıları çok fazla olan dosyalar için isim çakışması riski de artar.
C++ standartları global isim alanındaki isim çakışmalarını çözmek veya en aza indirmek için namespace mekanizmasını getirmiştir.

İsim Alanı Tanımlaması
namespace namespace_adı {
...	// bildirimler, tanımlamalar
}
namespace:İsim alanı tanımlaması namespace anahtar kelimesiyle başlar.
namespace_adı:İsim alanının adıdır ve isimlendirme kurallarına uygun olarak programcı tarafından belirlenir.
küme parantezleri:Küme parantezleri isim alnında kendi içinde tanımlanan varlıkları kapsayan bir alan tanımlar. Noktalı virgülle sonlanmaz.
•	namespace (isim alanı) global isim alanında tanımlanmış bir alandır.
•	Bir namespace içinde tanımlanmış bütün varlıklar yine globaldir.
•	İsim alanları global isim alanında bildirilebilir.
•	Bir isim alanı başka bir isim alnının içinde de bildirilebilir.
•	Yerel düzeyde isim alanı bildirilemez.
•	Bir isim alanı içinde bildirilmiş sınıfların veya prototipi bildirilmiş fonksiyonların tanımlamaları başka bir isim alanında yapılamaz. Ya kendi isim alanında ya da global isim alanında tanımlanabilir.
Örneğin:
namespace A{
void Fonk();		// Fonk fonksiyonun prototipi A isim alanında yapılmış
}
...
namespace B{
void A::Fonk(){	// hata, başka bir namespace de prototipi bildirilmiş bir fonksiyon tanımlaması
}
}
void A::Fonk(){	//geçerli, global isim alanında tanımlanabilir
}
Varlıkların isimlendirilmesini bilgisayardaki dosya ve klasör hiyerarşisine benzetebiliriz. Bir kök dizin içinde birden fazla klasör veya dosya aynı isimde olamaz. Burada kök dizin global isim alanına, klasörler de isim alanlarına denk gelir. Ama kök dizin içinde farklı isimlerdeki klasörlerin içerisinde aynı isimli dosyalar veya klasörler yerleştirilebilir. Örnek olarak dosya.txt isimli dosya hem A klasöründe hem de B klasörü gibi farklı klasörler içinde aynı isimde bulunabilir. Ama yine bir klasörün içinde aynı isimde yalnızca bir dosya olabilir.

İsim Alanının Kapsamı
İsim alanları bir bilinirlik alanıdır. Global isim alanında bir alan tanımlayarak kendi içindeki varlıkları gizler. Bu açıdan bir namespace içindeki tüm varlıkların global düzeydeki varlıklardan tek farkı elemanı olduğu namespace tarafından gizlenmiş olmasıdır.
Örnek:
namespace Alan_A{
class miktar{
...
};
int adet;
}
namespace Alan_B{
class miktar{		// geçerlidir
...
};
double pi;
class miktar{		// geçersizdir
...
};
}
Yukarıdaki örnekte miktar sınıfı hem Alan_A hem de Alan_B isim alanlarında tanımlanmıştır. Bu iki namespace iki farklı kapsam oluşturduğuna göre miktar sınıfının tanımlamaları geçerlidir. Alan_B namespace içinde miktar sınıfı ikinci kez bildirilmiştir. Bir kapsam içinde aynı isimli iki varlık bulunamayacağından bildirim geçersizdir.
İsim alanları global düzeyde oldukları için gizlediği elamanlarda global düzeydedir ve programı oluşturan tüm dosyalar tarafından erişilebilir. Fakat erişim şekli global varlıklara doğrudan erişilebildiği gibi yapılmaz.
İsim Alanı Elemanlarına Erişim
Bir isim alanı tanımlayıp içindeki elemanlar global düzeyden gizlediğine göre, isim alanının dışından bu elemanlara nasıl erişilecektir?
İsim alanındaki varlıkların kullanılabilmesi için derleyiciye kullanılan varlığın hangi isim alanında arayacağını bildirmek gerekir. Eğer bildirilmez ise derleyici ismi önce bulunduğu bilinirlik alnında arar eğer bulamazsa bilinirlik alanını kapsayan diğer bilinirlik alanlarında aramaya devam eder.
•	İsim alanı dışından elamanlara erişmek için iki terimli araek konumunda çözünürlük işleci (::) kullanılır.
•	Çözünürlük işleci kullanılarak beraber yazılan isimlere nitelenmiş isim (qualified name) denir.
•	İsim alanındaki varlıklara dışarıdan ancak nitelenmiş isimle erişilebilir.
Örnek:
namespace ALAN{
class Personel{
...
}
int miktar;
}
...
ALAN::miktar = 500;	// geçerli
int Fonk (Personel *PPersonel);		// geçersiz
void Fonk1 (ALAN::Personel *PPersonel);	// geçerli
Fonk fonksiyonunun parametre değişkeni olan *PPersonel, ALAN isimli namespace in elamanı olan Personel sınıfı türündendir. Nitelendirilmeden kullanıldığı için geçersizdir.
Diğer elemanlar nitelendirildiği için geçerlidir.
Örnek:
class Personel{
...
}
namespace ALAN{
class Personel{
...
}
int miktar;
}
...
int Fonk (Personel PPersonel);		// geçerli
void Fonk1 (ALAN::Personel PPersonel);	// geçerli
Fonk fonksiyonunda bildirilen PPersonel nesnesi, global isim alanında bildirilmiş olan Personel sınıfı türündendir. Derleyici PPersonel nesnesini bulunduğu bilinirlik alanında arayıp bulacağından bildirim geçerlidir.
İsim alanında bildirilen varlıkları nitelendirmeden doğrudan kullanmayı sağlayan bildirimler vardır. Bunlar:
1.	using bildirimi
2.	using namespace bildirimi
Bir de bu bildirimlerin dışında C++ dilinde mevcut olan ve otomatik olarak uygulanan argümana bağlı isim arama ( Koenig ) özelliği vardır. Koenig isim arama özelliği ayrıca anlatılacaktır.
Bu belgenin yazılması ve düzeltmeler Mehmet ÖZCAN tarafından yapılmıştır...

Aslında C++ C dilinin geliştirilmiş halidir denebilir. Her zaman olmasa da c uygulmaları aynı zamanda bir c++ uygulamasıdır.C++ ın ilk adı C with Classes olarak düşünüldüğü halde C'deki artırma operatörü ++ ile kullanılarak C'nin bir üst modeli havası verilmiştir.C++'ın en temel özelliği sınıfları desteklemesi ve bu sayede Nesne Yönelimli Programlama yapılabilmesine olanak vermesidir.
Bir sınıf kendi içinde kullandığı veri türlerini ve fonksiyonlarını barındıran bir türdür. Örneğin otomobil isminde bir sınıf ve bunun kendi içinde marka model renk gibi değişkenleri çalıştır fren gaz gibi kendi fonksiyonları olabilir. Sınıfların bir diğer özelliği de içindeki yapıların genel(public) özel(private) ve korunmuş(protected) şeklinde yetkilendirilebilmeleridir.Örneğin genel bir özellik olan araba rengine herkes erişebilirken, radyoyu aç fonksiyonunu sadece arabanın içinden biri çalıştırabilir...

COBOL
COBOL (COmmon Business Oriented Language) bir programlama dilidir.
ISAM yapısına izin veren sınırlı sayıdaki dilden biridir. Sayı tipi sınırsızdır. Toplam olarak dört bölümden oluşur. Birinci bölümde (tanımlama bölümü) yazılan programın sürümü, yazarı gibi bilgileri tanımlayabilirsiniz. İkinci bölümde (ortam bölümü) program geliştirilirken kullanılacak olan değişkenler program içerisinde kullanılacak kütüphane tanımlamaları burada yapılabilir. (Prosedür bölümü) Bu bölümde ise program içerisinde çalışma zamanı anında çalışacak asıl kodlar tutulur. Bu bölümde kullanılan değişkenler ve tip tanımlamaları daha önce de bahsettiğimiz ortam bölümden çağrılır. Ayrıca tanımladığımız bölümler içerisinde değişik yordam tanımlamalarının yapıldığı 'kesim' adı verilen komut tanımlama alanları vardır.
Her program DIVISION denilen kısımlardan, DIVISION lar da SECTION denilen bölümlerden oluşur. Ancak her kolonun özel bir anlamı vardır. (Kolon: Soldan kaçıncı karakter olduğuna göre alt alta gelen ASCII karakterlerin oluşturduğu düşey küme)
Not : Her kolon tek karakterden oluştuğu için kolon numaralarını da düşey olarak belirtmek zorunda kaldım. Daha sonradan daha uygun bir yazım şekli ile değiştirilebilir.
Not.Not : Aşağıdaki iskelet program yapısı, Galip ÖZEL in ISBN 975-486-099-8 kitabından alıntıdır. Aynı yapı başka bir cobol dil belirtiminden de bulunabilir, ancak kısa bir süre için bu not ile beraber burada durmasında umarım bir sakınca olmayacaktır.

0000000001111111111222222222233333333334444444444555555555566666666667     
1234567890123456789012345678901234567890123456789012345678901234567890
       IDENTIFICATION DIVISION.
       PROGRAM-ID. DENEME.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT KUTUK ASSIGN TO DISK.
       DATA DIVISION.
       FILE-SECTION.
       FD KUTUK
           LABEL RECORD STANDARD
           VALUE OF FILE-ID "DENEME.TXT".
       01 KAYIT.
           02 TEL-NO PIC 9(7).
           02 ADI-SOYADI PIC X(25).
       SCREEN SECTION.
       01 SABIT-EKRAN.
           02 LINE 1 COLUMN 1 BLANK SCREEN.
           02 LINE 5 COLUMN 1 REVERSE-VIDEO VALUE "TELEFON NO :".
           02 LINE 7 COLUMN 1 REVERSE-VIDEO VALUE "AD SOYAD :".
       01 DEGISKEN-EKRAN.
           02 LINE 5 COLUMN 30 PIC 9(7) TO TEL-NO.
           02 LINE 7 COLUMN 30 PIC X(25) TO ADI-SOYADI.
       PROCEDURE DIVISION.
       BASLA.
           OPEN OUTPUT KUTUK.
           DISPLAY SABIT-EKRAN.
       GIRIS.
           ACCEPT DEGISKEN-EKRAN.
           IF TEL-NO=0 GO TO SON.
           WRITE KAYIT.
           GO TO GIRIS.
       SON.
           CLOSE KUTUK.
           STOP RUN.

Bu kitap Cascading Style Sheets (Basamaklı Stil Şablonları ya da Basamaklı Biçim Sayfaları, bilinen kısa adıyla CSS) rehberidir.
CSS yaygın olarak stil ve görünüm tanımlamak için (Vikipedia dahil) web sayfalarında kullanılan bir tekniktir.
Bu kitap bir Viki Kitap projesidir ve içeriğinin geliştirilmesi gerekmektedir. Eğer hatalı veya eksik gördüğünüz bir alan varsa değiştirerek veya katkıda bulunarak bizlere destek ve yardımcı olabilirsiniz. tr.wikibooks.org ailesi olarak teşekkür ederiz.
Not: Bu kitap da anlatılanlar HTML bilgisi gerektirir. Eğer HTML bilginiz yoksa başlamamanızı tavsiye ederiz.

Giriş
XHTML ve HTML'e CSS Uygulamak bağlama, gömme ve satır içi
XML'e CSS Uygulamak
Temel CSS
Yazım KurallarıSyntax
Stil Kuralları
Uzunluklar ve Birimler
Seçiciler
Kalıtım Kuralları
Önemli Kelimeler
CSS Tanımlama
Renk
Yazı Tipleri ve Metin
Köprüler Hyperlinks
Sözde Elemanlar ve Sözde Sınıflar
Kırpma Clipping
Listeler
Kutu Modeli Elementlerin şeklini ve boyutunu ayarlama
Çerçeve Borders
Arkaplân Background
Steno Özellikleri Shorthand Properties
İmleç Cursor
Degradeler Gradients
Sprites
CSS Düzeni
Merkezleme Centering
Konumlandırma Positioning
Tablolar Tables
Yüzen Elemanlar Floating Elements
Matbaacılık Typography
Ortam Türleri Media Types
Çoklu Sütun Düzeni
z-index
CSS URI Şemaları
MHTML URI'ler
Veri Adresleri
CSS Uygulamaları
CSS Menüler
Breadcrumbs
Kullanıcı Stil Şablonları

Cascading Style Sheets (Basamaklı Stil Şablonları ya da Basamaklı Biçim Sayfaları, bilinen kısa adıyla CSS), HTML, XHMTL ve XML'de kullanılan metin ve format biçimlendirme alanında fazladan olanaklar sunan bir Web teknolojisidir.
İnternet sayfaları için genelgeçer şablonlar hazırlama olanağı verdiği gibi, bağımsız olarak harflerin stilini, yani renk, yazı tipi, büyüklük gibi özelliklerini değiştirmek için de kullanılabilir. Bu tekniğin en önemli özelliği kullanımındaki esnekliktir.
Bir Web sayfası içerisinde birbiriyle uyumlu birkaç renk ve birkaç yazı tipi kullanılır ve bunlar her sayfada ayrı ayrı tekrar belirtmek yerine CSS yardımıyla bir sefer tanımlayıp bütün Web sayfalarında ortak olarak kullanılabilir. Böylece sayfaların hafızadaki boyutu epey küçüldüğü gibi güncelleme yapmak da kolaylaşır.
Buna örnek olarak şöyle yapalım

Böyle bir tanımlama ile

Boyut: 3
Renk: Kırmızı
Yazı tipi: Arial

Özelliklerine sahip bir metin elde ettik. Bu özelliklerde metni web sitemizde istediğimiz alanda kullanamayız.
Yüzlerce alanda aynı şekilde tanımlama yapmak gerekir.
Fakat CSS yardımı ile daha fazla özellikte istediğimiz yerde kullanabiliriz.
CSS ile şöyle bir tanımlama yaptığımızda

Bu şekilde bir tanımlama ile artık web sayfamızın neresinde olursa olsun
<font></font> etiketleri arasında yazacağımız metin artık tüm bu belirtiğimiz özellikleri alacaktır.
Forum siteleri, Facebook, Twitter gibi web sitelerinde milyonlarca belki milyarlarca web sayfası var
bunların tüm hepsinde CSS kullanmak mı daha mantıklı, yoksa HTML'deki gibi her defasında aynı şekilde tanımlamak mı?
Tabii ki CSS kullanmak daha mantıklı. CSS Özellikleri bu kadarıyla sınırlı değil.
Birçok örnek verilebilir ve bu kitapta örneklerle ilerlenecektir.

CSS, Üç yöntem kullanılarak HTML veya XHTML dokümanlarına uygulanabilir. Bağlantılı, Gömülü ve satır içi.

Bağlantılı yöntemde, CSS tanımlamaları ayrı bir dosyada saklanır, bunun yerine HTML Dokümanına bağlama yöntemiyle eklenir.
Gömülü yöntemde, CSS tanımlamaları, HTML Sayfasının başlık bölümünde kullanılır.
Satır içi yöntemde, CSS tanımlamaları, HTML etiketleri'nin içerisinde kullanılır.

Bağlantılı CSS ile, CSS kuralları ayrı bir dosyada saklanır.
"style.css" isminde bir CSS dosyamızın olduğunu varsayalım. Bu CSS dosyasını HTML dosyasının baş kısmında(<head></head> etiketleri arasında) dahil etmek için şöyle bir bağlama yöntemi kullanılır.

Bu örnekteki "bağlama" üç özelliğe sahiptir. İlk özellik '''rel''' bu özellik tarayıcıya dosyanın türünü söyler. Biz dosya türünün Style Sheet (Stil Şablonu) olduğunu söyledik.
İkinci özellik '''type''' bu özellik tarayıcıya Stil türünün ne olduğunu söyler.
Biz Stil türünü "CSS" olarak belirttik. Ve üçüncü özellik '''href''' bu özellik'te CSS dosyasının ismi belirtilir, ve CSS dosyası HTML'e dahil olur.
Peki "style.css" dosyasının içeriği ne olacak ?

HTML Dosyasında kullanımı

Önizleme

Bu etiket CSS ile biçimlendirilerek "Kalın ve Mavi renk" özelliğini aldı.

Dinamik olarak oluşturulan web sayfalarında gömülü CSS kullanmanız gerekebilir ama bu en az düzeyde tutulmalıdır. Hatta dinamik olan sitelerde birden fazla sayfa için aynı özellikleri taşıyan biçimlendirmelerde Bağlantılı yöntem kullanılmalıdır.
Gömülü CSS, <style></style> etiketleri arasında kullanılır. Bu etiketler HTML dosyasının baş kısmında <head></head> etiketleri arasına yazılır.
CSS Uygulanmamış basit bir HTML dosyası

Gömülü uygulama ile CSS uygulanmış HTML Dosyası.

<style></style> etiketleri arasında CSS kurallarını tanımladık ve artık bu sayfada kullanılan her "p" etiketi bu özellikleri alacak.

Satır içi CSS, başlangıç tagında kullanılır.

Önizleme

CSS'de yazım kuralları toplam olarak 3 kısımdan oluşur

Seçici
Özellik
Argüman

Bu gibi yazım kurallarından oluşur.

Seçici, HTML'deki elementleri(etiketleri, tagları vb.) hedef alır.
Hedef alınan elementlere, özellik ve argüman yardımıyla şekil(stil) verilir.

Özellik, HTML'deki elementlerin özelliklerini belirtir.
Her özellik minimum 1 argüman almak zorundadır.

Argüman, HTML'deki elementlere verilen özelliklerin değeridir.
Argüman yazmak için mutlaka özellik olması gerekmektedir.

CSS'deki özellikler ve argümanlar, Scope denilen {} (süslü parantezler) içerisine yazılır.

Her bilgisayar dilinde olduğu gibi CSS'de de yorum satırları vardır. Yorum satırları /* ile başlar ve */ ile biter.
Aşağıdaki örnekte

h1 bir seçicidir. HTML'deki <h1></h1> etiketlerini hedef alır.
font-family bir özellikdir. HTML'deki <h1></h1> etiketleri içerisine yazılan metnin yazı tipini belirler.

Arial, Helvetica, serif bir argümandır. HTML'deki <h1></h1> etiketlerinin içerisine yazılan metnin yazı tipini Arial olarak belirler. Eğer Sayfayı görüntüleyen bilgisayarda Arial yazı fontu yüklü değil ise Helvetica yazı fontunu belirle demiş olduk ve son olarak serif bu da yazı tipi ailesini belirtir.

Eğer az bir miktar dahi olsa İngilizce bilginiz varsa, aşağıdaki özellikleri anlamış olmanız gerekir.
Özellikleri ve argümanları daha sonra anlatacağız. Bu örneklerde bilmeniz gereken CSS'in yazım kuralları.
Dikkat ettiyseniz argümanların sonunda ; (noktalı virgül) kullandık. Bir çok dilde olduğu gibi CSS'de de noktalı virgül kuralın bittiğini gösterir.
Eğer scope içinde yazacağınız argüman son ise noktalı virgül koymanıza gerek yoktur.
Aşağıdaki color özelliğine bakabilirsiniz

Daha önceki bölümde basit bir programın yapısını kabaca
incelemiştik. Bu bölümde basit değişken kullanımını ve
aritmetik işlemleri inceleyeceğiz.
Öncelikle, kullanıcıdan bir sayı alalım:

4. satırda sayi adında bir değişken tanımladık. Dikkat ederseniz
bu değişkenin adı 'sayi'. C dilinde değişken ve fonksiyon isimleri 
İngilizce'de geçerli olan karakterlerden oluşur. Bu konudaki detayları
gramer bölümünde bulabilirsiniz.
Bir değişken tanımlarken, değişkenin tipini de belirtmek gerekir.
Burada değişkenimiz için tamsayılari saklamakta kullanılan int
tipini kullandik.
Genel olarak bir C değişkeni şu şekilde tanımlanır:

Şimdilik sadece bu formatı bilmeniz yeterli olacaktır. Kompleks
veri tiplerini incelediğimiz zaman daha çeşitli değişken tanımlama
formatları göreceğiz.
Değişkenimizi tanımladığımıza göre komutlarımızı yazmaya
başlayabiliriz. C dilinde değişken tanımları diğer komutlardan önce
yazılır. Yeni standart (C99) ve bazı derleyiciler için (MS Visual C++ gibi) bu
mecburi değildir ama bu kuralı uygulamak genel olarak iyi bir alışkanlıktır.
Öncelikle kullanıcıya ne istediğimizi söylüyoruz:

Bu fonksiyonu daha önceki programımızda kullanmıştik. Arada sadece kücük
bir fark var. Buradaki  katarımız  \n karakterleriyle bitmiyor. Bir katarın içinde,
\n karakterleri satır sonu anlamına gelir. Hatırlarsanız bir önceki programı
çalıştırdığımızda "Selam Dünya" yazısından sonra komut satırı bir alt 
satırda başlamıştı. Bunun nedeni "Selam Dünya!\n" katarının bu özel
karakterlerle bitmesidir. İsterseniz bir önceki programdan bu karakterleri
silin ve bir de bu şekilde çalıştırın.
Şimdi de kullanıcıdan bir tamsayı alıyoruz. 

scanf ve printf fonksiyonları en temel fonksiyonlar olmalarına rağmen,
kullanımları biraz komplekstir. Şimdilik scanf fonksiyonun tamsayılarla
kullanımının bu şekilde olduğunu bilmeniz yeterli olacaktır. İşaretçiler
bölümünde bu fonksiyona tekrar döneceğiz. Burada dikkat etmeniz gereken
önemli bir nokta var: ampersand (&) işaretini yazmayı unutmamalısınız.
Bu önemli operatörün eksikliğinden kaynaklanan hatayı gcc farkeder ve
sizi uyarır fakat diğer derleyiciler hatayı farketmeyebilir.
Son işlem olarak programın doğru çalışıp çalışmadığını kontrol etmek
için aldığımız sayıyı ekrana yazıyoruz:

Burada gördüğünüz üzere, sayi değişkeninin değerini doğrudan
yazacağımız katarın içine gömmek mümkün değil. Bunun yerine
printf fonksiyonuna katardan sonraki argümanın bir tamsayı olduğunu
söylüyoruz ve bu tamsayıyı yazmasını istiyoruz.
Yukarıdaki katarda, %d karakterleri, tam olarak bunu ifade ediyor. 
Bu iki karakterin yazılmasını istediğiniz zaman, printf fonksiyonu
argüman listesinden bir tamsayı alır ve ekrana bunu yazar.
Programı derleyip çalıştıralım:

 $ gcc -o sayi -Wall sayi.c
 $ ./sayi
 Bir sayı giriniz: 5
 5 alındı. teşekkürler
 $

Şimdi de basit bir aritmetik işlem yapalım.

Bu program diğeriyle hemen hemen aynı Sadece birden fazla değişken
kullandık ve bir çarpma işlemi yaptık. İlk üç satırın ne anlama geldığini
artık benden iyi biliyorsunuz: değişken tanımları

Burada carpan1, carpan2 ve sonuc isimli üç tane değişken tanımladık. 
Üçü de aynı tipte: int (tamsayı). Tipleri aynı olduğu için bunlari
kısaca şu şekilde de tanımlayabilirdik:

Gördügünüz gibi değişken isimlerinde rakamları da kullanabiliyoruz.
Bununla ilgili tek bir kısıtlama var: değişken adınin ilk karakteri bir
harf olmak zorunda. Derleyici alt çizgi karakterini bu bağlamda bir harf
olarak değerlendirir.
Daha sonraki dört satır bir önceki programda kullandığımız
komutların aynısı.

İki sayi aldık ve bunları carpan1 ve carpan2 değişkenlerinde
sakladık.
Şimdi de basit bir çarpma işlemi yapıyoruz:

     sonuc= carpan1 * carpan2;

Çarpma operatörü asterisk (*) karakteridir. Diğer operatörler

toplama  +
çikarma -
bölme / ve
kalan %
şeklindedir. Çarpımın sonucunu ata (=) operatörünü
kullanarak sonuc değişkeninde sakladık. Operatörlerin
öncelik sırası normal matematik operatörleriyle aynıdır.
Ata operatörü en düşük önceliğe sahiptir.
Son adım olarak da işlemi ekrana yazıyoruz:

Bir önceki programda sadece bir tane tamsayı yazdırmıştık.
Bu komutla üç tane birden yazdırıyoruz. Eğer kendi yazdığınız
programlarda ekrana çok sayida tamsayı yazmanız gerekirse
ve hangi %d ikilisinin hangi sayıya karşılık geldiğini karıştırmaya
başlarsanız printf fonksiyonunu birkaç parca,ya bölerek de
çağırabilirsiniz. Yukarıdaki örneği basitçe şu şekilde de
yazabilirdik:

Bu metodla yazmak biraz daha uzun sürmesine rağmen alışana
kadar hata yapmamak için tercih edilebilir.
Programı çalıştıralım:

 $./carpma
 İlk çarpanı giriniz: 4
 İkinci çarpanı giriniz: 12
 4 x 12 = 48
 $

Tekrar çalıştıralım:

 $./carpma
 İlk çarpanı giriniz: -2
 İkinci çarpanı giriniz: -9
 -2 x -9 = 18
 $

Gördüğünüz gibi int tipindeki değişkenler negatif
değerleri de saklayabiliyor. C de integral değerler
(tamsayı gibi) için iki çeşit veri tipi vardır: işaretli
ve işaretsiz. İşaretli değerler (int gibi) hem negatif 
hem pozitif değerleri saklayabilir. İşaretsiz değerler
ise sadece negatif olmayan değerleri saklayabilir: sıfır
ve pozitif sayılar. Biz programımızda değişkenlerimizin
işaretli olup olmadığını özel olarak belirtmediğimiz
için derleyici int tipinin varsayılan çeşidini kullandı
ve işaretli değişkenler üretti. Bu konunun daha derin
irdelenmesini bir sonraki bölüme bırakıyorum.

← Giriş · Veri Türleri →

Bir önceki bölümde basitçe değişken kullanmayı ve 
aritmetik işlemleri incelemiştik. Bu bölümde 
konuyu biraz daha genişleterek tamsayıdan başka
ne gibi veri türlerini kullanabiliriz bunu inceleyeceğiz.

Hatırlayacağınız üzere, int türündeki değişkenlerin
tamsayıları saklamak için kullanıldığını söylemiştik.
Aslında bu tam olarak doğru değil.
Bir işlemci tamsayıları sabit sayıda basamaktan
oluşan veri yapıları şeklinde saklar ve işler. Örneğin
Pentium gibi PC işlemcileri tamsayıları 32 basamak olarak
saklar. 32 bit işlemci deyiminin anlamı budur. 
C dili sistem programlama için tasarlanmiş bir dil
olduğundan dili tasarlayanlar int türünü bu tamsayı
formatına karşılık gelecek şekilde tanımlamışlardır.
Bu yüzden int türü sadece 31 basamaklı tamsayıları
temsil edebilir. Eğer çok büyük sayılarla işlem
yapıyorsanız, özellikle çarpma işlemlerinde, bu sınırlamayı
göz onüne almalısınız.
Peki neden 31 basamak, bir basamağı neden kullanmıyoruz?
İşlemciler 32nci basamağı işaret basamaği olarak kullanır.
32nci basamakta 1 değeri varsa bu, o sayının negatif
olduğu anlamına gelir. 0 değeri varsa, bu da sayı pozitif
demektir. Bu yüzden int türü 31 basamakla
sınırlandırilmıştır.
Bildiğiniz gibi bilgisayarlar işlemlerini hep ikili sayı
sisteminde yaparlar. Bir tamsayının
basamakları sadece ikili sayı sistemindeki sayıları
saklayabilir: 1 ve 0. Bu nedenle yukarıda bahsettiğimiz
basamaklar onlu sayı sisteminde değil ikili sayı sisteminde
kullanılan basamaklardır. Özetleyecek olursak int türündeki
değerlerin alt ve üst sınırları yaklaşik olarak -2 milyar ve
+2 milyardır. Bu diğer sistemlerde farklı olarak
tanımlanabilir fakat modern bir işletim sistemi yüklü
(Linux, BSD, Windows XP gibi) olan PC sistemleri için bu
kadarını bilmeniz şimdilik yeterli olacaktır.

C dili, rasyonel sayıları işlemek ve saklamak için de
bir veri türü içerir: double. Gene işlemci tasarımından
dolayı, bu türdeki sayıların da int türündeki sayılara
benzer basamak problemleri var.
Double türündeki sayılar 64 basamaklı bir veri yapısında
saklanır. Bu yüzden double türündeki sayıların sonsuz
basamağı olan irrasyonel sayılari veya 1/3 gibi basamakları
sonsuza değin tekrar eden  sayıları  tam olarak ifade
edebilmesi mümkün değildir. Bunun yerine, en küçük
basamaklar atılarak yaklaşık bir değer kullanılır.
Bir önceki bölümde int türündeki değişkenleri kullanıcıdan
nasıl isteyebileceğimizi ve int değerleri ekrana nasıl 
yazdırabileceğimizi görmüştük. Şimdi de aynı şeyi
double değerler için yapalım:

double değişkenimizi tanımlarken geçen bölümde
gördüğümüz tip ad biçimini kullandık.
printf kullanarak ekrana yazı yazdırmayı artık zaten
biliyorsunuz. double sayımızı kullanıcıdan
almak ve ekrana yazdırmak için aynı geçen bölümdeki gibi
scanf ve printf fonksiyonlarını kullandık. Bu fonksiyonların
kullanım şekillerini şimdilik fazla irdelemenize gerek
yok. double ve int türleri için nasıl kullanıldıklarını 
bilmeniz yeterli. Daha ayrıntılı bilgiyi işaretçiler bölümüne
geldiğimiz zaman vereceğim.
C dili makine diline çok yakın
olduğu için buna benzer çok esnek yapılar içeriyor. Dili 
öğrendikten sonra C'nin bu alışılmadık gücü programlamada
çok büyük kolaylıklar sağlıyor fakat başlangıçta alışmak
biraz zaman alabilir.  Programı çalıştıralım:

bir rasyonel sayı giriniz>21.9
rasyonel sayılar birden fazla
biçimde yazdırılabilir:
21.900000 veya 2.190000e+01 gibi.

Tekrar çalıştıralım:

bir rasyonel sayı giriniz>0.6
rasyonel sayılar birden fazla
biçimde yazdırılabilir:
0.600000 veya 6.000000e-01 gibi.

Gördüğünüz gibi printf fonksiyonu double sayılari değişik
biçimlerde ekrana yazabiliyor. %f formatı verildiğinde
normal ondalık biçiminde, %e formatı verildiğindeyse,
bilimsel notasyon kullanarak ekrana yazıyor. Çok küçük
sayılarla hesaplama yapmadığınız sürece bilimsel notasyonu
kullanmaya fazla ihtiyacınız olmayacak fakat programlarınız
ekrana hep 0 yazıyorsa ve yazılan sayının çok küçük olduğundan
şüpheleniyorsanız geçici olarak %e notasyonunu kullanarak
problemi teşhis edebilirsiniz.

int ve double türlerinin yanında, C dili bu türlerin 
değişik varyasyonlarını da tanımlar.
İşaretsiz tamsayılar
(doğal sayılar), kısa veya uzun tamsayılar, daha az hassas
rasyonel sayılar gibi. Dili öğrenmek ve programlamanızı
geliştirmek için int ve double türleri uzun bir süre yeterli
olacaktır. Başkası tarafından yaratılan verileri işleyen
programlar yapmaya basladığımız zaman veya özel
kullanım alanlarını anlattığımız zaman bunları
detaylı olarak inceleyeceğiz.
Sayılar dışında 
C dilinin tanımladığı iki temel veri türünden hiç bahsetmedik:
char ve void. char türü katarları kullanmayı öğrendikten
sonra belki de en çok kullanacağınız veri türlerinden biri.
Katarlar işaretçilerle çok yakından ilgili olduğu için 
kullanımları bir hayli karmaşık. Bu yüzden char türünün
bir tamsayı çeşidi olduğunu ve genelde yazı saklamak 
için kullanıldığını bilmeniz yeterlidir. void türü ise
yine işaretçiler ve fonksiyonlarla ilgili bir veri türü.
Bu türü de yeri geldiği zaman daha uzun tartışacağız.

Soyut veri türleri bu bölümde anlattığımız
temel türlerden olan verileri organize etmek için
kullanılan yapılardır. Basit bir örnek olarak
matrisleri düşünebiliriz. Bir matris, soyut bir
veri türüdür: sayıları (ki bunlar temel veri türüdür)
satır ve sütunlar halinde organize eder. (Eğer matris
örneği size yabancıysa bir lineer cebir kitabından
tanımını ve genel olarak kullanımını öğrenebilirsiniz.)
Bu bölümde birçok veri türünü yüzeysel olarak
tanımladık. Hepsini art arda sıralamak yerine
kullanım alanlarını gördükçe veri türlerini daha
detaylı inceleyeceğiz.
Şimdi dilerseniz bir kaç örnek programla
temel veri türleri ve değişkenlerle ilgili öğrendiklerimizi
pekiştirelim.  İlk programımız bir dairenin alanını 
hesaplıyor;

← Değişkenler ve Aritmetik · Koşullar ve Döngüler →

Dev C++, Bloodshed Software'den temin edilebilen, C++ programlama dili için bir Entegre Geliştirme Ortamıdır (IDE). Güncellenmiş bir sürüm Orwell Dev-C++ adresinde mevcuttur.
C++, C dilinin büyük bir kısmını ve uzantılarını bünyesinde barındıran bir programlama dilidir. Çoğu C++ derleyicisi, bazen birkaç ayarlamayla (farklı bir adla veya komut satırı anahtarıyla çağırmak gibi) C programlarını derler. Bu nedenle, C geliştirmesi için Dev C++ kullanabilirsiniz.
Ancak, Dev C++ derleyici değildir. GCC'nin MinGW veya Cygwin sürümlerini kullanmak üzere tasarlanmıştır - tamamen farklı projeler olmalarına rağmen her ikisi de Dev C++ paketinin bir parçası olarak edinilebilir.
Dev C++ yalnızca bir düzenleyici, sözdizimi vurgulama, kodun görselleştirilmesi için bazı olanaklar (sınıf ve paket tarama gibi) ve seçilen derleyiciye bir grafik arabirim sağlar. Dev C++, derleyici tarafından üretilen hata mesajlarını analiz ettiğinden ve satır numaralarını hataların kendisinden ayırmaya çalıştığından, hata mesajlarının formatı muhtemelen farklı olabileceğinden, diğer derleyici yazılımlarının kullanılması önerilmez.
Dev-C++'ın en son sürümü, sürüm 5 için bir betadır. Ancak yine de önemli sayıda hataya sahiptir. Tüm özellikler var ve oldukça kullanışlı. Windows için mevcut olan en iyi ücretsiz yazılım C IDE'lerinden biri olarak kabul edilir.
Linux için Dev C++'ın bir sürümü yolda. Ancak henüz tam olarak kullanılabilir değil. Linux kullanıcıları zaten çok sayıda IDE'ye sahiptir. (örn. KDevelop ve Anjuta.) Grafik metin editörlerinin çoğu ve emacs ve vim gibi diğer yaygın editörler sözdizimi vurgulamayı destekler.

GNU Derleyici Koleksiyonu (GCC), Özgür Yazılım Vakfı tarafından geliştirilen özgür/erkin bir derleyici setidir ve çok çeşitli işletim sistemlerine kurulabilir. Windows'taki alternatifleri Cygwin, MinGW ve Tiny C (TCC) olarak sayılabilir.

Bellekteki ardışık gözeneklerin toplamına dizi denir.

C programlama dilinde dizi belirtimi şöyle yapılır:

Böyle kullandığımızda bellekte diziBoyutu*sizeof(veriTipi) kadar alan açılır. Dizinin elemanlarına indis ([]) operatörüyle erişebiliriz. Örnek:

Burada bellekte 10 tane int depolayabilecek kadar bir alan açılmakta ve dizinin 1. elemanı ekrana yazdırılmaktadır. Ancak burada dikkat etmemiz gereken husus int dizi[10]; satırının bellekte sadece bir bölge tahsis etmesidir. Bölgedeki gözeneklere herhangi bir değer atanmaz. Dolayısıyla printf("%d",dizi[1]); satırında bizim tahmin edemeyeceğimiz bir değer ekrana yazdırılacaktır. Eğer dizinin elemanlarına ilk değer vermek istiyorsak;

şeklini kullanırız. Burada diziye atanan eleman sayısının 10 olması zorunlu değildir. Diziye atanan eleman sayısı 10'dan az olursa kalan elemanlara 0 atanır.

İki boyutlu bir dizi şöyle bildirilir:

Örnek:

Bu program ekrana 4 çıktısını verecektir. Başka bir örnek:

Burada değerler mantıksal olarak değil, bellekte depolandıkları şekilde diziye atandı. Çok boyutlu diziler de tek boyutlu dizilerde olduğu gibi bellekte ardışık sıralanır. Başka bir örnek:

Burada ise 2*3*2 boyutlarında üç boyutlu bir dizi tanımlanmış ve kullanılmıştır. Kodun ekran çıktısı 6'dır. Eğer dizinin tanımlandığı satırda diziye ilk atama yapılıyorsa dizinin eleman sayısının belirtilmesi şart değildir. Örnek:

Bu dizinin eleman sayısı 6'dır. Köşeli parantezler arasına 6 sayısının yazılması ile yazılmaması arasında herhangi bir fark yoktur. Başka bir örnek:

Stringler birer karakter dizisi olduğuna göre string dizisi de bir karakter dizisi dizisidir. Yukarıdaki kullanım tamamen geçerlidir.

Fonksiyonlar yazdığımız programın modüler olmasını sağlar, ayrıca okunabilirliği artırır... Bundan önceki alıştırmalarınızı Main ana fonksiyonu içinde yazmış olabilirsiniz... Fakat programlarınız büyüdükçe herşeyi main fonksiyonun içine yazmak iyi bir fikir değildir. Sonradan programda bir değişiklik yapmak için oldukça uğraşmak zorunda kalabilirsiniz...
Kısaca fonksiyonlar, programınızdaki özel işlere bakan görevlilerdir... Programınızdaki görevleri alt-kümelere böldüğünüzde bunların hepsini main içinde yapmak yerine ayrı ayrı fonksiyonlara bölmek işinizi gerçekten kolaylaştıracaktır...

Fonksiyonların genel olarak yazımı bu şekilde gerçekleşir...

Fonksiyonları şu basit örnekle anlayacağınızdan eminim...
Şimdi bir hesap makinesi yapalım... Nasıl yapılır? önce bir tasarım yapalım...

1) hesap makinemiz basit olsun... Sadece toplama ve çarpma yapsın...
2) kullanıcıdan iki sayı isteyelim... programımız bu iki sayının toplamını ve çarpımını bulsun... 
3) bir de programımızın özel bir yeteneği olsun... Bu iki sayının toplamlarının karesini bulsun...

pekala, tasarımımızı tamamladıktan sonra anlıyoruz ki...

1) üç tane fonksiyonumuz olacak... birisi iki sayıyı toplayacak, ikincisi iki sayıyı çarpacak, 3. ise iki sayının toplamının karesini bulacak...
2) kullanıcıdan iki sayının istenmesini ve bu fonksiyonların çağrımını main içinde yapabiliriz...

Öyleyse önce toplama fonksiyonunu yazalım...

bu kadar... a ve b iki sayı ve bu fonksiyon onların toplamını döndürüyor....
Çarpma için 

toplamlarının karesi ise...

Her C programı #include direktifi ile başlar. Kullanımı #include <KütüphaneAdı.h> şeklindedir.
Kütüphaneler programımızda kullanacağımız fonksiyonları içerirler. Benzer görevleri olan fonksiyonlar aynı kütüphanede toplanmıştır. Örneğin bir matematik programı geliştiriyorsak math.h adlı kütüphaneye ihtiyacımız vardır. Bazı kütüphaneler standartır , bazıları ise sonradan eklenmiştir. stdio, stdlib, math ... gibi kütüphaneler bütün derleyicilerde bulunur, fakat sonradan geliştirilmiş olan gtk , sdl gibi kütüphaneleri bulamayabilirsiniz.
Bütün C programlarında bir ana fonksiyon bulunur. bu fonksiyon main() ile belirtilir. Bu ilk çalıştırılan fonksiyondur. Daha sonra veri tipleri ve kendi ürettiğimiz fonksiyonları tanımlarız.
Bu aşamadan sonra printf, scanf gibi kütüphanemizden aldığımız fonksiyonları kullanabiliriz.

Bir program yazarken ekibinizdeki kişilere kaynak kodunuz içinde not vermek isteyebilirsiniz. Bu durumda 

/* Açıklama yapıyorum, */ 

biçiminde not verebilirsiniz.

Bir programlama dilinde ilk yazılan programın amacı ekrana "Merhaba Dünya" yazdırmaktır. Yalnız bunu C ile yaparken Giriş-Çıkış fonksiyonları hakkında bilgi sahibi olmanız gereklidir. C dili fonksiyonlar üzerine kuruludur ve ekrana bir harf yazmak için bile bir komut yoktur. Bu printf() fonksiyonu ile sağlanır ve stdio.h kütüphanesinde bulunmaktadır.
haydi başlayalım. merhaba_dunya.c

ne kadar kısa öz değil mi? Şimdi kodu derleyip çalıştıralım.
merhaba_dunya

Merhaba Dünya

Değişkenler ve Aritmetik →

Belirli bir koşul olması durumunda eğer anlamına gelen "if" kalıbı kullanılabilir. Koşul if'den sonra parantez içine yazılır. Yapılması istenen komut ise ayraç içine yazılır.
Kullanımı:

Eğer yapılması istenen komut tek satır ise ayraç kullanılmayabilir. 
Kısa kullanımı:

else ve if komutları birden fazla koşul yapmak için beraber kullanılabilir:

Birçok koşulun olması durumunda if/else yerine switch/case kalıbı kullanılabilir. Switch döngüsünden çıkmak için her seçeneğin sonuna break() fonksiyonu konulur.

Koşul sağlandığı sürece yapılması istenen komutlar için for kalıbı kullanılabilir. Belirlenen bir başlangıç değeri için değişim uygulanır ve koşul sağlandığı müddetçe kod işlenir.
Kullanımı:

Ör: 4'den 6'ya kadar olan sayıların toplamını veren bir program isteniyorsa:

Burada program i=4 için kodu işleyecek ve toplam=0+4=4 olacaktır. Değişimde i++, i'yi bir artıracağından program i=5 için tekrar kodu işleyip, toplam=4+5=9 olacaktır. Sonraki döngüde i=6 için toplam=9+6=15 olacaktır. Sonraki döngüde i=7 için koşul sağlanmadığından program "for" fonksiyonundan çıkacaktır.

Belirli bir koşul sağlandığı sürece işlenmesi istenen kodlar için while döngüsü kullanılır. While koşulu ile sonsuz döngüler yaratılabilir. Koşul yerine "1" yazılırsa, mantıksal doğru anlamına geldiği için program sürekli devam eder.

Koşul sağlanmaksızın kodun işlenmesi ve daha sonra belirli bir koşul aranıyorsa "do/while" kalıbı kullanılır. "do/while" ın while'dan tek farkı koşul sağlanmasa bile enaz bir kez kodun işlenmesidir. Do/while fonksiyonunda önce kod işlenir, sonra koşul kontrol edilir.

← Veri Türü ·

C işletim sistemleri yazmak için en yaygın kullanılan programlama dilidir. C ile yazılmış ilk işletim sistemi Unix'tir. Daha sonra GNU / Linux gibi işletim sistemlerinin tümü C'ye yazılmıştır. İşletim sistemlerinin dili sadece C değil, bugün mevcut olan en yaygın üst düzey dillerin neredeyse tümü için öncü konumundadır. Aslında, Perl, PHP, Python ve Ruby hepsi C ile yazılmıştır.
Diyelim ki İspanyolca, İtalyanca, Fransızca veya Romence öğreneceksiniz. Latince bilmenin yardımcı olacağını düşünmüyor musunuz? Latince tüm bu dillerin temeli olduğu gibi, C'yi bilmek, C gelenekleri üzerine inşa edilmiş bütün programlama dilleri ailesini anlamanıza yardımcı olacaktır.

Assembly dili programın hızını ve maksimum kontrolünü sağlarken, C taşınabilirliği sağlar.
Farklı işlemciler farklı assembly dilleri kullanılarak programlanır ve programcılar bunlardan sadece birini seçmek ve öğrenmek durumunda kalırlar. Aslında, C'nin temel güçlü yönlerinden biri, derleme dili tarafından sağlanan donanımın kontrolünün çoğunu korurken, evrenselliği ve taşınabilirliği çeşitli bilgisayar mimarileri arasında birleştirmesidir.
Assembly, son derece güçlü olmasına rağmen, büyük uygulamaları programlamak için çok zordur ve mantıklı bir şekilde okunması veya yorumlanması zordur. C hızlı ve verimli çalıştırılabilir dosyalar oluşturan derlenmiş bir dildir. Aynı zamanda küçük bir “ne görüyorsanız hepsini alırsınız” dilidir: bir C ifadesi çoğunlukla bir yığın assembly ifadesine karşılık gelir, diğer her şey kütüphane işlevleriyle sağlanır.
Domino taşlarının devrilmesi gibi, gelecek nesil programlar öncekilerin trendini takip ediyor. C'de tasarlanan işletim sistemlerinde daima C'de tasarlanan sistem kütüphaneleri bulunmaktadır. Bu sistem kütüphaneleri sırayla daha yüksek seviyeli kütüphaneler (OpenGL veya GTK gibi) oluşturmak için kullanılır ve bu kütüphanelerin tasarımcıları genellikle kullanılan sistem kütüphanelerini kullanmaya karar verir. Uygulama geliştiricileri, kelime işlemciler, oyunlar, medya oynatıcılar ve benzerlerini tasarlamak için üst düzey kütüphaneleri kullanır. Geliştiricilerin birçoğu üst düzey kütüphanenin kullanıldığı dilde programlamayı seçecektir.

WinAPI (Win32 API olarak da bilinir; resmî olarak Microsoft Windows API olarak adlandırılır), Windows özelliklerine erişime izin vermek için Microsoft tarafından C ile yazılmış bir uygulama programlama arabirimidir. WinAPI'nin ana bileşenleri:

WinBase: Çekirdek fonksiyonları, CreateFile, CreateProcess, vb.
WinUser: GUI fonksiyonları, CreateWindow, RegisterClass, etc
WinGDI: Grafik fonksiyonları, Ellipse, SelectObject, vb.
Ortak kontroller: Standart kontroller, liste görünümleri, kaydırıcılar, vb.

C programlama dilinin özellikleri sıralanırken genellikle C ile yazılan programların taşınabilir olduğundan söz edilmektedir. Ancak yazdığınız programın taşınabilir olması sizin için önemli değilse ve sadece Windows'ta GTK, Qt, vb. kütüphanelerden bağımsız olarak çalışmasını amaçlıyorsanız WinAPI'yi kullanabilirsiniz.

WinAPI ile basit bir GUI örneği olarak Windows mesaj kutusu oluşturan C kodudur:

Programın açıklaması:

İlk adım, windows başlık dosyalarını eklemektir. Tüm Windowslar için ana başlık windows.h'dir, ancak başka başlık dosyaları da vardır.
WinMain, konsol uygulamalarında kullanılan standart int main () fonksiyonundan farklıdır. Arayüzde kullanılan daha fazla parametre vardır ve daha da önemlisi, bir pencere uygulamasının ana giriş noktası standart C / C ++ 'dan farklı bir çağrı düzeni kullanır.
APIENTRY niteleyicisi, argümanların yığına itildiği sıra olan çağırma düzenini belirtir. Varsayılan olarak çağırma düzeni, __cdecl ile belirtilen standart C düzenleridir. Ancak Microsoft, __stdcall niteleyicisi tarafından belirtilen Windows API fonksiyonları için farklı türde bir çağırma düzeni (PASCAL düzeni) kullanır. APIENTRY, windows.h'nin içerdiği başlık dosyalarından birinde __stdcall için tanımlanmış bir addır.

Yapılar (struct) birden fazla farklı tipte olabilecek değişkeni bir arada paketlemek için kullanılan yapılardır. Bir yapı programın belirli bir yerinde bir kere tanımlandıktan sonra programın diğer yerlerinde temel veri türleri gibi kullanılabilir. Bir fonksiyon parametre olarak bir yapı türü alabilir, geriye bir yapı türü döndürebilir, bir yapı türünden değişken tanımlanabilir, her bir elemanı bir yapı türünden olan diziler tanımlanabilir. Yapının üyelerine erişmek için . (nokta) operatörü kullanılır. Bir yapı şöyle tanımlanır:

Burada a ve b yapı türünden birer değişkenlerdir. Bu değişkenler programımız içinde kullanılabilir. Bunlara ilaveten yeni değişkenler tanımlanabilir. İstenirse a ve b değişkenleri oluşturulmayabilir. Bu durumda elimizde önceden oluşturulmuş herhangi bir değişken olmayacaktır. Bu yapının programımız içinde kullanımı şöyledir:

Bir yapının bellekte ne kadar yer işgal ettiği sizeof() operatörüyle bulunabilir. Örnek:

sizeof() operatörüne direkt tip adı verilebileceği gibi bir tipin değişkeni de verilebilir. Örnek:

sizeof() operatörü temel veri tipleriyle de kullanılabilir. Örnek:

Bir yapı değişik şekillerde de tanımlanabilir. Örnek:

Burada yapının adı insan değil, kisi'dir. Dolayısıyla yapı değişkeni tanımlanırken insan değil kisi adı kullanılır. Tipi yapı olan bir değişkene gerek programımız içinde gerekse de yapı tanımlaması yaoılırken ilk değer atanabilir. Örnek:

Bu değer atamalarında yapının üyelerine tanımlandıkları sırada değer ataması yapılır. Eğer atanan değer sayısı yapının üye sayısından azsa kalan üyelere 0 atanır. Bir yapının adı olmak zorunda değildir. Bu durumda programımızda yalnızca yapıyı tanımlarken kullanılan değişkenler kullanılabilir. Örnek:

Program yazarken çoğu zaman her şey ak ve kara gibi net olmaz, çoğu zaman çeşitli koşullara göre farklı komutlar çalıştırmamız gerekir. Benzer şekilde çoğu komutun da yalnızca bir kez çalıştırılması bizim için yeterli gelmez, belli koşulları sağladığı sürece sürekli çalıştırılmasını istediğimiz komutlar olabilir. İşte bu gibi durumlar için C#'ta akış kontrol mekanizmaları vardır. Aslında en basitinden en karmaşığına kadar bütün programlama dillerinde bu mekanizmalar mevcuttur ve programlama dillerinin en önemli ögelerinden birisidir.

if else deyimi sayesinde belli bir koşul sağlandığında söz konusu komutlar çalıştırılır, o belli koşullar sağlanmadığında çalıştırılmaz ya da başka komutlar çalıştırılır. Kullanılışı şu şekildedir:

veya

Yukarıdaki örneklerde eğer koşul sağlanırsa 1. komutlar, sağlanmazsa 2. komutlar çalıştırılır. if veya else'in altında birden fazla komut varsa bu komutları parantez içine almak gerekir. if veya else'in altında tek komut varsa bu komutları parantez içine almak gerekmez. Örnek bir program:

Başka bir örnek program:

if else yapılarında else kısmının bulunması zorunlu değildir. Bu durumda sadece koşul sağlandığında bir şeyler yapılacak, koşul sağlanmadığında bir şeyler yapılmayacaktır. Örnek:

if else bloklarının aşağıdaki gibi kullanımı da mümkündür:

Bu program kullanıcıdan cinsiyetini girmesi istemekte, eğer kullanıcının girdiği harf e ise ekrana Erkeksiniz yazmakta, eğer girdiği harf e değilse ise bu sefer kullanıcının girdiği harfi k mı değil mi diye incelemekte, eğer k girmişse ekrana Kızsınız yazmakta, bunların dışında bir harf girdiğinde de ekrana
Lütfen cinsiyetinizi doğru giriniz! yazmaktadır. Bu şekilde bu bloklar daha da uzatılabilir. Yani else if satırının bir tane olması zorunlu değildir. Ancak tabii ki else satırının yalnızca bir tane olması gerekir. C# iç içe if else kullanılmasına izin verir:

switch deyimi bazı if else deyimlerinin yaptığı işi daha az kodla yapar. Genellikle bazı karmaşık if else bloklarını kurmaktansa switch'i kullanmak programın anlaşılırlığını artırır. Ancak tabii ki basit if else bloklarında bu komutun kullanılması gereksizdir. Kuruluşu:

Bu switch deyimiyle ilgili bilmeniz gerekenler:

İfadenin ürettiği değer hangi case sabitinde varsa o "case"deki komutlar işletilir. Eğer ifadenin ürettiği değer hiçbir case sabitinde yoksa default casedeki komutlar işletilir.
Aynı birden fazla case sabiti olamaz. Örneğin:

Bu program hatalıdır.

C#'ta herhangi bir case'e ait komutların break; satırı ile sonlandırılması gerekmektedir. Eğer break; satırı ile sonlandırılmazsa programımız hata verir. Örneğin aşağıdaki program hata vermez:

Ancak şu program hata verir:

Eğer programımızın bir case'deyken farklı bir case'e gitmesini istiyorsak goto anahtar sözcüğünü kullanırız. Örnek:

goto satırı kullanılmışsa break; satırının kullanılmasına gerek yoktur.
Eğer farklı case sabitlerinin aynı komutları çalıştırmasını istiyorsak şöyle bir program yazılabilir:

Bu programda a değişkeni 4 olsa da 5 olsa da aynı komutlar çalıştırılacaktır.

case anahtar sözcüğünün yanındaki ifade mutlaka ya sabit ya da sabitlerden oluşan bir ifade olmalıdır.
default durumunu istediğiniz yere yazabilirsiniz, aynı şekilde istediğiniz case'leri de istediğiniz yere yazabilirsiniz. Yani case'lerin sırası önemli değildir.
Bir switch blokunda default durumu bulunmak zorunda değildir.
switch'in parantez içindeki ifadesi bir değişken olabileceği gibi, bir sabit ya da ifade de olabilir.

Eğer programda -belli koşulları sağladığı sürece- birden fazla çalıştırılmasını istediğimiz kodlar varsa döngüler kullanılır. C#'ta en çok kullanılan döngü "for"dur. Kullanımı:

veya

1) ifade1 çalıştırılır.
2) Koşula bakılır. Eğer koşul sağlanıyorsa;

2.1) küme parantezleri içindeki ya da -küme parantezleri yoksa- kendinden sonra gelen ilk satırdaki komut çalıştırılır.
2.2) ifade2 çalıştırılır.
2.3) 2. adıma dönülür.
3) Eğer koşul sağlanmıyorsa küme parantezleri dışına ya da -küme parantezleri yoksa- kendinden sonra gelen ilk satırdaki komuttan hemen sonraki satıra çıkılır. Dolayısıyla döngüden çıkılmış olur.

Bu program 1'den 3'e kadar olan tam sayıları (1 ve 3 dâhil) toplayıp toplamı ekrana yazacaktır.

Bu program girdiğimiz herhangi bir sayının faktöriyelini bulup ekrana yazar. Eğer girdiğimizi sayı tam sayı değilse veya 1'den küçükse "Lütfen pozitif tam sayı girin." diyerek tekrar veri girişi ister.
UYARI: C# nokta (.) işaretini sayıların ondalık kısımlarını ayırmak için kullanırken, DOS aynı amaç için virgül (,) işaretini kullanır.

for döngüsünün parantezleri içindeki "for(int i=0;i<5;i++)" iki ifade ve bir koşulun istenirse bir tanesi, istenirse bazıları, istenirse de tamamı boş bırakılabilir; ancak noktalı virgüller mutlaka yazılmalıdır.
Tahmin edebileceğiniz gibi for döngüsünün içinde veya "for(int i=0;i<5;i++)" kısmında tanımlanan herhangi bir değişken döngünün dışında kullanılamaz. Bir değişkeni döngünün dışında kullanabilmemiz için o değişkenin döngüden önce tanımlanıp ilk değer verilmesi ve değişkeni kullanacağımız yerde de faaliyet alanının devam etmesi gerekmektedir. Bu bütün döngüler ve koşul yapıları için geçerlidir. Örneğin:

Bu program ekrana 5 yazacaktır. Ancak;

Bu program çalışmaz, çünkü a değişkeni döngüden önce tanımlanmasına rağmen ilk değer verilmiyor.
HATIRLATMA: Bir değişkenin faaliyet alanı tanımlandığı en iç blokun içidir.
NOT: Console.Write("{0,3}",i); gibi bir ifadede i değişkeni 3 birimlik bir genişlikte sağa yaslı olarak yazılır. WriteLine ile de kullanılabilir. i; değişken, sabit ya da ifade olabilirken 3 yalnızca sabit olmalıdır. i bir ifade olsa bile parantez içine almaya gerek yoktur.

Komut ya da komutların bir koşul sağlandığı sürece çalıştırılmasını sağlar. Kuruluşu:

1) Koşula bakılır. Eğer koşul sağlanıyorsa;

1.1) küme parantezleri içindeki ya da -küme parantezleri yoksa- kendinden sonra gelen ilk satırdaki komut çalıştırılır.
1.2) 1. adıma dönülür.
2) Eğer koşul sağlanmıyorsa küme parantezleri dışına ya da -küme parantezleri yoksa- kendinden sonra gelen ilk satırdaki komuttan hemen sonraki satıra çıkılır. Dolayısıyla döngüden çıkılmış olur.

Aslında while döngüsü for döngüsünün yalnızca koşuldan oluşan hâlidir. Yani for(;i<0;) ile while(i<0) aynı döngüyü başlatır.

Şimdiye kadar gördüğümüz döngülerde önce koşula bakılıyor, eğer koşul sağlanırsa döngü içindeki komutlar çalıştırılıyordu. Ancak bazen döngüdeki komutların koşul sağlanmasa da en az bir kez çalıştırılmasını isteyebiliriz. Bu gibi durumlar için C#'ta do while döngüsü vardır.

1) Döngüdeki komutlar bir kez çalıştırılır.
2) Koşula bakılır.

2.1) Eğer koşul sağlanıyorsa 1. adıma dönülür.
2.2) Eğer koşul sağlanmıyorsa döngüden çıkılır.

Hatırlarsanız break komutunu switch'teki case'lerden çıkmak için kullanmıştık. Benzer şekilde break komutu bütün döngülerden çıkmak için kullanılabilir. Örnek:

Bu program, kullanıcı "q" harfini girene kadar kapanmamaktadır.

break sözcüğüne benzer. Ancak break sözcüğünden farklı olarak program continue'u gördüğünde döngüden çıkmaz, sadece döngünün o anki iterasyonu sonlanır. Örnek:

Bu program 0'dan 50'ye kadar (0 ve 50 dâhil) olan çift sayıları ekrana alt alta yazmaktadır.

Nesneye yönelik programlamada pek hoş görülmese de kullanabileceğiniz başka bir komut "goto"dur. Aslında eskiden BASIC gibi dillerde her satırın bir numarası vardı ve bu sözcük satırlar arasında dolaşmayı sağlıyordu. Ancak böyle bir yöntem nesne yönelimli programlamaya terstir. O yüzden çok fazla kullanmamanız tavsiye edilir. Örnek kullanım:

Bu programda ikinci bölüm hiçbir zaman çalıştırılmayacaktır.

1'den 1000'e (sınırlar dâhil) kadar olan sayılar içerisinde 5'e tam bölünen, ancak 7'ye tam bölünemeyen sayıları alt alta listeleyen, bu sayıların kaç tane olduğunu ve toplamını yazan bir program yazınız.

Girilen pozitif herhangi bir tam sayıyı ikilik düzene çeviren programı yazınız.

Konsol ekranına girilen 0 ile 100 (sınırlar dâhil) arasındaki 10 notun en büyüğünü, en küçüğünü ve ortalamasını yazan programı yazınız.

İsterseniz şimdi geçen bölümün son konularını biraz hatırlayalım. Geçen bölümde sanal metot ve sanal sahte özellikleri görmüştük. Bu sayede bir nesnenin kendi türüyle değil, gizli türüyle işlem yapılmasını sağlamıştık. Geçen bölümde gördüğümüz diğer önemli şey ise özet metot ve özet sahte özelliklerdi. Özet metot ve özet sahte özellikler ana sınıf içinde bildiriliyordu, içerikleri yoktu ve bu sınıflardan türeyen sınıflar da bu metot ve sahte özellikleri içermek zorundaydı. Yani diğer bir deyişle ana sınıftaki özet üye elemanlar yavru sınıflara şunları diyordu: "Bizi içermek zorundasınız, ancak içeriğimizi kendiniz yazacaksınız". Yani özet üye elemanları kılavuza benzetebiliriz. Kılavuz bir işin nasıl yapılacağını ana hatlarıyla anlatır, ancak bu işi asıl yapan kılavuzu okuyan kişidir. Şimdi öyle bir sınıf düşünün ki sadece özet üye elemanlardan oluşsun. Yani bu sınıfın işlevsel olarak hiçbir faydası yok. Sadece kendinden türeyen sınıflara kılavuzluk yapıyor. İşte, arayüzlere sınıfların sadece özet üye eleman içerebilenleri diyebiliriz.

Arayüzler interface anahtar sözcüğüyle bildirilir.
Bir arayüzde özellik, metot, indeksleyici, temsilci ve olay bildirilebilir. Temsilci ve olayları ileride göreceğiz.
Arayüz isimleri geleneksel olarak I harfi ile başlar, ancak zorunlu değildir.
Arayüz elemanlarını static olarak bildiremeyiz.
Arayüz elemanları içsel olarak zaten publictir. Tekrar bir erişim belirleyici kullanmak hatalıdır.
Arayüzler sahte olmayan özellik içeremez.
Arayüzlerde yapıcı ve yıkıcı metot olmaz.
Şimdi iki metodu, bir sahte özelliği ve bir indeksleyicisi olan bir arayüz yazalım:

Bu arayüzde parmak basmamız gereken önemli bir nokta var. Bu arayüzü kullanan sınıftaki indeksleyicinin sadece get bloğu olabilir veya hem get hem de set bloğu olabilir. Yani indesleyicilerdeki durum sahte özelliklerden biraz farklıdır. Arayüzü kullanan sınıftaki indeksleyici en az arayüzdeki set-get durumuna sahip olmalıdır.

Arayüzlerin uygulanması sınıf türetmeyle aynı şekilde yapılır. Örnek:

Bir sınıf birden fazla arayüzü kullanabilir. (Bu sınıf türetmede yoktu). Örnek:

Tabii ki arayüzü kullanan sınıfta sadece arayüzdeki elemanlar bulunur diye bir kural yoktur.
Arayüzler de sınıf türetmeyle aynı şekilde birbirlerinden türetilebilir. Bu durumda yavru arayüz ana arayüzün taşıdığı bütün elemanları taşır.
Sınıflardan farklı olarak arayüzleri birden fazla arayüzden türetebiliriz. Örnek:

Burada Arayuz3'ü kullanan bir sınıf her üç metodu da içermelidir.

Tıpkı sınıflardaki gibi new anahtar sözcüğünü kullanarak isim gizleme yapabiliriz. Örnek:

Burada aklınıza şöyle bir sorunun gelmesi doğaldır: Arayuz2'yi kullanan bir sınıfta Metot1()'in bildirimi yapıldığında geçerli bir bildirim olur mu? Bunun cevabı hayırdır. Arayuz2'nin Arayuz1'e ait metodu gizlemesi sonucu değiştirmez. Bu sorunu halletmek için sınıfımızı şöyle yazabiliriz.

Burada hem Arayuz1'in hem de Arayuz2'nin isteklerini yerine getirdik. Bu tür arayüz uygulamaya "açık arayüz uygulama" denir. Açık arayüz uygulamanın detayları birazdan verilecektir.

Kulağa biraz itici gelse de bir arayüz türünden nesne oluşturulabilir. Arayüz nesneleriyle ilgili bilmeniz gereken en önemli şey şudur:
Tıpkı türetmedeki gibi bir arayüz nesnesine o arayüzü kullanan sınıf türünden nesne atanabilir. Bu durumda o arayüz nesnesinin gizli türü o sınıf olur ve o sınıfa ait üye elemana arayüz nesnesi üzerinden erişilebilir. Örnek:

Gördüğünüz gibi arayüz nesneleri oluştururken new anahtar sözcüğünü kullanmıyoruz.
NOT: Herhangi bir arayüzdeki üye elemanlar sınıfa public, static değil, doğru geri dönüş tipinde ve doğru parametrelerle geçirilmelidir.

C# dilinde var olan arayüzleri uygulamanın bir yolu daha vardır. Buna açık arayüz uygulama denir. Bunun avantajları şunlardır:

Açık arayüz uygulama yöntemiyle sınıfa ait bazı üye elemanlara sınıf dışından erişim sınıf nesnelerine kapatılırken, aynı üye elemanlara sınıf dışından arayüz nesnesiyle erişim mümkün kılınabilir.
Bir sınıfa birden fazla arayüz uygulandığında eğer arayüzlerde aynı isimli üye elemanlar varsa isim çakışmasının önüne geçebiliriz. Örnek program:

Burada sinif türünden olan nesne arayuz türüne dönüştürüldü ve arayuz nesnesiyle Metot() metoduna erişildi. Direkt nesne üzerinden erişilemezdi. Aynı programı şöyle de yazabilirdik:

Açık arayüz uygulamada üye elemanlar public olarak belirtilemez. Dolayısıyla açık olarak uygulanan üye elemanlara o sınıf dışından erişilemez, sadece arayüz nesnesi üzerinden erişilebilir.
NOT: Yapılar da arayüz kullanabilir.
NOT: Sınıflar ve yapılar aynı anda hem bir sınıftan türeyebilirler hem de bir veya daha fazla arayüz kullanabilirler. Bu durumda sınıf ve arayüz(ler) virgüller ayrılır. Sınıf isminin ilk önce gelmesi gerekir.

Bu bölümde, yazdığımız Windows programının cevap verebilirliğini artıran bir yöntem göreceğiz. Bu yöntemde işlemci bir çevre bileşenine bir emir verir, ancak bu emrin yerine getirilmesini beklemez, kendi işine devam eder. Çevre birimi ilgili işi tamamladığında bir interrupt ile bunu işlemciye bildirir. Fark ettiğiniz üzere burada tek thread çalışmaktadır. Aslında asenkron programlama ile yaptığımız şeyi birden fazla thread açarak da yapabiliriz. Ancak asenkron programlama yöntemi bütün işi tek bir thread ile hallettiği için birden fazla thread kullanma yaklaşımına göre daha verimlidir.
Bir Windows form uygulaması programın kesildiği yerde donar. Buradaki kesilmekten kastımız işlemcinin bir metottaki bir satırda bir süre takılıp kalması, ilerlememesidir. Bu takılmaların çoğunda işlemci başka bir çevre biriminin iş yapmasını bekler, ancak bazen de yoğun işlemci gücü gerektiren işlemler yapılabilir. Asenkron programlama yaklaşımı birinci durumda kullanılabilir. İkinci durumda programın cevap verebilirliğini sağlamak için yeni thread açılması kaçınılmazdır.
Bir Windows form uygulamasının donması kullanıcı deneyimi açısından çok kötü bir şeydir. Formun üzerindeki kontroller tepki vermez hale gelir, hatta program penceresinin sağ üst kısmındaki kapatma, simge durumuna küçültme ve ekranı kaplama düğmeleri de çalışmaz hale gelir. Böyle bir durumda çoğu kullanıcı programın kilitlendiğini sanarak CTRL+ALT+DEL kısayolunu kullanarak programı kapatır.
Form tabanlı uygulamalarda program akışının kesilmesi formun donmasına neden olur. Çünkü formlar mesaj döngüsü mantığında çalışır. Bir formda sürekli sonsuz bir while döngüsünde dönülür. Bu while döngüsünün içinde formun kullanıcı eylemlerine tepki vermesini sağlayan kodlar bulunur, örneğin fare işaretçisinin bir butonun üzerine getirildiğinde butonun renk değiştirmesi gibi. Ayrıca form formun üzerindeki kontrollerin özelliklerine göre sürekli güncellenir. Örneğin formun üzerindeki bir butonun üzerinde bir metni değiştirmişsek bu değişiklik while döngüsünün sıradaki ilk iterasyonunda görüntüye yansıtılır. Son olarak bir metot çağrısı yaptığımızda da bu döngü yarıda kalır, metodun işlemleri yapılır, sonra kalınan yerden döngüye geri dönülür. İşte işlemi uzun süren bir metot çağrısı yaptığımızda formun donmasının sebebi budur. Ayrıca işletim sistemi belirli aralıklarla forma formun hayatta olup olmadığını öğrenmek için mesaj gönderir. Form da hayatta olduğuna ilişkin mesajı göndererek cevap verir. Bu işlem de mesaj döngüsünün içinde yapılır. Programımız bir metot içinde uzun süre kalırsa işletim sistemi bu mesajlara cevap alamaz ve programı "cevap vermiyor" (not responding) olarak işaretler. Windows, cevap vermeyen uygulamaların pencerelerini ilgili pencereyle aynı boyutlarda bir hayalet pencereyle değiştirir.

C# 5'ten itibaren asenkron işlemler asenkron metotlarla yapılır. Bundan öncesinde asenkron işlemler callback fonksiyonlarıyla ve aynı işi birden fazla metoda bölerek yapılabiliyordu. Ancak bu yöntem anlaşılmaz, zor ve hata yapmaya açıktı. Derleyici çoğu işi programcıya bırakıyordu. Ancak asenkron metot yaklaşımında asenkron işlemler hemen hemen senkron işlemler gibi yapılır, derleyici işin zor kısmını kendi halleder. Aşağıda bir asenkron metot bildirimi bulunmaktadır:

Asenkron metotlar async belirteciyle işaretlenir. async belirteciyle işaretlenen metotlar await anahtar sözcüğünü içerebilir, ancak içermesi zorunlu değildir. await anahtar sözcüğü geriye Task veya Task<T> döndüren bir ifadeyle kullanılmalıdır. Task ve Task<T> System.Threading.Tasks isim alanında bulunan birer sınıftır. Task sınıfı geriye değer döndürmeyen işleri, Task<T> sınıfı ise geriye değer döndüren işleri temsil eder. Şablon tip geriye döndürülecek nesnenin tipini belirtir. await anahtar sözcüğüyle kullanılan ifadenin temsil ettiği iş tamamlandıysa -varsa- ilgili atama yapılır. İş tamamlanmadıysa tamamlandığında geri dönülmek üzere ilgili metodu çağıran metoda geri dönülür. Yukarıdaki örnekte

ifadesiyle hem bir web sayfasını oluşturan metinlerin string olarak çekilmesi işlemine başlanır hem de geriye bir Task<string> nesnesi döndürülür. Burada önemli olan ilgili Task<string> nesnesinin oluşturulması için işin bitmesinin beklenmemesidir. İlgili Task<string> nesnesi ilgili işin gidişatı hakkında bilgi verir.

Burada ilgili Task<string> nesnesinin üreteceği değerle ilgili olmayan kodlar çalıştırılır.

Bu satır, ilgili Task<string> nesnesinin temsil ettiği işi bekleme komutudur. Eğer ilgili iş bitmişse elde edilen string s değişkenine atanır. Eğer ilgili iş bitmemişse metodu çağıran metoda geri dönülür. Eğer Task<string> nesnesinin oluşturulduğu satırla bu işlemin sonucunun beklendiği await'li satır arasında yapılacak başka iş yoksa bu iki satır aşağıdaki gibi tek satır olacak şekilde birleştirilebilir:

Geleneksel olarak asenkron metotların "Async" takısıyla bitmesi tavsiye edilir. Ancak zorunlu değildir. Async takısını gören başka programcılar bu metodun bir asenkron metot olduğunu anlarlar ve await anahtar sözcüğüyle kullanırlar.
Asenkron metotların çeşitli geri dönüş tipleri olabilir:

Task<T> İlgili asenkron metot geriye değer döndürüyorsa bu tip kullanılır. Metodun geriye döndürdüğü değerin tipine bağlı olarak bu şablon sınıfın kurulmuş hali kullanılmalıdır.
Task İlgili asenkron metot geriye değer döndürmüyorsa bu tip kullanılır.
void Sadece event handler metotlarda kullanılır. Event handler metot demek bilinçli olarak çağrılmayan, sadece bir olayın tetiklenmesiyle çalışan metot demektir.
C# 7'den itibaren GetAwaiter() metodunu içeren herhangi bir tiple asenkron metotlar geri dönebilir.

Bir asenkron metodu çağıran metodun da asenkron olması gerekir. Çünkü bir asenkron metot bir noktada kesildiğinde o metodu çağıran metot da kesilecektir. Bu kesinti zinciri çağrılan metottan çağıran metoda doğru ilerler. Bu ilerleyişin son bulduğu nokta event handler metottur. Çünkü event handler metotlar bilinçli bir metot çağrısıyla değil, olayın tetiklenmesiyle çalışır. Olayın tetiklendiği metodun asenkron olmasına gerek yoktur. Şimdi isterseniz birbirini çağıran metotlar üzerinde await anahtar sözcüğünün akışı nasıl yönlendirdiğini görelim:

Task sınıfına ait statik Delay() metodu programlardaki kesintiye neden olan durumları simüle etmek için kullanılır, programın akışını belirli bir süre kesintiye uğratır. Programın adım adım akışı şu şekildedir:

EventHandler metodunda 1. satır çalıştırılır. Burada Metot1() metoduna dallanma yapılır. Bu işi temsil eden Task<string> nesnesi oluşturulur.
Metot1() metodunda 1. satır çalıştırılır. Burada Metot2() metoduna dallanma yapılır. Bu işi temsil eden Task<int> nesnesi oluşturulur.
Metot2() metodunda 1. satır çalıştırılır. Burada Metot3() metoduna dallanma yapılır. Bu işi temsil eden Task nesnesi oluşturulur.
Metot3() metodunda 1. satır çalıştırılır. Task.Delay() metodu kesintiye neden olan asenkron bir metottur. Ancak program kesintiye uğramaz. Metot3() metodunun 1. noktasının çıktısını veren komut çalıştırılır (2. satır). Daha sonra 3. satıra bakılır. 3. satırda bir await ifadesi vardır ve t değişkeniyle kullanılmıştır. Bu satır programa şunu der: "t değişkeninin temsil ettiği görev bittiyse ilerleyebilirsin, ancak t değişkeninin temsil ettiği görev bitmediyse seni çağıran metoda geri dönmelisin, t değişkeninin temsil ettiği görev bittiğinde seni haberdar edeceğim." Henüz 5 saniye dolmamıştır, dolayısıyla t değişkeninin temsil ettiği görev bitmemiştir. Dolayısıyla akış Metot2() metodunun 2. satırına döner.
Metot2() metodunun 2. satırında ekrana "Metot2() metodu - 1. nokta" çıktısı verilir. 3 satırda t değişkeni kontrol edilir. Henüz Metot3() işlemin bittiğine dair mesajı göndermemiştir. O yüzden akış Metot1() metodunun 2. satırına gelir.
Metot1() metodunun 2. satırında ekrana "Metot1() metodu - 1. nokta" yazılır. 3. satırda henüz t değişkeninin temsil ettiği görev tamamlanmadığı için EventHandler() metodunun 2. satırına gidilir. Burada ekrana "EventHandler() metodu - 1. nokta" çıktısı verilir. 3. satırda henüz t değişkeninin temsil ettiği görev tamamlanmamıştır. Bunun üzerine eğer üzerinde çalıştığımız program bir form tabanlı uygulama ise formun mesaj döngüsüne dönülür. Eğer üzerinde çalıştığımız program bir konsol uygulaması ise olayı tetikleyen metoda dönülür (örneğin Main() metoduna). Main metodunda akışın kitlenmesine neden olacak bir komut yoksa olayın tetiklendiği satırdan sonraki komutlar çalıştırılır ve program sonlandırılır. Programdan çıkılırken beklenen herhangi bir sinyal olup olmadığına bakılmaz.
Form tabanlı uygulamada EventHandler() metodunun içindeki await'ten sinyal geldiğinde mesaj döngüsünden çıkılır ve EventHandler() metodunun 3. satırına gelinir.
EventHandler() metodunun 3. satırı bizi Metot1() metodunun 3. satırına yönlendirir.
Metot1() metodunun 3. satırı bizi Metot2() metodunun 3. satırına yönlendirir.
Metot2() metodunun 3. satırı bizi Metot3() metodunun 3. satırına yönlendirir.
Metot3() metodunun 3. satırının işlemi bitmiştir. Akış 3. metodun 4. satırından devam eder ve ekrana "Metot3() metodu - 2. nokta" yazılır.
Metot3() metodu bittiğine göre sıra Metot2() metodunun 4. satırına gelinir (3. satırda herhangi bir şey döndürülmemekte, sadece işlemin bittiği belirtilmektedir). 4. satırda ekrana "Metot2() metodu - 2. nokta" yazılır. Metot2() metodu geriye 0 değerini döndürmektedir.
Metot2() metodu bittiğine göre sıra Metot1() metodunun 3. satırına gelmiştir. Metot1() metodunun 3. satırında Metot2() metodunun geri döndürdüğü 0 değeri i değişkenine atanır. 4. satırda ekrana "Metot1() metodu - 2. nokta" yazılır. Metot1() metodu geriye "0" stringini döndürür.
Metot1() metodu bittiğine göre EventHandler() metodunun 3. satırına dönülür. Metot1() metodunun geri döndürdüğü "0" stringi s değişkenine atanır. 4. satırda ekrana "EventHandler() metodu - 2. nokta" yazılır.
Bütün metotların işi bittiğine göre mesaj döngüsüne geri dönülür.
Elbetteki form tabanlı uygulamalarda Console sınıfıyla ekrana çıktı veremezsiniz. Form tabanlı uygulama geliştirmişseniz Con

Derlenmiş exe ve dll dosyalarına assembly denir. Çalışan programımız içinde bir assembly olabileceği gibi birden fazla assembly de olabilir. Programımızda birden fazla assembly olması demek programımızın ilişkide olduğu bir ya da daha fazla dll dosyası mevcut demektir. System isim alanındaki AppDomain sınıfı çoklu assembly işlemleriyle ilgilenirken, System.Reflection isim alanındaki Assembly sınıfı ise tek bir assembly ile ilgili işlemler yapılmasını sağlar. Şimdi bu iki sınıfın çeşitli özelliklerini inceleyelim:

AppDomain sınıfının static CurrentDomain özelliği o an üzerinde çalışılan assembly grubunu bir AppDomain nesnesi olarak döndürür.
AppDomain sınıfının static olmayan GetAssemblies() metodu, ilgili AppDomain nesnesindeki bütün assemblyleri bir Assembly dizisi olarak tutar.
Assembly sınıfının static olmayan Location özelliği ilgili assemblynin sabit diskteki yolunu string olarak verir. Şimdi bu teorik bilgileri bir örnek üzerinde görelim:

Benim bilgisayarımda bu programın ekran çıktısı şöyle oldu:

Toplam assembly sayısı: 2
Assembly yeri: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
Assembly yeri: C:\Documents and Settings\Bekir Oflaz\new2.exe

mscorlib.dll dosyası şimdiye kadar sıklıkla kullandığımız System isim alanı ve bu isim alanına bağlı alt isim alanlarının içinde bulunduğu dosyadır. C# derlediğimiz her dosyaya bu dosyayı otomatik olarak ilişkilendirir. Bu dosyanın yolu kullandığınız .Net Framework sürümüne bağlı olarak sizde değişebilir.
Bazen programımızın ilişkiye girdiği dll dosyasının da ilişkiye girdiği başka bir dll dosyası olabilir. Bu durumda AppDomain sınıfının CurrentDomain özelliğiyle oluşturulan AppDomain nesnesine söz konusu bütün dll dosyaları dâhildir. Ancak tabii ki farklı assemblyler aynı dll dosyasını kullanıyorsa yalnızca bir tane dll AppDomain nesnesine dâhil edilir. Ayrıca AppDomain sınıfının GetAssemblies() metodu ile oluşturulan Assembly dizisinde sıra esas programda karşılaşılma sırasına göredir. Eğer programda System isim alanı kullanılmışsa ilk öğe mscorlib.dll'dir. Ondan sonra gelen öğe esas programımız, bundan sonra gelen öğeler ise karşılaşılma sırasına göre dll dosyalarıdır. Eğer herhangi bir dll dosyasını programımıza ilişkilendirir ancak söz konusu dll'i programımızda kullanmazsak söz konusu assembly programımıza dâhil değilmiş gibi hesaba katılır.

Assembly sınıfının static GetExecutingAssembly() metodu ile o an çalışan assemblynin kendisi bir Assembly nesnesi olarak döndürülür.
Assembly sınıfının static olmayan EntryPoint özelliği ilgili assemblynin başlangıç metodunu MethodInfo sınıfı türünden bir nesne olarak döndürür. MethodInfo sınıfını ileride göreceğiz. Başlangıç metodu çalıştırılabilir exe dosyalarında genellikle Main() metodudur. Dll dosyalarında ise başlangıç metodu yoktur. Bu yüzden bu özellik dll dosyaları için null değeri döndürür. Şimdi bu iki bilgiyi örnekleyelim:

Yeri gelmişken söylemek istiyorum. Bir sınıfın ya da yapının bir nesnesini Console.Write() ya da Console.WriteLine() metodu ile ekrana yazdırırsak aslında o nesnenin ToString() metodunun geri dönüş değerini ekrana yazdırmış oluruz. ToString() metodu normalde object sınıfına bağlıdır ve ilgili nesnenin türünü string olarak döndürür. Ancak tabii ki istersek kendi sınıf ya da yapılarımızda bu metodu override edip ilgili nesnemizin Console.Write() ya da Console.WriteLine() ile ekrana yazdırılırken nasıl davranması gerektiğini ayarlayabiliriz. Örnek:

Bu program sonucunda ekrana Deneme yazılacaktır. İstersek Sinif sınıfına yeni üye elemanlar ekleyip ekrana yazdırılacak şeyin nesneye bağlı olmasını sağlayabiliriz. Bu örneğimizde ekrana yazılacak şey nesneye bağlı değildir. Bu ipucundan sonra asıl konumuza dönebililiriz.

Assembly sınıfının static LoadFrom(string assembly_yolu) metodu bir assembly nesnesi döndürür. Örnek:

Bu program sonucunda assemblynin başlangıç noktası olarak ekrana hiçbir şey yazılmayacaktır. Çünkü null demek yokluk demektir.

Assembly sınıfının static olmayan GetTypes() metodu ilgili assemblydeki tüm türleri (sınıf, yapı, vb.) bir System.Type dizisi olarak döndürür. System.Type sınıfını ileride göreceğiz. Ancak şimdilik buna basit bir örnek verelim:

Bu program bende şu çıktıyı verdi:

Assembly: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
Tür sayısı: 2319
*******
Assembly: C:\Documents and Settings\Bekir Oflaz\new2.exe
Tür sayısı: 1
*******

Buradan anlıyoruz ki mscorlib.dll dosyasında tam 2319 tür varmış. Sizdeki .Net Framework sürümüne göre bu sayı değişebilir.

Assembly sınıfının static olmayan GetType(string Tür) metodu ilgili assemblydeki belirli bir türü System.Type nesnesi olarak tutar. Örnek:

Gördüğünüz gibi türü bağlı olduğu isim alanıyla belirtmemiz gerekir.

C# (si şarp diye okunur) Microsoft tarafından geliştirilmiş olan bir programlama dilidir. C++ ve Java dillerine oldukça benzer, ancak C#'ın bu dillere benzerliği yanında farkları da vardır. Örneğin C#, C++'dan farklı olarak % 100 nesne yönelim tekniğine sahiptir. Java'dan farklı olarak ise C#'ta gösterici (pointer) kullanılabilir. Böylelikle eski yazılım bileşenleriyle uyumlu bir şekilde çalışılabilir.

C# kodları, C++ veya Visual Basic'ten farklı olarak direkt makine koduna derlenmez. Önce IL dediğimiz bir ara koda derlenir. Bu derlenen ilk kodun dosyasına assembly denir ve uzantısı exe'dir. Bu dosya çalıştırılmak istendiğinde ise .Net Framework devreye girer ve IL kodu makine koduna dönüştürür, (alttaki şekle bakınız) böylelikle artık kodu bilgisayar anlayabilir. İşte bu yüzden de yazdığımız programın bir bilgisayarda çalışması için o bilgisayarda .Net Framework programının kurulu olması gerekir, çünkü .Net Framework IL kodu bilgisayarın anlayabileceği koda çevirir. .Net Framework, oluşturduğu makine kodlarını geçici bir süreliğine belleğe koyar, eğer aynı kodlar tekrar çalıştırılmak istenirse tekrar IL koddan makine koduna dönüşüm yapmak yerine bu belleğe kaydettiği makine kodlarını kullanır. Bu yüzden oluşturduğumuz programımızı ilk çalıştırdığımız zaman programımız biraz yavaş çalışabilir, ancak daha sonraki çalışmalarda oldukça hızlanacaktır.
C#'ta kodun direkt makine kodu yerine, önce IL koda çevrilmesinin bazı avantajları vardır. Bunlardan en önemlisi programımızın farklı işletim sistemlerinde çalışmasının eskiye oranla çok daha kolay olmasıdır. Çünkü makine kodu taşınabilir değildir, programları direkt makine koduna derlediğimiz zaman ilgili programın belirli bir işletim sistemine göre derlenmesi gerekir. Halbuki IL kod taşınabilirdir, ortak bir koddur, işletim sistemlerindeki çeşitli programlar vasıtasıyla makine koduna dönüştürülebilir. Örneğin Windows'ta bu işi .Net Framework yaparken, Linux'ta Mono yapabilir. Bu kitap C#'ı Windows üzerinden anlatacaktır. Ancak kitabın Linux'ta C# kullanımı kısmında ayrıca Linux'ta C# ile program geliştirme de anlatılacaktır.

Son bir-iki bölüm dışındaki bütün kodları Not Defteri'nde (notepad) yazacağız. Aslında Visual Studio adında son derece gelişmiş ve işimizi son derece kolaylaştıran bir editör yazılımı var. Ancak bizim buradaki amacımız gelişmiş kurumsal yazılımlar geliştirmek yerine C#'ı tam anlamıyla öğrenmek olduğu için bu gelişmiş yazılımı kullanmayacağız. Not Deferi'nde yazdığımız kod dosyasına "cs" uzantısı verip .Net Framework programıyla birlikte gelen csc.exe derleyicisi ile derleyeceğiz. Bu derleyici komut satırında çalışıyor ve dolayısıyla da kodumuzun derlenmesi için komut satırında kod yazacağız. Yani .Net Framework programı hem kodumuzu derlemek için, hem de programımızın çalışması için gerekli. .Net Framework'u herhangi bir download sitesinden ya da Microsoft'un resmî sitesinden ücretsiz olarak indirip bilgisayarınıza kurabilirsiniz. Vista kullanıyorsanız çok büyük ihtimalle, XP kullanıyorsanız da bir ihtimalle .Net Framework sizde zaten kuruludur. Ancak işinizi garantiye almak isterseniz veya son sürümünü edinmek isterseniz tekrar kurabilirsiniz.
.Net Framework'u kurduktan sonra bilgisayarımıza bir ayar yapmamız gerekecek. Bu ayara "path ayarlama" diyoruz. Bu ayarı yapmamızın sebebi komut satırında hangi klasörde olursak olalım csc.exe'ye erişebilmemiz. Bunun için şunları yapın:

Bilgisayarım'a sağ tıklayın.
"Özellikler"i seçin.
"Gelişmiş" sekmesine gelin.
"Ortam Değişkenleri" butonuna tıklayın.
"Sistem değişkenleri" kısmındaki "Path"a çift tıklayın.
Bu pencere burada kalsın, şimdi C:\WINDOWS\Microsoft.NET\Framework klasörüne gidin. Oradaki klasörlerin herbirinin içine tek tek bakın. Hangisinin içinde csc.exe varsa o klasörün adres çubuğundaki yolu kopyalayın.
Şimdi önceki açtığımız "Sistem Değişkenini Düzenle" penceresinin "Değişken Değeri" kısmının sonuna ; işaretini koyup yolu yapıştırın.
Bütün pencerelerden "tamam" diyerek çıkın.
Artık Not Defteri'nde yazdığımız kodu csc.exe derleyicisi ile derleyebiliriz. Örneğin "cs" uzantısı verdiğimiz kaynak kodumuzun adı "deneme.cs" olsun. Komut satırını açıp, kaynak kod dosyamızın olduğu klasörü aktif hâle getirip, csc deneme.cs yazıp entera basarak kodumuzu derleriz. Oluşan exe dosyamız kaynak kodumuzla aynı klasörde ve deneme.exe adıyla oluşur. Eğer aktif klasörde zaten deneme.exe diye bir dosya varsa eski dosya silinip yeni dosyamız kaydedilir. Programımızın kaynak kodun adından farklı bir adla oluşmasını istiyorsak

csc /out:YeniAd.exe deneme.cs

komutunu veririz. Bu örnekte programımız YeniAd.exe adıyla oluşacaktır.

C#'la şunları yapabilirsiniz:

Konsol uygulaması geliştirme
Windows uygulaması geliştirme
ASP.NET uygulaması geliştirme
Web servisleri yazma
Mobil uygulama geliştirme (PDA, cep telefonları vb. için)
DLL yazma
Oyun geliştirme (Unity, CryEngine, Xenko, vb.)
Biz kitap boyunca konsol uygulamaları, son bölümlerde de form tabanlı uygulamalar geliştireceğiz. Ancak kullandığınız dilin ne kadar güçlü bir dil olduğunu öğrenmeniz açısından bunları bilmenizde fayda var.

Program yazarken her zaman sabit verilerle çalışmayız, çoğu zaman programımızda bir verinin kullanıcının davranışına göre değişmesi gerekir. Kullanıcıdan bir metin alıp bunu ekrana yazdıran bir program buna örnek verilebilir. Değişken kısaca bellek gözeneklerinin programlamadaki karşılıklarıdır.

Çoğu programlama dilinde değişkenler kullanılmaya başlanmadan önce tanımlanırlar. Aşağıdaki şekli inceleyiniz.

Yukarıdaki şekilde C#'ta değişken tanımlamanın nasıl yapıldığı anlatılmıştır. Değişken türü bellekte ayrılan gözeneğin büyüklüğünü belirtmemizi sağlar. Değişken adı da bu gözeneğe verdiğimiz adı belirtir. Doğal olarak bu gözenekteki veriye erişmek istediğimizde veya bu gözenekteki veriyi değiştirmek istediğimizde bu adı kullanacağız. Yukarıdaki şekilde -2,147,483,648 ile 2,147,483,647 arasında (sınırlar dâhil) bir değer tutabilen ve adı "ad" olan bir bellek gözeneği oluşturduk.

Çoğu programlama dilinde değişkenler tanımlandıktan sonra direkt olarak programda kullanılabilirler. Ancak C#'ta değişkeni tanımladıktan sonra ayrıca bir de ilk değer atamak zorundayız. Aksi bir durumda değişkeni programımız içinde kullanamayız. Değişkenlere değer atama şöyle yapılır:

Burada ad değişkenine 5 değerini atadık. Bu en basit değer atama yöntemidir. Ayrıca şunlar da mümkündür:

Birinci satırda tanımlama ve değer vermeyi aynı satırda yaptık. İkincisinde aynı türden birden fazla değişken tanımladık. Üçüncü satırda ise tanımladığımız değişkenlerin bazılarına değer verirken bazılarına vermedik.
Aslına bakarsanız C#'ta değişken tanımlarken illaki türü belirtmek zorunda değiliz. Örnek:

Bu tür değişken tanımlamalarına bilinçsiz değişken tanımlaması denir. Bilinçsiz değişken tanımlamalarında çoklu değişken tanımlaması yapamayız. Ayrıca değişkene tanımlanır tanımlanmaz değer vermeliyiz. Aslına bakarsanız var ile yapılan değişken tanımlamalarında da değişkenlerin türleri vardır ve bu türler daha sonra değiştirilemez. Tek fark derleyicinin değişkenin tipini değerden anlamasıdır. Yani işlevsel olarak aşağıdaki iki değişken tanımlaması arasında fark yoktur.

Yukarıda değişken tanımlarken değişken türü için int kullanmıştık. C#'ta bunun gibi farklı kapasitelere sahip bir hayli daha değişken türü vardır. Ayrıca bazı değişken türleri sayısal, bazıları da metinseldir. Sayısal türler aşağıdaki tabloda listelenmiştir:

Dikkat ettiyseniz bazı değişken türlerinde değer atarken değerin sonuna bir karakter eklenmiş, bu değişken türlerindeki değişkenlere değer atarken siz de bunlara dikkat etmelisiniz. Sıra geldi metinsel türlere:

String türüne ayrıca char ve/veya string sabit ya da değişkenler + işaretiyle eklenip atanabilir. Örnekler:

C#'ta hem metinsel hem de sayısal olmayan türler de vardır:

Koşullu yapılarda kullanılır. Bool türünden değerlere true, false veya 2<1 gibi ifadeler örnek verilebilir. Örnekler:

Bu değişken türüne her türden veri atanabilir. Örnekler:

Aslında C#'taki bütün değişken türleri object türünden türemiştir. Bu yüzden object türü diğerlerinin taşıdığı bütün özellikleri taşır. Ancak şimdilik bunu düşünmenize gerek yok. Bu, nesneye dayalı programlamanın özellikleriyle ilgili.

Şimdiye kadar değişkenleri tanımlayıp ilk değer verdik. Şimdi değişkenleri programımızda kullanmanın zamanı geldi. Bir örnek:

Burada a değişkeninin değerini ekrana yazdırdık. Başka bir örnek:

Bu programda iki değişkenimizin değerlerinin toplamını ekrana yazdırdık.

Bu programda aynı satırda iki tane string değişkeni tanımladık ve değer verdik. Bu değişkenlerin değerlerini WriteLine metoduyla ekrana yan yana yazdırdık. WriteLine metodu + işaretini gördüğünde sayısal değişken ve değerleri toplar, string türünden değişken ve değerleri yan yana yazar, char türünden değişken ve değerlerin Unicode karşılıklarını toplar. Ancak tabii ki + karakterinin ayırdığı değişken veya değerler char ile stringse char karakterle string metni yan yana yazar.   

Sanırım şimdiye kadar yazdığımız en gelişmiş program buydu. Bu program kullanıcıdan bir metin alıp bunu ekrana "... metnini yazdınız." şeklinde yazıyor. Geçen derste ReadLine metodunu kullanıcı entera basana kadar programı bekletmek için kullanmıştık. Aslında ReadLine metodunun en yaygın kullanımı kullanıcının bilgi girişi yapmasını sağlamaktır. Dikkat ettiyseniz programımızda kullanıcının girdiği bilgi a değişkenine atanıyor. Sonra da WriteLine metoduyla ekrana bu değişken ve " metnini yazdınız." metni yan yana yazdırılıyor. Burada asıl önemsememiz gereken şey Console.ReadLine() ifadesinin string türünden bir değer gibi kullanılabilmesidir. C#'ta bunun gibi birçok metot bir değer gibi kullanılabilir. Tahmin edebileceğiniz üzere WriteLine gibi birçok metot da bir değer gibi kullanılamaz. Başka bir örnek:

  
Bu programda da görebileceğiniz gibi değişkenlere değer olarak başka bir değişkeni atayabiliriz. Ancak değerini atadığımız değişkene daha önceden bir değer atanmış olması gerekiyor. Burada b değişkenine a değişkeninin değeri atanıyor. Ancak aşağıdaki gibi bir kullanım kesinlikle hatalıdır.

Burada Console.ReadLine() ifadesi bir değişkenmiş gibi kullanılmaya çalışılıyor, ancak hatalı. Çünkü Console.ReadLine() ifadesi yalnızca bir değermiş gibi kullanılabilir.

Şimdiye kadar değişkenlere ad, a veya b gibi basit adlar verdik. Ancak aşağıdaki kuralları ihlal etmemek şartıyla değişkenlere istediğiniz adı verebilirsiniz.

Değişken adları boşluk, simge içeremez.
Değişkenler bir numerik karakterle başlayamaz.
C#'ın diğer bütün komut, metot ve benzerlerinde olduğu gibi değişken adlarında büyük-küçük harf duyarlılığı vardır. Yani degisken isimli bir değişkenle Degisken isimli bir değişken birbirinden farklıdır.
Değişken adları Türkçe karakterlerden(ğ,ü,ş,ö,ç,ı) oluşamaz. (Yeni versiyonlarda Türkçe karakterler kullanılabilir.)

C#'ta değişkenlerle ilgili sık yapılan hatalar şunlardır:

Aynı satırda farklı türden değişkenler tanımlamaya çalışma. Örneğin aşağıdaki örnek hatalıdır:

Değişkene uygunsuz değer vermeye çalışma. Örnek:

Değişkeni tanımlamadan ve/veya değişkene ilk değer vermeden değişkeni kullanmaya çalışma. Aşağıdaki örnekte iki değişkenin de kullanımı hatalıdır.

Değişken tanımlaması ve/veya değer vermeyi yanlış yerde yapma. Örnek:

Diğer using dışındaki bütün komutlarda da olduğu gibi değişken tanım ve değer vermelerini de Main bloğunun içinde yapmalıyız.

Bazı değişken türlerindeki değişkenlere değer verirken eklenmesi gereken karakteri eklememek. Örnek:

Ondalık sayıların ondalık kısmını ayırırken nokta (.) yerine virgül (,) kullanmak. Örnek:

Metinsel değişkenlerle matematiksel işlem yapmaya çalışmak. Örnek:

Bir değişkeni birden fazla kez tanımlamak. Örnek:

Değişkenlere değer verirken yanlış şekilde değer vermek. Örnek:

Programımızda bazen değeri hiç değişmeyecek değişkenler tanımlamak isteyebiliriz. Örneğin pi isimli float türünden bir değişken tanımlayıp buna 3.14 değerini verip programımızda pi sayısına ihtiyaç duyulduğunda bu değişkeni kullanabiliriz. Sabit değişkenlerin normal değişkenlerden farkı değişkeni değiştirmek istediğimizde ortaya çıkar, sabit olarak belirtilen değişkeni değiştirirsek derleyici hata verip programımızı derlemez. Bu daha çok uzun program kodlarında işe yarayabilir. Ayrıca sabit değişkenlere tanımlandığı satırda değer vermeliyiz. Herhangi bir değişkeni sabit olarak belirtmemiz için değişken türünden önce const anahtar sözcüğü kullanılır. Örnekler:

Aşağıdaki gibi bir durum, değişkene tanımlandığı satırda değer verilmediği için hatalıdır.

Sabit değişkenlere değer olarak sabit, sabit değişken ya da sabit ve/veya sabit değişkenlerden oluşan matematiksel ifadeler verilebilir. Örnek:

Aşağıdaki gibi bir durum hatalıdır.

Bir string sabitin içinde özel karakterler olması için escape sequence kullanılır. Örnekler:

Bu satırda " karakterinin ad değişkenine atanan string sabitin içine koyulmasını sağladık. Yukarıdaki kod ekrana Deneme"Deneme yazar. Başka bir örnek:

Burada bir illegal karakter olan \ karakterinin başına tekrar \ koyarak stringin bir tane \ almasını sağladık.

Burada yol değişkenine tırnak içerisindeki metin olduğu gibi aktarılır, ancak doğal olarak " karakterinde işe yaramaz.

Örnekte de gördüğünüz üzere C#'ta \n yeni satır yapmak için kullanılır.

Burada değişkenlerle ilgili olan ancak herhangi bir başlıkta incelenemeyecek olan önemli bilgiler bulunmaktadır. Bunların bazıları kendiniz çıkarabileceğiniz mantıksal bilgilerdir.

ReadLine() metodunun tuttuğu değer string türündedir.
WriteLine() metodunda parantezler arasına girilen değer object türünden olmalıdır. Yani herhangi bir türden değer yazılabilir.
Bütün değişkenler bir değermiş gibi kullanılabilir ancak değerler değişkenmiş gibi kullanılamaz.
Eğer bir değişkeni tanımlamış veya tanımlayıp değer vermiş, ancak programımızın hiçbir yerinde kullanmamışsak derleyici hata vermez, sadece bir uyarı verir.
"deneme"+"yalnızlık"+'d'+'m' gibi bir ifade aslında string türünden bir sabittir.
(3+8/9)*6 gibi bir ifade, byte, sbyte, short, ushort, int, uint, long, ulong veya double türünden değişkenlere atanabilir.
Aslında C#'ta sabitlerin de türleri vardır. Mesela:
"5" string türünden
'5' char türünden
5f float türünden
12.7 veya 5d veya 5D double türünden (C# harfi olmayan ondalıklı sayıları double sayar.)
5m decimal türünden
5 ise int türündendir. Çünkü C# herhangi bir ayırt edici özelliği bulunmayan tam sayı sabitleri int türünden sayar. Ancak 5'in türünün int olması 5'in byte türünden bir değişkene atanamayacağı anlamına gelmez. int türünden sabitler byte, sbyte, short, ushort ve uint türünden değişkenlere de atanabilirler.
5+"deneme"+6.7f gibi bir ifade aslında object türünden bir sabittir.
C#'ta herhangi bir sabit ya da değişkenin türünü anlamak için x.GetType() metodu kullanılır. Örnek:

Ancak GetType() metodunun tuttuğu değer Type türündedir, dolayısıyla herhangi bir string türündeki değişkene vs. atanamaz, ayrıca da GetType() metodu değişkenin CTS'deki karşılığını verir. Değişkenlerin CTS karşılıkları bir sonraki dersimizin konusudur.

Sabitin diğer adı değerdir.
a=b ifadesi atama işlemidir. b'nin değeri a'ya

Programlama dilleri genel anlamda ikiye ayrılabilir. Bunlar dinamik diller ve statik dillerdir. C, C++, C# ve Java birer statik dildir. Python, Ruby ve JavaScript ise birer dinamik dillerdir. Dinamik diller daha fazla esneklik sağlar, çabucak uygulama geliştirilmesine imkan verir, ancak buna karşılık olarak daha yavaştırlar ve büyük çaplı projelerin geliştirilmesine uygun değildirler. Örneğin JavaScript'te aşağıdaki gibi kodlar yazılabilir:

Burada a'nın tipini bilmiyoruz, ancak buna rağmen iki özelliğe ve bir metoda bu nesne üzerinden ulaşabiliyoruz. Halbuki statik dillerde böyle bir şey mümkün değildir. Statik dillerde a değişkeninin tipini açıkça belirtmeliyiz, daha sonra sadece o tipin tanımının içinde olan üye elemanlara o nesne üzerinden erişebiliriz. C#'ta dinamik dillerin bu özelliğini dynamic anahtar sözcüğüyle taklit edebiliriz. C#'ta dinamik tiplerle çalışma CLR'in üzerine eklenen DLR katmanıyla olur. Bir dinamik nesne üzerinden herhangi bir üye eleman çağrıldığında C# derleyicisi ilgili tipin içinde ilgili üye elemanın bulunup bulunmadığı kontrolünü yapmaz, bu kontrolü çalışma zamanında DLR'ye bırakır. Örnek:

Main bloğunun içinde bu iki satırın olduğu program derlenebilir. Çünkü C# derleyicisi dinamik tiplerin üye eleman çağrımlarında herhangi bir kontrol yapmaz. Ancak derlenmiş bu programı çalıştıracak olursanız çalışma zamanı hatası oluşur. Çünkü DLR, int tipinden olan d değişkeniyle int tipinde olmayan bir özelliğe erişilmeye çalışıldığında ne yapacağını bilemez. Aslında DLR, CLR'den daha akıllıdır. Örnek:

Activator sınıfına ait olan CreateInstance() metodu aslında geriye object nesnesi döndürür. Ancak buna rağmen bu geriye dönen nesne üzerinden string sınıfının Length özelliğine erişebildik. Az önce dediğim gibi DLR, CLR'den daha akıllıdır, eğer ilgili üye eleman o değişkenin tipi içinde yoksa o değişkenin gizli tipine bakar, ilgili üye elemanı orada arar, bulursa çalıştırır.
Bir metot dinamik tipte parametre alabilir, geri dönüş tipi dinamik olabilir. Dinamik tipler ile statik tipler arasında rahatlıkla tip dönüşümü yapılabilir. Dönüşümün uyumluluğu derleme aşamasında değil, çalışma aşamasında yapılacaktır.

Az önce int tipindeki dinamik bir nesne üzerinden Ozellik özelliğine erişmiştik. int tipinin içinde Ozellik özelliği olmamasına rağmen C# derleyicisi derlemeye izin vermişti, ancak çalışma zamanında hata oluşmuştu. Bu hatanın oluşmasının sebebi DLR'nin ilgili tip tanımının içinde olmayan bir üye çağrısı olduğu zaman ne yapacağını bilememesidir. Şimdi DLR'ye bu konuda yardımcı olacağız. Bir tipin dinamik olabilmesi için ilgili tipin ya IDynamicMetaObjectProvider arayüzünü kullanması gerekir, ya da DynamicObject sınıfından türemesi gerekir. DynamicObject abstract bir sınıftır ve IDynamicMetaObjectProvider arayüzünü uygulamıştır. IDynamicMetaObjectProvider içinde sadece aşağıdaki metot bulunur:

Burada DynamicMetaObject, System.Dynamic isim alanındaki bir sınıftır. Expression ise System.Linq.Expressions isim alanında bulunan bir sınıftır. Biz burada dinamik tipler oluşturmak için IDynamicMetaObjectProvider arayüzü yerine, DynamicObject sınıfını kullanacağız. Örnek:

Buradaki Sinif sınıfı normal üye elemanlar da içerebilir. Bir çakışma olması durumunda normal üye elemanlar çalışır. Örneğin sınıfta normal şekilde tanımlanmış ve tek bir int parametre alan Metot() isimli bir metot varsa ve programımızda örneğin d2.Metot(3); çağrısı varsa bu durumda normal metot çalışır. Bu durum diğer bütün üye eleman tipleri için de geçerlidir.

Şimdiye kadar birçok değişken tanımladık ve programlarımızın içinde kullandık. Bir program içinde tanımladığımız değişken sayısı şimdiye kadar bir elin parmaklarını geçmedi. Ancak her zaman bu böyle olmayabilir. Bazı programlarda 200-300 değişkene ihtiyaç duyabiliriz. Bunların hepsinin teker teker tanımlanması oldukça zahmetlidir. İşte bu yüzden programlama dillerinde dizi diye bir kavram vardır. Aslında bir dizi, birbiriyle ilişkili değişkenlerin oluşturduğu bir gruptan başka bir şey değildir. Diyelim ki sayi1 ve sayi2 adlı iki değişken tanımladık. Bunların adları birbirine benzemesine rağmen birbiriyle hiçbir ilişkisi yoktur. Yani bir döngü içinde sayiX yazarak bu değişkenlere erişemeyiz. Halbuki dizilerde bu mümkündür.

veya

Yukarıdaki iki kodda da int türünden 25 elemanlı dizi adında bir dizi tanımlandı ve dizinin her bir elemanına int türünün varsayılan değeri atandı. Varsayılan değerler, sayısal türler için 0, object türü için NULL (yokluk), string türü için "", char için ' ' (boşluk) ve bool için false değerleridir.

Bütün dizilerin birinci elemanı 0. indeksidir. dizi dizisinin birinci elemanına dizi[0], 10. elemanına dizi[9] yazarak erişebilir ve bu dizi elemanlarını bir değişkenmiş gibi kullanabiliriz. Örnek:

Bu program ekrana 30 yazacaktır.

C ve C++ programlama dillerinde olduğu gibi dizilerin elemanlarına aşağıdaki gibi de değer atayabiliriz:

Ancak bu şekilde dizi belirtimini sadece dizi tanımlamalarında kullanabiliriz. Örneğin bir sonraki derste göreceğimiz metotlara parametre olarak bir int dizisi vermemiz gerekiyorsa parametre olarak sadece {1, 2, 3} ifadesini veremeyiz. {1, 2, 3} ifadesini bir değişkene atayıp bu değişkeni metoda parametre olarak vermeliyiz. Ayrıca aşağıdaki kullanım da hatalıdır:

Çünkü daha önce de bahsettiğimiz gibi direkt dizi belirtimi sadece dizi tanımlamalarında geçerlidir.
Başka bir dizi tanımlama yöntemi de şöyledir:

Üstelik bu şekilde dizi belirtimini dizi kullanmamız gereken her yerde yapabiliriz. Örneğin bir metoda parametre olarak bir int dizisi vermemiz gerekiyorsa metot çağrısında parametre yerine direkt new int[]{1, 2, 3} yazabiliriz.
Diziler yukarıdaki şekilde tanımlandığında söz konusu dizilerin eleman sayısı yazılan eleman sayısı olur. Örneğin yukarıdaki örneklerde bütün dizilerin eleman sayısı üçtür ve dördüncü elemana ulaşmak istersek programımız çalışma zamanında hata verir. Bu şekilde dizi elemanlarına değişken ve ifadeler de atanabilir.

int[] dizi=new int[20]; satırında 20'nin illaki sabit olmasına gerek yoktur. Değişken ya da ifade de olabilir. Örnek:

Eleman sayısı belirlenen bir dizinin eleman sayısı daha sonra değiştirilemez.
Birden fazla dizi aşağıdaki gibi tanımlanabilir:

veya

İkincisinde tanımlanan dizinin elemanlarına henüz erişilemez.

foreach yalnızca dizilere uygulanabilen bir döngü yapısıdır. Kullanımı şu şekildedir:

Burada dizi dizisinin bütün elemanları teker teker ekrana yazdırılıyor.

foreach döngüsüyle dizi elemanlarının değerini değiştiremeyiz, sadece ekrana yazdırmak gibi "read-only" işler yapabiliriz.

Çok boyutlu diziler kısaca her bir elemanı bir dizi şeklinde olan dizilerdir, matris dizileri (düzenli diziler) ve düzensiz diziler olmak üzere ikiye ayrılır.

Her bir dizi elemanının eşit sayıda dizi içerdiği dizilerdir. 

3X2 boyutunda iki boyutlu bir matris dizi aşağıdaki gibi tanımlanabilir:

veya

İkinci dizinin elemanları indekslerine göre aşağıdaki gibidir.
dizi[0,0] → 1
dizi[0,1] → 2
dizi[1,0] → 3
dizi[1,1] → 4
dizi[2,0] → 5
dizi[2,1] → 6
Bu diziyi matris olarak aşağıdaki gibi gösterebiliriz:

Üç boyutlu bir dizi:

veya

Bu dizinin indekslerine göre elemanlarıysa;
dizi[0,0,0] → 1
dizi[0,0,1] → 2
dizi[0,1,0] → 3
dizi[0,1,1] → 4
dizi[1,0,0] → 5
dizi[1,0,1] → 6
dizi[1,1,0] → 7
dizi[1,1,1] → 8
dizi[2,0,0] → 9
dizi[2,0,1] → 10
dizi[2,1,0] → 11
dizi[2,1,1] → 12

foreach döngüsüyle iç içe döngü kurmaya gerek kalmadan her çeşit boyutlu matris dizinin elemanlarına ulaşılabilir.
Eğer dizilerin elemanlarını değiştirmemiz gerekiyorsa iç içe for döngüsü kurmamız gerekir. Örnek:

Bu programda dizinin bütün elemanlarının değerini 20 ile değiştirdik.

Her bir dizi elemanının farklı sayıda eleman içerebileceği çok boyutlu dizilerdir.

Birinci satırda 3 satırı olan ancak sütun sayısı belli olmayan iki boyutlu bir dizi tanımlanıyor. İkinci, üçüncü ve dördüncü satırda da bu iki boyutlu dizinin her bir satırının kaç sütun içerdiği ayrı ayrı belirtiliyor.

Düzensiz dizilerin elemanlarına, örneğin 0,0 indeksine dizi[0][0] yazarak erişebiliriz.
Düzensiz dizilerde foreach döngüsü sadece dizi adını yazarak çalışmaz. Ana düzensiz dizinin her bir elemanı için farklı bir foreach döngüsü başlatılmalıdır.
Şimdiye kadar öğrendiğimiz şekilde düzensiz dizilerin elemanlarını iç içe for döngüsüyle değiştiremeyiz. Çünkü her satır farklı sayıda sütun içerebileceği için satırların sütun sayısı dinamik olarak elde edilmelidir. Bunun için C#'ın System isim alanındaki Array sınıfına ait metotları vardır ve her diziyle kullanılabilirler.

x.GetLength(y) şeklinde kullanılır. Herhangi bir dizinin eleman sayısını int olarak tutar. x diziyi, y o dizinin hangi boyutunun eleman sayısının hesaplanacağını belirtir. Örnekler:

Bu program ekrana 4 yazar.

Bu program ekrana 3 yazar.

Bu program dizinin bütün elemanlarını teker teker ekrana yazar.

Şimdiye kadar öğrendiğimiz dizi tanımlama yöntemlerinin yanında başka dizi tanımlama yöntemleri de vardır.

Burada int türünden 5 elemanlı dizi adında bir dizi tanımlandı ve dizinin her bir elemanına int türünün varsayılan değeri atandı.

Burada 3X2X5 boyutunda int türünden 3 boyutlu bir dizi oluşturduk.

Burada 2X3X6X8X7 boyutunda beş boyutlu bir dizi oluşturduk.

CreateInstance yöntemiyle oluşturulan dizilere DiziAdi[0,4] gibi bir yöntemle erişilemez. Şimdi bir örnek yapalım:

Daha önce CreateInstance yöntemiyle oluşturulan dizilere DiziAdi[0,4] gibi bir yöntemle erişilemeyeceğini söylemiştik. İşte bunun için çeşitli metotlar vardır.
GetUpperBound: Bir dizinin son indeks numarasını verir.
SetValue: Bir dizinin belirli bir indeksini belirli bir değerle değiştirir.
GetValue: Bir dizinin belirli bir indeksini tutar.

Bu metotların kullanımları yukarıdaki örnek programda verilmiştir.
Bu metotlar normal şekilde oluşturulan dizilerle de kullanılabilir.

Burada dizi1'in tüm elemanları dizi2'ye 3. indeksten itibaren kopyalanıyor.

Burada 3 tane eleman dizi1'den dizi2'ye kopyalanır. Kopyalama işlemi 0. indeksten başlar.

Burada dizi1'in 2. indeksinden itibaren 3 eleman, dizi2'ye 7. indeksten itibaren kopyalanıyor.

Örnek:

Başka bir örnek:

Örnek:

BinarySearch metodu, bir nesneyi bir dizi içinde arar, eğer bulursa bulduğu nesnenin indeksini tutar, bulamazsa negatif bir sayı tutar. BinarySearch'ü kullanabilmek için diziyi daha önce Sort ile sıralamalıyız. Başka bir örnek:

BinarySearch burada 3. indeksten itibaren 4 eleman içinde "yakup"u arar. Bulursa indeksini tutar. Bulamazsa negatif bir sayı tutar.
UYARI: Yalnızca tek boyutlu diziler Sort ile sıralanabilir, dolayısıyla da çok boyutlu dizilerde hem Sort ile sıralama hem de BinarySearch ile arama yapmak imkansızdır.

Bu kod dizi dizisinin 1. indeksinden itibaren 3 indeksini sıfırlar (varsayılan değere döndürür).

Bu kod dizi dizisinin tamamını ters çevirir.

Bu kod dizi dizisinin 1. indeksten itibaren 3 elemanını ters çevirir.

Enum sabitleri sayesinde bazı özel sözcüklerin bazı tam sayıları temsil etmesini sağlayabiliriz. En genel enum bildirimi şu şekilde yapılır:

Bu bildirimde enum sabitinin adı ADdır. tur ise sözcüklerin hangi türden sabitleri temsil edeceğini belirtir. Parantez içindeki sözcükler ise herhangi bir sabiti temsil etmesini istediğimiz sözcüklerdir. Parantez içine en fazla türün kapasitesi kadar sözcük girilebilir. Örneğin tur yerine byte yazmışsak en fazla 255 tane sözcük girebiliriz.

Burada bir tür belirtmediğimiz için otomatik olarak tür int olur. Enum sabitlerinin türünü byte, sbyte, short, ushort, int, uint, long ve ulong türlerinden biri yapabiliriz. Şimdi enum sabitleriyle ilgili bir örnek yapalım. Örneğimizde bir metot kendisine ilk parametre olarak gönderilen dizinin elemanlarını ekrana yazsın. Metodun ikinci parametresinde de dizinin elemanlarının ekrana nasıl yazılacağı ayarlansın. Eğer ikinci parametre YANINA olarak girilirse dizinin elemanları ekrana yan yana yazılsın. Eğer ikinci parametre ALTINA olarak girilirse dizinin elemanları ekrana alt alta yazılsın:

Şimdi başka bir örnek:

Bu program ekrana kullanıcı 0 girerse basarisiz, 1 girerse gecmez, 2 girerse gecer, 3 girerse orta, 4 girerse iyi ve 5 girerse pekiyi yazmaktadır. Eğer kullanıcı 5'ten büyük bir sayı girerse sayıyı yazacaktır. Enum sözcüklerinin verilen türe göre temsil ettikleri bir tam sayı vardır. Biz enum sabitini tanımlarken herhangi bir ek düzenleme yapmadığımız için ilk sözcük 0'ı temsil eder. Diğer sözcükler de birer artarak kendi sayılarını temsil eder. Yani aşağıdaki tablo söz konusudur:

Ayrıca gördüğünüz gibi programımızda byte türünü not türüne (enum sabitine) bilinçli olarak dönüştürdük. Bilinçsiz olarak dönüştüremezdik. Ayrıca direkt olarak stringten nota dönüşüm yapamazdık. Şimdi başka bir program:

Burada da int türü not türüne bilinçli olarak dönüştürüldü. Başka bir örnek:

Bu programda ekrana basarisiz yazılır. Yani enum sözcükleri direkt kullanılmak istendiğinde yalnızca sözcük kullanılıyor. Başka bir örnek:

Burada da not türü byte'a bilinçli olarak dönüştürüldü.
ÖZET: Enum tipi ile enum'un baz tamsayı tipi arasında bilinçli tür dönüşümü yapılabilir, bilinçsiz tür dönüşümü yapılamaz.
NOT: Özetteki kuralın istisnası 0'dır. 0, ilgili enum tipine bilinçsiz olarak dönüşebilir. Örnek:

Ancak tersine dönüşüm mümkün değildir. Yani burada b değişkeni, int'e bilinçsiz olarak dönüşemez.
Eğer iki sözcüğe aynı tam sayıyı vermişsek bu iki sözcük birbirine eşit sayılır. Birinin yerine diğeri kullanılabilir. Örnek:

Bu program ekrana "TRUE" çıktısını verir.

enum not:byte{basarisiz,basarili} satırında sözcükler 0'dan başlayarak birer birer artarak bir tam sayıyı temsil eder. Ancak hangi sözcüğün hangi tam sayıyı temsil ettiğini kendimiz belirtebiliriz. Örnekler:

Bu örnekte basarisiz 6'yı, basarili 10'u temsil eder. Bir tam sayı birden fazla sözcüğe verilebilir.

Bu örnekte basarisiz 6'yı, basarili 7'yi temsil eder.

Bu örnekte ise şu temsiller söz konusudur:

Bu örnekte basarisiz -21'i basarili -20'yi temsil eder.
NOT: Bir enum değişkenine enumda olmayan bir sözcüğün sayı karşılığı dönüşüm operatörünü kullanmak şartıyla atanabilir.
NOT: Enum değişkenlerinin varsayılan değeri 0 değerinin ilgili enum tipine çevrilmiş halidir. Örnek:

Bu program ekrana "Ahmet" çıktısını verir.

System.Enum sınıfı enum sabitleriyle kullanılabilecek çeşitli üye elemanlara sahiptir. Burada yalnızca GetNames() metodu tanıtılacaktır. GetNames() metodu bir enum sabitinin tüm sözcüklerini string türündeki bir dizi olarak tutar. Örnek:

Bu örnek ekrana alt alta PAZARTESI ve PERSEMBE yazar.
NOT: Enum sabitine isim verirken ve enum sözcüklerini yazarken değişken adlandırma kurallarının tamamına uymalıyız.

C#'ta görsel formlarla ilgili işlemler System.Windows.Forms isim alanındaki sınıflarla yapılır. Bu isim alanı System.Windows.Forms.dll assemblysindedir.

Form sınıfı programımıza bir form getirmeye yarar. Örnek program:

Bu programda önce bir komut satırı açılır, sonra bir form açılır, sonra form kapanır. Eğer sisteminiz çok hızlıysa formu görmemeniz bile mümkündür. Ancak program çalışacaktır. Şimdi bir de bu programı

csc /t:winexe form.cs

komutuyla derleyin. Bu durumda ilgili exe dosyasını çift tıklayıp açtığımızda artık komut satırı penceresi gözükmeyecektir. Yani /t:winexe argümanının tek fonksiyonu budur. Şimdi program kodumuzu şöyle değiştirelim:

Bu sefer Form sınıfının Show() metodunu değil, Application sınıfının static Run() metodunu kullandık ve metodun parametresine Form nesnemizi verdik. Bu sefer form biz sağ üst köşedeki kapatma düğmesine basana kadar ekranda kalacaktır. Şimdi programızı şöyle değiştirelim:

Bu programda öncekilerin aksine Form sınıfına bağlanmadık. Kendi sınıfımızı Form sınıfından türettik. Bu sayede Form sınıfının birçok static üye elemanına yalnızca üye elemanın adını yazarak erişebiliriz. Ancak burada sınıfımızı Form sınıfından türetmedeki asıl amaç programımızın aslında bir form olmasıdır. Yani mantıksal bütünlüğü korumak için sınıfımızı Form sınıfından türettik.
NOT: Sinif a=new Sinif() satırında nesneyi oluşturan asıl kısım new Sinif() kısmıdır. Diğer kısım yalnızca oluşturulan bu nesnenin a referansına atanmasını sağlar.

Daha önce formun mantıksal olarak programımızın kendisini temsil ettiğini söylemiştik. Butonlar ve diğer kontroller ise yalnızca programımızdaki bileşenleri temsil ederler. Şimdi Button sınıfıyla ilgili bir örnek yapalım:

Size ve Point System.Drawing isim alanında bulunan iki sınıftır ve bir kontrolün konum ve boyut bilgisini tutarlar. Button sınıfının Location özelliği Point tipinden, Size özelliği ise Size tipindendir. Button sınıfının Text özelliği butonun üzerindeki yazıyı, Cursor özelliği fare ilgili butonun üzerine geldiğinde alacağı şekli belirtmemizi sağlar. Cursors enumu System.Windows.Forms isim alanındadır. Daha önceden de gördüğümüz gibi this anahtar sözcüğü bir yere hangi nesne üzerinden erişilmişse o nesneyi tutar. Form1 sınıfının yapıcı metoduna new Form1() yazarak eriştiğimize göre bu yere yeni bir Form1 nesnesi üzerinden erişilmiştir. Form sınıfının Text özelliği formun başlık çubuğundaki başlığını belirtir. Form sınıfındaki Controls özelliğinin tipi yalnızca kontrolleri tutabilen bir koleksiyondur. Bu koleksiyona nesne eklersek aynı zamanda forma da kontrol eklemiş oluruz.
NOT: Nesne yönelimli programlamanın en temel yaklaşımı bir problemi olabildiğince çok parçaya bölüp her bir parçanın yalnızca kendisiyle ilgili kodlar içermesidir. Bu sayede kaynak kodun karmaşıklığı azalacak ve kodun yönetimi kolaylaşacaktır. Biz bu örneğimizde bütün kodları Main metodunun içine koyabilirdik. Ancak nesne yönelim tekniğinin temel yaklaşımına aykırı olurdu. Üstelik bu sayede kodumuzda mantıksal bir bütünlük de yakaladık. Örneğin buton, formumuzda bulunan bir bileşendir. Bunu Main ya da yapıcı metoda koymak yerine Form1 sınıfının bir özelliği olarak yerleştirdik. Benzer şekilde yapıcı metoda yalnızca formla ilgili kodlar yerleştirdik. Programımızın temel kısmı olan Main() metodumuz ise yalnızca ilgili metotları çağırmaktan başka işe yaramadı. Gelişmiş uygulamalarda Main() metodu olabildiğince az kod içerir. Main() metodu yalnızca diğer metotların koordinasyonuyla ilgilenir.

Hatırlarsanız Temsilciler ve Olaylar konusunda olayların Windows formlarıyla içli dışlı olduğunu söylemiştik. Olayların en yaygın kullanım yeri Windows formlarıdır. Windows formlarıyla ilgili sınıfların çoğunun onlarca olayı vardır. Bu olayların tipi EventHandler temsilcisidir. Bu temsilci şu şekildedir.

Yani bu temsilci geriye bir değer döndürmeyen, iki parametre alan ve parametreleri de sırasıyla object ve EventArgs türünden olan metotları temsil eder. Dolayısıyla da Windows formlarıyla ilgili sınıfların olaylarına da yalnızca bu prototipte metotlar bağlanabilir. Hatırlarsanız olaylar konusunda hem temsilciyi (olay töneticisi), hem olayı, hem olaya bağlanan metodu biz yazmış, hatta olayı da biz gerçekleştirmiştik. Halbuki Windows formlarında biz yalnızca olaya bağlanan metotla ilgileniriz. Windows formlarında olay yöneticisi yukarıda prototipi yazılan EventHandler temsilcisidir. Yine bütün formlarla ilgili olaylar ilgili sınıfta bildirilmiştir. Olayın gerçekleştirilmesini ise kullanıcı yapar. İşletim sistemi herhangi bir olay gerçekleştiğinde (örneğin butonun tıklanması) olayın gerçekleştiği bilgisini ve bu olayla ilgili ek bilgileri programımıza verir. Eğer programımızda bu olayı işleyecek herhangi bir metot yoksa hiçbir şey yapılmaz. Varsa o metottaki komutlar çalıştırılır. Şimdi olayları hatırlama açısından bir örnek yapalım:

   
Bu en basit olay mantığıydı. Şimdi bunu Windows formlarına uyarlayalım:

Kuşkusuz bu program çalışmayacaktır. Yalnızca Windows formlarındaki olayların nasıl işlediğini anlamanız için bu örneği verdim. IsletimSistemi sınıfının arka planda sürekli çalıştığını düşünebilirsiniz. Şimdi artık olaylarla ilgili gerçek örneğimize başlayabiliriz:    

EventArgs System alanında ve MessageBox System.Windows.Forms isim alanında birer sınıflardır. MessageBox sınıfının static Show() metodu ekrana bir ileti kutusunun gelmesini sağlar. EventArgs ise olayla ilgili ek bilgileri tutan sınıftır. Diğer form kontrollerini bir sonraki konumuz olan Visual Studio.NET dersinde göreceğiz. Yani diğer kontrolleri formumuza kodlarla değil, Visual Studio.NET ile getireceğiz.

Göstericiler (pointer) yapı nesnelerinin bellekteki adreslerini tutan bir veri tipidir. Temel veri türlerinden byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, char ve bool birer yapıdır. (string ve object ise birer sınıftır.) Bu yapıların yanında .Net Framework kütüphanesindeki diğer yapılar ve kendi oluşturduğumuz yapı nesneleriyle de göstericileri kullanabiliriz. Ancak C# normal yollarla gösterici kullanılmasına izin vermez. Programımızın herhangi bir yerinde gösterici kullanabilmek için o yeri unsafe anahtar sözcüğüyle belirtmemiz gerekir. unsafe anahtar sözcüğünü şu şekillerde kullanabiliriz:

Bir sınıfı unsafe olarak belirtirsek o sınıf içinde gösterici kullanabiliriz.

Herhangi bir metodun içinde bir unsafe bloğu oluşturarak o bloğun içinde gösterici kullanabiliriz.

Normal bir metodu unsafe olarak belirterek o metot içinde gösterici kullanabiliriz.

Özellikleri unsafe olarak belirterek yeni bir gösterici oluşturabiliriz. Bu durumda sınıfı unsafe olarak belirtmeye gerek kalmaz. Ancak bir metot içinde bir gösterici oluşturabilmek için ya o metodun unsafe olarak bildirilmesi ya da bir unsafe bloğunun açılması gerekir. Ayrıca içinde gösterici kullandığımız bir kaynak kod dosyası normal yollarla derlenemez. İçinde gösterici kullandığımız bir kaynak kod dosyamızı aşağıdaki iki yoldan biriyle derleriz.
csc /unsafe KaynakKod.cs

veya

csc -unsafe KaynakKod.cs

Eğer programlarımızı yazmak için Visual Studio programlama ortamını kullanıyorsak derleyicinin unsafe olarak işaretlenmiş kod bloklarına izin vermesi için "Solution explorer" penceresindeki projemiz sağ tıklanır. "Properties" seçilir. Açılan penceredeki "Build" sekmesi tıklanır. Açılan sekmedeki "Allow unsafe code" onay kutusu seçilir. Son olarak ayarlarda yaptığımız değişiklikler kaydedilir.

Gösterici bildirimi ilgili yapı adının sonuna * işareti koyularak yapılır. Örnekler:

Bu göstericilerden birincisi bir char türünden nesnenin (değişkenin), ikincisi de bir int türünden nesnenin adresini tutabilir. Birden fazla aynı türde gösterici oluşturmak için normal veri türlerinde olduğu gibi virgül kullanılabilir. Örnek:

Göstericileri sabit ifadeler ile de bildirebiliriz. Örnek:

Burada bellekteki 123456 adresi gosterici göstericisine atanıyor. Ancak biz 123456 adresinde ne olduğunu bilmediğimiz için bu tür bir kullanım son derece tehlikelidir.

& operatörü yapı nesnelerinin bellekteki adreslerini üretir. Operandı hangi türdeyse o türün gösterici tipinde bir değer döndürür. Örnek:

* operatörü adreslerdeki veriyi görmek veya değiştirmek için kullanılır. * operatörü hangi tür göstericiyle kullanıldıysa o türde nesne geri döndürülür. Örnek:

Yani kısaca & ve * operatörleri gösterici ve nesne arasında dönüşüm yapmak için kullanılır.
NOTLAR:
1-) Henüz adresi olmayan bir göstericiye değer atanamaz. Örneğin şu kod hatalıdır:

2-) Ancak henüz bir değeri olmayan bir nesnenin adresi alınabilir. Yani şu kod hata vermez:

Göstericiler arasında bilinçli tür dönüşümü yapılabilir. Ancak dikkatli olunmalıdır. Çünkü büyük türün küçük türe dönüşümünde veri kaybı yaşanabilir. Küçük türün büyük türe dönüşümünde de küçük tür bellekte kendine ait olmayan alanlardan da alır. Dolayısıyla her iki durumda da istemediğimiz durumlar oluşabilir. Göstericiler arasında bilinçsiz tür dönüşümü ise imkansızdır. Örnek bir program:

Bu program sonucunda ekrana P yazılacaktır. (80'in Unicode karşılığı P'dir.) Bu programda herhangi bir veri kaybı gerçekleşmedi. Çünkü 80 char türünün kapasitesindeydi.
Dersin en başında söylemiştik: Göstericiler yapı nesnelerinin bellekteki adreslerini tutarlar. İşte bu adresi elde etmek için ilgili gösterici bir tam sayı türüne dönüştürülmelidir. Örnek:

Bu program sonucunda benim bilgisayarım 13F478 çıktısını verdi. Ancak bu sizde değişebilir. Çünkü işlemcinin verileri nereye koyacağını hiç birimiz bilemeyiz. Ayrıca adresi ekrana yazdırırken formatlama yapıp 16'lık düzende yazdırdığımın da farkında olmalısınız. Çünkü bellek adresleri genellikle 16'lık düzendeki sayılarla ifade edilir.
Göstericilerin adreslerini elde ederken uint türüne dönüşüm yapmak zorunlu değildir. İstediğiniz tam sayı türüne dönüşüm yapabilirsiniz. Ancak uint, bir bellek adresini tam olarak tutabilecek en küçük veri tipi olduğu için ilgili göstericiyi uint türüne dönüştürmeniz tavsiye edilir.
Göstericilerdeki adres bilgisini uint veya daha büyük bir tamsayı türüne dönüşüm yapmadan direkt göremeyiz. Örneğin aşağıdaki kullanım hata verir:

void tipinden göstericilere her türden adres atanabilir. void türü nesnelerdeki object türüne benzer. Örnek kod

sizeof operatörü yapıların bellekte ne kadar yer kapladıklarını bayt türünden verir. Geri dönüş tipi inttir. Örnek kod:

Bu kod ekrana 4 çıktısını verir. İsterseniz bir de şöyle bir örnek yapalım:

Bu program 8 çıktısını verir.

Göstericilerin bir adres kısmı, bir de veri kısmı olmak üzere iki kısmı bulunur. Adres kısmı tüm gösterici tiplerinde 4 bayt yer kaplar ancak veri kısmının kapladığı alan türe göre değişir. Örneğin tür int* ise adres kısmı 4 bayt, veri kısmı 4 bayt olmak üzere gösterici toplam olarak 8 bayt yer kaplar. Herhangi bir göstericinin adres kısmıyla ilgili matematiksel işlem yapmaya gösterici aritmetiği denir. Göstericilerle matematiksel işlem yapmak göstericinin türüne bağlıdır. int* türünden bir göstericiyi 1 ile toplarsak o göstericinin adres kısmı 4 ile toplanır. Yani herhangi bir göstericiyi herhangi bir tam sayı ile toplarsak ya da herhangi bir tam sayıyı herhangi bir göstericiden çıkarırsak ilgili tam sayı değil, ilgili tam sayının göstericinin türünün bayt cinsinden boyutu ile çarpımı işleme sokulur. Örnek:

Bu programın ekran çıktısı 508 510 508 506 olmalıdır. Göstericiler yalnızca tam sayılarla matematiksel işleme girerler. +, -, --, ++, -= ve += operatörleri göstericilerle kullanılabilir. Bir göstericiyi bu operatörler ve tamsayılarla işleme sokarsak yine bu gösterici tipinden nesne oluşur. Örnek:

void göstericiler matematiksel işleme girmezler.
İki gösterici birbirinden çıkarılabilir. Ancak bu durumda bir gösterici değil, long türünden bir nesne oluşur. Örnek:

Bu program sonucunda ekrana 2 yazılır. Çünkü göstericilerde çıkarma yapılırken şu formül kullanılır:

(Birinci göstericinin adresi - İkinci göstericinin adresi)/Ortak türün byte cinsinden boyutu

Bu formülden de anlıyoruz ki yalnızca aynı türdeki göstericiler arasında çıkarma yapılabilir. Eğer bu formül sonucunda bir tam sayı oluşmuyorsa ondalıklı kısım atılır. Göstericilerle kullanılabilecek diğer operatörler ==, <, > gibi karşılaştırma operatörleridir. Bu operatörler iki göstericinin adres bilgilerini karşılaştırıp true veya false'tan uygun olanını üretirler.

Garbage Collection mekanizması sınıf nesnelerinin adreslerini program boyunca her an değiştirebilir. Dolayısıyla bu sınıf nesnesi üzerinden erişilen ilgili sınıfa ait yapı türünden olan özelliklerin de adresleri değişecektir. Ancak istersek bir sınıf nesnesi üzerinden erişilen bir yapı nesnesinin bir blok boyunca değişmemesini isteyebiliriz. Bunu fixed anahtar sözcüğü ile yaparız. Şimdi klasik örneği yapalım (fixed'sız):

Bu programın derlenmesine C# izin vermeyecektir. Çünkü x bir sınıf nesnesidir ve sınıf nesnelerinin adresleri program boyunca değişebilir. Biz burada bu sınıf nesnesine ait olan bir özelliğin (yapı türünden) adresini aldık. Ancak muhtemelen program esnasında nesnemizin adresi değişecek ve bu adrese başka veriler gelecek. İşte karışıklığı engellemek için C# bu programın derlenmesini engelledi. Şimdi örneğimizi şöyle değiştirelim:

Birden fazla özelliği fixed yapmak için:

Aynı şeyi şöyle de yapabilirdik:

NOT: C#'ta tipler yönetilen tipler (managed type) ve yönetilmeyen tipler (unmanaged type) olmak üzere ikiye ayrılır. Yönetilen tip nesnelerinin bellekteki adresi nesnenin hayatı boyunca değişebilir, yönetilmeyen tip nesnelerinin ise bellekteki adresi nesnenin hayatı boyunca sabit kalır. Referans tipleri yönetilen tiplerdir (örneğin sınıflar), değer tipleri ise yönetilmeyen tiplerdir (örneğin yapılar).

Diziler bir System.Array sınıfı türünden nesnedir. Dolayısıyla diziler bir managed type'dır. Yani dizi elemanlarının adreslerini fixed anahtar sözcüğünü kullanmadan elde edemeyiz. Çok boyutlu diziler de dâhil olmak üzere tüm dizilerin elemanları bellekte ardışıl sıralanır. Bu hem performansta az da olsa bir artış hem de az sonra dizi elemanlarının bellekteki adreslerini alırken kolaylık sağlar. Örnek program:

Bu program dizinin elemanlarını alt alta yazacaktır. Programda öncelikle dizinin ilk elemanının bellekteki adresini alıp g göstericisine atadık. Sonra a dizisinin eleman sayısı kadar dönen bir döngü başlattık. Döngünün her iterasyonunda ilgili göstericiyi birer birer artırdık. Yani adres her seferinde birer birer ötelendi. Gösterici aritmetiğinde de gördüğümüz gibi aslında adresler 4'er bayt ötelendi. Eğer gösterici aritmetiğinde öteleme türe bağımlı olmayıp teker teker olsaydı döngüde her dizinin türüne göre farklı atlayış miktarı belirlememiz gerekecekti ve bu da oldukça zahmetli olacaktı.

Göstericiler ile indeksleyici kullanılabilir. Bir göstericinin bir tamsayı ile indekslenmesi durumunda ilgili göstericinin gösterdiği adrese (gösterici tipinin boyutu*indeksteki tamsayı) kadar ekleme yapılıp sonuçta bir gösterici değil ilgili adresteki verinin ilgili yapı tipindeki karşılığı üretilir. Örnek:

Bir diziyle aynı dizinin ilk elemanının adresi birbiriyle aynıdır. Bunu ispatlamak için şu programı yazabiliriz:

Gördüğünüz gibi bir diziyi bir göstericiye aktarmak için & operatörünü kullanmamıza gerek kalmadı. Çünkü aslında bütün diziler aynı zamanda bir göstericidir. Bu program sonucunda ekrana iki tane birbiriyle aynı adres yazılacaktır.

Şimdiye kadar gördüğümüz diziler System.Array sınıfı türünden birer nesne olduklarına göre bunlar yönetilen dizilerdir. Çünkü sınıflar yönetilen bir türdür. Yapılar, enum sabitleri, vs. ise yönetilmeyen türlerdir. Yönetilmeyen türlerle ilgili işlem yapmak daha hızlıdır. Çünkü yönetilmeyen türlerde C# bellek sorumluluğun

Diyelim ki elinizde A diye bir sınıf var. Ancak B diye bir sınıf daha oluşturmanız gerekiyor. Ancak bu B sınıfının içinde A sınıfındaki özellik ve metotların da bulunması gerekiyor. İşte bu durumda B sınıfını A sınıfından türetmeniz gerekir. Türetme kalıtım yoluyla olduğu için A sınıfının bütün üye elemanları B sınıfına adeta kopyalanır. Daha sonra B sınıfının kendine özel üye elemanlarını yazabiliriz. .Net kütüphanesindeki birçok sınıf birbirlerinden türetilmiştir. Örneğin temel veri türleri dediğimiz byte, int, uint, short, float ve bezerlerinin tamamı object sınıfından türetilmiştir. Bu sayede normalde object sınıfında bulunan ToString() metodunu bu yapı türünden nesnelerde de kullanabilirsiniz. Sınıflar türetilebilmesine rağmen yapılar türetilemez. Ancak bir sınıfın türetilmişinden yapı oluşturulabilir. C#'ta türetme şöyle yapılır:

Burada B sınıfı A sınıfından türetilmiştir ve artık B sınıfı A sınıfındaki bütün üye elemanları da içerir.

Şimdiye kadar public ve private erişim belirleyicilerini görmüştük. Şimdi ise yeni bir erişim belirleyicisi olan protected'ı göreceğiz. Normalde bir sınıfı türettiğimizde türetilmiş sınıfın içinden ana sınıfta private olarak belirtilmiş üye elemanlara erişemeyiz. Ancak bu, private üye elemanların türetilmediği anlamına gelmez. Örneğin:

Burada B sınıfından Ozellik özelliğine erişilemez. Ancak halen Ozellik özelliği B sınıfında vardır (kopyalanmıştır). Eğer bu programda private yerine protected'ı kullansaydık Ozellik özelliğine erişebilirdik. Yani protected erişim belirleyicisi ile belirtilen üye elemanlar türetilmiş sınıfın içinden kullanılabilirler. Ancak halen diğer sınıfların erişimine kapalıdırlar. Eğer ortada bir türetme söz konusu değilse protected erişim belirleyicisinin private'ten farkı kalmaz.
NOT: Eğer türetilen bir metottan bir private üye elemana erişiliyorsa bu durumda bir engelleme gelmez. Bu da az önce söylediğimiz "Private erişim belirleyici türetilmeye engel değildir." tezini doğrular. Örnek:

Bu program herhangi bir hata vermez.

C#'ta yapıcı metotların türetimiyle ilgili şu kurallar geçerlidir:

C#'ta yapıcı metotlar fiziksel olarak türetilmez.
Yavru sınıf türünden bir nesne yaratıldığında önce ana sınıfın parametre almayan yapıcı metodu, ardından yavru sınıftaki imzaya uyan yapıcı metot çalıştırılır.
Yavru sınıf türünden nesne yaratımında daima yavru sınıfın imzaya uyan bir yapıcı metodu olması gerekir.
Yavru sınıf türünden nesne yaratımlarında, ana sınıfın parametre almayan yapıcı metodu yavru sınıfın üye elemanlarıyla işlem yapar.
Yavru sınıf türünden nesne yaratımında, yavru sınıftaki ilgili (imzası uygun) yapıcı metoda base takısı eklenmişse ana sınıfın parametre almayan yapıcı metodu çalıştırılmaz. (base takısını birazdan göreceğiz)
Şimdi bu kuralları örneklendirelim:

Bu programda ekrana alt alta ana sınıfının parametre almayan yapıcı metodu ve yavru sınıfının parametre alan yapıcı metodu. alınan parametre: 5 yazacaktır. Bu ikinci kuralın örneklendirilmesiydi. Şimdi üçüncü kuralı örneklendirelim:

Bu program hata vermez. Çünkü sınıflar konusunda öğrendiğimiz üzere bir sınıfta hiç yapıcı metot olmadığı durumlarda varsayılan yapıcı metot oluşturulur. Varsayılan yapıcı metot parametre almaz ve hiçbir şey yapmaz. Bu örnekte y nesnesini yaratırken parametre verseydik yukarıda bahsettiğimiz üçüncü kural ihlal edilmiş olacaktı ve dolayısıyla programımız hata verecekti. Şimdi dördüncü kuralı örneklendirelim:

Bu örnekte ekrana 5 yazılacaktır. Aslına bakarsanız dördüncü kuralın tersinin olması imkansız. Çünkü zaten ortada ana tipinden bir nesne yok, o yüzden ana sınıfının parametre almayan yapıcı metodunun kendi sınıfının üye elemanlarıyla çalışması bu örnekte imkansız. Ancak yine de fiziksel olarak bir sınıfta olmayan bir yapıcı metodun o sınıfın üye elemanlarıyla çalışması ilginç. Şimdi başka bir örnek yapalım:

Bu program hata verir. Çünkü yukarıda saydığımız ikinci kuralı ihlal etmektedir. Çünkü ana sınıfta parametre almayan bir yapıcı metot yoktur. Ana sınıfta bir yapıcı metot tanımlandığı için varsayılan yapıcı metot oluşturulmamıştır. Şimdi beşinci kuralı örneklendirelim:

Bu program ekrana 1 2 3 4 yazar. Bu örnekte base anahtar sözcüğü ana sınıftaki yapıcı metodu temsil etmektedir. Örneğimizde yavru sınıfın yapıcı metodu 4 parametre almakta, bu aldığı parametrelerin ikisini kendi blokunda kullanmakta kalan iki parametreyi de ana sınıfın imzası uygun yapıcı metoduna göndermektedir. Ana sınıfın imzası uygun yapıcı metodu çalıştığında yavru sınıfın üye elemanlarıyla işlem yapacaktır. Asıl konumuza gelecek olursak bu örnekte yavru sınıfın bir yapıcı metoduna eklenen base takısı ile ana sınıfın bir yapıcı metodunu çalıştırdığımız için yavru sınıftaki base takısı eklenmiş ilgili yapıcı metodu çalıştıracak şekilde yavru sınıf türünden bir nesne yaratıldığında ana sınıfın parametre almayan yapıcı metodu çalıştırılmayacaktır. 
NOT1: base anahtar sözcüğü bu şekilde yalnızca yapıcı metotlarla kullanılabilir. Yani base anahtar sözcüğünü yalnızca yavru sınıftaki yapıcı metoda ekleyebiliriz ve base anahtar sözcüğünün ana sınıfta var olan bir yapıcı metodu belirtmesi gerekir.
NOT2: Yavru sınıfın yapıcı metoduna base takısı eklenip ana sınıfın bir yapıcı metodu çalıştırıldığı durumlarda önce ana sınıfın ilgili (imzaya uyan) yapıcı metodu, ardından yavru sınıfın ilgili (imzaya uyan) yapıcı metodu çalıştırılır. Örnek:

Bu programda alt alta A sınıfı ve B sınıfı yazılacaktır. Şimdi isterseniz bir de statik yapıcı metotların kalıtımdaki rolüne bakalım:

Bu sınıfın ekran çıktısı şöyle olacaktır:

B sınıfının statik yapıcı metodu
A sınıfının statik yapıcı metodu
A sınıfının statik olmayan yapıcı metodu
B sınıfının statik olmayan yapıcı metodu
-------
A sınıfının statik olmayan yapıcı metodu
B sınıfının statik olmayan yapıcı metodu

Gördüğünüz gibi statik yapıcı metotlarda yavru sınıf önce çalıştırılıyor. Statik olmayan yapıcı metotlarda ise ana sınıf önce çalıştırılıyor. İlk nesne yaratımından sonraki nesne yaratımlarında statik yapıcı metotlar çalıştırılmıyor.

Sınıflar tıpkı nine, anne, çocuk yapısında olduğu gibi ard arda türetilebilir. Yani örneğin B sınıfı A sınıfında türetilip C sınıfı da B sınıfından türetilebilir. Bu durumda C sınıfı türünden bir nesne yarattığımızda eğer C sınıfının ilgili yapıcı metoduna base takısını eklememişsek önce A, sonra B, sonra da C sınıfının yapıcı metotları çalıştırılır. Yani gidişat anadan yavruya doğrudur. Ayrıca tahmin edebileceğiniz gibi C sınıfı hem A'nın hem de B'nin bütün üye elemanlarına sahip olur. Örnek:

Bu program ekrana alt alta A sınıfı, B sınıfı ve C sınıfı yazacaktır. Bu örnekte base anahtar sözcüğünün kullanımı ise şöyledir:

Gördüğünüz gibi base anahtar sözcüğü kendisinin bir üstündeki sınıfın yapıcı metoduna parametre gönderiyor ancak tabii ki işlemler alt sınıftaki üye elemanlar için yapılıyor. Bu durumda -hangi sınıf türünden nesne yaratırsak yaratalım- hiçbir sınıfın parametre almayan yapıcı metodu çalıştırılmayacaktır (tabii ki nesne yaratırken gerekli parametreleri verdiğimiz müddetçe). Bu örneği şöyle değiştirirsek program hata verir:

 
Gördüğünüz gibi bu örnekte B sınıfının yapıcı metodundaki base takısı kaldırılmış ve gerekli düzenlemeler yapılmış. Bu örnekte B sınıfının yapıcı metodu çalıştırıldığı için ve B sınıfının söz konusu yapıcı metodunda base takısı olmadığı için B sınıfına göre ana sınıfın (bu durumda A sınıfı oluyor) parametre almayan yapıcı metodu çalıştırılmaya çalışılmıştır. A sınıfının parametre almayan yapıcı metodu olmadığı için program hata vermiştir. Yani ana sınıfın parametre almayan yapıcı metodu, tam olarak yavru sınıf tipinden nesne yaratılmasa da, sadece yavru sınıfın base takısı almayan yapıcı metodunun çalıştırılması durumunda da çalışır.

Muhtemelen şunu merak etmişsinizdir: yavru sınıfta ana sınıftakiyle aynı isimli bir üye eleman varsa ne olacak? İşte bu durumda ana sınıftaki üye eleman gizlenir ve normal yöntemlerle erişilemez. Buna isim saklama denir. Örnek:

Bu programda ekrana 20 yazılır yani değeri 20 olan a özelliği, değeri 10 olan a özelliğini gizlemiştir. Ancak derleyici bu programda bizim isim gizlemeyi bilinçsiz olarak yaptığımızı düşünür ve uyarı verir (hata vermez). Böyle bir durumda isim gizlemeyi açıkça belirtmeliyiz. Böylelikle hem programımızdaki muhtemel gözden kaçmaları hem de derleyicinin uyarı vermesini önleriz. İsim gizlemeyi açıkça belirtmek için new anahtar sözcüğünü kullanırız. Yukarıdaki programı şöyle yazarsak derleyici uyarı vermez:

Peki gizlediğimiz üye elemana erişebilir miyiz? Cevabımız evet. Bunun için base anahtar sözcüğünü kullanırız. Örnek:

Burada ekrana 10 yazılır. base anahtar sözcüğü static metotların içinde kullanılamaz.

NOT: C#, bir üye elemanın private olması nedeniyle ilgili üye eleman çağrılamadığında ana sınıfın aynı imzalı üye elemanını çağırmaya çalışır. Yani C#, private üye elemanları bulundukları sınıfın dışında kullanılmaya çalışıldığında yok sayar. Örnek:
Bu program ekrana 10 çıktısını verir.

C# tür güvenliğine maksimum derecede önem vermektedir. Bu yüzden, eğer özel tür dönüşüm operatörleri bildirilmemişse farklı sınıf türlerinden nesneler birbirlerine atanamaz. Ancak türeyen sınıflarda bu kural delinir. Ana sınıf türünden nesnelere yavru sınıf türünden nesneler atanabilir. Örneğin C#'taki temel veri türlerinin object sınıfından türetildiğini söylemiştik. Bu sayede bir object nesnesine her türden veri atanabilir. Örnek bir program:

Bu programda gözden kaçırmamamız gereken nokta nesne1 üzerinden B sınıfının kendine özgü üye elemanlarına erişemeyeceğimizdir. Bu şekilde ana sınıf türünden bir nesnenin kullanılabildiği her yerde yavru sınıf türünden bir nesneyi de kullanabiliriz. Örneğin bu örneğimizi düşünecek olursak bir metodun parametresi A tipinden ise bu metoda parametre olarak B tipinden bir nesneyi de verebiliriz. Çünkü her B nesnesi A nesnesinin taşıdığı bütün üye elemanları taşır. Bunu bilinçsiz tür dönüşümüne benzetebiliriz.

Şimdiye kadar bütün temel veri türlerinin object sınıfından türediğini söylemiştim. Aslı

Koleksiyonlar nesneleri gruplamaya yarayan sınıflardır. Yani bir koleksiyon nesnesi birden fazla nesneyi temsil eder. .Net Framework kütüphanesindeki koleksiyon sınıfları System.Collections isim alanındadır. Koleksiyonlarla diziler arasında şu farklar vardır:

Diziler System.Array türünden birer nesnedir.
Koleksiyonlar ise System.Collections isim alanındaki çeşitli sınıflar türünden birer nesnedir.
Koleksiyonlar dizilere göre bize daha fazla özgürlük verir. Çünkü koleksiyonlar içinde her türden nesne tutabiliriz. Ayrıca koleksiyonların boyutu sabit değildir. Eleman eklendikçe boyut dinamik olarak artar. Koleksiyonlar bize bunun gibi benzer avantajlar da verir. Konuyu işledikçe bu avantajları göreceksiniz.
Koleksiyon sınıflarının tamamı IEnumerable arayüzünü uygulamıştır. Dolayısıyla tüm koleksiyon nesneleri foreach döngüsüyle kullanılabilir. Ayrıca bunun haricinde her koleksiyon sınıfı kendine özgü birtakım arayüzleri de uygulamış olabilir. Örneğin birazdan göreceğimiz ArrayList sınıfı IList ve ICollection arayüzlerini de uygulamıştır. Bu arayüzlerin her birinin farklı anlamları vardır. Şimdi bu arayüzleri görelim:
ICollection Bu arayüz bir koleksiyonda bulunabilecek en temel üye elemanları içerir. System.Collections isim alanındaki bütün koleksiyon sınıfları bu arayüzü uygulamıştır. ICollection arayüzü IEnumerable arayüzünden türemiştir. Dolayısıyla ICollection arayüzünü uygulayan bir sınıf IEnumerable arayüzünü de uygulamış demektir.
IComparer Bu arayüz iki nesnenin karşılaştırılabilmesini sağlayan Compare() metodunu içerir. Bu metot iki nesnenin nasıl karşılaştırılacağını belirler. Compare() metodunun prototipi şu şekildedir:

Compare metodu -1, 0 ya da 1 değeri döndürür. Karşılaştırma genellikle büyüklük-küçüklük ilişkisine göre yapılır.
IDictionary Bu arayüzü anahtar-kilit ilişkisini uygulayan koleksiyon sınıfları uygular. Anahtar-kilit ilişkisini daha sonra göreceğiz. IDictionary arayüzü ICollection arayüzünden türemiştir.
IDictionaryEnumerator IDictionary arayüzünün özelleşmiş bir şeklidir. İleride göreceğiz.
IEnumerable İlgili koleksiyon nesnesinin foreach döngüsüyle kullanılabilmesini sağlayan arayüzdür.
IEnumerator IEnumerable arayüzüyle son derece ilişkilidir. IEnumerable arayüzü IEnumerator arayüzünün kullanılmasını zorlar. Aslında foreach döngüsünün kurulabilmesi için gerekli üye elemanlar IEnumerator arayüzündedir. IEnumerable arayüzü sadece IEnumerator arayüzünü zorlamak için aracı vazifesi görür.
IList Koleksiyon nesnelerine bir indeks numarasıyla erişilebilmesini sağlayan arayüzdür. IList ICollection arayüzünden türemiştir.
IHashProvider İleride göreceğimiz Hashtable koleksiyon sınıfıyla ilgilidir. System.Collections isim alanındaki arayüzlerden sonra artık aynı isim alanındaki koleksiyon sınıflarına geçebiliriz. Bunlar ArrayList, Hashtable, SortedList, BitArray, Stack ve Queue sınıflarıdır. Şimdi bu sınıfları teker teker inceleyelim.

Koleksiyon sınıflarının en genel amaçlı olanıdır. Dizilere oldukça benzer. Dizilerden tek farkı eleman sayısının sabit olmaması ve yalnızca object tipinden nesneleri saklamasıdır. ArrayList sınıfı ICollection, IEnumerable, IList ve ICloneable arayüzlerini uygular. ArrayList sınıfının aşırı yüklenmiş üç tane yapıcı metodu vardır. Bunlar:

Bu şekilde kapasitesi olmayan bir ArrayList nesnesi oluşturulur. Tabii ki koleksiyona yeni nesneler eklendikçe bu kapasite dinamik olarak artacaktır.

Bu şekilde 50 kapasiteli bir ArrayList nesnesi oluşturulur. Yine kapasite aşılırsa dinamik olarak artırılır.

Burada ICollection arayüzünü uygulamış herhangi bir sınıf nesnesi parametre olarak verilir.
Daha önceden dediğim gibi ArrayList sınıfı nesneleri object olarak tutar. Yani bu koleksiyondan nesneleri elde ettiğimizde object hâldedirler. Genellikle bu nesneleri kullanabilmek için orijinal türe tür dönüşüm operatörüyle dönüşüm yapmak gerekir. Bir ArrayList nesnesine nesne eklemek için Add() metodu kullanılır. Bu metot parametre olarak object nesnesi alır ve bu nesneyi koleksiyonun sonuna ekler. Aynı şekilde bir ArrayList koleksiyonundan eleman çıkarmak için Remove() metodu kullanılır. Parametre olarak verilen object nesnesi koleksiyondan çıkarılır. Eğer nesne bulunamazsa hata oluşmaz, program işleyişine devam eder. Ayrıca herhangi bir ArrayList koleksiyonunun kapasitesini öğrenmek için ArrayList sınıfının Capacity özelliği kullanılır. Şimdi bütün bu üye elemanları bir örnek üzerinde görelim:

Bu programın ekran çıktısı şöyle olmalıdır:

Kapasite: 0
Kapasite: 4
Kapasite: 4
Kapasite: 4
Kapasite: 4
Kapasite: 8
Kapasite: 8
Kapasite: 8
Kapasite: 8
Kapasite: 16
5 Deneme D 1,2 3,4 1,2 Vikikitap e 2
Kapasite: 16
5 D 1,2 3,4 1,2 Vikikitap e 2

Bu ekran çıktısından şunları anlıyoruz:

Kapasite başta 0, sonra 4, sonra da gerekli olduğunda kapasite ikişer kat artırılıyor.
Remove() metoduyla koleksiyonunun elemanını silmek kapasiteyi değiştirmiyor. Yani Remove() metoduyla yapılan şey koleksiyondan bir nesne silip onun yerine sona bir null eklemek.
NOT: C#'ta geçersiz türler arasında dönüşüm yapmak yasaktır. Örneğin bir object nesnesinin gizli türü string değilse bunu

şeklinde stringe çeviremeyiz. Bir ArrayList koleksiyonuna nesne yerleştirmek (araya sıkıştırmak) için Insert metodu kullanılır. Prototipi şu şekildedir:

Bu metotla ilgili koleksiyonun indeks nolu elemanına deger koyulur. Bu indeksteki önceki eleman ve bu indeksten sonraki elemanlar ileriye bir birim ötelenir. Bildiğimiz üzere bu normal dizilerde mümkün değildi. Sabit kapasiteli ArrayList koleksiyonu oluşturmak içinse ArrayList sınıfının static FixedSize metodu kullanılır. Örnek:

Yani burada önceden tanımlanmış bir ArrayList nesnesi başka bir ArrayList nesnesine sabit kapasiteli olarak atanıyor. Eğer al koleksiyonunun kapasitesi aşılırsa tıpkı dizilerdeki gibi istisnai durum meydana gelir.
NOT: ArrayList koleksiyonunun elemanlarına tıpkı dizilerdeki gibi indeksleyici ile de erişilebilir.
Şimdi istersek ArrayList sınıfının diğer önemli üye elemanlarına bir göz atalım. Önce özellikler:
Count İlgili ArrayList nesnesindeki toplam eleman sayısını verir. Capacity özelliği ile karıştırılmamalıdır. Count özelliği "doldurulmuş" eleman sayısını verir. Geri dönüş tipi inttir.
IsFixedSize İlgili ArrayList nesnesinin sabit kapasiteli olup olmadığını verir. Eğer sabit kapasiteli ise true, değilse false değer döndürür.
IsReadOnly İlgili ArrayList nesnesinin salt okunur olup olmadığını verir. Eğer salt-okunur ise true, değilse false değer döndürür. Salt-okunur ArrayList nesneleri elde etmek için ArrayList sınıfının static ReadOnly() metodu kullanılır. Kullanımı FixedSize() metodu ile aynıdır. Sıra geldi metotlara:
AddRange(ICollection ic) Bu metot ile parametredeki koleksiyonun tüm elemanları ilgili koleksiyonun sonuna eklenir. Parametrenin ICollection tipinden olması demek bu sınıfın ICollection arayüzünü uygulaması gerekliliğini belirtir. Bildiğiniz gibi System.Generic isim alanındaki bütün koleksiyonlar ICollection arayüzünü uygulamıştır.
Sort() Koleksiyonları sıralamak için kullanılır. Eğer koleksiyon salt-okunur ise istisnai durum oluşur. Üç farklı aşırı yüklenmiş hâli vardır:

void Sort() İlgili koleksiyonu ilgili koleksiyonun Compare() metodu kullanarak sıralar. Tabii ki ilgili koleksiyon IComparer arayüzünü uygulamalıdır.
void Sort(IComparer ic) IComparer arayüzünü uygulayan başka bir sınıfın Compare() metodu kullanılarak sıralama yapılır.
void Sort(int indeks,int adet,IComparer ic) Üsttekinden tek farkı bunda sadece indeksten itibaren adet kadar elemanın sıralanmasıdır.
int BinarySearch(object o) Sıralanmış koleksiyonlarda arama yapılır. Eğer o nesnesi bulunursa bulunulan indeksle geri dönülür, bulunamazsa negatif bir sayıyla geri dönülür. Bu metodun aşağıdaki gibi iki versiyonu daha vardır:

int BinarySearch(object o,IComparer ic) Arama için başka bir sınıfın Compare() metodu kullanılır. Bu metot daha çok kullanıcının tanımladığı türden nesneler içeren koleksiyonlarda arama yapmak için kullanılır.
int BinarySearch(int indeks,int adet,object o,IComparer ic) Üstekinden tek farkı indeksten itibaren adet kadar eleman içinde arama yapılmasıdır.
void Reverse() İlgili koleksiyon ters çevrilir. Başka bir kullanımı daha vardır.

void Reverse(int indeks,int adet) Ters çevirme işlemi yalnızca indeksten itibaren adet kadar elemana uygulanır.
void Clear() İlgili koleksiyonun tüm elemanları temizlenir. Dolayısıyla Count özelliği sıfırlanırken Capacity özelliğinin değeri değişmez.
void TrimToSize() Koleksiyonun kapasitesi eleman sayısından fazla olduğu durumlarda gereksiz kısımlar silinir. Dolayısıyla kapasiteyle eleman sayısı eşitlenir.
bool Contains(object o) Parametre ile verilen nesnenin ilgili koleksiyonda bulunup bulunmadığı kontrol edilir. Eğer varsa true, yoksa false değer döndürür.
void CopyTo() ArrayList nesnesindeki elemanları normal tek boyutlu dizilere (System.Array) kopyalamak için kullanılır. Üç farklı kullanımı vardır:

void CopyTo(Array a) Metodu çağıran ArrayList nesnesindeki tüm elemanlar a dizisine ilk indeksten itibaren kopyalanır.
void CopyTo(Array a,int indeks) Üsttekiyle aynı göreve sahiptir. Tek farkı kopyalamanın indeks. elemandan itibaren yapılmasıdır.
void CopyTo(int indeks,Array a,int dizi_indeks,int adet) Metodu çağıran ArrayList nesnesindeki indeksten itibaren adet kadar eleman a dizisinde dizi_indeks indeksli eleman ve sonrasına kopyalanır.
ArrayList GetRange(int indeks,int adet) Metodu çağıran ArrayList nesnesinin indeks nolu elemanından itibaren adet kadar elemanı yeni bir ArrayList nesnesi olarak tutulur.
int IndexOf(object o) Parametre olarak verilen o nesnesinin ilgili ArrayList nesnesinde ilk bulunduğu indeksi döndürür. Object nesnesi bulunamazsa negatif değer döndürülür.
object[] ToArray() İlgili ArrayList nesnesindeki elemanları bir object dizisi olarak tutar. Farklı bir versiyonu daha vardır:

Array ToArray(Type t) İlgili ArrayList nesnesindeki elemanları t türünden bir dizi olarak tutar. Yani gerekli tür dönüşüm işlemleri otomatik olarak yapılır.
void RemoveAt(int indeks) İlgili ArrayList nesnesindeki i

Şimdi daha önceden gördüğümüz bir şeyi hatırlatmak istiyorum. Kodlarımızı birden fazla dosyaya parçalayıp bu parçaları komut satırında hep birlikte derleyebiliriz. Yani programımızın bir sınıfını bir dosyaya, başka bir sınıfını başka bir dosyaya koyup komut satırında toplu derleme yaparsak bütün bu dosyalar sanki bir dosyadaymış gibi işlem görecektir. Aynı olayı isim alanı düzeyinde de yapabiliriz. Yani bir isim alanını bir dosyaya, başka bir isim alanını bir dosyaya koyup komut isteminde toplu derleme yaparsak yine iki isim alanı da aynı dosyadaymış gibi işlem görecektir.
Ancak şimdiye kadar gördüğümüz şekliyle bir sınıfın bir metodunun başka bir dosyaya başka bir metodunun başka bir dosyaya koyulması mümkün değildir. Şimdi bunu nasıl yapabileceğimizi göreceğiz. Bir sınıfın bazı metotlarını bir dosyaya bazı metotlarını başka bir dosyaya koymak için her iki dosyada aynı isimli sınıflar oluşturur ama her iki sınıfı da partial olarak işaretleriz. Örnek:
bir.cs dosyası

iki.cs dosyası

Komut isteminden csc bir.cs iki.cs komutunu verirsek bu iki dosyadaki sınıfların içeriği birleştirilecektir. Kısmi türlerle ilgili bazı ufak bilgiler:

Birleştirilmesini istediğimiz bütün aynı isimli türleri partial olarak bildirmeliyiz. Yalnızca birisini partial olarak bildirmek yeterli değildir.
Sınıflar, yapılar ve arayüzler partial olarak bildirilebilir.
Kısmi sınıflardan biri sealed ya da abstract anahtar sözcüğüyle belirtilmişse diğerinin de belirtilmesine gerek yoktur. Bütün sınıflar sealed veya abstract olur. Herhangi bir tür başka bir sınıftan türemişse diğerleri de o sınıftan türemiş sayılır. Herhangi bir tür bir arayüzü uygulamışsa diğerlerinin de uyguladığı sayılır.
Partial türlerin partial olarak bildirildi diye illaki başka bir dosyayla ilişkilendirilmesine gerek yoktur.
Türün bir parçasına erişim belirleyicisi koymuşsak diğer parçalarına da koymaya gerek kalmaz. Ancak erişim belirleyiciler birbiriyle çelişemez.
Kısmi tipler diğer parçalarındaki üye elemanları kullanabilir.
İçiçe türler söz konusu olduğunda içteki türler de partial olabilir. Örnek:
bir.cs:

iki.cs:

Aslında kısmi türler, kısmi olmayan türlerin içine koyulabilir. Ancak bu durumda dosya parçalanamaz. Örnek:

Elbetteki partial olarak bildirilen sınıf parçalarının farklı dosyalara koyulma zorunluluğu yoktur.
Derleme zamanında kısmi tiplerin nitelikleri ve XML yorumları birleştirilir (bunları ileride göreceğiz).
Kısmi tipler oluştururken partial anahtar sözcüğünün class, struct ve interface anahtar sözcüklerinden hemen önce yazılması gerekir.
Kısmi tipin bütün parçalarının aynı assembly'ye (.exe veya .dll dosyası) koyulması gerekir.
Şablonlu tipler de kısmi olabilir. Bu durumda tipin diğer parçalarının da aynı isimli şablonlara, aynı sırada sahip olması gerekir. Eğer kısmi şablon tiplerden birisi tip parametresi kısıtı almışsa diğerinin almasına gerek kalmaz. Diğerinin aynı şablon tip kısıtlarını aldığı varsayılır. Şablon tipleri ileride göreceğiz.
İçiçe tiplerdeki içteki kısmi tip new anahtar sözcüğü ile işaretlenmişse (bilinçli isim gizleme yapmışsa) bu kısmi tipin diğer parçalarının aynı new anahtar sözcüğünü kullanmasına gerek kalmaz.

Kısmi metot kavramı kısmi tür kavramından biraz farklıdır. Kısmi metotlarda metodun bir kısmını bir dosyada bir kısmını başka bir dosyada yazmayız. Bunun yerine metodun imzasını bir yere, uygulanmasını bir yere yazarız. Metodun uygulanması opsiyoneldir, uygulanmayabilir de. Metodun imzası ve uygulanması kısmi türün aynı parçalarına yazılabileceği gibi farklı parçalarına da yazılabilir. Eğer imzası belirtilen metot uygulanmazsa derleyici bu metot imzasını ve bu metoda olan bütün çağrıları siler. Sadece geri dönüş tipi void olan metotlar kısmi olabilir. Sadece kısmi bir sınıf veya yapı kısmi metot içerebilir. Kısmi metotlar da partial anahtar sözcüğüyle belirtilir. Örnek:
bir.cs:

iki.cs:

Kısmi metotlar public olamaz. Çünkü başka sınıflar kısmi metodun uygulanıp uygulanmadığını bilemez. Kısmi metotlar static olabilir. Ancak partial anahtar sözcüğü void anahtar sözcüğünden hemen önce gelmelidir, ayrıca metotların geri dönüş tipinin metot isminden hemen önce yazılması gerektiği hatırlanmalıdır. Yavru sınıflar kısmi metodun oluşturulup oluşturulmayacağını bilemeyeceği için kısmi metotlar virtual, abstract veya override olarak işaretlenemez. Kısmi metotlar ref parametre alabilir, ancak out parametre alamaz. Kısmi metotlar unsafe anahtar sözcüğüyle işaretlenebilir. unsafe anahtar sözcüğü göstericiler konusunda anlatılacaktır. Kısmi metotlar şablonlu olabilir. Bu konu da ileride anlatılacaktır.
Kısmi metotların uygulanıp uygulanmaması kısmi metodun imzasını tanımlayan sınıf parçası için çoğu durumda önemsizdir. Kısmi metodun geri dönüş tipi void olmak zorunda olduğu için kısmi metodun uygulanıp uygulanmaması kısmi metodun imzasını içeren sınıf parçasında yalnızca ilgili metodun çağrılması veya çağrılmamasıyla sonuçlanır. Ancak istisnai sayılabilecek bazı durumlarda kısmi metodun uygulanıp uygulanmaması kısmi metodun imzasını içeren sınıf parçasının işleyişinde başka etkilere de neden olabilir. Örnek:
bir.cs:

iki.cs:

Burada iki.cs dosyasında Metot() metodunun uygulanıp uygulanmaması bir.cs dosyasında Metot2() metodunun işlerinin yapılıp yapılmamasına neden olur. Çünkü iki.cs dosyasında Metot() metodu uygulanmazsa bir.cs dosyasındaki Metot() metoduna olan çağrı da silinecektir. Eğer her halükarda Metot2() metodunun çalışmasını istiyorsak yukarıdaki kodu şöyle değiştirmeliyiz:
bir.cs:

iki.cs:

Kısmi türlerin en yaygın kullanım alanı Visual Studio gibi programlama ortamlarıdır. Bu yazılımlarda görsel arayüz sürükle-bırak yöntemiyle oluşturulur. Yazılım otomatik olarak görsel arayüzle ilgili kodları bir sınıfa ve farklı bir dosyaya yazar. Bu dosya normal şartlar altında programcıdan gizlenir. Bu sayede programcının yanlışlıkla bu dosyayı değiştirmesi engellenir. Ayrıca programın görsel arayüzünü ilgilendiren kodlarla programın mantığını ilgilendiren kodlar birbirinden ayrıldığı için programcının işi kolaylaşır. Ancak yazılım tarafından otomatik doldurulan bu sınıftaki form kontrollerine programcının ulaşabilmesi için programcının da aynı sınıfa programın mantığını ilgilendiren kodları yazması gerekmektedir. İşte programcının programın görsel arayüzüyle ilgili kodları görmeden aynı sınıfa programın mantığıyla ilgili kodları ekleyebilmesini sağlayan şey kısmi türlerdir.
Kısmi metot kavramı da benzer şekilde kullanılır. Örneğin Unity oyun motorunda programcı isterse kendine ayrılan dosyada Start(), Update(), vs. metotlarını oluşturup bu metotları doldurabilir. Bu metotların özel anlamları vardır. Bu metotlarla oyun başladığında, oyunun her bir döngüsünde, vs. çalışacak kodlar programcı tarafından yazılır. Bu metotların oluşturulmaması programın hata vermesine neden olmaz.

Linux'ta iki şekilde C# uygulamaları geliştirebilirsiniz:

Kodlarınızı metin editöründe yazarsınız. mono-runtime paketini kurarsınız. Kaynak kod dosyanızı mono-runtime paketiyle gelen mcs programıyla derlersiniz. Derlenmiş programı mono-runtime paketiyle gelen mono programıyla çalıştırırsınız. mcs programı Windows'taki csc.exe'ye benzer. mono-runtime paketi Windows'taki .NET Framework'a benzer. mono-runtime paketi hem mcs ile program derlemeniz için ve hem de mcs ile derlenmiş programları çalıştırmanız için gereklidir. Mono'nun Windows ve MacOS sürümleri de vardır. Bu sayede Linux'ta yazmış olduğunuz bir C# programının Windows ve MacOS'ta çalışması sağlanır. Eğer C# programınızı yazarken Mono'ya özgü kütüphaneleri kullanmamışsanız yazdığınız programın Windows'ta çalışabilmesi için ilgili Windows makinede sadece .NET Framework'un kurulu olması yeterli olacaktır.
mono-develop paketini kurarsınız. Kodlarınızı MonoDevelop yazılımında yazar ve derlersiniz. MonoDevelop çok gelişmiş özellikler sunar. MonoDevelop Windows'taki Visual Studio'ya benzer.
Şimdi bu iki yöntemi sırayla görelim.

Paket yöneticisinde mono-runtime paketini aratın ve -varsa- bağımlılıklarıyla birlikte kurun.

Bir metin düzenleyicide aşağıdaki dosyayı oluşturun ve ismini deneme.cs verin.

Komut satırında bu dosyayı kaydettiğiniz dizine geçin ve aşağıdaki komutu verin.

mcs deneme.cs

Bu komut sonucunda aktif klasörde deneme.exe isimli bir dosya oluşacaktır.

deneme.exe dosyasının olduğu klasöre komut isteminde geçip şu komutu verin:

mono deneme.exe

Program ekrana Deneme çıktısını verecektir. Bu exe dosyasını Windows bir sisteme taşımanız durumunda çift tıklar tıklamaz çalışacaktır (tabii ki sistemde .NET Framework kurulu ise). Çünkü programda Mono'ya özgü herhangi bir kütüphane kullanmadık. Programda sadece Console sınıfını kullandık -ki bu sınıf da .NET Framework kütüphanesinde de var. Eğer programımızda Mono'ya özgü bir kütüphane kullansaydık bu programın Windows bir sistemde çalışması için ilgili sistemde Mono'nun kurulu olması gerekecekti.

MonoDevelop Windows'taki Visual Studio'ya benzer. Bir tümleşik geliştirme ortamıdır (IDE).

Paket yöneticisinde mono-develop paketini aratın ve -varsa- bağımlılıklarıyla birlikte kurun.

Proje: Bir proje derlendiğinde tek bir assembly (çalıştırılabilir dosya veya kütüphane) oluşur. Bir proje bir veya birden fazla kaynak kod dosyasından, kütüphane referanslarından ve kaynak dosyalardan (örneğin resim dosyaları) oluşabilir. Bir projenin bütün bilgileri XML biçimli ve .csproj uzantılı bir dosyada saklanır. Bu csproj dosyasında projenin hangi dosyalardan oluştuğu ve genel yapılandırmaları saklanır ve Visual Studio ile uyumludur. Projeler kaydedilip yeniden çağrılabilir, bu sayede projeye daha sonra kaldığımız yerden devam edebiliriz.
Çözüm: Bir veya birden fazla projeden oluşur. Çözüm bilgileri XML biçimli ve .sln uzantılı bir dosyada saklanır. Çözümler kaydedilip yeniden çağrılabilir. Bir çözüm alt çözümler içerebilir. Mono ile oluşturduğunuz çözüm dosyaları Visual Studio ile uyumludur.
Varsayılan durumda projeleriniz şu hiyerarşide saklanır: Ev klasörünüz > Projects > Çözüm ismi > Proje ismi

MonoDevelop'u açın. Dosya > Yeni > Çözüm yolunu izleyin. Açılan pencerede çözüme koyulacak ilk projenin dilini, tipini (konsol projesi, kütüphane, vs.) seçin. Projenize ve çözümünüze isim verin. Burada ayrıca çözümün kaydedileceği klasörü değiştirebilirsiniz. Ancak tutarlılık açısından değiştirmenizi tavsiye etmiyorum. "Create directory for solution" onay kutusunu işaretlemezseniz çözüm aktif çözüme bir alt çözüm olarak oluşturulur. Tamamen yeni bir çözüm oluşturduğumuz için bu onay kutusunun işaretli olması gerekiyor. Dili C# seçin ve bu seferlik örnek için proje tipini konsol projesi seçin. Çözümün ismini "Cozum" ve projenin ismini "Program" yapın. "İleri"yi tıklayın. Gelen ekranda hiçbir şeyi seçmeyip "Tamam"ı tıklayın. Ekranınıza main.cs dosyasının içeriği gelecektir. Bu dosyanın içeriği şöyle olacaktır:

Çalıştır > Çalıştır yolunu izleyerek programı MonoDevelop'un dahili konsol ekranında çalıştırabilirsiniz.

Kod yazdığınız alanın solunda bir çözüm kutusu olacaktır. Bu kutuda aktif çözümünüz, çözümün içindeki projeler, projelerin içindeki dosyalar hiyerarşik olarak gösterilecektir. Bir çözüme yeni proje eklemek için ilgili çözümü sağ tıklayın Add > Add New Project... yolunu izleyin. Açılan pencerede projenin dilini ve tipini seçin ve ismini girin. Dili C# ve tipi kütüphane seçelim. Yeni projenize Kutuphane ismini verin ve "İleri" düğmesine tıklayın. Açılan "Proje Özellikleri" penceresinde hiçbir şeyi seçmeden "Tamam" düğmesine tıklayın. Şimdi çözümümüzde iki proje var: bir konsol projesi ve bir kütüphane. Kutuphane projemizdeki asıl dosya MyClass.cs'dir ve kütüphanemizdeki kodları içerir. Bu dosyayı çözüm kutusundan açın. İçeriğinin şöyle olması gerekiyor:

Bir çözüm birden fazla çalıştırılabilir dosya içerebilir. Çalıştır > Çalıştır yolunu izlediğimizde başlangıç projesi çalıştırılır. Başlangıç projesini, çözüm kutusundaki ilgili projeyi sağ tıklayıp "Set As Startup Project"i seçerek belirtebilirsiniz. Bu şekilde tek bir projeyi başlangıç projesi olarak belirtebiliriz. Birden fazla projeyi başlangıç projesi olarak belirtmek için ilgili çözüme sağ tıklayın ve "Seçenekler"i tıklayın. Açılan pencereden Çalıştır > Startup Project yolunu izleyin. Pencerenin sağ kısmında bir veya birden fazla başlangıç projesi belirtebilirsiniz. Ana pencerede Çalıştır > Çalıştır yolunu izlediğimizde projeler burada belirttiğimiz sırada derlenip çalıştırılacaktır.
NOT: Gördüğünüz gibi her bir projenin asıl dosyası varsayılan durumda projenin ismiyle aynı olan bir isim alanı içeriyor ve sınıflar bu isim alanının içine yazılıyor.

Kütüphane, çalıştırılabilir dosyamızla aynı çözümde olsa bile kütüphanedeki sınıfları çalıştırılabilir dosyamızda kullanmak için kütüphaneyi çalıştırılabilir dosyamızla ilişkilendirmeliyiz. Bunun için çözüm kutusundaki ilgili projeyi (konsol projemizi) yanındaki oku kullanarak genişletin. Ortaya çıkan "Kaynaklar" ögesini sağ tıklayın ve "Edit References..."ı tıklayın. Açılan pencerede "Projeler" sekmesine gelin. Oluşturduğumuz kütüphanenin burada gözükmesi gerekiyor. Kütüphaneyi seçip "Tamam" düğmesine tıklayın. Şimdi kütüphanemizi çalıştırılabilir dosyamızla ilişkilendirdik. Ancak yine de emin olmak için çalıştırılabilir dosyamızın kaynak kodunun (Main.cs) using bildirimlerine using Kutuphane; satırını ekleyin ve Main() metodunun içini aşağıdaki satırlarla değiştirin:

Şimdi "İnşa Et" menüsünden "Build Cozum"u tıklayın. Bu sayede Cozum çözümündeki bütün projeleri derledik. Şimdi Çalıştır menüsünden Çalıştır'ı tıklayın. Başlangıç projemiz çalıştırılacaktır ve ekrana Kutuphane.MyClass yazılacaktır.
NOT: Eğer istersek bir çözümü komut isteminden de inşa (build) edebiliriz. Bunun için sln dosyasının olduğu klasöre komut isteminde geçin ve şu komutu verin:

mdtool build --f --buildfile:Cozum.sln

Bu yöntemi bazı küçük işler için MonoDevelop ile uğraşmak istemediğimizde kullanabiliriz. Bir projenin çalıştırılabilir dosyası ilgili proje klasörünün bin klasöründeki Debug klasöründe proje ismiyle ve exe veya dll uzantısıyla oluşacaktır. İstediğimiz exe dosyasını mono komutuyla çalıştırabiliriz.

MonoDevelop, Visual Studio'nun desteklediği sürükle-bırak ile görsel arayüz oluşturmayı destekler. Şimdi MonoDevelop ile görsel arayüzü olan bir program oluşturacağız. Programda iki TextBox, bir buton ve bir label olacak. Butona basıldığında TextBox'lara girilen sayıların toplamı label'a yazılacak. Programın basit olduğunu düşünebilirsiniz. Ancak zaten bizim burada amacımız sadece Mono'da görsel arayüzü olan programların nasıl geliştirileceğini anlatmak. O yüzden programı sade tutuyoruz. Şimdi başlayalım.

MonoDevelop'u açın. Dosya > Yeni > Çözüm yolunu izleyerek yeni bir çözüm oluşturun. Çözümün ve projenin her ikisinin de ismi Gorsel olsun. Zaten çözümümüzde sadece bir proje olacak. Dili C# ve proje tipini "Gtk# 2.0 Projesi" seçin (sizde sürüm farklı olabilir). "ileri" düğmesine tıklayın. "Proje özellikleri" penceresinde hiçbir şeyi seçmeyerek "Tamam" düğmesine basın.
Çözüm kutusundaki projenin altındaki "Kaynaklar" düğümünü genişletin. Buradaki kütüphanelerden bazıları kırmızı renkte ise MonoDevelop bu kütüphaneleri düzgün ilişkilendirememiş demektir. Bu durumda paket yöneticisinden gtk-sharp-devel paketini kurup MonoDevelop'u yeniden başlatın. İşi garantiye almak istiyorsanız yeni çözüm oluşturabilirsiniz.
Şimdi MonoDevelop gerekli dosyaları oluşturdu. Şu an programımız içi boş olan tek bir formdan oluşmakta. Bu formu görmek için Çalıştır menüsünden Çalıştır'ı seçin. Ekrana boş bir form gelecektir. Formun sağ üst köşesindeki çarpı işaretini tıklayarak koda geri dönün.
Şimdi boş forma birtakım kontroller ekleyeceğiz. Önce çözüm kutusundan MainWindow.cs'ye çift tıklayarak bu dosyanın içeriğinin yeni sekme olarak kod paneline (ortadaki panel) gelmesini sağlayın. Bu dosya kod paneline geldiğinde kod panelinin en altında "Kaynak kodu" ve "Tasarımcı" olmak üzere iki sekme gelecektir. Ayrıca sağ paneldeki "Araç çubuğu" sekmesinin üzerine farenizin işaretçisini getirerek forma ekleyebileceğiniz kontrolleri görebilirsiniz. Arayüzü görsel olarak tasarlamak için kod panelinin en altındaki "Tasarımcı" sekmesine tıklayın.
Formun başlığı varsayılan durumda MainWindow'dur. Bunu değiştirmek için öncelikle formu seçmeliyiz. Formu seçmek için ya forma tıklayın ya formun hemen üstündeki açılır kutudan "MainWindow"u seçin ya da sağ paneldeki "Document Outline" sekmesindeki "MainWindow"a tıklayın. "Document Outline" sekmesi formumuzu ve forma getirdiğimiz bütün kontrolleri hiyerarşik olarak gösterecektir. Formumuzun ismi "MainWindow"dur. Formu aktif hâle getirdikten sonra şimdi fare işaretçiniz ile sağ paneldeki "Öznitelikler" sekmesine gelin. Buradaki "Window Properties" düğümündeki "Title" girdisinin sağında "MainWindow" değeri olacaktır. Bu değere tıklayın. "MainWindow" yazısı değiştirilebilir hâle gelecektir. "MainWindow" yazısını istediği

Şu ana kadar yaptığımız örneklerde hep önceden hazırlanmış ReadLine(), WriteLine() gibi metotları kullandık. Artık kendi metotlarımızı yapmanın zamanı geldi. Bilmem farkında mısınız, ama aslında bütün örneklerimizde birer metot oluşturmuştuk. O da çalışabilir her programda bulunması gereken Main metoduydu. Artık Main metodu gibi başka metotlar derleyip programımızın içinde kullanabileceğiz. Metotlar oluşturarak programımızı parçalara böler ve programımızın karmaşıklığını azaltırız. Ayrıca bazı kodları bir metot içine alıp aynı kodlara ihtiyacımız olduğunda bu metodu çağırabiliriz. Bu sayede de kod hamallığı yapmaktan kurtuluruz.

Bu metot, iki tane int türünden girdi alır ve bu girdilerin toplamını int türünden tutar. Ancak bu metodu programımız içinde kullanabilmemiz için bu metodun içinde bulunduğu sınıf türünden bir nesne belirleyip "." operatörüyle bu nesne üzerinden metodumuza erişmeliyiz. Örnek:

static olarak tanımlanan metotlara erişmek için metodun içinde bulunduğu sınıf türünden bir nesne belirtmeye gerek yoktur. static olarak tanımlanan metotlara sadece metodun adını yazarak erişilebilir. Örnek:

Bütün programlarda önce Main metodu çalışır. Diğer metotlar Main metodunun içinden çağrılmadıkça çalışmaz.
Eğer metot, içinde bulunduğumuz sınıfta değil de, başka bir sınıf içinde oluşturulmuşsa o metodu kullanabilmek için önce sınıfı yazmamız gerekir. Örnek:

Dikkat ettiyseniz bu metodun yazıldığı satırın (4. satır) başına public anahtar sözcüğü konmuş. public sözcüğüyle derleyiciye bu metoda her sınıftan erişilebileceğini söylüyoruz. Eğer public sözcüğü yazılmamış olsaydı bu metoda sadece Metotlar1 sınıfından erişilebilirdi.

Şimdi de static olmayan bir metodu başka bir sınıf içinde yazalım ve kullanalım:

Bütün değer tutan metotlar bir değermiş gibi kullanılabilir, ancak değişkenmiş gibi kullanılamaz.
Herhangi bir değer tutmayan (WriteLine gibi) metotları void anahtar sözcüğüyle üretiriz. Örnek:

Burada oluşturduğumuz Yaz metodu aldığı ilk parametreyi ikinci parametre kere ekrana yazar. Örneğin programımızda "deneme" stringi ekrana 5 kez yazdırılıyor.

Herhangi bir değer tutmayan metotlarda return; komutu, yanına herhangi bir ifade olmadan kullanılabilir. Aslında return; komutunun asıl görevi metottan çıkmaktır, ancak yanına bazı ifadeler koyularak metodun tuttuğu değeri belirtme vazifesi de görür. Örneğin bir if koşulu belirtip, eğer koşul sağlanırsa metottan çıkılmasını, koşul sağlanmazsa başka komutlar da çalıştırılmasını sağlayabiliriz. Ancak doğal olarak bir metodun son satırında return; komutunun kullanılması gereksizdir. Örnek kullanım:

Bu programda eğer metoda verilen ikinci parametre 10'dan büyükse metottan hiçbir şey yapılmadan çıkılıyor.

Metotları kullanırken parametrelerini doğru sayıda, doğru sırada ve doğru türde vermeliyiz.
Değer tutan metotlarda return satırıyla belirtilen ifade, metodu yazarken verilen türle uyumlu olmalıdır.
Değer tutmayan (void ile belirtilmiş) metotlarda return komutunun herhangi bir ifadeyle kullanılması yasaktır.
Değer tutmayan metotların bir değermiş gibi kullanılması yasaktır.
Yapıcı metotların erişim belirleyicisi olarak public belirtilmelidir.
Metotlar değer tutmayabileceği gibi, parametre de almayabilirler. Örnek program:

Buradaki ekrana "deneme" yazan metot herhangi bir parametre almaz. Dolayısıyla da programda kullanırken de parantezlerin içine hiçbir şey yazılmaz.

Bir metodun içinde başka bir metot derlenemez. Örneğin aşağıdaki gibi bir kullanım hatalıdır:

Metot oluşturulurken metot parantezinde "static void Yaz(object a,int b)" veya metot küme parantezlerinin içinde tanımlanan değişkenler metottan çıkıldığında bellekten silinirler. Eğer aynı metot tekrar çağrılırsa söz konusu değişkenler tekrar tanımlanıp tekrar değerler atanır.
Metot oluşturulurken metot parantezindeki değişkenlerin türleri tek tek belirtilmelidir. Virgül ile ortak tür belirtimi yapılamaz. Yani static void Ornek(int a,int b) yerine static void Ornek(int a, b) yazılamaz.

Örnek:

Buradaki Yaz metodu kendisine parametre olarak verilen dizinin elemanlarını alt alta yazdı. Eğer yalnızca int[] türündeki değil bütün türlerdeki dizileri ekrana yazan bir metot yazmak istiyorsak:  

Bu kullanım doğrudur. Ancak aşağıdaki kullanım hatalıdır:

Çünkü dizilerde değişkenlerdeki gibi bir bilinçsiz tür dönüşümünden bahsetmek imkansızdır.

Aşağıdaki iki programı karşılaştırın:

Bu iki programı çalıştırdığınızda göreceksiniz ki metoda parametre olarak aktarılan dizinin metot içinde bir elemanının değiştirilmesi esas diziyi etkiliyor. Ancak metoda parametre olarak aktarılan değişkenin metot içinde değiştirilmesi esas değişkeni etkilemiyor. Çünkü bir metoda parametre olarak bir dizi verildiğinde derleyici metoda dizinin bellekteki adresini verir; metot o adresteki verilerle çalışır. Dolayısıyla da dizinin herhangi bir elemanındaki değişiklik esas diziyi etkileyecektir. Çünkü gerek esas program, gerekse de metot aynı adresteki verilere erişir. Halbuki bir metoda parametre olarak bir değişken verdiğimizde metot için değişkenin bellekteki adresi önemli değildir, metot için önemli olan değişkenin değeridir. Metot, değişkeni kullanabilmek için ram üzerinde geçici bir bellek bölgesi tutar ve parametre olarak aldığı değişkenin değerini bu geçici bellek bölgesine kopyalar ve o geçici bellek bölgesiyle çalışır. Metottan çıkıldığında da o geçici bellek bölgesi silinir.
Peki bir metoda aktarılan bir değişkende yapılan bir değişikliğin tıpkı dizilerdeki gibi esas değişkeni etkilemesini ister miydiniz? İşte bunun için C#'ın ref ve out olmak üzere iki anahtar sözcüğü vardır.

Örnek:

ref anahtar sözcüğü değişkenlerin metotlara adres gösterme yoluyla aktarılmasını sağlar. Gördüğünüz gibi ref sözcüğünün hem metodu çağırırken , hem de metodu oluştururken değişkenden önce yazılması gerekiyor. Bu program ekrana 10 yazacaktır. Ayrıca ref sözcüğüyle bir değişkenin metoda adres gösterme yoluyla aktarılabilmesi için esas programda değişkene bir ilk değer verilmelidir. Yoksa program hata verir. Örneğin aşağıdaki program hata verir:

Kullanımı ref anahtar sözcüğüyle tamamen aynıdır. Tek farkı out ile belirtilen değişkenlere esas programda bir ilk değer verilmesinin zorunlu olmamasıdır. Örneğin aşağıdaki kullanım tamamen doğrudur.

NOT: ref sözcüğünün dizilerle kullanımı gereksiz olmasına rağmen C# bunu kısıtlamamıştır. Ancak out sözcüğü dizilerle kullanılamaz.

C#'ta parametre sayısı ve/veya parametrelerin türleri farklı olmak şartıyla aynı isimli birden fazla metot yazılabilir. Buna metotların aşırı yüklenmesi denir.
C#, bir metot çağrıldığında ve çağrılanla aynı isimli birden fazla metot bulunduğunda metodun çağrılış biçimine bakar. Yani ana programdaki metoda girilen parametrelerle yeni olan metotların parametrelerini kıyaslar. Önce parametre sayısına bakar. Eğer aynı isimli ve aynı sayıda parametreli birden fazla metot varsa bu sefer parametre türlerinde tam uyumluluk arar, parametre türlerinin tam uyumlu olduğu bir metot bulamazsa bilinçsiz tür dönüşümünün mümkün olduğu bir metot arar, onu da bulamazsa programımız hata verir. Örnekler:

Bu programda üç metot da aynı sayıda parametre almış. Bu durumda parametrelerin türlerine bakılır. Ana programdaki Metot1("deneme","deneme"); satırıyla üçüncü metot çağrılır. Metot1(5,6); metot çağrımının parametre türlerinin tam uyumlu olduğu metot birinci metottur, o yüzden birinci metot çağrılır. Eğer birinci metot olmasaydı ikinci metot çağrılacaktı. Son olarak Metot1(10f,56f); satırıyla da ikinci metot çağrılır. Başka bir örnek:

Bu programda iki metodun da parametre sayısı eşit, iki metotta da tam tür uyumu yok ve iki metotta da bilinçsiz tür dönüşümü mümkün. Bu durumda en az kapasiteli türlü metot çağrılır. Yani bu programda birinci metot çağrılır. Başka bir örnek:

Bu durumda birinci metot çağrılır. Başka bir örnek:

Bu durumda ikinci metot çağrılır. Çünkü char hem inte hem de floata bilinçsiz olarak dönüşebilir. Ancak int daha az kapasitelidir.
NOT: Metotların geri dönüş tipi (tuttuğu değerin tipi) faydalanılabilecek ayırt edici özelliklerden değildir. Yani iki metodun parametre sayısı ve parametre türleri aynı ise tuttuğu değer tipleri farklı olsa bile bunların herhangi biri çağrılmak istendiğinde programımız derlenmeyecektir.

Burada sırasıyla 1., 3. ve 2. metotlar çağrılacaktır.

Şimdiye kadar metotlarımıza gönderdiğimiz parametre sayısı belliydi ve bu parametre sayısından farklı bir miktarda parametre girersek programımız hata veriyordu. Artık istediğimiz sayıda parametre girebileceğimiz metotlar yapmasını göreceğiz. Örnek:

Burada aldığı parametrelerin toplamını tutan bir metot yazdık. Eğer metoda hiç parametre girilmemişse 0 değerini döndürmektedir. Gördüğünüz gibi params anahtar sözcüğüyle girilen tüm parametreleri int[] türündeki sayilar dizisine aktardık ve bu diziyi metotta gönlümüzce kullandık. Bir de bu programımızda Length özelliğini gördünüz. Özellikler metotlara benzerler, metotlardan tek farkları "()" kısımları olmamasıdır. Dolayısıyla parametre almazlar. Örneğimizde sayilar.Length satırı sayilar dizisinin eleman sayısını int türünden tutar. Başka bir örnek:

Bu programdaki gibi metodumuzda değişken parametre yanında bir ya da daha fazla normal sabit parametre de olabilir. Ancak değişken parametre mutlaka en sonda yazılmalıdır.
NOT: Değer döndüren metotlarımız mutlaka her durumda değer döndürmelidir. Örneğin metodumuzda sondaki else kullanılmazsa programımız derlenmez. Çünkü else'i kullanmasaydık birinci parametre yalnızca "carp" veya "topla" olduğunda metodumuz bir değer döndürecekti. Ve bu da C# kurallarına aykırı.
NOT: Değişken sayıda parametre alan metotlar aşırı yüklenmiş metotlar olduğunda değerlendirilmeye alınmaz. Örnek:

Burada 1. metot çağrılır. Ancak,

Burada 2. metot çağrılır.

C#'ta bir metodun içinde aynı metot çağrılabilir. Örnek:

Programlamadaki metot kavramı aslında matematikteki fonksiyonlar konusunun aynısıdır. Matematikteki fonksiyonlar konusunda öğrendiğiniz bütün kuralları metotlarda uygulayabilirsiniz. Örneğin yukarıdaki örnek, matematikteki f

Nitelikler koda bir eleman hakkında ekstra bilgi eklemek için kullanılan ve elemanın bildiriminden hemen önce yazılan özel kodlardır. C#'ta hazır nitelikler olduğu gibi kendi niteliklerimizi de yazabiliriz. Şimdi isterseniz önce hazır niteliklerden başlayalım.

Bu nitelik yalnızca metotlarla kullanılır. Önişlemci komutlarında gördüğümüz sembol programda varsa ilişkili metot çağrılır, nitelikteki sembol programda yoksa metot çağrılmaz. Bu nitelik System.Diagnostics isim alanında bulunur. Örnek program:

Bu program ekrana programın Türkçe olduğunu yazacaktır. Yani program hata vermedi, yalnızca English() metodunun çalıştırılmasını engelledi. Çünkü ilgili sembol programda yoktu.

Bu nitelik bir metodun .Net ortamında geliştirilmediğini belirtmek için kullanılır. .Net kütüphanesini değil de Windows API'lerini kullanabilmek için bu nitelik gereklidir. Ayrıca ilgili metodun dışarıdan alındığını belirtmek için extern anahtar sözcüğünü kullanırız. Bu nitelik System.Runtime.InteropServices isim alanında bulunur.
DllImport niteliğini bir Windows API fonksiyonu olan MessageBox() üzerinde görebiliriz. Bu fonksiyonu C# programımızda kullanabilmek için DllImport niteliği ile belirtmeli, ayrıca extern anahtar sözcüğü ile de ayrı bir belirtim yapmalıyız. MessageBox Windows programlarında sıkça görebileceğimiz uyarı penceresi anlamına gelir ve üzerinde çeşitli uyarı metinlerinin olduğu bir uyarı penceresi çıkarır. Kullanıcı ekrandaki "Tamam" veya "İptal" gibi butonları tıklayabilir. Şimdi bunları kodsal olarak örnekleyelim.

Gördüğünüz gibi kendi metodumuzu oluşturmuş gibi gözüküyoruz. Ancak aslında tek yaptığımız şey User32.dll dosyasından ilgili fonksiyonu alıp programımıza bir metotmuş gibi geçirmek. MessageBox() metodunun son parametresini 0-6 aralığında bir tam sayı yapıp değişik buton kombinasyonları elde edebilirsiniz.

Bu nitelikle bir metodun çağrılması durumunda hata ya da uyarı verilmesi sağlanır. Önişlemci komutlarındaki #error ve #warning komutlarına benzer. İki kullanımı vardır:

veya

Birinci örnekte eğer ilgili metot çağrılırsa derleyici uyarı verecektir. Yani program derlenecektir. İkinci örnekte ise eğer hata parametresi true ise program hata verecektir. Yani program derlenmeyecektir. Eğer ikinci örneğin hata parametresi false olursa birincisinden farkı kalmaz. İlk parametreler ise ekrana yazılan hata metnini belirlememizi sağlar. Obsolote niteliği System isim alanında bulunur.

Bu nitelik ile kendi yazdığımız niteliklerin hangi elemanlarla kullanılabileceğini belirleriz. Parametre olarak AttributeTargets isimli enum nesnesi almaktadır. Bu enumun içerdiği sözcükler şunlardır: All, Assembly, Class, Constructor, Delegate, Enum, Event, Field, Interface, Method, Module, Parameter, Property, ReturnValue, Struct. Bu sözcüklerden tek anlamını çıkaramadığınız tahminimce Module'dür. Module sözcüğü isim alanlarını ifade eder. Örnek

Burada niteliğimizin yalnızca metotlara uygulanabileceğini belirttik. Şimdilik buna kafa takmanıza gerek yok. Az sonra kendi niteliklerimizi oluştururken AttributeUsage niteliğini uygulamalı olarak göreceksiniz.

Nitelikler aslında System.Attribute sınıfından türetilmiş sınıflardan başka bir şey değildir. O hâlde biz de kendi niteliklerimizi System.Attribute sınıfından türetme yaparak oluşturabiliriz. Örnek:

Bu programda kendi niteliğimizi oluşturduk ve bu niteliğimizi bir metot üzerinde uyguladık. Niteliklerle ilgili diğer ilginç bir nokta ise niteliği kullanırken parametre verirken nitelikteki özelliklere değer verilebilmesidir. Örneğin:

Burada niteliğimiz yalnızca bir parametre almasına rağmen diğer parametreler nitelikteki public özelliklere değer atamıştır. Bunu bir örnek üzerinde görelim:

İlk parametre normal parametre olmalıdır. Diğerlerinden bazıları ya da tamamı olmayabilir. İlk parametre dışındakilerin kendi arasındaki sırası önemli değildir.
Bir elemana ilişkin nitelikleri yansıma yoluyla elde etmek için Attribute sınıfının static GetCustomAttribute() metodu kullanılabilir. Örnek:

Benim bilgisayarımda program şu çıktıyı verdi:

System.SerializableAttribute
System.Runtime.InteropServices.ComVisibleAttribute

Yani System.Array sınıfı bu iki niteliği kullanıyormuş. Yansıma yoluyla bir türün veya üye elemanın niteliklerini elde ettiğimizde aslında ilgili tür veya üye elemanın başındaki nitelikteki değerler kullanılarak ilgili nitelik sınıfı nesnesi oluşturulur. Geriye bu nesne döndürülür. Daha sonra bu nesne üzerinden niteliğin farklı kısımlarına ulaşabiliriz.

Olaylar geçen derste öğrendiğimiz temsilcilerle yakından ilişkilidir. Geri dönüş tipi temsilci olan özelliklere olay diyebiliriz. İşlevsel açıdan olayların geri dönüş tipi temsilci olan özelliklerden bir farkı yoktur. Ancak olay tanımlamak için ilgili özellik tanımına event anahtar sözcüğü eklenir. Olaylar bir üye elemandır ve sınıflar, yapılar ve arayüzler içinde tanımlanabilir. Olayın arayüz içinde tanımlanması durumunda bu arayüzü uygulayan sınıf ve yapıların bu olayı içermesi gerekir. Olaylar virtual, override, sealed override ve abstract olarak belirtilebilir. abstract olarak belirtilmesi durumunda bu sınıfı türeten sınıf veya yapının bu olayı uygulaması gerekir. Olayların geri dönüş tipi sadece bir temsilci olabileceği için olaylar belirli bir şablonda bir veya daha fazla metodu temsil edebilir. Olay bildirim şablonu şöyledir:

Bu şablona göre bir olay bildirimi şöyle olur:

Bu program ekrana Deneme yazacaktır. Bir nesnenin bir olayına += ve -= operatörleri kullanılarak metot eklenir ve çıkarılır, sade atama operatörü kullanılamaz. Bu olay tetiklendiğinde bu eklenen metot(lar) çalıştırılır. Olayın tetiklenmesi olayın tanımlandığı sınıf içinde yapılır, başka sınıflarda yapılamaz. Olayın tetiklenmesi metot çağırır gibi yapılır. Bu örneğimizde olayın tetiklenmesi başka bir sınıf içinden yapılamayacağı için sınıftaki bir public metot çağrılmış, bu metot olayı tetiklemiştir. Olay gerçekleştiğinde çalıştırılacak metot ya da metotların statik olma zorunluluğu yoktur.
Herhangi bir metot bağlanmamış bir olayı tetiklemeye çalışırsanız çalışma zamanı hatası oluşur. O yüzden çoğunlukla olayı tetikleyen metodun içinde olaya herhangi bir metot bağlanıp bağlanmadığı aşağıdaki gibi kontrol edilir.

Burada öncelikle olaya bir metot bağlanıp bağlanmadığı kontrol edilmektedir. Olaya metot bağlanmışsa olay tetiklenmekte, olaya metot bağlanmamışsa tetiklenmemektedir.
Bir önceki derste gördüğümüz metot isimlerinin temsilci türüne bilinçsiz dönüşebilmesi sayesinde bir olaya sadece metot ismini yazarak da bağlama yapabilirsiniz. Örnek:

Eğer olayın içinde bulunduğu sınıf türetilirse ve yavru sınıf olaya isim gizleme yapmaz veya override etmezse olayın erişim belirleyicisi public olsa bile yavru sınıf olayı tetikleme hakkını kaybeder. Bu sorunun önüne geçmek için ana sınıfta erişim belirleyicisi en az protected olan ve tek görevi olaya metot bağlanmışsa olayı tetiklemek olan bir metot oluşturulabilir.

Bazen bir olaya += operatörü ile metot eklendiğinde veya -= operatörü ile metot çıkarıldığında belirli kod bloklarının çalıştırılmasını isteyebiliriz. İşte bunun için ilgili olayın blokları içine add ve remove blokları koyulur. add ve remove bloklarını sahte özelliklerdeki set ve get bloklarına benzetebiliriz. 

Bu programın ekran çıktısı şöyle olur:

Olaya metot eklendi.
Olaya metot eklendi.
Olaydan metot çıkarıldı.

Bir olayın add ve remove erişimcileri olması durumunda bildiğimiz yollarla olay tetiklenemez. Bu sorunu çözmek için sınıfta geri dönüş tipi bir temsilci olan bir özellik tanımlanır. add erişimcisi ile verilen temsilci nesnesi bu özelliğe eklenir, remove erişimcisi ile verilen temsilcisi nesnesi -eğer varsa- bu özellikten çıkarılır. Daha sonra sınıf içinde olayın tetiklenmesini istediğimiz durumlarda olayın kendisi değil, bu özellik tetiklenir. Örnek:

Bu programın ekran çıktısı aşağıdaki gibi olacaktır:

Metot1
Metot2
Metot1

Delegate sınıfına ait statik Remove() metodu bir temsilcinin içinden başka bir temsilciye ait metotları çıkarır. Bu metotların çıkarılabilmesi için metotları çıkarılacak temsilci nesnesindeki metotların aynı sırada ardışık olarak kaynak nesnede bulunması gerekir. Çıkarılacak temsilci nesnesindeki metotlar birden fazla kez aynı sırada ve ardışık olarak kaynak nesnede varsa sadece sonuncusu çıkarılır.
NOTLAR:

add ve remove bloklarını içeren olaylar özet (abstract) olarak bildirilemez.
Bir olayda add ve remove blokları birlikte olmalıdır. Ayrı ayrı olamazlar.
Aynı metot += operatörüyle birden fazla kez bir olaya bağlanabilir. Bu durumda olay gerçekleşmesi durumunda metot birden fazla kez çalışacaktır.
Olaya bağlanmamış bir metot -= operatörüyle çıkarılmaya çalışılırsa herhangi bir hata oluşmaz.
add ve remove erişimcileri alan bir olayı "sahte olay" olarak düşünebiliriz. Çünkü add ve remove erişimcileri alan bir olay için bellekte herhangi bir temsilci nesnesi depolanmaz. Sadece ilgili sahte olaya += operatörüyle bir temsilci nesnesi bağlanmaya çalışıldığında add bloğunun içindeki, -= operatörüyle bir temsilci nesnesi çıkarılmaya çalışıldığında remove bloğunun içindeki kodlar çalıştırılır. Bunun dışında bir şey yapılmaz. O yüzden bir sahte olay tanımı yaptığımızda mutlaka aynı sınıfa geri dönüş tipi aynı temsilci (veya temsilci dizisi) olan bir özellik eklememiz gerekir.

İleride göreceğimiz Windows uygulamaları geliştirirken olaylarla iç içe yaşayacağız. Forma bir buton getirdiğimizde aslında Button sınıfı türünden bir nesne yaratırız. Button sınıfının Click olayı vardır. İşte biz form tasarlama penceresinde (ileride göreceğiz) herhangi bir butona çift tıklarsak o butonun Click olayına bağlanan metodun içeriğini yazabileceğimiz bir kod penceresi açılır. Bu metodun genellikle prototipi şu şekildedir:

Kaynak, olayı hangi nesnenin çalıştırdığıdır. Yani forma bir buton getirdiğimizde, yani bir Button nesnesi oluşturduğumuzda, bu nesnenin bir adı olmalıdır. Forma buton getirmeyi kodlarla yapmadığımız için Visual Studio bu Button nesnesine button1, button2 gibi adlar verir. İşte kaynak demek bu buton nesnesinin adıdır. Button sınıfı türündendir. Kuşkusuz forma sadece buton getirmeyeceğimiz, başka form elemanları da getirebileceğimiz için bu parametre object türündedir. EventArgs ise System isim alanında bulunan bir sınıftır. Bu sınıftaki çeşitli özellikler olayla ilgili ayrıntılı bilgi içerirler. Örneğin EventArgs sınıfındaki özelliklerle kullanıcının butonun hangi koordinatlarına tıkladığını öğrenebiliriz. Biz bu metodu oluştururuz, bu metodun çağrılması ilgili Button sınıfının içinden yapılır. Dolayısıyla buradaki kaynak ve EventArgs nesnesi Button sınıfının içinde üretilir. Burada kaynağın bizim butonumuz olduğunu biliyoruz. Ancak her zaman bilemeyebiliriz. Örneğin birden fazla butonu aynı metoda bağlarsak öncelikle metodu hangi butonun çağırdığını bilmek gerekir.
.Net olayları oluşturulurken System isim alanındaki EventHandler temsilcisi kullanılır. Doğal olarak bu temsilci yukarıdaki metot prototipindedir.

Şimdiye kadar kendi sınıflarımızı, metotlarımızı, özelliklerimizi yazdık. Şimdi kendi operatörlerimizi yazmaya sıra geldi. Şimdi içinde saat bilgileri olan bir sınıf tasarlayacağız:

Gördüğünüz gibi Zaman sınıfının Saat, Dakika ve Saniye olmak üzere üç özelliği var ve bu özellikler nesne yaratılırken girilmek zorunda. Dakika ve saniye 60'tan büyük olamayacağı için yapıcı metotta gerekli düzenlemeler yapılıyor. Bu sınıftan bir nesne yarattığımızda söz konusu nesnenin Saat, Dakika ve Saniye olmak üzere üç özelliği olacak. Başka bir nesne yarattığımızda da aynı şekilde bunun da Saat, Dakika ve Saniyesi olacak. Peki Zaman türünden iki nesnenin + operatörüne sokularak bu iki zaman diliminin toplanmasını ister miydiniz? Örneğin zaman1 ve zaman2 Zaman türünden iki nesne olsun. zaman1+zaman2 yazdığımızda karşılıklı dakika ve saniyeler toplansın ve saniyeden dakikaya ve dakikadan saate gerekli aktarımlar yapılsın. İşte şimdi bunu yapacağız:

Bu program ekrana 7.2.0 yazacaktır. Gördüğünüz gibi kendi operatörlerimizi yazmak, daha doğrusu + operatörüne aşırı yükleme yapmak çok da zor değil. Operatör metotlarımızın adı operator+ mantığında olmalı. Örneğin söz konusu operatörümüz - olsaydı operatör metodumuzun adı operator- olacaktı. Operatörümüzün alacağı operandları bu metoda parametre olarak gönderiyoruz. Operatör metodunun tuttuğu değer operatörün operandlarıyla birlikte tuttuğu değeri ifade eder. return new Zaman(ToplamSaat,ToplamDakika,ToplamSaniye); satırıyla metodun, dolayısıyla da operatörün verilen parametreler ölçüsünde Zaman türünden bir nesne tutmasını sağladık. Ancak şimdi Zaman türünden bir nesneyle int türünden bir nesneyi toplamamız mümkün değildir. Eğer Zaman türünden bir nesneyle int türünden bir nesne toplanmak istenirse int türünden nesneyi saniye olarak hesaba katabiliriz. Bunun içinse Zaman sınıfına şu operatör metodunu ekleyebiliriz:

Gördüğünüz gibi bu kadar basit. Ayrıca şunu hatırlatmak isterim: return new Zaman(a.Saat,a.Dakika,ToplamSaniye) satırıyla metodun Zaman türünden verilen parametrelere göre yeni bir nesne oluşturulup bu nesneyi tutmasını sağladık. Dolayısıyla Zaman sınıfının yapıcı metodu çalıştırıldı. Dolayısıyla da bizim tekrar Saniye, Dakika ve Saat arasında aktarım yapmamıza gerek kalmadı. Operatör metotlarıyla ilgili bilmeniz gerekenler:

Operatör metotlarının geri dönüş tipinin illaki söz konusu sınıf tipinden olmasına gerek yoktur. Örneğin Zaman sınıfındaki ilk toplama operatör metodunu şöyle değiştirebiliriz.

Burada Zaman nesne=new Zaman(ToplamSaat,ToplamDakika,ToplamSaniye); satırını ekleyerek Saat, Dakika, Saniye aktarımlarının yapılmasını sağladık. Bu metoda göre Zaman tipinden a ve b nesneleriyle yapılan a+b ifadesinin sonucu string tipinde olur.

Operatör metotları static ve public olmalıdır.
Dört işlem operatörleri (+, -, *, /) herhangi bir koşul olmaksızın aşırı yüklenebilirler.
Tek operand alan operatörlerin parametresi mutlaka ilgili sınıf türünden olmalıdır. İki operand alan operatörlerin parametrelerinden en az birisi ilgili sınıf türünden olmalıdır.
Operatör metotlarında ref ve out anahtar sözcükleri kullanılamaz.
İki operand alan operatörlerin operandlarının sırası operatör metodundaki parametrelerin sırasıyla aynı olmalıdır. Örneğin operator+(Zaman z, int i) operatör metodunu oluşturmuşsak 5+new Zaman() ifadesini programımız içinde kullanamayız. Bu ifadeyi kullanabilmemiz için operator+(int i, Zaman z) operatör metodunu oluşturmalıyız.

Şimdi Zaman sınıfına aşağıdaki operatör metotlarını ekleyelim.

İlişkisel operatörlerdeki ana kural ilişkisel operatörlerin birbirlerinin zıtlarının sınıf içinde ve aynı türde olmasının zorunlu olmasıdır. Yani biz burada yukarıdaki metotların yalnızca bir tanesini yazıp bırakamazdık ya da birininin geri dönüş tipini bool, birinin int yapamazdık. Ayrıca return !(a==b); satırı son derece mümkündür. Burada daha önce yazılmış bir metodu kullandık. Her iki metot da static olduğu için herhangi bir nesne tanımlamaya gerek yoktur. İlişkisel operatörlerin geri dönüş tipi bütün türlerde olabilmesine rağmen bool olması tavsiye edilir. Diğer ilişkisel operatörler olan <, >, <= ve >= operatörlerini de çift hâlinde olmak şartıyla tıpkı örneğimizdeki gibi aşırı yükleyebiliriz.

Şimdiye kadar true ve falseu bool türünden sabitler olarak gördük. Ancak şimdi bu true ve falseu operatörmüş gibi aşırı yükleyebileceğiz. Şimdi şu metotları Zaman sınıfına ekleyin:

Bu metotları asıl programımız içinde şöyle kullanabiliriz:

Gördüğünüz gibi derleyici normalde true ya da false olması gereken bir yerde Zaman türünden bir nesne gördüğü zaman Zaman sınıfındaki true ve false metotlarını çalıştırıyor ve söz konusu Zaman nesnenisinin true ya da false değerlerden birisini tutmasını sağlıyor. Eğer böyle bir yapı oluşturmak istiyorsak hem true hem de false metotlarının sınıfımız içinde bulunması gerekir. Ayrıca true ve false operatör metotlarının geri dönüş tipi mutlaka bool türünden olmalıdır.

Örnek (sınıfımıza eklenecek):

& ve |, ! operatörlerinin aşırı yüklenebilmesi için herhangi bir şart yoktur. (! operatörünün tek operand aldığını unutmayın.) Ancak && ve || operatörlerinin aşırı yüklenebilmesi için söz konusu sınıf için şu şartların sağlanması gerekir:

& ve | operatörleri aşırı yüklenmiş olmalıdır.
true ve false operatörleri aşırı yüklenmiş olmalıdır.
operator& ve operator| operatörlerinin parametreleri ilgili sınıf türünden olmalıdır.
operator& ve operator| operatörlerinin geri dönüş tipi ilgili sınıf türünden olmalıdır.
Yukarıdaki şartlar sağlandığı takdirde bizim ayrıca && ve || operatörlerini aşırı yüklememize gerek kalmaz. Yukarıdaki şartlar sağlandığı takdirde sanki && ve || operatörleri aşırı yüklenmiş gibi kodumuzu yazabiliriz. Örnek:

Yukarıdaki programda ekrana alt alta 50 ve 20 yazar. Peki neden 50 ve 20 yazdı? İşte mantığı:

Tablodan da görebileceğiniz gibi örneğimizde true operatörü true, false operatörü false değer ürettiği için a||b ifadesi ilk operand olan a'yı, a&&b ifadesi ise & operatör metodunun geri dönüş değerini tutar.
Başka bir örnek:

Bir önceki örnekte true ve false operatörleri her durumda true veya false döndürüyordu. Bu örnekte ise true ve false operatörlerinin döndürdüğü değer nesneye bağlı. Buradaki nesne ise || veya && operatörünün hemen solundaki nesne. Bu örnekte ayrıca true ve false operatörleri birbirlerini tümleyen yapıda değil. Yani true true döndürdüğünde, false'un false döndürme (ve tersi) şartı yok. Şimdi isterseniz bu örnekteki || ve && operatörlerine sokulan Program türündeki nesnelerin nasıl sonuç döndürdüğünü detaylandıralım:
p3 || p1 : p3 için true operatörü true döndürür. p3 için false operatörü false döndürür. true'nun true, false'un false döndürdüğü kombinasyonda || operatörü için ilk operandı seçiyoruz. (p3=11)
p3 || p2 : p3 için true operatörü true döndürür. p3 için false operatörü false döndürür. true'nun true, false'un false döndürdüğü kombinasyonda || operatörü için ilk operandı seçiyoruz. (p3=11)
p1 || p2 : p1 için true operatörü false döndürür. p1 için false operatörü false döndürür. Her iki operatörün de false döndürdüğü kombinasyonda || operatörü için | operatör metodunun aynı operandlarla döndürdüğü değer seçilir. (-5)|8=3
p3 && p1 : p3 için true operatörü true döndürür. p3 için false operatörü false döndürür. true'nun true, false'un false döndürdüğü kombinasyonda && operatörü için & operatör metodunun aynı operandlarla döndürdüğü değer seçilir. 11&(-5)=-55
p3 && p2 : p3 için true operatörü true döndürür. p3 için false operatörü false döndürür. true'nun true, false'un false döndürdüğü kombinasyonda && operatörü için & operatör metodunun aynı operandlarla döndürdüğü değer seçilir. 11&8=88
p1 && p2 : p1 için true operatörü false döndürür. p1 için false operatörü false döndürür. Her iki operatörün de false döndürdüğü kombinasyonda && operatörü için & operatör metodunun aynı operandlarla döndürdüğü değer seçilir. (-8)&5=(-40)

Hatırlarsanız C#'ta iki tane tür dönüşüm mekanizması vardı. Bunlardan birincisi bilinçli, ötekisi de bilinçsiz tür dönüşümüydü. Şimdi bu iki olayın kendi sınıflarımız türünden nesneler için de gerçekleşmesini sağlayacağız. Bu iki olayın taslağı şu şekildedir:

Bu bilinçsiz tür dönüşümü içindi. Şimdi de bilinçli tür dönüşümü metodunun taslağı:

Şimdi bu taslakları örneklendirelim:

Şimdi de bilinçli tür dönüşümünü örneklendirelim:

Gördüğünüz gibi bilinçli ve bilinçsiz tür dönüşümü operatör metotlarını yazarken tek değişen implicit ve explicit anahtar sözcükleri. Bir sınıf içinde parametre ve geri dönüş tipi aynı olan explicit ve implicit metotlar aynı anda bildirilemez. Eğer implicit metodu bildirmişsek explicit (bilinçli) tür dönüşümüne de izin vermiş oluruz. İlk örneğimizde (implicit) a nesnesini int türünden değişkenlerin kullanılabildiği her yerde kullanabiliriz. İkinci örneğimizde ise aynı şeyi tür dönüştürme operatörünü kullanarak yapabiliriz. implicit ve explicit metotlarla yalnızca Sinif türünden başka türlere ya da başka türlerden Sinif türüne dönüşüm yapabiliriz. Yani örneğin byte ile int arasındaki dönüşüm mekanizmasına müdahale edemeyiz.
BİLGİLENDİRME: Şimdi konunun başında gördüğümüz Zaman sınıfını düşünün. Artık implicit metot sayesinde Zaman türünden bir nesneye a="12.45.34"; şeklinde değer atayabilirsiniz. Bunun için Zaman sınıfının implicit metodu içinde gerekli parçalamaları yapar ve sonucu bir Zaman nesnesinde tutarsınız. Gördüğünüz gibi adeta kendi sabitlerimizi yazabiliyoruz. Bunun gibi daha birçok şey hayal gücünüze kalmış.
NOT: Artık bu öğrendiğimiz implicit metot sayesinde Sinif türünden bir nesneyi new anahtar sözcüğünü kullanmadan direkt Sinif a=23; gibi bir şey yazarak oluşturabiliriz. Ancak bunun için tabii ki sınıfımız içinde int türünden Sinif türüne implicit dönüşüm metodunu oluşturmamız gerekir.
NOT: Bildiğiniz gibi C#'ta bazı türler arasında bilinçsiz tür dönüşümü olur. Örneğin C#'ta byte türünden inte bilinçsiz tür dönüşümü mümkündür. Ancak biz programımızı yazarken bunları kafamıza takmamıza gerek yok. Yani Sinif türünden int'e dönüşüm yapan meto

Programlama dillerinde tek başlarına herhangi bir anlamı olmayan ancak programın işleyişine katkıda bulunan karakter ya da karakter topluluklarına operatör denir. Örneğin a+b ifadesinde + işareti bir operatördür. Operatörlerin etki ettikleri sabit ya da değişkenlere ise operand denir. Örneğin a+b ifadesinde a ve b birer operanddır. C#'ta operatörlerın bazıları tek, bazıları çift, bazıları da üç operand alır. Peki eğer bir ifadede birden fazla operatör varsa ne olacak? Örneğin 2+3*7 gibi bir ifadede önce hangi işlem yapılacak? Burada önce toplama işlemi yapılırsa sonuç 35 olur, ancak önce çarpma işlemi yapılırsa sonuç 23 olur. İşte C#'ta bu gibi durumları önlemek için operatör önceliği diye kavram bulunmaktadır. Operatör öncelikleri ile ilgili şu kuralları bilmenizde fayda var:

Önce parantez içleri yapılır. Örneğin (3+5)*9 gibi bir ifadede önce toplama işlemi yapılır.
İç içe parantezler söz konusuysa önce en içteki parantez yapılır, sıra ile dıştaki parantezlere gidilir. Örneğin (2+(9+2)*5)*2 gibi bir ifadede önce 9 ile 2 toplanıp 11 değeri bulur, sonra 11 ile 5 çarpılıp 55 değeri bulunur, sonra 55 ile 2 toplanıp 57 değeri bulunur, en son da 57 ile 2 çarpılıp 114 değeri bulunur.
Dikkat ettiyseniz yukarıdaki örnekte bir parantez söz konusu olmamasına rağmen önce toplama yerine çarpmanın yapıldığı bir durumla karşılaştık. Çünkü C#'ta farklı operatörlerin farklı önceliği vardır. Yani ifadede bir parantez yoksa önce öncelik sırası daha önde olan operatörün işlemi yapılır. Aşağıdaki tabloda operatörler öncelik sırasına göre listelenmiştir. Tablo, öncelik sırası en önde olandan en geride olana göre sıralanmıştır. Yani aynı ifadede parantez söz konusu değilse bu tablodaki daha üstte olan operatör daha önce işletilecektir.

Dikkat ettiyseniz yukarıdaki tablodaki bazı operatörler aynı sırada, yani bunların öncelik sırası eşit. C#'ta eğer operatörler eşit öncelikliyse, soldan sağa işlem yapılır. Yani 2*6/5 işleminde önce 2 ile 6 çarpılır, sonra da sonuç 5'e bölünür. Çoğu durumda bunun sonuca bir değişiklik yapmadığı düşünülse de bazı durumlarda işleme soldan başlanmasının sağdan başlamaya göre değişik sonuçlar doğurduğu durumlara rastlanabilir. Örneğin:

Bu programda ekrana 2 yazılır. Ancak;

Bu programda ekrana 0 (sıfır) yazılır. Çünkü C# sonunda herhangi bir harf olmayan tam sayı sabitleri int sayar ve intin kurallarına göre işlem yapar. int sabitlerle yapılan her işlemden sonra -oluşursa- ondalık kısım atılır. Ancak programı aşağıdaki gibi değiştirirsek sonuç değişmeyecektir.

Burada sabitleri floatlaştırdık, dolayısıyla da işlemin sonunda float bir sabit oluştu. Sonra tür dönüştürme operatörüyle sonucu inte çevirip i değişkenine atadık ve bu değişkeni de ekrana yazdırdık. Şimdi isterseniz bütün operatörleri tek tek inceleyelim.

+, -, / ve * operatörleri hakkında açıklama yapma gereksinmi görmüyorum. Burada henüz görmediğiniz bir operatörü tanıtmak istiyorum. % operatörü mod alma işlemi yapar, yani;

Bu program ekrana 1 yazar. Yani 5 sayısının 2'ye bölümünden kalan i değişkenine atandı. Matematiksel operatörler hakkında şunu eklemek istiyorum: eğer işlem yapılan her iki operarand farklı türdeyse sonuç daha üst kapasiteli türde tutulur. Örnek:

Burada 5 sayısı da float gibi davranmış ve sonuç ondalıklı çıkmıştır. Ancak,

Burada sonuç 0 çıkar. Çünkü zaten işlem yapılırken sonuç daha floata (2f) gelmeden sıfırlanmıştı.

Burada ise zincirleme olarak her işlemin sonucu floatlaşmakta ve sonuç ondalıklı çıkmaktadır. Daha çarpıcı bir örnek:

Burada da sonuç ondalıklıdır.

C#'ın en çok kullanılan operatörlerindendir. Önüne veya sonuna geldiği değişkeni bir artırır veya bir eksiltirler, sabitlere uygulanamazlar. Hem uygulandığı değişkenin değerini 1 artırır veya eksiltirler hem de tutucu vazifesi görürler. Ön ek ve son ek olmak üzere iki şekilde kullanılabilirler. Örnek;

Programda da gördüğünüz gibi ++ operatörü hem a'nın değerini bir artırdı hem de bu değeri tuttu ve değer i'ye atandı. İşte ön ek ve son ek şeklinde kullanımın farkı burada ortaya çıkıyor. Örneği inceleyiniz.

Bu programda ++ operatörü ön ek şeklinde değil de son ek şeklinde kullanılmış. Bu durumda 7. satırda önce a'nın değeri i'ye atanır, sonra a'nın değeri 1 artırılır. Halbuki ilk örneğimizde önce a'nın değeri 1 artırılmış sonra bu değer i'ye atanmıştı. İsterseniz şimdi bu ++ ve -- operatörlerini bir örnekte hep beraber görelim;

Bu program ekrana alt alta 6, 4, 5 ve 9 yazacaktır. Dikkat ettiyseniz Write metodunu farklı şekilde kullandık. Siz de böyle çok fazla değişkeni daha kolay yazdırabilirsiniz. Ayrıca bu yöntemi WriteLine metodunda da kullanabilirsiniz.
NOT: Bir artırma ve bir azaltma operatörleri byte, sbyte, short ve ushort türlerindeki değişkenlerin türünü değiştirmez.

Daha önceki derslerimizden birinde 2<5 gibi bir ifadenin aslında bool türünden bir değer olduğunu söylemiştik. İşte bu operatörler bu bool türünden değerleri operandları vasıtasıyla üretmek için kullanılır. İki sayının birbirine göre büyüklüğünü ve küçüklüğünü kontrol ederler. Tabii ki yalnızca sayısal türdeki (char da dâhil) değişken ya da sabitlerle kullanılabilirler. Charla sayısal türler karşılaştırıldığında charın Unicode karşılığı hesaba katılır. Bu operatörler şunlardır: < (küçüktür), > (büyüktür), <= (küçük eşittir), >= (büyük eşittir), == (eşittir), != (eşit değildir). Örnekler:

Bu program ekrana alt alta True, True, True, False, False ve True yazacaktır.

Tüm değişken türlerinden objecte ve objectten referans değişkenlerine dönüşüm yapar. Dönüşüm gerçekleşmiyorsa null değer döndürür. Örnek:

veya

Verilen değişken, sabit ya da ifadenin türünü kontrol eder. Eğer söz konusu değişken, sabit ya da ifade verilen türle uyumluysa true değilse false değeri üretir. Eğer söz konusu değişken, sabit ya da ifadenin türü her zaman true ya da false üretiliyorsa derleyici uyarı verir, ancak bu uyarı derlemeye engel değildir. Kullanımına bir örnek:

Bu program alt alta True, False, False, False ve False yazacaktır. Dikkat ettiyseniz 12 sabitini byte saymadı ve 12f+7 sabitini de int saymadı. Çünkü C#, harfsiz tam sayı sabitleri int sayar. 12f+7 sabiti de floatlaşmıştır.

Bu operatörler true veya false sabit ya da değişkenleri mantıksal ve, veya, değil işlemine sokarlar. Bunlar && (ve), || (veya) ve ! (değil) operatörleridir. Örnekler:

Eğer ! operatöründen sonra bir değişken ya da sabit yerine bir ifade geliyorsa ifadeyi parantez içine almak zorundayız.

Bitsel operatörler sayıların kendisi yerine sayıların bitleriyle ilgilenirler. Diğer bir deyişle sayıları ikilik sisteme dönüştürüp öyle işlem yaparlar. Bu operatörler yalnızca tam sayı sabit, değişken ya da ifadelerle kullanılabilirler. Eğer bitsel operatörler bool türünden değişken, sabit ya da ifadelerle kullanılırsa mantıksal operatörlerin gördüğü işin aynısını görürler. Örneğin aşağıdaki iki kullanım da birbiyle aynı sonucu doğuracaktır: 

~ (bitsel değil), & (bitsel ve), | (bitsel veya) ve ^ (bitsel özel veya) operatörleri bitsel operatörlerdir. Örnekler:

Bitsel operatörler sayıları ikilik sisteme dönüştürüp karşılıklı basamakları "ve", "veya" veya "özel veya" işlemine sokarlar ve sonucu operandlarıyla birlikte tutarlar. & (ve) işlemi karşılıklı basamaklardan her ikisi de 1'se ilgili basamağında 1 tutar, diğer durumlarda 0 tutar. | (veya) işlemi karşılıklı basamaklarından herhangi birisi 1'se ilgili basamağında 1 tutar, diğer durumlarda 0 tutar. ^ (özel veya) işlemi karşılıklı basamakları farklıysa ilgili basamağında 1 tutar, diğer durumlarda 0 tutar. ~ (değil) operatörü operandının her basamağını tersleştirip tutar. Bu operatörlerin operandları byte, sbyte, short, ushort olması durumunda sonuç intleşir.
NOT: Başında 0x veya 0X olan sayılar 16'lık düzende yazılmış demektir. Örnek:

Bu program ff sayısının onluk düzendeki karşılığı olan 255 sayısını ekrana iki kere yazacaktır.

Bu operatörler (<< ve >>) sayıların bitlerini istenildiği kadar kaydırmak için kullanılır. << sayıları sola kaydırırken, >> sağa kaydırır. Örnekler:

<< ve >> operatörlerinin operandları değişken olabileceği gibi sabit ya da ifade de olabilir. Operand(lar) byte, sbyte, short, ushortsa sonuç intleşir.

Şimdiye kadar çok kullandığımız = operatörüyle ilgili bilmeniz gereken iki şey var.

Sol tarafta kesinlikle yalnızca bir tane değişken olmalı. Örneğin aşağıdaki gibi bir kullanım hatalıdır.

= operatöründe işlemler sağdan sola gerçekleşir ve = operatörü operandlarıyla birlikte atadığı değeri tutar. Örnek:

Bu program ekrana yan yana üç tane 7 yazacaktır. c=a=b; satırında önce b a'ya atanır ve a=b ifadesi 7 değerini tutar. Çünkü a=b atamasında 7 sayısı atanmıştır. Sonra a=b ifadesinin tuttuğu 7 sayısı c'ye atanır. Sonunda üç değişkenin değeri de 7 olur. Ancak şu örnek hatalıdır:

Burada önce a c'ye atanıyor ve c=a ifadesi 1 değeri tutuyor ve ifademiz 1=b ifadesine dönüşüyor. Atama operatörünün prensibine göre böyle bir ifade hatalı olduğu için program derlenmeyecektir. Bir de işlemli atama operatörleri vardır. Aslında bunlar = operatörünün yaptığı işi daha kısa kodla yaparlar:

a=a+b; yerine a+=b;
a=a-b; yerine a-=b;
a=a*b; yerine a*=b;
a=a/b; yerine a/=b;
a=a%b; yerine a%=b;
a=a<<b; yerine a<<=b;
a=a>>b; yerine a>>=b;
a=a&b; yerine a&=b;
a=a^b; yerine a^=b;
a=a|b; yerine a|=b;
kullanılabilir.

?: operatörü C#'ta üç operand alan tek operatördür. Verilen koşula göre verilen değerlerden (object türünden) birini tutar. Kullanımı şöyledir:

Örnek:

Tabii ki verilen değerlerin illa ki sabit olma zorunluluğu yoktur, değişken ya da ifade de olabilir.

- operatörü bir değişken, sabit ya da ifadenin işaretini değiştirmek için kullanılır. Örnekler:

+ operatörü stringleri veya charları yan yana ekleyip operandlarıyla birlikte string olarak tutar. Ancak ifadedeki bütün bileşenlerin string olarak birleşebilmesi için ilk stringten önce charların yan yana gelmemesi gerekir. Yalnızca charlardan oluşan bir ifade stringleşmez.
NOT: + ve - operatörleri aynı zamanda sayısal (ve char) sabit, değişken ve ifadeleri toplamak ve çıkarmak için de kullanılır. Bunu daha önce görmüştük.

He

C#'ta program yazarken (özellikle oyun programlarında) rastgele değerlere ihtiyaç duyabiliriz.

Rastgele sayı üretebilmemiz için öncelikle Random sınıfı türünden bir nesne yaratmalıyız:

Buradaki yarattığımız nesnenin adı rnd. Şimdi bu nesne üzerinden Random sınıfının metotlarına erişebileceğiz.

Birinci örnekte: 10 ile 20 arasında int türden rastgele bir sayı üretilir, 10 dâhil ancak 20 dâhil değildir.
İkinci örnekte: 0 ile 50 arasında int türden rastgele bir sayı üretilir, 0 dâhil ancak 50 dâhil değildir.
Üçüncü örnekte: int türden pozitif herhangi bir sayı üretilir.
Dördüncü örnekte: double türden 0.0 ile 1 arasında rastgele bir sayı üretilir.
Random sınıfı System isim alanı içinde bulunduğu için programımızın başında using System; satırının bulunması rastgele sayı üretme metotlarını kullanabilmemiz için yeterlidir.

Yeni bir string nesnesi şu yollarla oluşturulabilir.

İstenildiği kadar, istenilen türde parametre alır. Aldığı parametreleri birleştirip string olarak tutar.

a ve b kıyaslanır, a büyükse pozitif bir sayı, b büyükse negatif bir sayı, eşitlerse 0 döndürür. Büyüklük-küçüklük mantığı sözlükte önde/sonda gelme mantığının aynısıdır. Sonda gelen daha büyük sayılır. Türkçe alfabesine uygundur.

Birinci metotla aynı işi yapar. Tek fark eğer c true ise kıyaslamada büyük/küçük harf ayrımı gözetilmez. Eğer c false ise birinci metottan farkı kalmaz.

Birinci metotla aynı mantıkta çalışır. Tek fark kıyaslamada ilk elemanların a[indeks1] ve b[indeks2] sayılmasıdır. Yani stringlerdeki bu elemanlardan önceki elemanlar yok sayılır.

c true yapılırsa az önceki metodun büyük/küçük ayrımı gözetmeyeni kullanılmış olur.

Compare metodunun tek parametre almış ve static olmayan hâlidir. Metodu çağıran veriyle parametre kıyaslanır. Metodu çağırana a, parametreye b dersek static int Compare(string a,string b) metodunun yaptığı işin aynısını yapar.

Kendisini çağıran string içinde parametredeki veriyi arar. Bulursa bulunduğu indeksi tutar. Eğer aranan birden fazla karaktere sahipse ilk karakterin indeksini tutar. Eğer arananı bulamazsa -1 değeri döndürür. Eğer stringin içinde aranandan birden fazla varsa ilk bulunanın indeksini döndürür.

IndexOf metoduyla aynı işi yapar. Tek fark arananın son bulunduğu yerin indeksini vermesidir. Örneğin aranan 'n' karakteri ise ve string "benim çantam var" ise 2 değil, 8 döndürür.

Birincisi a dizisinin herhangi bir elemanının ilk bulunduğu indeks ile geri döner. İkincisi ise b dizisinin herhangi bir elemanının son bulunduğu indeks ile geri döner. char dizisindeki elemanların hiçbiri bulunamazsa -1 ile geri dönülür.

Birincisi metodu çağıran string a ile başlıyorsa true, diğer durumlarda false değeri üretir. İkincisi metodu çağıran string b ile bitiyorsa true, diğer durumlarda false değeri üretir.

metodu çağıran stringin başındaki ve sonudaki boşluklar silinir.

metodu çağıran stringin başındaki ve sonundaki dizi dizisinde bulunan karakterler silinir. Örneğin string ebebesdefbebe ise ve dizi 'e' ve 'b' elemanlarından oluşuyorsa sdef değeri döndürülür.

Birincisinde metodu çağıran stringin uzunluğu toplam olana kadar sağına boşluk eklenir. İkinci metotta ise aynı işlem boşluk ile değil c karakteri ile yapılır. Örneğin c karakterini '.' yaparak bir kitabın içindekiler bölümünü hazırlayabiliriz. Aynı işlemi stringin soluna yapmak için

metotları kullanılır. Bu da sağa yaslı yazılar yazmak için uygundur.

Birinci metotta metodu çağıran string ayirici dizisindeki karakter(ler)e göre parçalara ayrılır ve sonuç bir string dizisinde tutulur. İkincisinde bu işlem en fazla toplam kez tekrarlanır. Üçüncüsünde ayırıcı karakter olarak beyaz boşluk karakterleri kullanılır. Örnek:

NOT: Tek parametre alan Split() metodunda parametre params şeklinde tanımlanmıştır. Yani bu metoda birden fazla char parametresi atabiliriz. Ancak ikinci metodun ilk parametresi params olmayan bir dizidir. Bu parametreye sadece bir char dizisi verebiliriz.
NOT:: params olan tek parametreli Split() metoduna da parametre olarak bir char dizisi verebiliriz. Örnek:

Bu programın ekran çıktısı şöyle olacaktır:

ahmet
ozan
mustafa

ahmet
ozan.mustafa

Burada ikinci örneğe 2 parça sınırı verildiği için program ilk parçalama karakteriyle karşılaştığında parçalama yapmış, sonuçta bu aşamada 2 parça oluştuğu için parçalamayı durdurmuştur.
Join() metodu ise Split() metodunun tam tersi şekilde işler.

Birincisinde yazilar dizisinin elemanlarının arasına ayirici eklenerek tek bir string hâline getirilir. İkincisinde ise yazilar[baslangic]'ten itibaren toplam kadar eleman ayirici ile birleştirilip tek bir string olarak tutulur.

Kendisini çağıran stringin harflerini büyük yapar ve tutar.

Kendisini çağıran stringin harflerini küçük yapar ve tutar.

Yazıdan indeks nolu karakterden itibaren adet kadar karakteri yazıdan siler ve oluşan bu yeni stringi tutar.

Yazının indeks. elemanından sonrasına str stringini yerleştirir ve tutar.

Yazıda geçen bütün c1 karakterlerini c2 olarak değiştirir ve tutar.

Yazıda geçen bütün s1 yazılarını s2 olarak değiştirir ve tutar.

Metodu çağıran stringin indeks. elemanından sonraki yazıyı tutar.

Metodu çağıran yazının indeks. elemanından sonraki toplam karakterlik yazıyı tutar.

Şimdi isterseniz metotlardan başımızı kaldıralım ve yazıları biçimlendirmeye başlayalım. Biçimlendirme yazıların ekrana veya başka bir akıma istenilen formatta yazılması olayıdır. Ancak öncelikle yazılar üzerinde biçimlendirme yapabilmek için ilgili metodun biçimlendirmeyi destekliyor olması gerekir. Console.WriteLine(), String.Format() ve ToString() metotları biçimlendirmeyi destekler. İlk olarak Console.WriteLine() metodunu kullanarak yazıların nasıl biçimlendirilebileceğine bakalım.

Burada ekrana yazılacak yazıdaki {0} ifadesi no verisini, {1} ifadesi de sira verisini ifade ediyor. Bu verileri istediğimiz kadar artırabiliriz. Metin biçimlendirme taslağı:

şeklindedir. Farkındaysanız biz yukarıda sadece degisken_no'yu kullandık. Diğerleri kullanılmadığı zaman varsayılan değerleri kullanılır. genislik yazının karakter cinsinden minimum genişliğidir. Eğer yazının büyüklüğü genislik değerinden küçükse kalan kısımlar boşlukla doldurulur. Eğer genislik pozitif bir sayıysa yazı sağa dayalı, negatif bir sayıysa sola dayalı olur. Örnek:

Bu kodun konsol ekranındaki çıktısı şöyle olur.

        54 numara
54         numara

Dikkat ettiyseniz henüz format'ı kullanmadık. Formatı kullanmadığımız için şimdiye kadar varsayılan değerdeydi.

Burada 155 sayısı ekrana 16'lık sayı sisteminde yazılır. Yani ekrana 9B yazılır. Şimdi bu örneği biraz daha geliştirelim:

Bu kodla ekrana 0009B yazılır. Yani X'in yanındaki sayı, esas sayının kaç haneli olacağını belirliyor. Buradaki 5 sayısına duyarlıklık değeri denir ve her format belirleyicisi için farklı anlama gelir. Format belirleyiciler, duyarlılık değerleri ve açıklamaları:

Şimdi bunlarla ilgili bir örnek yapalım:

Bu programın ekran çıktısı şöyle olur:

105,000 TL
00105
5,689E+002
568,8700
105
568,9
%10.500,00
00069

NOT: Eğer sayıların normal ondalıklı kısmı duyarlılık değerinden uzunsa yuvarlama yapılır.

String sınıfının Format() metodu tıpkı WriteLine() metodu gibi çalışmaktadır. Tek fark WriteLine() biçimlendirdiği yazıyı ekrana yazarken Format() metodu yazıyı bir string olarak tutar. Örnek:

ToString() metodunda ise biçimlendirme komutu parametre olarak girilir. Onun dışında Format metodundan farkı yoktur. Örnek:

Örnek program:

Programın ekran çıktısı şuna benzer olmalıdır.

d--> 04.01.2009
D--> 04 Ocak 2009 Pazar

t--> 16:25
T--> 16:25:50

f--> 04 Ocak 2009 Pazar 16:25
F--> 04 Ocak 2009 Pazar 16:25:50

g--> 04.01.2009 16:25
G--> 04.01.2009 16:25:50

m--> 04 Ocak
M--> 04 Ocak

r--> Sun, 04 Jan 2009 16:25:50 GMT
R--> Sun, 04 Jan 2009 16:25:50 GMT

s--> 2009-01-04T16:25:50

u--> 2009-01-04 16:25:50Z
U--> 04 Ocak 2009 Pazar 14:25:50

y--> Ocak 2009
Y--> Ocak 2009

Standart biçimlendirme komutlarının yanında bazı özel karakterler yardımıyla kendi biçimlerimizi oluşturabiliriz. Bu özel biçimlendirici karakterler aşağıda verilmiştir:

# → Rakam değerleri için kullanılır.
, → Büyük sayılarda binlikleri ayırmak için kullanılır.
. → Gerçek sayılarda ondalıklı kısımları ayırmak için kullanılır.
0 → Yazılacak karakterin başına ya da sonuna 0 ekler.
% → Yüzde ifadelerini belirtmek için kullanılır.
E0, e0, E+0, e+0, E-0, e-0 → Sayıları bilimsel notasyonda yazmak için kullanılır.
Örnek bir program:

Bu programın ekran çıktısı şu gibi olmalıdır:

12.341.445
31,44
1.314E+4
25%

Düzenli ifadeler değişken sayıda karakterden oluşabilecek ancak belirli koşulları sağlayan ifadelerdir. Örneğin e-posta adreslerini düşünebiliriz. Dünyada milyonlarca e-posta adresi olmasına ve farklı sayıda karakterden oluşabilmesine rağmen hepsi kullaniciadi@domainismi.domaintipi düzenindedir. Örneğin iletisim@microsoft.com bu düzenli ifadeye uymaktadır.
C#'taki düzenli ifade işlemleri temel olarak System.Text.RegularExpressions isim alanındaki Regex sınıfı ile yapılmaktadır. Bir karakter dizisinin oluşturulan düzenli ifadeye uyup uymadığını yine bu isim alanındaki Match sınıfıyla anlarız. Düzenli ifadeler başlı başına bir kitap olabilecek bir konudur. Burada sadece ana hatları üzerinde durulacaktır.

Bir ifadenin mutlaka istediğimiz karakterle başlamasını istiyorsak ^ karakterini kullanırız. Örneğin ^9 düzenli ifadesinin anlamı yazının mutlaka 9 karakteri ile başlaması demektir. "9Abc" yazısı bu düzene uyarken "f9345" bu düzene uymaz.
Belirli karakter gruplarını içermesi istenen düzenli ifadeler için \ karakteri kullanılır:
\D ifadesi ile yazının ilgili yerinde rakam olmayan tek bir karakterin bulunması gerektiği belirtilir.
\d ifadesi ile yazının ilgili yerinde 0-9 arası tek bir karakterin bulunması gerektiği belirtilir.
\W ifadesi ile yazının ilgili yerinde alfanumerik olmayan karakterin bulunması gerektiği belirtiliyor. Alfanumerik karakterler a-z, A-Z ve 0-9 aralıklarındaki karakterlerdir.
\w ifadesi ile yazının ilgili yerinde bir alfanumerik karakterin bulunması gerektiği belirtiliyor.
\S ifadesi ile yazının ilgili yerinde boşluk veya tab karakterleri haricinde bir karakterin olması gerektiği belirtiliyor.
\s ifadesi ile yazının ilgili yerinde yalnızca boşluk veya tab karakterlerinden biri bulunacağı belirtiliyor.
Bu öğrendiğimiz bilgiler ışığında 5 ile başlayan, ikinci karakteri rakam olmayan, üçüncü karakteri ise boşluk olan bir düzenli ifade şöyle gösterilebilir:

Tahmin edersiniz ki aynı zamanda burada düzenli ifademizin yalnızca 3 harfli olabileceği belirttik. Yukarıdaki ^5\D\s ifadesine filtre denilmektedir.

Belirtilen gruptaki karakterlerden bir ya da daha fazlasının olmasını istiyorsak + işaretini kullanırız. Örneğin,

filtresi ilgili yerde bir ya da daha fazla alfanumerik karakterin olabileceğini belirtiyor. "123a" bu filtreye uyarken "@asc" bu filreye uymaz. + yerine * kullansaydık çarpıdan sonraki karakterlerin olup olmayac

Geçen derste assembly kavramını ve assemblylerle kullanılan bazı sınıfları incelemiştik. Şimdi ise bir assemblydeki tür ve üye eleman bilgilerini çalışma zamanında elde etmek demek olan yansıma konusunu inceleyeceğiz. Konumuza tam giriş yapmadan önce bir operatör ve bir metodu tanıtmak istiyorum:

typeof() operatörü herhangi bir türü System.Type türüne çevirip tutar. Örnek:

GetType() metodu herhangi bir nesnenin türünü Type türünden tutar. static değildir. object sınıfının bir metodudur. Dolayısıyla bütün türlere kalıtım yoluyla geçmiştir. Örnek:

Bu kod ekrana System.Int32 yazacaktır. Şimdi esas konumuza başlayabiliriz.

Type sınıfı System isim alanında bulunan özet (abstract) bir sınıftır. Dolayısıyla

gibi bir ifade mümkün değildir. Type türünden nesneler belirli bir türü temsil ederler. Type sınıfındaki static olmayan IsClass, IsAbstract, IsEnum, IsInterface, IsNotPublic, IsPublic, IsSealed ve IsValueType özellikleri vardır. Bunlar aşağıdaki koşullar sağlanıyorsa true, sağlanmıyorsa false değer döndürür:
IsClass → İlgili tür sınıfsa
IsAbstract → İlgili tür özetse
IsEnum → İlgili tür enumsa
IsInterface → İlgili tür arayüzse
IsNotPublic → İlgili tür public değilse
IsPublic → İlgili tür publicse
IsSealed → İlgili tür sealed ise
IsValuType → İlgili tür yönetilmeyen tür ise
Ayrıca Type sınıfının static olmayan IsAssignableFrom(Type tür) metodu parametredeki tür nesnesinin ilgili tür nesnesine atanıp atanamayacağının anlaşılması için kullanılır. Atanabiliyorsa true, atanamıyorsa false değer döndürür. Örnek:

Bu kod alt alta True ve False yazacaktır.

Bir türdeki üye elemanları temsil etmek için kullanılır. Özet bir sınıftır, dolayısıyla new operatörüyle yeni MemberInfo nesnesi tanımlanamaz. MemberInfo sınıfının önemli özellikleri:

Type DeclaringType İlgili üye elemanın içinde bulunduğu türü Type türünden döndürür.
MemberTypes MemberType İlgili üye elemanın ne tür bir eleman olduğunu MemberTypes enumu türünden döndürür. MemberTypes enumu Constructor, Method, Event, Field ve Property sözcüklerini içerir. Bunlar şu anlamlara gelir:
Constructor → yapıcı metot
Method → metot
Event → olay
Field → özellik
Property → sahte özellik
string Name ilgili üye elemanın ismini string olarak verir.
Type sınıfının GetMembers() metodu kullanılarak bir türdeki bütün üye elemanlar MemberInfo türünden bir diziye aktarılır. Ayrıca yine Type sınıfının GetMember(string eleman) metodu, ismi belirtilen string olan üye elemanları bir MemberInfo dizisi olarak döndürür. Örnek bir program:

Bu program String sınıfındaki tüm metotları ekrana yazacaktır.

Türlerdeki metotları temsil etmek için kullanılan bir sınıftır. Bu sınıf MemberInfo sınıfından türemiş olan MethodBase sınıfından türemiştir. Dolayısıyla MemberInfo sınıfındaki tüm üye elemanları taşır. Bu sınıfta ek olarak metotların geri dönüş tipini Type türünden döndüren ReturnType özelliği ve metotların parametrelerini ParameterInfo sınıfı türünden bir dizi olarak döndüren GetParameters() metodu da bu sınıfta bulunan üye elemanlardandır. Type sınıfının GetMethods() metodu bir türdeki tüm metotları bir MethodInfo sınıfı dizisi türünden döndürür. Ayrıca Type sınıfının GetMethods(BindingFlags kriterler) metodu bir türdeki belirli kriterlere uyan metotları bir MethodInfo dizisi olarak döndürür. BindingFlags System.Reflection isim alanındaki bir enumdur. BindingFlags enumundaki önemli sözcükler:

DeclaredOnly → Yalnızca ilgili türün kendi metotları diziye aktarılır. Kalıtım yoluyla gelenler aktarılmaz.
NonPublic → public olarak işaretlenmemiş metotlar
Public → public olarak işaretlenmiş metotlar
Static → static olarak işaretlenmiş metotlar
Type sınıfının GetMethod(string metotismi) metodu ilgili türdeki stringte verilen metodu MethodInfo türünden döndürür.
MethodInfo sınıfındaki IsStatic özelliği ilgili metot staticse true değilse false değer döndürür. Örnek program:

Farkındaysanız programımızda çok önceden gördüğümüz ?: operatörünü kullandık. Bu operatör if ile 3-4 satırda yazabileceğimiz kodu tek satıra indirdi. Başka bir örnek:

MethodInfo sınıfının IsStatic özelliği yanında IsAbstract, IsConstructor, IsPublic, IsPrivate, IsVirtual özellikleri de mevcuttur.

Metotların parametreleriyle ilgilenen bir sınıftır. Bir metodun parametrelerini elde etmek için MethodInfo sınıfının GetParameters() metodu kullanılabilir. MethodInfo sınıfının GetParameters() metodu bir ParameterInfo dizisi döndürür. ParameterInfo sınıfının ParameterType özelliği ilgili parametrenin türünü Type türünden döndürür. Yine ParameterInfo sınıfının Name özelliği ilgili parametrenin ismini string olarak döndürür.

Bir türün yapıcı metoduyla ilgilenir. Type sınıfının GetConstructors() metodu bu sınıf türünden bir dizi döndürür. Bu sınıfa ait en önemli metot GetParameters() tır. ParameterInfo sınıfı türünden bir dizi döndürür.

Bu sınıflar sırasıyla bir türdeki sahte özellikler, normal özellikler ve olaylarla ilgilenir. Type sınıfının GetProperties(), GetFields() ve GetEvents() metotları bu sınıflar türünden dizi döndürürler. Her üç sınıfta da Name özelliği mevcuttur. EventInfo sınıfının şu önemli özellikleri mevcuttur.

IsMulticast → Olayın multicast olup olmadığını verir.
EventHandlerType → Olayın türünü RuntimeType türünden verir. (Bir temsilci)
NOT: Type sınıfının GetMethods(), GetProperties() gibi metotları yalnızca public üye elemanları döndürür.
NOT: Gördüğümüz MethodInfo, EventInfo gibi sınıfların tamamı System.Reflection isim alanındadır. Yalnızca Type System isim alanındadır. Yine konuyu işlerken karşımıza çıkan enumlar da System.Reflection isim alanındadır.

Şimdiye kadar metotlarımızı derleme zamanında çağırdık. Ancak artık System.Reflection isim alanındaki sınıflar sayesinde metotlarımızı çalışma zamanında çağırabileceğiz. Bunun için MethodInfo ve ConstructorInfo sınıflarında bulunan

metodunu kullanacağız. Eğer ConstructorInfo sınıfındaki metodu çağırırsak çalışma zamanında nesne oluşturmuş oluruz. Invoke() metodunun birinci parametresi metodun hangi nesne üzerinden çağrılacağını belirtir. İkinci parametre ise çağrılacak metoda verilecek parametreleri içeren object tipinden bir dizidir. Çalışma zamanında çağrılacak metot static ise birinci parametre null olmalıdır. Benzer şekilde çağrılacak metot parametre almıyorsa ikinci parametre null olmalıdır. Programımız şu şekilde:

Bu program sonucunda ekrana 14 yazılacaktır. Burada MetotInvoke() metodu kendimizin oluşturduğu bir metottur. Kendiniz bu metoda farklı isimler verebilirsiniz. Bu metodun Invoke() metoduna iletilecek veriler için bir "ulak" vazifesi görmektedir. Yani bu metodun yaptığı tek iş Invoke() metoduna gerekli dönüşümleri yaparak ve gerekli hata durumlarını göz önünde bulundurrarak gerekli verileri iletmektir. Programın kritik satırları şunlardır:

Birinci ve ikinci satırda çalıştırılmak istenen metodun static mi değil mi olduğu kontrol ediliyor. Eğer staticse metoda herhangi bir nesne üzerinden erişilmiyor. Üçüncü satırda System isim alanındaki Activator sınıfındaki CreateInstance() metoduyla yeni bir nesne oluşturuluyor. Bu metot parametre olarak nesnenin hangi türden oluşturulacağını belirten Type türden bir tür alır. Son satırda ise oluşturulan söz konusu nesneyle ve parametrelerle metot çağrılıyor.

Bu kısımda .Net Framework sınıf kütüphanesinin en tepesinde bulunan System isim alanındaki önemli türleri yakından inceleyeceğiz. Hatırlarsanız bu isim alanındaki rastgele sayı üretmeye yarayan Random sınıfını, matematiksel işlemler yapmamızı sağlayan Math sınıfını ve türler arasında dönüşüm sağlayan Convert sınıfını daha önce incelemiştik. Şimdi ise C#'ta tarih-saat işlemleriyle ilgili üye elemanlar barındıran DateTime ve TimeSpan yapılarını, çöp toplama mekanizmasıyla ilgili üye elemanlar barındıran GC sınıfını, verilerin baytlarıyla ilgili işlemler yapmamıza yarayan BitArray ve Buffer sınıflarını, dizilerle ilgili işlemler yapmamızı sağlayan Array sınıfını ve C#'taki temel tür yapılarını ayrıntılarıyla işleyeceğiz.

Daha önce söylemiştim, ancak yine de hatırlatmak istiyorum. C#'taki temel veri türleri aslında System isim alanındaki bazı yapılardan başka bir şey değildir. int, float, vb. System isim alanındaki Int32, Single, vb. yapılarına verilen takma isimden başka bir şey değildir. Yani C#'ın programlarımızın başına using int=System.Int32; satırını gizlice eklediğini düşünebilirsiniz. Aşağıdaki tabloyu inceleyiniz:

Tahmin edersiniz ki bu yapıların üye elemanları da vardır. Önce özellikleri inceleyelim:
MaxValue İlgili veri türünün tutabileceği maksimum değeri ilgili veri türünden tutar. string, object ve bool türü haricindekilerle kullanılabilir. Örnek:

MinValue İlgili veri türünün tutabileceği minimum değeri ilgili veri türünden tutar. string, object ve bool türü haricindekilerle kullanılabilir. Örnek:

Epsilon Yalnızca Single ve Double ile kullanılabilir. En küçük pozitif değeri ilgili veri türünden tutar. Örnek:

NaN Herhangi bir sayıyı temsil etmeyen değer (ilgili türde). Yalnızca Single ve Double ile kullanılabilir. Örnek:

NegativeInfinity Negatif sonsuz (ilgili türde). Yalnızca Single ve Double ile kullanılabilir. Örnek:

PositiveInfinity Pozitif sonsuz (ilgili türde). Yalnızca Single ve Double ile kullanılabilir. Örnek:

Şimdi de metotlar:
Parse() String türünden veriyi ilgili türe çevirir. String ve object hariç bütün türlerle kullanılabilir. Aslında Parse() metodunun yaptığı iş stringin tırnaklarını kaldırmaktır. Stringin tırnakları kaldırılmış hâli hedef türle uyumluysa dönüşüm gerçekleşir. Örneğin string türündeki veri "true" ise Boolean türüne dönüşebilir. Ancak Int32 türüne dönüşmez. Benzer şekilde stringin içindeki karakter sayısı bir taneyse char'a dönüşebilir. Aksi bir durumda dönüşmez. Eğer dönüşüm gerçekleşmezse çalışma zamanı hatası alırsınız. Örnek:

CompareTo() Bu metotla, metodu çağıran veriyle parametre kıyaslanır. Metodu çağıran büyükse pozitif, parametre büyükse negatif, eşitlerse 0 değeri döndürür. Geri dönüş tipi inttir. Bütün türlerle kullanılabilir, ancak metodu çağıran object olamaz. Parametredeki verinin türü metodu çağırandan küçük ya da eşit kapasiteli olmalıdır. Bool türüyle bool türü kıyaslanabilir. true 1, false 0'mış gibi ele alınır. String türündeyse iki string aynıysa 0, diğer durumlarda 1 değeri geri döndürür. Örnek:

Equals() Bu metotla, metodu çağıran veriyle parametre kıyaslanır. Eşitlerse true, eşit değillerse false değeri geri döndürür. Bütün türlerle kullanılabilir. Hatasız sonuçlar için parametrenin tipi metodu çağırandan küçük ya da eşit kapasiteli olmalıdır. Uyumsuz türler kıyaslanırsa hata vermez, false değeri geri döndürür. Örnek:

ToString() Verilerin stringe dönüşmüş hâllerini tutar. Parse'ın tersidir diyebiliriz. Bütün türlerle kullanılabilir. Örnek:

IsInfinity() Parametredeki Single ya da Double türündeki veri sonsuz ise true, değilse false değeri üretir. Örnek:

IsNaN() Parametredeki Single ya da Double türündeki veri NaN (sayı olmayan) ise true, değilse false değeri üretir. Örnek:

IsPositiveInfinity() Parametredeki Single ya da Double türündeki veri pozitif sonsuzsa true, değilse false değeri döndürür. Örnek:

IsNegativeInfinity() Parametredeki Single ya da Double türündeki veri negatif sonsuzsa true, değilse false değeri döndürür. Örnek:

GetNumericValue() Yalnızca Char yapısında bulunur. Char tipindeki parametre numerikse o sayıyı döndürür, numerik değilse negatif sayı döndürür. Geri dönüş tipi double'dır. Örnek:

Şimdi bir metot grubu inceleyelim. Aşağıdaki metotların tamamı yalnızca Char yapısında bulunur, tamamı static'tir ve tamamının iki farklı prototipi vardır. Birinci prototip:

Bu metot prototipinde char türünden veri metoda sokulur.

Bu metot prototipinde string içindeki int'te belirtilen indeks numarasındaki karakter metoda sokulur.
Bu metotların tamamının geri dönüş tipi bool'dur, belirtilen koşul sağlanmışsa true, sağlanmamışsa false değeri döndürür. Şimdi bu metotlar:

Şimdi bunlara iki örnek verelim:

veya

Şimdi iki metot inceleyelim. Bu metotların ikisi de yalnızca Char yapısında bulunur. Parametre olarak Char türünden veri alırlar. İkisi de statictir.
ToLower Parametresinden aldığı char'ı küçük harfe dönüştürüp char olarak tutar.
ToUpper Parametresinden aldığı char'ı büyük harfe dönüştürüp char olarak tutar.
Bu iki metot, parametre mantıksal olarak dönüştürülemeyecekse karakteri olduğu gibi tutar. Örneğin ToLower metodu parametre olarak 'h' veya '%' almışsa karakterde herhangi bir değişim yapmadan tutar.
Şimdi iki özellik inceleyelim. Bu iki özellik yalnızca Boolean yapısında bulunur ve False ve True stringlerini üretir. Örnekler:

C# Decimal isminde diğer dillerden farklı bir veri türü barındırır. Değişkenler konusunu hatırlarsanız Decimal türü 16 bayt ile en fazla boyuta sahip olan türdü. Ancak işin enteresan tarafı kapasitesi çok da fazla değildi. Kapasitesi 8 byte olan double, decimaldan kat be kat fazla veri depolayabiliyordu. İşte şimdi decimal türünün sırrını göreceğiz.
Decimal türü System isim alanındaki Decimal yapısıyla temsil edilir. Decimal veri türünün bellekte saklanması diğer türlere nazaran biraz karmaşıktır. Bu yüzden bilgisayarların decimal türüyle işlem yapması biraz daha zordur. Decimal türünden bir nesne çok değişik yollarla tanımlanabilir. Örnekler:

Gördüğünüz gibi Decimal yapısının bir yapıcı metodu varmış. Bu yapıcı metoda parametre olarak int, uint, long, ulong, float ve double türünden veri verilebilir. Başka bir tanımlama şekli

buradaki alt 128 bitlik (yani 16 baytlık) sayının ilk 32 bitini, orta sonraki 32 bitini, ust sonraki 32 bitini temsil eder. işaret true olursa sayı negatif, false olursa pozitif olur. Son olarak ondalık da sayının ondalık kısmını ayırmak için kullanılan noktanın sağdan kaçıncı basamakta olduğunu, diğer bir deyişle sayının ondalıklı kısmının kaç haneli olacağını belirtir. Şimdi bir örnek:

Bu koda göre a sayısı 1287.55'tir. Şimdi yalnızca Decimal yapısına özgü metotları inceleyelim:
ToByte(), ToSbyte, ToInt16, ToUInt16, ToInt32, ToUInt32, ToInt64, ToUInt64, ToSingle() ve ToDouble() metotlarının tamamı statictir, parametre olarak decimal türünden veri alırlar ve ilgili türdeki veriyi üretirler. Yani tür dönüşümü yaparlar. Bir örnek:

Şimdi decimal sayılar üzerinde çeşitli işlemler yapan metotlara geçelim: 
d1 ve d2 decimal türünden iki veri olmak üzere

Decimal sayıların normal sayılardan en önemli farklarından biri de şudur:

Bu program ekrana alt alta 2 ve 2,00 yazar. Yani normal sayılarda ondalık kısımdaki etkisiz sıfırlar sonuca yansımazken, decimal sayılarda yansır. Decimal sayılar daha çok ekonomi, bankacılık, para, muhasebe, vb. ile ilgili yazılım geliştirirken kullanılır.

Array sınıfındaki birçok metodu ve özelliği daha önce görmüştük. Burada yalnızca hatırlatma yapacağım ve birkaç yeni üye eleman göreceksiniz.

IsFixedSize Dizinin eleman sayısı sabitse true, değilse false değeri verir. Henüz eleman sayısı sürekli değişen dizileri görmediğimiz için sonucu daima true olacaktır. Örnek (dizi bir dizi olmak üzere):

IsReadOnly Dizideki elemanlar salt-okunur ise true, değilse false değeri verir. Henüz salt-okunur dizileri görmediğimiz için bunun sonucu da daima false olacaktır Örnek.

Length Dizideki eleman sayısını verir (int). Örnek:

Rank Dizinin kaç boyutlu olduğunu verir (int). Örnek:

BinarySearch, Clear, Copy, CopyTo, GetLength, GetValue, Reverse, SetValue, Sort ve CreateInstance metotlarını diziler konusunda ayrıntılı olarak görmüştük. Burada henüz görmediğimiz bir metodu tanıtmak istiyorum. IndexOf metodu bir elemanın bir dizi içinde ilk görüldüğü indeksi verir. Örnek:

Bu kod ekrana 4 yazar.

Hatırlarsanız önceki konularımızın birinde Zaman sınıfı oluşturmuş ve iki zaman nesnesiyle çeşitli işlemler yapmıştık. Aslında şimdi göreceğimiz DateTime ve TimeSpan yapıları da benzer işleve sahip. DateTime yapısı belirli bir zamanı tutmaya yararken, TimeSpan ise zamanın miktarıyla ilgilenir. Şimdi bir örnek yapalım:

Bu kod ekrana

En küçük: 01.01.0001 00:00:00
En büyük: 31.12.9999 23:59:59

çıktısını verecektir. Gördüğünüz gibi DateTime yapısına ait olan MinValue ve MaxValue özellikleri -tıpkı temel veri türlerinde olduğu gibi- DateTime yapısının tutabileceği en büyük ve en küçük verileri veriyor. Şimdi başka önemli özelliklere bakalım:
Now şimdiki saati, Today bugünü DateTime türünden verir. Örnek:

Bu kodun ekran çıktısı şuna benzer:

25.12.2008 16:52:25
25.12.2008 00:00:00

Aynı işlemler DateTime yapısı türünden nesne oluşturularak da yapılabilir. Örnek:

Şimdi de DateTime yapısına ait diğer güzel özellikleri inceleyelim, bunlar static değildir, yani DateTime türündeki nesnelerle erişilir
Date DateTime nesnesine ilişkin saat dışındaki bilgiyi verir. (DateTime)
Month DateTime nesnesinin ay bilgisini verir. (int)
Day DateTime nesnesinin gün bilgisini verir. (int)
Year DateTime nesnesinin yıl bilgisini verir. (int)
DayOfWeek DateTime nesnesinin haftanın kaçıncı günü olduğunu verir. (DayOfWeek enum sabiti)
DayOfYear DateTime nesnesinin yılın kaçıncı gününe denk geldiğini verir. (int)
TimeOfDay Geçerli gün için 00:00:00'dan itibaren ne kadar zaman geçtiğini TimeSpan nesnesi olarak verir. (TimeSpan)
Hour DateTime nesnesinin saat bilgisini verir. (int)
Minute DateTime nesnesinin dakika bilgisini verir. (int)
Second DateTime nesnesinin saniye bilgisini verir. (int)
Milisecon

Sınıflar nesne yönelimli programlamanın en önemli ögesidir. Sınıflar sayesinde programlarımızı parçalara bölüp karmaşıklığını azaltırız.
C#'ta metotlar ve özellikler mutlaka bir sınıfın içinde olmalıdır. Metotlar bir veya daha fazla komutun bir araya getirilmiş halidir; parametre alabilirler, geriye değer döndürebilirler. Özellikler ise bellek gözeneklerinin programlamadaki karşılıklarıdır. Bu bakımdan özellikler değişkenlere benzerler. Aradaki en temel fark değişkenlerin bir metot içinde tanımlanıp yalnızca tanımlandığı metot içinde etkinlik gösterebilmesine rağmen özelliklerin tıpkı metotlar gibi bir üye eleman olmasıdır. Bu bakımdan özelliklerin tuttuğu değerlere daha fazla yerden erişilebilir.

Üç özelliği ve iki metodu olan örnek bir sınıf oluşturulması: 

Burada dikkatinizi public ve private anahtar sözcükleri çekmiş olmalı. Bir metot ya da özelliğe bulunduğu sınıfın dışından da erişilebilmesini istiyorsak public sözcüğü kullanılır. private sözcüğü kullanmakla hiçbir şey yazmamak aynı etkiye sahiptir ve iki durumda da metot ya da özelliğe yalnızca bulunduğu sınıfın içinden erişilebilir. Bu sınıftaki yalnızca ozellik1 özelliğine ve metot1 metoduna SinifIsmi sınıfının dışından erişilebilir. Diğer özellik ve metotlara erişilemez. Şimdi bu sınıfı programımızda kullanalım:

Bu programda SinifIsmi sınıfındaki bütün özellik ve metotların public anahtar sözcüğü ile belirtildiğine dikkat edin. Oluşturduğumuznesne nesnesiyle sınıfın bütün özellik ve metotlarına eriştik. ozellik1, ozellik2 ve ozellik3 özelliklerine hiçbir değer atanmamış, ancak programımız hata vermedi, sadece derleme sonunda uyarı verdi. Çünkü SinifIsmi nesne=new SinifIsmi(); satırındaki new anahtar sözcüğü sayesinde sınıftaki bütün özellikler nesne nesnesi için türlerine göre varsayılan değere atandı. Eğer SinifIsmi nesne=new SinifIsmi(); yerine SinifIsmi nesne; yazsaydık programımız hata verirdi. Ayrıca programımızda metot2 metodu değer tutan değil, iş yapan bir metot, o yüzden tek başına kullanıldı. Başka bir örnek:

Bu programda ise özelliklere önce değer verdik ve esas programda da bu değerler ekrana yazıldı.
NOT: Tipi bir dizi olan bir özelliğe ilk değer verirken kısa dizi notasyonunu kullanabiliriz (değişkenlerde yaptığımız gibi). Örnek:

Bu şekildeki kısa dizi notasyonu sadece değişkenlere ve özelliklere tanımlandığı satırda ilk değer verirken kullanılabilir.

Tahmin edebileceğiniz gibi C#'ta aynı sınıf türünden birden fazla nesne oluşturulabilir ve bu nesnelerle sınıfın özellik ve metotlarına erişilebilir. Örnek:

Burada KrediHesabi sınıfı türünden hesap1 ve hesap2 adlı iki nesne tanımlandı ve bu nesnelerle KrediHesabi sınıfının HesapNo özelliğine erişildi. Burada bilmemiz gereken şey farklı nesnelerle bir sınıfın özelliğine erişip özelliğin değerini değiştirdiğimizde aslında birbirinden farklı değişkenlerin değerini değiştirmiş olmamızdır. Bu program ekrana alt alta 3456 ve 1111 yazacaktır. Çünkü KrediHesabi hesap1=new KrediHesabi(); ve KrediHesabi hesap2=new KrediHesabi(); satırlarıyla birbirinden farklı iki nesne oluşturduk ve bu iki nesne için bellekte ayrı ayrı alan tahsisatı yaptık. Eğer programı şöyle değiştirirsek,

Bu durumda alt alta 1111 ve 1111 yazılacaktır. Çünkü KrediHesabi hesap2=hesap1; satırıyla KrediHesabi sınıfı türünden yeni bir nesne oluşturduk ancak bu nesne için bellekte ayrı bir alan tahsisatı yapmadık. Nesneyi hesap1 nesnesinin bellekteki adresine yönlendirdik. Dolayısıyla hesap1'in özelliğinde yapılan bir değişiklik hesap2'yi, hesap2'nin özelliğinde yapılan bir değişiklik de hesap1'i etkileyecektir. Başka bir örnek program:

Gördüğünüz gibi özellik ve metot tanımlamaları için ayrı bir sınıf oluşturmak zorunda değiliz. Main() metodunun olduğu sınıfa istediğimiz üye elemanları ekleyebiliriz. Bu durumda da özelliğine erişebilmek için a özelliğini public olarak belirtme zorunluluğundan da kurtulmuş olduk.
NOT: Farkındaysanız şimdiye kadar hiçbir metot ya da özelliğimizi static anahtar sözcüğüyle belirtmedik. static anahtar sözcüğüyle belirttiğimiz metot ya da özellikleri direkt olarak söz konusu metot ya da özelliğin adını yazarak kullanabilriz. Örnek:

Bu program ekrana 0 yazacaktır. Eğer a'ya bir değer verseydik o değer yazacaktı.
NOT: Diziler tıpkı değişkenler gibi birbirine atanabilirler. Örnek:

Burada b dizisine a dizisi adres gösterme yoluyla aktarılmıştır, dolayısıyla da a dizisinin bir elemanında yapılan bir değişiklik b dizisini, b dizisinin bir elemanında yapılan bir değişiklik a dizisini etkileyecektir. Çünkü diziler birbirlerine adres gösterme yoluyla atanır. Ayrıca aşağıdaki gibi bir kullanım da doğrudur:

Burada b dizisi sahip olduğu elemanları kaybedip a dizisinin adresine yönlendi. Bu ve benzer şekilde diziler birbirlerine atanabilir. Yani aynı adrese yönlendirilebilirler.

Bu program bir metoda girilen iki parametreyi ve bunların çarpımını ekrana yazar. Eğer bir dikdörtgen söz konusu olduğunu düşünürsek dikdörtgenin enini, boyunu ve alanını ekrana yazar.

Bu program Main blokundan çalışmaya başlar. Önce Dortgen sınıfı türünden d1 nesnesi oluşturulur. Bu nesneyle Dortgen sınıfındaki EnBoyBelirle metodu çalıştırılır. Bu metot geçerli nesne için En ve Boy özelliğini metoda girilen parametreler yapar. Sonra aynı nesneyle Yaz metodu çalıştırılıyor. Yaz metodu da geçerli nesnenin özelliklerini ve Alan metodunun sonucunu ekrana yazdırıyor. Sonra aynı olaylar d2 nesnesi için de gerçekleşiyor. Burada önemli olan bir sınıf türünden oluşturduğumuz her bir nesne için bellekte o sınıftaki tüm metot ve özellikler için bir yer açılması ve tüm işlemlerin o bellek bölgesinde yapılması olayını kavramamız. Ayrıca gördüğünüz gibi static olmayan metotların gövdesinde aynı sınıftaki özellik ve metotlar static olsun olmasın direkt olarak kullanılabiliyor. Ancak programı şöyle değiştirseydik hata çıkacaktı.

Çünkü burada En ve Boy özellikleriyle Alan() metodu tek başına kullanılamaz. Önce Dortgen sınıfı türünden bir nesne oluşturup bu nesne üzerinden bu özellik ve metotlara erişilmelidir. Çünkü Main metodu static bir metottur. Başka bir örnek:

Bu program da geçerlidir. Başka bir örnek:

Bu program çalışmaz. Çünkü, static olmayan metotların gövdesinde sadece aynı sınıftaki özellik ve metotlar static olsun olmasın direkt olarak kullanılabilir.
Şimdi evimizin üyelerinin (annemizin, babamızın vs.) özelliklerini gireceğimiz, yaşlarını hesaplayacağımız daha zevkli bir örnek yapalım. Yani evimizi bir sınıfmış gibi düşünelim.

Şimdi bu programda ufak bir oynama yapalım:

Gördüğünüz gibi annemin özellikleri girilmesine rağmen OzellikleriYaz metodu çağrılmadığı için özellikler ekrana yazılmadı. Ayrıca da babama da herhangi bir özellik girilmemesine rağmen OzellikleriYaz metoduyla ekrana yazdırdık. Ekrana bütün özelliklerin varsayılanları yazıldı. Çünkü EvHalki babam=new EvHalki(); satırındaki altı çizili kısım sayesinde bellekte babam nesnesi için ayrı bir yer ayrıldı ve bütün özellikler varsayılan değere atandı. Yalnızca EvHalki babam; satırı olsaydı Evhalki sınıfı türünden babam nesnesi oluşturulurdu, ancak bellekte bu nesne için ayrı bir yer ayrılmazdı.

Şimdi şöyle bir program yazalım:

Tahmin edebileceğiniz bu programda önce d1 nesnesinin En ve Boy özelliğini sırasıyla 20 ve 50 olarak ayarlıyoruz, sonra da bu d1 nesnesinin özelliklerini ekrana yazdırıyoruz. Bu programı şöyle de yazabilirdik:

Buradaki this anahtar sözcüklerinin Türkçe karşılığı "beni çağıran nesnenin"dir. Peki ama zaten this'i yazmasak da aynı şey olurdu. Şimdi başka bir örnek yapalım:

C# bu şekilde bir kullanıma izin verir. Çünkü Main blokunda EnBoyBelirle metodunu çalıştırdığımızda sadece EnBoyBelirle metodu çalışır, dolayısıyla da derleyici bu metottan önce tanımlanmış olan En ve Boy özelliklerini görmez. Burada alınan parametreler En ve Boy değişkenlerine atanıyor. Sonra En=En; ve Boy=Boy; satırlarıyla da aslında alınan parametreler yine aynı değişkenlere atanıyor. Tahmin edebileceğiniz gibi aslında burada bizim yapmak istediğiniz aldığı parametreleri d1 nesnesinin En ve Boy özelliklerine aktarmak. İşte bunun için this anahtar sözcüğünü kullanılırız:

Bu programda artık EnBoyBelirle metodunun aldığı parametreler d1 nesnesinin özelliklerine atanacaktır. Benzer şekilde C# aşağıdaki gibi bir kullanıma da izin verir.

Eğer En ve Boy değişkenleri Main blokunun içinde tanımlanmasaydı programımız hata verecekti. Başka bir örnek:

Burada ekrana sırasıyla 50 ve 100 yazılacaktır. Ancak;

Bu sefer de ekrana sırasıyla 8 ve 100 yazıldı. Çünkü derleyici En değişkenini Main bloku içinde bulamayınca sınıfın bir özelliği olan En'i ekrana yazdı. En ve Boy özellikleri static olarak tanımlandığı için bu özelliklere nesne oluşturmaya gerek kalmadan direkt erişebildik.

Şimdi aşağıdaki küçük programı yazalım:

Bu program oldukça basit. YardimciSinif sınıfının iki tane metodu ve bir tane de özelliği var. Ancak özellik private olduğu için bu özelliğe başka bir sınıftan erişmek veya değiştirmek mümkün değil. Bu yüzden bu özelliği değiştirmek veya bu özelliğe erişmek istediğimizde public olan SayiBelirle ve SayiAl metotlarını kullandık. Peki bunun bize ne faydası var? Aslında Sayi özelliğini public olarak ayarlayıp direkt olarak özellik üzerinde işlem yapılabilirdi. İşte faydası:  

Gördüğünüz gibi özelliğe değer atamayı ve özelliğin değerini ekrana yazdırmayı metotlar sayesinde koşullandırabildik. Eğer direkt özellik üzerinde işlem yapmaya kalkışsaydık böyle bir şansımız olmazdı. Şimdi benzer bir durumu set ve get sözcükleriyle oluşturalım:

Gördüğünüz gibi önce YardimciSinif sınıfında SahteOzellik adlı bir özellik oluşturduk. Bu özellik gerçekten de sahtedir. Özelliğe bir değer atanmaya çalışıldığında set blokundaki, özellik kullanılmaya çalışıldığında da get blokundaki komutlar çalıştırılır. Aslında C# kütüphanesindeki özelliklerin çoğu bu yöntemle oluşturulmuştur. Örneğin ileride göreceğimiz Windows programlamada bir buton nesnesinin Text özelliğini değiştirdiğimizde butonun üzerindeki yazı değişir. Halbuki klasik özelliklere değer atama yönteminde sadece özelliğin değeri değ

I/O İngilizce Input/Output'un kısaltmasıdır, Türkçeye girdi/çıktı olarak çevirebiliriz. Ancak I/O bilgisayar ve programlama dünyasında artık bir terim hüviyetine kavuştuğu için I/O olarak kullanmayı tercih ediyorum. Dosya kaydetme, ekrana ya da yazıcıya bilgi yazdırma, klavyeden bilgi girişi birer I/O işlemleridir. I/O işlemlerini System.IO isim alanının altındaki çeşitli sınıflarla yaparız. Şimdi isterseniz lafı fazla uzatmadan dosya ve klasör işlemleriyle ilgili sınıflara geçelim.

Directory sınıfının hiçbir özelliği yoktur, System.IO altında bulunur, sadece static metotlar içerir.

adres ile belirtilen adreste bir klasör oluşturur ve bu klasör bilgilerini bir DirectoryInfo nesnesi olarak tutar. Programımızın çalıştığı klasörde bir klasör oluşturmak için sadece klasörün adını yazmak yeterlidir. Örnekler:

Bu kod C:\WINDOWS altında deneme isimli bir klasör oluşturur.

Bu kod programın çalıştığı klasörde deneme isimli bir klasör oluşturur.

 
Bu kod programın çalıştığı klasörün bir üst klasöründe deneme isimli bir klasör oluşturur.

Bu kod programın çalıştığı klasörün iki üst klasöründe deneme isimli bir klasör oluşturur. .. sayıları bu şekilde artırılabilir. Bu tür bir adres belirtme şekli bütün diğer metotlarda da geçerlidir. Ayrıca bu ve diğer bütün metotlarda da adres diye tarif ettiğimiz veriye dosya/klasörün adı da dâhildir.

Belirtilen adresteki boş klasörü silmek için kullanılır. Başka bir kullanımı daha vardır.

Bu metot ile eğer a true ise belirtilen adresteki klasör, içindeki bütün dosya ve klasörlerle birlikte silinir.

Belirtilen adresteki klasörün olup olmadığını bool cinsinden tutar. Klasör varsa true, yoksa false döndürür.

Çalışan programın hangi klasörde olduğunu verir. Örneğin Windows'taysak C:\WINDOWS'u tutar.

Belirtilen adresteki bütün klasörleri adresleriyle birlikte bir string dizisi olarak tutar.

Belirtilen adresteki klasörün kök dizin bilgisini verir. Örneğin adres C:\Program Files\CONEXANT\CNXT_MODEM_HDAUDIO_SprtHD5m ise C:\ değerini döndürür.

Belirtilen adresteki dosyaları adresleriyle birlikte string dizisi olarak tutar. Bu ve benzer metotlarda liste İngilizce alfabetik sırasına göredir. GetFiles() metodunun bir prototipi daha vardır:

Adresteki dosya(lar) adresleriyle birlikte string dizisi olarak tutulur. Dosya isminde joker karakterleri (*, ?) kullanılabilir.

Belirtilen adresteki bütün dosya ve klasörleri adresleriyle birlikte bir string dizisi olarak tutar.

Belirtilen adresteki dosya ya da klasöre en son ne zaman erişildiğini DateTime türünden tutar.

Belirtilen adresteki dosya ya da klasörün en son ne zaman değiştirildiğini DateTime türünden tutar.

Belirtilen adresteki dosya ya da klasörün ne zaman oluşturulduğunu DateTime türünden tutar.

Bilgisayardaki bütün sürücüleri bir string dizisi olarak tutar. Bu sürücülere her türlü sabit disk, CD-ROM sürücü, flash disk vb. dâhildir.

Belirtilen adresin bir üst klasörünü DirectoryInfo nesnesi olarak döndürür.

Dosya ve klasörleri bir konumdan başka bir konuma taşır. Örnekler:

Bu kod C:\Documents and Settings\Bekir Oflaz\Belgelerim altındaki Örnek dosya.rtf dosyasını C:\Web konumuna deneme.rtf adıyla taşır.

Bu kod sürücü klasöründeki Web klasörünü tüm içeriğiyle birlikte C:\Documents and Settings\Bekir Oflaz\Belgelerim klasörüne internet adıyla taşır. Eğer hedef klasörde aynı adlı dosya ya da klasör varsa çalışma zamanı hatası alırsınız.

Belirtilen adresteki dosya ya da klasörün en son erişim zamanını zaman olarak değiştirir.

Belirtilen adresteki dosya ya da klasörün en son değiştirilme zamanını zaman olarak değiştirir.

Belirtilen adresteki dosya ya da klasörün oluşturulma zamanını zaman olarak değiştirir.

Programın çalıştığı klasörü belirtilen adres ile değiştirir.

File sınıfındaki birçok metot Directory sınıfında da vardır, tek farkları aynı görevleri dosyalar için yerine getirmeleridir. Bu metotlar şunlardır: Exists(), Delete(), GetCreationTime(), GetLastAccessTime(), GetLastWriteTime(), Move(), SetCreationTime(), SetLastAccessTime(), SetLastWriteTime(). Şimdi File sınıfının Directory sınıfında olmayan metotlarına sıra geldi.

Adreste belirtilen dosya için daha sonra göreceğimiz bir StreamWriter nesnesi oluşturur.

Kaynakta belirtilen dosya hedefe kopyalanır. Kopyalamada bir isim çakışması söz konusuysa, yani sizin kopyalama yapmak istediğiniz klasörde zaten aynı isimli bir dosya varsa çalışma zamanı hatası alırsınız. Bunu önlemek içinse;

Burada a true olursa eğer hedef klasörde aynı adlı dosya varsa üstüne yazılır. a false yapılırsa iki parametreli hâlinden farkı kalmaz.

Belirtilen adresteki dosya oluştururlur ve dosyaya ilişkin FileStream nesnesi döndürülür. tampon yazılmazsa yani sadece bir parametre yazılırsa varsayılan tampon miktarı kullanılır.

Belirtilen adreste üzerine yazmak için bir text dosyası oluşturulur ve dosyaya ilişkin StreamWriter nesnesi döndürülür.

Belirtilen adresteki dosya ya da klasörün FileAttributes enumu cinsinden özniteliği döndürülür. FileAttributes enum sabiti şu sözcükleri içerir: Archive, Compressed, Device, Directory, Encrypted, Hidden, Normal, NotContentIndexed, Offline, ReadOnly, ReparsePoint, SparseFile, System, Temporary. Bir dosya ya da klasörün birden fazla özniteliği olabilir. Bu durumda öznitelikler virgülle ayrılır.

Üç farklı aşırı yüklenmiş çeşidi vardır. Bunlar:

Open() metodu belirtilen adresteki dosyayı açar ve dosyaya ilişkin FileStream nesnesini döndürür. FileMode, FileAccess ve FileShare System.IO isim alanında bulunan enumlardır ve dosyanın ne şekilde açılacağını ve üzerinde ne şekilde işlem yapılacağını belirtirler.

Append Açılan dosyanın sonuna ekleme yapmak için kullanılır. Eğer dosya bulunmazsa oluşturulur.
Create Yeni dosya oluşturmak için kullanılır. Zaten dosya varsa üzerine yazılır.
CreateNew Yeni dosya oluşturmak için kullanılır, belirtilen dosya mevcutsa çalışma zamanı hatası verdirir.
Open Dosyayı açmak için kullanılır.
OpenOrCreate Belirtilen dosya varsa açılır, yoksa yenisi oluşturulur.
Truncate Belirtilen dosya açılır ve içi tamamen silinir.

Read Dosya okumak için kullanılır.
ReadWrite Dosya okunmak ve yazılmak üzere açılır.
Write Dosya sadece yazılmak için açılır.

Inheritable Dosyanın child (yavru) prosesler tarafından türetilebilmesini sağlar.
None Dosyanın aynı anda başka prosesler tarafından açılmasını engeller.
Read Dosyanın aynı anda başka proseslerce de açılabilmesini sağlar.
ReadWrite Dosyanın aynı anda başka proseslerce de açılıp, okunup, yazılabilmesini sağlar.
Write Dosyaya aynı anda başka proseslerce yazılabilmesini sağlar.

Belirtilen dosyayı yalnızca okumak için açar ve dosyaya ilişkin FileStream nesnesini döndürür.

Belirtilen dosyayı yalnızca text modunda okumak için açar ve dosyaya ilişkin StreamReader nesnesini döndürür.

Belirtilen dosyayı yazma modunda açar ve dosyaya ilişkin FileStream nesnesini döndürür.

DirectoryInfo sınıfı Directory sınıfının aksine static olmayan metot ve özellikleri içerir. Önce özellikleri bir örnek üzerinde görelim:

Şimdi de DirectoryInfo sınıfının metotlarına geçelim. Bu metotların tamamı static değildir. Bu metotların çalışması için gereken adres bilgisi, kendisine ulaşılması için kullanılan DirectoryInfo nesnesindedir.

Klasör oluşturur.

Belirtilen adreste bir alt dizin oluşturur. Örneğin C:\deneme altında \deneme2\deneme3 dizini oluşturmak için şu kodları yazarız.

Gördüğünüz gibi CreateSubdirectory metodu kendisine ulaşılan nesne içinde parametredeki klasörü oluşturuyor ve oluşturduğu klasörü de DirectoryInfo nesnesi olarak döndürüyor.

İki farklı aşırı yüklenmiş versiyonu vardır.

Birincisinde klasör boşsa silinir, ikincisinde a true ise klasör, içindeki her şeyle silinir.

İlgili klasörde bulunan bütün dizinleri bir DirectoryInfo dizisinde tutar.

İlgili klasörde bulunan bütün dosyaları bir FileInfo dizisinde tutar.

İlgili klasördeki bütün dosya ve klasörler bir FileSystemInfo dizisinde tutulur.

İlgili dizin, içindeki tüm dosya ve klasörlerle beraber hedefe taşınır.

İlgili klasörün özelliklerini diskten tekrar yükler.
NOT: Bütün taşıma ve kopyalama işlemlerinde kaynak ve hedef aynı sürücüde olmalıdır.

Önce özellikleri bir örnek üzerinde görelim. Kodu yazmadan önce kendiniz C:\WINDOWS klasöründe deneme.txt dosyasını oluşturun.

Şimdi metotlara geçelim. FileInfo sınıfı File sınıfındaki AppendText(), Create(), CreateText(), Delete(), Open(), OpenRead(), OpenText() ve OpenWrite() metotlarını içerir. Bunları tekrar anlatmayacağım. File sınıfında olmayan metotlarsa;

İki aşırı yüklenmiş versiyonu vardır:

Birincisinde ilgili dosya hedefe kopyalanır. Hedefte aynı adlı dosya varsa çalışma zamanı hatası alırsınız. İkincisinde a true ise, hedefte aynı adlı dosya varsa üzerine yazılır.

İlgili dosya hedefe taşınır.

İlgili dosyanın bilgileri diskten tekrar alınır.

Path sınıfı çeşitli işlemler yapan static üye elemanlara sahiptir. Örnek program:

FileStream sınıfı ile diskteki bir dosya açılır. StreamReader ve StreamWriter sınıflarıyla üzerinde işlem yapılır. Dosyalar üzerinde metin tabanlı ve bayt tabanlı işler yapabiliriz. Bir FileStream nesnesi çok değişik yollarla oluşturulabilir. Örnekler:

Bu nesne yaratımlarındaki FileMode, FileAccess ve FileShare enumlarını önceden görmüştük. Dosyayla ilgili işlemimiz bittiğinde FileStream sınıfının Close() metodu ile FileStream nesnesi tarafından tutulan kaynaklar boşaltılır ve dosyayı başka prosesler kullanabilir hâle gelir. Close() metodunun kullanılışı:

FileStream sınıfının Read() ve ReadByte() metotları dosya akımından byte düzeyinde veri okumamızı sağlarlar. ReadByte() metodu akımdan okuma yapamadığı zaman geriye -1 değerini döndürür. ReadByte() metodunun prototipi:

Bu metot ile akımdan bir baytlık bilgi okunur ve akımdaki okuma pozisyonu bir artırılır ki tekrar okuma da aynı değer okunmasın. Okunan byte değeri inte dönüştürülüp int olarak tutulur. İkinci metodumuz ise:

Bu metot ile adet kadar bayt akımdan okunur, okunan bu baytlar dizi dizisine baslangic indeksinden itibaren yerleştirilir. Geri dönüş değeri okunan byte sayısıdır. Şimdi komut satırı ar

Şimdiye kadar öğrendiklerimiz türler sınıflar, yapılar, enumlar ve arayüzlerdi. Şimdi temsilci isminde yeni bir tür daha öğreneceğiz. Temsilcilerin nesneleri oluşturulabilir ve bu nesneler metotları temsil ederler. Temsilci bildirimi delegate anahtar sözcüğü ile yapılır. Bir temsilci bildirim taslağı şu şekildedir:

Bu taslağa göre örnek bir temsilci bildirimi şöyle yapılır:

Temsilcilerin bir tür olduğunu ve tür tanımlarının sınıf veya isim uzayı kapsamında yapıldığını, bu yüzden metot içinde tanımlayamayacağımızı tekrar hatırlayalım. Temsilciler erişim belirleyicisi alabilir. Temsilciler genellikle programlarımıza belirli bir ifadeyle birden fazla metodu çağırabilme yeteneği vermek için kullanılır. Örnek program:

Bu program ekrana alt alta Burası Metot1() ve Burası Metot2() yazacaktır. Yani bir sınıf nesnesi oluşturur gibi bir temsilci nesnesi oluşturuyoruz. Yapıcı metoda parametre verir gibi temsilci nesnesinin hangi metodu temsil edeceğini belirtiyoruz. Sonra bu temsilci nesnesi üzerinden temsil edilen metodu çalıştırıyoruz. Daha sonra temsilci nesnesinin değerini yani hangi metodu temsil ettiğini değiştirebiliyoruz. Burada dikkat etmemiz gereken nokta temsilci nesnesinin geri dönüş tipi ve parametre olarak kendiyle uyumlu metodu temsil edebileceğidir. Erişim belirleyicisi, static olup olmama durumu, vs. bu uyuma dâhil değildir. Bu örneğimizde parametre almayan ve geri dönüş tipi void olan temsilcimiz her iki metodu da temsil edebildi.
NOT: Temsilciler sınıfların taşıdığı özelliklerin bazılarını taşırlar. Örneğin bir metot parametre olarak bir temsilci tipinden nesne kabul edebilir veya bir türün bir özelliği bir temsilci tipinden olabilir.

Şimdiye kadar bir temsilci nesnesi aynı anda yalnızca bir tane metodu temsil edebiliyordu. Artık bir temsilci nesnesinin aynı anda birden fazla metodu temsil edebilmesini sağlayacağız. Bu sayede temsilci nesnesi çağrıldığında temsil ettiği bütün metotlar sırasıyla çalıştırılacaktır. Bir temsilci nesnesinin birden fazla metodu temsil etmesini sağlamak için += ve -= operatörleri kullanılır. += operatörü temsilci nesnesine metot eklemek için, -= operatörü ise temsilci nesnesinden metot çıkarmak için kullanılır. Aslında aynı iş için + ve - operatörlerini de kullanabilirdik. Ancak += ve -= bu işi biraz olsun kolaylaştırıyor. Örnek:

Bu programın ekran çıktısı şöyle olacaktır:

Metot2 çağrıldı.
Metot1 çağrıldı.
Metot3 çağrıldı.
***
Metot2 çağrıldı.
Metot3 çağrıldı.

Yani metotların çalışma sırası metotların temsilci nesnesine eklenme sırasıyla aynıdır. Eğer programda Metot1 temsilci nesnesine tekrar eklenirse bu sefer Metot1() en sona geçecektir.
NOT:

satırlarıyla

satırları denktir.

Temsilciler statik metotlar yanında statik olmayan metotları da temsil edebilir. Bunun için temsilci nesnesini oluştururken parantez içine nesne.MetotIsmi yazarız. Örnek:

Bu durumda temsilci nesnesi hem metodu, hem o metodun üzerinden çağrıldığı nesneyi temsil eder.

Oluşturduğumuz bütün temsilci tanımları gizlice MulticastDelegate sınıfından türerler. Yani oluşturduğumuz temsilci nesneleriyle bu sınıfın üye elemanlarına erişebiliriz. Delegate sınıfı MulticastDelegate sınıfının anasıdır. Delegate ve MulticastDelegate sınıfları birer özet sınıf oldukları için
new anahtar sözcüğüyle bu sınıflar türünden nesne yaratamayız. Yalnızca kendi yarattığımız temsilci nesneleri üzerinden bu sınıfların üye elemanlarına erişebiliriz. Şimdi isterseniz MulticastDelegate sınıfının bazı üye elemanlarını görelim:

public override sealed Delegate[] GetInvocationList() Bu metot bir temsilcideki bütün metotları bir Delegate dizisine aktarır. İmzasından gördüğünüz üzere Delegate sınıfının metodunu override etmiştir, ancak kendisi yavru sınıfta override edilemez.
public object DynamicInvoke(params object[] parametreler) Bu metot bir temsilcinin temsil ettiği metodu çağırmak için kullanılır. Delegate sınıfından devralınmıştır (override etmemiştir). Delegate nesneleri, MulticastDelegate nesnelerinin aksine direkt çalıştırılamaz. Bunun için DynamicInvoke() metodu kullanılır. Bu metodun tek görevi aslında DynamicInvokeImpl() metodunu çağırmaktır.
protected virtual object DynamicInvokeImpl(object[] args) Bir Delegate veya MulticastDelegate nesnesini çalıştırmaya yarar. MulticastDelegate sınıfı, Delegate sınıfından devralmıştır. Sadece Delegate sınıfı veya bu sınıfı türeten sınıflar kullanabilir. Bildiğiniz gibi bütün temsilci tanımları MulticastDelegate sınıfından türemektedir. Bu durumda temsilci tanımının içinde bu metoda erişebiliriz, ama temsilci tanımlarının blokları olmaz. O halde biz bu metodu direkt çalıştıramayız. Biz az önce gösterdiğimiz DynamicInvoke() metodunu çalıştırırız, DynamicInvoke() metodu blokları içinde DynamicInvokeImpl() metodunu çağırır.
public static Delegate Combine(params Delegate[] delegates) MulticastDelegate sınıfı Delegate sınıfından devralmıştır. Birden fazla Delegate nesnesini birleştirip tek bir Delegate nesnesi olarak tutmaya yarar. Sonuçta geriye bir Delegate nesnesi döndürüldüğü için bu nesnenin DynamicInvoke() metoduyla çalıştırılması gerekir, direkt çalıştırılamaz.
public static Delegate Combine(Delegate a,Delegate b) MulticastDelegate sınıfı Delegate sınıfından devralmıştır. İki Delegate nesnesini birleştirip tek bir Delegate nesnesi olarak tutmaya yarar.
Bu metotların kullanımına bir örnek aşağıda verilmiştir.

Bu program aşağıdaki çıktıyı verir.

Burası Metot1()
Burası Metot2()
Burası Metot1()
Burası Metot2()
Burası Metot1()
Burası Metot2()

Eğer Delegate dizisindeki temsilci nesnelerinin temsil ettiği metotların parametreleri varsa bu parametreler DynamicInvoke() metoduna object dizisi olarak verilmelidir.
NOT: Delegate sınıfı türünden bir nesnenin daima gizli türü olur, ve bu tür de daima bir temsilcidir. Yani Delegate sınıfı sadece bir kap vazifesi görür. Ayrıca Delegate sınıfı türünden bir nesneyle, bir MulticastDelegate nesnesinden farklı olarak normal metot çağrısı, += operatörüyle metot eklemesi ve -= operatörüyle metot çıkartımı yapılamaz. Delegate nesneleriyle bu işlemler yalnızca Delegate sınıfına ait olan üye elemanlarla yapılır. Ayrıca istersek tür dönüştürme operatörüyle Delegate nesnesini gizli türüne (ki bu bir temsilci oluyor) dönüştürebiliriz. Örnek:

Bu program ekrana alt alta Metot1, Metot2 ve Metot3 yazar.
NOT: Tür dönüştürme operatörüyle bir nesneyi daima gizli türüne dönüştürebiliriz. Bu işlem için tür içinde bir explicit metot tanımlamaya gerek yoktur.

Şu ana kadar öğrendiklerimize göre temsilcilerin var olma nedeni metotlardı. Yani bir metot olmadan bir temsilci de olmuyordu. Ancak artık bir metot olmadan işe yarayan bir temsilci tasarlayacağız. Örnek:

Gördüğünüz gibi bir temsilci nesnesine bir metot yerine direkt kodlar atandı.

C# programlama dilinde metot isimleri (metot statik değilse nesne ve metot isimleri) temsilci nesnelerine bilinçsiz olarak dönüşebilir. Parametre olarak bir temsilci nesnesi alan metot, yapıcı metot, sahte özellik, indeksleyicinin ilgili parametresine direkt metot ismi yazılabilir. Örnek:

Burada statik Metot2() metodu s nesnesi üzerinden çalıştırılan Metot() metodunu çalıştırmaktadır. Burada Metot2(s.Metot); satırı yerine açık olarak Metot2(new Temsilci(s.Metot)); satırını da yazabilirdik. Zaten arkaplanda gerçekten çalıştırılan satır budur. C# bu şekildeki bir bilinçsiz dönüşümü olaylara temsilci nesnesi atarken, eklerken de yapmaktadır. Olayları bir sonraki derste göreceğiz.

C# 2.0'dan önce temsilci nesnelerinin temsil edeceği metotların prototipi temsilcinin prototipi ile aynı olmalıydı. Yani gerek geri dönüş tipi, gerekse de parametrelerin tipi arasında bir türeme söz konusu olsa bile tür uyumsuzluğu var sayılıyordu. C# 2.0 ve daha sonraki sürümlerde programcılar bu gereksiz tür uyumu derdinden kurtulmuştur. Örnek program:

Gördüğünüz gibi geri dönüş tipi Ana olan temsilciAna() temsilcisi türünden nesne geri dönüş tipi Yavru olan MetotYavru metodunu temsil edebildi. Ancak geri dönüş tipi Yavru olan temsilciYavru() temsilcisi türünden nesne geri dönüş tipi Ana olan MetotAna metodunu temsil edemezdi.

Modern programlamada birçok kez değişkenlerde tür dönüşümüne ihtiyaç duyulur. Örneğin string türündeki sayılarla ("5" veya "2" gibi) matematiksel işlem yapmamız gerektiğinde tür dönüşümü yapmamız gerekir. Aslında bahsettiğimiz tam olarak tür dönüşümü değildir, sadece bir değişkenin değişik türdeki hâlinin başka bir değişkene atanmasıdır. Tür dönüşümleri bilinçli tür dönüşümü ve bilinçsiz tür dönüşümü olmak üzere ikiye ayrılır.

Aslında bunu önceki derste görmüştük. Bu derste sadece adını koyuyoruz ve tanımlıyoruz: C#'ta düşük kapasiteli bir değişken, sabit ya da değişken ve sabitlerden oluşan matematiksel ifade daha yüksek kapasiteli bir değişkene atanabilir. Buna bilinçsiz tür dönüşümü denir, bunun için herhangi bir özel kod gerekmez.

Bilinçsiz tür dönüşümüyle ilgili ilginç bir durum söz konusudur. char türünü kendisinden daha kapasiteli bir sayısal türe bilinçsiz olarak dönüştürebiliriz. Bu durumda ilgili karakterin Unicode karşılığı ilgili sayısal değişkene atanacaktır.

Bilinçsiz tür dönüşümüyle ilgili diğer ilginç bir nokta ise byte, sbyte, short ve ushort türündeki değişkenlerle yapılan matematiksel işlemlerdir. Bu tür durumda oluşan matematiksel ifade intleşir. Yani aşağıdaki durumda programımız hata verir:

Çünkü artık 8. satırdaki a+b ifadesi intleşmiş, ayrıca da 9. satırdaki d+e ifadesi de intleşmiştir, ve bunları en az int türdeki bir değişkene atayabiliriz. Size yardımcı olması açısında bilinçsiz tür dönüşümü yapılacabilecekler tablosu aşağıda verilmiştir:

Bilinçli tür dönüşümü genellikle derleyicinin izin vermediği durumlarda kullanılır. Bilinçli tür dönüşümüyle küçük türün büyük türe dönüştürülmesi sağlanabilse de aslında bu gereksizdir, çünkü aynı şeyi bilinçsiz tür dönüşümüyle de yapabilirdik. Aşağıdaki programda bilinçli tür dönüşümü gerçekleştirilmektedir.

Programımızda da görebileceğiniz gibi (byte)a ifadesi, a değişkeninin byte hâlini tuttu. Aşağıdaki şekil bilinçli tür dönüşümünü anlatmaktadır.

Eğer değişken adı kısmında tek bir değişken yoksa, bir ifade varsa parantez içine alınması gerekir.
Bu şekilde tür dönüşümü değişkenlere uygulanabildiği gibi sabitlere de uygulanabilir:

Reel türler tam sayı türlere dönüşürken ondalık kısım atılır.
Bilinçsiz tür dönüşümüyle yalnızca küçük türler büyük türlere dönüşebiliyordu, yani veri kaybı olması imkansızdı. Halbuki bilinçli tür dönüşümünde veri kaybı gerçekleşebilir, eğer dönüşümünü yaptığımız değişkenin tuttuğu değer dönüştürülecek türün kapasitesinden büyükse veri kaybı gerçekleşir. Bu gibi durumlar için C#'ın checked ve unchecked adlı iki anahtar sözcüğü vardır.

Kullanımı aşağıdaki gibidir:

i, byte'a çevrilirken veri kaybı gerçekleştiği için programımız çalışma zamanında hata verecektir. Ayrıca yeri gelmişken bir konuya değinmek istiyorum. Bu programımızda b değişkeni checked bloklarının içinde tanımlansaydı checked bloklarının dışında bu b değişkenine erişemezdik, çünkü değişkenler yalnızca tanımlandıkları en iç bloğun içinde aktiftirler.
Buradaki "en iç" sözüne dikkat etmenizi öneririm.

Burada a değişkeni yalnızca en iç blokta aktif olmasına karşın, b değişkeni hem dıştaki hem içteki blokta aktiftir.

Burada her iki değişken de WriteLine satırının olduğu yerde geçersiz olduğu için bu kod da geçersizdir. Çünkü her iki değişken de tanımlandıkları en iç bloğun dışında kullanılmaya çalışılıyor.

Eğer programımızda veri kaybı olduğunda programın hata vermesini istemediğimiz kısımlar varsa ve bu kısımlar checked bloklarıyla çevrilmişse unchecked bloklarını kullanırız. unchecked, checked'ın etkisini bloklarının içeriği çerçevesinde kırar. Programımızın varsayılan durumu unchecked olduğu için, yalnızca eğer programımızda checked edilmiş bir kısım var ve bu kısım unchecked etmek istediğimiz alanı kapsıyorsa gereklidir, diğer durumlarda gereksizdir. Örnek:

Programımız çalışma zamanında hata verir, ancak bunun sebebi c=(byte)a; satırı değil, b=(byte)i; satırıdır.

C#'taki en ilginç türün object olduğunu geçen derste söylemiştik, işte bu ilginç türün daha başka kuralları:

object türündeki bir değişkene başka herhangi bir türdeki değişken ya da sabit (string dışında) + işaretiyle eklenemez. Örneğin aşağıdaki gibi bir durum hatalıdır:

object türündeki bir değişkene herhangi bir türdeki değişken ya da sabit atanabilir (bilinçsiz tür dönüşümü). Ancak object türündeki herhangi bir değişkeni başka bir türe çevirmek için tür dönüştürme işlemi kullanılır. Ayrıca da dönüştürülen türlerin uyumlu olması gerekir. Yani object türüne nasıl değer atandığı önemlidir. Örneğin aşağıdaki gibi bir durum hatalıdır:

Ancak aşağıdaki gibi bir kullanım doğrudur.

Aynı satırda çifte dönüşüm yapılamaz. Aşağıdaki gibi bir kullanım hatalıdır.

Burada önce objectin chara, sonra da charın inte dönüşümü ayrı ayrı yapılmalıydı. Aşağıdaki gibi bir kullanım hatalıdır:

Çünkü derleyici harfsiz tam sayı sayıları int sayar, dolayısıyla da burada uygunsuz bir tür dönüşümünden bahsedebiliriz. Yani 7. satırda a inte dönüştürülmeliydi. Ancak aşağıdaki gibi bir kullanım doğrudur:

Bu program hata vermez. Çünkü derleyici a'nın gizli türünün byte olduğunu biliyor.

Dikkat ettiyseniz şimdilik sadece sayısal türleri, char ve object (uygun şekilde değer verilmiş olması şartıyla) türünü kendi aralarında dönüştürebiliyoruz. Şimdi göreceğimiz metotlarla string türünü bu türlere ve bu türleri de string türüne dönüştürebileceğiz.

Bu metot x değişken ya da sabitini stringe çevirip tutar. Örnekler:

veya

veya

veya

ToString() metodu System isim alanında olduğu için programımızın en başında using System; satırının bulunması bu metodu kullanabilmemiz için yeterlidir. string türüyle ilgili bilmeniz gereken bir şey daha var:

Böyle bir kod mümkündür. Ayrıca şöyle bir kod da mümkündür:

Burada dikkat etmemiz gereken şey yan yana gelen sayısal ve char değer ve değişkenlerle matematiksel toplama yapılmasına rağmen bunların yan yana gelmemesi durumunda da normal yan yana yazma olayının gerçekleşmesidir. Ancak tabii ki şöyle bir durum hatalıdır:

Yani bir sabit ve/veya değişken grubunun bir stringe atanabilmesi için ifadenin içinde en az bir string olmalıdır.

System isim alanının altındaki Convert sınıfı içinde tür dönüşümü yapabileceğimiz birçok metot bulunur. Bu metotlarla hemen hemen her türü her türe dönüştürebiliriz. Ancak bunun için değişken türlerinin CTS karşılıklarını bilmeliyiz. Değişken türleri ve CTS karşılıkları aşağıdaki tabloda listelenmiştir.

Şimdi sıra geldi bu metotlara:

Convert.ToBoolean(x)
Convert.ToByte(x)
Convert.ToSbyte(x)
Convert.ToInt16(x)
Convert.ToUInt16(x)
Convert.ToInt32(x)
Convert.ToUInt32(x)
Convert.ToInt64(x)
Convert.ToUInt64(x)
Convert.ToSingle(x)
Convert.ToDouble(x)
Convert.ToDecimal(x)
Convert.ToChar(x)
Bu metotlar x'i söz konusu türe dönüştürüp o türde tutarlar. x bir değişken, sabit ya da ifade olabilir. x, ifade olduğu zaman önce bu ifade mevcut türe göre işlenir, sonra tür dönüşümü gerçekleşir. Kullanımına bir örnek:

Bu programla kullanıcıdan iki sayı alıp bunların toplamını ekrana yazdırdık. Ayrıca burada şimdiye kadar kullanmadığımız Write metodunu kullandık. Bu metodun WriteLine'dan tek farkı ekrana yazıyı yazdıktan sonra imlecin alt satıra inmemesi.

C#'ta veri tabanı işlemleri System.Data isim alanındaki ve bu isim alanının altındaki alt isim alanlarındaki türlerle yapılır. System.Data isim alanına programcılar ADO.NET ismini vermişlerdir. Yani bir yerde ADO.NET duyarsanız aslında System.Data isim alanından bahsetmektedir. System.Data isim alanıyla veri tabanlarına iki şekilde erişilebilir.

MSSQL veri tabanlarına direkt erişim.
OLEDB protokolünü destekleyen veri tabanlarına OLEDB protokolü ile erişim.
Tabii ki bağlanacağınız veri tabanı MSSQL ise daha hızlı olması açısından birinci yöntemi seçmeniz tavsiye edilir. Ancak daha genel bir yol olduğundan bu bölümde ikinci yöntem üzerinde daha çok duracağız. Popüler tüm veri tabanları  OLEDB protokolünü desteklemektedir. OLEDB protokolüyle MSSQL veri tabanlarına da erişebilirsiniz. Ayrıca OLEDB protokolüyle Access dosyalarına da bir veri tabanıymış gibi bağlanabilirsiniz.
Şimdi isterseniz System.Data isim alanı ve bu isim alanındaki alt isim alanları hakkında kısa bilgiler verelim:
System.Data Veri tabanlarındaki verilerle çalışmak için gerekli temel türler bu isim alanındadır. Veri tabanlarına bağlanmak için gerekli türler bu isim alanında değildir.
System.Data.Common İleride göreceğiz.
System.Data.OleDb OLEDB protokolünü destekleyen veri tabanlarına bağlanmak için gerekli türler barındırır.
System.Data.SqlClient OLEDB kullanmadan direkt MSSQL veri tabanlarına bağlanmak için gerekli türler barındırır.
System.Data.SqlTypes MSSQL veri tabanlarındaki veri türlerini içerir. Tabii ki veri tabanından veri çekerken veya veri tabanına veri kaydederken C#'a özgü veri türlerini (string, int, ...) kullanabiliriz. Ancak MSSQL'e özgü veri türlerini kullanmamız bize artı performans sağlar.

Burada çeşitli veri tabanlarına bağlanma hakkında üç örnek verilecektir:

Bu örneğimizde OLEDB protokolünü destekleyen bir veri tabanına bağlandık. OleDbConnection sınıfı System.Data.OleDb isim alanındadır.

Burada ise OLEDB protokolünü kullanarak bir Access dosyasına bir veri tabanıymış gibi bağlandık. Gördüğünüz gibi öncekinden tek farkı kaynak stringi.

Burada ise OLEDB protokolünü kullanmadan direkt olarak bir MSSQL veri tabanına bağlandık. SqlConnection sınıfı System.Data.SqlClient isim alanındadır. Biz ders boyunca ikinci yöntemi kullanacağız. Yani Access dosyalarına erişeceğiz. OLEDB protokolünü kullanarak normal bir veri tabanına bağlanıp işlem yapma ile aynı şeyi Access dosyalarına yapma arasındaki tek fark bağlanma şeklidir. Yani veri tabanına veya Access dosyasına OLEDB protokolü ile bir kere bağlandıktan sonra veri tabanından veri çekme/veri tabanına veri kaydetme vb. işlemler tamamen aynıdır. OLEDB protokolünü kullanmadan bağlanılan MSSQL veri tabanlarıyla işlemler yapmak kısmen farklı olsa da işlemler büyük ölçüde aynı mantıkla yapılır. Şimdi isterseniz bir veri tabanına bağlanma örneği yapalım:

Bu örneğin hata vermeden çalışabilmesi için programımızla aynı klasörde dosya.mdb dosyasının olması gerekir. Access'te bu dosyayı oluşturun. Dosyamız çeşitli alanları olan bir tablo içersin, bu alanlara da veri türleriyle uyumlu olmak şartıyla istediğiniz verileri koyun. OleDbConnection sınıfının static olmayan Close() metodu ilgili bağlantıyı kesip bağlantının kullandığı sistem kaynaklarının serbest bırakılmasını sağlar. Eğer bağlantı sağlanmışsa programın ekrana Bağlantı sağlandı... çıktısını vermesi gerekir. Eğer bağlantı sağlanamamışsa istisnai durum oluşması gerekir.
ÖNEMLİ NOT: Bu ders boyunca sizin SQL dilini ve Access programını başlangıç seviyesinde bildiğiniz varsayılmıştır. Örneklerde olabildiğince basit SQL cümleleri kullanılmıştır.
NOT: System.Data isim alanı şimdiye kadar gördüğümüz isim alanlarının aksine mscorlib.dll assemblysinde değil, System.Data.dll assemblysindedir. Bazı .Net Framework sürümlerinde derleyici bu dosyayı otomatik olarak her dosyaya refere etmesine rağmen bazı .Net Framework sürümlerinde refere etmemektedir. Eğer program derleme hatası verirse bir de bu dosyayı refere etmeyi deneyin.

OleDbCommand sınıfı bir veri tabanına komut göndermek için kullanılır. OleDbCommand sınıfı System.Data isim alanındadır. Bir veri tabanına gönderilmesi için üç şekilde komut oluşturabiliriz.

Bu örneğimizde OleDbCommand sınıfının yapıcı metodu bir OleDbConnection ve bir de string nesnesi aldı. String nesnesi SQL cümlesini içeriyor. Şimdi ikinci yönteme geçelim.

CommandType System.Data isim alanında bulunan bir enumdur. OleDbCommand sınıfının static olmayan CommandType özelliğinin tipi CommandType enumudur. Bu örneğimizde veri tabanına bir SQL cümlesi göndermektense bir tabloyu tamamen programa çekmek istedik.

Bu örnekte ise bir stor prosedür çalıştırdık. Parametreyi de Parameters alt sınıfındaki Add() metoduyla verdik. 
NOT: Bu üç örneğimizde OleDbConnection nesnesini ve komutu yapıcı metotta verdik. İstersek şöyle de verebilirdik:

NOT: OleDbCommand sınıfının CommandType özelliğine CommandType.Text ilk değeri verilmiştir. Bu da komutun bir SQL cümlesi olduğunu belirtir.  
Şimdiye kadar güzel. Ancak halen bazı şeyler eksik. Artık komut elimizde var. Ancak halen komutu çalıştırmadık. Belli bir komutu (OleDbCommand nesnesini) çalıştırmak için OleDbCommand sınıfının 4 farklı static olmayan metodu vardır.
int ExecuteNonQuery() Bu metot veri tabanındaki kayıtlarda değişiklik (ekleme-silme-değiştirme) yapan komutları çalıştırmak için kullanılır. Metot tabloda etkilenen (silinen-eklenen-değiştirilen) kayıt sayısını döndürür. Örnek:

object ExecuteScalar() Bu metot veri tabanından tek bir veri elde eden komutları çalıştırmak için kullanılır. Örneğin SQL dilinin COUNT deyimi tablodaki kayıt sayısını verir. Örneğin SELECT COUNT(*) FROM Tablo SQL cümlesini çalıştırmak için bu metot kullanılabilir. Örnek:

OleDbDataReader ExecuteReader() Bu metot veri tabanından bir tablo çeken komutları çalıştırmak için kullanılır. Genellikle SELECT deyimleri bu metotla çalıştırılır. Bir OleDbDataReader nesnesi döndürür.

OleDbCommand sınıfının static olmayan ExecuteReader() metodu ile oluşan tabloları tutmaya yarayan bir sınıftır. OleDbDataReader nesneleri new operatörüyle oluşturulamaz. OleDbDataReader nesneleri oluşturmak için OleDbCommand sınıfının static olmayan ExecuteReader() metodunu kullanabiliriz. OleDbDataReader sınıfı System.Data.OleDb isim alanındadır. Şimdi isterseniz Access'te şöyle bir tablo oluşturalım:

Bu tabloya ogrenci ismini verelim. Dosyayı kaynak kodumuzla aynı klasörde oluşturup adını dosya.mdb koyalım. Şimdi aşağıdaki programı yazalım.

Bu program ogrenci tablosundaki id hariç tüm verileri bir tablo şeklinde konsol ekranına yazar. Bu programda Temel string işlemleri konusunda gördüğümüz yazı formatlamayı kullandık. Aynı konuda gördüğümüz String sınıfına ait PadRight() metodunu ise ekrana bir karakteri belirli sayıda yazdırmak amacıyla kullandık. Asıl konumuza dönecek olursak OleDbDataReader sınıfının static olmayan Read() metodu ilgili tablodaki aktif kayıtı bir birim öteler ve true döndürür. Eğer aktif kayıt ötelenemiyorsa false döndürür. OleDbDataReader sınıfında tanımlı indeksleyici sayesinde aktif kayıttaki farklı alanlar tutulabilir. Bu indesleyici object türünde nesneler döndürür. Son olarak OleDbConnection ve OleDbDataReader nesneleriyle işimiz bittiğinde ilgili nesnenin Close() metoduyla sistemin ilgili tablo/bağlantı için ayırdığı sistem kaynaklarını işlemciye iade etmemiz gerekiyor. İstersek OleDbDataReader sınıfına ait indeksleyiciyi şöyle de kullanabilirdik:

Gördüğünüz gibi indeksleyiciye bir indeks numarası vermektense direkt olarak sütunun adını da verebiliyoruz. Aynı programdaki while döngüsünü şöyle de kurabilirdik.

Burada klasik indeksleme yönteminin aksine türler belirtilmiştir. İndeksleyici geriye object nesnesi döndürüyordu. Eğer veri tabanındaki sütunların tipini biliyorsak bu şekilde bir kullanım tür dönüşümü olmadığından dolayı işlemler daha hızlı gerçekleşeceği için tavsiye edilir. Microsoft Office Access 2003 sürümündeki veri tipleri, C# karşılıkları ve bunları programa geçirmek için gerekli OleDbDataReader metotları şöyledir:

Artık şimdiye kadar öğrendiğimiz sınıflarla bir veri tabanından veri çekip veri tabanına veri kaydedebiliyoruz. Zaten bir veri tabanıyla yapabileceğimiz işlemler bu kadar. Ancak birazdan göreceğimiz OleDbDataAdapter, DataSet, DataTable, DataRow ve DataColumn sınıfları bu işlemleri yaparken bize daha fazla seçenek sunuyor. Ayrıca bu sınıflar bize offline çalışmanın kapılarını açıyor. Yani öncelikle veri tabanından bir veri çekiyoruz, bu veriyi kendi makinamıza aktarıyoruz, bu işlemden sonra veri tabanıyla bağlantımızın kesilmesi programımızın işleyişine engel değil. Sonra çektiğimiz veri üzerinde istediğimiz oynamaları yapıyoruz. Sonra değiştirilmiş verileri tekrar veri tabanına yazıyoruz. Bu şekilde veri tabanıyla işlemlerimiz, veri tabanının bulunduğu bilgisayarla programın bulunduğu bilgisayar arasında fazla git-gel olmadığı için daha hızlı gerçekleşiyor. Şimdi offline çalışmayla ilgili sınıfları önce kısaca inceleyelim:
OleDbDataAdapter OLEDB protokolünü destekleyen veri tabanlarından veri çekmek ve değiştirilmiş verileri aynı veri tabanına tekrar yazmak için kullanılır. Offline çalışmayla ilgili sınıflar içinde veri tabanıyla fiziksel olarak iletişimde olan tek sınıftır. OleDbDataAdapter sınıfının çektiği veri tek bir veri olabileceği gibi bir ya da daha fazla tablo da olabilir. Hatta istersek OleDbDataAdapter sınıfıyla bir veri tabanının tamamını da programımıza aktarabiliriz. OleDbDataAdapter sınıfı System.Data.OleDb isim alanındadır. System.Data.SqlClient isim alanındaki SqlDataAdapter sınıfı ise OLEDB'siz bağlanılan MSSQL veri tabanları için aynı şeyi yapar. OleDbDataAdapter ile SqlDataAdapter sınıflarının arayüzleri aynıdır. Dolayısıyla birazdan OleDbDataAdapter sınıfını incelerken aynı zamanda SqlDataAdapter sınıfını da incelemiş olacağız.
DataSet OleDbDataAdapter sınıfının veri tabanından çektiği verileri programda offline olarak tutmaya yarar. System.Data isim alanındadır.
DataTable Bir DataSet'teki bir tabloyu temsil eder. System.Data isim alanındadır.

Şimdiye kadar programlarımızı Not Defteri'nde yazdık ve csc.exe derleyicisi ile derledik. Böyle yapmamızın sebebi C# dilini tam anlamıyla öğrenmemizdi. Artık C# dilini bayağı öğrendik. Artık gelişmiş özelliklerle donatılmış, tümleşik bir derleyiciye sahip olan Visual C# Express Edition yazılımına geçebiliriz. Bu yazılımı buradan ücretsiz olarak indirip bilgisayarınıza kurabilirsiniz.

Visual C# 2008 Express Edition yazılımının orta kısmı yandaki gibidir. "Recent Projects" kısmından "Create" satırındaki "Project" linkini tıklayarak yeni bir proje oluşturabileceğiniz aşağıdaki ekranı getirin.

Bu penceredeki işimize yarayacak olan proje çeşitleri:
Windows Forms Application Yeni bir Windows uygulaması. Otomatik bir form açılır.
Class Library Yeni bir DLL dosyası.
Console Application Yeni bir konsol (komut istemi) uygulaması.
Empty Project Boş bir sayfa
Diğerleri bizi ilgilendirmiyor. İstediğimiz proje çeşidini tıklayıp OK butonuna bastıktan sonra o tür bir proje için gerekli minimum kodlardan ibaret bir dosya oluşturulacaktır.

Yeni bir Console Application projesi oluşturun. Sayfanın asıl kısmına kodlarımız otomatik olarak gelecektir. Sayfanın sağ kısmında ise Solution Explorer penceresi bulunur. Solution Explorer pencereciği yandaki gibidir. Bu pencerede kodumuzla ilgili dosyalar ve kodumuza refere ettiğimiz DLL dosyaları bulunur. Referans DLL'leri "References" klasörünün içindedir. Daha önce oluşturduğumuz bir DLL dosyasını programımıza refere etmek için "References" klasörünü sağ tıklayıp "Add Reference"i tıklarız. Açılan pencereden ".NET" sekmesinden .NET Framework'un kendi DLL'lerini, "COM" sekmesinden Windows'un COM bileşenlerini, "Browse" sekmesinden kendi DLL'lerimizi, "Projects" sekmesinden başka projelerin DLL'lerini ve son olarak "Recent" sekmesinden son kullandığımız DLL'leri programımıza refere edebiliriz. Aynı anda birden fazla DLL seçebiliriz.

Menü çubuğundaki "View" menüsünden Class View pencereciğini görünür hâle getirin. Class View pencereciği yandaki gibidir. Class View pencereciğinde o anki projemizdeki ve projemizin referanslarındaki tüm isim alanları, türler ve üye elemanlar hiyerarşik bir yapıda listelenir. Bir türdeki üye elemanları görmek için türü tıklamamız yeterlidir. Türlerde türeme söz konusuysa türeyen üye elemanları da görebiliriz. Projemizde ilgili isim alanı, tür ya da üye elemana gitmek için sadece onun Class View penceresindeki karşılığına çift tıklamak yeterlidir. Türler ve üye elemanlar arasında dolaşmanın diğer bir yoluysa kaynak kodun hemen üstündeki drop down menüleri kullanmaktır.

Kaynak kodda herhangi bir yerde CTRL+boşluk tuş bileşimini kullanırsak orada kullanabileceğimiz her türlü kod (anahtar sözcük, tür, üye eleman, nesne vb.) bir menüde listelenir. Benzer şekilde kodun herhangi bir yerinde bir nesneyi kullanıp . tuşuna basarsanız o nesneyle erişilebilecek üye elemanlar listelenir. Visual Studio.NET'in bunun gibi birçok özelliği vardır. Bunları kendiniz program yazdıkça keşfedebilirsiniz.

Visual Studio projelerimizi varsayılan olarak "C:\Documents and Settings\Kullanıcı\Belgelerim\Visual Studio 2008\Projects" klasörüne kaydeder. (Derleme ve kaydetmenin nasıl yapıldığını ileride ayrıntılarıyla anlatacağım. Şimdilik programın kapatma düğmesine basıp gelen uyarı penceresine "Yes" deyin.) Bu klasörde solution ismimiz, bu klasörün içinde proje klasörümüz/klasörlerimiz, proje klasörümüzün içinde ismi sınıf ismimizle aynı olan kaynak kod dosyamız, bu klasördeki bin klasörünün içindeki Debug klasöründe de exe dosyamız bulunur. Yani son tahlilde exe dosyamızın yolu C:\Documents and Settings\Kullanıcı\Belgelerim\Visual Studio 2008\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug şeklindedir.
Projemize kaynak kod dosyası eklemek için Solution Explorer pencereciğinde projeyi sağ tıklayıp Add -> New Item yolunu izleyin. Açılan pencereden yeni oluşturulacak dosyadaki bildirimleri otomatik yapabilirsiniz. Örneğin bu açılan pencereden Code File'ı seçerseniz boş bir cs dosyası projemize eklenir, eğer Class'ı seçerseniz içinde bir sınıf bildirimi olan bir cs dosyası projemize eklenir. Yine Solution Explorer penceresindeki kaynak kodları sağ tıklayıp silebilir, projeden çıkarabilir, projeyi sağ tıklayıp Add -> Existing Item yolunu izleyerek var olan bir kaynak kodu projemize ekleyebiliriz. Ayrıca projeye sağ tıklayıp Add -> New Folder yolundan kaynak kodlarımızı koordine etmek için projemize bir klasör de ekleyebiliriz.

Solution, projeleri koordine etmeye yarayan bir yapıdır. Bir projede yalnızca bir tane çalıştırılabilir (exe) dosya bulunur. Bir solution'da ise birden fazla çalıştırılabilir dosya bulunabilir. Bir solution'a proje eklemek için Solution Explorer pencereciğinde solution sağ tıklanıp Add -> New Project yolu kullanılır. Aktif solution'a proje eklemenin başka bir yolu ise File menüsünden "New Project"i seçmektir. Bir projeyi başlangıç projesi yapmak için ilgili proje sağ tıklanıp "Set as StartUp Project" seçilir. Başlangıç projesinin ne demek olduğunu ileride göreceğiz.

Visual Studio.Net başlangıç projesindeki bütün kaynak kod dosyalarının birleştirilip derlenmesi için iki yol sunar. Bunlar Debug ve Release seçenekleridir. Debug seçeneği programımızın çalışmasını test etmek ve hata ayıklamak için kullanılır. Release seçeneği ise programımızın testi bittiğinde son kullanıcının istifadesine sunmak için kullanılır. Release seçeneğinde kodumuzdan bütün gereksiz kısımlar atılır ve program daha hızlı çalışır. Debug seçeneğinde ise hata ayıklama için gerekli kodlar kaynak kodumuza gizlice eklenir.
Başlangıç projesini debuglı çalıştırmak için debug menüsünden "Start Debugging" seçilir. Projeyi debugsız çalıştırmak içinse yine aynı menüden "Start Without Debugging" seçilir. Bunların kısayolları sırasıyla F5 ve Ctrl+F5'tir.
NOT: İlk aşamada solution, araç çubuğundaki disket simgesine ya da File menüsündeki Save komutuna tıklanmadan sabit diske kaydedilmez.

Hata ayıklama kaynak kodumuzun çeşitli yerlerine yerleştirdiğimiz breakpointlerle yapılır. Debuglı çalıştırılan bir kod breakpoint olan satırlardan birine geldiğinde programın çalışması duraklatılır (pause). Kaynak koddaki bir satıra breakpoint koymak için ilgili satır sağ tıklanıp Breakpoint -> Insert Breakpoint yolu izlenir. Bir satıra breakpoint koymanın başka bir yolu ise imleç ilgili satırdayken F9 tuşuna basmaktır. Kod debuglı çalışırken breakpointli bir satıra gelindiğinde Debug menüsünün içeriği değişir. Bu menüdeki önemli seçenekleri inceleyecek olursak; "Step Over" programın işleyişini bir sonraki satıra götürür. "Continue" ile bir sonraki breakpointe kadar programın işleyişi devam ettirilir. "Stop Debugging" ile de hata ayıklama modundan çıkılır. Windows -> Watch yolundan değişken değerlerini adım adım izleyebileceğimiz Watch pencereciği görünür hâle getirilir. Watch pencereciğine bir değişken izlemesi eklemek için pencere sağ tıklanır ve "Add Watch" seçilir. Bu adımdan sonra boş satırın "Name" sütunu çift tıklanır ve buraya değişken ya da değişkenlerden oluşan bir ifade yazılır. Artık ilgili satırın "Value" sütununda ilgili satırdaki değişken ya da ifadenin değeri adım adım gösterilecektir. Yine Debug menüsündeki "Exceptions" seçeneği ile bir istisnai durum fırlatıldığında ya da fırlatılıp yakalanamadığında debugın devam etmesini ya da durmasını sağlayabilirsiniz.
NOT: Bir solutionın tamamını derleyip release olarak kaydetmek için "Build" menüsünden "Build Solution" seçilir.

Geçen bölümde kodlarla bir form oluşturmuş, formun üzerine bir buton getirmiş ve butona tıklandığında bir ileti kutusunun açılmasını sağlamıştık. Bu bölümde diğer kontrolleri Visual Studio.Net ile formumuza getirip ayarlamalarını Visual Studio.Net ile yapacağız. Öncelikle Visual Studio.Net'te bir Windows Forms Application projesi oluşturun. Ekranınıza yandaki gibi boş bir form gelecektir. Formun yanındaki toolbox'tan forma bir buton ve bir de textbox sürükleyin. Alternatif olarak bunları forma getirmek için çift tıklamanız da yeterlidir. Kontrollerin yandaki tutamaçlarıyla oynayarak boyutlarına değiştirebilir veya sürükleyerek formdaki istediğiniz bir noktaya taşıyabilirsiniz. Tabii bunları yaparken kaynak kodumuz otomatik olarak değişecektir.

Seçili kontrolün özelliklerini görebileceğiniz "Properties" penceresini görünür hâle getirmek için View menüsünden "Properties Window"u seçin. Properties penceresinden (yandaki resimde) seçili kontrolün özelliklerini değiştirebileceğiniz gibi aktif kontrolü değiştirmek için Properties penceresinin üst kısmındaki dropdown menüyü de kullanabilirsiniz. Bir kontrolün olaylarını listelemek için Properties pencereciğinin üst kısmındaki sarı yıldırım simgesini tıklayabilirsiniz. Listelenen olayların sağdaki boş kısmına bir metot adı yazarak bu olay gerçekleştiğinde bu metodun çalışmasını sağlayabiriz. Siz buton seçiliyken Click olayını seçin ve metot ismi bölümüne Tiklandi yazın. Sonra bu metot ismine çift tıklayın. Metodun içeriğinin yazılacağı bir ekran açılacaktır. Metodun içeriğine şu satırı yazın:

Şimdi Solution Explorer penceresine bakacak olursak Form1.cs ve Program.cs olmak üzere iki öge vardır. Program.cs, içinde Main() metodunun ve Program sınıfının olduğu asıl dosyamızdır. Form1.cs'nin yanındaki + işaretine tıklayacak olursak Form1.Designer.cs ve Form1.resx olmak üzere iki dosya vardır. Form1.resx bizi ilgilendirmiyor. Form1.Designer.cs formdaki kontrolerin görsellikleriyle ilgilenen dosyadır ve biz formdaki kontrollerde değişiklik yaptıkça bu dosyanın içeriği değişir. Öncelikle Form1.Designer.cs'nin içeriğine bakalım:

Eğer sizde bu kod çok daha kısaysa region'dan dolayıdır. Kodun sol kenar kısmında bir region olduğunu belirten herhangi bir + işareti olmadığına emin olun. Kodumuzu inceleyecek olursak:

Form sınıfının en altında iki özelliği var. Bunlar forma eklediğimiz kontrolleri temsil eden Button tipinden olan button1 ve TextBox tipinden olan textBox1. Bu kaynak koddaki önemli metotları inceleyecek olursak;
SuspendLayout() Form sınıfına aittir. İlgili form nesnesine ait bütün özel

Şimdi isterseniz konu anlatımına başlamadan önce bu derste örnek olarak kullanacağımız XML dosyasını oluşturalım. Dosyaya dosya.xml ismini verelim ve kaynak kod dosyamızla aynı klasöre koyalım:

C#'ta XML işlemleri System.XML isim alanındaki sınıflarla yapılır. Konuya başlamadan önce Temel I/O işlemleri konusunu incelemenizde fayda var. Çünkü bu konuda akımlarla içli dışlı olacağız. Akımları unutmuş olabilirsiniz. Bir dosyadaki bilgiler programımıza akımlar aracılığıyla getirilir. Yani dosyadaki tüm veriler bir akım nesnesine atanır. Sonra bu akım üzerinde oynamalar yaparız. Sonra akımı tekrar dosyaya yazıp tamponu boşaltırız. Akımları geçen derste gördüğümüz offline çalışmaya benzetebiliriz.

Bir XML dosyasından okuma yapmamızı sağlar. Bir XmlTextReader nesnesi şu yollarla oluşturulabilir:

Stream sınıfı System.IO isim alanındadır ve FileStream, NetworkStream vb. sınıfların türediği sınıftır. Yani bir Stream nesnesine Temel I/O işlemleri dersinde gördüğümüz FileStream nesnelerini atayabiliriz. Şimdi XmlTextReader sınıfının üye elemanlarını bir örnek üzerinde görelim:

Bu programın çıktısı şöyledir:

öğünler   Nitelik yok.
öğün      1 niteliği var. adı=Sabah
yiyecek   Nitelik yok.
içecek    Nitelik yok.
öğün      1 niteliği var. adı=Akşam
yiyecek   Nitelik yok.
içecek    Nitelik yok.

XmlTextReader sınıfına ait olan Read() metodu aktif düğümü bir birim öteler ve true döndürür. Düğüm ötelenemiyorsa false döndürür. Düğüm, bir XML dosyasındaki en küçük birimdir. NodeType özelliği aktif düğümün cinsini XmlNodeType enumu tipinden verir. XmlNodeType enumu System.Xml isim alanındadır. Düğümün tipini Element yaparak yalnızca < ve > karakterleri arasındaki düğümlerin hesaba katılmasını sağladık. Eğer bunu yapmasaydık XML dosyasındaki sonlandırıcılar (</xxx> gibi), yorum satırları (<?xxx?> gibi), salt metinler (< ve > ile çevrelenmeyenler) ve hatta boşluklar da hesaba katılacaktı. Name özelliği aktif düğümün ismini string olarak verir. HasAttributes özelliği eğer ilgili düğümün nitelik (seçenek) kısmı da varsa true, yoksa false döndürür. AttributeCount özelliği ilgili düğümün nitelik sayısını int tipinden döndürür. MoveToNextAttribute() aktif düğümdeki seçenekler arasında öteleme yapar. Başlangıçta herhangi bir seçenek üzerinde olunmaz, düğüm üzerinde olunur. Yani bir seçenek elde edebilmek için en az bir öteleme yapılmalıdır. Öteleyemiyorsa false döndürür. Name ve Value özellikleri aktif seçeneğin ismini ve değerini string olarak döndürür.
NOT: Başlangıçta herhangi bir düğüm üzerinde olunmaz. Bir düğüm elde edebilmek için en az bir öteleme yapılmalıdır.
NOT: Her XML dosyası bir son düğüm içerir.
XmlNodeType enumunun sözcüklerinin tamamı: Attribute, Document, Element, Entity, Notation, Text, CDATA, DocumentFragment, EndElement, EntityReference, ProcessingIntsruction, Whitespace, Comment, DocumentType, EndEntity, None, SignificantWhitespace, XmlDecleration. Bunlardan bizim için önemli olanlar şunlar:

Attribute → seçenek
Element → eleman
Text → salt metin (boşluklar hariç)
EndElement → her dosyada bulunan son düğüm
Whitespace → boşluklar
Comment → yorumlar
None → Hiçbirisi
NOT: Bütün XML dosyalarının kök düğümü olmalıdır.
NOT: System.Xml isim alanı System.Xml.dll assemblysindedir.
XmlTextReader sınıfının MoveToElement() metodu seçenekler arasında dolaşırken seçeneğin düğümüne geçmek için kullanılır. Örneğin <öğün adı="Sabah"> düğümünde "adı" seçeneğindeysek bu metodu kullanırsak öğün düğümüne geçeriz. Eğer bu metodu bir seçenek üzerindeyken kullanmışsak true döndürür, düğüm üzerindeyken kullanmışsak false döndürür. Doğal olarak bir düğüm üzerinde kullanmışsak herhangi bir şey yapılmaz. Bu metotla Element, DocumentType ve XmlDeclaration düğüm tiplerine geri dönebiliriz. Yine aynı sınıfın MoveToAttribute() metodu ise aktif düğümün seçenekleri arasında dolaşmaya yarar. MoveToNextAttribute() metodunun aksine sadece ileri doğru değil, aktif düğümün istenilen seçeneğine atlama imkanı verir. İki farklı kullanımı vardır:

Birincisinde aktif seçenek i. indeksli seçenek yapılırken ikincisinde aktif seçenek ise s isimli (Name) seçenek yapılır. Şimdi bu iki metodu bir örnek üzerinde görelim: (dosya.xml dosyasında <öğün adı="Sabah"> düğümünü <öğün adı="Sabah" saat="8"> olarak değiştirin.)

XmlTextWriter sınıfı programlama yoluyla XML dosyaları oluşturmak amacıyla kullanılabilir. Örnek program:

Bu programın ürettiği XML dosyası şöyle olacaktır.

Metotları açıklama gereksinimi görmüyorum. Hepsi yeterince açık. XmlTextWriter nesneleri farklı yollarla oluşturulabilir:

Bu sınıflar özetle XmlTextReader ve XmlTextWriter sınıflarının yaptığı işleri yaparlar ancak daha gelişmiş özellikler sunar. XmlDocument bir XML dosyasını, XmlAttribute bir düğümün seçeneklerini, XmlElement bir dosyadaki element düğümleri ve XmlNode düğümleri temsil eder.

Bir XmlDocument nesnesi şöyle oluşturulabilir:

Bir XmlNode nesnesi şöyle oluşturulabilir:

XmlNode sınıfının önemli özellikleri şunlardır: (tamamı static değildir)
XmlAttributeCollection Attributes İlgili düğümün seçeneklerini bir XmlAttributeCollection nesnesi olarak döndürür. Bu koleksiyon XmlAttribute nesnelerinden oluşur. (salt okunur)
XmlNode ParentNode Üst düğümü XmlNode tipinden döndürür. (salt okunur)
bool HasChildNodes İlgili düğüm alt düğüm(ler) içeriyorsa true, içermiyorsa false döndürür. (salt okunur)
XmlNode FirstChild İlgili düğümün ilk alt düğümünü döndürür. (salt okunur)
XmlNode LastChild İlgili düğümün son alt düğümünü döndürür. (salt okunur)
XmlNodeList ChildNodes İlgili düğümün alt düğümlerini XmlNodeList tipinden döndürür. (salt okunur)
XmlNode NextSibling Aktif düğümden hemen sonraki düğümü döndürür. (salt okunur)
XmlNode PreviousSibling Aktif düğümden bir önceki düğümü döndürür. (salt okunur)
string InnerText Aktif düğümün yazısını -varsa- alt düğümlerin yazılarıyla birlikte yan yana ekleyerek döndürür. <düğüm>Yazı</düğüm> ifadesinde düğüm düğümünün yazısı "Yazı"dır.
string InnerXml Aktif düğümün içindeki her şeyi, XML etiketleri de dâhil olmak üzere döndürür.
string OuterXml Az öncekinden tek farkı düğümün kendi XML etiketlerini de döndürmesidir. (salt okunur)
string Name Düğümün ismi. (salt okunur)
string Value İlgili düğüme ilişkin değer. Tuttuğu değer düğüm tipine göre değişir. Örneğin düğüm tipi yorumsa yorumun içindeki yazı döndürülür, düğüm tipi elementse null döndürür.
XmlNodeType NodeType Düğümün tipini XmlNodeType enumu cinsinden verir. (salt okunur)

XmlNode sınıfından türemiştir. Dolayısıyla bu sınıftaki tüm üye elemanları içerir. Bir XmlElement nesnesi şöyle oluşturulabilir:  

Son olarak XmlDocument sınıfının Save() metodu ilgili XmlDocument nesnesinde yapılan değişikliklerin dosyaya geri yazılmasını sağlar:

Eğer bu programda Save() metodunun parametresine dosya.xml yazsaydık sistem hata verecekti. Çünkü dosyayı aynı anda hem XmlTextReader sınıfı hem de XmlDocument sınıfı kullanıyordu. Bu sorunu aşmak için programı şöyle yazabiliriz:

Burada öncelikle xtr nesnesinin tuttuğu dosyayı bırakmasını sağladık.  Sonra serbest kalan dosyaya yazma işini başarıyla gerçekleştirdik.

Sizce int, double, byte birer nedir? "Sınıftır!" dediğinizi duyar gibiyim. Yaklaştınız ancak tam olarak sınıf değil. Temel veri türleri (int, double, vb.) birer yapıdır. int türünden tanımladığımız bir a değişkeni/özelliği de bir yapı nesnesidir. Peki sınıf ile yapı arasında ne fark var? Aşağıdaki kodu inceleyiniz

Buraya kadar ikisi de birbirinin aynısı gibi. Bu koddan Sinif sınıfının içinde bir implicit metot olduğunu ve atanan değerin sınıf içindeki int türünden bir özelliğe atandığını çıkarabiliriz. Şimdi bu kodu şöyle geliştirelim:

Bu kodda int c=a; satırında a'nın tuttuğu değer c'ye atanır. Sinif d=b; satırında ise d nesnesi b nesnesinin bellekteki adresini bulur ve o adresteki değeri tutar. Gördüğünüz gibi sınıf nesneleri birbirine adres gösterme yoluyla atanırken yapı nesneleri birbirine değer kopyalama yoluyla atanır. Bu kodda b nesnesinde yapılan bir değişiklik d nesnesini, d nesnesinde yapılan bir değişiklik de b nesnesini etkileyecektir. Ancak c nesnesinde yapılan bir değişiklik a nesnesini, a nesnesinde yapılan bir değişiklik de c nesnesini etkilemeyecektir.
Kendimiz de int, float gibi yapılar oluşturabiliriz. Yapı yaratmak sınıf yaratmaya oldukça benzer, yalnızca class anahtar sözcüğü yerine struct anahtar sözcüğü kullanılır. Örnek:

Yapılarla ilgili bilmeniz gerekenler:

Tıpkı sınıflar gibi yapılarda da new operatörüyle nesne yaratılabilir. new anahtar sözcüğünü kullandığımızda yapının varsayılan yapıcı metodu veya varsa kendi tanımladığımız yapıcı metot çalıştırılır.
Sınıflardan farklı olarak YapiAdi nesne; yazarak bir yapı nesnesini oluşturup kullanılabilir hâle getirebiliriz. İllaki new anahtar sözcüğünü kullanmak zorunda değiliz. Ancak bu durumda nesnenin herhangi bir özelliğine erişmek için nesne oluşturduktan sonra bizim bu özelliğe bir değer atamamız gerekir. Örnek:

Yapı nesnesi oluştururken new anahtar sözcüğünü kullanırsak o yapıdaki bütün özellikler varsayılan değerine atanır.
Bir yapı türündeki nesne bir metoda parametre olarak gönderildiğinde metodun içinde nesnenin değiştirilmesi esas nesneyi değiştirmez. Ancak sınıf nesnelerinde değiştirir.
Yapılardaki özelliklere yapı içinde ilk değer verilemez (const özellikler hariç).
Tıpkı sınıflardaki gibi yapılarda da birden fazla yapıcı metot yaratabiliriz. Ancak yapılarda parametre almayan bir yapıcı metot bildiremeyiz. Hatırlarsanız sınıflarda bildirebiliyorduk. Ayrıca yapılarda parametre alan bir yapıcı metot oluşturmamız, varsayılan yapıcı metodun oluşturulmasını engellemez. Bir yapıda parametre alan bir yapıcı metot oluşturmuş olsak bile Yapi nesne=new Yapi(); şeklinde parametre almayan yapıcı metodu çağırabiliriz.
Bir yapının yapıcı metodu bildirildiğinde yapıcı metodun içinde yapının bütün özelliklerine (private olanlar da dahil) ilk değer verilmesi gerekir.
Yapı nesnelerinin faaliyet alanı sonlandığında otomatik olarak bellekten silinirler. Hatırlarsanız sınıf nesnelerinin faaliyet alanı sonlandığında garbage collection (çöp toplama) mekanizması devreye giriyordu. Ancak garbage collection mekanizmasının nesnenin faaliyet alanı sonlanır sonlanmaz devreye girme garantisi yoktu. Özetle sınıf nesnelerinin aksine yapı nesnelerinin tam olarak ne zaman bellekten silindiğini anlayabiliriz.
Yapılarda yıkıcı metot yaratılması yasaklanmıştır.
Sınıflarda olduğu gibi yapılarda da sahte özellik (get ve set bloklu özellik) ve indeksleyici kullanabiliriz.
Yapı nesneleriyle ilgili işlemler, sınıf nesneleriyle ilgili işlemlerden daha hızlı gerçekleşir.
Tıpkı sınıflardaki gibi normal metotlar da bir yapı içerisinde bildirilebilir. Ayrıca üye elemanlar static olabilir.
Tıpkı sınıflardaki gibi bir yapı içerisindeki özellikler const ya da readonly olabilir.
const özelliklere tanımlandığı satırda değer verilmesi gerekir. readonly özelliklere ise tanımlandığı satırda değer verilmemesi gerekir. readonly özelliklerin değerleri yapıcı metot içinde belirtilebilir. Yapıcı metot oluşturulmuşsa readonly özelliğe yapıcı metot içinde ilk değer verilmesi gerekir (aslında yapıcı metot oluşturulmuşsa diğer özelliklere de yapıcı metot içinde ilk değer verilmesi gerekir). const ve readonly özelliklerin değerleri nesne oluşturulduktan sonra değiştirilemez.
const özelliklerin değerleri yapıcı metot içinde değiştirilemez.

Hatırlarsanız foreach döngüsü şöyle kuruluyordu:

Burada b'nin kendi yarattığımız bir sınıf türünden olması için bu kendi yarattığımız sınıfın IEnumerable arayüzünü uygulaması gerekiyordu. Bu arayüz geri dönüş tipi IEnumerator olan bir metot içeriyordu. Ve daha bir sürü karmaşık şey vardı. Şimdiye kadar IEnumerable ve IEnumerator arayüzlerinin nasıl birlikte çalıştığını anlamamış olabilirsiniz. Ancak aynı mantıkla çalışan çok daha basit bir program yazınca bunun nasıl olduğunu anlayacaksınız:

Bu programda i1 arayüzü geri dönüş tipi i2 arayüzü olan Metot() isimli metodu içeriyor. Asıl sınıfımız i1 arayüzünü uyguluyor. Geri dönüş tipi i2 arayüzü olan Metot() metodumuzu sınıfımıza yerleştiriyoruz. Programımızdaki en kritik nokta metodumuzun geri dönüş tipi i2 arayüzü olmasına rağmen, bizim AltProgram sınıfı türünden bir nesne döndürmemiz. Çünkü AltProgram sınıfını incelerseniz bunun da i2 arayüzünü kullandığını göreceksiniz. Yani sınıflardaki türeme kuralları arayüz uygulamada da geçerli. Bir sınıf nesnesi, sınıfın kullandığı bir arayüz nesnesine atanabiliyor. Bu kuralı da şu basit programla özetleyebiliriz:

Ancak bir arayüz nesnesini new operatörüyle oluşturamayız. Çünkü new operatörü nesne için bellekte yer açmak demektir. Arayüzlerin pratikte bellekte yer kaplaması imkansızdır. O yüzden derleyici new operatörüyle arayüz nesnelerinin oluşturulmasını engeller. Konu buraya gelmişken bir şey söylemek istiyorum. Aslında sadece tanım yapmak istiyorum:

Yukarıdaki iki satırdan birincisinde bir referans oluşturulur. İkincisinde ise nesne oluşturulur. Aslında bu ikisinin arasındaki farkı biliyordunuz, burada sadece bunların isimlerini söyledim. Şimdi konuyu fazla dağıtmadan Arayüzler konusunda gördüğümüz ve kendi oluşturduğumuz sınıf türünden bir nesnenin foreach döngüsüyle kullanılabilmesini sağlayan programı tekrar yazmak istiyorum:

Burada az önceki basit örneklerde gördüğümüz kurallar var.

Az kalsın hatırlatma yapacağız derken asıl konumuzu unutuyorduk.:) İşte şimdi asıl konumuza başlıyoruz. yield deyimleri kendi oluşturduğumuz sınıf türünden nesnelerin kısa yoldan foreach döngüsüyle kullanılabilmesini sağlar. Örnek program:

Bu programın ekran çıktısı alt alta 1, 2 ve 3 olacaktır. Gördüğünüz gibi IEnumerator sınıfını yazmamıza gerek kalmadı. Her yield return sözcüğü bir iterasyon belirtir. Bu örneğimizde yield return anahtar sözcüğünün yanında int türden nesne koyduk. Ancak her türden nesne koyabilirsiniz. yield return anahtar sözcükleri mutlaka geri dönüş tipi IEnumerator olan bir metodun içinde kullanılmalıdır. Başka bir örnek:

Bu program 0'dan 150'ye kadar sayıları 10'ar 10'ar alt alta yazacaktır. yield return anahtar sözcüğüne benzer çalışan bir de yield break anahtar sözcüğü vardır. yield return ile yeni bir iterasyon başlatılırken yield break ile tüm iterasyonlardan çıkılır. Bu anahtar sözcüğü döngülerdeki break anahtar sözcüğüne benzetebiliriz. yield return'ü ise continue'ye benzetebiliriz. Örnek:

 
Bu programla ekrana 1 ve 2 yazılır, 3 yazılmaz.

Farkındaysanız şimdiye kadar yazdığımız kodlar satır satır çalıştırılıyordu ve bir satırın işlemi bitmeden öteki satıra geçilmiyordu. Örneğin;

Burada birinci metottaki bütün kodlar çalıştırılmadan ikinci metot çalışmaya başlamaz. Ancak bu derste göreceğemiz çok kanallı uygulama (multi-threading) geliştirme teknolojisiyle bu iki metodun aynı zamanda çalışmaya başlamasını sağlayabileceğiz. Yani bilgisayarımızın işlemcisi aynı anda iki işlem yapacak. Çok kanallı uygulama geliştirme teknolojisini genellikle arka planda sürekli çalışmasını istediğimiz bir program parçacığı varsa kullanırız. Örneğin bir anti virüs yazılımının gerçek zamanlı koruma yapabilmesi için thread teknolojisini kullanması gerekir. C#'ta çok kanallı uygulamalar ile ilgilenen sınıflar System.Threading isim alanındadır. Şimdi bir örnek yapayım ve konuyu bu örnek üzerinde anlatayım:

Önce bir Windows projesi açın.
Forma iki ListBox, bir Label, bir de Button getirin.
Birinci ListBox'a her saniye de bir öge eklenecek, bu ögeler de 1, 2, 3, ... diye gidecek.
İkinci ListBox'a her iki saniye de bir öge eklenecek, bu ögeler de 10, 20, 30, ... diye gidecek.
Label'da şu anki saat saat:dakika:saniye formatında olacak ve sürekli güncel olacak.
Son olarak butona basıldığında bütün bu sürekli değişen şeyler durdurulacak. Yani Label'ın saati butona basıldıktan sonra hep aynı kalacak. ListBox'lara da butona basıldıktan sonra öge ekleme durdurulacak.
Artık kodları yazmaya başlayabiliriz. Kodlarımızı görsellikle değil, kodlarla ilgilenen dosya olan Form1.cs dosyasındaki Form1 sınıfına yazacağız. Bu dosyayı ve sınıfı forma sağ tıklayıp "View Code"u tıklayarak açabilirsiniz.

Bu programdaki Form1.CheckForIllegalCrossThreadCalls = false; satırıyla derleyicinin bu şekilde thread kullanılmasına izin vermiş olduk. Metotların içindeki komutları sonsuz bir döngü içinde yazarak ilgili komutların bir kere çalışıp sonlanmak yerine sonsuza kadar çalışmasını sağladık. Thread sınıfının static Sleep() metoduyla programın istenilen süre zarfında hiçbir şey yapmadan beklemesini sağladık. Buradaki en önemli nokta olarak da yeni Thread nesneleri oluşturduk, bu nesneleri metotlarımızla ilişkilendirdik. Thread sınıfının static olmayan Start() ve Abort() metotlatıyla da Thread nesnelerinin temsil ettikleri metotların çalışmasını başlatıp durdurduk.

Artık kitap bitti. Artık C# dilini tam anlamıyla bildiğinizi düşünüyorum. Ancak C# ile .NET Framework kütüphanesi farklı kavramlardır. Bu kitap boyunca asıl anlatılmak istenen C# dilidir. .NET kütüphanesini kullanabileceğiniz tek dil C# değildir. C# dışında Visual Basic.NET, C++.NET, J# vb. birçok dille .NET Framework kütüphanesinden faydalanabilirsiniz. Ancak C#, .NET Framework kütüphanesi için Microsoft tarafından özel olarak sıfırdan geliştirilmiş bir dildir. C# ile .NET Framework kütüphanesini diğer dillere oranla çok daha efektif şekilde kullanırsınız. .NET Framework kütüphanesi hakkında daha fazla bilgi istiyorsanız Microsoft'un MSDN kütüphanesini kullanabilirsiniz. Sitede sol taraftaki ağaç görünümlü menüden .NET Development -> .NET Framework 4 -> .NET Framework Class Library yolunu izleyerek bu kitap boyunca özet olarak verilen sınıf bilgilerine ayrıntılı olarak erişebilirsiniz.

Şimdiye kadar gördüğümüz kodlar direkt olarak exe dosyasına katılıyordu. Şimdi göreceğimiz önişlemci komutlarının görevi ise sadece derleyiciye derlemenin nasıl yapılacağı hakkında bilgi vermektir. Önişlemci komutları derleme sonucu oluşan exe dosyasına aktarılmazlar. Önişlemci komutları # karakteri ile belirtilirler. C# kodlarından farklı olarak önişlemci komutları enter'la sonlandırılmalıdır. Sonlarında ; karakteri bulunmaz. Şimdi isterseniz bütün önişlemci komutlarını teker teker görelim.

#define komutu bir sembol tanımlamak için kullanılır. Sembollerin tek başlarına bir anlamı yoktur. İleride göreceğimiz diğer önişlemci komutlarının çalışabilmeleri için gereklidirler. #define ile sembol tanımlama program kodlarının en başında, (using deyimlerinden de önce) olmalıdır. Örnek program:

Bu programda ENGLISH ve TURKISH isimli iki sembol tanımlanmıştır. Diğer bütün önişlemci komutlarında olduğu gibi önişlemci komut parçaları arasında (örneğin #define ile TURKISH arasında) en az bir boşluk olmalıdır. Aynı sembolün tekrar tekrar tanımlanması hata verdirmez.

#define ile tanımlanmış bir sembolü kaldırmak için kullanılır. Olmayan bir sembolü kaldırmaya çalışmak hata verdirmez. Programın herhangi bir satırında olabilir. Örnek program:

Sembollerin büyük ya da küçük harf olması zorunlu değildir. Ancak tamamen büyük harf okunurluğu artırdığı için tavsiye edilir. Sembollerin büyük-küçük harf duyarlılığı vardır.

#if ve #endif komutları bir sembolün tanımlanmış olup olmamasına göre birtakım kodların derlenip derlenmemesinin sağlanması için kullanılır. Yani son tahlilde kaynak kodun bir kısmı exe dosyasına ya eklenir ya eklenmez. Önişlemci komutlarında bloklar olmadığı için #endif komutu da #if komutunun açtığı kod bölgesini kapatmak için kullanılır. Yani #if ve #endif arasındaki kodlar koşula göre derlenip derlenmez. Örnek program:

Bu program ekrana şu çıktıyı verecektir.

Programa hoş geldiniz.
Bu program ENGLISH

Eğer programın başına #define ENGLISH satırını eklemeseydik program çıktısındaki ikinci satır olmayacaktı. #if önişlemci komutuyla mantıksal operatörleri de kullanabiliriz. Örnek program:

Bu program sonucunda ekrana yalnızca Programa hoş geldiniz. satırı yazılacaktır. Şimdi bu mantıksal operatör durumlarını topluca görelim:
#if ENGLISH && TURKISH ENGLISH ve TURKISH varsa
#if ENGLISH || TURKISH ENGLISH veya TURKISH varsa
#if ENGLISH && (!TURKISH) ENGLISH var ama TURKISH yoksa
#if ENGLISH && (TURKISH==false) ENGLISH var ama TURKISH yoksa
Benzer şekilde çoklu koşullandırmalar da mümkündür. Örnek:
#if ENGLISH && TURKISH && FRANSIZCA

#else önişlemci komutu C#'taki else ile aynı göreve sahiptir. Koşul sağlanmışsa bir kod bloğunun derlenmesini sağlayan #if komutu ile birlikte kullanılır. Örnek:

Gördüğünüz gibi #else komutu #if ile #endif arasında kullanılıyor. Başka bir örnek: 

Bu programda aynı isimli birden fazla sınıf aynı kaynak kodda olmasına rağmen program hata vermedi. Çünkü her halukarda bu sınıflardan yalnızca biri derlenecektir.

#elif C#'taki else if'in kısaltılmışıdır. Yani değilse bir de bu koşula bak anlamı verir. Örnek program:

#elif komutlarının sayısını bir #if-#endif aralığında istediğimiz kadar artırabiliriz.
NOT: İç içe geçmiş #if-#elif-#else komutları da olabilir. Örnek program:

#error komutu derleyiciyi hata vermeye zorlamak için kullanılır. Örnek program:

Bu program kodumuz derlenmeyecek, hata mesajı olarak da ekrana Hem TURKISH hem ENGLISH aynı anda olamaz. yazacaktır.

#warning komutu #error komutu ile aynı mantıkta çalışır. Tek fark ekrana hata değil, uyarı verilmesidir. Yani programımız derlenir, ama uyarı verilir. Örnek program:

Eğer programımızda bir hata var ve derleyici de (csc.exe) bu hatayı tespit etmişse bize bu hatanın hangi dosyanın hangi satırında olduğunu verir. İstersek #line komutuyla bu dosya adını ve satır numarasını değiştirebiliriz. Yani tabiri caizse derleyiciyi kandırabiliriz. #line komutu kendinden hemen sonra gelen satırın özelliklerini değiştirmek için kullanılır. Örnek program:

Bu programda int türünden olan a değişkenine yanlış türde sabit atadık. Bu hatayı bilinçli olarak yaptık. Derleyici hatanın 1. satırda ve YeniDosya.cs dosyasında olduğunu iddia edecektir. Çünkü artık derleyici #line 1 "YeniDosya.cs" komutundan hemen sonra gelen satırı 1. satır ve YeniDosya.cs dosyası olarak tanıyor.

#region ve #endregion komutlarının, kodları Not Defteri'nde yazan bizler için pek bir önemi yok. Çünkü #region ve #endregion komutları kodları bölgelere ayırmaya yarıyor. Kod bölgesinin yanındaki + işaretine tıklayınca kodlar gösteriliyor, gösterilen kodların yanındaki - işaretine tıklayınca da kodlarımız gizleniyor. Bu komut Visual Studio veya Not Defteri'nden daha gelişmiş bir editör programı kullananlar için faydalı olabilir. Örnek:

Önişlemci komutları genellikle belirli koşullara göre programımızın yalnızca bir kısmını derlemek için kullanılır. Örneğin bir programın hem İngilizce hem Türkçe versiyonunu aynı kaynak kodda bulunduruyorsak önişlemci komutlarını programın yalnızca Türkçe ya da yalnızca İngilizce versiyonunu derlemek amacıyla kullanabiliriz.

Artık kod yazmaya başlıyoruz. İlk programımız şu şekilde:

Bu program konsol ekranına Merhaba dünya! yazıp kapanır. Programı geçen derste anlatıldığı gibi derleyin, sonra da programımızı çalıştırmak için komut satırında kod dosyanıza verdiğiniz adı girip entera basın.

class ilkprogram satırıyla ilkprogram adında yeni bir sınıf oluştururuz. C#'ta yazdığımız her programın en az bir sınıf içermesi zorunludur.
{ veya } işaretleri herhangi bir sınıfın veya metodun içeriğini belirtmek için kullanılır. İlk { karakteriyle önceki satırda açtığımız ilkprogram adlı sınıfımızın içeriğine alınacak kodların başladığını, programın son satırındaki } karakteriyle de sınıfımızın içeriğine alınacak kodların sona erdiğini belirtiyoruz.
static void Main() satırıyla sınıfımızın içine Main adlı bir metot yerleştirdik. Bu metodun adı mutlaka Main olmalı, yoksa programımız çalışmaz. Ayrıca bu metot mutlaka oluşturduğumuz sınıfın içinde olmalı. Yine { ve } karakterleriyle metodumuzun içeriğini belirledik. Dikkat ettiyseniz bir iç içe { ve } karakterleri söz konusu. Bu durumda koyulan ilk } karakteri son açılan { karakterini kapatır.
Programımızın pratikte iş yapan tek kısmı ise System.Console.WriteLine("Merhaba dünya!"); satırı. Bu satırla ekrana Merhaba dünya! yazdırdık, peki nasıl yaptık? Bunun için .Net Framework kütüphanesindeki hazır bir metottan yararlandık. Bu metot, System isim alanının altındaki Console sınıfında bulunuyor, ismi WriteLine ve konsol ekranına yazı yazdırmaya yarıyor. Parantezler arasındaki çift tırnaklar arasına alınan metni ekrana yazdırıyor. Satırın sonundaki ; karakterini ise { ve } karakterleri açıp kapatmayan bütün C# satırlarında kullanmamız gerekiyor.

Bu programımızın işlevsel olarak ilk programımızdan herhangi bir farkı yok. Yani ikisi de aynı şeyi yapıyor. Ancak kodda bir farklılık var. Using System; satırı oluşmuş ve System.Console.WriteLine("Merhaba dünya!"); satırındaki System kalkmış. using deyimi C#'ta isim alanı kullanma hakkı elde etmek için kullanılan bir anahtar sözcüktür. Yani aynı isim alanında kullanacağımız birden fazla metot varsa bu isim alanını using anahtar sözcüğüyle belirtmemiz son derece mantıklı.

Bu programımız önce ekrana Entera basın! yazar. Kullanıcı entera bastığında da Entera bastınız! yazıp kendini kapatır. Console sınıfına ait olan ReadLine metodu programımızın kullanıcıdan bilgi girişi için  beklemesini sağlar, yani programımızı entera basılana kadar bekletir. Kullanıcı entera bastığında da diğer satıra geçilir. Dikkat ettiyseniz ReadLine metodunda parantezlerin arasına hiçbir şey yazmıyoruz. C#'ta bazı metotların parantezleri arasına birşeyler yazmamız gerekirken, bazı metotlarda da hiçbir şey yazılmaması gerekir.

Daha önceden de bildiğiniz gibi tanımladığımız diziler System.Array sınıfı türünden bir nesnedir. Bu sayede tanımladığımız diziler üzerinden System.Array sınıfının üye elemanlarına erişebiliriz. Örneğin System.Array sınıfına ait olan Length özelliği dizimizin kaç elemandan oluştuğunu tutar. Sort() metodu ise dizimizin elemanlarını sıralar. Hatırlarsanız dizilerin elemanlarına [] operatörüyle erişiyorduk. Yani Array sınıfı türünden bir nesnenin sonuna [] koyuyorduk ve bunun belirli bir anlamı vardı. Bunu sağlayan System.Array sınıfındaki bir indeksleyeciden başka bir şey değildir. Artık biz de Sinif türünden yarattığımız a nesnesini a[5] şeklinde yazabileceğiz ve bunun belirli bir anlamı olacak. İndeksleyiciler tıpkı diziler gibi tek boyutlu indeksleyiciler ve çok boyutlu indeksleyiciler olmak üzere ikiye ayrılır.

Örnek:

Gördüğünüz gibi indeksleyiciler sahte özelliklere oldukça benziyor. Ancak ciddi farkları da var. İndeksleyici tanımlarken parametre normal parantez yerine köşeli parantezler arasına yazılıyor. Esas programda [ ve ] arasına girilen veri indeksleyiciye parametre olarak gönderiliyor. İndeksleyicilere özel bir ad verilmiyor, bunun yerine this anahtar sözcüğü kullanılıyor. Ayrıca şunu hatırlatmak isterim: a[5]=30; satırıyla a[5]'in değil a'nın Sayi özelliği değiştiriliyor. Yani esas programı şöyle değiştirsek:        

Bu programda ekrana alta alta iki kez 2 yazar. Çünkü hem a[5]=30; hem de a[1]=2; satırları a nesnesinin Sayi özelliğini değiştirir. Şimdi programımızı şöyle değiştirelim:

Bu program ekrana 9 yazar. İndeksleyicinin set blokunda indeksleyiciye hangi indeksle ulaşıldığı kontrol ediliyor. Eğer indeksleyici 0'dan büyükse esas programda o indeksleyiciye atanan değer a nesnesinin Sayi özelliğine ekleniyor. Eğer indeksleyici 0'dan küçükse esas programda o indeksleyiciye atanan değer a nesnesinin Sayi özelliğinden çıkarılıyor. Eğer indeksleyici 0'sa Sayi'nin değeri değiştirilmiyor.
NOT: İndeksleyiciler de aşırı yüklenebilir. Bunu ise parametre türünü farklı yaparak sağlarız.
NOT: İndeksleyicilerin parametre ve geri dönüş tipi herhangi bir tip olabilir. int olması şart değildir.

Çok boyutlu indeksleyicilerin tek boyutlu indeksleyicilerden tek farkı indeksleyicinin aldığı parametre sayısıdır. Örnek:

Bu programda a[5,4]=45; satırında 5*4+45 işlemi yapılır ve sonuç Sayi özelliğine atanır. Console.WriteLine(a[-6,12]); satırında ise -6+12+65 işlemi yapılır ve sonuç ekrana yazılır. (sonuç: 71)
NOT: Aslında indeksleyicilerin en yaygın kullanımı sınıfımız içindeki bir dizinin elemanlarına direkt nesne ve [] operatörünü kullanarak erişmektir. Bunu mantığınızı kullanarak yapabilirsiniz. Anlatma gereksinimi görmüyorum.
NOT: İndeksleyicilerin set ve get blokları sahte özelliklerdeki set ve get bloklarının tüm özelliklerini taşırlar. Örneğin set blokunu koymayarak nesnenin indekslerine değer atanmasını engelleyebiliriz.

İsim alanları en temel anlamıyla sınıfları organize etmeye (gruplandırmaya) yarayan bir yapıdır.

Bildiğiniz üzere şimdiye kadar .Net Framework kütüphanesindeki hazır isim alanlarına erişmek için using anahtar sözcüğünü kullandık. Bu anahtar sözcükle ilgili bilmeniz gereken bazı ufak detaylar:

using anahtar sözcüğüyle bir isim alanını varsayılan isim alanımız hâline getiririz. Yani o isim alanındaki sınıflara, yapılara, vb. direkt erişebiliriz. Eğer using anahtar sözcüğünü kullanmamış olsaydık söz konusu sınıfı ya da yapıyı kullanmadan önce söz konusu sınıfın ya da yapının bağlı olduğu isim alanını da . operatörüyle eklemek zorunda kalacaktık. Örneğin programımızın başında using anahtar sözcüğü ile System isim alanını belirtmezsek bu isim alanına bağlı olan Console sınıfının içindeki WriteLine metodunu System.Console.WriteLine() olarak kullanmak zorunda kalacaktık.
.Net Framework kütüphanesinin en tepesinde System isim alanı ve bunun altında çeşitli görevler için özelleşmiş farklı isim alanları bulunur. Örneğin System.Data isim alanında veri tabanı işlemleri için özelleşmiş çeşitli sınıflara ulaşabiliriz. Bu isim alanının altında yine çeşitli isim alanları da vardır.
using anahtar sözcüğüyle bir isim alanına erişim hakkı elde etmemiz onun altındaki veya üstündeki isim alanlarına da erişim hakkı elde ettiğimiz anlamına gelmez. Her bir isim alanını ayrı ayrı bildirmeliyiz.
Temel veri türleri (int, double, vs.) aslında .Net Framework kütüphanesindeki birer yapıdan başka bir şey değildir. Bu yapılar System isim alanının altında bulunur. Tür dönüşümü konusunda "değişken türlerinin CTS karşılıkları" adı altında bu yapıları tablolamıştık. Yani aslında int türünden bir değişken tanımlarken System.Int32 yapısından bir nesne tanımlamış oluyoruz. Ancak int a=34; gibi bir komutla bir değişken tanımlarken using anahtar sözcüğüyle System isim alanını eklememize gerek yoktur. Çünkü C# otomatik olarak temel veri türlerini bizim erişimimize açık tutar. Yani biz using anahtar sözcüğüyle System isim alanına erişim hakkı elde etmemiş olsak bile bu isim alanına bağlı olan Int32 yapısını kullanabiliriz. Bu durum yalnızca temel veri türlerinde geçerlidir. Aşağıdaki programı inceleyiniz:

Gördüğünüz gibi C# ikisinde de aynı yapıyı (System.Int32) kullanmamıza rağmen ikincisine izin vermedi. Programın başına using System; satırını ekleseydik ikincisine de izin verecekti. Yani değişkenleri C#'a özgü şekilde oluşturmuşsak System isim alanını eklememiz zorunlu değildir. Yapıların gerçek hâlleriyle değişken oluşturmak ise System isim alanının eklenmesini gerektirir.

Çoğu zaman programımıza using anahtar sözcüğüyle birden fazla isim alanı eklememiz gerekir. Bu gibi durumlarda her bir isim alanını using anahtar sözcüğüyle ayrı ayrı belirtmeliyiz. Virgül ile ortak bildirim yapamayız.

Fark ettiyseniz şu ana kadar yazdığımız sınıfları, yapıları vs. herhangi bir isim alanına yazmadık. Bu gibi durumlarda C# söz konusu sınıf ya da yapıları varsayılan isim alanımızda sayar. Yani biz bir isim alanı oluşturmamışsak bile C# hayalî bir isim alanı oluşturur ve bize bu isim alanına direkt erişim hakkı verir. Ancak istersek türlerimizi bir isim alanı içine koyabiliriz. Örnek bir isim alanı bildirimi

Bir isim alanının içinde yalnızca sınıflar, temsilciler, enum sabitleri, arayüzler ve yapılar direkt olarak bulunabilir. Bundan sonra tüm bunlara kısaca "tür" diyeceğim. Temsilciler ve arayüzleri ileride göreceğiz. Örnek bir program:

Gördüğünüz gibi bulunduğumuz isim alanından farklı bir isim alanındaki türle ilgili işlemleri ilgili isim alanını da belirterek yapıyoruz.
İsim alanları diğer bloklarda olduğu gibi blokun kapanmasıyla sonlanmaz. Eğer farklı dosyalardaki farklı türleri aynı isim alanına koyarsak bunlar aynı isim alanında sayılır. Örneğin Deneme1.cs dosyası şöyle olsun:

Deneme2.cs dosyası şöyle olsun:

Ve son olarak Deneme3.cs dosyamız şöyle olsun:

  
Şimdi bu üç cs dosyasını aynı klasöre koyalım. DOS'un cd komutuyla o klasöre geçelim ve csc Deneme1.cs Deneme2.cs Deneme3.cs komutunu verelim. Bu komutla C# derleyicisinin bu üç dosyayı tek dosya gibi düşünmesini sağladık. Bunu sınıflar için de yapabiliriz. Örneğin bir şans oyunu programının kullanıcı arayüzüyle ilgili üye elemanların bulunduğu sınıfı ayrı bir dosyaya, arka planla ilgili üye elemanların bulunduğu sınıfı başka bir dosyaya ve son olarak içinde Main metodunun olduğu ve temel komutları içeren son üye elemanların bulunduğu sınıfı da başka bir dosyaya koyarak komut isteminde aynı yöntemi kullanarak derleyebiliriz. Bu tür bir yöntem programımızın karmaşıklığını azaltacaktır. Yine bu tür bir yöntemde yalnızca bir tane Main metodu olmalıdır. Programımız, Main metodunun içinde bulunduğu dosya adında oluşacaktır. Yukarıdaki programa tekrar dönersek, program ekrana şunları yazar:

Burası ana program.
Sinif1 türünden nesne yaratıldı.
Sinif2 türünden nesne yaratıldı.

C# bu tür bir durumda Sinif1 ve Sinif2 sınıflarını aynı isim alanında sayar. Şimdi başka bir örnek yapalım:

Gördüğünüz gibi programımızın başında using Deneme; satırını da kullandığımız için artık bu isim alanındaki türlerle ilgili işlemleri direkt yapabiliyoruz. Programlarımızın ilk komutları using deyimleri olmalıdır. Bunun tek istisnası bir isim alanı bildirimi olması durumunda using deyimlerinin -isim alanının ilk komutları olması şartıyla- isim alanı bildiriminin içine de yazılabilmesidir. Örnek:

Ancak bu durumda Sinif2'nin içinde System isim alanının içindeki türleri direkt kullanamayız. Bir isim alanının içine yazdığımız using deyimiyle sadece o isim alanının içinde ilgili türlere direkt erişim hakkı elde ederiz. Başka bir örnek:

Yani bir isim alanı bildiriminin ilk komutları using deyimleri olma şartıyla using deyimlerinin illaki programımızın en başında olma şartı yoktur.
Aynı using deyiminin birden fazla kez yazılması durumunda program hata vermez, ancak gereksizdir. Örneğin aşağıdaki program hata vermez.

using anahtar sözcüğünün bir başka kullanımı da istediğimiz bir blokun sonunda nesnelerin Dispose() metodunu çağırmaktır. Örnek:

Bu program ekrana sırayla şunları yazar.

using bloku
Dispose() metodu çağrıldı.
using bloku dışı

Gördüğünüz gibi using blokunun hemen sonunda Dispose() metodu çağrıldı. using blokunu aşağıdaki şekilde de yazabilirdik:

Bu örnekte d1 ve d2 nesneleri için ayrı ayrı Dispose() metodu çağrılacaktır. Bu using blokunu aşağıdaki örnekteki gibi yazamazdık:

Yani nesneler aynı türden olmalıdır ve ortak tanımlama yapılmalıdır.

İsim alanları iç içe geçebilir. Örneğin .Net Framework kütüphanesinde System isim alanı altında veri tabanı işlemleri için özelleşmiş olan System.Data isim alanı bulunur. Kendimiz de iki türlü iç içe geçmiş isim alanları oluşturabiliriz. Birincisi klasik üst isim alanının blokları içinde yeni bir isim alanı tanımlayarak gerçekleşir. İkincisi de aşağıdaki gibi:

Burada UstIsımAlani isim alanına bağlı AltIsimAlani adında bir isim alanı oluşturduk.

C# programlama dilinde aynı seviyedeki ögeler aynı isme sahip olamaz, ancak farklı seviyelerdeki ögeler aynı isme sahip olabilir. Derleyici ismin hangi ögeyi kastettiğini ismin kullanım bağlamından çıkarır.
Bir metot içinde bir isme atıfta bulunulduğunda derleyici ilk önce bunun bir yerel değişken olabileceğini düşünür, eğer metotta o isimli bir yerel değişken yoksa bunun o sınıftaki bir üye olabileceğini düşünür, eğer sınıfta o isimli bir üye yoksa bu sefer erişilebilir konumdaki tiplere bakar, eğer o isimli bir tip yoksa bu sefer o isimli isim alanlarına bakar, eğer o isimli bir isim alanı yoksa program hata verir ve derlenmez. Yani isim araması daima içerden dışarı doğrudur. Örnekler:

Burada ekrana 3 çıktısı verilir. Burada yerel değişken aynı isimli alanı gizlemiştir.

Burada ekrana "Sinif sınıfı" çıktısı verilecektir. Burada aynı isimli bir özellik aynı isimli bir sınıfın kullanılmasını engellemiştir.

Burada erişilebilir durumda System isimli hem bir isim alanı, hem bir sınıf varken System isimli sınıf tercih edilmiştir. C# programlama dili aynı assembly'de aynı isimli tip ve isim alanlarının oluşturulmasına izin vermez. Ancak ilişkilendirdiğimiz bütün assembly'lerdeki bütün isim alanı ve tür isimlerini bilmeyebiliriz, daha da ötesi her bir assembly'nin diğerlerindeki tür ve isim alanı adlarını bilmesi de beklenemez. Bu yüzden C#, farklı assembly'lerdeki isim alanı ve tür isimlerinin çakışmasına izin verir. Çağrı yapılırken tür ve isim alanı çakışması olması durumunda C# türü tercih eder. Ancak elbetteki çakışma isim alanı ile isim alanı arasında veya türle tür arasında olursa derleme zamanı hatası meydana gelir.
Eğer üzerinde çalıştığımız assembly ile ilişkilendirdiğimiz bir assembly arasında isim çakışması meydana gelirse C# üzerinde çalıştığımız assembly'deki ögeyi kabul eder. Örnek:

Diyelim ki iki tane isim alanında aynı adlı türler var ve biz bu isim alanlarını using anahtar sözcüğü ile eklemişiz. Tahmin edersiniz ki bu durumda bu türlerden biriyle işlem yapmak istediğimizde hata oluşur. Çünkü derleyici hangi isim alanındaki türü kullanmak istediğimizi bilemez. İşte bu gibi durumlarda takma isim (alias) kullanılır. Örnek:

NOT: Böyle bir programda asıl isim alanlarının using anahtar sözcüğüyle ayrı olarak belirtilmesi şart değildir. Yani programımızda using IsimAlani1; ve using IsimAlani2; satırları bulunmasa da olurdu.
NOT: Takma ad kullanımı .Net Framework kütüphanesindeki sınıflarda da geçerlidir. Örnek:

Elbette ki programımızda Console dışında System isim alanına bağlı bir sınıf kullanacaksak using System; satırını programın başına eklemeliyiz. Ancak bu programda gerek yok. Başka bir örnek:

Burada Sinif sınıfı varsayılan hayalî isim alanımızda olduğu için isim alanını belirtmedik.

Burada System isim alanı varsayılan isim alanımız olmasına rağmen varsayılan hayalî isim alanımız olmadığı için program hata verir.
Tipler yanında isim alanlarına da takma isim verebiliriz. Örnek:

Eğer iki farklı isim alanında aynı isimli 100'er tane tür varsa bütün bu türlere farklı bir takma isim vermektense sadece isim alanların

Muhtemelen şu ana kadar fark etmişsinizdir. Ancak yine de söylemek istiyorum. Programlarımızdaki hatalar ikiye ayrılır: 

Derleme zamanı hataları
Çalışma zamanı hataları
Programımızda bir derleme zamanı hatası oluşursa derleme işlemi olmaz. Genellikle derleme zamanı hataları yanlış söz diziminden (sintaks) kaynaklanır ve tespiti kolaydır. Çalışma zamanı hataları ise daha çok mantıksal yanlışlıklardan kaynaklanır ve tespiti nispeten daha zordur. Örneğin kullanıcının girdiği iki sayıyı toplayan bir program yazdığımızı düşünelim. Kullanıcı sayıların yerine herhangi bir harf girerse programımız çalışma zamanı hatası verir ve kendisini sonlandırır. Böyle bir durumu engellemek için toplama işlemini yapmadan önce kullanıcının girdiği veriyi bir kontrolden geçirebiliriz. Örneğin kullanıcının girdiği stringin içinde foreach döngüsü yardımıyla dolaşıp herhangi bir rakam olmayan karakter varsa toplama işleminin yapılmamasını sağlayabiliriz. Ancak takdir edersiniz ki bu çok zahmetli bir yöntemdir. Üstelik bu kadar basit bir program için bu kadar zahmetli bir kod yazdığımızı düşünürsek büyük ölçekli projelerde zamanımızın çoğunu hata yakalamaya ayırmamız gerekirdi. İşte istisnai durum yakalama mekanizması böyle bir durumda zamanımızı büyük oranda kısaltır. İstisnai durum yakalama mekanizması programımızın bir çalışma zamanı hatasıyla karşılaştığında hata verip kendini sonlandırması yerine daha farklı işlemler yapılabilmesini sağlar. Şimdi kod yazmaya başlayabiliriz.

Bu programın şimdiye kadar yazdığımız programlardan farkı yok. Kullanıcının girdiği değerlerden en az biri sayı değilse program hata verip sonlanacaktır. Bunu önlemek için programı şöyle yazabiliriz:

Bu programda try blokunda herhangi bir çalışma zamanı hatasıyla karşılaşılır ise catch blokundaki satırlar çalıştırılır ve akış catch blokunun dışından devam eder. Eğer try blokunda herhangi bir çalışma zamanı hatasıyla karşılaşılmazsa catch blokundaki satırlar çalıştırılmaz ve programın akışı catch blokunun dışından devam eder. try ve catch blokları aynı blok içinde olmalıdır. Ayrıca try'dan hemen sonra catch gelmelidir. Başka bir örnek:

Burada finally blokunda hata oluşsa da oluşmasa da çalıştırılması istenen satırlar yazılır. finally blokunu belirtmek zorunda değiliz. Ancak try ve catch blokları istisnai durum yakalama mekanizmasının çalışması için mutlaka gereklidir. Programımızın hata vermemesi için try blokundan sonra catch ya da finally blokları gelmelidir. Ancak try blokundan sonra finally bloku gelirse istisnai durum yakalama mekanizması çalışmayacağı için böyle bir kullanım tavsiye edilmez.

Farkındaysanız şimdiye kadar try blokunda herhangi bir hata gerçekleşmesi durumunda catch blokundaki satırların çalışmasını sağladık. Şimdi hatanın türüne göre farklı catch bloklarının çalıştırılmasını sağlayacağız. Ancak bunun için bazı ön bilgiler almanız gerekiyor.
C#'ta bütün hata türleri System isim alanındaki birer sınıfla temsil edilir, bu sınıflar Exception sınıfından türeyen SystemException sınıfından türer. Programın try blokunda bir hata gerçekleştiği zaman bir hata sınıfı türünden nesne üretilir ve bu nesne catch blokuna parametre olarak gönderilir. Bu süreçte try blokunun yaptığı şeye "hata fırlatma", catch blokunun yaptığı şeye "hata yakalama" denir. Örnek:

System isim alanındaki FormatException metotlara yanlış formatta parametre verilmesiyle ilgilenir. Dolayısıyla da örneğimizde kullanıcı rakam yerine harf girerse Parse() metodu gerekli dönüşümü yapamayacağı için catch bloku çalışacaktır. Başka bir örnek:

IndexOutOfRangeException dizi sınırlarının aşımıyla ilgilenen bir sınıftır. Gördüğünüz gibi birden fazla catch bloku tasarlayıp oluşan farklı hata tiplerine göre catch bloklarından sadece birinin çalışmasını sağlayabiliyoruz. Başka bir örnek:

Hata sınıfları sonuçta bir sınıf olduğuna göre bu sınıfların kendine özgü üye elemanları olmalı. İşte Message özelliği hemen hemen bütün hata sınıflarında bulunur ve hatanın ne olduğunu belirten bir string döndürür (tabii ki İngilizce). Message gibi bütün hata sınıflarında bulunan bazı özellikler daha vardır:

Source Hata nesnesinin gönderildiği uygulama ya da dosyanın adıdır. (string)
StackTrace Hatanın oluştuğu yer hakkında bilgi verir. (string)
HelpLink Hatayla ilgili olan yardım dosyasını saklar. Tabii ki bunu programcı belirler. (string)
TargetSite İstisnai durumu fırlatan metot ile ilgili bilgi verir. (MethodBase)
InnerException catch bloku içerisinden bir hata fırlatılırsa catch blokuna gelinmesine yol açan istisnai durumun Exception nesnesidir.
ToString() Bu metot ilgili hataya ilişkin hata metninin tamamını string olarak döndürür.
Yukarıdaki üye elemanların tamamı static değildir. Şimdi çeşitli örnekler yapalım:

Bu program ekrana Dizi sınırları aşıldı. yazacaktır. Bu örnekte hatanın asıl oluştuğu yer Metot() metodudur. Ancak Metot() metodunun içinde bu hata yakalanmadığı için Main() metodunun içinde yakalanmıştır.

Bu program ekrana Metodun kendisinde hata yakalandı. yazacaktır. Yani daima hatanın gerçekleştiği yere en yakın olan hata yakalama mekanizması çalışır. Başka bir örnek:

Gördüğünüz gibi catch'e parametre verirken illaki nesne oluşturulmasına gerek yok. Sadece sınıfın adı yazılması yeterli. Ancak tabii ki bu durumda sınıfa ait üye elemanlara erişemeyiz. Başka bir örnek:

Bu programda istisnai durum mekanizmasını son derece yaratıcı bir şekilde kullandık. Programı biraz inceleyince ne yapmak istediğimizi anlayacaksınız.
NOT: Elbetteki try blokunun içinde bir hata fırlatıldığı zaman try blokunun geri kalan komutları çalıştırılmaz. Akış direkt catch blokuna yönlendirilir.

Aşağıdaki programı tekrar göz önüne alalım:

Bu programda aslında hatayı fırlatan Int32 yapısındaki Parse() metodudur. Ancak bu metot içinde bu hata yakalanmadığı için bu metodu çağıran Main() metodunda yakalanmıştır. Şimdiye kadar fırlatılan hatayı yakalamakla ilgilendik, şimdi kendimiz de hata fırlatabileceğiz. Hata fırlatmak için throw anahtar sözcüğünü kullanırız. Bu anahtar sözcük bir hata nesnesi fırlatmalıdır. Bir hata nesnesi throw anahtar sözcüğü yardımıyla şöyle fırlatılabilir:

veya

Birincisinde Message özelliğinin değeri "Dizinin sınırları aşıldı" stringi olan yeni bir IndexOutOfRangeException nesnesi fırlatılıyor. İkincisinde ise önce nesne oluşturuluyor sonra bu nesne fırlatılıyor. Nesne oluşturulurken yapıcı metot kullanılıyor. Şimdi bunları az önceki üzerinde görelim:

Şimdi aynı örneği throw anahtar sözcüğünün değişik formuyla yapalım:

Aslında bütün istisnai durum sınıfları Exception sınıfından türetilmiştir. Ancak Exception sınıfındaki üye elemanlar sanal olarak bildirilmiş ve istisnai durum sınıfları da bu üye elemanları override etmiştir. Benzer şekilde çoklu türetmenin yapıldığı sınıflar da mevcuttur. Örneğin:

SystemException sınıfı Exception sınıfından türemiştir.
IOException sınıfı SystemException sınıfından türemiştir.
FileNotFoundException sınıfı IOException sınıfından türemiştir.
Kalıtım konusunda da gördüğümüz gibi yavru sınıf nesneleri ana sınıf nesneleri yerine kullanılabilir. Dolayısıyla bir catch bloku IOException hatalarını yakalıyorsa aynı zamanda FileNotFoundException hatalarını da yakalar. Ancak tabii ki hem IOException hem de FileNotFoundException catch'leri oluşturulmuşsa FileNotFoundException'ın catch'i çalıştırılacaktır.
NOT1: Birden fazla catch bloku oluşturduğumuz durumlarda catch blokları art arda gelmelidir. Yani araya herhangi başka kod giremez.
NOT2: Bir C# programında aşağıdaki iki catch bloku varsa ikincisi (parametreli olan) çalışır.

Ancak başka dillerden alınmış bir COM parçacığı söz konusuysa birincisi çalışır. COM parçacıkları çok ayrıntılı ve karmaşık olduğundan ve muhtemelen işiniz düşmeyeceğinden birinci olasılığı özümsemeniz yeterlidir.
NOT3: Birden fazla art arda gelen catch blokunun parametreleri aynıysa programımız derlenmez.

try-catch-finally yapımızın şöyle olduğunu düşünelim:

Hatanın fırlatıldığı yere bağlı olarak çalışacak bloklar şöyledir:

A bölgesinden bir hata fırlatıldığı zaman dıştaki catch bloku ve dıştaki finally bloku çalışır, içteki finally bloku çalışmaz.
B bölgesinden bir hata fırlatıldığı zaman önce içteki catch bloklarına bakılır. Aynı tür varsa bu catch bloku çalıştırılır, aynı tür yoksa bilinçsiz tür dönüşümünün olup olmadığına bakılır. Birden fazla bilinçsiz tür dönüşümünün mümkün olduğu catch bloku varsa türetme zincirindeki daha yavru olan türlü catch bloku çalışır. Uygun tür yoksa dıştaki catch bloku çalıştırılır. B bölgesinde oluşan hata içerideki catch bloklarından yakalansın veya yakalanmasın içteki finally bloku çalışır.
C veya D bölgesinden bir hata fırlatıldığı zaman dıştaki catch bloku tarafından yakalanır ve dıştaki finally bloku çalışır, içteki finally bloku çalışmaz.
Benzer kurallar ikiden fazla iç içe geçmiş try blokları için de geçerlidir. Yani uygun tür varsa en içteki try blokundaki hata en içteki catch tarafından yakalanır. Uygun tür yoksa basamak basamak dışa çıkılır.
Hiç hata oluşmaması durumunda her iki finally bloku da çalışır.
Dıştaki finally bloku her durumda çalışır.
finally bloklarının çalışıp çalışmaması hatanın yakalanıp yakalanmamasına bağlı değildir. Sadece hatanın nerede oluştuğuna bağlıdır. B bölgesinde oluşan hatalarda hem içteki hem de dıştaki finally blokları çalışır. B bölgesi dışında ama dışarıdaki try bloku içinde oluşan hatalarda sadece dışarıdaki finally bloku çalışır.

Şimdiye kadar birkaç istisnai durum sınıfı gördük. Şimdi bunları ve sık kullanılan birkaç sınıfı daha göreceğiz:

System.OutOfMemoryException Programın çalışması için yeterli bellek kalmadıysa fırlatılır.
System.StackOverflowException Stack bellek bölgesinde yeterli alan kalmadıysa kullanılır. Kendini sonsuza kadar çağıran metot bu hatayı meydana getirir.
System.NullReferenceException Bellekte yer ayrılmamış bir nesne üzerinden sınıfın üye elemanlarına erişmeye çalışırken fırlatılır.
System.OverflowException Bir veri türüne kapasitesinden fazla veri yüklemeye çalışılırken fırlatılır.
System.InvalidCastException Tür dönüştürme operat

Bize art arda birden fazla nesne sunabilen tiplere ardıl denir. C# programlama dilinde ardıllar IEnumerable ve IEnumerable<T> arayüzleriyle temsil edilirler. Bu arayüzleri uygulayan tiplere ardıl özelliği gösteriyor denir. İteratörler ise ardılların art arda birden fazla nesne döndürebilmeleri için kullanılan yapılardır. Bir ardılı bir kitap gibi düşünürsek iteratör kitap ayracıdır. Kitap bir ardıldır. Çünkü her seferinde başka bir nesneyi (Sayfa) döndürebilir. Ancak her seferinde başka bir nesnenin döndürülebilmesi için kitap ayracına ihtiyacımız vardır. Kitap ayracı hangi sayfada kalındığı, sıradaki sayfanın talep edilmesi durumunda hangi sayfanın döndürüleceği bilgisini tutar. Ayrıca bir sayfa talep edildiğinde sıradaki sayfa varsa o sayfayı döndürüp kendini bir sonraki sayfaya atar. Eğer kitabın sonuna gelindiyse geriye sayfa döndürmez ve kitabın bittiği bilgisini döndürür. Aynı anda bir kitap üzerinde birden fazla ayraç dönebilir ve bunlar birbirinden bağımsız çalışır. Ayraçların hareketi kitapta ve diğer ayraçlarda herhangi bir değişikliğe neden olmaz. İteratörler .NET kütüphanesinde IEnumerator ve IEnumerator<T> arayüzleriyle temsil edilir. Şimdi bu verdiğimiz analojileri C# koduna dönüştürelim.

Bu program 1'den 10'a kadar sayfa numaralarını teker teker ekrana yazacaktır. IEnumerable<T> arayüzü IEnumerable arayüzünden, IEnumerator<T> arayüzü ise IEnumerator arayüzünden türemiştir. Dolayısıyla IEnumerable<T> arayüzünü uygulayan bir sınıfın IEnumerable sınıfındaki üyeleri de, IEnumerator<T> arayüzünü uygulayan bir sınıfın da IEnumerator arayüzündeki üyeleri de uygulaması gerekmektedir. IEnumerable arayüzünde IEnumerator döndüren GetEnumerator() metodu bulunaktadır. IEnumerable<T> arayüzünde IEnumerator<T> döndüren GetEnumerator() metodu bulunmaktadır. IEnumerable<T> arayüzü IEnumerable arayüzünden türediğine göre burada IEnumerable arayüzünden türeyen GetEnumerator() metodunu da uygulamalıyız. Ancak her iki metodun da imzası aynı, sadece geri dönüş tipleri farklı. O yüzden aynı sınıfta her iki metodu da klasik şekilde uygulayamayız. Bu nedenle ana arayüzden devralınan üyeyi açık arayüz uygulama yöntemiyle uygularız. Aynı durum IEnumerator ve IEnumerator<T> arayüzleri için de geçerlidir. IEnumerator<T> arayüzünde iki kere tanımlanan üye Current özelliğidir.
IEnumerator<T> arayüzü iteratörü temsil eder. Yapıcı metodunda üzerinde dönülecek asıl nesneyi alır. Ayracın hangi kitap üzerinde döneceğini bilmesi gerekir. MoveNext() metodu hem iteratörün bir sonraki ögeye gidip gidemeyeceğini döndürür hem de bir sonraki ögeye gidilebiliyorsa bir sonraki ögeye gitmeyi sağlayan kodları içerir. Current özelliği sıradaki ögeyi döndürür, bir sonraki ögeye gitme işlemi yapmaz. Reset() metodu iteratörü ilk ögeye döndürme için gerekli kodları içerir. Dispose() metodu iteratörle ilgili boşaltılması gereken kaynaklar varsa bunları boşaltmaya yarar. Örneğimizde dispose edilecek bir şey yoktur. Ancak bu her zaman böyle olmayabilir. Örneğin her iterasyonda belirli bir klasördeki dosyalar sırayla açılıp içeriği ekrana yazılıyor olabilir. Eğer dosya açıldıktan sonra ve kapatılmadan önce herhangi bir istisna oluşursa dosyanın düzgünce kapatılması gerekir. Böyle bir durumda Dispose() metoduna dosyanın kapatılmasıyla ilgili kodlar eklenir.

Ardılların bir özelliği de örneğimizde görüldüğü gibi foreach döngüsüyle kullanılabilmeleridir. Bir tipin foreach döngüsünde kullanılabilmesi için IEnumerable veya IEnumerable<T> arayüzlerini uygulaması yeterlidir. foreach döngüsüyle her iterasyonda edindiğimiz değer aslında az önce Current özelliği ile döndürülen değerdir. foreach döngüsünün bir sonraki iterasyona geçip geçmemesine MoveNext() metodu ile karar verilir. foreach döngüsü aslında C# programlama dilinin bize sağladığı bir kısayoldur. Şu kod:

C# derleyicisi tarafından IL'e dönüştürülmeden önce şu koda dönüştürülür:

Buradaki kodların using bloğu ile çevrili olması önemlidir. Eğer bloğun içinde herhangi bir istisna oluşursa enumerator nesnesine ilişkin Dispose() metodu çalışacaktır.

C# 1'de iteratörler yukarıda bahsedildiği gibi uygulanmaktaydı. Ancak bu kadar basit bir görev için bu kadar çok kod yazılmasına gerek olması iteratörleri C# 1'de kullanmamamıza neden oluyordu. Kütüphanede tanımlı ardılları foreach döngüsüyle rahatlıkla kullanabiliyorduk. Ancak kendi ardıllarımızı yazmıyorduk. C# 2 bu durumu kolaylaştırdı. C# 2'de artık çok daha rahatça IEnumerable<T> arayüzünü uygulayabiliyoruz. C# 2'de yukarıdaki Kitap sınıfındaki IEnumerator<Sayfa> döndüren GetEnumerator() metodunu şöyle yazabiliriz:

Bu metot normal bir metot değildir, bir iteratör metodudur ve kodların sırayla çalıştığı ve kodlar bitince veya return anahtar sözcüğüyle karşılaşıldığında çıkılan normal bir metoda benzemez. Bu metodun normal bir metot olmadığını geri dönüş tipinden anlayabilirsiniz. Geri dönüş tipi IEnumerator<Sayfa> arayüzüdür. Hepimiz biliriz ki arayüzler soyut tiplerdir. Gerçek anlamda bir arayüz nesnesi oluşturulamaz. Mutlaka o arayüzü uygulayan bir sınıfımız olması ve o sınıf türünden nesne döndürmemiz gerekir. Peki burada neler dönüyor?
Burada neler döndüğünden açıklamadan önce metodun içindeki yield return ifadesine odaklanalım. Bu ifade "sıradaki öge talep edildiğinde şimdilik bunu döndür, ama foreach döngüsündeki komutlar bittiğinde ve bir sonraki öge talep edildiğinde geri buraya döneceksin" demektedir. Bir de bunun gibi yield break ifadesi vardır. Bu da "döndüreceğim ögeler bitti. foreach döngüsünün bir sonraki iteasyonuna girme" demektedir. Yani programın akışı foreach döngüsünün içeriği ile burası arasında gidip gelmektedir. foreach döngüsünün her iterasyonunda bir sonraki yield return çalışmaktadır. Bu, normal metotlarda olmayan bir şeydir.
yield return ve yield break ifadeleri için bazı kısıtlamalar bulunmaktadır. yield return, catch bloğu olan try bloklarında kullanılamaz. finally bloklarında yield return veya yield break kullanılamaz.
İteratör metotlarının geri dönüş tipi IEnumerator, IEnumerator<T>, IEnumerable veya IEnumerable<T> olabilir. Ayrıca metotlar yanında özellikler de iteratör olabilir. Yani özelliklerin içinde de yield return ve yield break kullanılabilir. yield return'ün döndürdüğü değer metodun (veya özelliğin) geri dönüş tipine uyumlu olmalıdır. Geri dönüş tipi IEnumerable veya IEnumerator ise yield return object döndürmelidir. Eğer bu arayüzlerin jenerik eşdeğerleri kullanılmışsa yield return tip parametresindeki tipten döndürmelidir. İteratör metotları normal return ifadesi içeremez. IEnumerable<T> tipinden bir örnek verelim:

Şimdiye kadar ardıl özelliği gösteren tiplerden konuşmuştuk. Halbuki bu metot direkt ardıl döndürüyor. Direkt bir arayüz nesnesi döndüremeyeceğimize göre burada da birtakım numaralar olmalı. Bu metot geriye 1, 2 ve 3 değerlerinden oluşan bir ardıl döndürür.
Bir nesnenin foreach döngüsünde döndürülebilmesi için bu nesnenin sınıfının/yapısının System.Collections isim alanındaki IEnumerable veya System.Collections.Generic isim alanındaki IEnumerable<T> arayüzünü uygulaması gerekir. IEnumerable arayüzünün içeriği şöyledir:

Yani GetEnumerator() isminde tek bir metot içerir. Bu metodun geri dönüş tipi System.Collections isim alanındaki IEnumerator'dur. IEnumerable<T> arayüzünün içeriği ise şöyledir:

IEnumerator<T>, System.Collections.Generic isim alanındaki bir arayüzdür.
Bu arayüz geri dönüş tipi IEnumerator olan ve parametre almayan GetEnumerator() metodunu içerir. IEnumerator yine System.Collections isim alanında bulunan bir arayüzdür. Bu metodun geriye bir IEnumerator nesnesi döndürebilmesi için bizim başka bir sınıfta IEnumerator arayüzünü uygulamamız ve bu metodun geriye bu sınıf türünden nesne döndürmesi gerekmektedir. IEnumerator arayüzü Reset() ve MoveNext() metotlarını ve Current sahte özelliğini içerir.
Bir nesne foreach döngüsünde döndüren konumuna koyulursa C# derleyicisi bu nesnenin GetEnumerator() metodunu çalıştırarak IEnumerator nesnesini elde eder. Bu nesnenin MoveNext() metodu döngüye girilmeden ve döngüde her bir iterasyondan sonra çalıştırılır ve sıradaki iterasyona girilip girilmeyeceğini döndürür. Current sahte özelliği foreach döngü bloğunun içinde dönen değişkenin ne döndüreceğini döndürür, sadece get bloğu olmalıdır, geri dönüş tipi object'tir. foreach döngüsünün parantezleri içine yazılan dönen tipine göre foreach döngü bloğunun içinde Current sahte özelliğinin döndürdüğü object nesneye unboxing yapılır. foreach döngüsünün her bir iterasyonunda dönenin farklı olmasını sağlayan şey MoveNext() metodudur. IEnumerator nesnesi döngünün hayatı boyunca bellekte kalır, döngüden çıkılınca bellekten silinir.
Şimdi dönenin kendi türümüz olmasını sağlayalım:

Gördüğünüz gibi kendi oluşturduğumuz sınıf türünden nesnelerle diziler oluşturabiliyoruz. Nasıl ki int[] ile int türündeki veriler bir araya geliyorsa bizim örneğimizde de A türünden nesneler bir araya geldi.

C# programlama dilinde tipler iç içe tanımlanabilir. Örneğin:

Bu örnekte B sınıfı A sınıfının içinde bulunmaktadır. Bu türler iç içe geçmesine rağmen aslında birbirlerinden fiziksel olarak bağımsızdırlar. Yani üst sınıf türü nesne üzerinden alt sınıfın üye elemanlarına, alt sınıf türü nesne üzerinden üst sınıfın üye elemanlarına erişemeyiz. Alt sınıftan üst sınıfın statik ve statik olmayan üye elemanlarına erişebiliriz (private olanlar da dahil). Ancak statik olmayan üye elemanlara üst sınıf türünden nesne üzerinden erişebiliriz. Üst sınıf, alt sınıfın sadece public üye elemanlarına erişebilir. Benzer şekilde üst sınıf, alt sınıfın statik olmayan üye elemanlarına alt sınıf türünden nesne üzerinden erişebilir. C#'ta sınıfların içine başka sınıflar; sınıfların içine yapılar; yapıların içine başka yapılar; yapıların içine sınıflar; sınıfların ve yapıların içine arayüzler, temsilciler ve enumlar koyulabilir. Elbette ki arayüzler, temsilciler ve enumların bloğu olan üye elamanı olamadığı için bu türlerin içine başka türler konulamaz. Temsilciler konusu daha sonra işlenecektir. Ayrıca dış türlerin bir türün içindeki iç türe erişebilmesi için içerideki türün public olarak belirtilmesi gerekir. Bu durumda;

notasyonunu kullanırız. Yani bir sınıfın içindeki başka bir sınıfa erişmek için DisSinif.IcSinif yazarız. Elbetteki burada IcSinif sınıfının public olarak belirtilmesi gerekir. Türler de üye elemanlar gibi erişim belirleyicisi alabilir. Türlerin alabileceği erişim belirleyicileri türün iç tür veya dış tür olmasına göre değişmektedir. Dış türler (başka bir türün içinde olmayan türler) sadece public ve internal erişim belirleyicilerini alabilir. internal varsayılandır ve ilgili türe sadece derlendiği program içinden erişilebilir. Örneğin ilgili türü bir DLL'e koyarsak türe erişebilmek için türün public olarak belirtilmesi gerekir. İç türlerin hangi erişim belirleyicileri alabilecekleri ise iç türün hangi dış tür içinde tanımlandığına bağlıdır. Bu bakımdan iç türlerin ilgili dış türün üye elemanlarından herhangi bir farkı yoktur. Dış türün üye elemanları hangi erişim belirleyicilerini alabiliyorsa ilgili iç tür de o erişim belirleyicilerini alabilir. Örneğin bir sınıfın içinde tanımlanan üye elemanlar ve iç türler public, protected, internal, private ve protected internal erişim belirleyicilerini alabilir. Bu erişim belirleyicilerin anlamları şöyledir:

public: İlgili üye eleman veya iç türe her yerden erişilebilir.
protected: İlgili üye elaman veya iç türü sadece ilgili üye eleman veya iç türün içinde bulunduğu sınıfı türeten sınıf ve yapılar kullanabilir.
internal: İlgili üye eleman veya iç türe program içinde her yerden erişilebilir.
private: İlgili üye eleman veya iç türe sadece o üye eleman veya iç tür içinde bulunduğu sınıf içinden erişilebilir (varsayılan).
protected internal: İlgili üye eleman veya iç türe program içinden her yerden erişilebileceği gibi program dışından ilgili üye eleman veya iç türün içinde bulunduğu sınıfı türetmek şartıyla da erişilebilir.
Bunlar sınıfların üye eleman ve iç türlerinin alabileceği erişim belirleyicileriydi. Yapıların üye elaman ve iç türleri sadece public, private ve internal erişim belirleyicilerini alabilirler. Çünkü yapılar türetilmeyi desteklemezler. Enumlar ve arayüzlerin üye elemanları ise erişim belirleyicisi alamazlar, içsel olarak zaten public'tirler.
NOT1: Yavru sınıf/yapı ana sınıftan daha erişilebilir olamaz. Örneğin ana sınıf internal iken yavru sınıf public olamaz.
NOT2: Bir sınıf, yapı veya arayüz uyguladığı arayüzlerden daha erişilebilir olamaz.
NOT3: Bir temsilci, geri dönüş tipi ve parametre tiplerinden daha erişilebilir olamaz (temsilciler daha sonra gösterilecektir).
NOT4: Bir metot, geri dönüş tipi ve parametre tiplerinden daha erişilebilir olamaz.
NOT5: Bir özellik veya sahte özellik geri dönüş tipinden daha erişilebilir olamaz.
NOT6: Bir olay, tipinden daha erişilebilir olamaz (olaylar ileride gösterilecektir).
NOT7: Bir indeksleyici, geri dönüş tipinden ve parametre tiplerinden daha erişilebilir olamaz.
NOT8: Bir operatör, geri dönüş tipi ve parametre tiplerinden daha erişilebilir olamaz.

Dış sınıfı türeten yavru sınıf dış sınıfın iç sınıfına isim gizleme yapabilir, bilinçli isim gizleme için new anahtar sözcüğü kullanılır. Bilinçli isim gizleme yapılmazsa derleyici uyarı verir (hata vermez). Ancak iç sınıflarda virtual ve override anahtar sözcükleri kullanılamaz.

Şimdiye kadar bir sınıftaki tür bilgileri sınıf bildirimi esnasında belliydi. Ancak artık şablon tipler sayesinde sınıftaki istediğimiz türlerin nesne yaratımı sırasında belli olmasını sağlayacağız. Üstelik her nesne için söz konusu türler değişebilecek. Şablon tipler sayesinde türden bağımsız işlemler yapabileceğiz. Şimdi şablon tipleri bir örnek üzerinde görelim:

Bu programda s1 nesnesinin Ozellik özelliğinin geri dönüş tipi int, ancak s2 nesnesinin Ozellik özelliğinin geri dönüş tipi stringdir. Benzer şeyi metotların geri dönüş tipleri, metotların parametre tipleri vb. için de yapabilirdik. Bu programdaki Sinif sınıfı türden bağımsız bir sınıftır. Yani bu sınıfla istediğimiz türdeki verilerle çalışabiliriz. Bu programcılar için büyük esneklik sağlar. Sınıflar, arayüzler, yapılar, temsilciler ve metotlar şablon tip olarak bildirilebilir.

Bir sınıf (veya yapı, arayüz vs.) birden fazla şablon tip alabilir. Örnek:

Bu durumda bu sınıf türünden nesne şunun gibi yaratılır:

Aynı isim alanında isimleri aynı olsa bile farklı sayıda şablon tipi olan sınıflar bildirilebilir. Buna sınıf aşırı yükleme denir.

Şablon tipler arasında türeme ile ilgili çok fazla kombinasyon düşünebiliriz. Ancak biz burada karşımıza en çok çıkacak iki kombinasyondan bahsedeceğiz:

Arayüzlerin de şablon tipli versiyonları yazılabilir. Örneğin System.Collections.Generic isim alanında birçok şablon tipli arayüz bulunmaktadır. Bunlardan birisi de IEnumerable arayüzünün şablon tipli versiyonudur. IEnumerable arayüzünün şablon tipli versiyonu aşağıdaki gibidir.

Buradan anlıyoruz ki bu arayüzü uygulayan sınıf geri dönüş tipi IEnumerator<T> olan GetEnumerator() metodunu ve IEnumerable arayüzünün içerdiği tüm üyeleri içermeli. Bu arayüzü bir sınıfta şöyle uygulayabiliriz:

Burada hem IEnumerable hem de IEnumerable<T> arayüzlerinin metotları uygulandı. Çünkü IEnumerable<T> arayüzü, IEnumerable arayüzünden türemişti.

Bildiğiniz gibi sınıf düzeyinde bir şablon tip belirlediğimizde bu şablon tip metotların geri dönüş tipine, parametre tiplerine koyulabilir. Ancak bunun sonucunda bazen bir çakışma oluşabilir. Örneğin:

Bu sınıf türünden nesneyi şöyle tanımlayıp kullanırsak;

Sizce ne olur? Bu gibi bir durumda Metot(int a) metodu çalışır. Yani normal tipli versiyon şablon tipli versiyonu gizler.

Bildiğimiz gibi şablon tipler herhangi bir tipi temsil ederler. Bu yüzden C#, yalnızca bazı türlere özgü olan operatörler (+, -, *, ...) kullanılmasına izin vermediği gibi şablon tip türünden bir nesne yaratılıp bu nesneye bir değer verilmesine engel olur. Örnekler:

Bu sınıf derlenmez. Çünkü T tipinin hangi tip olduğunu bilmiyoruz. + operatörü bu tip için aşırı yüklenmiş olmayabilir. Bu yüzden C# bu gibi tehlikeli durumları önlemek için bu tür bir kullanımı engeller. Başka bir kullanım:

Yine burada da bir hata söz konusudur. Çünkü her tipten nesneye 0 atanmayabilir. Benzer şekilde yapı nesnelerine de null değer atanamaz. Gelelim default operatörüne. default operatörü bir şablon tipin varsayılan değerini elde etmek için kullanılır. Örnek:

Varsayılan değer bazı türler için 0 (int, short, float vs.) bazı türler için null (tüm sınıflar) bool türü için de false'tur.

Daha önce şablon tip türünden nesnelerle herhangi bir operatör kullanılamayacağını, bu şablon türden nesnelere herhangi bir sabit atanamayacağını vs. söylemiştik. Bunlara paralel olarak şablon tür nesneleriyle herhangi bir üye de (metot, özellik vs.) çalıştıramayız. Çünkü şablon tipin ne olduğunu bilmediğimiz için olmayan bir metodu çalıştırmaya çalışıyor olabiliriz. Tüm bunların sebebi aslında şablon sınıf türünden nesne yaratırken şablonu herhangi bir tür yapabilmemizdi. Eğer şablona koyulabilecek türleri kısıtlarsak bunları yapabiliriz. C#'ta şu kısıtlar bulunmaktadır:
struct şablon tip yalnızca yapılar olabilir.
class şablon tip yalnızca sınıflar olabilir.
new() şablon tipin parametre almayan bir yapıcı metotla nesnesinin oluşturulabilmesi gerekir.
türetme şablon tip mutlaka belirtilen bir türden türemiş olmalıdır.
interface şablon tip mutlaka belirtilen bir arayüzü uygulamalıdır.
Kısıtlar where anahtar sözcüğüyle yapılmaktadır. Şimdi isterseniz her bir kısıtı sırayla inceleyelim.

Türeme kısıtı sayesinde şablon tip nesnesiyle ana sınıftaki bütün üye elemanları çağırabiliriz. Ana sınıfın kendisi de bu türetme kısıtına uyar. Yani örnekteki D sınıfının T tip parametresine A da yazılabilir.
Türetme kısıtıyla tip parametresinin belirli bir türden türemesini isteyebilmekle birlikte bir tip parametresinin başka bir tip parametresinden türemesini de isteyebiliriz. Örnek:

Bu durumda sınıf içinde U tipten değişkenlere T tipten değişkenleri atayabiliriz.

new() kısıtı ilgili tipin parametre almayan bir yapıcı metotla nesnesinin oluşturulabildiğini belirtir. Örnek:

Artık bu sınıfın içinde T türünden nesneleri new operatörüyle oluşturabiliriz. Tabii ki C# şablon tipe parametre almayan bir yapıcı metotla nesnesi oluşturulamayan bir tür koyulmasını engelleyecektir.
NOT: new kısıtı ilgili tipin parametre almayan bir yapıcı metotla nesnesinin oluşturulabilmesini zorunlu kılar. Yapıcı metotla parametre vererek nesnesi oluşturulabilen, ancak parametre vermeden nesnesi oluşturulamayan tipler bu kısıtı sağlamaz.

Başka bir önemli kısıt ise arayüz kısıtıdır. Arayüz kısıtı sayesinde şablon tipe koyulan tipin mutlaka belirli bir arayüzü kullanmış olmasını sağlarız. Örnek program:

Bu program ekrana -1 0 -1 -1 çıktısını verecektir. .Net Framework kütüphanesindeki IComparable<T> arayüzünde CompareTo(<T> b) metodu bulunmaktadır. Bu programdaki Karsilastici<T> sınıfındaki T tip parametresi sadece kendisiyle karşılaştırılabilen sınıflar olabilir. Bir sınıf IComparable<T> arayüzünü iki şekilde kullanabilir. Birinci kullanım:

Bu sınıf kendisiyle karşılaştırılabilen bir sınıftır, az önceki programdaki tip parametresi olma şartını sağlamaktadır. Başka bir örnek:

Bu sınıf ise IComparable<T> arayüzünün kurulmamış halini uygulamaktadır. Bu durumda bu arayüzü uygulayan sınıfın en az bir tane T isimli tip parametresi olması gerekmektedir. Bu sınıf yukarıdaki kendiyle karşılaştırılabilme şartını sağlamamaktadır. Bu sınıf nesnesi kendisiyle değil, parametresindeki tiple karşılaştırılabilmektedir. Peki sadece, kendisiyle değil parametresindeki tiple karşılaştırılabilen sınıfları (yani örneğin yukarıdaki sınıfı) tip parametresi olarak kabul eden bir sınıf nasıl yazılır? Şöyle mi acaba:

Böyle bir şey olamaz. Çünkü tip parametreleri iç içe geçemez.
NOT: Arayüzün kendisi de arayüz kısıtına uyar.

Diğer önemli iki kısıt ise şablon tipe yalnızca bir referans tipi koyulabilmesini sağlayan class ve aynı şeyi değer tipleri için yapan struct kısıtlarıdır. Yapılar ve enumlar değer tipi; sınıflar, arayüzler ve temsilciler referans tipidir. Örnekler:

Tabii ki bir şablon tipe birden fazla kısıt eklenebilir. Bu durumda kısıtlar virgülle ayrılır. Örnek:

Kısıtlarda en önce sınıftan türeme kısıtı (veya class-struct kısıtı), sonra bir veya daha fazla arayüz kısıtı, sonra new() kısıtı olmalıdır.
new() kısıtı ile struct kısıtı bir arada olamaz.
Sınıftan türeme kısıtıyla "struct" veya "class" kısıtları bir arada olamaz.
class kısıtı ile struct kısıtı bir arada olamaz.
Sınıflar yanında diğer bütün şablon tip ve üye elemanlar da (temsilciler, arayüzler, yapılar, metotlar) kısıt alabilir.
Bir sınıfa eklenen birden fazla şablon tip varsa her biri için ayrı ayrı kısıtlar koyulabilir. Örnek:

Kısıta en az "class" koymak şartıyla == ve != ve operatörlerini tip parametresindeki nesneler için kullanabiliriz. Ancak bu durumda sınıf == ve != operatörlerini aşırı yüklemiş olsa bile sadece referansın eşitliği kontrol edilir. Eğer aşırı yüklenmiş == ve != operatörlerinin kullanılmasını istiyorsak tip parametresine "class" kısıtını koymak yerine o sınıftan türeme kısıtını koyabiliriz. Örnek:

Bu program alt alta True ve False çıktısını verecektir. Metot<T>() metodunun içinde t1 ve t2 nesnelerinin aşırı yüklenmiş == ve != operatörleri değil, C# derleyicisinin her referans tipindeki nesneye bahşettiği ve referansları kıyaslamaya yarayan == ve != operatörleri kullanılmıştır.
Kısıt almayan şablon tip nesneleriyle == ve != operatörleri kullanılamaz. Şablon tip nesneleriyle == ve != operatörlerinin kullanılabilmesi için şablon tipin class veya bir referans tipinden türeme kısıtını almış olması gerekir.
Kısıt almayan şablon tip nesneleri object tipine bilinçsiz (veya bilinçli) olarak dönüştürülebilir.
Kısıt almayan şablon tip nesneleri herhangi bir arayüz tipine bilinçli olarak dönüştürülebilir, ancak kurulmuş olan tip ilgili arayüzü uygulamamışsa çalışma zamanı hatası meydana gelir.
Kısıt almayan şablon tip nesneleri null değer ile karşılaştırılabilir. Bu durumda değer tipi nesneleri her zaman false döndürecektir, referans tipi nesneleri null olup olmama durumuna göre true ve false döndürebilir.
Kısıt almayan şablon tip nesneleri as ve is operatörleriyle kullanılabilir. Örnek:

Bir şablon tipten yapılandırmadan türeyen yavru tip en az ana sınıfın kısıtlarını uygulamalıdır. Örnek:

NOT: Main() metodu mutlaka şablon tipli olmayan bir sınıfın içinde olmalıdır, kendisi de şablon tipli olamaz. Ayrıca Main() metodu ya bir sınıfın içinde ya da bir yapının içinde olmalıdır. Diğer bir deyişle çalışabilir her program en az bir sınıf ya da yapı içermelidir.

Şimdiye kadar şablon tipler sınıf seviyesinde tanımlanmıştı. Halbuki şablon tipler metot ve temsilci düzeyinde de tanımlanabilir. Örnek:

Bu program alt alta 5 ve Veli yazacaktır.

Az önceki örneğin sadece Main() metodunu alalım:

Burada parametrelerin türleri belli olduğu hâlde ayrıca int ve string türlerini de belirttik. İstersek bunu şöyle de yazabilirdik:

Bu programda metot şöyle düşünecektir: "Benim parametrelerim T türünden, o hâlde yalnızca parametreme bakarak T'nin hangi tür olduğunu bulabilirim." Gördüğünüz gibi metotların aşırı yükleyerek saatlerce uğraşarak yazabileceğimiz programları şablon tipli metotlar kullanarak birkaç dakikada yazabiliyoruz.
NOT: Bir metot kısıtlayıcı tip parametresini bağlı olduğu sınıfın

Malzemeler:

2,5 su bardağı un
yarım çay kaşığı kabartma tozu
1/4 çay kaşığı tuz
1,5 su bardağı toz şeker
1 su bardağı tereyağı
2 adet iri yumurta
1 çay kaşığı vanilya
1 su bardağı dövülmüş ceviz
1 su bardağı bütün ceviz içi
Hazırlanması:

Unu, kabartma tozu ve tuzla birlikte eleyin. Ayrı bir kapta 1,5 su bardağı toz şeker ve oda sıcaklığındaki tereyağını mikserle karıştırın. Yumurtaları ve vanilyayı ekleyin, orta hızda bir müddet daha karıştırın. Üzerine unlu karışımı katın. Son olarak dövülmüş cevizleri fazla karıştırmadan ilave edin.
Bir fırın tepsisini yağlı kağıtla kaplayın. Hamurdan ceviz iriliğinde parçalar koparıp elinizle yuvarlayın. Yağlı kağıdın üzerine dizin. Her birinin üzerine yarım ceviz yerleştirin. Önceden ısıtılmış orta hararetli fırında 23-25 dakika pişirin. Fırından çıkartın ve soğumaya bırakın.
Üzeri için: çikolatayı benmari usulü eritin, üzerine 2 yemek kaşığı krema ekleyin. Bir çatalın ucundan akıtarak kurabiyelerin üzerine çikolata gezdirin. Çikolata donunca servis yapın.

Chronic Cluster Headaches

Sudden onset of unilateral pain, typically originating around the eyes, temple, cheek, and forehead. Typically along the V1 division of the trigeminal nerve
Frequently with concurrent ipsilateral autonomic activity, resulting in ptosis, miosis, lacrimation, conjunctival injection, rhinorrhea, and nasal congestion
Epidemiology
Prevalence of cluster headaches is estimated at 0.2%; incidence at 2-10/100,000
~10% develop chronic cluster headaches (remissions <30 days or duration >1 year)
~20& of CCH patients are highly refractory to medical treatment
Male 6:1 female predominance
Mean age of onset 30 years
Seasonal predilection for spring and fall
Increased incidence in monozygotic twins; 14x risk in first-degree relative and 2x risk in second-degree relative suggests role for genetic factors
Pathophysiology is not clear, but clinical presentation and functional imaging suggests central origin, with posterior hypothalamic hyperactivity. However, the pterygopalatine ganglion may also be involved, due to confluence of multiple nerve fibers passing through
Multiple surgical modalities (e.g. surgical başlıking of various nerves, MVD, deep brain stimulation, etc) have been explored, but all involved potential complications from surgery
Deep brain stimulation has proven to effective in both reducing pain and increasing efficacy of pain medications
Gamma Knife treatment targeting trigeminal nerve has not been successful, and has had much higher rate of side effects than same protocol used safely for trigeminal neuralgia. It is not clear whether the trigeminal nerve is more sensitive to RT in cluster headaches or more resistant to RT in trigeminal neuralgia
A single case report from Stanford suggest targeting the pterygopalatine ganglion at a lower dose might be efficacious

Stanford; 2007 PMID 17327771 -- "Cyberknife targeting the pterygopalatine ganglion for the treatment of chronic cluster headaches." (Lad SP, Neurosurgery. 2007 Mar;60(3):E580-1; discussioin E581.)
Case report. SRS targert to pterygopalatine ganglion; 45.5 Gy to 78% isodose line (Dmax 65 Gy)
Outcome: Good pain control
Minnesota; 2006 (1997-2001) PMID 17277688 -- "Long-term results of radiosurgery for refractory cluster headache." (McClelland S, Neurosurgery. 2006 Dec;59(6):1258-62; discussion 1262-3.)
Retrospective. 10 patients with refractory CH. GKS 75 Gy at 100% isodose to most proximal part of trigeminal nerve, with 50% isodose line outside brain stem. Median F/U 3.3 years
Outcome: pain relief fair in 1/10 and poor in 9/10 patients.
Toxicity: 50% facial numbness
Conclusion: no sustained pain relief when targetting TN
Marseille
Prospective trial. 10 patients. GKS target cisternal segment of trigeminal nerve. Dmax 80-85 Gy. Brainstem dose 4-11.1 Gy.
2006 PMID 17277687 -- "Trigeminal nerve radiosurgical treatment in intractable chronic cluster headache: unexpected high toxicity." (Donnet A, Neurosurgery. 2006 Dec;59(6):1252-7; discussion 1257.) Median F/U 3 years
Outcome: 2/10 CR, 1/10 good result, 7/10 no improvement.
Toxicity: 90% disturbances (3/10 paresthesia, 6 hypoesthesia including 2 deafferentation pain)
Conclusion: High rate of toxicity and failure, despite same methodology ast TN. Do not recommend for intractable CCH
2005 PMID 15654036 -- "Gamma knife treatment for refractory cluster headache: prospective open trial." (Donnet A, J Neurol Neurosurg Psychiatry. 2005 Feb;76(2):218-21.) Mean F/U 1 year
Outcome: 3/10 patients no pain, 3/10 patients few attacks, 4/10 no improvement
Toxicity: 50% injury (3/10 paresthesia, 1/10 hypoaesthesia, 1/10 deafferentation pain)
Conclusion: Rate and severity of nerve injury unexpectedly high; procedure less attractive
Ford Headache Clinic; 1998 (Alabama) PMID 9504996 -- "Gamma knife treatment of refractory cluster headache." (Ford RG, Headache. 1998 Jan;38(1):3-9.)
Case report. 6 patients. Dmax 70 Gy to CNV entry zone. Follow up 8-14 months
Outcome: 4/6 excellent relief, 1/6 good relief, 1/6 fair relief
Toxicity: none
Conclusion: GKS affords great promise with negligible risk

Guten Morgen!
Günaydın!
Wer bist du?
Kimsin?
Wer sind Sie?
Kimsiniz? (Resmi)
Wer seid ihr?
Kimsiniz? (Çoğul)
Wie heißt du?
Adın nedir?
Wie heißen Sie?
Adınız nedir? (Resmi)
Ich heiße Yıldız.
Adım Yıldız.
Ich liebe dich.
Seni seviyorum.
Ich liebe dich so sehr.
Seni o kadar çok seviyorum ki.
Wohin gehst du?
Nereye gidiyorsun?
Wo gehst du hin?
Nereye gidiyorsun?
Das weiß ich nicht.
Bunu bilmiyorum.
Wo bist du?
Neredesin?
Wo sind Sie?
Neredesiniz? (Resmi)
Wo seid ihr?
Neredesiniz? (Çoğul)
Was ist deine Staatsangehörigkeit?
Tâbiyetin nedir?
Was ist Ihre Staatsangehörigkeit?
Tâbiyetiniz nedir?
Ich bin Türke.
(Ben) Türk'üm.
Ich bin Deutscher.
(Ben) Alman'ım.
Woher kommst du?
Nerelisin?
Woher kommen Sie?
Nerelisiniz?
Aus welcher Stadt kommst du?
Hangi şehirden geliyorsun?
Aus welcher Stadt kommen Sie?
Hangi şehirden geliyorsunuz?
Aus welchem Land kommst du?
Hangi ülkeden geliyorsun?
Aus welchem Land kommen Sie?
Hangi ülkeden geliyorsunuz?
Ich bin aus Istanbul.
İstanbulluyum.
Ich lebe in der Türkei.
Türkiye'de yaşıyorum.
Ich lebe in Deutschland.
Almanya'da yaşıyorum.
Bist du ein Fremder?
Yabancı mısın?
Sind Sie ein Fremder?
Yabancı mısınız?
Was ist dein Beruf? / Was machst du beruflich?
Mesleğin nedir?
Was ist Ihr Beruf?
Mesleğiniz nedir?
Ich bin Arzt.
Doktorum.
Ich bin Student.
Öğrenciyim. (Üniversite)
Ich bin Schüler?
Öğrenciyim. (İlköğretim, lise)
Ich bin Rechtsanwalt.
Avukatım.
Seit wann bist du hier?
Ne zamandan beri buradasın?
Seit wann sind Sie hier?
Ne zamandan beri buradasınız?
Wie alt bist du?
Kaç yaşındasın?
Wie alt sind Sie?
Kaç yaşındasınız?
Ich bin zwanzig Jahre alt.
Yirmi yaşındayım.
Wo lebt deine Familie?
Ailen nerede yaşıyor?
Wo lebt Ihre Familie?
Aileniz nerede yaşıyor?
Bist du verheiratet?
Evli misin?
Sind Sie verheiratet?
Evli misiniz?
Nein, ich bin ledig.
Hayır, bekârım.
Wo arbeitest du?
Nerede çalışıyorsun?
Wo arbeiten Sie?
Nerede çalışıyorsunuz?
Was ist das?
Bu nedir?
Welche Farbe ist die Orange?
Portakal ne renktir?
Die Orange ist orange.
Portakal, turuncudur.
Was ist deine Telefonnumer?
Telefon numaran nedir?
Meine Telefonnumer ist ...
Telefon numaram ...
Wie geht es dir?
Nasılsın?
Prima/Danke, (mir geht's) gut/Ganz gut/Es geht/Nicht schlecht/Schlecht
Harika/Teşekkürler, iyiyim/Çok iyi/İdare eder/Fena değil/Kötü
Haben Sie Kinder?
Çocuğunuz var mı?
Hast du Kinder?
Çocuğun var mı?
Wie ist Ihre Name?
İsminiz nasıl/nedir?
Wie ist Ihre Famillienname?
Soyadınız nasıl/nedir?
 Wie bitte.
Efendim/anlamadım/ne dediniz anlamında kullanılır. (Nezaket içerir.)
Wiederholen Sie bitte.
Tekrarlar mısınız lütfen.
Buchstabieren Sie bitte.
Heceler misiniz/harfleri kodlayabilir misiniz lütfen? (Söyleneni yazabilmek için gerekli bir rica cümlesi.)
Kann ich Ihnen helfen?
Size yardım edebilir miyim?
Bitte, können Sie mir helfen?
Lütfen bana yardım edebilir misiniz?
Darf ich behilflich sein?
Yardımcı olabilir miyim?
Du hast recht.
Haklısın
Ich verstehe Sie nicht.
Sizi anlamıyorum.
Du siehst wunderbar aus.
Harika görünüyorsun.
Ich sterbe vor Hunger.
Açlıktan ölüyorum.

Hamıya salam!
Herkese selam!
Arzularınız çin olsun!
Arzularınız gerçek olsun!
Mən səni sevirəm.
Ben seni seviyorum.
Bu sözü sənə çoxdan demək istəyirəm.
Bu sözü sana çoktandır söylemek istiyorum.
Yarım nə zamandır küsmüsən məndən; nə bizə gəlirsən, nə zəng edirsən.
Yârim ne zamandır küstün bana; ne bize geliyorsun, ne telefon ediyorsun.
Səninlə blutuz kimi uzaqdan yox, ik-port kimi yaxından tanış olmaq istəyirəm.
Seninle bluetooth gibi uzaktan değil, ic port gibi yakından tanışmak istiyorum.
İnsanlar dəyişir, xəyallar dəyişir. duyğular dəyişir, hətta arzular dəyişir. Dəyişməyən bircə sənin corablarındı. Get corablarını dəyiş.
İnsanlar değişiyor, hayaller değişiyor, duygular değişiyor, hatta arzular değişiyor. Değişmeyen bir tek senin çorapların. Git çoraplarını değiştir.
Qaqaş limon da gətir!
Kanka limon da getir!
Hər kəsin sağlamlığını qorumaq və tibbi yardım almaq hüququ vardır.
Herkesin sağlığını koruma ve tıbbi yardım alma hakkı vardır.
Yardıma möhtac olanlara kömək etmək, ilk növbədə, onların ailə üzvlərinin borcudur.
Yardıma muhtaç olanlara yardım etmek, ilk önce onların aile üyelerinin görevidir.
Hər kəsin fikir və söz azadlığı vardır.
Herkesin düşünce ve ifade özgürlüğü vardır.
Hər kəsin başqaları ilə birlikdə sərbəst toplaşmaq azadlığı vardır.
Herkesin başkaları ile birlikte serbest toplanma özgürlüğü vardır.
Sən dəli olmusan?
Sen delirdin mi?
Sən deyəsən özünü itirmisən.
Sen galiba kendini kaybettin.
Sənin başına hava gəlib.
Sen kafayı üşütmüşsün.
Hər kəsin qanuni yolla istədiyi məlumatı axtarmaq, əldə etmək, ötürmək, hazırlamaq və yaymaq azadlığı vardır.
Herkesin, istediği bilgiyi yasal yolla aramak, elde etmek, ulaştırmak, hazırlamak ve yayınlamak özgürlüğü vardır.
Hər kəsin doğulduğu andan toxunulmaz, pozulmaz və ayrılmaz hüquqları və azadlıqları vardır.
Herkesin, doğduğu andan itibaren dokunulmaz, bozulmaz ve ayrılmaz hak ve özgürlükleri vardır.

Hej. Merhaba.
Hvordan går det? Nasılsın?
Jeg har det fint, tak. Ben iyiyim, teşekkür ederim.
God morgen. Günaydın.
Hvad hedder du? Adın ne?
Jeg hedder Anıl. Benim adım Anıl.
Rart at møde dig. Tanıştığımıza memnun oldum.
Er du sulten? Aç mısın?
Hvad synes du? Ne düşünüyorsun?
Held og lykke! İyi şanslar!
Tillykke! Tebrikler!
Jeg skal bruge hjælp. Yardıma ihtiyacım var.
Hvad er det der? Bu nedir?
Hvad laver du? Ne yapıyorsun?
Det ved jeg ikke. Bilmiyorum.
Forstår du? Anlıyor musun?
Det forstår jeg ikke. Anlamıyorum.
Jeg wil gerne købe noget til dig. Senin için bir şey almak istiyorum.
Hun kan ikke lide te eller kaffe. O, çay ya da kahve sevmez.
Han kan ikke lide fisk. O, balık sevmez.
Det her er lækkert. Bu lezzetli.
Kaffe er min yndlingsdrik. Kahve benim favori içeceğim.
Kan du lide chokolade? Çikolata sever misin?
Hvem er de? Onlar kim?
Han er min bror. O benim ağabeyim.
Hvor gammel er han? O kaç yaşında?
Han er tolv år gammel. O, on iki yaşında.
Du er meget ung. Sen çok gençsin.
Hvor er sygehuset ? Hastane nerede?
Hvad er problemet? Sorun nedir?
Ingen problemer. Sorun yok.
Hvorfor er du så ked af det? Neden çok üzgünsün?
Jeg er vred fordi jeg er sulten. Sinirliyim çünkü açım.
Hvad er klokken? Saat kaç?
Den er to. Saat iki.
Kan du tale engelsk? İngilizce konuşabiliyor musun?
Hvad betyder det? Bu ne anlama geliyor?
Kan du tale langsommere? Daha yavaş konuşabilir misin?
Jeg er journalist. Ben bir gazeteciyim.
Jeg skriver historier hver dag. Ben her gün hikayeler yazarım.
Jeg har allerede en telefon. Zaten bir telefona sahibim.
Han hader at læse avisen. O, gazete okumaktan nefret eder.
Jeg har ikke penge nok. Yeterli paraya sahip değilim.
Ved du hvor mine nøgler er? Anahtarlarımın nerede olduğunu biliyor musun?
Dine nøgler er under sofaen. Senin anahtarların kanepenin altında.

Bonjour.
Merhaba. / Günaydın.

Bon après-midi.
Tünaydın.

Bonsoir.
İyi akşamlar.

Bonne nuit.
İyi geceler.

Qui es-tu ?
Kimsin?

Qui êtes-vous ?
Kimsiniz?

Comment tu t'appelles ?
Adın ne?

Comment vous vous appelez ?
Adınız ne?

Je m'appelle Laurie.
Benim adım Laurie.

D'où êtes-vous ?
Nerelisiniz?

Je suis anglaise.
İngiliz'im. (bayan)

Je suis française.
Fransız'ım. (bayan)

Parlez-vous français ?
Fransızca konuşur musunuz?

Je ne comprends pas.
Anlamıyorum.

Quel genre de musique aimez-vous ?
Ne tür müzikten hoşlanırsınız?

Quel moteur de recherche utilisez-vous ?
Hangi arama motorunu kullanırsınız?

Qui est votre meilleure amie ?
En iyi (dişi) arkadaşınız kim?

J'ai un rendez-vous.
Bir randevum var.

Je suis dans l'atelier.
Ben atölyedeyim.

Quel est ton numéro de téléphone ?
Telefon numaran ne?

Mon numéro de téléphone est le 2932.
Telefon numaram 2932.

Où es-tu ?
Neredesin?

Où êtes-vous ?
Neredesiniz?

Je suis français.
Fransız'ım (erkek).

Je suis turc.
Türk'üm (erkek).

D'où viens-tu ?
Nerelisin?

De quel pays viens-tu ?
Hangi ülkeden geliyorsun?

De quelle ville es-tu ?
Hangi şehirlisin?

Je suis d'Istanbul.
İstanbulluyum.

J'habite en Turquie.
Türkiye'de yaşıyorum.

J'habite en France.
Fransa'da yaşıyorum.

J'habite à Paris.
Paris'te yaşıyorum.

As-tu des enfants ?
Çocuğun var mı?

Avez-vous des enfants ?
Çocuğunuz var mı?

J'ai deux enfants.
İki çocuğum var.

Quel est votre nom de famille ?
Soyadınız nedir?

Répétez, s'il vous plaît.
Lütfen tekrarlayınız.

Peux-je vous aider ?
Size yardım edebilir miyim?

Pouvez-vous m'aider, s'il vous plaît ?
Lütfen bana yardım edebilir misiniz?

Puis-je vous être utile ?
Size yardımcı olabilir miyim?

Tu as raison.
Haklısın.

Je ne vous comprends pas.
Sizi anlamıyorum.

Je meurs de faim.
Açlıktan ölüyorum.

გამარჯობა (gamarcoba) Merhaba; Selam
როგორ ხართ (rogor khart) Nasılsınız?
რას აკეთებ? (ras aketeb) Ne yapıyorsun?
გმადლობთ (gmadlobt) Teşekkür ederim; Sağolun
ნახვამდის (nakhvamdis) Allaha ısmarladık; Güle güle
რა გქვია? (ra gkvia) İsmin ne?
მე მქვია ... (me mkvia ...) Benim ismim ...
კარგად ვარ (k'argad var) İyiyim.
ცუდად ვარ (tsudad var) Kötüyüm.
ავად ვარ (avad var) Hastayım.
რა თქმა უნდა (ra tkma unda) Tabii ki
რომელი საათია? (romeli saatia) Saat kaç?
არაფრის (arapris) Rica ederim
სასიამოვნოა თქვენი გაცნობა (sasiamovnoa tkveni gatsnoba) Sizinle tanıştığıma memnun oldum
ეს რა ღირს? (es ra ghirs) Bu ne kadar?
სადაური ხარ? (sadauri khar) Nerelisin?
შეგერგოთ (şegergot) Afiyet olsun
რამდენი წლის ხარ? (ramdeni tzlis khar) Kaç yaşındasın?
ოცდაათი წლის ვარ (otsdaati tzlis var) Otuz yaşındayım.
ქართველი ვარ (kartveli var) Gürcüyüm.
თურქი ვარ (turki var) Türküm.
თურქეთიდან ვარ (turketidan var) Türkiyeliyim.
სტამბოლში ვცხოვრობ (stambolşi vtshovrob) İstanbul'da yaşıyorum.
უკაცრავად (uk'atsravad) Afedersiniz.
ბოდიში (bodişi) Özür dilerim.
თუ შეიძლება დამეხმაროთ? (tu şeidzleba damekhmarot) Bana yardım edebilir misiniz?
დიახ (diakh) Evet.
არა (ara) Hayır.
ალბათ (albat) Belki.
კეთილი იყოს თქვენი მობრძანება (k'etili iqos tkveni mobrdzaneba) Hoş geldiniz
როგორ მივიდე თავისუფლების მოედანში? (rogor mivide tavisuplebis moedanşi) Özgürlük meydanına nasıl giderim?

Hic totus liber litteras Romanas semper laudat.
Bu kitabın tümü Roma edebiyatını her zaman över.

Illud de vitiis istius reginae nunc scribam, et ista poenas dabit.
Şu kraliçenin kusurları hakkında o şeyi şimdi yazacağım ve o cezasını ödeyecek.

Potestne laus ullius terrae esse perpetua?
Herhangi bir ülkenin övgüsü uzun süreli olabilir mi?

Labor unius nunquam poterit has copias vincere.
Bir kişinin çabası bu askerî kuvvetleri asla yenemeyecek.

Mores istius scriptoris erant nimis mali.
Şu yazarın karakteri haddinden fazla kötüydü.

Dum illi ibi remanent, alii nihil agunt, alii discunt.
Onlar orada kalırlarken, bazıları hiç bir şey yapmıyorlar, bazıları da öğreniyorlar.

Ubi illas nunc videre possum?
Şimdi onları nerede görebilirim?

Hic illam virginem in matrimonium ducet.
Bu adam o genç kızla evlenecek.

Huic consilio palmam do.
Ödülü bu plana veriyorum.

Virtutem enim illius viri amamus.
Gerçekten o adamın erdemini seviyoruz.

Solus hunc iuvare potes.
Sadece sen bu adama yardım edebilirsin.

Poena istius unius nunc morbum civitatis relevabit sed periculum semper remanebit.
Bir tek şunun cezalandırılması şimdi devletin sıkıntısını giderecek fakat tehlike her zaman kalacak.

Hi enim de exitio huius civitatis et totius orbis terrarum cogitant.
Bu adamlar bu devletin ve bütün dünyanın yıkımı konusunda düşünüyorlar.

Est nullus locus utri homini in hac terra.
Bu ülkede her iki insana hiç yer yoktur.

Vita non est sine multis periculis.
Hayat çok tehlikesiz değildir.

Boni viri otium amant.
İyi kişiler huzuru severler.

Otium bello saepe non conservamus.
Huzuru sık sık savaşla korumayız.

Stultus vir pericula belli laudat.
Akılsız kişi savaşın tehlikelerini över.

Populus romanus otium bonum non semper habet.
Roma halkının her zaman iyi huzuru yoktur.

Patriam et otium bellis parvis saepe servant.
Vatanı ve huzuru sık sık küçük savaşlarla korurlar.

Pauci viri veros amicos habent et pauci sunt digni.
Çok az insanların gerçek arkadaşları vardır ve çok azı değerlidir.

Amicitia vera est praeclara et omnia praeclara sunt rara.
Gerçek arkadaşlık göz kamaştırıcıdır ve bütün göz kamaştırıcı şeyler nadirdir.

Homines dificilia officia timent.
İnsanlar zor görevlerden korkarlar.

Ars longa, vita brevis est.
Sanat uzun hayat kısadır.

Brevi tempore omnia iura civium mutabunt.
Kısa zamanda vatandaşların bütün hakları değişecek.

Medicus puellam fortem adiuvere non poterat, nam mors erat celeris.
Doktor cesur kıza yardım edemiyordu zira ölüm hızlı idi.

Homines fortes ante aetatem nostram vixerant.
Güçlü insanlar bizim zamanımızdan önce yaşamışlardı.

Themistocles omnes cives apellabat et memoria acri eorum nomina tenebat.
Themistocles bütün vatandaşları adıyla çağırıyordu ve onların isimlerini keskin hafızasıyla tutuyordu.

Rexes sapientes bella longa non amant.
Akıllı krallar uzun savaşları sevmezler.

Lentulus, amicus noster, puerum audacem puniverat.
Arkadaşımız Lentulus, cüretkâr çocuğu cezalandırmıştı.

Nuntii celeres libros, dona tua, portaverunt.
Sür'atli haberciler senin armağanların olan kitapları taşıdılar.

Regina naves multas miserit.
Kraliçe birçok gemiler göndermiş olacak.

Servi miseri onera gravia timuerant.
Zavallı köleler ağır yüklerden korkmuşlardı.

Iulia, soror mea, carmen dulce cantavit.
Kardeşim Iulia tatlı bir şarkı söyledi.

Sagittae celeris hostium nostros terruerant.
Düşmanların süratli okları bizimkileri korkutmuştu.

Portam magnam urbis tibi ostenderamus.
Şehrin büyük kapısını sana göstermiştik.

Verba sapientia amici nostri audivistis.
Arkadaşımızın akıllı sözlerini işittiniz.

Omnes regem et reginam in urbe vederant.
Herkes kral ve kraliçeyi şehirde görmüştü.

Diligo puellam quae ex Italia venit.
İtalya'dan gelen kızı seviyorum.

Homo de quo dicebas est amicus carus.
Hakkında konuştuğun insan değerli bir dosttur.

Puella cui librum dat est fortunata.
Kitabı verdiği kız şanslıdır.

Puer cuius patrem iuvabamus est fortis.
Babasına yardım ettiğimiz çocuk cesurdur.

Femina quam laudas est docta.
Övdüğün kadın bilgilidir.

Vitam meam committam, eis viris quorum virtutes laudabas.
Erdemlerini övdüğün o adamlara hayatımı emanet edeceğim.

Timeo idem periculum quod timetis.
Korkmakta olduğunuz aynı tehlikeden korkuyorum.

Multi cives aut ea pericula quae imminent non vident aut ea quae vident neglegunt.
Birçok vatandaş ya yakın oldukları tehlikeleri görmüyor ya da gördüklerini umursamıyorlar.

Matrem quae habuit multos filios adiuverant.
Birçok oğlu olan anneye yardım etmişlerdi.

Tyrannus urbes ex quibus cives fugerant delevit.
Tiran vatandaşların kaçıp gitmiş olduğu şehirleri tahrip etti.

Vir cuius filiam laudamus in urbem veniebat.
Kızını övmekte olduğumuz adam şehre geliyordu.

Laudaverunt civem cuius septem filii patriam servaverant.
Yedi oğlu vatanı kurtarmış olan vatandaşı övdüler.

Non accepimus dona quae miseratis.
Göndermiş olduğunuz armağanları almadık.

Nondum potui legere libros quos mihi dedisti.
Bana verdiğin kitapları henüz okuyamadım.

Servum cui epistulam dedisti in fora vidimus.
Mektubu verdiğin köleyi çarşıda gördük.

Puer quem servavistis est filius agricolae.
Kurtardığınız çocuk bir çiftçinin oğludur.

Bis vincit qui se vincit in victoria.
Zaferde kendisini yenen iki kez yener.

Non solum fortuna ipsa est caeca sed etiam eos caecos facit quos semper adiuvat.
Yalnızca talihin kendisi kör değil, aynı zamanda her zaman yardım ettiklerini kör yapar.

Fortuna eum stultum facit quem nimium amat.
Talih aşırı sevdiği kişiyi aptal yapar.

Levis est fortuna id cito reposcit quod dedit.
Talih dönektir, verdiği şeyi çabuk geri alır.

Qui coepit, dimium facti habet. Incipe!
Başlayan kişi işin yarısına sahiptir. Başla!

Salve, bone amice, cui filium meum heri commisi.
Merhaba dün oğlumu emanet ettiğim iyi arkadaşım.

Cicero rempublicam laudabat.
Cicero cumhuriyeti övdü.

De republica multa dixerunt.
Cumhuriyet üzerine birçok şey konuştular.

Urbs a malis viris delebatur.
Şehir kötü kişiler tarafından tahrip ediliyordu.

Urbs flammis delebatur.
Şehir alevlerle tahrip ediliyordu.

Hi cives patriam conservabunt.
Bu vatandaşlar vatanı kurtaracaklar.

Patria ab his civibus conservabitur.
Vatan bu vatandaşlar tarafından kurtarılacak.

Patria armis et veritate conservabitur.
Vatan silahlarla ve doğrulukla korunacaktır.

Cui dabuntur libri quos legi?
Okuduğum kitaplar kime verilecek?

A quibus filii agricolae laudabuntur?
Çiftçinin oğulları kimler tarafından övülecek?

Reges culpati erant.
Krallar suçlanmışlardı.

Libri missi erant.
Kitaplar gönderilmişti.

Multae epistulae a te scriptae erunt.
Birçok mektuplar senin tarafından yazılmış olacak.

Periculum superatum erit.
Tehlikenin üstesinden gelinmiş olacak.

Discipuli in schola non visi sunt.
Öğrenciler okulda görülmediler.

Multi libri a vobis legentur.
Birçok kitaplar sizin tarafınızdan okunacak.

Urbs a rege regebatur.
Şehir bir kral tarafından yönetiliyordu.

Urbs a nostris capta erat.
Şehir bizimkiler tarafından alınmıştı.

Filii agricolae ab omnibus laudati sunt.
Çiftçinin oğulları herkes tarafından övülüyordu.

Consul in senatu non visus est.
Konsül senatoda görülmedi.

Vicini nostri se in genua protinus iecerunt et omnes deos in mundo laudaverunt.
Komşularımız birdenbire diz çöktüler ve dünyadaki bütün tanrıları övdüler.

Gentes Graeciae ingentibus montibus et parvis finibus continebantur.
Yunanistanın yüksek dağlarla ve küçük arazilerle çevreleniyordu/sınırlanıyordu.

Quis iussit illam rem publicam servitute aspera liberari?
O devletin zor kölelikten kurtarılmasını kim emretti?

Dum vita est, spes est.
Yaşam varken umut vardır.

Hoc, fortuna, tibi videtur aequum.
Ey talih bu şey sana eşit görünüyor.

Senes in gente nostra filiis numquam neglegebantur.
Yaşlılar kavmimizde oğulları tarafından hiç bir zaman ihmal edilmiyorlardı.

Si vis pacem, para bellum.
Barış istiyorsanız, savaşa hazırlanın.

Quando cornu audivit, senex in genua cecidit et deis immortalibus gratias pronuntiabat.
Borazanı işittiği zaman, yaşlı adam, dizlerinin üzerine çöktü ve ölümsüz tanrılara şükranlarını bildirdi.

1.Como está? - Nasılsınız?
2.Bem, obrigado. (Erkekler kullanır.) - İyiyim, teşekkür ederim.
3.Bem, obrigada. (Kadınlar kullanır.) - İyiyim, teşekkür ederim.
4.Por favor. - Lütfen.
5.Obrigado - (Erkekler teşekkür ederken kullanırlar.) - Teşekkür ederim.
6.Obrigada - (Kadınlar teşekkür ederken kullanırlar.) - Teşekkür ederim.
7.De nada. - Bir şey değil.
8.Sim - Evet
9.Não - Hayır
10.Não sei. - Bilmiyorum.
11.Amo-te (Portekiz'de) Te amo (Brezilya'da) - Seni seviyorum.
12.Onde você vai? - Nereye gidiyorsun?
13.Quantos anos você tem? - Kaç yaşındasın?
14.Qual é o seu nome? - Adın ne?
15.Qual é a sua profissão? - Mesleğiniz nedir?
16.Quem é você? - Kimsin?
17.Por favor, você pode me ajudar? - Lütfen, bana yardım edebilir misiniz?
18.Saudades! - Özledim!
19.Que linda! - Ne güzel!
20.Feliz aniversário. - Mutlu yıllar.
21. Parabéns! - Tebrikler!
22. Tudo estava perfeito. - Her şey muhteşemdi.

Как вас зову́т?
Kak vas zavút?
Adınız nedir?

Меня́ зову́т Ахме́т.
Minyá zavút Ahmyet.
Benim adım Ahmet.

Отку́да вы?
Atkúda vı?
Nerelisiniz?

 Я из Ту́рции.
Ya iz Turts'i.
Türkiye'denim.

 Каку́ю му́зыку вы лю́бите?
 Kakúyu múzıku vı lyubitye?
Ne tür müzikten hoşlanırsınız?

 Я люблю́ поп му́зыку.
 Ya lyublyú pop múzıku. 
Pop müzikten hoşlanırım.

 Каку́ю по́исковую систе́му вы испо́льзуете?
 Kakúyu póiskavuyu sistyému vı ispól'zuyitye?
Hangi arama motorunu kullanırsınız?

 Ва́ша профе́ссия? 
Váşı prafessiyı?
Mesleğiniz nedir?

 Я учени́к.
 Ya uçin'îk. 
Ben bir öğrenciyim.

 Ско́лько вам ле́т?
Skol'kı vam lyet?
Kaç yaşındasınız?

 Мне четы́рнадцать ле́т.
Mn'e çitírnıtsıt' lyet.
On dört yaşındayım.

 Ты учи́тель?
 Tı uçîtil'?
Öğretmen misin?

 Твоя́ кни́га здесь. 
 Tvayá knîgı zdyes'.
Kitabın burada.

 Ты удиви́тельно вы́глядишь. 
 Tı udivîtil'na vígl'idiş'.
Harika görünüyorsun.

Dostê pi u kali, laceki rê miraso.
Adır vatene ra, fek nêvêşeno.
Senik vacé, zaf goş sernê.
Merdımo ke deyn ra terseno, gereke keyberê gırdi ra mekero.
Teneko tal veng veceno.
Merdımo cefa neanita, qedrê sefa nezano.
Comerd vanê mali ra kenê, egit vanê cani ra kenê.
Kutıkê teberi, hesarê keyi nêbeno.
Veyşan vano: "Mırd nêben", Mırd vano:"Veyşan nêben."
Sergovendi veyve ra, domani kayir a aciz nêbené.
Darê çixa derg bena bıbo ki, ca ra nêresena asmên.
Cayo ke koyi çıne bi, tum xo ko vineno.
Kilito zernên her keyberi keno a (ra)
Mangaya ke hebe zengila vındi nêbena.
Serê koy ra mij kemi nêbeno.
Hebe torbê tali asro rê nêna pêguretene.
Merdene rê çare çıniyo.
Merdena here kutıki rê bena veyve.
Fırsend her tım dest nêkuno.
Kıymete xortine, demê kalbiyayeni de eno zanitene.
Vace ke asmên de veyve esto, cêniye nerdugan nane ro.
Merdıno ke hebe roj çıla fıstê ra, şan de tari de maneno.
Kamci roje şand nêbiyo.
Her rındeke qusurê de xo esto.
Palêyo xırab verva iandi zeredejan gêno.
Kutık payna lınga kutıki nêdano.
Xebera xırabe rew bena vıla.
Qantıre ra pers biyê: " Piyê to kamo ", Vato: " Xalê mı astoro.
Kes nêkuno mezela kesi.
Koçe berani berani re bar niyo.
Oyo (yewo, juyo) ke heqi ra nêterseno, cı ra bıterse.
Merdımo ke şi meymantiya cınawiri (vergi), gereke kutikê xo, xo de bero.
Leylegê ke teyr say kena, amnani yena zımıstani şona.
Kami ke tuye vayi kerdo, tuye ru (ri) ye ho kerdo.
Kari ra mêterse wa kar to ra bıterso.
İnsan kal beno, zerri kal nêbena.
Cêniye baxçeyê camêrdiya.
İnsan viran vındeno, veyşan nêvındeno.

Good morning!
Günaydın!

Good afternoon!
Tünaydın!

Good evening!
İyi akşamlar!

Good night!
İyi geceler!

Who are you?
Kimsin(iz)?

What is your name?
Adın(ız) ne?

My name is Yıldız.
Benim adım Yıldız.

Nice to meet you.
Tanıştığımıza memnun oldum.

I love you.
Seni seviyorum.

I love you very much.
Seni çok fazla seviyorum.

You are my only love.
Sen benim tek aşkımsın.

What is your job?
İşin(iz) nedir?

I am a student.
Ben bir öğrenciyim.

I live in Turkey.
Türkiye'de yaşıyorum.

How old are you?
Kaç yaşındasın(ız)?

I am twenty years old.
Yirmi yaşındayım.

What are you talking about? 
Ne hakkında konuşuyorsun(uz)?

I said something wrong.
Yanlış bir şey söyledim.

Which languages can you speak?
Hangi dilleri konuşabilirsin(iz)?

I can speak English, French and Russian.
İngilizce, Fransızca ve Rusça konuşabilirim.

Where are you from?
Neredensin(iz)?

I am from Turkey.
Türkiye'denim.

What nationality are you?
Hangi millettensin(iz)?

I am Turkish.
Türk'üm.

I like Wikibooks.
Vikikitap'ı beğeniyorum.

I love Wikibooks.
Vikikitap'ı seviyorum.

I don't like him/her.
Ondan hoşlanmıyorum.

Do you like him/her?
Ondan hoşlanıyor musunuz?

Where are you going?
Nereye gidiyorsun(uz)?

I am going to the cinema.
Sinemaya gidiyorum.

I will do my best.
Elimden geleni yapacağım.

I live in New York.
New York'ta yaşıyorum.

I want to learn English.
İngilizce öğrenmek istiyorum.

Who wants to learn English?
Kim İngilizce öğrenmek istiyor?

I don't have any idea.
Hiçbir fikrim yok.

Where's the justice?
Adalet nerede?

Malzemeler :
1.) Asagıdaki çizimde gördüğünüz üçgen ve dikdörtgenlerden ikiser adet naylon.
2.) 3 adet 75 cm , 2 adet 77 cm , 1 adet 94 cm uzunluğunda ve yaklasık 1 cm kalılığında tahta çıta.
3.) Yapıstırıcı bant
Yapılışı

Büyük dikdörtgenleri üçgen seklindeki kanatlara çizimdeki gibi yapıstırıcı bant ile yapıstırın.

75 cm boyundaki 3 adet çıtayı ortaya ; 77 cm boyundaki 2 adet çıtayına yanlara çizmdeki gibi yapıstırıcı bant ile yapıstırın.

Küçük dikdörtgenleri alta ve üste çizimdeki gibi yapıstırın.

Orta çıtayı (94 cm olan ) çizimdeki gibi yan çıtalara A ve B noktalarından iple bağlayın.
( kolay tasımak için A ve B naktalarından çözüp , tekrar bağlayabilirsiniz.)

Denge:
Denge için yaklaşık 1 metre uzunluğunda bir ipi fotoğraftaki gibi öndeki çıtanın üst ucunun 12 cm altından bağlayın. Bu ipin diğer ucunu getirip çıtanın alt ucundan 12 cm yukarıya bağlayın. Uçuracağınız ipi bu dengede üstten 33-35 cm mesafeye bağlayın.

Rare, benign lesions, with high recurrence rate. Thought to be derived from leptomeningeal melanocytes. Contain melanin pigment. Usually positive for HMB 45, Melan A, vimentin, and S-100. May recur as melanomas and may metastasize.

Review: PMID 15160350, 2004 — "Therapy of meningeal melanocytomas." Rades D et al. Cancer. 2004 Jun 1;100(11):2442-7.
Reviewed all published literature since 1972. 89 pts included.
Demographics: 46 spinal cord, 43 brain. Median f/u 5 yrs.
Overall recurrence rate 37%. 24% after complete rebaşlık (CTR), 0% after CR + RT, 78% after incomplete rebaşlık (ITR), 24% after ITR + RT. For ITR + RT, dose response for local control (86% for 45-55 Gy vs 27% for < 40 Gy)
Conclusions: complete rebaşlık should be performed when possible. Incomplete rebaşlık should be followed with RT, approx 45 Gy.

1999 yılında Microsoft daha önce geliştirdiği MS-DOS’u geliştirme işleminden vazgeçtiği için bu arada oluşacak boşluğu gidermek amacıyla FreeDOS geliştirilmiştir.
GNU Genel Kamu Lisansı kapsamında geliştirilen bu sistem DOS tabanlı bir işletim sistemi olarak bilinmektedir. Bu sistemin ilk geliştirilme amacı DOS sistemi ile uyumlu bir işletim sistemine ulaşmaktır. Yapılan çalışmalardan elde edilen ve günümüzde yoğun olarak kullanılan FreeDOS ile bu amaç tümüyle gerçekleştirilmiştir.
FreeDOS özelliklerine sahip bilgisayarlarda herhangi bir işletim sistemi kurulu değildir. Bu ne demektir? Bu şu demektir satın alınan bilgisayara Windows 7, Windows 8, Windows 10 gibi işletim sistemleri yüklenmemiştir. Bilgisayarınızı ilk açtığınızda bilgisayar ekranınızda siyah bir ekran üzerinde FreeDOS yazısından başka bir şey görünmemektedir. Bu bilgisayarla işlem yapabilmeniz için Windows 7, Windows 8, Windows 10 gibi işletim sistemlerini yüklemeniz gerekmektedir.
Kaynak: FreeDOS Nedir ? FreeDOS Bilgisayar Alınır mı ?

Hoş geldiniz. Bu kategoride, Dünya tarihi hakkında ücretsiz, açık içerikli ve standart bir çalışma kitabı oluşturma amacı güdülmektedir. Amacımız, ilkokul, ortaöğretim ve yükseköğretim ortamları için yeterli bir kalite standardı oluşturmaktır. Yardım etmek isteyen herkesin katkısını memnuniyetle karşılıyacağız. Burada ana tartışma sayfamızda, bize ulaşabilirsiniz.
Standartlar | Altın Kuralımız | Yazarlar

Büyük Coğrafya -  Dünyanın Nüfus durumu
Antik Uygarlıklar - Tarımın Başlangıcı ve Antik Kültürler
İlk Çin Hanedanları - Mitsel Dönemden Xia, Shang ve Zhou Hanedanları'na
Hint Altı Kıtasındaki Medeniyet ve İmparatorluklar - Indus Vadisi Medeniyeti ve Mauryan ve Gupta İmparatorlukları
Dünya Dinleri - Geçmiş Dinler
Antik Yunan ve Büyük İskender -  Minoslardan Helenistik İmparatorlukların yükselişine, Büyük İskender

Roma İmparatorluğu
Çin'in Birleşmesi
Orta Doğu İmparatorlukları - ve İslam'ın Yayılması.
Avrupa'da Orta Çağ - Batı'nın başlangıcı
Norman İmparatorluğu - İngiltere'nin başlangıcı
Amerika'nın Erken Tarihi - Eski halkların göçü, Meksika, Mesoamerika ve Kuzey/Güney Amerika
Afrika'nın Antik Krallıkları  - Doğu ve Batı Afrika milletleri arasındaki sömürgeleştirme dönemi

Samo İmparatorluğu-Çek Cumhuriyeti, Slovakya ve Avusturya'nın başlangıcı

 Moğol Fetihleri ve Sonrası
Avrupa'da Rönesans
Keşifler Çağı ve Emperyalizm
Avrupa'da Dini Savaşlar
Milliyetçiliğin ve Ulus-devletin Yükselişi
Devrim, Değişim ve Felsefe İngiliz İç Savaşı ve Haklar Bildirisi, Amerika'ın bağımsızlığı, Fransız İhtilali gibi, Demokratik ve Liberteryen düşüncelerin yayılması
Napolyon'un Avrupası ve Reaksiyonizm

Sanayi Devrimi Başlangıcı ve Sonuçları.
Doğu Asya'da Değişiklikler
Emperyalizm Çağı, 2. kısım

Birinci Dünya Savaşı'nın Nedenleri ve Seyri
Birinci Dünya Savaşı'nın Sonuçları
Rus Sosyalist Devrimi - Rus İhtilali, İç Savaş ve Komünizmin yükselmesi
Savaş Sonrası Yıllar - Büyük Buhran ve savaş sonrası dönemde toplum ve kültürdeki değişiklikler
Diktatörlüğün ve Totalitarizmin Yükselişi - Faşizm ve benzerleri
İkinci Dünya Savaşı'nın Nedenleri ve Seyri - Müttefikler ve Eksen güçleri.
İkinci Dünya Savaşı'nın Sonuçları - Güçlerin değişimi ve dünya düzeninin değişimi.
Sömürgeciliğin Çöküşü

Soğuk Savaş
Dünya Ekonomisi
Ekler
Çatışmalar
Büyük Şahsiyetler
Teknoloji

Not: Elfçe'nin birçok farklı lehçesi vardır. Burada öğretilen Quenya lehçesi olacaktır.

Quenya'da fiiler üç guruba ayrılır. Sözcüğün sonundaki harfe bakarak hangi gruptan olduğunu anlayabiliriz.
1.) Primitif fiiller: bu fiiler sessiz harf ile biter.
2.) A-fiiller: bu fiiler -a harfi ile biter.
3.) U-fiiller: bu fiiler -u harfi ile biter.
Quenya'da 5 zaman vardır; şimdiki zaman, geniş zaman, tamamlanmış geçmiş zaman, gelecek zaman, geçmiş zaman.

Türkçe'deki gibi elfçede fiiller şahıslara göre çekim eki alırlar. Bunlar;
Ben için -nyë ya da -n
Hautanyë "Ben dururum."
Sen veya Siz için -lyë ya da -l
Hautalyë "Sen durursun."
O(erkek) için -ro
Hautaro "O durur."
O (kız) için -re
Hautarë "O durur."
O için -rye ya da -s
Hautaryë "O durur"
İkimiz için -mmë
Hautammë "Biz dururuz."
Senle(iki kişiden fazla ise) -lvë
Hautalvë "Biz ve sen dururuz."
Sensiz (iki kişiden fazla ise) -lmë
Hautalmë "Biz sensiz dururuz."
Onlar için -ntë veya -t
Hautantë "Onlar dururlar"

Elfçede beş farklı zaman vardır.

1- Primitif Fiiller tekil şahıs için -ë çoğul şahıs için -ir eki alır.
ör: hir-(bul-)→ hirë → hirir
2- A-Fiiller tekil şahıslarda ek almaz çoğul şahıs için -r eki alır.
ör: hauta(dur-) → hauta → hautar
3- U-Fiiller tekil şahıslarda u → a ya değişir çoğul şahıs için -r eki alır.
ör: allu- (yıka-) → allo → allur
Örnek Cümleler:
i máma matë salquë "Koyun ot yer."
i mi mámar matir salquë "Koyunlar ot yerler."

Fiilin tekil kişi için olan haline ekler eklenerek fiiller çekimlenir.
ör:
hautan ya da hautanyë(Ben dururum)
hautal ya da hautalyë(Sen durursun)
hautaro (Erkek durur)
hautare (Kız durur)
hautas ya da hautaryë (o durur)
hautammë (İkimiz dururuz)
hautalvë (Senle dururuz)
hautalmë (Sensiz dururuz)
hautat ya da hautantë (Onlar dururlar)

hautanyë len = hautanyël(Ben seni durdururum)
hautalyë nin = hautalyën (Sen Beni durdurursun)
hautammë son,sen,tan = hautammës (İkimiz onu durdururuz)
hautalvë tien = hautalvët (Senle onları durdururuz)
Bunların Kısaltmaları yoktur;
ikimizi = ment
bizi = men

1- Primitif Fiillerde eğer fiilde tek bir sesli harf varsa uzatılır, tekil şahıs için -a çoğul şahıs için -ar eki alır.
ör: hir-(bul-)→ hìra → hìrar
2- A-Fiillerde eğer fiilde tek bir sesli harf varsa uzatılır, tekil şahıslarda a → ëa ya, çoğul şahıslarda a → ëar a değişir..
ör: hauta(dur-) → hautëa → hautëar
3- U-Fiillerde eğer fiilde tek bir sesli harf varsa uzatılır, tekil şahıslarda -a, çoğul şahıs için -ar eki alır.
ör: allu- (yıka-) → állua → álluar

1- Primitif Fiiller tekil şahıs için -uva çoğul şahıs için -uvar eki alır.
ör: hir-(bul-)→ hiruva → hiruvar
2- A-Fiiller tekil şahıslarda a düşer, -uva eki, çoğul şahıslarda -uvar eki alır.
ör: hauta(dur-) → hautuva → hautuvar
3- U-Fiiller tekil şahıslarda u → ùva ya, çoğul şahıs için u → ùvar a değişir.
ör: allu- (yıka-) → allùva → allùvar

1- Primitif Fiiller tekil şahıs için -es çoğul şahıs için -er eki alır.
ör: hir-(bul-)→ hires → hirer
2- A-Fiiller tekil şahıslarda -në, çoğul şahıslarda -nër eki alır.
ör: hauta(dur-) → hautanë → hautanër
3- U-Fiiller tekil şahıslarda şahıslarda -nen, çoğul şahıslarda -ner eki alır.
ör: allu- (yıka-) → allunen → allunen
Bu yazdığım fiiller sadece düzenliler için geçerlidir.

menta- "yolla-" → ementië
nurru- "dağıt-" → unurrië
móta- "yay-" → omótië
hauta- "dur-" → ahautië
poita- "temiz-" → opoitië
anta- "ver-" → antië
allu- "yık-" → allië

Malzemeler 
Hamur

250 gram margarin/tereyağı
1 çay bardağı sıvıyağ
1 çay bardağı yoğurt
10 yemek kaşığı şeker
1 tatlı kaşığı karbonat
4-5 su bardağı un
3–4 damla limon suyu
İç

4 rendelenmiş elma
3 yemek kaşığı toz şeker
1 tatlı kaşığı tarçın
1 çay bardağı dövülmüş fındık
Hazırlanışı

Rendelenmiş elma şeker ilavesiyle pişirilir. Piştikten sonra tarçın ve fındık eklenerek soğumaya bırakılır.
Karbonat, limon suyu ile kabartılır.
Diğer iç hamur malzemeleri ilave edilir, un azar azar eklenerek hamur yoğurulur.
Hamurdan ceviz büyüklüğünde parçalar alınır avuç içinde açılır ve iç malzemeden konularak hamur birleştirilir.
Kurabiyenin birleşme yeri altta kalacak şekilde yağlanmış tepsiye dizilir.
Kurabiyeler iki üç yerinde bıçakla kesilerek şekil verilir.
Önceden ısıtılmış 175 derece fırında, 20 dakika kadar pişirilir.
Servis Önerisi

Pişen kurabiyelerin üstüne pudra şekeri dökülerek servis yapılır.

Windows altında Emacs kullanabilmek için en iyisi Emacs'ın CVS sürümlerinden bir tanesini indirelim:
Emacs CVS Sürümü Windows İçin
İndirdikten sonra kurulumu uzun uzun anlatmayacağım. Zaten kurulum paketi olduğu için her şeyi kuruyor ve çalıştırmaya hazır hale getiriyor. Bunun yerine Emacs'ı C ve C++ kodu yazmak için işlevsel hale getirebilmek için neler yapabilirsiniz onu anlatacağım. Bunun için .emacs dosyanızı düzenlemeniz gerekiyor. Ama Emacs'la yeni tanışıyor olacağınız için bu şimdilik zor gelebilir. Bunun yerine benim kullandığım .emacs dosyasını indirip direkt C:\.emacs şeklinde kaydedin:
Windows İçin Emacs Dosyası
Not : Tam olarak .emacs ismiyle kaydettiğinizden emin olun. Dosya uzantısı .txt vs.. uzantılı olmamalı.
Bir de Emacs için renk temaları kullanabilirsiniz. Aşağıdaki color.theme.el.gz dosyasını WinRar ile açın. Sonuçta color.theme.el diye bir dosya oluşacak. Daha sonra da bunu C:\Program Files\Emacs\site-lisp dizinine kaydedin.
Emacs İçin Renk Teması
Şimdi Emacs'ı başlatın. F12 tuşu ile renk temaları arasında dolaşabilirsiniz :)

Şimdi Emacs'ı kurduk ayarladık. Ama kodları nasıl derleyeceğiz. Emacs'la istediğiniz derleyiciyi kullanabilirsiniz. gcc, vc++7.1 vs .. Şimdi ben gcc'nin windows sürümü olan Mingw ile beraber nasıl kullanabileceğimizi anlatacağım :

İsterseniz MINGW'yi ayrı olarak hiç bir IDE olmaksızın da yükleyebilirsiniz. Ama ben zaten DevCPP kurmuştum. Bunun yerine DevCPP ile gelen derleyiciyi kullanmak istedim. Siz de eğer henüz kurmadıysanız Mingw/GCC 3.4.2 ile beraber gelen DevCPP'yi buradan indirebilirsiniz.
GCC'nin windows altında çalışabilmesi için derleyicinin bulunduğu BIN dizini PATH ortam değişkenleri arasında olmalı. Örneğin gcc'yi C altına kurduysanız şunun gibi olabilir:

C:\MinGW\bin

Ya da Program Files dizinine kurduysanız bu şekilde:

C:\Program Files\MinGW\bin

Ya da şimdi olduğu gibi Devcpp kuruluysa DevCPP'nin bin dizini olabilir:

C:\Dev-Cpp\bin

Ya da bir başka dizin:

C:\BaskaBirGCCDizini\bin

Sonuç olarak yapmamız gereken bu dizini PATH ortam değişkenine eklemek. Bunun için Başlat->Çalıştır kısmına msconfig yazıyoruz:

Ve tamama tıklıyoruz. Bu Sistem Yapılandırma Hizmet Programını çalıştırır. Buradan Autoexec.bat tabını tıklayıp PATH satırına geliyoruz ve Düzenle diyoruz.

Buraya da derleyicimizin olduğu dizini şu şekilde ekliyoruz:

;C:\Dev-Cpp\bin
 

NOT : Eğer böyle bir PATH satırı görmüyorsanız, bir tane siz oluşturmalısınız. Yeni butonuna tıklayıp şunu yazın:

path=C:\Dev-Cpp\bin

ya da derleyicinizin olduğu dizin neresiyse o dizini yazın.

Win98 altında kolaylık olsun diye direkt olarak DevCPP'yi kurup onunla beraber gelen derleyici araçlarını kullanmıştık. Bu seferde bir IDE olmadan sadece MINGW paketi ile gelen geliştirme araçları (derleyici, hata ayıklayıcı .. vs) kurup Emacs ile kullanmayı anlatacağım. Tabi siz kolaylık olsun derseniz bu kısmı atlayıp direkt DevCPP kurup DevCPP ile gelen GCC 3.4.2'yi programlarınızı yazmak için kullanabilirsiniz.

MINGW Geliştirme Araçlarını kurmak için en kolay yöntem bu sayfadan otomatik kurucuyu indirip kullanmak:
MINGW Kurucu Programı
Programı çalıştırdığımızda hangi yansıyı kullanmak istediğimizi soruyor. Bize yakın bir yansı seçip devam ediyoruz. Ayrıca Download as needed and Install (Gerekli Olanları İndir ve Kur Seçeneğini) seçiyoruz:

Yine hangi bileşenleri kurmak istediğimizi soruyor. Buradan g++ ve istersek MINGW Make seçmek yeterli...

Nereye kuracağımızı soruyor. Varsayılan olarak C:\MinGW dizinine kuruluyor. Bunu da kabul ederek devam ediyoruz:

Daha sonra bileşenleri indirip kuruyor..

Denetim Masasından Sistem'i açın. Gelişmiş tabından Ortam Değişkenleri'ni açın.

Diyalog kutusunun altındaki Path değişkenini seçin ve düzenleyi tıklayın.

Değişken değeri metin kutusuna tıklayın END tuşu ile en sona gelin ve BIN klasörünün olduğu dizini yazın:

;C:\MinGW\bin
 

Değişiklikler bir dahaki komut satırı penceresi açtığınızda etkisini gösterecek. Her şeyin doğru çalışıp çalışmadığını öğrenmek için g++ (c++ derleyicisi) nin sürüm numarasını gösteren şu komutları konsolda girebilirsiniz:

g++ -v

Bunun için Emacs'ı başlatın. Control tuşu ile beraber x tuşuna (bundan sonra bu kısaltmayı C-x olarak göstereceğiz) ve tekrar Control tuşu ile beraber f tuşuna (yine aynı şekilde bunu da C-f olarak göstereceğiz) basın. Bu komutlar ile ilgili daha ayrıntılı bilgiyi aşağıda bu dersin devamı sayılabilecek belgelerde bulabilirsiniz. Kısaca gösterimle C-x C-f eğer varsa bir dosyayı aç yoksa oluştur demek. Aslında bunu sizin de görebileceğiniz üzere yukarıda bulunan File->Visit New File yolunu takip ederek de yapabilirdik. Ama bu kısayolları kullanmak uzun vadede Emacs'ın asıl hızını gösteriyor ve bir kere alıştıktan sonra artık vazgeçemeyeceğiniz bir editör halini alıyor. Biz de merhabadunya.cpp isminde bir C++ kaynak kod dosyası oluşturacağız. Şimdi isterseniz buradan kopyalayarak ya da kendiniz yazarak ki (böylece Emacs'ın sunduğu olanakları daha iyi anlayabilirsiniz) aşağıdaki C++ kaynak dosyasını oluşturun:

 #include <iostream>
 using std::cout;

 class Dunya
 {
 public:
        
     Dunya () { cout << "Merhaba\n"; }
     ~Dunya () { cout << "Gule gule\n";}
 };

 Dunya dunya;

 int main ()
 {}

Not: Bunu yaparken Emacs'ın otomatik tamamlama özelliğini kullanmaya çalışın ve parantez boşluklarının da otomatik hizalandığına dikkat edin. Örneğin bir kere Dunya yazdık. İkinci kez Dunya yazmak istediğimizde D yazıp M-/ (Alt tuşu ile beraber / tuşuna beraber basın demek) basın. Emacs size olası tüm seçenekleri gösterir. Bir kere daha basarsanız yine D ile başlayan başka bir seçenek otomatik tamamlanır.

Programınızı yazdıktan sonra M-x (Alt ile beraber x tuşuna basın ve) compile yazın.
Compile command: make -C diye bir yazı göreceksiniz. Bunu g++ merhabadunya.cpp -o merhabadunya olarak değiştirin. Ve enter tuşuna basın. Böylece emacs kullanarak ilk c++ programımızı yazmış ve derlemiş olduk ;-)

NOT: Bu .emacs dosyasi Ali Cehreli'nin bir donem kullandigi kisisel bir .emacs'tir. Yalnizca bir fikir vermesi amaciyla buraya koyulmustur.
Ornegin bas tarafindaki global-set-key cagrilariyla yapilan tus donusumleri, Ali'nin kullandigi Dvorak klavye duzeninde rahat olacagi dusunuldugu icin yapilmaktadir.
Bunlar, sizin klavye duzeninizde hic ise yaramayabilirler. :)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Emacs startup File
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Miscellaneous variables

(prefer-coding-system 'utf-8)

;; key bindings that work well with Dvorak keyboard
(global-set-key "\C-f" 'previous-line)
(global-set-key "\C-b" 'next-line)
(global-set-key "\C-t" 'backward-char)
(global-set-key "\C-n" 'forward-char)
(global-set-key "\M-t" 'backward-word)
(global-set-key "\M-n" 'forward-word)
(global-set-key "\M-u" 'upcase-prev-word)
(global-set-key "\M--" 'goto-line)
;(global-set-key "\M-c" 'end-of-buffer-other-window)
(global-set-key "\M-c" 'next-error)
(global-set-key [home] 'beginning-of-buffer)
(global-set-key [end] 'end-of-buffer)

(global-set-key [(control shift right)] 'compile)
(global-set-key [(control shift up)] 'previous-buffer)
(global-set-key [(control shift down)] 'next-buffer)

;; Scroll buffer without moving the cursor
(global-set-key "\M-f" '(lambda () (interactive) (scroll-down 1)))
(global-set-key "\M-b" '(lambda () (interactive) (scroll-up 1)))

;; Record the position of the cursor to register 't' and then find-tag
(global-set-key "\M-." '(lambda () (interactive) 
						  (point-to-register t) 
						  (find-tag (find-tag-default))))

;; Go to the next definition of a tag
;; This overrides 'forward-sentence'
(global-set-key "\M-p" '(lambda () (interactive) (find-tag nil t)))

;; Go to the last recorded position of the cursor in register 't'
(global-set-key "\C-p" '(lambda () (interactive) (register-to-point t)))

;; don't center when point moves out of view
(setq scroll-step 20)

;; Mode line setup
(setq display-time-24hr-format t)
(display-time)

(setq line-number-mode t)
(setq column-number-mode t)
(setq visible-bell t)
(setq inhibit-startup-message t)
(put 'narrow-to-region 'disabled nil)

; (defvar default-load-path load-path
;   "Standard places to look for lisp files.  See load-path.")
; (setq load-path (append (list
; 						 "/usr/local/share/emacs/site-lisp"
;                          "~/lisp"
; 						 "~/lisp/emacs-lisp"
; 						 "~/lisp/emulation"
; 						 "~/lisp/gnus"
; 						 "~/lisp/international"
; 						 "~/lisp/language"
; 						 "~/lisp/mail"
; 						 "~/lisp/play"
; 						 "~/lisp/progmodes"
; 						 "~/lisp/term"
; 						 "~/lisp/textmodes"
; 						 )
;                         default-load-path))

(setq auto-mode-alist
      '(("[-\\.]info$" . info-mode)
        ("\\.c\\'" . c++-mode)
        ("\\.cpp\\'" . c++-mode)
        ("\\.cxx\\'" . c++-mode)
        ("\\.h\\'" . c++-mode)
        ("\\.hpp\\'" . c++-mode)
        ("\\.tex\\'" . TeX-mode)
        ("\\.el\\'" . emacs-lisp-mode)
        ("\\.pl\\'" . perl-mode)
        ("\\.sty\\'" . LaTeX-mode)
        ("\\.bbl\\'" . LaTeX-mode)
        ("\\.bib\\'" . bibtex-mode)
        ("\\.texinfo\\'" . texinfo-mode)
        ("\\.texi\\'" . texinfo-mode)
        ("\\.awk\\'" . awk-mode)
        ("\\.tar\\'" . tar-mode)
        ("\\.y\\'" . c-mode)
        ("\\.lex\\'" . c-mode)
	("\\.m$"  . objc-mode)
	("\\.C$"     . c++-mode)
	("\\.cc$"    . c++-mode)
	("\\.hh$"    . c++-mode)
        ("[]>:/]\\..*emacs\\'" . emacs-lisp-mode)
	("Makefile"  . makefile-mode)
	("makefile"  . makefile-mode)
	("\\.mak\\'" . makefile-mode)
	("\\.scm\\'" . scheme-mode)
	("\\.py$" . python-mode)
    ("\\.diff" . diff-mode)
    ("\\.sgml" . sgml-mode)
    ("\\.xml" . xml-mode)
))

(setq interpreter-mode-alist
	  (cons '("python" . python-mode)
			interpreter-mode-alist))

;; Customize auto-save interval
(setq auto-save-interval 2000)
(setq auto-save-timeout 120)

;; Save last location in all files between sessions
(load "saveplace")
(setq-default save-place t)

;; The ID database functions
(autoload 'gid  "gid" "ID Database functions" t)

;; C Mode stuff
(autoload 'c++-mode  "cc-mode" "C++ Editing Mode" t)
(autoload 'c-mode    "cc-mode" "C Editing Mode" t)
(autoload 'python-mode "python-mode" "Python Editing Mode" t)

     (defconst my-c-style
       '((c-tab-always-indent        . nil)
         (c-comment-only-line-offset . 4)
         (c-hanging-braces-alist     . ((brace-list-open)))
         (c-hanging-colons-alist     . ((member-init-intro before)
                                        (inher-intro)
                                        (case-label after)
                                        (label after)
                                        (access-label after)))
         (c-cleanup-list             . (scope-operator
                                        empty-defun-braces
                                        defun-close-semi))
         (c-offsets-alist            . ((arglist-close . c-lineup-arglist)
					(inline-open       . 0)
                                        (substatement-open . 0)
                                        (comment-intro     . 0)
                                        (block-open        . 0)
                                        (knr-argdecl-intro . -)))
         (c-echo-syntactic-information-p . t)
         )
       "My C Programming Style")
     
     ;; Customizations for all of c-mode, c++-mode, and objc-mode
     (defun my-c-mode-common-hook ()
       ;; add my personal style and set it for the current buffer
       (c-add-style "PERSONAL" my-c-style t)
       ;; offset customizations not in my-c-style
       (c-set-offset 'member-init-intro '+)
       ;; other customizations
       (setq tab-width 4
             ;; this will make sure spaces are used instead of tabs
             indent-tabs-mode nil)
       ;; we like auto-newline and hungry-delete
       (c-toggle-auto-hungry-state 1)
       ;; keybindings for all supported languages.  We can put these in
       ;; c-mode-base-map because c-mode-map, c++-mode-map, objc-mode-map,
       ;; java-mode-map, and idl-mode-map inherit from it.
       (define-key c-mode-base-map "\C-m" 'newline-and-indent)
       )
     
     (add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
     
(set-default `indent-tabs-mode nil)

;;(setq-default case-fold-search nil)
(setq dabbrev-case-fold-search nil)

(mouse-avoidance-mode 'animate)

(show-paren-mode t)
(setq search-highlight t)

;; Compilation Stuff
;(global-set-key "\C-c\C-c" 'compile)
;(global-set-key "\C-c\C-g" 'grep)
;(setq grep-command "grep -n -i ")
(setq compile-command '("make -C " . 9))
(setq compilation-ask-about-save nil)
;(setq compilation-finish-function 'compilation-buffer-goto-end)
;(setq compilation-finish-function 'next-error)

(setq calendar-week-start-day 1)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Dired

(setq dired-keep-marker-copy)

(setq dired-listing-switches "-alR")

(setq dired-auto-shell-command-alist
  (list
;; '("\\.[Tt][Aa][Rr]\\.*[Gg]*[Zz]$" "zcat * | tar tvf -")
   '("\\.shar.g*[Zz]$"  "zcat * | unshar")
   '("\\.ps$"           "gv * &")
   '("\\.ps[.gZz]*$"    "zxdvi")
   '("\\.dvi[.gZz]*$"   "zxdvi")
   '("\\.au$"           "play")
   '("\\.tar$"          "tar tvf")
   '("\\.u*e*$"         "uudecode")
   '("\\.gif$"          "xv * &")               ; view gif pictures
   '("\.tex$"           "latex")                
   '("\\.g*[Zz]$"       "gunzip")
   '("[Aa]rc"           "spark -tv")            ; Acorn Archimedes archive
   '("\\.shar$"         "unshar")               
   '("^![Rr][Uu][Nn][Ii][Mm]" "baslist -n")     ; Tokenised BASIC program
   '("\\.defaults$"     "xrdb")
   '("\\.gopher_menu$"  "mkcache")
   '("^a\\.out$"        "*")
   ))

(defun dired-mouse (event)
  "Visit a file clicked on in a Dired buffer.
If there is a filename on the current line, visit the file else
re-read the directory."
  (interactive "e")
  (let ((opoint (point)))
    (mouse-set-point event)
    (cond ((dired-move-to-filename)
           (sit-for 0)
           (dired-find-file))
          (t (dired-revert)
             (goto-char opoint)))))

;; A version of dired-mark-read-file-name which inserts the name of
;; the single current file as the intial minibuffer contents.

(defun my-dired-mark-read-file-name (prompt dir op-symbol arg files)
  (dired-mark-pop-up
   nil op-symbol files
   (function read-file-name)
   ;; Args for read-file-name:
   (format prompt (dired-mark-prompt arg files))
   dir nil nil                            ; completion dir, no default, needn't match
   (and (null (cdr files)) (car files)))) ; initial contents if single file

(defun upcase-prev-word ()
  (interactive)
  (upcase-word -1))

;(defun compilation-buffer-goto-end (buffer result)
;  (end-of-buffer-other-window 0))

(put 'upcase-region 'disabled nil)

(transient-mark-mode t)

;; Turn the menu bar off
(menu-bar-mode 1)

(add-to-list 'auto-mode-alist '("\\.e\\'" . eiffel-mode))
(autoload 'eiffel-mode "eiffel-mode" "Major mode for Eiffel programs" t)

(global-font-lock-mode t)
(setq font-lock-maximum-decoration '((c-mode . 3) (c++-mode . 3)))
(setq font-lock-maximum-size `((c-mode . 524288) (c++-mode . 524288)))
(setq font-lock-support-mode 'fast-lock-mode)
(add-hook 'c-mode-common-hook 'turn-on-font-lock)

; (setq Info-directory-list
;       '("/usr/local/info/"
; 		"/hw/cad/gnu/guile-doc/ref"
; 		"/cad/local/info/"
; 		))

;; Stop at the end of the file, not just add lines
(setq next-line-add-newlines nil)

;; (server-start)

;; (autoload 'sgml-mode "psgml" "Major mode to edit SGML files." t)
;; (autoload 'xml-mode "psgml" "Major mode to edit XML files." t)
;; (autoload 'html-mode "xxml" "Major mode to edit HTML files." t)
;; (autoload 'xxml-mode-routine "xxml")
;; (add-hook 'sgml-mode-hook 'xxml-mode-routine)

;; (setq sgml-indent-step 4)

(custom-set-variables
  ;; custom-set-variables was added by Custom -- don't ed

Contoh (Examples):

67  =  enam puluh tujuh
111  =  seratus sebelas
2743  =  dua ribu tujuh ratus empat puluh tiga
8015  =  delapan ribu lima belas
17432  =  tujuh belas ribu empat ratus tiga puluh dua
408305  =  empat ratus delapan ribu tiga ratus lima

1. = pertama
2. = kedua (ya da ke-2)
3. = ketiga (ya da ke-3)
4. = keempat (ya da ke-4)
5. = kelima (ya da ke-5)
10. = kesepuluh (ya da ke-10)
11. = kesebelas (ya da ke-11)
21. = kedua puluh satu (ya da ke-21)
Türkçe'de nokta ile belirtilen sıra sayılarını belirtmek için Endonezce'de 1 sayısı dışındaki sayılara -ke eki konur. Birinci demek için Pertama sözcüğü kullanılırken diğer sayılarda başa -ke eki getirilir (örneğin ikinci demek için ke+dua[2]=kedua)

Saya punya dua buah buku. (= Ben iki kitaba sahibim)
Saya punya dua buah buku merah. (= Ben iki kırmızı kitaba sahibim)
Saya tidak punya dua buah buku merah. (= Ben iki kırmızı kitaba sahip değilim)

Albania - Arnavutluk
Aljazair - Cezayir
Arab Saudi – Suudi Arabistan
Argentina - Arjantin
Armenia - Ermenistan
Australia – Avustralya
Austria - Avusturya
Azerbaijan - Azerbaycan
Bangladesh - Bangladeş
Belgia - Belçika
Bosnia-Herzegovina - Bosna-Hersek
Brasil - Brezilya
Britania Raya - Büyük Britanya (Birleşik Krallık)
Brunei - Brunei
Bulgaria - Bulgaristan
Chad - Çad
Republik Ceko – Çek Cumhuriyeti (Çekya)
Chili - Şili
Republik China (Taiwan) - Çin Cumhuriyeti (Tayvan)
Cina (lihat Republik Rakyat Cina) - Çin (Çin Halk Cumhuriyeti)
Côte d'Ivoire (Pantai Gading) - Fildişi Kıyısı

Denmark – Danimarka
Djibouti - Çibuti
Ekuador - Ekvador
Eritrea - Eritre
Estonia - Estonya
Ethiopia - Etiyopya (eski Habeşistan)
Filipina – Filipinler
Finlandia - Finlandiya
Gabon - Gabon
Gambia - Gambiya
Georgia - Gürcistan
Ghana - Gana
Guinea - Gine
Haiti – Haiti
Honduras - Honduras
Hong Kong – Hong Kong
Hongaria - Macaristan

India - Hindistan
Indonesia - Endonezya
Irak – Irak
Iran - İran
Republik Irlandia - İrlanda Cumhuriyeti
Islandia - İzlanda
Israel – İsrail
Italia - İtalya
Jamaika - Jamaika
Jepang - Japonya
Jerman - Almanya
Kamboja – Kamboçya
Kamerun - Kamerun
Kanada - Kanada
Kazakhstan – Kazakistan
Kenya – Kenya
Kirgizstan - Kırgızistan
Kolombia - Kolombiya
Republik Kongo - Kongo Cumhuriyeti
Republik Demokratik Kongo - Demoktarik Kongo Cumhuriyeti
Korea Selatan - Güney Kore
Korea Utara – Kuzey Kore
Kosta Rika - Kosta Rika
Kroasia – Hırvatistan
Kuba - Küba
Kuwait - Kuveyt

Saluton!
Esperanto dünyasına hoşgeldiniz!
İlk dersimize başlamadan önce bir-iki küçük hatırlama yapmak istiyoruz.
Her harf tek bir sese karşılık geldiğinden ve çok yabancı ses bulunmadığından Türkçe bilen biri için Esperanto metin okumak çok kolay bir iştir. Bu nedenle, dersimizde Esperanto alfabesinden özel olarak bahsetmeyeceğiz. Bunun yerine ilk birkaç derste her cümle için okunuş yardımı sunacağız ve siz de çok kısa zamanda okunuş kurallarına alışacaksınız. Bu süreç içerisinde okunuşlar iki / arasında eğik olarak verilecektir: / örnek /
Yine de okunuşla ilgili genel yardım almak istiyorum derseniz, burayı inceleyebilirsiniz. Mutlaka ses duymak istiyorsanız lernu! ve forvo gibi internet sitelerinde sesli örnekler bulabilirsiniz. Bilindik video sitelerinde de Esperanto konuşma duyabileceğiniz binlerce video bulabilirsiniz veya daha da güzeli vakit buldukça Muzaiko gibi Esperanto internet radyolarını dinleyebilirsiniz.
Dersler boyunca, genel bir ilke olarak gereksiz ayrıntılara girmeyerek izahları kısa tutmaya çalışacağım.
* Bu nedenle, sadeliğin bozulmaması için, konuyla ilgili ayrıntı niteliğindeki notları ilgili paragraftan hemen sonra (bu yazı gibi) anında-dipnot olarak ekleyeceğim. Ayrıntılara gerek veya ilgi duymuyorsanız ve özellikle de zamanınız sınırlıysa bu şekilde yazılan yazıları hiç okumadan geçebilirsiniz.
Mi deziras al ĉiu grandan sukceson pri Esperanto!

Sözcükler bölümünün temel amacı Esperanto dilinde en çok kullanılan sözcükleri zamanla öğretmektir.
Her derste 10-20 arası yeni sözcük vermeyi planlıyoruz. Sonraki derse bunların hiç olmazsa birazını öğrendikten sonra geçmeniz iyi olur.

Esperanto dilinin Esperanto'daki adıdır. Aynen Türkçe'deki gibi okunur.
* Özel isim olarak kullanılmadığında, "esperanto", "umut eden kişi" anlamına gelen bir türemiş sözcüktür. Aslında Esperanto dilinin orijinal adı "Lingvo Internacia"dır. Bu dili tasarlayan Dr. L. L. Zamenhof, ilk kitabını "Doktoro Esperanto" (Dr. Ümitvar) takma adını kullanarak çıkardı. Bu yüzden bazı insanlar bu dilden "Dr. Esperanto'nun dili" diye bahsediyorlardı. Çok geçmeden "Lingvo Internacia" yerine dilin birincil adı olarak "Esperanto" kullanılır oldu.

Estas, güncel zaman yardımcı fiilidir.
* Türkçe'de tam karşılığı olmayan bu sözcüğün kullanımını dilbilgisi bölümünde açıklayacağız.
"Estas", yazıldığı gibi / estas / olarak okunur.

= insan — Okunuş: / homo /

= çocuk — Okunuş: / infano /

= öğretmen — Okunuş: / instruisto /
* "Instruisto" sözcüğünü okumak belki ilk başta biraz zor gelebilir. Hecelere ayırarak okumaya çalışın: ins-tru-is-to.
* Öğretmen anlamına gelen kelimenin bu kadar uzun olması da size garip gelmiş olabilir. Bunun nedenlerinden biri, instruisto'nun  sonek yardımıyla üretilmiş bir türemiş sözcük olmasıdır — aynen Türkçedeki öğret-men gibi.

= İstanbul — Okunuş: / instanbulo /
Istanbulo, İstanbul'un Esperanto'daki adıdır. "Istanbulo" yerine "İstanbul" demek/yazmak da yanlış değildir. Çünkü Esperanto'da özgün şehir adlarını kullanmayı engelleyen bir kural yoktur.
* Şehir isimleri özel isimler olduğundandan, normalde bunların konuşulan dile göre değişmemesi beklenir. Ancak tarihi, siyasi ve fonetik sebeplerden dolayı dünya genelinde durum ne yazık ki böyle değildir. Örneğin: Türkçe "Londra" = İngilizce "London"; Türkçe "Pekin" = Çince "北京 (Běijīng)"; Türkçe "İstanbul" = İspanyolca "Estambul" = Yunanca "Κωνσταντινούπολη (Kōnstantinoúpolī)"…. Bu karışıklığın önüne geçmek adına, büyük şehirler için Esperanto isimler üretilmiştir (Londono, Pekino, Istanbulo gibi). Dileyen bu standart şehir isimlerini kullanabileceği gibi, karşı taraf anlayacaksa kendi dilindeki ismi kullanmakta da serbesttir. Küçük şehirlere gelince, bunlar uluslararası bilinir olmadıklarından kendi yerel adlarını kullanmak durumundayız. Gerçi, yine de isterseniz kendi şehriniz için Esperanto kurallarına uygun bir ad üreterek onu kullanabilirsiniz, ama standart olmayan bu tür bir yaklaşımın belirsizliğe yol açacağı açıktır (örneğin birisi internette şehrinizi arasa bulamayacak). Bu nedenle birkaç metropol hariç, şehir adları için orijinal (yerel) isimleri kullamak çok daha doğrudur.

= ülke — Okunuş: / lando /

= kitap — / libro /

= dil, lisan — / lingvo /
* Okunuş konusunda sorununuz olmasını gerektirecek bir şey yok: ling-vo şeklinde, iki heceli, yazıldığı gibi okunan sıradan bir sözcük.

= ben — / mi /

= selam — / saluto /

= öğrenci — / studento /

= türk (kişi) — / turko /

= Türkiye — / turkio /
* Bunu, Türkçe'de nasıl okunması gerekiyorsa öyle okuyun, yani 3 heceli olarak tur-ki-o şeklinde. Turk-yo diye okuyup i'yi yok etmek yanlıştır. Mutlaka 3 seslinin de (u,i,o) hece hakkını vermek gereklidir: Tur-ki-o.
* Turkio derken, i ile o tamamen ayrık olarak okunabileceği gibi, söylenişi kolaylaştırmak adına aralarında belli-belirsiz bir y sesi varmış gibi de okunabilir: Turkiyo. Böyle yapmayı tercih ederseniz bile y sesini, gerçekten orada y harfi varmış gibi çok bastırarak söylemeyin, yumuşak bir geçiş yapın.
* Aslında, çok büyük ihtimalle açıklama yapmadan önce de Turkio yazısını ilk gördüğünüzde doğru okumuşsunuzdur. Burada uzun uzun açıklama yapmamın nedeni aklınızda oluşabilecek "i ile o ayrık mı okunmalı, arada belirsiz bir y varmış gibi mi okunmalı" sorusuna yerinde yanıt vermekti ve yalnızca, hece sayısını azaltmamak kaydıyla ikisinin de doğru olduğunu belirttim.

= Türkiye — / turkuyo /
Görüleceği gibi "Turkio" ile "Turkujo" eşanlamlı kelimelerdir. Hangisini isterseniz onu kullanabilirsiniz.
Burada okunuşa ayrıca dikkat çekmek istiyoruz: / turkuyo /. Esperanto'da J harfleri Y sesiyle okunur.
* İlginçtir, bu derste karşımıza çıkan kelimelerin neredeyse hepsi Türkçe'de okunması gerektiği şekilde okunuyor. Bir tek bu son öğrendiğimiz kelime turkujo yazılıp turkuyo okunur. Çünkü Esperanto'daki j harfi y olarak okunur. "O zaman Esperanto'daki y harfi nasıl okunur" diye soracak olursanız, verebilecek bir yanıtımız yok, çünkü Esperanto alfabesinde "y" şeklinde bir harf yok (bizde q, w, x olmadığı gibi.
* Turkio ile Turkujo arasındaki fark nedir sorusuna gelince; Turkujo sözcüğü, Turkio sözcünden daha eski bir yapıdadır, yani Turkujo klasik Esperanto kurallarına sadık kalırken, Turkio sonradan ortaya çıkmış bir kurala göre üretilmiştir. Çeşitli nedenlerle -ujo ile biten ülke adlarından hoşlanmayanlar, alternatif olarak -io bitişini öne sürmüşlerdir. Bu bakımdan, Turkujo kelimesinin daha geleneksel bir havası vardır, Turkio kelimesi ise daha modern görülür. Yaptığımız araştırmaya göre -io ile biten ülke adları, -ujo ile bitenlerden en az beş kat daha fazla kullanılmaktadır, yani günümüzde Turkio biçimi çok daha yaygındır. Ama okuduğunuz yazılarda mutlaka yer yer bu iki kullanımdan her birine rastlayacaksınız. Elbette siz de duruma göre hangisini isterseniz onu kullanabilirsiniz.

= şehir — / urbo /

= kadın, kız — / virino /
* Virino sözcüğünün yaş ile ilgili hiçbir vurgu yapmadığı, yalnızca cinsiyet belirttiği söylenir. Bu yaklaşım teorik olarak doğru olsa bile, günlük hayatta bu kelimenin genelde yetişkin bayanlardan bahsetmek amacıyla kullanıldığı bir gerçektir.

= adam, erkek — / viro /
* Viro da virino gibi, yaş değil sadece cinsiyet belirten bir sözcük olarak geçer. Ama, yine benzer şekilde biri "viro" dediğinde büyük ihtimalle Türkçeden bildiğimiz "adam" anlamını vermek istiyordur.
* Viro ve virino arasındaki benzerlik dikkatinizi çekmiştir. Bunun nedeni, her iki sözcüğün de aynı kökten türemiş olmasıdır. Türkçede olduğu gibi Esperanto'da da yapım ekleri bulunur. İleride bu bize, az sayıda kök ezberleyip çok sayıda sözcük öğrenme imkânı sunacak.

Az önce birkaç sözcük öğrendiniz. Dikkâtli biriyseniz, bunların çoğunun -o ile bittiğini farketmişsinizdir. Bunun nedeni, bunların birer ad (isim) olmalarıdır.
Genel bir kural olarak Esperanto'da isimler o harfiyle biter.
Bu dersimizde öğrendiğimiz bazı isimlere dikkat edelim:

Geri dönüp, öğrendiğiniz çoğu sözcüğün sonundaki -o harfini tekrar görebilirsiniz.
* -o ile bitenler yanında, iki tane de -o ile bitmeyen sözcük öğrendik. "Estas" -o ile bitmiyor çünkü bu bir isim değil çekimlenmiş eylem. Diğer taraftan "mi" (ben) sözcüğü her ne kadar bir şahıs zamiri olsa da, Esperanto dilbilgisine göre isim grubuna girer. Dolayısıyla, normalde bunun da -o ile bitmesini beklerdik ama Esperanto'da son harf(ler)in sözcük türünü (ad, sıfat, zamir vb.) belirlemesi kuralının az sayıda istisnası vardır ve bu istisnaların biri de, diğer şahıs zamirleriyle birlikte, "mi"dir.

İsim cümlesi (ad tümcesi), iki "şey" de birer isim olmak üzere, bir "şey"in (başka) bir "şey" olduğunu anlatmakta kullanılan yapıdır. Örnekler üzerinden incelersek daha anlaşılır olacak gibi:

Bu cümlede geçen sözcüklerin karşıladıkları anlamlar şu şekildedir:

Esperanto → Esperanto
estas  → dir
lingvo  → bir dil
"Lingvo" sözcüğünün anlamını "dil" olarak öğrendik. Ancak özel isimler hariç (Esperanto, Istanbulo, Turkio, Turkujo), öğrendiğimiz bütün sözcüklerin içinde belirsizlik ifade eden "bir" anlamı kendiliğinden vardır. Her öğrenilen sözcükte bunu tekrar tekrar yazmamak için, direkt olarak kelimenin "bir"siz karşılığını yazıyoruz ve böyle yapmaya devam edeceğiz.
Şu listeyi inceleyin:

Bir örneğe daha bakalım:

Yine aynı şekilde "bir" anlamı "urbo"dan "şehir" anlamıyla birlikte kendiliğinden geliyor.
* Çeviri dilden dile anlam taşıma işi olduğundan, tamamıyla matematiksel kurallara bağlı kalarak açıklanamaz. Çünkü "anlam" dilin kendi içerisinde dahi konuya ve kişiye ve kişinin her anına göre farklılık gösterir. Bu nedenle, çevirilerle ilgili uyarılarımıza sıkı sıkıya bağlı kalmaya çalışmadan, cümlenin genel anlamına odaklanmanızı tavsiye ederim. "Esperanto bir dildir." cümlesi ile "Esperanto dildir." cümlesi arasında, veya "İstanbul bir şehirdir." ve "İstanbul şehirdir." cümlesi arasında size göre anlamca ne kadar fark var? Bir anlam farkı varsa bile (ki ben göremiyorum) ihmal edilebilir olduğu açıktır. Bu nedenle "Istanbulo estas urbo." cümlesini "İstanbul şehirdir." diye de çevirebiliriz. Burada "bir"i vurgulamamın nedeni, anlamın "belirsiz" o

= o (erkek) — / li /
Li, "o" anlamındaki şahıs zamirlerinden biridir.
Yalnızca erkeklerden (erkek insan ve nadiren erkek hayvan) bahsederken kullanılır.

= o (dişi) — / şi /
Ŝi, "o" anlamına gelen diğer bir şahıs zamiridir.
Yalnızca dişilerden (dişi insan ve nadiren dişi hayvan) bahsederken kullanılır.
* "O" anlamına gelen başka bir şahıs zamiri daha var, ancak bunu sonraki derste ele alacağız.
Esperanto'daki Ŝ / ŝ harfi Türkçe'deki "ş" gibi okunur.

=  sabah — / mateno /

=  gün — / tago /

=  akşam  — / vespero /

=  gece  — / nokto /

=  iyi  — / bona /

=  yeni  — / nova /

=  güzel, yakışıklı  — / bela /

=  genç  — / yuna /

=  büyük  — / granda /

=  uzun (ence)  — / longa /

=  yüksek, uzun (boyca)  — / alta /

Esperanto'da uzun anlamını iki sözcük karşılar: longa ve alta.
Genel olarak, cisimlerin (özellikle yatay duranların) uzunluğunu belirtirken veya "uzun" kavramını mecazi olarak kullanırken  longa sözcüğü kullanılır. Örneğin; uzun kalem, uzun tren,  uzun timsah, uzun yol, uzun zaman, uzun gece, uzun yazı, uzun konuşma, uzun hayat söz gruplarında altı çizili "uzun"ların Esperanto karşılığı longa’dır.
Alta ise yüksek demektir. Ama, içinde yükseklik anlamı bulunan uzunlukları (dikey uzunlukları) ve mecazi olarak "yüksek" kavramını da karşılar. Örneğin, uzun adam, uzun çocuk,  uzun direk, uzun kule, yüksek bina, yüksek dağ, yüksek fiyat, yüksek seviye, yüksek kalite söz gruplarında altı çizili kelimeleri karşılayan Esperanto sözcük alta’dır.
Özetle, longa uzun, alta yüksek demektir. Ama bahsedilen uzunluk, cismin dikey duruşundan dolayı yüksekliği de beraberinde getiriyorsa, uzun yerine yüksek anlamına gelen alta kullanılır (özellikle de bir insanın boyundan bahsederken).

=  hayır, değil vb. — / ne /
Ne’nin kullanımını "Dilbilgisi" başlığı altındaki "Olumsuzluk" bölümünde açıklayacağız.

Mal-, zıt anlam belirten ön ektir. Önüne geldiği sözcüğü karşıt anlamlı bir sözcüğe çevirir.
* Esperanto'da yapım eki olarak birçok ön ek ve sonek (veya bazılarına göre iç ek) bulunur. Bu sayede ezberlenmesi gereken kelime sayısı bir hayli azalır ve aynı zamanda dilde üretkenliğin de önü açılır.
Mal-’ın anlamı nasıl değiştirdiğini aşağıdaki tabloda görebiliriz.

Oldukça basit, değil mi? Bu ve benzeri ekler ve sözcük birleştirme sayesinde, bir tek kök sözcük ezberleyerek bir anda 10 ila 100 kadar yeni kelime öğrenmiş olabilirsiniz.
* Kolaylıkla tahmin edebileceğiniz gibi mallonga ve malalta’nın kullanım alanları arasındaki fark, longa ve alta arasındaki ayrımın bir benzeridir. Yani "kısa tren" demek için mallonga (ence kısa) kullanırken, "kısa adam" derken malalta (alçak, boyca kısa) kullanılmalıdır.
* Bazı zıt sözcüklerin alternatifleri de vardır. Örneğin malgranda yerine eta da kullanılabilir (bu da aslında bir eke dayanıyor). Başka bir örnek ise malnova ile aynı anlama gelen olda sözcüğüdür. Ancak bu sözcük, şiir vb. eserler dışında pek kullanılmaz.

Ne- ön eki ... olmayan anlamını verir.
Bu ekin kullanımını şu tabloda tabloda örnekleyebiliriz:

Mal- ve Ne- ön eklerinin anlamları birbirine benzemekle birlikte aralarında bir nüans vardır.
Örneğin, malgranda "küçük" demektir, negranda "büyük olmayan" demektir. Büyük olmayan bir şeyin küçük olması gerekmez (orta büyüklükte olabilir ama küçük de olabilir).
Benzer şekilde, malbela (çirkin) net bir olumsuz durumu belirtirken, nebela (güzel olmayan) sadece olumlu anlamın yokluğunu belirtir.
Ne- ile Mal- ard arda da kullanılabilir. Örneğin nemalgranda "küçük olmayan", nemalbona "kötü olmayan" anlamına gelir.
* Bona (iyi) sözcüğüne mal- ekleyerek malbona (kötü), ona da ne- ekleyerek nemalbona (kötü olmayan) sözcüğünü elde ettik. Peki malnebona olabilir miydi? Dilbilgisi bakımından evet, ancak anlam bakımından hayır diyebiliriz. Çünkü nebona "iyi olmayan" demektir, mal- eki ise anlamı tam zıddına çevirir. Halbuki "iyi olmayan" kavramının anlamca zıttı yoktur. "İyi", "iyi olmayan"ın değil "kötü"nün zıddıdır. "Kötü olmayan" da "iyi olmayan"ın zıttı değildir, çünkü iyi olmayan bir şey kötü de olmayabilir. Yani özetle, malnebona teorik olarak doğru bir sözcüktür ama hiçbir tutarlı anlam ifade etmez.
* Şu ana dek gördüğümüz üzere Esperanto mantık kurallarına oldukça bağlı bir dildir. Buna göre teorik olarak malmalbona ve nenebona sözcükleri bona ile aynı anlama, yani "iyi" anlamına gelmelidir. Öyleyse bu sözcükler mantıklıdır, ama elbette bunları günlük hayatta kullanmak son derece mantıksızdır.

Hemen hemen bütün isimlerin o ile bittiğini hatırlayalım. Sıfatlar için de benzer bir durum söz konusudur. Bütün sıfatlar a ile biter.

* Aslında sondaki -o'yu -a'ya çevirerek isimden sıfat yapmak, sondaki -a'yı -o'ya çevirerek de sıfattan isim yapmak mümkündür. İlk aşamada bunun ayrıntısından bahsetmeye gerek duymuyoruz, bunu yapmaya zaman içinde kendi kendinize alışacaksınız.

Esperanto'da yalın durumdaki adları sıfatla niteleme işini aynen Türkçe'deki gibi yapabiliriz.

Türkçe'den farklı olarak Esperanto'da önce ismi, sonra sıfatı söylemek de mümkündür.

1. sütundaki kullanım, 2. sütundakilere göre daha yaygındır.
Birden çok sıfat kullanarak da Türkçedekine benzer yapıda tamlamalar oluşturabiliriz.

* Umarım en son örneğin neden "iyi eski (bir) kitap" diye değil de "iyi (bir) eski kitap" biçiminde çevrildiğine takılmamışsınızdır. Sonuçta çeviri matematik kurallarıyla açıklanamaz, esas olan, anlamı uygun şekilde karşılamaktır. Bundan sonraki derslerde bu tür önemsiz ayrıntılarla ilgili ayrıca açıklama yapmayacağım ancak çevirinin yeterince farklı olmasını gerektiren önemli bir neden varsa bunu belirteceğim.
Sıralama serbestliği bu tür tamlamalarda da vardır. Örneğin, son tamlamayı söylemek için 6 ayrı alternatifimiz var:

Esperanto'da sıfat cümlesi kurmak kolaydır ve isim cümlesi kurmakla arasında önemli bir fark yoktur. Örnekleri inceleyelim:

Her ne kadar sıfat cümlesi olmasa da, yeri gelmişken yüklemi nitelenmiş ad olan isim cümlelerine örnek verelim.

Sıralama konusunda hâlâ yeterince özgürüz.

Yine de hiçbir zaman aşağıdaki gibi anlaşılması zor bir sıra kullanmamaya özen göstermek iyi olur, değil mi?

* Ne dediği pek belli olmayan yukarıdaki cümleyi bir kenara bırakırsak, bugüne kadarki bütün cümlelerimizin öznesi ya özel isim (Turkio, Esperanto, Ayşe, ...) ya da bir şahıs zamiri (Mi, Li, ...) oldu. Çünkü cins isimleri kullanmadan önce artikelin kullanımını öğrenmek iyi olacak ve bu konuyu da 4. derste ele alacağız.

Esperanto'da temel olumsuzluk sözcüğü "ne"dir.
Sıra çok önemli olmamakla birlikte, bir cümleyi olumsuzlaştırmanın en kolay yolu yüklemin öncesine ne getirmektir. Şu ana kadar eylem temelli bir yüklem olarak yalnızca estas’ı öğrendik.

* Ne’nin cümledeki konumunu değiştirebiliriz. Olumsuzluk durumu aynı kalır ama olumsuzluk vurgusu ne’den sonra gelen sözcüğe kayar. Çok önemli olmadığından şimdilik bunun üstünde durmayacağız.

Sıfatlar -a ile biterler ve nitelediği ismin sonuna veya başına getirilebilirler.
Mal- ön eki kelimeyi zıt anlama çevirir, ne- ön eki zıt anlama göre daha zayıf olan "... olmayan" anlamı verir.
Yalnız başına kullanıldığında ne cümleyi olumsuz yapar, alışılmış yeri yüklemin önüdür.

=  o (cinssiz)  — / ci /
Ĝ (ĝ) harfinin Türkçedeki "c" sesini verdiğine dikkat edelim ve bunu unutmayalım.

Şimdiye kadar o anlamına gelen 3 şahıs zamiri öğrendik: Li, Ŝi ve Ĝi.
Bunları nerede kullanacağınızı netleştirelim:

(Aslında karışık bir şey yok. Özetle, li bilinçli genel canlılar (insan ve insanüstü) ve her türlü erkek için, ŝi her türlü dişi için, ĝi hayvanlar, cansızlar, kavramlar ve bazen de bebekler için kullanılır. Li, ŝi, ĝi'nin kullanımı, eğer biliyorsanız İngilizce'deki he, she, it'in kullanımıyla neredeyse aynıdır. Hâlâ size anormal gelen bir durum varsa, bunu sorun etmeyip zamanın akışına bırakın. Zaman içerisinde verilecek örnekler sayesinde bu zamirlerin kullanım alanlarına kolayca alışacaksınız.)

=  benim  — / mia /
(Daha önce de belirttiğimiz gibi, böyle bir sözcüğü kolayınıza gelen şekilde telaffuz edebilirsiniz, yani "i" ile "a" arasında belli-belirsiz bir "y" sesi varmış gibi davranabilirsiniz. Ama elbette Türkçe "şiar" kelimesinde olduğu gibi, "i" le "a"yı ayrık okuyabilirsiniz (ki kelimenin yazımı normalde bunu gerektirir). Sonuç olarak size kolay geleni yapmanız yeterli. Aynı durum aşağıdaki "lia", "ŝia", "ĝia", "hieraŭ" ve "hodiaŭ" gibi sözcükler için de geçerli. Esperanto, kendi kuralları çerçevesinde yazıldığı gibi okunur. Bu nedenle bu konuyu uzatmak gereksiz.)

=  (erkek) onun — / lia /

=  (dişi) onun — / şia /

=  (cinssiz) onun — / cia /

Bu üç iyelik zamirinin kullanım alanı li, ŝi ve ĝi´nin yukarıda bahsettiğimiz kullanım alanlarına birebir karşılık gelir, yani örneğin ŝi zamiri kullanacağınız birine ait olan bir şey için ŝia sıfatını kullanırsınız.
Şu tabloyu inceleyelim:

(E-o, Esperanto anlamına gelen yaygın bir kısaltmadır.)
Bu tablo sakın size, sona -a eklemenin -nın, -nin anlamı verdiğini düşündürmesin. Böyle bir kullanım yoktur, bu yalnızca zamirler için geçerli olan çok özel bir durumdur.
Mia, lia, ŝia ve ĝia birer sıfattır ve kullanımları geçen ders öğrendiğimiz sıfatlar gibidir.

=  Türk, türkle ilgili, türkçe olan vb. — / turka /
Turka, turko'nun sıfat halidir. İsimleri nitelemek için daima sıfat kullanıldığını unutmayalım. Bu nedenle, Turko Türk anlamına gelmesine karşın "turko studento" demek yanlıştır, "turka studento" ise "türk öğrenci" anlamına gelen doğru bir kelime grubudur, elbette alternatif olarak "studento turka" da denebilir.

=  Türk Dili, Türkçe — / la turka (lingvo) /
Esperanto'da çoğu dil için ayrı bir ad yoktur. Dil adları turka gibi millî sıfatlar yardımıyla ifade edilir. Türkçe'nin Esperanto'daki adı "la turka lingvo"dur. Bu uzun adı kullanmak yerine kısaca "la turka" da denir.
("La turka" -a ile bittiğinden sıfat izlenimi verse de, daha öğrenmediğimiz "la"dan ve cümlenin gelişinden bunun "lingvo"su söylenmemiş bir dil adı olduğunu anlarız.)

=  su — / akvo /

=  kahve — / kafo /

=  çay — / teo /

=  arkadaş — / amiko /

=  sevmek — / ami /

= -den hoşlanmak, sevmek — / şati /

Ami, ŝati´ye göre daha güçlüdür ve daha çok duygusal bir bağı (aşk olması şart değil) belirtmek için kullanılır.
(Biz Türkçde "çayı" veya "resim yapmayı" "sevebiliriz" ama Esperanto'da genelde bunlardan "hoşlanılır" (ŝati). Bunlar için "ami" de kullanılır ama anlam çok derinleşir (resim yapmaya aşığım gibi). Ami fiili en çok sevgili, anne vb. akraba, yakın dost, evcil hayvan ve diğer insanlar için kullanılsa da, bunlar için ŝati kullanmak da mümkündür.)

=  görmek — / vidi /

=  okumak — / legi /

=  öğrenmek — / lerni /

=  konuşmak — / paroli /

= içmek — / trinki /

=  dün — / hieraw /
Esperanto'da Ŭ (ŭ) harfi w sesiyle okunur, yani sessiz bir harftir. W sesi, ağzı u harfi söyleyecek konuma getirip u harfini söylemeyerek elde edilir. Elde edilen ses v sesine çok benzer olur. Hatta, yanlış anlaşılmaya yol açacak sözcükler bulunmadığından, kendinizi zorlamayıp bu harfi direkt olarak v gibi okumanızda da bizce hiçbir sakınca yoktur.

=  bugün — / hodiaw /

=  yarın — / morgaw /
(Eğer hangi dilden geldiklerini bilmiyorsanız hieraŭ (dün), hodiaŭ (bugün) ve morgaŭ (yarın) sözcüklerini karıştırmanız olasıdır. Bu sözcüklerin alfabetik sırasıyla, belirttikleri zaman sırasının aynı olmasına dikkat ederseniz anlamlarını karıştırmazsınız.)

Esperanto'da mastar hâlindeki fiiller i ile biter. Örneklere bakalım:

Daha önce öğrendiğimiz estas çekimlenmiş bir fiildir. "Estas"ın mastar hali "esti"dir. Türkçe'de tam bir karşılığı yoktur ama nasıl kullanıldığını öğrenmek çok kolaydır.

Güncel zaman, Türkçedeki şimdiki zaman ve geniş zamana karşılık gelir. Güncel zaman as sonekiyle yapılır.

Daha önceden öğrendiğimiz estas, esti fiilinin güncel zaman çekimi olmaktadır.

(Karıştırılacağını zannetmiyorum ama her ihtimale karşı; son cümlede ŝia ile gizlice bahsi geçen "o" (öğretmene sahip olan kişi) dişidir, öğretmanin bayan veya erkek olduğuyla ilgili bir bilgi yoktur.)
("Ŝia nova instruisto ne estas turka." yerine "Ŝia nova instruisto ne estas turko." da denebilirdi. İki cümle arasında anlamca hiçbir fark yok, yalnızca biri sıfat biri isim cümlesi. Bu durumu Esperanto'nun mantığını çözdükçe anlayacaksınız. Bir de, bu ilginç örnek sizi yanlış yönlendirmesin. Örneğin "Li estas amiko.", "o bir arkadaş" anlamına gelirken, sondaki -o'nun -a yapılmasıyla oluşan "Li estas amika." cümlesi, yaklaşık olarak "o cana yakındır" gibi farklı bir anlama gelebilir.)

Esperanto'da geçmiş zaman is ekiyle yapılır.

Bu zamana göre çekimlenmiş bir fiil, örneğin parolis, cümlenin gelişine göre "konuştu" dışında "konuşmuş", "konuşurdu", "konuşuyordu", "konuşmaktaydı", "konuşmuştu" vb. anlamlara da gelebilir. Bu ek anlamların bazılarını kesin olarak vermek de mümkündür, bu yolları daha sonra göreceğiz.
Esti fiilinin geçmiş zaman çekimi olan estis, "idi" anlamına gelmektedir. Bununla ilgili örnekleri inceleyelim:

Son cümlede kullanılan hieraŭ yapıca olmasa da, anlamca zaman zarfı işlevi görmektedir. Bu tür kelimelerin cümledeki yeri çoğu kez önemsizdir. "Hieraŭ mi estis malbona." yerine "Mi hieraŭ estis malbona.", "Mi estis malbona hieraŭ." ... diyebiliriz.

Gelecek zaman os ekiyle elde edilir.

Esti´nin gelecek zaman çekimi olan estos tahmin edebileceğiniz gibi "... (durumunda) olacak" gibi bir anlama gelir.

(Son örneğin biraz saçma olmasına aldırmayın.)

Her zaman olmasa da, genelde Esperanto fiil cümlelerinde özne ve yüklem mutlaka bulunur.
(Bu kuralın nadir görülen istisnaları genelde yüklem+zarf şeklindeki cümlelerdir. Bunlarla sonra karşılaşacağız.)
Aşağıdakiler çok basit fiil cümleleridir:

Fiil cümlelerinde de öğe sırası önemsizdir. Örneğin "Mi vidos morgaŭ." dışında, "Mi morgaŭ vidos.", "Vidos mi morgaŭ.", "Vidos morgaŭ mi.", "Morgaŭ mi vidos.", "Morgaŭ vidos mi." cümlelerinin hepsi doğrudur ve (belki küçük vurgu farkları hariç) hepsi aynı anlama gelir.

Eğer bir cümledeki yüklem geçişli ise bu cümlede nesne bulunabilir. Nesne, fiilden direkt olarak etkilenen öğeye verilen addır. Esperanto'da nesne -n son ekiyle belirtilir. Bu Türkçede en çok -(y)ı/i/u/ü ve -(y)a/e eklerine karşılık gelirken, bazen başka bir eke veya yerine göre yalın duruma karşılık gelebilir. Aşağıdaki örnekleri incelediğinizde -n´nin ne işe yaradığını daha net anlayacaksınız:

Esperanto'da cümle öğelerinin yerini değiştirebilmemizi  -n ekine borçluyuz. Örneğin Mi amas cin. yerine Cin amas mi. (veya Mi cin amas., Amas cin mi. ...) diyebiliriz, çünkü -n hâlâ ci´ye eklidir. Ancak nesnenin yerini değiştirip Min amas ci. veya Ci amas min. dediğimizde anlamın "Beni seviyorsun." şeklinde değişeceğini görmek zor değildir.

Esperanto'da, Türkçede olmayan çok ilginç bir durum vardır. Sıfatlar, bağlı olduğu isme iki konuda uyum gösterirler. Bu uyumlardan ilk öğreneceğimiz nesne uyumudur. Şöyle ki, eğer bir sıfat tamlaması nesne ise -n ekini hem isim, hem de sıfat alır.

(Bu durum ilk başta anormal gelse de, yanlış anlaşılmayı önleme açısından çok kullanışlıdır ve dili iyice öğrenmiş olanlara geniş bir ifade alanı sağlar. Bazen, özellikle de ilk zamanlarda, iki (veya daha çok) kelimeden birine -n eklemeyi unutabilirsiniz. Bu arasıra herkesin yaptığı küçük bir hatadır, dert etmeyin.)
Son bir uyarıda daha bulunalım;
La turka (lingvo) sözcük grubundaki la, -n takısı almaz, çünkü sıfat değildir.
Mi la turkan lingvon parolas., veya daha kısa söylemek istersek 
Mi la turkan parolas. "Türkçe konuşurum." anlamına gelebilecek doğru birer cümledir.
Mi la turkan lingvon parolas. ve 
Mi la turkan parolas. cümleleri ise yanlıştır, çünkü la, -n ekini kabul etmez.
La´nın tam olarak ne olduğunu sonraki derste ayrıntısıyla inceleyeceğiz.

Fiillerin mastar hâli (-mak, -mek) -i ile biter.
Geçmiş zaman -is, güncel (şimdiki, geniş) zaman -as, gelecek zaman -os ile yapılır.
Nesneye (yüklemden direkt olarak etkilenen öğeye) -n eklenir.
Nesne sıfatlarla nitelenmiş bir isim ise, hem isme hem de sıfatlara -n eklenir.

Esperanto'da belirliliği sağlayan sözcük "la"dır.
"La", anlamı çok fazla değiştiren bir sözcük değildir, yalnızca ayrıntı verir. Bu nedenle eğer anlamazsanız üzerinde çok fazla durup zaman kaybetmenize gerek yok.
Özetle denebilir ki;

Bir cins ismin (veya cins isim değerindeki sözcük grubunun) başında la yoksa bu, konuşulan kişinin (veya okurun) sözkonusu isim hakkında belirleyici bilgisi bulunmadığını gösterir. Bu durumda isim "herhangilik" anlamı kazanır.
Bir cins ismin (veya cins isim değerindeki sözcük grubunun) başında la varsa bu, konuşulan kişinin (veya okurun) sözkonusu sözcükle tam olarak hangi şeyin/kişinin kastedildiğini anlayacağı beklentisini ifade eder.
Daha iyi anlamak için Türkçeden örnek verelim. Türkçede la olsaydı;

"Su içiyorum." cümlesinde "su"nun başına la konmazdı. Ama "su"nun başına la getirip "La su içiyorum." deseydik bu cümle içilen suyun belirli bir su (örneğin muhatabın görmekte olduğu masanın üzerindeki bardakta duran su) olduğunu ima ederdi ki, biz bu nüansı günümüz Türkçesinde Suyu içiyorum. şeklinde verebiliriz.
"Buraya gelirken işçiler gördük." cümlesinde "işçiler"in başında la olmazdı. Bu cümleyi "Buraya gelirken la işçiler gördük." şekline dönüştürseydik, günümüz Türkçesiyle "Buraya gelirken işçileri gördük." demiş olacaktık. Bir bakıma, özellikle hangi işçilerden bahsetmiş olduğumuzu belirtmiş olacaktık.
(Yukarıdaki örneklerde la nesnelere getirildi. Böylece Türkçedeki anlam değişimini hemen gözlemledik. Çünkü Türkçede nesne belirtili ve belirtisiz olabilir. Eğer bunun ne anlama geldiğini bilmiyorsanız,  "belirtili nesne" ile "belirtisiz nesne" arasındaki farkı internetten araştırarak öğrenebilirsiniz. Ancak ne var ki Türkçe, nesne dışındaki öğelerde belirlilik/belirsizlik ayrımını yapacak genel yapılara sahip değildir. Bu yüzden aşağıdaki örneklerde oluşan anlam farkı Türkçe cümle yapısına yansımaz.)
........................
"La"nın etkisini en kolay cümle içinde görürüz. Bu şekildeki örnekleri vermeden önce aşağıdaki uyarıları yapalım.

Özel isimler kendiliğinden belirlidir, yani La Istanbulo, La Turkio, La Mustafa gibi kullanımlar pek normal değildir. Buralarda "la" kullanılmamalı.
Şahıs zamirleri (mi, ci, li, ŝi, ĝi, ni, vi, ili, oni, si) kendiliğinden belirlidir. La mi diye bir şey olmaz, sadece Mi demek gerekir.
İyelik zamiri alan sözcük belirli sayılır. Örneğin La mia libro, La via patro yanlıştır, buralarda "la" olmaz.
La mia libro yanlıştır dedik ama La mia diye bir kullanım vardır. Bunun ne işe yaradığını az sonra açıklayacağız.

...................

Esperanto'da bir adı çoğul yapmak için ona -j eklemek yeterlidir. (Esperanto j harfinin Türkçedeki y gibi okunduğunu unutmayalım.)

Sıfatın isme iki yönden uyum sağladığını belirtmiştik. Bunlardan ilki -n nesne ekiydi. Diğeri ise -j çoğul ekidir.
Bir sözcük çoğul ise, onu niteleyen bütün sıfatlar çoğul eki almak zorundadır.

Zaman zaman -j´lerden bazıları unutkanlığınıza kurban gidebilir. Bu önemli bir sorun değildir ve alışkanlığa bağlı olarak zaman içinde kendiliğinden çözülür.

Zamenhof Esperanto dilini 1887 yılında Fundamento de Esperanto adlı belge ile tanıtmıştır. Burada Esperanto okunuş kuralları açıklandıktan sonra, Fundamento de Esperanto'da geleneksel olarak geçen 16 kural ve bunlarla ilgili kısa örnekler verilir. Esperanto Alfabesi dışındaki kurallar için bu bölümün amacı "öğretmek" değil "tanıtmak"tır. Bu ve diğer kurallar kitabın geri kalanınında daha açıklayıcı olarak ele alınacaktır.

Esperanto alfabesi 28 harften oluşur:

Her harf her zaman aynı sesi verir. Harflerin seslerini dinlemek için aşağıdaki tabloda IPA sütunundaki karakterlere tıklayabilirsiniz.
Not 1 : IPA, Uluslararası Fonetik Alfabe demektir. Bu alfabe yeryüzündeki herhangi bir dilin seslerini açıklamak için kullanılan uluslararası bir standarttır, Esperanto ile bir ilgisi yoktur, yani IPA sembollerini bilmenize gerek yoktur.
Not 2 : Aşağıdaki sesler IPA için kaydedilmiş olduğundan, yani özel olarak Esperanto için kaydedilmediğinden, özellikle seslilerde biraz farklılık olabilir. Bunları taklit etmeye çalışmayınız.  Büyük I harfinin i olarak okunması dışında, Esperanto'daki sesli harflerin beşi de aynen Türkçedeki gibi okunur. 

Yukarıdaki tabloda, Esperanto'nun da aynen Türkçe gibi Q, W ve X harflerini kullanmadığını görmekteyiz, ancak iki farkla: Esperanto'da Y harfi de yoktur (Türkçe'deki y sesini Esperanto'da j harfi verir) ve X sembolünün Esperanto yazımında özel bir yeri vardır (bunu Esperanto'ya Özgü Harflerin Yazımı başlığı altında açıklayacağız).
Esperanto'nun içerdiği sesler yönünden en çok benzeştiği dillerden biri Türkçedir.
Esperanto'daki 28 sesin 25'i Türkçe'de tam olarak vardır.

Esperanto yazılarda a, b, d, e, f, g, h, k, l, m, n, o, p, r, s, t, u, v ve z harflerini aynen Türkçede okuduğunuz gibi okuyabilirsiniz.
Bunlara ek olarak i harfi de Türkçedekiyle aynı okunur. Bunu ayrı almamın tek nedeni, İngilizce ve diğer çoğu yabancı dilde olduğu gibi Esperanto'da da, i harfinin büyüğünün I şeklinde noktasız olarak yazılıyor olması.
Son olarak, bu listeye ĉ ve ŝ harflerini dahil etmek de yanlış olmaz. Bu harfler şeklen Türkçede bulunmamasına karşın, gözümüz bunları yazı içerisinde Türkçedeki ç ve ş harfleri gibi algılar. Gerçekten de, Esperanto'da ĉ ç olarak, ŝ ise ş olarak okunmaktadır.
Sonuç olarak, Esperanto'daki 28 harfin 22'si Türkçedeki gibi okunmaktadır diyebiliriz. Üstelik (j hariç) geriye kalan harfler Esperanto kelimelerde nispeten daha az bulunur. Buna göre, hiç Esperanto bilmeyen biri bile Esperanto bir metni Türkçe okuyarak %90 civarında doğru telaffuza ulaşabilir.

Esperanto sözcükleri okurkan en çok dikkat etmemiz gereken harfler şunlardır:
J : Türkçedeki y gibi okunur.
Ĵ : Bizdeki orijinal j sesini gösterir.
Ĝ : Türkçedeki c gibi okunur.
Sonuç olarak okunuşlar: J → Y, Ĵ → J, Ĝ → C.

Esperanto'da c, ĥ ve ŭ harfleriyle gösterilen sesler Türkçede tam olarak bulunmamakla birlikte bunlardan biri yok denecek kadar nadirdir, diğer ikisi ise bazı yakın Türkçe seslerle yaklaşık olarak karşılanabilmektedir.

C harfinin gösterdiği ses Türkçedeki s harfinin süreksizi olarak nitelenebilir.
Bu ses bir çok bilinen dilde yoktur, örneğin Türkçe, İngilizce, Arapça, İspanyolca.... Bunun bir sonucu olarak, Esperanto konuşanların çoğunluğu bu harfi ts şeklinde okumaktadır. Yani, bazı dillerde x ks olarak okunduğu gibi, Esperanto'da da c ts olarak okunmaktadır (bunu Türkçede c'yi dj, ç'yi de tş olarak okumaya benzetebiliriz). C’nin "ts" olarak okunması o kadar yaygındır ki, artık hemen herkes tarafından doğru kabul edilmektedir. Dolayısıyla siz de c harfini ts birleşik sesiyle okuyabilirsiniz.
Birkaç örnek verecek olursak, dilimize Japonca'dan geçen "tsunami" sözcüğünün Esperanto karşılığı "cunamo" diye yazılır. Biz bunu "tsunamo" şeklinde okuyabiliriz. Benzer şekilde "paco" sözcüğü "patso", "scii" (Esperanto'da Türkler için okunması en zor sözcüklerden biri) ise "stsii" şeklinde okunabilir.
Şart değil ama ts birleşimini sanki tek bir harfmişlercesine hızlı söylerseniz çok daha iyi olur. T ve s harflerinin ikisini de aynı anda söylediğinizde ise bu harfin, özeliikle orta ve kuzeydoğu avrupalılar ve bazı asyalılardan duyabileceğiniz orijinal sesine tam olarak ulaşmış olacaksınız. Bu ses yaklaşık olarak şöyledir (aca).

Ĥ, Rusça ve Kiril Alfabesi kullanan bazı diğer dillerde, Yunan Alfabesinde ve Latin Alfabesi kullanılan Azerice gibi bazı dillerde "X" sembolüyle, bazı İspanyolca lehçelerinde J, bazı Almanca lehçelerinde de CH ile gösterilen, Türkçedeki K sesinin süreklisi, Ğ sesinin ise serti olarak düşünülebileceğimiz bir sestir. Ĥ damaksal bir h sesidir, dolayısıyla Arapçada خ ile gösterilen gırtlak h'sinden biraz daha farklıdır. Yaklaşık olarak şu sesi (ĥa, aĥĥa) vermektedir.
Ĥ Esperanto'da oldukça nadir ortaya çıkan bir harftir (Türkçedeki j harfinin nadirliğiyle karşılaştırılabilir). Ayrıca birçok dilde bulunmadığından pek çok kişi için telaffuz zorluğuna neden olmuştur ve böylece ilk zamanlardan beri bu sesin Esperanto'dan çıkarılması konusunda çalışmalar yapılmıştır. Bu kapsamda, ĥ harfi içeren zaten az sayıdaki sözcük için ĥ içermeyen yeni alternatifler üretilmiştir. Günümüzde artık içerisinde ĥ sesi geçen hemen hemen her sözcüğün, içinde ĥ geçmeyen bir alternatifi de vardır. Örneğin;
Ĥemio = Kemio (Kimya)
Monarĥio = Monarkio (Monarşi)
Teĥnika = Teknika (Teknik)
Ĥina = Ĉina (Çinli)
Ĥoro = Koruso (Koro)
Böylece ĥ harfi dilden hemen hemen atılmıştır. Dolayısıyla bu harfi doğru telaffuz etmeniz çok da önemli değildir.
Yine de belirtelim ki günümüzde sözcüklerin ĥ harfi içeren orijinallerini daha sempatik, rahat veya doğal buldukları için bunları kullanmaya devam eden kişiler de oldukça fazladır. Bu kitap boyunca bu tür sözcüklerin, yerine göre hem ĥ içeren, hem de ĥ içermeyen şekilleri kullanılacaktır.

Ŭ harfi İngilizcedeki w harfi veya diğer dillerdeki buna denk sesler gibi okunur. Bir sesli harf olan u'ya benzer ama aslen sessizdir ve oldukça da vurgusuz bir sestir.
Ŭ'yu bir çok açıdan Türkçedeki ğ'ye benzetebiliriz. Öncelikle şapkası benzemektedir. Sonra, aynen ğ gibi (kendi adı olan ŭo, nidalar ve sesletim amaçları hariç) asla kelime başında bulunmaz. Yine aynen ğ gibi yalnızca seslilerden sonra gelebilir ve bu öncül sesli %99'dan fazla bir oranda ya a ya da e olmaktadır (aŭ veya eŭ).
Eğer yabancı dillerden w sesine alışkın değilseniz, ŭ'yu, sadece dudak şeklinizi değiştirerek söylenmeye hazırlanan ama söylenmeyen bir u gibi okuyabilirsiniz (sadece sesli harflerden sonra geldiği için bu yöntem işe yarayacaktır). Eğer bu da zorunuza giderse, bu harfi bildiğimiz v harfi gibi okumanızda çok fazla mahsur yoktur, çünkü çok büyük ihtimalle, ŭ harfiyle v harfinin karışabileceği herhangi bir kelime bulunmamaktadır.

Esperanto metinleri okurken Türkçe konuşan birinin dikkat etmesi gerekenleri tekrar özetleyelim.
0. a, b, d, e, f, g, h, i, k, l, m, n, o, p, r, s, t, u, v, z harflerini bildiğiniz gibi okuyun.
1. Büyük I harfinin, küçük i harfinin büyüğü olduğuna dikkat edin.
2. j harfini Türkçe'deki y gibi okuyun.
3. ĵ harfini Türkçe'deki j gibi okuyun.
4. c harfini ts bitişik sesi olarak okuyun.
5. ĉ ve ŝ harflerini Türkçe'deki benzerleri gibi ç ve ş olarak okuyun.
6. ĝ harfini c olarak okuyun.
7. ĥ ve ŭ harfi için yukrıda yaplmış açıklamaları dikkate alın.

Esperanto'da, başka dillerde bulunmayan 6 harf vardır: Ĉ, Ĝ, Ĥ, Ĵ, Ŝ ve Ŭ. Bu harfleri yazmak her zaman mümkün olmayabilir. Bunun için çeşitli yöntemler vardır.

Bazı durumlarda ĉ, ĝ, ĥ, ĵ, ŝ ve ŭ harflerini kullanmamız teknik açıdan mümkün değildir (örneğin e-posta ve veb adresleri, cep telefonu mesajları, unikod desteklemeyen metin vb.). Bu durumlarda başvurulabilecek iki pratik yöntem vardır.

Şapkalı harfler yerine, o harfin şapkasızını, ardırdan da şapka yerine x harfini yazmayı öneren ve çok yaygın olarak kullanılan bir Esperanto yazım sistemidir.

Ĉ yerine Cx
Ĝ yerine Gx
Ĥ yerine Hx
Ĵ yerine Jx
Ŝ yerine Sx
Ŭ yerine Ux

Tarihsel olarak Zamenhof, h-sistemi denen bir sistem önermiştir. Bu sisteme göre Ĉ yerine Ch, Ĝ yerine Gh, Ĥ yerine Hh, Ĵ yerine Jh, Ŝ yerine Sh yazılırken, Ŭ harfi için sadece U yazılır.
Günümüzde bu sistemi kullananlar var olmakla birlikte x-sistemini kullananlara göre oldukça az sayıda oldukları gözlenmektedir.
H harfi Esperanto'da zaten bulunduğundan, bu sistem, özellikle bazı beklenmedik birleşik kelimelerde, telaffuz ve anlam ikilemine yol açabilir. Bu nedenle bu sisteme göre yazılmış bir metnin, bilgisayar tarafından doğru yorumlanarak orijinal harflerin (ĉ, ĝ, ĥ, ĵ, ŝ, ŭ) bulunduğu bir metne dönüştürülmesi her zaman mümkün olmayabilir. Bunun bir sonucu olarak Esperanto yazımıyla ilgili programlar daha çok x-sistemi üzerine kurulmuştur, bu programları kullanan insanlar x-sistemine aşina olmuş, bunun bir sonucu olarak da, başta göze anormal gelen x-sistemi Esperanto topluluğunca normal algılanır olmuş ve aksine h-sistemi garip algılanmaya başlamıştır.

Aşağıda, aynı Esperanto metnin önce orijinali (unikod), sonra x-sistemine göre yazılmışı, sonra da h-sistemine göre yazılmış hâli görülmektedir.
UNIKOD:

Eŭropa Unio estas organizaĵo de ŝtatoj en Eŭropo; formas ĝin nun dudek sep membroŝtatoj.
X-SİSTEMİ

Euxropa Unio estas organizajxo de sxtatoj en Euxropo; formas gxin nun dudek sep membrosxtatoj.
H-SİSTEMİ

Europa Unio estas organizajho de shtatoj en Europo; formas ghin nun dudek sep membroshtatoj.

Kâğıt vb. materyal üzerine Esperanto yazarken elbette her zaman unikod harfler (ĉ, ĝ, ĥ, ĵ, ŝ, ŭ) kullanılır.
Elektronik ortamlarda, Esperanto harflerini düzgün kullanmak teknik açıdan mümkün olsa bile, bu harfleri pratik olarak yazmayı sağlayacak bir araç yoksa, çoğu zaman x-sistemi (nadiren de h-sistemi) kullanılır. Küçük bir araştırma yaparsanız, Facebook ve Twitter gibi genel internet sitelerindeki Esperanto yazıların bir kısmının x-sisteminde (cx, gx, hx, jx, sx, ux) yazıldığını siz de görebilirsiniz.
Esperanto harfleri düzgün yazmak isteyenler için birçok pratik yöntem bulunmaktadır.
X-sistemini anında unikoda çeviren birçok küçük ve ücretsiz arkaplan uygulaması bulunmaktadır. Bu programların genel özelliği klavyeden önce 

Diğer konulara geçmeden önce Esperanto'da iki farklı sözcük türünün var olduğuna dikkat etmemiz yararlı olacaktır.
Bunlardan ilki finaĵvorto denen sözcüklerdir. İlk olarak bunlardan söz edelim.

Bu sözcükler dilin düzenli yapıları olup yerine göre isim, sıfat, zarf veya fiil durumuna geçebilirlier. Ancak direkt olarak kök halinde kullanılmazlar. (Kesme işateriyle kullanımlarından daha sonra bahsedeceğiz).
Basit bir finaĵvorto KÖK + BİTİŞ şeklindeki bir sözcüktür. Ancak bitişten önce birden çok kökler, hatta herhangi kelimeler de bulunabilir.
Yalnızca 9 adet normal bitiş vardır: -A, -E, -I, -O, -U, -AS, -IS, -OS, -US.
Bitişler sözcük türünü veya fiil zamanını belirlerler. Normalde -J ve -N bitiş olarak kabul edilmez. Bu ikisini daha sonra inceleyeceğiz.
Kökler ise bitişsiz kullanılmayan sözcük parçalarıdır. Kökler çok farklı anlamları karşılayabilirler. Örneğin; insanlar, hayvanlar, eylemler, nitelikler, soyut kavramlar, nesneler vb..
Bu durumda finaĵvortolara örnek olarak şunlar verilebilir:

Genel bir kural olarak her bir kökün 9 bitişin her birine uyum gösterdiği kabul edilir. Bazı kök+bitiş kombinasyonlarının kullanımı yaygın olmayabilir veya anlam tam olarak tahmin edilemeyebilir. Yine de, bunların kullanılmasında kurala uygunluk açısından bir sorun yoktur. Örneğin,

Birden fazla kökün veya sözcüğün birleşimiyle oluşan finaĵvortolar da vardır. Örneğin,

Son iki örnekte, söyleniş zorluğunu yenmek için ilk birleşenlerin tür belirteci (-o harfi) düşürülmemiştir. Bu kişisel tercihe bağlı bir kullanım olup ara -o'ların söylenmesi veya söylenmemesi dilbilgisi açısından bir farklılık arz etmemektedir.
Daha sonraları inceleyeceğimiz yapım ekleri de aslında normal bir kök statüsündedir ve bazıları hiç yaygın olmasa da, teorik olarak her biri bitişlerle birlikte ayrı bir sözcük olarak kullanılabilir.
Esperanto'da binlerce kök mevcuttur (yaklaşık 15-20 bin kadar). Bunların bir çoğu terimsel anlamlar içerir. Örneğin biyolojik tür adı, element-bileşik adları gibi. Dolayısıyla ilk etapta bilinmesi gereken köklerin sayısı bu denli çok değildir. Bu köklerle bitişler çarpılırsa ve eklerle birleşik kelimeler de hesaba katılırsa (elbette sonsuz ama kullanılabilirlik bakımından) en az birkaç milyon sözcük, anlamları anlaşılacak biçimde üretilebilir. (Şu an çok çeşitli alanlarda sayısız eserin yazılmış veya çevrilmiş olduğu İngilizce'de dahi kullanıma hazır sözcük sayısı 1 milyonun yalnızca biraz üzerindedir). Oluşacak bu yeni sözcüklerin her biri birer bitişe sahip olacağı için birer finaĵvorto olacaktır.  Bu bakımdan finaĵvortoların Esperanto'daki sözcüklerin çok çok büyük bir çoğunluğunu oluşturduğu söylenebilir.

Finaĵvorto olmayan sözcüklere vorteto (kelimecik) denir.
Vortetolar sözcük dağarcığında sınırlı bir yer tutarlar. Toplamda 200'den az vorteto vardır ve finaĵvortoların aksine yeni vorteto üretmek kolay kolay mümkün değildir.
Sayıları çok az olmasına karşın çok temel anlamları veya dilbilgisel amaçları karşıladıklarından vortetolar en az finaĵvortolar kadar sık karşımıza çıkarlar.
Bu sözcükleri finaĵvortolardan ayıran özellik, bunların bitişsiz olarak yani kök halinde kullanılmalarıdır.
Aşağıda Esperanto'da mevcut olan bütün resmi vortetoların listesi verilmiştir:

Ayrıca Esperanto harf adları da böyledir: a, bo, co, ĉo, ...
Bunlar dışında örneğin Ek! (Başla!, Tamam!), Hej! (hey!) gibi "yarı-resmi" vortetolardan da bahsedilebilir.
Çok nadir olarak yeni vortetolar (yani bitişsiz isimler) üretilebildiğini belirtmiştik. Bunların sayısı çok azdır. Örnek olarak malpli ve malplej verilebilir.
Vortetolar sonlarına bitiş aldıklarında, finaĵvortoya dönüşürler. (Örn. kial → kialo (sebep), ni → nia (bizim))
Vortetoların bazıları sesli harflerle biter. Bunların normal bitişlerle karıştırılmaması gerekir. Örneğin b harfinin adı olan "bo"'daki o, isim olmayı belirtmez, kendiliğinden vardır. Dolayısıyla, bu sözcüğü kök olarak kabul ettiğimizde bon, bumi, beca gibi değil, orijinal formu bozmadan bo-on, bo-umi, bo-eca şeklinde çekimlemek gerekir.
Vortetolardan 45'i bir tabloya göre kurallı olarak üretilir. (Kio, io, nenio, ĉio, tio, tiu, tia, tie, tial, tiel, tiam, ties, tiom ... vb.) Bunlara tabelvorto denir. Bunlar sonraki konularda ayrıntılı olarak ele alınacaktır.

Bu sayfa altında Paul Denisowski'nin CC Attribution 3.0 lisansı altındaki ESPDIC (26 Şubat 2012) adlı Esperanto-İngilizce sözlüğünün Türkçe'ye uyarlanma çalışması yapılmaktadır.
Türkçeleştirilen madde başları "Tamamlanmış Çalışma" başlığı altında verilirken, geri kalan sözcükler "Tamamlanmamış Kısım" başlığı altında yarıdımcı olması açısında orijinal İngilizce çevirileriyle birlikte tutulmaktadır. Kesinlikle sözcüklerin anlamını İngilizceden Türkçeye çevirmeye kalkışmayınız! ESPDIC basit yapıda kısa açıklamalı bir sözlük olduğundan, böyle bir tutumun hatalı anlam karşılıklarına yol açması kaçınılmazdır. Bunun yerine, anlamında şüpheye düştüğünüz sözcükler için bilinen Esperanto-Esperanto sözlüklere veya diğer güvenilir kaynaklara başvurabilirsiniz.

-a : (sıfat bitişi) 
-aĉ- : (nitelik düşüklüğü belirtir) 
-ad- : (bir eylemin sürekliliğini veya devamlı tekrarını belirtir) 
-ajn- : (ifadeye bir genelleme anlamı katar), herhangi bir, her ne 
-aĵ- : (belirli bir niteliğe sahip veya belirli bir maddeden yapılmış bir şeyi belirtir) 
-an- : (üyelik ve bir gruba dahiliyet belirtir) 
-ant- : (güncel zaman etken ortacı), -(y)an 
-ar- : (topluluk adı oluşturur) 
-as :  (güncel (şimdiki-geniş) zaman eki), -(i)yor, -r, -dır
-ata : (güncel zaman edilgen ortacı), -ılan, -nan, -ılmakta olan 
-ĉj- : (erkek adları için samimi küçültme belirten kısaltma eki) 
-e : (zarf bitişi) 
-ebl- : (olanak-olasılık belirtir), -ılabilir, -nabilir 
-ec- : (soyut nitelik belirtir), -lık 
-eca : -(ı)msı, -(ı)mtırak, gibi 
-eg- : (boyut, derece veya etki olarak büyüklük belirtir) 
-ej- : (bir eylem veya nesnenin yerini belirtir) 
ek- : (başlama veya anilik belirtir) 
-em- : (eğilimlilik belirtir) 
-end- : (zorunluluk belirtir), -ılması gereken, -nması gereken 
-er- : (bütünün bir parçasını belirtir) 
-estr- : (başkan-yönetici belirtir) 
-et- : (boyut, derece veya etki olarak azlık-küçüklük belirtir) 
-foje : kez, kere 
-i : (fiil bitişi) 
-iĉ- : (erkek cinsiyeti belirtir (genel kabul görmemiş ek)) 
-id- : (evlatlık-soy ilişkisi belirtir) 
-il- : (alet-gereç belirtir) 
-in- : (bir ismi dişileştirir) 
-ind- : (bir eyleme değer olmayı belirtir), -ılası, -nası, -maya değer 
-ing- : (bir nesneyi (kısmen veya tamamen) içeren kılıf adı ) 
-inta : (geçmiş zaman etken ortacı), -mış, -mış olan 
-is : (geçmiş zaman eki) 
-ism- : (felsefi veya siyasi akım adı üretir) 
-ist- : (uğraş, meslek veya felsefi-siyasi eğilim belirtir) 
-ita : (geçmiş zaman edilgen ortacı), -ılmış, -ılmış olan

Sayfa boyutunu arttırmamak adına sizi bu dış bağlantıya yönlendiriyoruz.

Aşağıda Esperanto dilinin yalnızca bazı nitelikleri tanıtılmaktadır. Eğer ek olarak Esperanto hakkında ansiklopedik bilgi de almak istiyorsanız, yeterince kapsamlı olan ilgili Vikipedi maddesini gözden geçirebilirsiniz.

Yeni bir dil öğrenmek hiçbir zaman kolay değildir. Karşılaşabileceğiniz her şeyin ve her durumun nasıl açıklanacağını sıfırdan öğrenmeniz gerekecek. Bu, Esperanto için de böyledir. Esperanto'nun diğer dillerden farkı, öğrenmeyi normalinden daha da zor bir hâle getirecek gereksiz öğelere mümkün olduğunca az yer vermesidir. Bu bakımdan, Esperanto öğrenmek diğer dilleri öğrenmekten çok daha kolaydır. Ancak buradan, Esperanto öğrenmenin çok kolay bir iş olduğu sonucunu çıkarmayın, aksi takdirde aradığınızı bulamayabilirsiniz. Kolaylaştırılmış olsa bile, başlı başına bir dil öğrenmekte olduğunuzu unutmayın.
Ne kadar kolay sorusu da sıkça sorulanlardan biridir. Yapılan araştırmalar ve ders içerik düzenlemelerinden çıkan sonuca göre Esperanto'nun, İngilizceden ortalama 6 kat daha hızlı öğrenildiği sonucuna ulaşılmıştır. Pratik bir hesap yöntemi olarak kaç yıldır İngilizce öğrenmekteyseniz, ona benzer çalışma temposuyla bu sürenin 6'da 1'i kadarı bir zamanda Esperanto'nuzu bugünkü İngilizce seviyenize çıkarabilirsiniz. Daha fazlasını beklemeniz doğru olmaz.

Dilbilgisi açısından hiçbir Avrupa dilinde bulunmayan bazı özellikler içermesine karşın, Esperanto kelime köklerinin neredeyse tamamı Avrupa kaynaklıdır.
Bazen Esperanto'nun Avrupa dillerini konuşanlara haksız bir avantaj sağladığı düşünülebilmektedir. Bu bir bakıma doğru sayılabilir, ancak burada iki önemli noktayı gözden kaçırmamak gerekir. Asya hariç bütün kıtalarda, insanların büyük bölümü en az bir Avrupa dili konuşmaktadır. Çince ve Arapça'yı bir kenara bırakırsak, Asya'da konuşulan dillerin büyük bir çoğunluğu Avrupa dillerinden çok sayıda sözcük almıştır ve birçok insan Avrupa dillerini öğrenmekte olduğu için Avrupa söz dağarcığına bir şekilde alışkındır. Neredeyse hiçbir Avrupalı öğe içermeyen Çince'ye rağmen Esperanto'nun en canlı olduğu ülkelerden birinin Çin olması da bu konuda büyütülecek bir sorun olmadığını desteklemektedir.
* Burada kullanılan Avrupa dili kavramı, Hint-Avrupa dil ailesindeki Romen, Cermen ve Slav dillerini kapsamaktadır.

Bir dili öğrenirken ortaya ilk çıkan sorunlardan biri okuma ve yazmadır. Esperanto'da böyle bir problem yoktur, her harf belirli ve değişmeyen bir tek ses değerine sahiptir. Bu özellik Esperanto'yu yazılı kaynaklardan öğrenmeyi kolaylaştırır.

Esperanto dilbilgisinde düzenlilik esastır. Konuşurken farkına varamayabilsek de Türkçe dahil birçok dilde düzensizlik barındıran fiil çekimleri, çoğullaştırma ve diğer dilbilgisel işlevler, Esperanto'da tamamen düzenli, yani kurallıdır.

Çoğu dillerdeki durumun aksine Esperanto'da cümle yapısında üç temel öğe sayılan "Özne-Yüklem-Nesne" birbirleri ile yer değiştirebilirler. Benzer özelliğin Türkçe'de de bulunduğunu biliyoruz. Her ne kadar Esperanto'da Avrupa dillerini konuşanların etkisiyle yaygın olarak kullanılan cümle dizimi İngilizce'deki gibi Ö-Y-N şeklinde ise de, diğer sıralamalar da yeri geldiğinde çokça kullanılmaktadır.
Benzer bir durum sıfatlar ve zarflar için de geçerlidir. Sıfatı ismin isterseniz önüne isterseniz de arkasına yerleştirebilirsiniz. Zarfları da çoğu zaman, cümlede uygun gördüğünüz herhangi bir yere koyabilirsiniz.
Esperanto'da, kurulabilecek cümleler ve ifadeler için de herhangi bir sınırlama yoktur. Dilbilgisi ve mantık kurallarına uygun olmak kaydıyla herkes istediğini istediği tarzda söyleyebilir. Normal dillerde bu böyle değildir. Örneğin "Nasıl adlandırılıyorsunuz?", "Size ne diye hitap ederler?", "Hangi adı almış durumdasınız?" gibi cümleler Türkçe dilbilgisine ve mantığına uygun olmasına karşın Türkçe öğrenen birinin bunları kullanırak ad sorması bizce garip karşılanır, çünkü doğal dillerde belirli düşünceleri belirtmek için zamanla, aynen kelimeler gibi, değişmez cümle kalıpları ortaya çıkmaktadır. Elbette, uzun bir geçmişi olan Esperanto'da da alışılmışlıklar oluşmuştur, ama bunlar istediğimiz anlamı başka yollardan ifade etmemize, hatta kendimize özgü bazı ifade yöntemleri geliştirip bunları kullanmamıza ve yaymamıza hiçbir şekilde engel değildir.

Esperanto, çok sayıdaki yapım ekleri ve üstün birleşik kelime üretme becerileriyle oldukça üretken bir dil olmasının yanında, bu yolla var olan kök sözcüklerden oluşturulabilecek sözcük kapasitesiyle de son derece zengin bir dildir.
Esperanto, yeni sözcük üretebilme becerisi sayesinde diğer dillere oranla daha az sözcük öğrenilmesini gerektirir. Böylece çoğu zaman sözcük ezberlemekle uğraşmak zorunda kalmazsınız.
Yine de çok iyimser olmayalım. Esperanto bugüne kadar hemen hemen her alanda kullanılmıştır ve bunun gereği olarak kök sözcük dağarcığı da ilk güne göre bir hayli genişlemiştir. Yine de kök sözcük sayısı her tür terminoloji dahil olmak üzere 20.000'i geçmemektedir. Ancak her durumda akıcı konuşabilmek için 2.000-5.000 sözcük öğrenmek yeterli olacaktır. Geri kalan sözcüklerin bir çoğu günlük hayatta kullanılmayan, bilim dallarına özgü sözcükler veya arkaizmler, yani günümüzde artık kullanılmayan eskimiş kelimelerdir.

Bazıları dil öğrenmeye meraklıdır. Belki siz de bunlardan birisiniz ve hangi dili öğrensem diye düşünüyorsunuz.
Esperanto, öğrenmek için en uygun dillerden biridir. Çünkü diğer dillerden daha kolay bir şekilde öğrenilebilmesi için üretildi.
Başka bir dil öğrenmek isteseniz bile Esperanto gibi biraz kolay ve oldukça kurallı bir dili öğrenmek fazla zaman harcamanızı gerektirmez. Öğrenmeye başladığınız diğer dili günde iki buçuk saat çalışırken, Esperanto'ya da günde yarım saat ayırabilirseniz, bir ayda diğer dilden çok daha fazla Esperanto öğreneceğinizi kendiniz gözlemleyebilirsiniz.

Yabancı biriyle tanıştınız ancak hiçbir ortak dil bilmediğiniz için birbirinizi anlayamıyorsunuz. İkiniz de bir hafta boyunca yoğunlaşarak kendi dilinizdeki kaynaklardan Esperanto öğrenmeyi deneyin. Bir hafta sonunda yeterli iletişim kurabiliyor olduğunuzu göreceksiniz. Başka bir dille benzer bir sonucu elde etmeniz neredeyse olanaksızdır.

Bazılarının eğlence anlayışı daha sıradışıdır ve Esperanto öğrenmeyi de kapsar. Bu kişilerden biri de siz olabilirsiniz. Böyle olmasanız bile, öğrendikten sonra Esperanto'yu kullanmak herkes için eğlencelidir.
Değişik şeylerle ilgilenmeyi, çoğunluktan farklı tercihlere sahip olmayı seviyor olabilirsiniz.
Dünyada yaşayan farklı milletlerin anlaşabilirliğini kanıtlayan bir projeyi desteklemek isteyebilirsiniz.
Esperanto özünde yalnızca bir dildir. Esperanto'yu herhangi bir ideolojiyle bağdaştırmak doğru olmaz. Zaten böyle bir durum da sözkonusu değildir, Esperanto hiçbir ideolojiyi diğerlerinden üstün görerek desteklemez. Bununla birlikte Esperanto'yu destekleyen veya doğası gereği Esperanto gibi daha tarafsız bir dilin kullanılmasını benimsemesi gereken bazı ideolojik akımlar bulunduğu da bir gerçektir.

Belki Esperanto'yu daha yeni duymuş olabilirsiniz. İnanılmaz gelebilir ama dünyada çoğu kişinin zannettiğinden gerçekten çok daha fazla Esperanto konuşanı vardır.
Aslında Esperanto konuşabilen kişi sayısını ne yazık ki tam olarak bilmemekteyiz. Bunun temel nedeni birçok ülkede yabancı diller hakkında kapsamlı istatistik tutulmaması. Yine de, kesin olmamakla birlikte bu konuda şunları söyleyebiliriz. Farklı dilleri bilen anne ve babanın evde ortak dil olarak Esperanto'yu kullanması sonucunda ortaya çıkan ve böylece anadili Esperanto olan 1000 kadar insan vardır. Esperanto'yu sonradan öğrenip akıcı konuşabilen on binlerce insan vardır ve bu tahminler (çok inandırıcı gözükmemekle birlikte) 2 milyona kadar ulaşmaktadır. Tam yeterli olmayarak da olsa bir miktar Esperanto konuşabilenlerin sayısı ise birkaç milyon olarak tahmin edilmektedir.
Sonuç olarak Esperanto ile potansiyel olarak milyonlarca kişiyle iletişime geçebilirsiniz. Az sayıdaki anadili Esperanto olan insanı ihmal edersek Esperanto herkesin sonradan öğrendiği bir dildir. Dolayısıyla Esperanto konuşurken, anadilini konuştuğunuz kişiler karşısında düştüğünüz güvensizlik durumuna düşmezsiniz. Ayrıca iletişime geçebileceğiniz kitle; millet ve ülkelerine göre yeryüzüne daha homojen dağılmış olduğundan dilin kullanımıyla ilgili herhangi bir kültürel sorunla karşılaşmazsınız.

Yurtdışı gezilerine merakınız varsa Esperanto bu konuda size yardımcı olacaktır.
Esperanto bilen ailelerden oluşan ve yeterince geniş bir katılımcı listesine sahip olan Pasporta Servo adında bir seyahat ağı bulunmaktadır. Dileyenler bu ağa katılarak, yurtdışından gelecek gezginlerin evlerinde misafir olarak konaklamalarına izin vermek suretiyle, yaptıkları yurtdışı gezilerde ağa üye olan kişilerde ücretsiz konaklama hakkına sahip olmaktadır.
Bunun dışında yılın hemen her gününde, toplu bir uluslararası Esperanto buluşması düzenlenmekte olan bir yerler mutlaka vardır. Bu tür buluşmalardan bazıları gezi, bazıları eğitim, bazıları eğlence odaklı olabilmekte; yalnızca gençlere veya yalnızca çocuklara ve ailelere yönelik olanları bulunmakta; 20-25 kişilik küçük buluşmalar olabildiği gibi, binlerce kişinin bir araya geldiği büyük kongreler de yapılmaktadır. Bu konuda merakı olanlar, sayfa bağlantılarıyla birlikte Esperanto buluşmalarının çoğunun listelendiği Uluslararası Esperanto Etkinlik Takvimi'ni inceleyebilirler.
Son yıllarda Türkiye'de de birden çok uluslararası Esperanto buluşması başarıyla gerçekleşmiştir ve bu tür buluşmaların artarak devam etmesi beklenmektedir.

Elliye yakın dili konuşabilen kişiler var olduğu gibi, bütün uğraşlarına rağmen bir türlü dil öğrenmeyi başaramayanlar da bulunmaktadır. Bunlardan biriyseniz, işe kolay yerden başlamayı deneyebilirsiniz. Esperanto'yu öğrenebildiğinizi görmek, diğer dilleri öğrenmedeki motivasyonunuzu yükseltecektir.

Esperanto, çocukların öğrenmesi için diğerlerinden çok daha uygun bir dildir. Yabancı dil öğrenme deneyimine Esperanto gibi kurallı bir dille başlamak, daha sonraki okul sürecinde öğrenilmesi gereken İngilizce gibi çok daha zor dillerle başa çıkmaya mutlaka 

Milyonlarca kişi tarafından konuşulabilen ve son yıllarda özellikle internet dünyasında çok hızlı bir yükseliş gösteren uluslararası kolaylaştırılmış yapay dil Esperanto hakkında ne yazık ki kolay kolay Türkçe bir yazılı kaynak bulunamamaktadır. Bu proje Esperanto öğrenmek isteyenler için temel bir Türkçe kaynak olarak bu eksikliği biraz olsun gidermeyi amaçlar.
Şu anda kitabın "Giriş" bölümünü okumaktasınız.
Giriş bölümünden sonraki Esperanto Nedir? adlı bölümde Esperanto dili, tarihi, kültürü ve kullanımı hakkında çeşitli bilgiler verilecektir. İstenildiği takdirde bu bölüm geçilebilir.
Daha sonra, dilin ilk tanıtım belgesi sayılan Fundamento de Esperanto'da 16 başlık altında gruplandırılmış olan dilbilgisi esaslarının açıklanacağı kısa bir Dilbilgisine Genel Bakış bölümü vardır. Bu sayfanın "0. Kural" olarak adlandırılmış ve okunuş kurallarını gösteren ilk başlığının incelenmesi çok iyi olur. Diğer 16 kuralın okunması zorunlu olmamakla birlikte dilin işleyişi hakkında birçok gerekli bilgiyi içermesi ve merak giderici yönü sebebiyle bu kurallara göz atılması yararlı olabilir.
Kitabın devamının en az 75 dersten oluşan bir kurs içermesi tasarlanmaktadır. Kelime tabanlı olacak bu derslerde öncelikli olarak dilbilgisi, yerine göre dilin pratik kullanımı, belki öğrenilenlerin pekiştirilebileceği metinler ve gerekli görüldüğünde çeşitli diğer başlıklar bulunabilecektir. Esperanto-Türkçe karşılaştırmalı cümleler tablo içine alınmıştır. Ayrıca her yeni kelimenin anlamı kutular içinde gösterilmektedir.
Dili kullanmak için son derece yeterli olacak temel derslerin sonrasında, pratik değerleri bulunmayan derin dilbilgisi konularını aydınlatmaya yönelik bir "İleri Seviyede Dersler" bölümü gelmektedir. Bu dersler PMEG adlı dilbilgisi referansının özet haline getirilmiş çevirilerinden ibaret olacaktır.
İmkânsıza yakın bir ideal gibi dursa da, yeterli çalışmanın yapılabilmesi durumunda kitabın sonunda kapsamlı bir Esperanto-Türkçe sözlük sunulması plânlanmaktadır.
Bu kitap yardımıyla okuyucuya nihaî olarak kazandırılması amaçlananlar şunlardır:

Sözlük yardımıyla Esperanto olarak yazılmış metinleri anlayabilmek.
Mümkün olan en az hata ile internat üzerinden Esperanto yazışmalar yapabilmek.
Esperanto'yu Esperanto dilinde yazılmış kaynaklar yardımıyla geliştirmeye devam edebilecek derecede öğrenmek. PMEG dilbilgisi kitabını, PIV gibi Esperanto-Esperanto sözlükleri veya Vojaĝo en Esperanto-Lando gibi Esperanto öğrenme kitaplarını kullanarak dil seviyesini Türkçe kaynaklardan bağımsız bir şekilde geliştirebilmek.
Dili bir şekilde kullanmaya çalışarak pratik olarak Esperanto konuşabilmek, Esperanto buluşmalarına katılabilmek.
Esperanto dahil hiçbir dilin sıfırdan başlanılarak öğrenilmesi asla kolay değildir. Dolayısıyla her ne kadar Esperanto uluslararasılık iddia eden diğer dillerden birkaç kat daha kolay bir şekilde öğrenilebilirse de Esperanto'yu mükemmeleştirmek kolay değildir. Ancak yukarıdaki amaçlar gerçekleştirildikten sonra dil her fırsatta kullanılmaya çalışılırsa önceden beklenilmediği kadar iyi sonuçlar almak mümkündür. Esperanto öğrenmede cesaret gerektiren üç nokta dili öğrenmeye karar vermek, dili öğrenmeye başlamak ve küçük zorluklarla karşılaşıldığında vazgeçmemektir. Bunlar başarıldığnda kısa süre içerisinde dili kullanabildiğinizin farkına varmaya başlayacaksınız.
Şimdiden iyi çalışmalar.

İlerleyen derslerde, daha önce öğrenmiş olduğunuz bir sözcüğe rastlar, ancak bu sözcüğün ne anlama geldiğini hatırlayamazsanız bu dizini kullanabilirsiniz. İlgili sözcüğe tıklamak, sizi o sözcüğün geçtiği ders bölümüne götürecektir. Ayrıca, dizinden dersleri çıktı üzerinden takip edenlerin de  yararlanabilmeleri için her kelimenin yanına parantez içinde (sayıyla) kaçıncı derste öğretildiği yazılmıştır.
Listede genelde kelimenin yalnızca bir türevi bulunmaktadır. Örneğin bona listededir ancak bono, malbona ve bonege listede değildir. Arama yaparken bunu da dikkate alınız.

Akvo (3)
Alta (2)
Ami (3)
Amiko (3)

Bela (2)
Bona (2)

Esperanto (1)
Estas (1)

Granda (2)

Ĝi (3)
Ĝia (3)

Hieraŭ (3)
Hodiaŭ (3)
Homo (1)

Infano (1)
Instruisto (1)
Istanbulo (1)

Juna (2)

Kafo (3)

Lando (1)
Legi (3)
Lerni (3)
Li (2)
Lia (3)
Libro (1)
Lingvo (1)
Longa (2)

Mal- (2)
Mateno (2)
Mi (1)
Mia (3)
Morgaŭ (3)

Ne (2)
Ne- (2)
Nokto (2)
Nova (2)

Paroli (3)

Saluto (1)
Studento (1)

Ŝati (3)
Ŝi (2)
Ŝia (3)

Tago (2)
Teo (3)
Trinki (3)
Turka (3)
Turkio (1)
Turko (1)
Turkujo (1)

Urbo (1)

Vespero (2)
Vidi (3)
Virino (1)
Viro (1)

Bu bölümde -A ile biten finaĵvortoları inceleyeceğiz. -A ile biten diğer sözcüklerle ve diğer sıfatlarla karışmamaları için bunlara standart sıfat diyoruz.
Standart sıfatlar nitelik, özellik, aidiyet, ilişki vb. belirtir ve isimleri betimlemek için kullanılır.
-A bitişi genelde bir şekilde kökle ilgili bir niteliğe sahip olma durumunu bildirir.

Bu tür sıfatların anlamı hem kökün anlamına hem de bağlama (cümlenin gelişine) bağlıdır.
Zamirler ve sayılar da -A ile standart sıfat olurlar. Ancak -A bunlara farklı birer özel anlam (sahiplik, sıralama) katar.
-A'nın arkasından, nitelediği isimlerin sayısına ve durumuna bağlı olarak -J veya -N gelebilir.
longa longaj longan longajn (uzun) 
ruĝa ruĝaj ruĝan ruĝajn (kırmızı) 
mia maiaj mian miajn (benim) 
sesa sesaj sesan sesajn (altıncı)
Daha sonra bu konuları detaylı olarak ele alacağız.
Bir sıfat genelde, nitelediği ismin önüne gelir, ancak isimden sonra da getirilebilir, hatta bir sıfat ismin önündeyken diğeri arkasında olabilir.

Sıfatlar ismi bir yüklem yardımıyla da niteleyebilir.

Son örnekteki yapı, öncekilerden biraz farklı olup, daha sonra incelenecektir.
Standart sıfatlar aynı zamanda standart olmayan (-O bitişi bulunmayan) isimleri de nitelerler.

Emir çekiminde ikinci şahıs bazen söylenmediği için, son örnekte singarda'nın aslında cümlede olmayan vi'yi nitelediğini düşünebiliriz.
Standart sıfatlar kullanılırken bazen nitelenen isim söylenmeden geçilir. Bu durum cümlenin gelişinin, hangi ismin nitelenmek istendiğini açıkça belli ettiği durumlarda gerçekleşir ve bu durumdaki sıfat bir isim gibi davranır.
Aşağıdaki örnek cümlelerde parantez içindeki sözcükler cümlede aslında olmayan, ama varlığı bağlamdan anlaşılan isimlerdir.

Zaman belirtirken nitelenen horo (saat), tago (gün) ve jaro (yıl) genelde söylenmeden geçilir. Bu durumda bunlara ait sıralama sayı sıfatları isim gibi davranır.

Günümüzde yıl söylerken çoğu zaman, sayıya sıralama anlamı katan -A da eklenmemektedir.

Nitelenen ismin söylenmemesine iyelik zamirlerinde de sıkça rastlanır.

Ayrıca alia (diğer, başka) sıfatı da çoğu kez isim gibi kullanılır.

Ayrıca multaj (çok, çoğu), malmultaj (az), pluraj (birçok) kaj kelkaj (bazı) sıfatlarının da isim gibi kullanılması yaygındır.

Bu konuda, standart zarf olarak adlandırdığımız -E ile biten finaĵvortoları inceleyeceğiz.
Bu sözcükler genelde şekil, tarz, yer, zaman, miktar vb. kavramları belirtirler.

Standart sıfatlarda olduğu gibi, standart zarfların anlamı da hem kökün anlamına hem de bağlama göre değişir.
Yer bildiren standart zarflar -N alabilir.
urbe (şehirde) → urben (şehre)
hejme (evde) → hejmen (eve)
Ancak -E ile yapılmış zarftan sonra asla çoğul eki -J gelmez.

Zamirler, cümlenin tamamı için de tamamlayıcı olabilirler

Zarflar sıfatların veya başka zarfların niteleyicisi de olabilirler.

Bir zarf bir fiili veya bir yan cümleyi, yüklem vasıtasıyla da nitelendirebilir.

-A ve -E bitişli finaĵvortolar birbirine oldukça benzerler. Hangisinin kullanılacağına, neyin nitelendirildiğine bakılarak karar verilir. Normalde, nitelenen bir isim ise -A, diğer durumlarda -E bitişi kullanmak uygundur.

Zarflar bazen belirli bir söz grubunu detaylandırabilirler. Bu durumda zarflar aslında, normalde niteleyemedikleri sözcük türü olan isimleri de nitelemiş olurlar.
Aşağıda koyu yazılmış zarflar, bir şekilde altı çizili isim gruplarını nitelemektedir.

Bazen sole (tek olarak) sözcüğünün anlamı açık olmayabilir. Örneğin; "Ili iris sole tien.", hem "Onlar sadece oraya gittiler." hem de "Onlar oraya yalnız (olarak) gittiler." anlamına gelebilir. Böyle durumlarda, iki anlamı ayırmak için nur (yalnızca, sadece) ve sole'nin sıfat hali sola (yalnız, tek) kullanılabilir.

"Sola" sıfat olduğundan ancak bir ismi niteleyebilir ve ikinci cümlede tek isim (standart isim değil ancak zamir (dolayısıyla da bir tür isim)) "ili" olduğundan, tek olma anlamının "ili"'yi nitelediği açıktır. "Ili" (onlar) anlam gereği çoğul olduğundan "sola"'nın çoğul şekli olan "solaj" kullanılmıştır. İleride bu konular daha ayrıntılı olarak ele alınacaktır.
Ankaŭ (de, dahi), eĉ (bile), almenaŭ (en azından), ja (vurgulayıcı) ve nur (yalnızca) gibi bazı standart olmayan zarflar da, nüans verici olarak sıkça kullanılmaktadır.

Bu konuda -o ile biten finaĵvortoların temel özelliklerini inceleyeceğiz. Bu tür sözcüklere Esperanto'da O-vorto denir ancak kavramın -o ile bitip isim olmayan sözcükleri de kapsayacak şekilde yanlış anlaşılmaması için burada bunları standart isimler olarak adlandıracağız.
Sonuç olarak, standart isimler isim olan fnaĵvortolardır. Dolayısıyla sonlarında bitiş olarak -o bulunur ve bunları genelde buradan tanırız.
Bir standart isim çok farklı türdeki kavramları açıklamak için kullanılabilir:

Standart isimler çoğul olarak kullanıldıklarında -J, nesne durumunda olduklarında -N eki alırlar. Aynı zamanda her iki durum da geçerli olduğunda bu eklerin her ikisini de aynı anda alabilirler. Ancak -J daima -N'den önce gelir.

Aynı zamanda standart isimlerde bulunan -o bitişi, bazı amaçlar için kesme işareti (') ile değiştirilebilir. Ancak bu yalnızca -o bitişinden sonra hiçbir şey yoksa yapılır. Yani -o'dan sonra sonuna -j veya -n almış bir ismin bitişi kesme işaretiyle değiştirilemez.

Yukarıda kısaca bahsedilen konular ileride daha ayrıntılı bir biçimde incelenecektir.
Şimdi bu isimlerle ilgili en tartışmalı konulardan biri olarak bunların cinsiyet belirtme durumunu ele alalım.

Öncelikle belirtmek gerekir ki Esperanto'da gramatik cinsiyet yoktur. (Aynı şey Türkçe'de de, İngilizce'de de var olmadığından bu kavramı bilmeyenler bulunabilir. Gramatik cinsiyet kısaca, ismin erkek veya dişi olmasına göre, aldığı eklerin veya onu niteleyen sıfatların şekil değiştirmesi olarak tanımlanabilir. Örneğin Arapça ve İspanyolca bu özelliğe sahip olan dillerdendir).
Yine de Esperanto'da birçok standart isim, kendi içerisinde cinsiyet anlamı içerir. Bu cinsiyet anlamını sondaki -o bitişinin verdiğini düşünmek yanlıştır.
Esperanto öğrenilirken nasıl ki sözcüklerin anlamının öğrenilmesi gerekiyorsa, insan ve hayvanları tanımlayan standart isimlerin de cinsiyet anlamı içerip içermedikleri öğrenilmek durumundadır. Çünkü bu konuda genel bir kural yoktur.
Esperanto'da isimler, içerdikleri varsayılan cinsiyet anlamına göre üç grupta toplanabilir: erkek isimler, dişi isimler, cinssiz isimler.

Bunlar cinsiyet anlamı içermezler. Cinsiyet anlamı vermeyen isim türlerini ve bunların bazı örneklerini şu şekilde listeleyebiliriz:
1. Çok genel hayvan ve insan isimleri

2. Bazı ekler

3. Ortaç ekleri

4. Bütün hayvanlar

5. Ailesel olmayan çeşitli insan ilişkileri

6. Meslekler ve çeşitli insan rolleri

7. Ordu mensupları

8. Bazı din görevlileri

9. Millet, kavim, ırk sahipleri

10. Doğaüstü varlıklar

Bu isimler söylendiğinde bahsedilen bireyin erkek olduğu anlamı kendliğinden çıkar. İşte gruplandırılmış bazı örnekler:
1. Erkek olduğu açık çeşitli isimler

2. Bir ek

3. Aile ile ilgili isimler

Not : Ancak, parenco (akraba) sözcüğü genelde cinssiz kabul edilir.
4. Asiller ve benzer üst kesim

Not : Ancak nobelo (asil) sözcüğünün kendisi genelde cinssiz sayılır.
5. Bazı din adamları

6. Hayvanlarla ilgili bazı özel kullanımlar

Bunlar anlam içeriğinde dişi olma durumu bulunan isimlerdir.
1. Dişi olduğu açık olanlar

2. Bazı ekler

3. Çeşitli dişi isimler

Sonuç olarak, anlam bakımından isimlerin büyük bölümünün cinssiz olduğu söylenebilir. Erkek isimler çok daha azdır, dişi isimler bunlardan da az miktardadır.
Burada bahsedilen cinsiyet sınıflandırmalarına her zaman uyulması beklenemez. İsimlerin taşıdıkları cinsiyet ayrıntısı üzerinde herkesin kabul ettiği kesin bir anlaşma yoktur.
-IN eki kullanılarak, bir sözcüğe dişilik anlamı katılabilir.

İsim erkekse, dişisinden bahsetmek için -in kullanılır. İsim cinssizse de dişi olduğu özellikle vurgulanmak istendiğinde -in kullanılabilir. İsim dişiyse tabii ki -in kullanılmaz.
Mutlaka erkek olduğu vurugusu yapılmak isteniyorsa cinssiz bir isme vira (erkek) sıfatı veya bunun kısaltılmışı olan VIR- öneki getirilebilir. (VIR- aslında geleneksel anlamda ek olarak sayılmaz.)

İsim erkekse elbette vir- eklenmez. İsim dişiyse teorikte vir- eklenebilir ancak böyle bir durumla pek karşılaşılmaz.
GE- önekiyle "her iki cinsiyet" anlamı verilebilir.

Eğer isim cinssizse, ge- aslında gereksizdir. Ancak, her iki cinsten de en az birer tane bulunduğu vurgulanmak istenirse kullanılabilir. Ge- genelde erkek isimlerde veya nadiren cinssiz isimlerde kullanılır, dişi isimlerle kullanılmaz.
-CJ- kısaltma ekiyle yapılan isimler erkek, -NJ- ile yapılanlar dişi sayılır.
Ne yazık ki bazı isimlerin cinsiyet anlamı hakkında farklı görüşler vardır. Özellikle cinssiz isimlerden 1., 2., 3., 4., 9. ve hatta 5. gruptakilerinin bazılarını erkek isim kabul edenler bulunmaktadır. Bu yüzden, gerekli olmadığı hâlde -in eki bunlarla çokça kullanılır.
Eski zamanlarda, bugün cinssiz diye niteledirdiklerimizin bir çoğunun erkek olarak kullanıldığını belirtmek gerekir. Ancak dil, zamanla gereksinimleri karşılamak adına cinssizleşme yönünde değişmektedir.
İleride vir-, -in, -ĉj-, -nj- ekleri daha ayrıntılı olarak incelenecektir.

Esperanto kitabına hoşgeldiniz. Öncelikle kitabın işleyişi ile ilgili bilgi almak için giriş bölümüne, Esperanto dili hakkında bilgi almak için Esperanto nedir? sayfasına bakabilirsiniz.

Giriş 
Esperanto nedir? 

Dilbilgisine genel bakış 

1. Ders 
2. Ders 
3. Ders 
4. Ders 
5. Ders 
6. Ders 
7. Ders 
8. Ders 
9. Ders 
...

Sözcük Dizini 
İleri Seviyede Dersler 
Esperanto'da Sözcük Türleri 
Standart İsimler 
Standart Sıfatlar 
Standart Zarflar 
İsim Değerindeki Sözcük Grupları 
Esperanto-Türkçe Sözlük 

Milyonlarca kişi tarafından konuşulabilen ve son yıllarda özellikle internet dünyasında çok hızlı bir yükseliş gösteren uluslararası kolaylaştırılmış yapay dil Esperanto hakkında ne yazık ki kolay kolay Türkçe bir yazılı kaynak bulunamamaktadır. Bu proje Esperanto öğrenmek isteyenler için temel bir Türkçe kaynak olarak bu eksikliği biraz olsun gidermeyi amaçlar.
Şu anda kitabın "Giriş" bölümünü okumaktasınız.
Giriş bölümünden sonraki Esperanto Nedir? adlı bölümde Esperanto dili, tarihi, kültürü ve kullanımı hakkında çeşitli bilgiler verilecektir. İstenildiği takdirde bu bölüm geçilebilir.
Daha sonra, dilin ilk tanıtım belgesi sayılan Fundamento de Esperanto'da 16 başlık altında gruplandırılmış olan dilbilgisi esaslarının açıklanacağı kısa bir Dilbilgisine Genel Bakış bölümü vardır. Bu sayfanın "0. Kural" olarak adlandırılmış ve okunuş kurallarını gösteren ilk başlığının incelenmesi çok iyi olur. Diğer 16 kuralın okunması zorunlu olmamakla birlikte dilin işleyişi hakkında birçok gerekli bilgiyi içermesi ve merak giderici yönü sebebiyle bu kurallara göz atılması yararlı olabilir.
Kitabın devamının en az 75 dersten oluşan bir kurs içermesi tasarlanmaktadır. Kelime tabanlı olacak bu derslerde öncelikli olarak dilbilgisi, yerine göre dilin pratik kullanımı, belki öğrenilenlerin pekiştirilebileceği metinler ve gerekli görüldüğünde çeşitli diğer başlıklar bulunabilecektir. Esperanto-Türkçe karşılaştırmalı cümleler tablo içine alınmıştır. Ayrıca her yeni kelimenin anlamı kutular içinde gösterilmektedir.
Dili kullanmak için son derece yeterli olacak temel derslerin sonrasında, pratik değerleri bulunmayan derin dilbilgisi konularını aydınlatmaya yönelik bir "İleri Seviyede Dersler" bölümü gelmektedir. Bu dersler PMEG adlı dilbilgisi referansının özet haline getirilmiş çevirilerinden ibaret olacaktır.
İmkânsıza yakın bir ideal gibi dursa da, yeterli çalışmanın yapılabilmesi durumunda kitabın sonunda kapsamlı bir Esperanto-Türkçe sözlük sunulması plânlanmaktadır.
Bu kitap yardımıyla okuyucuya nihaî olarak kazandırılması amaçlananlar şunlardır:

Sözlük yardımıyla Esperanto olarak yazılmış metinleri anlayabilmek.
Mümkün olan en az hata ile internat üzerinden Esperanto yazışmalar yapabilmek.
Esperanto'yu Esperanto dilinde yazılmış kaynaklar yardımıyla geliştirmeye devam edebilecek derecede öğrenmek. PMEG dilbilgisi kitabını, PIV gibi Esperanto-Esperanto sözlükleri veya Vojaĝo en Esperanto-Lando gibi Esperanto öğrenme kitaplarını kullanarak dil seviyesini Türkçe kaynaklardan bağımsız bir şekilde geliştirebilmek.
Dili bir şekilde kullanmaya çalışarak pratik olarak Esperanto konuşabilmek, Esperanto buluşmalarına katılabilmek.
Esperanto dahil hiçbir dilin sıfırdan başlanılarak öğrenilmesi asla kolay değildir. Dolayısıyla her ne kadar Esperanto uluslararasılık iddia eden diğer dillerden birkaç kat daha kolay bir şekilde öğrenilebilirse de Esperanto'yu mükemmeleştirmek kolay değildir. Ancak yukarıdaki amaçlar gerçekleştirildikten sonra dil her fırsatta kullanılmaya çalışılırsa önceden beklenilmediği kadar iyi sonuçlar almak mümkündür. Esperanto öğrenmede cesaret gerektiren üç nokta dili öğrenmeye karar vermek, dili öğrenmeye başlamak ve küçük zorluklarla karşılaşıldığında vazgeçmemektir. Bunlar başarıldığnda kısa süre içerisinde dili kullanabildiğinizin farkına varmaya başlayacaksınız.
Şimdiden iyi çalışmalar.

Aşağıda Esperanto dilinin yalnızca bazı nitelikleri tanıtılmaktadır. Eğer ek olarak Esperanto hakkında ansiklopedik bilgi de almak istiyorsanız, yeterince kapsamlı olan ilgili Vikipedi maddesini gözden geçirebilirsiniz.

Yeni bir dil öğrenmek hiçbir zaman kolay değildir. Karşılaşabileceğiniz her şeyin ve her durumun nasıl açıklanacağını sıfırdan öğrenmeniz gerekecek. Bu, Esperanto için de böyledir. Esperanto'nun diğer dillerden farkı, öğrenmeyi normalinden daha da zor bir hâle getirecek gereksiz öğelere mümkün olduğunca az yer vermesidir. Bu bakımdan, Esperanto öğrenmek diğer dilleri öğrenmekten çok daha kolaydır. Ancak buradan, Esperanto öğrenmenin çok kolay bir iş olduğu sonucunu çıkarmayın, aksi takdirde aradığınızı bulamayabilirsiniz. Kolaylaştırılmış olsa bile, başlı başına bir dil öğrenmekte olduğunuzu unutmayın.
Ne kadar kolay sorusu da sıkça sorulanlardan biridir. Yapılan araştırmalar ve ders içerik düzenlemelerinden çıkan sonuca göre Esperanto'nun, İngilizceden ortalama 6 kat daha hızlı öğrenildiği sonucuna ulaşılmıştır. Pratik bir hesap yöntemi olarak kaç yıldır İngilizce öğrenmekteyseniz, ona benzer çalışma temposuyla bu sürenin 6'da 1'i kadarı bir zamanda Esperanto'nuzu bugünkü İngilizce seviyenize çıkarabilirsiniz. Daha fazlasını beklemeniz doğru olmaz.

Dilbilgisi açısından hiçbir Avrupa dilinde bulunmayan bazı özellikler içermesine karşın, Esperanto kelime köklerinin neredeyse tamamı Avrupa kaynaklıdır.
Bazen Esperanto'nun Avrupa dillerini konuşanlara haksız bir avantaj sağladığı düşünülebilmektedir. Bu bir bakıma doğru sayılabilir, ancak burada iki önemli noktayı gözden kaçırmamak gerekir. Asya hariç bütün kıtalarda, insanların büyük bölümü en az bir Avrupa dili konuşmaktadır. Çince ve Arapça'yı bir kenara bırakırsak, Asya'da konuşulan dillerin büyük bir çoğunluğu Avrupa dillerinden çok sayıda sözcük almıştır ve birçok insan Avrupa dillerini öğrenmekte olduğu için Avrupa söz dağarcığına bir şekilde alışkındır. Neredeyse hiçbir Avrupalı öğe içermeyen Çince'ye rağmen Esperanto'nun en canlı olduğu ülkelerden birinin Çin olması da bu konuda büyütülecek bir sorun olmadığını desteklemektedir.
* Burada kullanılan Avrupa dili kavramı, Hint-Avrupa dil ailesindeki Romen, Cermen ve Slav dillerini kapsamaktadır.

Bir dili öğrenirken ortaya ilk çıkan sorunlardan biri okuma ve yazmadır. Esperanto'da böyle bir problem yoktur, her harf belirli ve değişmeyen bir tek ses değerine sahiptir. Bu özellik Esperanto'yu yazılı kaynaklardan öğrenmeyi kolaylaştırır.

Esperanto dilbilgisinde düzenlilik esastır. Konuşurken farkına varamayabilsek de Türkçe dahil birçok dilde düzensizlik barındıran fiil çekimleri, çoğullaştırma ve diğer dilbilgisel işlevler, Esperanto'da tamamen düzenli, yani kurallıdır.

Çoğu dillerdeki durumun aksine Esperanto'da cümle yapısında üç temel öğe sayılan "Özne-Yüklem-Nesne" birbirleri ile yer değiştirebilirler. Benzer özelliğin Türkçe'de de bulunduğunu biliyoruz. Her ne kadar Esperanto'da Avrupa dillerini konuşanların etkisiyle yaygın olarak kullanılan cümle dizimi İngilizce'deki gibi Ö-Y-N şeklinde ise de, diğer sıralamalar da yeri geldiğinde çokça kullanılmaktadır.
Benzer bir durum sıfatlar ve zarflar için de geçerlidir. Sıfatı ismin isterseniz önüne isterseniz de arkasına yerleştirebilirsiniz. Zarfları da çoğu zaman, cümlede uygun gördüğünüz herhangi bir yere koyabilirsiniz.
Esperanto'da, kurulabilecek cümleler ve ifadeler için de herhangi bir sınırlama yoktur. Dilbilgisi ve mantık kurallarına uygun olmak kaydıyla herkes istediğini istediği tarzda söyleyebilir. Normal dillerde bu böyle değildir. Örneğin "Nasıl adlandırılıyorsunuz?", "Size ne diye hitap ederler?", "Hangi adı almış durumdasınız?" gibi cümleler Türkçe dilbilgisine ve mantığına uygun olmasına karşın Türkçe öğrenen birinin bunları kullanırak ad sorması bizce garip karşılanır, çünkü doğal dillerde belirli düşünceleri belirtmek için zamanla, aynen kelimeler gibi, değişmez cümle kalıpları ortaya çıkmaktadır. Elbette, uzun bir geçmişi olan Esperanto'da da alışılmışlıklar oluşmuştur, ama bunlar istediğimiz anlamı başka yollardan ifade etmemize, hatta kendimize özgü bazı ifade yöntemleri geliştirip bunları kullanmamıza ve yaymamıza hiçbir şekilde engel değildir.

Esperanto, çok sayıdaki yapım ekleri ve üstün birleşik kelime üretme becerileriyle oldukça üretken bir dil olmasının yanında, bu yolla var olan kök sözcüklerden oluşturulabilecek sözcük kapasitesiyle de son derece zengin bir dildir.
Esperanto, yeni sözcük üretebilme becerisi sayesinde diğer dillere oranla daha az sözcük öğrenilmesini gerektirir. Böylece çoğu zaman sözcük ezberlemekle uğraşmak zorunda kalmazsınız.
Yine de çok iyimser olmayalım. Esperanto bugüne kadar hemen hemen her alanda kullanılmıştır ve bunun gereği olarak kök sözcük dağarcığı da ilk güne göre bir hayli genişlemiştir. Yine de kök sözcük sayısı her tür terminoloji dahil olmak üzere 20.000'i geçmemektedir. Ancak her durumda akıcı konuşabilmek için 2.000-5.000 sözcük öğrenmek yeterli olacaktır. Geri kalan sözcüklerin bir çoğu günlük hayatta kullanılmayan, bilim dallarına özgü sözcükler veya arkaizmler, yani günümüzde artık kullanılmayan eskimiş kelimelerdir.

Bazıları dil öğrenmeye meraklıdır. Belki siz de bunlardan birisiniz ve hangi dili öğrensem diye düşünüyorsunuz.
Esperanto, öğrenmek için en uygun dillerden biridir. Çünkü diğer dillerden daha kolay bir şekilde öğrenilebilmesi için üretildi.
Başka bir dil öğrenmek isteseniz bile Esperanto gibi biraz kolay ve oldukça kurallı bir dili öğrenmek fazla zaman harcamanızı gerektirmez. Öğrenmeye başladığınız diğer dili günde iki buçuk saat çalışırken, Esperanto'ya da günde yarım saat ayırabilirseniz, bir ayda diğer dilden çok daha fazla Esperanto öğreneceğinizi kendiniz gözlemleyebilirsiniz.

Yabancı biriyle tanıştınız ancak hiçbir ortak dil bilmediğiniz için birbirinizi anlayamıyorsunuz. İkiniz de bir hafta boyunca yoğunlaşarak kendi dilinizdeki kaynaklardan Esperanto öğrenmeyi deneyin. Bir hafta sonunda yeterli iletişim kurabiliyor olduğunuzu göreceksiniz. Başka bir dille benzer bir sonucu elde etmeniz neredeyse olanaksızdır.

Bazılarının eğlence anlayışı daha sıradışıdır ve

Cümlede tek bir sözcükmüş gibi hareket eden, yani bir araya gelip bir cümle öğesi oluşturabilen sözcük topluluklarına, sözcük grubu adı verilir.
Bu konuda 'uzaktan bakıldığında' tek bir isimmiş gibi görünen sözcük gruplarını inceleyeceğiz.

Tanım edatlarını (Esperanto: difinilo) daha sonra ayrıntılı olarak inceleyeceğiz. Şimdilik yalnızca, isim değerindeki bir sözcük grubunun başında bir tanım edatı bulunabileceğini veya bulunmayabileceğini söylemekle yetiniyoruz.

Bu tanım edatlarından 'la' ve 'ties' dışındakiler sözcüğün durumuna uyum gösterir, yani sözcük -J çoğul eki ve(ya) -N belirtme durumu eki alırsa, 'la' ve 'ties' dışındakiler de bu ekleri alırlar. Örneğin;

Sayılar yardımıyla isim değerinde sözcük grubu oluşturulabilir.

Burada kullanılan sayılar sıfat görevindedir, bunların niteledikleri ise isimdir. Böyle bir ikiliyi bir an için bölünmez bir bütün gibi düşünürsek, elimizdeki yeni sözcüğün bir isim olduğunu görürüz. Bu yüzden bu tür sözcük gruplarının isim değerinde olduğu söylenir.

Sıfatlar, niteledikleri isimlerle birlikte isim değerinde bir sözcük grubu oluşturur. Örneğin;

Bunları bir bütün olarak düşünürsek, iki sözcükten oluşmuş bir 'isim' olarak değerlendirebiliriz. Tabii ki sıralama önemli değildir:

Ancak sıfatın, ismin önüne değil arkasına getirilmesi, sıfatın biraz daha vurgulanmasını sağlar. Örneğin yukarıda eterna (sonsuz, ebedî) sıfatı, amo (aşk, sevgi) isminin önüne değil arkasına gelmişse, burada 'sonsuz' olmanın özellikle vurgulanmış olduğunu düşünebiliriz.

Rol gösterici derken, İngilizce'de preposition olarak bilinen konum edatlarının bir benzerinden bahsediyoruz. Rol gösterici bu kavramın Esperanto'daki adıdır (rolmontrilo). Bunları daha sonra inceleyeceğiz. Şimdilik sadece, isim değerindeki sözcük gruplarının bunlar yardımıyla nasıl kurulduğuna bakalım.

Bunların her biri birer 'isim değerinde sözcük grubu'dur.
(Aslına bakılırsa 'isim değerinde sözcük grubu' kalıbı da Türkçe'de bir 'isim değerinde sözcük grubu'dur, çünkü birden çok sözcükten oluşmasına rağmen, bir arada düşününce tek bir kavramın (ki o kavram 'isim değerinde(ki) sözcük grubu') ismi olarak işlev görür.)
Bu alt başlıkta "İsim + Rol gösterici + İsim" kalıbına göre oluşmuş isim değerinde sözcük gruplarını ele almaktayız. Sayılarla ve sıfatlarla oluşturulmuş olanları da bundan önce ele aldık. Ancak bildiğimiz üzere bir isim değerinde sözcük grubu, isim işlevi görür, yani ismin yerini tutar. Öyleyse 'İsim + Rol gösterici + İsim' kalıbında gördüğümüz 'İsim'lerin yerine 'isim değerinde sözcük grupları' da gelebilir. Örneğin aşağıda 'malgranda domo' ve 'vojo kampara', sıfat + isim kalıbına göre oluşmuş isim değerinde sözcük gruplarıdır ve isim yerini alarak şu an incelediğimiz kalıba uyum göstermişlerdir:

Burada dikkat edilmesi gereken başka bir durum, arada rol gösterici olmadan, yan yana iki ismi kullanarak, bir anlam elde etmeye çalışılmaması gerektiğidir. İsimlerin yan yana kullanılabileceği durumlar vardır, bunları bu derste göreceğiz, ancak 'belirtisiz isim tamlaması' oluşturmak için, İngilizce'deki kullanımdan esinlenip iki ismi yan yana getirme hatasını yapmamak gerekir. Örneğin;
Esperanto kongresi ≠ Esperanto kongreso (Yanlış)
dil öğretmeni ≠ lingvo instruisto (Yanlış)
Berlin Esperanto kulübü ≠ Berlino Esperanto-klubo (Yanlış)
Bunları ifade etmek için ya sıfat, ya rol gösterici, ya birleşik isim, ya da birleşik isim yapma anlamında kullanılan tire (-) kullanılmalıdır. (Bu konular sonra işlenecek). Bu durumda yukarıdaki yanlış kullanımlara bazı doğru alternatifler şunlar olabilir:
Esperanta kongreso = kongreso de Esperanto = Esperanto-kongreso
lingva instruisto = instruisto de lingvo = lingvoinstruisto
Berlina Esperanto-klubo = Esperanto-klubo de Berlino
[devam edecek]

1/3 adet baget ekmeği
2 yemek kaşığı zeytinyağı
1 tutam tuz
1,5 yemek kaşığı lutenitsa sos
2 dilim burger peyniri
4 dilim pastırma
4 dilim kuru domates
2 adet kornişon salatalık turşusu
4 ince dilim mor soğan
100 gram antrikot
2 yemek kaşığı limon suyu
2 yemek kaşığı zeytinyağı
1 tutam tuz
1 tutam karabiber

Antrikotu ince dilimler halinde kesin ve limon suyu ile zeytinyağı ile harmanlayın. Yarım saat buzdolabında bekletin.
Baget ekmeğini enlemesine ortadan ikiye kesin ve içine zeytinyağı sürüp hafifçe tuzlayın. Tavada kızartın.
Kızartırken çemeni alınmış pastırmaları da tavada çıtır çıtır olana kadar pişirin.
Etleri marine olduktan sonra yüksek ateşte ısınmış tavada önlü arkalı renk alana kadar 3-4 dakika pişirin. Tuz ve karabiber ekleyip ocaktan alın.
Kızarttığınız ekmeğin alt tabanına lutenitsa sosunu sürün. Üstüne pişirilmiş et parçalarını ekleyin ve sırasıyla burger peyniri, çıtır pastırmalar, yağda bekletilmiş kuru domatesler, kornişon dilimleri, mor soğan halkaları ve biraz daha zeytinyağı ekleyip ekmeğin üst parçasını kapatın.
Etli sandviç hazır! Afiyet olsun!

WBB, Alman bir forum şirketidir. Yaptığı forumlar tüm dünyada çok fazla kullanılmaktadır. Forumları para ile satılmaktadır, ama küçük versiyonları bedava satılmaktadır. En son 3.9 çıktı fakat, 3.0, 3.3, 3.5, 3.8 ve 3.9 yapısal olarak aynı sadece birkaç minik ekleme var. Burada bu forum türü ile nasıl gerçek bir forum yapılacağı öğretilmektedir.

Bu forumu kurmak için ilk önce forumun dosyaları olması gerek. Eğer elinizde WBB forumu dosyaları varsa 3. basamağa geçin. İlk önce http://www.woltlab.com adresine girin. Burada forumu para ile satın alabilir veya bedava küçük versiyonu indirebilirsiniz. Satın almak için Purchase tuşuna basın ama eğer bedava indirmek istiyorsanız sayfanın ortalarındaki "Tools For Your Community" tuşuna basın. Yeni açılan sayfada en altta "Burning Board Lite Free Download" yazmalı. Buna basın. Daha sonra sayfanın en alt ortasında ">> Download |" tuşuna tıklayın. Sonra açılan pencerede "Kaydet" tuşuna basın ve bilgisayarınıza yüklenmesini bekleyin. Şimdi sıra bu klasörü açmakta. Bilgisayarınızda WinZip programı, PowerArshiver programı gibi herhangi bir arşiv veya zip açma programı varsa bu dosyanın üzerine tıklayın. "Extract" tuşuna basın ve dosyayı "WBB" olarak masaüstüne kaydedin. WBB adlı klasöre girin. Burada birkaç adet text yazısı ve "upload" adlı dosya olmalı. O dosyayı açın. İçinde 3 adet dosya olmalı install.php, test.php ve WCFSetup.tar. Bu üç dosyayı da hiç ellemeyin ve üçünü de kendi bilgisayarınızın masaüstüne yapıştırın. Eğer masaüstünüzde üç dosya da varsa tamam demektir, bir sonraki basamağı okuyun.

Masaüstünüzde üç adet dosya olmalı. Şimdi kendi FTP Klasörünüze girin. Bunun için ilk bölümlerdeki bilgilerinizi kullanın. Şimdi sıra geldi aktarıma. Dosyaların üçünüde kopyalayın ve kendi FTP Klasörünüze yapıştırın. DİKKAT! FTP klasörünüz mutlaka boş olmalı aksi takdirde forum çalışmaz. Bu iş birazcık zaman alabilir ama en fazla 5 dk sürer dosyaları upload etmek. İş bitince FTP Klasörünüzde üç adet dosya vardır. instll.php, test.php ve WCFSetup.tar.gz olmalı. Şimdi Windows Gezgininizi yani şu an FTP Klasörünün olduğu yerin üstündeki adres çubuğuna bir şey yazmanız gerek. Bu adres çubuğuna kendi sitenizin adresini yazın. Önünde ftp. olmamalı yani bayağı adres olmalı. Önüne http:// yazın ve sonuna /test.php yazın. Enter veya Git tuşuna basara internete girin. O anda Internet tarayıcınız açılır. Eğer sayfada "PHP5 or greater is available. You can start the installation now." yazar ise iyi, start linkine basarak yüklemeye başlayabilirsiniz. Ama eğer bu yazmaz ve Php versiyonunuz geri ise ilk bölüme dönerek önerileni yapın. Funpic'de versiyon 5'den yüksetir ve uygundur. Daha sonra "start" tuşuna basın. Önünüze yükleme sayfası çıkar. Burada yüklemeye başlar. Eğer her şey iyi ise yüklemeye devam edin ama değil ise ilk bölümlere tekrar bakın. 

FTP Klasörleri yüklemek için değildir. Bu yüzden biz FTP'yi sadece dosya aktarımı için kullanırız. Şu an kendi İnternet tarayıcınızda ve yükleme sayfası önündeyseniz forumu yüklemeye başlamalıyız. FTP ile aktarılan dosyaları burada yükleyeceğiz. Fakat bu çok çok ince ve dikkat gerektiren bir iştir. Eğer herhangi bir yerde hata verirse, FTP Klasörünü boşaltıp en baştan başlayınız ama eğer doğru yaparsanız hata vermez. Şimdi başlıyoruz. İlk sayfada Dil sorar bize. Bu yükleme dilidir. Bunu Türkçe yapın. Eğer zaten Türkçe ise sayfanın biraz aşağısında sağ taraftaki "İleri>>" tuşuna basın. Karşınıza Lisans Sözleşmesi çıkar. Bunu onaylamanız gerekli. Bunu isterseniz okuyunuz. Daha sonra yazının altındaki kutuya basınız. Yine "İleri>>" kutusuna basınız. Sonra karşınıza gerekli sistem destekleri ile ilgili bir sayfa çıkar. Funpic kullananlar için hepsi tamam ve uygundur. Ama diğer hosting servisler için hepsi uygun değilse yükleme tamamlanmaz. Bu yüzden buradaki her şeyin yeşil renkte Bulunan:... yazması gerekir. Eğer böyle ise İleri>> tuşuna basıp devam edin. Şimdi önemli bir kısma geldi. Bize Framework için bir dosya adı soruyor. Burada sonunda /wcf/ olan yeri değiştirip /Framework yazıyoruz. Onun önünde yazan hiçbir şeye dokunmayın. Sonra İleri>> tuşuna basıyoruz. Burayı geçtikten sonra bize dil soruyor. Eğer siz sitenizin İngilizce olmasını istiyorsanız bunu işaretleyin. istediğiniz kadar dil seçebilirsiniz. Ama dikkat edin ne kadar ok dil olursa sistem o kadar yavaş olur ve zor yükler. Karakter Kodlaması Mutlaka "Unicode [UTF-8]" olmalı. Eğer bunu değiştirirseniz siteniz sadece "?" lerinden ve karelerden oluşabilir. Bu basamağı da İleri>> tuşu ile geçtikten sonra çok önemli bir kısma geliyoruz. Kendi hosting servisimize geri dönüyoruz. Burada önceden aktive ettiğimiz MySQL'e dönüyoruz. Sonra oradan MySQL Details, Bilgiler, Information gibi bir link varsa ona basıyoruz ve data base name ve diğer bilgileri öğreniyoruz. Şifremiz ise MySQL'yi aktive ederken kullanığımız şifre. Şifreyi, veri tabanı adı ve kullanıcı adını yazdıktan sonra İleri>> ye basıyoruz. Birkaç saniye bekliyoruz. Burada bazı yüklemeler yapıyor. Sonra bize Admin bilgilerini soracak. Kullanıcı Adı, Siteyi yöneten Admin'in kullanıcı adı. e-posta adresi admin'in e-postası. Bunu lütfen iki kere yazın, copy-paste yapmayın. Şifre ise Admin'in şifresi. Bunu da asla unutmayacağınız bir şey yapın. Asla ve asla basit bir şey yapmayın. Şifreyi tekrar yazdıktan sonra İleri>> tuşuna basın. Evet, eğer şimdiye kadar hata vermedi ise birkaç dakika sonra Forumunuz hazır!.. Şimdi birkaç dakika bekleyin. Eğer hata oluştu ise dediğim gibi FTP Klasörünü tamamen boşaltıp, ilk baştaki 3 dosyayı tekrar yükleyip yine aynı işlemleri yapın. 9 veya 10 dakika içerisinde yüklenir. Bu sırada yukarıdaki çubuğun %70, %80 &85 gibi üzdeler yazması gerekli. Eğer uzun bir süre hiç ilerleme olmazsa sayfayı yenileyin. Evet şimdi geldik en son bölüme. Size tekrar bir klasör adı soracak. Bunu asla ellemeyin. En sonunda kendi sitenizin adı olduğundan emin olun. Eğer sizin sitenizin adı "deneme" ise şöyle yazmalı: /usr/export/www/hosting/deneme/ bunu böyle bırakıp İleri>> tuşuna basın. Genellikle burada çok hatalar oluşuyor eğer hata verirse, "Paket Yüklemesini Geri Al" tuşuna basın ve tekrar yüklemeye başlayın. Devam edince %97'YE gelince bize birkaç şey sorucak. Importer, Legal Notice vs... bundan sadece Legal Notice'yi işaretleyin ve bu işi bitirin. Sonra ilerleyin. %100 olunca sizi sitenize sokar. Artık siz de bir site sahibisiniz. Size şimdi site ile ilgili bilgiler vereceğim. Nasıl siteyi yöneteceğinizi, ince detayları, renkleri ellemeyi, dilleri değiştirmeyi, ban vermeyi, ceza vermeyi öğreneceksiniz. 

Aslında normal anlatıcılar burayı anlatmaz; çünkü bu FTP ile alakalı değil. Ama ben kendi kılavuzumda eğer site kurmayı öğretiyorsam bunu da anlatmalıyım dedim ve şimdi size bu forumun nasıl kullanılacağını anlatacağım.

Eğer buraya kadar geldiyseniz sizin de artık bir forumunuz var. Hemen kendi site adresinize girin. Eğer sitenizin adresine girince direkt Woltlab Burning Board başlıklı forum çıkıyorsa doğru yapmışsınız. Hemen sayfanın üst, sol tarafında Giriş yazan yere basın. Yüklerken yazdığınız kullanıcı adı ve şifreyi girin. Onaylayın. Daha sonra sayfanın üstlerinde "Kontrol Merkezi" yazmalı. Ona girin. Şifre ve kullanıcı adınızı girdikten sonra artık kendi forumunuzun kontrol merkezindesiniz. Buradan siteyi her anlamında yönetebilirsiniz. Bu paneli kullanarak sitenin rengini değiştirebilir, forumlar ekleyebilir, kullanıcıları yönetebilirsiniz vs... Kısacası her şeyi yapabilirsiniz. Burayı kullanmayı öğrenmek her şey demektir. 

Eğer sitenizin başka renklerde olmasını istiyorsanız admin panelinize girip sol taraftaki tuşlara bakın. Buradan Tasarım Yazan Tuşa basın. Yukarıda Temalar tuşu belirecek buna da basıp "Temaları Listele" tuşuna basınız. Burada Woltlab Basic diye bir stil var. Bunun altında "Düzenle" tuşuna basabilirsiniz ve temanın renklerini düzenleyebilirsiniz. İlk sayfadan sonra Genel sayfasına geliniz. Burada sitenin nerede duracağını, arka plan resmini vs... ayarlayabilirsiniz. Bu sayfanın en aşağısında sitenin adresinin yanında duran simge gözüküyor. Onu seçin. Daha sonra Metin düğmesi ile Metin renklerini, büyüklüğünü, linklerin rengini vs... değiştirin. Genel'de iken "Sayfa" tuşuna basarsanız sayfanın aşağısında Logo diye bir seçenek vardır. Bu seçenek ile forumun ana sayfasında duran baş resmi değiştirebilirsiniz. Düğmeler tuşunu tıklayıp, düğmelerin rengini, kenarlıklarını vs... değiştirin. Menüler tuşu ile menüleri değiştirin. Dahası için siteyi gezip tanımanız gerekiyor.

Admin panelinde Sol tarafta en yukarıdaki Sistem tuşuna basın. Daha sonra yukarıda açılan tuşta tekrar Sistem'e tıklayın ve Genel tuşuna basın. Buradan site adı, sayfa tanımı, saat ayarı her şeyi elleyebilirsiniz.

Sitedeki kullanıcılara ceza verme, rütbe arttırma gibi ayarları admin panelindeki sol taraftaki "Kullanıcı" tuşu ile yapın.

Ftp hakkında. Yani File Transfer Protocol, dosya aktarım protokolü. Web siteleri, hostingler ve küresel ağlar için önemli bir dosya aktarım protokolü. Bu kılavuzda başlıca nasıl ftp kullanacağımızı, çeşitli ftp dillerini, gerekli destekleri, ftp programlarının kullanışlarını, forum kurulumunu, dosyaları web'e aktarmayı ve resimler ile bir "index" yapmayı öğreneceğiz.

Bu kitapda bazı etkinlikler ve pratikler bulacaksınız. Eğer bu etkinlikleri ve pratik bilgileri denemek istiyorsanız ftp kullanmalısınız. Bu yüzden en başta ftp ye ulaşmayı ve kullanamayı öğreneceğiz. Bunun için Windowsunuzda var sayılan bazı programları kullanmayı bilmek gerek. Windows'da hazır bulunan:

Apache 2.2
Internet Explorer
Windows Gezgini
FTP İletici
Arşiv Programları
Ayrıca windowsda hazır olmayan bazı programlar vardır ftp için. Bunlar bizim için gerek değil fakat eğer varsa çok daha kullanışlı olur. Bunlar:

Apache 3+
Power Archiver
Herhangi bir FTP Programı
Opera
Eğer bu programlarınız yoksa çok da önemli değildir ama varsa çok iyi. Ayrıca mutlaka edinilmesi gereken bir şey var, bir ftp kılasörü ve domain. Bunu da bizim kılavuzumuzda bulabilirsiniz.

Tam olarak hayır, gerek değil. Ama FTP kılasörüne çok iyi şeyler bırakmak istiyorsanız ASP, SQL,HTML,JavaScript bilmeniz belki gerekebilir. Onun dışında Bit işlem Klasörleri, JPEG,GIF,PNG gibi formatları da bilmek gerekebilir ama pek gerekli değildir.İleride gerekli olan FTP dosyaları ve dizinleri göreceğiz. Bunun dışında başka dile şimdilik ihtiyaç yok.Ama daha ileri seviyeler için İngilizce gerekebilir..

Eğer bir site yapmak, dosyaları web'e aktarmak, dizin "index" kurmak ya da forum,sunucu v.b kurmak istiyorsanız FTP en gerekli web ögesidir. Çünkü bu olaylarda herhangi bilgisayar formatlı dosyaları web klasörlerine aktaracağız. Bu iş biraz zaman ve gayret gerktiren bir iştir bunu unutmayın. Belki bazı yerlerde zorlanabilirsiniz. Bu kılavuzda ise bu çok çok gerekli web ögesini 0 dan sonsuza son derece basit şekilde öğreneceğiz. Eğer bir site yapmak istiyorsanız birkaç seçeneğiniz vardır, bunlar başlıca:

HTML Tabanlı Siteler (HTML gerekir)
Forum Siteleri (PHP, SQL, Çok Nadiren ASP gerekir)
Yorum Siteleri (HTML, PHP, SQL, ASP...)Bu siteleri yapmak için ftp ve başka şeylere ihtiyaç vardır.
Web Tabanlı Oyunlar (PHP, SQL, JAVAScript, ASP gerekir)
Dizin Siteleri (Her türlü Şeyin Dizini Yapılabilir.)
Bunlar çok başlıca siteler, bunların yanında onlarca site türü vardır. Fakat gördüğünüz gibi çoğunlukla siteler için HTML, ASP, PHP, SQL gibi web dilleri kullanılıyor. Fakat bizim en başta bunları bilmemize hiç gerek yok. Biz en başta sadece FTP klasörlerini yapmayı öğreneceğiz, daha sonra bu klasörleri dizinlemeyi ve basit bir forum sitesi kurmayı öğreneceğiz.

Sırası ile öğreneceğimiz şeylerin listesi:

FTP'ye giriş
FTP Kılasörleri Ekleme Silme
FTP Kılasöründe değişiklikler
Apache kullanma
Index yapma
FTP Kılasöründekileri Açma
FTP'de Dosya Taşıma
FTP'de Dosya Yedekleme
Basit Forum Kurulumu
İleri Derece forum kurulumu
HTML Öğrenme
PHP, SQL, ASP öğrenme
Çeşitli Dosya Formatları Öğrenme
Çok İleri FTP
Web Dilleri İle İleri Siteler Kurma

Evet artık başlıyoruz. FTP ile ste yapmayı ve çeşitli bilgisayar donanımlarını, WEB'i hep birlikte öğreneceğiz. Şimdi başlarken şunu asla unutmayınız, FTP en ufak bir yanlışlık ile tamamen bozulabilecek bir şey. Adım adım FTP öğrenmeye başlıyacağız. Anlatılan adımları doğru ve tamamen okuyunuz. Eğer bazı materyal veya donanımlarınız eksik ise en baştan okuyarak tekrar elde edebilirsiniz. Öncelikle şunun ile başlamalıyım. FTP: WEB üzerinden herhangi bir iş yapar iken dosyaları WEB'e aktarmamıza izin veren, vermeyen, yardım eden ve programlayan prosedürdür. Şifre ile çalışır. Eğer şifrenin güvenli olmasını isterseniz şifreyi uzun, karışık ve büyük küçük karakterli yapmanız gerekir.

FTP kurulumu ve FTP kılasörünüzden WEB'e aktarım için 5 adet çok önemli şeyler gerekir. Bunlar:

Şifreniz
FTP Kılasörü Kullanıcı Adı
Herhangi bir FTP Programı veya Windows Gezgini
İnternet
Ve mutlaka bir domain ve FTP Kılasörü.
Şimdi bunları elde etmeyi öğreneceğiz. Teker teker basamakları okuyunuz ve uygulayınız. 
1)Öncelikle bir domain ve FTP Klasörüne ihtiyacımız var. Eğer sizin bir domain ve FTP Kılasörünüz varsa bu adımı atlayınız ve 2. adıma geçiniz. Öncelikle bir bedava hoting sitesi gerekli bunun için. Hosting siteleri veri tabanı (data base) yaratan ve domain bağlatan sitelerdir. Bunun için size önerilerim olacak. Öncelikle isterseniz www.google.com adresine "bedava hosting" yazın. Bu sizin istediğiniz hosting servis olur. Ya da isterseniz size bir site önerebilirim. Bu alanda bedava hosting yapan www.funpic.org adlı bir site var. Buraya ulaşıp bedava "register" (kayıt) olup bedava bir hosting ve FTP Kılsörüne kavuşabilirsiniz. Şimdi sizin bulduğunuz hosting sitesinde eğer FTP Kılasörü vermiyorsa bu iş olmaz. Ayrıca daha ileri basamaklar için hosting serviste PHP, MySQL gibi bir çok özellik olması gerekir. Eğer bu desteklerin olduğundan emin değilseniz benim önerdiğim www.funpic.org sitesine girerek kayıt olunuz. Kayıt olurken verdiğiniz e-mail adresi sizin aktivasyon adresinizdir. Buna bir mail gelecek ve oradaki aktivasyon linkine basmanız gerekecek. 
2)Artık bir domaininiz var ve FTP Kılasörüne girmek istiyorsunuz. Şimdi kayıt olduğunuz hosting servisinin Paneline girin. Yani sitede üye girişi yapın. Şifrenizi ve kullanıcı adınızı yazın. Giriş yaptıktan sonra açılan panelde "Webhosting FTP", "FTP Hosting" "FTP" gibi bağlantılar var ise ona basınız. Bu bağlantı ile ilgili olan linke tıklayın. Sonra eğer FTP pasifse onu aktive etmemiz gerekir. Aktive et veya "Activate" veya bu tipte bir şey yazan yere tıklayın. Şimdi önemli bir kısma geldik. Orada FTP Kılasörü adı sorabilir. Çoğu Hosting'de (Funpic dahil) bu aynen sizin kayıt olurken olduğunuz kullanıcı adı. Yani sormayacak. Eğer sizinkinde değilse oraya bir kullanıcı adı yazın. Sıra şifrede. Şifreyi HATIRLAYACAĞINIZ mümkün olduğunca uzun ve karışık bir şey yapın, mümkünse sayılar koyun ve büyük küçük karakterler ile karıştırın. Daha sonra tekrar şifre sorarsa aynısını yazın. Bunu onaylayıp FTP Kılasörünüzü aktive edin. Daha sonra tekrar anelin ana sayfasına dönün. Burada "Webhosting MySQL" veya "MySQL Activate" gibi bir şey yazmalı. Ona girin. Activate MySQL diyin. Size şifre sormalı. Bu şifreyi ve demin yazdığınız FTP şifresi çok çok lazım. Bunu bir yere not edin. Daha sonra MySQL şifresini de yazdıktan sonra geri gelin. MySQL Detaylarına bakmalısınız. Buradan veritabanı adı ve kullanıcı adına bakın ve not edin. Şimdi sıra bu FTP Kılasörünü kullanmaya geldi. Alttaki basamak ile devam edin ve bu bitince bir sonraki bölüme, FTP Kullanma bölümüne ilerleyin.

Eğer bu satıra kadar her şeyi yaptınız ise bir FTP Kılasörünüz var. Şimdi ilk önce hosting servisinizde yine FTP ile ilgili olan yere giriniz. Burada "Information", "Bilgiler", "Detay" vs... gibi bir link var ise basınız. Eğer yoksa o sayfada bilgiler yazıyor olabilir. İlk önce bilgiler sayfasında FTP Kılasörünüzün asresini öğrenin. Funpic kullananlar için için FTP Kılasörü şöyledir: ftp.kullanıcı adınız.ilk iki harfi.funpic.org Eğer kullanıcı adınız "deneme" ise, ftp.deneme.de.funpic.org olur. Daha sonraki adıma gelirsek şifrenizi hatırlayınız. Bunu bir yere yazdıysanız iyi etmişsiniz. Şimdi internet tarayıcı sayfanızı alta indirin. Kendi bilgisayarınızın masüstündeki herhangi bir kılasörü açın ve tam sayfa yapın. Sayfanın üst tarafında tıpkı internet adresi yazdığınız yer gibi beyaz bir çubuk vardır. Eğer masaüstünüzdeki bir dosyayı açtıysanız bu söylediğim yerde C:\Documents and Setting\... bi şeyler yazar. Bunu silin. Tıpkı adres yazar gibi kendi FTP Kılasörü adınızı oraya girin. Git veya Enter tuşuna basın. Şimdi karşınıza bir pencere açıldı. Burada şifre ve kullanıcı adı soruyor. Eğer buraya kadar bunlar olmadı ise 1. Basamaktan yeniden başlayın. Eğer bu şifre ekranı çıktı ise kullanıcı adınızı ve şifrenizi aynen girin. Onaylayın. Evet, artık kendi FTP Kılasörünüzdesiniz. Eğer böyle şeyler olmadı ise (boş bir sayfa çıkmadı ise) 1. Basamağa dönün. Eğer doğru yaptı iseniz karşınızda boş bir kılasör var. Ve adres çubuğunda kendi FTP kılasörünüzün adresi yazıyor. Eğer her şey doğru ise kutlarız, 1. Fasikülü başarı ile yaptınız. 2. Fasikülümüze geçiniz. İçindekiler Sayfasından FTP'yi Kullanma adlı Sayfayı bulunuz ve ondan devam ediniz.

Forum çoğunlukla PHP ve az ASP alt yapısı ile yapılmış bir tür internet programıdır. Forumlar internet sitelerinde bilgi paylaşmak, eğlenmek, konuşmak, yazışmak için kullanılır. Forumlar basit olarak bu şekildedirler. Forum sistemleri bazı firmalar tarafından yazılır. (Ama eğer yapabilirseniz kendi forum sisteminizi yazın, bunun için PHP ve ASP dili bilmeniz gerek)Forumları yapan firmalardan bazıları bu forumları para ile satar. Ben kılavuzumda bu forumlardan dünyada en çok kullanılan 5 sistem türünün nasıl yükleneceğini anlatacağım. Dünya üzerinde en çok kullanılan forum sistemleri VBulletin ve WBB (Woltlab Burning Board)dur. Bunların asılları para ile satılır fakat WBB Lite yani küçük sistemleri bedava satılır. Ama VBulletin para ile satılmakta. Bunların dışında phpBB, SMF ve (Simple Machines Forum) MyBB bir başka çok kulanılan forum sistemleri. Bunlar ise bedava. Ben bunların hepsinin kuruluşunu teker teker anlatacağım, nereden yükleneceğini söyleyeceğim. FTP'ye aktardıktan sonra nasıl yükleneceğini anlatacağım ve hatta forumu nasıl geliştireceğinizi de anlatacağım. Siz sadece benim yazdıklarımı dikkatle okuyun, burası artık FTP'nin en güzel ama en zor kısımlarından. Başlıyoruz...   

Sizin için 5 adet forum sistemini anlatıyorum. Bu forum sistemleri dünya üzerinde en çok kullanılan ve en kaliteli sistemler. Bu sistemleri kurmak ve kendi forumumuzu yapmak için kendimize şöyle bir 1 saat ayırmamız gerek. Ondan sonra ise forumu düzenlemek için en az 5 gün gerek bize. Ama isterseniz hızlı bir şekilde de yapabiliriz ama dosyaları FTP'ye koymak için en az 1 saat gerek. İstediğiniz forum sisteminden başlayın veya sıra ile gidin bu size kalmış...

VBulletin Türü Forum Sistemi Kurulumu
Woltlab Burning Board Türü Forum Sistemi Kurulumu
phpBB Türü Forum Sistemi Kurulumu
Simple Machines Forum Türü Forum Sistemi Kurulumu
MyBB Türü Forum Sistemi Kurulumu

Index FTP ile yapabileceğiniz milyonlarca özellikten sadece biridir. Index demek kendi sitenizde istediğiniz her şeyi yayımlamak demektir. Örneğin sizin www.dizin.com diye bir adresiniz var. Bu adresin FTP kılasörüne benim önceden anlattığım gibi birkaç resim koydunuz. Arkadaşınız da bu resimleri www.dizin.com adresine girerek gördü. Aynı zamanda dizininize yazı, resim, slayt, müzik, video, oyun dosyaları, program dosyaları vs... kısacası her şey koyabilirsiniz. Örneğin bazı siteler vardır müzik indirirsiniz. İşte bu tür siteler FTP ile çalışır. Siz indir tuşuna basarsınız müzik size o FTP Kılasöründen gelir, yüklenir. Biz de bunun gibi bir site yapacağız ama şimdi bunun daha basitini yaparak başlıyoruz. Index'imizin içine her şeyi koyacağız. Haydi başlayalım.

Başlayalım Index yapmaya. Öncelikle kendi FTP Kılasörünüzü açın. Sonra bilgisayarınıza dönün ve boş bir yere gelin. Sol clicke basın ve Yeni tuşun üstüne gelin. Word e basın. Karşınıza bir word dosyası açılır. Bu Word dosyasının içine şunu yazın: Merhabalar herkese, bu Word dosyasını yüklediniz. ya da ne isterseniz onu yazın. Bunu kaydedin ve adını Word 1 diyin. Sonra yine bir Word Dosyası açın. Buraya da: Merhabalar bu da 2. Word dosyam. yazın. Kaydedin ve ve adına Word 2 diyin. Sonra bir tane daha Word dosyası açın ve: İşte bu da 3. Word Dosyam yazın. Bunu da kaydedin adı Word 3 olsun. Şimdi FTP Kılasörümüzün boş bir yerine gelelim ve sol clicke basalım. Burada Yeni tuşu olmalı ona gelelim ve Klasöre basalım. Yeni bir Klasör olmalı. Adını Değiştirelim ve "Word Kılasörü" Yazalım. Şimdi bilgisayarımıza dönelim ve 3 adet Word dosyasını seçelim, daha sonra sol click, kopyala ile kopyalayalım. FTP Kılasörüne dönelim ve "Word Kılasörü" adlı dosyaya iki kere tıklayalım. İçine girip sol clicke basalım ve yapıştır diyelim. İşlem tahminen 10-20 sn içinde biter. Artık 3 adet dosyamız FTP Kılasörünün içinde. Şimdi tekrar kendi domainimize dönelim. Internet adres çubuğuna kendi sitemizin adresini yazalım. Orada "Word Kılasörü/" yazmalı. Bu bizim yarattığımız kılasör. Ona basalım ve karşımızda 3 adet Word dosyası var. Şimdi herhangi bir tanesine basalım. Örneğin Word 1 e bastık. Karşımıza bir pencerede "İndirme Penceresi" çıkar. Bu bizim indirmemize yardımcı olacak prosedür. Yani eğer ben bir yazı yazar ve FTP'ye koyarak yayınlarsam, arkadaşlarım bu yazıyı buradan indirir ve okur. Evet umarım her şey olumludur. Çünkü sıra Müzik, Video, slayt gibi şeyleri yüklemeye geldi. Bunları yaparak kendi müziklerimizi indireceğimiz bir dizin yaparız. Bilgisayarımıza dönelim. Eğer masaüstünde bir müzik veya video var ise onu kopyalayalım. Eğer yoksa önemli değil. FTP kılasöründeaynı şekilde yeni bir Kılasör açalım ve adına "Müzik İndir" diyelim. Daha sonra varsa müziğimizi bunun içine kopyalayalım. Tekrar domain adresimize dönelim. Bu sefer iki adet dosya var. "Word Kılasörü" ve "Müzik İndir". Eğer müziğinizi koyduysanız bu kılasöre giren herkes bu müziği, videoyu indirir.
FTP Kaynak Programları;
Godzilla
Cute FTP
BlazeFTP

Eğer FTP ile bir şeyler yapmak istiyorsanız dosyaları yönetmeniz gereir. Şimdi şu bilgiyi vereyim size. Sizin şu an FTP Kılasörünüzü açtığınız yerin adı "Windows Gezgini" ve internette dosyaları gördüğünüz yerin ismi "Apache" (Apaçi) Apache basit bir FTP Programıdır. Buradan dosyaları silemez, değiştiremez, ekleyemez ve adlarını değiştiremezsiniz. Buradan yalnızca dosyaları görür, okur ve indirebilirsiniz. Şimdi Windows Gezginine yani FTP Kılasörümüze dönelim. Word Kılasörü içindekileri kopyalayalım. Şimdi geri gelelim ve "Müzik İndir" kılasörüne gelelim. Sol click ile yapıştır diyelim. A, yapışmıyor. Niçin? Yapışmıyor çünkü bu dosyalar FTP üzerinden WEB'e aktarılmış. Şunu anlatmam gerek. Bu bizim FTP Kılasörüne koyduğumuz dosyalar 4 adet veri tabanından geçiyor. 1. Bizim bilgisayarımız, 2. FTP Kılasörü, 3. Hosting Servisimiz ve 4.WEB. Bu dosyalar sırasıyla bu dosyalara aktarılıyor. Biz Word dosyalarını FTP Kılasörüne koyunca Upload ediyoruz. FTP'de bu sırada bunuHosting servisimize aktarıyor. İşte demin söylediğim Apache programı kullanılarak bu dosyalar Hosting Servis'den direkt WEB'e yani Internet'e aktarılıyor. Size demin ne dedim Apache'de dosyalara hiçbir şey yapılamaz. OBu yüzden FTP'ye bir kere konulan bir şeyin kılasörü asla değiştirilemez. Bunu kendi bilgisayarınıza yükleyip tekrar istediğiniz kılasörün içine sokmanız gerekir. Yani bu dosyaları "kes" tuşu ile kesip daha sonra bilgisayarımıza yapıştırmamız gerekiyor. Daha sonra bunları istediğimiz kılasöre sokabiliriz.

Eğer bundan önceki basamakları doğru yaptınız ise önünüzde bir FTP Kılasörü var.Yok ise önceki bölüme geri dünün ve uygulayınız. Eğer FTP Kılasörünüz var ise haydi onun üzerinde bazı değişiklikler yapalım ve onu kullanalım. Şimdi öncelikle bundan sonraki bölümde bir Index yani bir dizin hazırlamayı öğreneceğiz. Bu yüzden şimdi size FTP'ye bir şeyi Upload yani yüklemeyi öğreteceğim. Kendi bilgisayarınıza bir resim yükleyin. Basit bir resim olsun. Örneğin bir kuş resmi. Bilgisayarınızda "kuş" diye kayıtlı. Masaüstünüzde duruyor. Bunun üstüne gelin ve sol clicke basın. Kopyala tuşuna basın. Resim kopyalandı. Şimdi sıra geldi bu dosyaları WEB'e koymaya. FTP Kılasörünüzü açın. Eğer bu ana kadar her şey normal ise bundan sonraki basamağı okuyun.

Evet, umarım her şey normalir. FTP Kılasörünüz açık ve masaüstündeki resmi kopyaladınız. Şimdi Kılasöre gelin ve herhangi bir yere gelip sağ clike basın. Yapıştır tuşuna basın. Bu upload hızınıza göre değişir. Fakat en fazla 5 sn içerisinde o boş kılasörün içinde "kuş.jpg" veya .gif, veya .png vs... diye bir dosya var. Şimdi, Internetinizi açın ve adres çubuğuna kendi sitenizin adını yazın. Funpic kullananlar için eğer adınız deneme ise deneme.de.funpic.org dur. Sitenize girince şöyle bir şey yazar. Index Of/ daha sonra altta kuş.jpg adlı bir dosya vardır. İşte bizim aradığımız şey burada... kuş.jpg yazan yerin üzerine basın. İşte size masaüstünüzdei resim. Bu ilk basamaklar için küçük bir alıştırmaydı. Bu yolu kullanarak daha sonra dizin yapacağız. Şimdi buradaki hiç bir şeyi ellemeyin ve 3. basamağa geçin.

Başka bir alıştırmaya geldi sıra. Bize dizin yaparken gerekecek. Kendi masaüstünüze gelin ve boş bir yere sol click ile basın. Açılan küçük pencerede Yeni tuşuna gelin ve metin belgesi tuşuna basın. Şu anda masaüstünüzde bir text dosyası var. Adını değiştirin ve "deneme" yazın. Şimdi Bu dosyanın üzerine iki kere basın. Size bir text dosyası açıldı. İçine "Bu benim ilk deneme yazımdır." yazın sağ köşedeki "X" tuşu ile çıkın. Size kayıt ediyim mi diye soracaktır, siz Evet tuşuna basarak kayıt edin. Şimdi sıra geldi bu yazıyı FTP'ye koymaya. Yine aynı işlem ile dosyanın üzerine geliğ sol click e basın. Kopyala diyin. FTP Kılasörünüzü açın. Şu an içerisinde sadece demin koyduğumuz kuş adlı resim var. Şimdi kılasörde boş bir yere gelerek sol clicke basın. Yapıştır tuşuna basın. Bu da sizin en fazla 3 snizi alır. Kopyalayınca, tekrar sizin adrese dönün. Adres çubuğuna kendi domain adınızı yazın. Şimdi içerisinde iki adet dosya var olması gerek. Biri kuş diğeri ise yanında kağıt resmi olan deneme.txt dosyası. Şimdi burada deneme.txt yazan yere basın. İşte sizin demin yazdığınız yazı, internette. Şimdi sıra geldi bu bildiklerimizi kullanarak bir İnternet Dizini yapmaya. İnternet dizini nedir? Dizin aslında kendi sitenizde bu göstermek istediğiniz şeyleri göstermektir. Biz basit bir Index yapacağız başlama amaçlı. Ama daha ileride çok daha ileri Dizinler yapabiliriz. Şimdi sizden tek istediğim FTP Kılasörünüze dönün ve Kılasördeki iki dosyayı da seçin. Sol click e basın ve sil tuşuna basın. Dosyalar hemen silinir. Şimdi diğer bölüme geçin. FTP Indexi Yapma.

مَن هَستَم / مَن ...ام ben -(y)ım
örn. مَن دانِش‌آموز هَستَم. / مَن دانِش‌آموزَم. ben öğrenciyim
دانِش‌آموز (dâneşâmuz) kelimesi üniversiteden önceki öğrencilerden bahsederken kullanılır. Üniversite öğrencisinden bahsederken دانِشجو (dânéşcû) kelimesi kullanılır.
Üçüncü tekil şahısta iki çeşit bulunmaktadır ve اَست daha çok resmî dilde kullanılmaktayken, هَست ise daha çok gayriresmî dilde kullanılmaktadır.

Farsçada fiillerin geniş zaman kökleri şöyledir:

بودَن (bûden) olmak = باش (bâş)
کَردَن (kerden) yapmak, etmek = کُن (kon)
هَستَن (hesten) olmak = هَست (hest)
Sonra ise sonekler eklenir.

1.Tekil: ـَم
2.Tekil: ـی
3.Tekil: ـَد
1.Çoğul: ـیم
2.Çoğul: ـید
3.Çoğul: ـَند

Farsçada fiillerin geniş zaman köklerini yukarıda öğrenmiştik. Bu fiilleri şimdiki zamana dönüştürmek için başına bir "می" koymanız gerekir. Örneğin کَردَن fiilini şimdiki zamanda çekelim.

1.Tekil: مَن می‌کُنَم (men mikonem)
2.Tekil: تو می‌کُنی (to mikonî)
3.Tekil: او می‌کُنَد (û mikoned)
1.Çoğul: ما می‌کُنیم (mâ mikonîm)
2.Çoğul: شُما می‌کُنید (şomâ mikonîd)
3.Çoğul: آن‌ها می‌کُنَند (ânhâ mikonend)
Bu fiilleri olumsuz hâle getirmek için ise "می"nin önüne bir "ن" harfi iliştirilir.

1.Tekil: مَن نِمی‌کُنَم (men némikonem)
2.Tekil: تو نِمی‌کُنی (to némikonî)
3.Tekil: او نِمی‌کُنَد (û némikoned)
1.Çoğul: ما نِمی‌کُنیم (mâ némikonîm)
2.Çoğul: شُما نِمی‌کُنید (şomâ némikonîd)
3.Çoğul: آن‌ها نِمی‌کُنَند (ânhâ némikonend)
Fiillerin şimdiki zaman köklerinin bir listesi için bu sayfaya gidiniz.

Farsça fiillerin basit geçmiş zaman şekli oluşturulurken önce fiilin mastarındaki "ن" harfi atılır, sonra da özneye göre sonek eklenir.

1.Tekil: ـَم
2.Tekil: ـی
3.Tekil: ø
1.Çoğul: ـیم
2.Çoğul: ـید
3.Çoğul: ـَند
Örneğin کَردَن fiilini basit geçmiş zamanda çekelim.

1.Tekil: مَن کَردَم (men kerdem)
2.Tekil: تو کَردی (to kerdî)
3.Tekil: او کَرد (û kerd)
1.Çoğul: ما کَردیم (mâ kerdîm)
2.Çoğul: شُما کَردید (şomâ kerdîd)
3.Çoğul: آن‌ها کَردَند (ânhâ kerdend)

Teknolojinin gelişmesiyle birlikte son yıllarda eğitim ortamlarında kullanılan yöntem,
teknik ve materyallerde ciddi değişikler meydana gelmiştir. Özellikle de çeşitli teknolojik
araçların eğitim ortamlarında etkin bir şekilde kullanılmasıyla birlikte öğretmenin ve öğretim
ortamlarının işlevi değişmiştir. Öğretmen ve öğretim ortamlarının işlevini değiştiren ve
gelişmiş ülkelerin birçoğunda da eğitim gündemini oluşturan kavramlardan biri de FeTeMM
olduğu görülmektedir.
Aslında FeTeMM eğitiminin altında yatan en önemli etmen ekonomidir (Obama, 2008). Ekonomik kalkınmanın FeTeMM alanlarındaki bireylerin niceliksel ve niteliksel olarak artırılması ile gerçekleşeceği düşünülmektedir. Tüketen bir toplumdan ziyade üreten, bilimsel liderliğe sahip ve ekonomik gücü olan bir toplum oluşturma asıl hedefler arasındadır. FeTeMM eğitimi bu anlamda önemli bir araç ve istenilen amaca ulaşmak için ortaya konan bir paradigma olarak değerlendirilebilir.  FeTeMM çatısı altında fen bilimleri, teknoloji, mühendislik ve matematik disiplinlerine ilişkin bilgi, beceri ve uygulamalar tek disiplin altında ve birkaç disiplinin entegrasyonu ile  hem okul içi hem de okul dışı öğrenme ortamlarında kazandırılmaktadır.
Gelişmiş ülkelerin birçoğunun üzerinde durduğu FeTeMM (STEM) kavramı, fen bilimleri, teknoloji,
mühendislik ve matematiğin İngilizce yazılışlarının baş harflerinden oluşturulmuş bir
kısaltmadır. Genel olarak teknoloji ve mühendislik tasarım tabanlı STEM, matematik ve fen konuların öğretiminde bu alanlarla
ilgili bilgi ve becerilerin bütünleştirilmesini öngörmektedir (Bybee, 2010; Guzey ve ark.,
2014; Smith ve Karr-Kidwell, 2000). FeTeMM’de öngörüldüğü şekilde
okullardaki eğitim sürecine FeTeMM etkinliklerin dâhil edilmesi ve kullanılması durumunda,
öğretim ortamlarının verimlilik ve etkililiklerinin oldukça yüksek olacağıdır.
FeTeMM eğitiminin temel amacı, fen bilimleri, teknoloji, mühendislik ve matematik disiplinleri
arasında ilişki kurarak öğrenmenin bütüncül bir yaklaşım ile gerçekleştirilmesini
sağlamaktır(Smith ve Karr-Kidwell, 2000). National Governors Association Report (2007),
göre FeTeMM eğitiminin amacı, bilimsel, matematiksel, mühendislik ve FeTeMM okur-yazarlığını
geliştirmek olarak belirtilmiştir. Buna paralel olarak Rogers ve Porstmore (2004), göre ise
FeTeMM eğitimi, öğrencilerin mühendislik tasarım uygulamalarıyla farklı disiplinler arasında
işbirliği içinde çalışarak bu disiplinleri birbirine entegre edilmesini, problemlere yaratıcı ve
gerçek çözümler üretmesini amaçlar. Eğitim bilimciler öğrencileri fen bilimleri, teknoloji,
mühendislik ve matematikte eğitmek adına 7 standart bağlam içinde ele almaktadır. Bunlar;
1. Disiplinlerle ilgili içerikleri öğrenme ve uygulama,
2. Disiplinlerle ile ilgili içerikleri birbirine entegre etme,
3. Bilgiyi sorgulama ve yorumlama,
4. İletişim becerilerini geliştirme,
5. Mantıksal akıl yürütebilme,
6. Bir takım olarak işbirliği içinde çalışma,
7. Uygun olarak teknolojiyi uygulama.
Yukarıda bağlamalara bakıldığında FeTeMM eğitimi, 21. yüzyıl becerilerinin
geliştirilmesi ve kalifiyeli bireylerin sahip olması gereken becerilerin ön planda tutulduğu
söylenebilir. Yapılan çalışmalarda da FeTeMM eğitiminin öğrencilerin 21. yüzyıl becerileri
geliştirmelerine ve bu yeteneklerini kullanmalarına olanak sağladığı sonucuna ulaşıldığı
görülmüştür (Sahin ve diğerleri, 2014; Wagner, 2008; Levy ve Murnane, 2004; Jerald, 2009).
FeTeMM eğitimi ile öğrencinin pasif ve teorik eğitimin hâkim olduğu öğrenme
ortamlarından öğrencinin merkezde olduğu ve yaparak yaşayarak öğrendiği ve teorinin
uygulanmasına olanak bulduğu öğrenme ortamına geçilmiştir. Bu nedenle FeTeMM, eğitim
alanında hem öğrenme ortamlarının geliştirilmesi hem de öğretim sürecini etkilediği ve
etkileyeceği söylenebilir.

The National Science Foundation’s (NSF) FeTeMM tanımlamasında, fizik ve biyoloji bilimleri, bilgisayar ve enformasyon bilimleri, mühendislik, matematik ve de psikoloji, sosyoloji, ekonomi ve politik bilimler gibi sosyal ve davranışsal bilimleri de içermektedir(National Science Foundation, Division of Science Resources Statistics, 2009). Fakat FeTeMM eğitiminin geliştirilmesine yönelik yasal çabalar, FeTeMM’in temel alanları olan fen bilimleri, teknoloji, mühendislik ve matematik üzerine odaklanmıştır(Kuenzi, 2008). FeTeMM’ıin kapsadığı alanların geniş olması itibariyle yapılan tanımlamalarda bir standart eksikliği yaşanmakta ve literatürde FeTeMM ilgili birçok farklı tanımlama bulunmaktadır. FeTeMM ile ilgili yapılan tanımlamalardan birkaçı şu şekildedir: FeTeMM dört disiplinin baş harflerinden oluşan basit bir gruplamadan ziyade bir birleştirici fikir olarak tanımlanmalıdır(Morrison ve Raymond V. 2009). Maryland üniversitesi mühendislik Profesörü Leigh R. Abts ise FeTeMM’i “metadiscipline” olarak tanımlamış ve FeTeMM’i her biri doğal yaşamda ortaya çıkmış olan bilim, teknoloji, mühendislik ve matematik disiplinlerinin uygulama alanı olarak görmektedir. Meng ve arkadaşları (2014), ise FeTeMM’i fen bilimleri, teknoloji, mühendislik ve matematik disiplinleri arasında köprüler kuran bir çalışma alanı olarak tanımlamaktadır. Morrison (2006), görüşüne göre de FeTeMM, fen bilimleri, teknoloji, mühendislik ve matematik disiplin bilgilerinin entegrasyona dayalı bir bütün halinde yeni bir disiplin oluşturulmasıdır.
FeTeMM, fen bilimleri ve matematik disiplinlerine daha fazla odaklanmakla birlikte teknoloji ve mühendislik alanlarını içermektedir(Bybee, 2010b). FeTeMM, fen bilimleri, teknoloji, mühendislik ve matematik olmak üzere dört alanın içerik olarak birbirlerine uyarlanması veya bu dört disiplinden biri merkeze alınarak diğer üç disiplinin bu disiplinin içeriğinin öğretilmesi için bağlam olarak kullanılması şeklinde düşünülebilir(Moore ve ark., 2013).
FeTeMM eğitimi, öğrenci ve öğretmenlerin ilgi ve hayat deneyimleri sonucu şekillenmekte ve merkezde bulunan disipline ait özel bilgi ve becerilerin en az biri diğer FeTeMM disiplini ile bütünleştirilerek öğretilmesi olarak tanımlanmaktadır (Corlu, ve ark., 2014).
FeTeMM ile ilgili yapılan tanım ve yaklaşımlar incelendiğinde; FeTeMM her bir araştırmacı tarafından değişik olarak tanımlanmış gibi görülse de tanımlardan çıkarılan ortak nokta; FeTeMM, eğitimde öğrenme ortamlarının niteliğini artıran ve öğretim süreçlerini daha da verimli ve etkili hale getiren, okul müfredatlarındaki içerikler ile bilim, teknoloji, mühendislik ve matematik disiplinleri arasında entegrasyon sağlanarak öğrencilere uygulama yapma olanağı sunan bir yaklaşım olduğudur.
FeTeMM tarihi, eğitimde asıl etkiyi oluşturan teorisyen ve bilim adamlarının ortaya çıktığı 1700’li yılların sonuna dayanmaktadır. Bu dönemdeki bilim adamları ve eğitimciler FeTeMM için bir başlangıç noktası oluşturmuş olsalar bile asıl etkiyi John Dewey ‘in 1896’da kurmuş olduğu “Dewey School” da görmek mümkündür. Dewey’in teorilerini test ettiği bu öğrenme laboratuvarı aynı zamanda okul reformların başlangıcı da olmuştur. Dewey’in düşünceleri ve araştırmaları pedagojinin anlaşılmasında ve FeTeMM eğitiminden yararlanılmasında etkili olmuştur(Goodchild, 2012). 1931 yılında Dewey’in yazmış olduğu “The Way Out of Educational Confusion” kitapçığı 1950’li yıllara kadar, sınıflarda müfredatın entegresinde önemli etkileri olmuştur.
Dewey disiplinlerin ayrı olmaması gerektiğine inanmasından ziyade bu disiplinlerin gerçek yaşam uygulamasına yönelik olması gerektiğine inanmıştır. Ayrıca Dewey bilimin erken yaşlarda öğretilmesi gerektiğini ve öğrenme için kitaplardan daha çok gerçek yaşam nesnelerinin kullanılmasını önermiştir. Yapılan çalışmalarda, öğrencilerin erken yaşta FeTeMM etkinliklerine katılmalarına olanak sağlandığında, öğrencilerin FeTeMM alanlarına ilgilerinin arttığı sonucuna ulaşılmıştır(Maltese ve Tai, 2010; Dabney ve ark., 2012). ABD’de 1980’li yılların sonuna doğru FeTeMM eğitimi, hükümet tarafından desteklenmiştir. Bu destekle birlikte matematik ve bilim okulları gibi FeTeMM okulları da özelleşmiştir. ABD’de 1904 yılında ilk FeTeMM lise olan “Stuyvesant High School” ve 1938 yılında ise “New York Bronx High School of Science” açılmıştır. Bu iki okul FeTeMM disiplinleri için anlamlı ve zengin öğrenme deneyimi sağlamaya devam etmiştir(Sublette, 2013).
1985 başlayan ve son yıllarda üzerinde oldukça durulan “Project 2061” ile ABD’de FeTeMM eğitiminin geliştirilmesi ve artırılmasını amaçlamaktadır. Aynı zaman da bu proje Amerikalıların bilim okur-yazarlığını da geliştirmeyi hedeflemektedir. 2010 yılında Amerika da yayımlanan “Prepare and Inspire: K-12 FeTeMM Education for America’s Future” isim raporda FeTeMM eğitimi ile ilgili konular şu şekildedir;
Standartlar: bilim ve matematik standartları devlet kaynaklı desteklenmesi,
Öğretmenler: FeTeMM okullarındaki öğrencileri hazırlama ve öğrencilere ilham vermek
üzere 100.000 öğretmen gelecek on yıl içinde eğitim verilmesi ve FeTeMM öğretmenleri içinde ilk %5 giren öğretmenlerin ödüllendirilmesi,
Eğitim teknolojileri: yeniliği sürdürmek için teknoloji kullanılması,
Öğrenciler: okul dışın da öğrencilerin bireysel ve grup halinde deneyim geçirmelerine
fırsat yaratılması,
Okullar: gelecek on yıl ve sonrası için bin FeTeMM odaklı okulun açılması,
Güçlü ve stratejik ulusal liderlik sağlanması.
ABD hükümeti, FeTeMM ile ilgili etkinliklere öğrencilerin katılmalarını teşvik etmek, bilgi, beceri ve yetkinliklerini geliştirmek ve FeTeMM ile ilgili mesleklere ilgilerini arttırmak için “education to innovate” adında bir program başlatmıştır(Obama, 2009). Geçen 100 yılda, ABD’de yüzün üstünde FeTeMM odaklı okul açılmış ve ABD’de hükümeti gelecekte bu okulların sayısının bin olabilmesi için girişimde bulunmuştur(Fajemidagba ve ark., 2010). Bu okullar öğrencilere işbirliği içinde çalışmayı ve probleme tabanlı araştırmaya dayalı öğrenme imkânı sağlamaktadır.

Hayatın her alanında etkisini gösteren teknolojik gelişim toplum alanında da değişimlere sebebiyet vermiş ve bilginin artış göstermiş olduğu bu çağda eğitime duyulan ihtiyacı zorunlu kılmıştır. Eğitime duyulan ihtiyacın zorunlu hale gelmesi her ye

Bu Kısım Film Yapım Kılavuzu'nun bir parçasıdır.
Film yapımı bir film yapmanın sürecidir. Film yapımı boyunca filmin doğal belirleyicileri boyutu ve film ekibinin gerekenlerinin türüdür. Birçok Hollywood macera filmi bir kasta ve yüzlerce ekibe iş vermiş ve imgeler oluşturan karmaşık bilgisayarlara (CGI) sahiplerdir, bir düşük bütçede ise, bağımsız filmler iskelet ekiplerle yapılabilir, çoğunlukla çok az ödenir. Film yapımı dünyanın her yerinde farklı teknolojiler, teknikler kullanır ve Amerika stüdyo sisteminin içinde kâra yönelik film yapımından Çin'de devlet-destekli belgesellere kadar çeşitli ekonomik içeriklerde üretilir.

Film yapımının Üretim süreci 5 ana basamağı içerir.

Geliştirim
Üretim öncesi
Üretim
Üretim sonrası
Dağıtım
Hollywood tarzında üretim süreci tipik olarak 3 sene alır. İlk yıl geliştirme ile bir sürer. İkinci yıl üretim öncesini kapsar ve üçüncü yıl üretim sonrasını ve dağıtımı kapsar.

Bu geçerli senaryonun içindeki bir fikrin detaylarının anlatıldığı basamaktır. Filmin yapımcısı kitaplardan diğer filmlerden, gerçek hikâyelerden, orijinal fikirlerden bir öykü bulur. Önce tema veya alt mesaj belirlenir, bir sinopsis hazırlanır. Bu öyküyü dramatik yapı üstünde yoğunlaşarak bir paragraflık sahnelere parçalayan taslak takip eder. Sonra da bir tretman hazırlanır. Bu hikayenin 25-30 sayfalık tanımıdır, ruhsal durumları ve karakterleri ile biraz diyalog ve sahne yönergelerini, çoğunlukla göz önüne getirmeye yardım etmesi için çizimleri kapsar.
Senaryo belki altı aylık bir süreçten sonra yazılır ve oyunlaştırmayı, açıklığı, yapıyı, karakterleri, diyaloğu ve ayrıntılı tarzı geliştirmek için bir kaç defa tekrar yazılır. Prodüktörler çoğunlukla ilk basamakları atlar ve teslim edilen senaryo sürecinde değerlendirirmiş olan senaryoları geliştirir. Filmin ticari başarısını ve olası pazarı değerlendirmek için ilk basamakta bir film dağıtımcısı ile görüşülmüş olunmalıdır. Hollywood dağıtımcıları gerçekçi bir işe başvurmayı benimsemişlerdir ve film türleri, hedef kitlesi, benzer filmlerin tarihsel başarısı, filmde görünebilecek oyuncular ve potansiyel film yönetmenleri gibi faktörleri göz önünde bulundururlar. Bir potansiyel seyirci için bu faktörlerin tamamı belirli bir filmin çekiciliği ve bundan dolayı tiyatral yayın sırasında  "koltukların üstündeki butların sayısını" ifade eder. Filmler nadiren yalnız tiyatral yayından kar yaparlar bundan dolayı DVD satışı ve dünya çapında dağıtım hakları hesaplara geçirilmesine ihtiyaç vardır.
Daha sonra film ziftleri potansiyel film sermayedarları için hazırlanır ve sunulur. Eğer ziftler başarılı olur ve filmler "yeşil ışık" verirse ondan sonra çoğunlukla majör film stüdyolarından, film konseylerinden, bağımsız gelirlerden finansal destek verilir.  Görüşülmüş ve sözleşirmiş bir dağıtım imzalanır.

Üretim öncesinde film planlaması ve tasarlanması yapılır. Üretim şirketi yaratılır ve üretim bürosu kurulur. Üretim storyboardlanır, illüstrasyonların ve sanatçıların düşüncelerinin yardımıyla görselleştirilir. Ayrıca filmin masrafları için bir Üretim bütçesi hazırlanır.
Yapımcılar insanları aşağıdaki rolleri doldurmaları için kiralar:

Öncelikle filmdeki oyunculuktan ve yaratıcı öğelerin yönetiminden sorumlu olan yönetmen.
Yardımcı yönetmen çekim tarihini ve üretimin lojistiği içinde diğer görevleri idare eder.
Kast yönetmeni senaryodaki bölümler için oyuncu bulur. Bu genelde oyuncudan bir yetenek ister. Başroller çoğunlukla oyuncunun şöhreti veya 'yıldız gücü' temel alınarak dikkatlice seçilir.
Yer idarecisi filmin yerlerini bulur ve idare eder. Bir stüdyo ses sahnesinin önceden bildirilebilir ortamında çoğu resim sahne olur ama ara sıra dışarıda yapılan sekanslar film alındığı yere göre belirlenebilir.
Üretim idarecisi filmin bütçesini ve üretim programını idare eder. Ayrıca o, stüdyonun yetkilileri veya finansmanlarına üretim bürosunu adına rapor verir.
Görüntü yönetmeni veya fotoğraf yöneticisi filmin fotoğrafçılığını yaratır. O, yönetmen, ses yönetmeni ve sanat yönetmeni ile yardımlaşır.
Sanat yönetmeni üretim setleri yapan, kostüm, makyaj ve saç servislerini sağlayan sanat bölümü idare eder.
Üretim tasarımcısı üretim setlerinin görünüşünü ve duygusu, kostümleri, makyaj ve saç tarzlarını sanat yönetmeniyle birlikte çalışarak yaratır.
Storyboard sanatçısı yönetmene ve üretim tasarımcısına onların fikirlerini bildirerek üretim ekibi için görsel fikirleri yaratır.
Üretim sesçisi filmin üretim basamakları boyunca ses deneylerini idare eder. O, yönetmen, görüntü yönetmeni ve sanat yönetmeniyle yardımlaşır.
Ses tasarımcısı filmin işitsel duygularını seslendirme sanatçılarının yardımıyla artırır ve yeni sesler yaratır.
Besteci film için yeni müzik besteler.
Koreograf dans ve hareketleri yaratır ve koordine eder - çoğunlukla müzikaller için. Ayrıca bazı filmler dövüş koreograflarına itimat eder.

Burada film gerçekten yaratılır ve çekilir.  Dekorcu, Senaryo denetçisi, asistan yönetmen, fotoğrafçı, kurgucu ve ses kurgucusu gibi birçok ekip bu basamakta işe alınır. Film yapımında bunlar sadece genel görevlerdir ve üretim bürosu bir filme özel uygunluk için eşsiz rollerin karışımını yaratmakta özgürdür.
Bir tipik çekim günü çekim programını takip ederek bir asistan yönetmen ile başlar. Filmin seti inşa edilir ve sahne donanımı hazırlığı yapılır. Işıklar donatılır, kamera ve ses kayıt ekipmanları kurulur. Aynı zamanda kostüm, saç ve makyaj bölümleri hazırlanır.
Oyuncular senaryonun provasını ve yönetmen ile bloklama yapar. Sonra da görüntü ve müzik ekipleri oyuncular ile prova yapar. Son olarak yönetmenin uygun gördüğü aksiyonlar birçok defa çekilir.
Her alınan çekim bir izleği takip eder ve kurgucuya alınan her parçayı üretim sonrasında tutmasına yardımcı olan çekim tahtasının üstüne işaretlenir. Çekim tahtası sahneleri, alınanı, yönetmeni, görüntü yönetmenini, tarihi, filmin adını kayıt eder ve kamerayı gösteril. Ayrıca çekim tahtası senkronize etmek ve sesleri almak için gerekli işaretleme fonksiyonlarına yardım eder. Sesler filmden ayrı bir cihaza kayıt edilir ve üretim sonrasında senkronize edilmelidir.
Yönetmen çekimlerin iyi olup olmadığını kontrol eder. Senaryo denetçisi ses ve kamera ekipleri her işlemi kişisel rapor tablolarına iyi olup olmadığını kaydederler. Her rapor tablosuna her işlem hakkında önemli gerçekleri kayıtlıdır.
Sahnelerin çekimi bittiğinde yönetmen bir wrap'i ilan eder. Ekip bu sahneler için seti söker veya bırakır. Yönetmen gelecek gün çekim programını yoklar ve günlük ilerlemenin raporunu üretim bürosuna gönderir. Buna devamlılık, ses ve kamera ekiplerinden raporlar dâhildir. Call sheet, kasta ve ekiplere gelecek günkü çekimlerin nerede ve ne zaman çevrileceğini anlatmak için dağıtılır.
Üretim için geleneksel fotografik film kullanılır, işlenmemiş günün çekilen negatifleri geceki işlem için film laboratuarına yollanır. Negatifler bir defada laboratuvardan günlük çekim veya pozitif olarak geri döner ve akşam yönetmen, sözü geçen ekip ve bazen kast tarafından görünür.
Üretim için dijital teknolojiler kullanılır, negatif olarak göstermek için çekimler bilgisayara yüklenir ve organize edilir.
Bütün üretim evresi bittiğinde, üretim bürosu genelde tüm kasta ve ekibe teşekkür etmek için bir wrap partisi hazırlar.

Burada film kurgucu tarafından birleştirilir. Videonun modern kullanımı film yapımı işleminde filmi tamamen kullanarak veya videonun ve filmin bir karışımını kullanarak iki iş akışı seçeneğinde sonuçlanır.
Filmin iş akışında, tek-ışık filmin deneme baskısının (pozitif) mekanik kurgulama marinası ile kurgulanması için orijinal kamera filmi (negatif) kopyalanır ve açındırılır. Bir köşe kodu filmin üstünde resim çerçevelerin uygun yerine kaydedilir. Avid, Quantel veya Final Cut Pro gibi doğrusal olmayan kurgulamanın açındırma sistemlerinden beri, film iş akışı çok az üretim tarafından kullanılmıştır.
Video iş akışında, bilgisayar yazılımları ile kurgulama için orijinal film kamarası negatifleri açımlandırılır ve video haline getirilir. Zaman düzgüsü filmin üstünde videokasetin uygun yere kaydedilir. Ayrıca bu işlem boyunca üretim sesleri video resim çerçeveleri ile senkronize edilir.
Film kurgusunun ilk işi kişisel çekimlere dayanan sekanslardan (veya sahnelerden) alınmış kaba kesimleri inşa etmek olur. Kaba kesimin amacı en iyi sahneyi seçmek ve düzenlemektir. Sonraki basamak muntazam bir öyküde alınan tüm sahnelerden hazır film yaratılır. Kesilerek bir kaç dakika kadar kısa sahnelerin işleyişi veya hatta film kareleri bu evrede tamamlanır. Hazır film yönetmen ve prodüktör tarafından perdelendikten ve tasdiklendikten sonra resimler kitlenir, hiç bir değişiklik yapılmayacağı anlamına gelir. Sonra kurgucu bir negatif kesim listesinde (köşe kodu kullanarak) otomatik veya bir kurgu karar lisetesi (timecode kullanarak) elle yaratır. Bu edit listeleri kaynakları ve hazır filmdeki her çekimin resim karesini tanımlar.
Bir kere resimler kitlendikten sonra film müzik parçalarının oluşturulması için müzik bölümdeki kurgucuların ellerine geçer. Ses kayıtları senkronize edilir ve final müzik ve final müzik karışımı yaratılır. Müzik karışımı müzik efektleri, arka plan müziği, ADR, diyalog, walla ve müzik konbine edilir.
Müzik parçaları ve resimler filmin düşük kalitedeki cevap baskısında sonuçlanarak beraber kombine edilir. Orta boyutta kayda bağlı olan yüksek kalite yayınlan baskıları yaratan iki mümkün iş akışı vardır:

Film işleyişinde, kesim listesinin kararlaştırdığı filmin temelindeki cevapların çıktıları orijinal renkte negatifi kesmek ve ana kopya denilen bir renk sınıflandırması veya ara pozitif yaratmak için kullanılır. Tüm sonraki basamaklar bu etkinlikle ana kopyayı oluşturur. Sonraki basamak ilk ışık denilen negatifi veya ara negatifi yaratmaktır. Bu tiyatrosal yayın çıktısından yapılmış birçok kopyadan olur. Ara negatiften kopyalama direkt olarak ara pozitiften kopyalamadan daha kolaydır çünkü bu bir ilk ışık işlemidir; ayrıca bu, ara pozitif çıktısının üstünü aşındırıp eskimiş bir hale getirir.
Video işleyişinde, kurgu karar listenin karalaştır

Böyle riskli bir yazıyı sunmanın amacı yeni başlayanlara kısa yoldan daha iyi fotoğraflar üretmek için yardımcı olmaktır. Yazıda çeşitli internet sitelerinin yeni başlayanlara öneriler kısımlarından ve fotoğrafım e-Galerim'deki eleştirilerden yararlanılmıştır.
Fotoğraflar, şipşaklardan daha iyidir. Her ikisine de kalıp olarak fotoğraf diyebilirsiniz ama şipşak fotoğraflar çoğu izleyici için değerden yoksundur. Fotoğraf ile şipşak'ı ayıran çekme hızı değildir. Şipşak ile fotoğrafı ayıran gösterilen özendir. Bakış açısı, enstantane ve diafram değeri, kompozisyon gibi şeyler. Fotoğraf yaparken çekim aşamasında istenilen sonuca ulaşmak üzere plan yapılır, plan iyi bir fotoğraf çıkacağı umudu ile uygulamaya konulur.
Başarılı fotoğraf nedir? Başarılı fotoğrafın ne olduğu oldukça öznel bir konudur ancak başarıya giden yolda pek çok kişinin ortak görüşü istenilen ve istenilmeyen özellikler aşağıda belirtilmiştir.... Bu kurallarının tamamının uygulanmış olması iyi bir fotoğraf çıkması için yeterli değildir. Her fotoğrafçı fotoğrafı farklı çeker. Bunun için fotoğrafçının ekstradan kendinden birşeyler katması beklenecektir.
En azından başlangıçta kendinizin beğendiği, en az hata gördüğünüz fotoğraflarınızı gönderin. Değersiz gördüğünüz, belirgin hatalarını bildiğiniz fotoğraflarınızı başkaları ile paylaşmayınız. Sizin beğenmediğiniz bir şeyi başkası beğense bile size fazla bir yararı olmaz. Ayrıca gelebilecek eleştiriler kötü fotoğraflarda daha sert olabilir.

Başkalarının çalışmasının tekrarı olmadan izleyiciye yeni ve etkileyici bir görsel sunmak

İzleyici beklentisine yanıt vermek:
İzleyici beklentisi ile birebir örtüşerek sıkıcılığa düşmeden, onların beklentisinden uzaklaşıp uçuklaşmadan ortaya konan yapıtlar, izleyici ile gereken iletişimi kurmayı başarırlar. İlginçlik, sıradışılık artı değerlerdir.

Fotoğrafta Nü, Belgesel, Doğa, Digital, S/B gibi pek çok dal bulunmaktadır. Çalışmanız herhangi bir tarza dahilise o tarza ait bilgileri edinmeye çalışın. Bilgili sayılan kişiler fotoğrafınızı o çerçevede değerlendirecektir.

Ör. başlıkta hüzün deniyor ise fotoğraf izleyiciye hüznü iyi yansıtıyorsa amaca ulaşılmıştır.

Çekim bilgilerinin yazılması:
Çekim teknik bilgilerinin önceden yazılması veya istenince verilmesi, exif bilgileri varsa dosyadan silinmemesi izleyiciye fotoğraf teknik anlamda anlamada yardımcı olur.
Küçük fotonun önemi: Küçük fotoların yan yana geldiği sayfada küçük fotoğrafı cazip olanlar daha çok tıklama, daha çok izlemeye ve daha çok değerlendirmeye alınıyorlar.

Manzara fotoğrafında ufuk çizgisi veya karşı kıyı çizgisinin fotoğrafın kenarına paralel olması istenilen bir özelliktir. Bunun istisnası ufuk çizgisini belirgin şekilde diagonal kullanımıdır.

Ana konuyu merkez dışına yerleştirmek, sağında veya solunda çevreyi ikiye bölünmeden tek parça olarak daha iyi göstermeyi sağladığı gibi ana konuya daha fazla dikkat çekmeyi sağlar. İstisnalar: Ana konunun karenin büyük bir bölümünü kapladığı fotoğraflar. Simetrik fotoğraflar. Önerilen konum çerçevenin yatay ve dikey olarak 3'e bölünmesi ve ana konunun 4 kesişme noktasından birine yerleştirilmesidir.

Çerçeveyi çaprazlayan çizgiler kompozisyonu durağanlıktan çıkarmaya yardımcı olurlar.

Sadelik, ana konuyu dikkat dağıtan ve rahatsız edici unsurlardan kurtararak sunma sanatıdır. Bunun için alan derinliğini kısmak, zeminde sade fon kullanmak ve ana konu/fon oranını artırmadan yararlanılabilir.

Konulara uygun dikey veya yatay kadrajı tercih edin.Çekim esnasında her iki kadrajın tercihinde de,öncelikli olarak dikkat edeceğiniz en önemli şey, yatay ve dikey olarak bulunan (bina, kaldırım, yol, direk vd.) ve kadrajın alt/üst veya sağ/sol yana maksimum paralellikte referans oluşturmasıdır... Eğer kadrajınıza giren ve çizgisel görünüm oluşturan alanlarla merkez kompozisyonda yer alan obje  dengeli görünmezse, resminizde yamuk ve yanlış bir etki bırakacaktır...
Bunların haricinde kompozisyonun anlam bütünlüğü, kullanılacak mecra veya alan ile uyumu, eğer seri bir iş ise ışık devamlılığı da çok önemli konulardır. İnsan ve diğer canlı çekimlerinde verilmesi zorunlu olan baş boşluğu, çekilen objenin kendi baş büyüklüğü kadardır.

Netlik gözün aradığı özelliklerden biridir. Özellikle ana konunun flu, başka bir nesnenin net olduğu fotoğraflar çok rahatsız edicidir. Netsizlik fotoğrafçının ve donanımının yetersiz olduğu izlenimi uyandırabileceğinden kaçınılması gereken bir durumdur. Bilinçli kullanımlarda bunun kare içerisinde söze gerek kalmadan bir şekilde belli edilmesi gerekir.

Açık ve koyu alanlarda detay kaybı olmadan elde edilmiş yüksek kontrastdır. Bu aynı zamanda birbirinin karşığılı renkler için de kullanılan bir teknik tabirdir. Siyah ve beyaz, sarı ve kırmızı gibi...

Renkli fotoğraflarda (yapaya kaçmayan) yüksek renk doygunluğu.

Işığın iyisi fotoğrafın tadını on kat arttırır. Işık kullanımı tek cümlede anlatılmayacak şeylerden biridir.
-Ayrıca fotoğraf çekilirken güneş ışığından elimizden geldiğince yararlanmalıyız. Bazı donanımsız makinelerle çekilen fotoğraflarda Güneş ışığının arkaya alınarak çekilmesi kaliteyi oldukça artıran etkendir.-

Çerçeve fotoğraftaki anlatıma yardımcı olacak şekilde, gidecek web sayfasında etrafına belli bir alan yaratacak şekilde hazırlanırsa fotoğrafın etkisi artacaktır. Yapıt başlığı, isim, copyright bilgisi çerçeve üzerinde dikkat dağıtmadan yazılabilir.

Bunu hevesinizi kırmaktan çekinerek söylüyoruz, ama bu duyguyu ne kadar az yaratırsanız fotoğraflarınız o kadar başarılı olacak diye düşünüyoruz. Üstelik fotoğraf gibi milyarlarca üretilen bir şeyde bunu istemenin acımasızlık olduğunu da biliyoruz. İsterseniz küçük bir araştırma yapın, gönderilmiş fotoğraflara bir bakın. Bir süre sonra siz de "yine mi?" demeye başlayabilirsiniz.

Fotoğrafınızda çizikler, lekeler, kırmızı gözleri önlemeye; önlenemez ise göndermeden önce düzeltmeye çalışın.

En basit yaklaşım olduğundan fotoğraf üzerinde yeterince düşünülmemiş, basite kaçılmış hissi uyandıracaktır. Özellikle simetri söz konusu değilse daha yaratıcı çözümler aranmalıdır.

Ana konunun çerçeve içinde kapladığı alan algılamaya önemli katkı sağlar. Ana konu küçük kaldığı zaman fotoğrafçının gereken optik donanımdan yoksun olduğu veya konuya yeterince yaklaşamadığını düşündürür.

Yaygın bir hata olan ufuk çizgisinin birkaç derecelik eğrilikleri rahatsız edicidir ve puan kırdırır. Belirgin çapraz kompozisyonlar istisnadır.
Evet, fotoğrafta ufuk çizgisi önemlidir. Ancak bazı durumlarda (çapraz kompozisyon da dahil olmak üzere) anlatmak istediğiniz konu, yakaladığınız enstantane ve karenin içindeki o gerçek duygu tüm olumsuzlukları artı bir puan olarak size geri de getirebilir. Siz gerçekten fotoğrafınız için "evet, bu" diyebiliyorsanız ve hisleriniz her bakışınızda artan duygularla devam ediyorsa o zaman o fotoğraf tamamen olmuştur...

Anlaşılmayı zorlayan, anlatıma katkısı bulunmayan ekstra elemanlar fotoğrafı sıkıcı hale getirirler, önizlemede ise tıklanmaya cazip olmayan bir görüntü oluşmasına sebep olurlar.

Basık tonlar ve düşük kontrast
Az veya fazla pozlama
Hatalı beyaz dengesi, renk kaymaları
Aşırı doygun renkler
Patlak alanlar (beyaza kaçan parlama alanları)

"Görsel gürültü" olarak Türkçeleştirilebilen, aynı renk olması gereken komşu pikseller arasındaki noktasal renk farklılıkları. Düşük ASA'da (50, 64, 100) çekerek ve daha fazla ışıklandırma yapılarak azaltılabilir. Ayrıca optik yol üzerindeki kirlilikler fotoğrafa yansıyacağından bunlarda temizliğe özen gösterilmeli, objektif ve CCD kirlenmeleri önlenmelidir.

Taramanın kötüsü olur mu? Olur. Farkedilince puan kırdırır, kötü izlenim yaratır.

Belgesel fotoğrafta içeriğe müdahale istenmeyen bir özelliktir. Fotoğrafınız belgesel türden ise, mümkün olan en az müdahale ile sunulmalıdır.

Ekranda aşırı büyük ve aşırı küçük görünen fotoğraflar tepki çekerler.

Başlıksız gönderme iddialı bir tercihtir ama başlıksız ve açıklamasız fotoğraflar iletişime bir adım geriden başlar ve kolayca bilmeceye döner.

Aşırı büyük, fotoğrafa ağır basan, bol yazılı çerçeveler fotoğrafı öldürür.

Fotoğrafın içeriği izleyicinin kültürel sınırlarını zorlayınca olumsuz tepkiler almaya başlar. Çıplaklık, sigara, vs. konularda izleyicinin tepkisini önceden tahmin etmek zor olabilir.

Fransız dilini öğrenmek için ücretsiz ders kitabı Fransızca Vikikitap'a hoş geldiniz. Bu kitap hala geliştirme aşamasında olduğundan Tartışma sayfamızda bilinen sorunları/önerileri bildirebilirsiniz. Katkıda bulunmak isterseniz, özellikle de bilginiz var ise, lütfen çekinmeyiniz.

Salut!
Fransızca öğrenmek için lazım olan pek çok şeyi burada bulabilirsiniz. Bu kitapçık bittikten sonra, bilmek istediğiniz pek çok şeyi kolayca bulabileceksiniz.

Giriş
Fransız alfabesi
Cümleler

Fiiller (Français)
Zamanlar (Français)
geçmiş zaman (Français)
şimdiki zaman (Français)
gelecek zaman (Français)
Sıfatlar (Français)
İsimler (Français)
İsmin halleri (Français)
Soru sözcükleri (Français)
Zamir (Français)
Zaman (Français)
Belirtme sıfatları (Français)

Meslekler
Ülke isimleri, vatandaşlık ve diller
Artikeller (belirli ve belirsiz)
Aile bireyleri
Fiil örnekleri
Günler ve aylar
Renkler
Sayılar

Fransızca karakterler, Latin alfabesindeki harflerden meydana gelir ve yirmi altı harf vardır. Erken dönemde yirmi beş harf vardı ve on dokuzuncu yüzyılın ortalarında W harfi eklendi. Buna 'çift ve' de denmesine karşın Fransızlar v gibi kullanırlar ve onu (doo-bluh-vay) telaffuz edilen 'V'den sonra telaffuz ederler. Eski Fransızca'dan Modern Fransızca'ya geçen süreçte 'K' harfi eklenmiştir. Bu iki harf daha çok, dilde benimsenmiş yabancı kelimelerle birlikte kullanılır. Bugün kullanılan Fransız alfabesinin kullanımı 200 yıldan daha eskidir.

Alfabede yirmi altı harf mevcuttur ve basitçe ikiye ayrılır:

20 ünsüz içerir: B, C, D, F, G, H, J, K, L, M, N, P, Q, R, S, T, V, W, X, Z
6 ünlü ise şunlardır: A, E, I, O, U, Y
Bu harflere ek olarak, Fransızca birkaç aksan imi kullanır: tok aksan imleri (à, è ve ù) ve keskin aksan (é). Y (sesli harf olarak kabul edilir) hariç tüm ünlüler için bir inceltme imi geçerlidir: â, ê, î, ô, û. Bir tréma (çift nokta, Fr. dieresis) da kullanılır: ë, ï, ü, ÿ. İkili kombin harfler (bitişik imla harfleri olarak adlandırılırlar) kullanılır: æ ve œ. Son olarak, c üzerinde bir sedil kullanılır (ç şeklindedir) ve s gibi okunur (hatta yabancılar, bilinen şekiyle s olarak okumaktalar).

Wikibooks - The alphabet · L'alphabet
About.com - Fransız Alfabesi

Bu bölümde, Fransızca'ya ait fiilleri ve yapıları hakkında işleyiş şekillerini inceleyeceksiniz.

Adıl görevi yapan fiiller, zamirleri içeren fiillerdir. Bu zamirler me, te, se, nous ve vous olup, yükledikleri fiile göre ya doğrudan ya da dolaylı nesne olarak kullanılırlar. Adıl görevi yapan fiiller 'perfect tense' zamanlarında çekim yapıldığında, yardımcı fiil olarak 'être' kullanılır.
Aşağıdaki tablo, fiilin her bir biçimiyle hangi dönüşlü zamirin kullanılacağını gösterir:

Dönüşlü fiiller konuyla ilgili eylemi yansıtır.

Je me lave. - Ben "kendimi" yıkarım.
Nous nous lavons. - Biz "kendimizi" yıkıyoruz.
Ils se lavent. - Onlar "kendilerini" yıkarlar.
Dönüşlü fiiller ayrıca mastar olarak da kullanılabilir.

Je vais me laver. - Ben kendimi yıkayacağım.
Çekilmiş fiil veya mastar, her biri biraz farklı anlamlarla olumsuzlanabilir.

Je ne vais pas me laver. - Ben kendimi yıkamayacağım.
Je vais ne pas me laver. - Ben kendimi yıkamayacağım. (bir süreliğine, bir sürelik zaman diliminde)
'Perfect tense' zamanlarında, geçmiş ortaçlar, cinsiyet ve çoğullukta doğrudan nesne zamiri ile kabul edilir, ancak dolaylı nesne zamiri değildirler. Bu nedenle, yalnızca dönüşlü zamir, doğrudan nesne olduğunda uyuşur. Ayrıca, fiilden sonra giderse, 'geçmiş'in ortacının doğrudan nesne ile bağdaşmadığını unutmayın.

Elle s'est lavée. - O kendini yıkadı.
Nous nous sommes lavé(e)s. - Biz kendimizi yıkadık.
Elle s'est lavé les mains. - O ellerini yıkadı.
Nous nous sommes lavé les mains. - Biz ellerimizi yıkadık.
Bir dönüşlü fiilin bir çekiminden örnek:

1. Basit gelecek z., basit geçmiş z., kusurlu, koşullu ve dilek kiplerinin tümü, şimdiki zaman durumunda olduğu gibi aynı konumda dönüşlü zamir ile çekimlenir.
2. Tüm dönüşlü fiiller "passé composé" durumunda 'être' alır ve bu nedenle dişi sözcükler için geçmiş ortaçlara bir "e" ve çoğul için bir "s" eklenir.
3. Bir dönüşlü fiil başka bir fiilin arkasına mastar olarak konduğunda, yine de uygun bir dönüşlü zamir almaktadır. (örneğin vouloir, pouvoir, aller)

İşteş fiillerle insanlar birbirlerine eylemler gerçekleştirirler.

Nous nous aimons. - Biz birbirimizden hoşlanıyoruz.
Dönüşlü fiiller gibi, işteş fiillerin geçmiş ortaçları, fiilden önce giderse doğrudan nesne ile sayı ve cinsiyet bakımından uyuşurlar. Bu nedenle, doğrudan nesneler olarak işlev gören tüm işteş zamirler ile uyumludur.

Nous nous sommes aimé(e)s. - Biz birbirimizden hoşlandık.
Karşılıklı zamir, doğrudan nesne zamiri olmadan dolaylı bir nesne olarak da işlev görebilir.

Nous nous sommes parlé. - Biz birbirimizle konuştuk.
Elles se sont téléphoné. - Onlar birbirlerini aradılar.
Vous vous êtes écrit souvent? - Siz sık sık birbirinize mi yazdınız?

Bazı fiiller, dönüşlü veya karşılıklı bir eylem gerçekleştirmeksizin zamirdir.

Tu te souviens? - Sen hatırlıyor musun?
Perfect Tense hallerinde, bu fiiller, esas fiilden önce geçerse doğrudan nesne ile uyuşur. Aksi takdirde, 'geçmiş'in katılımcısı, konuyla hemfikirdir.

Elle s'est souvenue. - O hatırladı.
Bazı fiillerde de, zamirsel fiiller olarak farklı anlamlar içermesi görülür.

rendre - geri dön(dür)mek, geri vermek
se rendre (à) - gitmek

Fransızca'da çeşitli geçmiş zaman biçimleri ve kategorileri mevcuttur.
İlk etapta "Görülen geçmiş zaman" ile başlayacağız.

Şunları ifade etmek istediğinizde Passé Composé'yi kullanabilisiniz:

Geçmişte, bir şeylerin tamamlanmış olması;
Geçmişte, bir şeylerin belli bir miktarda yapılış olması; (bir şey devam ediyorsa 'imparfait' kullanılmalıdır)
Geçmişte, bir dizi şeyin tamamlanmış olması.

Bu zamanda, bir fiili türetmek için yardımcı fiil, şimdiki zaman belirteci ile türetilir ve daha sonra geçmiş zaman ortacı eklenir. Passé Composé'de yalnızca bir fiil olduğunu hatırlamak, önemlidir. Geçmiş ortacı, bir fiil gibi görünse de aslında öyle değildir - daha çok bir sıfat gibi işlev görür. Bunu hatırlamak önemlidir, çünkü Passé Composé'de olumsuzladığınızda, yardımcı fiil olan tek fiili olumsuzlarsınız (örnek: "Je n'ai pas mangé"; "Ben yemedim"). Bu, İngilizce'de tamamıyla aynı şekilde çalışır. Tek fiil, İngilizce'de olumsuzlanan tek şeyi gösteren yardımcı fiildir.

Passé composé, birleşik bir zamandır. İki fiilden oluşur: Yardımcı fiil ve birinin bu zamanda kullanmak istediği fiilin geçmiş ortacı.
Passé composé'yi oluşturmak için, "avoir" veya "être" yardımcı fiillerinden birini almanız ve ardından şimdiki zamandaki gibi cümlenin öznesine göre, çekimi yapmanız gerekir. Daha sonra fiilin geçmiş zamandaki eklentili halini alırız ve bunu sona yapıştırırız. Her fiilin değişmeyen bir geçmiş zaman ortacı vardır (ancak daha sonra öğrenileceği gibi bazı istisnalar da vardır).
Geçmiş zaman ortacını bulmak için mastarın kökü belirlenmeli veya düzensiz hali bilinmelidir.
İfadeyi olumsuz yapmak istiyorsak, örneğin geçmişte bir şey yapmadıysak, her zaman "ne ... pas" yapısını yardımcı fiilin etrafına, geçmiş zaman ortacından hemen önce koymalıyız. Örneğin: "Je n'ai pas joué".
Ayrıca, pek çok durumda, dönüşlü veya zamir fiiller 'être' ile çekilmelidir. Örneğin, "se réflechir" fiili birinci tekil şahısta "Je me suis réflechi(e)" ile çekimlenmektedir.

é'li fiiller, -erli fiilerin yerine geçer
i'li fiiller, -irli fiilerin yerine geçer
u'lu fiiller, -reli fiilerin yerine geçer
not: Düzensiz fiilerin ezberlenmesi gerekir.

not: Yıldızlı vous formunda, vous sadece tekil olanı belirtiyorsa, s ekinin kullanılmadığını unutmayın.  ("nous" ve "ils/elles" için ise daima eklenir.)

Participe présent, Fransızcada yan cümleleri kısaltmak için kullanılan bir fiil biçimidir. Kullanım açısından Gérondif ile benzerlikler gösterse de, farklı özne kullanımı koşulu ile birbirlerinden ayrılmaktadırlar.

Aynı Gérondif'in çekimlenişinde olduğu gibi Participe présent birinci çoğul şahsın geniş zaman kökünden elde edilir ve -ant eki ile çekimlenir. Gérondif'ten farklı olarak prepozisyona ihtiyaç duyulmadan yazılır. Participe présent herhangi bir zaman ifade etmemektedir ve bu nedenle daima içinde bulunduğu cümlede ait olduğu başka bir kelime bulunmalıdır.
Croyant que la banque était ouverte, Charlotte partait en ville.
Charlotte bankanın açık olduğuna inandığından dolayı, şehre gitti. 
Gérondif'ten farklı olarak Participe présent kullanımında iki farklı özne kullanılabilmektedir:
Mon frère Julien étant malade, je dois rester à la maison aujourd'hui.
Kardeşim Julien hasta olduğu için, bugün evde kalmak zorundayım.

Participe présent'in en önemli özelliklerinden birisi cümleleri kısatlmasıdır. Neredeyse tamamen yazı dilinde kullanılır. Participe présent ile kısaltılabilen bazı cümleler şunlardır:

Zaman bildiren yan cümleler (→quand, pendant que): Entrant dans le magasin, l'homme voit une fille voler quelque chose. (Quand il entre...)
İlgi bildiren yan cümleler (→qui): La fille souriant gentiment me plaît. (La fille qui sourit...)
Sebep bildiren yan cümleler (→parce que, comme, puisque): Ayant très peur, la fille criait. (Comme elle avait très peur...)
Cümleleri sıralama (→et): Écoutant de la musique, je fais mes devoirs. (J'écoute de la musique et je fais...)
Çelişki bildiren yan cümleler (→bien que, quoique): Je commence avec mes devoirs ayant encore faim. (Bien que j'aie encore faim...)

Fransızca dil bilgisi
Proposition participiale

Passé composé Fransızca'da geçmiş zamanı ifade ederken sıklıkla kullanılan bir zaman biçimidir. Konuşulan dilde, Fransızca'daki diğer geçmiş zaman formlarına kıyasen daha sıklıkla kullanılır. 

Passé composé geçmişte kalmış ve tamamlanmış bazı eylemleri tanımlarken kullanılır. Bu eylemlerin bittiği zaman bellidir. Bazı örnekler;

Tout à coup le camion s’est renversé "Kamyon aniden devrildi."
Ce jour-là j’ai raté le bus "Bu gün otobüsü kaçırdım."

Passé composé çekimlenirken ilk önce yardımcı fiil çekimlenir. Yardımcı fiil çoğunlukla avoir fiilidir ancak hareket bildiren bazı fiillerde être fiili de kullanılır. Çekimlenen yardımcı fiilden sonra asıl fiilin geçmiş zaman formu yazılır.

Asıl fiil olarak participe passé alınır: "-er" fiillerinin çekimlenmesinde er ekinin yetini  "-é" alır. Örneğin:

demander – demandé
parler – parlé
rester – resté
"-ir" fiillerinin çekimlenmesinde r eki düşer. Örneğin:

rougir – rougi
grandir – grandi
"-re" yahut "-oir" ile biten fiillerde, geçmiş zaman formu -u eki ile tamamlanır. Örneğin

rendre – rendu
valoir – valu
vouloir – voulu
Düzensiz fiillerin geçmiş zaman formu kuralsızdır.

acquérir – aquis (almak)
avoir – eu (sahip olmak)
boire – bu (içmek)
connaître – connu (bilmek - tanımak)
courir – couru (koşmak)
croire – cru (inanmak)
devoir – dû (zorunda olmak)
dire – dit (söylemek)
écrire – écrit (yazmak)
être – été (olmak)
faire – fait (yapmak)
fuir – fui (uçmak)
joindre – joint (eklemek)
lire – lu (okumak)
mettre – mis (koymak)
mourir – mort (ölmek)
naître – né (doğmak)
peindre – peint (resmetmek, boyamak)
plaire – plu (düşmek)
pouvoir – pu (-ebilmek)
prendre – pris (almak)
recevoir – reçu (almak)
résoudre – résolu (karar vermek)
rire – ri (gülmek)
savoir – su (bilmek)
suivre – suivi (takip etmek)
vaincre – vaincu (yenmek)
valoir – valu (geçerli olmak)
venir – venu (gelmek)
vivre – vécu (yaşamak)
voir – vu (görmek)

Subjonctif Fransız dilinde genellikle yan cümlelerin yapımında kullanılan bir çeşit kip. İspanyolcadaki subjuntivo ile benzerlikler gösterir. Romen dillerinde de buna benzer bir kullanım vardır. Örneğin İtalyancada congiuntivo yahut Portekizcede subjuntivo o conjuntivo. Çoğunlukla diğer dillere çevrilirken farklı yöntemler uygulanır. Fransızcada 4 farklı subjonktif bulunsa da, bunlardan présent (Subjonctif I) ve passé composé (Subjonctif II) daha sık kullanılan versiyonlardır. Buna karşın Subjonctif imparfait ve Subjonctif plus-que-parfait günümüz Fransızcasında yalnızca edebi değeri yüksek metinlerde karşılaşılır. Geniş zaman ifade ederken kullanılan Subjonktiv, Fransızca da belirli sinyal kelimeleri sonucu kullanılır.

Subjonctiflerin çekimlenmesi düzenli fiiller ve düzensiz fiiler arasında farklılıklar gösterir.

Düzenli fiiller, üçüncü çoğul şahıs, geniş zaman indikatifine (présent de l’indicatif) subjonctif eklerinin eklenmesi ile çekimlenirler. Dikkat edilmesi gereken önemli noktalardan birisi, birinci ve ikinci çoğul şahsın çekimlenmesi Imparfait ile aynı olduğundan, burada birinci çoğul şahıs kullanılır.
Subjonctif ekleri şunlardır: -e, -es, -e, -ions, -iez, -ent

Birçok fiil çoğul için aynı köke sahip olduklarından dolayı, Subjonctif genellikle présent ile benzerlik gösterir. -er, -ir ve -dre ekleri ile biten fillerde bu durumu gözlemek mümkündür. 

Subjonctifin çekimlenmesinde toplam 7 adet düzensiz fiil bulunmaktadır:

Bunların dışında aşağıdaki fiillerin formlarına dikkat etmek gerekir.

il faut → qu’il faille (falloir)
il pleut → qu’il pleuve (pleuvoir)
il vaut → qu’il vaille (valoir)

Subjonctif'in passé composé çekimlemesi, geçmiş zaman kullanımları içerisinde en yaygın olan kullanımdır.

Ekler şunlardır: -sse, -sses, -^t, --ssions, -ssiez, -ssent

Subjonctifin ne zaman kullanılacağı belirli sinyal kelimelerince belirlenir. Fransızcayı yabancı dil olarak öğrenenlerin zorlandığı bir konudur. Genel olarak subjonctifin kişisel izlenimler içeren ifadelerden sonra kullanıldığı söylenebilir.
Toplamda 4 çeşit sinyal grubu sayılabilir:

verbes de volonté "İstek bildiren fiiller"
verbes de sentiments "Duygu belirten fiiller"
verbes de la balance "Eşitlik fiilleri"
Belirli kullanımlar

vouloir "istemek"
attendre "beklemek"
proposer "önermek"
Örnek: Je veux que tu finisses "Durmanı istiyorum."

admirer que "hayranlık duymak"
regretter que "pişman olmak, esef etmek"
être heureux que "bir şeyden dolayı mutlu olmak"
il est bien/ bon que "bir şeyin iyi olması"
cela m’amuse que "bir şeyin keyif vermesi"
Örnek: Je regrette que tu ne saches rien "Bir şey bilmemene esef ediyorum."
İstisna: espérer „ummak“ fiili, eğer sorunun cevabı olumlanıyorsa, subjonctif kullanımını gerektirmez.
Örnek: J’espère que tu as écrit à Catherine.
Olumsuzlanan haliyle ummak fiili subjonctif ile kullanılır.
Örnek: J'espère qu'il ne pleuve pas.

Subjonctif kullanımı konusunda en zor belirlenen fiiller grubu eşitlik bildiren fiillerdir. Bunun sebebi bu fiillerin bazı durumlarda indikatif kullanımı ile de ifade edilebilir olmalarıdır. Subjonctifin kullanımı tamamıyla bağlama bağlıdır. En çok kullanılan fiillere örnek olarak penser, croire, être sûr verilebilir.
Temel olarak ifade edilen cümlenin içeriğinde eminlik varsa indikatif, şüphe ağır basıyorsa subjonctif kullanılmalıdır.
Örnekler:

Je pense que le père est malade.
Je ne pense pas que le père soit malade. (Ben babanın hasta olduğuna inanmıyorum ama bundan yüzde yüz emin değilim.)
Je ne pense pas que le père est vraiment malade.

Aşağıda listelenen yan cümle kullanımları subjonctif ile kullanılmak zorundadır.

afin que
avant que
bien que
jusqu’à ce que
pour que
pourvu que
quoique
sans que
à condition que
à moins que
à supposer que
de manière à ce que
en attendant que

Carolina Spiegel: Subjuntivo versus Subjonctif - eine vergleichende Betrachtung des Spanischen mit dem Französischen. LMU München Institut für Romanische Philologie, Sommersemester 2009, Hauptseminar Tempus-Modus-Aspekt, Barbara Schäfer-Prieß, 1. Juli 2009Şablon:Ölü bağlantı
Mario Wandruszka:  Über die Bedeutung des romanischen Konjunktivs und die Geburt des Nebensatzes. Zeitschrift für romanische Philologie (2000) 116: 56-71Şablon:Webarşiv
Karin Fürpaß: Der dubitative Konjunktiv im Italienischen und Französischen. Ein Vergleich anhand der gesprochenen Sprache. Diplomarbeit, Karl-Franzens-Universität Graz, Graz 2009, S. 3–18

Fransızca'da tüm isimlerin cinsiyeti vardır; (ya eril (e.) ya da dişil (d.) olarak)
İnsanları ve de hayvanları ifade eden isimlerin çoğu ise hem eril hem de dişil şekle sahiptir. Örneğin, Fransızca'da "oyuncu" için kullanılan iki kelime l'acteur ve l'actrice 'dir. "Kedi" için iki kelime le chat (e.) ve la chatte (d.).
Ancak, bir kişinin veya bir hayvanın gerçek cinsiyetinden bağımsız olarak, cinsiyeti sabit olan, insanlar veya hayvanlar hakkında okunan bazı isimler vardır: Örneğin, la personne (d.) amcanız hakkında kullanılırken (bu tabi ki amca sözcüğünün yerini tutmamakla birlikte) bile her zaman dişildir! Le professeur (e.) (Eğitmen), kadın profesör veya öğretmeniniz ile ilgili cümlede bahsederken bile her zaman erildir. Bu durum Fransızca'da önemlidir.

Fransızca'da çoğul olarak kullanıldığında cinsiyetin değiştiği üç ad vardır:

amour
orgue
délice
Bundan başka, Fransızca'da yalnızca öğrenilebilen cinslik kurallarının pek çok istisnası vardır. Yazılışları aynı ama eril veya dişil olduğunda farklı anlamlara gelen kelimeler bile vardır; örneğin, 'le livre', 'kitap' anlamına gelir, ama 'la livre', 'ağırlık' anlamına gelir. Eril görünen bazı kelimeler ('le photo' gibi) aslında dişildir. Ve tam tersi de.. O halde, sadece mantıklı olmayanlar var; 'la foi' dişi ve inanç anlamına gelirken, 'le foie' karaciğer anlamına gelir.

Önsöz
Giriş
Yükleme
İlk Adımlar
Faydalı
Yorumlar
Görevler
Merhaba Dünya

Matematikler
İstatistik
Gambas'ta Grafikler
Gambas'ta Renklerin Kullanımı
Mouse Programlama
Gambas/Çıktı
Gambas'ta Yazı Çalışmaları
Taşıma Panosu
Zaman ve Tarih
Gambas'ta Ses
Gambas Araç Kutusu
Gridview
Standart Diyoloklar
Açıklamalı Örneklerde Gambas Yapısını Oluşturma
Basit Bir text editor

Değişken Deklarasyonu, Boyutlandırma
Dallandırmalar: If then , Select case
Döngüler: For to , For each , do until
Diziler
Yazı Dosyası string Arama ve Yerleştirme
Eğer Bir Dosya veya Dizin Mevcutsa Kontrol Edilip Doğru veya Yanlış Bilgisi Geri Döndürme

Gambas'ta Ön Tanımlı Sabitler
Gambas Komut Listesi
Gambas'a Yeni Bileşenler Ekleme
Gambas ve VB Arasındaki Farklar
Hata Mesajları
Gambas Öğrenmenin Zorlukları
Sorular
Gambas Bağlantıları

Gambas geri dön

See also: http://www.binara.com/gambas-wiki/bin/view/Gambas/GambasWeblinks

http://gambas.sourceforge.net/
Gambas Ana Sitesi
http://www.gambas.it
İtalyan Gambas Sitesi
http://www.gambas-ir.com
İran Gambas Site
http://www.gambasdoc.org/help/
Bütün Komutlar
http://slashdot.org/article.pl?sid=04/10/26/142212
Slashdot has recognized Gambas
http://web.archive.org/20091027115248/geocities.com/arjun_jain/resources/gambas-paper.pdf
Gambas'ı VB ile Karşılaştırma
http://wiki.gnulinex.org/gambas
İspanyolca Birkaç Örnek Program
http://sourceforge.net/mailarchive/forum.php?forum=gambas-user
Forum
http://www.kudla.org/ an activist
http://gambas.magic-systems.net/ programs an Code in exchange
http://www.devchannel.org/devtoolschannel/04/02/02/1932209.shtml
http://groups.yahoo.com/subscribe/GAMBas-it
The italian Mailing list and support

Gambas

Gambas, işlevselliği geliştirilmekte olan Visual Basic'in kullanım rahatlığını taklit ederek çalışmakta olan Linux için programlama dilidir. Bununla beraber Gambas kaynak kodları Visual Basic ile uyuşmamaktadır. Gambas nesne yönelimli ekler ile bir BASIC yorumcusudur.
GNU temelli VB bilgisini kullanmak isteyen Linux kullanıcıları için Gambas iyi bir seçim olmaktadır.
Gambas Qt araçlarını kullanarak çok kolay Linux GUI programlarını yapmaktadır.(Gambas IDE, Gambas'ın kendisiyle yazılmaktadır.) Gambas'ın Windows versiyonu vardır ancak Cygwin ortamı altında çalışmaktadır. Grafiksel uygulamalar Windows versiyonu altında henüz çalışmamaktadır.(01.02.2009 çevirisi)
Benoît Minisini tarafından Paris'te 1999'dan beri geliştirilmektedir. Gambas GNU genel yayın lisansı altında yayınlanmaktadır. Şimdiki versiyonu 2.11.1'tür (17 Şubat 2005).
'Gambas', Gambas almost means basic sözcüklerinin baş harflerinde oluşan bir sözcüktür (Gambas İspanyolca'da karides demektir.)

Gambas ile rahat rahat:

Linux KDE çözümleri geliştirebilirsiniz. Yeni bir projeye başladığınızda "grafiksel uygulama" kullanımında herhangi bir ortam için çözüm oluşturabilirsiniz. Dikkat edilmesi gereken husus olarak son kullanıcının kullanmakta olduğu Çalışılan geçerli Masaüstü ortamı Gnome, KDE ...vs program kendisini otomatik olarak adapte olacaktır.
DCOP ile KDE uygulamaları geliştirebilirsiniz.
Diğer dillerden programlarınıza çeviriler yapabilirsiniz.
Linux altında Visual Basic programlarını sunabilirsiniz.
Network çözümleri oluşturabilirsiniz.
MySQL veya PostgreSQL gibi veritabanlarını kullanabilirsiniz.

"This project aims at making a graphical development environment based on a Basic interpreter, so that we have a language like Visual Basic under Linux."
"If you pass the responsibilty for the pc operating system only to one company , then this is just the same, as if you would sell the abc or the integers to this company."
"Still, this Qt-based software is one of the most advanced open source RAD tools available. It is nearly complete and very usable and stable. Benoit's goal is to avoid the development failures of Microsoft Visual Basic. The modern concept of Gambas is available as a graphic at the Web site. Gambas is translated into many languages. To run Gambas applications you need the Gambas interpreter component installed on the user machine."
Slashdot: Gambas 1.0 Release Candidate Available raindog2 writes "After two and a half years of development, Gambas has become the first Visual Basic-style environment for Linux to enter release candidate status. Anyone who has been frustrated by a lack of production-quality free RAD environments should give it a try."

Her programlama kitabı "Merhaba Dünya" programı ile başlar.
Every programming book should start out with a "Hello World" program, just to get you started. This book's author sees no reason not to follow this "standard" so we will do just that.

Gambas'ı çalıştırın.
Bu ekran sizi karşılayacak:

Daha sonra aşağıda tarif edilen adımları takip edin:
"New Project"'i tıklayın:
"Next"'i tıklayın:
"Create a graphical project"i seçin:
"Next"i tıklayın:
"Select the name of the project"e Hello_World girin
"Select the title of the project"e Hello World girin
Projeyi oluşturmak için "Ok"i tıklayın

Ok, now we should have gambas started with a fresh, new project. You are now looking at the Gambas GUI, which is where we will do all our Gambas work. When you look at the interface, it seems pretty useless; No windows, No buttons or what have you. Let's change that right away. 
On your left side, you'll see a tree view, right click on the Forms folder, and choose "New --> Form"(the --> indicates that you choose New, and follow the   submenu to Form).
In the Create form dialog, just click "Ok".
As you noticed, quite a few things happend. A new Form(Window) was created, and some other new things showed up. /*NOTE*/In gambas "Windows is called "Forms" and I will use the term Form(s)in the rest of the book.
The grey Form that just got created looks a bit ugly(tiny dots all over the place) but don't worry about that. The dots are there for your aid in placing your objects in the Form.
To your right you should see the "ToolBox". That's where you can choose what objects you want in your form. In our "Hello World" program, we'll need one label(marked as "A" in the toolbox) and one button(marked as "Ok" in the toolbox). Let's start with the label. Click on the label in the toolbox, and move the the new form. In the form, hold down the left mouse button, and "draw" the label on there. Once done, you will have a label in your form with the text "Label1" in it. Now you can change this text with the "Hello Word" phrase.
The next step is to put some code in the Ok Button (you must chage the text to "OK" of this button as you changed in the Label). After changing the text please double click the button so we can enter the exit code in the event click of this button. Type QUIT in the click event and that's all you've created your Hello World Application
index

Gambas geri dön
Bilgisayar programlamaya ilk başladığımda C64'te Basic yorumcusunu kullandım. Sonra MS Dos ve GWBasic/Qbasic'e geçtim. Sonraki adımda Visual Basic 3'tü. Aynı sıralarda internet kullanıma geçti. Böylelikle internete mini VB programlarımın hepsini koydum. bu bana ve başkaları için çok yararlı oldu. Birçok mavi ekrandan dolayı MS'tu bıraktım. Linux ve KDE benim favorimlerim oldular ve hala öyleler.
Fakat daima Linux ve KDE için VB özlemişimdir. Benim eski aklım C++ veya Java kullanımını alamadı.
2003 Noel zamanında, Mr. Minisini ve arkadaşları tarafından yapılan Gambas'ı keşfettim. 
Böylelikle mini VB programlarımın hepsini Gambas'a çevirmeye başladım.
Bence, Gambas çok başarılı olacaktır. Onu ilerletmek için, Vikikitap gibi GNU lisans altında mini programlarımın hepsini yayınlayacağım.
Herkesi, kötü ingilizcemmi geliştirmeye ve bu kitabu geliştirmeye davet ediyorum.
rhoe in January 2005 
de:Benutzer:Rho
Türkiyemin geri kalmaması adına çevirmeye başladığım bu kitabın herkese faydalı olmasını dilerim. Benim gibi VB kullanıcıları için linux'te bildiğim bir programlama dilini kullanarak program yazmak isteyenler için yardımcı olacak bir kitaptır. Linux, MS gibi virüse boğulmamış olması sebebiyle herkese tavsiye ederim.
VB bilgisi olanların katkıları ile çok güzel bir kitap olacaktır. Bu kitabı hep beraber geliştirelim ve önemli kaynakları Türkçeleştirelim.

Bu bölümde "Sprite" kavramının ne olduğunu göreceğiz.
GameMaker Studio 2'yi açalım ve sol üstteki "New" butonuna tıklayalım.Bir sayfa açılacak.O sayfada soldaki "Blank Project" kısmını seçelim.Sağdaki kodlama seçeneğini "DnD" yapalım.Sağ altta isim verelim (ben "Ders1" diye isimlendiriyorum.) ve onun altındaki seçeneği tıklayarak kaydedeceğimiz yeri belirliyelim.
Ayarlar bittiyse , "Let's Go!" butonuna basalım ve projeyi başlatalım.Karşımızda böyle bir görsel olmalı:

Sprite, oyuncu, düşman, altın vb. oyun içi nesnelerin (object) kostümleridir.Anlamamış olabilirsiniz , yani object'ler için kullandğımız görünümlerdir.Object'ler ise oyun içi nesnelerin ta kendisidir (ileriki bölümlerde göreceksiniz).

Sağdaki pencereyi gördünüz mü? Bu pencere Assets penceresidir.Burada oyunumuzda olan her şey gözükür.İşte buradan sprite oluşturacağız.Oradaki "Sprites" klasörünün üstüne sağ tıklayalım.Bir pencere göreceksiniz.O pencereden "Create" seçeneğini seçin.Sonra ki pencereden de "Sprite" seçeneğini seçin.Artık bir sprite'a sahibiz.Karşınıza da bir pencere çıkacak ve "Assets" penceresinde de göreceksiniz.

Yeni açılan pencerede, sol üstte "Name" kısmını göreceksiniz (ben "spr_GulenYuz" diyorum çünkü gülen bir yüz olacak).Onun altında iki seçenek var:

Edit Image:Sprite'ı kendi elinizle çizersiniz.
Import:Sprite'ı dosyalarınızdan yüklersiniz.
Edit Image diyelim.Yine bir pencere açılacak (ne çok pencere açıldı).Bu pencere ile kendiniz çizebilirsiniz.

Ge'ez, Eritre ve Kuzey Etiyopya'da konuşulmuş eski bir Sami dili.

አገር (hagar): şehir / አህጉር (’ahgur): şehirler
ንጉሥ (nəguś): kral / ነገሥት (nagaśt): krallar
ቤት (bēt): ev / አብያት (’abyāt): evler
ደብር (dabr): dağ / አድባር (’adbār): dağlar
ነቢይ (nabiy): peygamber / ነቢያት (nabiyāt): peygamberler
ገብር (gabr): hizmetçi / አግብርት (’agbərt): hizmetçiler
ብእሲ (bə’si): adam / ሰብእ (sab’): insanlar
ብእሲት (bə’sit): kadın / አንስት (’anəst): kadınlar
ሐመር (ḥamar): gemi, tekne / አሕማር (’aḥmār): tekneler
መሠግር (maśaggər): balıkçı / መሠግራን (maśaggərān): balıkçılar
ሊቅ (liq): yaşlı, büyük / ሊቃን (liqān): yaşlılar, büyükler
ንግሥት (nəgəśt): kraliçe / ንግሥታት (nəgəśtāt): kraliçeler
ገዳም (gadām): ıssız yer, yabani hayat / ገዳማት (gadāmāt): ıssızlıklar
እድ (’əd): el / እደው (’ədaw): eller
ዕፅ (‛əḍ): ağaç, odun / ዕፀው (‛əḍaw): ağaçlar, odunlar
ዕድ (‛əd): erkek / ዕደው (‛ədaw): erkekler
አፍ (’af): ağız / አፈው (’afaw) ağızlar
አብ(’ab): baba / አበው (’abaw): babalar
እኊ(’əxw): kardeş / አኀው (’axaw): kardeşler
ሕዝብ (ḥəzb): halk, millet / አሕዛብ (’aḥzāb) insanlar
ደቂቅ (daqiq): çocuklar
ነቢይ (nabiy): peygamber / ነቢያት (nabiyāt): peygamberler
ሕዝብ (ḥəzb): halk / አሕዛብ (’aḥzāb): insanlar
ቤተ፡ንጉሥ (bēta nəguś): saray
ሰማይ (samāy): gökyüzü
ጽባሕ (ṣəbāḥ), çoğulu ጽባሓት (-āt): sabah, doğu
ምሴት (məsēt), çoğulu ምሴታት (-āt): akşam, seher
ወይን (wayn), çoğulu አውያን (’awyān): şarap.
ዐጸድ (‛aṣad), çoğulu አዕጻድ (’a‛ṣād), ዐጸዳት -(āt): sınırlandırılmış alanlar, tarla, köy, bahçe, avlu
ሌሊት (lēlit), çoğulu ለያልይ layāləy: gece, ሌሊተ (lēlita) ya da  (ba-lēlit): geceleyin
እኍ (’əxw): erkek kardeş, çoğulu አኀው (’axaw) erkek kardeşler
እኅት (’əxt): kız kardeş, çoğulu አኃት (’axāt) kız kardeşler
ምድር (mədr), çoğulu ምድራት (mədrāt) ya da አምዳር (’amdār): dünya, toprak, yer, ülke
ምድረ፡ጽባሕ፡ (mədra ṣəbāḥ): doğu ülkesi
አርዌ፡ ምድር፡ (’arwē mədr): bir yılan
ብሔር (bəḥēr), çoğulu በሓውርት (baḥāwərt): bölge, il
ብሔረ፡ጽባሕ፡ (bəḥēra ṣəbāḥ): doğu bölgesi
ወንጌል (wangēl): incil
ሞት (mot): ölüm
ክርስቲያን (Kərəstiyān): Hristiyanlar
ቤተ፡ክርስቲያን፡ (bēta Kərəstiyān), çoğulu ቤተ፡ ክርስቲያናት፡ (bēta Kərəstiyānāt) ya da አብያተ፡ክርስቲያናት፡ (’abyāta Kərəstiyānāt): Kilise
ዕለት (‛əlat), çoğulu ዕለታት (-āt): gün, zaman
ኵሎ፡ዕለተ፡ (kwəllo ‛əlata): her gün
መዓልት (ma‛ālt), çoğulu መዋዕል (mawā‛əl): gündüz
መዓልተ (ma‛ālta): gündüzün
አሚር (’amir): gün (sadece yerleşmiş ifadelerde kullanılmaktadır, örneğin እም (እስከ)፡ውእቱ (ይእቲ)፡አሚር፡ (’əm-/’əska wə’ətu/yə’əti ’amir) o güne kadar, değin
እተ (ይእተ)፡አሚረ፡ (wə’əta/yə’əta ’amira): o gün geldiğinde, o günde
ኵሎ፡ አሚረ፡ (kwəllo ’amira): her gün, bütün gün

ነበረ (nabara): oturmak, kalmak, devam etmek, yaşamak
ወረደ (warada): inmek, aşağıya ilerlemek
ዐርገ (‛arga): yukarı çıkmak, tırmanmak
ሖረ (ḥora): gitmek
መጽአ (maṣ’a): gelmek
ወፅአ (waḍ’a): ortaya çıkmak, meydana gelmek
ቦአ (bo’a): girmek
ወድቀ (wadqa): düşmek, yıkılmak
ሮጸ(roṣa): koşmak
ጐየ (gwayya): kaçmak
ገብአ (gab’a): geri dönmek
በጽሐ (baṣḥa): varmak, ulaşmak
ርእየ (rə’ya): görmek
ሐነጸ (ḥanaṣa): inşa etmek
ቀተለ (qatala): öldürmek
ረከበ (rakaba): bulmak, elde etmek
ሰደደ (sadada): takip etmek, sürgüne göndermek, yasaklamak, boşamak
ተከለ (takala): ekmek
ኮነ (kona): olmak, genellikle bir yüklemcil isim ile birlikte kullanılır. (Örnek: ኮነ፡ካህነ (kona kāhəna): O bir rahip oldu.)
ኮነ፡ሌሊት (ሌሊተ) (kona lēlit(a)): gece oldu. ኮነ፡በረድ (በረደ) (kona barad(a)): dolu yağdı.
ሤጠ (śēṭa): satmak
ገብረ (gabra): çalışmak, işlemek, üretmek
ሰከበ (sakaba): yatmak
ሞተ (mota): ölmek
ሰበከ (sabaka): vaaz vermek
ሐዘነ (ḥazana): hüzünlenmek
ቀርበ (qarba): yaklaşmak (xaba, wəsta, la-)
ኀለፈ (xalafa): geçmek (’ənta, ’ənta xaba) bir şeyin arasında geçmek (’ənta wəsta ya da ’ənta mā’kala), uzağına geçmek, uzaklaşmak, yok olmak (’əm-, ’əm-xaba);
በከየ (bakaya): ağlamak (diba, lā‛la, ba’ənta).

ህየ (həyya) / በህየ (ba-həyya): şuraya
እምህየ (’əm-həyya): şuradan, şundan, bu yüzden
ዝየ (zəyya) / በዝየ (ba-zəyya): burada
እምዝየ (’əm-zəyya): buradan, bundan, bu yüzden.
ምስለ (məsla): birlikte, beraberinde
እንተ’(ənta): aracılığıyla, vasıtasıyla
ታሕተ (tāḥta): altında, aşağısında
እምዝ (’əmzə): sonra, bunun üzerine
ድኅረ (dəxra) ya da በድኅረ (ba-dəxra): arkasında
እምድኅረ (’əm-dəxra): arkadan, zamansal anlamda arkadan
እምድኅረ (’əm-dəxra): sonra
ድኅረ (dəxra) ya da እምድኅረዝ (’əm-dəxra-zə): sonradan
ለ (la-): -e, için (yönelme anlamı veren bir ek)
በእንተ (ba-’ənta): hakkında, adına, için, በእንተ፡ምንት፡ (ba’ənta mənt): Niçin? በእንተዝ (ba’ənta-zə): Bunun için, bu yüzden
ማእከለ (mā’kala) ya da በማእከለ (ba-mā’kala): ortasında, እምማእከለ (’əm-mā’kala): ortasından
እስከ (əska): -e kadar, -e değin.
ላዕለ (lā‛la): üzerine, akabinde (diba ile eş anlamlı olarak da kullanılmakta)
ቅድመ (qədma) ya da በቅድመ ba-qədma: önce (mekansal anlamda), huzurunda
እምቅድመ (’əm-qədma): önünde, huzurundan, önce (zamansal anlamda) ቅድመ (qədma): önceden

GESTALT KURAMI
Gestalt kuramına göre; bütün, parçaların toplamından farklı bir anlam ifade eder ve birey, bütünü parçalarına ayrıştırarak değil, bütünlük içinde algılar. Gestaltçılar, organizmanın, dışarıdan gelen duyumlara kendisinden bir şeyler katarak, yaşantıyı yeniden örgütlediğini savunurlar. Wertheimer belli uyarıcıların nasıl gruplanacağını, nasıl yapılandırılacağını ya da yorumlanacağını belirleyen uyarıcı değişkenleri tanımlamıştır. Bir objenin değişik koşullar altında aynı biçimde algılanmasına algısal değişmezlik adı verilir. Uzaktaki bir ağacı küçük, yakındakini büyük görmemiz gerekirken, ağaç deyince her daim aynı şekilde algılanır. 
1.Algının temel özellikleri
Gestalt yaklaşımına göre algılama zihinde oluşan bir süreçtir. Çevreden gelen uyarıcılar duyu organlarını uyarır ve bu şekilde meydana gelen sinir akımı beyne ulaştığında duyum ile birlikte algılama meydana gelir. Gestalt psikologları yaşantı ve beyin etkileşimine ilişkin farklı ve birbirini bütünleyen teoriler geliştirmişlerdir.
1.1	Algıda değişmezlik
Bir kez algılanan nesnelerin şekilleri, renkleri, büyüklükleri değiştiği halde, organizma o nesneleri hep aynı biçimde algılar. Nesneleri değişik ortam ve şartlarda yine aynı şekilde algılama eğilimine algıda değişmezlik denir.
1.2	Algıda seçicilik
Algı bir seçim sürecidir. Seçici dikkat sürecinde dış dünyada olup bitenler uyarıcılar aracılığı ile algılanır. Ancak bu uyarıcıların özelliklerine göre dikkat çekmesi ve algılanması farklıdır. Uyarıcının renkli, hareketli veya ışıklı olması hemen dikkatimizi çeker, örneğin ışıltılı reklam panoları, yüksek volümlü müzikler buna örnek gösterebilir. Ayrıca kişinin ilgi alanı da algıda seçicilik oluşturmaktadır ( aç olan birisinin yemek kokusunu algılaması gibi ).
1.3 Algısal örgütlenme
1. Şekil – Zemin İlişkisi
Nöronal algı şebekelerine göre, normal şartlar altında, bireyin dikkati şekil üstünde odaklanır; zemin ise şeklin gerisinde, algı alanına girmez. Ancak bazı durumlarda, şekil ve zeminin birbirleriyle yer değiştirdiği, hangisinin şekil, hangisinin zemin olduğuna karar verilemediği durumlar ortaya çıkabilir.
2. Yakınlık İlkesi
Organizma, bir alandaki öğeleri, nesneleri birbirlerine olan yakınlıklarına göre gruplandırarak, algılama eğilimindedir. İşitsel uyarıcıların gruplanarak algılanması ise, zamansal olarak birbirlerine olan yakınlıklarına göre gerçekleşir.
3. Benzerlik İlkesi
Şekil, renk, doku, cinsiyet vb. pek çok özellik bakımından birbirine benzer maddeler birlikte gruplanarak algılanma eğilimindedir. Benzerlik faktörü görsel uyarıcıların algılanmasında olduğu kadar, işitsel uyarıcıların algılanmasında da önem taşır.
4. Tamamlama İlkesi
Organizma, tamamlanmamış etkinlikleri, şekilleri, sesleri tamamlayarak algılama eğilimindedir. Organizma, bütünlük oluşturan simetrik şekillere, özetle sağlam bir Gestalt’a ulaşmayı hedefler.
5. Devamlılık (Süreklilik) İlkesi
Algı alanında bulunan ve aynı yönde giden birimler birbiriyle ilişkili görünme eğilimindedirler. Bu eğilim süreklilik olarak isimlendirilir. Şekilde yer alan resim 1’i 1a ve 1b’den oluşan bir şekil olarak değil iki çizgiden oluşan bir şekil olarak algılarsınız.
6. Basitlik İlkesi
Organizma, basit ve düzenli bir şekilde organize edilmiş şekilleri algılama eğilimine sahiptir.
1.4 Derinlik Algısı
Gestalt yaklaşımına göre yaşam boyunca edinilen yaşantılar iz sistemlerini oluştururlar. Geçmişte oluşturulan iz sistemleri daha sonraki yaşantıları ve algılamaları da etkiler. 
Bellekte iz bırakan algılar anımsanır. Bu izler bellek izi olarak isimlendirilir. Sonraki benzer yaşantılar bellek izini tetikler ve onlarla birlikte yeni bir yaşantıya ve yeni bir bellek izine dönüşür. Dolayısıyla sonraki tüm yaşantılar bellekte var olan önceki tüm yaşantılarla anlam kazanır.
1.İçgörüsel (Kavrayarak veya Seziş Yoluyla) Öğrenme
Anı kavrama yoluyla öğrenme de denilen içgörü (insight) yoluyla öğrenmenin başta gelen savunucusu Wolfgang Köhler’dir. Köhler’in bu alandaki en meşhur deneylerinden bir tanesi tavuklar üzerinde odaklaşmıştır. Bu öğrenmede birey problemin çözümü için bütün yolları düşünür. Problemin çözümü için uygun yolu bulduğunda konuyla ilgili içgörü kazanmış olur.
2.Yaratıcı Düşünme
Yaratıcı düşünme ile Gestalt yaklaşımının öncülerinden Wertheimer ilgilenmiş ve bu alanda kitap (Productive Thinking) yazmıştır. Wertheimer bu kitabında iki tür problem çözmeden bahsetmektedir. Bunlardan A türü çözümler, Gestalt ilkelerine dayalıdır, orjinaldir, içgörüseldir. Başka bir deyişle, problemin doğasını, temel yapısını anlamayı gerektirir. Çözüm başkası tarafından değil bireyin kendisi tarafından bulunur. Kolay genellenir ve uzun süre hatırlanır. B türü çözümler ise anlamadan çok ezberlemeye dönüktür. Birey olguları, kuralları, olayları anlamadan ezberler. Böyle bir öğrenme ise katıdır ve kolayca unutulur, sadece sınırlı durumlarda uygulanabilir. 
Dolayısıyla yaratıcı düşünmede anlamaya dayalı öğrenme söz konusudur. Transfer edilebilir ve uzun süre hatırlanabilir. Bu süreçte dışsal pekiştireç yoktur, içsel pekiştireç söz konusudur.

Orkun Yazıtlarında 4 ünlü tamga vardır. Hem ince hem de kalın olarak kullanıldıklarından bir tamga iki ses verir, dolayısıyla 8 ünlüye karşılık gelirler.
a : Sözcük başında uza ilk seslenişte sessiz tamgadan sonra yazılmaz. Sözcüğün ikinci, üçüncü sözcüklerinde yer almaz. Sözcük sonunda kullanılır.
i : Sözcük başında yazılır. Ancak ikinci, üçüncü seslenişlerde kullanılmaz. İlk seslenişte Q uza c tamgalarından önce yazılmaz. İç seslenişlerde de bu tamgalardan önce yazılmaz. Sözcük sonunda kullanılabilir. İlk seslenişte “o, u, ö, ü” varsa ikinci ve sonraki seslenişlerde yazılır.
o : Sözcük başında kullanılabilir. Ancak q tamgasından önce kullanılmaz. “Ko-Ku” sesi verilmesi istenirse q tamgasının sonuna eklenir. İlk seslenişte “o, u” varsa sonraki seslenişlerde “o, u” yazmaya gerek yoktur. Ama ilk seslenişte ayrı bir sesli varsa iç seslenişlerde o, u yazmaya gerek vardır.
“u” tamgası olarak sözcük sonuna yazılabilir.
ü : Sözcük başında kullanılabilir. Ancak X tamgasından önce kullanılmaz. “Kö-Kü” sesi verilmesi istenirse X tamgasının sonuna eklenir. İlk seslenişte “ö, ü” varsa sonraki seslenişlerde “ö, ü” yazmaya gerek yoktur. Ama ilk seslenişte ayrı bir sesli varsa iç seslemlerde “ö, ü yazmaya gerek vardır.
“ü” tamgası olarak sözcük sonuna yazılabilir.

Köktürük (Göktürk) Yazıtları; Türklerin bilinen ilk yazılı belgeleridir. Orkun ırmağı yanında bulunduğu için Orkun Yazıtları adı ile de anılır.
1893 yılında Danimarkalı dilbilimci Vilhelm Ludvig Peter Tomsen tarafından, Rus Türklük bilimcisi Vasili Vasilyeviç Radlof'un yardımıyla çözülmüş ve aynı yılın 15 Aralık günü “Danimarka Kağanlık Bilimler Akademisi'nde” bilim acununa açıklanmıştır.

Arapça gibi sağdan sola yazılır.
Lâtin tamgalarında olduğu gibi büyük, küçük tamga ayırımı yoktur.
Sözcükler arasına boşluk konmaz; ayırmak için “:” imi kullanılır. Aynı oğurda tümce sonlarına da “:” imi konur.
Eski Türkçede “F, Ğ, H, J, V” sesleri olmadığından, bunların simgeleyen tamgalar da yoktur.
Tamgalar kalın-ince olmak üzere nitelenmektedir.

Orhun harfleriyle yazılan yazıtlardan 13.yüzyıl Moğol tarihçisi Cüveyni (Ebü'l- Muzaffer Alâúdîn Atâ‘ Melik bin Bahâiddîn Muhammed el-Cüveynî), Tarih-i Cihangüşa adlı yapıtında söz etmişti. Çin kaynakları da kitabelerin dikilişini bildirmekteydi. Yine de bu durum 18. ve 19. yüzyıllara kadar bilim dünyasının bilinmeyeni olarak kalmalarına engel olamadı. İlk olarak Rus çarı I. Petro'nun emriyle Sibirya bitki örtüsünü incelemek için görevlendirilen bitki bilimci Messerschmidt ve kendisine rehber olarak verilen İsveçli tutsak subay Strahlenberg, 1721 yılında Yenisey vadisinde bu yazı ile yazılmış Kırgızlara ait mezar taşlarını içeren Yenisey Yazıtları'ndan bir tanesini keşfetti. Bir yıl sonra tutsaklığı son bulan Strahlenberg İsveç'e dönüşünde bu inceleme ile ilgili izlenimlerini kitap haline getirip Stockholm'de yayınladı. Böylece Orhun yazısı bilim dünyasının dikkatini çekmiş oldu. Orhun yazıtlarından iki yüzyıl öncesine ait Yenisey Yazıtları'nın tamamına yakını bu süreçte ortaya çıkarıldı. Nihayet 1889 yılında Rus bilgini Yadrintsev, sonradan Bilge Kağan ve Kül Tigin anıtları olduğu anlaşılan Orhun Yazıtları'nı bulmuş, bunun üzerine 1890 yılında Heikel başkanlığında bir Fin heyeti, bir yıl sonra da ünlü Türkolog Radloff'un başkanlığında bir Rus heyeti bölgede incelemelerde bulunmuştur. Rus ve Fin heyetleri, anıtların fotoğraflarını alarak kitap halinde yayımlamışlar; bu yayınlar sayesinde yazıtların okunması süreci hız kazanmıştır. Sonunda Danimarkalı dilbilimci Thomsen 1893 yılında Orhun yazısını çözmeyi başarmıştır. İlk çözdüğü kelime de Tanrı olmuştur. Yazının çözülmesinden sonraki süreçte Thomsen ve Radloff anıtların metni ve çevirisi üzerinde yarışa girmişlerdir. Yazıtlar, yazıtlarda kullanılan yazı ve dil üzerindeki çalışmalar günümüzde de devam etmektedir. Yazıtların hem dil hem de yazı bakımından özgün metni ile günümüz Türkçesine çevirisini Prof. Dr. Muharrem Ergin (1971) yapmıştır.

Köktürükçe tamgaları yâni harflerini kendi bilgisayarınızda kullanmak için birkaç küçük işlem yapmanız gerekmektedir.
Bunun nedeni, bu tamgaların evrensel yiv (unicode) içine alınmamış olmasındadır. Ancak Prof. Dr. Tâlat Tekin ve birkaç bilim adamının bu konuda çalışmaları ve gerekli yere başvuruları bulunmaktadır. Birkaç yıl sonra çalışmanın sonuca varacağı ve şu an Lâtin harflerini nasıl kolayca yazabiliyorsak, Köktürükçe harflerini de bir o kadar kolayca yazabileceğiz.
Şu anlık bilgisayarınızda yazabilmeniz için, Köktürükçe yazıtiplerini eklemeniz gerekiyor.
Yazıtipini indirmek için buraya tıklayınız >>>
İndirdiğiniz yazıtipini Windows kullanıyorsanız:

Başlat > Denetim Masası > Görünüm > Yazıtipleri (fonts) yolunu izleyerek ilgili bölüme yapıştırın.
Pardus kullanıyor iseniz de:

Pardus > Tasma > Görünüm Ve Temalar > Yazıtipi Kurucusu > Yazıtipi Ekle
yolunu izledikten sonra kurulum bitecektir.

Orkun tamgaları kendine özgüdür. Türkler tarafından ayrı ayrı türetilmişlerdir. Kimi dil bilimciler aksini iddia edip alıntı olduğu söylemektedirler. "Soğutça'dan almış, kendileri için uyarlamıştırlar." savını ortaya atanlar henüz bunu kanıtlayamadıkları gibi ellerinde buna dair hiç bir belge ya da kaynak da yoktur. Böyle demelerinin tek açıklanabilir yanıtı, siyasi nedenler olsa gerektir. Orkun tamgalarının özgün olduğuna dair bir çok kanıt bulunmaktadır. Aşağıda bunları inceleyen yazılar yer almaktadır.

Türkler şimdiye değin 13 ayrı abece kullanmışlardır. Latin, Soğut (Uygurca'da kullanılmıştır), Arap, Kiril... ama hiç biri Türkçe'nin temel özelliklerinden biri olan büyük ünlü uyumunu korumak için özel önlemler almamıştır. Oysa Orkun tamgalarında bu iş kendiliğinden olmaktadır. Kalın sözcükler için ayrı, ince sözcükler için ayrı tamgalar (harfler) kullanılmıştır.
Tamgaların türetim mantığı betizyazı iledir. Yani her bir tamga, bir nesnenin biçimi temel alınarak oluşturulmuştur. Bugün için birçok tamganın kökeni açıklanabilmiştir. Ancak çözülemeyenler de sırlarını korumaktadırlar.
Aşağıda tüm tamgaların listesi verilmiştir.

Köktürükçenin yazımı şu an kullandığımız Lâtin kökenli yazıdan ayrıdır. Belli başı kurallar aşağıdaki gibidir:

Bugün her ses için bir tamga (harf) kullanırken, Köktürükçe'de yazılmaz. Buna seslemli yani heceli yazım denir.
Bir diğer özelliği, Arapça gibi sağdan sola yazılmasıdır. Yazıtlarda yukarıdan aşağıya yazıldığı da olmuştur.
Bunların yanında en önemli kurallardan biri, ünlü uyumudur. Köktürük tamgaları öyle bir tasarlanmıştır ki, büyük ünlü ünlü uyumunu korumada bundan daha sağlam abece yoktur. Zaten şimdiye değin Türklerin kullandığı 13 ayrı abecede bu özelliği yalnızca Köktürük abecesi gösterir.
Sözcükler arasında boşluk anlamına iki nokta üst üste (:) konur. Edebi türler vermediği ve kullanımı taş üstünde kaldığından noktalama işaretleri geliştirilmemiştir. (Kağıt üstünde yazılan "Irk Bitig" adlı bir kitap bulunmuştur.)

betawikiversity:Wikiversity:Kantin#Vikiversite'yi Vikikitap'a taşımak --Yılmazmesaj 21.42, 26 Temmuz 2025 (UTC)

Hukuk & Güvenlik İletişim Noktaları
Merhaba topluluk üyeleri, Wikimedia Vakfı doğru yasal bilgilere erişimi sağlamak amacıyla vikinizin alt bilgi bölümünden bağlantı verilecek tek bir hukuk ve güvenlik iletişim sayfası oluşturdu. Bu, yasal bir gerekliliktir. İngilizce, Almanca, İtalyanca, İspanyolca ve diğer dillerdeki vikilere bağlantıları zaten oluşturduk ve yakında sizin vikinize de entegre edeceğiz.Daha fazla bilgi için proje sayfasını inceleyin ve yorumlarınızı bu başlık altında veya tartışma sayfasında paylaşın.

-- User:Sannita (WMF) (talk) 13.30, 25 Haziran 2026 (UTC)

Apologies if this has not yet been translated into your wiki's language. Lütfen kendi dilinize çevirmeye yardım edin.
You are invited to voice your opinions in a request for comment about the future of Abstract Wikipedia. Teşekkürler!
Kowal2701 (talk)  12.24, 24 Temmuz 2026 (UTC)

Gürcü alfabesi, günümüzde dünyada kullanılan 14 yazı sisteminden biridir.
Beşi sesli olmak üzere 33 harften oluşur.
Latin alfabesi gibi soldan sağa doğru yazılır.
Büyük-küçük harf ayırımı olmayıp hepsi aynı şekilde yazılır.
Gürcü alfabesinin geliştirildiği tarih olarak kabul edilen zaman dilimi, İÖ 4. yüzyıl ile İS 3. yüzyıl arasında değişir.
Gürcü alfabesinin üç farklı biçimi vardır. İlki Mrgvlovani (yuvarlak) veya Asomtavruli (başlık harfleri) olarak adlandırılır (İÖ 3. yüzyıldan). Nushuri (küçük) veya Hutsuri (dinsel) olarak adlandırılır (9. yüzyıldan). Bir diğeri olan Mhedruli (askeri) 11. yüzyılda ortaya çıkmıştır.

Günümüzde kullanım dışı olan; Eski Gürcücede kullanılan bazı harfler:

"ჱ" e ve i benzeri bir ses (ey/ei), Eski Yunancadaki Ηη (eta/ita) sesiyle eş değer.
"ჲ" Türkçedeki "y" gibi okunur; fakat modern alfabede yerini "i (ი)" sesine bırakmış. Örn: Milyon yerine Milion demek gibi.
"ჳ" Eski Yunanca'daki upsilon sesiyle eş değerdir. Türkçede tam karşılığı yoktur.
"ჴ" Tam olmasa da "Q" benzeri bir sesi karşılar.
"ჵ" Uzun bir "o" sesi, ô.
"ჶ" Türkçedeki tam karşılığı "F/f" dir. Günümüzde yerini "ფ (p/ph)" ye bırakmıştır. Fakat Laz alfabesinde hâlâ kullanılır.
"ჷ" Türkçedeki "I/ı" sesiyle hemen hemen aynıdır. Megrel ve Svan dilinde hâlâ kullanılır.
"ჸ" Arapçadaki ayın sesine benzer.
"უ̌" Kısa u, უ sesinin kısa telaffuzu.

Gürcüce'de olumsuz cümleler iki farklı ek ile kurulur;
1)არ [AR] : -maz/-mez
2)ვერ [VER] : -amaz/-emez

Birinci olumsuzluk eki sıradan yapmaz, gelmez gibi olumsuz ifadelerde kullanılırken ikinci olumsuzluk eki yapamaz, gelemez gibi bir eylemi gerçekleştirme kabiliyeti açısından olumsuzluk belirtir.
Olumsuzluk ekleri fiilden önce getirilirek kullanılır.

1) ალი გუშინ სკოლაში არ წავიდა იმიტომ რომ მისი დავალება არ დაამთავრა.
[ALİ GUŞİN SK'OLAŞİ AR TZAVİDA İMİT'OM ROM MİSİ DAVALEBA AR DAAMTAVRA]
Ali dün okula gitmedi çünkü ödevini bitirmedi.
2) ალი გუშინ სკოლაში ვერ წავიდა იმიტომ რომ ავად იყო.
[ALİ GUŞİN SK'OLAŞİ VER TZAVİDA İMİT'OM ROM AVAD İQO]
Ali dün okula gidemedi çünkü hasta idi.

Olumsuzluk bildiren emir ifadeleri iki şekilde kurulur;

არ [AR] + Fiilin dilek kipi hali ile kurulur.
-არ გააკეთო [AR GAAK'ETO] : Yapma
-არ მოხვიდე [AR MOKHVİDE] : Gelme
-არ წავიდეს [AR TZAVİDES] : Gitmesin
Gibi.

ნუ [NU] + Fiilin şimdiki ya da gelecek zaman hali
ნუ მიდიხარ [NU MİDİKHAR] : Gitme (Şu an için)
ნუ წახვალ [NU TZAKHVAL] : Gitme (Gelecek zaman için)
Birinci არ ile kurulan olumsuz emir ifadeleri yapma, gelme gibi standart iken diğer ნუ ile kurulan olumsuzluk ifadeleri yasak belirtme, kesinkes yapmama anlamı katar.

Gürcüce; Lazca, Megrelce ve Svanca ile birlikte Güney Kafkas dil ailesi (South Caucasian) içerisinde yer alır. Bu dil ailesine Kartvel dilleri (Kartvelian Languages) de denilmektedir.
Gürcüce, yaklaşık 4 milyon kadar kişi tarafından Gürcistan'da konuşulur. Bunun dışında yurtdışında yaşayan Gürcüleri de sayarsak yaklaşık 6 milyonu bulurlar. Rusya, Amerika, Avrupa Birliği, Türkiye ('de Çveneburiler), İran ('da Fereydan Gürcüleri), Azerbaycan'da (İngilolar), yaşarlar.
Gürcüce, Gürcülerin etnografik gruplarının, diğer Güney Kafkas dilleri olan Svanca, Megrelce ve Lazca konuşan halkın da edebiyat dilidir. Öte yandan Gürcistan Yahudilerinin konuştuğu ve Gruzinik veya Kivruli olarak adlandırılan dili de Gürcistan’da 20.000 kişi ve ayrıca başka yerlerde 65.000 kişi (İsrail’de 60.000 kişi) konuşmaktadır
Gürcüce Güney Kafkas dillerinin en yaygın dilidir. Güney Kafkas dilleri ise Gürcüce ile birlikte Svanca (Gürcistan’ın kuzeybatı kesiminde, Svaneti’de konuşulur), Megrelce (Gürcistan’ın batı kesiminde, Samegrelo ve Abhazya’da konuşulur) ve Lazca’dan (çoğunluğu Türkiye’de olmak üzere Karadeniz kıyısında konuşulur) oluşur.
Gürcüce, zengin bir edebiyat geleneğine sahiptir. Günümüze ulaşan Gürcüce en eski edebi metin, İakob Tsurtaveli’nin 5. yüzyılda yazdığı “Kraliçenin, Azize Şuşanik’in Çilesi”dir (Tsamebay tsmindisa Şuşanikisi, dedoplisa veya kısaca Şuşanikis Tsameba). Gürcü ulusal destanı “Kaplan Postlu Şövalye” (Vephistqaosani) ise, Şota Rustaveli tarafından 12. yüzyılda yazılmıştır.

Gürcüler kendilerini Kartveli; dillerini de Kartuli olarak adlandırırlar, bu isim Gürcü ulusunun atası sayılan ve Tarihi Gürcü Kroniklerinde bahsedilen (Nuh'un oğlu) Yafes'in büyük torunu Kartlos ile bağlantılıdır.. Gürcüler, değişik dillerde birbirinden farklı adlarla anılırlar. Türkçe’deki Gürcü adı ise, İranlıların Gürcüleri verdiği ad olan Kurc veya Gurc adından gelir. Osmanlı döneminde kullanılan Gürci adı da buradan gelir. İngilizce’de Georgians, Almanca’daki Georgier, Fransızca’daki Géorgiens gibi adların da ülkenin koruyucu azizi olan Aziz George (veya Türkçe'ye Yunanca'dan geçmiş ifadesiyle Aya Yorgi)'dan gelmiş olması ihtimaldir.

Bir HTML belgesinin baş kısmında (<head>...</head> arasında) sayfada gözükmeyecek olan şeyler yazılır. Bunlar sayfanın başlığı, Meta etiketleri, vb. olabilir.

Sayfanın başlığı <title> etiketi ile belirtilir. Örnek:

Meta etiketleri arama motorlarına sayfa hakkında bilgi vermek, sayfanın karakter kodlamasını belirtmek ve diğer çeşitli işleri yaparlar.

Şunlar arama motorlarına sayfamız hakkında bilgi verir:

Sayfa her 20 saniyede bir yenilensin:

Sayfa açılır açılmaz http://tr.wikibooks.org adresine yönlensin:

Sayfa açıldıktan 5 saniye sonra http://tr.wikibooks.org adresine yönlensin:

Arama motorları sayfamızı indekslesin, arşivlesin ve linkleri de takip etsin:

Burada all yerine şunlar da yazılabilir:

follow Arama motorları sayfadaki linkleri takip etsin.
index Arama motorları sayfayı indekslesin.
noarchive Arama motorları sayfayı arşivlemesin.
noindex Arama motorları sayfayı indekslemesin. Ancak sayfamızdaki linkleri takip edebilir. Sayfamızın indekslenmemesi demek arama sonuçlarında çıkmaması demektir.
nofollow Sayfa indekslenebilir ancak linkler takip edilmesin.
none Arama motorları sayfayı tamamen görmezden gelsin.
İstenirse birden fazla seçenek kullanılabilir. Örnek:

NOT: Arama motorları çoğunlukla, hiçbir şey belirtmediğiniz şeyler için izin verdiğinizi varsayacaktır.

Web sitesiniz hazırlarken kullandığımız program:

Web sayfasını bir görsel editörle hazırladığımız zaman çoğunlukla ilgili program buraya ismini koyar.

base etiketi sayfada kullanılacak göreli URL'ler için bir taban belirtmemizi sağlar. Örnek:

Sayfanın baş kısmında bunu kullanarak sayfanın içinde kullanılacak olan bütün göreli linklerin kendisine http://www.websitem.com/images/ adresini taban almasını söyledik. Ayrıca yine bu etiket sayesinde sayfada hedefi belirtilmemiş bütün linklerin yeni pencerede (veya yeni sekmede) açılmasını sağladık. Bu etiketin işlerlik gösterebilmesi için base etiketine href veya target seçeneklerinden en az birini eklemeliyiz. target seçeneğinin alabileceği diğer değerler şöyledir:

_self Hedef belirtilmemiş bütün linkler kendi çerçevesinde açılsın (varsayılan).
_parent Hedef belirtilmemiş bütün linkler bir üst çerçevede açılsın.
_top Hedef belirtilmemiş bütün linkler en üst çerçevede açılsın. Yani link bir çerçevenin içindeyse linke tıklandıktan sonra ortada çerçeve kalmasın.
çerçeve ismi Hedef belirtilmemiş bütün linkler belirtilen çerçevede açılsın.

Formların genel kullanımı aşağıdaki şekildedir;

Form içerisine veri girişini sağlayabilmek için input elementini kullanmak gerekir.İnput için 4 farklı tip özellik vardır.Bunlar: text,checkbox,radio ve sumbit değerleridir.Text metin girişi için kullanılır.Checkbox ve radio seçim işlemleri için kullanılır.Aralarındaki fark ise checkbox ile birden fazla seçim yapılabilirken radio ile tek seçim yapılabilir.Sumbit ise form verisini göndermek için kullanılır.Form verisini göndermek için action,gönderme metoduysa method degerleriyle belirlenir.Daha iyi anlaşılabilmesi için aşağıya örnek kod bloğu oluşturalım.

Get ve post metodları veriyi göndermek için kullanılır.Get metodunda gönderilecek veri tarayıcının url bölümünde gözükür.Bu yüzden şifre gibi özel verilerin olduğu formların get metoduyla gönderilmesi önerilmez.Yukarıdaki örnek kodumuz için bakacak olursak gönderilecek veri index.php?isim=veri1&soyisim=veri2... şeklindedir.Post ise veriyi sayfa içerisinde göndererek url de gözükmesine neden olmaz.

HTML web sayfaları hazırlamak için kullanılan bir işaretleme dilidir, statiktir, istemci tarafında çalışır, tarayıcılar tarafından yorumlanır. W3C denen kâr gütmeyen kuruluş HTML için standartlar belirler, ancak bu standartlara uyup uymamak tarayıcıların inisiyatifine kalmıştır. Tarayıcılar bazı W3C spesifikasyonlarını desteklemezken bazen de kendileri yeni spesifikasyon eklemesinde bulunabilirler.

Uzantısı html veya htm olan metin dosyalarına HTML dosyası denir. Dolayısıyla bir metin dosyası oluşturup uzantısını htm veya html yaparak bir tarayıcı tarafından yorumlanabilen bir HTML dosyası elde etmiş oluruz. HTML dosyaları HTML kodu içermelidir.

HTML belgelerinin içeriği genel olarak iki kısımdan oluşur:

Etiketler
Metin
Sayfada metin gösterilir; etiketler ise sayfada gösterilecek olan metni biçimlendirir (veya sayfaya resim eklemek gibi özel işleri yapar). HTML etiketlerinin genel biçimi şöyledir.

Burada etiket bir HTML etiketidir. Etiketin başlangıç imi <etiket> ile ve bitiş imi </etiket> ile gösterilir. Aradaki metin yazısı ise etiketten etkilenen içeriktir. Örneğin gerçek bir HTML etiketinden örnek verecek olursak:

Burada etiketimiz <b>'dir ve görevi içeriğini koyu yapmaktır. Yani tarayıcı HTML belgesinde <b> ve </b> ile çevrelenmiş bir yazı gördüğünde bu yazıyı sayfada koyu gösterir.
Her HTML etiketinin çifti olacak diye bir şart yoktur. Bazı etiketlerin çifti olmayabilir. Örneğin:

<hr> etiketi sayfaya yatay çizgi eklemek için kullanılır ve çifti yoktur.

HTML etiketleri seçenek alabilir. Seçenekler etiketin etkisini özelleştirmek için veya etikete yapacağı iş hakkında ek bilgi vermek için kullanılır. Seçenekler HTML etiketlerine şöyle eklenir:

Gerçek bir HTML etiketinden örnek verecek olursak:

Burada noshade seçeneği sayfaya eklenen çizginin gölgesiz olmasını sağlar.
Seçenekler değer alabilir. Seçeneklere değerler şöyle eklenir:

Gerçek bir HTML etiketinden örnek verecek olursak:

width seçeneği çizginin uzunluğunu belirtmek için kullanılır. Burada çizginin uzunluğu 100 piksel olacaktır.

Aslında HTML'deki seçeneklerin çoğu değer alan seçeneklerdir.
Bazen bir etiketin işlerlik gösterebilmesi bir seçeneğin (ve değerinin) mutlaka belirtilmesi gerekebilir. Bu seçeneklere zorunlu seçenek denir.
Seçeneklerin sırası önemli değildir.
HTML büyük-küçük harf duyarlılığı ile ilgili şu kurallara sahiptir:
HTML etiketleri ve seçenekleri büyük-küçük harf duyarlılığına sahip değildir. Yani HTML etiket ve seçeneklerini büyük ya da küçük, ya da büyük-küçük karışık şekilde yazmakta özgürsünüz.
Eğer değer veya etiket içeriği sayfada gözükecekse elbetteki büyük-küçük harf ayrımı önemli olacaktır. Çünkü metni büyük harflerle yazarsanız tarayıcı da ilgili içeriği sayfada büyük harflerle gösterecektir. Benzer şekilde metni küçük harflerle yazarsanız tarayıcı da ilgili içeriği sayfada küçük harflerle gösterecektir. Etiket içeriklerinin çoğu ve değerlerin bazıları sayfada gözükür.
Eğer değer bir dosya adını belirtiyorsa üzerinde çalıştığınız HTML dosyanızı yükleyeceğiniz bilgisayarın işletim sistemi önemli hale gelmektedir. Linux ve türevi sistemlerde dosya isimlerinde büyük-küçük harf duyarlılığı vardır; ancak bu duyarlılık Windows sistemlerde yoktur. Bu yüzden yazdığınız HTML dosyasını işlatim sistemi Linux olan bir sunucuya yükleme olasılığınız varsa değerde belirtilen dosya ile değerin kendisi büyük-küçük harf durumu bakımından aynı olmalıdır. En garanti yöntem dosya isimlendirirken daima sadece küçük harfler kullanmak ve HTML dosyanızda bu dosyaları belirtirken de daima küçük harf kullanmanızdır. Bu sayede olası bir sorunun en başından önüne geçmiş olursunuz.
Burada anlatılan büyük-küçük harf durumları İngiliz alfabesine göredir. Yani bu durumda <iframe> ile <İframe> HTML için tamamen farklı etiketlerdir.
Eğer bir etikete seçenek eklenmezse o seçenek için olan varsayılan değer kullanılır. Varsayılan değer tarayıcıdan tarayıcıya değişebilir. Ancak seçeneklerin çoğunda ortak bir varsayılanlık durumu vardır. Örneğin bütün tarayıcılar sayfanın arkaplan rengi HTML kodunda belirtilmemişse sayfanın arkaplan rengini beyaz yapar.
HTML, boşluk duyarlılığı bakımından şu kurallara sahiptir:
HTML doğrudan veya dolaylı olarak aynı satırdaki iki metni ayıran birden fazla boşlukları tek boşluğa indirger.
Eğer birden fazla boşluk iki metni ayırmıyorsa; yani boşluklar sayfanın veya satırın en başında veya en sonunda ise bu boşluklar yok sayılır.
Tarayıcılar eğer bir satırın uzunluğu ekran genişliğinden büyükse otomatik olarak artan kısımları alt satıra kaydırır. Ancak burada bahsettiğimiz "satır" bu değildir. Tarayıcının yaptığı yeni satır oluşturma değil, metin kaydırmadır. Yani tarayıcıda birden fazla satırda gözüken bir içerik HTML kodu olarak aslında aynı satır olabilir.
Aslına bakarsanız HTML'de değerlerin Türkçe karakter veya boşluk içermiyorlarsa tırnak içine alınma zorunlulukları yoktur. Ancak bence daima tırnak içine almayı alışkanlık hâline getirin ve hep böyle kullanın.
HTML'de değerler çift tırnak arasına alınabileceği gibi tek tırnakla da (') çevrelenebilirler.

Bir HTML belgesinin genel yapısı şu şekildedir:

Bir HTML belgesi genel olarak iki kısımdan oluşur: baş ve gövde kısımları. HTML belgesinin baş kısmı <head> ve </head> etiketleri arasında belirtilir. Buraya sayfanın içeriği diyemeyeceğimiz kısımları yazılır, örneğin sayfanın başlığı burada belirtilir. Sayfanın gövde kısmı ise <body> ve </body> etiketleri arasına yazılır. Buraya sayfanın içeriği (sayfada ne gözükmesini istiyorsak) yazılır.

XHTML, HTML'in daha katı kurallara sahip olan bir formudur. HTML, kuralları son derece esnek olan SGML üzerine kurulmuştur. Halbuki XHTML kuralları daha katı olan XML üzerine kuruludur. Aslına bakarsanız XHTML ile HTML arasındaki fark sadece etiket/seçenek/değerlerin kullanımında ortya çıkar. Yani XHTML bize yeni bir etiket/seçenek/değer sunmaz. Sadece HTML'in XML kurallarına uyacak şekilde yeniden düzenlenmiş hâlidir. XHTML, HTML'den farklı olarak aşağıdaki kurallara sahiptir:

Bütün etiket ve seçenekler tamamen küçük harfle yazılmalıdır. Eğer değerler sayfada görünmeyecekse veya bir dosya adı belirtmiyorsa tamamen küçük harflerle yazılmalıdır.
Bütün değerler mutlaka tırnaklarla kapatılmalıdır.
XHTML'de kapanmayan etiketlere izin verilmez. HTML'de kapanmayan etiketler XHTML'de <etiket /> şeklinde kullanılmalıdır.
Sayfanın başında mutlaka bir DTD bildirimi olmalıdır.
<html> etiketine xmlns seçeneği eklenmeli ve kullanılacak isim alanı bu seçeneğe değer olarak verilmelidir.
Bu kitapta örnekler XHTML kullanılarak verilecektir.

HTML5, HTML'in yeni versiyonudur, ancak henüz tarayıcılar tarafından % 100 destek gördüğünü söylixsueyemeyiz. HTML5'in getirdiği yeni etiket/seçenek/değerlerin 2014 gibi tarayıcılar tarafından tam destek görmesi beklenmektedir. Bu kitapta HTML5'in getirdiği yeni etiket/seçenek/değerlerden günümüzde tarayıcılar tarafından geniş destek görenleri gösterilecektir.

HTML'de adres belirtimleri mutlak adres ve göreli adres olmak üzere ikiye ayrılır.

İnternetteki bir kaynağa mutlak erişim: http://www.google.com.tr/resim.jpg
Linux makinemizdeki bir kaynağa mutlak erişim: /home/kullanici/Resimler/a.jpg
Windows makinemizdeki bir kaynağa mutlak erişim: C:/Documents and Settings/Kullanici/Desktop/Dosya.jpg

Eğer sayfanın baş kısmında <base /> etiketiyle varsayılan taban adresi değiştirmemişsek üzerinde çalıştığımız HTML dosyasıyla aynı klasörde olan dosyaları ismini ve uzantısını yazarak direkt kullanabiliriz. Ayrıca aşağıdaki kurallar da geçerlidir:

Klasör1/Klasör2/Dosya.jpg Bulunduğumuz klasörün alt klasörlerindeki dosyalara erişim.
../Dosya.jpg Bulunduğumuz klasörün bir üst klasöründeki dosyaya erişim.
../../../Klasör1/Klasör2/Dosya.jpg Karmaşık bir belirtim. Bulunduğumuz klasörün üst klasörünün üst klasörünün üst klasöründeki Klasör1 klasöründeki Klasör2 klasöründeki Dosya.jpg dosyasına erişim.

En basit sırasız liste:

Sırasız listenin her bir ögesinin başındaki işaret <ul> etiketine eklenen type seçeneği ile belirtilir. Olası seçenekleri:

disc (daire) (varsayılan)
square (kare)
circle (çember)
type seçeneği <li> etiketine de eklenebilir. Bu durumda belirtilen değer sadece o ögeyi etkileyecektir.

En basit sıralı liste:

Sıralı listenin ögelerinin her birinin nasıl numaralandırılacağı <ol> etiketine eklenen type seçeneği ile belirtilir. type seçeneğinin alabileceği değerler şunlardır:

1
A
a
I
i
Sıralı listenin içindeki <li> etiketleri de type seçeneğini ve bu değerleri alabilirler. Bu durumda ilgili numaralandırma tipinden sadece ilgili liste ögesi etkilenecektir.
<ol> etiketine eklenen start seçeneği ile sıralı listenin hangi sayıdan veya kaçıncı sıradaki harften başlayacağını belirtebiliriz. Örnek:

Çıktısı:

Listenin birinci ögesi
Listenin ikinci ögesi
Listenin üçüncü ögesi

Sıralı listenin içindeki <li> etiketlerine value seçeneğini ekleyebiliriz. value seçeneği ilgili sıralı liste ögesinin başındaki sayının kaç olacağını (veya kaçıncı sıradaki harf olacağını) belirtir. İlgili liste ögesinden sonra devam eden liste ögelerinin başındaki sayı (veya harf) da sıra numarasını değiştirdiğimiz liste ögesini takip edecektir. Örnek:

Çıktısı:

Listenin birinci ögesi
Listenin ikinci ögesi
Listenin üçüncü ögesi

Bir HTML dosyasında tablo oluşturmak için 3 temel kodu bilmemiz yeterli:
Kod	Anlamı

  < table >
     < tr >
        < td >satır 1, sütun 1</ td >
        < td >satır 1, sütun 2</ td >
     </ tr >
     < tr >
        < td >satır 2, sütun 1</ td >
        < td >satır 2, sütun 2</ td >
     </ tr >
  </ table >
  

Burada dikkat edilmesi gereken birkaç nokta var. Birincisi mutlaka satırlardaki sütun sayıları eşit olmalıdır. Eğer iki sütunu birleştireceksek colspan="" ya da iki satırı birleştireceksek rowspan="" özelliğini td kodu içerisinde kullanarak tırnak işareti arasına kaç sütun ya da satır birleştiğini yazmamız gereklidir.

  < table border="1" >
     < tr >
        < td colspan="2" >satır 1, sütun 1 ve 2 birleşti</ td >
     </ tr >
     < tr >
        < td rowspan="2" >satır 2 ve 3 birleşti, sütun 1</ td >
        < td >satır 2, sütun 2</ td >
     </ tr >
     < tr >
        < td >satır 3, sütun 2</ td >
     </ tr >
  </ table >

 
Dikkat edilirse rowspan="2" kullandığımız satırdan sonra sadece tek sütun kullandık. Bu da satır 3, sütun 2'yi oluşturdu. Bu sayılarda yapacağınız yanlışlık tabloda görünümde sorunlar çıkaracaktır.
Tablo Özellikleri

TD (Sütun) Özellikleri

NOT: Eğer bir sütuna hiçbir şey yazmadan boş bırakırsak sütun görünmeyecektir. Bu sorunu çözmek için   kullanarak kutuda boşluk karakterine yer verirseniz kenarlıkların göründüğünü göreceksiniz.

Bu kitap, havuz yapımı süreci, kullanılan malzemeler, bakım ve onarım teknikleri gibi konuları detaylandırarak bilgi sahibi olmak isteyenler için bir rehber niteliğindedir.

Havuzlar kullanım amaçlarına ve yapım tekniklerine göre sınıflandırılabilir:

Betonarme Havuzlar: Kalıcı ve dayanıklıdır, geniş tasarım seçenekleri sunar.
Prefabrik Havuzlar: Daha hızlı kurulum ve maliyet avantajı sağlar.
Fiber Havuzlar: Su geçirmez, hafif ve düşük bakım gerektirir.
Doğal Havuzlar: Kimyasal kullanmadan doğal filtreleme ile çalışan ekolojik havuzlardır.

Havuz yapımı genellikle şu adımlardan oluşur:

Planlama ve Tasarım: Havuzun konumu, boyutu ve yapım türü belirlenir.
Kazı ve Altyapı Hazırlığı: Toprak kazılır, drenaj ve su hatları düzenlenir.
İnşaat Süreci: Beton dökme, çelik takviye, kaplama işlemleri yapılır.
Filtrasyon ve Sirkülasyon Sistemleri: Su temizliği ve dezenfeksiyonu için filtreler ve pompalar monte edilir.
Kaplama ve Son İşlemler: Seramik, mozaik veya liner kaplamalar eklenir.

Beton ve Çelik: Dayanıklı ve uzun ömürlü havuz yapımı için kullanılır.
PVC Kaplama: Su sızdırmazlığını sağlamak için kullanılır.
Filtrasyon Malzemeleri: Kum filtresi, kartuş filtresi ve D.E. filtreleri suyun temizlenmesine yardımcı olur.

Gelişen teknoloji ile birlikte otomatik pH ölçüm cihazları, tuz klorlama sistemleri ve akıllı havuz robotları yaygınlaşmaktadır.

Klasik Fin Saunası: Yüksek sıcaklık ve düşük nem seviyesine sahiptir.
Buhar Odası: %100 nem oranına sahip, cilt sağlığına faydalıdır.
Kızılötesi (Infrared) Sauna: Daha düşük sıcaklıklarda derin ısıtma sağlar.

Hidromasajlı Jakuziler: Kas rahatlatma ve dolaşımı iyileştirme amacı taşır.
Tuz Odaları: Solunum yolu hastalıklarına fayda sağlar.
Soğuk Şok Havuzları: Sauna sonrası vücut dengesini sağlamak için kullanılır.

Havuzun sağlıklı ve hijyenik olması için düzenli bakım gereklidir:

pH ve klor seviyesi kontrolü
Filtre temizliği ve su sirkülasyonu
Alg oluşumunu önleyici bakım

Klor: Suyu dezenfekte etmek için kullanılır.
pH Dengeleyiciler: Asidik veya bazik seviyeyi kontrol etmek için eklenir.
Alg Önleyiciler: Yeşillenmeyi ve alg büyümesini önler.

Havuz inşaatı ve filtrasyon sistemleri üzerine teknik kılavuzlar.
Sauna ve spa sistemleri hakkında uluslararası araştırmalar.

Kedi bakımı, köpek bakımına nazaran daha kolaydır. Hayvanseverler, genellikle bahçeli bir eve sahip olmadığı için köpek yerine kedi beslemeyi tercih ederler. Evcil kediler evde veya sokakta beslenebilir. Belki gün boyunca birbirlerine eşlik edebilmeleri için iki kedi almak isteyebilirsiniz.
Bir kedinin kişiliği, 6-16 haftalık bir yavru kedi olduğu zamanlarda insanlardan çok fazla ilgi görürse daha iyi gelişir. Bu nedenle özellikle yavru kediler uzun süre yalnız bırakılmamalıdır.

Eğer kedinizi yalnız besliyorsanız ve evde yaşıyorsa, kedinizin sağlığı için kısırlaştırmanız tavsiye edilir. Dişi kediler kısırlaştırılmadığı sürece yüksek sesler çıkartıp rahatsızlık verebilmekte, erkek kediler ise evin içinde sağa sola işeyebilmektedir. Veteriner hekiminiz kısırlaştırma konusunda sizi bilgilendirecektir.

ETKEN ÇATI -hi ÇEKİMİ

šak- bilmek

Haber Kipi Şimdiki Zaman

šaggahhi bilirim, biliyorum, bileceğim

šakti bilirsin, biliyorsun, bileceksin

šakki bilir, biliyor, bilecek

šekkueni biliriz, biliyoruz, bileceğiz

šekteni bilirsiniz, biliyorsunuz, bileceksiniz

šekkanzi bilirler, biliyorsunuz, bilecekler
Haber Kipi Geçmiş Zaman

šaggahhun bildim, bilirdim, bilecektim

šakta bildin, bilirdin, bilecektin

šakkiš bildi, bilirdi, bilecekti
šekkuen bildik, bilirdik, bilecektik

šekten bildiniz, bilirdiniz, bilecektiniz

šekkir bildiler, bilirlerdi, bileceklerdi
Emir Kipi

šegallu bileyim

šak bil, bilesin

šakdu bilsin, bile
šekkueni bilelim

šekten bilin, biliniz, bilesiniz

šekkandu bilsinler, bileler
dai- koymak

Haber Kipi Şimdiki Zaman

tehhi koyarım, koyuyorum, koyacağım

daitti koyarsın, koyuyorsun, koyacaksın

dai koyar, koyuyor, koyacak
tiyaweni koyarız, koyuyoruz, koyacağız

taitteni koyarsınız, koyuyorsunuz, koyacaksınız

tiyanzi koyarlar, koyuyorlar, koyacaklar
Haber Kipi Geçmiş Zaman

tehhun koydum, koyardım, koyacaktım

daiš/taitta koydun, koyardın, koyacaktın

daiš koydu, koyardı, koyacaktı
tiyawen koyduk, koyardık, koyacaktık

taitten/daišten koydunuz, koyardınız, koyacaktınız

daier koydular, koyarlardı, koyacaklardı
Emir Kipi

tiyallu koyayım

dai koy, koyasın

dau koysun, koya

tiyaweni koyalım

daišten koyun, koyunuz, koyasınız

tiyandu koysunlar, koyalar
da- almak

Haber Kipi Şimdiki Zaman

dahhi alırım, alıyorum, alacağım

datti alırsın, alıyorsun, alacaksın

dai alır, alıyor, alacak
daweni alırız, alıyoruz, alacağız

datteni alırsınız, alıyorsunuz, alacaksınız

danzi alırlar, alıyorlar, alacaklar

Haber Kipi Geçmiş Zaman

dahhun aldım, alırdım, alacaktım

daš aldın, alırdın, alacaktın

daš aldı, alırdı, alacaktı
dawen aldık, alırdık, alacaktık

datten aldınız, alırdınız, alacaktınız

dair aldılar, alırlardı, alacaklardı
Emir Kipi

dallu alayım

da al, alasın

dau alsın, ala
daweni alalım

datten alın, alınız, alasınız

dandu alsınlar, alalar
ak- ölmek, öldürülmek

Haber Kipi Şimdiki Zaman

agahhi ölürüm, ölüyorum, öleceğim

akti ölürsün, ölüyorsun, öleceksin

aki ölür, ölüyor, ölecek
akkueni ölürüz, ölüyoruz, öleceğiz

akteni ölürsünüz, ölüyorsunuz, öleceksiniz

akkanzi ölürler, ölüyorlar, ölecekler
Haber Kipi Geçmiş Zaman

agahhun öldüm, ölürdüm, ölecektim

akta öldün, ölürdün, ölecektin

ak(k)iš öldü, ölürdü, ölecekti
akkuen öldük, ölürdük, ölecektik

akten öldünüz, ölecektiniz, öleceklerdi

ekir öldüler, ölürlerdi, öleceklerdi
Emir Kipi

agallu öleyim

ak öl, ölesin

aku/akdu ölsün, öle

akkueni ölelim

akten ölün, ölünüz, ölesiniz

akkandu ölsünler, öleler
pai- vermek

Haber Kipi Şimdiki Zaman

pihhi veririm, veriyorum, vereceğim

paišti verirsin, veriyorsun, vereceksin

pai verir, veriyor, verecek
piyaweni veririz, veriyoruz, vereceğiz

pešteni verirsiniz, veriyorsunuz, vereceksiniz

piyanzi verirler, veriyorlar, verecekler
Haber Kipi Geçmiş Zaman

pehhun verdim, verirdim, verecektim

paitta verdin, verirdin, verecektin

paiš/pešta verdi, verirdi, verecekti
piyawen verdik, verirdik, verecektik

pešten verdiniz, verirdiniz, verecektiniz

pier verdiler, verirlerdi, vereceklerdi
Emir Kipi

pi(y)allu vereyim

pai ver, veresin

pau versin, vere
piyaweni verelim

pešten verin, veriniz, veresiniz

piandu versinler, vereler
tarna- bırakmak

Haber Kipi Şimdiki Zaman

tarnahhi bırakırım, bırakıyorum, bırakacağım

tarnatti bırakırsın, bırakıyorsun, bırakacaksın

tarnai bırakır, bırakıyor, bırakacak

tarnummeni bırakırız, bırakıyoruz, bırakacağız

tarnatteni bırakırsınız, bırakıyorsunuz, bırakacaksınız

tarnanzi bırakırlar, bırakıyorlar, bırakacaklar
Haber Kipi Geçmiş Zaman

tarnahhun bıraktım, bırakırdım, bırakacaktım

tarnaš bıraktın, bırakırdın, bırakacaktın

tarnaš bıraktı, bırakırdı, bırakacaktı
tarnum(m)en bıraktık, bırakırdık, bırakacaktık

tarnatten bıraktınız, bırakırdınız, bırakacaktınız

tarnir bıraktılar, bırakırlardı, bırakacaklardı
Emir Kipi

tarnallu bırakayım

tarna/tarni bırak, bırakasın

tarnau bıraksın, bıraka
tarnummeni bırakalım

tarnatten bırakın, bırakınız, bırakasınız

tarnandu bıraksınlar, bırakalar

ETKEN ÇATI -mi ÇEKİMİ
eš- olmak, var olmak 

Haber Kipi Şimdiki Zaman

ešmi olurum, oluyorum, olacağım, -yım, varım

ešši olursun, oluyorsun, olacaksın, -sın, varsın

ešzi olur, oluyor, olacak, -dır, vardır

ešueni oluruz, oluyoruz, olacağız, -yız, varız

ešteni olursunuz, oluyorsunuz, olacaksınız, -sınız, varsınız

ašanzi olurlar, oluyorlar, olacaklar, -dırlar, vardırlar
Haber Kipi Geçmiş Zaman

ešun oldum, olurdum, olacaktım, idim, vardım

ešta oldun, olurdun, olacaktın, idin, vardın

ešta oldu, olurdu, olacaktı, idi, vardı
ešuen olduk, olurduk, olacaktık, idik, vardık

ešten oldunuz, olurdunuz, olacaktınız, idiniz, vardınız

ešir oldular, olurlardı, olacaklardı, idiler, vardılar
Emir Kipi

ašallu olayım

eš ol, olasın

ešdu olsun, ola
ešueni olalım

ešten olun, olunuz, olasınız

ašandu olsunlar, olalar
ed- yemek

Haber Kipi Şimdiki Zaman

edmi yerim, yiyorum, yiyeceğim

ezzašši yersin, yiyorsun, yiyeceksin

ezzazzi yer, yiyor, yiyecek
eduwani yeriz, yiyoruz, yiyeceğiz

ezzatteni yersiniz, yiyorsunuz, yiyeceksiniz

adanzi yerler, yiyorlar, yiyecekler
Haber Kipi Geçmiş Zaman

edun yedim, yerdim, yiyecektim

ezzaš yedin, yerdin, yiyecektin

ezta yedi, yerdi, yiyecekti

eduwan yedik, yerdik, yiyecektik

ezzatten yediniz, yerdiniz, yiyecektiniz

eter yediler, yerlerdi, yiyeceklerdi
Emir Kipi

adallu yiyeyim

et ye, yiyesin

ezzaddu yesin, yiye
eduwani yiyelim

ezzatten yiyin, yiyiniz, yiyesiniz

adandu yesinler, yiyeler
har(k)- tutmak, sahip olmak

Haber Kipi Şimdiki Zaman

harmi tutarım, tutuyorum, tutacağım, -im var

harši tutarsın, tutuyorsun, tutacaksın, -in var

harzi tutar, tutuyor, tutacak, -i var
harweni tutarız, tutuyoruz, tutacağız, -imiz var

harteni tutarsınız, tutuyorsunuz, tutacaksınız, -iniz var

harkanzi tutarlar, tutuyorlar, tutacaklar, -leri var
Haber Kipi Geçmiş Zaman

harkun tuttum, tutardım, tutacaktım, -im vardı

harta tuttun, tutardın, tutacaktın, -in vardı

harta tuttu, tutardı, tutacaktı, -i vardı

harwen tuttuk, tutardık, tutacaktık, -imiz vardı

harten tuttunuz, tutardınız, tutacaktınız, -iniz vardı

harkir tuttular, tutarlardı, tutacaklardı, -leri vardı

Emir Kipi

harkallu tutayım, -im olsun

harak tut, tutasın, -in olsun

hardu tutsun, tuta, -i olsun
harweni tutalım, -imiz olsun

harten tutun, tutunuz, tutasınız, -iniz olsun

harkandu tutsunlar, tutalar, -leri olsun
ep(p)- yakalamak

Haber Kipi Şimdiki Zaman

epmi yakalarım, yakalıyorum, yakalayacağım

epši yakalarsın, yakalıyorsun, yakalayacaksın

epzi yakalar, yakalıyor, yakalayacak
eppueni yakalarız, yakalıyoruz, yakalayacağız

epteni yakalarsınız, yakalıyorsunuz, yakalayacaksınız

appanzi yakalarlar, yakalıyorlar, yakalayacaklar
Haber Kipi Geçmiş Zaman

eppun yakaladım, yakalardım, yakalayacaktım

epta yakaladın, yakalardın, yakalayacaktın

epta yakaladı, yakalardı, yakalayacaktı
eppuen yakaladık, yakalardık, yakalayacaktık

epten yakaladınız, yakalardınız, yakalayacaktınız

eppir yakaladılar, yakalarlardı, yakalayacaklardı

Emir Kipi

appallu yakalayayım

ep yakala, yakalayasın

epdu yakalasın, yakalaya
eppueni yakalayalım

epten yakalayın, yakalayınız, yakalayasınız

appandu yakalasınlar, yakalayalar
pai- gitmek

Haber Kipi Şimdiki Zaman

paimi giderim, gidiyorum, gideceğim

paiši gidersin, gidiyorsun, gideceksin

paizzi gider, gidiyor, gidecek
paiweni gideriz, gidiyoruz, gideceğiz

paitteni gidersiniz, gidiyorsunuz, gideceksiniz

panzi giderler, gidiyorlar, gidecekler
Haber Kipi Geçmiş Zaman

paun gittim, giderdim, gidecektim

paiš gittin, giderdin, gidecektin

pait gitti, giderdi, gidecekti
paiwen gittik, giderdik, gidecektik

paitten gittiniz, giderdiniz, gidecektiniz

pair gittiler, giderlerdi, gideceklerdi

Emir Kipi

pallu gideyim

it git, gidesin

paiddu gitsin, gide
paiweni gidelim

itten gidin, gidiniz, gidesiniz

pandu gitsinler, gideler
kuen- öldürmek

Haber Kipi Şimdiki Zaman

kuemi öldürürüm, öldürüyorum, öldüreceğim

kueši öldürürsün, öldürüyorsun, öldüreceksin

kuenzi öldürür, öldürüyor, öldürecek
kuennummeni öldürürüz, öldürüyoruz, öldüreceğiz

kuennatteni öldürürsünüz, öldürüyorsunuz, öldüreceksiniz

kunanzi öldürürler, öldürüyorlar, öldürecekler
Haber Kipi Geçmiş Zaman

kuenun öldürdüm, öldürürdüm, öldürecektim

kuinnešta öldürdün, öldürürdün, öldürecektin

kuenta öldürdü, öldürürdü, öldürecekti
kueuen öldürdük, öldürürdük, öldürecektik

kuenten öldürdünüz, öldürürdünüz, öldürecektiniz

kuennir öldürdüler, öldürürlerdi, öldüreceklerdi
Emir Kipi

kunallu öldüreyim

kuen(n)i öldür, öldüresin

kuendu öldürsün, öldüre
kuennummeni öldürelim

kuenten öldürün, öldürünüz, öldüresiniz

kunandu öldürsünler, öldüreler

IRC, İngilizce:Internet Relay Chat Türkçe:İnternet Aktarmalı Sohbet denilen, internet tabanlı bir protokolün ismidir.
Bu protokol, sadece metin(text) tabanlı iletişime izin vermektedir.

IRC, bir istemci aracılığıyla sunucu-bilgisayar iletişimini oluşturur. Yani kişiler, veri aktarımını sunucu üzerinden gerçekleştirir. Bu yöntem sadece iki kişi arasında olan iletişim şeklidir.
Ayrıca, IRC'de kanal mantığı da vardır.
Kanal, kullanıcıların toplu olarak bulunduğu özel bir odadır. Yöneticileri ve kullanıcılardan oluşur.
Bu durumda ise kullanıcı iletişimini kanal ve sunucu üzerinden gerçekleştirir. Kişi mesajını kanala yazarak odadaki tüm kullanıcılara mesaj atmış olur.

IRC platformu, binlerce sunucudan oluşur. Kullanıcı istediği sunucuyu seçer ve bağlanabilir. Herhangi bir sunucu eğer IRC girişleri açık ise, kullanıcılar bağlanabilir. Sunuculara, web veya mIRC denilen istemci ile bağlanılabilir.
mIRC üzerinden,/server sunucu adresi yazarak bağlanılabilir.

IRC sunucuları, kanal ve sunucu olarak iki ayrı yönetim şekli ile yönetilirler.

Sunucularda kanallar, %(Half-Operator), @(Operator), &(Super Operator), ~(Founder) olarak yönetilirler. Her kanal founder denilen en üst kanal yöneticisine kayıt edilir. Kanalın tüm yetkilerine ve çalışmasında founder sorumludur. Daha sonra &,@ ve %'lar gelmektedir.
Bu rütbelerde, yetkiler değişmektedir.

Sunucular, tüm kanalların ve kullanıcıların yönetimi için kanal yöneticilerinden ayrı ve daha yetkili kişiler seçerler. Bunların yetkileri tüm sunucu üstünde etkilidir. Ancak kanal yöneticileri yetkileri bulundukları kanalda etkilidirler.
Genelde sunucular şu yetki sıralaması ile yönetilirler:

Root Admin (Genelde sunucunun sahibidir, ayrıca özel bir şifre ile tüm yetkilere sahiptir.)
Network Admin (Root Admin'den sonra gelen, en üst yöneticidir. Tüm sunucudan sorumludur.)
Services Admin (Servisler üzerinde yüksek erişime sahip olan kişilerdir.)
Server Admin (Sunucu yöneticisidir.)
Co-Admin (Her sunucuda bulunmayabilir, genelde yardımcı mantığıyla görevlendirilirler, kısıtlı yetkilere sahiptirler.)
IRCOp (En kısıtlı erişime sahip yöneticidir.)

IRC sunucuları, Unreal veya Conference Room tabanlı sistemlerde çalışır. Genelde en çok tercih edileni Unreal olup, Conference Room sistemini tercih eden sunucular da vardır.

Sunucuyu yönetmekte daha kolay olması için, yazılımcılar servisler üretmişlerdir. Genelde şu servisler kullanılır:

MemoServ (Çevrimdışı kullanıcıların mesajlaşmak için kullandıkları servistir.)
OperServ (Sunucu yöneticilerinin kullandıkları, özel erişimli servistir.)
ChanServ (Kanal yöneticilerinin kullandıkları, özel erişimli servistir.)
NickServ (Rumuzların yönetildiği servistir.)
Yazılımcılar bunları geliştirip veya yeni servisler ekleyip, daha rahat kullanabilirler.

Vikipedi Türkçe IRC maddesi

Geri

The Joomla Template system is amongst the easiest to learn in the Content Management System family.
Templates are located in the /templates directory. The following shows a typical directory structure for a template:

/templates
 /basic_template
  /css
   template_css.css
  /images
  index.php
  template_thumbnail.png
  templateDetails.xml

This is the minimum set of files you need to make a template. The filenames must be adhered to as each one is expected by the core script. Note that while there are no images shown in the /images directory, this is typically where you would place any supporting images for your template, like backgrounds, banners, etc. Let's have a look at each of these files.
index.php

This is the template layout file.
template_css.css

The css stylesheet for the template.
templateDetails.xml

This is a metadata file in XML format.
template_thumbnail.png

A reduced screenshot of the template, usually around 140 pixels wide and 90 pixels high.
 

While the template layout file is a PHP file, it is written mostly in HTML with only a few snippets of PHP. You do not have to be a master of PHP to write a template file. All you need to be able to do is learn where to place the key "hooks" into the Joomla templating engine.
Within the HTML framework you place "windows" that look into the database behind your web site. There are typically several small windows called Modules and usually one larger opening (like a frontdoor) for a Component.
You are encouraged to write templates in XHTML. While there is debate over whether XHTML *is* the way of the future, it is a well formed XML standard, whereas HTML is a loose standard.  Future versions of Joomla will rely more and more on XML so it is wise to adopt this model now.
The index.php file for a typical 3-column layout would look like the following in a skeletal form:

1: <?php
2: $iso = <a href="http://www.php.net/explode">explode</a>( '=', _ISO );
3: <a href="http://www.php.net/echo">echo</a> '<?xml version="1.0" encoding="' . $iso[1] . "\"?>\n";
4: /** ensure this file is being included by a parent file */
5: <a href="http://www.php.net/defined">defined</a>( '_VALID_MOS' ) or <a href="http://www.php.net/die">die</a>( 'Direct Access to this location is not allowed.' );
6: ?>
7: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
8: <html xmlns="http://www.w3.org/1999/xhtml" lang="<?php echo _LANGUAGE; ?>">
9: <head>
10:   <title><?php <a href="http://www.php.net/echo">echo</a> $mosConfig_sitename; ?></title>
11:   <meta http-equiv="Content-Type" content="text/html; <?php echo _ISO; ?>" />
12: <?php
13: if ($my->id) {
14:   initEditor();
15: }
16: ?>
17: <?php mosShowHead(); ?>
18: <link href="<?php echo $mosConfig_live_site;?>/templates/basic_template/css/template_css.css"
rel="stylesheet" type="text/css" />
19: </head>
20: <body>
21: <table cellspacing="0" cellpadding="5" border="0">
22:   <tr>
23:     <td colspan="3">
24:       <?php <a href="http://www.php.net/echo">echo</a> $mosConfig_sitename; ?>
25:     </td>
26:   </tr>
27:   <tr>
28:     <td colspan="3">
29:       <?php mosLoadModules ( 'top', 1 ); ?>
30:     </td>
31:   </tr>
32:   <tr>
33:     <td width="20%" valign="top">
34:       <?php mosLoadModules ( 'left' ); ?>
35:     </td>
36:     <td width="60%" valign="top">
37:        <?php mosMainBody(); ?>
38:     </td>
39:     <td width="20%" valign="top">
40:       <?php mosLoadModules ( 'right' ); ?>
41:     </td>
42:   </tr>
43:   <tr>
44:    <td colspan="3" valign="top">
45:      <?php mosLoadModules ( 'bottom' ); ?>
46:    </td>
47:  </tr>
48: </table>
49: </body>
50: </html>

Let's have a look at the main features. We are assuming you already know a bit about HTML pages so things like head tags, body tags, tables, etc will be skipped over.
Line 1-3: Defines the file as a valid XML file.  _ISO is a special constant defining the character set encoding to use.  It is defined in your language file.
Line 5: Prevents direct access to this file. It is essential that you include this line in your template.
Lines 7-8: Set up the XHTML standard for the page.
Line 10: Prints out the Site Name configuration variable with the opening and closing title tags.
Line 11: _ISO is used again to define the character set to use.
Line 12-16: $my->id is a script variable that is non-zero if a user is logged in to your site. If a user is logged in then the nominated WYSIWYG editor is pre-loaded. You may, if you wish, always pre-load the editor, but generally an anonymous visitor will not have the need to add content. This saves a little script overhead for normal browsing of your site.
Line 17: Inserts several metadata blocks.
Lines 18: Loads the CSS stylesheet. $mosConfig_live_site is a configuration variable that holds the absolute URL of your site.
Line 24: This prints the Site Name in a table cell (spanning the three columns).
Line 29: This loads any modules that are published in the "top" position. The second argument, "1", indicates that the modules are to be aligned horizontally.
Line 34: This loads any modules that are published in the "left" position. These modules will be displayed in a single column.
Line 37: This loads the component into your template. The component is set by the URL, for example, index.php?option=com_content will display the Content Component in this area.
Line 40: This loads any modules that are published in the "right" position. These modules will be displayed in a single column.
Line 45: This loads any modules that are published in the "bottom" position.

CSS Stylesheets
TODO
The XML Setup File

TODO

The Thumbnail
When you have finished your template, publish it with the Template Manager in the Adminstrator. Preview the site and take a screenshot. Import the screen shot into your favourite graphic editing package and crop it down to the contents of the browser's view port. Reduce the image down to around 140 pixels wide by 90 pixels high and save it in PNG format in your template directory (that is, /templates/basic_template).
Geri

A, B, C, CH, D, E, F, G, GH, H, X, I, J, K, KH, Q, L, M, N, NG, O, Ö, P, PH, R, S, SH, T, U, Ü, W, Y, Z, ZH

i - Yazıda ı-i ayrımı yoktur. X, gh, kh, q gibi kaıln ünsüzlerin yanında ı olarak okunur. Bir sözcükte kalın sıradan başka bir ünlü varsa ı, ince sıradan başka bir ünlü varsa i okunur. Fiillerde mastar ekine göre kalın veya ince okunur. Diğer yerlerde her zaman i olarak okunur. Jil kelimesi istisna olarak yıl veya cıl / jıl olarak okunur fakat yil veya cil / jil olarak okunması da hatalı sayılmaz. (Daha sonra başka istisnalar da belirlenebilir).
j - Seçime bağlı olarak y veya j / c olarak okunur. Türkçe asıllı kelimelerde söz başındaki y sesi yazıda her zaman j ile gösterilir.
kh - Seçime bağlı olarak x veya q olarak okunur. Kökenine bakılmaksızın bir sözcüğün hem Kazak Türkçesi hem de Kırgız Türkçesi karşılığında q sesi varken diğer lehçelerde aynı sözcükte x sesi varsa yazıda bu x sesi kh ile gösterilir.
ph - Seçime bağlı olarak f veya p olarak okunur. Arapça ve Farsça asıllı kelimelerdeki f sesi yazıda her zaman ph ile gösterilir.
N ve g sesleri bir araya geldiği zaman nazal n olarak okunmaması için araya (') işareti konur.

Açık e ünlüsü yoktur; sadece kapalı e vardır.
Türkiye Türkçesinde küçük ünlü uyumu bakımından dört şekli bulunan eklerin iki şekli vardır ve ünlüsü ı / i'dir. Yazıda ı / i ayrımı olmadığı için ekin yapısında bir gh / q yoksa yazımı tek şekilli olur.

Temel olarak iki basit zaman vardır:

Bu iki zamana ilaveten özellikle yazılı anlatımda kullanılması düşünülen bir Şimdiki Zaman ve bir de niyet bildiren Gelecek Zaman (bu Niyet Kipi olarak adlandırılabilir) vardır.

"...-mAk niyetindeyim" veya bazen "...-mAk istiyorum" anlamlarında kullanılan Gelecek Zaman.

Japonca, temel olarak Türkçeye çok benzemektedir. Japoncanın cümle yapısı ve dizilişi hemen hemen aynı olup bazı sosyal yapıdan kaynaklanan ifadeler dışında farklılık pek yoktur. Yine genel anlamda Türkçede mevcut zaman kavramı Japonca içinde geçerlidir.
Kısaca:

   Geçmiş Zaman
   Şimdiki Zaman
   Gelecek Zaman

Japoncada da mevcuttur.
Örnek vermek gerekir ise

Ben kitap okudum.  
私は本を読みました。 
Watashi　wa　hon wo yomimashita.
Vataşi va ho vo yomimaşta.

Ben kitap okuyorum.
私は本を読んでいます。
Watashi wa hon wo yondeimasu.
Vataşi va hon vo yondeymas.

Ben kitap okuyacağım.
私は本を読みます。
Watashi wa hon wo yomimasu.
Vataşi va hon vo yomimas.

Burada dikkatinizi çekmiş olduğunu düşündüğüm cümlenin sıralanışı ve fiilin sona geldiğidir. Türkçedeki gibi fiil zamanı belirten ekler alır; ama söyleyene yani özneye göre kişi belirten ekleri yoktur. Burada fiili daha ayrıntılı incelersek
Fiilin sözlük hali 
読む
Yomu
Okumak
Zaman ekleri ise 

f+mashita (maşta)
f+deimasu (deymas)
f+masu (mas)

olacaktır. (Zaman ekleri önündeki sese göre ses değişimi gösterebilmektedir.)

日本語が出来ますか？

Nihon-go ga dekimasu ka?

(Nihon-go ga dekimas ka?)

Japonca biliyor musunuz?

トルコ語が出来ますか？

Toruko-go ga dekimasu ka?

(Torıko-go ga dekimas ka?)

Türkçe biliyor musunuz?

英語が出来ますか？

Ei-go ga dekimasu ka?

(Ey-go ga dekimas ka?)

İngilizce biliyor musunuz?

はい、出来ます。

Hai, dekimasu.

(Hay, dekimas.)

Evet, konuşurum.

いいえ、出来ません。

Iie, dekimasen.

(İye, dekimasen.)

Hayır konuşamam. 

判りますか？

Wakarimasu ka?

(Vakarimas ka?)

Anlıyor musunuz?

はい、判ります。

Hai, wakarimasu.

(Hay, vakarimas.)

Evet, anlıyorum.

いいえ、判りません。

Iie, wakarimasen.

(İye, vakarimasen.)

Hayır, anlamıyorum.

仰っしゃる事が判りません。

Ossharu koto ga wakarimasen.

(Oşşaru koto ga vakarimasen.)

Söylediğinizi anlamıyorum.

もっとゆっくり話して下さい。

Motto yukkuri hanashite kudasai.

(Motto yıkkıri hanaşte kudasay.)

Daha yavaş konuşun lütfen.

もう一度云って下さい。

Moo ichido itte kudasai.

(Moğ içido itte kudasay.)

Bir daha söyleyin lütfen.

此処に書いて下さい。

Koko ni kaite kudasai.

(Koko ni kayte kudasay.)

Buraya yazınız lütfen.

私は日本語が上手です。

Watashi wa Nihon-go ga joozu desu.

(Vataşi va Nihon-go ga coğzu des.)

İyi Japonca konuşabilirim.

日本語話せる人は居ますか？

Nihon-go hanaseru hito wa imasen ka?

(Nihon-go hanaserı hito va imasen ka?)

Japonca konuşabilen biri yok mu?

之は何と云う意味ですか？

Kore wa nan to iu imi desu ka?

(Kore va nan to iyu imi des ka?)

Bu ne demektir? (Bunun anlamı nedir?)

こんにちは！
Konnichiwa!
(Konniçiva!)
Tünaydın/İyi günler! 
おはようございます。
Ohayou gozaimasu!
(Ohayoo gozaymas!)
Günaydın!(resmi)

ohayou 
günaydın (sokak konuşması)
今晩は。
Konban
(Konban va!)
İyi akşamlar!

おやすみなさい。
Oyasumi nasai!
(Oyasumi nasay!)
İyi geceler!

ひさしぶりですね
(Hisashiburi desu ne?)
(Hisaşiburi des ne?)
Ne zamandır görüşmedik, değil mi?

ご機嫌いかがですか？, おげんきですか？
Gokigen ikaga desu ka?, Ogenki desu ka?
(Gokigen ikaga des ka?, Ogenki des ka?)
Nasılsınız?, İyi misiniz?

おかげさまで / げんきです 有難う。 
Okagesama de. / Genki desu, arigatou.
(Okagesama de. / Genki des, arigato.)
İyiyim, teşekkür ederim.

とてもげんきです。
Totemo genki desu.
(Totemo genki des.)
Çok iyiyim.
どうげんき？
(Doo, genki?)
Ne var, ne yok?

まあまあです。
(Maa maa desu.)
Eh, şöyle böyle. 
ありがとう相変わらずです。
Arigatoo, aikawarazu desu.
(Arigatoo, aykavarazı des.)
Teşekkürler, her zamanki gibi. / Bildiğin gibi.

わるくはありません。
Waruku wa arimasen.
(Varıkı va arimasen.)
Fena değilim.

そんなによくありません。
Sonnani yoku arimasen.
(Sonnani yoku arimasen.)
Pek iyi değilim.

少し疲れて居ます。
Sukoshi tsukarete imasu.
(Sukoşi tsukarete imas.)
Biraz yorgunum.

私は病気です。
Watashi wa byooki desu.
(Vataşi va byooki des.)
Hastayım.

貴方の名前は何ですか？

Anata no namae wa nan desu ka?

(Anata no namae va nan des ka?)

Adınız nedir?

貴方の名前を教えて下さい。
Anata no namae o oshiete kudasai?

(Anata no namae o oşiete kudasay?)

Adınızı öğrenebilir miyim?

Kg
私の名前は ... です。

Watashi no namae wa ... desu.

(Vataşi no namae va ... des.)

Benim adım ...'-dır.

名字は ...

Myooji wa...

(Myoğci va...)

Soyadım...

私は ... です。

Watashi wa ... desu.

(Vataşi va ... des.)

Ben ...-yım.

貴方は日本人ですか？

Anata wa Nihon-jin desu ka?

(Anata va Nihon-cin des ka?)

Siz Japon musunuz?

はい私は日本人です。

Hai, watashi wa Nihon-jin desu.

(Hay, vataşi va Nihon-cin des.)

Evet, ben Japon'um.

私はトルコ人です。

Watashi wa Toruko-jin desu.

Vataşi wa Toruko-cin des.

Ben Türk'üm.

私はアメリカ人です。

Watashi wa Amerika-jin desu.

Vataşi wa Amerika-cin des.

Ben Amerikalıyım.

初めまして。 / お目に掛かれて光栄です。

Hajimemashite. / Omeni kakarete kooei desu.

(Hacimemaşte. / Omeni kakarete koğey des).

Memnun oldum.

こちらは ... さんです。

Kochira wa ... San desu.

(Koçira va ... San des.)

Bu ... Bey / Hanım.

どうぞ宜しく。

Doozoyoroshiku.

(Doğzoyoroşku.)

Tanıştığımıza memnun oldum.

貴方は何歳 (お幾つ) ですか？ 

Anata wa nan sai (o-ikutsu) desu ka?

(Anata va nan say (o-ikıtsı) des ka?)

Kaç yaşındasınız?

私は ... 歳です。

Watashi wa ... sai desu.

(Vataşi va ... say desu.)

... yaşındayım.

貴方は旅行者ですか？
Anata wa ryokoosha desu ka?

(Anata va ryokoğşa des ka?)

Siz turist misiniz?

私は以前から貴方を知って居ます。

Watashi wa izen kara anata wo shitte imasu.

(Vataşi va izen kara anata vo şitte imas.)

Ben sizi önceden tanıyorum.

左様なら。

Sayoonara!

(Sayoğnara!)

Güle güle / Allah'a ısmarladık / Hoşça kalın.

それじゃ。

Sore ja.

(Sore ca.)

Hoşça kal. (teklifsizce, dostça)

じゃあね。

Jaa ne.

(Caa ne.)

Hadi, eyvallah. (gençler arasında)

又会いましょう。

Mata aimashoo.

(Mata aymaşoğ.)

Görüşürüz. / Yine görüşelim.

又ね。

Mata ne.

Yine görüşelim.

では又。

Dewa mata.

(Deva mata.)

Görüşmek üzere.

お体に気を付けて。

O-karada ni ki o tsukete.

(O-karada ni ki o tsıkete.)

Kendinize dikkat edin.

行ってらっしゃい。 / 行ってらっしゃいませ。

Itterasshai! / Itterasshaimase!

(İtteraşşay! / İtteraşaymase!)

İyi yolculuklar!

宜しくお伝え下さい。

Yoroshiku otsutae kudasai.

(Yoroşikı otsıtaye kudasay.)

Selam söyleyin.

... に宜しく。

... ni yoroshiku.

... ni yoroşikı.

...'-e selam söyle.

畏まりました。 / 承知しました。

Kashikomarimashita. / shoochi shimashita.

(Kaşikomarimaşta. / Şoğçi şimaşta.)

Baş üstüne.

Bir programlama dilini öğrenmenin en önemli adımı ilk programınızı çalıştırmaktır. Bunun için çalışma ortamınızın ayarlanmış olması, editörünüzü kullanmayı bilmeniz, ve derleyicinizi kullanabilmeniz gerekir. Bazen gelişmiş bir IDE (Bütünleşik Geliştirme Ortamları) kullanarak bu uğraşlı süreçlerden kurtulmak mümkündür. Bu bölümde yapacağımız da basit bir IDE kullanarak ilk programımızı yazmak olacak. Programımız tabii ki "Merhaba Dünya" (Hello World) olacak. Programın kaynak kodunu HelloWorld.java isimli bir dosyaya kaydedin. Java'da sınıf isimleri ile dosya isimleri arasında ilerleyen bölümlerde anlatılacak bir ilişki bulunmaktadır.

1 public class HelloWorld {
2         public static void main(String[] args) {
3                 System.out.println("Merhaba Dünya!");
4         }
5 }

Yazdığınız programları derleyebilmek için, derleyiciye ihtiyacınız vardır. Derleyiciler, program kodunu makinelerin anlayabileceği makine dili komutlarına çeviren yazılımlardır. Java için gerekli derleyiciler farklı kaynaklardan edinilebilir. Biz bu kitapta, SUN tarafından geliştirilen ve dağıtılan derleyiciyi kullanacağız. Sun Java derleyicisini http://java.sun.com adresinden indirilebilir. Bu sitedeki farklı dağıtımlar, çeşitler ve versiyonlar ilk bakışta kafa karıştırıcı olabilir. O nedenle tüm bu bilgileri ayrı bir bölümde ele alıyoruz. Ek-A'da dağıtımlar arasındaki farklılıklar, hangi dağıtımın indirileceği ve kurulum bilgilerine bakabilirsiniz. Biz burada sisteminizde Java kurulu varsayarak anlatacağız. Yani komut satırından javac veya java yazdığınızda aşağıdakilere benzer çıktılar alabiliyor olmalısınız.

# java
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)

where options include:
...
# javac
Usage: javac <options> <source files>
where possible options include:
  -g                        Generate all debugging info
  -g:none                   Generate no debugging info
...

Eğer Ek-A'da yazılanları yaptıysanız ve sisteminiz hazırsa, ilk programımızı derlemeye hazırız demektir. HelloWorld.java programını derlemek için komut satırından aşağıdaki komutu çalıştırmalıyız.

# javac HelloWorld.java

Eğer her şey yolunda gittiyse, hiç hata veya uyarı almadan HelloWorld.class dosyasının oluştuğunu göreceksiniz. Eğer derleyici tarafından bir hata tespit edilirse, bu hatanın oluştuğu satır ve sütun işaret edilir ve hatanın bir açıklaması görülecektir.

Java ME ile Yazılım Geliştirme kitabına hoşgeldiniz. Bu kitap Java ME teknolojisini tanıtmayı ve bu teknoloji ile nasıl yazılım geliştireceğimizi açıklamayı amaçlamaktadır. Java ME ile yazı geliştirmek için temel Java yazılım bilgisinin olması gerekmektedir.

Java ME
Java Micro Edition çeşitli cihazlar için tanımlanmış bir grup belirtim ve teknolojidir. Java ME belli sınıflardaki cihazlar için bir grup konfigürasyon ve profillere bölünmüştür. J2ME olan eski ismi Java ME olarak değiştirilmiştir.
CLDC(Connected, Limited Device Configuration)
Java ME nin en yaygın konfigürasyonudur. CLDC 512 KB tan ufak hafızası ve sınırlı ağ bağlantısı olan aletler için tasarlanmıştır. CLDC KVM olarak adlandırılan JVM(Java Virtual Machine) i ve uygulamalar için temel olan bir takım kütüphaneleri belirler.
MIDP
Mobile Information Device Profile Java ME nin bir profilidir. CLDC nin üstündeki bir profil olarak yer alır ve uygulamanın yaşam döngüsü, kullanıcı grafik arabirimleri, iletişim ağı ve kalıcı depolama ile ilgili kütüphaneleri içerir.
Midlet
Midlet MIDP profili için yazılmış uygulamalara verilen isimdir.
Midlet suite
Midletler Midlet Suite'ler olarak paketlenir ve dağıtılır. Bir Midlet Suite bir veya daha fazla Midlet ten oluşabilir. Midlet Suite .jar ve.jad olarak 2 dosyadan meydana gelir. .jad uzantılı dosya tanımlayıcı dosya, .jar uzantılı dosya Midlet, kullanılan kütüphaneler, kaynak dosyaları gibi dosyaları içeren arşiv dosyasıdır.
=== Java Platformları ===ESES
Java ilk olarak avuçiçi ve taşınabilir cihazlar için tasarlanmış fakat sonraları çeşitli sebeplerden dolayı çıkış amacından uzaklaşmıştır. Java, Java ME ile çıkış günlerindeki amacına geri dönmektedir. Günümüzde Java platformu 3 ana kategoriye ayrılır:

Standard Edition (Java SE)
Daha çok kişisel bilgisayarlara ve temel sunuculara yönelik bir takım standartları içerir.
Enterprise Edition (Java EE)
Sunuculara yönelik geliştirilen bir takım standartları içerir.
Micro Edition (Java ME)
Cep telefonları, kablosuz el cihazları, kişisel dijital asistanlar ve benzeri kaynakları kısıtlı cihazlar için geliştirilen standartları içerir.

Jave ME çeşitli konfigürasyon ve profillere bölünmüştür. Konfigürasyonlar JVM(Java Virtual Machine) detaylarını ve belli sınıftaki cihazlarla kullanılabilecek temel kütüphaneleri tanımlayan belirtimlerdir. Mesela 512KB bellekten az hafıza alanı ve sınırlı bir ağ bağlantısı olan cihazların konfigürasyonu CLDC olarak adlandırılır. CLDC lere örnek olarak bazı cep telefonları ve avuç içi bilgisayarlar(PDAs) verilebilir. Daha fazla belleğe ve işlemci gücüne sahip, sürekli ağ bağlantısı olan diğer konfigürasyon ise CDC olarak adlandırılır (Connected Device Configuration). Bunlara örnek olarak ise Sharp Zaurus avuç içi bilgisayarları verilebilir.
Profiller uygulama geliştirmeye daha yetkin bir ortam sunabilmek için konfigürasyonun üzerine tanımlanan kütüphanelerdir. Konfigürasyon java sanal makinesi (JVM) ve temel kütüphaneleri tanımlarken, bir uygulama geliştirilirken ihtiyaç duyulabilecek yetkinlikte kütüphaneleri tanımlamaz. Profiller bu alanda uygulamanın yaşam döngüsü, kullanıcı arabirimi ve kalıcı bellek kütüphanelerini içerirler.

MIDP profili için yazılan uygulamalar Midlet olarak tanımlanır.
Bir MIDP uygulaması geliştirmek için bazı temel bilgileri edinmek gerekir. Bunlardan bazıları: midletlerin yaşam döngüsü, kullanıcı arabirimleri, komut işleme, konuşlandırma ve uygulama yönetimi olarak sayılabilir.

Midletler 3 durumda bulunabilir: durağan (paused), etkin (active), ölü(destroy).
Bir midlet yaratıldığı ve başlatıldığı zaman durağan moddadır. Eğer MIDlet yapılandırıcısında(constructor) kural dışı bir durum oluşursa(exception) MIDlet ölü durumuna geçer. MIDlet ler etkin durumdan durağan durumuna pauseApp() methodunu tamamladıktan sonra geçebilirler. Veya etkin konumdan durağan duruma startApp() methodunu tamamladıktan sonra geçebilirler. MIDletler ölü konumuna destroyApp(boolean unconditional) methodunun tamamlanmasından sonra geçerler.Bu method MIDlet kullandığı kaynakları serbest bırakır ve gerekli temizleme işlemlerini yapar.

Uygulama Yönetim Yazılımı(Application Management Software, AMS) MIDlet in kurulumu, başlaması, durdurulması ve kaldırılması ile ilgili işlemlerin yapıldığı ortamdır. 
Bir veya daha fazla MIDlet ‘MIDlet Suite’ denen JAR uzantılı dosyalara paketlenir. Her JAR dosyasının içeriğini tanımlayan JAD uzantılı uygulama tanımlayıcı dosyası vardır. Bu dosyalar Uygulama Yönetim Yazılımları tarafından kullanılır.
JAR ve JAD uzantılı dosyaların cep telefonlarına indirilebilmesi için bu dosyaların indirileceği web sunucuları üzerinde aşağıdaki MIME tiplerinin tanımlanması gerekmektedir:

.jar application/java-archive
.jad text/vnd.sun.j2me.app-descriptor

Ayrıca uygulama tanımlayıcısından dinamik olarak değer almak için MIDlet içinden getAppPropoerty (String key) methodu da kullanılabilir. Böylece JAR dosyasını değiştirmeye gerek kalmadan JAD dosyası üzerinden bazı değişiklikler ile MIDlet imizin çeşitli işlevlerini değiştirebiliriz.
Örnek bir JAD dosyası:

MIDlet-1: MerhabaDunya, , example.hello.HelloWorldMIDlet
MIDlet-2: ZiplayanYazi, , example.hello.BouncingTextMIDlet
MIDlet-Jar-Size: 7822
MIDlet-Jar-URL: HelloExamples.jar
MIDlet-Name: HelloExamples
MIDlet-Vendor: Ozgur Yazılım
MIDlet-Version: 1.0.1
ZiplayanYazi-BaslangicYazisi: MIDlet ler eğlenceli!

Yukarıdaki MIDlet Suite, Uygulama Yönetim Yazılımı tarafından yüklendiğinde hangi MIDlet in başlatılmak istendiği sorulacak, seçime göre ilgili MIDlet sisteme yüklenerek çalıştırılacaktır.

Bu bölümde MIDlet geliştirmeye başlayabilmek için gerekli araçların kurulumu ve yapılandırılmasını gerçekleyerek kod yazmaya başlayacağız. Hızlı bir şekilde kod yazabilmek için birçok Tümleşik Geliştirme Ortamları bulabilirsiniz.
Bunlardan bazıları:

JBuilder
NetBeans Mobility Pack
Metrowerks CodeWarrior Wireless Studio
Eclipse + Eclipse ME
Sun Java Wireless Toolkit

MIDlet uygulamalarımızı geliştirmeye başlamadan önce ihtiyacımız olan araçlar:

Java Platform, Standard Edition (Java SE) SDK
İhtiyaç duyulan minimum versiyonu Java ME Wireless Toolkit gereksinimlerinden bakarak bulmanız gerekir.
Sun Java Wireless Toolkit
Bu toolkit yazdığımız kodu derlemek ve test etmek gibi bir takım işlere yarar.
Metin editor
Kodumuzu yazmak için kullandığımız metin editörü.

İlk olarak ihtiyaç duyduğumuz Java Standart Edition SDK sını http://java.sun.com/j2se/ adresinden indirerek bilgisayarımıza kurmamız gerekir. Bu SDK bize Java Wireless Toolkit in çalışması için gerekli Java ortamını hazırlar. Java Wireless Toolkit yazdığımız kodu derlerken bu SDK daki derleyicileri kullanır. Kurulum bittikten sonra kurulumun olduğu dizinin altındaki “bin” dizinini path değişkeninize eklemeniz gerekiyor. 
Eğer buraya kadar olan adımları doğru olarak gerçekleştirdiyseniz işletim sisteminizin konsolunu açarak 

java –version

yazınız. Aşağıdaki gibi bir sonuç çıkıyorsa herşey yolunda demektir.

gunebakan@efeLaptop:~$ java -version
java version "1.5.0_06"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)

Şimdi sıra Java Wireless Toolkit’in kurulumunda. Bu toolkit yazdığınız kodların derlenmesi, test edilmesi, uygulamanız çalışırken bazı değerlerin gözlenmesi gibi bir takım işlere yaramaktadır.
http://java.sun.com/products/j2mewtoolkit/ adresinden en güncel Java Wireless Toolkit programını indirmemiz gerekir. Kurulum dosyasını çalıştırdıktan sonra toolkit sisteminizdeki Java SE ı otomatik olarak bulacak veya size Java SE nin kurulu olduğu dizini soracaktır. Kurulum işlemleri kurduğunuz işletim sistemine göre değişir. GNU/Linux işletim sistemi üzerinde indirdiğiniz dosyayı çalıştırılabilir(executable) yaptıktan sonra ismini yazarak kuruluma başlayabilir, windows işletim sistemleri üzerinde ise exe uzantılı dosyaya tıklayarak kuruluma başlayabilirsiniz. Detaylı kurulum bilgilerini indirdiğiniz dosyada veya web sitesinde bulabilirsiniz.

Bu kitap, yaygın olarak Web sahifelerinin ve eposta uygulamaları gibi Web uygulamalarının yapılışında kullanılan bir betik dili olan JavaScript'i öğrenmek isteyenler için hazırlanmaktadır. Nesne tabanlı bir dil olan JavaScript, nesne yönelimli Java ile bir isim benzerliğinden başka ortak tarafları yoktur. Piyasaya ilk defa LiveScript olarak çıkan, fakat adı daha sonra Java'nın adını daha çok yaysın diye JavaScript'e dönüştürülen bu dile benzer Microsoft tarafından zamanında geliştirilmiş w:JScript de vardır. Bütün bu dilleri bir standartta toplamak üzere çıkarılmış ECMA-262 standardıyla bu dillerin temeline ECMAScript de denir. Ancak muhtelif üreticiler standartın dışına çıkmış, bu gelişmeler kısmen yıllar sonra standarda aslına tam uygun olmayan şekilde eklenmiştir.

Giriş
Kelime yapısı
Değişkenler
Operatörler
Koşul ifadeleri
Döngüler
Diziler
Fonksiyonlar
Nesneler
Ayrılmış sözcükler
Hata yakalama

JavaScript'te değişken tanımlamaları var anahtar sözcüğüyle yapılır. Örnek:

Buradaki document.write(a) kodu ekrana yazı yazdırmaya yarar. Parantez içindeki değişken, sabit ya da ifade ekrana yazdırılır.
Değişken tanımlamayla değişkene ilk değer vermeyi aynı satırda yapabiliriz:

Aynı satırda birden fazla değişken tanımlayabiliriz. Hatta bunlardan istediğimize değer atama, istediğimize değer atamama hakkımız da vardır:

JavaScript, zayıf tür güvenliğine sahip bir dildir. Aynı değişkende önce string, sonra sayı depolayabiliriz:

Ancak bu, JavaScript'te tür diye bir kavram olmadığı anlamına gelmez. JavaScript'te varsayılan olarak değişkenlerin türleri değişkenlere atanan değerlerden anlaşılır, değişkenin değerini değiştirdiğimizde değişkenin türü de otomatik olarak değişir. Ancak istersek bu varsayılan durumu değiştirebiliriz:

Nasılsa baştaki sıfırlar önemsiz diye sayıların başına sıfır koymamalıyız. Çünkü yukarıdaki kodda da görebileceğiniz üzere JavaScript yorumlayıcısı başında sıfır olan sayıları sekizlik sayı sistemindeki sayı olarak görmektedir.
Onaltılık ve sekizlik tabandaki sayı bildirimlerinde ondalık sayı ve E ile üstlü sayı bildiremeyiz. Onaltılık sayı bildiriminde E sayının içindeki bir rakam olarak görülür. Sekizlik sayı bildiriminde de sayının içinde E kullanılması durumunda betik hata verir.
Sekizlik sayı bildiriminde 0-7 aralığındaki rakamları kullanmalıyız.

Infinity artı sonsuzu ve -Infinity eksi sonsuzu ifade eder.
Eğer bir değişkenin değeri maksimum sayı kapasitesini aşarsa ilgili değişken Infinity değerini tutar. Benzer şekilde bir değişkenin değeri minimum sayı kapasitesinin altına inerse ilgili değişken -Infinity değerini tutar.
Bir sayıyı 0'a böldüğümüzde sonuçta Infinity değeri üretilir.
İstersek bir değişkene direkt Infinity ve -Infinity değerlerini atayabiliriz. Infinity ve -Infinity büyük-küçük harf duyarlılığına sahiptir.
Infinity ve -Infinity == ve != operatörleriyle kıyaslanabilir. == operatörü eğer taraflardan ikisi de Infinity veya taraflardan ikisi de -Infinity ise true, aksi takdirde false değeri üretilir. != operatörü ise bunun tam tersini yapar.
Infinity ve -Infinity >, <, <=, >= operatörleri vasıtasıyla kendileriyle, birbirleriyle veya diğer sayılarla kıyaslanabilir. Infinity kendisi hariç her sayıdan büyüktür. -Infinity ise kendisi hariç her sayıdan küçüktür.
Matematikteki sonsuz ile ilgili bütün kurallar Infinity ve -Infinity için de geçerlidir. Örneğin Infinity'ye 5 eklenirse sonuç yine Infinity olur. Bir sayı Infinity'ye bölünürse sonuç sıfır çıkar.

İlgili değerin geçerli bir sayı olmadığını belirtir.
0, 0'a bölünürse; Infinity'nin sinüsü alınırsa; Infinity ile -Infinity toplanırsa bu değer üretilir.
NaN ile herhangi bir aritmetik işlem yapılırsa sonuç NaN olur.
Herhangi bir karşılaştırma operatörü vasıtasıyla herhangi bir sayıyla veya kendisiyle karşılaştırılırsa daima false değeri üretilir.
Bir değişkene direkt NaN değeri atanabilir. NaN büyük-küçük harf duyarlılığına sahiptir.
Tipi ve değeri uygun olmayan değişkenlerle aritmetik işlem yapılırsa NaN değeri üretilir. Örneğin 5 ile "metin" çarpılırsa NaN değeri üretilir.

Stringlerin içinde kullanılabilen escape sequence'ler şunlardır:

Çift tırnak ile çevrelenmiş bir stringin içindeki tek tırnakları; tek tırnakla çevrelenmiş bir stringin içindeki çift tırnakları escape etme gereksinimi olmadan gönül rahatlığıyla kullanabiliriz.

Tanımlanmamış veya tanımlanmış ama değer atanmamış değişkenlerin tipi undefined'tır. undefined tipteki bir değişkeni ekrana yazmamız durumunda ekrana "undefined" yazılır. undefined değişkenler bellekte yer kaplamaz.

Bir değişkenin var olduğunu ve bellekte yer kapladığını ama değişkenin içinin "boş" olduğunu belirtir.

JavaScript tür güvenliği olmayan bir dildir. Aynı değişkende önce string, sonra tam sayı depolayabiliriz:

for döngüsünün çalışma prensibi şöyledir:
1) komut1 çalıştırılır.
2) Koşula bakılır. Eğer koşul sağlanıyorsa;

2.1) küme parantezleri içindeki ya da -küme parantezleri yoksa- kendinden sonra gelen ilk satırdaki komut çalıştırılır.
2.2) komut2 çalıştırılır.
2.3) 2. adıma dönülür.
3) Eğer koşul sağlanmıyorsa küme parantezleri dışına ya da -küme parantezleri yoksa- kendinden sonra gelen ilk satırdaki komuttan hemen sonraki satıra çıkılır. Dolayısıyla döngüden çıkılmış olur.

Koşul sağlandığı müddetçe komutlar çalıştırılır. Eğer bloğun içinde tek komut varsa söz konusu komutu küme parantezleri içine almaya gerek yoktur.

Komutlar önce her halükarda bir kez çalıştırılır. Daha sonra koşul sağlandığı müddetçe komutlar çalıştırılmaya devam edilir. Blok içinde bir tane komut varsa söz konusu komutu süslü parantezler içine almaya gerek yoktur.

Döngüden çıkmayı sağlar.

Döngünün o anki iterasyonunu sonlandırır. Bir sonraki iterasyona geçilir.

Döngüler ve koşul ifadeleri etiketlenebilir. Etiketleme aslında döngüye/koşul ifadesine isim verme işlemidir. Döngüye/koşul ifadesine isim verdikten sonra bu isim break ve continue anahtar sözcüğüyle kullanılabilir. Bu durumda o döngüden/koşul ifadesinden çıkılacaktır/başa dönülecektir. Örnek:

Bu kod ekrana 0 1 2 1 2 yazacaktır. Çünkü break AnaDongu; satırı ile en içteki döngüden değil AnaDongu döngüsünden çıkılır ki bu döngü en dıştaki döngüdür. Varsayılan durumda break ve continue komutlarıyla en içteki döngüden çıkılır/en içteki döngünün bir sonraki iterasyonuna geçilir.

JavaScript HTML içine gömülebilen, tarayıcılar tarafından yorumlanabilen, web sayfalarına etkileşim kazandırmak için kullanılan bir betik dilidir. Java programlama diliyle isim benzerliği dışında bir ilgisi yoktur. JavaScript bir ECMAScript implementasyonudur. JavaScript bir betik dilidir, dolayısıyla JavaScript ile yazılan programlar da betik (script) olarak adlandırılır.
JavaScript her ne kadar web sitelerini (web tarayıcıların JavaScript betiklerini çalıştırma yeteneğini kullanarak) daha işlevsel hale getirmek için geliştirilmiş ve yıllarca yalnızca bu amaçla kullanılmış olsa da günümüzde sunucu (server) tarafında da yoğun olarak kullanılmaktadır. Aslında JavaScript betikleri, bir JavaScript motorunun (engine) bulunduğu her cihazda çalıştırılabilir. Şirketler ve topluluklar tarafından geliştirilen farklı JavaScript motorları vardır:

Google Chrome ve Opera tarafından kullanılan V8
Mozilla Firefox tarafından kullanılan SpiderMonkey
Safari tarafından kullanılan SquirrelFish
Bunlar dışında daha birçok JavaScript motoru mevcuttur.
JavaScript betikleri öncelikle JavaScript motoru tarafından okunur. Okunan betik, derlenerek makine diline dönüştürülür ve son olarak bu makine kodu işleme konur.
Web tarayıcı üzerinde çalışan bir JavaScript betiği; web sayfasını değişikliğe uğratmak, kullanıcıyla etkileşimde bulunmak ve sunucu ile iletişim kurmak gibi işleri başarıyla gerçekleştirir. Ancak kullanıcının dosya sisteminden dosya okuma - yazma gibi işlemleri yapamaz. Çünkü web tarayıcılar, kullanıcının güvenliğini gözeterek birtakım işlemleri ya doğrudan engeller ya da kullanıcının onayına sunar. Fakat örneğin sunucu taraflı JavaScript kullanımını mümkün kılan (çünkü bünyesinde bir JavaScript motoru barındırır) Node.js isimli çalışma ortamı, geliştiricilere daha özgür bir ortam sunar.
Bir tarayıcı sekmesinde çalışan JavaScript betiği, başka bir sekmeyle haberleşemez. Örneğin ilk sekmede example.com alan adı altında çalışan bir betik, diğer sekmede açık olan example.org alan adına erişemez, bu alan adına bir ağ (network) isteğinde bulunamaz ve buradan herhangi bir bilgi alamaz. Buna Same Origin Policy (aynı kök politikası) adı verilir. Ancak JavaScript betikleri, çalıştıkları sayfanın bulunduğu sunucu ile etkileşim içinde olabilir. Sunucu taraflı çalışan JavaScript uygulamaları için ise bu tip kısıtlamalar söz konusu değildir.

Sunucu taraflı çalışma ortamlarında, örneğin Node.js ortamında, bir JavaScript betiğini çalıştırmak için komut satırında (terminal, command line) node ilk-betik.js komutunu vermek yeterlidir. Diğer taraftan JavaScript betikleri, HTML dokümanlarının herhangi bir yerinde <script> etiketiyle kullanılabilir:Bu HTML dokümanını web tarayıcıda açarak sonucu görebilirsiniz.
<script> etiketi, web tarayıcı tarafından, görüldüğü anda çalıştırılmaya başlanan JavaScript kodlarını içerir.

Eski bir standart olan HTML4 standardında, <script> etiketinin içerdiği ifadelerin bir JavaScript betiği olduğunu web tarayıcıya bildirmek için type niteliğini eklemek gerekirdi:Ancak günümüzde kullanılan HTML5 standardında bu gereksizdir. Çünkü HTML5 standardında, type niletiği için varsayılan (default) değer JavaScript'tir.
Bir de çok çok eski tarayıcıları bilgilendirmek için language niteliği kullanılırdı:Ancak günümüzde bu niteliği kullanmaya da gerek yoktur.
Oldukça eski JavaScript betiklerinde şöyle bir şeye rastlayabilirsiniz:
Buradaki yorum satırları, içerdiği JavaScript kodlarını, JavaScript betiklerini çalıştırma yeteneği bulunmayan web tarayıcılardan gizlemek için kullanılırdı. Ancak günümüzde oldukça yüksek kullanım oranına sahip olan modern tarayıcılar JavaScript betiklerini düzgünce çalıştırabilme kabiliyetine sahiptir.
Harici JavaScript betiklerini HTML dokümanına dahil etmek için <script> etiketine src niteliği eklenir ve bu niteliğe değer olarak harici betiğin URL'si verilir:

Betiklerin, sunucudaki göreceli yolları da kullanılabilir:
Dahil edilen harici betiklerin, web sayfası ile aynı alan adında bulunması gerekmez:

Fakat bu yöntemle kullanılan etiketlerin içine ayrıca JS kodu eklenmemelidir.
Basit, az sayıda işler yapan JavaScript kodları HTML dokümanlarının içerisine yerleştirilebilir. Ancak karmaşık işleri yerine getiren betiklerin betik dosyalarına kaydedilip harici olarak HTML dokümanına eklenmesi çoğunlukla daha iyidir. Bu sayede aynı dosya birden fazla sayfada kullanılabilir ve önbellek özelliği olan tarayıcılar dosyaları tekrar tekrar indirmek zorunda kalmaz.

Modern web tarayıcıların JavaScript çalıştırma özelliği, varsayılan olarak açık gelse de daha sonradan bu özellik kapatılabilmektedir. Eğer tarayıcının JavaScript çalıştırma özelliği kapalıysa kullanıcıya bir mesaj göstererek JavaScript özelliğini açmasını isteyebilirsiniz:

Ayrıca Javascript ile görünmez yapılan bir noscript'siz mesaj da yerleştirebilirsiniz. Bu daha stabil çalışır fakat sayfa ilk açıldığı zaman kısa bir süreliğine JS izni olsa bile görünebilme şeklinde bir sorunu vardır.

JavaScript kodlarını <script> etiketiyle sayfaya direkt gömdüğümüzde ilgili JavaScript kodları sayfa açılır açılmaz çalışacaktır. Ancak JavaScript kodlarını olaylara bağlayarak ilgili JavaScript kodlarının sadece ilgili olay gerçekleştiğinde çalışmasını sağlayabiliriz. Örnek:

Her HTML etiketi her olayı desteklemeyebilir. Buradaki onclick olayı tıklamayı belirtir. Daha bunun gibi birçok olay vardır. Olayları ayrıntılı olarak olaylar konusunda göreceğiz.

HTML dosyasında normalde link yazılması gereken bazı yerlere javascript: ön ekini izleyen JavaScript kodları yazabiliriz. Örnek:

Bu kodda kullanıcı linke tıkladığı zaman ilgili JavaScript kodları çalışacaktır.

JavaScript tek bir istisna dışında boşluk duyarlılığı olmayan bir dildir. Normalde her JavaScript komutunun ; (noktalı virgül) ile sonlandırılması gerekir. Ancak bu zorunluluk, eğer komutları farklı satırlarda yazmışsak ortadan kalkar. Yani JavaScript'te ; karakteri ve/veya yeni satır komut sonlandırma amacıyla kullanılabilir. Ancak elbetteki aynı satıra birden fazla komut koyacaksak bunları ; ile ayırmak zorundayız. Lakin komutlar satırlara bölünür iken bitiş olamaz noktadan bölünmelidir çünkü aksi halde komutun orada bittiği varsayılır.

JavaScript bloklama için C stilini kullanır. Yani { karakteri bloğu açar ve } karakteri bu bloğu kapatır. Bloklar komutları belirli bir amaç için gruplamak için kullanılır. Örneğin belirli bir koşul gerçekleştiğinde hangi komutlar çalışacak? Fonksiyon hangi komutlardan oluşuyor? vs.

JavaScript'in nesne yönelimli programlama desteği vardır.

Birincisinde document nesnesinin statik write() metoduyla ekrana deneme yazdık. İkincisinde ise Array nesnesinin statik olmayan length özelliğiyle ilgili dizinin eleman sayısını aldık. Bir metot veya özellik herhangi bir nesne türünden değer döndürebilir. Metotlar, bir nesneyle ilişkilendirilmiş fonksiyonlardan başka bir şey değildir. Özellikler ise yine bir nesneyle ilişkilendirilmiş değişkenlerdir.
JavaScript'te tanımladığımız her dizi aslında Array türünden bir nesnedir.

JavaScript'te yeni nesne tanımı farklı şekillerde yapılabilir:

veya

Yukarıdaki yöntemlerden herhangi biriyle oluşturduğumuz nesneyi aşağıdaki gibi kullanabiliriz:

Şimdi bu nesne kalıbını kullanarak yeni nesne oluşturalım:

Yapıcı metot kullanarak da nesnemizi oluşturabiliriz:

KRename'i Pardus menüsü -> Uygulamalar -> Yardımcı Programlar -> KRename yolunu izleyerek çalıştırdığınızda karşınıza aşağıdaki gibi bir pencere gelir.

Resimden de görebileceğiniz üzere KRename'de "Files", "Destination", "Plugins" ve "Filename" olmak üzere dört sekme vardır. Bu sekmelerin her birisinde farklı türde görevler bulunur ve bu sekmeler arasında hiçbir veri kaybı olmadan dolaşılabilir. Bu sekmelerin görevleri şunlardır:

Files: Bu sekmeden ismi değiştirilecek dosya ve klasörler alınır ve listelenir.
Destination: Bu sekmeden hedef klasörle ilgili işlemler yapılır.
Plugins: Bu sekmeden KRename ile kullanılacak çeşitli eklentiler ayarlanır.
Filename: Bizim için en önemli sekmedir. Dosyaların isimlerinin nasıl değişeceği bu bölümden ayarlanır.
Bu kitapta bu sekmelerin her biri ayrı sayfalar olarak yer almaktadır. KRename'in menü çubuğunda ise yalnızca "Yardım" menüsü vardır. Bu menünün ögeleri şunlardır:

KRename El Kitabı (F1): Buradan KRename'i nasıl kullanacağınızı anlatan KRename el kitabını okuyabilirsiniz. Ancak bu el kitabı Pardus'ta kullanılabilir değil.
Bu Nedir (Shift+F1): Buradan "bu nedir" yardımına başvurabilirsiniz. Ancak üzülerek söylemeliyiz ki KRename'de pek işinize yaramıyor.
Hata Bildir...: Buradan programın geliştiricilerine bir hata e-postası gönderebilirsiniz.
Uygulama Dilini Seç...: Buradan uygulamanın dilini değiştirebiliyorsunuz.
KRename Hakkında: Buradan kullandığınız KRename'in sürüm numarası gibi temel bilgilerini öğrenebiliyorsunuz.
KDE Hakkında: Buradan kullnadığınız KDE'nin sürüm numarası gibi temel bilgilerini öğrenebiliyorsunuz.

KRename'in "Destination" sekmesinde dört seçenek vardır:

Girdi dosyalarını yeniden adlandır: Varsayılan seçenektir. Alınan dosya/klasörlerin ismi değiştirilir.
Copy files to destination directory: Alınan dosya ve klasörlerin ismi değiştirilmiş halleri pencerenin aşağısında belirtilen adrese kopyalanır. Orijinal dosya ve klasörlerde değişiklik yapılmaz.
Dosyaları hedef dizine taşı: Dosya ve klasörlerin isimleri değiştirilip pencerenin aşağısında belirtilen klasöre taşınır.
Hedef dizinde simgesel bağ oluştur: Yeni isimlendirilmiş dosya ve klasörlerin simgesel bağı pencerenin aşağısında belirtilen klasöre koyulur.
NOT: Kopyalama ve taşıma esnasında eğer hedef klasörde aynı isimde dosya/klasör varsa normalde işlem gerçekleşmez. Ancak pencerenin aşağısındaki "Üzerine yaz" onay kutusu seçilirse böyle bir durumda ilgili dosyanın/klasörün üzerine yazılır.

Bu sayfada, kitabın daha önceki sayfalarında kısaca zikredilen ancak açıklanmayan değişken ve işaretler anlatılmaktadır. KRename'de bu değişken ve işaretler "Filename" sekmesindeki "Simple Filename" sekmesindeki Önek, Sonek, Filename ve Uzantı metin kutularında ve "Advanced Filename" sekmesindeki "Şablon" metin kutusunda (hem dosya adında hem de uzantısında) kullanılabilir. Ayrıca bu bahsettiğimiz metin kutularının hemen sağındaki yardım botuna benzeyen bir düğme vardır. Bu düğmeye bastığınızda karşınıza yandaki gibi bir pencere çıkar. Bu penceredeki sol kısım değişken kategorilerini, sağ kısım da ilgili kategorideki değişkenleri, ilgili değişkenin açıklamasını ve "Token Preview" onay kutusu seçiliyse belirli bir dosya için ön izlemesini gösterir. Ön izlemesi gösterilecek dosya "Preview File" kısmından belirlenir. "Category" listesinin üstündeki "Ara" metin kutusuna bir şeyler yazılarak kategoriler; değişkenler (sembol) listesinin üst kısmındaki "Ara" metin kutusuna bir şeyler yazılarak ise ilgili kategorideki değişkenler filtrelenebilir. İstediğiniz bir değişkeni ilgili metin kutusuna (hangi metin kutusunun yanındaki yardım botuna tıklamışsanız) eklemek için ilgili değişkeni çift tıklamak, tek tıklamak (bilgisayarınızın yapılandırmasına göre) veya tek tıklayıp aşağıdaki "Insert" butonuna basmak yeterlidir. Şimdi isterseniz değişkenleri anlatmaya başlayalım.
NOT: Değişken isimlerinde büyük-küçük harf duyarlılığı yoktur.

Transliteration kategorisinde sadece transliterated değişkeni bulunur. Bu değişken başka dildeki karakterleri en yakın İngilizce karşılığına dönüştürür. Ancak çok sevinmeyin. Türkçe karakterlerden yalnızca ö, ü, Ö, Ü karakterlerini o, u, O, U'ya dönüştürüyor. Diğer Türkçe karakterleri olduğu gibi bırakıyor. Kiril alfabesi ve diğer bazı Latin olmayan alfabe türlerinde de başarılı sonuçlar veriyor. Benim önerim Türkçe karakterleri yok etmek için bu değişkeni kullanmamanız. Bunun yerine "Bul ve Değiştir" butonunu kullanın. Transliterated değişkeninin beş farklı formu vardır:

[transliterated;metin] → Herhangi bir metni translitere eder.
[transliterated] → Orijinal dosya adını translitere eder.
[%transliterated] → Orijinal dosya adını translitere edip tamamen küçük harfe dönüştürür.
[&transliterated] → Orijinal dosya adını translitere edip tamamen büyük harfe dönüştürür.
[*transliterated] → Orijinal dosya adını translitere edip sadece kelimelerin ilk harflerini büyük harfe dönüştürür.

Bu kategoride çeşitli müzik dosyalarından parça bilgisi almaya yarayan değişkenler bulunur. 

[tagYear] → Şarkının içinde olduğu albümün çıkış yılı.
[tagTrack] → Şarkının albümdeki sırası.
[##tagTrack] → Şarkının albümdeki sırası. Ancak 01, 02, 03, ... şeklinde.
[tagTitle] → Şarkının adı.
[tagGenre] → Şarkının türü.
[tagComment] → Şarkının açıklaması.
[tagArtist] → Şarkıyı söyleyen.
[tagAlbum] → Şarkının içinde olduğu albüm.

Bu kategoride dosya adına özel karakterler eklemeye yarayan işaretler bulunur.

\% → Dosya adına % karakterini ekler.
\# → Dosya adına # karakterini ekler.
\& → Dosya adına & karakterini ekler.
\\ → Dosya adına \ karakterini ekler.
\* → Dosya adına * karakterini ekler.
\$ → Dosya adına $ karakterini ekler.
\] → Dosya adına ] karakterini ekler.
\[ → Dosya adına [ karakterini ekler.
\/ → Dosya adına / karakterini ekler.

Bu kategoride dosya adına herhangi bir JavaScript kodu eklemeye yarayan [js] değişkeni bulunur. Örneğin [js;4+5] dosya adına 4 ve 5'in toplamını yani 9'u ekler. Ayrıca daha önce Plugins sekmesinde tanımladığımız JavaScript değişken ve fonksiyonları [js;degisken_adi] ve [js;fonksiyon_adi] yazılarak dosya adında kullanılabilir.

Bu kategoride, resim dosyalarının bilgilerini almaya yarayan tam 249 değişken var. Ancak bu değişkenlerin büyük kısmı fotoğrafçılık ve/veya dijital resim üretimi konularıyla ciddi anlamda ilgilenenleri ilgilendiriyor. Buradaki değişkenlerin çok az kısmı sıradan kullanıcılara hitap ediyor. Diğerlerini kendiniz deneyerek öğrenebilirsiniz. Zaten isimleri son derece ne işe yaradıklarını açıklayıcı cinsten. Şimdi isterseniz herkese hitap eden bu az sayıdaki değişkeni inceleyelim:

[exifExif.Image.ImageWidth] → Resmin genişliği (piksel cinsinden)
[exifExif.Image.ImageLength] → Resmin yüksekliği (piksel cinsinden)
[exifExif.Photo.DateTimeOriginal] → Fotoğrafın çekilme zamanı. Örneğin 1 Ocak 2010 tarihinde saat 12'yi 5 geçe, saniye 10'u gösterirken çekilen bir fotoğraf için 2010:01:01 12:05:10 değerini üretir.
[exifExif.Image.Make] → Fotoğrafı çeken fotoğraf makinesinin markası
[exifExif.Image.Model] → Fotoğrafı çeken fotoğraf makinesinin modeli

Bu kategoride şu değişkenler bulunur:

[year] → Şu anki yıl.
[user] → Dosyanın sahibi.
[time] → Şu anki saat. Örneğin saat 12'yi 5 geçiyor, saniye de 20'yi gösteriyorsa: 12-05-20
[second] → Şu anki saniye. Az önceki örneğimizi göz önüne alırsak 20
[month] → Şu anki ay (sayı olarak).
[modificationdate;

Filename sekmesi KRename'in en önemli sekmesidir. Dosyaların yeni isimleri bu sekmeden belirlenir. "Advanced Filename" ve "Simple Filename" olmak üzere iki alt sekmesi vardır. Simple Filename ve Advanced Filename sekmelerinin her ikisinde de aslında aynı şey yapılır, ancak yöntemler farklıdır. Simple Filename sekmesinde her şey tıklayarak ve kolayca yapılır, Advanced Filename sekmesinde ise şablonu bazı özel karakterler ve değişkenler yardımıyla sıfırdan oluştururuz. Bu iki sekme arasında rahatlıkla veri kaybı olmadan dolaşabilirsiniz. Şimdi isterseniz Filename penceresindeki kontrollere tek tek göz atalım.

Filename penceresinde sekmeden bağımsız bir önizleme kutusu vardır (pencerenin alt kısmındaki beyaz kutu). Bu kutunun içinde "İlk hali" ve "Adlandırılmış hali" adlı iki sütun vardır. Bu kutuda "Files" penceresindeki dosyalar Files penceresindeki sıraya göre listelenir. "İlk hali" sütununda dosya isimlerinin ilk halleri "Adlandırılmış hali" sütununda da sekmelerde yapılan değişikliklerin dosya isimlerine uygulanmış hali gözükür. Pencerenin en alt kısmındaki "Bitir" düğmesine basılırsa dosyaların isimleri "Adlandırılmış hali" sütununda belirtilen isim olur. Tıpkı "Files" penceresinde olduğu gibi burada da dosyaları seçip "Yukarı" ve "Down" düğmelerine tıklayarak ilgili dosyaları aşağı ve yukarı taşıyabilirsiniz. Ancak siz yine de bu işlem için "Files" sekmesini kullanın. Bu özellik pek kararlı gelmedi bana. Önizleme kutusundaki dosyalara sağ tıkladığınızda çıkan menüde şu ögeler vardır:

Change filename manually... F2: Bu öge seçilerek dosyanın ismi KRename'de ayarlanılan isim, orijinal isim veya gireceğiniz belirli bir isim yapılabilir. Genellikle KRename'deki düzen dışı dosyaları belirtmek için kullanılır. Bu ögenin açtığı pencere ilgili dosya tıklanarak (veya çift tıklanarak) da açılabilir.
Aç: Dosya, o dosya türünü varsayılan olarak açan programla açılır.
Ekle...: Listeye dosya/klasör eklenir.
Kaldır: İlgili dosya listeden kaldırılır.

Her bir dosyanın başına koyulacak metin buradan ayarlanır. Açılır kutudan "Sayı" ögesi seçilerek her dosyanın başına sırayla sayılar koyulması sağlanabilir. Bu koyulacak sayının ayarları (başlangıç numarası ve hane sayısı) sağ kısımdaki "Number" alanından yapılır. İstenirse açılır kutudan "Tarih" ögesi seçilerek her dosyanın başına günün tarihinin konulması sağlanabilir. Açılır kutunun hemen sağındaki metin alanına bir metin girilerek her bir dosyanın başına belirli bir metnin de koyulmasını sağlayabilirsiniz. Bu metinde özel KRename değişkenleri kullanılabilir. Metin kutusunun hemen sağındaki yardım botuna benzeyen düğmeye tıklayarak ise bu özel değişkenleri metne kolayca ekleyebilirsiniz. Bu özel değişkenler kitabın bir sonraki bölümünde anlatılacaktır.

Önek ile aynıdır. Tek fark ilgili metnin, dosya adının sonuna eklenmesidir (uzantıdan önce).

Dosyanın orijinal isminde değişiklik yapmayan, sadece dosya ismine birtakım metin ekleyen Önek ve Sonek'ten farklı olarak burada dosya isminin tamamını etkileyen değişiklikler yapılır. Buradaki açılır kutuda beş seçenek vardır:

Özgün ismi kullan: Dosyanın isminde değişiklik yapılmaz (varsayılan).
Convert to lower case: Dosyanın ismindeki büyük harfler küçük harfe çevrilir.
Büyük harflere çevir: Dosyanın ismindeki küçük harfler büyük harfe çevrilir.
Baş harflerini büyük yap: Dosya ismindeki her bir kelimenin sadece ilk harfi büyük yapılır. Boşluk ve _ (alt çizgi) karakterleri kelime ayırıcı karakterler sayılır.
Özel isim: Dosyanın ismi açılır kutunun hemen sağındaki metin alanına girilen metin yapılır. Bu metinde özel değişkenler kullanılabilir. Hemen sağdaki yardım botuna benzer düğmeye basılarak bu özel değişkenler kolayca eklenebilir.

Filename ile aynıdır. Tek fark burada dosyanın ismi değil, uzantısı değiştirilir.

Bu buton vasıtasıyla dosya ismindeki belirli bir karakter ya da karakter grubunun başka bir karakter ya da karakter grubuyla değiştirilmesini sağlayabilirsiniz. Bu butona bastığınızda karşınıza soldaki gibi bir pencere çıkar. Bu penceredeki "Ekle" butonuna bastığınızda ise karşınıza sağdaki gibi bir pencere çıkar. Bu çıkan penceredeki "Find" metin kutusuna dosya isminde bulunacak metni, "Replace With" metin kutusuna da bulunan metnin yerine koyulacak metni girin. "Find is a Regular Expression" onay kutusuna basarak Find metin kutusuna yazılan metindeki düzenli ifadelerin normal metin değil de düzenli ifade olarak algılanmasını sağlayabilirsiniz. Düzenli ifadeler tek başına kitap olabilecek bir konudur. Ama isterseniz Linux İşletim Sistemi kitabının Düzenli ifadeler sayfasına bir göz atabilirsiniz (anlatım Linux'taki grep ve sed gibi çeşitli komutlara göredir ama işinize yarayabilir). Aranacak ve değiştirilecek metni girdikten sonra "Tamam" düğmesine basın. Artık "Bul ve Değiştir" penceresinde eklediğiniz girdi listelenecektir. "Reg. Expression" sütunundaki ögede tik işaretinin olması aranan metindeki düzenli ifadelerin normal metin değil, düzenli ifade olarak sayılacağını belirtir. İstenirse buradan bu tik temizlenerek veya işaretlenerek ilgili metindeki düzenli ifadelerin düzenli ifade veya normal metin olup olmama durumları değiştirilebilir. Herhangi bir girdi seçilip "Düzenle" düğmesine tıklanarak ilgili girdinin bileşenleri değiştirilebilir. istenirse bir girdi seçilip "Kaldır" düğmesine tıklanarak ilgili girdi temizlenebilir. Bu penceren de tamam diyerek çıkılırsa ilgili girdinin/girdilerin belirttiği değişiklikler aktifleştirilir. Ancak henüz değişiklikler yapılmaz, bunun için KRename'in asıl penceresindeki "Filename" penceresindeki "Bitir" düğmesine basmak gerekir.

Advanced Filename sekmesinde, Simple Filename sekmesinin aksine dosya adlandırma pencere kontrollerinden ziyade özel değişkenler ve işaretlerle yapılır. O yüzden bu kısmı iyi kullanabilmek için bu değişken ve işaretleri bilmek gerekir. Bu değişken ve işaretler kitabın bir sonraki sayfasında anlatılacaktır. Şimdi isterseniz Advanced Filename penceresindeki kontrollerden bahsedelim.

Buradaki metin kutularına dosyaların yeni adı ve uzantısı yazılır. İşlevler butonuna basılarak dosya adı alanına özel bir işaret veya değişken girilebilir.

Bu onay kutusu seçilerek uzantıda değişiklik yapılmaması sağlanabilir.

Bu açılır kutudan dosyanın tam isminin hangi kısmının uzantı sayılacağı belirtilir. Seçenekler şunlardır:

İlk Nokta: Dosyanın tam ismindeki ilk noktayla karşılaşılan kısımdan sonrası uzantı kabul edilir. .tar.gz gibi birden fazla uzantısı olan dosyalar için uygundur.
Son Nokta: Dosyanın tam ismindeki son noktayla karşılaşılan kısımdan sonrası uzantı kabul edilir. Listede sadece normal uzantılı dosyalar varsa uygundur.
No File Extension: Dosyaların uzantılarının olmadığı, tam dosyanın tamamının gerçek dosya ismi olduğu varsayılır.
Belirli bir sayı: Bazen de bu açılır kutuda 1, 2, 3, ... gibi sayılar olur. Bu sayılar dosyanın asıl ismindeki nokta sayısını belirtir. Örneğin 1'in anlamı dosyanın asıl isminde 1 tane nokta olduğu ve dosya uzantısının ikinci noktadan itibaren başladığını belirtir. Listedeki dosyalardaki . işareti sayısına göre 2, 3 ve benzeri sayılar da listede kendine yer bulabilir.

"Simple Filename" sekmesindekiyle aynı işlevdedir.

Bu butonla ile bir sonraki sayfada göreceğimiz numaralama işaretinin kullanacağı sayıları belirleriz. Bu butona basıldığında soldaki pencere çıkar. Bu pencereden numaralandırmanın hangi sayıdan başlayacağı, kaçar kaçar artacağı, her yeni dizinde sıfırlanıp sıfırlanmayacağı (alınan bütün dosyalar/klasörler aynı klasörden olmayabilir) ve numaralandırma için kullanılmayacak (o numaraya rastlanıldığında hemen bir sonraki sıradaki numaraya atlanacak) numaralar belirtilir.
NOT: Burada yapılan ayarlar "Simple Filename" sekmesinde "Önek" veya "Sonek" için "Sayı" seçeneği seçilmesi durumunda eklenen sayıları da etkiler.

Bu butonla her bir dosyanın önceki ismindeki belirli sıradaki bir karakterden itibaren belirli bir karakter alımı sağlanır. Bu butona basılınca soldaki pencere çıkar. Bu çıkan pencerede listedeki ilk dosyanın orijinal ismi bulunmaktadır, bu ismin belirli bir kısmı seçilir. "Seçimi ters çevir" onay kutusu seçilirse metindeki seçilmeyen kısım alınır. "Convert Selection" açılır kutusundan seçime büyütme, küçültme veya sadece baş harfleri büyütme işlemleri uygulanabilir. Ayrıca yine bu pencereden, yapılacak işlemler için üretilen kodu da görebilirsiniz.

KRename'deki işlerimizi bitirip "Filename" sekmesindeyken pencerenin en altındaki "Bitir" düğmesine tıkladığımızda karşımıza yandaki gibi bir pencere gelir. Ekran görüntüsünde isimlendirmenin hatasız olarak yapıldığı belirtiliyor. Eğer isimlendirme yapıl(a)mazsa hangi dosyanın isimlendirilemediği, kaç tane hata oluştuğu, dosyanın isminin ne yapılmaya çalışıldığı gibi ayrıntılar bu pencereden verilir. Bu pencerenin alt kısmında dört buton vardır:
Rename more... Bu butona basıldığında dört alt seçenek açılır:
   Restart KRename... KRename, Files sekmesi boş olacak şekilde yeniden başlatılır.
   İşlenmiş Dosyaları Tekrar Yeniden Adlandır... KRename, Files sekmesinde ismi başarıyla değiştirilmiş dosyalar olacak şekilde yeniden başlatılır.
   Rename Unprocessed Files Again... KRename, Files sekmesinde ismi değiştirilememiş dosyalar olacak şekilde yeniden başlatılır.
   Rename All Files Again... KRename, Files sekmesinde bütün dosyalar olacak şekilde (ismi değiştirilmişler veya değiştirilememişler) yeniden başlatılır.
NOT: Dosyalar bu seçeneklerden biriyle Files penceresine geri getirildiğinde önceki sıralama hatırlanmaz. Files penceresinde hangi sıralama modu aktifse (artan, azalan, vb.) sıralama ona göredir.
Geri Al: Yapılan isimlendirme işlemi geri alınır.
Open Destination: Hedef klasör (Destination sekmesinde belirlediğiniz klasör) varsayılan dosya yöneticinizle açılır. Eğer Destination sekmesinde "Girdi dosyalarını yeniden adlandır"ı seçtiyseniz ve dosyaları farklı klasörlerden topladıysanız hedef klasör Files penceresindeki listedeki ilk dosyanın içinde bulunduğu klasör olur. Eğer "Subdirectory-Sort Plugin" eklentisini etkinleştirmişseniz yine d

Files sekmesinden KRename'e ismi değiştirilecek dosyalar/klasörler eklenir, kaldırılır ve bazı diğer işlemler yapılır.

KRename'i açın. Karşınıza ilk olarak Files sekmesi gelecektir. Bu sekmenin penceresinin sağ kısmındaki Ekle... butonuna basarak veya orta kısımdaki Add some files... linkine tıklayarak dosya açma penceresini ekrana getirin.

Burada birden fazla dosya seçmek için CTRL ve SHIFT tuşlarını kullanabilirsiniz.
Varsayılan durumda bu pencereden KRename'e klasör ekleyemeyiz. Bir veya birden fazla klasör seçip ekle dediğimizde ilgili klasör(ler)deki dosyalar eklenir. Eğer ilgili klasörün/klasörlerin içinde başka klasörler de varsa o alt klasörler de eklenmeyecektir. Örneğin elimizde a isminde bir klasör olsun, bu klasörün içinde de 1.jpg ile 2.jpg dosyaları ve b klasörü olsun, b klasörünün içinde de 3.jpg dosyası olsun. Biz a klasörünü seçip ekle dediğimizde KRename'e yalnızca 1.jpg ve 2.jpg dosyaları eklenecektir. Burada gerek b klasörünün kendisi, gerekse içindeki her türlü dosya/klasör bizi ilgilendirmemektedir. İşte bu pencerenin alt kısmındaki onay kutuları bu varsayılan durumu değiştirmek için kullanılır:
Dosya adlarıyla birlikte dizin adlarını ekle: Seçip ekle dediğimiz klasörün içindeki dosya ve klasörler ve ilgili klasörün kendisi KRename'e eklenir. Seçip ekle dediğimiz klasörün içindeki klasörün içinde de dosya ve/veya klasörler varsa bunlar KRename'e eklenmez. Yukarıdaki örneğimizde 1.jpg ve 2.jpg dosyaları ve a ve b klasörleri KRename'e eklenecektir.
Alt dizinleri özyinelemeli olarak ekle: Seçip ekle dediğimiz klasörün içinde başka klasörler de varsa o klasörlerin içindeki içerik de KRename'e eklenir, ve hatta o alt klasörün içinde başka klasör varsa o klasörün içeriği de KRename'e eklenir. Bu döngü sonsuzdur. Yani sonuçta mantıken bir klasörün içinde olan tüm dosyalar (veya az önceki seçenek seçiliyse tüm klasörler de) KRename'e eklenecektir.
Gizli dizinleri ekle: Normalde seçtiğimiz klasörün içinde gizli dosya/klasörler varsa bu ögeler KRename'e eklenmez. Ancak bu onay kutusunu seçerek bu ögelerin de eklenmesini sağlayabiliriz. Yalnızca, "Alt dizinleri özyinelemeli olarak ekle" onay kutusu seçildiğinde seçilebilir hale gelir. Yaptığım denemelerde hem "Dosya adlarıyla birlikte dizin adlarını ekle", hem "Alt dizinleri özyinelemeli olarak ekle" ve hem de "Gizli dizinleri ekle" onay kutuları seçildiğinde seçilen klasörün kendisinin KRename'e eklenmediğini gördüm. Ancak bu bir hata (bug) veya kararsız bir özellik gibi gözüküyor. İleride KRename geliştiricilerinin bu sorunu düzelteceğini umuyorum.
Sadece dizin isimlerini ekle: Bu onay kutusu seçilirse hiçbir dosya (seçilse bile) KRename'e eklenmez. Eğer bir klasör seçmişsek ilgili klasörün içindeki klasörler KRename'e eklenir. Adeta dosyalar yok sayılır, varsayılan durumun (hiçbir onay kutusunun işaretlenmemiş olduğu durum) tam tersidir. Ayrıca yukarıda bahsettiğim hata burada da oluşuyor. "Alt dizinleri özyinelemeli olarak ekle", "Gizli dizinleri ekle" ve "Sadece dizin isimlerini ekle" onay kutuları, hepsi birden seçili halde olduğunda asıl seçilen klasör KRename'e eklenmiyor.
KRename'e Krename arayüzünden dosya/klasör ekleyebileceğimiz gibi Dolphin ve Konqueror'da herhangi bir dosya/klasörü sağ tıklayıp veya birden fazla dosya ve/veya klasörü seçip sağ tıklayıp açılan menüden "Eylemler -> Rename with KRename"i tıklayarak da ilgili ögelerin KRename ile açılmasını sağlayabilirsiniz. Bu durumda ilgili ögeler varsayılan modda açılacaktır. Yani yukarıda bahsettiğimiz onay kutularının hiçbirinin seçilmediği varsayılacaktır.
Ayrıca Dolphin ve Konqueror'da herhangi bir veya birden fazla klasörü seçip sağ tıkladığınızda karşınıza çıkan menünün "Eylemler" alt kısmında "Rename with KRename (with subfolders)" girdisinin de olduğunu göreceksiniz. Bu girdiyi seçerseniz yukarıda bahsettiğimiz onay kutularından sadece "Alt dizinleri özyinelemeli olarak ekle" onay kutusunun seçili olduğu durumun aynısı olacaktır.
KRename'e başka bir dosya/klasör ekleme yolu da sürüklemektir. Eğer isterseniz Dolphin veya Konqueror'dan KRename'in "Files" penceresine dosya/klasör sürükleyebilirsiniz. Bu durumda da yine yukarıda bahsettiğimiz onay kutularından sadece "Alt dizinleri özyinelemeli olarak ekle" onay kutusunun seçili olduğu durumun aynısı olacaktır.

Files sekmesi içerisindeki Önizleme seçeneği ile resim ve videolarınız için önizleme yapabilirsiniz. Önizleme seçeneği seçiliyken dosya isimlerini de görmek istemiyorsanız, Görüntüleme ismi seçeneğini kaldırmanız yeterli olacaktır. Eğer KRename, listedeki bir dosya için önizleme sunamaz ise o dosya için sadece ilgili dosya ikonunu gösterir.

Files sekmesindeki sıra son derece önemlidir. Çünkü daha sonra dosya isimlerine numaralar eklerken buradaki sıra baz alınacaktır. Normalde Files penceresinde dosyalar eklenme sırasıyla sıralanır. Ancak istersek Files penceresinin sağ kısmındaki "Sıralama" açılır listesini kullanarak bu sıralamayı değiştirebiliriz. Şimdi isterseniz "Sıralama" açılır listesindeki ölçütlere bir göz atalım:

Sırasız: Sıralama yok. Eklenme sırasına göre (varsayılan).
Artan: Alfabetik, sözlük yöntemiyle.
Azalan: Ters alfabetik.
Sayısal: Sayıların mantıksal büyüklüğüne göre. Örneğin bu sıralamada Dosya3.jpg dosyası Dosya23.jpg dosyasından önce gelir. Bunun dışında "Artan" ile aynıdır.
Rastgele:Rastgele sıra.
NOT: Krename'in artan sıralaması şöyledir: boşluk Ç Ö Ü ç ö ü Ğ ğ İ ı Ş ş ' ( ) , - . 0...9 A...Z _ a...z
NOT: Gerek sistemler arası uyumluluk ve gerekse kafa karışıklığını önlemek için dosya adlarında ' ( ) , - . _ karakterleri dışında simge kullanmamanız tavsiye edilir.
Ayrıca Files penceresinden bir veya daha fazla dosya/klasör seçip sağ kısmındaki "up" veya "down" düğmelerine basarak ilgili ögelerin bir basamak yukarı veya aşağı gitmesini sağlayabilirsiniz.

Dosya ve klasörleri listeden kaldırmak için kaldırmak istediğiniz dosya ve/veya klasörleri seçip "Kaldır" düğmesine basın, veya "Remove All" düğmesine basarak listedeki tüm ögeleri kaldırın.
NOT: Aşağıdaki "Bitir" ve "Kapat" düğmeleri sekmeden bağımsızdır ve bütün yapacaklarımızı bitirdiğimizde dosya adlandırmanın gerçekleşmesi için ("Bitir") veya hiçbir şey yapmadan KRename'den çıkmak için ("Kapat") kullanılır.
NOT: Files penceresindeki "Specify the new filenames by giving a template..." linkinin tek görevi "Filename" sekmesini açmasıdır. Bunu "Filename" sekmesine tıklayarak da yapabilirsiniz. Eğer isimlendirilecek dosyalardan önce şablonu belirtmek istiyorsanız bu linki kullanabilirsiniz.

Plugins sekmesi KRename'in eklenti yönetimiyle ilgilenen kısmıdır. Yandaki penceredeki sol kısım KRename ile kullanılabilen eklentileri listeler, sağ kısımda da seçili eklentinin açıklaması, seçili eklentiye ait olan değişkenler ve ilgili eklentinin ayarları bulunur. "Ara" kutusuna bir şeyler yazılarak sol kısımda listelenen eklentiler filtrelenebilir.
KRename'in Plugins sekmesinde, bazı eklentiler etkinleştirilip ismi değiştirilen dosyalara uygulanabilirken bazı eklentilerin de sadece sunduğu değişkenler listelenir. İkinci tür eklentilerin ayarlarını değiştirmek veya bu eklentileri pasifleştirmek mümkün değildir. Şimdi isterseniz sadece uygulanabilen eklentileri inceleyelim. Çünkü diğer eklentiler Plugins sekmesinde sadece sundukları değişkenler ile ifade ediliyorlar ki zaten kitabımızın en son bölümünde bu değişkenleri ayrıntıları ile göreceğiz.

İsmi değiştirilen dosya ve klasörlerin izin ve sahipliğini de topluca değiştirmeye yarar.

İsmi değiştirilen dosya ve klasörleri yeni oluşturulacak alt klasörlere dağıtmaya (taşıyarak) yarar. Her bir klasörde kaç dosya olacağı, klasörlerin nasıl numaralandırılacağı (başlangıç numarası, hane sayısı) ve alt klasörlerin hangi klasörde oluşturulacağı buradan ayarlanır. Eğer ismi değiştirilen öge klasörse klasörün içeriği de taşınır. Dosyaların/klasörlerin alt klasörlere yerleştirilme sırası Files penceresindeki sıraya göredir. Duruma göre yerleştirilen son klasördeki dosya sayısı olması gerekenden az olabilir. Örneğin elimizde 16 dosya olsun ve bu 16 dosyayı her birinin içinde 5 dosya olacak olan klasörlere dağıtalım. Bu durumda en son klasörde yalnızca 1 dosya olacaktır.

Buradan dosya adlandırılırken kullanılacak JavaScript değişkenleri ve fonksiyonları oluşturulabilir. Değişken oluştururken değil ama fonksiyon oluştururken en azından temel JavaScript bilgisine sahip olmak gerekir. Değişken oluştururken sadece değişkenin ismini, türünü (string, int, double veya boolean) ve ilk değerini belirtmek yeterlidir. Burada oluşturduğumuz değişken ve fonksiyonların dosya adlandırılırken nasıl kullanılacağı kitabın en son bölümünde anlatılacaktır.

Dosya/klasör isimlerindeki sayıları düşürmeye/yükseltmeye yarar. Örneğin elimizde dosya05.jpg, dosya06.jpg ve dosya10.jpg olsun. Offset'i -5 olarak ayarlarsak bu dosyaların isimleri artık dosya00.jpg, dosya01.jpg ve dosya05.jpg olur. Bu eklentiyi kullanırken en dikkat etmemiz gereken şey programın ismini değiştirdiği dosyaların yeni isimlerinin ilgili klasörde zaten olan ve henüz ismi değiştirilmemiş dosyalarla isim çakışıklığına girmemesini sağlamaktır. KRename, dosyaları Files penceresindeki sıraya göre isimlendirme kuyruğuna alır. Örneğin Files penceresinde artan sıralamalı dosya05.jpg, dosya06.jpg ve dosya10.jpg dosyaları olsun. Biz offseti 5 olarak ayarlayıp "Filename" sekmesinden "Bitir" dersek dosya05.jpg dosyasının ismi değişemeyecektir. Çünkü ilgili dosyanın ismi artık dosya10.jpg olacaktır ve zaten o klasörde o isimde dosya vardır. Bunu engellemenin yolu Files sekmesinde dosyaları azalan olarak sıralamak veya Destination sekmesinde taşıma veya kopyalama modunu seçmektir.

Dosya ve klasörlerin son erişim/değişiklik tarihini ve saatini topluca değiştirmeye yarar. Dosya ve klasörlerin erişim ve değişiklik tarihini farklı değerler olarak ayarlamak istiyorsanız önce tarihi ve saati seçip, "Erişim tarihini & saatini değiştirin" onay kutusunu seçip "Filename" sekmesinden "Bitir" düğmesine basarsınız; sonra benzer işlemi "Change modification date & time" onay kutusunu seçip yaparsınız.
NOT: Bütün bu eklentileri uygularken dosyanın/klasörün ismini değiştirmek zorunda değilsiniz. İsim değişikliği yapmadığınızda KRename'in yapılan işlemleri ve varsa hataları gösteren çıkış penceresinde isimlendirmenin yapılamadığına dair bir girdi görürsünüz.
NOT: Bu eklentileri aktifleştirdikten ve varsa ayarlarını yaptıktan sonra dosyaya/klasöre uygulamak için "Filename" sekmesine geçip en aşağıdaki "Bitir" düğmesine tıklayın.

1,2 kilogram kemikli dana kaburga
3 yemek kaşığı zeytinyağı
1 adet soğan
1 adet havuç
3 diş sarımsak
3 adet kuru domates
2 adet kurutulmuş biber
1 yemek kaşığı domates salçası
1 çay kaşığı kekik
1 çay kaşığı toz kırmızı biber
1 çay kaşığı karabiber
3 çay kaşığı tuz
4 su bardağı tavuk suyu

1,5 su bardağı süzme yoğurt
3 salatalık
2 kuru soğan
1 diş sarımsak
1/2 adet limon suyu
1 çay kaşığı tuz
1/4 demet dereotu

3 adet baget ekmeği

Dana kaburga etini zeytinyağı, tuz ve karabiber ile harmanlayın.
Fırına uygun bir tencereyi yüksek ateşte önceden ocak üzerinde ısıtın. Ardından ateşi kısıp eti tencerede her yerini mühürleyin.
Eti mühürledikten sonra tencereden alın.
Tencereye iri parçalar şeklinde havucu, soğanı, sarımsakları, salçayı ve baharatları koyup kavurun.
Kavrulan karışımın üzerine tavuk suyu ekleyip kaynatın.
Eti kemikleri üstte kalacak şekilde tekrar tencereye alın ve ocaktan alıp üzerini alüminyum folyo ile sarın.
Eti tencereyle 170 derecelik fırında 4 saat pişirin.
Pişen eti fırından çıkarın ve 30 dakika dinlendirin.
Etinizi ayrı bir tepsiye alıp kemiklerini, fazla yağları ve sert yüzeyleri çatal yardımıyla temizleyin.
Kalan etleri çatal ile didikleyip tenceredeki sudan etleri örtecek şekilde üstüne ekleyin.
Cacık sos için salatalıkları soyup rendeleyin. Soğanı piyaz kesin, sarımsağı ezin ve dereotunu ince ince kıyın.
Kasede hazırladığınız sos malzemelerini karıştırın.
Baget ekmeklerini ikiye bölün ve enlemesine ikiye kesin.
Sandviç ekmeğinin içine didiklenmiş eti, cacık sosunu, roka yapraklarını ve dilimlenmiş domatesi ekleyin.
Üst ekmek parçasını kapatın ve servis edin.
Dana kaburga sandviçiniz hazır! Afiyet olsun!

Fetal beyin malformasyonlarının ultrason taraması 19-22 haftalar arasında yapılır. Fetal beynin değerlendirmesi için yapılan ikinci trimestr anomali taraması transtalamik, transventriküler ve transserebellar aksial planları içerir. Bu, standart bir yaklaşım haline gelmiştir. Ancak, beynin temel gelişimi gebeliğin ikinci yarısında olur. Nöronal proliferasyon, migrasyon ve organizasyon gebeliğin ikinci yarısında oluşur. Kanama ve tümörler gibi kazanılmış lezyonlar için de aynı durum geçerlidir. Bu nedenle beyin anomalileri ikinci trimestrde araştırılmakla birlikte migrasyon, proliferasyon ve organizasyon hastalıkları ve kazanılmış lezyonlar üçüncü trimerstrde görülür hale gelir. 

Santral Sinir Sistemi (SSS) anomalilerinin tarama muayenesi abdominal ultrason ile ve kolayca elde edilebilen aksial tarama planları ile yapılır. Koronal ve sagittal planların alınması zordur ve genellikle transvajinal ultrasonografi gerektirir. Ancak SSS anomalileri için artmış riski bulunan olgularda uygulanması gerekebilir. Buna fetal nörosonogram denir. Yüksek frekanslı transdüserlerle transvajinal ultrason genellikle birinci trimestrde uygulanır. Birinci trimestrde transvajinal ultrason ile fetal beyin değerlendirilirken fetal beynin gelişimi, tipik hızlı gelişen morfolojik değişikliklerin izlenmesi ve erken saptanabilen bazı anomalilerin (anensefali, alobar holoprozensefali gibi) için kullanılır. İlerleyen gebelik haftalarında fetus verteks pozisyonunda ise kompleks malformasyonların değerlendirilmesi, normal veya anormal orta hat yapılarının incelenmesi için çok kullanışlı hale gelir. Aslında transdüser ile fetal baş arasındaki mesafeye de bağlı olmak üzere daha yüksek frekanslı transdüserler kullanıldıkça fetal beyin daha iyi değerlendirilebilir, koronal ve sagittal planlar, neonatal transfontanel ultrasonda olduğu gibi daha kolay alınabilir hale gelmektedir.

Bu, fetal başı değerlendirirken alınan en üst seviyeli aksial plandır.
Ventrikülomegaliyi ekarte etmek için ventrikül atriasının eni koroid pleksusun glomusu seviyesinden ölçülmelidir. Ölçüm, ventrikül aksına dik olmalıdır. İmleçler, ekojenik ventriküler duvarların iç hizasına yerleştirilmelidir. Bu koşullarda kalınlık 10 mm.'den fazla olmamalıdır. Ölçüm yeri olarak glomus seviyesi seçilir. Etiyoloji ne olursa olsun lateral ventriküllerin genişlemesi öncelikle kaudal kısımdan (atrium ve posterior korn) başlar. 10 mm. sınır değeri tüm gebelik boyunca kullanılabilir. 10 mm. ve üzerinde bir ölçüm ventrikülomegaliyi gösterir. 
Yukarıda bahsedilen koroid pleksus gövdesinin medial ventriküler duvara mesafesinin 3 mm. veya daha fazla olması da ventrikülomegali için farklı bir işarettir. Bazı vakalarda atriumun genişliği normal bulunsa bile koroid pleksusun medial duvara uzaklığı anormal gidişle ilişkili olabilir.
Serebral ventriküllerin morfolojik incelemesi, holoprozensefali (tek veya kısmen ayrık ventriküller) ve korpus kallozum agenezisi gibi orta hat defektlerini de gösterebilir.
Alobar holoprozensefali, tek ventrikülle karakterizedir. Semilobar holoprozensefalide ventriküller yalnızca arkada ayrılmıştır. Burada rudimanter bir horn meydana gelir. En nadir olan lobar holoprozensefali varyantında ise ventriküller tamamen ayrılmış olmakla birlikte ön hornlarda füzyon bulunur.
Korpus kallozum agenezisinde kolposefali görülebilir. Lateral ventrikül paralel gövdeleri arasındaki mesafe artmıştır. Üçüncü ventrikül genişlemiş ve olguların %50-60'ında yukarı yer değiştirmiştir.
Bu aksial kesitte bazı destrüktif beyin hastalıkları da saptanabilir. Bunlardan hidranensefali, geniş endokranial kist ile karakterizedir. Porensefalide ise genellikle ventriküler sistem ile bağlantılı parenkimal kistler bulunur.

Aksial transtalamik plan, klasik olarak biparietal çap (BPD) ve kafa çevresi (HC) ölçümünün yapıldığı plandır.
CSP yokluğu ile giden malformasyonlar transtalamik ve transventriküler aksial planda değerlendirilebilir. CSP yokluğu ile giden malformasyonlar arasında holoprozensefali, korpus kallozumun komplet agenezisi bulunur. Her ikisinde de CSP yokluğu yanı sıra anormal lateral ventriküller bulunur. Ciddi hidrosefali ve septooptik displazi de CSP yokluğu ile birlikte gider.
Bunun yanı sıra, bazı nöronal proliferasyon ve migrasyon hastalıkları da transtalamik planda değerlendirilir. Bu grupta değerlendirilebilen mikrosefalide HC belirgin oranda küçüktür. Hemimegalensefalide iki serebral hemisfer farklı büyüklüklerdedir. Bu asimetri bazen intrakranial neoplazmları da gösterebilir.
Aynı planda kraniosinostoz veya diğer kafatası deformitelerine bağlı SSS anomalilerine de tanı konabilir.

Transvers serebellar çap için nomogramlar çıkarılmıştır.
Sisterna magna, serebellar vermisin arka kenarı ile oksipital kemiğin iç yüzü arasındaki mesafe ölçülür. Normal mesafe 3-10 mm. arasındadır. Ancak serebellar vermis erken ikinci trimestrde henüz tam gelişmemiştir. Bu yüzden erken haftalarda bakılması normal görünümün yanlış değerlendirilmesine neden olabilir. İkinci trimestrin başındaki geniş dördüncü ventrikül ve henüz tam gelişmemiş serebellar vermis yanlışlıkla vermian defekt tanısı konmasına neden olabilir. Bu yüzden posterior fossanın değerlendirmesi 19-21 haftadan önce yapılmamalıdır.
Aksial transserebellar planda sisterna magna, serebellum ve dördüncü ventrikül görüntülenebildiğinden bu yapıların anomalilerine de tanı konabilir. Bunlar arasında posterior kranial fossanın eni ile ilgili anomaliler (Chiari II malformasyonu, Dandy-Walker kompleksi) ve/veya posterior fossa kistleri (Dandy-Walker kompleksi, araknoid kist) bulunur.
Klasik Dandy-Walker malformasyonunda serebellar vermisin komple veya parsiyal agenezisi, dördüncü ventrikülün kistik dilatasyonu ve anormal geniş posterior fossa bulunur.
Araknoid kist olgularında serebellar vermis vardır ancak serebellar hemisferler gibi baskı altında kalmış ve yer değiştirmiştir. Vermis üzerinde çalışılırken dikkat vermisin kaudal kısmına verilmelidir. Serebellumun dönüp aşağıya kaydığı durumlarda plan vermis yerine dördüncü ventrikülü keser. Bu genişlemiş bir sisterna magna görüntüsü verir. Üstelik vermis de plandan çıktığından parsiyal agenezi olduğu zannedilebilir. Bu artefaktı anlatmak için genellikle şöyle bir tanımlama yapılır. Vallekula serebelli sıvı nedeniyle öne doğru itilmiştir. Membranöz tavanı çok ince olduğundan sonografik ekipman incelenmesine izin vermemiştir.  Vallekula, bitişiğindeki serebellar hemisferlerle birlikte sisterna magna ve dördüncü ventrikül arasında yalancı baskılanma yapıp Dandy-Walker varyantını taklit eder. Posterior fossada kist saptanan şüpheli vakalarda midsagittal görünüm sorunu çözebilir. Posterior fossanın pek çok anomnalisinden etkilendiğinden inceleme sırasında en büyük dikkat vermis üzerinde toplanmalıdır. Kist varlığında ve özellikle de kitle etkisi fazla ise vermis içeriğinin düzgün bir değerlendirmesini yapmak ne yazık ki zordur.

Bu yüzden korpus kallozum agenezisi ve vermain anomalilerin araştırması ve tanısı için uygundur. Vermian anomalilerin tanısı için vermian morfolojinin değerlendirilmesi önemlidir. 21-22 haftada primer fissür oluşmuştur. Primer fissür, vermisin anterior ve posterior loblarını ayırır. Posterior lobun hacmi, anterior lobdan daha fazladır.

Proksimal parasagittal planlar, lateral ventriküller ve koroid pleksusların görüntülenmesini sağlar. En dışta parasagittal planlar insula ile parietal ve temporal operkulumun görüntülenmesini sağlar.

Fetal beynin taramasında aksial planlar çok kullanışlı olsa da ciddi sınırlamalar içerir. Fetal beyni muayene ederken önemli kesitlerden biri midsagittal plandır. Bu plan, korpus kallozum ve serebellar vermis gibi orta hat yapıları hakkında eşsiz bilgiler sağlar. Kimi otoriteler, fetal beynin rutin taramasına bu planın da eklenmesini önerir. Ancak iki boyutlu ultrason ile bu planın incelenmesi bazen zor olabilir. Bazı yaklaşımlar önerilmişse de bu yaklaşımlar ciddi deneyim, zaman ve sıklıkla transvajinal muayene gerektirir. Üç boyutlu ultrasonun en önemlki yararı istediğimiz planda bir kesit almamızı sağlamasıdır. Bu teknik ile midsagittal ve koronal planlar alınabilir. Bir kez volum taraması yapıldığında istenilen planlarda kesit görüntülenebilir. Yeni imaj modaliteleri ile 2 boyutlu kesitler ard arda dizilip BT veya MR gibi bir tarama elde edilebilir.

Ventrikülomegali, serebral ventriküler sistemin genişlemesine yol açan pek çok hastalıktan kaynaklanabilir.
Postnatal periyodda uygulanan pekçok tanı kriteri prenatal dönemde geçerli değildir. Aslında in utero hidrosefalide fetal baş çevresi normal olup beyin omurilik sıvısının akım rotası değişmiş olabilir. Bunu herhangi bir sınıfa sokmak kolay değildir. Ventriküllerde giderek artan bir genişleme olması hidrosefali tanısı koydurabilir. Ventriküler genişliğin ölçümü ventrikülomegali nedenleri arasında ayrım yapmak için güvenilir değildir. Aralarındaki fark istatistiksel olarak anlamlı olmasa da kromozomal anomalilerden kaynaklanan santral sinir sistemi malformasyonlarının eşlik etmediği ventrikülomegaliler, destrüktif nedenli ventrişkülomegalilere göre daha daha küçük değerlerdedir. Kromozomal anomalili fetüslerde çoğunlukla borderline ventrikülomegali izlenir.
Unilateral veya bilateral ventrikülomegalinin ayırıcı tanıda bazı ipuçları sağladığı ortadadır. Detrüktif vakalarda ventrikülomegali unilateral iken malformasyonlarda genellikle bilateraldir. Bu fark istatistiksel olarak anlamlı bulunmuştur.
Ventrikülomegali bariz olarak izole ise hafif ve ılımlı olguların şiddetlilerden ayrılması ayrıca önem taşır. Kimi otoriteler 10-12 mm arasındaki olgular ile 12 mm üzerinde olanlar arasında istatistikçe anlamlı nörolojik prognoz farklı bulmuşlardır. Aslında 10-12 mm arasında olan hafif borderline ventrikülomegali izole ise normalin bir varyantı sayılır. Bu durum, erkek bebeklerde daha sık görülür. Bu, erkek fetüslerin kız fetüslerden hafifçe daha büyük olmasına bağlı olabilir. Borderline ventrikülomegali, doğum öncesi kendiliğinden ortadan kalkabilir. Bu olgularda ileride ek bir sorun da ortaya çıkmaz. Fakat bu bulgu az bir olguda farklı nedenlere bağlı beyin lezyonlarının erken belirtisi olabilir. Örneğin lissensefali gibi primer serebral gelişim bozuklukları.

Akuaduktal stenoz, nedeni ne olursa olsun ventrikülomegalinin artmasından sorumludur. Akuaduktal stenoz enfeksiyon veya intraventriküler kanamaya bağlı edinsel olabilir. Aslında genellikle multifaktöriyeldir. X'e bağlı kalıtılan mental retardasyon, spastik parapleji ve addukte baş parmak ile karakterize bir hastalıktan da bahsedilebilir.

Konjenital ventrikülomegalinin insidensi farklı çalışmalarda 1000 canlı doğumda 0,3 ile 1,5 arasında bulunmuştur. Fakat bu çalışmalar klinik verilere dayandığı için olduğundan daha nadir bulunmuş olabilir. Zira bazı ventrikülomegali olguları doğumda asemptomatiktir.

Burada ventrikülomegalinin en sık görülen nedenleri üzerinde durulacaktır.

Listede de görülebileceği gibi ventrikülomegali, santral sinir sistemi anomalilerine eşlik edebilir.
Chiari II Malformasyonu: Ventrikülomegaliye ek olarak küçük posterior fossa, küçük ve dismorfik serebellum, genişlemiş sisterna magna ve meningomyelosel bulunur.
Dandy-Walker Malformasyonu: Ventrikülomegaliye ek olarak dördüncü ventrikülün dilatasyonu ve serebral vermisin komple veya parsiyal agenezisi bulunur.
Korpus Kallozum Agenezisi: Lateral ventriküller gözyaşı görünümündedir. Buna kolposefali denir. Paralel yan ventriküller laterale yer değiştirmiştir. Üçüncü ventrikül yukarı yer değişltirmiştir. Bu olgularda korpus kallozum agenezisi koronal ve sagittal planlarda teyid edilmelidir.

Destrüktif lezyonlara eşlik eden ventrikülomegali unilateral veya bilateral olabilir. En sık nedenleri hipoksi, infeksiyon ve vasküler lezyonlardır.
Ventrikülomegaliye eşlik eden hiperekojen fokus varsa fetal infeksiyondan şüphelenilmelidir. Hiperekojen fokus, beyinde veya periventriküler kist içinde olabilir.
Nodüler subepandimal kalsifikasyonlar periventriküler hiperekojen band oluşturacak şekilde bir araya geliyorsa sitomegalovirüs (CMV) enfeksiyonu akla gelmelidir. Ventrikül içinde eksuda ve dökülen epandimal hücrelerin oluşturduğu serbest yüzen partiküller bulunur. Bu partiküllü sıvı ventriküler foramenleri tıkayarak sekonder obstrüktif hidrosefaliye yol açar. Bu vakalarda intraventriküler kanamaya ayırıcı tanı yapılmalıdır. CMV ve diğer enfeksiyonlar için maternal serolojinin yanı sıra eski ultrason muayenelerinde elde edilen görüntüler de yararlı olur.
Hipoksinin neden olduğu hemoraji vakaları ancak ciddi ise ventrikülomegali görülür. Ventrikülomegali genellikle intraventriküler fibrin depolanması ve kan pıhtılarının bulunmasına bağlıdır (grade 3). Bu olgularda genellikle parankimde hiperekojenik hemorajik lezyon (grade 4) görülür. Bu lezyon da kan pıhtısının likefaksiyonuna bağlı olarak tamamen hipoekoik hale gelir. Bir süre sonra geride ventriküler sistem ile bağlantılı bir porensefalik kist bırakarak ortadan kaybolur. Kist içeriği beyin omurilik sıvısı ile doludur.

Santral sinir sisteminde ultrasonografik olarak saptanabilen başka bir anormallik olmadığında izole ventrikülomegaliden bahsedilebilir. İzole ventrikülomegali unilateral de olabilir. Asimetrik ventrikülomegali atrial boyutlarda 2 mm.’den fazla fark olmasıdır. Normal fetuslarda dilatasyon olmadan ventriküler asimetri olabilir.

Nonkomünikan hidrosefali, komünikan olandan daha sık görülür. Postnatal periyodda oranlar bunun tersi şeklindedir. Nonkomünikan hidrosefalide ventriküler sistemde bir tıkanıklıktan bahsedilebilir. Örneğin akuaduktal stenoz bir nonkomünikan hidrosefali nedenidir. Komünikan hidrosefalide obstrüksiyon ventriküler sistemin dışındadır. 
Akuaduktal stenozda tipik sonografik patern, triventriküler hidrosefalidir. Triventriküler hidrosefalide üçüncü ventrikül ve lateral ventriküller genişlemiştir. Akuaduktal stenoz en azından bazı olgularda komünikan hidrosefalinin volüm etkisiyle orta beyine yaptığı bası sonucunda ortaya çıkabilir. Hidrosefali, beyin omurilik sıvısının prodüksiyon-rezorpsiyon dengesizliğinden de kaynaklanabilir. Prodüksiyon fazlalığı çok nadir bir nedendir. Ventriküler dilatasyonların çoğundan rezorpsiyon bozuklukları sorumludur. Prodükziyon fazlalığının en sık görülen nedenleri koroid pleksus papillomlarıdır.

Borderline ventrikülomegali, kolposefaliden ayırd edilmelidir. Kolposefalide görülen korpus kallozum agenezisini sonografik olarak saptamak mümkündür.
Diğer Malformasyonlarla İlişkisi: Olguların %45-80’i diğer serebral (holoprozensefali, korpus kallozum agenezisi, Dandy-Walker malformasyonu) ve ekstraserebral (myelomeningosel) anomalilerle birliktedir.
Kromozomal Anomali Riski: Orta-yüksek risk bulunur. Anöploidi riski, izole ventrikülomegalilerde %1,5-12 iken diğer malformasyonlara eşlik eden vakalarda %9-36’dır. Yalnız ventrikülomegali destrüktif lezyonlara eşlik ediyorsa kromozomal anomali riski düşüktür.
Nonkromozomal Sendrom Riski: Yüksek risk bulunur. En sık görülenler:

Miller-Dieker Sendromu: Ventrikülomegali, lizensefali, mikrosefali, kardiyak anomaliler, fasial anomaliler ve polidaktili bulunur.
Goldenhar Sendromu: Ventrikülomegali, fasial asimetri, preauriküler tag, vertebral anomaliler, yarık dudak ve damak.
Meckel-Gruber Sendromu: Ventrikülomegali, ensefalosel, polidaktili, polikistik böbrek ve diğer santral sinir sistemi anomalileri.
Neu-Laxova Sendromu: Ventrikülomegali, ekstremitelerde lenfödem, lizensefali, mikrosefali, proptozis, intrauterin gelişme geriliği, artrogripozis, diğer santral sinir sistemi anomalileri.
Walker-Warburg Sendromu: Ventrikülomegali, göz anomalileri (mikroftalmi, katarakt), santral sinir sistemi anomalileri (lizensefali, ortak hat anomalileri, serebral anomaliler, mikrosefali, sefalosel)
Crouzon Sendromu: Ventrikülomegali, kraniofasial dizostoz, hipoplastik çene kemiği.
Gorlin Sendromu: Ventrikülomegali, fasial anomaliler, makrosefali, multipl neoplazmlar.
Kartagener Sendromu: Ventrikülomegali, situs inversus.

Bu kısımda da gördüğünüz şeylerden biri parantezdeki (-ng) eki. (-ın), (-nın) yerine kullanılır. Fakat (-ng) samimi, (-ın), (-nın) ise resmi durumlarda kullanılır. Eğer kelimenin sonu (n) ile bitiyorsa Örn; Xin/Sen, sadece yanına (g) eklenir. (Xing) gibi.
B,D,G,K,L,M,N,P,R,S,T,Z gibi biten harfler için bu söz konusu değildir. Bu harflerde sadece (-ın), (-nın) eki kullanılır. Sadece N harfi için geçerlidir. Zaten bu sayılan harfler dışında başka harfler sona gelmez.
Eğer söz (nh) ile bitiyorsa Örn; Yönh, içindeki sessiz harf uzatılır. Ve Yö'nh (Yöönh) diye okunur.
Yalnız söz sade haliyle (ng) ile bitiyorsa Örn; Chong[Qong] (Büyük) (g) harfi kalkar ve yerine (n) gelir. Yani (n) çift (n) olur. Chonn[Qonn] gibi. 
Bu durum (-hın), (-sın), (-bın) ve (-yın) ekleri için geçerli değildir.
Samimi durumda "kumnida" eki gelmesine gerek yoktur. Samimilik durumuna göre sonuna "kun" getirilir ya da hiç getirilmeyebilir. Ancak resmi durumda "kumnida" eki gelmek zorundadır.
"Cao" da "Yahxi" gibi iyi demektir ve sonradan türetilmiştir. Ve nasıl türetildiği bilinmemektedir. Qiu(Chiu)-ru gitmek demektir. Bu şekilde Cao Qiu, güzel git, iyi git anlamına gelir. Ama bu söz hoşça kal, güle güle demek için kullanılır.
Erhuziei ise direkt afedersiniz, pardon demektir. Ve hiçbir eki yoktur. Sadedir. Orta Kanlıkça döneminde türetilmiştir. Ve halen kullanılır.

Kanlıkça'da insanlar böyle selamlaşır. Bu iki cümle günlük hayatta da çok kullanılır.
Bu iki cümle de kalıplaşmıştır. Tam olarak bu iki kelimenin anlamını öğrenecek olursak;
以센히마！(Yisenhima!) derken bu sözün anlamında Yisen(h) sözü tek başına kullanıldığında Yiseng olur ve bu sözün anlamı huzurlu olmak, sağlık ve mutluluk içinde bulunma(k) durumu anlamı taşıyan söz Türkçedeki "esenlik" sözüne denktir ki bu söz aslında Türkçe ile aynıdır. Söyle görebilirsiniz;
Yisen(h)=Yiseng --> Yisen ---> İsen (Tatarlar da böyle der) ---> Esen ---> Esen(lik)
-ima sözü de Orta Kanlıkça'da ile anlamı taşırken zamanla anlam kayması ile "ve" anlamına gelmiştir. Yani "Yisenhima" sözünün tam karşılığı "Esenlik ile" demektir ki bu Türkçeyle birebir anlam taşır. Esenlik ile derken de Huzur ve sağlıkla olun(kalın). anlamına gelir.
Çağdaş Kanlıkça'sına birebir uyarlayacak olursak "Yiseng ime byolsum." olur.
"以셍 니메 뵬숨。"
탕知悉吉！(Tangzhixiji！) sözünün de anlamında Tang sözünün anlamı güneşin doğuşu, tan ağarması'dır. Zhi sözü de Orta Kanlıkça'da -da, -de anlamı taşır. Xiji (Shiji)'nin anlamı (Shiji-man) da beklemektir. Şu an da Çağdaş Kanlıkça'da kullanılmaktadır. Sözün tam karşılığı da "Güneşin doğuşunda (sen-i) bekl(iyor) (olacağım)'dır. 
Ve bu sözün de Çağdaş Kanlıkça'sına uyarlayacak olursak Tangzhixiji'nin tam birebir karşılığı "Tei nın tūnluhında xin xijiep bǒl-anh." dır.
"王는 투운路흔다 信悉吉엡 벌않。"

TANITIM
Kanlıkça ya da Tabgaç/Kang Türkçesi, Uzakdoğu Türk Dilleri'ndeki dört Türk lehçesinden biridir. Fakat iki tane lehçe yaygın olarak kullanılır ve Kang Türkçesi de bunlardan biridir. Onlar dillerine "Kangxia" derler. 1960'a kadar Uygur yazısını kullandılar. 1960-2000 yılı arası Kore yazısını kendine uyarlayarak kullanmışlardır. 2000 yılında ise Anshan'da yaşayan bir grup Türk "Yanmen" isminde bir Türk yazısı oluşturdular. 2010 yılında ise son halini almıştır.Onlarda "Kanlık" diye sözcük yoktur. Kanlık sözü "Kang" sözünün Türkçe'ye uyarlanmış halidir. Latin ile yazılan sisteme "Baojiyi", Kiril ile yazılan sisteme de "Shengzi" denir. Ve bu dilin ayrıca Kore-Çin yazısı ile birlikte bir yazı sistemi vardır. Ona da "Conghan Xunbi Könüyi (Çin-Kore Yazı Sistemi)" denir. Ona kısaca "Conghan" denilebilir.

약시絲毫마？
Yahxi sihao ma?
İyi misiniz?

멘組이름은特木槿쿤미다。
Menzu irım ın Temujin kunmida.
Benim ismim Temujin.

파랑와하시新天。
Parangwaha shixintian.
Tanıştığıma memnun oldum.

Alfabe
Giriş
Dilbilgisi
Kanlıkça Cümle Deposu

https://www.academia.edu/12453685/%E6%8B%93%E8%B7%8B%E8%AF%AD%E4%B8%8E%E5%A5%91%E4%B8%B9%E8%AF%AD%E8%AF%8D%E6%B1%87%E6%8B%BE%E9%9B%B6

Kazak Kiril yazısında Rus Kiril abecesine ek olarak şu harfler bulunur: Ә, Ғ, Қ, Ң, Ө, Ұ, Ү, Һ, І. Rus alfabesinden alınan В, Ф, Х, Ц, Ч, Щ, Ъ, Ь ve Ё harfleri yalnızca çoğunluğu Rusçadan alınan ödünç sözcüklerde bulunur. En çok Çin, İran ve Afganistan'da kullanılan Kazak Arap abecesinde 29 harfin yanı sıra yüksek hemze ٴ, ve la لا bağlama harfi bulunur.  ۆ, گ, ڭ, پ, چ harfleri Arapçada bulunmayan sesleri gösterir.
Kazak Kiril yazısı Kazakistan ve Moğolistan'da kullanılır. Bu alfabe Kazak Türkçesindeki sesleri göstermek üzere Rusça abecesinde 33 harfe 9 harf daha eklenip 42 harfli olarak 1940 yılında S. A. Amanjolov tarafından sunulmuştur. Eklenen harflerden Ұ, 1950'ye kadar Ӯӯ şeklindeydi.

Kazakistan'da Kazak Kiril yazısı için kullanılan standart Windows ve Mac klavyelerinde Kazakçada bulunan, ancak Rusça'da bulunmayan karakterler standart Rusça klavyenin numara düğmelerine yerleştirilmiştir.
Kazak Türkleri genişletilmiş dokuz Kazak harfi ile Rus harflerini kullanırlar.

Kazak Türkçesinde ismin yedi hâli vardır:

Yalın hâl: Eksizdir
Yükleme hâli: Ünlülerden sonra nı, ni; l, m, n, ñ, r, v, y, z ünsüzlerinden sonra -dı, -di; k, q, p, s, ş, t ünsüzlerinden sonra -tı, ti; 3. teklik şahıs iyelikten sonra n.
İlgi hâli: Ünlülerden ve m, n, ñ ünsüzlerinden sonra -nıñ, -niñ; l, r, v, y, z ünsüzlerinden sonra -dıñ, -diñ; k, q, p, s, ş, t ünsüzlerinden sonra -tıñ, -tiñ.
Yaklaşma hâli: Ünlülerden ve sedalı ünsüzlerden sonra -ğa, -ge; sedasız ünsüzlerden sonra -qa, -ke; 1. ve 2. teklik şahıs iyelikten sonra -a, -e; 3. şahıs iyelikten sonra -na, -ne.
Bulunma hâli: Ünlülerden ve sedalı ünsüzlerden sonra -da, -de; sedasız ünsüzlerden sonra -ta, -te; 3. teklik şahıs iyelikten sonra araya n girer.
Uzaklaşma hâli: Ünlülerden ve sedalı ünsüzlerden sonra -dan, -den; sedasız ünsüzlerden sonra -tan, -ten; teklik şahıslar ve 3. çokluk şahıs iyelikten sonra -nan, -nen.

Kolombiya, Güney Amerika mutfak kültüründe dünya çapında büyük ün sahibi olmasa da orijin bir tarza sahiptir. Karayiplerin ve Amazonların yemek kültüründen de çok etkilenen Kolombiya mutfağı, deyim yerinde ise rengarenktir. Etli yemekler, patates türleri, unla yapılan yemek seçenekleri ve deniz canlıları, sofralardan eksik kalmaz.
Kolombiya yemek çeşitleri kendi bölge sınırlarının içerisinde, yer yer farklılıklar gösterir. Kuzey sahillerinde karides, balık çeşitleri, ıstakoz gibi deniz ürünleri yaygın tüketilir. Bogota kenti ve çevresi çorba konusunda ileri seviyededir. Tavuk ve mısır hemen her bölgede çok yaygındır. Tüm Güney Amerika’da olduğu gibi tropik sebze ve meyveler iyi bilinir. Kolombiya mutfağında tıpkı bizdeki gibi baharatlar, soğan ve sarımsak gibi katkılar da sık olarak kullanılır.
Kolombiya Mutfağında en çok bilinen seçenekler şunlardır:

Bandeja Paisa
Bandeja Paisa, Kolombiya’nın Paisa bölgesinden çıkmış ve ülke genelinde iyi bilinen bir Kolombiya geleneksel yemeklerindendir.

Arroz con Coco
Arroz con Coco, klasik pirinç pilavının hindistan sütü ile hazırlanan bir çeşididir. Damağa değişik gelebilecek bir tat verir.

Changua
Changua, And Dağları’ndan gelen, gayet doyurucu bir kahvaltı çorbasıdır.

Bagre en Salsa
Bagre en Salsa, Kolombiya’nın deniz mahsülleri ile yapılagelen bir yemeğidir. Bagre, Amerika kıtasında yaygın bulunan bir balık türüdür. Balıkçılarda bagre ile yapılan bir çok yemek türü vardır ama en rağbet edileni Bagre en Salsa'dır. Domates sosuyla yapılan bir yemektir. Özel bir karışım ile hazırlanan balık genellikle pilav, avokado ve kızartma muz ile birlikte servis edilmektedir.

not: Ancak, bahsedilen kızartılmış muz, Türkiye'de tüketilen tatlı muz ile yapılanı değildir. Orta ve Güney Amerika’da yetişen farklı bir muz çeşididir.
Ajiaco Colombiano (Ajiaco Con Pollo)
Bu, Kolombiya’nın geleneksel bir tavuk çorbası olarak bilinir. Ajiaco Con Pollo, bölgede gayet severek tüketilir.

Arepa
Bu hamur işi, bir mısır ekmeği türüdür. Arepa Tek başına yemek olarak servis edilebildiği gibi içine ekstra malzeme konarak da yenebilir.

Arroz con Pollo
Esasında, bir İspanya yemeği olan Arroz con Pollo, Türk mutfağındaki Tavuklu Pilav'ın karşılığıdır. 

Fritanga Colombiana
Fritanga Colombiana, et ve sebze kızartmalarının karışık şekilde var olduğu bir diğer Kolombiya lezzetidir. Bu yemekte de kızarmış et ve yeşillik çeşitleri yanyana sunulmaktadır.

Bunuelos Colombianos
Bunuelos Colombianos, Kızartılmış hamur toplarından oluşan Bunuelos, özellikle Noel dönemlerinde çok yapılan geleneksel bir Kolombiya yemeğidir. Bu yemek kahvaltılarda sık tüketilir.

Pandebono ve Almojabana
Kolombiya'nın, özellikle iki önemli hamur işi, Pandebono ve Almojabana'dır. Bu çöreklerin içine bazı bölgelerde guava reçeli de konabiliyor.

Carne a la Llanera
Carne a la Llanera'nın, Kolombiya’nın en popüler et yemeği olduğu iddia edilebilir. Kırmızı et sevenler için harika bir seçenektir. Türkiye’deki kuzu çevirmeyi andırır.

Cazuela de Mariscos
Cazuela de Mariscos, genel anlamda, Karayip kıyılarında popüler olan güveç lezzetlerden birisidir. Deniz canlıları ile yapılır.

Bandeja Paisa
Arroz con Coco
Changua
Bagre en Salsa
Ajiaco Colombiano
Arepa
Arroz con Pollo
Fritanga Colombiana
Bunuelos Colombianos
Pandebono
Almojabana
Carne a la Llanera
Cazuela de Mariscos

Arepa, öğütülmüş mısır temelli bir hamurdan ya da önceden pişirilmiş mısır unundan yapılmakta olan bir ekmek çeşididir. Arepa genellikle Kolombiya mutfağına ait olarak bilinmesine rağmen Venezuela, Porto Riko, Panama, ve Dominik Cumhuriyeti’nde de çok tüketilmektedir. Özellikle Venezuela’da Arepa, ülke genelinde ve hemen hemen tüm sosyo-ekonomik gruplarda günün herhangi bir saatinde yenir.
Çıtır çıtır, kahverengileşmiş bir kabuğa sahip altın yuvarlak ekmek biçimini alan bu yiyecek, genellikle çeşitli malzemelerle doldurulur ve fasulye çeşitleri, peynir ve avokado ile kıyılmış sığır eti ve soğan gibi katkılara kadar sonsuz denebilecek kombinasyonlar söz konusudur. Venezuela kahvaltılarında Arepa'lar, geleneksel bir tarz olmak üzere, bir fincan sert kahve ve sıcak daldırma çikolata ile sunulabiliyor.

4 kişilik:

300 gram mısır unu
125 gram lor peyniri
250 gram soğuk süt
200 ml soğuk su
12 gram tuz

Derin bir kaba mısır ununu koyunuz. Kabın ortasından iyice açarak tuzu, elinizle ufalayarak da lor peynirini, bir bardak süt ve bir bardak suyu koyup parmak uçlarınızla yoğurunuz. Hamurunuz gereğinden fazla katı olursa eğer, biraz daha süt ekleyebilirsiniz. Yoğurma işlemi bittikten sonra hamurun üstünü örtüp altı dakika süresince dinlendirin. Daha sonra 12 eşit parçaya ayırın.
Parçaların her birinden, avucunuzun içinde yuvarlayıp toplar yapın. Bu mısır toplarını, üzerlerine hafifçe bastırarak yassı hale getirin. Daha sonrasında (varsa) bir sacı, yoksa altı kalın bir tavayı kızdırın. Pişirilecek tabanı hafifçe yağlayarak, Arepa’ların iki tarafını da, altın gibi kızarıncaya kadar, 5 dakika kadar pişirin.
Daha sonra fırın tepsisine koyarak 175 derecede kızdırdığınız fırında 25 dakika pişirin. Fırında pişirme sırasında Arepa’ları birkaç kere çevirin piştikten sonra fırından çıkarın ve sıcak sıcak servis yapın.

Bu yemek, genellikle Bola Roja türünden bir kırmızı fasulye, havuç, yeşil muz, paça, kişniş, kimyon ve iki farklı sos karışımı ile hazırlanır. Kolombiya mutfağının tipik bir örneği de denilebilir.
Yemek, ortaya çıkışının başlangıcında köylü yemeği olarak varsayıldı, çünkü Antioquia'daki çiftçiler, tarlalarda çalışmadan önce kahvaltıda proteinli bir yemek olarak bunu yerlerdi. Yoğun et ve karbonhidratın onları gün boyunca diri tuttuğu öngörülürdü. Bandeja Paisa ile ilgili geçmiş bu algı, bugünlerde tüm bileşenleriyle tamamen değişmiştir. Yemek, genellikle menülerdeki en pahalı yemeklerden biridir. bunun nedenlerinden biri de, çok büyük bir yemek porsiyonuna sahip olmasıdır.

Sosların ilki, kırmızı biber ve yeşil biber, soğan, sarımsak ve safrandan oluşan "salsa de aliños"'tur. Diğer sos da domates, soğan ve sarımsakla yapılan, Kolombiya Creole aslından yapılan "Salsa Hogao"'dur.

6 kişilik miktar:

250 gram kuru kırmızı fasulye (varsa Bola Roja tercih edin), önceden 7.5 saat ıslatılmış
8 paça, dilimlenmiş
½ yeşil muz, soyulmuş ve doğranmış
1 veya 2 büyük havuç, soyulmuş ve parçalar halinde kesilmiş
½ küçük fincan Salsa de Aliños
½ çay kaşığı öğütülmüş kimyon
1¼ - 1½ litre su
4.5 veya 5 yemek kaşığı taze kişniş (doğranmış olacak)
½ fincan Hogao Salsa (Kolombiya Kreole sosu)
300 gram uzun beyaz pirinç
450 gram dana incik (veya döş)
1 litre su
3 diş sarımsak, ezilmiş
2 yeşil soğan, doğranmış
1 küçük soğan, ince doğranmış
Yarım veya 1 çay kaşığı öğütülmüş kimyon

1 su bardağı önceden pişirilmiş beyaz mısır unu (tava)
1 su bardağı ılık su (34-38°C)
3 yemek kaşığı eritilmiş tereyağı, ısıtılmış
¼ çay kaşığı tuz
1 yemek kaşığı tereyağı pişirmek için

6 parça korizo
1 litre su

3 veya 4 olgun yeşil muz
Bir miktar bitkisel yağ (kızartmak için)

6 yumurta
3 yemek kaşığı zeytinyağı
Avokado
Bu tarif, 6 Arepa ile servis edilir.
Son olarak, Bandeja Paisa, et, peynir, fasulye, yumurta veya jambon ile doldurulabilen Arepa ya da beyaz mısır çöreği ile servis edilebilir. İçerdiği tereyağının miktarı, yemeği çok yumuşak ve lezzetli kılar.

Bu yemeğin hazırlık süresi 15 dakika, pişirme süresi 30 dakikadır.

10 kişilik:

1 yemek kaşığı tereyağı
1 yemek kaşığı zeytinyağı (yoksa herhangi bir bitkisel yağ)
1 fincan doğranmış yeşil biber
1 fincan doğranmış kırmızı biber
1 bardak doğranmış soğan
2 diş kıyılmış sarımsak
1 su bardağı rendelenmiş havuç
Yarım bardak (100 ml) balık suyu
1 çay kaşığı kırmızı pul biber
4 bardak yoğun krema
1 kutu (400 ml) hindistancevizi sütü
Yarım fincan (30 ml) beyaz sirke (veya balsamik sirke)
2 kilo jumbo karides, soyulmuş ve işlenmiş
10 küçük istiridye, temizlenmiş
2 kilo kılıç balığı, parçalar halinde kesilmiş
1.5 yemek kaşığı doğranmış taze kişniş
2 yemek kaşığı doğranmış taze maydanoz
1 yemek kaşığı domates salçası
Biraz karanfil

Orta ateşte büyük bir tencerede, zeytinyağını ve tereyağını ısıtın. Krema, balık suyu ve hindistancevizi sütü ekleyin; kaynatın. Bir yandan, karidesleri soyun ve kırın, damarları atın ve tavaya aktarın. Bir tencerede, çeyrek bardak doğranmış soğan ve defne yaprağı ekleyin, 2 bardak et suyu koyun. Karidesi karıştırarak orta ateşte pişirmeye devam edin, biraz sonra ısıyı düşürün. Et suyu kokulu olana ve yaklaşık 1 bardak sıvı olana kadar ara sıra karıştırarak yaklaşık 15 dakika yavaşça pişirin. Karideslerin artıklarını atın. Tuzla hafifçe ovalayın ve karıştırın. Sıcak karidesli suyu hazırlayın.
Et suyu ile istiridyeyi 2 dakika pişirin ve malzemelerin kabuğunun kalıntılarını atın. İstiridyeleri (çok soğuk su ile dolu büyük bardaklarla) kaba aktarın (1 kaba 1 yemek kaşığı tuz eklenir). Yaklaşık 15-20 dakika bekletin. bunları sonra çıkarın, ıslatma sıvısını atın ve bir kaseye aktarın. Orta ateşte ağır gelen bir orta boy tencerede veya güvece sıcak zeytinyağını koyun. Hafifçe tuz ile pişirin, her iki tarafta hafifçe kızarana kadar yaklaşık 4-5 dakika döndürün. Karidesleri aynı tencereye ekleyin ve yaklaşık 2 dakika pişirin, bir kez döndürün veya renk pembeye dönene kadar karidesleri bir tabağa aktarın.

Kitaplık:Dil

 
 

Korece Vikikitap'a hoşgeldiniz; Korece öğrenmek için ücretsiz kitap.

Korece, Kore Cumhuriyeti (Güney Kore) ve Kore Demokratik Halk Cumhuriyeti'nde (Kuzey Kore) resmi dildir. Korece ayrıca Çince ile birlikte Çin'in Yanbian Kore Otonom Bölgesi'nde resmi dildir. Dünya genelinde 80 milyon kişiye yakın sayıda Korece ana dil kullanıcısı bulunmaktadır. Güney ve Kuzey Kore dışında Çin, Japonya, ABD, Özbekistan ve Kazakistan'da önemli sayıda Koreli nüfusu bulunmaktadır.
Koreceye Güney Kore'de 한국말 (hangunmal), 한국어 (hangugo), 국어 (gugo) denmektedir. Kuzey Kore ve Yanbian Bölgesi'nde 조선말 (cosônmal), 조선어 (cosônô) denmektedir.
Uzmanlar Korece'nin hangi dil ailesine dahil olduğu konusunda tartışmalara devam etmektedir. Korece'nin Altay Dil Ailesi'ne dahil olduğunu kabul eden uzmanlar olduğu kadar ayrı bir dil ailesi olduğunu kabul eden uzmanlar da bulunmaktadır. Ancak şu bir gerçektir ki Korece eklemeli bir dildir, bu nedenle Dil Bilgisi öğrenirken Japon ve Altay Dil Ailesi konuşan kişiler zorlanmayacaktır. Kelime öğrenirken ise özellikle Çince ve daha sonra da Japonca konuşan kişilerin zorlanmayacağı görülmektedir.

1. Alfabe
1. Ünsüz Harfler
2. Ünlü Harfler
3. Hangıl Yazım Düzeni
4. Tüm Hangıl Heceleri
2. Okunuş
1. Temel Ses değerleri
1. Ünsüz Harfler
2. Ünlü Harfler
2. Ses Değişimleri
1. Hangıl ile Değişim Tablosu
2. Türk Harfleri ile Değişim Tablosu
3. Latinceleştirme

1. Cümle Türleri
1. Saygı Seviyeleri
1. Resmi Hitab
1. Saygılı Düzey
2. Orta Düzey
3. Yalın Düzey
2. Samimi Hitab
1. Saygılı Düzey
2. Yalın Düzey
2. Zamanlar
2. Sözcük/Kelime Türleri
1. Ad/İsim
2. Adıl/Zamir
3. Eylem/Fiil
4. Önad/Sıfat
5. Fiilimsiler
6. Belirteç/Zarf
7. İlgeç/Edat
8. Bağlaç
9. Ünlem
4. Hal Çekimleri
5. Bağlaçlar
6. Diğer Ekler

1. Konularına Göre
2. Türlerine Göre

Merhaba Korece öğrenmek istiyorum

Bu bölümde basit bir şekilde Hangıl (한글) olarak da bilinen Kore alfabesi açıklanmaktadır.
Hangıl, eşsiz bir yazı sıralamasına sahiptir ve ayrıca en mantıklı yazı sistemlerinden birisidir. Diğer pek çok yazı sisteminin aksine, Hangıl var olan bir resimyazı (hieroglyphic) ya da kavramyazı'dan (ideogram) evrilmemiştir; Korece'yi daha kolay okumak ve yazmak için özellikle hazırlanmıştır.
Hangıl harfleri her ne kadar geleneksel Hanca (한자, 漢字) denilen Çin imleri gibi görünseler de aslında bir alfabeyi meydana getirirler. Her bir blok, bir heceyi temsil eder ve tek tek camo (자모) denilen harflerden oluşmuştur. Hangıl yalnızca 24 temel camo'dan oluştuğu için öğrenilmesi basit bir alfabedir.

Aşağıda afabedeki temel harfler ve alfabede belirtilmeyip kullanılan harfler gösterilmiştir. İlerleyen bölümlerde hepsi tek tek ele alınacak ve Hangıl yazı sistemi ayrıca gösterilecektir. Şimdilik alfabede gösterilen 14 ünlü ile 10 ünsüz ve yarı ünlü olduğunu, alfabe dışında ise 5 çift ünsüz ve 11 birleşik ünsüz ayrıca 11 birleşik ünlü ile toplamda 51 harfin bulunduğunu bilmek yeterlidir.

Hangıl alfabesinde 14 tanesi temel harf olmak üzere toplamda 30 ünsüz harf ve harf birleşimi bulunmaktadır.

Hangıl alfabesinde 10 tanesi temel harf olmak üzere toplamda 21 ünlü harf ve harf birleşimi bulunmaktadır.

Bilgisayarınızın dil çubuğundan (Denetim Masası/Bölge ve Dil Seçenekleri/Diller/) gerekli ayarlamaları yaparak Kore alfabesi, Hangıl'ı kullanarak yukarıdaki harfleri yazabilirsiniz. Klavyedeki Hangıl harf düzeni yan taraftaki tabloda gösterilmiştir.
[나는 내 재산이다] Bee tunci

Kore alfabesi, Hangıl'ı diğer yazı sistemlerinden ayıran en temel özellik yazım düzenidir. Alfabe sistemlerinde harfler yan yana bitiştirerek kelimeler yazılırken, Kore alfabesinde hece oluşturacak şekilde harfler özel bir şekilde birleştirilerek yazılmaktadır. 4 temel şekil olmak üzere kimi uzmanların birleşik ünsüz ve birleşik ünlüleri ayrı ayrı ele almasından dolayı toplam 9 şekilde Hangıl hecesi yazılmaktadır:

1. Ünsüz - yatay ünlü: ㄱ + ㅗ = 고
2. Ünsüz - dikey ünlü: ㄱ + ㅏ = 가
3. Ünsüz - yatay ünü - ünsüz: ㄱ + ㅗ + ㄴ = 곤
4. Ünsüz - dikey ünlü - ünsüz: ㄱ + ㅏ + ㄴ = 간

5. Ünsüz - birleşik ünlü: ㄱ + ㅘ = 과
6. Ünsüz - birleşik ünlü - ünsüz: ㄱ + ㅘ + ㄴ = 관
7. Ünsüz - yatay ünlü - birleşik ünsüz: ㄱ + ㅗ + ㄳ = 곣
8. Ünsüz - dikey ünlü - birleşik ünsüz: ㄱ + ㅏ + ㄳ = 갃
9. Ünsüz - birleşik ünlü - birleşik ünsüz: ㄱ + ㅘ + ㄳ = 곿

Heceler en az bir ünsüz ve bir ünlüden oluşmaktadır. Bu nedenle ünlü sesleri tek başına belirtmek için `ㅇ` harfi seçilmiş ve hece başında ses değeri olmayan bir harfe dönüştürülmüştür.

B= Başta yer alan ünsüz harfler: 

O1= Ortada yer alan yatay ünlü harfler: 

O2= Ortada yer alan dikey ünlü harfler: 

O1+O2= Ortada yer alan birleşik ünlü harfler:

S1= Sonda yer alan ünsüz harfler: 

S2= Sonda yer alan birleşik ünsüz harfler: 

Günümüz Korecesinde kullanılan harflerle yazılabilen tüm hecelerin listesi için tıklayınız.

연?출

Günümüz Korecesinde kullanılan harfler ile yazılabilen tüm heceler aşağıda sıralanmıştır. Bu liste bilgi amaçlıdır ve her bir hece mantıklı bir ifadeye sahip olmayabilir, kelime içinde kullanılmayabilir.

* Her bir başta bulunan ünsüz için 21 satır ve 27 sonda bulunan ünsüz + 1 son ünsüz bulunmayan hece için
  toplam 28 sütundan oluşan tek bir blokta 588 hece yer almaktadır.
* 19 başta bulunabilen ünsüz bloğundan (588) oluşan toplam 11.172 hece yazılabilmektedir.
* 19 Başta bulunan ünsüz x 21 ünlü x (1 Son ünsüz bulunmayan hece + 27 Sonda bulunan ünsüz)= 11.172 hece  
    
      * Hece başında bulunan ünsüz harfler (19 adet):
        ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ㅁ ㅂ ㅃ ㅅ ㅆ ㅇ ㅈ ㅉ ㅊ ㅋ ㅌ ㅍ ㅎ
      * Hece ortasında bulunan ünlü harfler (21 adet):
        ㅏ ㅐ ㅑ ㅒ ㅓ ㅔ ㅕ ㅖ ㅗ ㅘ ㅙ ㅚ ㅛ ㅜ ㅝ ㅞ ㅟ ㅠ ㅡ ㅢ ㅣ
     * Hece sonunda bulunan temel ünsüz harfler ve birleşik ünsüz harfler (27 adet):
        ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ㄹ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅁ ㅂ ㅄ ㅅ ㅆ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ

Bu bölümde Kore alfabesi, Hangıl'da yer alan ünlü harfler tek tek ele alınıp açıklanmıştır. Ancak verilen açıklamalar ve örnekleri daha iyi anlayabilmek amacıyla Korece'de Benzeşme ve Damaksıllaşma sayfasına göz atılmalıdır. Ayrıca Hangıl yazım düzeni diğer alfabe tabanlı yazı sistemlerinden farklı olduğu için Hangıl yazım düzeni sayfasına bakılmasında yarar vardır.

Temel ünlü harfler, alfabede yer alan harflerdir. Ünlü harfler yalnızca hece ortasında ya da sonunda bulunabilir. Ünlü bir sesi tek başına çıkartmak için hece başında bir ses değeri olmayan 'ㅇ' harfine ünlü harfler eklenerek yazılır. (Bakınız:Hangıl yazım düzeni).

Hangıl'ın ilk ünlü harfidir. Türkçe'de "a" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /a/ olmaktadır.
Okunuşu

Hangıl'ın ikinci ünlü harfidir. Türkçe'de "ya" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ya/ olmaktadır.
Okunuşu

Hangıl'ın üçüncü ünlü harfidir. Türkçe'de "ô" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ô/ olmaktadır. Normal /o/ sesinden farklıdır. Ağzın şekli /a/ sesini çıkarır gibi açıkken /o/ sesi çıkarılır. Bazı durumlarda /ıo/ şeklinde de gösterilmektedir.
Okunuşu

Hangıl'ın dördüncü ünlü harfidir. Türkçe'de "yô" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /yô/ olmaktadır. Normal /yo/ sesinden farklıdır. Ağzın şekli /ya/ sesini çıkarır gibi açıkken /yo/ sesi çıkarılır. Bazı durumlarda /yıo/ şeklinde de gösterilmektedir.
Okunuşu

Hangıl'ın beşinci ünlü harfidir. Türkçe'de "o" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /o/ olmaktadır.
Okunuşu

Hangıl'ın altıncı ünlü harfidir. Türkçe'de "yo" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /yo/ olmaktadır.
Okunuşu

Hangıl'ın yedinci ünlü harfidir. Türkçe'de "u" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /u/ olmaktadır.
Okunuşu

Hangıl'ın sekizinci ünlü harfidir. Türkçe'de "yu" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /yu/ olmaktadır.
Okunuşu

Hangıl'ın dokuzuncu ünlü harfidir. Türkçe'de "ı" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ı/ olmaktadır.
Okunuşu

Hangıl'ın onuncu ünlü harfidir. Türkçe'de "i" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /i/ olmaktadır.
Okunuşu

Birleşik ünlü harfler, alfabede yer almayan harflerdir. Bu harfler, iki temel ünlü harfin birleşmesi sonucu oluşmuşlardır. Ünlü harfler yalnızca hece ortasında ya da sonunda bulunabilir. Ünlü bir sesi tek başına çıkartmak için hece başında bir ses değeri olmayan 'ㅇ' harfine ünlü harfler eklenerek yazılır. (Bakınız:Hangıl yazım düzeni).

Hangıl harfidir, ünlüdür. Türkçe'de "ê" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ê/ olmaktadır. Normal /e/ sesinden farklıdır. Türkçe'deki açık /e/ sesidir.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "yê" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /yê/ olmaktadır. Normal /ye/ sesinden farklıdır. Türkçe'deki açık /e/ sesi ile /y/ sesinin birleşimidir.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "e" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /e/ olmaktadır.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "ye" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ye/ olmaktadır.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "va" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /va/ ya da /oa/ olmaktadır.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "vê" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /vê/ ya da /oê/ olmaktadır. Normal /ve/ sesinden farklıdır. Türkçe'deki /v/ ile açık /e/ sesinin birleşimidir.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "vi" ya da "oi" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /vi/, /oi/ ya da /ö/ olmaktadır. Ayrıca "ㅟ" birleşik ünlüsünün de gösterilişi "vi" şeklindedir. Fakat okunuşunda değişiklikler bulunmaktadır. Bu nedenle bazı durumlarda bu harf "oi" şeklinde de gösterilebilir.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "vô" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /vô/ ya da /uô/ olmaktadır. Normal /vo/ sesinden farklıdır. Ağzın şekli /a/ sesini çıkarır gibi açıkken /o/ sesi çıkarılır. Bazı durumlarda /vıo/ şeklinde de gösterilmektedir.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "ve" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ve/ ya da /ue/ olmaktadır.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "vi" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /vi/, /ui/ ya da /ü/ olmaktadır. Ayrıca "ㅚ" birleşik ünlüsünün de gösterilişi "vi" şeklindedir. Fakat okunuşunda değişiklikler bulunmaktadır. Bu nedenle bazı durumlarda bu harf "ui" şeklinde de gösterilebilir.
Okunuşu

Hangıl harfidir, ünlüdür. Türkçe'de "ıy" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ıy/, /i/ ya da /e/ olmaktadır.
Okunuşu

Bu bölümde Kore alfabesi, Hangıl'da yer alan harfler tek tek ele alınıp açıklanmıştır. Ancak verilen açıklamalar ve örnekleri daha iyi anlayabilmek amacıyla Benzeşme ve Damaksıllaşma sayfasına göz atılmalıdır. Ayrıca Hangıl yazım düzeni diğer alfabe tabanlı yazı sistemlerinden farklı olduğu için ayrıca Hangıl yazım düzeni sayfasına bakılmasında yarar vardır.

Temel ünsüz harfler, alfabede yer alan harflerdir. Bunlar hem hece başında hem de hece sonunda bulunabilmektedirler (Bakınız:Hangıl yazım düzeni).

Giyôg. Hangıl'ın ilk harfidir, ünsüzdür. Türkçe'de "g" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /g/ ve /k/ olmaktadır.
Okunuşu

Niın. Hangıl'ın ikinci harfidir, ünsüzdür. Türkçe'de "n" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /n/ olmaktadır.
Okunuşu

Digıd. Hangıl'ın üçüncü harfidir, ünsüzdür. Türkçe'de "d" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /d/ olmaktadır.
Okunuşu

Riıl. Hangıl'ın dördüncü harfidir, ünsüzdür. Türkçe'de "r" ve bazı durumlarda "l" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /r/ ve /l/ olmaktadır.
Okunuşu

Hangıl'ın beşinci harfidir, ünsüzdür. Türkçe'de "m" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /m/ olmaktadır.
Okunuşu

Hangıl'ın altıncı harfidir, ünsüzdür. Türkçe'de "b" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /b/ olmaktadır.
Okunuşu

Hangıl'ın yedinci harfidir, ünsüzdür. Türkçe'de "s", "ş" ve bazı durumlarda "d" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /s/, /ʃ/ ve /d/ olmaktadır.
Okunuşu

Hangıl'ın sekizinci harfidir, ünsüzdür. Hece başında herhangi bir değer ifade etmez. Türkçe'de "ng" harfi ile gösterilir. Okunuşu hecedeki durumuna göre yoktur ya da /ŋ/ olmaktadır.
Okunuşu

Hangıl'ın dokuzuncu harfidir, ünsüzdür. Türkçe'de "c" ve bazı durumlarda "d" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ʨ/ ve /d/ olmaktadır.
Okunuşu

Hangıl'ın onuncu harfidir, ünsüzdür. Türkçe'de "ç" ve bazı durumlarda "d" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ʨʰ/ ve /d/ olmaktadır.
Okunuşu

Hangıl'ın on birinci harfidir, ünsüzdür. Türkçe'de "k" ve bazı durumlarde "g" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /k/ ve /g/ olmaktadır.
Okunuşu

Hangıl'ın on ikinci harfidir, ünsüzdür. Türkçe'de "t" ve bazı durumlarda "d" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /t/ ve /d/ olmaktadır.
Okunuşu

Hangıl'ın on üçüncü harfidir, ünsüzdür. Türkçe'de "p" ve bazı durumlarde "b" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /p/ ve /b/ olmaktadır.
Okunuşu

Hangıl'ın on dördüncü harfidir, ünsüzdür. Türkçe'de "h" ve bazı durumlarda "d" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /h/ ve /d/ olmaktadır.
Okunuşu

Çift ünsüz harfler, alfabede yer almayan harflerdir. Bu harfler, aynı temel ünsüz harfin yanyana yazılmasıyla oluşmuş klavyede ayrı yere sahip harflerdir. Hepsi hece başında bulunabilmesine rağmen yalnızca ㄲ ve ㅆ hece sonunda bulunabilmektedirler (Bakınız:Hangıl yazım düzeni).

Hangıl harfidir, ünsüzdür. Türkçe'de "gg" ve bazı durumlarda "kk" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /g’/ ve /k’/ olmaktadır.
Okunuşu

Hangıl harfidir, ünsüzdür. Türkçe'de "dd" ve bazı durumlarda "tt" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /d’/ ve /t’ / olmaktadır. Yalnızca hece başında bulunabilir.
Okunuşu

Hangıl harfidir, ünsüzdür. Türkçe'de "bb" ve bazı durumlarda "pp" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /b’/ ve /p’/ olmaktadır. Yalnızca hece başında bulunabilir.
Okunuşu

Hangıl harfidir, ünsüzdür. Türkçe'de "ss", "şş" ve bazı durumlarda "dd" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /s’/, /ʃ’ / ve /d’/  olmaktadır.
Okunuşu

Hangıl harfidir, ünsüzdür. Türkçe'de "cc" ve bazı durumlarda "dd" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /c’/ ve /d’/ olmaktadır. Yalnızca hece başında bulunabilir.
Okunuşu

Birleşik ünsüz harfler, alfabede yer almayan harflerdir. Bu harfler, temel ünsüz iki harfin birleşik halde yazılmasıyla oluşmuş harflerdir. Tamamı hece sonunda bulunmaktadır (Bakınız:Hangıl yazım düzeni).

Birleşik Hangıl harfidir, iki ünsüz ㄱ ve ㅅ harflerinden oluşur. Türkçe'de "gs", "gş" ve bazı durumlarda "g" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ks/, /kʃ/ ve /k/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄴ ve ㅈ harflerinden oluşur. Türkçe'de "nc" ve bazı durumlarda "n" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /nʨ/ ve /n/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄴ ve ㅎ harflerinden oluşur. Türkçe'de "nh" ve bazı durumlarda "n" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /nh/ ve /n/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄹ ve ㄱ harflerinden oluşur. Türkçe'de "lg", "l" ve bazı durumlarda "g" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /lk/, /l/ ve /k/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄹ ve ㅁ harflerinden oluşur. Türkçe'de "lm" ve bazı durumlarda "m" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /lm/ ve /m/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄹ ve ㅂ harflerinden oluşur. Türkçe'de "lb" ve bazı durumlarda "l"  harfi ile gösterilir. Okunuşu hecedeki durumuna göre /lb/ ve /l/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄹ ve ㅅ harflerinden oluşur. Türkçe'de "ls", "lş" ve bazı durumlarda "l" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /ls/, /lʃ/ ve /l/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄹ ve ㅌ harflerinden oluşur. Türkçe'de "lt" ve bazı durumlarda "l" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /tʰ/ ve /l/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄹ ve ㅍ harflerinden oluşur. Türkçe'de "lp" ve bazı durumlarda "p" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /lp/ ve /p/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㄹ ve ㅎ harflerinden oluşur. Türkçe'de "lh" ve bazı durumlarda "l" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /lh/ ve /l/ olmaktadır.
Okunuşu

Birleşik Hangıl harfidir, iki ünsüz ㅂ ve ㅅ harflerinden oluşur. Türkçe'de "bs", "bş" ve bazı durumlarda "b" harfi ile gösterilir. Okunuşu hecedeki durumuna göre /bs/, /bʃ/ ve /b/ olmaktadır.
Okunuşu

Latin harfleri ile yazılmayan dillerin Latin harfleri ile yazılmasına genel olarak Latinceleştirme ya da Romanization denmektedir. Kore yazı sistemi, Hangıl için de çeşitli sistemler geliştirilmiştir. Fakat bu sistemlerin hepsi İngilizce de kullanılan Latin harfleri üzerine kurulmuştur. O nedenle evrensel bir değer ifade etmemektedir. Ancak Kore Cumhuriyeti, resmi olarak bu sistemleri zaman içinde kullanmış ve son olarak da "Gözden Geçirilmiş Latinceleştirme"(Revised Romanization of Korean) adı altında kendi hazırladığı sistemi uluslararası alanda kullanmaktadır.

2000 yılında Güney Kore'de resmi latinceleştirme olarak McCune-Reischauer ile değiştirilen Revised Romanization of Korean ile birlikte McCune-Reischauer latinceleştirme sistemi Korecenin latinceleştirilmesinde kullanılan en yaygın sistemdir. McCune-Reischauer sisteminin değişik bir versiyonu Kuzey Kore'de resmi olarak kullanılmaktadır.
Bu sistem 1937  yılında George M. McCune ve Edwin O. Reischauer adındaki iki Amerikalı tarafından oluşturulmuştur. Birkaç istisna dışında bu sistem, Hangıl'ın yazılışını (transliteration) değil aslında fonetik okunuşunu ifade etmeyi amaçlamıştır. McCune–Reischauer sistemi Kore dışında çok yaygın bir biçimde kullanılmaktadır. Bu sistemin değişik bir versiyonu 1984 yılından 2000 yılına dek Güney Kore'de resmi latinceleştirme sistemi olarak kullanılmıştır.
Detaylı bilgi için ayrıca bakınız: Wikipedia:McCune-Reischauer (İngilizce)

Yale sistemi, McCune-Reischauer sisteminden yaklaşık beş yıl sonra Samuel Elmo Martin ve Yale Üniversitesi'ndeki meslektaşları tarafından geliştirilmiştir. Bu sistem, Kore dilinin dilbilimdeki standart latinceleştirme sistemidir.
Yale sistemi, asıl vurguyu kelimelerin morfo-fonemik yapısına yapmaktadır. Bu özelliği ile Yale sistemi, yaygın bir şekilde kullanılan diğer iki sistemden (Revised Romanization of Korean (RR) and McCune-Reischauer) ayrılmaktadır. Bu iki sistem genellikle tüm kelimenin okunuşunu karşılarken bu okunuştaki morfo-fonemik unsurların genellikle latinceleştirme ile anlaşılmamaktadır ki bu da dilbilimsel açıdan yetersiz kalmasına neden olmaktadır. Morfo-fonemik kapsamı açısından, Yale sisteminin yaklaşımı Chosŏnŏ sin ch'ŏlchapŏp (Hangıl: 조선어 신철자법, Hanca: 朝鮮語新綴字法, Türk: Çosônô Şinçôlcabôb) olarak bilinen Kuzey Kore'nin ortografisi ile kıyaslanabilir.
Yale sistemi, içeriğinden bağımsız olarak her bir morfo-fonem için uygun bir okunuş kullanmaya çalışmaktadır.
Detaylı bilgi için ayrıca bakınız: Wikipedia:Yale Romanization (İngilizce)

Korece'nin Gözden Geçirilmiş Latinceleştirmesi (Hangıl:국어의 로마자 표기법, İngilizce:The Revised Romanization of Korean) anlamına gelen bu sistem, eski McCune–Reischauer sisteminin yerine Güney Kore'de Korecenin latinceleştirilmesi için Kültür, Spor ve Turizm Bakanlığı tarafından resmi sistem olarak ilan edilmiştir.
Bu yeni sistem, tek sesi temsil eden iki harfler adına fonetik işaretleri kaldırmış ve anadili Korece olmayanlar için Korecenin fonetiğinin önerilen temsilinden çok Kore fonolojisine daha fazla bağlı kalmıştır.
Ulusal Kore Dili Akademisi tarafından 1995 yılından itibaren geliştirilmiş ve 7 Temmuz 2000 tarihinde Güney Kore Kültür ve Turizm Bakanlığı tarafından ilan edilmiştir.
Detaylı bilgi için ayrıca bakınız: Wikipedia:Revised Romanization of Korean (İngilizce)

Kore alfabesi, Hangıl'da her ne kadar her harfin ayrı bir ses değeri olsa da okunuş esnasında hece ve hecelerin kelime içindeki yerine göre özellikle ünsüz harfler değişik ses biçimlerini alabilmektedirler. O nedenle harfler her zaman temel ses değerleri ile okunmaz.
Ünsüz Kore harflerinin kelime içindeki hecelerde ses değişiklikleri temel olarak iki alt kategoride ele alınmaktadır: benzeşme ve damaksıllaşma.

1. Benzeşme
2. Damaksıllaşma
Benzeşme, harflerin hece içindeki konumlarına göre bir önceki ve bir sonraki harfle olan etkileşiminden oluşmaktadır. Bu nedenle her harf ayrı ayrı ele alınmaktadır.
Damaksıllaşma ise belirli harflerin ünlü bir harf ile karşılaştığında aldığı değişimi belirtmektedir.

1. Hece başında /r/, hece sonunda /l/ diye okunur
2. Devamında ㅑ,ㅕ,ㅛ,ㅠ,ㅣ, ㅙ,ㅚ,ㅞ, ㅟ ünlü harfleri gelirse /ş/, diğer durumlarda /s/
3. Devamında ㅑ,ㅕ,ㅛ,ㅠ,ㅣ, ㅙ,ㅚ,ㅞ, ㅟ ünlü harfleri gelirse /şş/, diğer durumlarda /ss/

Tek heceden oluşan kelimelerde ya da birden fazla heceden oluşan kelimelerin son hecelerindeki ses değişimleri aşağıdaki gibidir:

1. Devamında ㅑ,ㅕ,ㅛ,ㅠ,ㅣ, ㅙ,ㅚ,ㅞ, ㅟ ünlü harfleri gelirse /ş/, diğer durumlarda /s/
2. Devamında ㅑ,ㅕ,ㅛ,ㅠ,ㅣ, ㅙ,ㅚ,ㅞ, ㅟ ünlü harfleri gelirse /şş/, diğer durumlarda /ss/
3. Hece başında bir ses değeri yoktur, ünlü harf okunur.

1. ㄱ, ㄲ, ㄳ, ㄺ, ㅋ harflerinin hepsi hece sonunda ㄱ (/g/) olarak okunur.
2. ㄴ, ㄵ, ㄶ harflerinin hepsi hece sonunda ㄴ (/n/) olarak okunur.
3. ㄷ, ㅅ, ㅆ, ㅈ, ㅊ, ㅌ,ㅎ harflerinin hepsi hece sonunda ㄷ (/d/) olarak okunur.
4. ㄹ, ㄼ, ㄽ, ㄾ, ㅀ harflerinden ㄼ hariç hespi ㄹ (/l/) olarak okunur. ㄼ ise hem ㄹ (/l/)  hem de ㅂ (/b/) olarak okunur.
5. ㅁ, ㄻ harflerinin hepsi hece sonunda ㅁ (/m/) olarak okunur.
6. ㅂ, ㄿ, ㅄ, ㅍ  harflerinin hepsi hece sonunda ㅂ (/b/) olarak okunur.

Birden fazla heceden oluşan kelimelerde ilk hecenin sonunda ve ikinci hecenin başında bulunan harflerin birbirileri ile olan etkileşimle bazı harflerin ses değerleri değişir.

사: ㅅ harfinden sonra ㅏ, ㅐ, ㅓ, ㅔ, ㅗ, ㅘ, ㅙ, ㅚ, ㅜ, ㅝ, ㅞ, ㅟ, ㅡ, ㅢ harfleri geldiğinde ㅅ harfinin okunuşu değişmez ve /s/ şeklinde olur.
시: ㅅ harfinden sonra ㅣ, ㅑ, ㅒ, ㅕ, ㅖ, ㅛ, ㅠ harfleri geldiğinde ㅅ harfinin okunuşu /s/ değil /ş/ şeklinde olur. (시, 샤, 섀, 셔, 셰, 쇼, 슈)
아: ㅇ harfinden sonra ㅏ, ㅐ, ㅓ, ㅔ, ㅗ, ㅘ, ㅙ, ㅚ, ㅜ, ㅝ, ㅞ, ㅟ, ㅡ, ㅢ. 
이1: ㄷ ve ㅌ harflerinden sonra 이, 야, 얘, 여, 예, 요, 유 harfleri geliyorsa ㄷ harfi /c/ şeklinde, ㅌ harfi de /ç/ şeklinde okunur.
이2: Öz Korece kelimelerde 이, 야, 얘, 여, 예, 요, 유 harflerinden önceki hece ünsüzle bitiyorsa bu seslerin önüne ㄴ (/n/) sesi gelir ve okunuşları 니, 냐, 냬, 녀, 녜, 뇨, 뉴 şeklinde olur.
하: ㅎ harfinden sonra ㅏ, ㅐ, ㅓ, ㅔ, ㅗ, ㅘ, ㅙ, ㅚ, ㅜ, ㅝ, ㅞ, ㅟ, ㅡ, ㅢ. 
히: ㅎ harfinden sonra ㅣ, ㅑ, ㅒ, ㅕ, ㅖ, ㅛ, ㅠ. Özellikle ㄷ harfi 히 ile karşılaştığında /çi/ diye okunur. ㅅ harfi ile karşılaştığında ise okunuşu /s/ yerine /ş/ olur.
1*: kelime ㄱ ile başlayan ek aldığında sesletimi /n/ olur.
2*: kelime ㄹ ile başlayan ek aldığında sondaki ㄹ harfi /n/ şeklinde okunur.
3*:

Korece'de konuşma esnasında ya da cümle içerisinde hitaba göre çeşitli saygı/yüceltme seviyeleri bulunmaktadır. Bunlar, kendinden yaş/mevki bakımından yüksek kişiler için, yaş/mevki bakımında aynı durumda olan kişiler için ve yaş/mevki bakımından aşağıda olan kişiler için ve yakınlık-uzaklık seviyelerine göre değişmektedir. Bu saygı seviyeleri günlük hayat içerisinde olduça önem taşımaktadır. Yanlış seçilen saygı seviyesi pek çok anlaşmazlıklara yol açabilmektedir. Korece'de bulunan bu yüceltme üç şekilde olmaktadır:

Özne yüceltmesinde konuşan, dinleyen ve öznenin birbirileri ile olan ilişkileri oldukça önemlidir. Yaş, mevki, yakınlık durumları vs göre bu üç kişinin birbirileri arasındaki etkileşimleri doğrultusunda özneyi yüceltmek amacıyla fiil köküne -(으)시 eklenir. Fiil kökü, ünlü ile bitiyorsa –시eklenir eğer ünsüz ile bitiyorsa –으시 eklenir.
Örnek:  

Bu ekin kullanımında birkaç istisna bulunmaktadır. Bunlar aşağıdaki gibidir:
1.	Dinleyen kişinin özneden daha yüksek bir statüde yer aldığı durumlarda özne yüceltme eki olan -(으)시 kullanılmaz.

Örnek: 
할아버지, 아버지가 밖에 갔습니다.  – Büyükbaba, babam dışarıya çıktı.
선생님, 교수님이 지금 왔습니다. – Öğretmenim, profesör şimdi geldi.

2.	Haber raporları, kitap yazıları gibi yerlerde her ne kadar özne yüksek bir statüde olsa da özne yüceltme eki -(으)시 kullanılmaz.

Örnek: 
대통령이 터키를 방문한다. – Devlet başkanı Türkiye’yi ziyaret ediyor.

3.	Yüceltme hedefindeki öznenin vücut organları ya da kişisel bir aitliğinden bahsederken -(으)시 özne yüceltme eki ile dolaylı yoldan yüceltme yapılabilir.

Örnek: 
김 선생님께서는 얼굴이 예쁘십니다. – Kim hocanın güzel bir yüzü var/yüzü güzeldir.

Konuşma seviyeleri Resmi ve Samimi Hitab olmak üzere ikiye ayrılır. Ayrıca bu iki hitab seviyesi kendi içinde alt bölümlere ayrılmaktadır. Detaylar için Resmi Hitab ve Samimi Hitab konularına bakınız.

1. Resmi Hitab
Saygılı Düzey
Orta Düzey
Yalın Düzey
2. Samimi Hitab
Saygılı Düzey
Yalın Düzey

Saygı kalıplarını kullanırken bazı belirli kelimeler ve ekler yüceltme durumuna göre tamamen değişmektedir. Aşağıda bu duruma örnek sık kullanılan kelimelerden ve eklerden örnekler verilmiştir:

Resmi Hitabın Orta Düzeyi, yaşı ya da sosyal statüsü daha aşağı olan dinleyiciye yönelik çok fazla "küçültme" olmaksızın yaşı yüksek ya da sosyal statüsü yüksek olan konuşan tarafından kullanılır. Bu düzey, bir alt seviyeye oranla dinleyiciye belirli bir ölçüde saygı göstermektedir. Sonuç olarak, dinleyen kişi göreceli olarak yaşlı ya da sosyal statüsü yüksek olan biridir. Bu nedenle bu kalıp en çok aynı kuşaktaki yaşlı kişiler arasında sıklıkla kullanılmaktadır. Ayrıca aileye sonradan katılan damat için gelinin annesi tarafından bu kalıbın kullanımı vardır ve damadın (yetişkin durumundaki) kendinden küçükler için bu kalıbı kullandığı durumlar artmaktadır.
Ayrıca bu kalıpta zamir olan "sen", '자네' şeklini alır.

Örnek:
• Bildiri cümlesinde fiil kökü ünlü ile bitiyorsa: -네, -데, -ㄴ세
 누나가 학교에 가네.  ↔  Ablam okula gidiyor. 

• Bildiri cümlesinde fiil kökü ünsüz ile bitiyorsa: -네, -데, -은세
 동민이 책을 읽네.  ↔  Dongmin kitap okuyor. 

• Soru cümlesinde fiil kökü ünlü ile bitiyorsa: -니까, -는가, -던가
 손님이 차를 마시니까?.  ↔  Misafir çay içiyor mu?.

• Soru cümlesinde fiil kökü ünsüz ile bitiyorsa: -으니까, -는가, -던가
 연필이 있으니까?       ↔  Kalemin var mı?

• Emir cümlesinde : -게
 위쪽으로 보게.     ↔  Yukarıya bakın.
 그 자리에 앉게.    ↔  Oraya oturun.

• Öneri cümlesinde : -세
 한국어를 공부하세.  ↔  Korece (ders) çalışalım.
 김치를 먹세.       ↔  Gimçi yiyelim.

• Ünlem cümlesinde: -구먼
 이 꽃이 매우 예쁘구먼! ↔ Bu çiçek çok güzel!

Resmi-Saygılı Düzey , konuşan kişinin dinleyen kişiye saygısını ve aynı şekilde tevazu ve samimiyet derecesini ifade eder. Bu nedenle konuşanın, dinleyen kişiye saygı ve hürmetini göstermek amacıyla genellikle resmi durumlardaki ciddi ve kanuni konuşmalarda sıkça kullanılır. Ayrıca bu kalıp, konuşan ve dinleyen kişinin sosyal statü ya da karşılıklı ilişkisi ile bağlantılı olmaksızın konuşan ve dinleyen kişinin ilk defa karşılaştıkları veya birbirilerini iyi tanımadıkları durumlarda da kullanılır.

Örnek:
• Bildiri cümlesinde fiil kökü ünlü ile bitiyorsa: -ㅂ니다
  누나가 학교에 갑니다.  ↔  Ablam okula gidiyor. 

• Bildiri cümlesinde fiil kökü ünsüz ile bitiyorsa: -습니다
  동민이 책을 읽습니다.  ↔  Dongmin kitap okuyor. 

• Soru cümlesinde fiil kökü ünlü ile bitiyorsa: -ㅂ니다
  손님이 차를 마십니까?.  ↔  Misafir çay içiyor mu?.

• Soru cümlesinde fiil kökü ünsüz ile bitiyorsa: -습니다
  연필이 있습니까?       ↔  Kalemin var mı?

• Emir cümlesinde fiil kökü ünlü ile bitiyorsa: -십시오
  위쪽으로 보십시오.     ↔  Yukarıya bakın.

• Emir cümlesinde fiil kökü ünsüz ile bitiyorsa: -으십시오
  그 자리에 앉으십시오.   ↔  Oraya oturun.

• Öneri cümlesinde fiil kökü ünlü ile bitiyorsa: -십시다
  한국어를 공부하십시다.  ↔  Korece (ders) çalışalım.

• Öneri cümlesinde fiil kökü ünsüz ile bitiyorsa: -으십시다
  김치를 먹으십시다.     ↔ Gimçi yiyelim.

• Ünlem cümlesinde: -구료
  이 꽃이 매우 예쁘구료! ↔ Bu çiçek çok güzel!

Resmi Hitabın Yalın Düzeyi, tipik olarak yaşı ya da statüsü yüksek olan konuşanın alt seviyedeki dinleyen için kullandığı bir kalıptır. Ayrıca aynı yaş grubundaki samimi kişiler arasında da kullanılır. Ancak bu kalıbın en çok kullanıldığı alan herhangi bir kişiyi hedef almayarak haber ve bilgilendirme amacı olan rapor, haber ve kitap yazılarındadır. Bu gibi durumlarda bu kalıp herhangi bir "küçültme" içermemektedir.

Örnek:
• Bildiri cümlesinde fiil kökü ünlü ile bitiyorsa: -ㄴ다, -(더)라
 누나가 학교에 간다.  ↔  Ablam okula gidiyor. 

• Bildiri cümlesinde fiil kökü ünsüz ile bitiyorsa: -는다, -(더)라
 동민이 책을 읽는다.  ↔  Dongmin kitap okuyor. 

• Soru cümlesinde fiil kökü ünlü ile bitiyorsa: -니, -느냐
 손님이 차를 마시니?.  ↔  Misafir çay içiyor mu?.

• Soru cümlesinde fiil kökü ünsüz ile bitiyorsa: -니, -느냐
 연필이 있니?       ↔  Kalemin var mı?

• Emir cümlesinde fiil kökünün son ünlüsü ㅏ ya da ㅗ ise: -아라 
 눈을 감아라.       ↔  Gözlerini kapat.
 
  *(Fiil kökü ㅏ ünlüsü ile bitiyorsa ㅏ fiil köküne eklenir, ve tek bir ㅏ olur)
   학교에 가라.       ↔  Okula git.
  
  *(Fiil kökü ㅗ ünlüsü ile bitiyorsa ㅏ fiil köküne eklenir, ㅘ olur)
   위쪽으로 봐라.     ↔  Yukarıya bak. 
  
• Emir cümlesinde fiil kökünün son ünlüsü ㅓ,ㅜ,ㅡ,ㅣ ise: -어라
 김치를 먹어라.     ↔ Gimçi ye.
  
  *(Fiil kökü ㅓ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ve tek bir ㅓ olur)
   다리를 건너라.     ↔   Köprüyü geç. 
  
  *(Fiil kökü ㅜ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ㅝ olur)
   책을 줘라.       ↔  Kitabı ver.  
  
  *(Fiil kökü ㅡ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ㅓ olur)
   이름을 써라.     ↔  İsmini yaz.
  
  *(Fiil kökü ㅣ ünlüsü ile bitiyorsa normal 어 gelir)
   피오나를 치어라.  ↔  Piyano çal.  

• Emir cümlesinde fiil kökünün son ünlüsü 하 ise: -여라 *(해라 olur)
 한국어를 공부해라.  ↔  Korece (ders) çalış.

• Öneri cümlesinde: -자
 한국어를 공부하자.  ↔  Korece (ders) çalışalım.
 김치를 먹자.     ↔ Gimçi yiyelim.

• Ünlem cümlesinde: -구나
 이 꽃이 매우 예쁘구나! ↔ Bu çiçek çok güzel!

Bu kalıbla günlük hayatta sıklıkla karşılaşılır. Samimi, yakınlık derecesi fazla olan kişiler arasında günlük konuşmalarda, resmi olmayan konuşmalarda daha çok bu kalıp tercih edilir.

Bu kalıbın belirgin eki -어(아,여)요 ekidir. Fiil kökündeki son ünlüye göre -아요, -어요 ve -여요 olur. Daha detaylı olarak:

1. Fiil kökünün son ünlüsü ㅏ ya da ㅗ ise: -아요
  * Fiil kökü ㅏ ünlüsü ile bitiyorsa ㅏ fiil köküne eklenir, ve tek bir ㅏ olur. → -ㅏ요
  * Fiil kökü ㅗ ünlüsü ile bitiyorsa ㅏ fiil köküne eklenir, ㅘ olur. → -ㅘ요

2. Fiil kökünün son ünlüsü ㅓ,ㅜ,ㅡ,ㅣ ise: -어요
  * Fiil kökü ㅓ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ve tek bir ㅓ olur. → -ㅓ요
  * Fiil kökü ㅜ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ㅝ olur. → -ㅝ요
  * Fiil kökü ㅡ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ㅓ olur. → -ㅓ요
  * Fiil kökü ㅣ ünlüsü ile bitiyorsa normal 어 gelir. → -어요

3. Fiil kökünün son ünlüsü 하 ise: -여요 ekini alır ve → 해요 olur.

Bu kalıpla kullanılan cümle türleri, ünlem dışında farklı bir ek almaz. O nedenle cümlenin bildiri, soru, emir ya da öneri olduğu konuşmanın gelişinden ya da vurgudan anlaşılır.

Örnek:
• Bildiri cümlesinde: -어(아,여)요 
  누나가 학교에 가요.  ↔  Ablam okula gidiyor. 
  동민이 책을 읽어요.  ↔  Dongmin kitap okuyor. 

• Soru cümlesinde: -어(아,여)요
  손님이 차를 마셔요?.  ↔  Misafir çay içiyor mu?.
  연필이 있어요?       ↔  Kalemin var mı?

• Emir cümlesinde: -어(아,여)요
  위쪽으로 봐요.     ↔  Yukarıya bakın.
  그 자리에 앉아요.   ↔  Oraya oturun.

• Öneri cümlesinde fiil kökü ünlü ile bitiyorsa: -어(아,여)요
  한국어를 공부해요.  ↔  Korece (ders) çalışalım.
  김치를 먹어요.     ↔ Gimçi yiyelim.

• Ünlem cümlesinde: -군요
  이 꽃이 매우 예쁘군요! ↔ Bu çiçek çok güzel!

Ayrıca bu kalıpta yer alan -지요 eki, 1) konuşanın belirli bir gerçek ya da durumdan oldukça emin olduğunu belirtir veya 2) konuşanın söylediği konunun dinleyici tarafından da bilindiğini vurgulamak için kullanılır. Türkçe'de yer alan "değil mi?" kalıbı gibi.

Örnek:
  누나가 학교에 가지요.  ↔  Ablam okula gidiyor(, değil mi). 
  동민이 책을 읽지요.  ↔  Dongmin kitap okuyor(, değil mi).

Bu kalıp da günlük konuşma dilinde sıklıkla karşılaşılan bir kalıptır. Samimi-Saygılı Düzey'e göre, yakınlık derecesi ve samimiyetin daha fazla olduğu kişiler arasında resmi olmayan günlük konuşmalarda daha çok bu kalıp tercih edilir. Ayrıca en alt düzeyde konuşma seviyesi olduğu için aşağılama, küçültme durumlarında sıklıkla kullanılır. Aile büyükleri çocuklarına bu şekilde hitab edebilr, ve karı-koca arasında koca, karısına bu kalıbı kullanabilir. Fakat en çok gençler arasında, çok yakın arkadaşlar arasında kullanılır.

Bu kalıbın belirgin eki -어(아,여) ekidir. Fiil kökündeki son ünlüye göre -아, -어 ve -여 olur. Daha detaylı olarak:

1. Fiil kökünün son ünlüsü ㅏ ya da ㅗ ise: -아
  * Fiil kökü ㅏ ünlüsü ile bitiyorsa ㅏ fiil köküne eklenir, ve tek bir ㅏ olur. → -ㅏ
  * Fiil kökü ㅗ ünlüsü ile bitiyorsa ㅏ fiil köküne eklenir, ㅘ olur. → -ㅘ

2. Fiil kökünün son ünlüsü ㅓ,ㅜ,ㅡ,ㅣ ise: -어
  * Fiil kökü ㅓ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ve tek bir ㅓ olur. → -ㅓ
  * Fiil kökü ㅜ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ㅝ olur. → -ㅝ
  * Fiil kökü ㅡ ünlüsü ile bitiyorsa ㅓ fiil köküne eklenir, ㅓ olur. → -ㅓ
  * Fiil kökü ㅣ ünlüsü ile bitiyorsa normal 어 gelir. → -어

3. Fiil kökünün son ünlüsü 하 ise: -여 ekini alır ve → 해 olur.

Bu kalıpla kullanılan cümle türleri, ünlem dışında farklı bir ek almaz. O nedenle cümlenin bildiri, soru, emir ya da öneri olduğu konuşmanın gelişinden ya da vurgudan anlaşılır.

Örnek:
• Bildiri cümlesinde: -어(아,여) 
  누나가 학교에 가.  ↔  Ablam okula gidiyor. 
  동민이 책을 읽어.  ↔  Dongmin kitap okuyor. 

• Soru cümlesinde: -어(아,여)
  손님이 차를 마셔?  ↔  Misafir çay içiyor mu?.
  연필이 있어?      ↔  Kalemin var mı?

• Emir cümlesinde: -어(아,여)
  위쪽으로 봐.     ↔  Yukarıya bakın.
  그 자리에 앉아.   ↔  Oraya oturun.

• Öneri cümlesinde fiil kökü ünlü ile bitiyorsa: -어(아,여)
  한국어를 공부해.  ↔  Korece (ders) çalışalım.
  김치를 먹어.     ↔ Gimçi yiyelim.

• Ünlem cümlesinde: -군
  이 꽃이 매우 예쁘군! ↔ Bu çiçek çok güzel!

Ayrıca bu kalıpta yer alan -지 eki, 1) konuşanın belirli bir gerçek ya da durumdan oldukça emin olduğunu belirtir veya 2) konuşanın söylediği konunun dinleyici tarafından da bilindiğini vurgulamak için kullanılır. Türkçe'de yer alan "değil mi?" kalıbı gibi.

Örnek:
  누나가 학교에 가지.  ↔  Ablam okula gidiyor(, değil mi). 
  동민이 책을 읽지.  ↔  Dongmin kitap okuyor(, değil mi).

Malzemeler:

110gr krem peynir, oda sıcaklığında
yarım su bardağı toz şeker
1/4 tatlı kaşığı  + 1 çimdik tuz
2 yumurtanın sarısı
1,5 tatlı kaşığı yoğurt
1/8 tatlı kaşığı vanilya
1 su bardağı margarin, oda sıcaklığında (eğer tereyağı kullanıyorsanız hamura tuz eklemeyin)
2 su bardağı un
Hazırlanması:

Mikserde krem peyniri 3 dakika çırpın. (varsa mikserin hamur ucunu kullanın.) Dörtte bir su bardağı şekeri ve 1 çimdik tuzu ekleyip 3 dakika daha çırpın. 1 yumurtanın sarısını, yoğurdu ve vanilyayı ekleyip karıştırın. Bir kaba alıp yarım saat buzdolabında bekletin.
Fırını 175 dereceye ayarlayın. Mikserde yağı ve kalan dörtte bir su bardağı toz şekeri 1-2 dakika karıştırın. Kalan dörtte bir tatlı kaşığı tuzu ve yumurta sarısını ekleyin. Unu yavaş yavaş karışıma ekleyin.
Karışımdan bir silme yemek kaşığı kadar hamur alıp yuvarlayın. Yağlı kağıt serili tepsiye yerleştirip ortasına unlanmış bir tahta kaşığın arkası veya parmağınızla bastırın. Hepsini tamamlayıp 10 dakika pişirin. Fırından çıkartıp tekrar ortalarına bastırın. 7-9 dakika daha pişirin. Küçük bir tatlı kaşığı ile kurabiyelerin ortasına birer tatlı kaşığı krem peynirli karışımdan dökün. Tekrar fırına verip 7-8 dakika (karışım katılaşana kadar) pişirin. Fırından çıkartıp soğutun, aralarına yağlı kağıt sererek hava almayan bir kaba yerleştirip buzdolabında en az 4 saat dinlendirin.

1. Giriş
Yirminci yüzyılın başından itibaren, fizikçiler kuantum fiziğindeki gelişmeleri büyük ilgiyle takip etmektedirler. Kuantum mekaniği dersine katılmaktan asla zevk almayan insanlar bile, kendi klasik gözlemlerden farklı olan garip davranışlardan etkilenmişlerdir. Örneğin, neredeyse herkes kuantum mekaniği ile ilgili ünlü alıntılardan en az birini duymuştur. Bunlar arasında NielsBohr’un “Kuantum teorisiyle ilk karşılaşmalarında şok olmayanlar, onu anlamamışlardır” ve Albert Einstein’ın “Tanrı zar atmaz” iddiası da vardır. Bu teorinin büyük cazibesinin bir başka nedeni de kuantum fiziği kavramı hakkında fikir sahibi olmak için klasik düşünce tarzından vazgeçme zorunluluğunun olmasıdır. Aksi takdirde, örneğin kuantum dolanmasını açıklamak mümkün olamaz. Günlük fizik tarafından tam olarak anlaşılamayan kuantum fiziğine ait bir dizi kural vardır. Örneğin: • Klonlanamaz teoremi:Kişinin bilinmeyen kuantum halinin bir kopyasını oluşturamayacağını belirtir. • Kimse bir sistemi, onu bozmadan ölçemez. • Belirsizlik ilkesi:Kişinin tamamlayıcı değişkenleri (bir parçacığın konumu ve momentumu gibi) keyfi olarak yüksek hassasiyetle aynı anda ölçemediğini belirtir. Verilen örneklerin ortak bir yönü vardır. Neyi yapacakları sonucuna varmaları! Bu kuantum mekaniğine dair olumsuz bir bakış açısına yol açar. Ancak daha yakından incelendiğinde, bu özelliklerin olumlu yönleri olduğu ortaya çıkmaktadır. Kuantum kriptografisi, bu “sakıncaların” kullanışlı uygulamalara dönüştürülebileceğine en iyi örnektir. Ama kuantum kriptografisi tam olarak nedir?
Kriptografi Tarihi Kriptografi (Yunancada kryptos “gizli” ve graphein “yazı”) güvenli kodlar oluşturma sanatıdır; oysa kriptanaliz bu kodları kırmakla uğraşır. Bu iki alan güvenli iletişim bilimleri olan kriptolojiye aittir. Mezopotamyalılar ve eski Mısırlılar da dâhil olmak üzere eski uygarlıklar, erken dönemde güvenli bir şekilde iletişim kurmanın önemini fark etmişlerdir. Düşmanlarının onların değerli sırlarını açığa çıkarma tehdidinin farkındaydılar. Yıllar boyunca, gizli bilgilerin yanlış ellere geçmesini önlemek için birçok kriptografi tekniği geliştirilmiştir. Kriptografi, trans-pozisyon ve ikame olarak bilinen iki şifreleme yöntemine bölünebilir.
Transpozisyonda, bir metin şifrelenmeden önce mesaj için teknik terim olan bir düz metindeki harflerin sırası, belirli bir permütasyon ile yeniden düzenlenir. Bu yönteme ilişkin ünlü bir örnek, ilk askeri şifreleme aygıtını temsil eden “Scytale”verilebilir. Spartalı askeri komutanlar tarafından M.Ö. 5. yüzyılda kullanılmıştır. Scytale, etrafına sarılı bir deri veya parşömen şeridine sahip bir silindirden oluşur. Bu şeritte, yalnızca aynı çapa sahip bir silindir kullanıldığında doğru okunabilen bir mesaj yazılır. Aksi halde, rastgele harflerden oluşan bir liste gibi görünür.
Şekil 1: Spartalılar tarafından kullanılan ilk askeri kriptografik cihaz, Scytale.
Transpozisyonda her harf farklı bir düzende yeniden düzenlenir, ancak kimliği değişmeden kalır. Bunun aksine, ikame halinde her harf kendi kimliğini değiştirir, ancak konumunu korur. Julius Sezar askeri amaçlar için basit bir harf değişimi kullanmıştır. Mesajında her harf, alfabenin aşağısına doğru üç nokta izleyen harfle değiştirilmiştir. Bu nedenle, A harfi D, B harfi E vb. ile ikame edilir. Sezar'ın yerine koyma yöntemini kullanarak, örneğin İngilizcede “folk” kelimesi “iron” kelimesine dönüşür. Alfabenin belirli sayıda noktayı (sadece üç değil) kaydırdığı bu işleme Sezar şifresi denir.
Klasik Kriptografi Günümüzde, bir kriptogramın güvenliği şifreleme ve şifre çözme işleminin gizliliğine değil, anahtarın gizliliğine bağlıdır. Anahtar, anahtar olmadan kriptogramın kilidini açmanın imkânsız olacağından emin olmak için rastgele seçilmiş ve yeterince uzun bit dizileri içermelidir. Bu talep uygulamada yumuşatılmıştır. Buradaki fikir, değerli bilgilerin en azından kodu kırmak için gereken süre kadar gizli kalması gerektiğidir. Aşağıdaki şifreleme sistemlerini açıklamak için, gizlice iletişim kurmak isteyen iki taraf olan Melis ve Faruk'u ve aynı zamanda yetkisiz dinleyicileri Ela’yı tanıtmak uygun olur.
Biri, iki şifreleme sistemi olan simetrik ve asimetrik şifreleme arasında ayrım yapar.
Simetrik (Gizli Anahtar) Kriptosistem Simetrik şifreleme sistemi anahtarı gizli olarak paylaşır, dolayısıyla gizli anahtar şifreleme sistemi olarak da bilinir. Hem şifreleme hem de kripto çözme için tek bir anahtar kullanır. "Tek kullanımlık şifre" bu kategoriye ait olup 1917 yılında Amerikalı mühendis GilbertVernam tarafından icat edilmiştir. Bu şifreleme sisteminde, Melis düz metin için rastgele oluşturulmuş bir anahtar ekler ve şifreli bir metin alır. Bu şifreli mesaj, aynı anahtarı çıkararak şifrelenmiş şifreyi çözen Faruk'a gönderilir. Aşağıda yer alan örnek, Vernam’ın tek kullanımlık şifre planını göstermenin en iyi yoludur. Büyük harflerle basit bir dijital alfabe kullanımı
Şifreli metnin anahtar gibi rastgele olduğunu unutmayın. Sonuç olarak, her ikisi de herhangi bir bilgi içermemektedir. Şimdi şifreli metin, aynı anahtarı çıkararak mesajın şifresini çözen Faruk'a gönderilir:
Yıllar sonra anahtar, mesajla aynı uzunluğa sahip ve gerçekten rastgele olduğu sürece bu şifreleme sisteminin mükemmel bir gizlilik sağladığı gösterilmiştir. Ayrıca, anahtar sadece tek bir şifreleme için kullanılabilir, -bu nedenle “tek kullanımlık şifre” olarak adlandırılmıştır. Bu klasik kriptosistemin gerçekten kırılamaz olmasına rağmen, hâlâ sakıncaları vardır. Ana
sorun anahtar dağılımıdır. Melis ve Faruk'un anahtarı paylaşmak için çok güvenli ve güvenilir bir kanal kullanması gerekmektedir. Daha önce de belirtildiği gibi, her mesaj için anahtar yenilenmelidir. Aksi halde, Ela belli bir süre sonra çok fazla bilgi edinebilir. Her bir anahtar için bütün prosedürün tekrarlanması çok masraflı hale gelecektir.
Asimetrik (Ortak Anahtar) Kriptosistem Simetrik kriptosistemin alternatif yöntemi, genellikle ortak anahtarlı kriptosistem olarak adlandırılan asimetrik kripto sistemidir. İlk yönteme zıt olarak, genel anahtar şifreleme, şifreleme ve şifre çözme için farklı anahtarlar kullanır. 1978 yılında, RSA şifreleme sistemi, yani ilk kamu anahtar şifreleme tekniği uygulaması geliştirilmiştir. Mucitler Ronald Rivest, Adi Shamir ve LeonardAdleman'ın soyadlarının ilk harflerini almıştır ve halen yaygın olarak kullanılmaktadır. RSA aşağıdaki gibi çalışır: Melis, bir ortak anahtarı hesaplamak için kullandığı özel bir anahtar seçer. İlgilenen herhangi bir tarafın bu genel anahtara erişimi vardır. Örneğin Faruk, Melis ile güvenli bir şekilde iletişim kurmak istiyorsa, mesajını şifrelemek için ortak anahtarı kullanacaktır. Faruk, şifrelenmiş mesajı özel anahtarla şifresini çözen Melis 'e gönderir. Özel anahtarı bilmeden, Ela herhangi bir değerli bilgiyi elde edemez, çünkü ortak anahtar bilgisi şifre çözmede yardımcı olmaz. Sadece bu özel anahtarın bulunduğu kişi, bu durumda Melis, mesajın kilidini açabilir. Aşağıdaki asma kilit benzetimini kullanmak asimetrik kriptografi yöntemini daha da açık hale getirmektedir. Herkes bir asma kilidi kilitleyebilir. Ancak, sadece anahtarı olan kişi onu açabilir. Melis 'in açık asma kilitlerin birçok kopyasını üretebileceğini düşünün. Bu açık asma kilitler genel anahtar olarak yorumlanabilir. Melis 'e özel bir mesaj göndermek isteyen Faruk, böyle bir açık asma kilit alır. Asma kilit kilitlendikten sonra yalnızca Melis doğru anahtara sahip olduğu için verilere erişebilir. Açıkçası, Melis’in anahtarı özel anahtar olarak görülebilir.
Genel anahtar şifreleme sistemlerinin büyük bir avantajı, anahtar dağılımı sorununun görünmemesidir. Son yıllarda, bu şifreleme sistemleri çok popüler hale geldi. Örneğin, internet güvenliğinin parçaları bu sistemlere dayanmaktadır. Teorik olarak, kamu anahtar şifreleme tekniği süreci basit görünmektedir. Yine de gerekli kriterleri karşılayan
matematiksel bir fonksiyon bulmak birkaç yıl sürmüştür. Fikir tek yönlü fonksiyonları kullanmaktır. Örneğin, x değişkenini bilerek, f(x) fonksiyonunu hesaplamak kolaydır. Fakat zıt yönde, x'den f(x) hesaplanması daha zordur. Bu bağlamda, “zor” kelimesi şu şekilde yorumlanır: Bir görevi yerine getirmek için gereken süre, girdideki bit sayısıyla birlikte katlanarak büyür. 61 x 89'un hesaplanmasının 5429'un temel faktörlerini bulmaktan çok daha hızlı olduğu açıktır. Ancak, bazı ek bilgiler verilirse, örneğin, 61'in 5429'un temel faktörlerinden biri olduğunu belirtmek gibi, problem kolayca çözülebilir.Bu sistemin en büyük dezavantajı, RSA'nın güvenliğinin, kanıtlanmamış matematiksel varsayımlara, yani büyük tam sayıları çarpanlara ayırmanın zorluğuna bağlı olmasıdır. Şimdiye kadar, sayıları yeterince hızlı bir şekilde belirleyebilen bir algoritmanın mevcut olmadığını kanıtlamak mümkün olmamıştır. Böyle bir algoritmanın bulunması, tüm güvenlik sisteminin çökmesine neden olur. Örneğin, elektronik para bir gecede değersiz hale gelebilir. Nitekim, kuantum hesaplamasındaki son gelişmeler, kuantum bilgisayarlarının inşa edilmesinin sonunda mümkün olacağını göstermiştir. Prensip olarak, bu makineler klasik bilgisayarlardan çok daha hızlı üretilmektedir. Sonuç olarak, RSA sistemlerinin güvenliği, teknolojik ilerlemenin yavaşlığına bağlıdır. Gizli anahtarlı şifreleme sistemlerine dönmenin başka yolu yoktur. Yukarıda belirtildiği gibi, gizli anahtarlı şifreleme sistemlerinin büyük bir kusuru vardır: Anahtar dağılımı. Ancak, kuantum kriptografisi bu problemi çözmek için yeni bir yol getiriyor.
Kuantum Anahtar Dağılımı Kuantum fiziğindeki ilerlemeden ötürü kriptograflar, özellikle kuantum bilgisayarların gerçek olacağı zamanda, iletişimde güvenliği sağlamak için yeni yöntemler düşünmek zorundadırlar. Yeni bir şifreleme sistemine ihtiyaç duyulan teorinin, sorunun cevabı olduğu ortaya çıkmaktadır. Daha önce tartışıldığı gibi, gizli anahtarlı şifreleme sistemleri kanıtlanmış ve mutlak güvenlikli bir mesaj iletir. Tek sorun anahtarı güvenli bir şekilde dağıtmaktır. Ancak kuantum kriptografisi, tek kullanımlık şifre düzeni olan gizli anahtar şifreleme

2 dilim macar salam
3 dilim tost ekmeği
150 gram fileto tavuk göğsü
1 adet orta boy domates
2 dilim kaşar peyniri
2 dilim jambon
4 adet kıvırcık marul yaprağı

1 adet yumurta
1 tatlı kaşığı ayçiçek yağı

1 yemek kaşığı süzme yoğurt
1 tatlı kaşığı mayonez

Tost ekmeklerini ızgara izli bir tavada veya tost makinesinde iki taraflı kızartın.
Dilimlediğiniz fileto tavuk göğüslerini yağsız bir tavada arkalı önlü kızartın.
Omleti hazırlamak için yumurtayı çırpın ve az miktarda ayçiçek yağıyla ince bir omlet yapın.
Mayonez ve süzme yoğurdu karıştırarak malzemeleri bir arada tutacak ve sandviçe lezzet katacak baz karışımını hazırlayın.
Kızarmış tost ekmeğinin üzerine mayonezli karışımdan sürün, ardından marul yapraklarını yerleştirin.
İkinci katı oluşturmak için omleti, tavuk göğsü dilimleri ve kaşar peyniri dilimlerini ekleyin.
Üçüncü katı oluşturmak için salam, marul yaprakları, domates dilimleri ve jambon dilimlerini yerleştirin.
En üstteki kızarmış ekmek dilimini sandviçin üzerine kapatın ve servis edin. Afiyet olsun!

Küresel ısınma, genel olarak tüm dünyayı saran ısının artması demektir. Sıcaklıklar artınca iklimler değişmektedir. Kış yaşanılması yerde yaz yaşanılınca ekosistem bozulur ve insanlar dinç, sağlıklı olamazlar. Sıcaklığın tüm dünyada artışı 1983 yılından itibaren ölçümler yardımıyla gözükmektedir. Küresel ısınmaya en büyük sonuçları günümüz sorunlarından örneklendirebiliriz. Bunlardan en önemlisi ve bizi en çok ilgilendiren buzların erimesi. Bunlar Küresel ısınmanın inkâr edilemeyen kanıtlarıdır.

Sıcaklığın artması sebebiyle yeryüzünde bazı şekil bozuklukları, ekosistemde değişiklikler gözlenebilir. Bazı yerlerde aşırı kuraklığa kadar gidecektir. Bazı bölgelerde ise tam tersine aşırı yağış olacaktır. Seller, buzların erimesi, aşırı sıcaklık bunların sonuçlarıdır.
Kutup bölgesindeki buzlar eriyecek doğal olarak ve tüm dünya da gözle görülebilir su düzeyinin yükselişi fark edilecek.
Siklon, fırtına gibi dünya dışı rahatlatıcı ama insanlar için yıkıcı olan doğal denge ise iyice artıcak, insanlar kaçacak yer arayacaklardır.
Bunun sonucunda insanlar geçim sıkıntısı çekecektir, yiyecekler yok denecek kadar azalacak, bir ekmek için bile kavga edilir hale gelinecektir.

Kürtler Kürdistan denen bir coğrafyada yaşayan irani bir halktır ve kürtçe dilini konuşurlar bu kitapda kürt kültürünü tarihini dilini öğreneceksiniz ve kürtlerin kökenlerine dair tezleri ve araştırmaları bulacaksınız.

2500-2600 yıl öncesinde Zuhak (Bazı kaynaklara göre Dehak) adında Asurlu çok ama çok zalim bir kralın egemenliği altında yaşayan Kawa adında bir demirci vardı. Bu kral tam bir canavardı ve efsaneye göre her iki omuzunda da birer yılan bulunuyordu. Bu iki yılanı beslemek için her gün halktan iki çocuğu sarayına kurban olarak getirtip aşçılarına bu iki çocuğun beyinlerini yılanlarına yemek olarak verdiriyordu. Aynı zamanda bu canavar kral ilkbaharın gelmesini engelliyordu. En sonunda bu zulümden bıkan ve bir şeyler yapmak isteyen Armayel ve Garmayel adlı iki kişi kralın sarayına aşçı olarak girmeyi başarırlar ve Kralın yılanlarını beslemek için beyinleri alınarak öldürülen çocuklardan sadece birini öldürüp diğerinin gizlice saraydan kaçmasına yardımcı olurlar. Böylece ellerindeki bir insan beyni ile kestikleri bir koyunun beynini karıştırarak yılanlara verirler her gün bir çocuğun kurtulmasını sağlamış olurlar. İşte bu kaçan kişilerin Kürtlerin ataları olduğuna inanılır. Kaçan çocuklar Kawa adlı demirci tarafından gizlice eğitilerek bir ordu haline getirilirler. Kawa'nın liderliğindeki bu ordu bir 20 Mart günü zalim kralın sarayına yürüyüşe geçer ve Kawa, kralı çekiç darbeleri ile öldürmeyi başarır. Kawa etraftaki tüm tepelerde ateşler yakar ve yanındakilerle birlikte bu zaferi kutlarlar. Böylece Kürt halkı zalim kraldan kurtulmuş olur ve ertesi gün ilkbahar gelir.

Kürt ve bölge halkları mitolojilerinde rastlanan akıllı ve iyicil olarak tanımlanan bellerinden aşağısı yılan, üstü ise insan şeklindeki Maran adı verilen doğaüstü yaratıkların başında bulunan ve hiç yaşlanmayan, ölünce ruhunun kızına geçtiğine inanılan varlık. Binlerce yıl önce yedi katlı yeraltında yaşayan yılanlar vardı. Meran adı verilen bu yılanlar, gerçekten akıllı ve şefkatli idi. Onlar barış içinde yaşarlardı. Meranların kraliçesine Şahmeran denirdi. O genç ve güzel bir kadındı. Efsaneye göre, Şahmeran'ı gören ilk insan Cemşab oldu. O, geçimi için odun satan fakir bir ailenin oğluydu. Bir gün Cemşab ve arkadaşları bal dolu bir mağara keşfederler. Balı çıkarmak için Cemşab'ı aşağıya indiren arkadaşları, paylarına daha çok bal düşmesi için onu orada bırakıp kaçarlar. Cemşab mağarada bir delik görür ve buradan ışık sızdığını fark eder. Cebindeki bıçak ile deliği büyütünce, ömründe görmediği kadar güzel bir bahçeye girer. Bu bahçede eşi benzeri olmayan çiçekler ve bir havuz ile pek çok yılan görür. Havuzun başındaki tahtta süt beyaz vücutlu bir yılan oturmaktadır. Şahmeran'ın güvenini kazanan Cemşab uzun yıllar bu bahçede yaşar. Şahmeran ona tıp biliminin bilinmediklerini söyler. Yıllar sonra, ailesini çok özlediğini söyleyip gitmek için yalvarır. Bunun üzerine Şahmeran da kendisini salıvereceğini, ancak yerini kimseye söylemeyeceğine dair söz vermesini ister.
Şahmeran'a söz verip ailesine kavuşan Cemşab uzun yıllar verdiği sözde durarak Şahmeran'ın yerini kimseye söylememiş. Bir gün ülkenin padişahı hastalanmış. Vezir, hastalığın çaresinin Şahmeran'ın etini yemek olduğunu söylemiş ve her yere haber salınmış. Ülkenin veziri herkesi tek tek hamama sokmuş. Sıra Cemşab'a gelmiş. Cemşab soyununca vezir Cemşab'ın derisinde pullar olduğunu görünce Cemşab'ı konuşturmayı başarmış. Cemşab kuyunun yerini gösterince Şahmeran bulunup dışarı çıkarılmış. Şahmeran Cemşab'a, "Benim başımı kaynatıp padişaha içir, padişah kurtulsun, gövdemi de vezire içir, ölsün, kuyruğumu da kaynatıp sen iç, böylece Lokman Hekim ol" demiş. Böylece vezir ölmüş, padişah da iyileşip Cemşab'ı veziri yapmış. Ve rivayete göre de Cemşab böylece Lokman Hekim olmuş. Efsaneye göre Şahmeran'ın öldürüldüğünü yılanlar o günden beri bilmemektedirler. Dünyanın, Şahmeran'ın öldürüldüğünü öğrenen yılanlar tarafından bir gün istila edileceği rivayet edilir.

Bu LaTeX biçimlendirme dili için bir rehberdir. Yeni kullanıcılar için kullanışlı bir kaynak olması ve deneyimli kullanıcılara hızlı bir referans olması amaçlanmıştır.

Giriş 
Yeni Başlayanlar 
Temel Öğeler 
Belge Yapısı 
Hatalar ve Uyarılar 
Başlık Yaratımı 
Kaynakça (Bibliografya) 
Listeleme Yapıları 
Tablolar 
Biçimlendirme 
Yazıtipleri 
Sayfa Yerleşimi 
Matematik 
İleri Matematik 
Kuramlar 
Etiketleme ve Atıfta Bulunma 
Dizinleme 
Sözlükçe 
Algoritmalar 
Mektuplar 
LaTeX Öğretimi
Grafik Biçimleri 
Grafiklerin Yaratılması 
Haraketliler ve Figürler 
Sunumlar 
HiperBağlantılar 
Renkler 
Paketler 
İleri Konular 
LaTeX'i Özelleştirmek
Çoklu LaTeX Belgeleri
Ortaklaşa LaTeX Kodlaması
İpuçları ve Faydalı Bilgiler 
Genel Tavsiyeler
Diğer Metin Biçimlerine Dönüşüm
Diğer dillerde LaTeX
Özel Karakterler
Bağlantılar
Yazarlar

Kurulum
Önemli Ölçü Makroları
Önemli Büyüklük Komutları
Örnek LaTeX Belgeleri
Dizin
Komut Sözlüğü 
Ek Kaynakça

TeX

Bu kitap aynı adlı ingilizce Vikikitap'tan çevrilmektedir: en:LaTeX

Prof. Bekir Karaoğlu, İnce Bir LaTeX 2e Elkitabı
Yrd. Doç. Dr. Çağdaş ALLAHVERDİ, Örnekler ile LaTeX'e Giriş, SAGE Yayıncılık, ISBN 978-605-9932-50-9

TeX (X veya chi İskoçya dilinde loch şeklinde telaffuz edilir.) düşük seviye bir biçimlendirme ve programlama dilidir. Donald Knuth tarafından belgeleri cazip ve sürekli dizgilemek için yaratılmıştır. Adının kökeni Yunanca kelime "τεχνολογία" (technologìa) dayanır. İngilizce çevirisi "technology"dir. İlk hecesi "τεχ"dir ve Latin alfabesinde TeXe benzerdir. İsminin kökenine farklı yaklaşımlara göre kökeni Yunan kelime "τέχνη"dir (techni), İngilizce çevirisi arttır. İkinci durumda da ilk hece "τεχ"dir.
Knuth TeX dizgileme motorunu yazmaya 1977'de başladı. O dönemde yayıncılık endüstrisine sızmaya başlayan sayısal/dijital baskı ekipmanlarını gözlemlemeye de başladı, özellikle kendi kitap ve makalelerinin etkilenmesini görünce, yazım kalitesi bozulma akımını tersine çevirme umuduyla çalışmalarına başladı. 
Tex bir programlama dilidir, if-else yapısını destekler. Bununla birlikte hesaplamalar yapabilirsin (belge derleme yapıldığı sırada o da yapılır) fakat başka herhangi bir şey yapmayı onunla çok zor bulurdum. İyi kontrol TeX onu çok güçlü yapar, fakat birfe zor ve kullanımı zaman alandır. TeX bir sürü farklı makine çalışmasına son derece kararlı olduğu için ve neredeyse hatasız olduğu için ünlüdür,
Günümüzde TeX dilinde belge hazırlarken kimse pratikte düz/yalın TeX kullanmaz. Bunun yerine farklı TeX dağıtımları mesela LaTeX zaman kazanmak için kullanılır, belirli görevleri otomatikleştirmek ve kullanıcı odaklı hataları düşürür.

LaTeX (telafuzu hem "Lah-tech" hem de "Lay-tech" şeklindedir) TeX'e dayalı bir makro paketidir. Leslie Lamport tarafından oluşturulmuştur. Amaçları TeX dizgilemesini basitleştirmek, özellikle matematiksel formüller içeren belgeler için.
Çok daha sonraları yazarlar LaTeX'e packages veya styles olarak adlandırılan uzantılar katkısında bulundu. Bunların bazıları çoğu TeX/LaTeX yazılım dağıtımları ile birlikte dağıtılmaktadır; daha fazlası Comprehensive TeX Archive Network (CTAN) içinde bulunabilir.
LaTex'in bir grup TeX komutu kapsamasından beri, LaTeX belge işleme aslında programlamadır. Bir LaTeX biçimlendirme türünde text dosyası oluşturursun. LaTeX makro bunu okur ve nihai belgeyi üretir.
Bu yaklaşım bir WYSIWYG (What You See Is What You Get/Ne Görürsen Onu Alırsın) programı(Openoffice.org Writer or Microsoft Word) ile karşılaştırıldığında bazı dezavantajları vardır
LaTeX'de:

Genellikle belgeyi düzenlerken nihai sürümünü göremeyiz.
Genelde LaTeX biçimlendirme için gerekli komutları bilmen gereklidir.
Bazen belge için kesin bir görünüm elde etmek zor olabilir.
Öte yandan, LaTeX yaklaşımının bazı kesin avantajları vardır:

Belge kaynakları WYSIWYG ile kullanılan karmaşık ikilik ve XML formatları aksine herhangi bir metin editörü ile okunabilir.
Sen belgenin yüzeysel düzen sorunlarına kapılmadan, belgenin yapısı ve içeriğine tamamen konsantre olabilirsiniz.
Elle yazı tiplerini, metin boyutlarını, satır yüksekliklerini ne de metin akışını ayarlamak gerekmez, LaTeX otomatik olarak bunlarla ilgilenir.
LaTeX belge yapısı kullanıcıya görünür ve kolayca başka bir belgeye kopyalanabilir. WYSIWYG uygulamaları genelde kesin biçimlendirme nasıl üretileceğinde açık değildir ve başka bir belgeye doğrudan kopyalamak imkansız olabilir.
Düzen, yazı tipleri, tablo ve benzeri belge boyunca tutarlıdır.
Matematiksel formüller kolayca dizgilenebilir.
Dizinler, dipnotlar, alıntılar ve kaynaklar kolaylıkla üretilir.
LaTeX seni zorlar ki belgelerini düzgün bir biçimde yapılandırasın.
LaTeX-benzeri yaklaşıma WYSIWYM(What You See Is What You Mean/Ne Görürsen Onu Kastedersin) denebilir: Nihai sürümü yazarken göremezsin. Belgenin mantıksal yapısını görmek yerine, LaTeX sizin için biçimlendirme ile ilgilenir.
LaTeX belgesi bir belgenin içeriğini içeren ek biçimlendirmeli düz metin dosyasıdır. Makro paketi tarafından kaynak dosya işlenirken, bir kaç belgeyi farklı biçimlerde üretebilir. LaTeX doğal olarak PDF ve DVI destekler, fakat diğer yazılımları kullanarak kolayca PostScript, PNG, JPG, vb.

LaTeX hakkında araştırma yaparken  XeTeX, ConTeXt, LuaTeX veya diğer -TeX son ekli isimlere rastlayabilirsin. Bazıları TeX dağıtımları, diğerleri TeX motorlarıdır. Onlar birçok yönden LaTeX'den farklıdır, mesela XeTeX bir TeX motorudur. XeTeX Unicode kullanır ve çok popüler olan .ttf ve .otf yazı tiplerini destekler. ConTeXt pdfTeX için destek içeren ve basit sözdizimine sahip, çok tutarlı bir TeX dağıtımıdır. XeTeX ve LuaTeX motorlardır. İnternet üzerinde bulunan, kod parçacıkları ve paketlerini kullanılmadan önce, LaTeX ile yazıldığını kontrol etmelisin.

En azından, iyi bir metin editörü ve bir DVI ya da PDF görüntüleyici içeren bir TeX dağıtımına ihtiyacımız olacaktır. Ama, eğer ilk defa LaTeX dışında çalışıyorsanız, başka herhangi bir şey yapmamız gerekmez. Sadece ScribTeX.com'de kullanıcı hesabı oluşturun. Sonraki bölümde bu ders devam ediyor. ScribTeX internet tabanlı LaTeX belgeleri için çevrimiçi bir editördür. ScribTeX, işbirliği yeteneklerine sahip olan ve bir dağıtım ve bir editör kurup ayarlamaya gerek kalmadan sana LaTeX sözdizimleri denemeler yapmanı sağlar. Daha sonra bağımsız bir LaTeX kurulumunun faydalı olacağını düşünürseniz. Bu bölüme dönüp aşağıdaki yönergeleri takip edebilirsiniz.

Eğer bilgisayarınızda yerel olarak LaTeX kullanmak istiyorsanız, genellikle TeX dağıtım yükleminiz gerekir. TeX dağıtımları paketlenmiş paket koleksiyonlarıdır ve elle dosyaları almak ve ayarlamaya gerek kalmaksızın size dizgilemeyi sağlayacak programlardır. Her bir büyük işletim sistemleri için önerilen dağıtımlar:
Eğer bilgisayarınızda yerel LaTeX kullanmak istiyorsanız, genellikle bir TeX dağıtım yüklemeniz gerekir. TeX dağılımları elle dosyaları almak için, bazı şeyleri biçimlendirip kalmadan paketleri ve typeset sağlayacak programların koleksiyonları paketlenmiştir. büyük işletim sistemlerinin her biri için önerilen dağıtımları:

TeX Live Unix/Linux, Mac OS ve Windows için büyük bir TeX dağıtımıdır.
MiKTeX Windows'a özgü bir dağıtımdır.
MacTeX Mac OS'a özgü bir dağıtımdır.

TeX live ve MikTeX ortam ayarlamaları ile ilgilenecek ve paketleri indirecek basit yükleyicilere sahiptir.

TeX Live bu adresten indirebilir.
MiKTeX  bu adresten indirilebilir

Ubuntu depolarında TeX Live'in 2009 sürümüne sahip, bu bağlamda sudo apt-get install texlive kullanılabilir.Bu betikle ubuntuda otomatik olarak TeX Live 2010 Ubuntu üzerine kurulabilir.
Fedora depolarında sadece 2007 sürümüne sahip, fakat şanslısın ki iyi bir depo sayesinde son sürümü doğrudan kurabilirsin: yum install texlive (plus yum install texlive-latex ve herhangi texlive-scheme- paketini).
Eğer dağıtımınız TeX Live paketlerine sahip değilse, hata takip sistemlerine bir istekte bulunun. En kötü durumda ele buradan kendiniz indirip ve kurulumunu yapmanız gerekebilir. Bu zor olmasa da, konsol bilgisi ve kurulum sırasında nasıl çoklu seçim yapmayı bilmeyi gerektirir.

MacTeX sayfasından MacTeX.mpkg.zip dosyasını indir, sıkıştırılmış dosyaları aç ve talimatları takip et.

LaTeX kodu yazmak için bir de metin düzenleyicisine ihtiyacınız var. Kelime işlemci (Word, Openoffice) değil de, bir metin düzenleyicisi kullanmalısınız. Özel LaTeX düzenleyicilerini kullanmak, basit bir düz metin düzenleyicilerini kullanmaktan daha kullanışlıdır, çünkü onlar genellikle otomatik komutları tanımlamaya, imlâ denetimine ve hata kontrolüne ve yararlı makrolara sahiptir

TeXworks MiKTeX and TeX Live içine dahil özel bir TeX düzenleyicisidir. Karmaşık bir arayüz yerine basit bir arayüzün daha iyi olacağı fikri ile geliştirilmiştir, ve böylece başlarda insanlara yapmak istediklerini kolayca yapmalarını sağlayacak. TeXworks aslen bu amaçla ortaya çıktı. Çünkü bir matematik profesörü LaTeX ile öğrencilerinin daha iyi bir ilk deneyim sahibi olmaları istedi.
TeXworks'ı kendi Linux dağıtımınızın paket yöneticisini kullanarak ya da Windows ve Mac yükleyicisinde kurulum seçeneğini seçerek kurulum yapabilirsiniz.

LyX Windows, Linux ve Mac OS için popüler bir LaTeX düzenleyicisidir. Formülleri ve tablo düzenleyicileri içerir ve nihai belgenin görsel ipuçlarını gösterir. Kullanıcılara ekranda gerçek sözdizimini önemsemeksizin LaTeX belgeleri yazmayı sağlar.

Kile KDE için bir LaTeX editörüdür. (Platform Bağımsız) Çoklu belgeleri düzenlemeyi ve birbirinden farklı TeX derleyicisi ile derlemeyi sağlayan elişmiş bir kullanıcı arayüzü sağlar. Kile, Kate editor tabanlıdır, semboller için hızlı erişim araç çubuğu, belge yapısını gösterici, bir konsol ve kişiselleştirilebilir inşa seçeneklerine sahiptir. Kile KDE çalıştırabilen her işletim sisteminde çalıştırılabilir.

TeXmaker platformlar-arası bir düzenleyicidir, Kile'e özellikler ve kullanıcı arayüzü olarak çok benzer. Ayrıca kendi PDF görüntüleyicisi vardır.

TeXnicCenter Windows için özgür ve açık kaynak popüler bir düzenleyicidir. TeXmaker ve Kile'le çok benzeyen nir kullanıcı arayüzü vardır.

BaKoMa TeX WYSIWYG benzeri özellikleri olan Windows için bir düzenleyicidir. LaTeX kaynağının derlenmesi ile ilgilenir ve onu güncelleyerek, devamlı değişikliklerin görünmesini neredeyse gerçek zamanlı yapar.

TeXShop Mac OS için TeXworks benzeri bir düzenleyicidir 

gedit-latex-plugin ile birlikte gedit kullanmak, gnome kullanıcıları için denemeye değer. Windows, Mac ve Linux için platform bağımsız bir uygulamadır.

Gummi Linux için bir LaTex düzenleyicidir. Gerçek zamanlı olarak derler ve pdflatex çıktısını ekranın sağ tarafının yarısında görüntüler.

Emacs genel amaçlı metin işleme sistemidir. Auctex ve Reftex (Emacs uygulamasına kurulabilen eklentilerdir) birlikte kullanıldığında, Emacs tam bir LaTeX düzenleme ortamına dönüşür. İçeriğin tablosu, belge önizleme ve daha bir çok özellikler içerir. Emacs eşsiz klavye kısa yolları olan, olgun bir düzenleme sistemidir.

LaTeXila Linux için başka bir metin düzenleyicidir (Gnome).

Son olarak, LaTeX çıktı dosyaları için görüntüleyiciye ihtiyacın olacak. Genelde LaTeX son belgeyi .dvi(Cihazdan bağımsız dosya formatı) olarak kaydeder, fakat nadiren bunu isteyeceksindir. DVI dosyaları dahili yazı tiplerini içermez ve çoğu bel

Bu LaTeX komutlarının bir listesidir—LaTeX komutlarının alfabetik bir şekilde etkileriyle gösterildiği bir liste. (Ayraçlar opsiyonel argümanlardır "[]" ve askılar gerekli argümanlardır "{}".)

/
see slash marks
\@
following period ends sentence
\\[*][extra-space]
new line
\,
thin space, math and text mode
\;
thick space, math mode
\:
medium space, math mode
\!
negative thin space, math mode
\-
hyphenation; tabbing
\=
set tab, see tabbing
\>
tab, see tabbing
\<
back tab, see tabbing
\+
see tabbing
\'
accent or tabbing
\`
accent or tabbing
\|
double vertical lines, math mode
\(
start math environment
\)
end math environment
\[
begin displaymath environment
\]
end displaymath environment

\addcontentsline{file}{sec_unit}{entry}
adds an entry to the specified list or table
\addtocontents{file}{text}
adds text (or formatting commands) directly to the file that generates the specified list or table
\addtocounter{counter}{value}
increments the counter
\address{Return address}
\addtolength{len-cmd}{len}
increments a length command, see Length
\addvspace
adds a vertical space of a specified height
\alph
causes the current value of a specified counter to be printed in alphabetic characters
\appendix
changes the way sectional units are numbered so that information after the command is considered part of the appendix
\arabic
causes the current value of a specified counter to be printed in Arabic numbers
\author
declares the author(s). See Document Structure

\backslash
prints a backslash
\baselineskip
a length command (see Lengths), which specifies the minimum space between the bottom of two successive lines in a paragraph
\baselinestretch
scales the value of \baselineskip
\bfseries
Boldface typeface
\bibitem
generates a labeled entry for the bibliography
\bigskipamount
\bigskip
equivalent to \vspace{\bigskipamount}
\boldmath
bold font in math mode
\boldsymbol
bold font for symbols

\cal
Calligraphic style in math mode
\caption
generate caption for figures and tables
\cdots
Centered dots
\centering
Used to center align LaTeX environments
\chapter
Starts a new chapter. See Document Structure.
\circle
\cite
Used to make citations from the provided bibliography
\cleardoublepage
\clearpage
Ends the current page and causes any floats to be printed. See Page Layout.
\cline
Adds horizontal line in a table that spans only to a range of cells. See \hline and Tables chapter.
\closing
Inserts a closing phrase (e.g. \closing{yours sincerely}), leaves space for a  handwritten signature and inserts a signature specified by \signature{}.  Used in the Letter class.
\color
Specifies color of the text. LaTeX/Colors
\copyright
makes © sign. See Formatting.

\dashbox
\date
\ddots
Inserts a diagonal ellipsis (3 diagonal dots) in math mode
\documentclass[options]{style}
Used to begin a latex document
\dotfill
\dfrac

\em
Toggles italics on/off for the text inside curly braces with the command. Such as {\em This is in italics \em but this isn't \em and this is again}. This command allows nesting.
\emph
Toggles italics on/off for the text in curly braces following the command e.g. \emph{This is in italics \emph{but this isn't} and this is again}.
\ensuremath (LaTeX2e)
Treats everything inside the curly braces as if it were in a math environment. Useful when creating commands in the preamble as they will work inside or out of math environments.
\epigraph
Adds an epigraph. Requires epigraph package.
\euro
Prints euro € symbol. Requires eurosym package.

\fbox
\flushbottom
\fnsymbol
\footnote
Creates a footnote.
\footnotemark
\footnotesize
Sets font size. See Text Formatting.
\footnotetext
\frac
inserts a fraction in mathematics mode. The usage is \frac{numerator}{denominator}.
\frame
\framebox
Like \makebox but creates a frame around the box. See Boxes.
\frenchspacing
Instructs LaTex to abstain from inserting more space after a period (´.´) than is the case for an ordinary character. In order to untoggle this functionality resort to the command \nonfrenchspacing.

\hfill
Abbreviation for \hspace{\fill}.
\hline
adds a horizontal line in a tabular environment. See also \cline, Tables chapter.
\href
Add a link, or an anchor. See Hyperlinks
\hrulefill
\hspace
Produces horizontal space.
\huge
Sets font size. See Text Formatting.
\Huge
Sets font size. See Text Formatting.
\hyphenation{word list}
Overrides default hyphenation algorithm for specified words.  See Hyphenation

\include
This command is different from \input in that it's the output that is added instead of the commands from the other files. For more see LaTex/Basics
\includegraphics
Inserts an image. Requires graphicx package.
\includeonly
\indent
\input
Used to read in LaTex files. For more see LaTex/Basics.
\itshape
Italicizes the text which is inside curly braces with the command. Such as {\itshape This is in italics}. \em is generally preferred since it allows nesting.
\item
Creates an item in a list. Used in list structures.

\kill
Prevent a line in the tabbing environment from being printed.

\label
Used to create label which can be later referenced with \ref. See Labels and Cross-referencing.
\large
Sets font size. See Text Formatting.
\Large
Sets font size. See Text Formatting.
\LARGE
Sets font size. See Text Formatting.
\LaTeX
Prints LaTeX logo. See Formatting.
\LaTeXe
Prints current LaTeX version logo. See Formatting.
\ldots
Prints sequence of three dots. See Formatting.
\left
\lefteqn
\line
\linebreak
Suggests LaTeX to break line in this place. See Page Layout.
\linethickness
\linewidth
\listoffigures
Inserts a list of the figures in the document.  Similar to TOC
\listoftables
Inserts a list of the tables in the document.  Similar to TOC
\location

\makebox
Defines a box that has a specified width, independent from its content. See Boxes.
\maketitle
Causes the title page to be typeset, using information provided by commands such as \title{} and \author{}.
\markboth \markright
\mathcal
\mathop
\mbox
Write a text in roman font inside a math part
\medskip
\multicolumn
\multiput

\newcommand
Defines a new command. See New Commands.
\newcolumntype
Defines a new type of column to be used with tables. See Tables.
\newcounter
\newenvironment
Defines a new environment. See New Environments.
\newfont
\newlength
\newline
Ends current line and starts a new one. See Page Layout.
\newpage
Ends current page and starts a new one. See Page Layout.
\newsavebox
\newtheorem
\nocite
Adds a reference to the bibliography without an inline citation.  \nocite{*} causes all entries in a bibtex database to be added to the bibliography.
\noindent
\nolinebreak
\nonfrenchspacing
Setting the command untoggles the command \frenchspacing and activates LaTeX standards to insert more space after a period (´.´) than after an ordinary character.
\normalsize
Sets default font size. See Text Formatting.
\nopagebreak
Suggests LaTeX not to break page in this place. See Page Layout.
\not

\onecolumn
\opening
Inserts an opening phrase when using the letter class, for example \opening{Dear Sir}
\oval
\overbrace
Draws a brace over the argument. Can be used in displaystyle with superscript to label formulae. See Advanced Mathematics.
\overline
Draws a line over the argument.

\pagebreak
Suggests LaTeX breaking page in this place. See Page Layout.
\pagenumbering
Defines the type of characters used for the page numbers. Options : arabic, roman, Roman, alph, Alph, gobble (invisible).
\pageref
Used to reference to number of page where a previously declared \label is located.  See Floats, Figures and Captions.
\pagestyle
See Page Layout.
\par
Starts a new paragraph
\paragraph
Starts a new paragraph. See Document Structure.
\parbox
Defines a box whose contents are created in paragraph mode. See Boxes.
\parindent
Normal paragraph indentation. See Lengths.
\parskip
\part
Starts a new part of a book. See Document Structure.
\protect
\providecommand (LaTeX2e)
See Macros.
\put

\quad
Similar to space, but with the size of a capital M
\qquad
double \quad

\raggedbottom
Command used for top justified within other environments.
\raggedleft
Command used for right justified within other environments.
\raggedright
Command used for left justified within other environments.
\raisebox
Creates a box and raises its content. See LaTeX/Boxes.
\ref
Used to reference to number of previously declared \label. See Labels and Cross-referencing.
\renewcommand
\right
\rmfamily
Roman typeface.
\roman
Causes a counter to be printed in roman numerals.
\rule
Creates a line of specified width and height. See LaTeX/Rules and Struts.

\savebox
Makes a box and saves it in a named storage bin.
\sbox
The short form of \savebox with no optional arguments.
\scshape
Small caps.
\scriptsize
Sets font size. See Text Formatting.
\section
Starts a new section. See Document Structure.
\setcounter
\setlength
\settowidth
\sffamily
Sans serif.
\shortstack
\signature
In the Letter class, specifies a signature for later insertion by \closing.
\slshape
Slanted.
\slash
See slash marks
\small
Sets font size. See Text Formatting.
\smallskip
\sout
Strikes out text.  Requires ulem package. See Text Formatting.
\space
force ordinary space
\sqrt
Creates a root (default square, but magnitude can be given as an optional parameter).
\stackrel
Takes two arguments and stacks the first on top of the second.
\stepcounter
Increase the counter.
\subparagraph
Starts a new subparagraph. See Document Structure.
\subsection
Starts a new subsection. See Document Structure.
\subsubsection
Starts a new sub-subsection. See Document Structure.

\tableofcontents
Inserts a table of contents (based on section headings) at the point where the command appears.
\telephone
In the letter class, specifies the sender's telephone number.
\TeX
Prints TeX logo. See Text Formatting.
\textbf{}
Sets bold font style. See Text Formatting.
\textcolor{}{}
Creates colored text. See Entering colored text.
\textit{}
Sets italic font style. See Text Formatting.
\textmd{}
Sets medium weight of a font. See Text Formatting.
\textn

Installing "LaTeX" is not a simple one-click download and install. Multiple programs often need to be downloaded and installed in order to have a suitable computer system that can be used to create publishable output, such as PDFs. The basic requirement is to have TeX and LaTeX. Optional, and recommended installations include an attractive editor to write LaTeX source documents (this is probably where you will spend most of your time), and a bibliographic management program to manage references.

TeX and LaTeX are available for most computer platforms, since they were programed to be very portable. They are most commonly installed using a distribution, such as teTeX, MiKTeX, or MacTeX. This, however, does not include any editor or advanced graphical user interface. Other programs, that are not part of the distribution, are used to write and prepare TeX and LaTeX files.

UNIX and Linux users have a wide choice of distributions; the most common are teTeX and TeX Live. As of May 2006 teTeX is no longer actively maintained and its former maintainer Thomas Esser recommended TeX Live as the replacement. Ubuntu and Debian users can install one (not both!) of these systems using the system's apt package manager.

Mac OS X users may use MacTeX, supporting TeX, LaTeX, AMSTeX, ConTeXt, XeTeX and many other core packages.
TeX Live is also available through MacPorts and Fink.

Microsoft Windows users can install MiKTeX onto their computer. This distribution has advanced features, such as automatic installation of packages, and simple interfaces to modify settings, such as default paper sizes.

To get started without needing to install anything, users can use ScribTeX which is a completely online LaTeX compiler, based on the TeX Live distribution.

TeX and LaTeX source documents (as well as related files) are all text files, and can be opened and modified in almost any text editor. A few recommended editors include:

Cross-platform

Texmaker
Vim with Vim-LaTeX Vimscript plugin
Emacs with AUCTeX
ScribTeX (browser based)
Verbosus (browser based)
Linux-only

Kile
Mac OS X-only

TeXShop
Windows-only

LEd
TeXnicCenter
WinEdt
WinShell

Bibliography files (*.bib) are most easily edited and modified using a management system. These graphical user interfaces all feature a database form, where information is entered for each reference item, and the resulting text file can be used directly by BibTeX.

Cross-platform

JabRef
Mendeley
Mac OS X-only

BibDesk

Xfig is a basic program that can produce vector graphics, which can be exported to PSTEX. It can be installed on UNIX/Linux platforms. With Ubuntu or Debian distributions, it can be easily installed using apt.
On Microsoft Windows systems, Xfig can only be installed using Cygwin-X; however, this will require a fast internet connection and about 2 gigabytes of space on you computer. With Cygwin, to run Xfig, you need to first start the "Start X - Server", then launch "xterm" to bring up a terminal. In this terminal type "xfig" (without the double quotes of course) and press return.

Inkscape is an open source vector graphics editor, which can export images to EPS or PDF files, which may then be imported into LaTeX (see LaTeX/Importing Graphics). It can run natively under Windows, Linux or Mac OS.
An extremely useful plug-in is textext, which can import LaTeX objects. This can be used for inserting mathematical notation or LaTeX fonts into graphics (which may then be imported into LaTeX documents).

It is also possible to export vector graphics to EPS format using OpenOffice.org Draw, which is an open source office suite available for Windows, Linux and Mac.

Installing Extra Packages

Donald Knuth'u TeX sistemini geliştirmeye yönlendiren en önemli sebeplerden birisi, matematiksel denklemlerin basitçe yaratılabildığı ve aynı zamanda matbaadan çıkmış gibi gözüken belgelerin yaratılmasına imkan veren bir yazılım tasarlamaktı. Nitekim, TeX'in ( ve sonrasında LaTeX'in) bilim çevrelerinde çok yaygın olarak kulanılıyor olması Knuth'un bu çabasında başarılı olduğunu göstermektedir. Matematiksel ifadelerin kolay ve şık olarak yazılabilmesi, LaTeX'in en önemli özelliklerinden biridir. Bundan dolayı ve engin sayıdaki matematiksel yazım biçimleri yüzünden, LaTeX'de matematik konusu büyük bir konudur.

Eğer yaratmak istediğiniz belge sadece birkaç matemik denklemi içeriyorsa, sıradan bir LaTeX sürümü işinizi görecektir. Ancak, birçok değişik türde ve karmaşık denklemler içeren bilimsel bir yazı yazıyorsanız, amsmath paketine bakmanızda yarar var. Bu paket, sıradan LaTeX komutlarından daha esnek ve güçlü komutlar içerir. Diğer bir paket, mathtools, amasmath'a bir takım kullanışlı ayarlamalar, ortamlar, ve işaretler ekler. Bu paketleri kullanmak için, komutundan önce şunları ekleyin:

ya da

.

LaTeX'in metnin matematiksel ifade olup olmadığını bilmesi gerekir. Çünkü LaTeX, matematiksel gösterimleri normal metinden farklı şekilde işler. Bu nedenle, bu amaç için özel ortamlar tanımlanmıştır. Bunlar, gösterilme biçimlerine bağlı olarak iki kategoriye ayrılabilir:

text — metin formülleri, tanımlandıkları metnin içinde, yani satır içi olarak görüntülenir; örneğin, bir cümle içinde 
  
    
      
        a
        +
        a
        =
        2
        a
      
    
    {\displaystyle a+a=2a}
  
 diyebiliriz.
displayed — görüntülenen formüller ayrı bir satırda yer alır.
Matematik özel ortamlar gerektirdiğinden, standart şekilde kullanabileceğiniz uygun ortam adları vardır. Ancak diğer birçok ortamdan farklı olarak, formüllerinizi belirtmek için bazı kullanışlı kısaltmalar vardır. Aşağıdaki tablo bunları özetlemektedir:

Matematik birçok işarete sahiptir! Aşağıda gördükleriniz klavyeden ulaşılabilecek sembollerdir:

+ - = ! / ( ) [ ] < > | ' : *

Bu listenin dışında, belirgin komutlar arzu edilen semboller için kullanılmalıdır. Buna Yunanca harfler, ilişik semboller, oklar, ikili operatörler ve daha fazlası söylenebilir.

Bir örnek:

Neyse ki, özel semboller için arama yapabilen bir araç var. "Detexify" için dış bağlantılar bölümüne bakabilirsiniz. Başka bir seçenek de dış bağlantılar bölümünde bulabileceğiniz "The Comprehensive LaTeX Symbol List".

∈

boş küme

k=netdata/toplam zaman

)

%

Olağan bir LaTeX kurulumu ile gelen tüm işaretler aşağıda listelenmiştir. Bunların dışındaki işaretler paketler ile elde edilebilir.

Yazılara renk ekleme xcolor paketi tarafından desteklenmektedir (color paketi ile değiştirir). Bu paketi kullanarak, yazıtipi rengini, yazı arkaplanı rengini, ya da sayfa arkaplanı rengini ayarlayabilirsiniz. Öntanımlı renklerden seçmek ya da kendi renklerini RGB, Hex, ya da CMYK ile tanımlamak da ayrıca mümkün. Matematiksel formüller ayrıca renklendirilebilir.

To make use of these features, the Şablon:LaTeX/Package package must be imported. Şablon:LaTeX/Package starts from the basic facilities of the Şablon:LaTeX/Package package and extends it.
Şablon:LaTeX/Usage
The package allows you to use the names of 19 base colors (black, white, blue, green, yellow, red etc.); these names are always available. Besides, the package has some options to get more predefined colors, which should be added globally. Şablon:LaTeX/Parameter allows you to access more than 60 colors, and Şablon:LaTeX/Parameter allows access to about 150 colors. If you need more color names, then you may also want to look at the Şablon:LaTeX/Parameter option that offers more than 300 colors.
The Şablon:LaTeX/Parameter option allows colors to be added to tables.

The simplest way to type colored text is by:
Şablon:LaTeX/Usage
where Şablon:LaTeX/Parameter is a color that was defined before by \definecolor.
Another possible way by
Şablon:LaTeX/Usage
that will switch the standard text color to the color you want. It will work until the end of the current TeX group. For example:
Şablon:LaTeX/Example
The difference between
\textcolor
and
\color
is the same as that between
\texttt
and
\ttfamily,
you can use the one you prefer. The \color environment allows the text to run over multiple lines and other text environments whereas the text in \textcolor must all be one paragraph and not contain other environments.
You can change the background color of the whole page by:
Şablon:LaTeX/Usage

\colorbox{declared-color}{text}
Eğer arkaplan rengi ve yazı rengi değiştiyse:
\colorbox{declared-color1}{\color{declared-color2}text}
Ayrıca \fcolorbox adındaki komut da çerçeveli arkaplan renkleri yapabilir:
\fcolorbox{declared-color-frame}{declared-color-background}{text}

The predefined color names are

black, blue, brown, cyan, darkgray, gray, green, lightgray, lime, magenta, olive, orange, pink, purple, red, teal, violet, white, yellow.

There may be other pre-defined colors on your system, but these should be available on all systems.
If you would like a color not pre-defined, you can use one of the 68 dvips colors, or define your own. These options are discussed in the following sections

Invoke the package with the usenames and dvipsnames option. If you are using Şablon:LaTeX/Package or Şablon:LaTeX/Package package you must declare the xcolor package before that, otherwise it will not work. 
Şablon:LaTeX/Usage
This above syntax may result in an error if you are using beamer with Şablon:LaTeX/Package. To go around it, include usenames and dvipsnames options when defining the document class. 
Şablon:LaTeX/Usage
Be wary that the below color names are case-sensitive. For example, \color{olivegreen} raises an "undefined color" error, but \color{OliveGreen} works fine.  Table can be sorted by color name, by hue, by saturation, or by lightness.

If the predefined colors are not adequate, you may wish to define your own.

Define the colors in the preamble of your document. (Reason: do so in the preamble, so that you can already refer to them in the preamble, which is useful, for instance, in an argument of another package that supports colors as arguments, such as the listings package.)

You need to include the Şablon:LaTeX/Package package in your preamble to define new colors. In the abstract, the colors are defined following this scheme:
Şablon:LaTeX/Usage
where:

name is the name of the color; you can call it as you like
model is the way you describe the color, and is one of gray, rgb, RGB, HTML, and cmyk.
color-spec is the description of the color

Among the models you can use to describe the color are the following (several more are described in the xcolor manual):

To define a new color, follow the following example, which defines orange for you, by setting the red to the maximum, the green to one half (0.5), and the blue to the minimum:
Şablon:LaTeX/Usage
The following code should give a similar results to the last code chunk.
Şablon:LaTeX/Usage
If you loaded the Şablon:LaTeX/Package package, you can define colors upon previously defined ones.
The first specifies 20 percent blue and 80 percent white; the second is a mixture of 20 percent blue and 80 percent black; and the last one is a mixture of (20*0.3) percent blue, ((100-20)*0.3) percent black and (100-30) percent green.
Şablon:LaTeX/Usage
Şablon:LaTeX/Package also features a handy command to define colors from color mixes:
Şablon:LaTeX/Usage

Normally one would predeclare all the colors as above, but sometimes it is convenient to directly use a color without naming it first. To achieve this, 
\color 
and 
\textcolor 
have an alternative syntax specifying the model in square brackets, and the color specification in curly braces. For example:
Şablon:LaTeX/Usage

You may want to use colors that appear on another document, web pages, pictures, etc.
Alternatively, you may want to play around with rgb values to create your own custom colors.
Image processing suites like the free GIMP suite for Linux/Windows/Mac offer color picker facilities to capture any color on your screen or synthesize colors directly from their respective rgb / hsv / hexadecimal values. 
Smaller, free utilities also exist:

Linux/BSD: The gcolor2 tool (usually also available in repositories)
Linux/BSD: in newer systems you may want to use gcolor3 tool (usually also available in repositories)
Microsoft Windows: The open-source Color Selector tool.
Apple Macs: Hex Color Picker for creating custom colors and the built-in DigitalColor Meter for capturing colors on screen.
Online utilities: See here for a Wikipedia article with several external links

Spot colors are customary in printing. They usually refer to pre-mixed inks based on a swatchbook (like Pantone, TruMatch or Toyo). The package Şablon:LaTeX/Package extends xcolor to provide real spot colors (CMYK and CIELAB). They are defined with, say:
Şablon:LaTeX/Usage

The xcolor manual
The color package documentation

tabular ortamı (ing. environment), yatay ve dikey çizgi seçeneği ile, tablo yaratılmasında kullanılır. LaTeX kolon genişliklerini kendiliğinden ayarlar.
Bu ortamın ilk satırı şu biçimdedir:
\begin{tabular}[konum]{''tabloBelirt''}
Burada, tabloBelirt değiştirgeni (argümanı) LaTeX'e her kolonun nasıl hizalanacağını söyler, ve ayrıca tabloyo dikey çizgi koyulması bilgisini verir.
Kolon sayısı bilgisi, tabloBelirt değiştirtgeninde yer aldığı için, bu sayının ayrıca belirtilmesine gerek yoktur. Aşağıda kolon hizalaması ve dikey çizgiden sorumlu işaretleri görmekteyiz:

Bir kolondaki yazı aşırı geniş ise, LaTex kendiliğinden kolon genişliğini buna göre ayarlamaz. Bu durumda, p{genişlik} yaparak, yazıyı içine alacak özel bir kolon tipi tanımlayabilirsiniz. Burada genişlik herhangi bir pt, cm gibi geçerli uzunluk birimi cinsinden olabilir: örneğin p{5cm}. Ya da bunun yerine  \textwidth gibi bir uzunluk komutu kullanılabilir (bakınız LaTeX/Önemli Ölçü Makroları).
İsteğe bağlı değişken konum, etraftadaki yazıya göre tablonun nasıl konumlanması gerektiğini belirtir. Bir çok durumda bu seçeneği kullanmanıza gerek yoktur. Bunun için şu anahtar harfleri kullanabilirsiniz:

İlk satırda, kaç tane kolon kullanacağımız, bunların hizalanmasını ve dikey çizgi ile ayrılıp ayrılmayacaklarını belirttik. Bu tanımlalardan sonra, ortam içinde tablo hücrelerini belirtmemiz ve yeni satırlar girmemiz gerekmektedir. Bunun için şunları kullanırız:

tabular ortamında fazladan boşlukların herhangi bir etkisi yoktur. Boşluk karakterini istediğiniz gibi, LaTeX kodunu okunabilir hale getirmek için kullanın.

LaTex, ilk olarak, yazarın nasıl bir belge yaratmak istediği bilgisine ihtiyaç duyar. Bu bilgi \documentclass komutu ile belirtilir.
\documentclass[seçenekler]{sınıf}
Burada sınıf (Ingilizce: class) yaratılmak istenen belge biçimini belirtir. Seçenekler (ing. options) değişkeni belge sınıfının davranışını özelleştirir. Seçenekler, virgül ile birbirlerinden ayrılırlar.
Örnek: bir LaTeX belgesi 
\documentclass[11pt,twoside,a4paper]{article}
satırı ile başlayabilir. Bu satır LaTeX'e, yaratılmak istenen belgeyi makale (article) olarak, 11 numara yazı (11pt) büyüklüğü, ve A4 kağıda (A4paper) iki-taraflı (twoside) olacak şekilde derlemesini belirtir.
LaTex'te kullanılan sınıflar şu şekildedir:

Bu sınıflar ile birlikte sıklıkla kullanılan seçenekleri aşağıdaki tabloda belirtelim:

Örneğin, 12pt yazıtipi büyüklüğünde, tek taraflı, A4 sayfa, draft modunda bir LaTeX belgesi şu satır ile başlamalıdır:
\documentclass[12pt,a4paper,oneside,draft]{report}

\documentclass[11pt,a3paper]{article}
\begin{document}
selaam
\end{document}
\begin{enumerate}
\item \textbf{Introduction}
\end{enumerate}

Yüzlerce - binlerce değilse - harf tipi, ya da yazıtipi aileleri bulunmaktadır. Yaygın örnekleri Times, Courier ve Helvetica olarak söyleyebiliriz. Bu aileler genelde üç ana kategoriye ayrılırlar: serif, sans serif, ve monospaced.
LaTeX komutları genellikle bunları stenografik olarak rm, sf, ve tt diye ima eder.
Normalde, LaTeX Donald Knuth tarafından TeX içinde kullanmak için yazılan harf tipleri ailesi Computer Modern'i kullanır.
Kendisi birçok güçlükte ve optikal büyüklükte serif, sans serif, ve monospaced yazıtipleri içerir.
LaTeX dökümanlarının gövdeleri normalde Roman (serif) tipinde olur, ancak bu ayarlardan değiştirilebilir:
\\renewcommand{\familydefault}{<family>
<family> yerini şunlar takip eder:

\rmdefault
\sfdefault
\ttdefault

Bir anlatım tarzına veya bir kelimeye vurgu yapmak istediğiniz zaman, metni italik yapabilen \emph{text} komutunu kullanın. İtalikler \textit{text} komutu ile belirlenmiş aralıklara sahip olabilir.

\I want to \emph{emphasize} a word.
Sonuç: I want to emphasize a word.
\emph komutunun dinamik olduğunu not edin: eğer zaten vurgulanmış bir kelimeyi yine vurgularsan, o kelime eski haline geri dönecektir.

\emph{In this emphasized sentence, there is an emphasized \emph{word} which looks upright.}
Sonuç: In this emphasized sentence, there is an emphasized word which looks upright.
Yazı kalın yazıların kullanımına göre ağır bir şekilde vurgulanacaktır, özellikle anahtar kelimeler için okuyucu yazıyı okur iken bulmaya çalışacaktır. Kalın yazı genelde herhangi bir yazıdan ve hatta sayfadan bile daha önce okunur ki, kendisi tutumlu bir şekilde kullanılmalıdır. Ayrıca sans-serif harf tipleri için vurgulanmamış bir yazıya daha iyi bir kontrast sağlamak için italiklerin yerinde de kullanılır. Kalın yazı \textbf{text} komutu ile yaratılabilir.

\textbf{Bold text} may be used to heavily emphasize very important words or phrases.
Sonuç: Bold text may be used to heavily emphasize very important words or phrases.
UYARI: Paragraflarınızda vurgulamayı aşırı kullanmayın. Vurgulama yazılar içindeki anahtar kelimelerde ya da diğer önemli konseptlerde kullanılmalıdır, ve kalın yazının az kullanılması tavsiye edilir.

Harf tipleri genelde farklı varyantlarda ve ağırlıkta gelir, italik ve kalın gibi.
Aşağıdaki liste diğer yazıtiplerini açmanız için gereken komutları gösterir.
Not: Paragraf kırılmaları komut forumlarında izinli değildir.

Generally, one should prefer the commands over their equivalent switches because the former automatically corrects spacing immediately following the end of the selected style.
You may have noticed the absence of underline - this is because underlining is a byproduct of the typewriter era, and is not recommended when bold and italic type is available instead.
However, underlining can be useful in some cases, such as to draw attention to changes during editing. Although underlining is available via the \underline{...} command, text underlined in this way will not break properly. Instead, use the \ul{...} command from the Şablon:LaTeX/Package package or \uline{...} command from the Şablon:LaTeX/Package (underline emphasis) package. By default, the latter package also overrides \emph to underline instead of italicize the text. In the likely case that this is not your intent, use the normalem option, i.e. \usepackage[normalem]{ulem}. Both packages also provide strikethrough text with \st{...} or \sout{...}, respectively.

Bir yazıyı büyütmek ya da küçültmek için şu komutları kullanın:

Bu komutlar boyutu belirli bir değer ile değiştirirler. Örnek olarak {\Large some words} sadece some words kelimesinin boyutunu değiştirir, ve döküman içindeki yazıtipine etki etmez. Yazının çoğu kısmında bu çalışır.
{\Large\tableofcontents}
Bu komutlar matematik modunda kullanılamaz. Yine de, formülün boyutu \mbox komutu ile ayarlanabilir.
Yeni boyut boyut komutundan sonra efekti hemen alır; eğer tüm paragraf ya da birim kesin bir boyuta ayarlanırsa, boyut komutu mutlaka boş bir çizgi veya birimi sınırlayan \end{...} komutuna sahip olur.
Standart olarak, \normalsize 10 points olmaktadır, ama bu \documentclass beyannamesi ile ile değiştirilebilir,
örneğin \documentclass[12pt]{article}.
Her dökümanın her boyut komutları için farklı boyutlara sahip olduğunu not edin.

TeX içinde noktalar 1 noktanın takriben 0.35136 mm olduğu standart Amerikan nokta sistemi ile aynıdır. Normal nokta boyutu en modern bilgisayar programlarında (desktop publishing point ya da PostScript point olarak bilinen) 1 nokta takriben 0.3527 mm ile eşit iken normal Avrupa nokta boyutu (Didot point olarak da bilinir) içinde 1 nokta takriben 0.37597151 mm ile eşittir (bakınız: nokta (baskısı)).

The \tiny...\Huge commands are often enough for your needs, but you may occasionally want an arbitrary font size. This is done with \fontsize{<size>}{<line space>}\selectfont. For example:
Şablon:LaTeX/Usage
sets the current font size to 5cm with 5.5 centimeter leading.
If you are using the latex or pdflatex engines, you may get a warning similar to the following:

LaTeX Font Warning: Font shape `OT1/cmr/m/n' in size <142.26378> not available
(Font)              size <24.88> substituted on input line 103.

This is because these older engines only support a fixed set of sizes - between 5 and 17 point.
When he designed Computer Modern, Knuth created individual font files for these sizes, each with stroke widths and spacing optimized for that particular size.
To avoid distorting them, scaling these fonts is disabled by default.
This issue is avoided when using lualatex or xelatex, which use Latin Modern - a vectorized version of Computer Modern - as the default font family.
This still provides individual files at each of the original optical sizes, but will automatically scale the closest one when asked for an arbitrary size.

When TeX was originally designed in the late 1970s, vector-based fonts didn't exist in any common format - PostScript wouldn't be released until 1982.
Consequently, TeX was designed to use its own font system, METAFONT.
Over time, TeX (and LaTeX) were extended to support PostScript fonts, and modern LaTeX engines also support the
TrueType (TTF) and OpenType (OTF) fonts found on modern systems.

If you are using lualatex or xelatex, you can use TTF and OTF fonts with the Şablon:LaTeX/Package package:
Şablon:LaTeX/Usage
The [Ligatures=TeX] option allows you to use the standard TeX ligatures mentioned in the Text Formatting chapter instead of Unicode characters that are unlikely to be on your keyboard. For example, --- can be used to create em dashes (—), quotes can be typed ``like this'' instead of “like this”, and so on.
The Şablon:LaTeX/Package package is extremely configurable. See the manual for details, but some basics are covered below.

Different weights and styles of a given typeface are usually stored as separate font files. A typical typeface might offer four files to represent its normal weight, italics, bold, and bold italics. Given a typefaces's name, Şablon:LaTeX/Package can generally deduce the names of the individual files.
However, many typefaces come in more than two weights—some versions of Futura, for example, comes in light, book, medium, demi, bold, and extra bold weights. Sometimes small caps are stored as separate files as well.
We might want to hand-pick weights to achieve a certain look or better match the weights of other fonts in our document. Continuing to use Futura as an example, say we want to use the "book" weight for our default weight, "demi" for bold, and the font files are named:

Futura-Boo for upright book weight
Futura-BooObl for oblique book weight
FuturaSC-Boo for small caps, book weight
Futura-Dem for upright demi(bold)
Futura-DemObl for oblique demibold
Our font setup might resemble:
Şablon:LaTeX/Usage
Note that instead of typing out Futura-Boo, Futura-BooObl, and so on, we can use * to insert the base name.

The OpenType (OTF) format allows type designers to embed font features that can be turned on and off, such as:

Alternate versions of glyphs
Lining and "oldstyle" figures, each with tabular and proportional spacing
Up to three sets of ligatures: standard, contextual, and historical
Superscript and subscript glyphs
Small caps (in the same file as the standard upper and lowercase characters)
All of these features can be turned on and off using different Şablon:LaTeX/Package options.
If we wanted to set our body text in Linux Libertine with oldstyle, proportionally-spaced figures, for example, we might set up our fonts as follows:
Şablon:LaTeX/Usage
Features can be turned on and off using \addfontfeatures{...}. Say you wanted to set a table in lining, tabular figures:
Şablon:LaTeX/Usage

If you are not using one of the Unicode-aware engines, font selection is more complicated. (See the discussion of encoding below.)
Useful resources for latex and pdflatex font configuration include:

The Latex Font Catalogue
LaTeX font commands
How to change fonts in Latex
Understanding the world of TEX fonts and mastering the basics of fontinst
Font installation the shallow way "For one-off projects, you can cut corners with font installation (i.e. fontinst) and end up with a more manageable set of files and a cleaner TEX installation. This article shows how and why"

Digitising human language is a complicated topic that has evolved significantly since TeX's inception.

Today, text is usually represented in computer systems using Unicode. Briefly,

A Unicode text file is made of a series of code points, each of which can represent a character to be drawn, an accent or other diacritical mark to combine with an adjacent character, or some non-printing character, such as instruction to print subsequent text right-to-left.
One or more of these code points combines to represent a grapheme cluster or glyph, the shapes within a font that we informally call "characters".
Modern font formats such as TrueType and OpenType contain encoding tables which map code points to the glyphs the font fil

Bu ders de LaTeX temeline aşina olmak amaçlanıyor.
Başlamadan önce, LaTeX'in bilgisayarınızda kurulu (bakınız Kurulum gerekecek yönergeler) olduğundan emin olun. Bu bölüme, LaTeX kaynak dosyası oluşturarak başlıyoruz. Ve sonra bu dosyayı kullanarak LaTeX sistemi ile nasıl, PDF ve postscirpt gibi, kaliteli çıktılar oluşturacağımızı ele alacağız.

LaTeX belge yapısını ve sunumunu tanımlamak için bir biçimlendirme dili kullanır. LaTeX biçimlendirme ile birleştirilmiş senin kaynak metnini yüksek kaliteli belgeye dönüştürür. Benzetme amacıyla, web sayfaları benzer bir şekilde çalışır:HTML belgeyi tanımlamak için kullanılır. Farklı renk, yazı tipleri, boyutları vb, ama tam görkemiyle tarayıcımızda sunulur.
LaTeX için girdi dosyası düz ASCII metin dosyasıdır. Herhangi bir metin düzenleyici ile oluşturulabilir. Belgenin metnini hem de metnin nasıl dizgileneceğini belirten komutları içerir.
Gerçekten sabırsızlananlar için,aşağıdaki gibi minimal bir örnek (komutlar daha sonra açıklanacak):

Boşluk karakteri, mesela boşluk veya tab, LaTeX tarafından boşluk olarak eşit şekilde değerlendirilir. Art arda gelen birçok boşluk tek bir boşluk olarak değerlendirilir. Satır başındaki boşluk karakterleri genelde görmezden gelinir ve tek satır sonu "boşluk" olarak ele alınır. İki satır arasında
art arda gelen birçok boşluk karakterlerinden tek bir boşluk olarak değerlendirilir. Metnin iki satırı arasındaki boş bir satır bir paragrafın sonunu tanımlar. Birkaç boş satır aynı şekilde boş bir satır olarak değerlendirilir. Aşağıdaki metin bir örnek. Sol taraftaki metin girdi dosyası, ve sağ taraftaki biçimlendirilmiş çıktıdır.

Aşağıdaki semboller saklı karakterlerdir ya LaTeX altında özel bir manaya sahip ya da bütün yazı tiplerinde mevcut değildir. Eğer metnin içinde doğrudan girersen, genelde baskılanmayacaktır. Fakat, daha ziyade LaTeX sizin istemediğiniz garip şeyler yapacaktır.

# $ % ^ & _ { } ~ \

Göreceğiniz üzere, bu karakterlerin hepsi  belgelerinizde ters bölü ön eki ekleyerek aynen kullanılabilir:

Diğer semboller ve daha birçok matematiksel formüller içindeki özel komutlar veya aksan gibi özel komutlar basılabilir.
Ters bölü karakteri \ önüne başka bir ters bölü(\\); eklenerek girilemez; bu dizi satır kesmek için kullanılır. Matematik modunda tersbölü tanıtmak için, \backslash kullanabilirsin.
\~ komutu bir sonraki harf üzerinde yaklaşık işareti üretir.Mesela \~n ñ verir.Sadece ~ karakterini üretmek için, \~{} kullan.Bu boş bir kutu üzerine ~ yerleştirir.
Benzer biçimde, \^ komutu bir sonraki karakter üzerinde bir şapka üretir, mesela \^{o} ô üretir.Eğer metin içinde ^ sembolünü görüntülemek istersen \textasciicircum kullanmalısın.
Eğer bir kaç belirli sembol içeren bir metin(mesela URI) girmek istersen, \verb komutunu kullanmayı düşünebilirsin.Bu daha sonra biçimlendirme bölümünde ele alınacaktır.

LaTeX komutları küçük harf duyarlıdır, ve aşağıdaki iki biçimlerden birini alır:

Ters bölü ile başlarlar \ ve sonra sadece harflerden oluşan bir isme sahiptirler.Komut isimleri bir boşluk, bir numara veya başka bir harf olmayan tarafından sona erer.
\ içerirler ve tamamen bir harf olmayandan oluşur.
Bazı komutlar bir argüman gerektirir, bu komut isminden sonra küme parantezleri{ } arasında verilmelidir.Bazı komutlar isteğe bağlı parametreleri destekler, bu köşeli parantez[ ] içinde komut isminden sonra eklenir.Genel sözdizimi:

LaTeX içindeki Ortamlar komutlara oldukça benzer bir işleve sahiptir, fakat genellikle belgenin daha geniş bir bölümü üzerinde etkileri vardır. Kendi sözdizimi şöyledir:

\begin ve \end arasına diğer komutları ve iç içe ortamları koyabilirsiniz. Genel olarak, ortamlar argüman kabul edebilirler. Ancak bu özellik yaygın olarak kullanılmadığı için, bu konu takip eden ileri seviye bölümlerde ele alınacaktır.
LaTeX içinde her şey komutlar ve ortamlar cinsinden ifade edilebilir.

LaTeX giriş dosyasını işlenirken, bir % karakteri ile karşılaştığında, bu satırın geri kalanını yok sayar, satırın sonu, ve sonraki satırın başlangıcının tamamını boşluk sayar.
Bu girdi dosyasına not alırken kullanılabilir.Bu basılı versiyonunda görünmeyecektir

Dikkat, % karakteri boşluk veya satır kesmelerine izin vermeyen uzun girdi satırlarını bölmek için kullanılabilir, yukarıda Supercali...cious ile olduğu gibi.
Çekirdek LaTeX dili çok sayıda satıra bölünmüş bölgeler dışında yorum oluşturma için önceden tanımlanmış söz dizimine sahip değildir.Basit geçici çözümler için Çok-satırlı yorumlara bakın.

LaTeX giriş dosyasını işlediğinde, o belirli bir yapıyı takip etmeyi bekliyor. Böylece her girdi dosyası şu komutla başlamalıdır

Bu sizin hangi tür belge yazmak istediğinizi belirtir. Bundan sonra, tüm belgenin tarzını etkileyen komutlar ekleyebilirsiniz, veya LaTeX sistemine yeni özellikler ekleyen paketleri yükleyebilirsiniz. Böyle bir paket yüklemek için aşağıdaki komutu kullanabilirsiniz

Tüm kurulum çalışmaları tamamlandığında, metnin gövdesine aşağıdaki komut ile başlarız.

Şimdi bazı yararlı LaTeX komutları ile karıştırarak metni yazınız. Belgenin sonuna aşağıdaki komutu ekleyin.

Bu komutu takip eden komutlar LaTeX tarafından görmezden gelecektir. \documentclass alanı ile \begin{document} arasındaki alana ön söz(preamble) denir.

LaTeX girdi dosyalarınızı öğüten ve bir DVI ya da PDF'den birini üreten bir program olduğu için, kendi içinde GUI'ye(grafiksel kullanıcı arayüzü) sahip değildir, 
Bazı LaTeX kurulumlarında tıklayıp girdi dosyalarını derleyebileceğiniz grafiksel arayüze sahiptir.Diğer sistemlerde biraz yazma gerekebilir, böylece burda LaTeX'i metin tabanlı sistemde girdi dosyanızı derlemesi ikna edeceğiz.Lütfen dikkat: Bu ​​açıklamada, zaten bilgisayarınızda çalışan bir LaTeX kurulumu olduğunu varsayıyoruz.

LaTeX girdi dosyanızı düzenlemek/oluşturmak.Bu dosya düz ASCII metin olmalı.Unix üzerinde bütün metin düzenleyiciler sadece bunu oluşturur. Windows üzerinde dosyayı ASCII ya da düz metin dosyası olarak kaydettiğimize emin olmalıyız.Dosyamıza isim seçerken .tex uzantısını taşıdığına emin olmalıyız.
Girdi dosyanız üzerinde LaTeX'i çalıştırın.Eğer başarılı olursa .dvi dosyası ile sona erer. LaTeX'i içindekiler tablosu ve tüm dahili referansların doğru olması için bir kaç kere çalıştırmak gerekebilir.Girdi dosyanda bir hata varsa LaTeX girdi dosyasını işlemeyi bırakacak ve sana bildirecektir.
Komut sistemine dönmek için ctrl-D yazın.

latex foo.tex

Şimdi DVI dosyasını görüntüleyebilirsiniz.X11'li Unix üzerinde xdvi foo.dvi yazabilirsiniz, Windows üzerinde yap (yet another previewer) denilen programı kullanabilirsiniz.(evince ve okular, çoğu Linux dağıtımları için olan belge görüntüleyicileri DVI dosyalarını görüntüleyebilir.) 
Aynı işlemi PDF belgesini .tex orjinal kaynağından  oluşturmak için pdflatex komutu ile tekrarlayabiliriz.Yukarıdakinin benzeri, komutu gir:

pdflatex foo.tex

Şimdi PDF dosyasını görüntüleyebiliyorsunuzdur, foo.pdf.

Bundan sonra, ilk belgemizi yaratabiliriz. Bi şekilde LaTeX derlemesi yapıp, çıktı almak için gereken, "Merhaba Dünya" olarak bilinen, en az kodlama yolunu seçeceğiz.

Metin/belge düzenleyicinizi açın. Eğer, Vim, Gedit, Notepad++, Emacs kullanıyor iseniz, bu yazılımlar kaynak kod renklendirmesi ile LaTeX kodlaması yapmanıza yardımcı olacaktır.
Aşağıdaki metni düzenleyicide yazın. Bu "Merhaba Dünya" nın LaTeX kaynak kodudur.

Bu metni merhaba.tex olarak kaydedin.

Daha önce bahsettiğimiz üzere, LaTex komutları ters bölü işareti (\) ile başlar. Bu şekilde LaTeX takip eden karakterleri komut olarak yorumlaması gerektiğin bilir. Bu kuralın işlemediği tek bir durum kaynak kodu içerisinde yapılan yorumlar kısmında yeralan ters bölü işaretleridir.

Açık olmak gerekirse, derleyeceğimiz bu belge çok ilginç olmayacak ancak yine de bu basit belgeyi görmekte fayda var. Buna başlamadan önce, komut ekranı arayüzünde olduğunuzu ve merhaba.tex belgesinin bulunduğu dosyada olduğunuzu varsayıyoruz. 

Şu komutu girin: latex hello (.tex uzantısı gerekli değil ancak isterseniz bu uzantıyı kullanın)
LaTeX hakkında bir çok bilgi göreceksiniz ve derlemey işleminin gidişatı gözükecek. Herşey yolunda giderse, komut ekranında gözükecek son iki satır şöyle olacak:
Output written on merhaba.dvi (1 page, 232 bytes).
Transcript written on hello.log.

Bu şu demektir: kaynak kodu işlendi ve bunun çıktısı olan belge merhaba.dvi olarak adlandırıldı. Bu belge 1 sayfa ve 232 "byte" boyutundadır. Bu şekilde DVI belgesini yarattınız, fakat kaynak kod ile PDF belgeside yaratabilirsiniz. Bunun için yapmanız gerekenler aşağı yukarı aynı ancak  latex komutunu pdflatex ile değiştirmelisiniz:

pdflatex merhaba.tex komutunu girin
Bir takım LaTeX ile ilgili bilgiler gözüktükten sonra, herşey yolunda giderse şu iki satırı göreceksiniz?:
Output written on merhaba.pdf (1 page, 5548 bytes).
Transcript written on merhaba.log.

Görüldüğü üzere PDF belgesi, aynı bilgiye sahip olmasına rağmen,  bilgisayarda  DVI belgesinden daha büyük bir yer kaplamaktadır. DVI ile PDF arasında temel farklar şunlardır:

DVI bilgisayarda daha az yer kaplar ve yaratılması hızlı olur. Belgedeki yazı tiplerini içermez. Bu yüzden eğer belgeyi başka bir bilgisayarda görmek istiyorsanız, bu belge için gerekli yazı tıplerinin tümünün bu bilgisayarda yüklü olması gerekir. İnternet linklerini ya da haraketli resimleri desteklemez. DVI gösterici yazılımlar yaygın değildir. Bu yüzden DVI çıktısını, LaTeX kodlamasını yapıyorken, belgenin sadece çabucak bir önizlemesini yapmak için kullanılmaktadır.
PDF bilgisayarda daha fazla yer kaplar ve yaratılması uzun sürer, ancak gerekli tüm yazıtiplerini içerir. Böylece, yarattığınız belgeyi herhangi bir bilgisayarda açabilirsiniz. Ayrıca PDF iç ve dış hiper bağlantıları destekler. Buna ek olarak, ileri yazım özelliklerini destekler. PDF günümüzde en yaygın geçerliliği olan belge biçimidir. Bu sebepten, LaTeX ile kodladığınız belgeyi tamamladığınızda, mutlaka bu en son sürümün bir PDF çıktısını yaratın.
Şimdiye kadar, aynı kaynak koddan DVİ ve PDF belgeleri yaratabilceğimizden bahsettik. Eğer belgeye resimler ya da bağlan

Latince'de kelimeler değiştirilebilir ve değiştirilemez kelimeler olmak üzere ikiye ayrılabilir. Değiştirilebilir kelimeler arasında çekimlenen fiiller, isimler, sıfatlar ve zamirler bulunur. Değiştirilemez kelimeler arasında ise zarflar, prepozisyonlar (ön edatlar) ve bağlaçlar bulunur.

Latince'de isimler aynı Türkçe'de olduğu gibi kelime sonlarına aldıkları ekler ile çekimlenirler. Latince'de isimlerin toplam 6 hali (Nominativus: Yalın hal, Vocativus: Seslenme hali, Accusativus: -i hali, Genitivus: -in hali, Dativus:-e hali, Ablativus: -den hali) , 3 cinsi (Masculinum, Femininum, Neutrum) ve çoğul ile tekil olmak üzere iki çeşidi vardır.  Bu hallere göre isimlerin çekimlemeleri yapılır. İsimler ayrı ayrı çekim gruplarına aittirler.

Birinci çekim grubunda yalın halde -a eki ile biten isimler bulunur. Bu çekim şemasına ait kelimeler çoğunlukla feminin cinsine sahiptir ancak bunu genellemek mümkün değildir. A grubundaki isimlerin çekimlenmesi için aşağıdaki tabelada bulunan ekler isimlere eklenir.

İkinci çekim grubunda -us, -er ve -um eki ile biten isimler bulunur. -us ve -er ile biten isimler genellikle masculinum iken, -um ile biten isimler genellikle neutrum cinsine sahiptirler. 

Türkçe'den farklı olarak Latince'de sıfatlar her zaman ait oldukları isimlerin çekimlendiği biçimde çekimlenirler. Örneğin büyük ev anlamına gelen aedificium magnum gibi.

Aşağıda listenmiş fiiller de aynı şekilde a grubunun şemasına uygun olarak çekimlenirler.

Aşağıda listenmiş fiiller de aynı şekilde e grubunun şemasına uygun olarak çekimlenirler.

Aşağıda listenmiş ve e-grubu fiillerden olan fiiller düzensizlerdir ve ezbere öğrenilmeleri gerekir.

Aşağıda listenmiş fiiller de aynı şekilde i grubunun şemasına uygun olarak çekimlenirler.

Aşağıda listenmiş ve i-grubu fiillerden olan fiiller düzensizlerdir ve ezbere öğrenilmeleri gerekir.

Bu çekim grubuna ait bütün fiiller düzensizdir ve ezbere öğrenilmeleri gerekir.

Cümle Deposu/Latince
Dilbilgisi

Latince'de toplam yedi hal (Casus) vardır. İsim çekimlerini gösteren tablolarda bunlardan genelde beşi bulunur.
Benzer yönleri olsa da Türkçe'de ve Latince'de ismin halleri birbirinden farklıdır. Bu yüzden Latince'de bir isim -den halinde iken aslında Türkçe'ye çevrildiğinde -de halini alıyor olabilir. Bu dilin kullanımıyla ilgili bir özelliktir.
1. Nominativus
Türkçe'de ismin yalın halini karşılar.

Örnek:
Caesar çok çay içiyor.
Vikipedi komik bir ansiklopedidir.
Quintus ambulabat. (Quintus konuşuyordu.)
2. Vocativus
Seslenme halidir. Tam bir karşılığı yoktur. Latince'de özneye hitap edildiğini belirtir. Genellikle nominativus ile aynı şekilde çekildiği için tablolara dahil edilmez. Farklı olarak ikinci çekimde "us" ile biten eril isimlerde "us" "e" halini alır, ve "ius" ile bitenlerin sonu "i" olur. (Örnek olarak: "servus" "serve", "filius" "fili" olur.) Ayrıca antik Yunanca'dan alınmış bazı isimlerin üçüncü çekiminde nominativus ve vocativus halleri farklıdır.

Örnek:
Caesar! hemen buraya gel.
Elif, suyu uzatır mısın?
Quinte!, caue canem! (Quintus, köpeğe dikkat et!)
3. Accusativus
Türkçe'de i halini karşılar, fakat daha farklı kullanımları olabilir.

Örnek:
Cornelia Marcus'u öldürdü.
Çiçeği suya koydum.
4. Genitivus
"in" hali ya da iyelik hali olarak çevrilebilir. Genel olarak sahiplik bildirir.

Örnek:
Köpek kulübesi. (Latince'de "köpeğin kulübesi şeklinde ifade edilir, farklılığa dikkat ediniz.)
Kedinin tüyleri kabarmış.
5. Dativus
İsmin -e hali.

Örnek:
Kızıma bir hediye aldım.
Sezen'e söyle, elektrik faturasını yatırsın.
6. Ablativus
İsmin -den haline tekabul eder, ancak çok farklı kullanımları vardır. ("Tarafından" ve "birliktelik" anlamı gibi.)

Örnek:
Puer longis capillis. (Uzun saçlı çocuk.)
Çocuk bir taş ile yaralandı.
Selim'den daha akıllıyım.
7. Locativus
Bir ismin yerini belirten haldir. Bu anlam genellikle proposition'larla verildiği için az kullanılır, ve tablolarda gösterilmez.

Örnek:
Romae sum. (Roma'dayım.)
domi est. (evde.)
sokakta uyudum.

Birden fazla programın çalışması halinde bellekte bu programların sadece bir tanesi tutulur. Böylece bellekten tasarruf sağlanır.
Çalıştırılabilir bir program, belleğin tamamından büyük olabilir. Bu durumda programın sadece o an kullanılan bölümleri belleğe alınır ve çalıştırılır. Böylece bellek kısıtlaması programın çalışmasına engel teşkil etmez.
Disk alanı yardımıyla belleğin yetmediği durumlarda fazla veri diske yazılır. Bu bölüme takas alanı (swap space) denir. Her biri en çok 2Gb tutan 16 tane takas alanı açılabilir.
Paylaşılan kütüphaneler dinamik veya statik olabilir. Yani bir kütüphane aynı anda birden çok program tarafından yüklenebilir (dinamik), veya bir programın içine gömülebilir (statik). Linux’un çekirdeği büyük oranda POSIX , System V ve BSD standartlarıyla uyumludur. Pek çok klavye tipini destekler.
Aynı anda birden çok sanal ekranı destekler. Konsolda oturuken birden fazla (en çok 64) giriş yapabilirsiniz.

Linux, 1.0 sürümünün Internet sitelerine konulduğu 14 Mart 1994 yılından beri beta denemelerini geçmiş ve kararlı bir yapıya bürünmüştür. Çekirdekte hatalar tespit edildikce üzerine yeni kodlar eklenir. Ancak Linux açık bir şekilde geliştiğinden sürekli bir kontrol altındadır. Çekirdeğin iki farklı sürümüde internette dağıtılır. Örnek olarak 1.2.13 kararlı bir çekirdek sürümüdür. 1.3.56 ise halen üzerinde geliştirme yapılıyor ve test ediliyor anlamına gelir. Çekirdek sürümünün ortasındaki rakam tek ise bu çekirdek deneyseldir. Hala test aşamalarından geçmekte ve üzerinde sürekli yeni kod yazılıyor demektir. Çift olması durumu ise bu çekirdeğin kullanılabilir ve çok büyük ihtimalle kararlı olduğu anlamına gelecektir.
Linux’un kararlı bir işletim sistemi olmasının en büyük kanıtı, Internet üzerindekullanıldığı alanların genişliği ve bu konudaki yönetici memnuyetleridir.

Salt olarak kullanıldığında sabit disk(ler)in ve bölüm(ler)in (partition) toplam boyutlarını, kullanılmış alanlarını, boş alanlarını, yüzde kaçının dolu olduğunu ve nereye bağlı olduğunu verir. Çıktısı şuna benzer bir şeydir:

Dosyasistemi         1K-blok        Dolu Boş       Kull%Bağlanılan yer
/dev/sda5             60743612  16382312  43744180  28% /
tmpfs                   509664       608    509056   1% /dev/shm
/dev/sda1             55505488  11465220  44040268  21% /mnt/sda1

"1K-blok" yazan yer ilgili bölümün (veya sabit diskin) toplam boyutudur. Varsayılan durumda bu değerler KB cinsinden görüntülenir. Ancak istersek ekleyeceğimiz çeşitli seçeneklerle bu birimi değiştirebiliriz. m seçeneği ile sonuçların MB cinsinden olmasını k seçeneği ile de KB cinsinden olmasını sağlarız (varsayılan). Ancak bunlardan en kullanışlısı h'dir. h seçeneği ile sonuçların gösterilebilecek en büyük birimle gösterilmesini sağlarız. Örnek:

df -h

Salt olarak kullanıldığında aktif klasörün ve aktif klasörün altındaki tüm klasörlerin (alt klasörler de dahil) isimlerini ve toplam boyutlarını verir. Burada boyuttan kastımız ilgili klasörün içindeki her şeyin boyutudur. Bu durumu kolay anlayabilmeniz için olayı şöyle somutlaştırayım: aktif klasörünüzün alt klasörleri şöyle olsun:
Ana Klasör

dosya1.mpg
Alt Klasör
dosya1.mpg
dosya2.mpg
Alt-Alt klasör
dosya1.mpg
Buradaki dosya1.mpg dosyasının birden fazla klasörde birer kopyası var. Alt Klasör klasöründe de bir dosya2.mpg dosyası var. dosya1.mpg dosyasının boyutu 10 MB, dosya2.mpg dosyasının ise 20 MB olsun. Biz Ana Klasör klasöründeyken du komutunu verirsek şöyle bir çıktı alırız (du komutunu h seçeneği ile verin ki boyut bilgilerini okumak kolay olsun):

10M     ./Alt Klasör/Alt-Alt klasör
40M     ./Alt Klasör
50M     .

Tahmin edebileceğiniz gibi du komutunun m, k (varsayılan) ve h seçenekleri vardır. Ayrıca istersek du komutuyla belirli bir klaasörün boyutunu da öğrenebiliriz. Ancak bunun için komuta s seçeneğini eklemeliyiz. Örnek:

du -sh ../Klasör

Bu komutla bir üst klasördeki Klasör klasörünün ismini ve boyut bilgisini en okunaklı şekilde alırız. Ancak bu durumda sadece belirttiğimiz klasörün bilgisi verilir. Alt klasörlerin bilgisi verilmez. Örneğin şu komutu verirsek:

du -sh "Ana Klasör"

şöyle bir çıktı alırız: (yukarıdaki klasör ağacımızdaki Ana Klasör klasörü)

50M     Ana Klasör

Bu yöntemle sadece klasör değil, dosya da belirtebiliriz. Örnek:

du -sh *.mpg

Bu komutla aktif klasördeki mpg uzantılı dosyaların boyutlarını bir liste şeklinde alırız.

du -sh *.mpg *.flv

Bu komutla aktif klasördeki mpg ve flv uzantılı dosyaların boyutlarını bir liste şeklinde alırız.

du -sh *.mpg *.flv Klasor

Bu komutla da aktif klasördeki mpg ve flv uzantılı dosyaların ve Klasor klasörünün boyutlarını bir liste halinde alırız.

mount komutu ile herhangi bir aygıtı herhangi bir klasöre bağlayabiliriz. Bu sayede o klasörü açtığımızda o aygıtın içindekilere erişebiliriz. Aslına bakarsanız Ubuntu ve Pardus gibi modern dağıtımlarda bu işlem otomatik olarak gerçekleşir. Örneğin CD-ROM sürücüsüne bir CD taktığınızda CD'yle ne yapmak istediğinizi belirten bir ileti kutusu görüntülenir. Ancak modern dağıtımlarda mount komutunun kullanılması kısıtlanmamıştır. Şimdi CD-ROM sürücünüze bir CD yerleştirin ve şu komutu verin:

mount /dev/cdrom "Yeni Klasör"

Bu komutu verdikten sonra aktif dizininizdeki Yeni Klasör klasörünü açtığınızda taktığınız CD'deki dosya ve klasörleri görebileceksiniz.

umount komutu mount komutunun yaptığının tersini yani "bağlantıyı kesme" işlemini yapar. Bu sayede CD-ROM'a bağlı klasörünüzün gerçek içeriğini tekrar görebilirsiniz. Az önceki bağlantıyı kesmek için şu komutu verin:

umount /dev/cdrom

NOT: mount ve umount komutlarını kullanabilmeniz için root modunda olmalısınız.
NOT: Dosya yöneticinizde mount komutunu vermenize rağmen Yeni Klasör klasöründe CD'nin içeriği gözükmüyorsa, veya umount komutunu vermenize rağmen halen gözüküyorsa birkaç kez F5'e basmanız, dosya yöneticinizi kapatıp açmanız ve/veya biraz beklemeniz gerekebilir.
NOT: Bağlantının yapılabilmesi veya sorunsuz kesilebilmesi için komut isteminde bağlanan klasörün içinde olmamanız tavsiye edilir.

ls komutu salt olarak kullanıldığında aktif klasördeki dosya ve klasörleri listeler. Dosya ve klasörler farklı renklerde gösterilir. İstenirse belirli bir klasör veya dosya belirtilip o klasörün içeriği veya dosya listelenebilir. Dosya/klasör adı belirtirken joker karakterler (*,?) kullanılabilir. Örnekler:

ls

Bu komut aktif klasördeki tüm dosya ve klasörleri listeler.

ls Belgeler

Bu komutla aktif klasördeki Belgeler klasörünün içeriği görüntülenir.

ls ..

Bu komutla bir üst klasörün içeriği listelenir.

ls ../*.htm 

Bu komutla bir üst klasördeki uzantısı htm olan dosyalar listelenir.

ls ~

Bu komutla home dizininizin içeriği görüntülenir.

ls ../../Klasor1/Klasor2/deneme.htm

Bu komutla iki üst klasördeki Klasor1 klasöründeki Klasor2 klasöründeki deneme.htm dosyası listelenir.

ls deneme.htm

Bu komutla aktif klasördeki deneme.htm dosyası listelenir.

ls a?e.htm

Bu komutla aktif klasördeki ilk harfi a olan, üçüncü harfi e olan, uzantısı htm olan, ismi üç harfli olan dosyalar listelenir.

ls komutu l parametresiyle kullanıldığında dosya ve klasörleri ayrıntılı olarak listeler. Örnek:

ls -l ../deneme

Bu komut bir üst klasördeki deneme klasörünün içeriğini ayrıntılı olarak listeler. Eğer bir üst klasörünüzde deneme klasörü varsa deneme klasörünüzdeki dosya ve klasörlere bağlı olarak şuna benzer bir çıktı almanız gerekir.

-rwxr-xr-x 1 bekir users 20974 Mar  8  2009 ascii.pdf
-rwxr-xr-x 1 bekir users  1423 Mar  6 15:54 Ayarlar Listesi.txt
drwxr-xr-x 2 bekir users  4096 Mar  7 12:05 Resimler

Bu çıktıdaki ilk karakterler ilgili ögenin dosya mı yoksa klasör mü olduğunu belirtir. İlk karakter d ise ilgili öge klasördür, - ise dosyadır.
Bu çıktıdaki ikinci, üçüncü ve dördüncü karakterler ilgili dosya veya klasöre, dosya veya klasörün sahibi olan kullanıcının neler yapabileceğini belirtir. Beşinci, altıncı ve yedinci karakterler dosya veya klasörün sahibi olan grubun dosya veya klasöre yapabileceklerini belirtir. Sekizinci, dokuzuncu ve onuncu karakterler ise diğerlerinin dosya veya klasöre neler yapabileceğini belirtir.
Linux'ta bir dosya veya klasörün bir kullanıcı sahipliği bir de grup sahipliği vardır. Varsayılan durumda dosya veya klasörün sahibi olan kullanıcı hangi gruptaysa o grup dosya veya klasörün grup olarak sahibidir. Ama istenirse bir dosya veya klasörün kullanıcı sahipliği ve/veya grup sahipliği değiştirilebilir. (ileride göreceğiz) Bu durumda bir kullanıcının grup olarak sahibi, o dosya veya klasöre sahip olan kullanıcının grubu olmayabilir.
Bütün izinleri açılmış bir dosya şöyle gözükür:

-rwxrwxrwx

Bütün izinleri kapatılmış bir dosya da şöyle gözükür:

----------

r: Okuma iznini belirtir.
w: Yazma iznini belirtir.
x: Yürütme iznini belirtir.

-rwxr-x---

Bu çıktıdan ilgili ögenin bir dosya olduğunu, sahibinin her türlü izninin olduğunu, grubunun okuma ve yürütme izninin olduğunun ama yazma izninin olmadığının ve diğerlerinin de ilgili dosyayla ilgili hiçbir izinlerinin olmadığını anlayabiliyoruz.
Şimdi az önceki çıktıya geri dönelim:

-rwxr-xr-x 1 bekir users 20974 Mar  8  2009 ascii.pdf
-rwxr-xr-x 1 bekir users  1423 Mar  6 15:54 Ayarlar Listesi.txt
drwxr-xr-x 2 bekir users  4096 Mar  7 12:05 Resimler

Bu çıktıdaki ikinci sütun ilgili dosya veya klasöre yapılan "hard link" sayısını verir. Şimdilik bize "hard link", "soft link" gibi kavramlar biraz ağır geleceği için bu sütunu açıklamıyorum.
Üçüncü sütun ilgili dosya veya klasörün sahibini verir. (kullanıcı olarak)
Dördüncü sütun ilgili dosya veya klasörün grup olarak sahibini verir.
Beşinci sütun ilgili dosya veya klasörün boyutunu byte olarak verir. Ancak burada dikkat etmemiz gereken nokta klasörlerlerin içlerinin boyutunu değil, kendi boyutlarını vermesidir. Linux'ta bir klasör oluşturduğumuzda klasörün içi boş olsa bile Linux 4 KB'lık bir alanı klasör için ayırır ve alanda klasörle ilgili metadata denilen bilgiler tutulur.
Altıncı, yedinci ve sekizinci sütun ilgili dosya veya klasörün son değiştirilme zamanını verir. Eğer dosya ya da klasör içinde bulunduğumuz yılda değiştirilmişse yılı vermez, bunun yerine saati verir. Eğer bulunduğumuz yıldan eski bir zamanda değiştirilmişse yılı verir, saati vermez.
Son sütun ise ilgili dosya veya klasörün ismini verir.

ls komutunun gizli dosya ve klasörleri de göstermesini sağlar. Linux'ta gizli dosya ve klasörler . (nokta) karakteriyle başlar. Örnek:

ls -a

Bu komut aktif klasördeki bütün dosya ve klasörleri gizlileriyle birlikte gösterir.
NOT: Linux, her yeni klasör oluşturulduğunda ilgili klasöre otomatik olarak . ve .. gizli klasörlerini yerleştirir. Bu klasörler tahmin edebileceğiniz gibi geçerli klasör ve bir üst klasörü temsil ederler.

ls komutunun ilgili klasörü alt klasörleriyle beraber listelemesini sağlar. Deneyin, bu parametreyi çok seveceksiniz.

l parametresiyle birlikte kullanıldığında anlam kazanır. Dosya boyutlarını kolayca okunabilecek şekle dönüştürür. Örnek:

ls Belgeler -lh

Komutunu verdiğimizde aktif klasördeki Belgeler klasörünüzdeki dosya ve klasörlerler temsil edilebilecek en uygun türle gösterilirler. (byte, KB, MB veya GB) Bu sayede ilk bakışta dosyanın büyüklüğünü anlayabilirsiniz.
NOT: Parametre kullanırken birden fazla parametre kullanacaksanız parametreleri ard arda eklersiniz. Her parametre için farklı bir tire işareti kullanmazsınız ve parametrelerin sırası da önemli değildir. Örnek:

ls -laRh Belgeler

Bu komut aktif klasördeki Belgeler klasöründeki tüm dosya ve klasörleri, gizliler dahil olmak üzere, ayrıntılı olarak, alt klasörler de dahil olmak üzere ve dosya ve klasörlerin boyut bilgilerini kolay okunur şekilde vererek listeler.
NOT: ls komutu için özel olmak üzere dosya/klasör argümanıyla, parametre argümanının yerini değiştirebilirsiniz. Örneğin

ls -laRh Belgeler
ls Belgeler -laRh

Yukarıdaki her iki komut da çalışacaktır.
NOT: Linux komutları ve dosya/klasör adları büyük-küçük harf duyarlıdır.

cd, dizinler arasında geçiş yapmak istediğimizde kullanabileceğimiz bir komuttur. Yani aktif dizini değiştirir. Kullanım:

cd klasor

Eğer klasörün başına / işaretini koyarsak Linux ilgili klasörü en üst klasörde arayacaktır, aksi takdirde aktif klasörde arayacaktır. Örnek:

cd /home/bekir/Belgeler

Bu komutla en üst klasöre bağlı home klasöründeki bekir klasöründeki Belgeler klasörü etkin hale getirilecektir. Yani komut isteminde bu klasörün içine girilecektir.

cd Müzik/Avril

Bu komutla aktif klasördeki Müzik klasöründeki Avril klasörüne girilir.

cd Müzik/..

Bilin bakalım bu komutla nereye girilir? Cevap basit: bu komutla bulunduğunuz klasörde kalırsınız.

cd .

Bu komutla da bulunduğunuz klasörde kalırsınız. Nokta işareti aktif klasörü belirtir.
NOT: Şimdiye kadar fark etmişsinizdir. Ama yine de ben söyleyeyim. Linux'ta herhangi bir komuta argüman olarak dosya/klasör adı veriyorsak bu dosya/klasör adını salt ad şeklinde verebileceğimiz gibi son derece karmaşık yol bilgileriyle beraber de verebiliriz. Salt ad şeklinde verdiğimizde aktif klasördeki dosya veya klasörlerle işlem yapılır. Yine bütün komutlar için klasör belirtirken .., . ve ~ özel işaretleri geçerlidir.
NOT: Yalnızca cd komutuna ve .. özel klasörüne özel olmak üzere cd.. gibi bir kullanım geçerlidir. Ancak cd../.. gibi bir kullanım elbette ki geçerli değildir. Diğer bütün klasörlerde klasör adını cd komutundan ayırmak gerekir.
NOT: Linux'ta bütün komutlarda geçerli olmak üzere bir komuta bir kelimeden fazla (yani boşluk içeren) bir argüman vermemiz gerekiyorsa ilgili metni çift tırnak arasına alırız. Örnek:

cd "Yeni Dizin"

Bu komutla aktif klasördeki Yeni Dizin klasörü aktif hale getirilir.

Geçerli dizini ekrana yazar.

Yeni dizin oluşturmak için kullanılır. Örnek:

mkdir "../../Klasör/Yeni Klasör"

Bu komut iki üst klasördeki Klasör klasöründe Yeni Klasör adıyla bir klasör oluşturur.

Dizin silmek için kullanılır. Ancak silinecek dizinin içinin boş olması gerekir. Örnek:

rmdir "../../Klasör/Yeni Klasör"

Bu komutla az önce oluşturduğumuz klasörü sildik.
NOT: Bu komut klasörleri çöp kutusuna taşımadan, direkt olarak siler.

Boş bir dosya oluşturur. Örnek:

touch Deneme/Ornek.txt

Bu komut aktif klasördeki Deneme klasöründe Ornek.txt isminde boş bir dosya oluşturur.

cp komutu dosya ya da klasör kopyalamaya yarar. Örnek:

cp Deneme/Ornek.txt .

Bu komut aktif klasördeki Deneme klasöründeki Ornek.txt dosyasını (az önce oluşturduğumuz dosya) geçerli klasöre kopyalar.

cp Deneme/Ornek.txt Ornek2.txt

Bu komut ise aynı işlemi dosyanın ismini Ornek2.txt olarak değiştirerek yapar. (klasör belirtmediğimizde aktif klasör sayılıyordu)
NOT: Klasörleri özyinelemeli kopyalamak için -r değişkeni kullanılmalıdır.

Dosya taşımaya yarar. Dosyaları kopyalamak yerine taşıması haricinde cp ile aynı özelliklere sahiptir.Dosya ismi değiştirmeye de yarar.

Dosya silmeye yarar. Örnek:

rm Deneme/Ornek.txt Ornek.txt Ornek2.txt

Bu komutla şimdiye kadar oluşturduğumuz bütün dosyaları sildik. Bu komut silmeden önce onay ister. y yazıp enter'a basarsak silinir, n yazıp enter'a basarsak silinmez. Yine rmdir'de olduğu gibi bu komutta da dosyalar çöp kutusuna taşınmadan, direkt olarak silinir.
NOT: Bu komutta olduğu gibi rmdir, touch, mkdir, cp ve mv komutlarında da çoklu dosya/klasör belirtme yöntemini kullanabilirsiniz. Örnekler:

rmdir "Yeni Dizin" "Yeni Dizin_1" "Yeni Dizin_2"
touch dosya1.txt dosya2.txt
cp dosya1.txt dosya2.txt Resimler

Birinci komutta aktif dizindeki Yeni Dizin, Yeni Dizin_1 ve Yeni Dizin_2 klasörleri silinir. İkinci komutta aktif klasörde dosya1.txt ve dosya2.txt dosyaları oluşturulur. Son örnekte de bu oluşturulan dosyalar aktif klasördeki Resimler klasörüne kopyalanır.
NOT: rmdir komutu rm'den farklı olarak silme için onay istemez ve klasörlerin içinin boş olması gerekir.
NOT: cp ve mv komutlarıyla en sık yaşayabileceğimiz aksilik hedef klasörde zaten aynı isimde dosya olmasıdır. Bu durumda komut istemi "Üstüne yazılsın mı?" diye sorar. y yazıp enter'a basarsanız üzerine yazılır, n yazıp enter'a basarsanız kopyalama/taşıma gerçekleşmez. Ancak bu durum touch ve mkdir için geçerli değildir. Bu 

Düzenli ifadeler bir bilgisayar programcısının en çok seveceği yapılardandır. Çünkü programcıların normalde yapamayacağı veya çok zor yapacağı şeyleri son derece basit ve kullanışlı yöntemlerle yapabilmesini sağlar.
Yukarıdaki tanımdan düzenli ifadelerin ne demek olduğunu anlamadınız, biliyorum. O halde açıklayayım. Düzenli ifadeler, bazı ortak özelliklere sahip karakter dizeleriyle ilgili ortak işlemler yapabilmemizi sağlayan bir yapıdır. Örneğin iki karakter dizesi de a harfi ile başlıyorsa bunların ortak özelliği a harfi ile başlamalarıdır diyebiliriz ve bu ortak özelliğe dayanarak bu iki karakter dizesiyle ilgili ortak işlemler yapabiliriz. Örneğin ikisini de başka bir kelimeyle değiştirebiliriz.
Linux komut satırında düzenli ifadeler grep, sed ve awk komutlarıyla kullanılabilir. grep komutunu daha önce görmüştük. sed ve awk komutlarını da bu bölümde göreceğiz. Şimdi düzenli ifadelere başlayabiliriz.

Köşeli parantezler ilgili yerde parantezin içindeki karakterlerden birisinin bulunması gerektiğini belirtir. Örnek:

grep [ktsş]an dosya.txt

Bu komutla dosya.txt dosyasında kan, tan, san ve şan kelimeleri aranır. Köşeli parantezlerin başka bir kullanımı da şu şekildedir:

grep [a-z]an dosya.txt

Bu komutla aan'dan zan'a kadar olan kelimeler aranır. (aan, ban, can, çan, ..., zan)

grep [f-m]an dosya.txt

Bu komutla fan'dan man'a kadar olan kelimeler aranır. (fan, gan, ğan, han, ..., man)

grep [1-9]an dosya.txt

Bu komutla 1an'dan 9an'a kadar olan kelimeler aranır. (1an, 2an, 3an, 4an, ..., 9an)

grep [4-7]an dosya.txt

Bu komutla 4an, 5an, 6an ve 7an aranır.
NOT: Yaptığım denemelerde büyük harf kullanımıyla küçük harf kullanımının genelde fark etmediği gördüm. Sadece bir yerde fark ediyor. Eğer köşeli parantezler içindeki ilk harf küçük harfse o harfin büyük harf olarak karşılığıyla başlayan karakter dizesi çıkmıyor. Bu sorunu köşeli parantezler içindeki ilk harfi büyük yaparak giderebilirsiniz.

İlgili yerde herhangi bir karakter bulunması gerektiğini belirtir. Örnek:

grep ş.n dosya.txt

Bu komutla şan ve şen gibi ş ile başlayıp n ile biten ve üç karakterden oluşan bütün karakter dizeleri aranacaktır. Başka bir örnek:

grep f...r dosya.txt

Bu komutla bulunabilecek karakter dizelerinden bazıları: fener, fecir, fular, fiber, f)? r

Kendinden önceki karakterin (veya köşeli parantez ifadesinin) hiç bulunmayabileceğini, bir kere veya daha fazla bulunabileceğini belirtir. "O halde bunun aramaya bir etkisi yoktur" diyebilirsiniz, ki haklısınız. Evet, aramaya etkisi yoktur ama bulunan karakter dizesine etkisi vardır. Şimdi içeriği şöyle olan bir metin dosyası oluşturun ve adına dosya.txt verin:

benim adım hmet
benim adım ahmet
benim adım aahmet
benim adım aaaaaahmet

Komut isteminde bu dosyanın bulunduğu klasöre girin ve şu komutu verin:

grep a*hmet dosya.txt

Bu komutun çıktısı şöyle olacaktır:

benim adım hmet
benim adım ahmet
benim adım aahmet
benim adım aaaaaahmet

Gördüğünüz gibi * işareti "bulunabilme"yi değiştirmiyor, ama bulunan karakter dizesini değiştiriyor. Bu işaret bulunan bir karakter dizesinin başka bir karakter dizesiyle değiştirilmesini sağlayan ileride göreceğimiz sed komutunda işe yarayacak. Başka bir örnek:

grep [a-z]*m  dosya.txt

Bu komutun çıktısı da şöyle olur:

benim adım hmet
benim adım ahmet
benim adım aahmet
benim adım aaaaaahmet

grep komutuna argüman olarak verilen aranan metinin yalnızca başına konursa işe yarar. Anlamı şudur: bu karakter dizesini yalnızca satır başlarında ara. Şimdi dosya.txt dosyanızın içeriği şöyle değiştirin:

ahmet başta
ortada ahmet...
sonda ahmet

Şimdi şu komutu verelim:

grep ^ahmet dosya.txt

Bu komut sonucunda yalnızca ilk satır görüntülenir.
NOT: Şöyle bir komut istediğimiz aramanın yapılamamasına yol açar.

grep b^ahmet dosya.txt

^ işaretinin tam tersidir. Arama yalnızca satır sonlarında yapılır. Örnek:

grep ahmet$ dosya.txt

Bu komut sonucunda ekranda yalnızca son satır görüntülenir. Komutun işe yaraması için $ işareti aranan metnin sonuna konmalıdır.

İki tane ters slash işareti (\\) düzenli ifadeler bakımından anlamı olan özel karakterlerin ([ ] . * ^ $) düz metin olarak algılanmasını sağlar. Diyelim ki metin dosyanızda ahmet$ metnini aramak istiyorsunuz. Ancak aramanızı bu şekilde, olduğu gibi yaparsanız komut istemi sizin sonu ahmet ile biten satırları aramak istediğinizi düşünecektir. İşte bunu engellemek için bir özel karakter olan $'ın önüne iki tane ters slash koyup $ karakterinin normal karaktermiş gibi algılanmasını sağlarız. Örnek:

grep ahmet\\$ dosya.txt

Bu komutla "ahmet$"lar aranır.
NOT: Eğer \ işaretinin düz karakter olarak algılanmasını istiyorsanız önüne üç tane \ koyarsınız. Yani yan yana dört tane \ karakteri bir tane düz \ karakteri anlamına gelir.
NOT: Arama yaparken özel karakterleri özel bir anlama gelmeyecek şekilde kullanırsak (örneğin arama metninin ortasında ^ kullanırsak) ilgili özel karakter düz karakter olarak algılanır. Ancak istersek yine de \\ ile düz karakter olarak algılanmalarını sağlayabiliriz. Örnekler:

grep be^nim dosya.txt
grep ad$ı dosya.txt
grep *ben dosya.txt

NOT: Arama yaparken [ veya ] karakterlerinden sadece birini kullansak bile \\ ile düz karakter olarak algılattırmalıyız.
NOT: grep ile arama yaparken arama metnimizin başında $ bulunması gerekiyorsa bunun düz metin olarak algılanması için tek ters slash işareti kullanırız. Örnek:

grep \$benim dosya.txt

Bu komut sonucunda "$benim"ler aranır.

sed komutu metin dosyalarının içeriğini değiştirmek için kullanılır. grep komutunu anlatırken söylediğimiz her şey sed için de geçerlidir. Yani [] . * ^ $ ve \\ işaretleri grep ile kullanıldığı şekilde sed ile de kullanılır. Ancak sed komutunun kendine özgü kuralları da vardır. Örnek bir komut:

sed s/benim/senin/ dosya.txt

Bu komutla dosya.txt dosyasındaki "benim"ler "senin" olarak değiştirilir. Daha doğrusu değiştirilmişi ekrana yazılır, orijinal dosya değiştirilmez. Ancak orijinal dosyanın da değiştirilmesi daha önce görmüş olduğumuz komutlar sayesinde oldukça kolaydır:

sed s/benim/senin/ dosya.txt > dosya2.txt
rm dosya.txt
mv dosya2.txt dosya.txt

Burada ilk komutun çıktısını direkt olarak dosya.txt dosyasına yazamadık. Çünkü dosya.txt dosyası zaten komut isteminde kullanımda olduğundan o tür bir kullanım istemediğimiz sonuçlara yol açıyordu. Şimdi dosya.txt dosyanızın içeriğini şununla değiştirin:

benim adım hmet
benim adım ahmet
benim adım aahmet
benim adım aaaaaahmet

Şimdi şu komutu verin:

sed s/a*hmet/osman/ dosya.txt

Bu komutun çıktısı şöyle olur:

benim adım osman
benim adım osman
benim adım osman
benim adım osman

Şimdi dosya.txt dosyanızın içeriğini şununla değiştirin:

1. deneme deneme deneme
2. deneme deneme deneme
3. deneme deneme deneme
4. deneme deneme deneme
5. deneme deneme deneme

Şimdi şu komutu verin:

sed s/deneme/mustafa/ dosya.txt

Evet, bu komut sonucunda beklenmedik bir çıkış aldınız. sed komutu her satırdaki yalnızca ilk "deneme"yi değiştirdi. İşte bu sed komutunun bir özelliğidir. sed komutu belirtilen metinle eşleşen her satırdaki yalnızca ilk metni değiştirir. Ancak bu sınırlamayı aşmak mümkündür:

sed s/deneme/mustafa/g dosya.txt

Gelelim sed komutunun başka bir özelliğine. Diyelim ki metin dosyasındaki bütün "deneme"ler yerine sadece 5. satırdaki "deneme"leri değiştirmek istiyorsunuz. Bunu yapmak için:

sed /5/s/deneme/mustafa/g dosya.txt

Bu komut bilgisayara şunu der: Önce "5" metninin olduğu satır(lar)ı bul. Sonra, bu satır(lar)daki "deneme" ile eşleşen metinleri "mustafa" olarak değiştir. Şimdi aynı konuyla ilgili başka bir örnek yapalım. dosya.txt dosyamızın içeriği şöyle olsun:

aaadenemebbb
aaadenemccc
qwertyfrdsx
deneme e

Komutumuzda şöyle olsun:

sed /deneme/s/a/e/ dosya.txt

Bu komut, içinde "deneme" olan satırlardaki yalnızca ilk "a"ları "e" olarak değiştirecektir. İlk ve son satırlarda "deneme" var. Ama son satırda "deneme" olmasına karşın hiç "a" yok. Bu durumda komut sadece ilk satırda etkisini gösterecektir. Bir de şöyle bir komut girelim:

sed /deneme/s/e/a/ dosya.txt

Burada dikkatimizi çeken şey ön arama yapılan kelimedeki harfin değişmesi. Yani böyle bir şey olabiliyor. Şimdi sed komutunun başka güçlü bir özelliğine geçelim: sed komutuyla tek seferde birden fazla değiştirme işlemi yapabilirsiniz. Örnek:

sed -e s/deneme/mustafa/g -e s/ayşe/fatma/g dosya.txt

Bu komutla dosyadaki "deneme"ler mustafa olarak, "ayşe"ler fatma olarak değiştirilir. "-e"ler artırılarak aynı komutla ikiden de fazla değişiklik yapılması sağlanabilir.

& işareti sed komutuna özgü bir karakterdir. Bulunan metni temsil eder. Biliyorsunuz, düzenli ifadeleri kullandığımızda aramak için yazdığımız şey çıkan sonuçlardan farklı oluyor. Örneğin ".an"ı aramışsak "tan", "şan" vb. çıkıyor. Bunlar ".an"dan farklı şeyler. İşte & işareti buradaki tan, şan, ve benzerlerini temsil ediyor. Örneğin dosya.txt dosyamızın içeriği şöyle olsun:

mustafa yılmaz
ayşe matur
süleyman uysal
tuğçe kazakçı
yusuf fişek 

Şimdi biz burada her ismin başına "sayın" ifadesini getirmek istiyoruz. Bunu şimdiye kadar öğrendiğimiz bilgilerle yapamayız. Bunu ancak & işaretini kullanarak yaparız:

sed s/.*/"sayın "\&/ dosya.txt

Bu komutun çıktısı şöyle olur:

sayın mustafa yılmaz
sayın ayşe matur
sayın süleyman uysal
sayın tuğçe kazakçı
sayın yusuf fişek

NOT: sed komutuyla da tıpkı grep gibi birden fazla dosyayla çalışılabilir. Ancak komutun çıkışını tekrar her bir dosyaya geri göndermek pek mümkün olmadığı için çıktıları tek ve farklı bir dosyaya almak daha mantıklı olacaktır.

Şimdiye kadar grep ve sed komutlarını gördük. grep bulmaya, sed de bulup değiştirmeye yarıyordu. Ancak bu iki komutun birçok ortak yönleri vardı, ikisi de aynı mantığı kullanıyordu. Aralarındaki tek fark birisinin sadece aramaya yapması, birisinin de hem arama yapıp hem de değiştirmesiydi. Ancak şimdi göreceğimiz awk komutu bu iki komuttan tamamen farklı bir mantığa sahip. Şimdi dosya.txt dosyasının içeriğini şunlarla değiştirin:

benim adım osman, ya seninki ne
benimki de ayşe
memnun oldum
ben de memnun oldum

Şimdi şu komutu verelim:

a

Bu bölümde bir komutun sonucunu ekran yerine bir dosyaya yazma ve bir komuta argüman olarak bir metin dosyası vermektense başka bir komutun çıktısını vermeyi göreceğiz.

> işareti bir komutun sonucunu yeni oluşturulacak bir dosyaya yazmaya yarar. Örnek:

ls > dosya.txt

Bu komut aktif dizindeki dosya ve klasörleri yeni oluşturulacak dosya.txt dosyasına yazar. dosya.txt dosyası aktif klasörde oluşturulur. Başka bir örnek:

ls -lh ../Klasör > ../../dosya.txt

Bu komut da geçerlidir.
NOT: Eğer yaratılacak olan dosya isminde dosya varsa üzerine yazılır.

>> işaretinin > işaretinden tek farkı yeni dosya oluşturmaması, komut çıktısını var olan dosyanın sonuna eklemesidir.

> ve >> işaretleri normal çıktıyı basarken 2> ve 2>> işaretleri verilen komutun hata çıktısını basar. Örnek:

ls -z 2>dosya.txt   "ls: geçersiz seçenek -- z" hatasını dosya.txt dosyasına içeriği silerek yazar.
ls -z 2>>dosya.txt  "ls: geçersiz seçenek -- z" hatasını dosya.txt dosyasının son satırına ekler.

| işaretiyle bir komutun çıkışını başka bir komuta argüman olarak verebiliriz. Bu sayede dosya oluşturma işleminden kurtulmuş oluruz. Çünkü | işareti bir komutun sonucunun sanki bir metin dosyasının içeriğiymiş algılanmasını sağlar. Örnek:

ls Klasör | grep dosya

Bu komut "ls Klasör" komutunun çıktısında "dosya" kelimesini arayacak ve bulduğu satırları listeleyecektir. (ls komutunun çıktısındaki her dosya/klasör ismi bir satır olarak algılanır.)

Bu kısımda Linux komutları aracılığıyla metin dosyalarını görüntülemeyi ve metin dosyalarında arama yapmayı göreceğiz.

Bir metin dosyasının içeriğini komut satırında görmemizi sağlar. Örnek:

cat dosya.txt

Bu komut dosya.txt dosyasının içeriğini komut isteminde okuyabilmemizi sağlar.

more komutu cat ile aynı ile vazifelidir. Ancak more komutunun bir avantajı tek sayfada gösterilemeyecek olan dosyalar okunurken boşluk tuşu ile kaydırma olanağı sağlamasıdır.

Bir metin dosyasının ilk birkaç satırını görüntülemek için kullanılır. Örnek:

head dosya.txt

Bir metin dosyasının son birkaç satırını görüntülemek için kullanılır. Örnek:

tail dosya.txt

head ve tail komutları için varsayılan değer 10'dur. Ancak istenirse bu değer değiştirilebilir. Örnekler:

head -n 5 dosya.txt
tail -n 25 dosya.txt

Birinci örnekte dosyanın başından itibaren 5 satır görüntülenir. İkincisinde ise aynı dosyanın sonundan itibaren 25 satır görüntülenir. Eğer dosyanın satır sayısı belirtilen sayıdan az ise (veya sayı belirtilmediğinde 10'dan ise) dosyada olan kadar satır görüntülenir.

Metin dosyalarında arama yapmaya yarayan bir komuttur. Örnek:

grep metin dosya.txt

Bu komutla dosya.txt dosyasında "metin" metnini içeren bütün satırlar görüntülenir ve "metin" metinleri de renkli gösterilir. grep komutu ile istenirse aynı anda birden fazla dosyada da arama yapılabilir. Bu durumda her bulunan metnin satırının sol kısmında metinin hangi dosyada bulunduğu yazar. Örnek komut:

grep metin dosya1.txt dosya2.txt

Linux (telaffuz: Lin-uks), Unix’e fikirsel ve teknik anlamda atıfta bulunarak geliştirilmiş açık kaynak kodlu, özgür ve ücretsiz (destek hariç) bir işletim sistemi çekirdeğidir. Çekirdeğin kaynak kodları GNU Genel Kamu Lisansı çerçevesinde özgürce dağıtılabilir, değiştirilebilir ve kullanılabilir. Linux ismi ilk olarak Linus Torvalds tarafından yazılan ve 5 Ekim 1991 Linux 0.02 etiketiyle duyurusu yapılan, Linux çekirdeğinden gelmektedir. Linux'un Unix ile herhangi bir kod ortaklığı bulunmamaktadır yani Linux'un kodları sıfırdan başlanılarak yazılmıştır.
Çok geniş bir donanım desteğine sahip olan Linux çekirdeği; sunucu bilgisayarlar, masaüstü-dizüstü bilgisayarlar, iş istasyonları, akıllı telefonlar, yeni nesil TV'ler ve tabletler gibi hemen her platformda tam bir uyum içerisinde çalışabilmektedir. Linux sunucu işletim sistemlerinde kullanım oranı bakımından ilk sırada tercih edilmekte ve dünyanın 10 hızlı süperbilgisayarında da kullanılmaktadır.
Linux; işletim sistemi değildir, işletim sistemi çekirdeğidir. Linux çekirdeği, bu çekirdeği kullanan çeşitli "Linux dağıtımları" tarafından kullanıcıya tam teşekkülü bir işletim sistemi olarak sunulurlar. Bir Linux dağıtımı; Linux çekirdeği, GNU araçları, X pencere sistemi ve bir masaüstü ortamının bir araya gelmesiyle, bu birlikteliği sürdürülebilir şekilde yönetecek bir yapılandırma araçları seti, yazılım güncelleme araçları vb. ile oluşturulan bir tam teşekküllü bir işletim sistemini ifade eder.
Günümüzde Linux çekirdeğini kullanan işletim sistemleri büyük bir kitle tarafından genel olarak "Linux" adıyla anılmaktadır. Diğer yandan Özgür Yazılım Vakfı ve çeşitli özgür yazılım toplulukları, bir işletim sistemi olarak Linux'dan bahsederken, GNU araç ve yazılımlarını barındırıyor olması nedeniyle "GNU/Linux" tanımını kullanmaktadır.
Linux gelişimi açık bir şekilde yapılmaktadır. Bunun anlamı, işletim sisteminin her aşaması açık olarak Internet üzerinde yayınlanmakta, dünyanın dört bir yanında kullanıcılar tarafından test edilmekte, hataları ve eksiklikleri belirlenerek düzeltilmekte ve geliştirilmektedir. Zaman zaman bu deneme aşamaları belirli bir noktada durdurulur ve güvenilir bir işletim sistemi sunulup, geliştirme için ayrı bir seriye devam edilir. Hatalar, anında kullanıcılar tarafından belirlenip rapor edilmekte ve birçok kişinin katkısıyla düzeltilmektedir.
Açık kaynaklı bir işletim sistemidir.

a ∈ N+ olmak üzere 1'den a'ya kadar olan tam sayıların çarpımına a faktöriyel denir ve a! şeklinde gösterilir. 0!=1 kabul edilir.

              10
              !
            
            
              8
              !
            
          
        
      
    
    {\displaystyle {\frac {10!}{8!}}}
  
 işleminin sonucu kaçtır?

              (
              n
              −
              1
              )
              !
              ∗
              n
              −
              n
              !
            
            
              (
              n
              +
              1
              )
              !
              +
              n
              !
            
          
        
      
    
    {\displaystyle {\frac {(n-1)!*n-n!}{(n+1)!+n!}}}
  
 işleminin sonucu kaçtır?

              8
              !
              ∗
              9
              ∗
              10
            
            
              8
              !
            
          
        
      
    
    {\displaystyle {\frac {8!*9*10}{8!}}}
  
 = 9 · 10 = 90

(n-1)!*n=n!'dir. n!-n!=0'dır. Pay 0 olduğuna göre paydaya bakmadan sonucun 0 olduğunu söyleyebiliriz.

Gerçek sayılar kümesi Rasyonel (Doğal, Tam, Kesir, Üslü) ve İrrasyonel (Köklü, Pi sayısı) sayı kümelerinin birleşiminden oluşur.
N=Doğal Sayılar kümesi 
Z=Tam Sayılar kümesi 
Z+=Pozitif Tam Sayılar kümesi 
Q=Rasyonel (Oransal) Sayılar kümesi 
Q'=İrrasyonel Sayılar kümesi

Z+UZ-=Z ifadesi doğru mudur?

        42
        c
        3
        +
        37
        b
        a
        +
        2992
        =
        10993
      
    
    {\displaystyle 42c3+37ba+2992=10993}
  
 olduğuna göre 
  
    
      
        
          
            
              c
              +
              b
            
            a
          
        
      
    
    {\displaystyle {\frac {c+b}{a}}}
  
 kaçtır?

(6+35)+21/7=?

Hayır, çünkü Pozitif ve Negatif Tam Sayılar kümesine 0 dahil değildir.

        3
        +
        a
        +
        2
        =
        13
      
    
    {\displaystyle 3+a+2=13}
  
 

  
    
      
        c
        +
        b
        +
        9
        +
        1
        =
        19
      
    
    {\displaystyle c+b+9+1=19}
  
 

  
    
      
        a
        =
        8
      
    
    {\displaystyle a=8}
  
 

  
    
      
        c
        +
        b
        =
        9
      
    
    {\displaystyle c+b=9}
  
  

  
    
      
        
          
            9
            8
          
        
        =
        1
        ,
        125
      
    
    {\displaystyle {\frac {9}{8}}=1,125}
  

İşlem önceliği sırasına göre 
1. Üsler (6+35)+21/7=(6+243)+21/7 
2. Parantezler (6+243)+21/7=249+21/7 
3. Çarpma ve Bölme 249+21/7=249+3 
4. Toplama ve Çıkarma 249+3=252

Küme kelimesinin bir tanımı yoktur ama "Nesneler topluluğu" olarak bilinir. Küme konuları 4'e ayrılır.

Asal Sayılar kümesi sonsuz bir küme midir?

9 elemanlı bir kümenin 3, 4 ve 6 elemanlı alt küme sayılarının toplamı kaçtır?

Evet, çünkü doğal sayılar sonsuz olduğu için asal sayılar da sayı değerinin yüksek olmasına rağmen sonsuzdur.

              9
              !
            
            
              (
              9
              −
              3
              !
              )
              +
              3
              !
            
          
        
        +
        
          
            
              9
              !
            
            
              (
              9
              −
              4
              !
              )
              +
              4
              !
            
          
        
        +
        
          
            
              9
              !
            
            
              (
              9
              −
              6
              !
              )
              +
              6
              !
            
          
        
        =
        
          
            
              7
              ∗
              8
              ∗
              9
            
            6
          
        
        +
        
          
            
              6
              ∗
              7
              ∗
              8
              ∗
              9
            
            24
          
        
        +
        
          
            
              7
              ∗
              8
              ∗
              9
            
            6
          
        
        =
        84
        +
        126
        +
        84
        =
        294
      
    
    {\displaystyle {\frac {9!}{(9-3!)+3!}}+{\frac {9!}{(9-4!)+4!}}+{\frac {9!}{(9-6!)+6!}}={\frac {7*8*9}{6}}+{\frac {6*7*8*9}{24}}+{\frac {7*8*9}{6}}=84+126+84=294}
  

A,B ve C kümeleri evrensel kümenin 3 alt kümesidir.

s(A)=22
s(A')=46
s(B')=18
s(C)=37
s(A-B')≠0 ise A∩B∩C nin olası eleman sayıları kümesi kaç elemanlıdır?

A={x| x≥|-6| xɛR} 
B={x| x<22 x=2k xɛR} olduğuna göre A∩B ortak özellik yöntemiyle nasıl gösterilir.

s(E)=22+46=68
s(B)=68-18=50
A-B'=A∩B
A∩B en az 1, en fazla 50 olabilir. A∩B∩C ise en az 0 en fazla 37 olabilir. Bu durumda 38 farklı ihtimal vardır.

|-6|=6
A={7,8,9,10,...}
B={...,14,16,18,20,22}
A∩B={8,10,12,14,16,18,20,22}={x| 7>x<23 x=2k xɛR}

        (
        4
        x
        ,
        22
        )
        =
        (
        52
        ,
        5.5
        y
        )
      
    
    {\displaystyle (4x,22)=(52,5.5y)}
  
 olduğuna göre 
  
    
      
        
          
            x
            y
          
        
        =
        ?
      
    
    {\displaystyle {\frac {x}{y}}=?}
  

        A
        =
        
          1
          ,
          2
          ,
          3
          ,
          4
        
      
    
    {\displaystyle A={1,2,3,4}}
  
 ve 
  
    
      
        B
        =
        
          2
          ,
          3
          ,
          5
          ,
          7
        
      
    
    {\displaystyle B={2,3,5,7}}
  
 ise (AXB)∩(BXA)

        5
        ,
        5
        y
        =
        22
      
    
    {\displaystyle 5,5y=22}
  
 
  
    
      
        y
        =
        4
      
    
    {\displaystyle y=4}
  

  
    
      
        4
        x
        =
        52
      
    
    {\displaystyle 4x=52}
  
 
  
    
      
        x
        =
        13
      
    
    {\displaystyle x=13}
  

  
    
      
        
          
            13
            4
          
        
        =
        3
        ,
        25
      
    
    {\displaystyle {\frac {13}{4}}=3,25}
  

AXB={(1,2),(1,3),(1,5),(1,7),(2,2),(2,3),(2,5),(2,7),(3,2),(3,3),(3,5),(3,7),(4,2),(4,3),(4,5),(4,7)} 
BXA={(2,1),(3,1),(5,1),(7,1),(2,2),(3,2),(5,2),(7,2),(2,3),(3,3),(5,3),(7,3),(2,4),(3,4),(5,4),(7,4)} 
(AXB)∩(BXA)={(2,2),(3,2),(2,3),(3,3)}

47 kişilik bir turist kafilesi vardır. Bu turistlerden 15 kişi İngilizce, 22 kişi Almanca, 18 kişi Fransızca, 6 kişi İngilizce ve Almanca, 4 kişi İngilizce ve Fransızca ve 3 kişi Almanca ve Fransızca konuşmaktadır. Kaç kişi 3 dil birden konuşmaktadır.

s(A)+s(B)+s(C)-s(A∩B)-s(A∩C)-s(B∩C)+s(A∩B∩C)=s(AUBUC)  
  
    
      
        15
        +
        22
        +
        18
        −
        6
        −
        4
        −
        3
        +
        x
        =
        47
      
    
    {\displaystyle 15+22+18-6-4-3+x=47}
  
  
  
    
      
        x
        =
        5
      
    
    {\displaystyle x=5}

Birden fazla varlığın bir doğru üzerindeki belirli sayıdaki noktaya kaç farklı şekilde dizilebileceğini bulmak için yapılan işleme permütasyon denir. Permütasyon işlemi n ve r olmak üzere iki girdi alır. n varlık kümesinde kaç varlık olduğunu, r de varlıkları yerleştireceğimiz doğruda kaç tane yerleştirme noktası olduğunu belirtir.
Permütasyon = P(n,r) = 
  
    
      
        
          
            
              n
              !
            
            
              (
              n
              −
              r
              )
              !
            
          
        
      
    
    {\displaystyle {\frac {n!}{(n-r)!}}}
  
 dir.
Soruda her zaman açık olarak bu varlık kümesinden ve doğrudan bahsedilmez. Soruyu kafanızda bu şablona dönüştürmek analiz yeteneğinize kalmış.

8 kişilik bir gruptan bir başkan, bir başkan yardımcısı, bir de üye seçilecektir. Kaç farklı seçim yapılabilir?

A={1,2,3,4,5} kümesinin elemanlarıyla rakamları farklı üç basamaklı kaç sayı yazılabilir?

BEKİR kelimesindeki harflerin sırası değiştirilerek kaç farklı anlamlı ya da anlamsız kelime elde edilebilir?

Bir doğru üzerinde B, Y ve Ü olmak üzere üç nokta hayal edelim. Bir de 8 elemandan oluşan bir varlık kümesi hayal edelim. Soruda bu B, Y ve Ü noktalarına bu varlık kümesindeki varlıkların kaç değişik biçimde yerleştirilebileceği soruluyor aslında. O halde çözümümüz:
P(8,3) = 
  
    
      
        
          
            
              8
              !
            
            
              (
              8
              −
              3
              )
              !
            
          
        
      
    
    {\displaystyle {\frac {8!}{(8-3)!}}}
  
 = 
  
    
      
        
          
            
              8
              !
            
            
              5
              !
            
          
        
      
    
    {\displaystyle {\frac {8!}{5!}}}
  
 = 6*7*8 = 336

Elimizde 5 elemanlı bir varlık kümesi var ve bu varlıkları bir doğru üzerindeki üç noktaya yerleştireceğiz. O halde sorumuzun çözümü:
P(5,3) = 
  
    
      
        
          
            
              5
              !
            
            
              (
              5
              −
              3
              )
              !
            
          
        
      
    
    {\displaystyle {\frac {5!}{(5-3)!}}}
  
 = 
  
    
      
        
          
            
              5
              !
            
            
              2
              !
            
          
        
      
    
    {\displaystyle {\frac {5!}{2!}}}
  
 = 3*4*5 = 60

Bu soruda varlık kümemiz 5 elemanlı ve aynı zamanda doğrumuzda da 5 nokta var. O halde:
P(5,5) = 
  
    
      
        
          
            
              5
              !
            
            
              (
              5
              −
              5
              )
              !
            
          
        
      
    
    {\displaystyle {\frac {5!}{(5-5)!}}}
  
 = 5! = 1*2*3*4*5 = 120

a=324 b=4912  c=1258 a, b ve c'yi sıralayınız.

                3
                
                  9
                
              
              −
              
                3
                
                  3
                
              
              
                .3
                
                  5
                
              
            
            
              3
              
                9
              
            
          
        
        =
        ?
      
    
    {\displaystyle {\frac {3^{9}-3^{3}.3^{5}}{3^{9}}}=?}
  

4912=724 1258=524
724>524>324 b>c>a

                3
                
                  9
                
              
              −
              
                3
                
                  3
                
              
              
                .3
                
                  5
                
              
            
            
              3
              
                9
              
            
          
        
        =
        
          
            
              
                3
                
                  9
                
              
              −
              
                3
                
                  8
                
              
            
            
              3.3
              
                8
              
            
          
        
        =
        
          
            
              
                3.3
                
                  8
                
              
              −
              
                3
                
                  8
                
              
            
            
              3.3
              
                8
              
            
          
        
        =
        
          
            
              2.3
              
                8
              
            
            
              3.3
              
                8
              
            
          
        
        =
        
          
            2
            3
          
        
      
    
    {\displaystyle {\frac {3^{9}-3^{3}.3^{5}}{3^{9}}}={\frac {3^{9}-3^{8}}{3.3^{8}}}={\frac {3.3^{8}-3^{8}}{3.3^{8}}}={\frac {2.3^{8}}{3.3^{8}}}={\frac {2}{3}}}

500 ml süt
500 ml su
2-3 portakal ve limonun kabuğu (rendelenmemiş) + ince rendelenmiş 1 portakal ve limonun kabuğu
1 vanilya
40 gr tereyağı
200 gr irmik
220 gr toz şeker
4 yumurta
350 gr tatlı lor
Üstüne serpmek için pudra şekeri

Fırını 180 C'ye ısıtın. 20 cm’lik yuvarlak veya kare kek kalıbını yağlayın ve unlayın.
Süt ve suyu, rendelenmemiş limon ve portakal kabuklarını, tereyağı ve vanilya ile birlikte bir tencereye koyun.
Kaynatın ve irmiği yavaşça ekleyin ve karışım koyu ve pürüzsüz olana kadar 2-3 dakika boyunca sürekli olarak çırpın.
Bir kaseye aktarın, üstünü kapatın ve soğumaya bırakın.
Portakal ve limon kabuklarını çıkarın.
Ayrı bir kapta yumurtaları köpürene kadar şekerle çırpın .
Lor ekleyin ve iyice karıştırın.
Bu karışıma soğutulmuş irmik karışımını ekleyin.
İnce rendelenmiş kabuklarla birlikte iyice çırpın.
Hazırladığınız kalıbın içine dökün ve 60 dakika pişirin.
Yüzeyi biraz çatlayacak ve karakteristik bir desen oluşacak  ve ortası titrek kalacak.
Fırından çıkarın ve kalıp içinde tamamen soğutun.
Soğudukça hafifçe düzleşecek.
Üstüne pudra şekeri serpin.

MATLAB (matrix laboratory) genel olarak sayısal hesaplama özelde ise kuvvetli bir lineer cebir yazılımıdır ve  MathWorks firması tarafından 80'lerin ortasından bugüne kadar aktif olarak geliştirilmektedir. . MATLAB,  vektör/matris hesaplarının fazlaca program bilgisi gerektirmeden yapılmasına olanak sağlar. Fonksiyonların görselleştirilmesi, animasyonlar oluşturulması, programlama, sayısal modelleme, grafik arabirim tasarlama, C veya Fortran ile yazılmış programları MATLAB içinden kullanma, paralel hesaplama gibi daga birçok yeteneğe sahiptir. Zaman içinde MATLAB'a dahil edilmiş bir çok eklenti ile birlikte MATLAB bugün artık araştırmacıların kolay kolay vazgeçemediği hesaplama aracıdır.
Bu kitabı hazırlama amacımız MATLAB ile yeni tanışmış kullanıcılara tecrübelerimizi derli toplu olarak aktarabilmek ve bu vesile ile MATLAB'i etkin olarak kullanmanız yönünde faydalı olmak. Umarız kitap amacına ulaşır.

Matlab Mathworks şirketi tarafından geliştirilen ve sayısal çözümlemede sıkça kullanılan bir programdır. İlk başta kullanımı çok zor gelse de, biraz alıştırmayla istediğiniz çözümlemeleri rahatlıkla yapabilirsiniz. Matlab'ın zor yönü çok fazla komut olmasıdır. Bu yüzden yardım dosyalarına çok sık ihtiyacınız olacak.
Program yazarken yanınızda bir not defteri bulundurmanız iyi olur. Gerekli fonksiyonları not olarak tutarsanız zorluklar azalacaktır.
Devamını oku 

Matlab'ı ilk açtığınızda çıkan pencereye Command Window denmektedir. Burada temel işlemler gerçekleştirilir. Ama amacınız program yazmaksa (bunlara Matlab'da m-file denmektedir.) bunu script editorde yazmalısınız. Hemen bir örnekle başlayalım...
Devamını oku 

Bu bölümdeki bilgiler özellikle Matlab'da oluşabilecek genel sorunlar hakkındadır. Aşağıdaki kodları Command Window'da ve Script Editor'de denemeniz ve anlatılan bilgileri aklınızda tutmanız sizin için faydalı olacaktır.
Devamını oku

Matematik terminolojisi ile konuşacak olursak vektörler aslında tek satırlı veya tek sütünlu matrislerdir. Dolayısı ile vektörler matrislerin özel bir çeşidi olarak değerlendirebilir. MATLAB ortamında da aynı ilke geçerlidir. Tek boyutlu olmasının dışında vektörlerin matrislerden bir farkı yoktur. Dolayısı ile vektör dediğimiz veri yapıları aslında bir matristir ve matrisler için geçerli olan uygulamalar vektörler için de geçerlidir.
Devamını oku

Grafik konularını anlatmanın en iyi yöntemi bence bol bol örnek vermek. İste size bazı örnek uygulamalar:
Devamını oku

Devamını oku

Matlab Dersleri PDF dosyası
Wikibooks İngilizce'den çeviri

MPlayer, sloganı "The Movie Player" ("Film Oynatıcı") olan bir medya oynatıcıdır. Resmi sitesi http://www.mplayerhq.hu dur.
Özgür bir yazılım olan MPlayer'ı, Özgür Yazılım Vakfı tarafından yayınlanan GNU Genel Kamu Lisansı (versiyon 2) şartları altında dağıtabilir ve/veya düzenleyebilirsiniz. MPlayer yararlı olması umuduyla dağıtılmakta ancak dağıtılırken satın alınabilirliğin ve belirli bir amaca uygunluğun sunduğu üstü kapalı garantiler de dahil olmak üzere hiçbir garanti verilmemektedir. Daha fazla ayrıntı için GNU Genel Kamu Lisansı'na bakınız. Mplayer'la birlikte GNU Genel Kamu Lisansı'nın bir kopyasını almış olmalısınız. Eğer almamışsanız "Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA" adresine yazın.

Bu kitabı nasıl okumalı
Giriş
Kurulum
Yazılım gereksinimleri
Özellikler
Grafik arayüz
Fontlar ve OSD
Kodek kurulumları
RTC
Kullanım
Komut satırı
Altyazılar ve OSD
Denetim
Ağdan akış veya veriyolları
DVD çalma
VCD çalma
Değişiklik Karar Listeleri (EDL)
Bir ağ üzerinde senkronize edilmiş çalma
Surround - Çok kanallı çalma
Kanal düzenleme
Yazılım ses ayarı
TV girişi
Teletext
Radyo
Video çıktı aygıtları
Xv
DGA
SVGAlib
Framebuffer çıktısı (FBdev)
Matrox framebuffer (mga_vid)
3Dfx YUV desteği
tdfx_vid
OpenGL çıktısı
AAlib – metin modu görüntüleme
libcaca – Renkli ASCII Sanatı kütüphanesi
VESA - VESA BIOS'a çıktı
X11
VIDIX
DirectFB
DirectFB/Matrox (dfbmga)
MPEG çözücüleri
Zr
Blinkenlights
TV-out desteği
Portlar
Linux
BSD
Ticari Unix
Windows
Mac OS
MEncoder'ın temel kullanımı
Kodek ve kap formatlarını seçme
Girdi dosyasını veya aygıtını seçme
Çift geçiş MPEG-4 ("DivX") kodlama
Sony PSP video formatına kodlama
MPEG formatına kodlama
Videoların ölçüsünü değiştirme
Akım kopyalama
Çoklu resim dosyalarını (JPEG, PNG, TGA, vb.) girdi alıp kodlama
DVD altyazılarını VOBsub dosyasına çıkarma
En-boy oranını koruma
MEncoder ile kodlama
DVD filminden yüksek kaliteli MPEG-4 ("DivX") elde etme
NTSC DVD'lerdeki telecine ve interlace ile uğraşma
libavcodec kodek ailesiyle kodlama
Xvid kodeğiyle kodlama
x264 kodeğiyle kodlama
Video for Windows kodek ailesiyle kodlama
MEncoder ile QuickTime uyumlu dosyalar oluşturma
MEncoder ile VCD/SVCD/DVD uyumlu dosyalar oluşturma
Sık Sorulan Sorular
Hataları bildirme
Güvenlikle alakalı hataları bildirme
Hataları düzeltme
Subversion'u kullanarak tekrar test yapma
Hataları bildirme
Hatalar nereye bildirilmeli
Neler bildirilmeli
Ne yaptığımı biliyorum...
MPlayer kabuk formatı
Tanıtım
Kabuk dosyası
Fontlar
Grafik arayüz iletileri
Kaliteli kabuklar oluşturma

MPlayer'ı başlatmak oldukça basittir. MPlayer'ı başlatmak için komut satırında aşağıdaki komutu verin:

mplayer <dosya adı>

Eğer MPlayer'a ulaşılamıyorsa yolu tam olarak belirtmeniz gerekebilir:

/usr/bin/mplayer <dosyanın yolu>

veya Windows kullanıyorsanız

C:\Program Files\mplayer\mplayer.exe <dosyanın yolu>

Ayrıca GMPlayer'ı kullanarak MPlayer'a görsel olarak erişebilirsiniz. GMPlayer'ı açtığınızda iki pencere açılır:

Görüntüleme penceresi - buradan DVD'ler/videolar çalınır.
Kontrol penceresi - buradan MPlayer'ın en sık kullanılan komutlarını tek tıklamayla çalıştırırsınız.
Herhangi bir dosyayı çalmak için görüntüleme penceresinde herhangi bir yeri sağ tıklayın, açılan menüden "Open"ın üzerine gelin ve açılan alt menüden "Play file"ı tıklayın. Ekrana bir dosya açma penceresi gelecektir. Varsayılan durumda bu dosya açma penceresinde sadece videolar gözükür, çünkü pencerenin aşağısındaki tür filtresi varsayılan durumda "Video files" olarak ayarlıdır. Bu pencerede ses dosyalarını da göstermek için dosya türü seçicisinin sağ ucundaki aşağı bakan oka tıklayıp açılan listenin en altındaki "All files"ı seçin. Sonra bu pencerede istediğiniz dosyayı seçin ve "OK" düğmesine tıklayın. Dosya çalınmaya başlayacaktır.
Windows komut satırı (grafik arayüz yok):
En kolay yol temel MPlayer paket ve kodeklerini MPlayer'ın ana sitesinden indirmektir (isminde GUI olan hiçbir şeyi indirmeyin). İndirdiğiniz sıkıştırılmış dosyanın içeriğini istediğiniz bir klasöre çıkarın. Sonra izlemek istediğiniz videoyu sağ tıklayıp "Birlikte Aç"ın üzerine gelip "Program seç"i tıklayın. Açılan pencerede az önceki sıkıştırılmış dosyanın içeriğini çıkardığınız klasöre gidin, MPlayer'ı seçin ve ilgili video dosyasını her çift tıklayışınızda MPlayer'ın açılması için "Bu tür dosyaları açmak için her zaman seçili programı kullan" onay kutusunu işaretleyin.
Eğer sorunla karşılaşırsanız sorunun ne olduğunu anlamak için mplayer'ı Windows komut satırı ile çalıştırın. Dosyayı komut satırına sürükleyip bırakırsanız ilgili dosyanın adı komut satırında çıkacaktır, bu sayede dosyanın adını ve yolunu tam olarak yazmak zorunda kalmayacaksınız. Komut satırında mplayer'ın bütün fonksiyonlarını kullanabilirsiniz.
(adjust content locations and continue cleanup from here -- kokushibyou).
This shows a file that starts properly; there are some errors (no subtitle fonts, which is easily fixed if required) and other interesting feedback you might be interested in.

(and movie launches in its own window, with the cmd window in the background).

GMplayer's menus allow access to your CD/DVD drive for playing most on disk video files. On the command prompt you can simply refer to the DVD:// device or if you have an image of a disk on your hard drive you can use the BIN:// or ISO:// devices.
A win32 example is mplayer -dvd-device e: dvd://1 (for title 1).
If the disk does not play, then the system may not have a CDDA extractor such as cdparanoia, or MPlayer was not compiled from source with the correct option enabled.  The CDDA extractor is only needed at compile time.

In most cases mplayer will automatically recognize the video's format and the environment it is running in. It will then show the video as best it can. If you are running a graphical interface (XWindow, MS Windows) you may wish to start MPlayer's GUI. This can also be started at a command line or from your desktop's "Run file" option or via its menu system. In all cases above the command is; gmplayer.
If you start running into issues with trying to determine why video/sound isn't working, try a few of the following things:

Try running mplayer command-line only - your prompt will usually output good information about errors.
Be sure you have the full codec pack from http://www.mplayerhq.hu ; or any other codec packs that aren't included there (pretty much everything you'd ever need is already available on their site).

Keyboard shortcuts for MPlayer include:

q = quit
r = sub position -
t = sub position +y
T = enable/disable stay on top mode
y = sub delay reset to 0
o/O = toggle on-screen display (enabled, disabled, time lapsed, time lapsed/remaining)
p = play/pause
[ = speed -10%
] = speed +10%
{ = speed x 1/2
} = speed x 2
a = sub alignment
d = toggle framedropping (on, hard, off)
f = toggle full-screen
j = toggle subtitle (off, language 1, language 2, etc...)
l = load file to playlist (GUI only)
z = sub delay -
x = sub delay +
c = skin browser
v = enable/disable subtitles
b = toggle subtitle (off, language 1, language 2, etc...)
m = mute on/off
/ = volume down,
0 = play
. = frame advance
1 = contrast -
2 = contrast +
3 = brightness -
4 = brightness +
5 = tint - (green)
6 = tint + (red)
7 = color -
8 = color +
/ = volume -
* = volume +
- = audio-video delay -
+ = audio-video delay +
up = forward 1 minute
down = back 1 minute
left = rewind
right = fast forward
home = beginning
end = end
pg up = forward 10 mins
pg dn = back 10 mins
# = toggle audio

Mplayer has a freely configurable OSD menu. Unfortunately it is not well documented (or rather, not at all...). The following is an example menu.conf (to be put in ~/.mplayer on GNU/Linux systems):

 <keybindings name="default">
    <binding key="UP" cmd="menu up" />
    <binding key="DOWN" cmd="menu down" />
    <binding key="LEFT" cmd="menu left" />
    <binding key="RIGHT" cmd="menu right" />
    <binding key="ENTER" cmd="menu ok" />
    <binding key="ESC" cmd="menu cancel" />
    <binding key="HOME" cmd="menu home" />
    <binding key="END" cmd="menu end" />
    <binding key="PGUP" cmd="menu pageup" />
    <binding key="PGDWN" cmd="menu pagedown" />
    <binding key="JOY_UP" cmd="menu up" />
    <binding key="JOY_DOWN" cmd="menu down" />
    <binding key="JOY_LEFT" cmd="menu left" />
    <binding key="JOY_RIGHT" cmd="menu right" />
    <binding key="JOY_BTN0" cmd="menu ok" />
    <binding key="JOY_BTN1" cmd="menu cancel" />
    <binding key="AR_VUP" cmd="menu up" />
    <binding key="AR_VDOWN" cmd="menu down" />
    <binding key="AR_PREV" cmd="menu left" />
    <binding key="AR_NEXT" cmd="menu right" />
    <binding key="AR_PLAY" cmd="menu ok" />
    <binding key="AR_MENU" cmd="menu cancel" />
    <binding key="AR_PREV_HOLD" cmd="menu home" />
    <binding key="AR_NEXT_HOLD" cmd="menu end" />
    <binding key="MOUSE_BTN3" cmd="menu up" />
    <binding key="MOUSE_BTN4" cmd="menu up" />
    <binding key="MOUSE_BTN0" cmd="menu click" />
    <binding key="MOUSE_BTN2" cmd="menu cancel" />
 </keybindings>
 <keybindings name="list" parent="default">
    <binding key="AR_PREV" cmd="menu pageup" />
    <binding key="AR_NEXT" cmd="menu pagedown" />
 </keybindings>
 <keybindings name="filesel" parent="list">
    <binding key="BS" cmd="menu left" />
 </keybindings>
 <keybindings name="chapsel" parent="list" />
 <keybindings name="cmdlist" parent="list">
    <binding key="AR_PREV" cmd="menu left" />
    <binding key="AR_NEXT" cmd="menu right" />
 </keybindings>
 <keybindings name="txt" parent="list" />
 <keybindings name="pt" parent="list" />
 <keybindings name="pref" parent="list">
    <binding key="AR_PREV" cmd="menu left" />
    <binding key="AR_NEXT" cmd="menu right" />
    <binding key="AR_PREV_HOLD" cmd="menu left" />
    <binding key="AR_NEXT_HOLD" cmd="menu right" />
 </keybindings>
 <filesel name="open_file"/>
 <filesel name="open_list" file-action="loadlist '%p'" auto-close="yes"
         title="Open a playlist: %p"
         filter="/etc/mplayer/extensions_filter"
         actions="d:run 'mp_loader \'%p\' d',c:run 'mp_loader \'%p\' c'" />
 <chapsel name="select_chapter" />
 <pt name="jump_to"/>
 <console name="console0" height="80" vspace="0">Welcome to MPlayer</console>
 <txt name="man" file="manpage.txt"/>
 <pref name="general_pref" title="General">
      <e property="osdlevel" name="OSD level"/>
      <e property="speed" name="Speed"/>
      <e property="loop" name="Loop"/>
 </pref>
 <pref name="demuxer_pref" title="Demuxer">
 </pref>
 <pref name="osd_sub_pref" title="Subtitles">
      <e property="sub" name="Subtitles"/>
      <e property="sub_visibility" name="Visibility"/>
      <e property="sub_forced_only" name="Forced sub only"/>
      <e property="sub_alignment" name="Alignment"/>   
      <e property="sub_pos" name="Position"/>
      <e property="sub_delay" name="Delay"/>
      <e property="sub_scale" name="Scale"/>
 </pref>
 <pref name="audio_pref" title="Audio">
      <e property="volume" name="Volume"/>
      <e property="balance" name="Balance"/>
      <e property="mute" name="Mute"/>
      <e property="audio_delay" name="Delay"/>
 </pref>
 <pref name="colors_pref" title="Colors">
      <e property="gamma" name="Gamma"/>
      <e property="brightness" name="Brightness"/>
      <e property="contrast" name="Contrast"/>
      <e property="saturation" name="Saturation"/>
      <e property="hue" name="Hue"/>
 </pref>
 <pref name="video_pref" title="Video">
      <e property="fullscreen" name="Fullscreen"/>
      <e property="panscan" name="Panscan"/>
      <menu menu="colors_pref" name="Colors ..."/>
      <e property="ontop" name="Always on top"/>
      <e property="rootwin" name="Root window"/>
      <e property="framedropping" name="Frame dropping"/>
      <e property="vsync" name="VSync"/>
 </pref>
 <cmdlist name="pref_main" title="Preferences" ptr="<>" >
    <e name="General ..." ok="set_menu general_pref"/>
    <e name="Audio ..." ok="set_menu audio_pref"/>
    <e name="Video ..." ok="set_menu video_pref"/>
    <e name="Subtitles ..." ok="set_menu osd_sub_pref"/>
    <e name="Back" ok="menu cancel"/>
 </cmdlist>
 <pref name="properties" title="Stream Properties">
      <e txt="${filename}" name="Name"/>
      <e txt="${video_format}" name="Video Codec"/>
      <e txt="${video_bitrate}" name="Video Bitrate"/>
      <e txt="${width} x ${height}" name="Resolution"/>
      <e txt="${audio_codec}" name="Audio Codec"/>
      <e txt="${audio_bitrate}" name="Audio Bitrate"/>
      <e txt="${samplerate}, ${channels}" name="Audio Samples"/>
      <e tx

MPlayer, Linux için bir video oynatıcıdır (diğer birçok Unix'te ve x86 olmayan işlemcide de çalışabilir, portlara bakın). MPlayer; MPEG, VOB, AVI, Ogg/OGM, VIVO, ASF/WMA/WMV, QT/MOV/MP4, FLI, RM, NuppelVideo, yuv4mpeg, FILM, RoQ, PVA ve Matroska dosyalarının çoğunu, desteklenen XAnim, RealPlayer, Win32 DLL kodekleriyle ve kendi birçok yerel kodeğiyle oynatabilir. Ayurıca MPlayer ile Video CD, SVCD, DVD, 3ivx, RealMedia, Sorenson, Theora ve MPEG-4 (DivX) videolarını da oynatabilirsiniz. MPlayer'ın başka bir önemli özelliği ise desteklenen çok sayıda çıktı sürücüsüdür. MPlayer; X11, Xv, DGA, OpenGL, SVGAlib, fbdev, AAlib, libcaca, DirectFB, GGI ve SDL (ve dolayısıyla bütün sürücüleri) ve bazı düşük seviye karta özgü sürücüler (Matrox, 3Dfx ve Radeon, Mach64, Permedia3) ile çalışabilir. Bu sürücülerin çoğu yazılım ve donanım ölçeklemesini desteklerler, dolayısıyla videoları tam ekranda oynatabilirsiniz. MPlayer, DVB ve DXR3/Hollywood+ gibi bazı donanımsal MPEG çözme kartlarını kullanarak görüntülemeyi destekler. MPlayer'ın başka bir güzel özelliği ise gölgelendirilmiş ve yumuşatılmış altyazılardır. Altyazılarda; Avrupa/ISO 8859-1,2 (Macarca, İngilizce, Çekçe, vb.) Kiril, Kore fontları ile 14 tip alyazı desteklenir. Ayrıca OSD (onscreen display) de MPlayer'ın önemli özelliklerinden biridir.
MPlayer, hasarlı MPEG dosyalarını çalmakta son derece başarılıdır (bu özellik bazı VCD'lerin oynatılmasında faydalı olmaktadır.) MPlayer ayrıca Windows Media Player'ın oynatamadığı kötü AVI dosyalarını da oynatabilmektedir. İndeks kısmı olmayan AVI dosyaları bile MPlayer'la oynatılabilmektedir. Söz konusu AVI dosyalarının indekslerini geçici olarak -idx seçeneğiyle veya kalıcı olarak MEncoder ile oluşturabilirsiniz, bu sayede video içinde dolaşabileceksiniz. Gördüğünüz üzere kararlılık ve kalite çok önemlidir, ancak hız da ayrıca müthiştir. MPlayer'ın ayrıca video ve ses düzenleme için güçlü bir filtre sistemi vardır.
MEncoder (MPlayer'ın video kodlayıcısı), MPlayer'ın oynatabildiği AVI/ASF/OGG/DVD/VCD/VOB/MPG/MOV/VIV/FLI/RM/NUV/NET/PVA dosyalarını diğer MPlayer'ın oynatabildiği formatlara (aşağıya bakın) dönüştürebilmek amacıyla tasarlanmış basit bir video kodlayıcısıdır. MEncoder, MPEG-4 (DivX4) (tek veya çift geçiş), libavcodec, PCM/MP3/VBR MP3 sesi gibi çeşitli kodeklerle kodlama yapabilir.

MPlayer'ın dosya formatları ve çözücülerinin çoğundan kodlama
FFmpeg'in libavcodec kodeklerinin tamamına kodlama
V4L uyumlu TV alıcılarından kodlama
Düzgün indeks ile interleaved AVI'ye kodlama/katıştırma
Harici ses akımından dosya oluşturma
1, 2 veya 3 geçişle kodlama
VBR MP3 sesi
PCM sesi
Akım kopyalama
Girdi ses/video senkronizasyonu (pts tabanlı, -mc 0 seçeneğiyle pasifleştirilebilir)
-ofps seçeneğiyle fps düzeltme (30000/1001 fps VOB'u 24000/1001 fps AVI'ye kodlarken faydalı)
Güçlü filtre sistemi kullanımı (kırpma, büyütme, ters çevirme, artişleme (postprocessing), döndürme, ölçekleme, RGB/YUV dönüşümü)
DVD/VOBsub ve metin altyazıları çıktı dosyasına kodlama
DVD altyazılarını VOBsub formatına ripleme
MPlayer ve MEncoder GNU Genel Kamu Lisansı, Versiyon 2 şartları altında dağıtılmaktadır.

Macarca dilini öğrenmeye geçmeden önce, bu dilin alfabesini bilmeniz gerekir. Macar alfabesinde 44 harf mevcuttur.
██ Sesli harfler

Yukarıda verilen sessiz harflerin okunuşları, ilgili harfin tek başına okunuşlarıdır. Yani harf, sözcük içinde değil de tek başına ise "a" sesi ile birlikte okunur. (Fakat yukarıdaki tabloda bulunan seslendirmeler a değil e getirilerek seslendirilmiştir.)  Türkçede de bu böyledir. Örneğin Türkçede "b" harfi tek başına olduğunda "be" şeklinde okunur. Fakat sözcük içerisinde sadece harfin verdiği ses okunur. Örnek verilecek olursa "baba" kelimesinde sadece "b" harfinin verdiği ses söylenir, yanında "e" sesi çıkmaz. Macarcada da örneğin "c" harfi tek başına bulunduğunda "tsa" şeklinde okunur. Fakat Macarca Kıbrıs anlamına gelen "Ciprus" kelimesi, "tsipruş" şeklinde okunur. Görüldüğü gibi "c" harfi sözcük içinde sadece kendi sesi olan "ts"yi vermiştir. Ayrıca bu kural sadece sessiz harfler için geçerlidir. Özetlenecek olursa;
Ciprus -> c (ts) + i (i) + p (p) + r (r) + u (u) + s (ş) = tsipruş
Birkaç kelime okunuşuna örnek,
asztal (masa, sehpa) -> ostol şeklinde
csiga (salyangoz) -> çigo şeklinde
elefánt (fil) -> elefant şeklinde  ( (yardım·bilgi))
győz (zafer) -> dyöz şeklinde
kutya (köpek) -> kutyo şeklinde
nyár (yaz) -> nyar şeklinde ( (yardım·bilgi))
rózsa (gül) -> roja şeklinde okunur. ( (yardım·bilgi))
Ayrıca harfler kullanılırken dikkat etmek gerekir. Örneğin fogas ( (yardım·bilgi)) kelimesi askı anlamına gelirken fogás ( (yardım·bilgi)) kelimesi yemek anlamındadır. Oysaki iki kelime arasında sadece "a" harfinin üzerinde bulunan çizgi farkı vardır.

Ünlü uyumu, Macarcanın en önemli konularından biridir ve kesinlikle öğrenilmeden diğer bölümlere geçilmemelidir. Macarcada sözcükler arka sesli ve ön sesli olmak üzere ikiye ayrılmaktadır.

Arka sesliler: a, á, o, ó, u, ú
Ön sesliler: e, é, i, í, ö, ő, ü, ű
Düz: e, é, i, í
Yuvarlak: ö, ő, ü, ű
Harfleri akılda tutmak için bir ipucu, arka seslilerin harflerinin tümü Uzak Doğu kelimesinde bulunmaktadır. Ayrıca arka sesliler Türkçedeki kalın seslilere, ön sesliler de Türkçedeki ince seslilere benzemektedir.
Macarcada, sözcükler ya ön sesli ya arka sesli içermektedir. Eğer bir sözcük sadece arka veya ön sesli içeriyorsa, gelen ek de buna uygun olan ek olmalıdır. Fakat, bazı sözcükler hem ön sesli hem de arka sesli içermektedir. Bu durumda ön sesli, kesinlikle düzdür. Örneğin elefánt sözcüğünde arka sesli olan á'nın yanında e de bulunmaktadır. Yukarıda görüldüğü gibi, e düz ön seslidir. Fakat birleşik sözcükler için bu durum geçerli değildir.

Bazı yerlerde yanlışlar/eksiklikler bulunmaktadır. Ayrıntılı ve doğru bilgi için şu (İngilizce) Wikipedia sayfasına göz atınız: Hungarian Phonology

10'dan sonraki rakamlar, aynı Türkçedeki gibi onlu sayının devamına bir basamaklı sayıların gelmesiyle yapılır (Örneğin Türkçede de kırk + beş = kırkbeş). Fakat sadece onlu ve yirmili sayılarda istisnai durum vardır.
On rakamının karşılığı olan tíz kelimesin sonuna bir basamaklı sayılar getirilirken tíz kısalıp tiz olur. Bir basamaklı sayı ile de arasına en gelir. (Örneğin 15 - tizenöt)
Yirmi rakamının karşılığı olan húsz kelimesin sonuna bir basamaklı sayılar getirilirken húsz kısalıp husz olur. Bir basamaklı sayı ile de arasına on gelir. (Örneğin 24 - huszonnégy)
Ünlü uyumu bölümünde de demiştik, ekler bir sözcüğün ünlü durumuna göre gelir. Macarcada 10 ve 20 harici diğer onlu sayılar, kendisinin bir basamaklı karşılığına -van veya -ven getirilerek yapılır. Şöyle ki;
négy, öt, hét ve kilenc, ön sesli içerdikleri için -ven eki alır.
hat ve nyolc, arka sesli içerdikleri için -van eki alır.
Yüzlü sayılar, aynı Türkçe gibi 100 kelimesi olan száz'ın önüne bir basamaklı sayılar getirilerek yapılır (200 = kétszáz, 2'nin ikinci şekliyle yapılır). Şöyledir;
három (üç) + száz (yüz) = háromszáz (300)
Binli sayılar, aynı Türkçe gibi 1000 kelimesi olan ezer'in önüne bir basamaklı sayılar getirilerek yapılır. Şöyledir;
két (iki) + ezer (bin) = kétezer  (2000)
kétszáz (iki yüz) + hatvan (altmış) + öt (beş) + ezer (bin) = kétszázhatvanötezer (265 000)

Üdvözlünk a magyar oldalon! A magyar nyelvet körülbelül 10 millió ember beszéli Magyarországon, és megközelítőleg 3 millióan más országokban, mint Románia, Ukrajna, Csechoszlovákia, Jugoszlavija, Ausztria, számos egyéb európai országban, valamint az Egyesült Államokban.
Az első és második világháború után, majd az 1956-os forradalom és szabadságharc után nagyon sok magyar emigrált, így a nyugati világ majd' minden szegletébe elkerült a magyar nyelv.
Sajnos, mint sok más "kisebbségi" nyelvet, a Trianon utáni országokban a magyar nyelvet is üldözték, mint például Romániában (Erdélyben).
Annak ellenére, hogy ezt a nyelvet egy viszonylagos kisebbség beszéli Európában, fantasztikus dolog megtanulni, mivel lényegesen különbözik minden más nyelvtől, így például a magyar irodalom is kivételes élményt képes nyújtani. A nyelv szavait, hangzását olyan szerzők is használták, mint Anne McCaffrey és J.R.R. Tolkien.
A magyar nyelv ugyanazon nyelvcsaládba tartozik, mint a finn és az észt, de e két utóbbi jobban hasonlít egymásra, mint (bármelyikük) a magyarra. Legfeljebb néhány szó hangzása hasonló.

Macarca, Macaristan'da yaklaşık 10 milyon kadar kişi tarafından ve eski Macar toprakları olan Romanya, Ukrayna, Slovakya, Sırbistan, Slovenya, Avusturya ile diğer Avrupa devletleri ve ayrıca Kanada ile Birleşik Devletler'de yaklaşık 3 milyon kadar kişi tarafından konuşulmaktadır.
Birinci ve İkinci Dünya Savaşı'ndan sonra gerçekleşen Macarların göçü ve 1956 yılının Ekim ve Kasım aylarındaki iç savaş, Macarca'yı batıya savurmuştur. Maalesef diğer azınlık dilleri gibi Macarca, Romanya gibi Triyanon antlaşması ile kurulan devletler içerisinde sindirilmiştir.
Her ne kadar Macarca, Avrupa'da akraba azınlıklarca kullanılsa da, Macarca öğrenilebilecek harika bir dil olabilir; o eşsizdir, dünyadaki diğer dillerden tamamen farklıdır. Bu yüzden Macar edebiyatı gerçekten kuraldışı olup çevirisi zordur. Bununla birlikte, kelime dağarcığı ve sesleri Anne McCaffrey ve J.R.R. Tolkien gibi yazarlarca kullanılmıştır.
Dilbilgisi açısından bakıldığında Fince ve Estonca'ya yakındır, fakat bu dillerin birbirleri ile olan yakınlığı Macarca ile olandan fazladır ve birkaç benzer sözcük hâlâ olduğu gibi durmaktadır.

Türkçe: Çince Vikikitap'a hoşgeldiniz. Bu kitapta Çince konuşmak, yazmak ve okumak için gereken her şeyi bulacaksınız. Bu bir ortak çalışmanın eseridir, bu yüzden lütfen, amacınız yalnızca yanlışları düzeltmek bile olsa katılmaktan çekinmeyin!
中文: 欢迎国语维基. 在这本书中您可以找到所有你需要知道为了发言 书写和阅读汉语语言. 这是一个合作努力,所以请放心贡献什么,甚至只订出错误.
Pīnyīn: Huān yíng guó yŭ wéi jī. Zài zhèi bĕn shū zhòng nín kĕ yĭ zhăo dào sŭo yŏu nĭ xū yào zhī dào wéi liăo fà yán shū xĭe húo yùe dóu hàn yŭ yù yán. Zhèi shì yī gĕ hé zuō náo lì, sŭo yĭ qĭng fàng xìn gòng xìan shén ma, shén zhì zhĭ dìng chū cùo wù.

Mandarin hakkında中文是什么？ 
Bu kitap nasıl kullanılır如何使用这本教科书 
Mandarin nasıl öğrenilir如何学习中文 
Çince nasıl yazılır如何用中文写作  

Temel Pinyin Telaffuzu
Ton Kullanışı

Merhaba!你好！
Bugün meşgul musunuz?今天你忙不忙?
Cüzlere bir tanıtım助词
Cümle düzeni ve fiiller词序和动词
Sınıflayıcı kelimeler量词
Soru kelimeleri hakkında daha fazla bilgi疑问助词
Bu nedir?这是什么?
Benim adım Wang Ming我叫王明

Mandarin-Türkçe Sözlüğü
Türkçe-Mandarin Sözlüğü
Gramer İndeksi

Bu kitap sizin hiç sabık Çince bilginiz olmadığınızı ama aynı anda Çince'yi gerçekten öğrenmek istediğinizi varsayıyor. Her derste evvelki derslerinde öğrendiğinizi geliştirip, azar azar hem yeni kelimeler hem de yeni gramer öğrenirsiniz.
Her ders bir haftalığın günlük dersleri olarak yeterlidir, buna rağmen kendinizi her dersteki maddeden bunalmış hissetmeyin. Yeni karakterleri öğrenmek büyük ihtimalle sizin sınırlayıcı faktörünüz olacak, onun için bir dersin karakterlerini hatırlamasına iki veya üç gün üzerinde öğren ve ders zamanını çoğunlukla gramer ve konuşma ilgili çalışmalar yapıp kullan.

Her ders beş tane bölüme bölünmüştür:

Diyalog. Bu bölümde iki veya iki kişiden daha arası bir muhabbet görülür. Her metin dört versiyonda veriliyorlar: Basitleştirilmiş Çince, Geleneksel Çince, Hanyu Pinyin, ve bir Türkçe tercümesi.
Gramer. Bu bölüm diyalogdaki tanıtılan her yeni cümle yapısını anlatıyor ve bu yeni bilgileri sağlamlaştırmak için örnekler gösteriyor.
Kelimeler. Bu bölüm dersteki yeni kelimeleri, tercüme ve telaffüz ile, veriyor. Her yeni tanıtılan karakter çizme sırasını gösteren bir resmiye veya animasyona bağlanır.
Örnekler. Bu bölüm dersteki maddeki cümlelerle ve ibarelerle ilgili daha örnek veriyor.
Alıştırmalar. Bu bölüm maddeden anladığınızı test edip sorular ve aktiviteler veriyor. Bunlar ödev veya revizyon olarak kullanılabilirler.

Mandarince, Çin Halk Cumhuriyeti ve Tayvan gibi Asya ülkelerinde konuşulan Pekin lehçesidir. Günümüzde dünyanın %20'si bu dili ana dili olarak konuşmaktadır.

Çince dili (汉语/漢語, 华语/華語 veya 中文) Sino-Tibet dil ailesinden. Dünyanın %20'si ana dil olarak bir biçim Çince konuşuyorlar, yani Çince, ana dil olarak, dünyanın en çok konuşan dilidir.
Çince çok çeşitlidir, ve konuşulan Çin dilleri, örneğin Standart Mandarin (Pǔtōnghuà), Şanghayca (Wú) ve Kantonca (Yuèyǔ) karşılıklı anlaşılmıyorlar. Fakat, standartlaştırıldı bir Çince biçimi var - Standart Mandarin, yani Pekin lehçesi. Ancak bu lehçe sadece bir tane Mandarin lehçesidir, çünkü Mandarin kuzey ve güneybatı Çin'de konuşan çok büyük ve muhtelifli bir Çince lehçe grubudur. Standart Mandarin Çin Halk Cumhuriyetin ve Tayvan'ın resmî dilidir, Singapur'un dört resmî dilinden biridir, ve Birleşmiş Milletler'in altı resmî dilinden biridir. Aynı zamanda, Standart Mandarin, herhangi bir Çince biçimi konuşanlar kullanılan yazılan çağdaş standart Çince diline uyuyor. Bu yazılan Çince hem Mandarin, hem de Wu, Kantonca, Hakka, Min-Nan, v.d.. Bu Vikikitap hem konuşan hem de yazılan Standart Mandarin'i öğretiyor.
Çince gramer çoğunlukla Avrupa dillerinin gramerlerinden daha çok basittir (Çince'de fiil zamanlar, çoğullar, ve konu-fiil uyuşma gibi şeyler bulmazsınız), ama aynı zamanda kuşkusuz başlayanı yanıltan birçok tuzak var (örneğin, Çince'de Avrupa dillerinde pek özelliği olmayan tonlar, ölçü kelimeler ve hitap cüzler gibi şeyler.) Ayrıca, yazı sistemin kompleksitesi yeni Çince öğrencileri çoğunlukla yıldırılıyor, çünkü Çince dünyanın birkaç tane alfabe veya hece alfabe kullanmayan dillerinden biridir; bunun yerine binlerce karakterler kullanılıyorlar, her birisi kelime veya bir kelimenin bölümü ifade ediyor. Çin hükümeti Standart Mandarin'i Latin alfabesi ile yazmak için Hanyu Pinyin veya pinyin (汉语拼音/漢語拼音, "sese göre hecelemek") adlı bir sistem yarattılar. Hanyu Pinyin Çince kelimeleri fonetik yönden yazmak için kullanılıyor, ve Çince'yi öğrenenleri Çince'nin telaffuzuyla yardım ediyor. Bu Vikikitap öncelik, gerçek cümlelerden önce, Hanyu Pinyin'i öğretir. Her örnek ve yeni kelime Hanyu Pinyin ile öğretilir.
İki tane karakter seti var: Basitleştirilmiş Çince Karakterleri (简体字/簡體字) ve Geleneksel Çince karakterleri (繁体字/繁體字). Geleneksel karakterlerin nesilleri Çin tarihte binlerce yıl önce kaynaklanıyor, ve bugün hem Hong Kong, Makao ve Tayvan'da, hem de bu ülkeler dışında birçok Çin azınlıklar bu sistemi kullanıyorlar. Basitleştirilmiş Çince karakterler Çin Halk Cumhuriyeti'nde okuryazarlık oranı yükseltmek için ortaya koyulduğu ıslahatların sonucudur, ve artık hem orada hem de Singapur'da kullanılıyor. Her iki sistem çoğunlukla birçok karakteri değiştirilmemiş halinde veya azaltmış çizme sırası ile halinde paylaşıyor; fakat, bazı değişiklikler o kadar formüle değiller. Böylece, Çince'yi ana dili olarak konuşanların çoğu sadece bir tane sistemle yazabiliyorlar, ama aynı anda her iki sistemi genellikle okuyabiliyorlar. Tercihimiz sizin öyle öğrenmeniz. Geleneksel Çince öğrenenler genellikle her iki sistemin okuması daha basit olduğunu hissediyorlar, ama yeni öğrenciler Basitleştirilmiş karakterleri öğrenmesini daha çok az yıldırıcı bir şey olduğunu hissedebilirler. Bu Vikikitap'ta, her örnek ve kelime her iki sistemde veriliyor, ve istediğiniz sistemiyle bütün Vikikitap'ında takılabilirsiniz.
Çince karakterler geçmişte diğer Asyalı ülkelerce de kullanıldı ve bazıları hala kullanıyorlar. Bazı yaşlı Koreliler Çince karakterlerin nasıl yazıldığını hala biliyorlar ama daha genç nesiller sadece Kore alfabesiyle, hangıl, okuma ve yazma öğrenmişler. Japonlar hala kısmen Çince karakterleri kullanıp (Japonca'da Çince karakterlerin adı kanji'dir) Japonca yazıyorlar. Kuzey Kore'de ve Vietnam'da ise 20. yüzyıla kadar kullanılmıştır. Yazının Korece adı 한자/漢字 (Hanja / Hancha), Vietnamca adları ise Hán Việt/漢越, Hán Nôm/漢喃, Hán Tự/漢字 ve Chữ Nôm/𡨸喃 olarak geçer.

Pinyin'i öğren. Bu kitap'ta doğru telaffuzu anlatmak için kullanılıyor. Ayrıca, Çince'de hem sözlüğe bakmak için kullanılır, hem de daktiloyla Çince yazmak için kullanılır.
Tonlara dikkat edin. Çince'de çok az hece olduğu için, birçok eşadlı kelimeler var, ve buna rağmen tonlara dikkat etmek çok önemlidir. Karakterleri öğrendiğin zamanlarda aynı anlarda pinyin'i doğru tonlarla öğrenmek tellafuzunuzu ve dinleme anlayışınızı geliştirir.
Metni yüksek sesle oku. Konuşmak (ve kendi konuşmanızı dinlemek) metnin belleğinize işlemesini kolaylaştırır. Tonları abartmak kelimeleri hatırlamanıza yardım eder.
Dil partneri bulun. Size yakın bir şehir veya üniversite'de bir Çince dil kulübü olabilir. İnternet'te dil mübadeleleri kurmasına yardım eden Skype ve diğer VoIP programları gibi bedava siteler var. İki tane örnek: The Mixxer (Almanca/Fransızca/İngilizce/İspanyolca/Japonca sitedir) ve E-Tandem (Almanca/Danca/Fince/Flemenkçe/Fransızca/İngilizce/İspanyolca/İsveççe/İtalyanca/Lehçe/Norveççe/Portekizce/Rusca/Yunanca sitedir).
Çince medyayı dinle. Çince'yi dinlemek çok çeşitli multimedya seçeneğiniz var. Birçok Çince internet radyo kanalları, haber yayınları, filmler ve televizyon dizileri bulunmaktadır.

Yazma partiği yapın. Hem de çok. Bir karakteri öğrendiğiniz zaman, o karakteri hatırladığınız zamana kadar günde en az 10 kere yazın. Hafızanız için periyodik olarak kendinizi test edin ve aynı anda daha pratik isteyen karakterleri bulursunuz. Karakteri yazdığınızda, karakterin sesi ve anlamı düşün, veya yüksek sesle söyleyin. Öncelik doğru çizme sırası öğrenin, sonra kopyalamadan önce basınlayan karaktere bakıp, dikkatle çizin.

Radikal karakterlere dikkat edin. Radikaller Çince'de sık sık kullanalan cüzlerdir. Radikallerin anlamları öğrenmek benzer kelimelerin bağlantısı görmesini çok yardım eder. Birçok karakter radikal-fonetik çiftleşmelerle kapsıyorlar - radikal kelimenin "kökü" olarak kelimenin anlamına ima edip, aynı anda karakterin başka kısmı kelimenin sesine ima ediyor. Radikalleri bulmasını öğrenmek de yararlıdır çünkü Çince sözlüklerde bilinmeyen kelimelere bakmak için radikal kullanılıyor.
Bir Çince sözlüğü alın. Bir sözlük yeni kelimelere bakmak, veya sadece göz atmak için kullanılabilirler. Çince'yi yeni başlayana ait bir sözlüğe satın alın - bu sözlüklerin yazıyüzleri daha büyükler, hem de örnekler ve Pinyin telaffüzlüler (bunlar bazen kapsamlı sözlüklerde bulunmuyorlar). Eğer herhangi bir kelimeyi bulamıyorsanız, isterseniz ikinci bir sözlüğe satın alın.

Çocuk kitapları (karakterler daha kolay, ve birçoğu zor veya bütün karakterler için pinyinliler)

Bu kursta Çince karakterlerin okumalarını ve yazmalarını öğrenmek belki sizin en büyük zorluğunuz olacak. Çince'nin yeniden kullanabilen harflerle alfabesi olmadığı için, pratik yapmak amacıyla çok yazmak ve ezberlemekten başka diğer alternatifiniz yok. Pinyin karakterlerin telaffuzları öğrenmek için ne kadar yararlı ise, Çince'nin o kadar eş adlı kelimeleri var ki, Pinyin'i karakterlerin tümüyle yerine koymak elverişsiz olur.
Çince karakterler zor ve zaman harcayan bir şeyse ne var? Çince karakterleri öğrenmek eğlenceli ve değerli bir deneyimdir ve Çin kültürüne kapılar açıyor. Çince yazma sistemi 3000 yıldan beri durmadan kullanılıyor ve 7. yüzyılından beri karakterler neredeyse hiç değişmemişler. Her karakterin bir hikayesi var.

Her karakterin spesifik çizme sırası var. Bu karakterlerin öğrenmesini daha zor yaptığını bir şey olduğunu belki hissedebilirsiniz, ama çok da yaralı, çünkü çizme sırasını öğrenmek karakterleri hatırlamanıza çok yardım eder. Her seferinde yaptığın çizme sırası "motor hafızanızı" daha geliştirip karakteri yazdığında sonuna kadar bir ritim yaratıyor. Karşılıklı olarak, her zaman bir karakteri rastgele bir çizme sırasıyla çizip her şey büyük ihtimalle yanlış çıkar!
Çizme sırasıyla en önemli kurallar, spesifikler ile, aşağıdaki tabloda gösteriliyorlar.

Kümlere matematikte sık sık kullanılır ve küme teorisi kümeleri inceler. Küme teorisi biçimsel olarak açıklanabileceği gibi Zermelo-Fraenkel küme teorisi ve benzeri aksiyomatik küme teorileri de vardır. Bu kitap biçimsel açıklamaya girmeyecektir.
Küme teorisini biçimsel olarak tartışmayacak olsak da kümeler ile ilgili bazı temel konuları anlamamız elzemdir. Bu bölüm bununla ilgilenecek.

Küme, birbirinden farklı özel nesnelerin (nesnelerin kendileri de küme olabilir) koleksiyonudur. "Özel" teriminin belirsizliği nedeniyle bu açıklama kümelerin tanımı değildir. Kümeleri ilkel kavram (daha önceden belirtilen kavramlarla belirtilmeyen kavram) olarak tanımlayabiliriz.
Kümede bulunan birbirinden farklı nesnelere eleman (element) denir. Matematiksel olarak eleman 
  
    
      
        a
      
    
    {\displaystyle a}
  
'nın küme 
  
    
      
        A
      
    
    {\displaystyle A}
  
'da bulunduğunu 
  
    
      
        a
        ∈
        A
      
    
    {\displaystyle a\in A}
  
 ifadesiyle belirtiyoruz.

Bir kümeyi net bir şekilde (elemanların o kümeye ait olduğunun net olarak bilindiği şekilde) tanımlamanın birkaç yolu vardır.
Eğer bir küme az sayıda elemandan oluşuyorsa o halde listeleme yöntemi verimli çalışabilir. Listeleme yönteminde kümenin elemanları süslü parantez içinde ({}) gösterilir. Bir kümede bulunan elemanların sırasını değiştirmek kümenin kendisini değiştirmez. Örneğin 
  
    
      
        {
        1
        ,
        2
        }
      
    
    {\displaystyle \{1,2\}}
  
 ile 
  
    
      
        {
        2
        ,
        1
        }
      
    
    {\displaystyle \{2,1\}}
  
 kümeleri yalnızca 1 ve 2 elemanlarını içerdikleri için aynı kümeyi temsil etmektedirler. Eğer parantezler içinde temsil edilen elemanlar aynı ise elemanların sıralanışları fark etmeksizin iki gösterim de aynı kümeyi belirtmektedir. Ayrıca aynı elemanı küme içinde birden fazla kez belirtmek o kümeyi değiştirmez. Örneğin, 
  
    
      
        {
        1
        ,
        1
        ,
        2
        ,
        2
        ,
        2
        }
      
    
    {\displaystyle \{1,1,2,2,2\}}
  
 ile 
  
    
      
        {
        1
        ,
        2
        }
      
    
    {\displaystyle \{1,2\}}
  
 eleman sayıları fark etmeksizin yalnızca 1 ile 2 elemanlarını içerdikleri için aynı kümeyi belirtmektedirler. Eğer bir küme hiçbir eleman içermiyorsa o kümeye boş küme denir ve 
  
    
      
        {
        }
      
    
    {\displaystyle \{\}}
  
 veya 
  
    
      
        ∅
      
    
    {\displaystyle \varnothing }
  
 şeklinde belirtilebilir.
Kümeleri tanımlamanın başka bir yolu da kelimelerdir. Örneğin 10'dan küçük tüm asal sayıları içeren 
  
    
      
        S
      
    
    {\displaystyle S}
  
 kümesini düşünün. Bu kümeyi harf yerine listeleme yöntemiyle belirtseydik 
  
    
      
        {
        2
        ,
        3
        ,
        5
        ,
        7
        }
      
    
    {\displaystyle \{2,3,5,7\}}
  
 olarak belirtirdik.
Küme tanımlamanın bir diğer üçüncü yolu ise küme inşaa kavramıdır. Bu yöntem çok fazla eleman içeren kümelerde etkilidir. Bu küme tanımlama yöntemini oluşturan üç parça aşağıda belirtilmiştir:

  
    
      
        
          
            
              {
              ⏟
            
          
          
            The set of
          
        
        
          
            
              x
              ⏟
            
          
          
            
              all elements 
            
            x
          
        
        
          
            
              :
              ⏟
            
          
          
            such that
          
        
        
          
            
              
                P
                (
                x
                )
              
              ⏟
            
          
          
            
              the property 
            
            P
            (
            x
            )
            
               is satisfied
            
          
        
        }
      
    
    {\displaystyle \underbrace {\{} _{\text{The set of}}\underbrace {x} _{{\text{all elements }}x}\underbrace {:} _{\text{such that}}\underbrace {P(x)} _{{\text{the property }}P(x){\text{ is satisfied}}}\}}
  

Tahmin edilebileceği üzere iki küme ancak ve ancak aynı elemanlara sahip oldukları zaman birbirlerine eşittir. Aynı şekilde iki küme 
  
    
      
        A
      
    
    {\displaystyle A}
  
 ve 
  
    
      
        B
      
    
    {\displaystyle B}
  
 kümeleri ancak 
  
    
      
        A
      
    
    {\displaystyle A}
  
'nın her elemanı 
  
    
      
        B
      
    
    {\displaystyle B}
  
'nin, 
  
    
      
        B
      
    
    {\displaystyle B}
  
'nin her elemanı 
  
    
      
        A
      
    
    {\displaystyle A}
  
'nın ise birbirlerine eşittir. Bu durum bir aksiyom veya betimleme olarak değerlendirilebilir. Eğer 
  
    
      
        A
      
    
    {\displaystyle A}
  
 ve 
  
    
      
        B
      
    
    {\displaystyle B}
  
 kümeleri birbirlerine eşitse bu durumu 
  
    
      
        A
        =
        B
      
    
    {\displaystyle A=B}
  
 ifadesiyle belirtiriz. Eğer birbirlerine eşit değillerse 
  
    
      
        A
        ≠
        B
      
    
    {\displaystyle A\neq B}
  
 ifadesini kullanırız.
Bu kitapta bir eşitlik çözdüğümüz zaman aksi belirtilmediği sürece o eşitliğin yalnızca gerçek çözümlerini kabul ediyoruz.

<<Örnek Program   -   Vektörler ve Matrisler>>

Bu bölümdeki bilgiler özellikle Matlab'da oluşabilecek genel sorunlar hakkındadır. Aşağıdaki kodları Command Window'da ve Script Editor'de denemeniz ve anlatılan bilgileri aklınızda tutmanız sizin için faydalı olacaktır.

Matlab'da değişkenlerin kendisini veya tipini önceden tanımlamaya gerek yoktur. Fakat doğal olarak farklı değişken tipleri arasında işlem yapmak hatalara yol açabilir.

Matlab'da integer, real veya complex değişkenler gibi bir ayrıma gerek yoktur. Örneğin Command Window'da doğrudan

yazarak 1, 2.78 ve 3+4i'ten  oluşan sayi_vektoru isimli bir vektör oluşturabilirsiniz.

Stringlerin tanımlanmasında ise iki ayrım işareti arasındaki karakterler göz önüne alınır. Örneğin

size içeriği Matlab stringi olan 3 elemanlı bir vektör verecektir. Fakat Matlab bir vektör içindeki değerlerin aynı tipte olmasını isteyecektir. Yani 

yazarsanız, string'i öncelik verildiği için, Matlab 1'i string'in kodu yani boşluk olarak algılayacaktır.

Matlab'da 0 sayısı False, 0 dışındaki bütün tam ve gerçel sayılar (karmaşık sayılar hariç), True olarak algılanır. Örneğin

 kodunda 9 True kabul edildiği için, if döngüsünün içindeki Disp komutu uygulanacaktır.

Matlab'da m-file'lar script editor'de yazılır. Script editor'de kodlarınızı daha düzenli yazabilirsiniz. M-file dosyaları function veya script olarak tutulur.

function içinde adı geçen değişkenler sadece m-file'ın sınırları içinde geçerlidir ve Matlab'ın ana belleğinde yer almazlar. Yani function içinde kullandığınız bir değişkeni doğrudan Command Window'da kullanamazsınız. Function'ın girişinde şu kod bulunmalıdır

function çıktı değişkeni veya değişkenleri = fonksiyon adı (girdi değişkeni veya değişkenleri )

Örneğin script editor'de

yazarsanız ve deneme ismiyle kaydederseniz girdinin 2/5'ini çıktı olarak veren bir fonksiyon yazmış olursunuz.  Eğer Command window'da sadece x1 yazarsanız Matlab size hata verecektir, çünkü x1 değişkeni function içinde tanımlıdır.

Scriptlerde ise ana bellekteki değişkenlerle çalışırsınız. Yani Command Window'da çalışıyormuşsunuz gibi olur, fakat burada kodları daha düzenli yazabilirsiniz. Scriptlerde function yardımcı kelimesini veya girdi veya çıktılarla ilgili herhangi bir şey tanımlamanıza gerek yoktur.  Örneğin Command Window'da 

 vekt2=[1 2 3 4];

diye bir değişken tanımlamış olalım. Bu vektör Matlab'ın ana belleğinde tutulacaktır. Mesela script editor'de sadece

 vekt2.^2;

yazdınız ve bunu vektor_kare ismiyle kaydettiniz. Command window'da vektor_kare yazarsanız,    ana bellekte bulunan vekt2 değişkeninin elemanlarının karesi alınacaktır.
<<Örnek Program             Vektörler ve Matrisler>>

Matlab Mathworks şirketi tarafından geliştirilen ve sayısal çözümlemede sıkça kullanılan bir programdır. İlk başta kullanımı çok zor gelse de, biraz alıştırmayla istediğiniz çözümlemeleri rahatlıkla yapabilirsiniz.
Matlab'ın zor yönü çok fazla komut olmasıdır. Bu yüzden yardım dosyalarına çok sık ihtiyacınız olacak.
Program yazarken yanınızda bir not defteri bulundurmanız iyi olur. Gerekli fonksiyonları not olarak tutarsanız zorluklar azalacaktır.
Programlama açısından modüler olarak ilerlemek çok faydalıdır. Eğer bir program doğru olarak çalışmıyorsa, programı parçalara bölüp bu parçaların doğruluğunu kontrol etmeniz en iyisidir.
Eğer İngilizce biliyorsanız aşağıdaki bağlantılar yardımıyla birçok bilgiye ulaşabilirsiniz
Hemen bir örnekle kitaba başlayalım,
Örnek Program >>

Matlab Kitabı (Basit)
Matlab ile ilgili notlar
(Matlab ile ilgili güzel bir sayfa)

The MathWorks şirketinin MATLAB ana sayfası
Matlab (The WikiBook) (Tam değil)
MATLAB Central MATLAB kullanıcıları
Open Directory Project'de MATLAB
MATLAB'ın tarihi

Vektör ve matris operasyonları sözkonusu olduğu zaman MATLAB'in diğer programlama dillerine üstünlüğü tartışılmaz. Bu üstünlüğün sebebi MATLAB'in çıkış süreci ile yakından ilgili. 70'lerin sonunda  geliştirilmeye başlanan MATLAB'in çıkış noktası o dönemin yaygın dili olan Fortran'ı kullanmadan matris ve vektör işlemlerini kolayca yapmaktı. Geliştirilen yeni sisteme bu nedenle Matrix Laboratuary (MATLAB) adı verilmiştir.

Matematik terminolojisi ile konuşacak olursak vektörler aslında tek satırlı veya tek sütünlu matrislerdir.  Dolayısı ile vektörler matrislerin özel bir çeşidi olarak değerlendirebilir. MATLAB ortamında da aynı ilke geçerlidir. Tek boyutlu olmasının dışında vektörlerin matrislerden bir farkı yoktur. Dolayısı ile vektör dediğimiz veri yapıları aslında bir matristir ve matrisler için geçerli olan uygulamalar vektörler için de geçerlidir.

Bu kısa girişten sonra şimdi vektörlerin nasıl tanımlandığına bakalım. Diyelim ki

  
    
      
        x
        =
        
          [
          
            
              
                
                  1
                
                
                  2
                
                
                  3
                
              
            
          
          ]
        
      
    
    {\displaystyle x=\left[{\begin{matrix}1&2&3\end{matrix}}\right]}
  

şeklinde 3 elemanlı bir x yatay vektörü tanımlamak istiyoruz. Bu iş için aşağıdaki komutu yazmanız yeterli:

Aynı değerlere sahip dikey bir matris yaratmanın iki temel yolu vardır.  Birinci yöntemde  ; sembolü kullanarak vektör elemanlarının yana doğru değil alta doğru eklenmesini sağlanır. İkinci yöntemde ise yatay vektör tanımının hemen yanına transpoze almayı sağlayan  '  sembolü yerleştirilir. Kullanım kolaylığı açısından ikinci yöntem genelde tercih edilir.

Hemen bir örnek ile başlayalım.

  
    
      
        x
        =
        
          [
          
            
              
                
                  1
                
                
                  2
                
                
                  3
                
              
              
                
                  4
                
                
                  5
                
                
                  6
                
              
            
          
          ]
        
      
    
    {\displaystyle x=\left[{\begin{matrix}1&2&3\\4&5&6\end{matrix}}\right]}
  

ile gösterilen x matrisini MATLAB ile tanımlamak için şu komutu kullanabiliriz:

Dikkat ederseniz, 3 rakamından hemen sonra ; sembolü kullanılarak 4,5 ve 6 rakamlarlarının bir alt satıra yazılması sağlandı. Her ne kadar dolambaçlı bir yol olsa da aynı matrisi transpoze kullanarak da tanımlayabiliriz.

Vektör veya matrislerin uzunluğunu hesaplamak için length, size veya numel fonksiyonları kullanılır. Şimdi sırasıyla bu fonksiyonları tanıtalım.

length
Kendisine verilen matrisin hangi boyutunda fazla eleman varsa o boyutun uzunluğunu verir. Sözgelimi 
  
    
      
        3
        ×
        2
      
    
    {\displaystyle 3\times 2}
  
 boyutundaki bir matris için length 3 sonucunu verir. Vektörler sözkonusu olduğu zaman tahmin edeceğiniz gibi vektörün boyunu bu fonksiyonlar kolaylıkla öğrenebilirsiniz.
size
Bu fonksiyon ile vektör/matrislerin kaç boyutlu olduğunu ve her boyutunun uzunluğunu ayrı ayrı öğrenebilirsiniz.
numel
Bir vektör/matris içinde toplam kaç eleman olduğunu hesaplar. 
  
    
      
        3
        ×
        2
      
    
    {\displaystyle 3\times 2}
  
 boyutlu bir matris için 
  
    
      
        6
      
    
    {\displaystyle 6}
  
 rakamını üretir.

Matrisler (vektörleri de kastediyorum tabii) üzerinde tanımlı bütün aritmetik işlemleri MATLAB ile yapmak mümkün. Toplama ve çıkarma için matrislerin boylarının aynı olması gerekir. Çarpma işleminde ise birinci matrisin sütün sayısı ile ikinci matrisin satır sayısının eşit olması şart. Son olarak matrislerde bölme işlemi ters alma ile yapılıyor. Bölenin tersi (tabii varsa) alınıp bölünen ile çarpılıyor. Şimdi bazı örnek uygulamalar yapalım.

Değerleri 0 ve 1 arasında rastgele değişen 10 elemanlı yatay bir vektör oluşturmak için rand komutu kullanılabilir. Fonksiyonun bir ve ikinci parametreleri sırasıyla oluşturalacak matrisin satır ve sütün sayıları göstermektedir.

Değerleri 0 ve 1 arasında rastgele değişen 10 elemanlı dikey bir vektör oluşturmak

<<Giriş      Genel Bilgiler>>

Matlab'ı ilk açtığınızda çıkan pencereye Command Window denmektedir. Burada temel işlemler gerçekleştirilir. Ama amacınız program yazmaksa (bunlara Matlab'da m-file denmektedir.) bunu script editorde yazmalısınız. Hemen bir örnekle başlayalım...
Öncelikle command window'dan bir m-file açalım

karşınıza script editor çıkacaktır

Mesela buraya girilen değerler arasındaki sinüs fonksiyonunu veren ve çizdiren bir fonksiyon yazmak istiyoruz. Fonksiyon yazmak için öncelikle programın girdilerini ve çıktılarını tanımlamalıyız. Mesela programımızın ismi sinus_çiz olsun, o zaman

 function y = sinus_ciz(altsinır,ustsinir)
 
olarak başlamalıyız (Türkçe karakterler genelde Matlab tarafından tanınamıyor). Burada function 
yazılması  bu m-file'ın sadece kendi içindeki değişkenleri kullanacağı anlamına gelir. Eğer command 
window'da daha önce bir tanımlanmış bir değişken varsa bu function'ın içinde doğrudan kullanamazsınız. function'dan sonra çıktıları tanımlamalısınız. Burada biz çıktıyı y olarak tanımladık. Eğer çıktınız birden fazla ise, mesela y1 ve y2, o zaman şöyle yazmalıydınız

 
 function [y1,y2] = sinus_ciz(altsinir,ustsinir)

Çıktı tanımlamasından sonra fonksiyonun adını girmelisiniz.(fonksiyon ismi rakamla veya özel karakterlerle başlamamalı!!). Daha sonra iki parantez arasına girdilerin isimlerini tanımlamalısınız. Biz burada iki girdi kullanacağız, altsinir ve ustsinir. Bu ikisini virgülle ayırıp parantezlerin içine yazıyoruz. Böylece fonksiyonun yapısını tanımlamış olduk.
Matlab her sayısal programda olduğu gibi verileri diziler halinde tutar. Fakat Matlab'da bunlar artık vektör ve matris şeklini almaktadır. Amacımıza uygun olarak programımızda vektör kullanmalıyız. Yani üstsınır ve altsınır arasında değişen bir vektör tanımlamalıyız. Öncelikle basit olarak matlabda bir vektörü gösterelim. Mesela 1'den 100'e kadar olan tam sayılardan oluşan a diye bir vektör tanımlayalım

 a=1:1:100;

Yani yapı şöyledir; başlangıç sayısı, iki nokta üstüste, basamak değeri, iki nokta üstüste, bitiş sayısı. Burada noktalı virgül satırın bitimini gösterir. Eğer kullanmazsanız vektörün değerleri Command Window'da gösterilir. Amacımıza uygun olarak altsinir ve ustsinir arasında v diye bir vektör tanımlayalım

 v = altsinir:(ustsinır-altsinir)/100:ustsinir;

burada basamak değeri aralığın yüzde biri olarak tanımlanmıştır. Matlabın en önemli ve faydalı özelliklerinden biri vektörler üzerinde paralel işlem yapabilmesidir. Yani yukarıda tanımladığımız vektörün içindeki değerlerin sinüsünü almak için herhangi bir döngü kurmamıza gerek yoktur. Basitçe

 y = sin(v);

yazarak v içindeki değerlerin sinüsünü y gibi bir vektöre atayabilirsiniz. Toparlarsak aşağıdaki fonksiyon

 function y = sinus_ciz(altsinir,ustsinir)
 v=altsinir:(ustsinir-altsinir)/100:ustsinir;
 y=sin(v);

girilen değerler arasında sinüs fonksiyonunu bir vektör çıktısı olarak vermektedir. Yukardaki kodu script editorde yazdığımızı ve sinus_ciz olarak kaydettiğimizi düşünelim.

Command windowa geçip 

 sinus_ciz(0,2*pi)

yazarsanız Matlab size 
  
    
      
        0
      
    
    {\displaystyle 0}
  
 ile 
  
    
      
        2
        π
      
    
    {\displaystyle 2\pi }
  
 arasındaki açıların sinüsünü vercektir. Bu arada Matlabın açıları radyan cinsinden kabul ettiğini belirtelim. Eğer görsel açıdan değerleri görmek istiyorsanız Plot fonksiyonundan yararlanabilirsiniz. Kodu tekrar yazacak olursak

 function y = sinus_ciz(altsinir,ustsinir)
 v=altsinir:(ustsinir-altsinir)/100:ustsinir;
 y=sin(v);
 plot(y);

Bu kodu kaydedip, Command Window'da sinus_ciz(0,2*pi); yazarsak karşımıza şu ekran çıkar.

<<Giriş      Genel Bilgiler>>

Medya ve gazetecilik tarihi, düzenli olarak bilgi toplamak ve yaymak için özel tekniklerin ortaya çıkmasıyla belirlenen teknoloji ve ticaretin gelişimini kapsar. Bir tahminde belirtildiği gibi, "elimizde olan haberlerin kapsamı ve iletilme hızı" istikrarlı bir şekilde artar. Matbaa icat edilmeden önce haberin temel kaynağı ağızdan ağza iletişimdi. Geri dönen tüccarlar, denizciler ve gezginler anakaraya haberler getirdiler ve bu daha sonra seyyar satıcılar ve gezici oyuncular tarafından alınıp kasabadan kasabalara yayıldı. Eski yazıcılar bu tür bilgileri sıklıkla yazıyorlardı. Bu haber aktarımı biçimi son derece güvenilmezdi ve matbaanın icadıyla ortadan kalktı. 18. yüzyıldan itibaren gazeteler, 20. yüzyılda radyo ve televizyon, 21. yüzyılda ise internet, gazetecilerin öncelikli iletişim aracı olmuştur.

İlk radyo yayınının 1895 yılında Guglielmo Marconi tarafından Wight Adası'nda kurulan geçici bir istasyondan yapıldığı genel olarak bilinmektedir. Bu süreç, Alessandro Volta, André-Marie Ampère, Georg Ohm ve James Clerk Maxwell'in de aralarında bulunduğu birçok kişinin bu alandaki öncü çalışmalarıyla devam etti. Dağınık bir izleyici kitlesine ulaşmayı amaçlayan radyoda müzik ve konuşmaya dayalı yayın, deneysel olarak 1905-1906 civarında, ticari olarak ise 1920-1923 civarında başladı. VHF istasyonları 30 ila 35 yıl sonrasında başladı. İlk zamanlarda radyo istasyonları uzun dalga, orta dalga ve kısa dalga frekans bantlarında, daha sonra ise VHF ve UHF'de yayın yapmaktaydı. Bununla birlikte, Birleşik Krallık, Macaristan, Fransa ve diğer bazı yerlerde, 1890 gibi erken bir tarihten itibaren haberlerin, müziğin, canlı tiyatronun, müzik salonunun, öykü okumalarının, dini yayınların vb. özel evlerde sunulduğu bir sistem zaten mevcuttu. Birleşik Krallık'ta bu sistem Electrophone olarak biliniyordu ve 1895 veya 1899 gibi erken bir tarihten 1926'ya kadar mevcuttu. Macaristan'da Telefon Hírmondó ve Fransa'da Théâtrophone olarak adlandırılıyordu. 1950'lere gelindiğinde hemen hemen her ülkede, genellikle hükümetlerin sahip olduğu ve işlettiği bir yayın sistemi vardı. Alternatif modlar arasında Amerika Birleşik Devletleri'nde olduğu gibi ticari radyo; veya Avustralya'da 1924 gibi erken bir tarihte tanıtılan ve 1932'de Kanada'nın takip ettiği, hem devlet destekli hem de ticari istasyonlardan oluşan ikili bir sistem vardı. Bugün Birleşik Krallık da dahil olmak üzere çoğu ülke ikili sisteme evrilmiştir. 
1955'e gelindiğinde Japonya'nın yanı sıra Kuzey Amerika ve Batı Avrupa'da yaşayan hemen hemen her ailenin bir radyosu vardı. 1960'larda küçük, ucuz ve taşınabilir transistörlü radyoların piyasaya sürülmesiyle dramatik bir değişiklik oldu ve bu radyoların mevcudiyeti ve kullanımı büyük ölçüde arttı. Erişim, dünya çapında neredeyse evrensel hale geldi.

Avustralya'da amatör radyoculuğun izleri 1900'lerin başlarına kadar uzanabilir. 1905 Kablosuz Telgraf Yasası, kablosuz telgrafın varlığını kabul ederken, Avustralya'daki tüm yayın konularını Federal Hükümetin kontrolü altına aldı. 1906'da Avustralya'daki ilk resmi Mors kodu iletimi, Queenscliff ve Devonport arasındaki Marconi şirketi tarafından yapıldı.
İlk müzik yayını 13 Ağustos 1919'da AWA - Amalgamated Wireless'tan Ernest Fisk'in şovu sırasında yapıldı. 1920 ve 1921'de bir dizi (amatör anlamda) müzik yayınlamaya başladı. Kısa süre sonra diğer birçok amatör de onları takip etti. 2CM istasyonu 1921'de, Sidney'deki Wentworth Hotel'den düzenli olarak Pazar akşamlarındaki yayınlarıyla başlatan Charles MacLuran tarafından yönetiliyordu. 2CM genellikle Avustralya'nın ilk, düzenli, resmi olmayan istasyonu olarak kabul edilir.

Hükümet bu süreçte, nihayet resmi olarak tanınan bir dizi orta dalga istasyonu için onay verdiği Kasım 1923'e kadar kapsam dışıydı. Tüm istasyonlar, her setin bir istasyonun frekansına mühürlendiği benzersiz bir mühürlü set sistemi altında çalışıyordu. Setin fiyatının bir kısmı genel müdürlük dairesi aracılığıyla hükümete gitti, kalan para da yayıncıya gitti. Son derece sınırlı reklamların yanı sıra, bu, yayıncıların tek gelir kaynağıydı. Başlangıçtan itibaren sistemdeki sorunlar ön plana çıktı. Öyle ki, birçok genç, tüm istasyonları alabilecek kendi setlerini kurdu. 

Temmuz 1924'te set sisteminin başarısız olduğu ilan edildi ve yerini A sınıfı ve B sınıfı istasyonlardan oluşan başka bir sistem aldı. Beş eski tipte set istasyonu, A sınıfı istasyonlar haline getirildi ve kısa süre sonra diğer Eyalet başkentlerindeki istasyonlar da bunlara katıldı. Amatör yayıncılar uzun dalga ve kısa dalga bantlarında çalışmalarına devam etti. Ulusal bir yayın servisi olan Avustralya Yayın Komisyonu, Avustralya Yayın Şirketi'nin (Australian Broadcasting Company) sözleşmesinin sona erdiği Temmuz 1932'de kuruldu.

Avustralya'nın en nadir görülen orta dalga istasyonlarından ikisi 2XT ve 3YB mobil istasyonlarıydı. Her ikisi de kırsal radyo istasyonlarının evrensel olarak kurulmasından önceki dönemlerde faaliyet gösteriyordu. 2XT, Kasım 1925 ile Aralık 1927 arasında, NSW Demiryolları treninden, New South Wales Eyaleti'nde AWA tarafından tasarlandı ve işletildi. 2XT, 100'ün üzerinde kırsal merkezi ziyaret etti. Mühendisler bir yayın anteni kuracak ve istasyon daha sonra yayına başlayacaktı. Bu, AWA ürünlerinin daha fazla satışına yol açtı. 3YB, Ekim 1931 ile Kasım 1935 arasında Victoria kırsalında benzer bir hizmet sağladı. Başlangıçta istasyon bir Ford araba ve bir Ford kamyonla çalışıyordu, ancak 17 Ekim 1932'den itibaren 1899'da dönüştürülmüş eski bir Kraliyet Tren vagonuyla işletiliyordu. Mühendisler, ziyaret edilen kasabadaki istasyonun 50 watt'lık vericisini kurarken, satıcılar da 3YB'nin o bölgeden yayın yapacağı iki hafta boyunca reklamverenlere kayıt yaptırıyordu.
İstasyon her gün saat 18.00 ile 22.00 arasında yayın yapıyordu ve 1.000 kayıtlık kütüphanesi, her biri 14 gün için olmak üzere dört saatlik programlara bölünmüştü. Yani her kasabanın müzik yayını aynıydı. İstasyon Vic Dinenny tarafından işletiliyordu, ancak adını Ballarat'tan spiker Jack Young'dan alıyor. 18 Ocak 1936'da Dinenny 3YB Warrnambool'u kurdu ve ardından 18 Mayıs 1937'de 3UL Warragul geldi. Ticari gemi MV Kanimbla'nın dünyada dahili bir yayın istasyonuyla inşa edilen tek gemi olduğuna inanılıyor.
Kanimbla, 1936'da Kuzey İrlanda'da inşa edildi ve öncelikle McIlwraith, McEacharn & Co., Cairns ve Fremantle arasında yolcu taşımak üzere tasarlandı. Yayın istasyonu AWA tarafından inşa edildi ve işletildi ve başlangıçta amatör radyo çağrı kodu VK9MI'ye verildi, ancak daha sonra 9MI oldu. İstasyon, Kuzey İrlanda'dan ayrılmadan önce deneysel bir yayın yaptı ve Avustralya'ya giderken denizde de bu tür birçok yayın yaptı. Yayın istasyonu AWA tarafından inşa edildi ve işletildi ve başlangıçta amatör radyo çağrı kodu VK9MI'ye verildi, ancak daha sonra 9MI oldu. İstasyon, Kuzey İrlanda'dan ayrılmadan önce deneysel bir yayın yaptı ve Avustralya'ya giderken denizde de bu tür birçok yayın yaptı. 9MI'nin ilk resmi yayını Nisan 1939'da Büyük Avustralya Körfezi'nden yapıldı. İstasyon, genellikle haftada birkaç kez kısa dalga yayın yapıyor, ancak programlarının çoğu, yine AWA'nın sahibi olduğu ticari orta dalga istasyonlarına aktarılıyordu. 9MI yöneticisi ve spikeri Eileen Foley'di. 9MI, Eylül 1939'da İkinci Dünya Savaşı'nın başlangıcında yayını durdurdu. Kanimbla, HMS/HMAS Kanimbla adıyla Kraliyet Donanması gemisi olarak görevlendirildi. Son derece önemli ve başarılı bir savaş kariyerine sahipti.

Kanada'da yayıncılığın tarihi 1919 gibi erken bir tarihte Montreal'deki ilk deneysel yayın programlarıyla başlar. Kanadalılar radyo çılgınlığına kapıldılar ve Amerikan istasyonlarını dinlemek için kristal setler inşa ettiler; Kanada Marconi Kablosuz Telgraf Şirketi, 1921'de ticari olarak üretilen ilk radyo yayını alıcısını ve ardından 1923'te "Marconiphone" Model I'i piyasaya sürdü. Tarihteki ana temalar arasında şunlar yer alır: Mühendislik teknolojisinin gelişimi; ülke genelinde istasyonların inşası ve ağların kurulması; radyo ve televizyonların halk tarafından yaygın biçimde satın alınması ve kullanılması; istasyonların devlet mülkiyetine karşı özel mülkiyetine ilişkin tartışmalar; yayın medyasının hükümet, lisans ücretleri ve reklam yoluyla finanse edilmesi; programlamanın değişen içeriği; programın Kanada kimliği üzerindeki etkisi; izleyicilerin müzik, spor ve politikaya tepkilerini şekillendirmede medyanın etkisi; Québec hükümetinin rolü; Frankofon ve Anglofon kültürel zevkler; diğer etnik grupların ve ilk Milletlerin rolü; radyo dalgaları yoluyla Amerikan kültür emperyalizmine dair korkular; ve internet ve akıllı telefonların geleneksel medya üzerindeki etkisi.
Radyo sinyalleri uzun mesafeler taşıyordu ve Kanada'nın bazı bölgelerinde bir dizi Amerikan istasyonlarından kolaylıkla alınabiliyordu. Kanada'nın ilk istasyonu, başlangıçta Montreal'deki Marconi Company'nin deneysel bir istasyonu olan CFCF idi. Kanada'da Birinci Dünya Savaşı süresince kablosuz telgrafın sivil kullanımı yasaklanmıştı. Kanada'daki Marconi Kablosuz Telgraf Şirketi, askeri kullanım için radyo deneylerine devam etme hakkını elinde bulunduran tek şirketti. Bu, şirkete savaştan hemen sonra deneysel bir radyo yayın istasyonu geliştirme konusunda liderlik etmede etkili oldu. Kanada'daki ilk radyo yayını, 1 Aralık 1919'da Montreal'deki The Marconi Wireless Telegraph Company of Canada tarafından, Williams Street fabrikasından XWA çağrısı altında gerçekleştirildi. İstasyon, 20 Mayıs 1920'de düzenli programlamaya başladı. Toronto'da ilk radyo istasyonu Toronto Star gazetesi tarafından işletiliyordu. CKCE İstasyonu Nisan 1922'de başladı ve o kadar iyi karşılandı ki Star, kendi stüdyoları ve iletim tesisleriyle ilerlemeye başladı ve Haziran 1922'nin sonlarında CFCA olarak yayına geri döndü. Montreal'de başka bir gazete olan La Presse, Eylül 1922'nin sonlarında kendi istasyonu olan CKAC'ı yayına açtı. O zamanlar radyo frekanslarında hükümet sınırlamaları olduğundan, CKAC ve CFCF dönüşümlü olarak yayın yapıyordu; biri bir gece, diğeri ise ondan sonraki gece yayın yapı

En sık benign beyin tümörü
Yaklaşık %95
Primer intrakraniyal neoplazmların %20’ sini teşkil eder.
En sık 40-70 yaşta görülür, insidansı yaşla artar, 70 yaşta pik yapar.
Kadın > Erkek   2:1

Daha önceden radyasyon tedavisi
Radyoterapi ile tinea capitis tedavisi, radyasyona bağlı menenjiom için klasik senaryodur.
Proflaktik kraniyal ışınlama menenjiom gelişme riskini normale göre 10 kat artırır.
Radyasyon tedavisi ile menenjiom gelişimi arasındaki ortalama interval ~20 yıldır.
Tip II Nörofibromatozis
Kadınlarda hormon replasman tedavisi

Mayo Clinic; 2008 (1993-2003) PMID 18182668 -- "Is there an association between meningioma and hormone replacement therapy?" (Blitshteyn S, J Clin Oncol. 2008 Jan 10;26(2):279-82.)
Retrospektif. 1390 menenjiomlu kadın hasta, % 11’ inde mevcut/önceden hormon replasman tedavisi
OR  for HRT use and meningioma 2.2 (SS)
Sonuç: Hormon replasman tedavisi ile menenjiom tanısı arasında pozitif ilişki var.

BT
Normal beyin dokusunu iten iyi sınırlı ekstraaksiyal kitle. Düzgün konturlu, bazen kalsifiye
Normal beyin ile izointens, IV kontrast ile hiperintens
MRG
Tercih edilen görüntüleme yöntemi, çünkü dural orjini gösterebilir. (dural kuyruk = periferalde küçülen karakteristik marjinal kalınlaşma )
T1’ de izointens, T2’ de hiperinens,  IV kontrast ile yoğun kontrastlanma
PET
Menejiomun agresifliğinin tayininde rolü olabilir: daha agresif tümörlerde belirgin olarak daha yüksek glukoz utilizasyonu görülür.

Benign (Grade I) - (90%) – meningotelyal, fibröz, transizyonel, psammomatöz, anjioblastik (en agresif)
Atipik (Grade II) - (7%) - Koroid, berrak hücreli, atipik
Anaplastik/Malign (Grade III) - (2%) - papiller, rhabdoid, anaplastik

Korea; 2007 (1986-2004) PMID 17766430 -- "Atypical and anaplastic meningiomas: prognostic implication of clinicopathological features." (Yang SY, J Neurol Neurosurg Psychiatry. 2007 Aug 31)
Retrospektif. Yüksek gradeli 74 hasta (33 atypik, 41 anaplastik). 2000 WHO’ya göre yeniden sınıflandırılmış. Ortalama takip 4.8 yıl
Toplam sağkalım atipiklerde  11.9 yıl vs. anaplastiklerde 3.3 yıl; relapssız sağkalım atipiklerde 11.5 yıl vs. anaplastiklerde 2.7 yıl
Atipik olanlarda beyin invazyonu ve radyoterapi sağkalıma etki etmemiş; anaplastiklerde ise  prognostik faktörler beyin invazyonu, adjuvan RT, p53 overekspresyonu, rezeksiyon genişliği
Sonuç: 2000 WHO klasifikasyonu önceki kriterlere göre daha iyidir.

Tedavi konservatif yaklaşım, definitif cerrahi, adjuvan RT veya definitif RT/radyocerrahi şeklinde olabilir.
Küçük, asemptomatik menenjiomlu hastalar tümör büyüyene ya da semptomatik olana kadar gözlenebilir.
Adjuvan RT için endikasyonlar: Tam olmayan rezeksiyon ve yüksek grade tümör Grade I için 54 Gy, grade II-III için 60 Gy’ dir.
Kavernöz sinüs menenjiomu, cerrahi rezeksiyonun bu bölgede potansiyel morbiditesinden dolayı stereotaktik radyocerrahinin özellikle faydalı olduğu bir senaryodur.
Güncel kılavuz: UpToDate(version 15.2, 4/2007)
Küçük, asemptomatik menenjiom: dikkatli izlem, 3-6 ayda bir görüntüleme
İlk takipte büyüme yoksa, yılda bir periyodik görüntüleme
Büyüme mevcutsa aktif tedavi
Asemptomatik menenjiomlu genç hastalar: cerrahi düşünülmelidir
Semptomatik, geniş, infiltratif ya da ödemli lezyonlar cerrahi ve/veya RT ile tedavi edilmelidir
Anatomik olarak ulaşılabilir: cerrahi rezeksiyon denenmelidir
Simpson Grade I: adjuvan tedavi yok
Simpson Grade II-III ve benign: adjuvan tedavi yok
Simpson Grade II-III ve atipik/malign: adjuvan RT
Simpson Grade IV: adjuvan RT
Unrezektabl tümörü olan, ccerrahi adayı olmayan ve cerrahiyi reddeden hastalara primer RT önerilmelidir

Asemptomatik, tesadüfen tespit edilen menenjiomların çoğu (~2/3) görüntülemede stabildir. Progresyon olursa; yıllık 2-4 mm büyüme görülür, tümör ikilenme zamanı ortalama 20 yıldır.
Kalsifiye ve T2’de hipointens menenjiomlarda progresyon daha nadirdir; yaşlı hastalarda tümör büyümesi daha yavaştır.
Asemptomatik menenjiomlarda, özellikle yaşlı hastalarda ve yüksek operasyon riski taşıyan kafa tabanı tümörlerinde gözlem uygundur. 3. ayda MR, sonrasında 6 ay ve daha sonra yıllık takip önerilir.
Genç hastalarda ve non-kalsifiye tümörlerde daha yüksek büyüme oranı nedeniyle tedavi düşünülmelidir.
Tel Aviv; 2004 (Israil)(1989-1999) PMID 15452322 -- "Natural history of conservatively treated meningiomas." (Herscovici Z, Neurology. 2004 Sep 28;63(6):1133-4.)
Retrospektif. 43 hasta, 51 menenjiom.
% 63’ünde büyüme yok, % 37’sinde büyüme (ortalama yılda 4mm büyüme).
Genç yaş, sphenoid ridge lokalizasyonu, non-kalsifiye, T2 MR’da hiperintens ise  büyüme beklenmelidir.
Hannover; 2003 PMID 12823874 -- "The natural history of incidental meningiomas." (Nakamura M, Neurosurgery. 2003 Jul;53(1):62-70; discussion 70-1.).
Retrospektif. 47 asemptomatik hasta. 41 (87%)’sine konservatif yaklaşım, 6’sına cerrahi.
Volumetrik büyüme ortalaması 0.8 cm3 / yıl, % 66’sında büyüme oranları  <1 cm3 / yıl; tümör çiftlenme zamanı ortalama 22 yıl (1.3 - 143 yıl). Genç hastalarda daha yüksek büyüme oranları. Başlangıçtaki boyut ile çiftlenme zamanı arasında korelasyon yok. Kalsifiye ise progresyon daha nadir.
Sonuç: Tesadüfen tespit edilen menenjiomlarda büyüme minimaldir; konservatif yaklaşım önerilir
Mayo; 1998 PMID 9855530 -- "The natural history of asymptomatic meningiomas in Olmsted County, Minnesota." (Go RS, Neurology. 1998 Dec;51(6):1718-20.)
Retrospektif. 35 asemptomatik, tesadüfen saptanan menenjiom. Ortalama takip 6.2 yıl.
%88 stabil, %12’sinde progresyon, %3 (1 hasta)’da semptom gelişimi. Kalsifiye olanlarda progresyon daha nadir.
Northwestern; 1997 PMID 9153494 -- "Meningiomas: the decision not to operate." (Braunstein JB, Neurology. 1997 May;48(5):1459-62.)
Retrospektif. 12 hasta, konservatif yaklaşım, 100 menenjiom, asemptomatik ya da yüksek operasyon riski. Ortalama takip 8.8 yıl.
1 hastada tümörde büyüme .
Illinois; 1995 PMID 7616265 -- "The natural history and growth rate of asymptomatic meningiomas: a review of 60 patients." (Olivero WC, J Neurosurg. 1995 Aug;83(2):222-4.)
Retrospektif. 60 asemptomatik menenjiomlu hasta. 45 hastaya 3. ay, 9. ay ve sonrasında yıllık takip. Ortalama takip 2.7 yıl(0.5-15).
% 67’sinde büyüme yok (ortalama takip 2.4 yıl, maksimum 6 yıl); % 22 tümörde büyüme (2.4 mm/ yıl, 2 mm - 1 cm ranjda).
Sonuç: Hızlı büyüyen tümörleri ekarte etmek için yakın takip gereklidir.

Genellikle semptomatik, genç hastalarda ve genişleme, infiltrasyon gösteren tümörlerde düşünülür
Komplikasyonlar: Lokalizasyona ve tipine göre % 2-30 oranda görülür
Mortalite: % 1-14; yaşlılarda daha kötü
Rezektabilitenin önemli rolü vardır:
Rezeksiyon genişliği - Simpson Grade PMID 13406590 – lokal rekürrens için belirleyicidir

Gross total rezeksiyon (Grade I-III) ~80% olguda, 10 yıllık progresyonsuz sağkalım ~80%
Subtotal rezeksiyon tipik olarak kavernöz sinüste, petroklival bölgede, posterior superior sagittal sinüste, ve optik sinir kılıfı tümörlerinde; komplet rezeksiyona oranla 4.2 kat daha yüksek rölatif ölüm riski
Grade de önemlidir: 15-yıllık toplam sağkalım benign olanlarda % 80, atipik/anaplastik’ lerde %51 ve rölatif ölüm riski 4.6 kat artmış

Helsinki; 1992 (Finland)(1953-1980) PMID 1641106 -- "Factors affecting operative and excess long-term mortality in 935 patients with intracranial meningioma." (Kallio M, Neurosurgery. 1992 Jul;31(1):2-12.)
Retrospektif. 935 cerrahi ile tedavi edilen hasta.
1-yıllık DSS % 91, 15-yıllık DSS % 78; subtotal rezeksiyonda rölatif ölüm riski  4.2 kat artmış; malign histoloji mevcutsa 4.6 kat artmış risk

UCSF
1987 (1968-78) PMID 3587542 -- "Radiation therapy in the treatment of partially resected meningiomas," (Barbaro NM, Neurosurgery. 1987 Apr;20(4):525-8.
Retrospektif. 51 hasta gros total rezeksiyon, RT yok; 30 hasta subtotal rezeksiyon, RT yok; 54 hasta subtotal rezeksiyon + RT
Rekürrens oranı: GTR % 4, sadece STR %60, STR + adjuvan RT % 32
Sonuç: adjuvan RT rekürrens oranında düşüş sağlar
1994 (1967-90) PMID 8283256 -- "Postoperative irradiation for subtotally resected meningiomas. A retrospective analysis of 140 patients treated from 1967 to 1990," (Goldsmith BJ, J Neurosurg. 1994 Feb;80(2):195-201.)
Retrospektif. 140 hasta (117 benign, 23 malign) adjuvan RT ile tedavi edilmiş, ortalama doz 54 Gy, benign olanlarda 1-2 cm, malignlerde 1-3 cm marjin, ortalama takip 3.3 yıl
5-yıllık toplam sağkalım benignlerde % 85, malignlerde % 58 (SS); benignlerde 10-yıllık progresyonsuz sağkalım ve toplam sağkalım % 77 (malignlerde 10 yıllık sağkalım yok)
RT dozu: 10-yıllık progresyonsuz sağkalım <52 Gy’ de % 65,  >52 Gy’ de % 93 (SS); maliglerde  5-yıllık progresyonsuz sağkalım < 53 Gy’ de  %17, >53 Gy’ de % 63 (SS)
Toksisite: sekonder SSS tümörü yok; % 4 körlük, % 1 (2 hasta) serebral nekroz, 1 hastada ölüm
Sonuç: RT subtotal rezeksiyon uygulanan menenjiomlarda efektif ve güvenlidir. Benign menenjiom için 54 Gy, malign menenjiom için 60 Gy RT önerilmektedir
Gainesville (1964-85) PMID 3403313 -- Taylor WB et al.  "The meningioma controversy: postoperative radiation therapy," Int J Radiat Oncol Biol Phys. 1988 Aug;15(2):299-304.
132 hasta, benign intrakranial menenjiom, minimum 2 yıl takip.
10 yılda lokal kontrol: sadece STR (%€ 18), STR + RT (% 82), GTR (% 77)
Princess Margaret (1966-90) PMID 8598358 -- Milosevic MF et al.  "Radiotherapy for atypical or malignant intracranial meningioma," Int J Radiat Oncol Biol Phys. 1996 Mar 1;34(4):817-22.
59 hasta, atipik veya malign menenjiom. 17 hastada GTR, 35 hastada STR, diğerlerinde biyopsi ve diğer.  Tüm hastalara RT (ortalama doz 50 Gy).
5 yıllık toplam sağkalım % 28, 5 yıllık CSS % 34.
Multivariat analizde; yaş < 58, RT dozu > 50 Gy olması yüksek CSS için bağımsız belirleyiciler idi.
Cleveland Clinic (1979-95) PMID 10656373 -- Goyal LK et al.  "Local control and overall survival in atypical meningioma: a retrospective study," Int J Radiat Oncol Biol Phys. 2000 Jan 1;46(1):57-61.
22 atipik menenjioma, 8 hastaya ortalama 54 Gy (35-59.4) RT, 15 hastaya GTR
GTR uygulanan hastalarda 5 ve 10 yıllık toplam sağkalımlar % 87; STR uygulanan hastal

İlk mentör-danışan toplantısı çoğunlukla beklenti ve tedirginlik icerir.  İki tarafın da iyi bir ilk izlenim bırakmak istediği bu toplantının gündemini, görev ve sorumlulukların açıklanması, mentörlük ilişkisinin resmi yönleri ve okuldaki diğer danışanlarla işbirliği ve yardımlaşma gibi konular oluşturabilir. Aday öğretmenlere okul ve öğrenciler hakkında bilgi vermek mentörün sorumluluğudur. Bu kısımda mentör ve aday öğretmen arasında gerçekleştirilen bu ilk toplantı üzerine yoğunlaşacağız.
Nilssen (2010) danışan konumundaki aday öğretmenin ilk toplantı sırasında uygulama ile ilgili bilgilerle doldurulmaması gereğinden bahsetmektedir. Ayrıca, mentörün aday öğretmenin öğretmen olmak ile ilgili deneyim, düşünce ve davranışlarını öğrenmesinin önemini de vurgulamaktadır. Öğretmenliği meslek olarak seçen öğrenciler genellikle müfredat dışı faaliyetler ve spor aktiviteleri gibi konularda koçluk deneyimine sahip olurlar. Bir mentör bunu şöyle açıklamaktadır: “Öğrencilerin kişisel ve profesyonel deneyimleri hakkında bilgi sahibi olmak, benim için öğretme ve mentörlük açısından bir belirteç olmuştur.  Ayrıca öğrencinin de,  mentörü olarak benim geçmişim hakkımda bilgi sahibi olmasının önemli olduğunu düşünüyorum. Benim niyetim nedir? Öğretmen olarak ben kimim ve neden bu tür bir mentörlük görevi üstleniyorum? Bu aynı dili konuşmamızı sağlar ve her şeyi daha öngörülebilir kılar” (Nilssen 2010: 72).
Mentör ve aday öğretmen okul deneyimi süreci ile ilgili genellikle farklı fikirlere sahiptir. Bunun nedeni öğretmenlik mesleği ile ilgili algılarının farklı olması olmaları olabilir. Alternatif olarak şu sorular sorulabilir:

Bu sorulara verilecek cevaplar mentörlüğün doğasını tanımlayacaktır. Aday öğretmenlerin yükümlülükleri sınıf içi performanslarını iyileştirmenin ötesindedir. 
Öğrencilerin ödevleri ile ilgili tartışmaları, farklı durumları gözlemlemeleri ve veli toplantılarına katılmaları gerekir. Bir çok öğretmen adayı hala öncelikle ders ders sınıftaki performanslarına odaklanmaktadır. Bir mentör bunu şöyle açıklamaktadır: “Öğrenciler genellikle benden onlara sınıf içinde yaşanan özel durumlarla başa çıkabilmeleri için yardım etmemi ve tavsiyelerde bulunmamı bekliyor. Mentörlük yaptığım grubun benden beklentisinin onlara sorunlarla başa çıkmanın farklı yollarını söylemem yönünde olduğunu gördüm.” (Nilssen 2010:73). Aşağıda bir kaç örnek yer almaktadır:

Aday öğretmenlerin sorumlulukları sınıf içi performanslarını iyileştirmenin ötesindedir. Öğrencilerin ödevleri ile ilgili tartışmalı farklı durumları gözlemleme ve veli-öğretmen görüşmelerine katkıda bulunmaları da gerekmektedir.

Nilssen, V. (2010) Praksislæreren. Oslo: Universitetsforlaget.

Norveç’te mentörlük modellerinde en etkili olan modelin aksiyon-yansıtma modeli olduğu konusunda bir fikir birliği söz konusudur. Bu model Handal and Lauvås (1983, 1990) tarafından 1980’lerden beri geliştirilmektedir. Bu model Norveç Üniversitesi (Norwegian University Colleges) tarafından ulusal danışmanlık planı doğrultusunda çalışılmakta ve Norveç’li mentörler için kuşaklardır bir rehber olmaktadır (Skagen 2004:31). Bu modelin 1990’larda erken çocukluk eğitimi üzerindeki etkisi önemli bir konudur (Carson and Birkeland 2009).
Bu model mentörlerin öğretmen adaylarının stajları sırasında çok fazla kontrol sahibi olması ile ilgili eleştiriler karşısında geliştirilmiştir. Bu durumda aday öğretmenin mentörün isteklerini takip etmek zorunda olduğu varsayılır. Çünkü öğretmen adayının yetkinlik kazanması için son kararı mentör verecektir. Sonuç olarak, öğretmen eğitiminin önceleri bağımlı öğretmenler yetiştirdiği düşünülmektedir (Skagen 2004:31). Aksiyon- yansıtma modeli böylece 1980’lerin sonlarına kadar Norveç öğretmen eğitiminin merkezinde bulunan çıraklık geleneğinin hiyerarşik yapısın dengelemek için geliştirilmiştir.

"Uygulama teorisi" aksiyon-yansıtma modelinde önemli bir terimdir. Bireyin eylemlerini ya da eylem planlarını belirleyen değerler, deneyim ve bilgi olarak tanımlanabilir. "Uygulama teorisi" her insanın kişisel uygulama düşüncesi ve uygulama için hazır olmasına işaret eder. Lauvås ve Handal (2000) bu kavram ile herkesin başkaları ile bilgi ve deneyim inşa ettiği kişisel, bilişsel eylem stratejisine sahip olduğunu varsayar. Bu stratejiler ve fikirler ilgili olduğu düşünülen değerlere göre düzenlenir. Birçok insan için uygulama teorisi daha çok karışık, rasgele ve tutarsızlıklarla doludur.
Mentörlük açısından odak noktası danışanın kendi uygulama teorisini daha iyi anlaması için yardımcı olmasıdır. Mentörlük uygulamanın arkasında yatan teoriye odaklanır. Amaç eylemlerimizi yönlendiren temel değerler hakkında farkındalık oluşturmaktır. Danışandan kendi eylemlerini açıklaması ve gerekçelendirmesi istendiğinde bu temel değerlerle ilgili farkındalığı artar. Bu teorinin içerdiği daha büyük farkındalık danışanın eylem repertuarını genişletmesini mümkün kılmasıdır.
Uygulama teorisinde temel değerler çoğunlukla çelişkili olduğu için danışanın kişisel farkındalık geliştirmesi önemlidir.
Bizlerin profesyoneller olarak neyi savunuyoruz ya da eylemlerimizin arkasında hangi değerler yatıyor gibi sorular profesyonel kimliklerimizi güçlendirmemize katkıda bulunur. Carson ve Birkeland (2009:72-73) uygulama teorisini şöyle tarif eder:

"Uygulama teorisi" kişiseldir çünkü her birey farklı bilgi deneyim ve değerlere sahiptir.
"Uygulama teorisi" değişkendir çünkü bizler sürekli yeni deneyimler ediniriz. Değerler değişime karşı bilgiden daha fazla dirence sahip olsa da, bu değerlerimizde değişimlere neden olur.
Profesyonel yaşamda yeni bile olsa herkesin bir "uygulama teorisi" vardır.
"Uygulama teorisi" büyük ölçüde bilinçsizdir ve formüle etmesi zordur. İnsanlar çoğunlukla eylemleri yönlendiren değerlerin farkında değildir.
"Uygulama teorisi" çoğunlukla tutarsızdır ve birbirleri ile ters düşebilir.
Aksiyon-yansıtma modelinde odak, odağı devam eden günlük etkileşimdeki gayrı resmi mentörlük olan çıraklık modelinin aksine, planlanmış, formüle edilmiş mentör-danışan görüşmeleri üzerindedir. Mentörlük, danışanın ifade ettiği ihtiyaçlar üzerine kuruludur ve genellikle uygulama için mentörlük planı geliştirilir. Bu belge hem mentöre hem de danışanı mentörlüğe hazırlanmaları için yardımcı olur.
Başlangıçta bu model öğretimle ilgili konulara ilişkin öğretmen adaylarına verilen rehberlikle ilgiliydi. Bugün ise deneyimli öğretmenler için de mentörlükte kullanılmaktadır ve mentörlük öğretmenlikteki deneyim süresine göre de değişmektedir. Örneğin yeni başlayan öğretmenler daha açık profesyonel kimlik edinmek için rehberliğe ihtiyaç duyabilir. Daha deneyimli öğretmenler monotonluğu ve tükenmişliği önlemek için rehberliğe gereksinim duyabilir (Carson and Birkeland 2009:72-75).

Handal ve Lauvås aksiyon-yansıtma modelini hümanist ve diyalektik olarak tanımlar. Onlara ilham veren yazarlardan birisi de Ole B. Thomsen’dır. Thomsen öğretmen adaylarının iyi bir öğretim için kriterler geliştirilme sürecine dahil olmaları gerektiğini savunur. Yazarlar ayrıca Carl Rogers'ın kendini gerçekleştirme ve kişisel gelişimi ile ilgili fikirlerinden de etkilenmişlerdir (Skagen 2004: 32). Donald Schön’ün öğretmenlerin kendi davranışları etrafındaki yansıtma becerileri konusundaki vurgusu bu modele ilham veren diğer konudur.

Aksiyon-yansıtma modeli çeşitli yönlerden eleştirilmektedir. Öncelikle, diyalog üzerine odaklanması nedeniyle mentörün profesyonel otoritesini zayıflattığı düşünülmektedir. İkinci eleştiri, bazı soruların kişisel farklılıklar ve tercihlere çok fazla önem verildiği ve belirli rehberlik görevlerine adaptasyon yeteneğinin üzerinde fazla durulmadığı yönündedir. Üçüncü eleştiri, bu modelin kuramsal temellerinin belirsiz olduğu şeklindedir. Yansıtma vurgulanarak, uygun eylemler üzerindeki odak kaçırılabilir. Bu model ayrıca sözel becerileri iyi olan öğrencilerin yararına olmaktadır (Skagen 2004: 124). Søndenå (2004:16) bütün uygulama kuramlarının eşit olarak göz önünde bulundurulmasını sorun olarak görmektedir. Danışanın yeteneklerini yansıtmasını geliştirmek için gösterdiğimiz isteklilik içerisinde, yansıtmanın amacını unutmak olasıdır.

Carson, Nina og Åsta Birkeland (2009). Veiledning for førskolelærere. Kristiansand: Høgskoleforlaget
Handal, Gunnar og Per Lauvås (1983). På egne vilkår: en strategi for veiledning med lærere. Oslo: Cappelen. Revidert utgave fra 1999 er tilgjengelig i full versjon.
Handal, Gunnar og Per Lauvås (1990). Veiledning og praktisk yrkesteori. Oslo: Cappelen. Hele boken elektronisk
Skagen, Kaare (2004) I veiledningens landskap. Kristiansand: Høgskoleforlaget.
Søndenå, Kari (2004). Kraftfull refleksjon i lærerutdanningen. Oslo: Abstrakt forlag.

Altmışlı yıllardan beri terapistlerin söyleşi becerilerine daha fazla odaklanılmaktadır.  Aktif dinleme becerilerine sahip olma şimdilerde daha fazla önemsenmektedir. Aktif dinleme ile ilgili iletişim teknikleri sözel becerilerin yani sıra beden dili gibi sözel olmayan becerileri (örneğin göz teması, hareketler, mesafe vb.) de kapsar. Empati göstermek oldukça önemlidir. Örneğin Bjørndal (2011), alanda empatinin önemini kanıtlayan profesyonel danışmanlık araştırmalarından gelen çok sayıda deneysel kanıtlar olduğunu iddia eden Clark (2007)’tan bahsetmektedir. Carson and Birkeland (2009: 126) aktif dinlemenin her turlu mentörlük yaklaşımının bir parçası olabileceğine inanmaktadır.

Mentör aktif dinleyici olabilmek için danışanın ne söylediğini anlamaya odaklanmalıdır. Mentör danışan ile aynı noktada bulunmak için caba göstermelidir. Literatürden seçtiğimiz mentörler için faydalı olabilecek aktif dinleme tekniklerinden bazı örnekler şöyledir:

Açımlama, mentör olarak danışanın söylediklerini kendi kelimelerinizle tekrar etmeye çalışmayı gerektirir. Bu genellikle danışanın konuyu daha fazla açmasını sağlar. Amaç danışanı argümanlarını daha açık hale getirmesi ve yasadığı kişisel zorluklarla ilgili bir fıkır edinmesi için motive etmektir. Bu teknik ayrıca danışana mentörün anlattıklarını dikkatle dinlediğini gösterir.
Aktif dinlemede çeşitli açımlama türleri mevcuttur. Temel strateji danışanın anlattıkları hakkında anahtar kelimeleri tekrar etmektedir. Örneğin danışanın söylediği son kelime ya da başka ilginç bir kelime söylenebilir. Bu sorgulama  seklinde de olabilir. Örneğin danışan “Bu bakış açısına göre değişir” dediğinde, mentör sorgulayıcı bir tonla “bakış açısı” kısmını tekrarlayabilir. Bu yolla mentör danışanı dikkatle dinlediğini gösterir. Ayrıca danışan yansıtma surecine devam etmek için de teşvik edilmiş olur.
Özetleme, aç imlama ile benzer bir yöntemdir. Her iki yöntem de danışanın ne söyletildiğini tekrar etmeyi içerir. Ancak özetleme daha uzun bir sureci kapsar. Özette, mentör kendi kelimeleri ile konuşmanın içeriğinin kısa bir versiyonunu oluşturur. Aşağıda örnek olarak bazı bilindik formüller yer almaktadır:

“diyorsun ki...”
“… derken seni doğru mu anladım?”
Lauvås ve Handal (2000) açımlamanın mentörlük konuşmalarında en önemli konuşma becerisi olduğunu iddia etmektedir. Buna rağmen çok az mentör bu beceriye sahiptir. Lauvås and Handal (2000), Geldard (1989)’ın açımlamayı danışanın söylediklerinden önemli detayları çıkarma ve bunları daha açık bir şekilde ifade etme girişimi olarak tanımladığına işaret etmektedir. Mentör danışanın ifadelerinden önemli unsurları seçmeye çalışır. Altı çizilen bu unsurlar danışana daha sonraki yansıtma surecinde yardımcı olabilir (Geldard 1989:25).
Lauvås and Handal (2000), bu tanımı çıkış noktası olarak kullanarak, açımlamanın gerçekte tekrarlama ile ilgili olmadığını, aksine söyleneni anlama ve yorumlama ile ilgili olduğunu öne sürmektedir. Örneğin, danışan süreç içerisinde konuşmanın aksini kaçırdığında, O’na yerinde bir tekrar sunmak uygun olabilir. Buna rağmen tekrar, rahatsızlık verici olabilir ve konuşmanın gelişimini durdurabilir. Tersine, eğer yorum danışanın söylediğine yeterince yakın değilse, bu da kafa karışıklığına yol açabilir. Açımlamanın amacı, danışanın yansıtma surecine devam etmesi için desteklemektir. Açımlama, danışan tarafından söylenenlerin özünü devam ettirme olarak algılandığı zaman başarılı olur. Wheeler and Birtle (1993:33-34) açımlamanın 3 amacı olduğundan bahsetmektedir:

Danışana, mentörün kurdukları iletişime dikkatini verdiğini ve bu iletişimin önemini anladığını göstermek.
Danışana mentörün konuşmadan anladıklarını düzeltme fırsatı vermek.
Konuyu daha fazla açmak, detaylandırmak.
Bilinen güçlüklerden birisi de danışanı konuşturmaktır. Danışan düşüncelerini formüle etmeye çalışırken, dikkatle dinlemek oldukça önemlidir. Açımlamada, danışanın fikirlerini netleştirmesi için O’na yardım etmek gerekir.   Örneğin danışan “Bunu daha fazla açıklayamıyorum” dediği zaman açımlama yapmak uygun olabilir. Danışan kendine güvende hissetmiyor olabilir yahut net olmayan düşüncelerini ifade etmekten utanabilir. Mentör kolaylıkla öğüt vermeye başlayabilir. Halbuki danışanların çoğu düşüncelerini organize etmek için yardıma ihtiyaç duyar (Lauvås and Handal 2000).

Sorular, sözel bir eylem olarak güçlü bir araç olabilir. Bir çok insan için sorulan bir soruyu yanıtlamamak oldukça güçtür. Böylece soru sormak konuşmayı kontrol etmek için güçlü bir araç olarak görülebilir. Aktif dinlemede, kapalı sorulardansa açık sorular önerilmektedir. “Buraya nasıl geldin?” sorusu açık sorulara örnek teşkil ederken, kapalı sorulara örnek olarak da “Buraya otobüsle mi geldin?” sorusu verilebilir.
Yeni bir konuya dahil olurken,  konunun neler gerektirdiği ile ilgili tahminde bulunmak kolaydır. Bir kimse bu tahminleri  teyit etmek yahut çürütmek için sorular sormaya başlar. Kapalı soruların pek tavsiye edilmemesinin bir çok nedeni vardır.  Kapalı sorulara genellikle  kısa cevaplar verilir. İstenen bilgileri edinmek için soru sormaya devam edilmelidir. Bu da süreyi uzatır. Ayrıca, mentör konuşmanın konusunu ve yönünü tanımlayacaktır. Böylece kendi bakış açısından neyin önemli ve alakalı olduğuna karar verir (Lauvås and Handal 2000).
Diğer taraftan, açık sorular sorarak danışan yansıtma için cesaretlendirilir. Örneğin;

“Bunu biraz daha açıklar misin/Bunu detaylandırabilir misin?”,
“Söylediğine göre (...) bunun hakkında biraz daha konuşabilir miyiz?”,
“(...)derken ne demek istedin?”, “(...)’yı tanımlarken ne demek istediğini anlamadım”,
“Bunu tekrarlayabilir misin?”,
“Bunun avantajları ve dezavantajları nelerdir?” (Bununla ilgili daha fazla bilgi için “Sorular” kısmına bakınız)
Açık sorular danışanı daha fazla bilgi vermesi için teşvik eder. Örneğin bazı sorular, açıklayıcı bir girişin ardından sorulabilir: “Notlarında yazdıklarını biraz daha anlatabilir misin?” Bu yine de bütün açık soruların iyi ve bütün kapalı soruların kotu olduğu anlamına gelmez. Sorular duruma göre uyarlanmalıdır. Bazı durumlarda, kapalı sorular açık sorulardan daha çok ise yarayabilir.
Lauvås and Handal (2000) mentörlük bağlamında önem taşıyan 3 farklı açık soru türünden bahsetmektedir:

Tamamlayıcı sorular – Bu sorular kavramları detaylandırmak için kullanılır.
Konuyu değiştirmek için sorulan sorular – Bu sorular tartışmayı yeni bir tartışma konusu ile genişletmek için gereklidir.
Kabul edilen sorular -  Öğüt verdikten veya öneri sunduktan sonra mentör inisiyatifi danışana geri vermelidir. Bunu yapmanın bir yolu bu soruları kullanmaktır:  “Bununla ilgili ne düşünüyorsun?” Bu tarz sorular açık ve nötr (yönlendirici olmayan) sorulardır.
Sorular bazen çeşitli sebeplerden işlevsiz olabilirler. Örneğin;

Bir cümlede ya da bir ifadede iki soru sorarız.
Dolambaçlı sorular sorarız.
Sormak yerine yorum yaparız.
Önyargılı oluruz (taraf tutarız).
Karmaşık sorular sorarız (Lauvås and Handal 2000).
Lauvås and Handal çok fazla soru sormamanın önemine dikkat çekmektedir.  Bu bir çeşit sorguya bezeyen bir konuşma yaratır. Böylece danışan zorlanabilir ve sonuç olarak daha az konuşabilir. Danışan konuşmanın inisiyatifini almak yerine konuşmak için  yeni sorular bekleyecektir. Bu iletişim yapısı danışanın kendi ilgileri ile ilgili konularda konuşma becerisinin önüne geçer. Bunun yerine danışan konuşmayı yönlendirmek için teşvik edilmelidir. 
Mentörlük literatüründe, Neden-soruları genellikle önerilmez.  Bu tarz sorular, hemen suçlama olarak yorumlanabilir, örneğin bir kimsenin yanlış bir şeyler yaptığı izlenimi verebilir. Bu durumda danışan savunmacı bir tavır alabilir. Ayrıca birçok öğrencinin deneyimi, öğretmenlerin cevap yanlış olduğu zamanlarda neden sorusu sorması ve öğrenciyi tekrar denemesi için yönlendirmesi şeklindedir (Lauvås and Handal, 2000). Bunun yerine sorulara kim, ne, ne zaman, nerede ve hangi soru kelimeleri ile başlanmalıdır.

Geldard (1989) temel  bir konuşma becerisi olarak “özenli olmanın” önemini vurgulamaktadır.  Danışan mentörün konuşma ile ilgilendiğini hissetmelidir. Bu teknik bir beceri olmaktan çok doğru tutuma sahip olma sorusudur. Aşağıda danışana karşı özenli olmakla ilgili bir takım özelliklerden bahsedilmektedir. Bu özellikler bazen minimum yanıtlar ve genellikle bireyin beden dili ile ilgilidir.
Örnek olarak; “evet”, “tamam”, “hımm” gibi kelimeler kullanmak ya da basını sağlamak olabilir. Bu tarz minimum tepkilerle mentör danışanın anlattıklarıyla ilgilendiğini gösterir. Buna rağmen bu tepkiler çok fazla kullanıldığında danışan mentörün özenli olmaya çalıştığından şüphe duyabilir ve rol yaptığını düşünebilir. Aşırı vurgulama konuşmayı tekrara düşmüş gibi gösterebilir. Odak kolaylıkla konuşmanın daha teknik yönlerine kayabilir. Göz teması bir diğer asgari tepkidir. Göz teması olmaksızın, iki kişi arasındaki konuşma sağlıklı değildir. Ayni zamanda, konuşma sırasında karşıdaki kişiye sabit bakmak da olumsuz bir etki bırakır. Kişi, karşısındaki kişiye çok fazla dikkat gösteren, davetsiz ve istilacı olarak ve algılanabilir (Lauvås and Handal, 2000).

Yansıtma mentörün danışanın duygularını tanımlamak için yorumladığı zaman gerçekleşir:

“Sesin çok üzgün geliyor, bir şey mi oldu?
“Başarından duyduğun gurur söylediklerinden anlaşılıyor!”
Yansıtma terapilerde kullanılan önemli bir konuşma tekniğidir.  Tanınmış psikolog Carl Rogers bir terapistin rol model olarak iyi davranışlar göstermesi gerektiğini düşünmektedir. Bir video sunusunda, danışanı ile ilişkisini su şekilde tanımlamaktadır: “Eğer danışan benim tarafımdan anlaşılırsa, kendini daha iyi anlayacaktır. ”, “Eğer danışan benim gerçekliğimi (otantikliğimi) hissederse, kendi gerçekliğini (otantikliğini)  de hissedecektir” [1].

Tarihsel olarak, aktif dinleme Carl Rogers ile ilişkilendirilir. Rogers danışan-merkezli terapiyi kurmuştur (ayrıca kişi-merkezli olarak da bilinir). 
Bu terapi sekli, mentörlük anlamında iyi bildiğimiz bir alan olarak psikolojide çok etkilidir. Danışan-merkezli terapi deterministtik yaklaşımlardan hem davranışçılığa

Sistemik mentörlük  danışanların insanların çevrelerini nasıl etkiledikleri ve çevrelerinden nasıl etkilendikleri ile ilgili farkındalık edinmesi için tasarlanan bir rehberlik yaklaşımıdır. Bu rehberlik yaklaşımı Gregory Bateson ve Urie Bronfenbrenner,  tarafından sunulan fikirler üzerine kurulmuştur. Bir kimse her zaman bir sosyal sitemin ve kişiler arası ilişkilerin bir parçası olarak görülür (Skagen 2004;89-90). Sistem teorisinde temel kavramlar bütünlük, insan ilişkileri ve döngüselliktir.
“Bütünsellik” kavramı birbirleri ile ilişkili fenomenleri vurgulamak için kullanılırdı. Sonuç olarak insanlar insan ilişkilerinde daima karşılıklı olarak birbirlerini etkilerler. Örneğin, bir eğitim kurumunda mentörler arasında, okul yönetimi ve mentör arasında, ve danışan ve mentör arasında ilişkiler vardır. Her ne kadar tarafların tümü rehberliğe doğrudan katılmasa da, rehberliğin nasıl organize edileceğini etkileyebilir. Ek olarak, kurumsal düzeyde mentörlüğe dahil olan kurumlar arası ilişkiler de söz konusudur (cf. Bronfenbrenner). Böylece, danışan bir sorun çözmeye çalıştığı zaman, mentörlüğe doğrudan dahil olan taraflardan biri olabilir (Skagen 2004:90).
Günlük etkileşimde davranışlarımızı var olan sebep ve sonuçlara göre değerlendirme eğiliminde oluruz. Bu düşüncenin sonucu ilgili bütün bakış açılarını göremeyeceğimiz anlamına gelir (Skagen 2004:90). Sistemik mentörlükte neden-soruları olarak bir sebep-sonuç ilişkisinin (örneğin “Bunu neden yaptın?”) varlığına işaret ettiği zaman verimsiz olarak düşünülür. Bunun aksine tarafların etkileşime sürekli katkıda bulunduğu sistemik mentörlük daha döngüsel bir açıklama modeli kullanır. Bir etkileşimi açıklarken öncelikle etkileşimi noktalamalıyız.  Noktaladığımız zaman, etkileşim sürecini bitirir, etkileşimi yorumlamaya başlarız. Bunun arkasında yatan, taraflar arasında olanların nedenlerini açıklarız. Bir durum “öğretmen öğrenciler çok gürültü yaptığı için bağırıyor” şeklinde yorumlanabileceği gibi “öğrenciler gürültü yapıyor çünkü öğretmen bağırıyor” şeklinde de yorumlanabilir. “Noktalama” kavramı bir olayı anlamak için her zaman alternatif yollar olduğu anlamına gelir. Eğer etkileşimi farklı şekilde noktalarsak, etkileşimle ilgili farklı bir anlama ediniriz (Carson and Birkeland 2009: 92-94).

Sistemik mentörlükte, danışanın zor durumlara çözüm bulmakta yetersiz olduğu varsayılır. Değişimi tetiklemek için Milan grup tarafından geliştirilen dairesel sorular kullanılabilir (Carson and Birkeland 2009:102-103). Bu sorular dört kategoriye ayrılır. Bunu betimlemek için bir örnek vererek başlayacağız:

Eğitim lideri bu olayla ilgili danışmanlık istiyor. Bir sonraki bölümde bu mentörlük yaklaşımında yaygın olarak kullanılan farklı soru türlerinden bahsedeceğiz.

Bu sorular dört alt kategoriye ayrılır.

Bu sorular bir duruma herkesin farklı tepki verdiği varsayımına dayanır. Amaç insanların bir durum karşısında nasıl farklı davrandığı ile ilgili farkındalığı arttırmaktır. Birinci örnekteki hikayede bu mentörlük yaklaşımı içerisinde mentör şu soruları sorabilir: 

Olayda kimler var?
Bente’nin davranışı karşısında diğer çocuklar nasıl tepki verdi?
Bente’nin davranışı karşısında diğer asistanlar nasıl tepki verdi?
Sorular danışanın mevcut kişilerin farklı tepkileri konusundaki farkındalığını arttırır ve olayı daha iyi anlamasını sağlar. 

Bu sorular kişiler arası ilişkilerdeki farklılıkları araştırır. Danışandan farklı ilişkileri tanımlaması ve nasıl farklı olduklarını açıklaması istenir. Sorular şöyle olabilir:

Bente ile Per arasındaki ilişki nasıl?
Bente ile diğer çocuklar arasındaki ilişki nasıl?
Bente ile senin arandaki ilişki nasıl?
Bente ile diğer asistanlar arasındaki ilişki nasıl?
Bente’ye en yakın kim?
Senin Bente ile ilişkin diğer asistanlar ile olan ilişkinden nasıl farklı?
Bu sorular bir ilişkideki birçok farklılığı ortaya çıkarabilir. Bende ile olan ilişkilerle ilgili farkındalığı arttırır.

Bu sorular diğer kişilerin durumu nasıl algıladığını düşündüğümüze odaklanır. Amaç bizi durum etrafında farklı düşünmeye teşvik etmektir. Şu tarz sorular sorabiliriz: 

Bente’nin bu şekilde davrandığı zaman ne düşündüğü hakkında neler düşünüyorsun?
Diğer asistanın Bente’nin davranışını fark ettiğinde ne düşündüğü hakkında neler düşünüyorsun?
Aynı durumda sen olsan Bente’den farklı olarak ne yapardın?
Bente bu davranışını nasıl açıkladı?
Bu sorularla durumun nasıl anlaşıldığına ilişkin düşüncelerin ortaya çıkarılması amaçlanmaktadır. Bu farklı düşünceleri ve çocukların algılarını içerir.

Bu sorularla insanların yeni durumlar karşısında farklı yollardan verdiği tepkileri göz önünde bulundurmuş oluruz. Odak daha önceki durumlara dahil olan taraflar ve onların nasıl farklı davrandıkları üzerindedir. Daha önceki örneklerle karşılaştığımızda şu soru ortaya çıkabilir: 

Bente, Per’e karşı daha önce benzer şekilde davranmış mıydı?
Bütün bu sorular danışana deneyimlenen durumun daha geniş ve karmaşık bir resmini sunar.

Bu sorular danışana birbirini karşılıklı olarak etkileyen insanlar hakkında farkındalık vermeye çalışır. Sorular danışanın başkalarının davranışlarına ve bu davranışları nasıl karşıladığımıza odaklanır. Başka birinin bakış açısını anlayabilme becerisi empati için esastır. Aynı durumla ilgili şu sorular sorulabilir:

Bente’nin senin davranışını nasıl karşıladığını düşünüyorsun?

Üçlü soruların amacı etkileşime dahil olan üçüncü tarafın farkına vardırmaktır. Şöyle sorular sorulabilir: 

Çocukların sen ve asistanların arasındaki ilişkiyi nasıl algıladığını düşünüyorsun?
Per’in, diğer çocukların ve diğer asistanların senin müdahaleni nasıl karşıladığını düşünüyorsun?
Bu sorular ayrıca insanlar arasındaki karşılıklı ilişki hakkında farkındalık yaratmaya çalışır. Mentör danışana kendi davranışlarının dışarıdan nasıl göründüğünü gözleme becerisi geliştirmeleri için yardımcı olmalıdır (Carson and Birkeland 2009: 105).

Çeşitli olası senaryolar ile ilgili sorular sorularak, danışan alternatif seçenekler ile ilgili görüşlerini bildirmesi için teşvik edilir. Olası sorular:

Bente işi bıraksaydı ne hissederdin?
Bente ile ilişkinde bir şeyleri değiştirebilseydin, neyi değiştirirdin?
Asistanınla bir anlaşmaya varabilmeniz için gerekli olan nedir?
Eğer istediğin değişiklikleri yapabilseydin, durum nasıl olurdu?
Böyle bir değişikliği engelleyen nedir? (Carson and Birkeland 2009: 105)
Bu tarz farazi sorular danışana alternatif davranış biçimi aramak için yardımcı olabilir. Ayrıca problem çözüldüğünde durumun nasıl görüneceğini derinlemesine düşünmesi için teşvik etmek önemlidir.

Kreş danışmanı Berit iki asistan, bir yardımcı öğretmen, ve özel eğitim öğretmeninden oluşan bir grup çalışanın yöneticisidir. Aşağıda Berit’in yazdığı sistemik mentörlükle ilgili iki kişisel hikayeye yer verilmiştir (Carson and Birkeland 2009: 107-110).
Mentörlük konuşması

İlk kişisel hikaye Berit’in yıkıcı etkileşim örgülerine takıldığını gösteriyor. Genel varsayım sorunun diğer kişi olduğu ve O’nun değişmesi gerektiği şeklindedir. Kendimizde nasıl değişiklik yapabiliriz kısmını görmek zor olabilir. İkinci hikayede Berit pedagojik lider olarak kendi sorumluluklarını  daha iyi anlamaktadır.

Baltzersen, Rolf K. (2008). Å samtale om samtalen. Bergen: Fagbokforlaget.
Bomar, Perri J. (2003), Promoting Health in Families: Applying Family Research and Theory in Nursing
Carson, Nina og Åsta Birkeland (2009). Veiledning for førskolelærere. Kristiansand: Høgskoleforlaget
Gjems, Liv (1995) Veiledning i profesjonsgrupper. Oslo: Universitetsforlaget. Hele boken
Skagen, Kaare (2004) I veiledningens landskap. Kristiansand: Høgskoleforlaget.
Ulleberg, Inger (2004). Kommunikasjon og veiledning : en innføring i Gregory Batesons kommunikasjonsteori - med historier fra veiledningspraksis. Oslo: Universitetsforlaget.

Takdir edici sorgulama kişi ve kuruluşları en iyi şekilde tanımlamak ve teşvik etmek için bir mentörlük yaklaşımıdır. “Takdir edici” takdir ettiğimiz ve değer oluşturan şeylere odaklanmaya teşebbüs etmek anlamına gelir. “Sorgulama” şu anda işe yarayan ve değeri olan şeyleri araştırmak anlamına gelir. Takdir edici sorgulama son yıllarda daha fazla dikkat çekmektedir (Cooperrider & Srivastva 1087; Cooperrider & Srivastva 1999; Cooperrider & Whitney 2000).
Takdir edici sorgulama yaparken, kişinin yaşamına dair kendisinin anlamlı ve verimli olduğunu düşündüğü yönleri inceleyerek başlamalıyız. Bu yaklaşım, insanların önceden var olan kaynaklarını güçlendirerek dönüştürücü hedeflerine daha hızlı ulaşacakları varsayımı ile yapılır. Bir durum alternatif problem analizi yöntemleri ile de güçlendirilebilir. Fakat problem analizi, durumu daha kötü hale de getirebilir (Cooperrider & Srivastva 1987).  Cooperrider & Srivastva (1987)’e göre takdir edici sorgulama aşağıdaki varsayımlar üzerine kurulur:

Bu değişikleri yaparken çalışanlar kurumda neyin önemli olduğunu, iyi, mutlu bir yaşamı neyin oluşturduğunu, kurumda gelişmeyi ve özgürlüğü neyin sağladığını anlayacaktır (Ludema, Cooperrider & Barrett 2006).  Kendi gücünün ve niteliklerinin farkına  varan insanlar daha özverili olur. Neyin işe yaradığını anlamak için, iyi deneyimlerin ve gelişimin özelliklerini yansıtmak gerekir. Bu yaklaşımın kuramsal temeli aşağıdaki varsayımlara dayanır:

Takdir edici sorgulama dört aşamada gerçekleşir (Cooperrider & Srivastva 1999; Cooperrider & Whitney 2000; Ludema, Cooperrider & Barrett 2006; Whitney & Trosten-Blom 2003). 4-D (Discovery, Dream, Design and Destiny) döngüsü olarak da bilinen bu aşamalar şöyledir: Keşif, Hayal, Dizayn/Tasarım, Talih.
1. Keşif
Keşif aşamasının amacı kurum ya da bireyin performansının en iyi olduğu yeri belirlemektir. Keşif sistemik grafik doğrultusunda gerçekleştirilir. Örneğin mülakat gibi nitel veri toplama yöntemleri kullanılabilir. Bu veri toplamada yaygın yöntem olumlu hikayelerin araştırılmasıdır.
Fikir hikayeler anlatarak, yaşamlarımızı nasıl algıladığımız ve deneyimlediğimizi ortaya çıkarmaktır. Bu hikayeleri ve onlarla birlikte deneyimlerimizi ön plana çıkararak, günlük yaşamımızda bize güç veren şeyler ve değer verdiklerimiz üzerine kurulu ortak bir deneyim oluşturabiliriz. Mülakatlar esnasında, aşağıda yer alan olumlu sorular kullanılabilir:

Bizi mutlu eden nedir?
Ne tür katkılar bizi mutlu ediyor?
Bizi olumlu olmaya iten şeyler nelerdir?
Çalışanları bu süreçte dinlerken, onların hikayelerinin güç veren yünlerini araştırmaya ve belirlemeye çalışmalıyız. Kilit nokta güç verici hikayeleri açığa çıkarmak ve kişilere ve kurumlar için hayati önemi olan alanları anlamaktır.
2. Hayal
Önemli deneyimleri tabloladıktan sonra, gelecek için kurulan hayaller ve vizyon oluşturulur. Tercih edilen gelecek anlayışı değişebilir. Tekdir edici sorgulamanın işe yaraması için, katılım üzerine temellendirilmelidir. İdeal olan,  kurumdaki ya da takımdaki bütün çalışanların dahil olması, ve mümkün olan en kısa zamanda iş birliği yapılmasıdır.
3. Dizayn/Tasarım
Dizayn aşamasında çalışanlar kurumun gelecek hayalini ya da vizyonunu karşılayacak uygulamalar için gün be gün kesin tanımlamalar yaparlar. Kesin amaçları belirler ve bir eylem planı yaparlar. Bu aşamada kurumun çalışanlar arzu edilen gelişimi destekleyecek ilişkiler ve sistemler oluşturmak için uğraşırlar.  Bu aşamanın amacı vizyonu ve bu vizyonu gerçekleştirmek için nelere ihtiyaç duyulduğunu tanımlamaktır.
4. Talih
Bu aşamada çalışanlar dizayn aşamasında geliştirilen hedefleri gerçekleştirmek için inisiyatif alırlar. Bu neye, ne zaman ihtiyaç olduğunu ve bunu kimin yapacağını tanımlayan belirli eylem planları gerektirir. Çalışanlar geçmişten gelen olumlu deneyimleri teşvik eder ve yeni ölçümler yapar. Öğrenme süreci düzenleme ve deneme şeklinde devam eder. Bu aşamadan daha fazla faydalanılması tespit edilen değerlendirme ve gelişim için kullanılan etkili ve yaratıcı araçlara dayanır.

Takdir edici sorgulama; 

kullanılır (Cooperrider & Srivastva 1999; Cooperrider & Whitney 2000; Ludema, Cooperrider & Barrett 2006; Whitney & Trosten-Blom 2003).

Cooperrider, D.L. and Srivastva, S. (1987). Appreciative Inquiry in Organizational Life, Research in Organizational Change and Development, 1, pp. 129-169. Original article (read 15.06.12)
Cooperrider, D. L., & Srivastva, S. (1999). Appreciative inquiry in organizational life. In: S. Srivastva & D. L. Cooperrider (Eds), Appreciative Management and Leadership: The Power of Positive Thought and Action in Organization (Rev. ed., pp. 401–441). Cleveland, OH: Lakeshore Communications.
Cooperrider, D.L. & Whitney, D. (2000). A Positive Revolution in Change: Appreciative Inquiry. Appreciative Inquiry Commons. Original article
Ludema, J.D., Cooperrider, D.L., & Barrett, F.J. (2006). Appreciative Inquiry: the Power of the Unconditional Positive Question. I Reason, Peter & Bradbury, Hilary (Eds.) (2006). Handbook of Action Research. Sage. London
Whitney, D. & Trosten-Blom, A. (2003). The Power of Appreciative Inquiry. A Practical Guide to Positive Change. San Fransisco: Berrett-Koehler Publishers
http://appreciativeinquiry.case.edu/uploads/Introduction%20to%20Appreciative%20Inquiry.pdf

Appreciative Inquiry Commons (http://appreciativeinquiry.case.edu) has articles and commentaries on Appreciative Inquiry in theory and practice, as well as information on workshops and conferences.
The Taos Institute (http://www.taosinstitute.net/)
Anne Radford (http://www.aradford.co.uk/) is editor of AI Practitioner and has other AI resources.

Tarihsel olarak zanaatkarların formal eğitim almaları oldukça zordu. Eğitim çırakların sürekli olarak mentörlük alabildiği çalışma ortamlarında deneyimli zanaatkarların gözetimi altında gerçekleşmiştir. Usta bir işin doğru şekilde nasıl yapılacağını göstererek tarif eder ve sonrasında çırak ustanın becerilerini taklit ederek aynı işi yapmaya çalışır. Bu süreçte usta çırağın her yanlışını düzeltir.
Bu geleneksel çıraklık modelinin tarihi Orta Çağ’da Avrupa’sında loncalara dayanmaktadır. Loncalar 12. Yüzyılda ortaya çıkmıştır. Eğitim başlamadan önce, çırak ve  usta zanaatkar eğitimin belirli dönemleri için resmi bir sözleşme imzalardı. Çırak  kalfa olmadan önce, yani bir alan ya da beceri için yetişmiş kişi olmadan önce birkaç yıllık çıraklık kontratını imzalamalıydı. Ancak bir alan ya da beceri için yetişmiş kişi olmak usta olmak anlamına gelmez (Skagen 2004:118). Britannica Ansiklopedisinde (2013 dijital baskısı) çıraklığı şöyle tanımlamaktadır: “usta ile çırak arasındaki ilişkinin süresini ve koşullarını tanımlayan yasal bir anlaşma çerçevesinde bir sanat, ticaret ya da zanaat eğitimi.” 
“Çıraklık” terimi iki şekilde kullanılabilir. İlki mesleki eğitime kapsamında yasal kurumsal yapılan çıraklık eğitimini tanımlar. İkincisi ise acemi kişinin deneyimli kişiden öğrenmesi şeklindeki ilişki için kullanılan genel metafordur. Usta işin nasıl yapılması gerektiğini bilir. Usta çırak için işin nasıl yapıldığını modeller. Çırak ustanın örneğini takip etmeye çalışır. Son on yıldır çıraklık modelinin yeniden doğuşuna tanık olunmuştur ve artık günümüzde usta-çırak ilişkisi mesleki öğrenmede iyi bir yöntem olarak düşünülmektedir. Çıraklık modeli ayrıca geleneksel mesleki eğitimin haricinde de genel bir pedagojik bir model olarak tanıtılmaktadır (Nielsen and Kvale 1999).

Çıraklık modeli mesleki pedagoji içinde özellikle güçlü bir dayanağa sahiptir (Skagen 2004: 118).  
Bir metafor olarak, iki kişi arasında bulunan asimetrik bir ilişki anlamına gelir. Bu iki kişiden birisi (usta) ticari becerilere hakimken, diğeri (çırak) bu becerilere sahip değildir.  Geleneksel öğretmen-öğrenci ilişkisine benzer şekilde, bu model tek yönlü iletişim üzerine kuruludur. Bu süreç boyunca, çırak ustasını bu becerileri kullanırken gözlemlemeyerek örtük bilgi edinir (Polanyi 1958). Bu bakış açısı çocuk ve ebeveynleri arasındaki ilişkiyi analiz ederken de kullanılabilir. Günlük etkinliklere katılım doğrultusunda, çocuklar ebeveynlerini gözlemleyerek bazı becerileri öğrenirler (Rogoff 1990).  Bu tür öğrenme bazen  gözlem yolu ile öğrenme şeklinde tanımlanır (bkz Albert Bandura).

Nielsen ve Kvale (1999:19) pedagojik anlamda çıraklık modelinin dört özelliğinden bahsetmektedir: 

Çıraklık modeli sadece sözel iletişim ile edinilemeyecek yetkinlikler üzerine kuruludur. Yetkinlik kısmen duruma bağlı ve doğaçlamadır. Böylece bu usta için bir görevin nasıl tamamlanacağını göstererek tarif etme ile bunu kelimeler ile anlatmak arasında zor bir karardır. Görselleştirme, göstererek tarif etme, gözlemleme ve taklit (imitasyon) temel tekniklerdir.

 Durumlu öğrenme (situated learning) teorisi çıraklık modelinde esastır (Lave and Wenger 1991). Odak bilişsel süreçte değil (örneğin bkz. bilişsel öğrenme teorisi) kişiler, külütrel araçlar ve sosyal topluluk  arası etkileşim doğrultusunda öğrenme üzerindedir.
Jean Lave ve Etienne Wenger (1991) bu teoriyi Afrika toplumlarında esnafların nasıl öğrendikleri ile ilgili çalışmalar yaparak geliştirmiştir. Öğrenme, “ortak bir etki alanında kolektif bir öğrenme süreci ile meşgul insanlar tarafından oluşturulmuş” uygulama topluluklarına katılım ile gerçekleşmektedir. Uygulama topluluklarında, çırak başlangıçta “meşru çevresel katılımcı (legitimate peripheral participant)” olarak görülür. Öğrenme yörüngesi öğrenme topluluğundaki bireylere verilen olanaklara bağlı olarak değişir (Nielsen and Kvale 1999).
Lave and Wenger (1991), uygulama toplulukları odağı ile, bir birey ustanın pedagojik öneminin vurgusunu azaltmıştır. Çırak ayrıca hem diğer çıraklardan hem de deneme yanılma yoluyla çok şey öğrenir.  Bu yaklaşım Hubert ve Stuart Dreyfus’un odaklandığı aceminin ustadan birebir ilişki içerisinde gözlem ve taklit yolu ile öğrendiği yaklaşımı ile çelişmektedir. Aceminin geniş bir ortamın parçası olması gerekmez. Bu öğrenme şekli spor ve araştırma alanlarında da geçerlidir.
Uygulama toplukları literatüründe, iskele terimi öğretimin çırağın ihtiyaçlarına nasıl adapte edildiğini tarif etmek için kullanılır. İskele, ustanın uygulama ödevlerini basitleştirerek, hedefi açıklayarak, çırağın ürettiklerinin kalitesini değerlendirerek destek önermesi ve iş için ilgi oluşturması anlamına gelir. Usta ayrıca çırağın hayal kırıklıklarını bir tarafa, risk alma isteğini ise diğer tarafa koyarak dengelemeye çalışmalıdır (Rogoff’dan esinlenilmiştir). İskele terimi Lev Vygotsky tarafından geliştirilen yakınsal gelişim alanı terimi ile benzerdir. Yakınsal gelişim alanının altında yatan fikir çırağın oluşturulan durumda daha yetkin kimseden destek alarak yalnızca yeni becerileri öğrenebilmesi şeklindedir. Öğretmen matematik problemlerini çözerken sesli düşünebilir ve öğrencilere strateji geliştirme ve problem çözme için şans verebilir. Gözlemsel öğrenme, öğrenenin  gözlem doğrultusunda modelin yeni davranışlarını taklit etmesi şeklinde gerçekleştirilen bir diğer önemli öğrenme yöntemidir
. Bu teori Albert Bandura tarafından geliştirilmiştir.

Dil zanatkarların eğitiminde, özellikle gözlem ve örnekleme sırasında genellikle ikincil bir rol oynar. Daha önemlisi, mentörlük ve uygulama birlikte gerçekleşir. Örneğin, deneyimli mimarlar öğrencilerine çizim başında mentörlük yapar. Öğrenciler seçimlerinin altında yatan nedenleri tartışarak nasıl çizim yapacaklarını öğrenirler. Skagen (2004:19)’e göre, Donald Schön çıraklığın başkasının eylemlerini basitçe kopyalama şeklinde olan biçimini reddeder. Schön bunun yerine çırağın bu deneyimleri kendi çalışma stilini geliştirmesi için kullanması gerektiğini savunur. Schön bu süreci tanımlamak için yansıtıcı öykünme, taklit ederek yorumlama ve seçici yorumlama terimlerini kullanır. Ana fikir öğrencinin bağımsız bir çalışma içerisine girmeden önce bağımlı bir ilişkiye girmesi gerekliliğidir. Bir mimarın öğrencilerine nasıl mentörlük yaptığını betimlemek için Skagen (2004) birisi  Schön'ün kitabından olmak üzere iki kişisel hikaye anlatmaktadır:

Bir takım eleştirilere göre çıraklık modeli; mentörlük ile ilgili değildir. Norveç’te öğretmenlik eğitiminde, örneğin, mentörlük dersleri geleneksel olarak aksiyon-yansıtma modeline dayanır. Aksiyon-yansıtma modeli çıraklık geleneğine bir tepki olarak ortaya çıkmıştır. Geleneksel çıraklık modelinin eleştirilerine göre, o zamanda baskın olan, az olmakla birlikte “papağan öğretmenler” yetiştirmiştir. Şimdilerde çıraklık modeli mentörlük pedagojilerine giriş niteliğindeki kitaplarda çeşitli mentörlük yaklaşımları arasında yer verilerek meşrulaştırılmıştır (Skagen 2004 ve Løv 2009). Buna rağmen, öğüt verme bu yaklaşımda diğer mentörlük yaklaşımlardan daha fazla önemsenir.
Çıraklık modelinin genellikle bireysel mentörlüğe (örneğin aksiyon-yansıtma modeli) odaklanan geleneksel mentörlük yaklaşımlarının tersine bazı teoriler grup mentörlüğüne (örneğin uygulama toplulukları teorisi) de odaklandığını unutmamak gerekir. 
Ayrıca, mentör-danışan konuşmalarının önemi üzerine kurulu olan aksiyon-yansıtma modeli ile karşılaştırıldığında, çıraklık modelinde resmi olmayan mentörlük daha fazla önemsenir.
Çıraklık modeline yapılan eleştiriler aşağıda özetlenmiştir: 

Çıraklık modeli ödevler için tek bir doğru çözüm gerektirdiği için eleştirilir. Bu yaklaşım geleneksel uygulamaları destekler ve yaratıcılık ve yeniliğin önüne geçer.   Öte yandan çıraklık modelinin destekçileri, daha sonra yaratıcılığın geliştirilmesi için gerekli olduğunu iddia etmektedir.
Çıraklık modeli yansıtma ve mesleki uygulama arasındaki yakın bir bağlantı gerektirir. Sözel ifadelere ihtiyaç duyulmaz ve sonuç daha yüzeysel bir yansıtma olabilir.
Çıraklık modeli danışanın kendi gelişimi ile ilgili isteklerini ve kriterleri şekillendirmesi hakkını küçümser. Bunun yerine  mentörlük uygulamalarını mesleki gelenekler yönlendirir. Mentörlük yaklaşımı yaratıcılık, kendini geliştirme ve öğrenenin özerkliğine çok fazla odaklanan yenilikçi eğitim eleştirir.
Ustanın bir zanaat ya da bir meslek içinde yetkili olması gerektiğini gerçeği mentörlük yapabilecek kişileri kısıtlar. Aksiyon-yansıtma modelinde mentörün iyi ilişkiler geliştirebilmesi ve iyi sorular sorabilmesi için iletişim konusunda yetkin olması önemlidir. Mesleki bilgiler konusunda bilgisinin olması aynı derecede önemli sayılmaz.
Çıraklık modeli uygulamaya teoriden daha çok değer vermesi yönünden eleştirilir. Mesleki becerilerde ustalaşmayı fazla önemsemek önemli kuramsal ilkeleri öğrenmek için ayrılan zaman baltalayabilir (Skagen 2004: 122-123).

Son on yılda, öğretmen eğitiminde öğretmenleri yoğun bir şekilde yansıtıcı olmaya teşvik etmeye odaklanılmaktadır (Skagen 2004: 121).  Örneğin Hiim ve Hippe’nin , öğretici modeli bu fikir üzerine kuruludur. Skagen (2004: 125-126) bu mentörlük yaklaşımını tek yönlü olduğu için eleştirmektedir. Yansıtıcı konuşmalar baskındır. Bugünlerde, yeni bir öğretmene öğretmenlik mesleğine girişini takiben diğer öğretmenleri çok fazla gözlemleme fırsatı olmadan öğretme sorumluluklarının tamamı verilmektedir. Bu çıraklık modelinde, alternatif olarak öğretmen adayının yetkinlik kazanana kadar öğretme sürecinin parçası olduğu bir durum resmedilebilir. Mentörlük modellerinin öğretmen eğitimi stajlarında gerçekte kullanıldığını gösteren çok az deneysel çalışma olduğu söylenebilir.

Hiim, Hilde og Else Hippe (2006) Undervisningsplanlegging for yrkesfaglærere. Oslo: Gyldendal akademisk forlag.
Lave, Jean og Etienne Wenger (1991). Situated learning : legitimate peripheral participation. Cambridge: Cambridge University Press .
Nielsen Klaus og Steinar Kvale (1999). Mesterlære: læring som sosial praksis. Oslo: Ad Notam Gyldendal.
Polanyi, Michael (1958)

Hubert L. ve Stuart E. Dreyfus öğrenme surecine ilişkin çeşitli çalışmalardan bahsetmekte ve bir kimsenin farklı düzeylerden geçerek beceri kazandığını iddia etmektedir. Teorilerini deneysel çalışmalara ve bisiklete binmek, yüzmek, pilotluk gibi duyusal-motor becerileri ile satranç oynama gibi bilişsel becerileri gözlemleme üzerine dayandırırlar. “Mind Over Machine” (1986) adli kitaplarında, beceri kazanımında düzey modelini şöyle tanımlamaktadırlar:

Hubert L. ve Stuart E. Dreyfus bireyin bir kez beceri edindiğinde, farkında olarak ya da olmayarak kuralları düşünmeden davrandığından bahsetmektedir. Eylemin nedenini anlamasına gerek yoktur. Bu konuda Dreyfus ve Dreyfus (1999) filozof Merleau-Ponty’den ilham almıştır. Merleau-Ponty’e göre “bir kimsenin durumu optimum beden-çevre ilişkisinden saptığı zaman, o kişinin eylemi ideal olana daha çok yaklaşır ve böylece sapma durumunun neden olduğu gerginlik azalır.” Bir kimsenin neyin ideal olduğunu bilmesi ya da ifade etmesi gerekmez. Kişinin bedeni basitçe içinde bulunduğu durum ile denge durumuna gelir (Dreyfus 1998).”

Yetenekli bir futbol oyuncusu rakibe ne zaman ve nasıl çalım atacağını çabucak anlar (Tiller 2006).  Yetenekli bir futbolcunun çalım atmadan önce çalım atma kurallarını için zamanı olduğuna dair hiç bir gösterge bulunmamaktadır. Maradona 1986 dünya kupasında bütün İngiliz defansına çalım atarken bunu önceden bir planlamamıştı. Bu durumda, Maradona topu paslaması ya da çalımlara devam etmesi gereğini hızlıca değerlendirmiştir. Maradona’nın uzmanlığı örtük bilgi ile bağlantılıdır. Örtük bilgi açık olmayan bilgiyi ifade edilmektedir; başkaları ile her zaman kurallar ya da farklı öneriler aracılığı ile iletişim kuramayabiliriz. Nasıl ki usta bir şoför kendi arabası ile ‘bir’ ise usta bir öğretmen de kendi sınıfı ile ‘bir’dir.  İçgüdüsel/sezgisel karar verme sureci ile ilgili araştırmalar, rasyonel karar verme sureci ile ilgili yapılan araştırmalara nazaran çok daha azdır.

Bu videonun sonlarına doğru, Dreyfus uzman seviyesine ulaşmak için (aşağıda bahsedilen rutinlere karşı) risk almamız gerektiğini vurgulamaktadır. Ciddi hatalar yapmadan ve bu hatalardan ders çıkarmadan uzman olmak mümkün değildir.

Dreyfus, Hubert L., Dreyfus, Stuart E. og Tom Athanasiou (1986). Mind over machine : the power of human intuition and expertise in the era of the computer. New York: Free Press
Tiller, Tom (2006). Aksjonslæring - forskende partnerskap i skolen : motoren i det nye læringsløftet. Kristiansand: Høgskoleforlaget
Bakke, Kari Renate & Emil Severin Tønnesen (2007) Lave & Wenger og Dreyfus & Dreyfus. Master thesis. Oslo: University of Oslo http://www.duo.uio.no/sok/work.html?WORKID=62030
http://www.class.uh.edu/cogsci/dreyfus.html

Koçluk terimi İngilizcede ulaşım aracı anlamına gelen “coach” kelimesinden gelmektedir. 19. yüzyıl İngiltere’sinde bu kelime öğrencileri sınavlara hazırlayan özel ders öğretmenlerini tarif etmek için kullanılmıştır.
Ulaştırma için kullanılan bu kelimenin öğretmen için kullanımına dönüşümü 19. yüzyılda öğrencilerin öğretmenlerini, Onları sınavlara hazırlayan bir araç gibi görmesi nedeniyle olmuştur. Mentörlükte ilgili daha güncel algılarda, “koç” kelimesi danışanın içsel yolculuğunda rehberlik eden ya da yardımcı olan gibi metaforik anlamlarda kullanılmaktadır. Koç danışana, akli ya da uygulama becerilerini iyileştirerek yeteneklerini geliştirmesi için yardımcı olmaktadır (Skagen 2004).

Koçluk esasında bir mentörlük biçimi olarak Amerikan sporlarında geliştirilen geliştirilmiştir. Norveç futbol koçu Knut Rockne mentör konseptinde spor koçluğuna öncülük etmiştir. Buna rağmen, tenis koçu Timothy Gallwey mentör olarak danışanın içsel yolculuğuna rehberlik edilmesi anlamında koçluğu tanıtmıştır. Gallwey iyi bir tenis oyuncusu olmanın anahtarının “içsel oyun”a hükmetmek olduğunu iddia etmektedir. “Tenisin İçsel Oyunu” isimli kitabı koçlukta Myles Downey ve John Whitmore gibi bir çok isme ilham kaynağı olmuştur.
Gallwey teniste oyuna hakim olmak için önemli olanın rahat ve konsantre olmak olduğunu ileri sürmektedir. Oyuncu kendini eleştirmemeleri ya da basarileri konusunda hüküm vermemelidir. Çelişkili bicimde, bir oyunu kazanmanın sırrı çok fazla zorlamamaktır.  Oyuncu kazanmaya değil oyuna konsantre olmalıdır. Enerjinin ve kaynakların açığa çıkmasını ve performansın en üst seviyeye çıkarılmasını sağlamak için sakinlik durumunu korumak zorunludur. Bu esasında bizim bir parçamızdır ve sonradan öğrenilmesi gereken bir durum değildir. Fakat, bunu yapmamızı engelleyecek bazı kötü alışkanlıklar edinmiş olabiliriz. Bu üretken duruma ulaşmak için davranışlarımızı analiz etmek yerine kendimiz için başarılı bir imaj çizmeliyiz. Eksikliklerimizi olumsuz biçimde yargılamayı bırakmalıyız. Bunu yapmak, bir yandan eylemlerimizi gözlemlemek ile diğer yandan da bu gözlemleri değerlendirmek arasında ayırım yapmayı gerektirir. Gallwey bu ideal durumu Csikszentmihalyi'nin akış kavramı (notion of flow) ile benzerlikler taşıdığı yönünde tanımlamaktadır (Skagen 2004). Mentörlük olarak koçluk daha sonraları yönetici koçluğu, is dünyası koçluğu ve yasam koçluğu olarak tanıtılmıştır. Bunlara ek olarak da koçluğun çeşitli türleri de ortaya çıkmaktadır. Koçluk terimi bugünkü kullanımı, bir kişinin diğerine belirli bir alanda yetenekleri ile ilgili azami potansiyeli gerçekleştirmesi için yardım ettiği konuşma yönteminden daha fazlasını ifade etmemektedir (Skagen 2004).

Skagen, Kaare (2004) I veiledningens landskap. Kristiansand: Høgskoleforlaget.

Bir şeyi görmek ve gözlemlemek arasında büyük bir fark vardır. Gözlemlemek birini ya da bir şeyi özellikle dikkatli bir şekilde izlemektir. Birinci derecede gözlem kendi başına temel bir izleme görevdir (Bjørndal 2002). Buna örnek olarak öğretmen adayının dersi gözlemesi verilebilir.

İyi gözlem yapmak zordur. Aday öğretmenler kolaylıkla genel olana odaklanabilir. Örneğin ayni anda birçok öğrenciyi gözlemlemeye çalışabilir. Gözlemin odağını daraltmak için, mentörün yardımına ihtiyaç duyarlar. Eğer amaç bir sınıfta iş birliği yapan öğrencileri gözlemlemekse, is birliğinin bazı göstergeleri bastan oluşturulmalıdır (Nilssen 2010).
Gözlem sistematik ve sistematik olmayan biçimlerde yapılabilir. Sistematik olmayan yöntemler neye odaklanmak istediğimizi anlamamıza yardımcı olacak ilk izlenimi oluşturmak için kullanılabilir. Sistematik yöntemle gözlem planlanır ve belirli etkinliklere odaklanılır. Gözlem formu ya da gözlemleri yazmak için kullanılabilecek farklı türde kayıtlar kullanabiliriz. Gözlemler bir durum boyunca, durumdan hemen sonra ya da durum ikisinin kombinasyonu şeklinde ile yazılabilir.
Gözlemi tanımlama ile yorumlama birbirinden farklıdır. Bir yöntemde bir gözlem formu oluşturup  iki sütuna ayırırız. Bir sütun ne gördüğümüzü, diğer sütun ise ne düşündüğümüzü yazmak içindir. Bir öğrencinin belirli zaman aralıklarında neler yaptığını not alarak zamanını ne yaparak geçirdiğini tespit edebiliriz. Aynı şekilde bir davranışı her gerçekleştiğinde not alarak bu davranışın yaygınlığını belirleyebiliriz (Nilssen 2010).
Öğretmen adayı gözlem formunu doğrudan bir kitaptan almak yerine kendisi oluşturursa, öğrenme potansiyeli çok daha fazla olacaktır. Gözlem boyunca tutum değişir ve odaklanacağı noktayı nasıl belirleyenlerini  deneyimleme sansı bulurlar.
Ayrıca gözlem yaparken gözlemin yapılacağı yer ve gözlem süresi gibi hususlarda göz önünde bulundurulmalıdır. Örneğin, çocuklar arasındaki etkileşime dair bir  gözlem, çocukların okuma seviyelerini değerlendirmek için yapılan bir gözlemden daha uzun sürebilir. Öte yandan bir öğrencinin okuma gelişimine dair yapılan yıllık gözlem uzun zamana yayılır. Fakat her bir gözlem kendi başına çok uzun sürmez. (Nilssen 2010).
Ön yargıların gözlemi etkileyebileceği hususunun farkında olmalıyız. Örneğin, Nilssen (2010), okul ve ana okulu kültürünün olumlu yönleri üzende fazla odaklanıldığını iddia etmektedir. Aday öğretmenler ayrıca pozitif ilişkiler arama eğilimindedir ve sonuç olarak daha çok olumlu tutuma sahiptir. Ayrıca, bizler genellikle tanıştığımız insanlarla ilgili ilk ve son izlenimleri hatırlarız. Bu gözlemleri genellemek ve bunlara daha çok ağırlık vermek kolaydır. Sonuç olarak, gözlemcinin geçmiş deneyimleri ve ön yargıları ne gördüğünü etkilemektedir.

Gözlem öğretmenlerin günlük işlerinin önemli bir parçasıdır. Nilssen (2010)’a göre  aday öğretmenin çocukların sınıfta ne yaptıklarının farkında olması oldukça önemlidir. İyi bir öğretmen olmak için çocuklardan sürekli öğrenmeliyiz. Çocuklar kimdir, nasıl düşünürler, nasıl hissederler, farklı alan bilgilerini nasıl edinirler, nasıl ortak çalışırlar? Tecrübesiz öğretmenler öğrencilerin birbirlerinden nasıl farklı olduklarını göremezler. Gözlem doğrultusunda, öğrencileri daha fazla anlarız. Ek olarak, aday öğretmenler gözlemi yazılı ödevlerini hazırlarken bir belgeleme yöntemi olarak da kullanılabilir.

Nilssen (2010) aday öğretmenler için öğretme pratiklerini ve özellikle öğretmen ve öğrenci arasındaki etkileşimi gözlemlemenin öneminden bahsetmektedir. Öğrencinin nasıl öğrendiğini gözlemlemeleri gerekmektedir. Aksi takdirde öğrencilerin öğrenmesini sağlamaya değil, yalnızca sınıf içi disipline konsantre olmaları riski söz konusudur. Eğer böyle yaparlarsa, odakları öğretmen-öğrenci etkileşiminde değil, kendi performanslarına takılı kalacaktır.

Gözlemlediğimiz kişilerin bütünlüğünün korunması önemlidir. Bu çocuklar için özellikle önemlidir. Uzun vadede sistematik bir şekilde veri toplamak için ebeveynlerin ya da bakıcıların iznini almamız gerekir. Ayrıca ebeveynler ya da bakıcılar aday öğretmenin bir gizlilik sözleşmesi imzaladığının farkında olmalıdır (Nilssen 2010).

Nilssen, V. (2010) Praksislæreren. Oslo: Universitetsforlaget.

Güzel konuşma becerileri mentörlüğün her türü için önemlidir.  Kristiansen (2008: 36-37)’a göre mentörlük, mentörün danışana soru sormasını ve danışanın sorularını cevaplaması için uygun dil tekniklerini kullanmasını gerektirir. Bu tarz sözel yansıtma araçları danışanın gelişimi üzerinde olumlu bir etkiye sahiptir. Bu kitapta, bir mentörün aşina olması gereken dört farklı yansıtma aracından bahsedilmektedir.
En önemli konuşma becerisi dinlemedir. Bu beceri mentörlükte genellikle “aktif dinleme” olarak adlandırılır. Diğer bir konuşma becerisi üst iletişimdir (meta iletişim) (Baltzersen 2008). Konuşmaları hakkında konuşarak iletişim daha açık ve etkili hale getirilebilir. Birçok mentör bu konuda tereddütlüdür çünkü danışan genellikle hassas bir konumdadır. Bu kitapta en önemli becerilerden bazıları tartışılacaktır.

 
Konuşma becerilerinin ya da tekniklerinin üzerinde çok fazla odaklanmanın mentörlük konuşmalarının sahiciliğine zarar verebileceğinin farkında olmalıyız. Mentör konuşma tekniklerinin danışan ile kendi arasındaki açık ve doğal konuşmaya müdahale etmediğinden emin olmalıdır. Bu kitapta, Martin Buber “I and Thou” (1967) (Ben ve Sen) adli kitabında bir kimsenin izole olmuş bir “Ben” olarak anlaşılamayacağını yazar. İnsanoğlu her zaman bir Ben-O ve Ben-Sen ilişkisi içindedir. Bir Ben-O ilişkisinde dünya ile diğer insanları mesafe ya da kontrol ile ilişkilendiririz; tarif ederiz, analiz ederiz, tanımlarız, tanı koyarız ve karşılaştırırız. Bir kimse bir “model”, bir “şey”, bir “nesne”, bir “güç” ya da bir “kaynak” olarak tanımlanabilir. Bu ilişkide, danışanı hakkında hâlihazırda bildiklerimiz ışığında değerlendirmeliyiz. Öte yandan bir Ben-Sen ilişkisinde her zaman, diğer kişinin beklediğimizden ya da bizim tanıdığımızı düşündüğümüz kişiden farklı birisi olabileceği gerçeği ile yüzleşmeliyiz (Kristiansen 2009).
Uzman bir mentör, mentörlük araçlarını nasıl kullanacağını, bunların ne tur etkilerinin olduğunu ve bu araçları ne zaman kullanacağını bilir. Hepsi olmamakla birlikte bazı mentörler, danışanlarını söyleşiler başında uygulayacaklar bazı söyleşi teknikleri hakkinda bilgilendirmektedir. Danışanı bilgilendirmemekte ki risk sudur; danışan mentörün kullandığı gizli söyleşi tekniklerinin farkına vardığı zaman sinirlenebilir. Kristiansen (2008) bunun mentör ve danışan arasındaki karşılıklı ilişkiye zarar verebileceğinden bahsetmektedir. Bu konuşmanın kontrolünü fazlasıyla mentöre verebilir. Bu hususlar esasında, “aktif dinleme” ve “konuşma hakkında konuşma becerisi” (meta iletişim)  ile alakalı daha geniş bir pedagojik bağlamda ‘sözel konuşma araçları’ terimini ileri sürüyoruz .

Baltzersen, Rolf K (2008) Å samtale om samtalen. Bergen: Fagbokforlaget.
Kristiansen, Aslaug (2008). Hva skiller en veiledningssamtale fra andre samtaler? : Veiledningssamtalens egenart og etiske utfordringer. I Eide, Solveig Botnen, Grelland, Hans Herlof, Kristiansen, Aslaug,  Sævareid, Hans Inge og Aasland, Dag G. (red.) Til den andres beste : En bok om veiledningens etikk s. 24-40. Oslo, Gyldendal akademisk.
Kristiansen, Aslaug (2008). “Hva hører du når du lytter? Hvem blir du når du svarer?” I Eide, Solveig Botnen, Grelland, Hans Herlof, Kristiansen, Aslaug,  Sævareid, Hans Inge og Aasland, Dag G. (red.) Til den andres beste : En bok om veiledningens etikk. Oslo, Gyldendal akademisk.
Lauvås og Handal (2000). Veiledning og praktisk yrkesteori. Oslo: Cappelen Akademisk forlag.

Sözel üst iletişim, devam eden bir konuşma hakkında yapılan konuşmalar ve analizden oluşan iletişim biçimidir. Üst iletişim bir anlamda sıradan bir konuşmadır çünkü bir içerik, diyalog biçimi ve zaman çerçevesi içerir. Baltzersen (2008) içerikten üç temel soruda bahseder:

Ne hakkında üst iletişim kuruyoruz?
Bunu nasıl yapıyoruz?
Bunu ne zaman yapıyoruz?
Birinci soru üç alt kategoriye ayrılabilecek üst iletişim içeriğinden bahseder. Öncelikle konuşma içeriğinden bahsedebiliriz. Bu bütün konuşmalar bir içeriğe sahiptir olduğu anlamına gelmez; her zaman “konuşma içeriğini “konuşma konusu” yapamayız. Örneğin, danışan “tezimin yapısı hakkında yeterince konuştuk, belki biraz da teori secimim hakkında tartışabiliriz” diyebilir. Odak mentörlük sırasında konu içeriğinde değil, aksine konuşma konusu üzerindedir.
İkinci olarak, karşılıklı konuşma ilişkileri hakkında konuşabiliriz. Bu çoğunlukla konuşmanın değerlendirilmesi şeklinde gerçekleşir. Bu ilişkinin yakinlik/uzaklık  (örneğin “Daha açık konuşmalıyız”), simetri/asimetri (örneğin “Bana ne yapmam gerektiğini söylemene gerek yok!”), başkalarını değerlendirme (örneğin “Benimle konuşurken neden bu kadar sertsin?”) ya da kendini değerlendirme (örneğin Galiba seninle konuşurken çok net görünmüyorum”) gibi farklı yönlerine odaklanmak mümkündür. Kişinin söyledikleri ile yaptıkları arasında bir uyumsuzluk potansiyeli olduğu zaman yine üst iletişim kurabiliriz. Örneğin, eğer danışan beden dili yolu ile bir tatminsizlik gösteriyorsa (örneğin “Mutlu olduğunu söylüyorsun ancak üzgün görünüyorsun.”) üst iletişim gerekebilir.
Üçüncü olarak, konuşma zamanının kullanımı hakkında konuşabiliriz. Bu farklı yollarla yapılabilir: Görüşmelerin ne sıklıkta gerçekleşeceği (örneğin “Belki daha sik görüşebiliriz?”), konuşma düzeni (örneğin “Bu sefer ilk önce ben konuşmak istiyorum”), konuşmanın uzunluğu: (örneğin “Fazla zamanımız yok, bu konuşmayı olabildiğince kısa tutabilir miyiz?”), ya da hız (örneğin “Başka bir toplantıya yetişmem gerekiyor, sonuca gelir misin?”) gibi konularda tartışılabilir. Aşağıdaki tablo Baltzersen's (2008) tanımı üzerinden çeşitli meta iletişim ifadelerini ve sorularını nasıl sınıflandırdığımızı göstermektedir.

Ayrıca, yazma araçları da üst iletişimi destekler. Örneğin yazılı bir anlaşma yapabiliriz, bir özet ya da bireysel yansıtma dokumanı yazabiliriz. Mentörlük literatüründe, danışan ve mentörün yazılı işbirliği anlaşması içerisine mentörlük surecinin ilk safhalarında girmesi  çoğunlukla tavsiye edilir (bkz. Nilssen, 2010). Bu tarz anlaşmalar içerik, biçim ve uzunluk bakımından farklılık gösterebilir. Mentörlük veren bazı kurumlar ayrıca bir tavsiye edilen konuları anlaşmaya dahil etmek için bir genel şablon da oluşturmuştur. (Daha fazla bilgi için mentörlükte yazılı araçlar kısmına bakınız)
Bu tur bir anlaşmanın avantajı iki tarafa da beklentilerini sunma şansı verilmesidir.  Eğer sözleşme kendine özgü ise, daha sonra oluşabilecek yanlış anlaşılmalar en aza  indirilebilir. Taraflar da daha bağlayıcı hissedecektir. Bunun yani sıra, hassas konularda konuşmak da daha kolay olabilir.

Profesyonel  mentörlükte farklı üst iletişim türlerinden bazıları şöyledir: 

Bu kısımda profesyonel mentörlük konuşmalarında üst iletişim yolları işe ilgili tartışacağız. Örneğin ilginç sorulardan birisi tartışma konusuna kimin karar vereceğidir. Carson and Birkeland (2009) mentörlük pedagojisi hakkında konuşmanın öneminden bahsetmektedir. Bunun nedeni, hemen hemen her danışanın tavsiye beklemesidir (ibid: 37).  Birçok danışan montörünün onun adına seçimler yapmasını ister ve yapılmadığında hayal kırıklığına uğrar.
Carson and Birkeland (2009: 126) kullanılacak mentörlük yöntemi yapılandırılırken danışanın da bilgilendirilmesi ve onayının alınması gerektiği görüsündedir. Eğer danışan belirli bir mentörlük yaklaşımına karşı ise bu düşüncesi dikkate alınmalıdır. 
Danışanın mentörün hoşlanmadığı bir mentörlük stratejisini kullanmasını istediği zamanlarda ortaya zor bir durum çıkabilir.
Geleneksel olarak, mentör görüşme sürecini nasıl yapılandıracağına karar verirken danışan da konuşulacak konuyu seçer. Carson and Birkeland (2009) istenen sonuçları elde etmek için bunun en iyi yöntem olup olmadığını sorgulamaktadır. Baltzersen (2008)’in yaptığı anket çalışması mentörlükte üst iletişimi önemli bulan öğrencilerin sadece yarısı bu tur bir iletişimi gerçekte kullanmışlardır. Bunun nedeni öğrencilerin mentörlük hakkında konuşma girişiminde bulunmanın mentörün sorumluluğunda olduğunu düşünmesidir (Lauvås and Handal, 1998).

Nilssen (2010)’a göre başkalarıyla nasıl iletişim kuracağımız daima duygularımız tarafından belirlenir. Bu mentörlükte de böyledir. Bazen mentörlük ilişkisi hakkında konuşmamız uygun olabilir. Bir mentör söyle açıklamaktadır: “Benim danışan grubumda mentörlük oturumu boyunca konuşma konusunda çok hevesli,  lider rolünü alan bir kişi vardı. Başka bir öğrenci ise ancak kendisine bir şey sorulduğunda konuşuyordu. Bununla ilgili konuştuk. Oturumumuzun nasıl olmasını istiyoruz? Herkes katılmalı mi? Sessiz öğrenci daha fazla konuşmak istediğini ancak kendini sözel olarak iyi ifade edemediğini düşündüğünü söyledi. Daha sonra hepimizin sahip olduğumuz beceriler ile konusması gerektiği konusunda hem fikir olduk. ”  (Nilssen 2010:82)

Mentör olarak konuşmanın ortasında kendimize sormamız gereken sorular bazı sorular vardır: “Danışanı çok mu zorluyorum?”, “Ayni konunun etrafında mi donup duruyoruz?”, “Konuşmada ilerliyor muyuz?”, “Neleri tartışmaktan kaçınıyoruz?” Bu tarz düşünceler çoğunlukla yalnızca mentörün kafasında yer alır, fakat bu konuşmanın yönünü ve sorulan soruları etkiler. Bazen, belirsizliklerin ve yanlış anlaşılmaları açığa çıkarmak için konuşmada bu sorular ortaya çıkarılır. Aşağıda birkaç örnek yer almaktadır:

Mentörlük konuşmalarının tartışılan temel noktalarda hemfikir olarak özetlenmesi genellikle tavsiye edilir. Özet çok geniş kapsamlı olmamalıdır fakat iki tarafa da  durumu kendi açılarından yansıtacak zaman vermelidir (Carson and Birkeland 2009: 83-84). Ayrıca, her yeni görüşmede bir önceki görüşmenin özetinin yapılması faydalıdır.

Baltzersen (2013), üst iletişim derecesi ile iletişimin iyi algılanması arasında güçlü bir istatiksel korelasyon bulmuştur. Konuşma hakkında  yapılan düzenli konuşmaların çatışmaların önüne geçtiği görülmektedir. Ayrıca ne hakkında konuşmamamız gerektiği ile ilgili konuşmak da mümkündür.

Baltzersen, Rolf K. (2008): Å samtale om samtalen. Veiledning og metakommunikasjon. Bergen: Fagbokforlaget.
Carson, Nina og Åsta Birkeland (2009). Veiledning for førskolelærere. Kristiansand: Høgskoleforlaget.
Nilssen, Vivi (2010). Praksislæreren. Oslo: Universitetsforlaget.
Lauvås, Per og Gunnar Handal (1998): Hovedfagsveiledning ved Universitetet i Oslo. Oslo: Pedagogisk forskningsinstitutt, Universitetet i Oslo. (Rapport nr.1)

Uygun bir tanım oluşturma girişimleri
“Mentörlük” kavramını tanımlamak için bir çok girişimde bulunulmuştur. Bu tanımlar, mentörlüğü  bir kavram olarak benzerliklerden çok farklıların tanımlayacağı kadar çok çeşitlidir. Buna rağmen, yapılan bazı genel açıklamalar bu çeşitliliği kapsar. Örneğin, Ole Løw (2009)’e göre mentörlük daima amaca yönelik bir etkinliktir. Profesyonel mentörlük konuşmalarında, konuşmanın niteliğinden büyük oranda mentör sorumludur. Mentörlük, mentör ve danışan arasındaki anlaşmaya dayanır ve böylece gerek yapısı gerekse ilerlemesi karakterize edilir.
Danışanın kim olduğundan bağımsız olarak ana odak hala danışan üzerindedir. Böylece mentörlük danışanın kendi öğrenme sürecini destekleme yolu şeklinde düşünülebilir. (Løw 2009). Løw (2009) mentörlüğü  danışmanlık, denetim, konsültasyon ve koçluk içeren ortak bir terim olarak tanımlar. Løw (2009) bu tanımın eğitim ya da profesyonel bağlamda daha deneyimli ve yetkin olan kimse (mentör) ile daha az deneyimli ve yetkin olan kimse (danışan) arasındaki tamamlayıcı ilişki için rezerve edilmesini önerir. Asgari gereklilik danışanı desteklemek amacı ile yapılan konuşmadır ve bilinen bir perspektif veya rehberlik modelini kullanır.
Johnson, Rose and Schlosser (2007) mentörlükte ilişkilerde aşağıdaki yer alan ortak bileşenleri tanımlamaktadır:  

a) mentörlük kişisel ilişkileri sürdürür.
b) mentörlük artan biçimde karşılıklıdır.
c) mentörler danışana kıyasla daha fazla başarı ve deneyime sahiptir.
d) mentörler doğrudan kariyer desteği sağlar.
e) mentörler sosyal ve duygusal destek sağlar.
f) mentörler model teşkil eder.
g) mentörlük danışan ya da mentörde kimlik dönüşümü ile sonuçlanır.
h) mentörlük kendini keşfetmek için güvenli bir ortam sunar.
i) mentörlük genellikle olumlu bir kariyer ve kişisel sonuçlar üretir.
(Johnson, Rose and Schlosser, 2007)
"Öğüt verme" mentörlük tanımına dahil edilmeli midir?
Mentörlüğü tanımlamaya çalışırken, danışmanın rolünün bu tanıma dahil edilip edilmeyeceğine karar verilmelidir. Günlük dilde mentörlük ve danışmanlık terimlerini öğüt verme anlamında kullanabiliriz. Bu ayrıca rehberlik, danışmanlık, konsültasyon, denetmenlik gibi durumlar için de kullanılabilir. Buna rağmen, mentörlükle ilgili literatür öğüt verme rolündeki vurguyu azaltır ve bir takım mentörlük yaklaşımları bu etkinliği teşvik etmez. Buna rağmen, bazı yazarlar mentörlük kavramına bu bakış açısını dahil eder. Örneğin Kåre Skagen (2004), iletişim odaklı çıraklık modelini geçerli mentörlük modeli olarak kabul eder.

Birçok araştırmacı mentörlüğün gelişmemiş bir araştırma alanı olduğunu iddia eder (Allen and Eby, 2007; Bjørndal, 2011a). Bunun için birçok neden bulunmaktadır:
Bjørndal (2011a) mentörlük alanının bir bilim olarak yeterince gelişmediği fikrindedir. Bunun için çeşitli nedenler ortaya koymaktadır: 

Mentörlük korunan bir meslek değildir. Nadiren özel bir durum veya yetkinlik gerektirir. Sonuç olarak, okullardaki mentörler için herhangi bir resmi eğitim olmaması yaygın bir durumdur.
Mentörlük kısıtlı deneysel çalışma bulunan yeni bir araştırma alanıdır. Yazılmış kitaplar genellikle yazarın mentör olarak kendi deneyimlerini yansıtır.
Eğitim bilimi olarak mentörlük çeşitli disiplin üzerine kuruludur (örneğin felsefe, psikoloji, sosyoloji, antropoloji), ve bu kavram farklı mesleklerde kullanılır. Böylece bu kavram için tek bir jenerik tanımda uzlaşmak zordur.  Allen and Eby (2007)’ye göre mentörlük üç farklı alanda önemli bir kavram olarak gelişmiştir: işyeri danışmanlığı, öğrenci-öğretmen danışmanlığı ve gençlik danışmanlığı.
Bu alanda yapılan araştırmalar genellikle diğer araştırmaları çok az dikkate alarak yapılmaktadır. Sonuç olarak, mentörlük kavramı için ortak turarlı bir tanımlama bulmak güçleşmiştir. Örneğin, Jacobi (1991) mentörlük için 15 farklı tanım belirlemiştir. Bugün hala çoğunluk tarafından kabul edilen bir tanım söz konusu değildir.

Mentörlük terimi hala belirsizdir ve daha önce de bahsedildiği gibi, benzer bir çok terim  bulunmaktadır, örneğin rehberlik, danışmanlık, koçluk vb. Bu terimler genellikle belirsiz ve birbiri ile örtüşen anlamlarla birbirinin yerine kullanılır. Böylece mentörlük terimi ile diğer terimler arasında bir çatışma söz konusudur. Literatürde konsültasyon, danışmanlık ve benzer başlıklarla önemli miktarda yayın bulunmaktadır. Buna rağmen, bu kavram genellikle ikici ilişkilerle daha yakından bağlantılıdır. Fakat Eby, Rhodes and Allen (2007)’e göre, mentör-danışan ilişkisinin rol model-gözlemci, danışman-danışan, öğretmen-öğrenci ve koç-danışan ilişkisinden ayrılması gerekmektedir.

Mentörlük kavramının geçmişi Homer’ın Odyssey’sine uzanır. Mentör Odysseus’un Troya savaşına gittiğinde oğluna bakan ve onu büyüten arkadaşıdır. Mentörlük kavramına bilimsel açıdan ilgi Daniel Levinson’ın 1978’de insani gelişimle ilgili yaptığı çalışmalara uzanır. Levinson’ın teorisine göre, erken yetişkinlik dönemi (17-23 yaş) bireyin yaşamında çocukluktan yetişkinliğe geçişte uğraşması gereken bir çok kapsamlı işle karşı karşıya kaldığı bir dönemdir. Bu işler (a) yaşamı için bir ideal belirleme, (b) bir mentör edinme, (c) bir meslek edinme (d)bir sevgili/eş edinme şeklindedir.  Bir çok farklı biyografik hikaye doğrultusunda Levinson bu geçiş sürecinde bir mentör edinme safhasının öneminin altını çizmektedir (Undertekst til et bilde: "Levinson ayrıca ebeveynleri de mentör olarak tanımlar " (bilde av en forelder med et barn som viser noe. Ebeveyneler mentör olabilir mi?). Bu şekilde bir kuramsal çerçevede tarihte hemen hemen her alanda bir çok mentörlük hikayesinin bulunduğu öne sürülebilir (örneğin psikolojide Freud ile Jung arasındaki ilişki) (Eby, Rhodes and Allen, 2007).
Eby, Rhodes and Allen (2007)’e göre, ilk deneysel çalışmalar kişinin mentörü olabilecek bir kimsenin olmasının öneminin altını çizmektedir. Yaklaşık 4000 başarılı yönetici ile yapılan bir çalışmada Roche (1979),  üçte ikisinin bir mentöre sahip olduğunu bildirmiştir. Ayrıca Kanter (1977) de kurumların başındaki bu kişilerin genel olarak yol boyunca Onlara rehberlik eden bir “haham” ya da “vaftiz babası” olduğundan bahsetmektedir. Vaillant (1977) bazı ulusların en seçkin kişileri ile bir çalışma yapmış ve bu kişilerin en başarılı olanlarının erken yetişkinlik dönemlerinde bir akıl hocası olduğunu tespit etmiştir (Eby, Rhodes and Allen, 2007).

İskandinav mentörlük kavramı ayrıca Danimarkalı filozof Kierkegaard’ın yardım etme sanatı tanımlamasından ilham almıştır. “Bir kimseyi bir amaç için başarılı bir şekilde yönlendirmek için, öncelikle ve her şeyden önemlisi bulunduğu yeri tespit etmek ve o noktanda başlatmak gereklidir. Yardım etme sanatının bütün sırrı budur.” (...) “Eğer yine de kendi bildiğini yapmak isteyenler varsa, bunun sebebi kibirli ya da gururlu olmaları olabilir, temel olarak danışanın yararından çok, danışanın kendisine hayran olmasını istediği içindir.” (Kierkegaard 2000: 460). Aynı şekilde, mentörün danışana öğrenme ve  gelişim süreci için cevaplar vermek yerine farklı türde sorular sorarak yardımcı olması da oldukça yaygındır.

Gençlik mentörlüğü yaşça daha büyük ve daha deneyimli yetişkinler ile gençler arasındaki ilişkiyi tanımlamak için insan kaynaklarında kullanılmaktadır. Mentör çırağı yetkinlik kazanması ve karakter gelişimi için destekler. Bir mentör akademi, kariyer planlama, fiziksel ve duygusal sağlık ve sosyal etkileşim gibi yaşamın farklı alanlarında rehberlik sağlar. Mentör genç bireyin sıkıntılı geçiş dönemlerinde yolunu bulmasına yardımcı olur. Mentörlük etkinlikleri içeriğe (okul, iş dünyası, toplum) göre değişmektedir; özel gruplar (özel eğitime gereksinim duyanlar, risk altındaki gruplar) ve gelişim süreci (çocuklar, ergenler)  vb. (Eby, Rhodes and Allen, 2007; Keller, 2007).
Gençlik mentörlüğünün önemi ile ilgili araştırmalar
Williams ve Kornblum (1985)’un klasik çalışması Kötü Yetişmek (Growing Up Poor)’te şehirde yaşayan 900 düşük gelirli genci takip etmiş ve mentörlerin gençlik için sağlıklı sonuçlar elde etmede oldukça önemli bir etmen olduğunu tespit etmiştir. Diğer araştırmacılar  davranış bozukluğu olan çocuklara daha az benzeyen, “iyi bir ilişki” içinde olduğu düşünülen risk altında çocukları da vurgulamaktadır (Werner and Smith 1982; Rutter, 1987). Risk grubundaki gençliğe odaklanan araştırmalar gençlik mentörlüğü programındaki yetişkin rol modelin önemine dikkat çekmektedir (örneğin Abla ve Abi) (Eby, Rhodes and Allen, 2007).
Gençlik mentörlüğünün tarihi
Resmi gençlik mentörlüğü programlarının kökenleri Ernst Coulter tarafından 1904’te Amerika’da Big Brothers movement(Abiler hareketi)’ne dayanmaktadır. Genellikle bir gönüllü, toplumsal ortamlarda gençler ile etkinlikler yaparak birebir mentörlük ilişkisi kurar. Abi/Abla programlarının çoğu okul başarısızlığı yahut erken gebelik gibi gençleri risk altında bırakan güç durumlarda destek vermek için tasarlanmıştır. Boşanmış ebeveynlere ve bozulmuş ilişkilere yönelik programların sayısı arttırılarak toplumsal destek kurmak amaçlanmaktadır (Keller, 2007). Hali hazırda yaklaşık iki buçuk milyon gence hizmet veren 4000’in üzerinde ajans ve gençlik odaklı program bulunmaktadır (Eby, Rhodes and Allen, 2007). Bazı mentörlük programlarının değerlendirilmesinde çoğunlukla önlem almak yahut olumsuz sonuçları en aza indirmek hedeflenmektedir. Kişisel yetkinliklerinin geliştirilmesi ve psikolojik refahın arttırılmasına odaklanan bu programlar alternatif bir bakış açısı sunmaktadır (Keller, 2007).

İşyeri mentörlüğü deneyimli bir çalışan ile daha az deneyimli bir başka çalışan arasında kişisel ve profesyonel gelişimin amaçlandığı bir ilişki içerir. Mentör bir iş arkadaşı ya da kurumdan başka bir kimse olabilir. Bu kimse himayesinde kişi için herhangi bir resmi sorumluluk taşımaz. Bu kimseler aynı uygulama topluluğunun birer parçası olabilir (Lave and Wenger, 1998).  Resmi mentörlük sözleşme ile sabit hedefler, belirli bir zaman çizelgesi ve ne sıklıkla görüşüleceğine ilişkin kurallar içerir. Still, Eby, Rhodes ve Allen (2007) bu tarz mentörlüklerin kendiliğinden gelişen mentör-danı

Bu bölümde mentörlükte işe yarayacak yazılı yansıtma araçlarından bahsedeceğiz. Bu araçlar İskandinav ülkelerinde okul danışmanlığı kapsamında kullanılmasına rağmen diğer ülkelerde verilen danışmanlık hizmeti ile ilişkili de olabilir. Öncelikle, mentör ve danışanın yazılı bir anlaşma yapması oldukça yaygındır. Bu anlaşma gelecek mentörlük görüşmeleri için bir çerçeve oluşturur. Bu anlaşmaya ek olarak, danışan kendine özgü şahsi bir doküman hazırlar. Biz bu dokümandan “bireysel strateji dokümanı” olarak bahsedeceğiz. Bireysel strateji dokümanı öğretim yöntemleri ve/veya kişisel hikayelerden oluşabilir. Bu dokümanın amacı danışanı bireysel düşünceleri doğrultusunda desteklemektir. Ayrıca mentörlük sürecinde, danışanlara bu bireysel düşünceleri geliştirmek için okul ziyaretleri sırasındaki gözlem ve deneyimlerini düzenli olarak yazmaları tavsiye edilir. Bu bölümde sadece aday öğretmenlerin mentörlük süreçleri ile ilgili örnekler değil ayrıca mesleğe yeni başlayan öğretmenlerin mentörlük süreçleri ile ilgili de ornekler de yer almaktadır.

Mentörlük sözleşmesi mentör ile danışan arasında işbirliği için yapılan yazılı bir plandır. Amacı staj suresince faydalı bir işbirliği oluşturmak ve bunu devam ettirmektir. Mentörlük sözleşmesi oluştururken iki tarafında beklentilerini açıkça ortaya koyması önemlidir. Dakiklik, teslim tarihleri, görüşme saatleri, hedefler, çalışma gayreti ve mentörlükte kullanılacak pedagoji gibi konular sıklıkla tartışılan konulardan bazılarıdır. Öğretmen yetiştirme enstitüsü tarafından yayınlanan staj uygulamaları ile ilgili kılavuzlar mevcuttur. Bu kılavuzlar genellikle sözleşmenin nasıl yapılacağı ile ilgili öneriler içerir. Mentörlük sözleşmesi düzenli olarak gözden geçirilmelidir. Takviye sorular “Planladıklarımızı gerçekleştirebildik mi?” ya da “Bu şekilde devam etmeli miyiz yoksa değiştirmemiz gereken kısımlar var mi?” seklinde olabilir.

Aşağıda yazılı sözleşmede yer alabilecek bazı alanlara yer verilmiştir:
Resmi bilgiler
Mentörlük sözleşmesinde gerek montörle gerekse danışanla ilgili öğrencinin adı, bölümü, staj süresi vb. bazı resmi bilgiler yer almalıdır. Danışan ile ilgili de en az isim ve iletişim bilgisine (örneğin telefon numarası, elektronik posta adresi vb.) yer verilmelidir.
Danışanın sorumlulukları 
Mentörün sorumluluklarının tanımlanması önemlidir. Böylece danışan beklentilerini buna göre belirler. Bu mentör-danışan ilişkisinin daha resmi destekleyici bir yapıda olmasını sağlayacaktır. Aşağıda bazı örneklere yer verilmiştir. 

Mentör sınıftaki öğrenciler ve ekipman kullanımı hakkında pratik bilgiler sağlamalıdır. Bu bilgilerin sözlü ve yazılı olarak verilebilir.
Mentör ilişkiler hakkında bilgi verebilir. Örneğin mentör danışanı olan aday öğretmen ile ilgilenir ve onun mevcut öğretmen topluluğuna dahil olmasına yardımcı olur.
Mentör, mentörlük sürecinin düzenlenmesi için olası yollarını belirleyebilir. Örneğin, sözleşme dersten önce ve sonra görüşmeleri düzenleme işinin mentörün sorumluluğunda olduğunu belirtebilir. Sözleşmede mentörün danışanın derslerinin ortalama ne kadarını gözlemlemeyi istediğini belirtmek de mümkündür.
Mentörün danışandan beklentisi
Mentörlük sözleşmesi mentörün aday öğretmen (danışan)  ile ilgili  beklentilerini içermelidir. Genellikle aday öğretmenin görüşmelere zamanında ve hazırlıklı gelmesi belirtilir. Ayrıca mentörün yapılmasını beklediği iş miktarının belirtilmesi de yaygındır. Örneğin aday öğretmenden detaylı bir ders planı taslağı hazırlaması ve mentöre geri bildirim için sunması istenir. Bazı durumlarda aday öğretmen her mentörlük görüşmesinden sonra düşüncelerini yansıtma amacı ile günlük yazmalıdır.
Konu danışanın sorumlulukları olduğunda mentör ve danışanın bazı beklentileri ayni olmayabilir. Böylece aday öğretmenin çalışma saatlerin
n ve aday öğretmenden öğretim dışında yapması beklenen işlerin (örneğin diğer öğretmenlerle işbirliği, sınıf öğretmeni olmanın doğası, öğretmen – öğrenci sohbetleri, planlama, öğrenme ortamlarının ve müfredat dışı etkinliklerin kullanımı) bu sözleşmede belirtilmesi iyi bir fikir olacaktır. Sözleşmenin aday öğretmenin isinin gizlilik boyutları hakkında yasal bilgileri de içermesi gerekir.
Staj çalışmasının amaçları ve hedefleri
Mentörlük sözleşmesinin hedefleri öğretmen eğitimi programının ve stajyerlikle ilgili yerel planların amaçları ile yakın bağlantılı olmalıdır. Bu amaçlar didaktik, sosyal beceriler, mesleki etik ve yetkinliklerin değişimi gibi farklı konular ile ilgili olabilir. Aşağıda sözleşmede yer alan genel amaçlar için bir kaç örnek verilmiştir:

Bu genel hedeflere ulaşılıp ulaşılmadığını değerlendirmek zor olabilir. Buna rağmen, mentör ve danışan  farklı yetkinlikler için daha spesifik hedefler belirleyebilir. Aday öğretmenin kendi beklentileri sözleşmeye dahil edilmeli ve ayrıca aday öğretmen kişisel gelişim hedeflerini de ekleyebilmelidir. Bu tarz tercihlerin göz önünde bulundurulması, sözleşmenin karşılıklı olarak bağlayıcı görülmesini sağlayacaktır. 
Zaman yönetimi
Genellikle mentörlüğün miktarı kurumsal kurallar tarafından düzenlenir. Bazen mentörlük görüşmelerinin sayısı belirtilir. Zaman kullanımı ile ilgili diğer konularda aday öğretmen ile birlikte karar verilebilir. Örneğin bazıları mentörlük oturumlarının düzenli aralıklarla gerçekleşmesi gerektiğini düşünürken bazıları ise aday öğretmenin ihtiyaç olduğunda olması gerektiğini düşünebilir. Sözleşme şu şekilde olabilir: ders öncesi mentörlük oturumu Pazartesi sabah 8:00-9:30 ve  bilgilendirme oturumu Cuma öğleden sonra 3.30-4.30. Mentör zamanları önceden belirleyebilir ya da mentör ve danışan ilk görüşmede her iki tarafa içinde uygun olan bir zamana karar verebilir. En önemlisi, zaman çizelgesi iki tarafa da uygun sekide düzenlenmelidir. Aday öğretmen bundan sonra personel toplantıları, bahçe nöbetleri ve ekip görüşmeleri ile ilgili bilgilerin yani sıra dersler ve planlanmış mentörlük toplantıları hakkında da bilgi sahibi olarak staj donemi için bir plan takip eder. Bütün planlar staj süresince düzenlenebilecek şekilde esnek olmalıdır.
Değerlendirme
Staj değerlendirmesi mentörlük sözleşmesinde ayrı bir bölüm olmalıdır. Örneğin bazı sözleşmeler surecin ortasında aday öğretmenin güçlü olan yönleri ve geliştirilmesi gereken yönleri hakkında geribildirim alacağını belirtir. Aday öğretmenin öğrencilerden, mentörden ve diğerlerinden gelen geribildirimleri hoş görü ile karşılamaya hazır olması ve bu geri bildirimler doğrultusunda gerekli değişiklikleri yapması gerektiğini ifade etmek faydalı olabilir. Örneğin, aday öğretmenin yapıcı bir şekilde mentörlüğü kabul etmesinin ve kendisinin ve diğerlerinin öğretimini aktif olarak yansıtmasının şart olduğu belirtebilir. Ek olarak, mentörün aday öğretmeni değerlendireceği de belirtilmelidir. Değerlendirme aday öğretmenin öğretmenlik mesleği ile ilgili becerileri ve yeteneklerini incelemektedir. Mentör ayrıca aday öğretmenin stajı ile ilgili bir rapor yazacaktır.

Mentörlüğe ilişkin birçok teoride kilit nokta her şeyden önce danışanın ihtiyaçlarını göz önünde bulundurmaktır. Esas strateji aday öğretmeni farklı bir yansıtma dokumanı oluşturmaya teşvik etmektir. Bireysel düşünceleri yansıtmak için hazırlanan bu dokuman mentöre verilmek üzere ihtiyaçların belirtildiği sadece bir not da olabilir. Format ve içerikle ilgili bazı kısıtlar söz konusudur.  Buna rağmen mentör, danışanı olabildiğince  acık olması için desteklemelidir. Örneğin, danışan  “Ben sınıfta topluluk olma duygusuna odaklanmak istiyorum” gibi açık bir durum  ifade etmeyen, çok genel ifadelerden kaçınmalıdır. Bireysel strateji dokumanı mutlaka bir problem tanımlamak zorunda değildir. Fakat danışanın belirtmek istediği bir soru ya da durumu içerebilir. Öğretmen eğitiminde bireysel strateji dokumanı genellikle kişisel hikayeler ve/veya kişiselleştirilmiş yazılı ders planlarından oluşur.

Bireysel strateji dokümanı hem mentörün hem de danışanın mentoldük oturumuna hazırlanmalarını kolaylaştırır. Mentör bireysel strateji dokümanını toplantıdan önce okumalıdır. Bu mentörlük sürecine iyi bir başlangıç yapmasına yardımcı olur. Buna rağmen mentör bu buluşmayı soruları önceden hazırlanmış bir mülakat gibi görmemelidir. Bu danışanın kendi düşüncelerini sunmasının önüne geçebilir. Bireyin notlarına bağımlı kalmaması ve sohbetin dinamiğini takıp edebilmesi önemlidir (Carson and Birkeland 2009: 75-76).
Mentörlük görüşmesinde bu dokuman mentörün birçok farklı konudan bahsetmesi için yardımcı olacaktır. Mentörlüğün ilk aşamalarında danışana kendi düşüncelerini geliştirmek için zaman verilmesi önemlidir. Eğer mentör daha bastan tek bir konuya odaklanırsa, bu görüşmenin devamında danışan için yeni konuları gündeme getirmeyi zorlaştıracaktır.

Yazılı ders planı belirli bir derse hazırlanırken yardımcı bir dokümandır. Yazılı ders planı sıklıkla gerçek dersten önce mentörlük görüşmesinde kullanılır. Bu danışanın önündeki ders ile ilgili düşünmesini sağlayacaktır. Sonuç olarak bu mentörlük konuşmasını daha belirgin yapacaktır.
Nilssen (2010)’a göre, birçok öğretmen aday ders planı hazırlamanın gereksiz ve zor olduğunu düşünmektedir. Bu düşüncenin birçok nedeni vardır. Öncelikle, bazı aday öğretmenler mentörlerin bu tarz dokümanları kendi sınıflarında kullanmadıklarını iddia etmektedir. Böylece bu dokuman otantik bir planlama aracı olarak görülmez. İkinci olarak, bazı mentörler aday öğretmenlerin bu formları uygun şekilde doldurmak için yeterli olmadıklarını söylemektedir. Bazen hem mentör hem de aday öğretmen didaktik kategoriler arasındaki farklı anlamanın güç olduğunu düşünmektedir. Bir araştırmada Sara isimli mentör bunu söyle ifade etmektedir:  “Öğrencilerin bu kullanılması zorunlu dokümanları doldurmakla ilgili memnuniyetsiz ve kafası karışık tavırlarından sonra sunu merak etmeye başladım: “Bundan ne elde ediyorum, daha önemlisi, öğretmen adayı bundan ne kazanıyor?” (…)”(Nilssen 2010: 106-107). Sara’nın yaptığı, öğrencilerin kısa okul deneyimleri suresinde gerçek kullanıma ilişkin örnekler üzerine fazla çalışma fırsatı bulamadıkları için, didaktik ilişki mod

Türk eğitim sisteminde öğretmen yetiştirme programlarının niteliğinin arttırılmasında rol oynayan iki temel bileşen söz konusudur. Bunlardan ilki eğitim fakülteleriyle Milli Eğitim Bakanlığı arasında imzalanan protokole bağlı olarak, eğitim fakültelerinde öğrenimlerine devam etmekte olan öğretmen adaylarının iş başında öğrenme ilkesine dayanarak uygulama okullarında staj yaptıkları süreçtir (Akdemir, 2013). Diğeri ise mesleğe yeni başlayan öğretmenlerin ilk yılını ifade eden adaylık sürecidir. Adaylık dönemi öğretmen adayını mesleğe hazırlamada pratik değeri olması ve oldukça yoğun bir uygulama sürecine kapsadığı için büyük önem taşımaktadır. Pek çok öğretmenin öğretmenlik ile ilgili bakış açısını bu geçiş dönemi şekillendirir (Ekinci, 2010).
Millî Eğitim Bakanlığı 1998 yılımda öğretmen yetiştiren yüksek öğretim kurumlarında öğrenim görmekte olan öğrencilerin, Millî Eğitim Bakanlığına bağlı resmî ve özel eğitim ve öğretim kurumlarında yapmalarını öngören öğretmenlik uygulaması çalışmalarının, amaç, ilke ve yöntemlerine ilişkin bir yönerge yayınlamıştır.
Bu yönergede, "öğretmen adaylarının, öğretmenlik mesleğine daha iyi hazırlanmalarını, öğrenimleri süresince kazandıkları genel kültür, özel alan eğitimi ve öğretmenlik mesleğiyle ilgili bilgi, beceri, tutum ve alışkanlıklarını gerçek bir eğitim-öğretim ortamı içinde kullanabilme yeterliliği kazanmalarını sağlayacak uygulama çalışmalarına ilişkin usul ve esasları düzenlemek" amaçlanmıştır (Millî Eğitim Bakanlığı, 1998). 
Öğretmenlik programına devam etmekte olan, öğretmeni olacağı öğretim düzeyi ve alanında, okul ortamında, öğretmenlik uygulaması yapan yüksek öğretim kurumu öğrencisi olarak tanımlanan "Öğretmen Adayı", öğretmenlik uygulamasını "Uygulama Öğretmeni"nin mentörlüğünde gerçekleştirir. Bu mentör uygulamanın gerçekleştiği okulda görev yapmakta olan, öğretmenlik formasyonuna sahip, kendi alanında deneyimli öğretmenler arasından seçilir. Görevi öğretmen adayına öğretmenlik mesleğinin gerektirdiği davranışları kazanmasında rehberlik ve danışmanlık yapmaktır. Uygulama öğretmeni aynı zamanda öğretmenlik uygulamasını planlama, programlama ve yürütme için belirlenen ilkelerden biri olan "ortak değerlendirme ilkesi"nde belirtildiği üzere aday öğretmenin değerlendirilmesinde de görev alır. Öğretim elemanı ve uygulama öğretmeni uygulama etkinliklerini birlikte planlar ve yürütürler. Bu nedenle öğretmen adayının öğretmenlik uygulamasındaki performansı, her ikisi tarafından ayrı ayrı değerlendirilir. Yine aynı ilke kapsamında aday öğretmenin öğretmenlik uygulaması ile ilgili başarısında bu iki değerlendirmenin fakültenin "Eğitim-Öğretim ve Sınav Yönetmeliği" takip edilerek birleştirilmesiyle not olarak belirlenir ve uygulama öğretim elemanı tarafından fakülte yönetimine teslim edilir.
Bu yönergede ayrıca öğretmenlik uygulamasında yer alan her birey ve kurumun görev, yetki ve sorumlulukları tanımlanmıştır. Mentörlük çalışmaları ile doğrudan ilişkili olan uygulama öğretmeninin ve öğretmen adayının görev ve sorumlulukları aşağıda listelenmiştir. 
Uygulama öğretmeninin görev ve sorumlulukları:

Öğretmen adayının görev ve sorumlulukları:

Ancak öğretmen adayları programlarından mezun olduktan sonra mesleğe başladıkları ilk yıllarda belli başlı problemlerle karşılaşmaya devam etmektedir. Bu nedenle mesleğe yeni başlayan öğretmenlerin ilk yılını ifade eden adaylık sürecinde bir mentörün yol göstermesine ihtyaç duymaktadırlar.
Mesleklerinin ilk yıllarında olan öğretmenler, gerek aldıkları ağılıklı teorik eğitimi uygulamaya sırasında gerekse kurum içi idari konulara aşina olmamalarından kaynaklı çeşitli sorunlar yaşamaktadır. Bunlara tecrübesizlik, çok şey yaparak kendini ispatlama gayreti, denetlenme kaygısı, kurum kültürüne ve çevreye adaptasyon sorunları, öğrencilikten öğretmenliğe geçişteki rol değişimine alışma süreci, aday öğretmenler üzerindeki yoğun baskılar ve benzeri problemler eklenebilir. Ekinci (2010), öğretmenlik mesleğini, teorik bilgi birikiminin yanı sıra uygulamaya dayalı deneyim ve yaşantı ile bir bütünlük gösteren, sanatsal, sosyal ve liderlik boyutları ağırlıkta olan bir meslek olarak tanımlayarak, bu adaylık sürecinin uygulamaya dayalı etkin ve işlevsel bir planlama ile yeterli deneyim ve beceri kazandıracak nitelikte olması gerektiğini vurgulamaktadır.
Aday öğretmenlerin yetiştirilmesi sorumluluğu, görev tanımları içerisinde “Aday personelin yetişmesi için gereken tedbirleri alır” (2508 Sayılı T.D.) ifadesi ile okul müdürlerine verilmektedir (Ekinci, 2010). Aday öğretmenlerin yetiştirilmesi “MEB Aday Memurların Yetiştirilmesine İlişkin Yönetmelik” kapsamında açıklanır bu yönetmelik takip edilerek uygulanır. Bu süreçte bütün planlama ve uygulama sorumluğu okul müdürlerine aittir. Aday öğretmenin yetiştirilmesinde rehberlik yapması amacıyla mesleki tecrübesine ve görev bilincine güvenilen bir öğretmen görevlendirilir. Rehber eğitici ve rehber öğretmenler bu görevlerin yerine getirilmesi ile ilgili okul veya kurum amirine karşı sorumludur. Söz konusu yönetmeliğin 28. Maddesinde  belirtilen Rehber Eğitici ve Rehber Öğretmenlerin görevleri aşağıda listelenmiştir (MEB, 1995): 

Uygulamalı eğitim süresi sonunda aday memurun adaylığının kaldırılıp kaldırılmayacağına ilişkin görüşünü, sicil amirlerince dikkate alınmak üzere uygulamalı eğitim değerlendirme belgesindeki niteliklere uygun olarak belirtmek.
Aday Memurların Yetiştirilmesi programı 3 aşamada gerçekleşir (MEB, 1995):

Akdemir, A. S. (2013). Türkiye’de Öğretmen Yetiştirme Programlarinin Tarihçesi Ve Sorunlari. Electronic Turkish Studies, 8(12).
Ekinci A. (2010). Aday Öğretmenlerin İş Başında Yetiştirilmesinde Okul Müdürlerinin Rolü. Dicle Üniversitesi Ziya Gökalp Eğitim Fakültesi Dergisi, 15, 63-77.
MEB. (1995). Milli Eğitim Bakanlığı Aday Memurların Yetiştirilmesine İlişkin Yönetmelik. Tebliğler Dergisi. Sayı: 2423
MEB. (1998). Öğretmen Adaylarının Milli Eğitim Bakanlığına Bağlı Eğitim Öğretim Kurumlarında  Yapacakları Öğretmenlik Uygulamasına İlişkin Yönerge

Öğretmenlik mesleğine hazırlanma süreci, öğretmen liselerinin yahut üniversitelerin öğretmen eğitimi programları ile başladığı varsayımının aksine çok daha öncesine, öğretmen adayının kendi öğrencilik yıllarına dayanmaktadır.  Öğretmen adayları yükseköğrenime başlamadan çok daha önce kendi eğitim okul yaşamları boyunca pek çok öğretmen tanır ve deneyim edinir. Bu deneyimler öğretmen adayının öncelikle meslek seçiminde, sonrasında ise birer öğretmen olarak kendi sınıflarında uygulayacakları tutum ve davranışlarını belirlemede öncü kaynak oluşturur (Baki & Gökçek, 2007; akt Işık, Çiltaş ve Baş, 2010).  Mustan (2002) öğretmenliğin bir meslek olarak hak ettiği değeri görebilmesi ve etkin olabilmesi için öğretmen adaylarına büyük görev düştüğünden bahsetmektedir. Öğretmen adayları öncelikle meslek seçimi yaparken öğretme, öğrenci okul gibi öğretmenliğin temelini oluşturan olgular hakkında bilgilenmek için çaba sarf etmelidirler. Bunun için liselerin rehberlik servisleri ile eğitim fakülteleri ortak çalışmalar ile öğretmenliği meslek olarak seçmeyi düşünen adaylara yardımcı olmalı, gerekli bilgilendirme çalışmasını gerçekleştirmelidirler (Tubbs, 1996; akt. Mustan, 2002).
Eğitim fakültelerinden mezun olup mesleğe başlayan öğretmenler  arasında maalesef ilk yıllarda mesleği bırakma eğilimleri görülmektedir. Bir çok meslekte olduğu gibi öğretmenlikte de ilk yıl yoğun adaptasyon sorunları yaşanması olasıdır. Mesleğinin ilk yıllarında olan öğretmenlerin yaşadığı problemlerden bir kaçı aşağıda sıralanmıştır (Yalçınkaya, 2002: 127; akt. Ekinci, 2010).

 
Bunların yanı sıra eğitim fakültelerinde aldıkları eğitim yoğun olarak teoriye dayanan öğretmen adayları mesleğe başladıkları ilk yıllarda büyük ölçüde gerçek sınıf ortamında deneyim kazanmaya dayalı olan (MEB, 2013:26-29; akt. Gökyer ve Özer, 2014) ve deneyim ve yaşantı ile bir bütünlük gösteren, sanatsal, sosyal ve liderlik boyutları ağırlıkta olan (Ekinci, 2010) bu meslekte teorik bilgileri pratiğe dökme hususunda problem yaşamaktadır.
Öğretmen yetiştirme programları yetiştirilecek adayların hizmet öncesi seçimi, belirli bir süre ve program dâhilinde yetiştirilmesi (hizmet öncesi eğitim),  görevlendirilecek olan öğretmen adaylarının kamu personeli olarak atanması ve görev başında ve hizmet içi eğitim ile yetiştirilmesi olmak üzere çeşitli aşamalardan oluşur (Ekinci, 2010; Akdemir, 2013).
Aday Memurların Yetiştirilmelerine İlişkin Yönetmelik (MEB, 1995) aday öğretmeni, “temel, hazırlayıcı ve uygulamalı eğitimlere tabi tutulmak üzere, Bakanlık merkez ve taşra teşkilatındaki görevlere ilk defa devlet memuru olarak atananlar” şeklinde tanımlamaktadır. Adaylık eğitimi ise, yine aynı yönetmelikte “aday memurların yetiştirilmesi amacıyla düzenlenen temel, hazırlayıcı ve uygulamalı eğitim devrelerini içine alan eğitim” olarak tanımlanmıştır. Bir başka deyişle aday öğretmen, Millî Eğitim Bakanlığı’na bağlı resmi veya özel bir eğitim kurumuna ataması yapılmış̧ ve mesleğine başlamış, ancak asaletini almamış̧ öğretmendir. Adaylık eğitimi süresince, deneyimli bir öğretmeni izlemek ile yükümlüdür (Gökyer ve Özer, 2014).
Adaylık eğitimi aday öğretmenler, gelecekteki başarılarının temelini şekillendirecek beceri ve alışkanlıkları kazanmaya başladıkları dönemdir. Bir çeşit geçiş dönemi olan bu süreçte pek çok öğretmenin mesleğine ilişkin bakış̧ açısı şekillenmeye başladığı, öğretmenin örgütsel aidiyetini, mesleğe bağlılığını ve uyum sağlama sürecinin sağıklı olarak gerçekleşmesini sağlayıcı oldukça kritik bir dönemdir (Gökyer ve Özer, 2014). Özetle adaylık eğitimi aday öğretmenin mesleğini benimsemesinde, mesleğine karşı olumlu bir tutum edinmesinde ve uygulamaya ilişkin yeterliliklerini edinebilmesinde kritik bir rol oynar. Özdemir ve Yalın (2000) öğretmenlikte ilk yılın kritik önemine dikkat çekmekte ve aday öğretmenlerin akademik destek ve yardıma ne kadar ihtiyaç duyduğundan bahsetmektedir.  Gökyer ve Özer (2014) de atanma şansını yakalamış olan stajyer öğretmenlerin yetkin ve ilgili rehberlerin (mentör) desteğine ihtiyaç duyduğunu belirtmektedir.
Esasında mesleğe yeni başlamış bir öğretmenin mesleğini sevmesi ve yeterli hissetmesi için henüz üniversitedeyken başlayan ve mesleğinin ilk yılında devam etmesi gereken okulun ne olduğu, bir kurum olarak nasıl işlediği, öğretmen olarak kurumun kendisinden neler beklediği ve bu beklentileri ile kendi kişiliği arasında uzlaşma sağlamak için neler yapabileceği gibi sorular üzerine düşünmesi gerekmektedir. Böylelikle bir öğretmen adayı bu mesleği seçtiği andan itibaren kendisini sosyal olarak olgunluk edinmek ve mesleği hususunda bilinçlenmek için hazırlamaya başlayacaktır (Tubbs, 1996; Mustan, 2002).
Adaylık eğitimi, bir anlamada hizmet öncesi öğretmen eğitiminin bir devamı niteliğini taşımaktadır. Adaylık eğitiminde, aday öğretmenin hizmet öncesi eğitiminde öğrendiklerinin üstüne öğretim ilke ve yöntemleri, ders araç ve gereçleri, planlama, rehberlik, ölçme ve değerlendirme, öğretmenlik mesleğine ilişkin yönetmelik ve yasalar, özlük hakları gibi konularda ek bilgi, beceri ve tutumlar kazandırılmak ve bunların uygulanması için olanak sağlamak amaçlanmaktadır (Gökyer ve Özer, 2014).
Aday öğretmenlerin yetiştirilmesi sorumluluğu görev tanımları içerisinde “Aday personelin yetişmesi için gereken tedbirleri alır” (2508 Sayılı T.D.) şeklinde ifade edilerek okul müdürlerine verilmiştir (Ekinci, 2010). Aday öğretmenlerin yetiştirilmesi “MEB Aday Memurların Yetiştirilmesine İlişkin Yönetmelik” kapsamında açıklanır bu yönetmelik takip edilerek uygulanır. Bu süreçte bütün planlama ve uygulama sorumluğu okul müdürlerine aittir. Aday öğretmenin yetiştirilmesinde rehberlik yapması amacıyla mesleki tecrübesine ve görev bilincine güvenilen bir öğretmen görevlendirilir. Rehber eğitici ve rehber öğretmenler, bir diğer tanım ile mentörler bu görevlerin yerine getirilmesi ile ilgili okul veya kurum amirine karşı sorumludur.
Öğretmen eğitiminde mentörlük deneyimli bir çalışanın deneyimsiz veya daha az deneyime sahip iş arkadaşlarına mesleki gelişimlerini sağlamak ve uyum süreçlerini desteklemek amacı ile önerilerde bulunduğu sistematik bir ilişki süreci olarak tanımlanmaktadır (Arslan ve Öcal, 2012; Yıldırım ve Yılmaz, 2013). Bu bağlamda mentörlük eğitim alanında tecrübeli ve deneyimli yöneticilerin mesleğe yeni başlamış olan y öneticilere ve öğretmenlere; tecrübeli ve deneyimli müfettişlerin mesleğe yeni başlamış olan müfettişlere, yöneticilere ve öğretmenlere; tecrübeli ve deneyimli öğretmenlerin mesleğe yeni başlamış öğretmenlere ve öğrencilere bilgi ve deneyimlerini sistemli bir şekilde aktarması biçiminde kullanılabilir (Yıldırım ve Yılmaz, 2013).
Yıldırım ve Yılmaz (2013) mesleklerine yeni başlayan öğretmenlerin üniversitedeki programlarından iyi derecelerle mezun olsalar  ve/veya başarılı staj dönemleri geçirseler dahi  mesleklerinin ilk yıllarında çeşitli zorluklarla karşılaştıklarından bahsetmektedir. Bu anlamda mentörün en önemli rolünün aday öğretmenin mesleki kimlik oluşturma sürecinde yaşadığı problemlerle baş etmesine yardımcı olmak ve bu süreçte yaşadığı stresi azaltmak olduğunu belirtmektedir. Söz konusu stres oluşturan durumlar arasında mesleklerinin ilk yılında bu öğretmenlerin sınıf yönetimi konusunda yetersiz kalmaları, teorik bilgilerini uygulamaya aktarma konusunda sıkıntı yaşadıkları, öğrencilikten öğretmenliğe geçişte yaşadıkları rol ve sorumluluk değişimi, yeni bir çalışma ortamına giriş ve benzeri etmenler sayılabilir.
Okullarda mesleğe yeni başlayan öğretmenler için geleneksel birebir mentörlüğün ötesinde destek sunulmalıdır. Örneğin grup mentörlüğü, informal mentörlük ve çevrimiçi mentörlük (Strachan, 2012 : 168). Strachan (2012) mesleğe yeni başlayan öğretmenlerin kendi ihtiyaçları için hangi tür mentörlüğün en uygun olduğunu söylemlerinin önemini üzerinde durmaktadır. Bir okulda birden fazla türde mentörlük sunulabilir:
Çeşitli mentörlük biçimleri aşağıda açıklanmaktadır: 

Öğretmen yetiştirme programlarının niteliğinin arttırılmasında rol oynayan iki temel bileşen söz konusudur. Bunlardan biri öğretmen olmayı amaçlayan bireylerin eğitim fakültelerinde yüksek öğrenimlerine devam ettikleri süreçte aldıkları hizmet öncesi eğitimdir. Diğeri ise okulda öğretmenlik görevine başlamış olan öğretmenlerin bu göreve devam ettikleri süreçte katıldıkları ve gerçekleştirdikleri hizmet içi eğitim ya da mesleki gelişim etkinlikleridir (Özer, 2008; akt. Işık, Çiltaş ve Baş, 2010).
Aşağıda hem hizmet öncesi hem de hizmet içi eğitimlerle öğretmenlerin adaylık süresinde yaşadıkları sorunlarla baş etmelerine yardımcı olmak amacı ile tasarlanmış mentörlük çalışmalarına ilişkin Türkiye’de yapılan çalışmalara yer verilecektir.
Adaylık döneminde mesleğe yeni başlayan öğretmene, meslek öncesi aldığı eğitimin niteliği ne olursa olsun, atanan bir veya bir kaç danışmanın mentorlüğünde uygulamada karşılaşacağı sorunlarla ilgili destek sağlamak amaçlanmaktadır. Bunun dışında eğitim sırasında eksik kalan bilgi, beceri, alışkanlık ve tutumların da bu dönemde kısmen de olsa giderilebilmesi hedeflenmektedir (Köymen, 1991:90; akt. Gökyer ve Özer, 2014).
Ekinci (2010), Özonay’ın 2004 yılında yaptığı “Öğretmenlerin Adaylık Eğitiminin Değerlendirilmesi” adlı çalışmasının sonucunda Türkiye’de uygulanan adaylık eğitimi programının kapsamının yeterli olduğunu aktarmaktadır. Ancak bu program kapsamında aday öğretmenlerin uygulamaya dönük gereksinimlerinin yeterince karşılanmadığı, yeni ve ilginç bilgilerden oluşmadığı, adaylık eğitimi sürecinin öğretimse bakımdan etkin ve verimli geçmediği eklenmektedir. Özonay’ın çalışması sonucunda ayrıca aday öğretmenlerin rehber öğretmenlerden yeterince yardım almalarına rağmen onlarla düzenli bir biçimde derse girmedikleri ve müfettişlerden de yeterince destek göremedikleri yönünde bulgular elde ettiği aktarılmaktadır.
Milli Eğitim Bakanlığı da 2011 yılında Ulusal Öğretmen Stratejisi Çalıştayı gerçekleştirmiştir. Bu Çalıştayda çağdaş uygulamaların mentörlüğün iş başında öğrenme kapsamında geliştirilmesi zorunluluğu belirtilmiştir. Bu

Anaplastik Glioma (WHO Grade III)

Anaplastik astrocytoma (AA), anaplastik oligodendroglioma (AO), ve anaplastik oligoastrocytomayı (AOA) kapsar
Tedavi yaklaşımı WHO Grade IV glioblastoma gibidir. Ancak AO ve AOA histolojilere spesifik bir kaç çalışma mevcuttur.

RTOG RPA; 1993 (1974-1989) - PMID 8478956 — "Recursive partitioning analysis of prognostic factors in three Radiation Therapy Oncology Group malignant glioma trials." Curran WJ et al. J Natl Cancer Inst. 1993 May 5;85(9):704-10.
Analysis of RTOG 74-01 / ECOG 1374, RTOG 79-18, and RTOG 83-02. 1578 hasta içeriyor.

NOA-04 (Germany)(1999-2005) -- RT 54-60 Gy vs. PCV vs. temozolomide
Randomize. 318 hasta, supratentoryal WHO Grade III glioma. Kol 1) 6 haftada 54-60 Gy RT vs. Kol 2) CCN 110 mg/m2, vincristine 2 mg, procarbazine 60 mg/m2 x 4 siklus vs. Kol 3) Temozolomide 200 mg/m2 x 8 siklus. Primer endpoint başarısızlığa kadar geçen süre
2008 ASCO Abstract -- "Randomized phase III study of sequential radiochemotherapy of oligoastrocytic tumors of WHO-grade III with PCV or temozolomide: NOA-04." (Wick Wolfgang W. J Clin Oncol 26: 2008 (May 20 suppl; abstr LBA2007))
Bulgular: medyan başarısızlığa kadar geçen süre RT 3.6 yıl vs. PCV/Temozolomide 3.6 yıl (NS), medyan OS 5+ yıl vs. 5+ yıl (NS)
Prediktörler: oligo komponent (oligodendroglioma veya oligoastrocytoma), LOH 1p/19q , MGMT+
Toksisite: Grade 3-4 hematolojik toksisite PCV'de temozolomide göre bariz daha fazla
Sonuç: başarısızlığa kadar geçen süre açısından RT ve KT kollarında (PCV veya TMZ) fark yok

EORTC 26951 (1996-2002) -- RT +/- adjuvan PCV
Randomize. 368 hasta. AO and AOA (>25% oligodendroglial elementler). Medyan yaş 49. Cerrahiden sonra 6 hafta içinde 33 fraksiyonda 59.4 Gy RT planlandı, Kol 1) izlem vs. Kol 2) PCV (procarbazine 60, lomustine 110, vincristine 1.4) x6 siklus. Adjuvan PCV %38 hastada tamamlanamadı; RT kolunun %80'ine progresyonda kemoterapi uygulandı. RT 45Gy/25fx PTV1 = T2 + 2.5cm , sonra 59.4Gy/33fx PTV2 = T1 + 1.5cm uygulandı. Primer endpoint OS
5-yıl; 2006  PMID 16782911 — "Adjuvant procarbazine, lomustine, and vincristine improves progression-free survival but not overall survival in newly diagnosed anaplastic oligodendrogliomas and oligoastrocytomas: a randomized European Organisation for Research and Treatment of Cancer phase III trial." (Van den Bent MJ et al. J Clin Oncol. 2006 Jun 20;24(18):2715-22.). Medyan takip 5 yıl
Bulgular: medyan OS RT+PCV 3.4 yıl vs RT 2.6 yıl (NS); PFS: 1.9 yıl vs 1.1 yıl (SS)
1p/19q Analizleri: Kombine deletion %25 olguda mevcut; 5-yıllık OS %74; 5-yıllık OS RT+PCV %74 vs. RT %75 (NS); PFS %69 vs. %50 (NS). 5-yıllık OS karşılaştırılmasında 1p/19q delesyonu %74 vs. 1p/19q WT %30.
Sonuç: Adjuvan PCV sağkalımı uzatmıyor, fakat PFS iyileştiriyor. 1p/19q delesyonlu hastalar bariz daha iyi sonuca sahipler ve bu iyi sonuca PCV eklenmesinin katkısı yok.
QoL; 2007 PMID 18089866 -- "Health-related quality of life in patients treated for anaplastic oligodendroglioma with adjuvant chemotherapy: results of a European Organisation for Research and Treatment of Cancer randomized clinical trial." (Taphoorn MJ, J Clin Oncol. 2007 Dec 20;25(36):5723-30.)
Sağlıkla ilişkili QoL değerlendirildi, başlangıçta hastaların %78'i, tedavi sonrası 2.5 yılda %55 olarak saptandı.
Bulgular: başlangıçta: PCV grubunda daha kötü iştah, baygınlık, kemoterapi esnasında ve hamen sonrasında gözlenirken uzun dönem fark yoktu.
Sonuç: PCV sonrası QoL'ta uzun dönemde fark yok
RTOG 9402 / INT 0149 (1994-2002) -- Ardışık PCV -> RT vs. tekbaşına RT
Randomize. Supratentoryal AO and AOA'lı 289 hasta (>%25 oligodendroglioma component), KPS >=60. Maksimal cerrahi rezeksiyon sonrası PCV x4 siklus -> RT vs tekbaşına RT'ye randomize edilmişler. Kol 1) PCV (procarbazine, CCNU, vincristine) x4 siklus -> RT vs. Kol 2) Tekbaşına RT. RT 59.4Gy/33fx, PTV1 = T2 + 2cm, PTV2 = T1 + 1cm
2006 PMID 16782910  --; "Phase III trial of chemotherapy plus radiotherapy compared with radiotherapy alone for pure and mixed anaplastic oligodendroglioma: Intergroup Radiation Therapy Oncology Group Trial 9402." (Cairncross G, J Clin Oncol. 2006 Jun 20;24(18):2707-14.) Medyan takip 5.1 yıl
Bulgular: Medyan OS PCV->RT 4.9 yıl vs. RT 4.7 yıl (NS). PFS 2.6 yıl vs. 1.7 yıl (SS).
Toksisite: Grade 3-4 PCV sırasında %65, sonrasındaki RT'de %8 vs. tekbaşına RT %5
Kromozomlar: LOH 1p/19q her ikisinde %46 iken, AO %57 vs. AOA %14 (SS).  Tümör progresyonu olmaksızın sağkalım PFS riski düşük  4.0 vs 1.3 yıl(SS). Tedavinin sağkalıma etkisi yok.
Sonuç Sağkalıma katkı yok. PFS daha iyi fakat artmış toksisite bedelini öderseniz. 1p/19q delesyonlu hastaların sonuçları bariz olarak daha iyi.
EORTC 26882 (1988-2000) -- RT +/- adjuvan BCNU/DBD
Randomize. Hasta alımındaki problemler nedeniyle durdurulmuş. 193/212 hasta anaplastik astrositoma. İki cohorts: 58 anaplastik astrositoma hastası original EORTC 26882 cohort'u + 135 hasta yalnızca AA hastası. Kol 1) Tekbaşına RT vs. Kol 2) RT + eşzamanlı BCNU/DBD sonrası adjuvan BCNU/DBD x1 yıl. RT 60Gy/30fx uygulanmış. Primer endpoint OS.
2008 PMID 18248979 -- "Adjuvant dibromodulcitol and BCNU chemotherapy in anaplastic astrocytoma: results of a randomised European Organisation for Research and Treatment of Cancer phase III study (EORTC study 26882)." (Hildebrand J, Eur J Cancer. 2008 Jun;44(9):1210-6. Epub 2008 Jan 14.)
Patoloji: Merkezi patoloji değerlendirmesinde, AA hastalarının %53'ünün tanıları onaylanmamış. AA %35, AOA %8, AO %2, GBM %25, LGG %23, diğer tanılar %7
Bulgular: medyan OS RT 2.0 yıl vs. RT + BCNU/DBD 2.3 yıl (NS), PFS de fark yok
Sonuç: BCNU/DBD eklenmesinin OS ve PFS katkısı yok

Harvard; 2001 (1993-1996) PMID 11516862 -- "Dose-escalation with proton/photon irradiation for Daumas-Duport lower-grade glioma: results of an institutional phase I/II trial." (Fitzek MM, Int J Radiat Oncol Biol Phys. 2001 Sep 1;51(1):131-7.)
Faz I/II. Anlamlı yanıt olmaksızın yüksek toksisite nedeniyle erken kapatıldı. 20 hasta (7'sinde Daumas-Duport Grade 2, 13'ünde Grade 3-4). Grade 2'de dose 68.2 CGE (Kobalt Gy eşdeğeri) ve Grade 3'te 79.7 CGE, konvansiyonal fraksiyonasyon ile uygulandı. Siklotron uygunluğuna göre medyan proton dozu %84 ve kalanı 3-B foton tedavisi olarak verildi. Medyan yaş 36 yıl. Yaşayan hastalar için medyan takip 5 yıl
Bulgular: 5-yıl OS: Grade 2 %71, Grade 3 %23. Yeni kontrast tutulumu 16/20 hastada, 14/16 had patolojik örnekleme yapılmış (%50 radyasyon nekrozu). Tekrarayan hastalığı çoğunluğu yüksek doz bölgesinde
Sonuç: Doz artışı bariz radyasyon nekrozuna neden oluyor fakat sonuçları iyileştirmiyor.

Daha agresif tedavinin sağkalıma negatif etkisi mi var?

PMID 2689399, 1989 --; "Radiation Therapy Oncology Group (RTOG) survival data on anaplastic astrocytomas of the brain: does a more aggressive form of treatment adversely impact survival?" Laramore GE et al. Int J Radiat Oncol Biol Phys. 1989 Dec;17(6):1351-6.
RTOG çalışmalarınına göre, tekbaşına foton ile tedavi edilen 47 hasta , foton+kemoterapi ile tedavi edilen 78 hasta ve foton + nötron boost uygulanan 38 hasta karşılaştırılmış.
Medyan sağkalım 3.0, 2.3, ve 1.7 yıl, daha agresif tedavi ile sağkalım kötüleşiyor.
PMID 1659173, 1991 --; "Long-term survival in treated anaplastic astrocytomas. A report of combined RTOG/ECOG studies." Fischbach AJ et al. Am J Clin Oncol. 1991 Oct;14(5):365-70.
Yukarıdaki çalışmaya (Laramore) benzer sonuç.

Çocuklardaki SSS tümörlerinin % 10-20.
Yetişkinlerdeki SSS tümörlerinin %5.

Genellikle ponsta yerleşirler.
Genellikle yüksek dereceli (WHO III/IV).
Lokal invaziv.
Prognoz kötü (medyan sağkalım <1 yıl).
Beyin sapı gliomlarının %80'ini oluşturur.

Medulla veya ortabeyinde yerleşir.
Düşük derecelidir.
Lokal infiltrasyon veya ödem yoktur ve iyi sınırlıdır.
Bariz bölümü uzun sağkalım verir.
Beyin sapı gliomlarının %15-20'sini oluşturur.

Diffüz beyinsapı gliomu - Steroidler ve RT/temozolomid ile yüksek dereceli astrositomalar gibi tedavi edilir.
Hiperfraksiyonasyon çok çalışılmış ve faydası gösterilememiştir.
Fokal beyinsapı gliomu
Tektal glioma BOS diversiyonu ve gözlem ile tedavi edilebilirler.
Tegmental glioma cerrahi rezeksiyon ile tedavi edilebilirler.
Dorsal eksofitik fokal beyinsapı gliomu cerrahi rezeksiyon ile tedavi edilebilirler.
Meduller fokal beyinsapı gliomu sıklıkla RT ile tedavi edilirler.

Nijmegen, Netherlands; 2009 PMID 18990510 -- "The role of hypofractionation radiotherapy for diffuse intrinsic brainstem glioma in children: a pilot study." (Janssens GO, Int J Radiat Oncol Biol Phys. 2009 Mar 1;73(3):722-6. Epub 2008 Nov 5.)
Prospektif. 9 çocuk, diffuz beyinsapı glioması. RT 13/39. Ortalama takip 15 ay
Bulgular: Medyan OS 8.6 ay, medyan TTP 4.9 ay
Grade 3-4 toksisite yok
Sonuç: Radikal hipofraksiyonasyon uygulanabilir daha kısa tedavi süresinde çabuk iyileşme sunuyor.
Harvard; 2003 (1990-96) - PMID 12654425 -- Marcus KJ et al.  "A phase I trial of etanidazole and hyperfractionated radiotherapy in children with diffuse brainstem glioma."  Int J Radiat Oncol Biol Phys. 2003 Apr 1;55(5):1182-5.
Beyinsapı gliomu 18 hasta etanidazole + hiperfraksiyone RT ile tedavi edilmiş. (66 Gy/1.5 BID 1-3 hastalar, diğer 15 hasta 63 Gy/1.5 BID).
3 grade 3 toxicities (skin, 1 vomiting)
Medyan sağkalım 8.5 ay
Sonuç:  Etanidazole'un doz sınırlayıcı toksisitesi çocukluk çağında döküntü (yetişkinlerde nöropati olmasına rağmen).
POG 9239, 1999 (1992-97) - PMID 10192340 -- Mandell LR et al.  "There is no role for hyperfractionated radiotherapy in the management of children with newly diagnosed diffuse intrinsic brainstem tumors: results of a Pediatric Oncology Group phase III trial comparing conventional vs. hyperfractionated radiotherapy."  Int J Radiat Oncol Biol Phys. 1999 Mar 15;43(5):959-64.
Diffüz beyin sapı gliomalı 130 hasta eşzamanlı cisplatin ile tedavi edilmişler, konvansiyonel RT (180 cGy qD toplam 54 Gy) ve hiperfraksiyone RT (117 cGy BID toplam 70.2 Gy) randomize edilmişler.
1-yıllık OS %30.9 (konvansiyonal) vs %27 (HF); 2-yıllık OS %7.1 (konvansiyonal) vs %6.7 (HF)
Progresyona kadar geçen süre 6 ay (konvansiyonal) ve 5 ay (HF)
Sonuç:  Diffüz beyin sapı gliomasında hiperfraksiyone RT fayda yok.

Adult low grade gliomas

Rölatif olarak yavaş büyüyen beyin tümörlerindendir.
Primer SSS tümörleriin yaklaşık %10'unu oluşturur.
Yetişkinler için medyan tanı yaşı 40'lı yıllardır ve gençlerde ise pilositik astrositoma görülür
Bayılmadan fonksiyonel bozukluklara kadar heterojen klinik bulgular mevcuttur.
WHO tarafından Grade I veya Grade II olarak tanımlanır; sık görülen histopatolojik subtipler astrocytoma, oligodendroglioma, ve mixed oligoastrocytomadır.
Yüksek dereceye anaplastik transformasyon sıktır, %70-80 hastada
Cerrahi tipik olarak ilk seçenektir.
RT adjuvan ya da kurtarma tedavisi olarak kullanılabilir; progresyona kadar geçen süre ve bayılma gibi semptomların kontrolü daha iyi olsa da OS fark yoktur.
İki randomize çalışmada 45 ve 65 Gy arasında doz yanıtı açısından bir fark olmadığı görülmektedir. (EORTC 22844 45 Gy vs. 59.4 Gy, INTERGROUP  50.4 Gy vs. 64.8 Gy); sonuç olarak, NCCN 45 - 54 Gy'ı uygulanabilir bir doz olarak önermektedir.
5-yıllık toplam sağkalım %60-70, progresyonsuz sağkalım ise %40-50.

1p/19q füzyon ya da delesyonu

NCCTG Trials; 2006 PMID 17047046 -- "A t(1;19)(q10;p10) mediates the combined deletions of 1p and 19q and predicts a better prognosis of patients with oligodendroglioma." (Jenkins RB, Cancer Res. 2006 Oct 15;66(20):9852-61.)
NCCTG'nin 2 düşük dereceli glioma çalışmasına 119 hasta alınmış. Translokasyon t(1;19) FISH ile değerlendirilmiş
Füzyon prevalansı: oligodendroglioma %55, mixed oligoastrocytoma %47, astrocytoma %0
Medyan OS: tüm hastalar - füzyon/delesyon 11.9 yıl vs. füzyonsuz 8.1 yıl (SS); yalnızca oligodendroglioma - füzyon/delesyon 13.0 yıl vs. füzyonsuz 9.1 yıl (SS).
Sonuç: t(1;19) kombine 1p/19q delesyonuna aracılık ediyor ve daha iyi OS ve PFS ile ilişkili
Prognostik Gruplama

EORTC 22844/22845
2002 PMID 11956268, "Prognostic factors for survival in adult patients with cerebral low-grade glioma." (Pignatti F et al. J Clin Oncol. 2002 Apr 15;20(8):2076-84.)
EORTC 22844 (construction set = 322 hasta) and EORTC 22845 (validation set = 288 hasta)
Kötü prognoz: Yaş >= 40, astrocytoma hikayesi, tümör >= 6 cm, orta hattı geçen tümör, cerrahi öncesinde nörolojik defisit var, cerrahi genişliğinin etkisi yok
Model:

EORTC 22844 (1985-1991)
Randomize. 343 hasta. Yaş 16-65. Astrocytoma, oligodendroglioma ve mixed oligoastrocytomayı içeriyor. Total rezeke edilmiş pilositik astrocytoma hariç tutuyr. Önce cerrahi. 1.8 Gy/fx larla 45 Gy vs 59.4 Gy randmize edilmiş. RT tekniği: kontrast + 2 cm marjin 45 Gy'e kadar, sonrasında 54 Gy'e kadar 1 cm marjin ve 59.4 Gy'e kadar minimal marjin.
5-yıl; 1996 PMID 8948338, 1996 — "A randomized trial on dose-response in radiation therapy of low-grade cerebral glioma: European Organization for Research and Treatment of Cancer (EORTC) Study 22844." Karim AB et al. Int J Radiat Oncol Biol Phys. 1996 Oct 1;36(3):549-56. Medyan takip 6.2 yıl
5-yıl: OS fark yok (%58 vs %59) veya PFS (%47 vs %50)
Prediktörler: Yaş, tümör boyutu, nörolojik durum ve cerrahinin genişliği
Sonuç: 45 Gy üzerinde oz yanıt artışı yok.
Quality of life; 1998 PMID 10023313 -- "Quality of life after radiation therapy of cerebral low-grade gliomas of the adult: results of a randomised phase III trial on dose response (EORTC trial 22844). EORTC Radiotherapy Co-operative Group." (Kiebert GM, Eur J Cancer. 1998 Nov;34(12):1902-9.)
Anket, 47 soru
Bulgu: yüksek RT grubunda daha fazla baygınlık/halsizlik, emosyonel fonksiyon kaybı var.
Sonuç: 45 Gy daha iyi
Intergroup NCCTG/RTOG/ECOG (1986-1994)
Randomize. 203 hasta. Yaş >18. Düşük dereceli astrocytoma, oligodendroglioma, veya mixed oligoastrocytoma içeriyor; pilositik astrocytoma çalışma dışı tutulmuş. 50.4 Gy vs 64.8 Gy randomize edilmiş. RT tekniği: 2 cm marjin preoperatif tümör hacmine, 1 cm marjin 50.4 Gy sonrası boost için veriliyor.
5-yıl; 2002 PMID 11980997 — "Prospective randomized trial of low- versus high-dose radiation therapy in adults with supratentorial low-grade glioma: initial report of a North Central Cancer Treatment Group/Radiation Therapy Oncology Group/Eastern Cooperative Oncology Group study." (Shaw E et al. J Clin Oncol. 2002 May 1;20(9):2267-76.) Medyan takip 6.4 yıl
5-yıl sonuç: Düşük dozda OS %72 vs. yüksek dozda %65 (NS); progresyonsuz sağkalım %58 vs. %52 (NS). Alan içi başarısızlık %92
Toksisite: yüksek doz kolunda daha sık ve ciddi (%2.5 vs %5)
Kötü prognoz: Astrocytoma, yaş >40, tümör >=5 cm (5-yıl OS <40 ve oligodendroglioma'da %82 vs. >40 ve astrocytoma %32)
Sonuç: Daha yüksek RT dozu için fayda yok
MMSE Kognitif; 2003 PMID 12829670 -- "Effects of radiotherapy on cognitive function in patients with low-grade glioma measured by the folstein mini-mental state examination." (Brown PD, J Clin Oncol. 2003 Jul 1;21(13):2519-24.)
Prospektif. 203 hasta Mini-Mental State Examination ile tedavi öncesi ve takipte değerlendirilmiş. Medyan takip 7.4 yıl
7.4-yıllık sonuç: Tümör progresyonu olmaksızın hastaların %95'inde MMSE aynı. Eğer başlangıç MMSE anormal ise tedavi sonrası bariz iyileşme gözlemlenmiş.
Sonuç olarak: RT sonrası hastaların büyük çoğunluğunun nörokognitif durumu aynı kalıyor.
Kognitif; 2005 PMID 15964709 -- "Cognitive function after radiotherapy for supratentorial low-grade glioma: a North Central Cancer Treatment Group prospective study." (Laack NN, Int J Radiat Oncol Biol Phys. 2005 Nov 15;63(4):1175-83.)
Subset. 20 hasta (10 düşük doz, 10 yüksek doz). Başlangıçta ve her 1.5 yılda bir yoğun test yapılmış. Medyan takip 3 yıl.
Sonuç: Yaş-spesifik normal değerlere göre başlangıç skorları daha düşük. Stratifikasyona (doz, yaş, lokasyon, tip, rezeksiyon) bakılmaksızın kognitif performansta fark yok
Karar: RT sonrası kognitif fonksiyon aynı

EORTC 22845 (1986-1997)
Randomize. 314 hasta. Yaş 16-65. Supratentoryal düşük dereceli astrocytoma, düşük dereceli oligoastrositoma, veya düşük dereceli oligodendroglioma. Küçük, tam çıkarılmış pilositik astrositoma,optik sinir gliomu, beyin sapı gliomu, 3. ventrikül glioması, ve infratentoryal gliomalar çalışma dışı bırakılmış. Önce cerrahi uygulanmış. Erken radyoterapi ve progresyon sonrası geç radyoterapiye randomize edilmişler. RT dozu 54 Gy (1.8 Gy/fx). Progresyona kadar 4 ayda bir BT ile takip edilmişler. Teknik: preop BT + 2 cm marjins 45 Gy'e kadar, sonrasında mrjı 1 cm düşürmüşler.
2005 PMID 16168780 — "Long-term efficacy of early versus delayed radiotherapy for low-grade astrocytoma and oligodendroglioma in adults: the EORTC 22845 randomised trial." (van den Bent MJ et al. The Lancet Volume 366, Issue 9490, 17 September 2005, Pages 985-990.) Medyan takip 7.8 yıl
Sonuç: Medyan PFS erken RT'de 5.3 yıl vs gecikmiş RT'de 3.4 yıl (SS). 5-yıllık PFS %55 vs. %35 (SS). Medyan OS 7.4 vs 7.2 yıl (NS). Kontrol grubundaki hastaların %65'ine progresyon esnasında RT uygulandı. Erken RT kolundakilerin %4'ü kurtarma RT'si uygulandı. 1 yılda erken RT kolunda daha iyi bayılma kontrolü sağlanmış. (%25 vs. %41 SS).
Progresyon sonrası: Sağkalım erken RT'de 1 yıl vs. gecikmiş RT'de 3.4 yıl (SS). Yaklaşık %70'i yüksek dereceye transforme oluyor ve RT uygulanmanın bir katkısı yok. Yineleyen hastalığın çoğu aln içinde.
Toksisite: Kognitif defisit, peformans durumu, ve başağrısında fark yok.
Sonuç: Erken RT PFS'yi uzatırve bayılmayı kontrol eder fakat OS'ye katkısı yok.
Yorum: OS'de fark olmaması kurtarma RT'sine bağlı olabilir.

RTOG 98-02 / INT (1998-2002) -- RT +/- PCV
Randomize. 362 hasta, WHO Grade II supratentoryal astrositoma, oligoastrositoma, veya oligodendroglioma
Yüksek riskli LGG (yaş >=40 veya STR/bx; 251 hasta): Kol 1) Tekbaşına RT vs. Arm 2) RT + PCV x 6 siklus. RT, T2 + 2 cm block-sınır marjı
Düşük riskli LGG (yaş <40 ve GTR; 111 hasta): Yalnız gözlem
4-yıl; 2006 ASCO Abstract 1500 (slides + video) — "Initial report of Radiation Therapy Oncology Group (RTOG) 9802: Prospective studies in adult low-grade glioma (LGG)." Shaw EG et al. Journal of Clinical Oncology, 2006 ASCO Annual Meeting Proceedings Part I. Vol 24, No. 18S (June 20 Supplement), 2006: 1500. Medyan takip 4 yıl
Sonuç:
Yüksek risk: 5-yıl OS RT %61 vs. RT + PCV %70 (NS); PFS %39 vs. %61 (NS)
Düşük risk: 5-yıl OS %94; PFS %50
Toksisite: Grade 3-4 RT %9 vs. RT + PCV %67. Tedaviye bağı ölüm yok.
Sonuç: 5-yıllık PFS 3 kolda da kötü; yüksek riskli hastalarda adjuvan PCV ekleme sağkalım avantajı yok
6-yıl; 2008 ASCO Abstract 2006 -- "Final report of Radiation Therapy Oncology Group (RTOG) protocol 9802: Radiation therapy (RT) versus RT + procarbazine, CCNU, and vincristine (PCV) chemotherapy for adult low-grade glioma (LGG)." (Shaw EG, J Clin Oncol 26: 2008 (May 20 suppl; abstr 2006)) Medyan takip 5.9 yıl
Yüksek risk sonuçları: 5-yıllık OS RT'de %63 vs. RT + PCV %72 (NS); PFS %46 vs. %63 (p=0.06). 2 yıla kadar fark yok ama 2 yıldan sonra RT+PCV kolunda bariz fark var. ölüm için HR 0.52, PFS için 0,45.
Sonuç: PCV eklenmesiyle PFS iyileşiyor fakat OS değil. 2 yıl sonrasında, OS avantajı mevcut ve ölüm riski %48 azalmış.
RTOG 04-24 (Devam ediyor)
Faz II. Yüksek riskli LGG (en az 3 risk faktör varlığında: yaş >=40, tümör çapı >=6cm, orta hattı geçen tümör, astrositoma subtipi, preop. nörolojik defisit varlığı). RT + Temozolomide. Karşlaştırılma EORTC hasta populsayonu ile yapılacak.

RTOG 98-02 (1998-2002) -- RT +/- PCV
Randomized kol + gözlem kolu. 362 hasta, WHO Grade II supratentoryal astrositoma, oligoastrositoma, veya oligodendroglioma. Düşük riskli LGG (yaş <40 ve GTR; 111 hasta): Gözlem
2006 ASCO Abstract 1500 (slides + video) — "Initial report of Radiation Therapy Oncology Group (RTOG) 9802: Prospective studies in adult low-grade glioma (LGG)." Shaw EG et al. Journal of Clinical Oncology, 2006 ASCO Annual Meeting Proceedings Part I. Vol 24, No. 18S (June 20 Supplement), 2006: 1500. Medyan takip 4 yıl
Bulgular: Düşük riskte 5-yıllık OS %94; PFS %50
Sonuç: 5-yıllık PFS kötü

Intergroup NCCTG/RTOG/ECOG (1986-1994) -- 50.4 Gy vs. 64.8 Gy
Randomized. 203 patients. Age >18. Included low grade astrocytoma, oligodendroglioma, or mixed oligoastrocytoma; pilocytic astrocytomas were excluded. Randomized to 50.4 Gy vs 64.8 Gy. RT technique: 2 cm margin around preoperative tumor volume, 1 cm margin for boost after 50.4 Gy.
5-years; 2002 PMID 11980997 — "Prospective randomized trial of low- versus high-dose radiation therapy in adults with supratentorial low-grade glioma: initial report of a North Central Cancer Treatment Group/Radiation Therapy Oncology Group/Eastern Cooperative Oncology Group study." (Shaw E et al. J Clin Oncol. 2002 May 1;20(9):2267-76.) Median F/U 6.4 years
5-year outcome: OS low dose 72% vs. high dose 65% (NS); time-to-progression 58% vs. 52% (NS). Failure within field 92%
Toxicity: more often and more severely in high dose arm (2.5% vs 5%)
Poor prognosis: astrocytoma, age >40, tumor >=5 cm (5-year OS if <40 and oligodendroglioma 82% vs. >40 and astrocytoma 32%)
Conclusion: No benefit for higher RT dose
EORTC 22844 (1985-1991) -- 45 Gy vs. 59.4 Gy
Randomized. 343 patients. Age 16-65. Included astrocytoma, oligodendroglioma, mixed oligoastrocytoma. Excluded completely excised pilocytic astrocytoma. Surgery first. Randomized to low dose 45 Gy vs high dose 59.4 Gy at 1.8 Gy/fx. RT technique: 2 cm margin around enhancing tumor to 45 Gy, reduced field 1 cm margin to 54 Gy and minimal margin to 59.4 Gy.
5-years; 1996 PMID 8948338, 1996 — "A randomized trial on dose-response in radiation therapy of low-grade cerebral glioma: European Organization for Research and Treatment of Cancer (EORTC) Study 22844." Karim AB et al. Int J Radiat Oncol Biol Phys. 1996 Oct 1;36(3):549-56. Median F/U 6.2 years
5-year outcome: No difference in OS (58% vs 59%) or PFS (47% vs 50%)
Predictors: Age, size, neurologic status, amount of surgery
Conclusion: No dose response above 45 Gy

EORTC 22845 (1986-97) -- Adjuvant vs. salvage RT
Randomized. 314 patients. Age 16-65. Supratentorial low grade astrocytoma, low grade oligoastrocytoma, or low grade oligodendroglioma. Excluded small completely resected pilocytic astrocytomas, optic nerve gliomas, brainstem gliomas, third ventricle gliomas, and infratentorial gliomas. Surgery first. Randomized to early radiotherapy with 54 Gy (1.8 Gy/fx) vs delayed radiotherapy until the time of progression. CT with contrast every 4 months until progression. Technique: preop CT + 2 cm margins to 45 Gy, reduced field to 1 cm after 45 Gy.
2005 PMID 16168780 — "Long-term efficacy of early versus delayed radiotherapy for low-grade astrocytoma and oligodendroglioma in adults: the EORTC 22845 randomised trial." (van den Bent MJ et al. The Lancet Volume 366, Issue 9490, 17 September 2005, Pages 985-990.) Median F/U 7.8 years
Outcome: Median PFS early RT 5.3 yrs vs delayed RT 3.4 yrs (SS). 5-year PFS 55% vs. 35% (SS).  Median OS 7.4 vs 7.2 yrs (NS). 65% of pts in control group received RT at progression, 4% in early RT received salvage RT.  At 1 yr, better control of seizures in early RT group (25% vs. 41%, SS).
After progression: survival early RT 1.0 years vs. delayed RT 3.4 years (SS). ~70% transformed to high grade tumors, regardless if they had RT or not. Most recurrences within field
Toxicity (compared at 1 year for patients still tumor free at 2 years): No difference in cognitive deficit, focal deficit, performance status, or headaches.
Conclusion: Early RT lengthens PFS and controls seizures, but doesn't impact OS
Comment: tumor planning off CT, central path showed 26% were high grade tumors but balanced between arms, no QoL analysis

RTOG 98-02 / INT (1998-2002) -- RT +/- PCV
Randomized arm + observation arm. 362 patients, WHO Grade II supratentorial astrocytoma, oligoastrocytoma, or oligodendroglioma
High risk LGG (age >=40 or STR/bx; 251 patients): Arm 1) RT 54/30 alone vs. Arm 2) RT + PCV x6 cycles. RT given T2 + 2 cm block-edge margin
Low risk LGG (age <40 and GTR; 111 patients): Observation only
6-years; 2008 ASCO Abstract 2006 -- "Final report of Radiation Therapy Oncology Group (RTOG) protocol 9802: Radiation therapy (RT) versus RT + procarbazine, CCNU, and vincristine (PCV) chemotherapy for adult low-grade glioma (LGG)." (Shaw EG, J Clin Oncol 26: 2008 (May 20 suppl; abstr 2006)) Median F/U 5.9 years
High risk outcome: 5-year OS RT 63% vs. RT + PCV 72% (NS); PFS 46% vs. 63% (p=0.06). In years 0-2 no difference, beyond 2 years significant benefit for RT+PCV. HR for death 0.52, for PFS 0.45
Conclusion: PFS but not OS were improved with addition of PCV. Beyond 2 years, OS advantage, and decreased risk of death by 48%

EORTC 26951 (1996-2002) -- RT +/- adjuvant PCV
Randomized. 368 patients. AO and AOA (>25% oligodendroglial elements). Median age 49. Surgery followed by RT within 6 weeks 59.4/33, then Arm 1) observation vs. Arm 2) PCV (procarbazine 60, lomustine 110, vincristine 1.4) x6 cycles. Adjuvant PCV discontinued in 38%; 80% of RT arm received chemo at progression. RT PTV1 = T2 + 2.5cm to 45/25, then PTV2 = T1 + 1.5cm to 59.4/33. Primary endpoint OS
5-years; 2006  PMID 16782911 — "Adjuvant procarbazine, lomustine, and vincristine improves progression-free survival but not overall survival in newly diagnosed anaplastic oligodendrogliomas and oligoastrocytomas: a randomized European Organisation for Research and Treatment of Cancer phase III trial." (Van den Bent MJ et al. J Clin Oncol. 2006 Jun 20;24(18):2715-22.). Median F/U 5 years
Outcome: median OS RT+PCV 3.4 years vs RT 2.6 years (NS); PFS: 1.9 years vs 1.1 years (SS)
1p/19q Analysis: Combined deletion in 25%; 5-year OS 74%; 5-year OS RT+PCV 74% vs. RT 75% (NS); PFS 69% vs. 50% (NS). Comparison of 5-year OS 1p/19q deleted 74% vs. 1p/19qWT ~30%
Conclusion: Adjuvant PCV does not prolong OS, but improves PFS. Patients with 1p/19q deletion have significantly better outcome, though not impacted by addition of PCV
EORTC 26882 (1988-2000) -- RT +/- adjuvant BCNU/DBD
Randomized. Stopped early due to slow accrual. 193/212 patients, anaplastic astrocytoma. Two cohorts: 58 anaplastic astrocytoma patients from original EORTC 26882 cohort + 135 patients from extended accrual focusing on AA only. Arm 1) RT alone vs. Arm 2) RT + concurrent BCNU/DBD followed by adjuvant BCNU/DBD x1 year. RT 60/30. Primary endpoint OS.
2008 PMID 18248979 -- "Adjuvant dibromodulcitol and BCNU chemotherapy in anaplastic astrocytoma: results of a randomised European Organisation for Research and Treatment of Cancer phase III study (EORTC study 26882)." (Hildebrand J, Eur J Cancer. 2008 Jun;44(9):1210-6. Epub 2008 Jan 14.)
Pathology: At central path review, 53% of AA cases couldn't be confirmed. AA 35%, AOA 8%, AO 2%, GBM 25%, low grade glioma 23%, other diagnosis 7%
Outcome: median OS RT 2.0 years vs. RT + BCNU/DBD 2.3 years (NS), no difference in PFS
Conclusion: No benefit in OS or PFS with addition of BCNU/DBD

NOA-04 (Germany)(1999-2005) -- RT 54-60 Gy vs. PCV vs. temozolomide
Randomized. 318 patients, supratentorial WHO Grade III glioma. Arm 1) RT 54-60 Gy in 6 weeks vs. Arm 2) CCNU 110 mg/m2, vincristine 2 mg, procarbazine 60 mg/m2 x4 cycles vs. Arm 3) temozolomide 200 mg/m2 x8 cycles. Primary endpoint time-to-failure
2008 ASCO Abstract -- "Randomized phase III study of sequential radiochemotherapy of oligoastrocytic tumors of WHO-grade III with PCV or temozolomide: NOA-04." (Wick Wolfgang W. J Clin Oncol 26: 2008 (May 20 suppl; abstr LBA2007))
Outcome: median TTF RT 3.6 years vs. PCV/Temodar 3.6 years (NS), median OS 5+ years vs. 5+ years (NS)
Predictors: oligo component (oligodendroglioma or oligoastrocytoma), LOH 1p/19q , MGMT+
Toxicity: Grade 3-4 hematologic significantly higher for PCV than temozolomide
Conclusion: No difference in TTF between RT and chemotherapy (PCV or temozolomide)

RTOG 9402 / INT 0149 (1994-2002) -- Sequential PCV -> RT vs. RT alone
Randomized. 289 patients with supratentorial AO and AOA (>25% oligodendroglioma component), KPS >=60.  Randomized to PCV x4 cycles prior to RT vs RT alone after maximal surgical rebaşlık. Arm 1) PCV (procarbazine, CCNU, vincristine) x4 cycles followed by RT vs. Arm 2) RT alone. RT given 59.4/33/ PTV1 = T2 + 2cm, PTV2 = T1 + 1cm
2006 PMID 16782910  — "Phase III trial of chemotherapy plus radiotherapy compared with radiotherapy alone for pure and mixed anaplastic oligodendroglioma: Intergroup Radiation Therapy Oncology Group Trial 9402." (Cairncross G, J Clin Oncol. 2006 Jun 20;24(18):2707-14.) Median F/U 5.1 years
Outcome: Median OS PCV->RT 4.9 years vs. RT 4.7 years (NS). PFS 2.6 years vs. 1.7 years (SS).
Toxicity: Grade 3-4 induction PCV 65%, RT after PCV 8% vs. RT alone 5%
Chromosomes: LOH 1p/19q combined in 46%, AO 57% vs. AOA 14% (SS).  Lower risk of tumor progression PFS 4.0 v 1.3 years(SS), and median OS not-reached vs. 2.8 years (SS). No effect of treatment on survival
Conclusion: No impact on survival. Improved PFS but at significant toxicity cost. Patients with 1p/19q deletion have significantly improved outcome

Greece (2000-2002) -- RT vs. RT + TMZ
Randomized, Phase II. 130 patients with GBM, KPS >=60. Biopsoy or surgery. Arm 1) RT 60/30 vs. Arm 3) Same RT + concurrent TMZ 75 mg/m2 1 hour prior to RT, then adjuvant TMZ 150 mg/m2 x6 cycles. RT CTV1=T2 + 2 cm margin to 46/23, CTV2=T1 + 2.5 cm margin to 60/30
2005 PMID 15800329 -- "Randomized phase II study of temozolomide and radiotherapy compared with radiotherapy alone in newly diagnosed glioblastoma multiforme." (Athanassiou H, J Clin Oncol. 2005 Apr 1;23(10):2372-7.)
Outcome: Median TTP RT 5.2 months vs. RT + TMZ 10.8 months (SS); 1-year PFS 37% vs. 8% (SS). Median OS 8 months vs. 13 months (SS); 1-year OS 16% vs. 56% (SS)
Toxicity: Grade 3+4 leukopenia 3%, thrombocytopenia 5%. One death from sepsis
Conclusion: TMZ combined with RT more effective than RT alone
EORTC / NCIC 26981-22981 (2000-2002) -- RT vs. RT + TMZ
Randomized. 573 patients with GBM, s/p biopsy or surgery (GTR 40%). Arm 1) RT alone vs Arm 2) RT with con

Pituitary Adenoma

Comprise ~10% of intracranial tumors
Benign histologically
Can cause significant morbidity due to 1) hormonal imbalances and 2) local compression of critical structures (optic chiasm and hypothalamus)
Treatment overview:
Microadenoma, not secreting prolactin: surgery
Microadenoma, secreting prolactin: bromocriptine
Macroadenoma: multimodality approach, typically surgery, adjuvant RT and if secretory hormone suppression

Loma Linda; 2006 (1991-2001) PMID 16257131 -- "Fractionated proton beam irradiation of pituitary adenomas." (Ronson BB, Int J Radiat Oncol Biol Phys. 2006 Feb 1;64(2):425-34. Epub 2005 Oct 27.)
Retrospective. 47 patients with pituitary adenomas. 42 prior rebaşlık, 5 primary RT. Functional 49% (n=23). Median dose 54 CGE in 30 fractions, mean target volume 8 cm3
Outcome: Stabilization in 100% with visible tumor, resolution 24%, regression 29%, stabilization 46%. If functional, biochemical control 86%, normalization 38%. OS 89%, due to disease progression 2 patients (Cushings)
Toxicity: Temporal lobe necrosis with headaches 1 patient (2%), new visual deficits 3 patients (23%), hypopituitarism 11 patients (30%), panhypopituarism 2 patients (5%)
Conclusion: Fractionated proton RT achieved effective radiologic, endocrinological, and symptomatic control; significant morbidity uncommon
Lawrence Berkeley Laboratory
1991 PMID 1808652 -- "Heavy-charged-particle radiosurgery of the pituitary gland: clinical results of 840 patients." (Levy RP, Stereotact Funct Neurosurg. 1991;57(1-2):22-35.)
Retrospective. 840 patients, 30 treated with protones, and 810 with helium ion. Pituitary tumors n=475 (59%), systemic disease treatment by inducing hypopituitarism n=365 (41%).
Outcome: Great majority marked and sustained biochemical and clinical improvement
Toxicity: Hypopituitarism in ~30%, focal temporal lobe necrosis ~1%
1980 (1957-1978) PMID 7415170 Full paper -- "Treatment of acromegaly, Cushing disease and Nelson syndrome." (Lawrence JH, West J Med. 1980 Sep;133(3):197-202.)
Retrospective. 429 patients (acromegaly 72%, Cushing's disease 13%, chromophobe adenoma 8%, prolactin-secreting adenoma 4%, Nelson's syndrome 4%). Treated with alpha particles or protons. Dose ~60 Gy
Outcomes reported
Harvard, 1968 (1963-1967) PMID 4966299 -- "Proton-beam therapy in acromegaly." (Kjellberg RN, N Engl J Med. 1968 Mar 28;278(13):689-95.)
Retrospective. 14/22 patients with acromegaly. Median time from onset to treatment 11.8 years. 5 prior RT therapy (36-40 rads). Proton dose typically 100-120 Gy (60-140 Gy), given 12 portals.
Outcome: 7/12 improved clinically, 3/12 unchanged, 2/12 worse.
Complications: Transient diplopia, H/A, anterior pituitary insufficiency

Düşük dereceli astrositik tümörlerdir
Sıklık
Serebral gliomalarn %2>'si
Çocukluk çağı beyin tümörlerinin %5'i
%75'i <10 yaşın altında olmak üzere optik yolak gliomalı hastaların %90'ı <20 yaş, ; %10'u yetişkinlerde
Nörofibromatozis ile ilişkili
Optik yolak gliomu olan hastaların %30'u NF1 hastasıdır
NF1 hastalarının %25'inde optik yolak gliomu gelişir (NF1'de görülen en sık tümör)
Yerleşim yeri
Anterior (orbital, infrakanaliküler, prechiasmal) - prepubertal çocuklarda sık
Posterior (chiasm, hipotalamus, anterior 3. ventrikül) - yetişkinlerde sık

Optik Yolak Gliomun optimal tedavisi tartışmalıdır.
Hastanın yaşı
Tümörün yerleşim yeri
NF1 varlığı
Mümkünse çocuklar yakın takip ile izlenmelidir
Yetişkinler agresif olarak tedavi edilmelidir.
Cerrahi dışı tedavi algoritmi PMID 16411210
<3 yaş veya 3-10 yaşında unrezektable lezyonu olanlar
Radyolojik veya semptomatik progresyona kadar izlem,
Sonrasında Packer rejimi (carboplatin/vincristine); progresyon yoksa izlem; progresyon varsa RT
>10 yaş
Mümkünse proton RT'si, ya da stereotaktik/konformal RT; progresyon yoksa izlem; progresyon varsa protokol
Karar: Kemoterapi tedavide başarısız fakat hastalar nörofizyolojik olarak gelişene kadar radyoterapi ve cerrahiyi geciktiriyor.

Optimal zamanlama açısından fikir birliği yok
Muhtemelen fayda:
Obstrüktif hidrosefalide
Progresif disfigüring proptosis veya körlük yapan tek sinir tutulumlarında
Genç çocuklarda RT geciktirmek önemli
Muhtemel kontra-endikasyon:
Diffüz chiasmal tutulum/yaygın infiltratif hastalık
NF hastaları

Fikir birliği yok; bir çoğu düşük dereceli gliomalar gibi tedavi ediliyorlar.
UCSF çalışması nitrosure-tabanlı KT'nin (TPDCV) aktivitesini göstermiştir.
George Washington çalışması (Packer) karboplatin/vinkristine'nin (şu an da en "standart" KT) iyi sonuçlarını göstermiştir.
Fransız çalışması RT'siz olarak uzun süreli kontrol sağlamıştır.
Children's Oncology Group çalışması CCG A9952 devam etmektedir. (temelde UCSF ve GW protokollerini randomize etmektedir.

Devam Eden

CCG A9952 - Protocol link -- "Phase III Randomized Study of Carboplatin and Vincristine Versus Thioguanine, Procarbazine, Lomustine, and Vincristine in Children With Progressive Low Grade Astrocytoma"
Kapandı. Sonuçları henüz yayınlanmadı. (05/08)

Yayınlanmış

Fransız Pediatrik Onkoloji Derneği, 2003 (1990-1998) PMID 14673044 -- "Progression-free survival in children with optic pathway tumors: dependence on age and the quality of the response to chemotherapy--results of the first French prospective study for the French Society of Pediatric Oncology." (Laithier V, J Clin Oncol. 2003 Dec 15;21(24):4572-8.)
Prospektif. Progresif optik yolak tümörlü 85 çocuk. KT: 3 haftada bir, alterne prokarbazine/karboplatin, etoposide/sisplatin, ve vinkristine/siklofosfamide. Relapsta, RT öncesi ikinci hat KT
5-yıllık sonuçlar: PFS %34, OS %89. RTsiz sağkalım %61
Prognostik faktörler: yaş <1, NF1 ilişkisi hastalıkta progresyona neden oluyor.
Karar: Umut vaadeden OS veya görme fonksiyonu olmaksızın uzatılmış KT ile RT uygulanmayabilir.
Royal Marsden, 2003 (UK) PMID 12892235 -- "Tolerance of nitrosurea-based multiagent chemotherapy regime for low-grade pediatric gliomas." (Lancaster DL, J Neurooncol. 2003 Jul;63(3):289-94.)
Prospektif. Düşük dereceli glioması olan 10 çocuk, başlangıçta karboplatin/vinkristine ile tedavi edimiş, ikinci hat olarak TPCV kullanılmış.
Karar: TPCV is ikinci hat tedavi olarak uygun bir tedavi şeklidir.
George Washington, 1997 PMID 9126887 -- "Carboplatin and vincristine chemotherapy for children with newly diagnosed progressive low-grade gliomas." (Packer RJ, J Neurosurg. 1997 May;86(5):747-54.)
Prospektif. Progresif düşük dereceli glioması olan 78 çocuk (12 beyin sapı glioması). Eşzamanlı karboplatin/vinkristine. Medyan takip 2.5 yıl
3-yıllık PFS: %68. NF+ ve NF - hastalar arasında fark yok. Objektif yanıt %56.
Prognostik faktörler: yalnızca yaş (<3 yaş %74 vs. >3 yaş %39, istatisiki olarak belirgin)
UCSF, 1991 (1983-1989) PMID 1901597 -- "Management of chiasmal and hypothalamic gliomas of infancy and childhood with chemotherapy." (Petronio J, J Neurosurg. 1991 May;74(5):701-8.)
Retrospektif. Chiasmal/hipotalamik glioması olan 19 çocuk. 12'si başlangıçta progresif semptomları nedeniyle tedavi edilmiş, 7'sinde ertelenmiş. KT: TPDCV TPDCV
Progresyona kadar geçen meyan süre: 20. ayda erişilmemişti. tümöre bağlı ölüm yok. Başlangıçtaki yanıt/stabilizasyon 15/18 hastada mevcut.
Salvage: RT
Karar: TPDCV hastalık progresyonuna kadar RT'yi erteliyor.

En iyi sonuçlar 1.8 Gy/fx dozunda toplam 45-56 Gy'de rapor edilmiştir.
Posterior yerleşimli olanların sonuçlarının daha kötü olduğu düşünülür.
Proton RT'si halen araştırılmaktadır.

Harvard, 2005 (1992-1998) PMID 15667955 -- "Stereotactic radiotherapy for localized low-grade gliomas in children: final results of a prospective trial." (Marcus K, Int J Radiat Oncol Biol Phys. 2005 Feb 1;61(2):374-9.)
Prospektif. Lokalize düşük dereceli gliomalı 50 hasta. KT/cerrahi sırasında veya sonrasında progresyon için RT. Medyan takip 6.9 yıl.
RT: Çıkarılabilir kafa çerçevesi. 2-mm marj ile planlanmış. Ortalama doz 1.8 Gy/fx ile toplam 52.2 Gy. Hedef çizimi BT/MR füzyonu ile yapılmış
5-yıllık sonuçlar: PFS %83, OS %98; 6 hastada tedavi alan içinde progresyon, marginal başarısızlık yok
Karar: Stereotaktik RT sınırlı marjlar ile mükemmel lokal kontrol sağlamaktadır.
Heidelberg, 2005 (Germany) (1990-2003) PMID 15936565 -- "Fractionated stereotactic radiotherapy of optic pathway gliomas: tolerance and long-term outcome." (Combs SE, Int J Radiat Oncol Biol Phys. 2005 Jul 1;62(3):814-9.)
Retrospektif. 15 hasta. Medyan doz 1.8 Gy/fx ile toplam 52.2 Gy (45.2-57.6). Medyan takip 8 yıl.
5-yıllık sonuç: PFS %72, OS %90. İkincil malignite yok.
Karar: İyi kontrol, normal beyin dokusunun korunuyor. Daha uzun takip gerekli.
Institut Curie, 1991 (1970-1986) PMID 1907959 -- "Chiasmal gliomas: results of irradiation management in 57 patients and review of literature." (Bataini JP, Int J Radiat Oncol Biol Phys. 1991 Aug;21(3):615-23.)
Retrospektif. 57 hasta, %37 chiasm, %63 hypothalamus/posteriorly uzanımı var. RT 40-60 Gy. Ortalama takip 7.5 yıl
5-yıllık (ve 10-yıllık) OS: %84; yanıt: CR %15, PR %46, SD %22
Karar: RT hızlı gelişen visual, nörolojik, veya endokrin semptomların olduğu olgularda etkili
1956 PMID 13323290 -- "The value of radiation therapy in the management of glioma of the optic nerves and chiasm." (Taveras JM, Radiology. 1956 Apr;66(4):518-28.)
Retrospektif. 34 hasta RT ile tedavi edilmiş.
Sağkalım: Yayınlandığı anda 23/34
Önemli bir çalışma. Sonuçlar istisna sayılıyor. RT'yi tedavi stratejisi olarak kabul ettiriyor.

Manchester/London, 2006 PMID 16735710 -- "Second primary tumors in neurofibromatosis 1 patients treated for optic glioma: substantial risks after radiotherapy." (Sharif S, J Clin Oncol. 2006 Jun 1;24(16):2570-5.)
Retrospektif. NF1 hastalarının 58/80 OPG'lı. 18/58 tekbaşına RT veya kombinasyon tedavisi. Doz 25-50 Gy.
İkincil SSS tümörü. 308 yıl-kişi takipte RT uygulananların 9/18'inde (%50) 12 ikincil tümör gelişmiş. RT uygulanmayanlarda ise 721 yıl-kişi takipte 8/40 (%20) 9 ikincil tümör saptanmış.
Karar: OPG'li NF1 hastalarında ikincil kanser riski yüksektir. RT gerektiğinde kullanılmalıdır.
Toronto, 1993 (1971-1990) PMID 8315466 -- "Moyamoya phenomenon after radiation for optic glioma." (Kestle JR, J Neurosurg. 1993 Jul;79(1):32-5.)
Retrospektif. OPG'li 47 hasta tedavi edilmiştir.
Moyamoya fenomeni: RT'siz grupta 0/19; RT uygulananlarda 5/28; 2/23 NF1- vs. 3/5 NF1+ (SS)
Sonuç: NF1 ve kraniyal RT uygulanan hastalarda moyamoya semptomları sıklığında artış.

2006 PMID 16411210 -- "Optic pathway gliomas." (Jahraus CD, Pediatr Blood Cancer. 2006 May 1;46(5):586-96.)

Paragangliomas are still sometimes called glomus tumors (not to be confused with glomus tumors of the skin) and chemodectomas, but paraganglioma is the currently accepted and preferred term
A rare neoplasm that can be found in the abdomen (85%), thorax (12%), and in the head and neck region (3%)
Incidence estimated at 1:1,000,000
Categorized as a neuroendocrine tumor
Usually considered benign and complete surgical removal results in cure.  However, in about 3-5% of cases they are malignant and have the ability to metastasize.
Most occur as single tumors.  When they occur in multiple sites they are usually found as a part of a heritable syndrome such as MEN types II-A and II-B and Carney syndrome.

Familial paragangliomas account for ~25% of cases, are often multiple and bilateral, and occur at an earlier age.
Mutations of the genes SDHD (previously known as PGL1), PGL2, and SDHC (previously PGL3) have been identified as causing familial head and neck paragangliomas.
Mutations of SDHB play an important role in familial adrenal pheochromocytoma and extra-adrenal paraganglioma (of abdomen and thorax), although there is considerable overlap in the types of tumors associated with SDHB and SDHD gene mutations.

Arise from the glomus cells, which are special chemoreceptors located along blood vessels that have a role in regulating blood pressure and blood flow.
The glomus cells are a part of the paraganglion system, composed of the extra-adrenal paraganglia of the autonomic nervous system, derived from the embryonic neural crest.  Thus, paragangliomas are a type of neuroendocrine tumor, and are closely related to pheochromocytomas.  Although all paragangliomas contain neurosecretory granules, only about 1-3% have clinical evidence of oversecretion.
According to the WHO classification of neuroendocrine tumors, paragangliomas are classified as having a neural cell line of origin.  In the categorization proposed by Wick, the paragangliomas belong to Group II.
The main concentration of glomus cells are found are in the carotid body and the aortic bodies
Individual tumor cells are polygonal to oval and are arranged in distinctive cell balls, called Zellballen. These cell balls are separated by fibrovascular stroma and surrounded by sustenacular cells.
The paragangliomas appear grossly as sharply circumscribed polypoid masses and they have a firm to rubbery consistency.  They are highly vascular tumors and may have a deep red color.
With IHC, the chief cells located in the cell balls are positive for chromogranin, synaptophysin, NSE, serotonin and neurofilamen; they are S-100 negative.  The sustenacular cells are S-100 positive and focally positive for GFAP.  By histochemistry, the paraganglioma cells are argyrophilic, PAS negative, mucicarmine negative, and argentaffin negative.

Paragangiomas are described by their site of origin and are often given special names:

Carotid paraganglioma (carotid body tumor): Is the most common of the head and neck paragangliomas.  It usually presents as a painless neck mass, but larger tumors may cause cranial nerve palsies, usually of the vagus nerve and hypoglossal nerve.
Glomus tympanicum and Glomus jugulare: Both commonly present as a middle ear mass resulting in tinnitus (in 80%) and hearing loss (in 60%).  The cranial nerves of the jugular foramen may be compressed, resulting swallowing difficulty.
Vagal paragangliomas: These are the least common of the head and neck paragangliomas.  They usually present as a painless neck mass, but may result in dysphagia and hoarseness.
Other sites: Rare sites of involvement are the larynx, nasal cavity, paranasal sinuses, thyroid gland, and the thoracic inlet.

The main treatment modalities are surgery, embolization and radiotherapy.
When radiation is given, doses are in the range of 45-50 Gy.
For stereotactic radiosurgery, median margin dose (50% isodose) used is ~16 Gy

Typically considered slow-growing (estimated doubling time 4.2 years) benign tumors, <5% malignant potential
However, they are locally agressive neoplastic lesions, involving bony erosion and destruction of neurovascular structures
Commonly arise from the paraganglia of the jugular bulb
Typically invade the tympanic cavity and jugular foramen
Can extensively invade petroclival region
Can invade cavernous sinus above
Can invade hypoglossal canal below
Clinical presentation typically with tinnitus or hearing loss, but may also impact jugular foramen CNs
Glasscock-Jackson Classification:

Fisch Classification:

Optimal treatment strategy is not clear, with multiple options:
Surgery: primary option if brainstem compression, or in young patients with functional CN loss. Surgical morbidity not insignificant
Fractionated RT: typical doses 45-55 Gy, mechanism of action likely related to fibrosis of feeding vessels and not direct glomus cell destruction. Complication rate low
SRS: No long-term experience yet, but appears a good option due to high conformality. RT dose typically ~16 Gy at 50% margin isodose. Typically ~1/3 have volume shrinkage, and ~2/3 no change, <10% further growth. Clinically ~50% may experience improvement
Embolization: typically considered an adjunctive treatment to surgery or RT. Not adequate alone due to poor tumor coverage and frequent re-vascularization

Verona, 2006 (Italy)(1996-2005) PMID 16955038 -- "Glomus jugulare tumors: the option of gamma knife radiosurgery." (Gerosa M, Neurosurgery. 2006 Sep;59(3):561-9; discussion 561-9.)
Retrospective. 20 patients (3 primary GKS, 8 recurrence post surgery, 11 recurrence after embolization). Average volume 7 cm3, mean marginal dose 17.3 Gy (13-24). Estimated doubling 4.2 years. Mean F/U 4.2 years
Outcome: Improved volume 40%, no change 55%
Toxicity: Improved CN function 25%, no neuro change 65%, hearing loss 10%
Conclusion: GKS effective, negligible side effects
Virginia, 2005 PMID 15662818 -- "Gamma knife surgery for glomus jugulare tumors: an intermediate report on efficacy and safety." (Sheehan J, J Neurosurg. 2005 Jan;102 Suppl:241-6.)
Retrospective. 8 patients. Median margin dose 15 Gy (12-18). Median F/U 2.7 years
Outcome: clinically 100% stability or improvement; radiographically 4/7 decreased, 3/7 stable
Toxicity: None
Conclusion: Effective local control and preservation of neurologic function
Mayo Clinic, 2004 PMID 15329025 -- "Stereotactic radiosurgery in patients with glomus jugulare tumors." (Pollock BE, Neurosurg Focus. 2004 Aug 15;17(2):E10.)
Retrospective. 42 patients treated with GKS. Mean volume 13.2 cm3. Mean margin dose 14.9 Gy. Mean F/U 3.7 years
Outcome: 31% decreased, 67% unchanged, 2% grew. PFS at 7 years 100%, at 10 years 75%
Toxicity: 15% new deficit (hearing loss, facial numbness, vocal cord paralysis, vertigo). Hearing preservation 81% at 4 years
Conclusion: GKS good tumor control, safe
Stanford, 2004 PMID 15329026 -- "Efficacy and safety of stereotactic radiosurgery for glomus jugulare tumors." (Lim M, Neurosurg Focus. 2004 Aug 15;17(2):E11.)
Retrospective. 13 patients with 16 tumors. Treated with LINAC/Cyberknife to 14-27 Gy. Median F/U 3.4 years
Outcome: clinically 100% stable; radiographically 100% decreased or stable
Toxicity: one transient ipsilateral vocal cord paralysis (however, patient also had prior EBRT)
Conclusion: RS effective and safe
Vienna, 2001 (Austria)(1993-1999) PMID 11696882 -- "Efficiency of gamma knife radiosurgery in the treatment of glomus jugulare tumors." (Saringer W, Minim Invasive Neurosurg. 2001 Sep;44(3):141-6.)
Retrospective. 12 patients. All Fisch Class D. Mean F/U 4.2 years
Outcome: clincally 50% improved, 50% no change; radiographically decreased 25%, stable 75%
Toxicity: transient cranial neuropathy in 17%.
Conclusion: GKS attractive treatment option
European Multicenter, 1999 (1992-1998) PMID 10592113 -- "Gamma Knife radiosurgery of the glomus jugulare tumour - early multicentre experience." (Liscak R, Acta Neurochir (Wien). 1999;141(11):1141-6.)
Retrospective. 6 sites, 52/66 patients. Median margin dose 16.5 Gy (10-30). Median F/U 2 years
Outcome: clinically 29% improved, 65% stable; radiographically decreased 40%, stable 60%
Conclusion: safe, with no acute morbidity; need longer follow-up
Graz, 1999 (Austria)(1992-1998) PMID 10536716 -- "Gamma knife radiosurgery for glomus jugulare tumours." (Eustacchio S, Acta Neurochir (Wien). 1999;141(8):811-8.)
Retrospective. 10/13 patients with imaging followup. Median marginal dose 13.5 Gy to 50% isodose line. Median F/U 3.1 years
Outcome: 40% decreased volume, 60% unchanged. Improved clinical status in 50%, stable in 50%
Toxicity: none
Conclusion: effective treatment option
Prague, 1998 (Czech Republic)(1993-1997) PMID 9782246 -- "Leksell gamma knife radiosurgery of the tumor glomus jugulare and tympanicum." (Liscak R, Stereotact Funct Neurosurg. 1998 Oct;70 Suppl 1:152-60.)
Retrospective. 14 patients. Mean maximum dose 37.4 Gy (20-44); mean margin dose 19.4 Gy (10-25). Mean F/U 1.7 years
Outcome: radiographically 30% improved, 70% stable; clinically 36% improved
Toxicity: worsening hearing in 21%
Conclusion: GKS safe treatment; will need long follow-up

Meta-analysis, 2004 (1994-2004) PMID 15329019 -- "Comparison of radiosurgery and conventional surgery for the treatment of glomus jugulare tumors." (Gottfried ON, Neurosurg Focus. 2004 Aug 15;17(2):E4.)
7 surgical series 374 patients, 8 GKS series 142 patients. Mean F/U surgery 4.1 years, GKS 3.3 years
Outcome: local control surgery 92%, recurrence 3%; GKS decrease 36%, stable 61%, recurrence 2%
Toxicity: surgery CSF leak 8%, mortality 1.3%; GKS morbidity 8%, no mortality
Conclusion: Both treatments safe and efficacious; surgery higher morbidity but long term GKS outcomes unknown

Pellitteri PK et al. Paragangliomas of the head and neck. Oral Oncology 2004 Jul;40(6):563-75. (PMID 15063383)
Sukhamay Lahiri, "Aortic body", in AccessScience@McGraw-Hill
John T. Hansen, "Carotid body", in AccessScience@McGraw-Hill
Wick MR. Neuroendocrine neoplasia. Current concepts.

WHO Grad I tümör
20 yaş altı genç erişkin ve çocuklarda erişkinlere oranla daha sık görülmektedir.
Çoğunlukla serebellumda iyi sınırlı, kontrast tutan lezyonlardır.çoğu optik gliomalardır.
Tekbaşına cerrahi eksizyon başarılı tedavi ve sonucu sağlar. 10-yıllık toplam sağkalım %80

Loma Linda; 2002 (1991-1997) PMID 11977386 -- "Conformal proton radiation therapy for pediatric low-grade astrocytomas." (Hug EB, Strahlenther Onkol. 2002 Jan;178(1):10-7.)
Retrospektif. 27 hasta, progresif veya tekrarlayan düşük gradlı astrositoma.  Fraksiyone proton tedavisi 1,8 CGE/fx ile toplam 50,4-63 CG. Ortalama takip 3,3 yıl.
Sonuç: LK % 78, TS % 85
Toksisite: iyi tolere edilmiş, nörofibromatozis-1 li 1 çocukta; optik gliomu olan 6 çocukta görme korunmuş ve/veya iyileşmiş.
Karar: Proton RT güvenli ve etkilidir; uzun dönem takibe ihtiyaç vardır.

Seyrektir
Klinik bulgular; görme bozuklukları, bayılma ve başağrısıdır. Papilödem sıktır.
Hem sağkalımda hem de nörolojik fonksiyon anlamında iyi prognoza sahiptir.
Ancak primer veya sekonder grad III anaplastik pilositik astrositomlu vakalarda cerrahi sonrası yineleme oranı %30 civarındadır ve bu histolojiye sahip bireylerde adjuvan radyoterapi veya kemoradyoterapi önerilebilir.
Birçoğu rezeksiyon (gross veya subtotal) sonrasında sabit kalır ve yakın takip ile herhangi bir adjuvan radyoterapiye ihtiyaç duymaz.
Unrezektabl hastalıkta RT önermek, özellikle nörolojik semptomu olanlarda, mantıklı olabilir.
10-yıllık toplam sağkalım %95

Intergroup NCCTG/RTOG (1986-1994)
Prospektif. Supratentoryal pilositik astrocytomalı 20 yetişkin. Gross total (n=11) veya subtotal (n=6) rezeksiyon sonrası, takip. Yalnızca biyopsi uygulandığında (n=3), ödem +2 cm sınırla 50.4 Gy RT
PMID 15001258 -- "Adult patients with supratentorial pilocytic astrocytomas: a prospective multicenter clinical trial." (Brown PD, Int J Radiat Oncol Biol Phys. 2004 Mar 15;58(4):1153-60.) Medyan takip 10 yıl
10-yıllık sonuç: %95 hayatta. 1 hasta bilinmeyen nedenle çalışmaya dahil edildikten 2.1 yıl sonra ölmüş; 1 hasta çalışmaya dahil edildikten sonra progrese olmuş ve P-32 ile salvage tedavi uygulanmış, 9. yılında progresyonu yok
Karar: İyi prognoza sahip; gross total veya subtotal rezeksiyon sonrasında RT ihtiyacı yok

Pineal Gland Tümörleri

Yetişkin SSS tümörlerinin % 1’ i
Çocukluk çağı SSS tümörlerinin % 5’ i
3 ayrı tümör tipi:
Pineal parankimal tümörler
Glial parankim tümörleri
Germ hücreli tümörler
Coğrafik dağılımda dramatik varyasyon (germinoma Japonya’ da ~% 50 , Avrupa’ da <  %30)

Anatomi ve büyüme yönü ile ilgili bulgu verir
Akuaduct obstrüksiyonu: Baş ağrısı, bulantı kusma ile ortaya çıkan hidrosefali
Superior kollikulus tutulumu: Vertikal bakış palsisi, pupiller ve okulomotor sinir parezisi (Parinaud syndrome)
Progresif büyüme: kraniyal sinir nöropatileri, hipotalamik disfonksiyon
Metastatik hastalık nadirdir, fakat pineoblastomların  ~% 20’ sinde ve germ hücreli tümörlerin ~% 10’ unda leptomeningeal yayılım görülür

Pineal glanddaki ana hücre pineosittir
Spesifik olarak nöronla ilgili retinal rod ve konlar
Sempatikleri retinadan suprakiazmatik çekirdek yoluyla gelir
Uyarı sonucu melatonin salgılar, bu da LH ve FSH’ I etkiler
Aydınlık – karanlık, pineal gland ve sirkadyan ritim arasında ilişki mevcut
Nöron spesifik enolaz  (NSE) ve Synaptophysin
Çevreleyen stroma astrositlerden oluşur
GFAP, S-100, ve Vimentin
Germ hücreleri embriyonel kalıntılardır, tipik olarak orta hat yapılarında ortaya çıkar

Germ hücreli tümörler
Germinoma (% 30-40)
Non-seminomatöz germ hücreli tümör (% 10-20)
Pineal parankimal tümörler (15-30%)
Pineocytoma (WHO Grade II):
İyi-diferansiye düşük dereceli tümör
Karakteristik pineositomatöz rozetler
Nöronal, astrositik ya da karışık (ganglioglioma) diferansiasyon görülebilir
Orta derecede diferansiye pineal parankimal tümör (WHO Grade III)
Intermediate grade tümör, pineositoma ile pineoblastoma arasında
Nadir, pineal parankimal tümörlerin % 10’ u
Pineoblastoma (WHO Grade IV):
Primitif yüksek gradeli tümör
İmmatür nöronal progenitör hücrelerden köken aldığı düşünülür; pineal, nöronal, gliyal veya retinoblastik diferansiasyon görülebilir
Bilateral retinoblastoma ile pineoblastoma sendromu ("trilateral retinoblastoma syndrome")’ nun bir parçası olabilir,  Rb mutation (retinobastom mutasyonu) ile ilgili olabilir
Nekroz sıktır
Histolojik olarak Supratentorial PNET ve infratentorial PNET (medulloblastoma)’ dan ayırtedilemez
Leptomeningeal yayılım eğilimi mevcut
Pineal bölgenin papiller tümörü (Papillary tumor of the pineal region) (PTPR)
Nadir, yeni tanımlanmış
Histolojisi ependimoma benzer ve spesifik epandimositlerden köken aldığı düşünülür
Glial tümörler
Astrositoma (%10-30 )
Benign lezyonlar
Pineal gland kistleri, vasküler malformasyonlar, Galen veni anevrizması

Tanı için MR, BOS sitolojisi, bHCG ve AFP
Doku tanısı önemlidir çünkü menajman patolojiye göre değişir
Stereotaktik pineal gland biyopsisi
Açık cerrahi (komplet rezeksiyonun nadiren mümkün olması, görme fonksiyonuna zarar riski ve çoğunun kemoRT’ ye duyarlı olması nedeniyle tercih edilmez)
BOS diversionu; obstruktif hidrosefali olan hastalarda düşünülmelidir
Germ hücreli ümörler definitif RT veya kemoRT ile tedavi edilirGerm cell tumors
Pineoblastoma cerrahi sonrası adjuvan KT ve kraniospinal RT ile tedavi edilir (diğer SSS pNET’ ler gibi)( CNS PNETs).

Çoğu yayın küçük seridir, en büyüğünde 9 hasta
Yaş: Pediatrik pineositomlar daha agresifdir, yüksek rekürrens riski vardır. Yetişkin olgular daha benigndir.
Barrow Nörolji Enstitüsü:
Semptomatikse, rezeksiyon. Subtotal rezeksiyonda adjuvan GKS
Küçük ve asemptomatik ise, stereotaktik biyopsi, ve primer GKS
Pittsburgh verileri primer GKS’ yi destekler
Mayo verileri subtotal rezeksiyonda 50-55 Gy adjuvan RT önermektedir
Barrow Neurological Institute; 2004 (Arizona)(1990-2003) PMID 15271241 -- "Diagnosis and management of pineocytomas." (Deshmukh VR, Neurosurgery. 2004 Aug;55(2):349-55; discussion 355-7.)
Retrospektif. 9 hasta. Ortalama yaş 44. Cerrahi: 3 hastada GTR, 6’ sında  subtotal ya da biyopsi. Adjuvant RT 5 hastada i (n=2 IMRT 54/30, n=3 GKS)
Bulgular: 4/9 lokal rekürrens(3 klinik, 1 radyolojik). Rekürrense kadar geçen ortalama süre 3.5 yıl
Radyocerrahi: tümü stabil ya da 3 yılda azalmış
Tedavi önerileri: Semptomatikse cerrahi. Subtotal rezeksiyon ise adjuvan GKS. Küçük asemptomatik tümörlerde stereotaktik biyopsi ve primer GKS. Sıkı takip gerekli
Mayo; 1996 PMID 8952565 -- "Histologically confirmed pineal tumors and other germ cell tumors of the brain." (Schild SE, Cancer. 1996 Dec 15;78(12):2564-71.)
Retrospektif. Pineal tümörlü 135 hasta (pineoblastoma 15, intermediate/mixed PPT 6, pineositoma 9). Ortalama takip 5.3 yıl
Bulgular: 5-yıllık OS pineositomda % 86, intermediate/mixed PPT/pineoblastomda % 49
Sağkalım prediktörü: RT >50 Gy
Sonuç: Prognoz tümör tipine, sağkalım RT dozuna bağlıdır

University of Pennsylvania; 1987 (1975-1985) PMID 3815306 -- "Pineocytomas of childhood. A reappraisal of natural history and response to therapy." (D'Andrea AD, Cancer. 1987 Apr 1;59(7):1353-7.)
Retrospective. 4 children (11% of all pineal region tumors). Surgery + CSI+boost (n=3) or local RT (n=2) or chemo-RT (n=1).
Outcome: 4/6 recurrences, median 2 years after diagnosis. 3 leptomeningeal dissemination
Conclusion: Aggressive tumors in pediatric population; RT alone inadequate

Patoloji yukardaki gibi; histolojik olarak diğer SSS pNET' lerine benzer. Çoğu eski çalışmada pineoblastomlar  supratentorial PNET olarak gruplanmıştır.
Esas olarak çocuklarda (% 40-50 < 1 yaşta) görülür. Özellikle < 3 yaştaki çocuklarda agresif gidiş mevcut olup sıklıkla ileri evrede prezente olur
Yetişkinlerde nadirdir (< % 10), en geniş seri Japonya’ dan olup 30 yaş civarında 34 hasta mevcuttur
Çevre doku invazyonuna ve BOS yayılımına meyillidir
Tipik yaklaşım cerrahi, ardından KT ve CSI’dir
Daha büyük çocuklarda sağkalım daha iyidir
Çocuklarda RT’ nin elimine edilmesi kötü sonuçlar doğurmuştur ( POG, CCG, Alman çalışmaları). Bununla birlikte, uzun vadeli CSI toksisitesi şiddetlidir ve kök hücre transplantasyonu ile doz intensifikasyonu gayretleri devam etmektedir
Çocukluk Çağı

German HIT-SKK87, HIT 91, and HIT-SKK92 (1987-1992, 1992-1997)
Pineoblastomlu 11 hasta. < 3 yılda, cerrahi + KT, RT > 3 yıl ya da progresyona kadar ertelenmiş (n=5). > 3 yıl ise cerrahi + KT + CSI (35.2/22 + 20/10 boost) +/- idame KT (n=6)
2007 PMID 16941074 -- "Childhood pineoblastoma: experiences from the prospective multicenter trials HIT-SKK87, HIT-SKK92 and HIT91." (Hinkes BG, J Neurooncol. 2007 Jan;81(2):217-23.)
Diğer (> 3 yaş) çocuklar: KT ve RT sonrası 5/6 hayatta, medyan OS/progresyonsuz sağkalım 7.9 yıl. Hepsinde M0 hastalık mevcuttu
< 3 yaş çocuklar: OS 0.9 yıl, progresyonsuz sağkalım 0.6 yıl; 0/5 hayatta. Hepsinde M1 hastalık ve/veya postop rezidüel hastalık mevcuttu. KT’ ye cevap daha kötü, sadece 1/5’ e RT uygulandı
RT’ nin rolü: Daha büyük çocukların hepsine uygulandı, ve fayda gördü (parsiyel cevap -> tam cevap ya da tam cevapta kaldı). Küçük çocuk grubundan KT sonrası progresyon görülen bir hastaya RT uygulandı ve parsiyel cevap alındı
Sonuç: > 3 yaşta kombine KT ve RT etkindir. < 3 yaş için daha ileri rejimler gereklidir
Supratentorial pNET' li küçük çocuk grubu için sonradan yapılan HIT çalışmasında küçük doz intensifikasyonu indüksiyonu sonrası yüksek doz KT ve CSI araştırılmıştır
CCG 921 (1986-1992)
Daha büyük (> 1.5 yaş) çocuklar cerrahi + CSI  KT ile tedavi edilmiş; küçükler (< 1.5 yaş) sadece cerrahi + KT ile tedavi edilmiş
Pineal only; 1995 PMID 7751882 -- "Survival and prognostic factors following radiation and/or chemotherapy for primitive neuroectodermal tumors of the pineal region in infants and children: a report of the Childrens Cancer Group." (Jakacki RI, J Clin Oncol. 1995 Jun;13(6):1377-83.)
Pineoblastoma 25 hasta, 17’ si  >1.5 yaş, 8’ i daha küçük
Küçükler: hepsinde progresif hastalık görüldü, medyan progresyonsuz sağkalım 4 ay
Büyük çocuklar ( >1.5 yaş ): 3-yıllık progresyonsuz sağkalım % 61 (ST-PNET’ den daha iyi). RT sonrası, % 70’ inde 5 yıl sebat eden rezidüel pineal kitle
Sonuç: Sadece KT küçük (< 1.5 yaş) çocuklarda etkin değil. > 1.5 yaş ise CSI + KT efektif
All ST-PNETs; 1995 PMID 7602359 -- "Prognostic factors and treatment results for supratentorial primitive neuroectodermal tumors in children using radiation and chemotherapy: a Childrens Cancer Group randomized trial." (Cohen BH, J Clin Oncol. 1995 Jul;13(7):1687-96.)
ST-PNET 55 hasta, yaş >1.5
Bulgular: 3-yıllık OS % 57, progresyonsuz sağkalım % 45; pineal pNET daha iyi (% 73 ve % 61); evre M0’ da progresyonsuz sağkalım % 50 vs M +’ de % 0. KT kolları arasında fark yok
Toksisite: 8-in-1 kolu daha kötü
Sonuç: KT kolları arasında fark yok; M0 ve pineal bölgede ise daha iyi sonuç
Baby POG I (1986-90)
Prospektif. 198 çocuk < 3 yaş (132 ‘ si < 2 yaş, 66’ sı  2-3 yaş), biyopsi ile teyit edilmiş malign beyin tümörü (düşük rade astrositom hariç tutuldu), tedavide maksimal cerrahi, postop KT (CTX/VCR ardından cis/etopo) 2 yıl ya da 1 yıl, ardından RT
HistoloJİ: medulloblastoma % 31, ependimom % 24, pNET % 18, malign glioma % 9, beyin sapı gliomu % 7, diğerleri  % 9. % 27’ si M+. GTR (gros total rezeksiyon) % 38 hastada.
RT medullo, PNET, anaplastik ependimom, veya subaraknoid ekilimde CSI 35.2 Gy + 54 Gy’ e kadar primere boost. RT  ependimom, gliomlarda lokal 54 Gy . KT sonrası rezidüel hastalık yoksa, RT dozu CSI 24 Gy ve primere 50 Gy’ e düşürüldü.  < 2 yaşta dozun % 90’ı
1995 PMID 7753001 -- "Lack of efficacy of postoperative chemotherapy and delayed radiation in very young children with pineoblastoma. Pediatric Oncology Group." (Duffner PK, Med Pediatr Oncol. 1995 Jul;25(1):38-44.)
Pineoblastomlu çocuklar (yaş < 3, fakat 8/11 < 1 yaş). 11 hasta. Parsiyel cerrahi rezeksiyon
Bulgular: KT ile tüm hastalarda failure; 9/11 primer bölgede, 8/11’ de failure sırasında leptomeningeal progresyon. Sağkalım 4-13 ay, tüm hastalar ex
Sonuç: Sadece KT etkin değildir
Adults

Japan; 2005 (1969-1998) PMID 15782004 -- "Management and survival of pineoblastoma: an analysis of 34 adults from the brain tumor registry of Japan." (Lee JY, Neurol Med Chir (Tokyo). 2005 Mar;45(3):132-41; discussion 141-2.)
Kayıt çalışması. Japonya ulusal beyin tümörü grubuna kayıtlı tüm has

HIV ile ilişkili olmayan SSSlenfomaları ortalama 6. dekatta ortaya çıkar. HIV’ a bağlı ise ortaya çıkış zamanı HIV’ ın evresine bağlıdır
Geçen 30 yılda insidans 10 kat artmış olup, bu artış sadece HIV’ la bağlantılı değildir
İmmun kompetan hastalarda önceki görülme oranı % 1 iken, günümüzde tahmin edilen oran % 4’ dür
2 ayrı popülasyonu etkilemektedir:
Immun kompromize (HIV, organ transplantasyonu, immun yetmezlik sendromları) – B lenfositlerin EBV enfeksiyonundan ortaya çıkar
Immun kompetan –Bilinen etyoloji yoktur, B hücrelerinin beyinde normal olarak bir rolü yoktur

Genellikle B hücre histolojisi mevcuttur
T hücreli varyantlar gelişmiş ülkelerde primer SSS lenfomalarının % 5’ inden azını teşkil eder; davranışları B hücrelerle benzerdir
% 85’ i agresif NHL varyantlarıdır.
PCNSL Collaborative Group; 2005 PMID 15800313 -- "Primary CNS lymphoma of T-cell origin: a descriptive analysis from the international primary CNS lymphoma collaborative group." (Shenkier TN, J Clin Oncol. 2005 Apr 1;23(10):2233-9.)
Retrospektif. 7 ülkede 12 merkez. 45 hasta. Ortalama yaş 60, % 44 ECOG 0-1, % 58 serebral hemisferde, % 26 derin lezyon. LDH % 32 hastada yüksek, BOS % 79’ da yükselmiş
Hastalık spesifik sağkalım 2 yılda % 51, 5 yılda % 17
ECOG 0-1 ve metotreksat kullanımı pozitif belirleyicilerdir
Sonuç: Prezentasyon ve sonuç B hücreli primer SSS lenfomaları ile benzerdir

Beyin, serebrospinal sıvı, göz ve nadiren spinal kordda sınırlı
Klinikopatolojik varyantlar; intrakraniyal lezyonlar, diffüz leptomeningeal veya periventriküler, vitröz ve spinal lezonlardır
İntrakranial primer SSS lenfoması % 75 supratentorial, % 25 infratentorialdir
MR, tutulumun genişliğini saptamada yetersizdir
Primer SSS lenfoması diffüz infiltratif bir hastalık olarak kabul edilir
Evre I E NHL olarak sınıflandırılır, çünkü tipik olarak tek bir ekstranodal bölgeye sınırlıdır

Kötü prognozla ilgili faktörler: Yaş > 60, ECOG performans statüsü > 1, yüksek LDH, BOS proteininde artış, beyinde derin yerleşim
Avrupa snıflaması: Yukardaki 5 faktör. Risk grupları 0-1 faktör, 2-3 faktör, 4-5 faktör
MSKCC sınıflaması: 2 faktör, yaş ve KPS

MSKCC; 2006 (1983-2003) PMID 17116938 -- "Primary central nervous system lymphoma: the Memorial Sloan-Kettering Cancer Center prognostic model." (Abrey LE, J Clin Oncol. 2006 Dec 20;24(36):5711-5.)
338 hasta RPA’ ya göre değerlendirildi. Prospektif 3 RTOG çalışması da değerlendirilmeye dahil edildi
RPA: klas I (yaş <=50), klas II (yaş >=50 and KPS >=70), klas III ( >50 and KPS <70)
MSKCC verileri: ortalama overall sağkalım klas I, II ve III’ de sırasıyla 8.5 yıl, 3.2 yıl, 1.1 yıl
RTOG verileri: ortalama overall sağkalım 5.2 yıl, 2.1 yıl, 0.8 yıl
Sonuç: Basit, uluslararası uygulanabilir
International Extranodal Lymphoma Study Group; 2003 PMID 12525518 -- "Prognostic scoring system for primary CNS lymphomas: the International Extranodal Lymphoma Study Group experience." (Ferreri AJ, J Clin Oncol. 2003 Jan 15;21(2):266-72.)
378 hasta. Prognoz için 5 faktör: 1) yaş >60, ECOG >1, yüksek LDH, yüksek BOS proteini, beyinde derin yerleşim.
2-yıllık toplam sağkalım: Skor 0-1: % 80; Skor 2-3: % 48; skor 4-5: % 15
Sonuç: Prognostik skor geliştirilmiş

France; 1993 (1982-1991) PMID 8494713 -- "Multivariate analysis of prognostic factors in patients with non HIV-related primary cerebral lymphoma. A proposal for a prognostic scoring." (Blay JY, Br J Cancer. 1993 May;67(5):1136-41.)
Retrospektif. HIV’ la ilişkisiz 41 primer SSS lenfoma hastası
Multivariat belirleyiciler: BOS protein  > 0.6 g/l,  ECOG >2, yaş > 60
Prognostik risk grupları: ortalama sağkalım : iyi grupta 54 ay, orta grupta 20 ay, düşük grupta 4 ay
Sonuç: heterojen hastalık, stratifiye edilebilir

Herni riski taşıyan kitleler haricinde debulking cerrahinin rolü yoktur
Steroidler; tümör regresyonunu indükleyip patolojiyi maskelediği için herniasyonu önleme haricinde kullanılmamalıdır. Bununla birlikte, steroid verilmesinde de ölü hücrelerde immunostaining yapılabilir
SSS lenfomalarının geleneksel tedavisi radyoterapi olup sonuçlar genellikle kötüdür. Radyasyona başlangıçta cevap olsa da hastaların çoğunda beyinde relaps görülür ve hastalıklarından ölürler. Ortalama sağkalım 1-1.5 yıl, 5 yıllık toplam sağkalım yaklaşık %5’ dir
Primer SSS lenfomaları nadir görüldüğünden, konuyla ilgili çoğu çalışma faz II’ dir
RTOG 8315 beyin tedavisinde doz eskalasyonunu ele almış, fakat toplam sağkalımda belirgin artış olmadan geç yan etkilerde belirgin artış saptanmıştır. İdeal doz 40-50 Gy olup, < 40 Gy’ de sağkalım kötü, > 50 Gy’ de nörotoksisite artmıştır
CHOP tedavisi sistemik NHL’ da etkin olmasına rağmen, SSS’ deki sonuçlar kötüdür
Tek kollu faz II RTOG 9310 çalışmasında RT sonrası KT’ nin daha önceki kontrollerle karşılaştırıldığında sadece RT’ den daha üstün olduğu saptanmış; fakat > 60 yaşta kombine modalite tedavide yüksek nörotoksisite oranları tespit edilmiştir
Yüksek doz metotreksat kemoterapisi, primer tedavinin esas parçası olmuştur. Tamamlayıcı tüm beyin RT > 60 yaş hastalarda çok toksik olup sonraya bırakılmalıdır. Tamamlayıcı tüm beyin RT’ nin genç hastalarda rolü belirsizdir fakat sonucu iyileştirdiği düşünülmektedir. Sekansiyel kemoRT ve sadece yüksek doz KT ile ortalama sağkalım 4 yıl civarındadır
Gelecek için KT rejimlerinin optimize edilerek tamamlayıcı tüm beyin RT’ nin nörotoksisitesinin ertelenmesi amaçlanmaktadır

Tedavi için güncel NCCN rehberi:

KPS > 40 ve kreatinin klirensi > 50 olan hastalarda yüksek doz metotreksat bazlı KT standart tedavi olarak değerlendirilmektedir.
BOS sitolojisi pozitif ise intratekal kemoterapi düşünülmelidir.
KPS < 40 veya kreatinin klirensi < 50 ise, 45 Gy tüm beyin RT uygulanmalıdır.
RT için endikasyonlar: 

Genç hastaların ilk menajmanında post-KT tedavi olarak değerlendirilmelidir (RTOG 9310)
Metotreksat bazlı KT’ ye rezistan rekürren hastalık.
> 60 yaş hastalarda mümkünse RT’ den kaçınılmalıdır.

RTOG 0227 Protocol -- "Phase I/II Study of Pre-Irradiation Chemotherapy with Methotrexate, Rituximab, and Temozolomide and Post-Irradiation Temozolomide for Primary Central Nervous System Lymphoma"
Protokol: Rituximab + Temozolomide + Methotrexate -> Tüm beyin RT 36/30 in 1.2 Gy BID -> Temozolomide
EORTC 20962 (1997-2002)
Faz II. 52 hasta. AIDS’ le ilişkisiz. MBVP x 2 kür ile 2x IT-MTX, ara-C, ve HC. Sonrasında 40 Gy tüm beyin RT.
2003 PMID 14597741 — "High-dose methotrexate-based chemotherapy followed by consolidating radiotherapy in non-AIDS-related primary central nervous system lymphoma: European Organization for Research and Treatment of Cancer Lymphoma Group Phase II Trial 20962." Poortmans PM et al. J Clin Oncol. 2003 Dec 15;21(24):4483-8. Median F/U 2.2 years.
Ortalama sağkalım 3.8 yıl. 3 yıllık toplam sağkalım % 58
Toksisite: Grade 3-4 nötropeni %78; ölümlerin %10’ u tedaviye bağlı
Sonuç: MBVP sonrası tüm beyin RT’ de cevap oranı yüksek fakat toksiktir.
RTOG 9310 (1994-1997)
Faz II prospektif tek kollu çalışma. 98 hasta KT’ de metotreksat, vinkristin, prokarbazin ve intraventriküler metotreksat idi. RT tüm beyin 45 Gy; oküler lenfoma ise gözlere 36/20. Çalışmada protokol modifiye edilerek KT sonrası tam cevap olduğunda tüm beyin RT 36/20 BID uygulandı. RT sonrası hastalara yüksek doz sitarabin verildi.
Primary outcome; 2002 PMID 12488408 — "Combination chemotherapy and radiotherapy for primary central nervous system lymphoma: Radiation Therapy Oncology Group Study 93-10." DeAngelis LM et al. J Clin Oncol. 2002 Dec 15;20(24):4643-8.
Ortalama sağkalım < 60 yaşta 50.4 ay, > 60 yaşta 21.8 ay (overall 36.9 ay); 5 yıllık toplam sağkalım % 32, KT sonrası tam cevap olanlarda fark yok
Toksisite: % 15 hastada şiddetli geç nörolojik toksisite
Sonuç: Daha önceki toplam sağkalım verileriyle karşılaştırıldığında yüksek doz metotreksat bazlı rejimle RT kombinasyonu, sadece RT koluna göre üstün. Bununla birlikte > 60 yaş hastalarda kombine tedavi ile belirgin geç toksisite
HFX-RT; 2005 PMID 16193393 -- "Secondary analysis of Radiation Therapy Oncology Group study (RTOG) 9310: an intergroup phase II combined modality treatment of primary central nervous system lymphoma." (Fisher B, J Neurooncol. 2005 Sep;74(2):201-5.)
Retrospektif. 82 hasta, 66 hastaya standart tüm beyin RT (45/25) 16 hastaya hiperfraksiyone (36/30)
Nörotoksisite: Grade 5 (fatal) % 10, hiperfraksiyonede % 13, standart RT’ de % 10; hiperfraksiyone grupta geç lökoensefalopati. KT’ ye tam cevap olan hastalarda grade 5 nörotoksisite yok
Bulgular: Fark yok
Sonuç: Hiperfraksiyonede % 25 düşük BED, fakat progresyonsuz ve toplam sağkalımda fark yok. Hiperfraksiyone ile şiddetli nörotoksisite geciktirilmiş fakat elimine edilmemiştir

MSKCC; 2006 (1992-1998) PMID 17008697 -- "Long-term follow-up of high-dose methotrexate-based therapy with and without whole brain irradiation for newly diagnosed primary CNS lymphoma." (Gavrilovic IT, J Clin Oncol. 2006 Oct 1;24(28):4570-4.)
Retrospektif. 57 hasta, ortalama 65 yaş, ortalama KPS 70. Tedavide 5 x yüksek doz metotreksat + vinkristin. Intra-Ommaya metotreksat, prokarbazin. Sonra 45 Gy RT, ardından 2 kür Ara-C. > 60 yaş hastalarda RT % 68 hastada ertelendi. Ortalama takip sağ olan hastalar için 9.6 yıl
Bulgular: Medyan OS 4.2 yıl, medyan progresyonsuz sağkalım 10.7 yıl. > 60 yaşta medyan OS 2.4 yıl (RT’ den bağımsız). < 60 yaşta medyan OS henüz elde edilmemiştir (çoğu KT – tüm beyin RT)
Sonuç: Sağkalım çok iyi. Yaşlı hastalarda tüm beyin RT sonraya bırakılmalı, genç hastalarda ise tüm beyin RT’ nin ertelenmesi hastalık kontrolünü zorlaştırabilir

Trans-Tasman Radiation Oncology Group, TROG, (1991-97)
Faz II. 46 hasta. IV metotreksat (1 g/m2; gün 1,8) + lökovorin. BOS (+) hastalara 60 mg haftada 2 kez 3 hafta intratekal Ara-C, sonrasında BOS temizlenene kadar haftada 3 kez devam. Tüm beyin RT 15. günde başlandı, 45 Gy / 25 fx (180 cGy/gün) ; lokalize tutulumda 50.4 Gy’ e boost, diffüz ise tüm beyin 60 Gy
2000 PMID 10653867, 2000 — "Phase II multicenter study of brief single-agent methotrexate followed by irradiation in primary CNS lymphoma." O'Brien P

Trigeminal Neuralgia

15,000 new cases in US per year; incidence 4/100,000 - 5/100,000
Majority of idiopathic TN after age 50

International Headache Society
Classical TN (also called Idiopathic, or tic douloureux)
A) Paroxysmal attack lasting from fraction of a second to 2 minutes, affecting one or more of the trigeminal nerve divisions
B) One of the two following: 1) intense, sharp, superficial, stabbing or 2) precipitated from trigger areas or by a trigger factor
C) Stereotyped in the individual patient
D) No other neurological deficits
E) Not attributed to another disorder
Symptomatic TN (also called Secondary)
Symptoms indistinguishable from Classical TN but caused by a demonstrable structural lesion (e.g. neuroma, vascular compression)

Idiopathic has five classical features:
Paroxysmal
Provokable
Unilateral
Confined to the trigeminal nerve distribution
Unassociated with gross trigeminal motor or sensory loss.
Atypical TN is any pain that lacks the 5 classical features.
Multiple sclerosis-associated TN similar pain as idiopathic, but in the setting of MS

Typically does not wake patient up at night
Unilateral in most cases, if bilateral then not simultaneously
Trigger zones in distribution of CN V, include light touch, chewing, talking, brushing teeth, cold air, smiling/grimacing

Barrow Neurological Institute (BNI)

Marseille scale

Idiopathic TN
Compression of trigeminal nerve by aberrant artery or vein suspected in 80-90% of cases
Resulting demyelination somehow triggers TN (possibly via ephaptic cross-talk between fibers mediating light touch and pain)
Also evidence for central pain mechanisms (refractory period after episode, trans of pain after single stimulus, latency from stimulus to onset)
Secondary TN
Caused by other structural compressions (e.g. vestibular schwannoma, meningioma, epidermoid cyst, aneurysm, AVM)

Oregon, 2004 PMID 15540931 -- "Pathophysiology of trigeminal neuralgia: new evidence from a trigeminal ganglion intraoperative microneurographic recording. Case report. (Burchiel KJ, J Neurosurg. 2004 Nov;101(5):872-3.)
Intraop recordings suggest TN pain generated by an abnormal discharge within peripheral NS, both in trigeminal ganglion neurons and/or the nerve itself

Trigeminal nerve (CN V) supplies sensory to the face, and sensory and motor to muscles of mastication
V1 - Ophthalmic
V2 - Maxillary
V3 - Mandibular
Nerve exits at midlateral surface of the pons
Meckel's cave - gasserian ganglion (sensory ganglion), located 2 cm anterior to trigeminal root entry zone.

Thin slice (1mm) MRI/MRA to rule out structural lesions. Sensitivity and specificity for identifying vascular compression 89% and 50%

Tufts
2006 PMID 16436823 -- "Nerve atrophy in severe trigeminal neuralgia: noninvasive confirmation at MR imaging--initial experience." (Erbay SH, Radiology. 2006 Feb;238(2):689-92.)
31 patient MRIs reviewed. Mean diameter on symptomatic side 2.11 mm  vs. 2.62 mm (SS). Mean cross-başlıkal area 4.50 mm2 vs. 6.28 mm2 (SS)
2005 PMID 15662790 -- "Targeting the cranial nerve: microradiosurgery for trigeminal neuralgia with CISS and 3D-flash MR imaging sequences." (Zerris VA, J Neurosurg. 2005 Jan;102 Suppl:107-10.)
Multiple imaging sequences evaluated. CISS/3D-Flash preferred method
MC Wisconsin PMID 16029818 -- "Effect of image uncertainty on the dosimetry of trigeminal neuralgia irradiation." (Jursinic PA, Int J Radiat Oncol Biol Phys. 2005 Aug 1;62(5):1559-67.)
Conclusion: uncertainty of target by MRI >2x than by CT. 4&8 mm collimator higher isodose line than 4mm collimator
UCLA PMID 15730595 -- "Three-dimensional fast imaging employing steady-state acquisition magnetic resonance imaging for stereotactic radiosurgery of trigeminal neuralgia." (Chavez GD, Neurosurgery. 2005 Mar;56(3):E628; discussion E628.)
Evaluation of 3-D-FIESTA sequence in 15 patients. 3-D-FIESTA sequence successfully demonstrated the trigeminal complex (root entry zone, trigeminal ganglion, rootlets, and vasculature) in 14 patients (93.33%). The 3-D-FIESTA sequence also allowed visualization of the branches of the trigeminal nerve inside Meckel's cavity.
Conclusion: SRS targeting of specific trigeminal branches may be feasible
Rosewell Park PMID 11733329 -- "Focal enhancement of cranial nerve V after radiosurgery with the Leksell gamma knife: experience in 15 patients with medically refractory trigeminal neuralgia." (Alberico RA, AJNR Am J Neuroradiol. 2001 Nov-Dec;22(10):1944-8.)
Retrospective. 15 patient MRIs. RT dose 35-45 Gy at 50% isodose line. Mean time to follow-up imaging 61 days
Target enhancement in 10/15; remaining 5 had RT dose 35 Gy

Please see the treatment and retreatment pages

Mayo
1999-2001 PMID 15951649 -- "A prospective cost-effectiveness study of trigeminal neuralgia surgery." (Pollock BE, Clin J Pain. 2005 Jul-Aug;21(4):317-22.)
Prospective, nonrandomized. 126 patients (MVD 33, GR 51, SRS 69)
Outcomes (6 months, 24 months): MVD (85%, 78%) vs. GR (61%, 55%) vs. SRS (60%, 52%). MVD > GR = SRS
Cost per quality adjusted pain-free year: MVD $8174 vs. GR $6342 vs. SRS $8269
PMID 14677455 -- "CSNS Resident Award: the economics of trigeminal neuralgia surgery." (Ecker RD, Clin Neurosurg. 2003;50:387-95.)
No abstract
Radiation Oncology:TOC

Trigeminal Neuralgia Treatment

Medical (carbamazepine, phenytoin, gabapentin, baclofen) first, until failure
Surgical
Destructive: radiofrequency rhizotomy, glycerol rhizotomy, balloon compression, peripheral neurectomy
Non-destructive: microvascular decompression
Radiosurgery
Gamma Knife
Linac-based

Meta-analysis (1960-2005) PMID 17174762 -- "Drug treatment of trigeminal neuralgia: a systematic review of the literature." (Chole R, J Oral Maxillofac Surg. 2007 Jan;65(1):40-5.)
21 publications with high level of evidence (6 randomized, 15 controlled clinical trials), 348 patients
Conclusion: Anticonvulsants effective, but difficult to compare/combine data in a scientifically meaningful manner

Pittsburg
1972-1991 -- "The Long-term Outcome of Microvascular Decompression for Trigeminal Neuralgia." (Barker et al.  NEJM. 1996, 334:17, 1077-1083)
Retrospective study of 1185 patients who underwent microvascular decompression.
Immediate pain relief in 82%, partial 16%, and none in 2%. 75% had complete relief at 1 year, 9 % partial. 64% had complete relief at 10 years, 4 had partial (first surgery).
11% had re-operation for recurrent or refractory symptoms-total 80% had complete relief at 1 year and 8% partial, 70% had complete relief at 10 years, 4 had partial.
Decision Analysis

Queen Mary; 2007 PMID 17451880 -- "Decision analysis of medical and surgical treatments for trigeminal neuralgia: how patient evaluations of benefits and risks affect the utility of treatment decisions." (Spatz AL, Pain. 2007 Oct;131(3):302-10. Epub 2007 Apr 23.)
156 patients evaluated with time-trade-off utility measurement questionnnaire
Outcome: MVD highest maximum expected utility (16.08), followed by balloon compression (15.97), glycerol rhizolysis (15.61), and RFA (14.93). Meds alone worst at 14.61. Difference between highest and lowest treatments 7%, and sensitive to utility values
Conclusion: Patients should consider surgery over meds, but treatment utility differences minimal

Columbia; 2007 PMID 17167238 -- "Microvascular decompression vs. gamma knife radiosurgery for typical trigeminal neuralgia: preliminary findings." (Brisman R, Stereotact Funct Neurosurg. 2007;85(2-3):94-8.)
Prospective protocol. 85 patients (GKS 61, MVD 24). GKS 75 Gy max.
Outcome: CR (no pain, no meds): 1 year GKS 58% vs. MVD 68%; 2 years 24% vs. 68% (p=0.09)
Toxicity: no permanent complications
Conclusion: MVD more likely than GKS to result in complete pain relief
UCSF
2005 PMID 16419978 -- "Management of medically refractory trigeminal neuralgia in patients with multiple sclerosis." (Cheng JS, Neurosurg Focus. 2005 May 15;18(5):e13.)
Retrospective. 11 patients with TN-MS. Mean f/u 40 months
Conclusion: Complete pain relief in TN-MS significantly more difficult than other TN, including highly refractory TN. SRS effective procedure, resulting in fewer retreatments, longer pain-free intervals compared with MVD or RF ablation
2005 PMID 16419977 1997-2004 -- "Recurrent or refractory trigeminal neuralgia after microvascular decompression, radiofrequency ablation, or radiosurgery." (Sanchez-Mejia RO, Neurosurg Focus. 2005 May 15;18(5):e12.)
Retrospective. 32/209 patients treated with SRS, MVD or RFA required retreatment.
Outcome: 19/93 MVD retreated (20%). 5/12 RFA retreated (42%), 8/108 (7.7%) SRS retreated, 2 with SRS.
Conclusion: lowest re-treatment rates with SRS. SRS also more likely to be final treatment for recurrence, regardless of initial treatment
Cooper University; 2005 1994-2002 PMID 16111575 -- "Glycerol rhizotomy versus gamma knife radiosurgery for the treatment of trigeminal neuralgia: an analysis of patients treated at one institution." (Henson CF, Int J Radiat Oncol Biol Phys. 2005 Sep 1;63(1):82-90.)
Retrospective. 36/79 patients (GR) and 63/109 (GK) evaluated. RT 70-90 Gy to 100% isodose.
Initial success: (Barrow I-III) 86% GR vs. 92% GK. Median time to relief <24hr GR vs. 3 weeks GK.
Failure or pain recurrence: 53% GR vs. 42% GK (NS). Median time to failure 5mo GR vs. 8 mo GK (NS). End of treatment 39% GR vs. 24% GK failed
Side effects: facial numbness 54% GR vs. 30% GK, bothersome 33% GR vs. 11% GK. GK lower pain score (OR 4.3)
Conclusion: GR for acute pain relief, GK otherwise
Mayo
2005 PMID 15951649 1999-2001 -- "A prospective cost-effectiveness study of trigeminal neuralgia surgery." (Pollock BE, Clin J Pain. 2005 Jul-Aug;21(4):317-22.)
Prospective, nonrandomized. 126 patients (MVD 33, GR 51, SRS 69)
Outcomes (6 months, 24 months): MVD (85%, 78%) vs. GR (61%, 55%) vs. SRS (60%, 52%). MVD > GR = SRS
Cost per quality adjusted pain-free year: MVD $8174 vs. GR $6342 vs. SRS $8269
2005 PMID 15913282 1999-2004 -- "Comparison of posterior fossa exploration and stereotactic radiosurgery in patients with prev

1. Neuroepithelial Tumors

Astrocytic Tumors
Pilocytic astrocytoma 9421/1
Pilomyxoid astrocytoma 9425/3
Subependymal giant cell astrocytoma 9384/1
Pleomorphic xanthoastrocytoma 9424/3
Diffuse astrocytoma 9400/3
Fibrillary astrocytoma 9420/3
Protoplasmic astrocytoma 9410/3
Gemistocytic astrocytoma 9411/3
Anaplastic astrocytoma 9401/3
Glioblastoma 9440/3
Giant cell glioblastoma 9441/3
Gliosarcoma 9442/3
Gliomatosis cerebri 9381/3
Oligodendroglial tumours
Oligodendroglioma 9450/3
Anaplastic oligodendroglioma 9451/3
Oligoastrocytic tumours
Oligoastrocytoma 9382/3
Anaplastic oligoastrocytoma 9382/3
Ependymal tumours
Subependymoma (WHO Grade 1) 9383/1
Myxopapillary ependymoma (WHO Grade 1) 9394/1
Ependymoma (WHO Grade 2) 9391/3
Cellular 9391/3
Papillary 9393/3
Clear cell 9391/3
Tanycytic 9391/3
Anaplastic ependymoma(WHO Grade 3) 9392/3
Choroid plexus tumours
Choroid plexus papilloma 9390/0
Atypical choroid plexus papilloma 9390/1*
Choroid plexus carcinoma 9390/3
Other neuroepithelial tumours
Astroblastoma 9430/3
Chordoid glioma of the third ventricle 9444/1
Angiocentric glioma 9431/1*
Neuronal and mixed neuronal-glial tumours
Dysplastic gangliocytoma of cerebellum (Lhermitte-Duclos) 9493/0
Desmoplastic infantile astrocytoma/ganglioglioma 9412/1
Dysembryoplastic neuroepithelial tumour 9413/0
Gangliocytoma 9492/0
Ganglioglioma 9505/1
Anaplastic ganglioglioma 9505/3
Papillary glioneuronal tumor 9509/1*
Rosette-forming glioneuronal tumour of the fourth ventricle 9509/1*
Central neurocytoma 9506/1
Extraventricular neurocytoma 9506/1*
Cerebellar liponeurocytoma 9506/1*
Paraganglioma of the filum terminale 8680/1
2. Tumours of the pineal region

Pineocytoma 9361/1
Pineal parenchymal tumour of intermediate differentiation 9362/3
Pineoblastoma 9362/3
Papillary tumour of the pineal region 9395/3*
3. Embryonal tumours

Medulloblastoma 9470/3
Desmoplastic/nodular medulloblastoma 9471/3
Medulloblastoma with extensive nodularity 9471/3*
Anaplastic medulloblastoma 9474/3*
Large cell medulloblastoma 9474/3
CNS primitive neuroectodermal tumours (PNETs)
CNS PNET, NOS 9473/3
CNS neuroblastoma 9500/3
CNS ganglioneuroblastoma 9490/3
Medulloepithelioma 9501/3
Ependymoblastoma 9392/3
Atypical teratoid / rhabdoid tumour 9508/3
4. Tumors of the Cranial and Paraspinal Nerves

Schwannoma (Neurilemoma, neurinoma) 9560/0
Cellular 9560/0
Plexiform 9560/0
Melanotic 9560/0
Neurofibroma 9540/0
Plexiform 9550/0
Perineurioma 9571/0
Intraneural perineurioma 9571/0
Soft tissue perineurioma 9571/0
Malignant peripheral nerve sheath tumour (MPNST) 9540/3
Epithelioid 9540/3
MPNST with divergent mesenchymal and / or epithelial differentiation 9540/3
Melanotic 9540/3
5. Tumors of the Meninges

Tumours of meningothelial cells
Meningioma 9530/0
Mesenchymal tumours
Lipoma 8850/0
Angiolipoma 8861/0
Hibernoma 8880/0
Liposarcoma (intracranial) 8850/3
Solitary fibrous tumour 8815/0
Fibrosarcoma 8810/3
Malignant fibrous histiocytoma 8830/3
Leiomyoma 8890/0
Leiomyosarcoma 8890/3
Rhabdomyoma 8900/0
Rhabdomyosarcoma 8900/3
Chondroma 9220/0
Chondrosarcoma 9220/3
Osteoma 9180/0
Osteosarcoma 9180/3
Osteochondroma 9210/0
Haemangioma 9120/0
Epithelioid haemangioendothelioma 9133/1
Haemangiopericytoma 9150/1
Angiosarcoma 9120/3
Kaposi sarcoma 9140/3
Primary melanocytic lesions
Diffuse melanocytosis 8728/0
Melanocytoma 8728/1
Malignant melanoma 8720/3
Meningeal melanomatosis 8728/3
Other neoplasms related to the meninges
Haemangioblastoma 9161/1
6. Lymphomas and Hematopoietic Neoplasms

Malignant lymphomas 9590/3
Plasmacytoma 9731/3
Granulocytic sarcoma 9930/3
7. Germ Cell Tumors

Germinoma 9064/3
Embryonal carcinoma 9070/3
Yolk sac tumour 9071/3
Choriocarcinoma 9100/3
Teratoma 9080/1
Mature 9080/0
Immature 9080/3
Teratoma with malignant transformation 9084/3
Mixed germ cell tumours 9085/3
8. Tumors of the Sellar Region

Craniopharyngioma 9350/1
Adamantinomatous 9351/1
Papillary 9352/1
Granular cell tumour 9582/0
Pituicytoma 9432/1*
Spindle cell oncocytoma of the adenohypophysis 8291/0*
9. Metastatic Tumors

Glioblastoma ve Yüksek Dereceli Gliomalar

University of Calgary, 2007 PMID 17696644 -- "The p75 Neurotrophin Receptor Is a Central Regulator of Glioma Invasion" (Johnston AL, PLoS Biol 5(8): e212, 2007)
Glioma fare modeli. Glioma invazyonu için p75 nörotrofin reseptörü (p75NTR)kritik düzenleyici olarak tanımlanmış. Bu invazyon nörotrofine bağlı ve hücre iskeletinde değişiklikler ile sonuçlanıyor.

EORTC Online Nomogram

EORTC 26981 / NCIC
Çalışma detayları için adjuvant therapy sayfasına gidebilirsiniz
RTOG RPA Validasyonu; 2006 PMID 16735709 -- Radiotherapy and temozolomide for newly diagnosed glioblastoma: recursive partitioning analysis of the EORTC 26981/22981-NCIC CE3 phase III randomized trial. (Mirimanoff RO, J Clin Oncol. 2006 Jun 1;24(16):2563-9.)
Çalışmada RPA'nın prediktif gücü değerlendirilmiş. RPA şu şekilde adapte edilmiş
Sonuç: RPA prognostik önemini koruyor

Nomogram; 2008 PMID 18082451 -- "Nomograms for predicting survival of patients with newly diagnosed glioblastoma: prognostic factor analysis of EORTC and NCIC trial 26981-22981/CE.3." (Gorlia T, Lancet Oncol. 2008 Jan;9(1):29-38. Epub 2007 Dec 21.)
Subanaliz. 573 hasta. RT + TMZ grubu (n=287), ve RT + TMZ grubu (MGMT durumu + olanlar)(n=103)
Nomograms: Medyan ve 2-yıllık sağkalımı öngörmek için geliştirilmişler. EORTC GBM Calculator sayfasından ulaşılabilir
Sonuç: MGMT promoter metilasyon durumu, yaş, performans durumu, rezeksiyon genişliği, ve MMSE gelecekteki çalışmalarda kullanılabilecek seçim ve stratifikasyon faktörleri olarak önerilmiş.
Yorum (editör): RTOG RPA sınıflamasından daha doğru. MGMT durumu belli olan hastalar için yaş multivaryant analizlerde etkili çıkmamış. Yalnızca MGMT durumu, Performans Skoru ve MMSE.
RTOG RPA; 1993 (1974-1989) - PMID 8478956 -- "Recursive partitioning analysis of prognostic factors in three Radiation Therapy Oncology Group malignant glioma trials." Curran WJ et al. J Natl Cancer Inst. 1993 May 5;85(9):704-10.
RTOG / ECOG 1374, RTOG 79-18, ve RTOG 83-02 analizi. 74-01'de 1578 hasta vardı.
Yaş <50 veyar >=50 sağkalım için en önemli belirleyici.

Bu çalışmanın yeniden gözden geçirilmesinde (Abstract olarak yayınlanmış) 5 ve 6 grupları tek bir risk grubunda değerlendirmek daha doğru
RTOG Validasyonu; 1998 PMID 9422557 -- "Validation and predictive power of Radiation Therapy Oncology Group (RTOG) recursive partitioning analysis classes for malignant glioma patients: a report using RTOG 90-06." (Scott CB, Int J Radiat Oncol Biol Phys. 1998 Jan 1;40(1):51-5.)
Yeni veri setini (RTOG 90-06) kullanarak RPA sınıflamasının validasyonu
Bulgular: Medyan OS ve 2-yıllık OS %95 güvenlik aralığında; '. sınıf haricinde tüm sınıflarda fark istatistiki olarak bariz (p<0.0001)
Sonuç: RPA sınıflarının validasyonu, gelecekteki Faz II çalışmalar için faydalı tarihi kontrol grubu.

Duke; 2005 PMID 16282174 -- "Glioblastoma multiforme and the epidermal growth factor receptor." (Friedman HS, N Engl J Med. 2005 Nov 10;353(19):1997-9.)
EGFR gen amplifikasyonu
EGFR gen mutasyonu (en sık olanı EGFRvIII'dir)
Tümör süpresör olan PTEN kaybı
PDGFR α fazla ekspresyonu
Mutasyona uğramış p53
1p ve 19q kromozomlar için heterozigosite kaybı, ilk olarak anaplastik oligodendrogliomalarda tanımlanmıştır.
MGMT onarım geni

O6-methylguanine-DNA methyltransferase (MGMT) DNA onarım enzimidir. TMZ tedavisiyle bu enzim azaltılır.
MGMT geni 10q26 kromozumunda bulunur. Gen ürünü guaninin O6 pozisyonundan alkil grup ayırır. Bu bölge DNA alkilleyici ajanları için önemli bir DNA metilasyon bölgesidir.
Tümördeki yüksek MGMT seviyeleri bu çeşit kemoterapilere direnç yaratır.
Tümördeki düşük MGMT seviyeleri Nitroüre-tabanlı kemoterapi uygulanan GBM hastalarında daha uzun sağkalım ile ilişkilidir.
Promoterinin metilasyonu ile oluşan MGMT gen sessizliği daha iyi sağkalım iyi ilişkilidir.
EORTC / NCI Canada; 2005 - PMID 15758010 — "MGMT Gene Silencing and Benefit from Temozolomide in Glioblastoma." Hegi ME et al. NEJM 352:997-1003, 2005.
MGMT metilasyonu EORTC / NCI Canada çalışmasındaki hastalarda analiz edilmiş. 206 hasta analiz edilmiş. Hastaların %44'ünde PCR ile tespit edilebilen MGMT promoter metilasyonu mevcutmuş. Metile grupta çlümde %55 azalma varmış(HR=0.45). Medyan sağkalım 18.2 ay vs 12.2 ay. Metile grup için RT + TMZ grubunda tekbaşına RT grubuna göre bir fayda varmış (HR=0.21). Metilasyon olmayan rupta bu fark daha az olarak bulunmuş. 2-yıllık OS metile grupta %46 (RT+TMZ), %23 (tekbaşına RT); metile olmayan grupta %13.8 ve %2.  Metile grupta medyan sağkalım 21.7 ay (RT + TMZ) metile olmayan grupta ise 12.7 ay (RT + TMZ) vs 11.8 ay (RT).
Metile grup için (RT+TMZ) 2-yıl OS %46 , %23 (tekbaşına RT)
Sonuç: TMZ'den fayda metile MGMT promoterli hastalarda daha fazla.

Radyobiyoloji:

Birmingham, 2007 (UK) PMID 17324531 -- "Estimation of radiobiologic parameters and equivalent radiation dose of cytotoxic chemotherapy in malignant glioma." (Jones B, Int J Radiat Oncol Biol Phys. 2007 Jun 1;68(2):441-8.)
Medyan tümör α/β 9.3; medyan hücresel ikilenme zamanı 39.5 gün
Temozolomide: medyan eşdeğer BED 11Gy (2 Gy/fx'te 9.1 Gy)

Radyodirenç:

Duke, 2006 - PMID 17051156 — "Glioma stem cells promote radioresistance by preferential activation of the DNA damage response." Bao S et al. Nature. 2006 Dec 7;444(7120):756-60.

Cerrahi primer tedavi modalitesidir. Cerrahiye uygun olmayanlar ve yalnızca Bx uygulanan hastaların sonuçları kötüdür.
Post-op EBRT standart tedavidir.
30 fraksiyonda 60 Gy (doz eskalasyonu ya da farklı fraksiyonasyon şemalarının faydası yok)
>60 yaş üzeri hastalarda 40Gy/15fr 60Gy/30fr ile benzer sonuçlar veriyor.
>70 yaş üzeri ve KPS >=70 hastalarda, RT 50/28 GY destek tedavi ile kaşılaştırıldığında QoL veya konitif fonksiyonlarda düşmeye yol açmadan ( orta düzeyde sağkalım faydası (medyan 29 hafta vs. 17 hafta) sağlıyor.
>70 yaş üzeri ve kötü KPS, tekbaşına destek tedavi uygun bir seçenek.
Post-op RT'ye temozolomid eklenmesi halen etkili bir standart tedavi şekli.

Derleme

Singapore, 2007 PMID 17549284 -- "The Role of Surgery in High-grade Glioma - Is Surgical Rebaşlık Justified? A Review of the Current Knowledge." (Pang BC, Ann Acad Med Singapore. 2007 May;36(5):358-6.)

BTCG 69-01 ve 1981 SGSG çalışmaları RT'nin destek tedaviden çok daha iyi sağkalım sonuclarına (iki kat) ve RT tedavinin standart bileşenidir.
2002 Derleme PMID 12242114 -- "Radiotherapy for newly diagnosed malignant glioma in adults: a systematic review." (Laperriere N, Radiother Oncol. 2002 Sep;64(3):259-73.)
6 randomize çalışmanın verilerinin toplanması ve değerlendirilmesi sonucunda: destek tedavi ile karşılaştırıldığında RT lehine bariz sağkalım faydası gösterilmiştir (1 yıllık mortalite için RR 0.81)
SGSG, 1981 -- "Combined modality therapy of operated astrocytomas grade III and IV. Confirmation of the value of postoperative irradiation and lack of potentiation of bleomycin on survival time: a prospective multicenter trial of the Scandinavian Glioblastoma Study Group." (Kristiansen K, Cancer. 1981 Feb 15;47(4):649-52.)
Randomize. 118 hasta. Grade III/IV. Kol 1) 45 Gy WBRT + bleomycin, kol 2) 45 Gy WBRT, kol 3) destek tedavi
Medyan OS: 10.8 ay vs. 10.8 ay vs. 5.2 ay (SS)
Sonuç: RT dramatik olarak destek tedaviden daha iyi. Bleomycin'in ekstra katkısı yok.
BTSG 69-01 -- BCNU vs RT vs RT + BCNU vs İzlem
Randomize, 4 kol. 303 hasta, anaplastik glioma, cerrahi ve steroid sonrası. Kol 1) Tekbaşına BCNU, kol 2) Tekbaşına RT, kol 3) RT + BCNU, kol 4) destek tedavi. BCNU 1-3 günlerde her 6-8 hafta bir uygulanmış. RT 50-60 Gy tüm beyine uygulanmış.
1978 PMID 355604 -- "Evaluation of BCNU and/or radiotherapy in the treatment of anaplastic gliomas. A cooperative clinical trial." (Walker MD, J Neurosurg. 1978 Sep;49(3):333-43.)
Sonuç: medyan OS OBS 3.2 ay vs. BCNU 4.2 ay vs. RT 8.1 ay vs. RT + BCNU 8.0 ay (SS)
Toksisite: Kabul edilebilir trombositopeni ve lökopeni
Not: Bu çalışma RT'nin destek tedaviden daha iyi olduğunu söyleyen ilk çalışmadır.
Yaşlıda:

France (Association of French-Speaking Neuro-Oncologists), 2007 (2001-2005) - PMID 17632898 -- "Radiotherapy for Glioblastoma in the Elderly." Keime-Guibert F et al. New Engl J Med. 2007 Apr 12;356(15):1527-1535.
Randomize. Cerrahi sonrası RT veya destek tedaviye randomize edilmişler.
85 hasta. >70 yaş, GBM veya AA, KPS >=70. Cerrahi %50 hastada yalnızca Bx. Destek tedavi steroid ve antiepileptikleri içeriyor. RT CTV'ye(kontrastlanan tümör + 2 cm) 180cGy/fx da toplam 50 Gy uyguanmış. Ön sonuç analizinden sonra çalışma durdurulmuş.
Medyan takip 21 hafta. 21'inci haftada hastaların %90'ı ölmüş. RT grubunda hastaların ölümünde %53 azalma rapor edilmiş. madyan sağkalım 12 hafta fayda etmiş (29.1 vs 16.9 hafta). PFS 14.9 hafta vs 5.4 hafta. QoL ve nöropsikiyatrik ölçümlerde iki grup arasında fark yok, her iki parametrede zamanla azalmakta.
Sonuç: Yaşlı hastalarda RT QoL'ı olumsuz etkilemeden sağkalımda orta düzeyde bir iyileşmeye neden olmaktadır.

Halen kullanılan tedavi alanları (RTOG tanımlaması):
Önce preop BT/MRG'de kontrast tutan lezyon ve çevreleyen ödem ile birlikte + 2 cm marj ile oluşan tedavi volümüne 46 Gy/23 fx. Eğer ödem yoksa marj 2.5 cm olmalıdır.
Daha sonra 14 Gy/7 fx boost eklenmeli: tedavi volümü yalnızca kontrast tutan lezyon + 2.5 cm marj ile çizilir.
WBRT ile karşılaştırılabilen sonuçlar
%80-90 recurrence is lokaldir (BT'de kontrastlanan lezyonun + 2 cm içinde)
WBRT ile ilişkili nörotoksisiteden kaçınılmaktadır
WBRT multifokal hastalıkta önerilebilir, fakat bu durumda nadirdir.
MD Anderson, 1991 - PMID 1851573 -- Outcome and patterns of failure following limited-volume irradiation for malignant astrocytomas. (Garden AS, Radiother Oncol. 1991 Feb;20(2):99-110.)
Retrospektif. GBM'li 39 AA'lı 21 olmak üzere toplam 60 hasta 1982-1986 yılları arasında tedavi edilmşlerdir.
RT: 53'ü lokal alandan tedavi edilmiş, 7 si WBRT ile tedavi edilmiştir.
BTCG 80-01, 1989 - PMID 2661738 -- Randomized trial of three chemotherapy regimens and two radiotherapy regimens and two radiotherapy regimens in postoperative treatment of malig

Mono, geliştiricilere çapraz-platform (birden fazla işletim sisteminde çalışabilen) programlar yazma imkanı veren bir yazılım platformudur. Mono, .NET Framework'un Linux muadilidir, açık kaynaklıdır, özgürdür, ECMA standartlarını destekler.
Mono platformunda C# dili kullanılır. Mono, C# dilinin gücünü ve kolaylığını Linux'a aktararak Linux programcılarının da % 100 nesne yönelimli, verimli ve performanslı olan bu dille nitelikli programlar yazabilmelerini sağlar. Ayrıca, Mono'ya özgü olan sınıfları kullanmazsanız programınızın Windows'ta çalışabilmesi için o bilgisayarda sadece .NET Framework'un kurulu olması yeterli olacaktır.
Mono platformunda yazılım geliştirmek isteyenlerin temel olarak edinebilecekleri iki paket vardır. mono-runtime paketini kurarak hem Mono platformuyla yazılmış olan yazılımları çalıştırabilir hem de bu paketin içine dahil edilen derleyici sayesinde herhangi bir metin editörüyle yazdığınız program kodlarını komut satırında derleyebilirsiniz. "MonoDevelop" (mono-devel) paketi ise Microsoft'un Visual Studio'suna benzer, yazılım kodlarını yazmayı kolaylaştırmak dışında bir işlevi yoktur. Bu kitapta son bölüm dışında her yerde kodlarımızı normal bir metin editörüyle yazıp mono-runtime paketiyle gelen derleyiciyle derleyeceğiz.

Mono paketini Pardus'a kurmak için paket yöneticisinde mono-runtime paketini aratıp kurun veya konsoldan

sudo pisi it mono-runtime

komutunu verip, root şifrenizi girip, paketin kurulumunu bekleyin.

Şimdi paketi doğru kurduğumuzdan emin olmak için Pardus'ta kurulu olarak gelen KWrite'ı kullanarak içinde aşağıdaki kodlar olan ve adı merhaba.cs olan bir dosyayı Belgeler klasörünüzde oluşturun:

Şimdi Belgeler klasörünüzdeyken konsolda aşağıdaki komutu verin:

gmcs merhaba.cs

Şimdi Belgeler klasörünüzde merhaba.exe isminde bir dosya oluşacaktır. Bu dosyayı (programı) çalıştırmak için konsolda Belgeler klasöründeyken

mono merhaba.exe

komutunu verin. Programın ekrana Merhaba dünya! çıktısını verip kapanması gerekir. Bu programda Mono'ya özgü herhangi bir sınıf kullanmadığımız için bu exe dosyasını .NET Framework'lu Windows yüklü bir bilgisayara taşıyarak Windows'ta da çalıştırabilirsiniz.

Atatürk, önce annesinin ısrarı üzerine kısa bir süreliğine dini eğitim veren mahalle mektebinde okumaya başladı. Buradaki kısa eğitiminden sonra; çağa göre yeni metotlarla eğitim veren, Şemsi Efendi Okulundaki eğitimine başladı. Burada her şey güzel gitmekteydi. Ama babası Ali Rıza Bey; 23 Mayıs 1886'da vefat edince, ailesi ile dayısının Langaza'daki çiftliğine yerleştiler. Bunun üzerine bir müddetliğine Atatürk eğitim hayatına ara vermek zorunda kaldı.
Atatürk'ün eğitime sevgisini bilen Zübeyde Hanım, altı aylık çiftlik yaşamından sonra Mustafa'yı eğitim görmesi için Selanik'te kalan teyzesine gönderir. Burada Selanik Mülkiye Rüştiyesi'ne kaydoldu. Ancak burada Mustafa Kemal'in matematik öğretmeni Hüseyin Efendi ile yaşadığı sıkıntılardan dolayı; babaannesi Ayşe Hanım onu okuldan almıştır. Sonra kendi hür iradesi ile asker olmaya karar vermiş ve annesinden, habersiz Selanik askeri rüştiyesinin sınavlarına girip; sınavlarda başarılı oldu. Önceden dördüncü sınıfa kadar eğitim veren askeri rüştiyenin o yıl birinci sınıfının lağvedilmesi üzerine; Atatürk askeri rüştiyeye 1894'te ikinci sınıftan başlamıştır.
Bu dönemde normal ortaokullar (rüştiyeler) çekiciliği az olan okullardı. Ayrıca o dönemlerde yabancı dil ve Türkçe'ye askeri rüştiyelerde daha çok önem veriliyordu. Atatürk bu okulda daha çok dikkat çekti. Ve önem verildi. Ve bu okul sayesinde Atatürk Fransızca'yı öğrenmeye başladı. Ve matematik dersini sevdi. Matematik öğretmeni 1882 mezunu Yüzbaşı Üsküplü Mustafa Sabri Bey onun zekasını fark etti ve KEMAL adını verdi.

Mustafa Kemal Atatürk; 1881 yılında Osmanlı'nın günümüz Yunanistan'ında bir vilayeti olan Selanik Vilayetinin Selanik kazasında; Ahmet Subaşı mahallesinde bulunan iki katlı pembe boyalı evde dünyaya gelmiştir. Annesi Langaza köyünden Zübeyde Hanım; babası ise; Gümrük memuru, kereste tüccarı ve üsteğmen olan; dedesi Aydınlı bir Yörük olan Ali Rıza Bey'dir. Mustafa doğmadan önce; Çiftin Ahmet, Ömer ve Naciye adlarında üç çocukları olmuş ama üçü de küçükken hastalıktan vefat etmiştir. Ali Rıza Bey doğunca kardeşi Mustafa'nın adını koymuştur oğluna. Kardeş Mustafa; henüz kundaktadır. Minik bir kazadan sonra beşikten düşen kardeşi ne yazık ki ölür. Ali Rıza kardeşini çok sevmiştir ve bu olaydan dolayı çok üzülmüştür. Ve yeni doğmuş olan evladına kardeşi Mustafa'nın adını koymuştur. Mustafa'nın doğumu ile eve hem bir neşe hem de bir korku gelir.
Ailesi Mustafa'ya çok dikkat etmiştir. Böylece huzur içinde yaşamışlardır. 1884 yılında ise; Atatürk'ün kız kardeşi Makbule Atadan dünyaya geldi. Mustafa; 6 yaşında idi.
Ve okul çağı gelmişti. Annesi, mahalle mektebine babası ise; modern eğitim veren Şemsi Efendi okuluna gitmesini ister. Ve Mustafa önce mahalle mektebine, ardından Şemsi Efendi Okuluna gider.

Ali Rıza Bey'in kereste ticareti işi son günlerde sıkıntıya girer. Ve ne yazık ki iflas eder. Ali Rıza Bey bir müddet sonra hastalanır. Ve 1888'in sonlarına doğru vefat eder.
Bir müddet ailesini idare eden Zübeyde hanım; 1889 yılının başında Naciye doğunca çaresiz kalır. Ve kardeşi Hüseyin'in Langaza köyündeki çiftliğine yerleşmiştir.
Ve bundan dolayı Atatürk 6 ay kadar eğitim hayatına ara vermiştir. Daha sonra ise; Zübeyde hanım eğitim hayatına devam etmesi için Mustafa'yı Selanik'e teyzesinin yanına gönderir.
Böylece Mustafa tekrar Selanik ve eğitim hayatına döner. Burada bir süre Selanik Mülkiye Rüştiyesini okumaya başlar.

Mustafa Kemal Atatürk, Türk asker ve siyasetçidir. Türkiye Cumhuriyeti'nin kurucusu ve ilk cumhurbaşkanıdır. Ve TBMM'yi 23 Nisan 1920'de açtı ve ilk başkanı oldu. Kurtuluş Savaşı'nı askeri ve siyasi olarak yönetti. Onun öncesinde İttihat ve Terakki Cemiyetine üyeydi. 31 Mart vakasına katıldı. Hareket Ordusu'nda idi. Sonra birçok savaşa katıldı.

31 Mart vakkası
Arnavutluk isyanı

Trablusgarb Savaşı
İkinci Balkan Savaşı
Çanakkale Savaşı
Kafkas Cephesi
Suriye-Filistin Cephesi
Kurtuluş Savaşı
Sakarya Meydan Muharebesi
Büyük Taarruz
Çanakkale Savaşından sonra paşalığa yükseldi. Suriye-Filistin Cephesinde ise Yıldırım ordular grubunu idare etti. Birinci Dünya Savaşı bittikten sonra İstanbul'a çağrıldı. 1 ya da 2 yıl kaldıktan sonra Samsun'a 9. Ordu Müfettişi olarak atandı. Samsun'a ayak basınca Kurtuluş Savaş'ını başlattı. TBMM'yi kurdu. Kurtuluş Savaşını idare etti. Savaş kazanıldı ve düşman Türkiye'den atıldı.
Sonra Atatürk Cumhurbaşkanı seçildi.  Ve sonra gelişmeler, ilke ve inkılaplar birbirini takip etti. Yurdumuz güzelleşti. Ama 1938'de Atatürk vefat etti. Cenazesi Etnografya müzesine kaldırıldı.
1950'de ise Anıtkabir'e nakledildi. Atatürk, Türk ve dünya tarihi için çok önemli ve yeri doldurulamayacak bir şahsiyettir. Türk halkının umudu. Bağımsızlığın sembolü ve gelişmemiş halkların gelişmesi için örnek oldu. Kemalizm akımını kurucusu ve öncüsü oldu.

Şablon:Wikibooks lisans bilgisi
Bu kitap, Nesnel İzdüşüm (Objective Projection) metodolojisini akademik içeriğe boğmadan, meraklı okuyucular için açıklayan bir giriş rehberidir. Yazarlar, sinemacılar ve hikaye anlatımıyla ilgilenen herkes için yazılmıştır.
Yazar: Levent Bulut | ORCID: 0009-0007-7500-2261 | https://leventbulut.com
Lisans: CC BY-SA 4.0 — Atıf yaparak, değiştirerek ve ticari amaçla da paylaşabilirsiniz.

Bu kitap, yeni bir teori ortaya atmıyor. Levent Bulut tarafından geliştirilmiş ve DOI kayıtlı akademik yayınlarla belgelenmiş Nesnel İzdüşüm (Objective Projection) metodolojisini öğreten bir yazarlık rehberidir.
Tıpkı bir programlama dilini öğreten ders kitabı gibi  bu kitap, yayınlanmış bir metodolojinin nasıl uygulanacağını pratik örneklerle göstermektedir.
Kitapta kullanılan kavramlar (Anlatı Entropisi, Vakum Değişkeni, Biyofiziksel Çıktı ve diğerleri) aşağıdaki DOI kayıtlı akademik yayınlarda tanımlanmış ve belgelenmiştir:

Mimari Çerçeve: DOI: 10.5281/zenodo.18689179
Anlatı Entropisi: DOI: 10.5281/zenodo.18652451
Anlatı Yerçekimi: DOI: 10.5281/zenodo.18908324
OPCT v2.0 (Deneysel Doğrulama): DOI: 10.5281/zenodo.19415236
Dataset (Hugging Face): huggingface.co/datasets/leventbulut/objective-projection
Resmi arşiv: leventbulut.com
Wikibooks politikası gereği bu kitap yalnızca öğretici/rehber niteliğindedir. Metodolojinin akademik kanıtları ve teorik temelleri için yukarıdaki kaynaklara başvurunuz.

Beyin Hikaye Makinesini Nasıl Çalıştırır?
Aksiyon Filminde Neden Esniyoruz?
Gece Yarısı Kitabı Bırakamama Fenomeni
Neden Bazı Karakterler "Karton" Gibi?
"Kalbi Hızlandı" Neden İşe Yaramıyor?
Hitchcock Neden Hiçbir Şey Söylemedi?
Sıfat Ambargosu: Neden "Hüzünlü" Yazmıyoruz?
Beyin Neden Bazı Sahneleri Yıllarca Hatırlıyor?
Shakespeare Bunu Zaten Yapıyordu
Yapay Zeka Neden "Kalbi Hızlandı" Yazıyor?
Kendi Sahnenizi Test Edin
Daha Fazlası İçin

Hiç şunu yaşadınız mı: Elinizde bir kitap var, okuyorsunuz, ama bir yandan da aklınızın yarısı başka yerde. Sayfaları çeviriyorsunuz ama aslında hiçbir şey içinize işlemiyor. Sonra kitabı kapatıyorsunuz ve "Ne okudum?" diye soruyorsunuz kendinize.
Öte yandan başka bir kitap var. Onu okurken telefon çalıyor, duymuyorsunuz. Biri size bir şey soruyor, "Hm?" diyorsunuz. Yemek soğuyor.
İkisi de kitap. İkisi de kelimelerden oluşuyor. Fark nerede?

İnsan beyni yüz binlerce yıl boyunca hikaye dinlemek için değil, hayatta kalmak için evrimleşti. Beyin her an şu soruyu soruyor: "Burada çözülmemiş bir şey var mı? Tamamlamam gereken bir döngü var mı?"
Bir hikayede çözülmemiş bir şey varsa — kim yaptı, ne olacak, neden öyle davrandı — beyin o soruyu kapatmak için okumaya devam ediyor. Buna Vakum Değişkeni diyoruz.
Vakum Değişkeni olmayan bir hikaye? Beyin ilk sayfada dosyayı kapatıyor.

Anlatı Mühendisliği, bir hikayedeki "çözülmemiş bilgi miktarını" matematiksel olarak ölçüyor:

Sₙ = If × Cb

If (Bilgi Sürtünmesi): Okuyucunun ihtiyaç duyduğu ama verilmeyen bilgi miktarı.
Cb (Nedensel Dallanma): Aynı anda açık olan, yanıtsız kalan soru sayısı.
Sₙ çok düşükse → okuyucu sıkılır, bırakır.
Sₙ çok yüksekse → okuyucu kaybolur, bırakır.
Doğru seviyede → okuyucu devam eder.

Milyonlarca dolar harcanmış, arabalar havada uçuşuyor, her beş dakikada bir patlama var. Ve siz gizlice telefonunuza bakıyorsunuz.
Öte yandan karanlık bir odada iki adam konuşuyor. Hiçbir şey olmuyor. Ve nefes almayı unutuyorsunuz.
Nasıl?

Her patlama bir bilgi noktasıdır: tehdit gerçekleşti, sonuç belli oldu. If = 0. Bilgi tamamlandı, Sₙ düştü.
Beyin artık "çözülmesi gereken bir şey yok" diye değerlendiriyor ve dikkatini geri çekiyor.
Karanlık odadaki iki adam sahnesinde ise: tehdit belirsiz, niyet bilinmiyor, sonuç görünmüyor. If yüksek, Cb yüksek, Sₙ maksimum. Beyin sistemi açık tutuyor.

Quentin Tarantino'nun filmlerinde sahneler kronolojik sırayla gitmiyor. Bu rastgele değil her sahne kesimi yeni bir Vakum Değişkeni açıyor. İzleyicinin beyni sürekli "bu ne zaman oluyor, bu sahneyle bağlantısı nerede?" sorusunu çözmeye çalışıyor.
Anlatı Entropisi kasıtlı olarak yüksek tutuluyor. İzleyici bırakamıyor.
Şablon:Alıntı

Saat 01:30. Sabah erken kalkmanız lazım. "Sadece bir bölüm daha" diyorsunuz. Ve kitabın sonuna geliyorsunuz.
Bu sizi iradesiz yapmıyor. Bu beyninizin normal çalışma prensibi.

1920'lerde Bluma Zeigarnik adlı bir psikolog şunu keşfetti: Beyin tamamlanmamış görevleri tamamlanmış görevlerden çok daha uzun tutar.
Bir bölüm yarıda biten bir soruyla kapanırsa beyin o döngüyü kapatmak için geri dönüyor. "Sadece bir bölüm daha" aslında "bu döngüyü kapat" emridir.
İyi romanlar bu döngüyü kasıtlı olarak kullanır. Her bölüm bir soru açar, bir öncekini kapatmaz. Beyin asılı kalır.

Romanınızda her bölümü bir cevapla değil, yeni bir soruyla bitirin. Okuyucu "ne olacak?" sorusuyla bir sonraki bölüme geçsin.
Bu tekniğin adı: Nedensel Dallanma yönetimi.

Binlerce sayfalık romanlar okuruz. Bazı karakterlerin adını kitabı kapattığımız an unuturuz. Ama bazı karakterler Raskolnikov, Ahab, Hamlet  sanki yıllardır tanıdığımız biri gibi zihnimizde yaşar.
Fark nerede?

Klasik yanıt şu olur: "Derinlikli karakter gelişimi." Karakterin geçmişini anlat, travmalarını göster, iç dünyasına gir.
Ama bu yanıt yanlış. Ya da en azından yetersiz.
Bir karakterin iç sıkıntısını sayfalarca anlattığınızda okuyucunun beyni onu analiz eder  empati kurmaz. Uzaktan izler.

Beynin empati sistemi  ayna nöronlar  soyut düşüncelere değil, fiziksel hareketlere tepki verir.
Raskolnikov merdivenden inerken adımları ağırlaşır. Elini kapı koluna koyar, duraksar. Geri çeker. Tekrar uzanır. Bu fiziksel teredüt  iç monologdan çok daha güçlü bir empati yaratır.
Karakteri gerçek yapan iç dünyası değil, fiziksel varoluşudur.

"Kalbi hızlandı."
"Gözleri doldu."
"İçi sıkıştı."
Bu cümleleri milyonlarca kez okudunuz. Ve muhtemelen hiçbirini hatırlamıyorsunuzdur.
Neden?

"Kalbi hızlandı" bir duygusal etiket. Yazar size duyguyu veriyor. Ama o duygunun sizinle buluşması garantili değil.
Her okuyucunun "kalp hızlanması" deneyimi farklı. Kimi için korku, kimi için heyecan, kimi için aşk. Yazar bir şey demek istiyor ama okuyucu farklı bir şey anlıyor.
Daha da önemlisi: bu cümle milyonlarca kez yazıldı. Beyin artık tepki vermiyor. Geçiyor.

Nesnel İzdüşüm şunu söylüyor: Duyguyu söyleme. Duyguyu üreten fiziksel koşulları yaz.
Duygusal etiket:

"Kadın çok üzgündü."
Nesnel İzdüşüm:

"Kadın sandalyenin koluna elini koydu. Tahta soğuktu. Geri çekti."
İkinci cümlede "üzgün" kelimesi yok. Ama beyin o koordinatı kaydediyor ve kendi duygusunu üretiyor.
Şablon:Alıntı

Alfred Hitchcock şöyle diyordu:
Şablon:Alıntı
Bu sadece bir filmcilik prensibi değil. Nörobilimsel bir gerçek.

Bomba patladığında: If = 0. Bilgi verildi. Nedensel dallanma kapandı. Sₙ sıfıra indi. Sinir sistemi rahatladı.
Ama masanın altında bomba olduğunu bildiğinizde: If yüksek, Cb açık, Sₙ maksimum. Beyin sistemi kapalı tutuyor. Gerilim devam ediyor.

Psycho'da Norman Bates ilk göründüğünde tehlikeli görünmüyor. Utangaç, biraz tuhaf, ama zararsız.
Ama o sahnenin fiziksel parametrelerine bakın: Duvarlarda doldurulmuş hayvanlar. Tek ışık kaynağı, soldan. Alçak tavan. Kapı arkada, kapalı. Norman'ın sandalyesi Marion'ın sandalyesinden biraz yüksekte.
Hiçbir şey söylenmedi. Ama izleyicinin sinir sistemi o odada zaten karar verdi.

Kimlik esirgeme: Kim olduğunu söyleme. "Adam" de, isim verme.
Neden esirgeme: Eylemi göster ama nedenini açıklama.
Sonuç esirgeme: Eylemi başlat ama bitirme. Sahneyi kırp.
Bu üç teknik birlikte kullanıldığında Sₙ otomatik yükseliyor.

"Hüzünlü bir öğleden sonraydu."
Bu cümleyi bir düşünün. Neyi görüyorsunuz?
Büyük ihtimalle kendi hüzünlü öğleden sonranızı görüyorsunuzdur. Yazarın değil.

Sıfat okuyucuya duyguyu verir. Ama o duygunun okuyucuyla buluşması garantili değildir.
"Güzel" kelimesi her okuyucu için farklıdır. "Korkunç" her kültürde farklı çağrışım taşır. "Hüzünlü" yazarın zihninden okuyucunun zihnine köprü kuramayabilir.
Fiziksel nesne ise evrenseldir. Sararmış perde herkes için sararmış perdedir. Boş sandalye herkes için boş sandalyedir.

Duygu ismi kullanma: Üzgün, mutlu, korkmuş, kaygılı, öfkeli.
Benzetme kullanma: "Gibi", "sanki", "andırıyordu."
Fiziksel parametrelerle kodla: Sıcaklık, ses, ışık, hareket, mekan.
Nesne önce gelir: Nesneyi koy, ağırlığını ver, konumunu belirt.
Sahne artığını taşı: Önceki sahnedeki fiziksel gerçeklik sonrakine sızar.
Biyofiziksel çıktıyı hedefle: Okuyucunun bedenini hedefle, zihnini değil.

Kötü versiyon:

"Ahmet, Ayşe'ye derin bir sevgiyle baktı. Kalbi hızla çarptı."
Nesnel İzdüşüm versiyonu:

"Ahmet bardağı masaya koydu. Sol eliyle değil, sağ eliyle. Ayşe'nin oturduğu yere yakın köşeye. Bardağı bırakmadı hemen — parmakları camın üzerinde üç saniye kaldı. Parmağını çektiğinde teri, bardaktan yansıdı."
"Sevgi" kelimesi yok. Ama okuyucu görüyor.

On yıl önce okuduğunuz bir romanı düşünün. Konuyu hatırlamıyorsunuzdur. Karakterlerin adlarını unutmuşsunuzdur. Ama bir sahneyi hatırlıyorsunuzdur. Neredeyse fotoğraf gibi.
Neden?

İnsan beyni hikaye hatırlamak için değil, hayatta kalmak için evrimleşti. Beyin için önemli olan şu: Bu nesne neredeydi? Bu yer tehlikeli miydi?
Duygular değil — koordinatlar.
Beyindeki hipokampüs bir GPS sistemi gibi çalışır. Görevi: Bu veriyi bir koordinata bağla ve kaydet.
Soyut duygusal etiketler koordinata bağlanamaz. Bu yüzden geçicidir.
Ama "soğuk tahta", "tek çıkış kapısı", "sesi geri gelen koridor" — bunların koordinatları var. Mekansal hafızaya kaydedilir. Ve mekansal hafıza son derece dayanıklıdır.
Şablon:Alıntı

Hemingway "buzdağı teorisi" diyordu. Göster, anlatma. Somut nesne kullan.
Bu içgüdüsel bir kuraldı. Yüzyıllar boyunca işe yaradığı gözlemlendi ama neden işe yaradığı açıklanamadı.
Şimdi açıklanabiliyor: İyi yazarların sezgiyle yaptığı şey beynin mekansal hafıza sistemini hedeflemekti.

"Olmak ya da olmamak, işte bütün mesele bu."
Bu cümle Nesnel İzdüşüm'ün en büyük ihlali. Çünkü soyut. Bir etiket. Bir kavramsal bildiri.
Ama Shakespeare o sahneyi Nesnel İzdüşüm ile yazmış olsaydı?

Şablon:Alıntı
"Olmak ya da ol

Günümüzde ORİGAMİ adı ile bilinen kağıt katlama sanatının başlangıçtaki adı ORİKATA idi origami tarihini 2 sınıfa ayırıp incelemek daha doğru olacaktır 
1.HENİAN DÖNEMİ :794 - 1185 arası origami bir statü sembolüde denilebilir kağıdın pahalı ve lüks bir araç olması sebebi ile samuraylar birbirlerine hediye olarak origami verirlerdi örnek olarak kağıdın çiçek olarak katlandığı NOSHİ verilebilir.Ayrıca budist rahipler tapınaklarını süslemek için çeşitli origami figürleri kullanmışlardır.
2.Muramachi Döneminde : (1338–1573) origaminin halk arasında yayıldığı dönemdir samuraylar ve halk ayrı okullara gider branşlarına göre ayrı eğitim alırlardı samurayların gittiği ISE okulunda origami dersleri verilmekteydi fakat bu dönemde normal halkın gittiği Ogasawara origami okullarıda bulunmaktadır tabii bunda kağıdın ucuzlaması ve daha geniş bir alanda kullanılmasınında etkisi büyüktür.
Origami sanatı yazılı bir kaynak olmadan babadan oğula aktarılmıştır.İlk yazılı kaynaklar Edo Dönemine (1603–1867) ait olup bunlar 1797’de yazılan Senbaorizuru Orikata (1000 turna katlama) ve 1845’te yazılan Kan No Mado’dur.Müslümanlarda origami ile ilgilenmişlerdir fakat islamda hayvan ve insan motfleri günah sayıldığı için geometri şekillerle ve desenlerle uğraşmışlardır.Müslümanlar ispanyayı fethettikleri zaman avrupa origamiyi tanımış oldu.Müslümanlar arasında pek rağbet görmeyen origami ispanyollar tarafından çok sevilmiştir kültürlerinin bir parçası olmuştur.Halen varlığını sürdüren avrupanın ilk origami okulu UNAMUO Miguel Unamuno tarafından açılmıştır.

Osmanlı döneminde yazmak için Arap alfabesinin azıcık değiştirilmiş bir versiyonu kullanılmaktadır. Sami bir dil olan Arapçada kelimeler çoğunlukla "vezin" adı verilen kalıplara uyarak kurulduğu için, ünlülerin her zaman yazılmasına gerek görülmemiştir. Ayrıca, Arapçada bulunan ünsüz sayısı Türkçeden çok daha fazla iken ünlü sayısı ise Türkçeden çok daha azdır. Tüm bu problemler, Osmanlı döneminde bazı kelimelerin bir sürü doğru yazıma sahip olmasına ve genel olarak yazım kurallarının çok tutarlı olamamasına sebep olmuştur.

Yukarıdaki tabloda kırmızı ile işaretlenen harfler, sadece Arapça kelimelerde bulunup, kökeni Türkçe veya Farsça olan veya Batı asıllı kelimelerde bulunmamaktadır. Buna mukabil mor ile işaretlenmiş harfler ise alfabeye Farsçanın eklediği harfler olduğundan kökeni Arapça kelimelerde bulunmamaktadır. Sarı ile işaretlenen nef harfi ise sadece Türkçeye mahsustur.

Ancak, Arap harfleri nadiren blok hâlinde kullanılır. Kitap harfleri bile el yazısı gibi kendi birleşme şekillerine sahiptir. Bundan dolayı harfler; kelimenin başında, ortasında ve sonunda farklı şekiller almaktadır. 

ا، د، ذ، ر، ز، ژ، و (elif, dal, zel, re, ze, je, vav) harfleri, kendisinden sonra gelen harfle bağlanmazlar. Bu harflere "munfasıl harfler" de denir. ه (he) harfi ise bir ünsüzü temsil ettiğinde bağlanır, ancak bir ünlüyü temsil ettiğinde bağlanmaz. 

Bazı harfler, yan yana gelince özel şekillere bürünürler. En sık ve zorunlu olan tek ligatür, lam-elif ligatürüdür.

Bunun dışında ج، چ، ح، خ، م، ه (cim, çim, ha, hı, mim, he) harfleri, kullanılan hatta göre çeşitli ligatürlere bürünebilmektedir. Bilgisayarlarda tüm fontlarda bu ligatürler bulunmasa da Osmanlı döneminde bu ligatürlerin çoğunluğu zorunluydu. Aşağıda Be ve Lam harflerini kullanarak bu ligatürler gösterilmiştir.

Arapçadan gelen yapılar, Osmanlı döneminde özellikle yüksek dilde çok sık kullanılıyordu. Arapça bağlaçlar, tamlamalar ve türetmeler ile dolu bir lisanla konuşmak, süslü ve özenli konuşmak gibi görülüyordu. Bu sebepten ötürü bu sistemleri öğrenmek, Osmanlıca okuyabilmek için yüksek derecede önem teşkil etmektedir.

Türkçeden farklı olarak Arapça kelimelerin cinsiyeti vardır. Eril kelimelere müzekker kelimeler, dişil kelimelere müennes kelimeler denir. Bu noktada dikkat edilmesi gereken bir husus, kelimenin cinsiyetinin sadece canlı varlıklara mahsus olmadığı, ve başka bir sürü farklı şeyi ifade etmek için kullanılabildiğidir.
Arapçada müennes kelimelerin sonuna özel bir harf olan ة (yuvarlak te) harfi gelir. Bu harf bağlama göre -et veya -e şekliyle okunur. Dişil kelimeler Osmanlıcaya geçerken bu iki telaffuzdan birisi kalıplaşmıştır, dolayısıyla Osmanlıcada bu harf nadiren kullanılır. Osmanlıcaya geçen müennes kelimeler ه veya ت harflerinden birisiyle biter. Okuyucu, yeni kelimeler türetirken bu iki ekin aslında birbirinin aynısı olduğunu aklında tutmalıdır, ve ت harfinin bu durumda kelime kökünün bir parçası olmadığını da göz önünde bulundurmalıdır. Bu sebeple aşağıdaki kelimelerin hepsi müennestir.

Birçok durumda müzekker kelimelere -e/-et eki getirerek müennes yapmak mümkündür.

Türkçe dilinde yeni kelimeler türetilmek istendiğinde genellikle sondan eklenen eklere başvurulur. Bu sebeple Türkçe, sondan eklemeli diller kategorisine girer. Arapçada ise durum farklıdır. Arapçada kelimenin içindeki ünlüler değiştirilerek, uzatılarak, veya kelimenin farklı yerlerine bazı ünsüzler eklenerek yeni kelimeler üretilir. Bu sebeple Arapça bükümlü diller kategorisine girer.
Arapça fiillerin çoğu 3 ünsüzden oluşan bir kökten oluşur. Ender de olsa bazı fiiller 4 ünsüzden oluşabilirler. Bu ünsüzleri vezin adı verilen kalıplara yerleştirerek yeni kelimeler türetilir. Bir kelimenin veznini bulmak için, kökünü oluşturan 3 ünsüzün yerine sırasıyla ف - ع - ل ünsüzlerini koyarız. Çoğu zaman bu şekilde oluşan kelime manalı değildir, sadece Arap alimlerince dilbilgisini analiz etmek için kullanılır.
İlerleyen makalelerde bir kökten ne kadar fazla kelime türetebileceğimizi göreceğiz.
Sayfa yapım aşamasındadır

Osmanlıcaya Arapçadan geçen kelimeler, yazımlarını olduğu gibi korumaktadır. Bu sebepten ötürü bu tür kelimeleri doğru yazabilmek ve okuyabilmek için bir miktar Arapça dilbilgisi öğrenmek mühimdir.
Arapça asıllı kelimelerin Türkçeye geçtiğinde geçirdikleri ses değişimleri oldukça düzenlidir. Bu sebepten ötürü, bir kelimenin Latin harfleriyle nasıl yazıldığını ve nasıl telaffuz edildiğini öngörebilmek için Osmanlıca yazılışına bakmak tamamen olmasa da az çok yeterlidir. Bu makalede Arapçada harflerin nasıl telaffuz edildiği ve günümüz Türkçesine nasıl geçtikleri ele alınacaktır.

Arapçada sadece 3 tane ünlü bulunur: A, İ ve U. Bu ünlülerin uzun veya kısa olabileceğini de göz önünde bulundurursak aslında toplam 6 ünlü ses bulunur.
Arap harflerinden Türk harflerine geçilirken kelimelerin yazımının telaffuzuna yakın olması önemsendiğinden Arapçada ünlüler arasında küçük telaffuz farkı olarak görülen küçük detaylar bile Türkçede gösterilmiştir. Bu sebepten ötürü, kısa A sesi genellikle E olarak, kısa U sesi de genellikle Ü olarak Türkçeye geçer. Ancak bu kaide, kalın ünsüzlerin etrafında bozulur. Kalın ünsüzlerin yanında kısa A sesi A ile, kısa U sesi U ile, hatta bazı durumlarda kısa İ sesi I ile gösterilebilir. İnce ünsüz olan ل (lam) ve ك (kef) harfleri de bunu engellemeye çalışır. Ünlülerin ne zaman kalınlaşıp ne zaman inceldiği oldukça düzenli kurallara bağlıdır, ancak bu kuralların sayısı çok fazla olduğundan öğrenmenin en kolay yolu bolca metin okumaktır. O ve Ö harfleri Arapça kelimelerde nadiren görülür.
Ancak uzun ünlü sesleri sabit kalma eğilimindedir. Yakındaki ünlüler ne kadar kalın veya ince olursa olsun, uzun A Türkçeye A olarak, uzun İ Türkçeye İ olarak, uzun U da Türkçeye U olarak geçer; ünsüzler de uyum sağlar.
Arapçada kısa ünlüler yazılmaz. Bunun yerine ünsüzlerin üstüne yerleştirilen hareke denilen işaretler yardımıyla gösterilirler.

Ancak harekeleri yazmak zaman aldığı için her metinde gösterilmez. Dinî metinlerde, hat sanatında, sözlüklerde ve yazmayı yeni öğrenenler için hazırlanan kitaplarda gösterilirken diğer metinlerde terk edilir. Bu tür metinlerde sonuncu bir hareke daha vardır:

Uzun ünlüler ise okutucu harflere gösterilir. Okutucu harflerin harekesi olmaz, ancak harekeli metinlerde bir önceki ünsüzün harekesi her halükârda yazılır.

Bu kitapta okuyucunun dikkatini dağıtmamak için ünlüler günümüz Türkçesine en yakın hâliyle geçirilmiştir ve kısa ünlülerin kalınlaşması da göz önünde bulundurulmuştur.
Tek heceli Arapça kelimeler Türkçe ile uyumsuz ünsüz silsileleriyle bitebilir. Bu durumda, Türkçe'ye geçerken ünlü uyumuna göre bir dar ünlü türer, ancak kelime ek aldığı zaman ünlü düşmesine uğrar. Bu kitapta bu tür ünlüler gri renk ile gösterilmiştir.

Aşağıdaki tabloda Arapça telaffuzlar için IPA (Uluslararası Fonetik Alfabe), Türkçe telaffuzlar için standart Türk Alfabesi kullanılmıştır.

Arapçada çift ünsüzleri yazmak için özel bir hareke bulunur: Şedde

Arapçada kelimeler çekimlenirken bazı ünsüzlere şedde gelip kalkabilir. Bu sebepten ötürü dilbilgisel bir işlevi de vardır.
Türkçe kelimelerde Şedde kullanılmaz, ünsüzler iki kere yazılır.

Arapçada da bir ünsüzün iki kere yazıldığı tek bir kelime vardır: Allah

Şedde ile biten kelimeler günümüz Türkçesinde tek ünsüz ile yazılır, ancak ek alınca ünsüz türemesi gerçekleşir. Bu tamamen tahmin edilebilir bir şekilde gerçekleştiği için bu kitapta şedde ile biten kelimeler çift ünsüz ile yazılmıştır.

Dişlerden telaffuz edilen ث (se), ذ (zel) ve ظ (zı) ünsüzlerine konvansiyon olarak peltek ünsüzler denilir. Bu ünsüzler batılı kaynaklarda th, dh, ṯ, ḏ gibi latinleştirilebilir, ancak Türkçe telaffuzlarında normal S ve Z'den bir farkları bulunmadığı için bu kitapta s̱ ve ẕ şeklinde latinleştirilmiştir.

ح (ha) ve ع (ayn) harfleri yutaktan telaffuz edilir; ص (sad), ض (dad), ط (tı) ve ظ (zı) harfleri ise aynı anda hem yutaktan, hem de dilin ucuyla telaffuz edilir. Aynı şekilde  ق (kaf), غ (gayn) ve خ (hı) harfleri de küçük dilden telaffuz edilir. Bu harflerin yutaksıl telaffuzu nedeniyle Türkçede etrafındaki ünlüleri kalınlaştırma eğilimi vardır. Batılı kaynaklar genellikle Kaf ve Hı harflerini q ve kh/x ile latinleştirir, ancak bu kitapta mevzubahis ünsüzlerin hepsi, Türkçe telaffuzunun altına bir nokta konularak ḍ, ṭ, ẓ, ḥ ve ḳ şeklinde latinleştirilmiştir. Sad harfinin latinleşmiş versiyonu ise ş ile karışmasın diye ṡ şeklinde seçilmiştir. Hı harfi ḫ, Gayn harfi de Türkçe telaffuzuna göre g veya ğ olarak latinleştirilmiştir. Böylece okuyucunun dikkatini dağıtmadan bu farklılıklar not edilmiştir.

Dad harfi standart Arapçada kendi özel telaffuzuna sahip olsa da Irak'ta ve başka Orta Doğu diyalektlerinde Zı harfi ile aynı şekilde telaffuz edilmektedir. Bu diyalektlerin etkisiyle dolayısıyla Arapçadan Farsçaya geçen kelimelerde Dad harfi, Z gibi telaffuz edilir. Osmanlı Türkçesi hem Arapçanın, hem de Farsçanın etkisinde olduğundan, bu harf Türkçede düzensiz olarak ya Z (örn: عرض arz, ضمّ zam), ya da D (örn: ضربه darbe) olarak telaffuz edilmektedir. Bu farklılıkları Latin harflerinde de korumak için Dad harfi bu kitapta d'ye tekabül ederken ḍ, z'ye tekabül ederken ẓᵈ gösterimleri seçilmiştir.

Günümüz Türkçesinde B, C ve D harfleri kelime sonlarında ve sert ünsüzlerden önce sertleşip P, Ç ve T olur. Sertleşmenin ne zaman olacağı tahmin edilebilir olduğundan bu kitapta ünsüz sertleşmeleri gösterilmemiştir; Be harfi daima B, Cim harfi daima C, Dal harfi de daima D olarak geçirilmiştir.

(Hemzenin telaffuzu için bir sonraki bölüme bakınız)
Diğer harflerden farklı olarak hemze, özel imlâ kurallarına tabidir. Kelime içindeki pozisyonuna göre yazım kuralları şöyledir:
Kelime başındayken hemze; harekesi üstün veya ötre ise Elif harfinin üstüne, esre ise Elif harfinin altına yazılır. Takibinde uzun ünlü varsa okutucu ile birlikte yazılır. İstisnai bir durum olarak, iki Elif harfinin yan yana geleceği durumlarda Medli Elif kullanılır. Yani Medli Elif, ˀâ- silsilesine tekabül eder.

Kelime başında olan Hemze'ler, Osmanlıcada genellikle terk edilir. Bundan ötürü kökeni Türkçe olmayan kelimelerde Elif harfi, kelime başında herhangi bir ünlüye denk gelebilir.

Kelime ortasında ve sonunda Hemze'nin yazım kuralları karmaşıktır. Öncelik sırası şudur:

Yakında bir kısa ünlü varsa o ünlünün okutucusunun üstüne yazmak,
İki kısa ünlü arasında seçim yapmak zorunda kalınınca öncelikle Ye'yi, sonra Vav'ı, en son da Elif'i seçmek,
-ˀâ- silsilesini Medli Elif ile yazmak,
Ye'nin bir sonraki harfle bağlanmasını engellememek için ikinci bir Ye'nin üstüne yazmak,
Üstteki kuralların hiçbirine uygun bir harf seçilemiyorsa satır üstünde ayrı bir harfmiş gibi yazmak.
Özetle, etrafta bulunan ünlülere göre yazılır.

Osmanlı Türkçesinde satır üzerinde yazılan veya kelime başında kalan hemzeler genellikle terk edilir.

Ancak Hemze ile biten kelimelere Türkçe bir ek geldiğinde bazen yazımı değişebilir.

Hemze ve Ayn ünsüzleri, Arapçada bir telaffuza sahip olsa da Türkçede bir telaffuza sahip değildir. Bu yüzden Latin harflerine geçilirken Hemze ve Ayn ünsüzleri gösterilmemiştir. Ancak bazı ipuçlarına bakarak bu iki telaffuzsuz ünsüzün varlığını kestirmek mümkündür.
Örneğin, iki ünlünün arasındaki tek ünsüz Hemze veya Ayn ise arkalarında kuralsız, Türkçe ile uyuşmayan bir ünlü silsilesi bırakırlar:

Hemze ünsüzü düşünce gerisinde bir ince ünlü silsilesi bırakır (ee, üe gibi), Ayn ise bir kalın ünlü silsilesi bırakır (aa, ua gibi).
Bu ünsüzler bir ünlü ile bir ünsüz arasındayken düşünce gerilerinde bir uzun ünlü bırakır. Okuyucu Arapçanın vezin sistemini iyi kavrarsa uzun ünlülerin nerede olması gerektiğini hissedebilecektir, ve bu şekilde Ayn ve Hemzeleri de kestirebilecektir. Bu sebeple Osmanlıca okuyabilmek için vezinleri iyi öğrenmek önemlidir. 

Türkçede bulunan tüm uzun E ve Ü sesleri, bir Hemze'nin düşmesinden kaynaklıdır.
Arapçada kelimelerin bir ünlüyle başlaması imkânsızdır. Eğer Türkçede bir ünlüyle başlayan bir Arapça kelime varsa orijinali ya Hemze, ya da Ayn ile başlıyordur.

Türkçesi E ile başlayan kelimeler çoğunlukla Hemze ile başlar, Türkçesi kısa A ile başlayanlar da çoğu zaman Ayn ile başlar. Ayrıca, ˁu- ile başlayan kelimeler Türkçeye sık sık ö- veya o- ile geçmiştir. Arapça kelimelerde o ve ö ünlülerinin bulunduğu nadir durumlardan birisi budur.

Bu durumlar haricinde Hemze ve Ayn, hiçbir iz bırakmadan düşer.

Ancak Hemze ve Ayn'ın varlığını bilmek, kelimenin kökünü bilmek için önemli olduğundan bu kitapta kökün parçası olan Hemze'ler sola bakan ˀ işaretiyle, Ayn'lar da sağa bakan ˁ işaretiyle işaretlenecektir.

Arapçada و (vav) ve ی (ye) harfleri tam olarak ünsüz sayılmazlar. Telaffuz olarak U ve İ'den bir farkları yoktur, ancak hecedeki pozisyonlarına göre ünsüz oldukları anlaşılır. Türkçede de Y ile İ'nin telaffuzu aynıdır, ama buna rağmen Y her pozisyonda bulunabilir. Arapçada ise Vav ve Ye her pozisyonda bulunamazlar, bu sebepten ötürü kelimeler çekimlenirken sık sık düşerler veya başka harflere dönüşürler. Bu şekilde düşen veya değişen Vav veya Ye harfleri ᵛ veya ʸ şeklinde gösterilecektir. Okuyucu bu harfleri telaffuz etmemelidir.

Arapçada kelimelerin cinsiyeti vardır. Dişi kelimelere müennes, eril kelimelere müzekker denir. Arapçada dişi kelimeler özel bir harf olan yuvarlak te ile biter.

He ile Te'nin karışımı olarak görünen bu harf, kelimeler cümle sonuna geldiğinde -e diye okunurken cümle ortasında -et diye okunur. Türkçeye müennes isimler düzensiz bir şekilde -e veya -et eki ile geçer. Arapça dilbilgisini öğrenirken -e ve -et eklerinin birbirinin aynısı olduğu unutulmamalıdır.

Ancak Osmanlıcada bu harf genellikle Türkçe telaffuzuna göre normal Te veya normal He olarak yazılır.

İstisna olarak, ileride göreceğimiz gibi Arapça çekimlenmiş ifadelerde Yuvarlak Te kullanılır.

Arapçada Ye harfi kelime sonuna gelince de noktalı yazılır

Farsçada, ve Farsçanın etkisiyle Osmanlıcada ise Ye kelime sonuna gelince noktalarını yitirir.

Bunun sebebi Arapçada noktasız Ye'nin aslında Elif'in kelime sonuna gelmiş bir türevi olmasıdır. Osmanlıcada çoğu zaman dir

Eklerin imlâ kuralları, kelime köklerinden farklılık göstermektedir. Günümüz Latin Alfabesinde kelimelerin telaffuzlarına yakın yazılması sebebiyle bazı eklerin 8'e kadar farklı şekli bulunabilmektedir. Osmanlıcada ise çoğu ekin 1, en fazla 2 şekli bulunur.

A veya E içeren ekler, genellikle sabit bir şekilde ه (he) okutucusuyla gösterilir. I, İ, U veya Ü içeren ekler ise genelde sabit bir şekilde ی (ye) okutucusuyla gösterilir. Kapalı (ünsüzle biten) ekler ise, genellikle hiçbir okutucu içermez. Aynı zamanda, eklerdeki Dal harfi, sert ünlülerden sonra Te'ye dönüşmez. Ancak K içeren ekler Kaf ve Kef arasında geçiş yapar.
Kelime köklerindeki çoğu ünsüz yumuşaması gösterilmez, ancak Kaf harfinin yumuşayıp Gayn olması gösterilir. Ünlü düşmesi de aynı şekilde gösterilmez, ünlüsü düşen kelimeler direkt okutucu olmadan yazılır.

Okutucu ه (he) veya و (vav) ile biten isimler, ek alınca bağlanmazlar. Diğer muttasıl harfler, bir ek alınca bağlanırlar.

Arapça kelimelerin Arapça çoğulları, ilerleyen makalelerde incelenecektir. Türkçe çoğul eki ise tahmin edildiği gibidir:

Türkçede ayrı yazılan soru edatı/eki mı/mi/mu/mü, Osmanlıcada çoğu zaman birleşik yazılır.

Yuvarlak ünlülerden sonra ی (ye) yerine و (vav) gelmez.

Ünlü ile biten kelimelerde kaynaştırma ünsüzü ی (ye) kullanılır. 

İlgi eki (Muzafün İleyh) -(n)ın, kef ile yazılır.

Ünlüyle biten kelimelerden sonra kaynaştırma ünsüzü ن (nun) gelir.

Günümüz Türkçesindeki gibi "su" ve "ne" kelimelerinden sonra ن (nun) yerine ی (ye) kaynaştırma ünsüzü gelir.

Eşitlik (Müsavat) eki ise aşağıdaki gibidir:

Baştaki cim harfi, çe olarak sertleşmez.

Vasıta (Mezidün Maa) eki ise aşağıdaki gibidir:

Ünlülerden sonra ی (ye) kaynaştırma ünsüzü gelir.

Bu ekin ile edatı olarak kullanılması da mümkündür.

Mülkiyet ekleri de aşağıdaki şekildedir:

Ünlüyle biten kelimelerden sonra 3. şahısta kaynaştırma ünsüzü س (sin) gelir.

3. şahıs izafe ekinden sonra bir hâl eki gelince, muttasıl harflerle biten kelimelerde ی (ye) düşer, munfasıl harflerle biten kelimelerde düşmez.

"Su" kelimesi, günümüz Türkçesinde olduğu gibi Osmanlıcada da düzensiz olarak ی (ye) kaynaştırma ünsüzü alır.

Cim harfi sert ünsüzlerden sonra sertleşip Çe'ye dönüşmez, ancak ince ünlülerden sonra Kaf ve Gayn harfleri Kef olarak inceleşir.

Günümüz Türkçesinde, -ki eki dün ve gün kelimeleriyle birleştiğinde ünlü uyumuna uyar. Bu Osmanlıcada gerçekleşmez.

Zamirler, yönelme durum eki -e'yi alınca düzensizlik gösterirler.

Ayrıca daha eski metinlerde o zamiri şu şekilde çekimlenebilir.

Çoğul hâli de آنلر (anlar) şeklinde yazılmaktadır.
Ayrıca eski metinlerde شو (şu) yerine de شول (şol) yazılmaktadır. Yeni metinlerde اول (ol) ve شول (şol) sadece işaret sıfatı olarak kullanılmaktadır, zamir olarak kullanılmamaktadır.

-mak/mek eki K ünsüzü içerdiğinden ق (kaf) ve ك (kef) arasında geçiş yapmaktadır.

Mastar ekinden sonra günümüz Türkçesinde olduğu gibi hâl ekleri gelebilir. Günümüz Türkçesinden farklı olarak -ı ve -a hâl ekleri de mastar ekinden sonra gelebilir. Bu durumda ق (kaf), غ (gayn) olarak yumuşar

-ma/me mastar ekinin yazımı ise genel olarak tutarsızdır.

Bu ekin ما şeklinde Elif ile yazılması, daha çok yeni yazımlarda görülür. Eski yazılarda sabit bir şekilde مه diye yazılır.

Bazı yazılarda izafe eklerinden önce He düşer, veya kalınsa ك (nef) harfinden önce Elif'e dönüşür.

-ış/iş/uş/üş ekinin yazımı da aynı şekilde tutarsızdır.

Bu ekin و (vav) ile وش şeklinde yazılması, sadece yeni yazılarda görülür. Eski yazılarda da ی (Ye)'nin yazılıp yazılmaması tutarsızdır.

Edilgen mastar eki -ım/im/um/üm eki ise و (vav) ve ی (ye) arasında geçiş yapar. Bu ek günümüz Türkçesindeki kadar sık kullanılmaz.

Olumsuzluk eki istisnai olarak ünlü uyumuna göre elif ve he arasında geçiş yapar.

Çatı eklerinin imlası oldukça tutarsızdır, tek bir doğru şekli yoktur. Aşağıda kullanılan şekiller karışık olarak verilmiştir.

Çatı eklerinin okutucu ile yazılıp yazılmadığı genel olarak tutarsızdır.

-ıl- edilgen çatı eki ise ünlü ile başlayan bir ek aldığı zaman okutuculu yazılır, öbür türlü okutucusuz yazılır.

Eski Osmanlıcada ettirgen çatı eki -dır- eki daima در şeklinde yazılıp u veya ü ile telaffuz edilirdi.

Ünlüyle biten kelimelerden sonra -yor, ünsüzle biten kelimelerden sonra -iyor olarak eklenir. Ünlü daralması, konuşmada da yazımda da en yakın metinler hariç bulunmaz.

Örnekler aşağıda verilmiştir.

Geniş zaman eki; vav, ye ve elif arasında geçiş yapan istisnai bir ektir.

Bu ekin çok farklı versiyonları olabildiği için bilmek, gitmek ve yapmak fiilleri de örnek olarak çekimlenecektir.

Geniş zamanın olumsuz versiyonu, günümüz Türkçesinde olduğu gibi düzensizdir.
Tablo yapım aşamasındadır

Dal harfi, sert ünsüzlerden sonra yumuşamaz. Bu sebeple, örnekte görmek ve bakmak fiilleri kullanılmıştır.

Örnek eklenecektir

Örnek eklenecektir

Osmanlıca vikikitabına hoş geldiniz! Bu kitapta, 1928 yılına kadar kullanılan yazım sistemi hakkında her bilgiyi bulabileceksiniz!

Osmanlıca aslında İngilizce, Almanca gibi yabancı bir dil değildir. Sadece Türkçenin daha eski bir versiyonudur. Bu sebepten ötürü okuyucu "Osmanlıca" deyiminden korkup çekinerek yaklaşmamalıdır.
Harf İnkılabı'yla mazi olan Arap alfabesi, Arapça için tasarlanmış olduğundan Türkçeye uyarlanırken bir sürü düzensizlik oluşmuştur. Bu sebepten ötürü Osmanlıca okumayı öğrenmek, Latin harfleriyle okumak kadar kolay olmayacaktır. Yazımı aynı olan veya birden fazla yazımı olan kelimeler çok sayıdadır. Ancak Arap harfleri 1000 yıldan uzun süredir Türklerin işini görmüştür ve bu zorluklar Osmanlı İmparatorluğu'nun dünya güçlerinden birisi olmasını engellememiştir. Dolayısıyla okuyucu bu zorluklardan korkup öğrenmeyi terk etmemelidir.
Arap harflerinin yanı sıra, Osmanlı döneminde konuşulan dilde Arapça ve Farsça gramerlerinin de etkisi büyüktü. Arapçanın vezin sistemi ve Farsçanın tamlamaları, özellikle saray dilinde çok sık rastlanmaktaydı. Yabancı etmenlerin sokak ağzına etkisi görece daha azdı.
Arapçanın ayrıca derin bir hat sanatı kültürü bulunmaktadır. Arapların yanı sıra, Farslar ve Türkler de kendi hat stillerini geliştirmişlerdir. En harcıalem yazılar bile harflerin birleştiği özel bir hat ile yazılır. İlerleyen derslerde bu hatlar da karşılaştırılacaktır.

Osmanlıca imlasının karışık olma sebebi, temelinde İngilizce imlasının düzensiz olma sebebiyle aynı. Kökeni Türkçe olan kelimelerin genelde birden fazla doğru yazımı oluyordu, çünkü bazı sesleri temsil eden 2 veya hatta 3 harf varken bazı harfler ise 6'ya kadar farklı sesi temsil edebiliyordu. Bütün bunların yanı sıra, ünlülerin ne zaman ve nasıl yazılacağına dair olan kurallar da genel olarak belirsizdi. Ayrıca, Türkçe zamanla evrilirken yazı yeterince hızlı evrilemiyordu, ve böylece bazı kelimeler 300 yıl önceki telaffuzlarına göre yazılıyordu.
Bütün bunların yanı sıra, Arapça ve Farsçadan gelen kelimeler kendi yazımlarını olduğu gibi koruyordu. Hatta bu kelimelerde Türkçe kelimelerde olmayan bir kesinlik vardı ve harfler, telaffuzu aynı olan başka harflerle değiştirilemiyordu. Arapça veya Farsça bilmeyen öğrencilerin böylece kelimelerin doğru yazımını ezberden öğrenmesi gerekiyordu. Aynı şekilde bunun yol açtığı başka bir sorun da, bir kelimenin doğru telaffuzunu öğrenmek için kelimenin nasıl yazıldığına bakmak yeterli değildi, kelimenin kökenini de bilmek gerekiyordu.
İlerleyen yıllarda bu düzensizlikleri düzeltmek için muhtelif çabalarda bulunulmuştur. Ancak hiçbir teşebbüs genel olarak kabul görmemiştir ve bu sebepten ötürü bu değişiklikler tersine daha çok karmaşıklığa yol açmıştır. 19. yüzyılda bir sürü aydın Arap harflerini terk etmeyi öne sürmüştür; yerine Ermeni, Yunan, Kiril veya Latin harflerine geçmeyi öneren aydınlar bulunmuştur. Cumhuriyetin kurulmasıyla Atatürk, okuryazarlık oranının hâlihazırda düşük olmasından yararlanmış ve 1928 yılında Harf İnkılabı'nı gerçekleştirmiştir.

Eğer Osmanlıca konusunda bilgiliyseniz, lütfen bu kitaba katkıda bulunmaktan çekinmeyin. Bu proje, ancak herkesin emeğiyle gerçekleşebilir.
Aşağıda şu ana kadar katkıda bulunan kullanıcıların bir listesi bulunmakta. Eğer siz de katkıda bulunursanız kendinizi eklemekten lütfen çekinmeyin.

Kullanıcı:Sinus46

Eklenecektir

Arapça fiiller, Osmanlıca'ya doğrudan geçmez. "Masdar" denilen isimleşmiş hâlleri geçer. Masdarlar, şekillerine göre 4'e ayrılırlar:

Sülasi Mücerred Masdarlar
Mimli Masdarlar
Mezidün Fih Masdarlar
Mecul Masdarlar
Bu makalede bu masdarları inceleyeceğiz

Sülasi köklerin başlarına bir harf eklemeden elde edilen masdarlara sülasi mücerred masdarlar denir. Bu masdarlar, fiillerin en temel anlamını taşırlar. Bu tür masdarların 30'a yakın vezni vardır, bunların en sık kullanılanları aşağıdadır:

Hangi fiilin hangi vezinde masdar oluşturacağı çoğunlukla semaidir, yani belirli bir kurala bağlı değildir. Ancak, kesin bir şey söylemek mümkün olmasa da bazı kaideler mevcuttur.

Faˁl veznindeki masdarlar genellikle geçişli (müteaddi) olur.
سوق (bir şeyi sevk etmek)
ضرب (bir şeyi darb etmek)
ترك (bir şeyi terk etmek)
Fuˁûl, fuˁûle(t) ve faˁalân veznindeki masdarlar genellikle geçişsiz (lazım) olur.
وجود (bulunmak)
سكون (sessiz olmak)
دخول (girmek)
خروج (çıkmak)
رتوبت (yaş olmak)
جریان (akmak)
طیران (uçmak)
Kötü şeylerden bahsetmek için fuˁl vezni kullanılır.
ظلم
فحش
جرم
Faˁle(t) vezni, bir eylemin 1 kere yapıldığını belirtmek için kullanılabilir.
ضربه → ضرب
جلسه → جلوس
Renkler genellikle fuˁle(t) vezninde olur.
حمرت (kırmızılık)
سمرت (esmerlik)
صفرت (sarılık)
Hastalıklardan bahsetmek için sık sık faˁal vezni kullanılır.
تعب (yorgunluk)
وجع (ağrı)
عرج (topallık)
عمل (ishal)
Fiˁâle(t) ve faˁâle(t) vezni sık sık sanat, makam veya meslek belirtmek için kullanılır.
تجارت
ریاست
خطابت
ولایت
نظارت
Akrabalık bildirmek için fuˁûle(t) vezni kullanılır.
أبوّت (babalık)
أمومت (annelik)
عمومت (amcalık)
أخوّت (kardeşlik)
Faˁalân vezni çoğunlukla hareket, ıztırap veya değişim bildirir.
طیران (uçmak)
جریان (akmak)
غلیان (kaynamak)

Başına م (mim) harfi eklenerek yapılan masdarlara mimli masdarlar denir. Bunların en sık kullanılan 4 vezni vardır.

İlerleyen makalelerde görüleceği gibi bu vezinler ayrıca ism-i zaman ve mekân da yapmaktadır.
Muzâaf (son iki ünsüzü aynı) köklerde tekrarlanan harfler birleşir; محلّ (mahall), محبّت (mahabbet) örneklerindeki gibi.
Mefˁil ve mefˁile(t) vezni çoğu zaman misâl (ilk ünsüzü vav olan) kökler tarafından kullanılır. Ecvef (ortadaki ünsüzü vav veya ye olan) köklerde ortadaki ünsüz düşer, onun yerine ikinci hecedeki ünsüz uzatılır; مجاز (mecâz, جواز kökünden), مسافه (mesâfe, س و ف kökünden), معیشت (maˁîşet, ع ی ش kökünden) örneklerindeki gibi.

Mezidün Fih masdarlar, yukarıda anlatılan masdarlardan farkı olmak üzere fiilin anlamında önemli bir değişikliğe sebep olurlar. Türkçede 4 çatı vardır; edilgen, ettirgen, dönüşlü ve işteş. Arapçada bu çatılar, Mezidün Fih masdarlar yoluyla elde edilir.

Müteaddi yani geçişli masdarlar, bir nesneye sahiptirler.
Lazım yani geçişsiz masdarlar, nesnesizdirler.
Mutavaat yani dönüşlülük ise nesnenin özneyle aynı olduğu anlamına gelir. Müteaddi masdarlardan türer.
Müşareket yani işteşlik ise, özne ve nesnenin bir işi karşılıklı yaptığı anlamına gelir.
Bu vezinler, aşağıda verilmiştir.

إِفْعَالْ
ˀifˁâl vezni, geçişsiz sülasi mücerred masdarları geçişli yapar. Geçişli masdarları ise bir derece daha geçişli yapar. Bazen, geçişli sülasi mücerred masdarlarla aynı anlama sahip olabilir.

İlk ünsüz و (Vav) veya ء (Hemze) ise ilk ünsüz ی (Ye)'ye dönüşür.

İkinci ünsüzün و (Vav) veya ی (Ye) olması durumunda, ikinci ünsüz düşer ve sona -ة eki eklenerek kelime müennes yapılır. 

Son ünlünün و (Vav) veya ی (Ye) olması durumunda ise son ünlü ء (Hemze)'ye dönüşür, ama Osmanlıcada nadiren yazılır.

تَفْعِیلْ
Tefˁîl vezni de, ˀifˁâl vezni gibi kelimeleri geçişli yapar. 

Ayrıca, bir şeyi bir şekilde kabul etmek, bulmak, görmek gibi anlamlar için de tefˁîl vezni kullanılır. Bir şeyin oluştuğu şeyi göstermek için de tefˁîl vezni kullanılır.

Sayılar, tefˁîl veznine sokularak o sayıya bölmek, ayırmak anlamı elde edilebilir.

Bazı özel dinî ifadeleri söylemek anlamında da tefˁîl vezni kullanılır.

Tefˁîl vezninde tek düzensizlik, son ünsüzün و (Vav) veya ی (Ye) olduğu durumlardadır. Bu durumlarda, Vav veya Ye'nin yerine bir ة (Yuvarlak Te) gelir.

Az sayıda Vav veya Ye içermeyen kökler de düzensiz bir şekilde müennes olurlar.

مُفَاعَلَة
Bu vezin müşareket (işteşlik), yani bir eylemin iki veya daha fazla kişi arasında yapıldığını belirtmek için kullanılır. Bazen bir eylemin devamlı gerçekleştiğini göstermek için kullanılır.

Bazen ise sülasi mücerret masdarlarla eş anlamlıdır.

Bazen de işteşlik dışında başka anlamları ifade etmek için de kullanılır. Bu şekilde hem geçişli, hem de geçişsiz olabilir.

Son harfin و (Vav) veya ی (Ye) olması durumunda ا (elif)'e dönüşür.

Son iki ünsüzün aynı olması durumunda aralarındaki ünlü düşer.
Örnek eklenecektir

تَفَعُّلْ
Bu vezin, tefˁîl veznindeki masdarları dönüşlü yapar.

Ancak bu vezinde var olan her masdarın tefˁîl vezni Türkçede kullanılmaz.

Son ünsüzün و (Vav) veya ی (Ye) olması durumunda yerine ye gelir, bir önceki ünsüzün harekesi de Esre'ye çevrilir.

تَفَاعُلْ
Bu vezin müfâˁale veznindeki masdarları dönüşlü, sülasi mücerret masdarları da işteş yapar. Bazen isimler bu vezne sokulup Türkçedeki -laşma/-leşme eki gibi fiilleştirilir. Bazen de fiilin samimi olmadığını veya yapmacık olduğu anlamı katar.

Tefeˁˁul vezni ile aynı şekilde, son ünsüzün و (Vav) veya ی (Ye) olması durumunda Vav ise Ye'ye çevrilir, ve sondan ikinci ünsüzün harekesi Esre yapılır.

إِفْتِعَالْ
ˀiftiˁâl vezni, çoğunluka dönüşlü masdarlar yapmak için kullanılır. Bazen beklenmedik anlamlara da sebep olabilir, bazen de sülasi mücerret masdarlarla da eş anlamlı olabilir. Çok sık kullanılan bir vezindir.

Eklenen ت (Te) harfi, ilk ünsüze göre değişime uğrar.

İlk ünsüzün ص (Sad), ض (Dad) veya ط (Tı) olması durumunda, ت (Te) yerine ط (Tı) harfi ilave edilir.
İlk ünsüzün ز (Ze) veya د (Dal) olması durumunda, ت (Te) yerine د (Dal) harfi ilave edilir.
İlk ünsüz و (Vav) ise düşer, onun yerine ت (Te)'nin üstüne şedde gelir.
İlk ünsüz ء (Hemze) ise ی (Ye)'ye dönüşür.

İkinci ünsüzün و (Vav) olması durumunda ی (Ye)'ye dönüşür. Ancak kökte başka bir düzensizlik daha varsa bu gerçekleşmez.

Üçüncü ünlü و (Vav) veya ی (Ye) ise ء (Hemze)'ye dönüşür, bu da Osmanlıcada çoğu zaman yazılmaz.

إِنْفِعَالْ
Bu vezin pasif, kendiliğinden olan ve geçişsiz masdarlar yapmak için kullanılır. 

İkinci ünsüzün و (Vav) olması durumunda ی (Ye)'ye dönüşür. Kökte başka bir düzensizlik varsa bu gerçekleşmez.

Son ünsüzün و (Vav) veya ی (Ye) olması durumunda son ünsüz ء (Hemze)'ye dönüşür, bu da Osmanlıcada çoğu zaman yazılmaz.

إِسْتِفْعَالْ
Bir eylemi yapmayı istemek, veya arzulamak anlamı katar. Bazen de bir masdara "olduğu gibi kabul etmek" anlamı katar.

Bu veznin düzensizlikleri, ˀifˁâl vezninin düzensizlikleriyle aynıdır.

İsimlerin sonuna یة (-iye(t)) eki gelerek elde edilen masdarlara mecul masdarlar denir.

Farsça ve Arapça tamlamalar, özellikle yüksek konuşmada oldukça sık kullanılmıştır. Bu sebeple, bu makalemizde bu tamlama çeşitlerini inceleyeceğiz.

Arapçada tamlamalar, Türkçenin tam tersi şekilde işler; tamlanan isim (muzâf) önce, tamlayan isim (muzâfün ileyh) sonra gelir. Muzâf ismin sonuna bir ötre gelir, muzâfün ileyh olan isim ise harf-i tarif denilen el- belirtili takısı bulunur.

Muzâf isim Yuvarlak Te ile bitiyorsa, daima T ile telaffuz edilir. Muzâfün ileyh olan isim Yuvarlak Te ile bitiyorsa, daima T olmadan telaffuz edilir. Söz konusu kelimenin Türkçe'de normalde nasıl telaffuz edildiği önemli değildir.

Örneğin yukarıdaki "Muhakeme" kelimesi Türkçede T olmadan telaffuz edilmektedir. Ancak muzâf pozisyonuna geldiği için yukarıda "Muhakemet" diye telaffuz edilmiştir. Aynı şekilde, "Delalet" kelimesi Türkçede T ile telaffuz edilmektedir. Ancak yukarıda muzâfün ileyh pozisyonuna geldiği için T düşmüş, kelime "Delale" diye telaffuz edilmiştir.
Arapça isim tamlamaları, Osmanlıcada çok sık kullanılmaz; bu amaç için genellikle Farsça tamlamalar tercih edilir. Arapça tamlamalar, sadece Arapça kökenli iki isim arasında yapılabilir, iki isimden birisi Türkçe, Farsça veya Batı asıllı olunca Arapça terkip yapılamaz.
Özel adlardan önce gelen ابو ebû "babası" ve ابن ibn / بن bin "oğlu" gibi sözcükler de isim tamlaması yapısındadır ve buna göre ابو عبدالله Ebû Abdillâh şeklinde okunur. Şayet ابو ebû'dan önce ibn veya bin gelirse bu durumda o da ابی ebî şekline girmektedir: ابن ابی عبدالله İbn Ebî Abdillâh.

Sıfat Terkiplerinin İzafet Terkiplerinden tek farkı, tamlayanın bir isim değil sıfat olmasıdır. Bu sebeple tamlayana mevsûf denilir.
Sıfat Terkiplerinde mevsûf olan sıfat, muzâf olan isme keyfiyet ve kemiyet açısından uyum gösterir. Aşağıdaki müfret tamlamalarda bu görülmektedir:

Muzâf tesniye hâlinde olunca mevsûf da tesniye hâline alınır.

Müzekker çoğul isimler, müzekker veya mükesser çoğul sıfatlarca terkip edilebilirler.

Mükesser ve müennes çoğullar da müennes isim sayıldığından müennes müfret veya çoğul bir isim tarafından tamlanabilir.

Arapça sıfat terkipleri de Osmanlıcada çok tercih edilmez. Aynı şekilde Farsça terkipler kullanılır.

Lafzî İzâfetler, biçim açısından bir tamlama gibi görünse de anlam bakımından bir tamlama değildir. Bu tür "tamlama"larda, muzâf daima bir ism-i fâil, ism-i meful, sıfat-ı müşebbehe veya mübalağalı ism-i fail olur, mevsuf da başka bir sıfat olur. Bu şekilde, iki sıfat birleştirilip bir birleşik sıfat elde edilir.

Bu tür tamlamalar, Osmanlıcada daha sık kullanılmıştır.

Muzâf olan isim, kendisi bir isim tamlamasıysa veya aşağıda gösterildiği gibi bir edat-isim bileşkesiyse, harekesi ötre olmaz, esre olur. 3'ten uzun tamlamalardan genellikle kaçınılır.

Aynı şekilde, iki muzâfün ileyhi ve ile bağlamak mümkündür.

Tek başına mana taşımayan edatlara harf-i cer denilir. Harf-i cerler, tek bir harf olmak zorunda değildir ama genelde kısa olurlar. Harf-i cerlerin başlıcaları şunlardır:

بِ
Türkçedeki ile edatına benzer. Bir eylemin nasıl yapıldığını belirtir.

لِ
için manasına gelir. Amaç belirtir.

كَ
"gibi" manasına gelir.

إِلَی
Türkçedeki -e ekine tekabül eder. Yön belirtir. Sonrasında harf-i tarif gelince a kısalır, e'ye dönüşür.

عَلَی
"Üzerine" manasına gelir. Sonrasında harf-i tarif gelince a kısalır, e'ye dönüşür.

عَن
-dan/den manasına gelir. 

مِن
-dan/den manasına gelir, ancak ˁan ile eş anlamlı değildir.

فِی
-da/de manasına gelir. Bulunma belirtir.

مَعَ
Birliktelik belirtir.

Aynı zamanda, Arapçada bir edat gibi davranan bazı isimler de vardır. Edatlardan farklı olarak bunlar tek başına bir anlam teşkil edebilir. Bunların başlıcaları şunlardır:

بَیْنَ
"Arasında" anlamına gelir.

فَوْقَ
"Üstünde" anlamına gelir.

بَعْدَ
"Sonrasında" anlamına gelir.

Osmanlıcada Arapçadaki son harekeler çoğunlukla telaffuz edilmemekle birlikte Arapçadaki harf-i cerrlerin son harekeyi değiştirdiği bazı durumlara Osmanlıcada da rastlanılmaktadır. Mesela Arapça حق hakkun Osmanlıcada hakk olarak okunurken بحق Arapçadaki gibi bihakkın şeklinde son harekesi esrelenmiş olarak okunmaktadır. Ayrıca Arapça isim tamlaması yapısı kullanılmışsa bunların önündeki harf-i cerrlere göre son harekeler değişmektedir. Mesela عبدالله abdullâh, من عبدالله min abdillâh gibi.

Arapçada zamirler özne olmadıkları zaman kelimelere eklenen küçük eklere dönüşürler. Bu ekleri edatlara ekleyerek edatların da zamirlisini yapabiliriz.

Bu ekleri zamirlere ekleyince şahıslı versiyonları oluşur:

ˁalâ, ˀilâ ve li edatları, bir zamirle birleşince ˁaley-, ˀiley- ve le- olurlar.

Aynı şekilde, zamirler aidiyet bildirmek için isimlere de gelebilirler.

Farsça tamlamalar, belki Osmanlıca'nın en bilindik özelliği olabilir. Bu tamlamaların inşası ayrıca oldukça basittir; muzâfın son ünsüzünün harekesi esre yapılır, ve mevsûf da sonrasına eklenir.

Elif veya Vav ile biten kelimelerin sonuna bir Ye gelir.

He veya Ye ile biten kelimelerde de He'nin veya Ye'nin üstüne bir Hemze gelir.

Farsça sıfat terkiplerinde, iki isim de Arapça olunca kemiyet ve keyfiyet uyumu aranır.

Şu ana kadar sülasi köklerden Masdarlar, ve Sıfat-Fiiller elde etmiştik. Bu sayfada, bu köklerden özel isimler elde etmesini göreceğiz.

Daha önce gördüğümüz mimli masdarlar için kullanılan tüm vezinler, aynı zamanda ism-i mekân ve zamân yapmak için de kullanılır.

Alet isimleri türetmek için de aşağıdaki vezinler çokça kullanılır.

فَعِیلْ
Bir varlığın bir fiili sadece yapmakla kalmayıp, onun özelliği olduğunu belirten ism-i fâillere sıfat-ı müşebbehe denilir. Türkçeden örnek vermek gerekirse, "konuşan" bir ism-i fâil iken "konuşkan" bir sıfat-ı müşebbehedir. Arapçada bu, yukarıda gösterilen faˁîl vezni ile yapılır. Müteeddi (geçişli) fiillerden sıfat-ı müşebbehe olmaz.

فَعَّالْ
Bir fâilin, bir fiili çokça yaptığını belirtmek için faˁˁâl vezni kullanılır. Bazı durumlarda, meslek isimleri yapmak için de bu vezin kullanılır.

أَفْعَلْ
Renk ve eksiklik bildiren sıfatlar için yukarıda gösterilen ˀefˁal (kısa a ile) vezni kullanılır. Nakıs (son ünsüzü Vav veya Ye olan) köklerde son ünsüz düşer, yerine ا (elif) gelir.

Bu sıfatların müennes (dişi) hâli de faˁlâˀ veznidir.

فَعْلَاءْ

أَفْعَلْ
İsm-i tafdîl, sıfat-ı elvân ve uyûp ile aynı vezinde (ˀefˁal) bulunur. Ancak, temsil ettiği anlam farklıdır. Batılı dillerde bulunan komperatif ve süperlatif sıfatların ve Türkçedeki "daha" ve "en" zarflarının Arapça karşılığıdır. Aynı şekilde, nakıs (son ünsüzü Vav veya Ye olan) köklerde son ünsüz düşer, yerine ا (elif) gelir.

Sıfat-ı tafdîllerin müennes (dişi) hâli, fuˁlâˀ veznidir.

فُعْلَاءْ

فُعَیلْ
İsm-ı tafdilin zıddı olarak, ism-i tafgiller ismi küçültmek için kullanırlar. Türkçedeki -cık/cik diminütif ekine tekabül ederler. Fuˁayl vezni ile oluşturulur. Nadir kullanılır.

Arapçada kelimeler genellikle üç ünsüzden oluşan bir köke dayanır. Bu yapılara sülasi kök adı verilir. Bu kökler, vezin adı verilen kalıplara yerleştirilerek yeni anlamlar taşıyan sözcükler türetilir. Örneğin, س ك ن harflerinden oluşan kök, تفعیل (tefʿîl) veznine yerleştirildiğinde "sakinleştirmek" anlamına gelen تسكين (teskīn) kelimesi elde edilir.
Bu sistem, özellikle Arapçanın yoğun olarak kullanıldığı Osmanlı Türkçesi metinlerinde sözcük kökenini ve anlamını analiz etmek açısından büyük önem taşır. Osmanlıcada Arapça kökenli kelimeler çoğunlukla harekesiz olarak yazıldığı için, hangi kökün hangi vezinle kullanıldığını bilmek kelimeyi doğru anlamlandırmak açısından kolaylık sağlar.

Vezinler, sabit üç harften oluşan ve kökü temsil eden ف، ع، ل (f, ʿayn, l) harfleri üzerine inşa edilir. Bu harfler, cebirdeki x, y, z gibi işlev görerek yerine kök ünsüzleri yerleştirilir. Örneğin, ش م س (ş-m-s) ünsüzlerinden oluşan şems (güneş) kelimesi, sesli harflerle birlikte فَعْل (faʿl) veznine uyar.
Eğer bir kelimede kök dışında başka ünsüzler de bulunuyorsa, bunlar da vezin yapısına dahil edilir. Örneğin, معرفت (maʿrifet) kelimesinin kökü ع،ر،ف (ʿayn, r, f) harfleridir. Başındaki م (mîm) ve sonundaki ت (te) harfleri türetme ekidir. Bu durumda kelimenin vezni مَفْعَلَة (mefʿale) şeklinde olur.

Arapça kökler, düzenlilik durumlarına göre yedi gruba ayrılır:

Çekimlenirken düzensizlik göstermeyen köklere sahih kökler denir. Bu kökler genellikle و (vav) veya ي (ye) harflerini içermez.
- Salim kök: Tamamen düzenlidir, hiçbir özel çekim kuralı gerekmez.
- Mehmuz kök: Ünsüzlerinden biri hemze olan köklerdir. Bazı vezinlerde küçük sapmalar olabilir.
- Muzaaf kök: Son iki ünsüzü aynı olan köklerdir. Genelde düzenlidir.

و (vav) ve ي (ye) harflerinden birini içeren köklerdir ve çeşitli düzensizliklere neden olurlar. Bu harfler illetli harfler olarak bilinir.
- Misal: İlk harfi illetli olan köklerdir. Örn: وجود (vücûd) → إيجاد (îcâd) vezin değişiminde vav düşer.
- Ecvef: Ortadaki harfi illetli olan köklerdir. Örn: دور (devr) → دائر (dâʾir) formunda hemzeye dönüşüm olur.
- Nakıs: Son harfi illetli olan köklerdir. En düzensiz türdür; vav veya ye düşebilir veya tamamen değişebilir.
- Lefîf: İki harfi illetli olan köklerdir. Karmaşık çekim kuralları vardır.

Osmanlı Türkçesi, Arapça sözcükleri harekesiz biçimde yazdığı için, vezin bilgisi özellikle yazılı metinlerde kelime anlamının ve yapısının doğru çözümlenmesi açısından büyük önem taşır. Vezin sistemini bilen biri, kelimenin hangi kökten türediğini, ne tür anlam kaymaları içerdiğini ve hangi kalıba göre çekimlendiğini kolaylıkla anlayabilir.

Arap alfabesi, prensip olarak Latin alfabesinden farklıdır. Arap alfabesinde, her ünlü gösterilme mecburiyetinde değildir, önemli olan ünsüzlerdir. Ünlüleri göstermek, sadece okumaya yardımcı olmak içindir.
Bunun yanında, Arapçada sadece 3 ünlü bulunurken, Türkçede 8 ünlü bulunmaktadır. Bu, bazı harflerin birden fazla sesi temsil etmesine, dolayısıyla birden fazla kelimenin aynı şekilde yazılabilmesine sebep olmaktadır. 

Temelinde;

A ünlüsü ا (elif) harfiyle,
E ünlüsü ه (he) harfiyle,
I ve İ ünlüleri ی (ye) harfiyle,
O, Ö, U ve Ü ünlüleri ise و (vav) harfiyle gösterilmektedir.
Ünlüleri gösteren bu harflere okutucu harfler ismi verilir.
Örnek kelimeler aşağıda bulunmaktadır:

Ancak, E ünlüsünü gösterirken kaide azıcık değişmektedir. ه (he) okutucusu, ilk hecede ve kapalı hecelerde yazılmaz. Çoğunlukla kelime sonlarında yazılır. Bazı örnekler aşağıda verilmiştir:

Kelime başında, okutucular tek başlarına ünlü sesleri gösteremezler. Bu yüzden, ünlü ile başlayan kelimelerde okunmayan bir ünsüz olarak ا (elif) kullanılmaktadır. Böylece;

I veya İ ile başlayan kelimeler ای (elif-ye) ile,
O, Ö, U veya Ü ile başlayan kelimeer او (elif-vav) ile,
E ile başlayan kelimeler sadece ا (elif) ile,
A ile başlayan kelimeler ise, yan yana iki elifin gelmesi kabul edilemez olduğu için, آ (medli elif) ile başlar.
Ayrıca, anlam karışıklığını çözmek veya okumayı kolaylaştırmak için,

E ile başlayan kelimelerin başına أ (hemzeli elif),
Ö veya Ü ile başlayan kelimelerin başına da أو (hemzeli elif-vav) konulabilir.
Ancak genel olarak, hemzelerin yazılıp yazılmaması keyfidir.
Örnekler aşağıda bulunmaktadır.

Bazı metinlerde medli elifin üstündeki med de terk edilebilir.

Ünlülerin yazımındaki düzensizler, görece ileri bir konu olduğundan, okuyucuların önce Osmanlıca/Ünsüzlerin Yazımı sayfasını okumaları tavsiye edilir.

Eklerin imlâsı, Osmanlıca/Eklerin Yazımı makalesinde anatalacağından burada değinilmeyecektir.

İsimlerin köklerinin sonlarında, A ünlüsü ا (elif) ile yazılmaktansa çoğu zaman ه (he) ile yazılmaktadır. Ancak fiil köklerinin sonunda ا (elif) tercih edilmektedir.

Bu kural, her kelimede geçerli değildir.

St-, sk- veya sv- gibi ünsüz yığıntılarıyla başlayan Batılı kelimeler, bazen Türkçeye başlarına bir İ eklenerek geçmiştir. Bu şekilde eklenen yardımcı İ, sadece Elif ile gösterilir.

Küçük ünlü uyumu, Türkçemizde Osmanlı döneminin sonuna doğru gelişen bir özelliktir. Ancak, küçük ünlü uyumu geliştikten sonra bile, yazıda bazı kelimeler güncellenmemiştir, dolayısıyla günümüzde I veya İ'ye tekabül eden و (vav) harfleri, veya U veya Ü'ye tekabül eden ی (ye) harfleri görmek de mümkündür.

Geç Osmanlı döneminde bu düzensizlik düzeltilmeye çalışılmıştır, ancak tüm yazarlar tarafından rağbet görmediğinden işleri bilakis daha çok karıştırmıştır.

Az sayıda ama temel bazı kelimelerde E ünlüsü, ی (ye) harfi ile gösterilmektedir. Bu büyük olasılıkla bu kelimelerdeki E'lerin, Farsça ve Kürtçedeki gibi kapalı telaffuzundan kaynaklanmaktadır. Bu kitapta, bu tür E'ler é ile işaretlenecektir.

Ardı ardına iki veya daha fazla ا (elif) olan kelimelerde, öncesinde kalın ünsüz bulunuyorsa, eliflerin ilki düşebilir.

Bazı kelimelerde de vav okutucusu düşebilir. Bu kelimelerin genel bir kaidesi yoktur.

ی (ye), diğer okutuculara nispeten daha sık düşer. Temel bazı kelimelerde ye kullanılmaz.

Yan yana 3 tane ye geliyorsa da birisi düşer.

Osmanlı Alfabesinde 33 harf bulunmaktadır, ve 33 harfin hepsi bir şekilde ünsüz olabilmektedir. Bu yüzden, aynı sesi temsil eden çok sayıda harf bulunabilmektedir. Bu sayfada, bu harflerin aralarındaki farklar açığa kavuşturulacaktır.

Arapçaya mahsus olan bu harfler; Türkçe, Farsça veya Batı asıllı kelimelerde asla bulunmaz.

Bu harflerin temsil ettiği sesler Türkçede bulunmamakta olup, ayrıca kullanılmaları için başka bir amaç da bulunmamamıştır.

Kef harfinin üç versiyonu bulunmaktadır:

Çoğu yazıda bu üç farklı Kef arasında ayrım yapılmaz.

Bu iki harf, Osmanlı döneminde farklı telaffuz edilen iki farklı N sesine tekabül etmektedir. ن (nun) harfi (IPA: /n/) (günümüzdeki N sesi ile aynı) dilin ucuyla telaffuz edilirken ڭ (nef) harfi ağzın arkasından gelen (IPA: /ŋ/) (İngilizce sing, Almanca Rechnung kelimelerindeki gibi) sesine tekabül etmektedir. Bu iki ses, yakın dönemde birleşmiştir, ancak yazımda hâlâ ayırt edilmektedir. Türkçenin kırsal bazı ağızlarında bu iki ses arasındaki ayrım hâlâ gözetilmektedir.
ڭ (nef) harfi, iyelik eki -(n)in başta olmak üzere bir sürü ekte karşımıza çıkar, ayrıca bazı kelime köklerinde de çıkar. Akademik makalelerde nef harfi genelde ñ harfiyle gösterilir, bu yüzden bu kitapta da bu harf kullanılacaktır. Örnek kelimeler aşağıda bulunmaktadır.

Kefin diğer versiyonları, kalın ünlülerle (a, ı, o, u) birlikte bulunamayacağı için, kalın ünlülerden sonra gelen keflerin hepsinin aslında nef olduğu varsayılabilir.

Bu iki harf, birbirinden farklı iki G sesine tekabül etmektedir. گ (gef) harfi damaktan okunurken (IPA:/ɟ/) غ (gayn) harfi ağzın arkasından gelmektedir (IPA:/g/). Bu iki harf latin alfabesinde G'ye tekabül etse bile, günümüzde bu farklı telâffuzlarını korumuştur. Bu telâffuz farkından dolayı, غ (gayn) daima kalın ünlülerin (a, ı, o, u); گ (gef) ise daima ince ünlülerin (e, i, ö, ü) yanında bulunur.
Aynı şekilde, bu iki harf de ünlülerden sonra gelip Ğ sesini temsil edebilir. Osmanlıcada G ve Ğ arasında bir ayrım gözetilmez.
Az sayıda kelimede, Ğ'ler günümüzde latin harflerinde V'ye dönüşmüştür, bu yüzden غ (gayn) ve گ (gef)'in V'ye tekabül etmesi de mümkündür. Çok az sayıda kelimede gef, Y'ye de tekabül edebilir.

Aynı şekilde, ك (kef) damaksıl bir K'ye tekabül ederken (IPA: /c/) ق (kaf) ise küçük dilin eteğindeki yumuşak tabakadan gelmektedir (IPA: /k/). Bu telâffuz farkı günümüzde de korunmaktadır. Bu sebepten ötürü, Kef sadece ince ünlülerle (e, i, ö, ü), Kaf ise sadece kalın ünlülerle (a, ı, o, u) bulunabilir.

ه (he) gırtlaktan gelen /h/ sesine tekabül ederken (günümüzdeki H sesi) خ (hı) ise art damakta oluşan /x/ (Almanca Nacht, Rusça хороший kelimelerindeki gibi) sesini temsil etmekteydi. Bu iki ses de kökeni Türkçe kelimelerde nadir bulunmaktadır, ancak yansıma seslerde ve Doğu asıllı kelimelerde bulunmaktadır. Çoğu kitapta خ (hı) kalın, ه (he) de ince ses olarak öğretilir, ancak Hı'nın ince, He'nin de kalın ünlülerde bulunduğu çokça örnek bulunmaktadır. Türkçe kaynaklarda Hı harfi, ḫ karakteri ile latinleştirilir, bu kitapta da bu harf kullanılacaktır.

Sad harfinin telâffuzunun, Sin harfinin telâffuzundan hiçbir farkı bulunmamaktadır. S sesleri genellikle Sin ile gösterilmekle beraber, anlam karışıklığını engellemek ve okumayı kolaylaştırmak için bazen kelime köklerinde kalın ünlülerle beraber Sad harfi kullanılır. Ancak Sad harfiyle yazılan kelimeleri Sin ile yazmak da yanlış olmaz.

Tı harfi; hem Te'nin, hem de Dal'ın kalın versiyonu olarak kullanılmaktadır. Sad ile aynı şekilde, telaffuzda olan bir farklılığı göstermektense sadece anlam karışıklığını engellemek ve okumayı hızlandırmak ve kolaylaştırmak için kullanılır. Genellikle hece sonlarında kullanılmaz, çoğunlukla kelime başında kullanılır.

Normal şartlarda, ünsüz yumuşamasına uğrayan kelimeler, her durumda yumuşak ünsüzle yazılır, ve ek alınca değişmez.

Ancak T ve K ünsüzlerinin yumuşaması, yazımda da gösterilir.

Bir fiili yapan özneyi belirten isimlere ism-i fâil, bir fiilin nesnesi olan isimlere de ism-i mefûl deriz. Arapçada bu tür isimleri türetmek için gelişmiş bir sistem vardır, ve bu makalede bunu inceleyeceğiz.

Masdarların en basit hâlinde onlarca vezni olduğunu öğrenmiştik. Ancak tüm basit masdarların ism-i fâil ve mefûl'ü aynı vezindedir.

فَاعِلْ
Oldukça sık kullanılan bir vezin olan fâˁil vezni, basit masdarların ism-i fâilini yapar.

İkinci ünsüz و (vav) veya ی (ye) ise ء (hemze)'ye dönüşür.

Son harf Vav ise Ye'ye dönüşür, uzun İ olarak okunur.

مَفْعُولْ
Yine oldukça sık kullanılan bir vezin olup, basit masdarların ism-i mef'ûllerini yapar.

Son iki ünsüzden birisi و (vav) ise düşer. Son iki ünsüzden birisi ی (ye) ise yine Vav düşer, son hece uzun İ ile okunur.

Mezidün Fih Masdarların fâil ve mefûl isimleri çoğu zaman aynı yazılır, sadece telaffuzda ayrılır. Bu tür fâillerin ve mefûllerin hepsi mü- ön ekiyle başlar.

ˀiftiˁâl vezninde Te'ye olan değişiklikler, ism-i fâil ve mefûlünde de gözlemlenir. ˀifˁâl ve ˀistifˁâl vezinlerinde ilk ünsüzde olan düzensizlikler, ism-i fâil ve mefûlünde gözlemlenmez, ancak müfˁil ve müfˁal vezinlerinde oluşan -üv- silsilesi Türkçeye -û- olarak geçer.

İkinci ünsüzün و (vav) olduğu durumlarda ˀiftiˁâl ve ˀinfiˁâl vezinlerinde ی (ye)'ye dönüştüğünü görmüştük. Bu masdarların ism-i fâil ve mefllerinde ise söz konusu ی (Ye), ا (Elif)'e dönüşür. Bu vezinlerin ism-i fâil ve mefûlleri aynıdır.

İkinci ünsüzün و (vav) veya ی (ye) olunca ˀifˁâl ve ˀistifˁâl babında -ة (-e(t)) eki geldiğini görmüştük. Bu masdarların ism-i fâil ve mefûllerinde ise و (vav) ve ی (ye) yine düşer, ancak son hecedeki ünlü uzatılır.

Son ünsüzün و (Vav) veya ی (Ye) olduğu durumlarda her babda Vav veya Ye düşer, ve sondaki ünlü uzatılır.

Son iki ünsüzün aynı olması durumunda müfâˁale, ˀifˁâl, tefâˁul, ˀinfiˁâl, ˀiftiˁâl ve ˀistifˁâl vezinlerinin ism-i fâil ve mefûllerinde ünsüz iki kere tekrarlanmaz, sondaki ünsüz şeddelenir.

Bu bölümde, Arapça gramerinde ismin nasıl çekimlendiğini inceleyeceğiz.

Belirtili isimler, Belirtisiz isimlere harf-i tarif denilen -ال (el-) ön eki getirerek yapılır. Ancak, el- ön eki her zaman yazıldığı gibi telaffuz edilmez. Bu konuda dikkat edilmesi gereken iki husus vardır:

Ünlü ile biten bir kelimeden sonra el- ön ekinin Elif'i telaffuz edilmez. Bunu göstermek için bazen el- ön eki, -ٱل şeklinde hemze-i vasıl ile yazılır.
 بالجمله 
 bi'l-cümle 
 بالذات 
 bi'ẕ-ẕât 

Dilin ön ucuyla telaffuz edilen ünsüzlere şemsî ünsüzler denilir. Bu ünsüzler kelime başında olunca Lâm harfi telaffuz edilmez, ilk ünsüz şeddeli okunur. Aşağıdaki ünsüzler şemsîdir:
 ت ث د ذ ر ز س ش ص ض ط ظ ل ن 
Dilin ucuyla telaffuz edilmeyen ünsüzlere ise kamerî ünsüzler denir. Bu ünsüzlerle başlayan kelimelerden önce Lâm harfi telaffuz edilir.
 ء ب ج ح خ ع غ ف ق ك م ه و ی 
Cim harfi, dilin ucuyla telaffuz edilmesine rağmen kamerî sayılmaktadır.
 السلام  
 es-selâm  
 الرحیم 
 er-raḥîm 

Arapçada kelimelerin bulunduğu üç hâl vardır:

Yalın hâldeki kelimeler ötre ile biter
Belirtme hâlindeki kelimeler üstün ile biter.
İyelik hâlindeki kelimeler ise esre ile biter.
Belirtisiz, yani el- ön ekine sahip olmayan isimler ise tenvin işaretlerinden biriyle biter. Dolayısıyla, Arapçada asla "kitap" kelimesi olduğu gibi kullanılmaz. Ya
 كتابٌ 
kitâbün
ya da
 الكتاب
el-kitâbü
olarak geçer. Ancak hâl ekleri, bir ifadenin sonunda bulununca düşer. Bu sebepten ötürü, Arapça kelimeler Osmanlıcaya -un eki olmadan geçmiştir.
Osmanlıcada İyelik hâli nadiren kalıplaşmış ifadelerde kullanılır. Yalın hâlindeki ötre ise sonraki makalelerde göreceğimiz gibi tamlama yaparken kullanılır.
 دارُ الشفقة 
Belirtme hâli ise sık sık zarf olarak kullanılır.
 ذاتاً رسماً قسماً حالاً 

Arapçada iki cinsiyet vardır: müzekker (eril) ve müennes (dişil). Bir kelimenin müennes olduğunu anlamak için iki yol vardır:
Bazı kelimeler, anlamlarından dolayı müennestir. Gerçek bir kadını belirten her isim, biçimine bakılmaksızın müennestir. İlaveten, harf isimleri ve aşağıda anlatılacak olan müennes ve mükesser çoğullar da daima müennes sayılırlar.
Bazı kelimeler ise biçimlerinden dolayı müennestir. Örneğin ة- (Yuvarlak Te) harfi ile biten kelimeler neredeyse her zaman müennes olurlar. Ayrıca, ا (elif) ve ت (te) ile biten kelimeler de müennes olurlar, ancak söz konusu Elif ve Te'nin kökün bir parçası olmaması gerekir.
Bir kelime müennes değilse o kelimeye müzekker denilir. Müzekker kelimelere ة- (yuvarlak te) veya ت- (te) eki getirerek müennes yapabiliriz.

Kelimelerin müennes olabilmesi için bir insanı temsil etmesine gerek yoktur. Sık sık cisimler, hatta soyut konseptler bile müennes olabilir.

Türkçede kelimelerin sahip olabileceği iki sayı vardır: Tekil ve Çoğul.
Arapçada ise kelimeler üç farklı sayıya sahip olabilirler:

Müfred (Tekil)
Tesniye (İkil)
Cem (Çoğul)
Bir kelimeyi müfret yapmak için herhangi bir ek eklemek gerekmez. 

Bir kelimeyi müsenna (tesniye edilmiş) yapmak için ise ین- (-eyn) eki kullanılır.

Arapçada iki çeşit cem bulunur:

Cem-i Salim (Düzenli Çoğul)
Cem-i Mükesser (Kırık Çoğul)

Salim çoğullar, kelimenin köküne bir ek getirerek elde edilir. Müzekker kelimelerin çoğulunu elde etmek için ون- (-ûn) veya ین- (-în) eki kullanılır.

Ancak müzekker olup insan olmayan varlıklar için ون- veya ین- (-ûn veya -în) ekleri kullanılamaz. Bu tür isimler, müennes isimler gibi çekimlenir.
Müennes isimlerde ise kelimenin sonundaki yuvarlak te düşer, yerine ات- (-ât) eki gelir. Kelimenin kökü zaten -ât ile bitiyorsa -ât ekinin yerine bir Vav gelir.

Bazı isimler ise, çoğullarını türetmek için ekler almaktansa özel vezinlere sokulurlar. Hangi kelimenin hangi vezne girdiği mutlak kurallara bağlı değildir, ancak kelimenin kökünün bulunduğu vezne göre bazı kaidelerden bahsetmek mümkündür.

Mezidün fih masdarlar bunların ism-i fâil ve mefûllerinin çoğulları çoğu zaman salimdir.
Birkaç istisnai ismin çoğulu da tamamen düzensizdir:

PC (Personal Computer) Malware yani kişisel bilgisayar Zararlı yazılımları, kısaca:Bilgisayara zarar vermek isteyen yazılımlardır (Malware=Malicious Software yani zararlı yazılım) olarak tanımlanabilir .Her zararlı yazılım  aynı değildir. Özellikleri farklı olabilmektedir.Bu Kitapta Günlük hayatı etkileyen zararlı yazılımların bazılarını anlatılmıştır

Trojan türkçesiyle Truva atı,zararsız bir yazılım gibi görünüp zararlı olan yazılımlardır ismini meşhur Truva atından almaktadır

( Orijinal Truva Atını merak edenler https://tr.wikipedia.org/wiki/Truva_At%C4%B1 okuyabilirler)
(Truva Atı zararlı yazılımı hakkında bilgi almak isteyenler https://tr.wikipedia.org/wiki/Truva_at%C4%B1_(bilgisayar) okuyabilirler)

bu zararlı yazılım türü şunları yapabilir:

Bilgi çalabilir
Hesaplara girebilir
Gizlice Veri toplayabilir
...
gibi örnekler verilebilir
bu zararlı yazılım türü genellikle 

Korsan yazılım ve bilinmeyen yazılımlar
zararlı sitelerden
gibi şeyler ile bulaşabilmektedir
not:
Drive-By-Download isimli saldırıda Saldırgan bir siteye girmek üzerinden kullanıcıyı enfekte etmeye çalışır bazı gelişmiş türleri sadece siteye tıklamaktan bulaşabilmektedir

Ransomware Türkçesiyle Fidye yazılımı dosyaları şifreleyip şifreyi vermek için para isteyen zararlı yazılımlardır.
bu virüs türü,

Kullanıcı verilerini şifreleyebilirler
bu şifreyi vermek için para isteyebilirler
örneği verilebilir 
(bkz. ayrıntılı bilgi için Vikipedi - Fidye Virüsü okuyabilirsiniz)

Remote Access Trojan (RAT) Türkçesiyle Uzaktan erişim Truva Atı,Uzaktan bir bağlantı kurmaya ve C2 (Command and Control) türkçesiyle Komuta ve Kontrol sunucularına bağlanmaya çalışan Zararlı yazılımlardır.
bu zararlı yazılım türünün yapabileceği şeylere:

(Varsa) Kamerayı açabilir
Klavyede basılan her şeyi kaydedebilir (keylogger)
Tam kontrol sağlayamaya çalışabilir
Bilgileri çalabilir
gibi örnekler verilebilir.
(ayrıntılı bilgi için Remote Access Trojan inceleyebilirsiniz)

Rootkit,Sistemde yönetici izni almaya, bazı gelişmiş versiyonları donanıma bulaşmaya ve sistemin en derinine saklanmayı ve enfekte etmeyi amaçlayan zararlı yazılım türüdür.
bu zararlı yazılım türü,

(Varsa) Kamerayı,mikrofonu vb açabilirler
Sistemi ele geçirebilirler
Klavyede basılan her şeyi kaydedebilirler
Sistem yazılımı gibi görünüp saklanabilirler
gibi örnekler verilebilir.

Worm,Türkçesiyle Solucan,bir enfekte edilmiş elektronik cihazdan (telefon,bilgisayar,televizyon vb) diğer elektronik cihazlara aynı ağ ile bulaşan zararlı yazılım türüdür.
Bu zararlı yazılım türü,

Bir yerdeki aynı ağa bağlı elektronik cihazlara bulaşabilir
kendi kendine çoğalma özelliği gösterir
yayılgan bir eylem göstermektedir

Spyware,yani Türkçesiyle Casus yazılım,bulaştığı cihazdan veri çalan ve toplayan zararlı yazılımlardır.Bu zararlı yazılım çaldığı verilerle,

Hesaplara girip hesapları çalabilir
Şantaj,Tehdit gibi şeyler için kullanılabilir
Dark web'de satılabilir
Klavyede yazılanı kaydedebilir (Keylogger) ve mikrofonu kamerayı gizlice açabilir
gibi örnekler verilebilir.

Scareware,Türkçesiyle Korkutma  yazılımı enfekte edilen cihazın kullancısını korkutmaya çalışan bir zararlı yazılım türüdür.
bu zararlı yazılım,korku ile kullanıcıyı korkutmayı amaçlar böylece:

Yönetici izni alabilir
Veri çalabilir
Başka virüsler yayabilir
gibi örnekler verilebilir

Dropper türü zararlı yazılımlar,enfekte ettiği cihaza başka zararlı yazılım indiren zararlı yazılım türüdür bu zararlı yazılımın amacı ana virüsü yaymaktır.

Başka Virüsleri enfekte edilen sisteme yayabilir
Kendi parçasını sisteme yayabilir
Daha tehlikeli virüsleri bulaştırabilirler

Kaspersky - Rootkit Nedir?
Vikipedi - Fidye Virüsü

İşletim Sistemi, bilgisayar donanımına bir soyutlama sunarak üzerinde yazılım geliştirilmesine olanak sağlayan bir yazılımdır. Bir işletim sistemi temel olarak dosya sistemi, süreç sistemi, hafıza yönetimi, donanım sürücüleri ve açılış sürecinden oluşur. Modern işletim sistemlerinde sanal hafıza yönetimi, grafik kullanıcı arayüzü gibi bileşenler de bulunabilmektedir. Bazı işletim sistemlerinde grafik kullanıcı arayüzü işletim sisteminin bir parçası sayılırken (Windows gibi), genellikle UNIX türevi işletim sistemlerinde bu hizmet X Window System adı verilen harici yazılımlarla sağlanır.

Dos İşletim Sistemi
Minix İşletim Sistemi
Unix İşletim Sistemi
Linux İşletim Sistemi
SME Linux İşletim Sistemi
Pardus İşletim Sistemi
Truva İşletim Sistemi
Windows İşletim Sistemi
Apple/Macintosh İşletim Sistemi
Amiga İşletim Sistemi
İşletim Sistemi Dersleri

Genel bilgiler
Kısa tarihi
Bir betik motorunda neler var?
PHP'nin diğer avantajları
Eksik yönleri neler?
PHP ve diğer betik dillerini ne zaman kullanacaksınız?
Sonuç olarak
Kodlama
Kod yazımı
Okunabilirlik ve girintileme
Noktalı virgül
Yorumlar
Kod yazımı
Veri türleri ve değişkenler
Değişkenler
Tanımlama ve ilklendirme
Veri türleri
Integer
String
Float
Boolean
Gönderimli atama
Çıktılama
echo
Kaçış karakterleri
\n karakteri
\t karakteri
\" ve \' karakterleri
\$ karakteri
\\ karakteri
var_dump()
printf()
Tür dönüşümü
Tür dönüşümü
Boolean türe dönüşüm
String türe dönüşüm
String ifadelerin sayıya dönüşümü
Integer türe dönüşüm
gettype() işlevi
settype() işlevi
Türlerle ilgili işlevler
is_string() işlevi
is_bool() işlevi
is_int() işlevi
is_float() işlevi
is_null() işlevi
is_numeric() işlevi
is_array() işlevi
is_object() işlevi
intval() işlevi
floatval() işlevi
strval() işlevi
empty() işlevi
isset() işlevi
unset() işlevi
Değişkenlerde Gönderimli Atama
Sabitler
define()
const
defined() işlevi
Operatörler
İşlem önceliği
Aritmetik operatörler
Atama operatörleri
Mantıksal operatörler
Artırma ve eksiltme operatörleri
Karşılaştırma operatörleri
Hata operatörü
Diziler
Diziler
Gönderimli atama
Dizi işlevleri
is_array()
unset()
count()
range()
list()
array_key_exists()
array_keys()
array_values()
array_pop()
array_rand()
array_count_values()
array_shift()
array_unshift()
array_search()
array_sum()
array_product()
shuffle()
array_chunk()
array_combine()
array_fill()
array_fill_keys()
array_flip()
array_push()
array_slice()
array_unique()
current()
next()
prev()
end()
key()
each()
reset()
String işlevleri
explode()
implode()
ltrim()
rtrim()
trim()
strlen()
strrev()
strstr()
nl2br()
chr()
ord()
parse_str()
ucfirst()
ucwords()
md5()
sha1()
quotemeta()
Akış denetimi ve döngüler
if
elseif
else
while
do-while
for
continue
break
foreach
Fonksiyonlar
global ve $GLOBALS
Parametre alan fonksiyonlar
Parametreleri gönderimli aktarma
Değer döndüren fonksiyonlar
Değişken fonksiyonlar
Değişir sayıda parametre alan fonksiyonlar
function_exists() işlevi
get_defined_functions() işlevi
Sınıflar
Sınıflar
Sınıf içinde özellik ve metotlara erişmek
Nesne yaratmak
Sınıfları devralmak
Özellik ve metotların görünürlüğü
Sınıf sabitleri
Statik özellik ve metotlar
Kurucular
Yıkıcılar
self
parent
final

Programın, akış içerisinde bir veya birkaç koşul dahilinde belirtilen işleri yapması ya da başka bir gidişata yönlendirilmesi akış denetimi olarak tanımlanabilir. Döngüleri de bir veya birkaç koşul dahilinde, belirtilen işlerin belli oranda tekrarlanması olarak tanımlayabiliriz.

Şu biçimde yazılır:

if bloğunun çalışması için koşul ifadesinin boolean true döndürmesi gerekir. Dönen değer true ise yapılacak işler kısmı devreye girer.

Örnekte değeri 5 olan $a ve değeri 4 olan $b değişkenleri tanımlandı. if bloğunun koşul kısmında $a büyüktür $b şartı koşuldu. Buradan dönen değer true olacağından if bloğunun içindeki echo deyimi çalışacak ve a büyüktür b ifadesi çıktılanacaktır.
Yukarıdaki örnekte olduğu gibi koşul kısmında operatörler kullanılır.

Burada $a′nın $b′den ve $c′nin de $a′dan büyük olması şartı koşuldu. Koşul true değer üreteceğinden echo deyimi devreye girer. Ek bilgi için bkz: Operatörler
Başka bir örnek;

Bu örnekte koşul true değer üreteceğinden ekrana burası çalışır çıktılanır. Başka bir örnek:

Buradaki koşul false değer üreteceğinden if bloğu çalışmaz. Yani if bloğunun içindeki echo deyimi işleme konulmaz. Ek bilgi için bkz: Boolean türe dönüşüm

Bu örnekte $a değişkeninin 2'ye bölümünden kalan 0 (sıfır) ise -yani $a çiftse- şartı koşuluyor. Koşul, true değer üreteceğinden if bloğu çalışır, a çifttir çıktılanır, $a'nın karesi alınır ve son olarak $a değişkeninin değeri (32) çıktılanır.
İç içe if blokları tanımlanabilir.

Örnekte, dıştaki if bloğu çalışır, içteki if bloğunun koşulu olan $a > 10 da true değer üreteceğinden içteki if bloğu da çalışır.

if bloğu dışında ikinci bir koşul tanımlanmasını ve farklı işler yapılmasını sağlar. Şöyle kullanılır:

if bloğundaki koşul true değer üretirse if bloğu çalışır, elseif bloğu kontrol edilmez. Ancak if bloğu false değer üretirse elseif bloğunun koşuluna bakılır. Bu koşul true ise elseif bloğu çalıştırılır, aksi durumda elseif bloğu da es geçilir. Bir örnek:

Burada if bloğunun koşulu false üreteceğinden elseif bloğunun koşulu kontrol edilir, bu koşul da true döndüreceğinden elseif bloğu çalışır. if bloğu true değer üretseydi elseif bloğu hiç kontrol edilmeyecekti. Yani:

Yukarıda if bloğu çalışır, elseif kontrol edilmez.
Birden fazla elseif bloğu tanımlanabilir.

$not değişkeni <= 69 koşuluyla uyuştuğundan ilgili elseif bloğu çalışır ve ekrana Gayretli çıktılanır.
elseif bloklarının içinde yeni if - elseif blokları oluşturulabilir.

Bu örnekte elseif bloğu çalışacaktır ve bu bloğun içindeki echo deyimi (a çifttir) işleme konacaktır. Daha sonra bu bloğun içindeki if deyimi kontrol edilir ancak bu kısım false üreteceğinden işleme konmaz. elseif bloğuna geçilir ama bu blok da false üreteceğinden o da çalıştırılmaz.

if ve elseif bloklarındaki koşullar sağlanmadığında yapılacak işler else bloğu içine alınır. Şu biçimde kullanılır:

else bloğunun herhangi bir koşul ifadesi almadığına dikkat ediniz. Çünkü else bloğu bir koşula bağlı olarak değil, if ve elseif blokları çalışmadığında devreye girer. Örneğin:

Burada if bloğu false üreteceğinden else bloğu çalıştırılır. Başka bir örnek:

Burada ise if ve elseif blokları false sonuç üreteceğinden else bloğu çalıştırılır.
else bloğu içinde if - elseif - else blokları tanımlanabilir.

if - elseif - else bloklarında PHP kipinden çıkıp HTML'e geçilebilir. Bunun için bloklar şu biçimde yazılır:

Bu tip kullanımlarda koşullardan sonra iki nokta üst üste ve tüm bloklardan sonra endif kullanıldığına dikkat ediniz.
Bir örnek:

Bu kullanım genellikle PHP kipinden çıkıp HTML kipine geçmek için kullanılır ancak PHP betiklerinin içinde de kullanılabilir. Örneğin:

switch denetimi, bir değişken veya ifadenin alabileceği değerlere göre farklı işler yapılmasını sağlar. Kullanılış biçimi:

ifade, case deyiminden sonra gelen hangi değerle eşleşiyorsa o bloktaki işlemler yapılır. ifade hiçbir case ile eşleşmiyorsa default bloğu çalıştırılır. Bir örnek:

Burada $wikimedia isimli ve Wikibooks değerli bir değişken ve bu değişkenin değerini temel alan bir switch denetimi tanımlandı. $wikimedia değişkeni, case "Wikibooks" değeri ile eşleşeceğinden bu case bloğu çalıştırılacaktır.
break komutu, eşleşen case bloğundaki işlemler yapıldıktan sonra, switch denetiminden çıkılmasını sağlar. break kullanılmayan bir örnek:

Burada $wikimedia değişkeni ilk case bloğuyla eşleşir. Bu bloktaki işlemler yapılır, ancak break komutu verilmediği için bir sonraki case bloğu da çalıştırılır. İlk bakışta bu bir yanlışlık olarak düşünülse de, aslında istenen şey de olabilir. Başka bir örnek:

Burada $meyve değişkeni portakal, mandalina, elma veya çilek değeri alırsa case çilek: bloğu çalışacaktır. Bunun gibi break komutu kullanmadan gruplamalar yapılabilir.
default bloğu ile ilgili bir örnek:

Burada $a değişkeni herhangi bir case bloğuyla eşleşmeyeceğinden default bloğu çalıştırılır.
switch denetimlerinde, son blokta break komutu kullanılmasına gerek yoktur. Çünkü adı üstünde son bloktur, ondan sonra gelecek herhangi bir case bloğu olmayacaktır.
switch denetimleri şu biçimde de yazılabilir:

Bu söz dizimi, PHP kipinden çıkıp HTML'e geçmek için de kullanılabilir. Örneğin:

Koşul sağlandığı müddetçe birtakım işlerin yapılmasını sağlar. Kullanılış biçimi:

while döngüsü şu mantıkla çalışır:

koşul ifadesi kontrol edilir
koşul sağlanıyorsa while bloğu içindeki işlemler yapılır
Başa dönülür ve koşul kontrol edilir.
koşul hala sağlanıyorsa blok içindeki kodlar çalıştırılır, koşul sağlanmıyorsa döngüden çıkılır
Döngüden çıkabilmek için belli bir noktadan sonra koşulun false değer üretmesi gerekir. Aksi durumda sonsuz döngü oluşur.

Bu örnekte koşul daima sağlanacağından while bloğu içindeki echo komutu daima çalışacak ve bir sonsuz döngü oluşacaktır. Döngünün bir noktadan sonra kırılması gerekir. Örneğin:

Burada değeri 1 olan $a değişkeni tanımlandı ve while döngüsüne koşul olarak $a, 10'dan küçük olduğu müddetçe çalış emri verildi. while bloğu içinde de bir echo komutu verildi ve daha sonra $a nın değeri bir artırıldı. Döngünün her iterasyonunda $a bir artacağından bir müddet sonra -yani $a 10 olduğunda- koşul sağlanamayacak ve döngüden çıkılacaktır. Yukarıdaki örneğin çıktısı:

1
2
3
4
5
6
7
8
9

Döngünün son iterasyonunda $a 10 değerini aldığı için ve 10 < 10 koşulu sağlanamadığı için döngüden çıkılmıştır.
while döngüsü şu biçimde de kullanılabilir:

Veya şöyle:

Kullanılış biçimi:

Şu mantıkla çalışır:

İlk seferde, herhangi bir koşula bakılmaksızın do bloğundaki işlemler yapılır
while deyiminin parantezlerindeki koşul kontrol edilir
koşul sağlanıyorsa do bloğu tekrar çalıştırılır, koşul sağlanmıyorsa döngüden çıkılır.
while döngüsünde olduğu gibi sonsuz döngü oluşmaması için döngünün bir noktadan sonra kırılması gerekir.
Kullanımıyla ilgili bir örnek:

Burada do bloğu ilk seferde sorgusuz sualsiz çalıştırılır. Daha sonra while deyiminin parantezlerindeki koşul'a bakılır. Koşul sağlanmayana kadar do bloğu çalıştırılır. Yukarıdaki örneğin çıktısı:

Karesi: 1
Karesi: 4
Karesi: 9
Karesi: 16
Karesi: 25
Karesi: 36
Karesi: 49
Karesi: 64
Karesi: 81

while döngüsüne benzer. Bir koşul dahilinde birtakım işlerin belli sayıda tekrarlanarak yapılmasını sağlar. Söz dizimi:

ifade1, döngü çalışmaya başladığında çalıştırılır. Daha sonra işleme konmaz.
ifade2, koşul ifadesidir. Döngünün hangi şarta bağlı olarak tekrarlanacağını belirtir.
ifade3, döngünün her iterasyonundan sonra çalıştılır.
Bir örnek:

Bu örnekte, döngüye girildiği anda $a = 1 ataması işleme konur. $a < 10 koşuluna bakılır, koşul sağlanıyorsa döngünün ilk iterasyonu gerçekleşir. $a++ ifadesi çalıştırılır, koşul true değer üretiyorsa ikinci iterasyona geçilir; false değer üretiyorsa döngüden çıkılır. Yurakıdaki örneğin çıktısı:

1
2
3
4
5
6
7
8
9

1'den 15'a kadar tek sayıları çıktılayan basit bir örnek:

Bu döngü ilk çalıştığında $a değişkenine 1 değeri atanır. $a < 15 koşulu sağlandığından döngünün ilk iterasyonu başlar ve echo ile $a′nın değeri çıktılanır ve ilk iterasyon sonlanır. $a += 2 ifadesi işleme konur. Koşula bakılır. Örneğin çıktısı:

1
3
5
7
9
11
13

İç içe for döngüleri tanımlanabilir.

Çıktısı:

dış döngüdeyiz. a = 1
iç döngüdeyiz. b = 1
iç döngüdeyiz. b = 2
iç döngüdeyiz. b = 3
dış döngüdeyiz. a = 2
iç döngüdeyiz. b = 1
iç döngüdeyiz. b = 2
iç döngüdeyiz. b = 3
dış döngüdeyiz. a = 3
iç döngüdeyiz. b = 1
iç döngüdeyiz. b = 2
iç döngüdeyiz. b = 3

for döngüleri şu söz dizimi ile de kullanılabilir:

PHP kipinden çıkıp HTML'e de geçilebilir.

continue deyimi, döngünün o anki iterasyonunun sonlanıp bir sonrakine geçilmesini sağlar.

Çıktısı:

1
2
4
5

Görüldüğü gibi $a 3 değerini aldığında, continue deyiminin etkisiyle ekrana çıktılanmadan bir sonraki iterasyona geçildi.
continue deyimiyle, mevcut döngüde başa dönülebileceği gibi üst döngülerden birine de geçilebilir. Örneğin:

Burada iç içe iki while döngüsü var. Dıştaki döngü çalıştığında dış döngüdeyiz çıktılanır ve $a bir eksiltilir. İçteki döngü çalışmaya başlar ve iç döngüdeyiz çıktılanır. continue 2 deyiminin etkisiyle bir üstteki döngüye (yani dış döngü) geçilir ve bundan sonraki kısım işleme konmaz. Yani echo "burası çalışır mı?" ifadesi hiçbir zaman işleme konmayacaktır. Bir önceki örnekte continue deyimi, for döngüsünde başa dönmemizi sağlamıştı. Buradaki continue 2 ifadesi ise mevcut döngünün bir üstündeki döngünün başına dönmemizi sağladı. Ayrıca içteki while döngüsünün koşulu olan (1) ifadesi kafanızı karıştırdıysa bkz: Boolean türe dönüşüm
Yukarıdaki örneğin çıktısı:

dış döngüdeyiz
iç döngüdeyiz
dış döngüdeyiz
iç döngüdeyiz
dış döngüdeyiz
iç döngüdeyiz
döngülerin dışındayız

break deyimine switch denetiminde değinilmişti. switch bloğundan çıkmayı sağlıyordu. Bu deyim döngülerle de kullanılabilir. Örneğin:

Çıktısı:

7
6
5

Görüldüğü gibi $a 4 değerini aldığında break komutu sayesinde döngü sonlandı ve diğer iterasyonlar işleme konmadı.
break komutu ile mevcut döngüden çıkılabileceği gibi üst döngüden de çıkılabilir. Söz dizimi olarak ifade etmek gerekirse:

Diziler (array) üzerinde döngü kurmaya yarar. İlgili olarak bkz: Diz

Değişkenlerin değerleri birbirlerine aktarılabilir. Değişkenlerin değerleri birbirlerine aktarıldığında, daha sonra o değişkenlerin değerlerinde yapılan değişiklikler diğerini etkilemez:

Burada "a" değerli $char1 ve "b" değerli $char2 isimli iki değişken tanımlandı. 4. satırda $char1 ve $char2 değişkenlerinin değerleri eşitleniyor. 5. satırda $char2 değişkenine "c" değeri veriliyor. Bu durumda $char2 değişkeni "c" değerini gösterirken $char1 değişkeni hala "b" değerini göstermektedir. Bunun nedeni $char1 ve $char2 değişkenlerinin bellekte farklı yeri göstermeleridir.
Eğer istenen şey iki değişkenin de bellekte aynı yeri göstermesi, yani birinde yapılan bir değişikliğin diğerini de etkilemesi ise o zaman gönderimli atamadan yararlanılır. Yine yukarıdaki betiği kullanalım:

Görüldüğü gibi $char2 değişkeninde yapılan değişiklik $char1 değişkenini de etkiledi. Gönderim yapılırken atama işleminin = ile değil =& ile yapıldığına dikkat ediniz.
Gönderimi ortadan kaldırmak için unset() işlevi kullanılır.

Burada 4. satırda gönderimli atama yapılıyor. 7. satırda ise gönderimli atamaya tabi değişkenlerden char2, unset() ile tanımsız kılınıyor ve böylece gönderim de tanımsız oluyor. Yani gönderimli atamayı ortadan kaldırmanın tek yolu, değişkenlerden birini tanımsız kılmaktır.

Diziler, farklı sayıl türlerin birarada tutulabileceği bileşik bir türdür. Dizilerin temelinde anahtar - değer ilişkisi vardır. Yani her anahtar, bir değeri işaret eder. Anahtarlar integer veya string olabilirken değerler integer, string, float, boolean veya bir array (dizi) olabilir.

Yukarıda "a", "b" ve "c" değerlerini tutan bir dizi tanımlanmıştır. Anahtar belirtilmemiştir. var_dump() kullanarak, bu diziyle ilgili bilgilere bakalım:

Çıktısı:

array(3) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
}

Bu çıktıya göre "a" değerinin anahtarı 0, "b" değerinin anahtarı 1 ve "c" değerinin anahtarı 2′dir. Eğer burada olduğu gibi dizi tanımlanırken sadece değerler belirtilirse, dizi anahtarları 0'dan (sıfır) başlar. Yani yukarıdaki örnek şununla eşdeğerdir:

Görüldüğü gibi anahtar ve değer eşlemesinde => işareti kullanılıyor. Değerleri birbirinden ayırırken de virgül kullanılıyor. Bu diziyi echo ile ekrana yazdırmayı deneyelim:

Çıktısı:

Notice: Array to string conversion in dosya.php on line 3
Array

Beklenildiği gibi olmadı. Bunun nedeni dizilerin, indis belirtilmeden echo ile çıktılanamamasıdır. Ama şu çalışır:

a değeri çıktılanacaktır. Burada echo deyimine "$dizi'nin 0. indisindeki değeri çıktıla emri verilmiştir. Bu şekilde anahtarlar belirtilerek, o anahtarların işaret ettiği değerler çıktılanabilir.

Bir örnek:

Çıktısı:

Ankara Türkiye'nin başkentidir.

Başka bir örnek:

Çıktısı:

Portakal en sevdiğim meyvedir.
Pırasa sevmem.

Bir anahtarın değeri şu biçimde değiştirilebilir:

Dizi tanımında anahtar belirtilmediği zaman anahtarların 0'dan (sıfır) başlayacağını biliyoruz. Ancak yalnızca ilk değere anahtar vererek bu değiştirilebilir.

Çıktısı:

array(4) {
  [1]=>
  string(1) "a"
  [2]=>
  string(1) "b"
  [3]=>
  int(12)
  [4]=>
  bool(false)
}

Görüldüğü gibi anahtarlar 1'den başladı.

Başka bir dizi tanımlama yöntemi daha vardır.

Bu tanımlanan dizi, bir önceki örnektekiyle aynıdır.
Dizi tanımlarının uzayıp gitmemesi için girintileme yapılabilir.

Şimdiye dek verilen örnekler tek boyutlu dizi örnekleriydi. Çok boyutlu diziler -yani iç içe diziler- de tanımlanabilir.

Çıktısı:

array(2) {
  ["İl"]=>
  array(3) {
    [0]=>
    string(6) "Ankara"
    [1]=>
    string(8) "İstanbul"
    [2]=>
    string(5) "İzmir"
  }
  ["Plaka"]=>
  array(3) {
    [0]=>
    int(6)
    [1]=>
    int(34)
    [2]=>
    int(35)
  }
}

$dizi dizisinin İl ve Plaka olmak üzere 2 anahtarı vardır ve bu anahtarlar birer dizi barındırır. İçteki dizilerin değerlerine anahtar değer verilmedi. Yani yukarıdaki tanımlama, PHP yorumlayıcısı tarafından, şöyle yapılmış varsayılır:

Dizinin elemanlarına erişip çıktılayalım:

Çıktısı:

Ankara ilinin plaka kodu: 6
İstanbul ilinin plaka kodu: 34
İzmir ilinin plaka kodu: 35

echo deyiminde süslü parantez kullanılması sizi şaşırttıysa bkz: echo deyimi
İç içe diziler şöyle de tanımlanabilir:

Anahtar belirtilmeden atanan değerlerin anahtarları, mevcut en büyük tamsayı anahtarın bir fazlası olur. Tamsayı anahtar yoksa 0 (sıfır) olur.

Boş köşeli parantezler kullanılarak -yani anahtar belirtmeden- diziye yeni değerler eklenebilir.

Boş köşeli parantezler kullanılarak yeni bir dizi de oluşturulabilir.

Dizi indisi olarak değişken belirtilebilir.

İndis olarak sabitler de kullanılabilir.

Çıktısı:

elma

Burada olduğu gibi indis olarak bir sabit verilirse PHP yorumlayıcısı o isimde bir sabit arar. Bulduğu sabitin değerinin, dizi içinde işaret ettiği değeri bulur. Örnekte renk isminde ve kırmızı değerli bir sabit tanımlandı. Alt satırda ise kırmızı anahtarının elma, turuncu anahtarının portakal değerini işaret ettiği bir dizi tanımı var. Son satırda ise echo deyimine sabitin ismi -yani renk- indis olarak veriliyor. Yani aslında echo $dizi["kırmızı"] denmiş oluyor. İlgili olarak bkz: Sabitler
$dizi[renk] ile $dizi["renk"] aynı şey değildir. $dizi["renk"] belirtiminde herhangi bir sabit aranmaz. $dizinin içinde "renk" anahtarlı bir değer aranır.
Stringlerin karakterlerine de dizilerde olduğu gibi erişilebilir.

Stringler ile dizilerin benzeşen tek yanı budur.

Dizilerde gönderimli atama yapılabilir.

Çıktısı:

array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
}
array(4) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
}

İlgili olarak bkz: Değişkenlerde gönderimli atama

Değişkenin dizi olup olmadığına bakar ve mantıksal değer döndürür.

unset() işlevi, değişkenlerle olduğu gibi dizilerle de kullanılabilir.

Çıktısı:

array(2) {
  [0]=>
  string(1) "a"
  [2]=>
  string(1) "c"
}

Bir dizinin eleman sayısını döndürür.

Çok boyutlu dizilerde count() kullanımı:

Belli bir aralıkta tamsayı değerlerden oluşan dizi meydana getirir.

Çıktısı:

array(11) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(2)
  [3]=>
  int(3)
  [4]=>
  int(4)
  [5]=>
  int(5)
  [6]=>
  int(6)
  [7]=>
  int(7)
  [8]=>
  int(8)
  [9]=>
  int(9)
  [10]=>
  int(10)
}

Üçüncü parametre olarak artış miktarı belirtilebilir.

Çıktısı:

array(7) {
  [0]=>
  int(0)
  [1]=>
  int(5)
  [2]=>
  int(10)
  [3]=>
  int(15)
  [4]=>
  int(20)
  [5]=>
  int(25)
  [6]=>
  int(30)
}

Dizi değerlerini, değişkenlere atar.

Başka bir örnek:

list() işlevi, çok boyutlu dizilerle de çalışır.

Bu işlev yalnızca integer anahtarlı dizilerle çalışır.

Bir anahtar dizide var mı diye bakar ve mantıksal bir değer döndürür.

Bir dizideki anahtarları döndürür.

Çıktısı:

array(2) {
  [0]=>
  string(3) "gün"
  [1]=>
  string(4) "saat"
}

array_keys() işlevine dizinin ismi dışında parametre olarak bir değer de verilebilir. Bu verilen değer dizide varsa, ilgili anahtarlar döner.

Çıktısı:

array(3) {
  [0]=>
  int(0)
  [1]=>
  int(3)
  [2]=>
  int(4)
}

Dizideki değerleri döndürür.

Çıktısı:

array(3) {
  [0]=>
  string(6) "Ankara"
  [1]=>
  string(8) "İstanbul"
  [2]=>
  string(5) "İzmir"
}

Dizinin sonundan bir eleman siler.

Çıktısı:

array(2) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
}

Diziden rastgele seçilen değerlerin anahtarlarını döndürür.

Çıktısı şöyle olabilir:

array(2) {
  [0]=>
  int(0)
  [1]=>
  int(2)
}

Görüldüğü gibi $dizi dizisinde 0 ve 2 anahtarlarında tutulan değerler seçilmiş.

Dizideki her bir değerin sayısını döndürür. Değerler, oluşan yeni dizide anahtar durumuna gelir.

Çıktısı:

array(4) {
  ["a"]=>
  int(3)
  [23]=>
  int(1)
  ["b"]=>
  int(1)
  [46]=>
  int(2)
}

Dizinin başından bir elemanı siler ve o elemanın değerini döndürür.

Dizinin son hali:

array(4) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "c"
  [2]=>
  string(1) "d"
  [3]=>
  string(1) "e"
}

array_shift() ile eleman silindiği zaman, dizi yeniden indislenir. Yeniden indisleme esnasında string anahtarlar aynen bırakılır, integer anahtarlar 0′dan başlanarak yeniden indislenir.

Çıktısı:

array(5) {
  [3]=>
  string(1) "a"
  [14]=>
  string(1) "b"
  [5]=>
  string(1) "c"
  [8]=>
  string(1) "d"
  [16]=>
  string(1) "e"
}

Şimdi array_shift() kullanalım ve dizi bilgilerine tekrar bakalım:

Çıktısı:

array(4) {
  [0]=>
  string(1) "b"
  [1]=>
  string(1) "c"
  [2]=>
  string(1) "d"
  [3]=>
  string(1) "e"
}

Görüldüğü gibi dizi yeninden indislendi. Bir önceki çıktıyla karşılaştırınız.

Dizinin ön kısmına değer ekler.

Çıktısı:

array(4) {
  [0]=>
  string(9) "Wikipedia"
  [1]=>
  string(9) "Wikiquote"
  [2]=>
  string(9) "Wikibooks"
  [3]=>
  string(10) "Wikisource"
}

Bir değeri bir dizi içinde arar, bulursa değerin anahtarını; aksi durumda false döndürür.

array_search() işlevi, üçüncü parametre olarak boolean bir değer de alır. Bu değer, karşılaştırma esnasında türlerin de dikkate alınmasını sağlar. Örneğin:

İlgili olarak bkz: Veri türleri ve Tür dönüşümü

Bir dizideki değerlerin toplamını hesaplar.

Bir dizideki değerlerin çarpımını hesaplar.

Dizinin elemanlarını karıştırır.

Örnek çıktı:

array(5) {
  [0]=>
  string(1) "f"
  [1]=>
  string(1) "a"
  [2]=>
  int(2)
  [3]=>
  int(1)
  [4]=>
  int(4)
}

Diziyi parçalara böler.

Çıktısı:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
  }
  [1]=>
  array(2) {
    [0]=>
    string(1) "c"
    [1]=>
    string(1) "d"
  }
  [2]=>
  array(1) {
    [0]=>
    string(1) "e"
  }
}

Üçüncü parametre olarak true verilirse değerlerin anahtarları korunur.

Çıktısı:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
  }
  [1]=>
  array(2) {
    [2]=>
    string(1) "c"
    [3]=>
    string(1) "d"
  }
  [2]=>
  array(1) {
    [4]=>
    string(1) "e"
  }
}

Görüldüğü gibi değerler, anahtarları korunarak bölündü. Bir önceki çıktıyla karşılaştırınız.

Anahtarların tutulduğu bir diziyle, değerlerin tutulduğu bir diziyi anahtar => değer ilişkisiyle birleştirir.

Çıktısı:

array(3) {
  ["Asya"]=>
  string(3) "Çin"
  ["Afrika"]=>
  string(5) "Mısır"
  ["Amerika"]=>
  string(7) "Meksika"
}

Diziye değer doldurur.

Çıktısı:

array(4) {
  [3]=>
  string(1) "a"
  [4]=>
  string(1) "a"
  [5]=>
  string(1) "a"
  [6]=>
  string(1) "a"
}

Belirtilen anahtarları değerle doldurur ve bir dizi döndürür.

Çıktısı:

array(5) {
  [3]=>
  string(1) "a"
  ["anahtar"]=>
  string(1) "a"
  [12]=>
  string(1) "a"
  ["başka anahtar"]=>
  string(1) "a"
  ["son anahtar"]=>
  string(1) "a"
}

Anahtarlarla değerlerin yerini değiştirir.

Çıktısı:

array(3) {
  ["Çin"]=>
  string(4) "Asya"
  ["Mısır"]=>
  string(6) "Afrika"
  ["Meksika"]=>
  string(7) "Amerika"
}

Dizinin sonuna eleman ekler.

Çıktısı:

array(5) {
  [0]=>
  string(6) "Avrupa"
  [1]=>
  string(4) "Asya"
  [2]=>
  string(6) "Afrika"
  [3]=>
  string(10) "Antarktika"
  [4]=>
  string(7) "Amerika"
}

Dizinin belli bir bölümünü döndürür.

Çıktısı:

array(4) {
  [0]=>
  string(1) "e"
  [1]=>
  string(1) "f"
  [2]=>
  string(1) "g"
  [3]=>
  string(1) "h"
}

Üçüncü parametre olarak alınacak değer sayısı da belirtilebilir.

Çıktısı:

array(2) {
  [0]=>
  string(1) "e"
  [1]=>
  string(1) "f"
}

Dördüncü parametre olarak true belirtilirse, değerler anahtarlarıyla birlikte alınır.

Çıktısı:

array(2) {
  [

Fonksiyonlar, belli işleri yapan ve programın gereken yerlerinde çağrılarak bu işleri yerine getiren kod blokları olarak tanımlanabilir. Söz dizimi şu biçimdedir:

Görüldüğü gibi fonksiyon tanımlanırken function anahtar sözcüğü kullanılıyor ve bu anahtar sözcükten sonra fonksiyonun ismi belirtiliyor. Fonksiyonların isimlendirilmesi, değişkenlerle aynı kurallara tabidir. Bkz: Değişkenler
Şimdi, echo deyimi ile Vikikitap sözcüğünü çıktılayan yazdir isimli bir fonksiyon tanımlayalım:

Fonksiyonu tanımladık. Ancak fonksiyonumuz bu haliyle herhangi bir işi yerine getirmiyor. Çünkü fonksiyonu program içerisinde çağırmadık. Şimdi son satırda fonksiyonu çağıralım:

Görüldüğü gibi yazdir() söz dizimiyle, tanımlı fonksiyonumuzu son satırda çağırdık. Bu sayede fonksiyon çalıştırılacak ve ekrana Vikikitap çıktılanacaktır.
İç içe fonksiyon tanımları yapılabilir:

Burada mekan ve dil isimli iç içe iki fonksiyon tanımlandı. Şimdi bu fonksiyonları program içerisinde çağıralım.

Programımızın son iki satırında, fonksiyonlar çağrıldı ve çalışmaları sağlandı. İç içe yapılan fonksiyon tanımlarında dikkat edilmesi gereken bir durum var. İçteki fonksiyona erişebilmek için, dıştaki fonksiyonun öncelikli olarak çağrılması gerekir. Yani:

Tanımladığımız bir fonksiyonun içinde, ana betikte tanımlı bir değişkeni kullanmayı deneyelim.

Burada yazdir fonksiyonunun içinde, ana betikte tanımlı $mekan değişkenine erişmeye çalışılıyor. Ancak bu hatalıdır çünkü $mekan değişkeninin faaliyet alanı ana betiktir. PHP yorumlayıcısı yazdir fonksiyonunu çalıştırdığında ve echo $mekan komutuyla karşılaştığında, yazdir fonksiyonu içinde tanımlı bir $mekan değişkeni arar ve bulamadığı için hata verir. Ama bu, ana betikte tanımlı değişkenlere fonksiyonlardan asla erişilemez anlamına gelmiyor. Tekrar deneyelim:

Şimdi yazdir fonksiyonu düzgün bir biçimde görevini yerine getirecektir. Çünkü global $mekan komutuyla, ana betikte tanımlı $mekan değişkenini kullanmak istediğimizi bildirdik. Başka bir örnek:

Bu örnekte de global anahtar sözcüğünü kullanarak ana betikte tanımlı değişkenleri carp fonksiyonu içinde çarpma işlemine soktuk.
global yerine, bir süper küresel olan $GLOBALS de kullanılabilir. Bir örnek:

Bu örnek de bir öncekiyle aynı işi yapıyor ancak bu sefer $GLOBALS süper küreseli kullanıldı.
Fonksiyon içinde tanımlı değişkenlerin faaliyet alanı, fonksiyon bloğu ile sınırlıdır. Yani:

Örnekte bilgi fonksiyonunda tanımlı $mekan değişkenine fonksiyon dışından erişilmeye çalışıyor ancak fonksiyon dışından $mekan değişkenine erişilemez.

Fonksiyonlara, çağrıldıkları anda bazı değerlerin gönderilmesi ve bu değerlerin fonksiyon içinde kullanılması istenebilir. Parametreler, fonksiyon isminden sonraki parantezlere yazılır.

Yukarıda ismi topla olan, aynı zamanda $deger1 ve $deger2 isminde iki adet parametre alan bir fonksiyon tanımlandı. Şimdi bu fonksiyonu program içerisinde çağıralım.

Son satırda fonksiyon çağrılırken, 2 ve 3 değerleri parametre olarak gönderildi. Yani $deger1 parametresi 2 değerini alırken $deger2 parametresi de 3 değerini aldı ve bu değerler daha sonra fonksiyon içerisinde kullanıldı.
Parametre alan fonksiyonlar çağrılırken parametre sayısına uygun olarak değer gönderilmesi gerekir. Örneğin:

Bu hatalıdır çünkü topla fonksiyonu iki parametre alırken, çağrıldığı esnada yalnızca bir değer gönderiliyor.
Parametrelerin uygun sayıda gönderilmesi kadar, parametrelere uyan değerlerin gönderilmesi de önemlidir. Örneğin:

Örnekte parametre olarak aldığı iki değeri ekrana çıktılayan bir fonksiyon tanımlandı ve programın son satırında parametre olarak "PHP" ve "Vikikitap" değerleri gönderildi ve fonksiyon çağrıldı. Fonksiyonun çıktısını inceleyelim:

Mekan: PHP
Konu: Vikikitap Programlama Dili

Görüldüğü gibi, parametrelere uyan değerler gönderilmediği için çıktı da olması gerektiği gibi olmadı.
Fonksiyon parametrelerine öntanımlı değerler verilebilir. Örneğin:

Burada $konumuz parametresine öntanımlı olarak "PHP" değeri verildi. Bu parametre öntanımlı değere sahip olduğundan son satırda fonksiyon çağrılırken yalnızca $nerdeyiz parametresinin alacağı değer gönderildi.
Çıktısı:

Mekan: Vikikitap
Konu: PHP Programlama Dili

Başka bir örnek:

Bu örnekte ise $konumuz parametresinin öntanımlı değeri yerine fonksiyon çağrılırken "C#" değeri gönderildi. Fonksiyon çağrılırken değer gönderildiği için $konumuz parametresi öntanımlı değerini değil "C#" değerini kullanacaktır.
Çıktısı:

Mekan: Vikikitap
Konu: C# Programlama Dili

Öntanımlı değer alan parametrelerin, öntanımlı değeri olmayan parametrelerden sonra yazılması gerekir. Aksi durumda bu bir karışıklığa yol açar. Yani:

Çıktısı:

Warning: Missing argument 2 for bilgi(), called in dosya.php on line 7 and defined in dosya.php on line 2

Notice: Undefined variable: nerdeyiz in dosya.php on line 4
Mekan:
Konu: Vikikitap Programlama Dili

$konumuz parametresinin öntanımlı değerini kullanacağımız için değer göndermedik. $nerdeyiz parametresinin değeri olan "Vikikitap" değerini gönderirken PHP yorumlayıcısı $konumuz parametresinin değerini gönderdiğimizi sandı ve bu bir karışıklığa neden oldu.

Parametre olarak aldığı değişkenin değerini karesiyle değiştiren bir fonksiyon tanımlayalım.

Buraya kadar her şey tamam. Şimdi ana betikte, fonksiyonu çağırdıktan sonra ana betikteki $sayi değişkeninin değerine bakalım.

Fonksiyon içerisinde karesiyle değiştirmemize rağmen $sayi değişkeni hala 5 değerini tutuyor. Şimdi fonksiyon tanımında $deger parametresini gönderimli hale getirip tekrar deneyelim.

Görüldüğü gibi $sayi değişkeni artık 25 değerini tutuyor çünkü $deger parametresi gönderimli olarak tanımlandı. İlgili olarak bkz: Değişkenlerde gönderimli atama

Bir fonksiyondan geriye değer döndürmek için return deyimi kullanılır.

kare fonksiyonu bir parametre alıyor ve aldığı parametreyi kendisiyle çarparak işlem sonucunu döndürüyor. Örnekte 5 değerli $sayi değişkeni tanımlandı. Daha sonra $sayi değişkeni kare fonksiyonuna parametre olarak gönderildi ve dönen değer $sayi değişkenine atandı. Başka bir örnek:

return deyimi yalnızca değer döndürmek için değil, fonksiyonun çalışmasını durdurmak için de kullanılabilir. Örneğin:

Burada $mekan parametresinin değeri "Vikikitap" değilse; fonksiyonun çalışması duracak, geri kalan kısım işleme konmayacak ve geriye NULL değer dönecektir.
Öntanımlı değere sahip parametreler de gönderimli aktarılabilir.

Bir değişken isminin sonunda parantezler varsa değişkenin tuttuğu değerle aynı isimde bir fonksiyon aranır ve çalıştırılır. Örneğin:

Başka bir örnek:

Parametre olarak gönderilen değer sayısı, her çağrılışta değişen fonksiyonlar da tanımlanabilir.

Çıktısı:

Parametre sayısı 3
Birinci parametre: a
İkinci parametre: b
Üçüncü parametre: c

func_num_args() işlevi, parametre olarak aktarılan değerlerin sayısını döndürür. func_get_arg(n) işlevi ise, gelen parametlerden n'inci sıradakinin değerini döndürür.
func_get_args() işlevi ise, alınan parametreleri bir dizi olarak döndürür.

İlgili olarak bkz: Diziler ve foreach döngüsü

Kaçıncı kez çağrıldığı hakkında bilgi veren bir fonksiyon örneği:

Çıktısı:

1. kez çağrıldı
2. kez çağrıldı
3. kez çağrıldı

Görüldüğü gibi static olarak tanımlanan değişkenler, fonksiyon bloğu sonlansa bile mevcut değerlerini koruyor.

Bir fonksiyonun tanımlı olup olmamasına göre mantıksal bir değer döndürür.

Çıktısı:

fonk1 tanımlı
fonk2 tanımlanıyor
fonk2 tanımlandı
fonk1 çağrıldı
fonk2 çağrıldı

Tanımlı fonksiyonları bir dizi olarak döndürür.

Çıktısı:

array(2) {
  ["internal"]=>
  array(1425) {
    [0]=>
    string(12) "zend_version"
    [1]=>
    string(13) "func_num_args"
    [2]=>
    string(12) "func_get_arg"
    [3]=>
    string(13) "func_get_args"
    [4]=>
    string(6) "strlen"
    ...
    ...
    ...
    [1422]=>
    string(32) "xmlrpc_parse_method_descriptions"
    [1423]=>
    string(36) "xmlrpc_server_add_introspection_data"
    [1424]=>
    string(45) "xmlrpc_server_register_introspection_callback"
  }
  ["user"]=>
  array(2) {
    [0]=>
    string(5) "topla"
    [1]=>
    string(4) "carp"
  }
}

internal indisinin alt dizisi, mevcut PHP fonksiyonlarını içerirken, user indisinin alt dizisi kendi tanımladığımız fonksiyonları içerir.

Açılımı Personal Home Page (Kişisel Web Sayfası) olan PHP, ilk kez Rasmus Lerdorf tarafından, web sayfalarını ziyaret edenleri izlemek amacıyla bir dizi Perl Script (betik) kullanılarak geliştirilmişti. İnsanlar kısa zamanda bununla ilgilenmeye ve bu konuyla ilgili sorular sormaya başladıklarında, Rasmus kararını verdi ve bir betik motoru oluşturdu. Ayrıca formlara da destek verdi ve böylece PHP/F1'i biçimlendirmiş oldu. Adını duyurdukça bir grup yazılım geliştiricinin dikkatini çekti ve böylece bir API oluşturuldu ve PHP3 ortaya çıktı. Daha sonraları yeniden ele alınması gerekti ve Zend motoru PHP4'ü yaratmış oldu. Artık PHP önünde pek engel bulunmuyordu, PHP Hypertext Processor fetihlere çıkmaya hazırdı.

PHP gibi bir betik motorunun verimliliğini en yüksek düzeye çıkartan 4 temel etmen bulunuyor. Bunlar; Hız, İstikrar, Güvenlik ve Basitlik olarak sayılabilir.
Hız - Uygulama hızı önemlidir tabii ki, ancak bununla birlikte bilgisayarın diğer fonksiyonları yavaşlamamalıdır. Bu nedenle bir sürü sistem kaynağına gerek duymamalıdır. PHP, özellikle Unix tabanında çalışıyorsa, diğer yazılımlarla iyi uyum sağlamaktadır, az yer kaplar ve bir web sunucu (Apache vb.) modülü olarak çalıştırıldığında hemen kullanıma geçer.
İstikrar - Birkaç bin sayfalık bir işte, sistem çöküyorsa hızın pek bir anlamı kalmayacaktır. Her uygulamanın hata sorunu vardır. Ancak bir grup yazılım geliştiriciden oluşmuş topluluğa sahip uygulama söz konusuysa, işler biraz değişir, ve böcek (bug) olarak tabir edilen hatalar saklanacak pek bir delik bulamaz. Bunun yanı sıra PHP kendi işletim sistemi kaynaklarını kullanıyor ve veri transferi ve denetiminde çok başarılı ve kompleks bir yöntem getiriyor.
Güvenlik - Sistemin bazı saldırgan tavırlı kullanıcılara karşı korunması zaruridir. PHP istenilen düzeyde .ini dosyaları olarak kurulabilen farklı güvenlik düzeylerine sahiptir.
Basitlik - Programcıların uygulama üzerinde hızlı bir biçimde üretime geçmeleri gerekmektedir. PHP üzerinde, HTML kodlamacıları hiç zorlanmadan web sayfalarını yazmaya başlayabilir. C dilinde deneyim sahibi olan programcılar, hatta javascript kullananlar kısa bir sürede hızlanabilirler. Ayrıca bağlanabilirlik de PHP'nin artılarından biridir. Modül uzantılar sistemi çeşitli kütüphanelerle (veritabanları) kolayca arabirim oluşturabiliyor. Dahası yeni uzantılar eklemek çok kolay.

PHP hemen hemen her platformda çalışabiliyor. PHP aynı kod temelini kullandığı için, UNIX, Windows (95/98/NT/2000) ve Mac OS dahil olmak üzere 25 platformda derlenip kurulabiliryor. Kodların büyük çoğunluğu aynı olduğundan kodlar küçük değişiklikler ile istenilen tüm platformlarda çalışır hale getirilebiliryor.
PHP, uzantı alabilmektedir. Uygulamanın içerisinde yer alan çekirdek motor (Zend tarafında yazıldı), bir dizi asal kod modüllerinden ve kod uzantılarından oluşmaktadır. Bu nedenle programcılara PHP uzantıları yaratarak bazı özel işlemlerini yapabilmeleri için iki seçenek sunuluyor; ya uzantı modüllerini yazarak uygulanabilen bir derleme yapmak, ya da PHP'nin dinamik yükleme mekanizmasıyla yüklenebilecek uygulanabilir uzatmalar yaratmak.
PHP pek çok HTTP server arayüzü barındırıyor. PHP Apache'ye, AOL server'a, Roxen ve THTTPD'ye doğrudan yüklenebiliyor. Alternatif olarak CGI modülü olarak da kullanılabilir.
PHP pek çok veritabanı arayüzü bulunduruyor. PHP, MySQL, MS SQL, Oracle, Informix, PostgreSQL ve diğerleriyle doğrudan çalışabiliyor. Bunlar ikili sayı düzenindeki arayüzlerden oluşmaktadır ve bu çözümler için veritabanının desteklenmediği yerlerde ODBC desteği sağlıyor.
Bir PHP kullanıcısı herhangi bir kütüphane için arayüz oluşturmakta zorluk çekmez. Pek çok kullanıcı bu yolu seçmiş, grafik rutinleri, PDF dosyaları, Flash Movie'leri, Cybercash cetvelleri, XML, IMAP, POP ve diğerleriyle ilgili modüller bulabilmiştir.
PEAR, PHP'nin uzantısı ve Add-on deposudur. Pear, Perl için geliştirilen CPAN'e benzemektedir. Halen başlangıç aşamasında olmasına rağmen PEAR, PHP'nin kurulumuyla birlikte gelecek bir dizi PHP betiğini kullanıma sunmaktadır.
PHP bir açık kod uygulamasıdır ve pek çok profesyonel kullanıcı için çok şey ifade etmektedir. Basitçe açıklamaya çalışırsak PHP kullanıcıyı, çalışmayan uygulamalar için üretici firmanın keyfini beklemekten, her yıl sistemini belli paralar ödeyerek güncelleme zorunluluğundan kurtarmaktadır.

Hata denetimi Cold Fusion ya da ASP uygulamasındaki kadar etkili değil. Tanınmış iyi bir IDE ve debugger uygulaması bulunmuyor. IDE'nin pek çok kullanıcı için fazla bir önemi yok. Ancak debugger Zend tarafından yakın gelecekte geliştirilecek.

Eğer bir UNIX ya da Linux platformu üzerinde iş görüyorsanız, Perl ve PHP, her ikisi de çalışmalarınız için ideal. Her ikisi de başlangıç aşamasında script yazmayı kolaylaştırıyor. Windows platformundaysa ASP ve Cold Fusion egemenliği bulunuyor. Aslında buradaki tercih teknik olmasından çok politik sayılır. ASP ile IIS mühtemelen PHP ile IIS'den daha iyi. Ancak tamamen teknik bir altyapıda PHP, Windows NT üzerinde, diğer platformlardaki performansına ulaşmakta.

Sıklıkla olduğu gibi PHP'nin geliştirilmesi de neredeyse tesadüf eseri olmuştur. Bir kullanıcının betik yazılım denemeleri, daha sonra pek çok programcının gereksinimlerini karşılayacak, hızlı, kullanışlı ve kolay uygulanabilen bir betik diline dönüştü. Son üç yıl içerisinde kaydettiği gelişmelerle PHP sunucu dünyasında ciddi bir rol almış durumda. Apache, MySQL, PHP üçlüsü İnternet dünyasında vazgeçilmez bir paket haline geldi. Bu paket hızlı, dinamik ve veri tabanlı site ve portal inşaasında bir numara olmaya aday...

PHP betikleri, açılış etiketinden başlanıp kapanış etiketine kadar PHP yorumlayıcısı tarafından işleme sokulurlar. Açılış ve kapanış etiketlerinin dışında kalan kısımlar, PHP yorumlayıcısı tarafından es geçilir.

Yukarıdaki kod parçasındaki span HTML etiketi PHP yorumlayıcısı tarafından es geçilir. <?php açılış etiketinden başlanıp ?> kapanış etiketine kadar olan kısımlar ise PHP yorumlayıcısı tarafından işleme sokulur. Bu durumda, son satırdaki span kapanış etiketi de yorumlayıcı tarafından es geçilecektir.

PHP'de, zorunlu bir kodlama standardı yoktur.

Aynı kod şöyle de yazılabilirdi:

Yukarıdaki kodların ikisi de geçerlidir. Yani beklendiği gibi çalışır. Çünkü PHP yorumlayıcısı birden çok boşluğu, tab (sekme) ve satır sonu karakterlerini boşluk olarak ele alır.
Denildiği gibi iki kod da istenildiği gibi çalışır. Ancak ilk örneğin, iyi bir kodlama stiline sahip olduğu söylenemez.

Herhangi bir programın istenen işi yapması, onun verimli bir program olması için yeterli değildir. Ayrıyeten birçok etken vardır. Bu etkenlerden biri okunabilirliktir. Kodlar, okunabilirliği artırmak adına belli bir standarda göre girintilenerek yazılmalıdır. Buna girintileme veya hizalama denir.

Örneğin yukarıdaki kod parçasında iç bloklar ve deyimler girintilenerek yazılmıştır. Bunun gibi girintilenerek yazılan kodlar, yapılan işin daha kolay algılanmasını sağlar. İlerleyen konularda, yazılan kodlar uzadıkça ve işin içine denetim ifadeleri, döngüler, fonksiyonlar vb. girince girintilemenin önemi daha iyi anlaşılacaktır.
Girintileme yapmak için klavyedeki tab (sekme) adı verilen tuş veya 4 adet boşluk kullanılır. Zaten tab tuşu da genellikle 4 adet boşluğa denk gelir ancak bu durum kullanılan IDE veya metin editörü ne bağlı olarak değişebilir. Tab tuşunun kaç adet boşluk bırakacağı IDE veya metin editörünün ayarlarından değiştirilebilir.

PHP'de noktalı virgülün işlevi deyimleri birbirinden ayırmaktır. Az önce belirtildiği gibi PHP sekmeleri (tab), birden fazla boşluğu ve satır sonlarını birer boşluk olarak ele alır. Bu durumda, deyimlerin karışmaması ve PHP yorumlayıcısının yazılan kodları düzgün bir biçimde işleme koyabilmesi için noktalı virgül kullanılır.

Yukarıdaki kod parçasında iki adet echo deyimi vardır ve bu deyimlerden sonra birer noktalı virgül konulmuştur. Noktalı virgüller, ilgili deyimin veya komutun sonuna gelindiğini belirtir.

PHP'de ikisi tek satırlık, biri de çok satırlı olan 3 tane açıklama tarzı vardır.

Tek satırlı yorumlar için , # (diyez işareti) veya // (iki adet bölü işareti) kullanılır. Çok satırlı yorumlar ise /* ile başlar ve */ ile sonlanır.
Yorumlar, kodları yazana ve okuyana kolaylık sağlar. Yazdığımız programlardaki yorumlar, o programlara sonradan baktığımızda orada yapılan işi hatırlamamızı sağlar. Aynı şekilde yazdığımız kodlar, başkası tarafından okunduğunda da okuyan kişiye bilgi vermesi açısından önemlidir. Ama yorum satırlarının bunun dışında bir işlevi daha vardır. Örneğin yazdığımız programdaki herhangi bir işe henüz tam karar vermemişsek veya yazılan bir komutun henüz işleme konulmasını istemiyorsak yine yorum satırlarından yararlanabiliriz.

Yukarıdaki kod parçasında, // tek satırlık yorumu bu amaçla kullanılmıştır. PHP yorumlayıcısı, bu satırı açıklama olarak görecek ve echo deyimini işleme sokmayacaktır.

Bir veya birden fazla değer arasında gerçekleştirilecek işlemleri temsil eden simge ya da sözcüklere operatör veya işleç denir. Örneğin matematikte kullandığımız + (artı), - (eksi), * (çarpı), / (bölü) gibi semboller PHP'de birer operatördür. Aynı şekilde mantıksal (bkz: Sembolik mantık) işlemlerde kullanılan && ile and ve || ile veya sembol ve sözcükleri de birer operatördür. Bunların dışında, başka görevler üstlenen operatörler de vardır. Operatörlerle işleme sokulan ifadelere operand denir.
Matematikte olduğu gibi operatörlerin de farklı öncelik değerleri vardır.

Yukarıdaki işlem sonucu echo ile çıktılanacak değer 22 olacaktır. Çünkü çarpma işlemi, toplamaya göre yüksek önceliklidir. Yani önce çarpma işlemi, sonra toplama işlemi yapılır. Ancak işlem önceliğine müdahale etmek de mümkündür.

Bu durumda echo ile çıktılanacak değer 30 olacaktır çünkü toplama işlemi parantezler ile önceliğe alınmıştır. Burada olduğu gibi parantezler işlem önceliğini düzenlemek adına kullanılabilir.
Matematikte olduğu gibi PHP operatörlerinin de kendi aralarında işlem öncelikleri vardır. Aşağıdaki tablo, operatörlerin işlem öncelikleri hakkında bilgi veriyor. Bu tablo, mevcut bilgilerimizle şu an için bir şey ifade etmiyor olabilir ancak tüm operatörlerin açıklamaları okunduktan sonra dönüp bakıldığında daha iyi anlaşılacaktır.

Operatörler, en yüksek öncelikliden en düşük öncelikliye doğru işlem yönleriyle sıralanmıştır.

Bölme işleminden dönen değer, operandlar tam bölünüyorsa integer; aksi durumda daima float türündedir. Integer değer elde etmek için dönen değerde tür çarpıtma veya yuvarlama uygulanmalıdır.
Kalan bulma ( % ) işleminde her iki operand float türünde olsa bile dönen değer integer olur.

Kalan bulma ( % ) işleminde bölünen görevindeki operand negatif ise kalan da negatif olur.

Atama operatörü = (eşittir) işaretidir. Temel görevi sağdaki değeri soldakine atamaktır.

Bu tip atamalar kısaltılarak da yazılabilir. Örneğin:

String veri türünden bildiğimiz nokta operatörü de atama operatörüyle kullanılabilir.

Aşağıda && operatörüyle ilgili örnekler verilmiştir.

Aşağıda || operatörüyle ilgili örnekler verilmiştir.

and ile && operatörleri aynı karşılaştırmayı yapar ancak öncelikleri farklıdır. Aynı durum or ile || operatörleri için de geçerlidir.

Son satırda true dönmesinin nedeni işlem önceliğidir. Çünkü = (atama operatörü), and operatöründen daha önceliklidir. Bir de or ve || operatörleri için bakalım:

Son satırda false dönmesinin nedeni de işlem önceliğidir. İşlem önceliği tablosuna bakılırsa = (atama) operatörünün or operatöründen daha öncelikli olduğu görülür.
Son olarak xor operatörüyle ilgili örnekler:

xor operatörü = (atama) operatöründen düşük öncelikli olduğu için son satırda sonuç false olmuştur.

Önceden eksiltme ve artırma ile ilgili örnekler:

Sonradan eksiltme ve artırma ile ilgili örnekler:

Karşılaştırma işlemlerinde sayıl değer ile karakter dizisi karşılaştırılıyorsa karakter dizisi sayıya dönüştürülür ve karşılaştırma buna göre yapılır. Aynı şekilde, sayıl değere sahip karakter dizileri karşılaştırılıyorsa karakter dizileri yine sayıya dönüştürülür ve karşılaştırma buna göre yapılır. === (aynıdır) ve !== (farklıdır) karşılaştırmalarında, operandların türleri de karşılaştırılacağından tür dönüştürme yapılmaz.

Burada karşılaştırma sonucunun true (doğru) çıkmasının nedeni $b değişkeninin karşılaştırma esnasında sayıya dönüştürülmesidir.

Burada "10" değerine sahip $b stringi, 10 olarak integer türüne dönüşmüştür ve sonuç doğru olmuştur. Ek bilgi için bkz: String ifadelerin sayıya dönüşümü

Burada ise aynılık karşılaştırması yapılıyor. $a integer, $b string türüne sahip olduğu için sonuç false (yanlış) olmuştur.

@ (kuyruklu a) operatörü, hata denetimi yapar. Bu operatör, bir deyimin önünde kullanıldığında, oluşabilecek hatalar görmezden gelinir. Bu hatalar, $php_errormsg değişkeninde saklanır. @ operatörü, sonucunda bir değer elde edilen deyimlerle kullanılabilir.

Sabitler, değişkenler gibi bir değer tutar. Ancak değişkenler gibi değerleri değiştirilemez. Yani bir sabit bir kez tanımlandıktan ve bir değer aldıktan sonra değeri programın herhangi bir yerinde değiştirilemez veya tanımsız hale getirilemez. Sabitler boolean, integer, float ve string türünde değer alabilir. Sabitler isimlendirilirken, değişkenlerdeki gibi $ işareti kullanmaya gerek yoktur.

Sabitler define() işlevi ile tanımlanır ve programın her yerinden erişilebilirler.

Burada "admin" değeri alan KULLANICI isimli ve "123456" değeri alan PAROLA isimli iki sabit tanımlandı.

Sabitler define() işlevi dışında, const deyimiyle de tanımlanabilir.

const ile tanımlanan sabitlerin isimlerinin tırnak içinde yazılması gerekmez. define() ile tanımlanan sabitlerle bir istisna dışında aynı kurallara tabidir ve aynı özellikleri taşır. Bir sabit define() ile programın herhangi bir yerinde tanımlanabilirken const ile tanımlanan sabitler; fonksiyonlar, akış denetimleri, döngüler gibi iç bloklarda değil programın en üst seviyesinde tanımlanmalıdır. Bunun nedeni const ile tanımlanan sabitlerin derleme zamanı ele alınmasıdır.

defined() işlevi, bir sabitin tanımlı olup olmadığına bakar ve geriye mantıksal (boolean) bir değer döndürür.

defined() işlevi, const ile tanımlanan sabitlerle de kullanılabilir.

Bir string ifade veya değişkeni belli bir ifadeye göre parçalara ayırır ve dizi oluşturur.

Çıktısı:

array(3) {
  [0]=>
  string(5) "panel"
  [1]=>
  string(9) "kullanici"
  [2]=>
  string(5) "giris"
}

İsteğe bağlı ikinci bir parametre daha alır. Parçalama sonucu oluşacak dizi, bu parametre kadar eleman içerir. Örneğin parametre 3 ise ilk 3 eleman parçalanıp alınırken diğerleri olduğu gibi alınır. Parametre negatifse son eleman yok sayılır.

Çıktısı:

array(3) {
  [0]=>
  string(1) "c"
  [1]=>
  string(3) "c++"
  [2]=>
  string(23) "java c# perl php python"
}

Çıktısı:

array(6) {
  [0]=>
  string(1) "c"
  [1]=>
  string(3) "c++"
  [2]=>
  string(4) "java"
  [3]=>
  string(2) "c#"
  [4]=>
  string(4) "perl"
  [5]=>
  string(3) "php"
}

Görüldüğü gibi son parametre negatif olduğu için son eleman alınmadı.

Bir dizinin elemanlarını belli bir ifadeye göre birleştirip karakter dizisi (string) oluşturur.

Çıktısı:

c.c++.java.c#.perl.php.python

Bir karakter dizisinin başındaki şu karakterleri siler:

" " (boşluk)
\0 (NULL karakter)
\n (satır sonu karakteri)
\t (yatay tab [sekme] karakteri)
\v (dikey tab [sekme] karakteri)
\r (satır başı karakteri)

$lang değişkeninin:

ilk hali:    c c++ java c# perl php python
son hali: c c++ java c# perl php python

ltrim() işlevine, parametre olarak bir ifade de verilebilir.

$lang değişkeninin:

ilk hali: ^^^c c++ java c# perl php python
son hali: c c++ java c# perl php python

Bir karakter dizisinin sonundan şu karakterleri siler:

" " (boşluk)
\0 (NULL karakter)
\n (satır sonu karakteri)
\t (yatay tab [sekme] karakteri)
\v (dikey tab [sekme] karakteri)
\r (satır başı karakteri)
Kullanım stili ltrim() işlevi ile aynıdır.

Karakter dizisinin her iki tarafından şu karakterleri siler:

" " (boşluk)
\0 (NULL karakter)
\n (satır sonu karakteri)
\t (yatay tab [sekme] karakteri)
\v (dikey tab [sekme] karakteri)
\r (satır başı karakteri)

İkinci bir parametre olarak bir ifade de verilebilir.

Karakter dizisinin uzunluğunu döndürür.

Bir karakter dizisini ters çevirir.

Karakter dizisindeki belli bir ifadeden sonraki kısmı alır.

Üçüncü parametre olarak true verilirse önceki kısmı alır.

Karakter dizisindeki \n satır sonu karakterini HTML satır sonu karakteri olan <br /> etiketiyle değiştirir.

Kaynak kod çıktısı:

PHP<br />
Programlama Dili

ASCII numarası verilen bir karakter döndürür.

İlgili olarak bkz: ASCII tablosu

Bir karakterin ASCII numarasını döndürür.

İlgili olarak bkz: ASCII tablosu

Bir karakter dizisindeki değişkenleri bulur.

İkinci bir parametre verilirse bir dizi oluşur.

Çıktısı:

array(2) {
  ["form"]=>
  string(5) "giris"
  ["statu"]=>
  string(7) "premium"
}

Karakter dizisinin ilk harfini büyük yapar.

Karakter dizisindeki sözcüklerin ilk harfini büyük yapar.

Karakter dizisinin MD5 algoritmasıyla şifrelenmiş halini döndürür.

Ek bilgi için bkz: MD5

Karakter dizisinin SHA-1 algoritmasıyla şifrelenmiş halini döndürür.

Ek bilgi için bkz: SHA-1

( ) [ ] $ . ^ + ? * \ işaretlerinin başına ters bölü getirir.

Sınıflar class anahtar sözcüğü ile tanımlanır. Sınıflar değişken ve fonksiyonları içerir. Sınıf elemanı olan değişkenler genellikle özellik veya öznitelik, sınıf elemanı olan fonksiyonlar ise metot veya yöntem olarak adlandırılır.

Yukarıda, IlkOzellik adında bir özellik ve IlkMetot adında bir metot içeren IlkSinif isimli bir sınıf tanımlandı.

$this değişkeni, sınıf içinde, tanımlı özelliklere ve metotlara erişmeyi sağlar.

Örnekte de görüldüğü gibi $this değişkenine ek olarak -> işaretinden sonra erişilmek istenen özelliğin veya metodun ismi yazılıyor.

Bir sınıftan nesne yaratmak için new anahtar sözcüğü kullanılır. Bu sayede, sınıfın bir örneği oluşturulmuş olur.

Son satırda, IlkSinif sınıfının $nesne adında bir örneği oluşturuldu. Artık bu nesne üzerinden sınıfın özellik ve metotlarına sınıf dışından erişebiliriz. Şimdi, oluşturduğumuz nesneyi kullanarak IlkMetot metoduna sınıf dışından erişelim. Yani fonksiyonlarda olduğu gibi çağıralım ve çalışmasını sağlayalım.

Aynen $this değişkeninde olduğu gibi $nesne nesnesine ek olarak -> işaretinden sonra IlkMetot metodunun ismi yazılarak ilgili metot çağrıldı. Tahmin edebileceğiniz gibi bu metodun görevi, sınıf içinde tanımlı IlkOzellik özelliğinin değerini -yani Bir değer ifadesini- çıktılamaktır.
Şimdi, örnek olması açısından bir öğretim üyesinin isim, soyisim ve unvan bilgileriyle işlemler yapan basit bir sınıf tanımlayalım.

Şimdi bu örneği açıklayalım. OgretimUyesi isimli bir sınıf tanımladık. Bu sınıfın Unvan, Isım ve Soyisim adında üç adet özelliği var. Aynı zamanda da Kaydet ve Getir isimli iki metoda sahip. Kaydet metodu, kendisine parametre olarak gönderilen değerleri $this değişkenini kullanarak sırasıyla Unvan, Isim ve Soyisim özelliklerine atıyor. Getir metodu ise sınıfın özelliklerini ekrana çıktılıyor. Sınıfımızı tanımladıktan sonra, bu sınıftan uye adında bir nesne yarattık. Bu nesne üzerinden sınıfın Kaydet metodunu, gerekli parametre değerlerini göndererek çağırdık. Kaydet metodu gönderdiğimiz değerleri, uye nesnesi için sınıfın özelliklerine atadı. Son olarak ise Getir metodunu çağırdık ve özelliklerin değerlerini çıktıladık.
Getir metodunu çağırmak yerine, uye nesnesini kullanarak, sınıf özelliklerine de erişebilirdik. Yani:

Görüldüğü gibi burada Getir metodunu kullanmak yerine, sınıf özelliklerine direkt olarak eriştik.
Başka bir öğretim üyesi daha kaydedelim:

uye1 ve uye2 adlarında iki nesne yarattık. Her nesne için ayrı ayrı Kaydet ve Getir metotlarını kullandık. Her nesne için sınıf özelliklerinin farklı değerler tuttuğuna dikkat edin. Aşağıdaki örneği inceleyiniz.

Görüldüğü gibi sınıf özellikleri, her nesne için farklı değerler tutuyor.

Bir sınıf, başka bir sınıfın özellik ve metotlarını devralabilir (miras almak olarak da ifade edilir). Bu durumda devralınan sınıf ebeveyn veya üst sınıf, devralan sınıf ise çocuk veya alt sınıf olarak anılır. Alt sınıf, üst sınıfı devraldığında onun özellik ve metotlarına erişebilir. Buna kalıtım denir. Devralınacak sınıfın ismi extends anahtar sözcüğünden sonra yazılır.

Yukarıda A ve B isimli sınıflar tanımlandı. B sınıfı, A sınıfını devralıyor. Diğer bir deyişle B sınıfı, A sınıfının alt sınıfıdır. Şimdi özellik ve metotları da kullanarak bu örneği genişletelim.

Örnekte B sınıfı A sınıfını devralıyor. 19. satırda $nesne nesnesi yaratılırken B sınıfı kullanılıyor. Kalıtım özelliği sayesinde B sınıfının, A sınıfının özellik ve metotlarına erişebileceğini belirtmiştik. İşte 20. satırda $nesne nesnesi üzerinden A sınıfının BirMetot isimli metoduna erişiliyor. Son satırda ise B sınıfının kendi metodu olan BaskaMetot metodu çağrılıyor. BaskaMetot metodu içerisinde, $this değişkeni kullanılarak üst sınıfın BirOzellik özelliğine erişilebildiği de dikkatinizi çekmiş olmalı.
Birden fazla sınıf devralınamaz. Bir sınıf yalnızca bir tane sınıfı devralabilir.

Şimdiye dek verilen örneklerde özellik ve metotlar public anahtar sözcüğüyle tanımlandı. Ancak public dışında kullanılabilecek iki anahtar sözcük daha vardır: protected ve private. Bu anahtar sözcükler, özellik ve metotların görünürlüğünü veya başka bir deyişle erişilebilirliğini ifade eder.

public tanımlı özellik ve metotlara sınıf içerisinden, alt sınıflardan ve nesneler üzerinden erişilebilir.
protected tanımlı özellik ve metotlara sınıf içerisinden ve alt sınıflardan erişilebilir. Nesneler üzerinen erişilemez.
private tanımlı özellik ve metotlara sınıf içerisinden erişilebilir. Alt sınıflardan ve nesneler üzerinden erişilemez.
Örnek üzerinde görelim:

Örnekte $nesne nesnesi üzerinden üç özelliğe de erişmek istedik. Ancak ProOzellik ve PriOzellik özelliklerine erişemeyiz çünkü bunlar protected ve private olarak tanımlanmıştır. $nesne üzerinden yalnızca public olarak tanımlı PubOzellik özelliğine erişilebilir.
Bir de metotları kullanalım:

protected ve private tanımlı özelliklere nesne üzerinden erişmek istenirse, public tanımlı bir metot kullanılır. Aşağıdaki örneği inceleyiniz.

Gördüğünüz gibi, public olarak tanımlanmış bir metot kullanarak tüm özelliklerin değerlerine sınıf dışından erişebildik.
Şimdi de bir alt sınıf kullanalım.

Sınıf özellikleri sabit ifadelerle ilklendirilmelidir. Yani:

Sınıfların içinde sabit tanımları yapılabilir.

Sınıf sabitlerine erişmek için nesne yaratmaya gerek yoktur. Sınıf sabitlerine :: operatörü kullanılarak erişilir. Operatörden önce sınıfın ismi, sonra da erişilecek sabitin ismi yazılır. İlgili olarak bkz: Sabitler
Sınıf sabitlerine, sınıf içerisinden nasıl erişileceğine sayfanın ileri kısımlarında self anahtar sözcüğünün açıklandığı başlıkta değinilmiştir.

Statik olarak tanımlanmış özellik ve metotlara, sınıf dışından nesne yaratmadan erişilebilir. Statik özellik ve metotlar static anahtar sözcüğüyle tanımlanır.

Sınıf sabitlerinde olduğu gibi static olarak tanımlanmış özellik ve metotlara erişirken de :: operatörü kullanılıyor. static olarak tanımlı özellik ve metotlara erişmek için nesne yaratmaya gerek yoktur. Zaten nesneler üzerinden, statik özelliklere erişilemez. Ama statik metotlara erişilebilir.
Statik olmayan özelliklerin, her nesne için farklı değerler tuttuğunu biliyoruz. Ancak statik özellikler adı üstünde statik olduğundan ve nesneler ile erişilemediğinden doğal olarak son aldıkları değeri -yani tek bir değer- tutarlar.
Statik özelliklere, sınıf içerisinden nasıl erişileceğine sayfanın ileri kısımlarında self anahtar sözcüğünün açıklandığı başlıkta değinilmiştir.

Sınıf kurucuları, her nesne yaratılışında çalışır ve kendiliğinden birtakım işleri yerine getirir. Kurucu metot, __construct ismiyle tanımlanır. Kurucu metot, public olmalıdır. Aksi durumda kurucuya erişilemeyeceğinden kurucu çalışamayacaktır.

Örnekte $nesne nesnesi yaratıldığı anda kurucu metot çalışacak ve işlevini yerine getirecektir.
Başka bir örnek:

Bu örnekteki kurucu metot, üç adet parametre alıyor ve parametre olarak aldığı değerleri, sınıfın özelliklerine atıyor. Getir metodu da bu özelliklere erişmemizi sağlıyor. Kurucu metodun parametrelerinin alacağı değerlerin, nesne yaratılırken gönderildiğine dikkat ediniz.
PHP birden fazla kurucu tanımlanmasını desteklemez.
Alt sınıftan üst sınıfın kurucusuna nasıl erişileceğine, parent anahtar sözcüğünün açıklandığı başlıkta değinilmiştir.

Yıkıcı metot, nesnenin görevi bittikten sonra çalıştırılır ve kendiliğinden birtakım işler yapar. Yıkıcı metot, __destruct ismiyle tanımlanır.

Burada $nesne nesnesi yaratıldığı anda kurucu metot çalışacaktır. Alt satırda çağrılan BirMetot metodu da görevini yerine getirdikten sonra nesnenin görevi bitti için yıkıcı metot devreye girecektir.

Sınıf içerisinde sabitlere, statik özellik ve metotlara erişmeyi sağlar.

Görüldüğü gibi self anahtar sözcüğü kullanılarak BaskaMetot isimli metotta sabite, statik özelliğe ve statik metoda erişildi.

Üst sınıfın sabitlerine, statik özellik ve metotlarına erişmeyi sağlar.

Örnekte, alt sınıfın kurucusundan parent anahtar sözcüğü ve :: operatörü kullanılarak üst sınıfın sabitine ve statik özelliğiyle metoduna erişildi.
parent kullanarak üst sınıfın kurucusunu çağırma örneği:

Üst sınıfta final olarak tanımlanmış bir metot, alt sınıfta yeniden tanımlanamaz (override). Örneğin:

Sınıflar da final olarak tanımlanabilir. final olarak tanımlı sınıflar devralınamaz.

Tür çarpıtma, bir değişkenin türünün başka bir türe dönüştürülmesi işlemidir.

Tür çarpıtma işlemi için parantez içinde hedef tür ve çarpıtma işlemine sokulacak değişken yazılır. Yukarıdaki kod parçasının 3. satırında, türü float olan $sayi değişkeni tür çarpıtma işlemine tabi tutulmuş ve hedef tür olarak int (integer, tamsayı) belirtilmiştir.
Yapılacabilecek çarpıtmalar:

(int), (integer) Hedef tür: Tamsayı
(string) Hedef tür: String
(bool), (boolean) Hedef tür: Boolean
(float), (double), (real) Hedef tür: Float
(array) Hedef tür: Array
(object) Hedef tür: Object
(unset) Hedef tür: NULL

Aşağıdakiler, boolean türe dönüşümde false olarak ele alınır.

Boş string veya değeri 0 (sıfır) olan string
integer 0 (sıfır)
float 0.0 (sıfır)
null (yokluk)
Boş array (dizi)
Üyesiz object (nesne)

(bool) çarpıtması yerine (boolean) da kullanılabilir.

string türe dönüşümlerde boolean true "1" olarak, false ise boş karakter dizisi olarak dönüşür. Aynı şekilde null da boş karakter dizisi olarak dönüşür. Aşağıda string türe dönüşümle ilgili bazı örnekler verilmiştir.

String türe dönüşüm için izlenebilecek başka bir yol daha vardır:

Yukarıda değeri 3 ve türü integer olan $sayi değişkeninin değeri, $deger değişkenine çift tırnak içerisinde atanmıştır. Bu durumda $deger değişkeninin türü string, değeri de "3" olmuştur.

Karakter dizisi nokta veya küçük ya da büyük e harfi içermiyorsa ve tamsayı genişliğini aşmıyorsa integer türe, aksi durumda float türe dönüşür. Aşağıda bazı örnekler verilmiştir.

Mantıksal true 1'e, false 0'a dönüşür.
Float türünden dönüşümlerde aşağı yuvarlama yapılır ve tamsayı kısım alınır.

gettype() işlevi, bir ifade ya da değişkenin türünü döndürür. Dönebilecek değerler:

integer
boolean
double (aslında float)
string
array (eğer bir "dizi" ise)
object (eğer "sınıf" nesnesi ise)
NULL (eğer tanımsız ise)

Bir değişkenin türünü belirlemeyi sağlar. Geçerli ise true, geçersiz ise false değer döndürür. Parametre olarak, türü değişecek değişkeni ve tür ismini alır. Parametre olarak alabileceği tür değerleri şunlardır:

integer veya int
boolean veya bool
float
string
array
object
null

Bir değişkenin türünün string olup olmadığını kontrol eder. Mantıksal değer döndürür.

Bir değişkenin türünün boolean olup olmadığını denetler. Mantıksal bir değer döndürür.

Değişkenin türünün integer olup olmadığına bakar. Mantıksal değer döndürür.

Değişkenin türünün float olup olmadığını sınar. Geriye mantıksal değer döndürür.

Bir değişkenin NULL olup olmadığını kontrol eder ve mantıksal bir değer döndürür.

Bir ifade ya da değişkenin numerik olup olmadığını denetler ve mantıksal değer döndürür.

6 ve 8. satırlarda görüldüğü gibi sayıl değere sahip stringler de numerik kabul ediliyor.

Değişken dizi mi diye bakar. Mantıksal değer döndürür.

Değişken object türünde mi diye bakar ve mantıksal değer döndürür.

Bir değişkene ait tamsayı değeri döndürür.

Bir değişkenin değerini float olarak döndürür.

Bir değişkenin değerini string olarak döndürür.

Bir değişkenin boş olup olmadığına bakar.

Bir değişkenin tanımlı olup olmadığını kontrol eder.

Bir değişkeni tanımsız kılar.

Değişkenler, belli bir değer tutar ve programın herhangi bir yerinde o değerleri kullanmamızı sağlar. Değişken isimlendirmede uyulması gereken bazı kurallar vardır.

Değişken isimleri $ (dolar işareti) ile başlamalıdır.
Değişken isimleri Türkçe karakter içermemelidir.
Değişken isimleri bir harf veya alt çizgi işareti ile başlayabilir.
Değişken isimleri büyük küçük harfe duyarlıdır.

Değişken isimlendirme hususunda yukarıdaki kuralların dışında, zorunlu olmayan ama uyulması tavsiye edilen bazı durumlar vardır. Örneğin değişken isimleri, tuttukları değerlerle ilintili olmalıdır. Bu sayede okunabilirlik de artacaktır.

Birden çok sözcükten oluşan değişkenlerin isimlendirmesinde ise sözcükler arasında alt çizgi kullanılabilir veya CamelCase yöntemi tercih edilebilir.

PHP'de bir değişkenin kullanılmadan önce veri türünün belirtilerek tanımlanması ve ilklendirilmesi gerekmez. Değişkenlerin türleri, kullanıldıkları duruma ve aldıkları değerlere göre PHP yorumlayıcısı tarafından belirlenir. Tamsayı değer tutan bir değişken o an için integer türündedir, ancak daha sonra aynı değişkene bir karakter dizisi atanırsa değişkenin türü string olacaktır.
PHP'nin, bazı özelliklerini miras aldığı C Programlama Dili'nde değişkenler, programın başında türleriyle birlikte tanımlanmalı ve bir ilk değer atanmalıdır. Çünkü ilk değer verilmediğinde o değişken, türüne göre (integer, float vb.) rastgele bir değer alır. C Dili'nde tanımlama ve ilklendirmenin bir örneği:

Ancak PHP'de buna gerek yoktur. Denildiği gibi PHP değişkenlerini programın başında tanımlayıp ilklendirmek gerekmez. Yine de değişkenleri tanımlayıp bir ilk değer atamak bazı durumlarda gerekli olabilir.

PHP yalın [sayısal (scalar)] veri türleri, bileşik (compound) türler ve 2 adet özel türe sahiptir.
Yalın veya sayısal türler:

integer
string
boolean
float
Bileşik türler:

array
object
Özel türler:

null
resource

integer değerler pozitif veya negatif tamsayılardır.

Tamsayılar yukarıdaki biçimde onluk tabanda belirtilebileceği gibi sekizlik veya onaltılık tabanda da belirtilebilir. Tamsayılar sekizlik tabanda belirtilirken başlarına 0, onaltılık tabanda belirtilirken ise 0x veya 0X getirilir. Ek bilgi için bkz: Konumsal yazım ve sayı tabanları

Bir veya bir dizi karakterin oluşturduğu veri türüdür. string ifadeler veya diğer adıyla karakter dizileri, tek tırnak veya çift tırnak içinde tanımlanır.

Karakter dizisi bildirimlerindeki tırnak kullanımında dikkat edilmesi gereken bir husus vardır:

Burada çift tırnak ile bir karakter dizisi tanımlanıyor ve bu karakter dizisi içinde yine çift tırnak kullanılarak bir alıntı yapılıyor. PHP yorumlayıcısı ilk çift tırnaktan itibaren bu ifadeyi yorumlamaya başlayacaktır. der ki: ifadesinden sonra ise ikinci çift tırnağı görecektir. Buraya kadar PHP yorumlayıcısı için herhangi bir sorun yoktur. Yorumlayıcı, ifadeyi işlemeye devam ettiğinde kendisi için bir şey ifade etmeyen Doğruluk sözcüğüyle karşılaşacak ve hata verecektir. Bu durumu aşmak için aynı karakter dizisi şu şekilde tanımlanabilir:

Burada $quote değişkenine yine çift tırnak kullanılarak değer veriliyor ancak bu çift tırnaklar içindeki alıntı tek tırnaklar kullanılarak yapılıyor. Bu sayede PHP yorumlayıcısının karakter dizisini düzgün bir biçimde işlemesi sağlanıyor.
Yukarıdaki karakter dizisi şöyle de tanımlanabilirdi:

Bu kod parçasında ise $quote değişkeninin tutacağı karakter dizisi tek tırnaklarla sarmalanıyor. Karakter dizisi içindeki alıntı ise sorun çıkmaması için çift tırnaklarla sarmalanıyor.

Kayan noktalı sayılar veya diğer bir deyişle gerçel sayıları kapsar. Örneğin:

Ek bilgi için bkz: Kayan noktalı sayılar

boolean türü true (doğru) ve false (yanlış) değerlerinden oluşur. Bunlar genellikle mantıksal bir sınama işlemi sonucunda ortaya çıkar. Ancak tabii ki bir değişkene de mantıksal bir değer atanabilir.

boolean değerler büyük - küçük harfe duyarsızdır.

echo deyimi, bir karakter dizisi veya değişkenin çıktılanmasını sağlar.

Yukarıdaki kod parçası Vikikitap ifadesini çıktılar.
echo deyimiyle değişkenler de kullanılabilir:

echo deyiminde değişkenler ve karakter dizileri birarada kullanılabilir. Bu durumda, karakter dizilerini birleştirmeye yarayan nokta operatörü kullanılır:

Bu kod parçasının çıktısı:

VikikitapPHPProgramlamaDili

Daha hoş bir görüntü elde etmek için $wiki ve $lang değişkenlerinin arasına, ve sondaki karakter dizisinin başına boşluk eklenebilir:

Yeni çıktı:

Vikikitap PHP Programlama Dili

Çıktılanacak olan değer, önce bir değişkene de atanabilir:

Nokta operatörü yerine virgül de kullanılabilir:

Bu örnek de yukarıdakiyle aynı çıktıyı verecektir.
Nokta operatörü veya virgül kullanılmadan aynı örnek şöyle de yazılabilir:

Burada nokta operatörüyle birleştirme yapmadan, değişkenler ve Programlama Dili karakter dizisi çift tırnaklar içine yazıldı. Yukarıdaki kodun çıktısı:

Vikikitap PHP Programlama Dili

Tırnaklar içinde kullanırken değişken isimleri süslü ayraçlar içine de alınabilir. Ayrıca bu, okunabilirliği artırması açısından daha iyi bir yöntemdir:

$ işareti, süslü parantezlerin dışında da olabilir:

Karakter dizileri çift tırnaklar haricinde tek tırnaklar kullanılarak da tanımlanabildiğine göre, tek tırnaklar echo deyimiyle de kullanılabilir:

Ancak tek tırnaklar içerisinde kullanılan değişkenlerin değerleri çıktılanmaz. Bunlar yazıldıkları gibi çıktıya dahil olurlar:

Çıktısı:

$wiki $lang Programlama Dili

Tek tırnaklar kullanılırken, değişken isimlerini süslü ayraçlarla sarmalamak da fayda etmez:

Çıktısı:

{$wiki} {$lang} Programlama Dili

Elbette echo deyimiyle yalnızca karakter dizileri değil, integer ve float türündeki değişkenler ve sabit ifadeler de çıktılanabilir:

echo deyimiyle boolean değerler de çıktılanabilir ancak elde edeceğiniz çıktı sizi biraz şaşırtabilir. Örneğin:

Yukarıdaki kodlar herhangi bir çıktı üretmez. Mantıksal true değeri çıktılandığında ise sonuç 1 olur. Bunun sebebini ilerleyen bölümlerde öğreneceksiniz.

Alt satıra geçilmesini sağlar.

Yukarıdaki kod parçası web tarayıcıda çalıştırıldığında

Vikikitap PHP Programlama Dili

çıktısı elde edilir. Ancak sayfanın kaynak kodlarına bakıldığında ise

Vikikitap PHP
Programlama Dili

yazdığı görülür. Görüldüğü gibi kaynak kodda alt satıra geçilmiştir fakat web tarayıcıdaki çıktı tek satıra yayılmıştır. Bunun nedeni satır sonlarının, web tarayıcı tarafından tek bir boşluk karakteri olarak yorumlanmasıdır. HTML'de alt satıra geçebilmek için  HTML etiketi kullanılır:

Bu kez hem \n kaçış karakteri hem de br HTML etiketi kullanıldı. Bu durumda tarayıcı çıktısı şu biçimde olacaktır:

Vikikitap PHP
Programlama Dili

Aynı sayfanın kaynak kodlarında da alt satıra geçilmiştir:

Vikikitap PHP
<br>Programlama Dili

çünkü br etiketinden önce \n alt satır karakteri kullanıldı.

Sekme (tab) görevi görür.

Yukarıdaki kod parçasının çalıştığı sayfanın kaynak kodlarına bakıldığında:

Vikikitap PHP    Programlama Dili

yazdığı görülür. \n kaçış karakterinde olduğu gibi bu kaçış karakteri de sadece kaynak kodlarda etkili olur ve tarayıcı çıktısına etki etmez. Çünkü web tarayıcılar, kaynak kodlardaki birden fazla boşluğu tek bir boşluk olarak yorumlar.

Yukarıda echo deyimine verilen karakter dizisinin tırnaklar nedeniyle sorun çıkaracağını string veri türüyle ilgili bilgilerimizden biliyoruz. Bunun önüne geçmek için \" kaçış karakteri kullanılabilir. Yani:

Çıktısı:

Friedrich Schiller der ki: "Doğruluk, her türlü şart altında meyve verir."

Aynı durum tek tırnaklar için de geçerlidir.

PHP yorumlayıcısı, echo deyimindeki çift tırnaklar içinde $ işareti gördüğünde, o isimde bir değişken arayacak ve bulduğu değişkenin değerini çıktıya dahil edecektir. Ancak her zaman istenilen o değişkenin değerini çıktılamak olmayabilir:

echo deyiminde tek tırnaklar kullanıldığında, değişkenlerin değeri zaten çıktılanmayacağ için bu kaçış karakteri tek tırnaklarla kullanılmaz:

Kaçış karakterinin yerine getirdiği görevi geçersiz kılmak için kullanılır:

var_dump() işlevi, bir değişkenle ilgili bilgileri çıktılar.

Çıktısı:

string(9) "Vikikitap"

Bu çıktıdan anlaşılacağı üzere $wiki değişkeni string türündedir, 9 karakter uzunluğundadır  ve değeri Vikikitap ifadesidir.

Pardus İşletim Sistemi, TÜBİTAK’ın bünyesinde kriptoloji, bilişim ve elektroniğin ileri konularında faaliyet gösteren bir enstitü olan Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü (UEKAE) tarafından yürütülen bir Linux dağıtımı projesidir. Pardus İşletim Sistemi GPL (Genel Kamu Lisansı) ile dağıtılan açık kaynak kodlu özgür yazılım ürünüdür. Pardus İşletim Sistemi Linux çekirdeğini kullanmaktadır. Bu işletim sisteminin planlamasına 2003 yılında başlanmış olup ilk kararlı sürümü 27 Aralık 2005’te çıkarılmıştır. Pardus ismi Anadolu Parsı’nın bilimsel adı olan Panthera pardus tulliana‘dan gelmiştir.
Pardus bilişim okur yazarlığına sahip bilgisayar kullanıcıları için temel bir işletim sistemi olup, mevcut Linux dağıtımlarının üstün taraflarını kavram, mimari ya da kod olarak kullanan bir ulusal dağıtım projesidir. Pardus 2013 sürümü ile beraber Debian tabanına geçilmiştir.
Pardus İşletim Sistemi Tarihçesi
2003 >>> Pardus için ilk adım atıldı.Linux çekirdeği tabanlı ve GPL (Genel Kamu Lisansı) ile dağıtılan açık kaynak kodlu olmasına karar verildi.
2004 >>> Proje hayata geçirildi.Çekirdek mimarisi oluşturuldu, Linux konusunda teknik girişimlerde bulunuldu. Ulusal işletim sistemi için TÜBİTAK/UEKAE bünyesinde görevlendirmeler yapıldı.
2005 >>> İlk yazılım olan Pardus CD 1.0 ile yayımlandı. 2005 Yılının sonuna doğru Pardus’un ilk kurulabilir sürümü olan Pardus 1.0 ağ üzerinden yayınlandı
2011 >>> Yeniden yapılanma amacıyla TÜBİTAK bünyesindeki proje yöneticileri ve geliştirici ekip dağıtılarak tasfiye edildi.
2012 >>> Pardus 2011 bireysel sürümününe güncelleme desteğinin sona erdiğini duyurdu. Kısa bir süre sonra “Pardus’un Yarını Çalıştayı” adı ile projenin yeniden nasıl devam edileceği konusunda çalışma yapılacağı bildirildi. İlerleyen zamanlarda FATİH projesindeki akıllı tahtaların Pardus logolu ve Debian İşletim Sistemine sahip olduğu görüldü.
2013 >>> Debian tabanlı ilk kararlı Pardus sürümü “Pardus 2013 Anadolu Parsı” adı ile yayınlandı.
Kaynakça:
https://tr.wikipedia.org

Bu örnekte kullanılan modem Huawei E176G, TURKCELL VINN ve kullanılan Pardus dağıtımı 2009.2'dir. Sizin modemin markası, modeli, GSM operatörü veya kullandığınız Pardus'un versiyonu değişikse burada anlatılanlardan farklı bir rota izlemeniz gerekebilir.

Çoğu 3G modemi kullanabilmek için bir PIN kodu girmek gerekir. Eğer modeminizi Pardus'ta kullanmak istiyorsanız öncelikle bu PIN sormayı kaldırmanız gerekir. Bunun için modeminizin arayüzü Windows'ta açılıyken Araçlar -> PIN işlemleri -> PIN Doğrulamasını kapat yolunu izleyerek modeminizin PIN sormasını engelleyebilirsiniz.

Pardus'a geçin.
Pardus menüsü->Uygulamalar->İnternet->İnternet Çevirmeli Ağ Aracı (KPPP) yolunu izleyerek KPPP'yi açın.
Açılan pencereden "Yapılandır" düğmesine tıklayın.
Açılan pencerden "Yeni" düğmesine tıklayın.
Açılan pencereden "Elle Ayarlama" düğmesine tıklayın.

Parmesanlı enginar sosu, çok çeşitli yiyeceklerle kullanılan bir dip sostur. En çok, atıştırmalıklar ile kullanılır.
Enginar, birçok ülkede konserve ve kavanoz şeklinde kolaylıkla bulunabiliyor ve atıştırmalık sosların yapımında giderek daha fazla kullanılıyor. Bazı restoranların, genellikle mayonez bazlı olan bir çeşit enginar sosu vardır.
Bu tarif, özellikle bir parti için son dakikada hazırlanma amacıyla uygundur. Tarif, diğer malzemelerin eklendiği (mayonezli olma esasından oluştuğu) için, farklı bir şeyler eklemek isteyenler arasında popülerdir.

Enginar; suyu süzülmüş, doğranmış veya sıkılmış.
Mayonez.
Parmesan veya Romano peyniri.

Hazırlamak için tüm malzemeleri iyice birleştirmelisiniz.

Oda sıcaklığındaki sebzelerin, patates cipslerinin ve diğer tüm genel parti atıştırmalıklarının lezzetli sosları için mükemmeldir. Ancak batırarak, daha da iyi hale gelir. Sosu küçük, ısıya dayanıklı bir tabağa koyun ve üst kısmı hafifçe bronzlaşana kadar kısa bir süre kızartın. Yanmayı önlemek için arada bir karıştırılması gerekmesine rağmen, fondü kabına koymak da işe yarayabilir.
Bu sos aynı zamanda bir sandviçin tabanı olarak da kullanılabilir. Sosu iyi bir İtalyan rulosunun üzerine yayın, sonra kızartın. Sos güzel bir kavruk renge dönüştüğünde, çıkarın ve sandviçi marul ve domatesle bitirin.

Sağlık nedenleriyle enginar tüketme miktarını artıranlar vardır. Ayrıca, mayonez yerine yumuşak tofu kullanılan çeşitli versiyonları da vardır.
Enginar sosuna sıklıkla eklenen çeşitli öğeler şunlardır:

Tuz ve biber
Kıyılmış yeşil soğan
Dere otu
İnce doğranmış zeytin
Doğranmış domates
İstenilen miktarda, çok ince doğranmış sebzeler
Kıyılmış ıspanak (pişmiş)
½ su bardağı ekşi krema
½ su bardağı krem peynir
Kıyılmış sarımsak
Ufak doğranmış yeşil biber konservesi
Dijon hardalı

Çipura kolay bulunabilen , çok lezzetli bir balıktır. Fırında kolay pişer ve sonuçları lezzetlidir. Hafif olduğu ve tavada kızartmaya nazaran daha az koktuğu için akşam yemeklerinde kolaylıkla yapılabilir.
Malzemeler(2 Kişilik)

2 Adet porsiyonluk çipura
1 Tatlı kaşığı karabiber
12 Adet pazı yaprağı
2 Mini dal biberiye (mümkünse taze alın)
4 Yaprak nane
2 Defne yaprağı
2 Dal kekik
2 Dal adaçayı
2 Dal arapsaçı
1 Adet limon
1 Kahve fincanı zeytin yağı
Tuz
Hazırlanışı

Çipuraların pullarını ve iç organlarını ayıkladıktan sonra tuzlayın ve yaklaşık 20-25 dk dinlendirin.
Pazı yapraklarının saplarını keserek ortasındaki sert damarları çıkardıktan sonra yıkayın.
Pazı yapraklarının yarısını yağladığınız tepsiye döşeyin.
Çipuraların iç organlarını aldığınız için bu organların yerine kokulu yeşilliklerimizi koyacağız. Biberiye, adaçayı vb.
Balıklarınızı pazı yapraklarının üzerine yatırın.
Limonu ince halkalar şeklinde dilimleyerek dilimleri balıkların altına üstüne ve karın boşluklarına yerleştirin.
Son olarak balıkların üzerine zeytinyağı ve tuzu gezdirin ve kalan pazı yapraklarını döşeyin.
Fırın kabını folyo ile kapatıp önceden 250 derecede ısıtılmış fırına verin.
Balıklara kolayca çatal batırabileceğiniz bir kıvama gelinceye kadar pişsinler. Yaklaşık 15 dk.
Balıklar piştikten sonra sıcak servis edin.

'''Not''' Çipura yerine mercan, lüfer , alabalık gibi balıklar da kullanılabilir.

PERL PROGRAMLAMA DİLİNE GİRİŞ 

Söze, ilk olarak, "neden Perl konusunda İnternet'te yayınlanan türkçe bir kitap yazmaya karar verdim?" sorusu ile başlamak isterim. Burada, anahtar sözcükler, Perl, türkçe ve İnternet'tir. Perl, kanımca ve bir bakıma günümüzün BASIC dilidir; programlar çalıştırılmadan hemen önce, bir yorumlayıcı tarafından derlenir. Bundan dolayı, bir Perl programının kaynak kodunu, Perl yorumlayıcısının bulunduğu herhangi bir makineye koyduğunuz zaman, çalışmaya hazırdır. Perl'in bu taşınabilir olma özelliği C'ye (en çok sevdiğim derlenebilen programlama diline) benzer; belli başlı tüm sistemlerde (örneğin tüm UNIX'lerde ve Win32 platformlarında) çalışan Perl yorumlayıcıları bulunmaktadır.
İkinci anahtar kelime türkçe idi. Perl konusunda, İngilizce olarak bir çok kitap, makale ve İnternet üzerinde bilgi olmasına rağmen, türkçe kaynakların azlığı, beni bu konuda bir şeyler yazmaya yönlendirdi. Daha önce yazdığım C programlama dili ile ilgili türkçe kitap ve bilgisayar konusunda yaptığım çeşitli çeviriler beni yüreklendirdi. Bu kitaba başlarken aslında yazdığım konu hakkında detaylı bilgiye sahip olmadığımı ve konular ilerledikçe, okuyucu ile beraber kendimi de bilgilendirmek amacında olduğumu belirtmek isterim.
İnternet konusuna gelince, Perl yorumlayıcısı bir özgür yazılımdır. Özgür yazılım olduğu için, kaynak kodu herkes kolayca elde edebilir ve herkes kendi gereksinimlerine göre üzerinde değişiklikler yaparak kullanabilir. Böyle özgür bir yazılımla uğraşıldığı zaman, bu yazılımla ilgili her türlü bilgi ve dokümantasyonun da özgür olması gerekir. Bunun için, Perl ile ilgili birçok kitap (kısmen ya da tamamen) İnternet'te yayınlanmıştır.

Perl konusunda en uzman kişi ve yaratıcısı olan Larry Wall, Perl'i şu şekilde tanımlamaktadır:

Perl her türlü metin içeren dosyayı tarama, bu dosyalardan bilgiyi oluşturma ve bu bilgiye dayanarak raporlar üretme konusunda eniyileştirilmiş bir yorumlanan dildir. Ayrıca, birçok sistem yönetim işi için de iyi bir dildir. Dil güzel (küçük, zarif, şık) yerine pratik (kullanımı kolay, verimli, tam) olacak şekilde tasarlanmıştır. C, sed, awk ve sh’ın en iyi özelliklerini birleştirdiği için bu dillerle tanışıklığı olan kişiler fazlaca bir güçlükle karşılaşmazlar. (Dil tarihçileri, csh, Pascal ve hatta BASIC-PLUS’tan da bazı izler bulacaktır.) İfadelerin sözdizimi C'nin ifadeler için kullandığı sözdizime çok benzemektedir. Birçok UNIX hizmet programından farklı olarak, Perl verilerinizi sınırlamaz; örneğin, eğer belleğiniz varsa, tüm bir dosyayı tek bir karakter dizisi içinde yutabilirsiniz. Özçağrı derinliğinde sınır yoktur. İlişkilendirilmiş diziler için kullanılan "hash" tabloları, performansı bozmamak için gerektiği kadar büyüyebilir. Perl, büyük miktardaki verileri çok hızlı bir şekilde taramak için karmaşık desen eşlemesi teknikleri kullanmaktadır. Metin bilgisi için eniyileştirilmiş olmasına rağmen, Perl, aynı zamanda ikili verileri de işleyebilir ve dbm dosyalarını (eğer dbm varsa) ilişkilendirilmiş diziler gibi gösterebilir. Setuid Perl programcıkları, birçok aptal güvenlik açıklarını engelleyen bir veri akışı izleme mekanizması aracılığı sayesinde C programlarından daha güvenlidir. Eğer normalde sed, awk veya sh kullanarak çözeceğiniz bir problem varsa, ancak onların kapasitesi yetersiz kalıyorsa veya biraz daha hızlı çalışacak bir çözüm arıyor da C kullanacak kadar önemli bir çalışma yapmayacaksanız, Perl tam size göre olabilir. Ayrıca, yazmış olduğunuz sed veya awk programcıklarını Perl'e çeviren çevirici programlar da bulunmaktadır.
Yukarıda anlatılanlardan bazıları (sed, awk vs.) size pek bir şey ifade etmiyorsa, endişelenmeyin. Zira, Perl bir C, Pascal veya BASIC'ten pek farklı değildir; yani klasik bir programlama dilleriyle çözülen problemleri de Perl kullanarak pekala (ve muhtemelen daha az kodlama zamanı harcayarak) çözebilirsiniz.
Haa... Bu arada, Perl sözcüğünün nereden geldiğini merak edenler için şunları söyleyebilirim: Perl, "Pratik Çıkarım ve Raporlama Dili" (Practical Extraction and Report Language) sözcüklerinin baş harflerinden oluşmuştur. Perl'in sloganı ise "bir şeyi yapmanın birden fazla yolu vardır" (there's more than one way to do it). Perl'in yaratıcısına göre, bir Perl programcısının (yoksa herhangi bir programcının mı?) en önemli "erdemi" Tembellik, Sabırsızlık ve Ukalalıktır! Neyse, siz de benim gibi yapın ve bunları ciddiye almayıp keyif almaya bakın.

Perl'in güçlü olduğu tarafları ve diğer avantajlarını tekrarlamak gerekirse; Perl'in iki önemli avantajı vardır: Listeler ve ilişkilendirimiş dizilerden oluşan devingen veri yapıları ve üstün performanslı desen eşlemesi sağlayan güçlü metin işleme özellikleri. Bunların dışında zengin ağ fonksiyonları, kalıcı veriler, nesne yönelimi gibi özellikler de içerir. Perl kullanarak çözülebilecek problemlerin yapısında genellikle veri indirgeme ve çözümlemesi, veri dönüşümü, doküman derleme ve yönetimi gibi özellikleri bulunur. (Yine anlaşılmaz bir dille yazmaya başladım! Neyse, zaten önsözleri kimse okumaz...)
Perl dili hızlı kodlamaya yardımcı olacak şekilde tasarlanmış olduğu için, fazlaca bildirim ve tanım yapmaya gerek yoktur. Yani, diğer programlama dillerinin aksine, yürütülebilir kod yazmadan önce, tipleri, değişkenleri veya altyordamları bildirmenize gerek yoktur. Bu, özellikle basit sorunlar çözmek için yazılacak olan programlarda çok yararlıdır. Perl'in diğer güzel özelliklerini ise kitabın geri kalan sayfalarında kendi kendinize bulacaksınız.
Perl'in zayıflıkları arasında ise, derlenen programlara göre, Perl'de yazılan programcıkların daha yavaş çalışması, bazı özel karakterlerin ($, @, # vs.) çok sık kullanılması (örneğin, değişkenlerin önüne sürekli $ konması) ve bazı kişilere göre, bir işi yapmak için bir fazla yöntem bulunması sayılabilir.

Perl taşınabilir bir programlama dili olmasına rağmen, bazı sistemlerde (özellikle Perl yorumlayıcısının o ortamdaki bazı hatalarından dolayı) bir takım farklılıklar ortaya çıkabilir. Sistemler arasındaki farklılıklar ve bazı Perl hataları İnternet'te bolca tartışılmaktadır. Bu kitapta verilen örnekler, Linux ve Windows altında çalışan Perl versiyon 5.8.6 ile test edilmiştir. Diğer sistemlerde de aynen çalışması beklenmektedir.

Bu kitap, temel yazı tipi dik yazıdır. Sözdizimsel gösterimde, sözdizimsel sınıflar italik yazı stili ile gösterilmiştir. İsteğe bağlı bölümler, arkalarında satır altına yazılan opt simgesiyle gösterilmiştir. Program bölümleri, ekran veya yazıcı çıktısına benzetilmek için, eşit aralıklı yazı tipiyle yazılmıştır. Program açıklamaları italik ile yazılmıştır. Bilgisayar girdi/çıktısı da eşit aralıklı yazı tipiyle gösterilmiştir; çıktı, girdiden ayırt edilebilmesi için, alt çizgili yazılmıştır.
Kitabın geri kalan kısmında ??? bölüm, ??? ek ve Perl programlama diliyle ilgili bazı kaynakların liste halinde verildiği bir bibliyografya vardır. Bölüm 1'de dile bir giriş yapılmakta ve basit programlar yazmak için gerekli olan genel bilgiler verilmektedir. Bölüm 2, Perl dilindeki temel veri tiplerini anlatmaktadır. Bölüm 3 kontrol deyimleri ve doğruluk-değerli, yani mantıksal, ifadeler üzerinedir. ..................... Ekler ise Perl yorumlayıcı ortamı ile ilgili bazı bilgiler içermekte, bazı problemlerin yanıtlarını vermekte ve kitapta kullanılan terimlerin İngilizce karşılıklarını bulmak için küçük bir sözlük içermektedir. Kitapta, olanaklar dahilinde, yaygın olarak kullanılan Türkçe terimler tercih edildiği için, İngilizce bilgisayar terimleri hakkında bilgi sahibi olan okuyucu, bu kitapta kullanılan Türkçe terimleri anlamak için bu sözlüğe başvurabilir.

1. Aşağıdaki "Perl programcığı"nı sisteminizde çalıştırmaya çalışın:

print "Perl'den merhaba...";

Windows platformunda belki farketmeyebilirsiniz, ama program ekrana Perl'den merhaba... yazısını yazdıktan sonra yeni satıra geçmemektedir. Bunu en iyi şekilde bir UNIX platformunda görebilirsiniz. Perl'de ekrana yazılan bir satırı bitirmek için en sona \n eklemeniz gerekir.
Şimdi de aşağıdaki programın ne çıktı vereceğini kestirmeye çalışın:

print "bir";
print "iki\n";

2. Bir Perl programını çalıştırmanın yöntemleri nelerdir? Hangi komutları girmeniz gerekir? Bunu öğrenmek için etrafınızdaki deneyimli Perl kullanıcılarına danışın. Eğer durum gerçekten ümitsizse bu sayfanın tartışma bölümüne danışabilirsiniz.

PERL PROGRAMLAMA DİLİNE GİRİŞ 

Bu bölümde, basitten orta büyüklüğe kadar değişen Perl programları yazmak için size gerekli olan temel bilgileri vermeye çalışacağım. Burada amaç, sizi mümkün olduğu kadar çabuk bir şekilde Perl'de program yazmaya hazırlamaktır. Zaten bir programlama dilini bildiğiniz varsaydığım için, bu iş o kadar uzun sürmeyecektir. Bu bölümde havada kalan bazı kavramlar, daha sonraki bölümlerde daha detaylı açıklanacaktır.

Bir Perl programı, tıpkı başka dillerde yazılanlar gibi, bir takım tanımlamalar ve deyimlerden oluşur. Genelde fazla tanım yapmanıza gerek yoktur; doğrudan program içinde yapmak istediğiniz şeyleri yazmaya başlayabilirsiniz.
Örneğin,

#!/usr/bin/perl -- -*- C -*-
# ilk Perl programi
print "Anapara: ";
$anapara = <STDIN>;  # deger oku
print "Faiz orani: ";
$oran = <STDIN>;
print "Alacaginiz faiz: ", $anapara * $oran / 100 , "\n";

programını bir metin düzenleyiciye girip ilk.pl isimde bir dosya içine saklayıp daha sonra aşağıdaki gibi çalıştırdığınızda, şuna benzeyen bir sonuç alırsınız:

$ perl -w ilk.pl
Anapara: 5670
Faiz orani: 11.40
Alacaginiz faiz: 646.38

Şimdi ilk örnek programımıza bir bakalım. İlk satır biraz garip gelebilir; genellikle UNIX'te çalışanlar böyle bir satırla programlarına başlarlar. UNIX'in özelliğinden ötürü, herhangi bir yorumlanan dilde bir programcık yazıp bunu sadece dosya ismini vererek çalıştırmak istediğinizde, sistemin o dosya içinde hangi programlama dilinde program bulunduğunu anlaması için ilk satıra, o dilin yorumlayıcısının tam adı verilir. Örneğin, sizin UNIX sisteminizdeki perl yorumlayıcısı, /usr/local/bin/perl yolunda bulunuyorsa, o zaman programınızın ilk satırı

#!/usr/local/bin/perl -- -*- C -*-

olmalıdır. Bu durumda programınızı çalıştırmak için sadece içinde bulunduğu dosya adını verebilirsiniz. Ancak, önce aşağıdaki UNIX komutunu girmeniz gerekecektir:

$ chmod +x ilk.pl

Bundan sonra,

$ ilk.pl

veya

$ ./ilk.pl

şeklinde programınızı çalıştırabilirsiniz. Eğer ilk satırınız farklı ise o zaman, yukarıdaki gibi uzun uzun

 $ perl -w ilk.pl

yazmanız gerekir.
Öte yandan, Windows kullanıcıları için, programa yukarıdaki gibi bir satırla başlamanın anlamı yoktur, işletim sisteminde .pl uzantılı dosyaların nasıl çalıştırılacağına dair tanım yapıldıktan sonra sadece dosya adını vererek programlarını çalıştırabilirler.
Bunun dışında, bazı DOS Perl ortamlarında pl2bat.bat adında bir yardımcı program vardır. Bu programı şu şekilde kullanarak Perl programınızı bir DOS batch dosyasına çevirebilirsiniz:

C:\PROG\perl>pl2bat ilk.pl

Bu işlemden sonra, ilk.bat isminde bir dosya oluşacaktır. Bu dosyanın ismini vererek programınızı çalıştırabilirsiniz:

C:\PROG\perl>ilk
...

Ancak,

Can't execute ilk.bat.

şeklinde bir hata mesajı alabilirsiniz. Bu durumda yapacağınız iki şey vardır:
Ya, Perl programlarını (DOS batch dosyalarını) içeren dizini PATH'ınıza ekleyeceksiniz, ya da ilk.bat dosyasına girerek,

perl.exe -w -S ilk.bat %ARGS%

satırını

perl.exe -w ilk.bat %ARGS%

şeklinde değiştireceksiniz.
Eğer bu işlemlerden sonra memnun kalır da ilk.bat dosyasını kullanmayı tercih ederseniz, o zaman ilk.pl dosyasını silin ve programda yapacağınız düzeltmeleri ilk.bat dosyasında yapmaya devam edin.
Kitapta bundan sonra verilecek örneklerde, yer kazanmak amacıyla, ilk satır gösterilmeyecektir. Ancak, artık siz ne yapacağınızı biliyorsunuz.
Şimdi programımıza geri dönelim. İkinci satırda bir açıklama görmektesiniz: # ile başlayan satırlar bir açıklamadır ve Perl yorumlayıcısı tarafından dikkate alınmazlar. Aynı zamanda, bir deyimden sonra satırın geri kalanına da bir açıklama konabilir, bunun için yine # karakteri ile başlamak gerekir (dördüncü satırda yapıldığı için).
Üçüncü satırda kullanıcıya bir mesaj iletilir. Bu amaç için print fonksiyonu kullanılmaktadır. print'in arkasına yazacağımız mesajı çift tırnak içine koyarak yazarız. En sona ise, deyimi bitirmek için noktalı virgül koymamız gerekir. En sık yapılan hatalardan biri deyimi bitirmek için noktalı virgül konmamasıdır. Aynı satıra iki deyim yazabiliriz ya da bir deyimi iki satırda yazabiliriz. Yeter ki deyimi bitirmek için gerekli olan noktalı virgülü unutmayalım.
print fonksiyonu istenen şeyi yazdıktan sonra satırı bitirmez. Satırı bitirmek için \n kullanmamız gerekir (örnek programın son satırında yapıldığı gibi). Bu konu hakkında daha ileride bilgi verilecektir. Şimdilik, gereken yerde \n kullanmayı unutmayın yeter.
Perl'de kullanıcıdan girdi almak için <STDIN> işleci kullanılır. STDIN, standart girdi dosyasıdır. Tıpkı C dilinde olduğu gibi, kullanıcının klavyesi bir dosya şeklinde değerlendirilebilir. Bir dosyanın etrafına <> karakterlerini koyduğunuz zaman, o dosyadan bir sonraki satırı okursunuz. Okuduğunuz satırla birlikte satır sonu (\n) karakteri de gelir. Örneğimizin dördüncü satırında, kullanıcıdan okunan satır $anapara değişkenine atanır.
Perl'de değişkenlerin başında her zaman özel bir işaret konur. Basit değişkenler için $ kullanılır; başka tip değişkenler için başka işaretler kullanılır. Eğer değişkenin önüne $ koymazsanız, Perl yorumlayıcısı sizi uyarır.
Beşinci ve altıncı satırda benzer deyimler kullanılmıştır. Bunların ne yaptığını kendiniz tahmin edebilirsiniz.
Yedinci satırda ise bir hesaplama vardır. Hesaplamalar, Perl işleçleri, değişken ve değişmezler kullanılarak yapılır. Programlama deneyimi olan kişiler için $anapara * $oran / 100 ifadesi, anlaşılması zor bir şey değildir. Burada çarpı (*) ve bölü (/) işleçleri kullanılmıştır. Değişkenler dışında, bir de değişmez (100) kullanılmıştır. İfadenin sonucu, anaparanın oranla çarpılarak yüze bölünmesidir. Uygun bir mesaj, hesaplamanın sonucu ve arkasına satır sonu işareti konarak oluşan bilgi kullanıcıya iletilir.
Son satırın da tamamlanmasıyla program sona erer. Programı erken bitirmek isterseniz uygun bir yere exit deyimini koyabilirsiniz. Örneğin, son print deyiminin üzerinde bir satır açıp

exit;

yazarsanız, kullanıcıdan sadece bilgiler alınacak, ancak herhangi bir sonuç görüntülenmeyecektir. exit deyimi programdan çıkmak için kullanılır. Öte yandan, programın kaynak kodunun sonunu (açıkça) göstermek için __END__ satırını kullanabilirsiniz.
Örneğin, yine son print deyiminin üzerinde bir satır açıp

__END__

yazarsanız bu sefer Perl yorumlayıcı programınızı __END__ satırına kadar okuyacağı için bazı uyarılar verebilir:

Name "main::anapara" used only once: possible typo at ...
Name "main::oran" used only once: possible typo at ...

Bu durumda, Perl yorumlayıcısı programın son satırına bakmayacağı için, anapara ve oran değişkenlerinin program içinde sadece bir defa kullanıldığını varsayacak ve muhtemel bir hataya karşı sizi uyaracaktır.
Normalde, __END__ satırını kullanmanıza gerek olmayabilir, ancak exit ve (ileride göreceğimiz) die deyimlerini program içinde kullanmanız gerekebilir.
... devam edecek! ;) ...

1. ...

MATLAB, The MathWorks firması tarafından geliştirilen bir programlama dilidir. Lineer cebir programlamanın kolay olduğu yerde bir matris programlama dili olarak başlamıştır. 
İnteraktif oturumlar altında, bir grup çalışması kadar iyi çalıştırılabilmektedir.

MATLAB, diğer işler arasında, basit hesaplama işlemlerini yapabilir. Basit bir örnek çözümüyle rsayılarak, ne kadar yol gidebilir?
Önce Ahmet'in arabasının iki benzin dolumu arasındaki kat ettiği mesafeyi hesaplayalım.

>> 3503-3215

ans =

   288

Ahmet'in arabasının litre başına gittiği yol:

>> 288/45
 
ans =

   6.4

Buna göre gidebileceği yol:

>> 6.4 * 69.3

ans =

  443.5200

Tekrar benzini bitinceye kadar 443.52 km yol gidebilir.
Aynı örneği, değişkenleri adlandırarak yapalım

>> mesafe = 3503-3215

mesafe =

   288

>> kullanim = mesafe/45

kullanim =

   6.4000

>> beklenen_mesafe= kullanim * 69.3

beklenen_mesafe =

  443.5200 

Sonucun komut penceresinde görüntülenmesini engellemek için, yazılan ifadenin ardından noktalı virgül koyulur. Sonuç depoda saklanır. Komut satırına değişkenin adını yazarak, değişkene erişmek mümkündür. Örneğin:

>>beklenen_mesafe = kullanim * 69.3;
>>
>>beklenen_mesafe

beklenen_mesafe = 

  443.5200

MATLAB, numaraların yanı sıra  dizgileri de işleyebilir. Dizgiler tek tırnak içinde yazılmalıdır:

>> dizgi1 = 'merhaba'

dizgi1 =

merhaba

Eğer içerisinde tek tırnak işareti de kullanacaksanız şu şekilde yazabilirsiniz:

>> dizgi1 = 'Vikitap''ta'
 
dizgi1 =
 
Vikitap'ta

>> dizgi2 = ''''
 
dizgi2 =
 
'

Diziler MATLAB'da temel veri tipleridir. Aslında daha önce burada sunulan veri tipleri, yani numara ve dizgiler, dizilerin özel durumlarıdır. Çoğu geleneksel dilde olduğu gibi, MATLAB'daki diziler
aynı tipin çeşitli değerlerine ait bir koleksiyondur (varsayılan olarak, tip C için double dır.) ve tamsayı (integer) olarak nitelendirilirler.
Dizi oluşturmanın kolay yollarından biri köşeli parantez içinde, dizinin her bir sayısının virgülle ayrılarak yazılmasıdır:

>> dizi = [0, 1, 4, 5]

dizi =

    0     1     4     5

C gibi daha alt seviye dillere karşın, MATLAB'da bir dizi daha üst seviye bir veri tipidir. Boyutuna, veri tipine vs. göre çeşitli bilgiler içerir.

>> length(dizi)

ans =

    4

Diziler çok boyutlu olabilir. 2 boyutlu bir dizi oluşturmak için (Lineer Cebir'de matris denir), virgülle ayrılmış değerler vermemiz ve her sırayı da noktalı virgülle ayırmamız gerekir:

>> matris = [1, 2, 3; 4, 5, 6]

matris =

    1     2     3
    4     5     6

Unutulmamalıdır ki bir matris, matematiksel değeri açısından her sıradaki sütun sayısı ve her sütundaki sıra sayısı eşit olmalıdır:

>> matris = [1, 2, 3; 4, 5]
??? Error using ==> vertcat
All rows in the bracketed expression must have the same
number of columns.

Bir matrisin sıra ve sütun sayıları, içindeki size fonksiyonu sayesinde bilinebilir. Aşağıdaki standart matematiksel yazıda, ilk numara sıra sayısını, ikinci numara da sütun sayısını ifade eder.

>> size(matris)

ans =

    2     3

Tek boyutlu diziler genellikle çok boyutlu dizilerin bir özel halidir:

>> size(dizi)

ans =

    1     4

Daha önce de söylediğimiz gibi diziler yüksek seviye nesnelerdir, C dekilerden çok daha yüksek, hatta bir C++ vektöründen bile. Burda asıl gaye, matematiksel vektör ve matrislerle benzer tipte olması. Aslında bir vektör, bir satır vektörü ya da bir sütun vektörü olabilir ama bu ikisi eşit değildir:

>> sutun = [1; 2; 3] 

sutun =

    1
    2
    3

>> satir = [1, 2, 3]

satir =

    1     2     3

"satir" ve "sutun" aynı boyda değildir:

>> size(sutun)

ans =

    3     1

>> size(satir)

ans =

    1     3

Diziler MATLAB'ın temel prensibidir ve neredeyse MATLAB'daki her şey, dizilerin geniş kapsamlı kullanımına dayalıdır. Matlab dizilerinin ve bu dizilerin kullanımlarının daha geniş açıklaması için Diziler ve Matrisler bölümüne bakın.

Dizi uygulamalarına giriş
Temel Vektör Çalışmaları

Matlab scripts and functions are stored in M-files, with the extension *.m. Custom functions follow the syntax:

function outputname= function_name(input_arg1,input_arg2)
        statements
return;

Function files must have the same name as function_name, and be added into MATLAB's PATH environment variable by selecting File-Set Path-Add Folder, then adding the folder containing function.m.

Yorum satırları yüzde(%) karakteriyle başlar, böylece MATLAB '%' işaretinden sonraki kısmı görmezden gelir. Yorumlar, fonksiyonların ne işe yaradıklarını belirtmek için çok kullanışlıdır.(CTRL+R ile de eklemeniz mümkündür.)

The input() function lets your scripts process data entered at the command line. All input is converted into a numerical value or array. The argument for the input() function is the message or prompt you want it to display. Inputting strings require an additional 's' argument. Example:

%test.m
%let's ask a user for x
x = input('Please enter a value for x:')

Then running the script would produce the output:

Please enter a value for x:3

x = 3

>>

MATLAB'da dosya kaydetmenin bir kaç yolu vardır.

save - Veriyi dosyaya kaydeder, varsayılan ayarı *.mat şeklindedir
uisave - includes user interface
hgsave - saves figures to files, *.fig by default
 diary [filename] - saves all the text input in the command window to a text file.

MATLAB for Windows retains the file naming constraints set by DOS.  The following characters cannot be used in filenames:  

  "  / : * < > | ? 

Tek tırnak işaretini (') yazmazmanın bir yolu, işareti iki defa yazmaktır. Başka bir yol ise, char komutunu kullanmaktır, char(39). Örneğin:

>> ''''

ve

>> char(39)

ikisinin de sonucu

ans =

'

böylece tek tırnak işaretini yazmış oluruz.

Cell arrays are the easiest way to generate new lines when using the functions xlabel, ylabel, zlabel, text, title, and gtext.  However, cell arrays do not always work (see next başlık).
When displaying text on plots, "\n" is typically interpreted as '\' followed by 'n' instead of the newline character.  To generate multiple lines, use cell arrays.  This is done by separating each string line of text with a comma and enclosing all comma-separated strings in curly braces as follows.

>> title({'First line','Second line'})

Sometimes it is nice to put the value of a variable and a newline into the plot title.
You can do this like so:

n = 4;
x = -n:1:n;      %x'in alt sınırı,hassasiyeti,x'in üst sınırı
y = x.^2;        %y=x^2 
plot(x,y)        %ekrana çiz fonksiyonu
title( [ 'plot of x squared', 10, 'from x = ', num2str(-n), ' to x = ', num2str(n) ] )%buradaki 10 yazı şekillerinden bir tanesini gösterir

The 10 outside the single quotes is the ascii value for a newline.  You don't have to use the char() function, just the number will work.
The output should look like this:

plot of x squared
from x = -4 to x = 4

The functions warning, error, sprintf  and fprintf will interpret '\n' as a newline character.   
For example

>> error('This error\nhas a newline.')
??? This error
has a newline.

This functionality was introduced in MATLAB 6.5 (R13), when formatted error strings were introduced.  This is described in the Release Notes for that release.  To do this in previous versions, use SPRINTF or CHAR(10):

>> error(sprintf('This error\nhas a newline.'))
??? This error
has a newline.

disp(['abcd' char(10) 'efgh'])
abcd
efgh

This works as well:

disp(['abcd', 10,  'efgh'])
abcd
efgh

Kılavuz (GUIDE) allows the creation of interactive user interfaces.

Simulink is a set of tools for modeling, simulating and analysing systems.

Psychtoolbox is a set of tools that aid in vision research.

The distributed computing toolbox is a set of tools that aid in distributing models over a cluster.

Programlama dili, yazılımcının bir algoritmayı ifade etmek amacıyla, bir bilgisayara ne yapmasını istediğini anlatmasının tek tipleştirilmiş yoludur. Programlama dilleri, yazılımcının bilgisayara hangi veri üzerinde işlem yapacağını, verinin nasıl depolanıp iletileceğini, hangi koşullarda hangi işlemlerin yapılacağını tam olarak anlatmasını sağlar.
Şu ana kadar 150’den fazla programlama dili yapılmıştır. Bunlardan bazıları Pascal, Basic, C, C#, C++, Java, Cobol, Perl, Python, Ada, Fortran, Delphi ve 1C Enterprise'dır.
Dünyadaki en popüler programlama dilleri sıralaması ise şöyle: JavaScript, Java, PHP, Python, Ruby, C#... Popüler dilleri daha yakından incelemek istiyorsanız buradan takip edebilirsiniz.
Seviyelerine göre programlama dilleri. Seviye ne kadar düşük olursa insan diline o kadar uzak bir söz dizimine sahip olur.

Derleyici (Compiler), bir bilgisayar dilinde yazılmış olan kodu, bilgisayarın (ya da elektronik cihazın) donanımına uygun makine diline çeviren bilgisayar programıdır.
Derleyici öncelikle yazılan program kodunun doğru yazılıp yazılmadığını kontrol eder, eğer hatalar varsa bunları programcıya bildirir.
Eğer kod doğru ise derleme yapılan sisteme uygun olan 0 ve 1’lerden oluşan makine kodunu üretir (EXE dosyası).

Yorumlayıcı (Interpreter), bir programın kaynak kodunu derlemek yerine doğrudan satır satır yürüten bir programdır.
BASIC gibi bazı diller hem derleyici hem yorumlayıcı programlar ile kullanılabilir.
JAVA dili, yorumlayıcı kullanması nedeniyle taşınabilir (platform bağımsız) bir yapıya sahip olmuştur.

Diller: Ada | ALGOL 68 | Alice ML | Amiga E | Applescript | AspectJ | Assembly Intel x86 Linux | Assembly Intel x86 NetBSD | AWK | bash | BASIC | Batch files | C | C, Cairo | C, Xlib | Candle | Clojure | C++ | C# | Delphi | Dylan | E | Eiffel | Erlang | Forth | FORTRAN | Fortress | Go | Groovy | 
Haskell | Hume | IBM PC bootstrap | Inform 7 | Java | Java, Swing | JavaScript | LaTeX | Lisp | Logo | Lua | Maple | MATLAB | Mercury | OCaml/F Sharp | occam | Oz | Pascal | Perl | Perl6 | PHP | Pic | PIR | PLI | PostScript | Prolog | Python | Rexx | Ruby | Scala | Scheme | Seed7 | sh | Smalltalk | SQL | Standard ML | SVG | Tcl | Tcl Tk | Visual Basic | Visual Basic .NET | XSL

Kaynak: http://en.literateprograms.org/Hello_World_(bash)

Programlama Temelleri kitabı meslek liseleri 10. ve 11. sınıflarda verilen programlama temelleri dersi içindir. Hedef okuyucu kitlesi programlamaya yeni başlayacak olan lise öğrencileridir. Kitabın kapsamı dersin müfredatı ile sınırlı olacaktır.

Bilgisayarın Çalışma Mantığı
Yazılım
Programlama Araçları

Algoritma Yazım Aşamaları
Akış Diyagramı

Programlama Yazılımının Arayüzü

Değişkenler
Değişkenleri İsimlendirme Kuralları
Veri tipleri
Sabitler
Atama İşlemi
Çıkış İşlemleri
Giriş İşlemleri
Giriş-çıkış işlemleri hata mesajları
Açıklama Satırları

Aritmetiksel Operatörler
İlişkisel Operatörler
Mantıksal Operatörler
İşlem Önceliği

If İfadesi
İç-İçe If İfadesi
Switch-Case Deyimi

Döngü Çeşitleri
İç-İçe Döngüler

Dizi Oluşturma
Diziye Değer Girme
Diziyi Yazdırma
Dizilerde Arama
Dizilerde Sıralama
Dinamik Diziler

Metot Kavramı
Metot Tanımlama
Metotlarda Parametre Kullanımı
Metotlar İle İlgili Önemli Özellikler
Özyineli (Rekürsif) Metotlar
Main Metodu

Metinsel (String) Fonksiyonlar
Matematiksel Fonksiyonlar
Tarih ve Zaman Fonksiyonları

T.C. Milli Eğitim Bakanlığı Bilişim Teknolojileri Modülleri(Kodlamaya Hazırlık | Basit Kodlar | Kontrol Deyimleri | Metotlar) Ankara 2011

Çalışma mantığını kavramak için öncelikle bilgisayarın bir işi nasıl yaptığını ve bilgisayarın parçalarını incelemek gerekir.
Bilgisayar bir işi,komutu 3 aşamada gerçekleştirir.

Bilgi girişi
Bilginin işlenmesi
Bilgi Çıkışı

Bu durumu örneklerle inceleyelim.

Örnek 1:
CD içerisindeki bir word dosyasını yazıcıdan yazdırmak için şu işlemler gerçekleşir.

Giriş: CD'deki word dosyası bilgisayar tarafından okunur.
İşlem: Okunan bilgi bilgi işlemci tarafından yazıcının anlayacağı şekle çevrilir.
Çıkış: Son olarak çevrilen bilgi çıktı olarak yazıcıya gönderilir.

Örnek 2:
Sabit diskteki resim dosyasını Paint ile düzenleyip CD'ye yazdırmak için şu işlemler gerçekleşir.

Giriş: Sabit diskteki resim dosyası bilgisayar tarafından okunur.
İşlem: Okunan resim Paint'e aktarılır ve düzenlenir.
Çıkış: Son olarak düzenlenen resim çıktı olarak CD'ye gönderilir.

Bilgi girişi, bilginin işlenmesi ve bilgi çıkışı sırasında kullanılan bilgisayar parçalarını yaptıkları işe göre 5 gruba ayırabiliriz.

Girdi Üniteleri: Bilgilerin bilgisayara aktarılmasını sağlar. Örneğin: Klavye, fare, tarayıcı, kamera ya da mikrofon.
Merkezi İşlem Birimi: Veriyi işlemeyi sağlar. Bilgisayardaki sadece 1 tane merkezi işlem birimi vardır, o da işlemcidir.
Çıktı Üniteleri: İşlemcinin çıkan sonuçları dışarı aktarabilmesini sağlar. Örneğin: Monitör, yazıcı, sürücüler ya da hoparlör.
Hafıza Birimi: Bilgisayar tarafından işlenecek bilgileri, programları depolamayı sağlar. Örneğin: Ram bellek, sabit disk, CD ya da DVD.
Veriyolu: Bilgisayarda, bir birimden diğerine veri aktarmak için veriyolları kullanılır. Örneğin: Klavyeden basılan bir tuşun bilgisi işlemciye veriyolu vasıtasıyla iletilir.

Bigilerin alınması,işlenmesi ve çıktı olarak istenilen yere gönderilmesi işlemcinin yönetiminde gerçekleşir. İşlemciyi yöneten şey ise programdaki komutlardır. 
Peki nedir bu komutlar:  Bu komutlar 0 ve 1'lerden oluşmuş sayı dizileridir. Her bir komutun işlemcide yaptığı bir iş vardır. Ve bu 0-1'ler bizim istediğimiz sırada çalıştırıldığında bir işi gerçekleştirir. Bu komutların bütününe ise program, yazılım deriz. Yazılım bilgisayarda bir işi yapan komutlar bütünüdür. Biz bir yazılımı bilgisayardaki simgesine tıklayarak çalıştırdığımızda aslında yaptığımız şey yazılımın içindeki kodları hafızaya yüklemektir. Bu yüklenen kodlar ise sırası geldiğinde çalışarak programı yürütürler ve program ne için tasarlanmışsa o işi yaparlar. Örneğin bilgisayarda müzik dinlemek, oyun oynamak, vs.

Makine dili, geliştirilen ilk programlama dilidir. Bu dilde yazılan tüm komutlar 0 ve 1 lerden oluşur.  
Makine dili örneği 

Bu program ekrana "Hello world" yazısını yazar.
101110110100010001 0000000110111001 0000110100000000 10110100000001
1000101000000111 0100001111001101 0001000011100010 1111100111001101
0010000001001000 0110010101101100 0110110001101111 0010110000100000
0101011101101111 0111001001101100 0110010000100001

İkili sayılar, sayıların 2 tabanında yazılmasıyla elde edilir. Dolayısıyla tüm sayılar 0 ve 1 rakamları kullanılarak ifade edilirler. Günümüz bilgisayarlarının neredeyse tamamında kullanılırlar.

Günlük hayatta sayıları ifade etmek için onluk taban [decimal] kullanılır. Bunun anlamı, her sayının 0, 1, 2, 3, 4, 5, 6, 7, 8 ve 9 rakamları kullanılarak ifade edilmesidir. İkili sayılarda ise fark 10 yerine taban olarak 2'nin kullanılmasıdır. Dolayısıyla kullanabileceğimiz rakamlar 0 ve 1'dir.

  
    
      
        
          101
          
            2
          
        
        =
        (
        1
        ×
        
          2
          
            2
          
        
        )
        +
        (
        0
        ×
        
          2
          
            1
          
        
        )
        +
        (
        1
        ×
        
          2
          
            0
          
        
        )
        =
        4
        +
        0
        +
        1
        =
        
          5
          
            10
          
        
      
    
    {\displaystyle 101_{2}=(1\times 2^{2})+(0\times 2^{1})+(1\times 2^{0})=4+0+1=5_{10}}
  

Bilgisayarda ikili sayı sisteminin kullanılma nedeni: bilgisayarın temelde sadece iki durumu ölçebilmesindendir. Bu durumu Sinyal yok 0, sinyal var 1 şeklinde özetleyebiliriz. Aslında bilgisayarların tüm bildiği, ölçebildiği budur. Fakat saniyede milyarlarca işlemi ardarada yapabilirler ve programla dilleri kullanılarak programlanabilirler.

Bir programlama dili ile yazılmış olan kaynak kodu makine koduna çeviren yazılımdır. 

Örneğin, şu satırı bir programın kaynak kodunda (programın okunabilir hali) düşünelim:

  
    
      
        X
        =
        2
        +
        Y
      
    
    {\displaystyle X=2+Y}
  

Alttaki assembly'de yazılmış satırlar, aynı programın derlenmiş halidir:

LOAD A [0]        ;; belleğin 0 adresindeki veriyi A siciline yükle 
ADD  A BX         ;; A siciline BX sicilindeki adreste bulunan veriyi ekle 
STOR A [100]      ;; sonucu 100 adresine yaz 

Bu örnekte çevirinin hedefi, programcının anladığı kaynak kodundan işlemcinin anladığı
0 ile 1 den oluşan makine dili kodunu üretmek (LOAD,ADD ve STOR komutları 0001, 0011 ve 0010 olarak yorumlanır)

 0001 01 00 00000000
 0011 01 10 00000010
 0010 01 00 00000100
 ---- -- -- ---------
  |   |  |   |_________bellek adresi
  |   |  |____________işaret   
  |   |______________sicil
  |_________________komut

Özetle derleyici yazdığımız kodu makinenin anlayacağı ikili sayı sistemine çevirir.

Yazılımlar programlama dilleri kullanılarak oluşturulurlar. Programlama dilleri, yazılımcının bilgisayara neyi nasıl yapacağını  hangi koşullarda hangi işlemlerin yapılacağını tam olarak anlatmasını sağlar.
Her programlama dili diğerinden farklıdır. Her birinin farklı komutları ve kuralları mevcuttur. En iyi programlama dili budur diye bir şey söylemeyiz. Çünkü her programlama dilinin bir diğerine göre üstün ve zayıf tarafları vardır. Günümüzde en yaygın  kullanılan kullanılan programlama dilleri şunlardır:  Java ,C ,C++ ,C# ,PHP ,Objective-C ,(Visual) Basic ,Python ,Perl ,JavaScript ,Lisp ,Ada
Öneri: Linki verilen istatistik sitesinde en çok kullanılan programlama dilleri her ay güncellenerek yayınlanmaktadır.
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

Makine dili, geliştirilen ilk programlama dilidir, öğrenilmeleri çok zordur. Bu dilde yazılan tüm komutlar 0 ve 1 lerden oluşur.  Belirli bir işlemci/makine için yazılan kod, farklı yapıdaki başka bir makinede çalışmaz, tamamen yeniden yazılması gerekir. Örneğin 1011101100010001 farklı yapıdaki işlemcilerde farklı işlemleri yapar. Bu yüzden makine dili donanıma bağlıdır. Makine dili biraz daha kolay okunabilmesi için 16'lık sayı sistemi ile yazılır fakat derlenme sonrası kod ikilik sisteme çevrilir. İşlemci ikilik tabandaki kodu okur ve uygular.
Makine dili örneği 

Bu program ekrana "Hello world" yazısını yazar.
1011101100010001 0000000110111001 0000110100000000 1011010000001110
1000101000000111 0100001111001101 0001000011100010 1111100111001101
0010000001001000 0110010101101100 0110110001101111 0010110000100000
0101011101101111 0111001001101100 0110010000100001
Bu program ekrana "Hello world" yazısını yazar.
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21

İkinci kuşak dillerdir. Bu dillerde komutlar sembollerle ifade edilir, makine koduna çok yakındırlar. Yüksek seviyeli dillerin yaygın kullanımına karşın, halen hızın ve verimin önemli olduğu noktalarda  yazılan çoğu programda assembly dili kullanılmaktadır.

Orta seviye ve üstündeki dillerde yazılan programlar donanımdan bağımsız çalışırlar.Yani yazılan programlar farklı makinelerdede kullanılabilirler. Oldukça esnek olan bu diller hem üst hem alt seviye programlama yapabilirler. Yüksek seviye dillerine göre kullanımı daha zordur fakat programcıya daha özgür bir program geliştirme imkanı sunarlar. Örneğin:  C ,C++, C# , Java ,ADA...
C programlama dili örneği
Bu program ekrana "merhaba, dünya" yazısını yazar.

Yüksek seviyeli dilde, Assembly dili veya makine dilindeki birçok satır tek bir komutla gösterilir. Böylece program daha kısa bir sürede yazılır. Bu dillerin komutları İngilizce bir kelimenin tamamından alındığından öğrenmek kolaydır. Örneğin: Pascal ,Basic ,Fortran...
Pascal programlama dili örneği
Bu program ekrana "merhaba, dünya" yazısını yazar.

Bu programlama dilleri programlama hakimeyitini azaltırlar, bunun yanında en hızlı ve en etkili programlama dilleri bu kategoridedir. Çok  yüksek seviye programlama dillerini kullanmak ve öğrenmek kolaydır fakat bu tip diller ile yapabilecekleriniz kısıtlıdır. Örneğin: VisualBasic, VB.NET, Acces , Foxpro
Visual basic programlama dili örneği
Bu program ekrana "merhaba, dünya" yazısını yazar.

Beşinci nesil programlama dilleridir. Yapay zeka programlama dillerinin çalışma mantığı diğer dillere göre farklıdır. Diğer dillerde bir problemin çözülmesi için gerekenler adım adım yazılır ve programa nasıl yapacağı öğretilirdi.Kısacası bir algoritma oluşturulur ve program buna göre yazılırdı. Yapay zekada ise koşulları ve kısıtlamaları programa verdiğinizde, çözümü programın kendisi bulur. Açıkça kodlamanın yerine bildirimsel yöntemle çalışır. Örneğin: Prolog, OPS5 ve Mercury

Yazılım, belirli bir görevi yapmak için bilgisayar dili kullanılarak oluşturulmuş makine komutlarıdır.

Her yazılımın kendi türüne göre özellikleri farklıdır.Bu yüzden yazılımdan beklediğimiz temel özellikler de değişir. Fakat genel olarak her yazılım şu özellikleri taşımalıdır.
Kullanıcı için temel özellikler

Doğruluk: Program yapması gereken işi tam ve hatasız bir şekilde yapabilmelidir.
Kolay Kullanım: Programı kullanacak kişiler fazla yardım almadan, kendi başlarına kolayca kullanabilmelidir. Kullanıcı sezgilerini kullanarak programı kullanabilmelidir.
Basitlik: Programın arayüzü mümkün olduğunca sade ve basit olmalıdır. Kullanıcının nereye tıklayacağını, nereye yazacağını rahatlıkla görmesi gerekir.
Dayanıklılık: Program beklenmedik hatalardan dolayı çökmemelidir. Bu hatalar daha önceden öngörülmeli ve hatanın oluşması engellenmelidir.
Uyumluluk: Program çalıştığı sistemin üst versiyonlarında da çalışabilmeli, bunlara uyumlu olmalıdır.
Programcı için temel özellikler

Genişletilebilme: Program, geliştirilmeye, özelliklerinin artırılmasına açık olmalıdır.
Modülerlik: Yazılan program diğer programlar tarafından da kullanılabilir olmalıdır.
Kontrol Edilebilirlik: Hata olabilecek yerlere açıklayıcı hata mesajları konulmalıdır.
Parçalanabilirlik: Program küçük parçalara ayrılarak yazılabilmelidir. Bu sayede program daha kolay ve sağlıklı yazılabilir
Anlaşılabilirlik: Yazılan program kodları diğer bir programcı tarafından okunduğunda kolaylıkla anlaşılabilmesidir. Bunun için kodların yanına , ne iş yaptığını açıklayan mesajlar yazılmalıdır.
Koruma: Modüller birbirine müdahale etmemelidir.

Donanım sürücüleri
İşletim sistemleri
Sunucular (Application server,File server,DNS server, Database server )
Hizmet programları (Disk defragmenters,Registry cleaners )
Pencere sistemleri (KDE desktop)

Derleyiciler
Yorumlayıcılar
Hata ayıklayıcılar
Bağlayıcılar
Metin düzenleyicileri

Mesleki Yazılımlar
Bilgisayar destekli tasarım
Veritabanları
Eğitim yazılımları
Resim düzenleme
Endüstriyel otomasyon
Matematiksel yazılım
Tıbbi yazılım
Moleküler modelleme yazılımı
Simülasyon yazılımı
Video düzenleme yazılımı
Video oyunları
Kelime işlemci
Elektronik Tablolama yazılımı

Önsöz

1 Tarih, Teori, Bir Disiplin Olarak Psikoloji
1.1 Psikoloji Tarihi
1.1.1. Psikoloji Tarihi Çalışmaları
1.1.2. Psikolojinin Gelişimine Felsefenin Etkisi
1.1.3. Psikolojinin Gelişimine Fizyolojinin Etkisi
1.1.4. 19. Yüzyıl Alman Psikolojisi
1.1.5. Yapısalcılık
1.1.6. İşlevselcilik
1.1.7. Davranışçılık
1.1.8. Geştalt Psikolojisi
1.1.9. Psikanaliz
1.1.10. Hümanistik Psikoloji
1.1.11. Bilişsel Psikoloji
1.1.12. Psikolojinin Farklı Ülkelerde Gelişimi
1.1.13. Psikoloji ve Üçüncü Dünya Ülkeleri
1.2 Psikoloji Teorileri
1.3 Teorik ve Felsefi Psikoloji
1.4 Psikoloji Disiplini Konuları
1.5 Psikolojide Etik
1.6 Psikoloji ve Ulusal Gelişim
2 Araştırma Yöntemleri ve İstatistik
2.1 Psikolojide İstatistiksel ve Matematiksel Yöntemler ve Modeller
2.2 Psikolojide Veri Toplama ve Araştırma Desenleri
2.3 Psikolojik Test ve Ölçüm
2.4 Psikolojik Araştırmada Enstrümantasyon
2.5 Psikolojik Araştırmada Bilgisayarlar
3 Duyusal ve Motor Süreçler
3.1 Duyusal ve Motor Süreçlerin Ölçümü
3.2 Psikofizik
3.3 Görsel Süreçler
3.4 İşitsel Süreçler
3.5 Diğer Duyusal Süreçler
3.6 Çok duyulu süreçleme
3.7 Motor Süreçler ve Motor Beceriler
3.8 Duyu-motor ilişkiselliği
3.9 Duyusal ve Motor Bozukluklar
4 Dikkat ve Algı
4.1 Dikkat ve Keşif
4.2 Görsel Algı
4.3 İşitsel Algı ve Müzik Algısı
4.4 Diğer Modalite Algıları
4.5 Mekan Algısı
4.6 Zaman Algısı
4.7 Estetik ve Psikoloji
5 Öğrenme, Bellek ve Biliş
5.1 Koşullama
5.2 Öğrenme Stratejileri
5.3 Bellek Süreçleri
5.4 Çalışma Belleği
5.5 İleriye Yönelik Bellek
5.6 Bellek Yanılması
6 Biliş
6.1 Bilgilendirme Süreci
6.2 Zihinsel Algılama ve İmgeleme
6.3 Kavram Oluşumu ve Yapılar
6.4 Düşünce Süreci ve Anlama
6.5 Zeka ve Yaratıcılık
6.6 Problem Çözümü ve Karar Alma
6.7 Bilinç
7 Dil, Okuma ve İletişim
7.1 Psikolinguistik
7.2 Dil Edinimi
7.3 Konuşma ve Okuduğunu Anlama
7.4 Çok Dillilik
7.5 Sözsüz İletişim
8 Duygulanım ve Motivasyon
8.1 Duygulanım
8.2 Biyolojik Motivasyon
8.3 Sosyal Motivasyon
8.4 Dürtüler
8.5 Seksüalite
8.6 Hipnoz
9 Bilişsel Bilim ve Akıllı Sistemler
9.1 Bağlantıcılık
9.2 Sinir Ağları
9.3 Bilgisayar Modellemesi
9.4 Yapay Zeka ve Uzman Sistemler
9.5 Robotik
10 Hayvan Davranışı
10.1 İçgüdüsel Davranış
10.2 Duyu
10.3 Algı ve biliş
10.4 Toplumsal Davranış
10.5 Sosyobiyoloji
10.6 Evrimsel Psikoloji
10.7 Hayvan Modelleri
11 Davranışsal ve Bilişsel Nöro-Bilim
11.1 Davranış Genetiği
11.2 Bilişin Nöral Temelleri
11.3 Davranışın Nöral Temelleri
11.4 Biyopsikoloji
11.5 Psikonöroimmünoloji
11.6 Psikofarmakoloji
11.7 Nöropsikoloji
11.8 Nöro-imgeleme
12 İnsan Gelişimi
12.1 Bebeklik
12.2 ocukluk
12.3 Ergenlik
12.4 Yetişkin Gelişimi
12.5 Yaşam Boyu Gelişim
12.6 Yaşlılık
13 Gelişim Süreçleri
13.1 Fiziksel ve duyusal-motor gelişim
13.2 Bilişsel Gelişim
13.3 Dil Gelişimi
13.4 Kişilik ve Moral Gelişimi
13.5 Aile ve Sosyal Çevre
14 Eğitim Psikolojisi
14.1 Akademik Öğrenme ve Başarı
14.2 Sınıfın Sosyal Psikolojisi
14.3 Öğretme Psikolojisi
14.4 Psikoloji Öğretimi
14.5 Eğitimde Değerlendirme
14.6 Eğitim Teknolojisi
14.7 Öğrenme Yeteneksizliği
14.8 Zihinsel Gerilik
15 Kişilik ve Bireysel Farklılıklar
15.1 Kişilik Değerlendirilmesi
15.2 Kişilik Teorisi
15.3 Kişiliğin Biyolojik Karşılıkları
15.4 Kişiliğin toplumsal ve Kültürel Karşılıkları
15.5 Cinsiyet Farkları
15.6 Bireysel Farklar
16 Sosyal Psikoloji
16.1 Tutumlar, İnançlar ve Değerler
16.2 Toplumsal Biliş
16.3 İnsanlar Arası Süreçler ve İlişki
16.4 Grup Dinamikleri
16.5 Gruplararası Süreçler
16.6 Toplumsal Etki ve İletişim
16.7 Saldırganlık ve Şiddet
17 Toplumsal Konular
17.1 Etnisite ve “Irk”
17.2 Stereotipler, Önyargı ve Ayrımcılık
17.3 Din Psikolojisi
17.4 Aile ve Psikoloji
17.5 Nüfus ve Psikoloji
17.6 İşsizlik ve Psikoloji
17.7 Toplumsal ve Ekonomik Geçiş
18 Psikoloji ve Hukuk
18.1 Suç Psikolojisi
18.2 Suçla İlgili ve Yasal Süreçler
18.3 Yasal Karar Alımı
18.4 Kriminoloji ve Suç
19 Kültür ve Psikoloji
19.1 Psikolojide Kültürler Arası Yaklaşımlar
19.2 Kültürler Arası Psikolojide Yöntem
19.3 Kültür ve Biliş
19.4 Kültür ve İnsan Gelişimi
19.5 Bireycilik-Kolektivizm
19.6 Yerli Psikolojisi
20 Politik Psikoloji
20.1 Politik Çatışma ve Çözüm
20.2 Politik Sosyalizasyon
20.3 Barış Psikolojisi
20.4 Uluslararası İlişkiler ve Uluslararası Görüşmeler
21 Klinik ve Danışmanlık Psikolojisi
21.1 Çocuk ve Ergen Psikopatolojisi
21.2 Deneysel Psikopatoloji
21.4 Klinik Araştırma Yöntemleri
21.5 Psikolojik Bozukluk
21.5.1. Psikopatolojik Modeller
21.5.2. Araştırma, Tanı, Sınıflama
21.5.3. Genelleşmiş Anksiyete Bozukluğu ve Fobiler
21.5.4. Panik Bozukluk, Saplantı Zorlantı Bozukluğu, Akut ve Posttravmatik Stres Bozukluğu
21.5.5. Duygudurum Bozuklukları
21.5.6. Duygudurum Bozukluklarında Terapi
21.5.7. İntihar
21.5.8. Bedensel Bozuklukların Psikolojik Etkenleri
21.5.9. Yeme Bozuklukları
21.5.10. Cinsel Bozukluklar
21.5.11. Şizofreni
21.5.12. Kişilik Bozuklukları
21.5.13. Bellek ve Bilişsel İşlev Bozuklukları
21.5.14. Yaşlılıkta Ortaya Çıkan Bozukluklar
21.6 Okulda Psikolojik Danışma
21.7 Psikoterapi: Araştırma ve Tedavi Yöntemleri
21.8 Madde Bağımlılığı
21.9 Antisosyal Davranış
22 Sağlık Psikolojisi
22.1 Fiziksel ve Psikolojik Sağlık
22.2 Sağlık Tutumları ve Davranış
22.3 Stres
22.4 Davranışsal Tıp
22.5 Rehabilitasyon
22.6 Ağrı ve Ağrı Yönetimi
22.7 Sağlık ve Ölüm
23 Spor Psikolojisi
23.1 Sporda Motor Becerilerin Kazanılması
23.2 Sporda Bilişsel Stratejiler
23.3 Sporcuların Psikolojik Özellikleri
23.4 Sporda Eğitim ve İdman
23.5 Müsabaka Psikolojisi
23.6 Sporcular İçin Psikolojik Danışmanlık
23.7 Spor Psikolojisinde Mesleki Etik
23.8 Fiziksel Egzersiz ve Yaşam Kalitesi
23.9 Spor Psikolojisi ve Sporda Yaralanma
24 Endüstri ve Örgüt Psikolojisi
24.1 Örgütsel Davranış
24.2 Çalışma Psikolojisi
24.3 İş Becerisi Gelişimi
24.4 İnsan Kaynakları Yönetimi
24.5 Örgütlerde Liderlik ve Grup İşbirliği
24.6 İnsan Faktörleri Mühendisliği
25 Çevre Psikolojisi
25.1 Çevre-Davranış İlişkileri Hakkında Teoriler
25.2 Çevre Algısı ve Biliş
25.3 Gürültü, Hava, İklim, Felaketler, Toksik Tehlike, Kirlilik ve Davranış
25.4 İkamet Edilen Çevrenin ve Kurumsal Çevrenin Düzenlenmesi
25.5 İş, eğitim ve Boşzaman Çevreleri
25.6 Çevre Planlamasında Psikolojik Konular

Kaynakça

Araştırma Yöntemleri

Bilimler gerçeği bulmak için tümevarım ve tümden gelim olmak üzere iki yöntem kullanılır. Tüme varmak, tek tek olaylardan yola çıkarak genel kuram veren akıl yürütmedir. Fizik, Kimya, Biyoloji, Astronomi vb. bize sürekli yeni bilgiler verir. Ancak yanılma olasılığı az da olsa vardır.
-Tümden Gelim: Genel ilkelerden özele varan akıl yürütmeye denir ve %100 kesindir. Ancak yeni bir bilgiyi vermez. Matematik ve mantık, bu yöntem kullanılır. Örnek, tüm insanlar ölümlüdür. Ayşe bir insandır. -> Öyleyse Ayşe bir ölümlüdür.
-Tümevarım: Gözlenen tek tek olgulardan yola çıkarak genel yargılara ulaşmaktır. Başka bir deyişle tümevarım özelden genele giden bir akıl yürütme türüdür. Tümevarım yöntemi ile ilgili verilebilecek en basit örnek; her günün 24 saat sürdüğünün bilinmesi ile “haftanın günleri 24 saattir” şeklinde bir hükme varılabilinmesidir.

Psikoloji'de kullanılan yöntemler
-Betimsel yöntem (Tarama,doğal gözlem, görüşme, vak'a incelemesi)
-Korelasyonel Yöntem 
-Deneysel Yöntem (Bağımlı/bağımsız değişken, kontrol/deney grupları)
-Betimsel yöntem: Bir davranışın, bir olayın, bir ilişkinin betimlenmesini sağlar. Sözle olabileceği gibi sayılarla da olabilir.
a) Tarama: Bu yöntem öğrenci-öğretmen sorunlarının saptanmasında, oyların siyasal partilere dağılımının belirlenmesinde ve kamuoyu yoklamalarında kullanılır. Bunun için test ve anketten yararlanılır. Testler bireyin yeteneğini, zekasını, kişilik yapısını, başarısını ortaya çıkaran araçtır. Bu yolla bireyleri birbirleri ile karşılaştırmak mümkündür. Anketler ise bir konuda düzenlenmiş soruları, ilgili kişilere sorarak ya da göndererek bilgi derlemeye denir. Daha çok kişilerin görüşlerini toplamak amacıyla yapılır.
b) Doğal Gözlem: Gözleyici, duruma ya da olaya herhangi bir müdahalede bulunmaz. Sadece gördüklerini betimler. Gözlem yapmak için, günümüzde gözlem odası, film, fotoğraf makinesi, ses alma aygıtı gibi araçlardan yararlanılır.
c) Görüşme: Konuşma ve konuşturma yoluyla bireyin değerlendirilmesine denir. Bilgi edinmek için yapıldığı gibi ruhsal bozuklukların tedavisinde de kullanılır.
d) Vak'a İncelemesi: Freud'un başvurduğu yöntemdir. Bu yolla aile geçmişi, okul yaşamı, geçirilen hastalıklar, olağanüstü olaylar ve şimdiki durumdan oluşan bir biyografi oluşturulur. Bu biyografi bireyin bugünkü kişilik yapısının ve davranışlarının anlaşılmasında yardımcı olur.
e) İstatistiksel yöntem: Psikolojik araştırmalardan elde edilen sonuçların birçoğu sayılar şeklindedir ve bunların ne anlama geldiğini bilmek gerekir. Bunun içinde istatistiksel yöntemlerden yararlanılır.
-Korelasyonel yöntemler: İki dizi puan ya da ölçüm arasındaki karşılıklı ilişki anlamına gelir. Üç tip korelasyon vardır; pozitif, negatif ve nötr korelasyon.
a) Pozitif Korelasyon: İki cins verinin değişme yönü aynıysa korelasyon pozitiftir.

John B. Watson tarafından yapısalcılık ve işlevselciliğe karşı olarak kurulmuştur. Daha sonra B. F. Skinner, Albert Bandura gibi yeni-davranışçılar, Watson'ın kuramını geliştirmişlerdir. Davranışlara göre psikoloji bilimi, yapısalcılık gibi bilincin yapısını ya da işlevselcilik gibi bilincin işlevsel durumlarını değil, davranışları gözlemlemelidir. Davranışçılığa göre psikoloji, bilince dayanarak bilimsel araştırma yapmamalıdır. Belirli durumlarda insanların yaptıkları belirli davranışlar bu bilimin dayanağı olmalıdır. Ayrıca davranışçılık, Wilhelm Wundt'un içebakış teorisini de reddetmektedir. İçebakış, kişinin kendi bilinç durumunu gözlemlemesi demek olduğu için nesnel bir gözlem metodu değildir. Bu nedenle davranışçılar, denekleri olan insanların ya da hayvanların belirli bir durum altında oluşturdukları davranışları gözlemleyip raporlarlar. Bu deneylere örnek olarak Ivan Pavlov'un köpeklerle olan deneyleri ve B. F. Skinner'ın farelerle olan deneyleri ve John B. Watson'ın Küçük Albert deneyi gösterilebilir.

Etnisite ve ırk kavramları psikoloji bilimi bağlamında "toplumsallık" "kültür" "folk" temalarıyla karşımıza çıkmaktadır. **
İnsanın sosyal bir kimlik kazanmaya doğru ilerlediği  dönemde artık ben merkezci yapıdan çevresindeki dünyayı da anlamaya ve onu kabullenmeye başlar. Bu duruma önce kendi ailesi ile başlar ve daha sonra ait olduğu topluma doğru yönelir. "Ben" ilerleyişi yerine "biz"leşme veya -"ben" ama biraz da ve yine de "biz"- kaçınılmaz sonunu şekillendiren temel kavramlar. Çocuk artık kendi dışında oluşmuş ve oluşumu devam etmekte olan bir yapıya dahil olmuş (edilmiş) tir. Topluluk, grup, sosyalite. Çocuk için artık "benim için" temel dürtüsünün yerini, (bu temel itgenin reddedilmesini egale etmek, meşrulaştırmak, kabul sağlamak ve böylelikle herhalde yine bu itgenin sonuçlarına ulaşabilme gizli amacına özgülemiş olmakla birlikte) "bizim için" değer'i alacaktır. Bu temel itki değişimi ya bu şekilde saf ilkel bencilliğine sarılıp kalacak ya da bütüne adaptasyonun içsellenimindeki motivasyon değerleri kuvvetinde asıl istenç- itki halini alacaktır. 
Ama mutlaka başarıyla içinden çıkılacak olan bu karmaşadan sıyrılan çocuk için, etnisiteye hoş geldin demenin zamanıdır.

Geştalt Psikolojisi, psikolojinin kurucusu Wilhelm Wundt'un görüşlerine ve yapısalcılığa karşı Almanya'da oluşturulmuş bir psikoloji akımıdır. Bu akım, bilincin yapılarını incelemenin mümkün olamayacağını, çünkü insanların algılarının yapılardan çok onların birleşiminden oluşan farklı bir yapı oluşturacağını göstermek istemiştir. Bu nedenle bütüncül bir bakış açısına sahip olduğu söylenebilir. Bu akımın en önemli deyişi "bütünün kendini oluşturan parçalardan farklı" olduğudur. Bir şarkıyı dinlerken onu oluşturan notaları değil, o notaların oluşturduğu bütünü yani parçayı algılamamız gibi. Bu nedenle algıların bütüncül bakışını vurgulamaktadır.
II. Dünya Savaşı zamanında Geştalt psikologları Amerika'ya göç etmişlerdir. Burada hakim olan psikoloji akımı Davranışçılık ile mücadele etmişlerdir. Genel olarak bakış açıları yapısalcılığa karşı olduğu için ve de Amerika'ya gittiklerinde Amerika'da yapısalcılıktan çok davranışçılık hakim olduğu için Geştalt psikolojisi, kendine pek fazla yandaş bulamamıştır.

GİRİŞ :

Çocuğunuz  olduğu  zaman  başka meslekte eşi görülmemiş  ,  günde yirmi dört saat süren  bir işi üstlenmiş olursunuz :  Annelik
Anneliği kısaca tanımlarsak mutlu ve aklı başında insanlar yetiştirmek için bilimin çocuk psikolojisi konusunda altı yaşındaki çocuklar bruceinden hoşlanmıyor ak üzülürler bütün verilerinden , şefkatli  ve sevecen bir tutum içinde yararlanmak  diyebiliriz.gerel
Bilgi Rum bizni illa
Çocuk yetiştirmek güç ve karmaşık bir iştir. Ne var ki , dünyanın en mutluluk   getiren , insana huzur veren en tatlı uğraşlarından biridir. Bir annenin dünyaya sunacağı en önemli armağan , mutlu  ve güvenli bir insan olarak yetiştirmiş çocuklarıdır.
Annelik etmek , anne sevecenliği ile bilimsel  verileri kaynaştırmak demektir. Kendisini  , çocuğunun kafasının içindekiler hakkında bilimin getirdiği verilerle donatmış sevecen ve düşünceli bir anne , çocuğunu mutlu ve aklı başında bir insan olarak nasıl yetiştirebileceğini hemen öğrenir. 
Annelik etmek , özel bir tür psikolog olmak ve özel bir tür öğretmen olmak demektir. Çocuklarınızın psikolojisini anlayabilmek için çocuk psikoloğu olursunuz. Ama becerseniz de beceremeseniz de isteseniz de istemeseniz de , artık çocuk psikoloğu görevini üstlenmişsinizdir. 
Öte yandan , çocuklarınızın bütün yaşamları boyunca en önemli öğretmeni de siz olursunuz. Siz onlara ( öğrettiğinizin farkında bile olmadan ) öğrettiğiniz şeyler , çocuklarınız için okulda öğrenecekleri bütün derslerden daha önemli dersler olacaktır. 
Çocuklarınıza ayıracağınız zaman , başka bir şeye harcayacağınız zamandan çok daha kıymetlidir. İyi terbiye edilmiş , topluma kazandırılmış bir genç , hem ailesi hem de memleketi için bir servettir. Çünkü onun kuracağı aile , yapacağı başarılı işler sizin eseriniz olacaktır. Kadın  çocuk doğurmaz . Kadın toplum doğurur ,sözü ne kadar yerinde bir sözdür.  
Buradan hareketle , çocuklarınızda çözümleyemediğiniz psikolojik sorunlarda bir psikiyatristin yardımı istenmelidir. Ancak bu rasgele seçilmiş bir uzman olmamalıdır. 
İstanbul Bakırköy Ruh ve Sinir Hastalıkları Hastanesi Başhekimi Doç. Dr. Arif Verimli’ nin yaptığı araştırmaya göre , Türkiye ’de en çok intihar edenler arasında işsizler ve emeklilerin ardından üçüncü sırada psikiyatristler yer almaktadır.
Aşağıda anlatılan çocuğun psikolojisi ve davranış bozuklukları , çocuklarınızdaki ve hatta kendinizdeki sorunları algılamanızı sağlamaya çalışan bir metindir.
Şüphesiz sağlıklı bir nesil karşılıklı sevgi ve saygının hakim olduğu , bilinçli ve okuyan aile çekirdeğinde oluşacaktır. 
Dr. Ahmet  Berk 
Cidde 
	   				     drahmetberk@hotmail.com                       
																																						                                           İÇİNDEKİLER
	 1)Çocuğun ruhsal gelişimi ve psikolojik bozukluk belirtileri
	0-1 yaş dönemi 

    1-3	yaş dönemi				             					                                
    3-5	yaş dönemi
    6-12 yaş dönemi	
    Ergenlik dönemi	

2) 	Çocukluk ve ergenlik döneminde ruhsal kökenli bedensel belirtiler ve davranış bozuklukları

    Beslenme	sorunları
    Uyku 	sorunları
    Tuvalet 	eğitimi   ile ilgili sorunlar
    Altını	ıslatma
    Saldırganlık  ve şiddet
    İçe	kapanıklık
    Yalan   söylemek
    Hırsızlık
    Kekemelik
    Korkular

3) 	 Çocukluk ve ergenlikte ciddi psikolojik bozukluklar

    Aşırı hareketlilik ve öğrenme bozukluğu

4) 	Çocuklarda ciddi davranış bozukluğu

    Bebeklik otizmi ( içe dönük yaşam ) 
    Çocukluk otizmi 
    Çocukluk depresyonları
    Ergenlik depresyonları

5) 	Uzun süren hastalıklar

    Çocukların hastalıklara tepkileri 
    Anne babanın hastalıklara tepkileri 
    Ergenlik dönemindeki çocukların hastalıklara tepkileri
    Hastaneye yatırılmaya tepkiler

6) 	Disiplin ve çocuklara olumlu davranışların yerleştirilmesi
7) 	Çocuğun kişiliğini güçlendirmek
8) 	Anne babalar  için özetlenmiş öğütler
0-1 YAŞ DÖNEMİ
Yeryüzünde tüm canlılar arasında başkasının bakımına en uzun süre ve tümüyle gereksinimi olan tek varlık hiç kuşkusuz insandır.
Gözü iyi seçmeyen kulağı yalnızca gürültüleri algılayan  yeni doğmuş bir bebek yalnızca kendi bedeninden gelen uyaranlara karşı çok duyarlıdır:başka bir deyimle bebeğin antenleri çevreye değil kendine dönüktür. Emme dürtüsü o   denli 	güçlüdür ki uykuda da sürer. Uykuya dalarken emme hızlanır:emme bebekte bir gevşeme yapar haz sağlar. Bu nedenle ağzına konan emzik uykuya geçişini kolaylaştırır.
Bebeğin tam anlamıyla içe dönük yaşadığı bu ilk 2-3 aya normal otistik devre denir. Uyanıklık süresinin biraz uzamasıyla yavaş yavaş dışa dönüklük başlar. Ancak yine de içten gelen uyaranlar belirli bir eşiği aşınca  bebekte iç denge hemen bozulur organizmada bir gerginlik meydana gelir ve bebek buna tepkisini tüm bedeni ile tepinerek ağlayarak terleyerek titreyerek  idrarını yaparak gösterir.  Tepkisi globaldir. Beklemeye dayanamaz bütünüyle isteklerin doyumu son derece önemlidir. Bebeğin doğumdan itibaren emme ve yakalama refleksleri vardır. Ancak 3-4aylıkta görüş alanı içine çıngırak gibi bir obje konursa elini uzatıp objeyi yakalayabilir ancak bebeğin eli ve obje aynı anda görüş alanı içinde değilse kendiliğinden uzanıp yakalama yeteneği yoktur. 5. Aydan itibaren bebek elini bir objeye uzatıp ağzına götürme yeteneğine kavuşur.
Biliçsel gelişimde ikinci adım hafızanın gelişimidir. Bebek ilk haftalardan başlayarak kendisini rahat hissettiği zamanlarda veya çıngırak gibi bir objeyi gördüğünde gülümser. Ancak 6 aylıktan küçük bebek alıştığı yüzü yabancıdan ayırt edemez kendisi ile ilgilenen hareket eden her insana gülümseyebilir. Oysa 6. Ayın sonunda artık tanıma başlar. Örneğin bebek annesinin gidişini gözleri ile izler biberonu görünce ona uzanır biberonun üzeri örtülse onu gözleri ile arar. Annenin ve biberonun imajı artık hafıza merkezinde yer etmeye başlamıştır.
Bu nedenle 6-7. Aylardan başlayarak bebek kendisine iğne yapan doktoru veya hemşireyi tanımaya başlar.
Bugün tüm bilimsel araştırma sonuçlarına göre başlangıçta bebek anneye veya anne yerine geçen kişiye karşı özel bir bağlılığın olduğu sanılmamaktadır. Oysa çocuğun gereksinimleri karşılandıkça 3-6. Aylarda bebekte anneye karşı bağlanma duygusu gelişmeye başlar. 6. Ayda bu bağlanma duygusu öyle kuvvetlidir ki annenin kaybı ağır bebeklik depresyonuna yol açabilir hatta bu yokluğun uzun sürmesi  ileriki kişilik gelişiminde önemli zedelenmelere neden olabilir.
Annenin çocuğa karşı tüm içsel tepkileri en iyi rol yapanlarda bile kişinin bilinçli veya bilinçdışı tavırlarına yansır. Aşırı endişe telaş korku  aşırı güvensizlik  pişmanlık  isyan  bebeğin varlığını kabullenememe veya onu benimseme sevgi  ilgi gibi tüm duyguları bebeği beslerken  onu alırken  tutarken  yerine koyarken  özetle onunla beraberliğindeki tüm davranışlarda kendisini eleverir. İşte annenin davranışları bebeğin alıcı yeteneklerine uyarsa anne ile bebek arasında dengeli bir beraberlik devamlı biçimde sağlanırsa  bebeğin bedensel olarak da bir bozukluğu yoksa bebeğin uykusu rahat ve derindir  beslenmesi  barsakları normaldir bebek huzurludur. Annenin kendisini hep seveceğinden  hep isteyeceğinden  onu hiç terk etmeyeceğinden emin olma duygusu çocukta temel güven duygusunun çekirdeğini oluşturur Böylece çocuk önce kendisini devamlı seven koruyan anneye güvenir  sonra korunduğu sevildiği gereksiz yere terk edilmediği için kendi benliğini sevilen değer olarak hisseder. Kısaca kendine güvenmeye başlar.
Tam aksine annenin hamileliği ileri şekilde huzursuz devam etmişse bebeğin bundan olumsuz şekilde etkilenmesi büyük olasılıktır. Annenin hamileyken veya bebeğin doğumundan itibaren annenin sürekli huzursuzluğu  duygusal çelişkileri  çaresizliği  bebek ile anne arasında dengeli beraberliğin kurulamaması hiçbir organik neden bulunamamasına karşın bebekte uyku ve yeme problemlerine  gaz sancılarına yol açabilir.
Böyle bir durumda hiç kuşkusuz önce annenin sorunlarının ele alınması ve annenin rahatlatılması gerekir.
1-3  YAŞ  DÖNEMİ
Bu dönemin en belirgin özelliği çocuğun istemli hareketleri yapabilme yeteneklerini kazanmasıdır. Bu dönem onun çevresini etkin biçimde tanıyabileceği kendi kendine keşifler yapacağı ve kendine güvenini geliştireceği bir süreçtir. Bu dönem çocuk için olduğu kadar anne içinde bir öğrenme dönemidir. Çocuk evi dolaşır ve yeni şeyler öğrenirken annede o zamana kadar aklına getirmediği biçimde çocuğunun nerelere girip çıkabileceğini  nereleri karıştırabileceği ve ne gibi tehlikelerle karşılaşacağını öğrenir. Çocuğun 1-3 yaş dönemi diğer bir isimle sıralama çağına girmesi annelere yeni bir yükümlülük getirir. Bu çağda çocuğu olan annenin ilk yapacağı şey evinin düzeni konusunda bir karar vermesidir: Evi sadece büyüklere özgü  bir ev mi olacaktır yoksa çocuklu bir ev mi ?  Bu dönemde annenin yapması gereken şey Çocuğun erişebileceği yerlerdeki onun için tehlikeli olabilecek şeyleri ve annenin değer verdiği vazo biblo gibi şeyleri çocuğun uzanamayacağı yüksekte bir yere kaldırmaktır. Ancak bu çağdaki çocuğunuza karşı davranışınızı çok ölçülü ayarlamak gerekir. Çünkü çocuğunuzu karşılaşabileceği tehlikelerden korumaya çalışırken aşırı koruyucu olabilirsiniz ki bu ikisi birbirinden  çok  ayrı şeylerdir. Çocuğunuz kendi kendine fark edemeyeceği şeylere karşı korumaya muhtaçtır. Gerçekten tehlikeli bir durum  yokken de onu fazlasıyla sakınırsanız çocuğunuza yersiz korkular aşılamaktan onun kendine güvenini yok etmekten başka bir şey yapmış olmazsınız. Bu dönemde önemli olan  başka bir nokta da ailenin çocuğu tuvalet eğitimine alıştırma çabasıdır. Bu çocuğa kendi  dışkısını başkalarının isteğine bağlı olarak  tutmayı veya bırakmayı öğretmek demektir. Kısaca aile çocuğun kendi tutma- bırakma hazzına karışmakta onun bu serbest seçimine egemen olmaya çabalamaktadır. Sabırlı ve sevgi dolu anne çocuğun kendi dışkılaması üzerinde kontrol kazanmış olmasını belirttikleri sevinç işaretiyle ödüllendirirlerse  yalnızca kendi akıllarına geldiği  zaman ve yerde değil de çocuğun zaten bu gereksinimi duyduğu zaman ve işaretlere göre tuvalet eğitimini uygularlarsa bu çocuk için sorun olmadan

Koşullama
KLASİK KOŞULLANMA
1900'lerin başında Rusya'daki Ivan Pavlov laboratuvarında bir teknisyen olarak çalışıyordu. Pavlov, sindirim sistemiyle ilgili refleksler üzerine yaptığı çalışma ile Nobel ödülünü almıştır. Örneğin köpeğin ağzına yiyecek konulduğu zaman, yiyeceğin tükürük refleksi tetiklediği buldu.
Laboratuvar teknisyeni olarak görevi, köpeğin ağzına çeşitli yiyecekler yerleştirmek ve ne kadar tükürük salgıladığını ölçmek. Ama kısa süre sonra bir sorunla karşılaşıyor. Köpeğin ağzına birkaç defa yiyecek yerleştirdikten sonra, köpek yiyeceği görür görmez tükürük salgılamaya başlıyor.[1]
Pavlov önce bu beklenti salyasını küçük bir sorun gibi görünüyor. Sonradan köpeğin yiyeceği görür görmez tükürük salgılamasının da bir tür refleks olduğunu fark etti, öğrenilmiş bir refleksti bu. 
Çok iyi bilinen bir deneyde Pavlov köpeğin ağzına yiyecek yerleştirmede önce bir zil çalıyor. Zil sesiyle beraber verilen yiyecekle yapılan birkaç denemeden sonra köpek zil sesini duyduğu zaman bile tükürük salgılamaya başladı. 
Pavlov bu fenomene koşullu refleks diyordu. Günümüzde ise klasik koşullanma olarak biliniyor. Klasik koşullanma araştırmacılara gözlemlenebilir ya da objektif bir ortamda öğrenme sürecini inceleme olanağı sağladığı için önemli keşifti. [2]
Klasik koşullanma, nötr bir uyarıcının normalde başka uyarıcılar tarafından meydana getirilen bir tepkiyi meydana getirme becerisini kazandığı bir tür öğrenmedir.
EDİMSEL KOŞULLANMA
1800'lerin sonlarında Amerikalı psikolog E. L. Thorndike'nin laboratuvardayız. Görevi bir kediye, basit bir mandal sayesinde içeriden açılabilen bir kutunun içine yerleştirmek. Kutunun dışındaki bir tabakta ise balık bulunuyor. Kedinin mandal basıp kapıyı açmasının ve tabaktaki balığa ulaşmasının ne kadar ölmemiz gerekiyor. 
İlk denemede kedi kutunun içini koklar, partisini gelişi güzel delillere sokar, tesadüfen mandala dokunur, kapıyı açar ve balığa ulaşır. Kediyi ikinci bir deneme için tekrar kutuya koyar. Kedi tekrar kutunun içinde hareket eder, tesadüfen mandala dokunur ve balığa ulaşır. Bir kaç denemeden sonra kedi mandalın etrafında hareket etmeyi öğrenir ve sonunda mandala dokunarak balığa çabucak ulaşmayı başarır. 
Thorndike kedinin amaca yönelik davranışını açıklayabilmek için etki yasasını kullandı. 
Etki yasasına, göre bazı gelişi güzel hareketlerin keyif verici bir sonuç ya da ödül tarafından izlenilmesi durumunda, bu hareketler pekiştirilir ve gelecekte tekrarlanması olasıdır. 
Thorndike etki yasası, Pavlov'un koşullu refleksinden farklı bir öğrenme süreci tanımladığı için önemlidir. Günümüzde etki yasası, edimsel koşullanmanın bir parçası haline geldi. [1]
Edimsel koşullanma, bir hareketi izleyen sonuçların, o hareketin gelecekte tekrarlama ihtimalini azalttığı ya da çoğalttığı bir tür öğrenmeyi tanımlar.
BİLİŞSEL ÖĞRENME
1960'lardayız ve Albert Bandura'nın laboratuvarındayız. Çocuklar, bir yetişkinin durmaksızın plastik bir bebeğe vurduğu ve tekmelediği bir film izliyorlar. Filmden sonra çocuklar oyun oynuyorlar ve bu sırada davranışları izleniyor. 
Bandura, bir yetişkinin saldırgan davranışlarda bulunduğu filmi izleyen çocukların, filmi izlemeyen çocuklara göre daha saldırgan bir şekilde oyun oynadığını tespit etti. [3]
Çocukların davranışlarının artan saldırgan tepkilere dönüşmesinin ne Pavlov'un koşullanmış refleksi ne de Thorndike'nin etki yasasına dayanmıyordu. Bu öğrenme şeklinde, bütün öğrenme süreci gözlemlenebilir herhangi bir tepki ya da herhangi bir ödüllendirme olmaksızın çocukların zihninin içinde gerçekleşir. Bu zihinsel öğrenme süreçleri, 1960'larda başlayan ve nispeten yeni bir yaklaşım olan bilişsel öğrenmenin bir parçasıdır [4]
Bilişsel öğrenme, dikkate bellek gibi zihinsel süreçleri içeren bir öğrenme türüdür; gözlemler ya da taklit edilerek öğrenilebilir ve dışsal bir ödül ya da kişinin gözlemlenebilir bir davranış göstermesi gerekmeyebilir.

Psikoloji, insan zihni ve davranışlarını inceleyen bilim dalıdır. Ancak psikolojinin bilim olarak kabul edilmesi uzun bir sürecin sonucudur. İnsan doğasıyla ilgili sorular, Antik Yunan'dan günümüze kadar filozoflar, bilim insanları ve araştırmacılar tarafından ele alınmıştır. Psikolojinin tarihsel gelişimi, çeşitli düşünce akımları ve metodolojik değişimlerle şekillenmiştir.

Psikolojinin temelleri Antik Yunan'da atılmıştır. Sokrates, Platon ve Aristoteles, insan zihni ve ruhu hakkında önemli görüşler ortaya koymuşlardır. Platon, ruhun ölümsüz olduğunu savunurken, Aristoteles daha bilimsel bir yaklaşımla ruhun bedene bağlı olduğunu ifade etmiştir. Bu dönemde psikoloji, felsefenin bir alt dalı olarak kabul edilmekteydi.
Antik Roma ve Orta Çağ boyunca psikoloji, büyük ölçüde dini inanışlarla şekillenmiştir. St. Augustine ve Thomas Aquinas gibi düşünürler, insan ruhunun doğasını inceleyerek psikolojinin dini ve etik yönlerini ön plana çıkarmışlardır.

17. yüzyılda René Descartes, "Düşünüyorum, öyleyse varım" ilkesiyle zihin ve beden arasındaki ayrımı vurgulamıştır. Bu düalist yaklaşım, psikolojinin bilimsel olarak ele alınmasına zemin hazırlamıştır. John Locke ise empirizmi savunarak, insan zihninin doğuştan boş bir levha (tabula rasa) olduğunu öne sürmüştür.
18. yüzyılda psikolojinin bilimsel bir disiplin haline gelmesi Wilhelm Wundt'un çalışmalarıyla başlamıştır. 1879'da Leipzig Üniversitesi'nde kurduğu ilk deneysel psikoloji laboratuvarı, psikolojinin bağımsız bir bilim dalı olarak kabul edilmesini sağlamıştır. Wundt, bilinçli deneyimleri inceleyerek psikolojiyi sistematik bir bilim dalına dönüştürmüştür.

Psikolojinin gelişimi, farklı düşünce akımlarıyla şekillenmiştir. Bunlardan bazıları şunlardır:

Yapısalcılık (Structuralism)
Wilhelm Wundt ve Edward Titchener tarafından geliştirilen bu yaklaşım, bilinçli deneyimleri analiz etmeyi amaçlamıştır.
İşlevselcilik (Functionalism)
William James tarafından savunulan işlevselcilik, insan davranışlarının ve zihinsel süreçlerin adaptif işlevlerini incelemiştir.
Psikanaliz (Psychoanalysis)
Sigmund Freud tarafından geliştirilen psikanalitik kuram, bilinçdışı süreçlerin insan davranışları üzerindeki etkisini vurgulamıştır.
Davranışçılık (Behaviorism)
John B. Watson ve B.F. Skinner tarafından geliştirilen bu yaklaşım, gözlemlenebilir davranışları inceleyerek psikolojiyi daha objektif bir bilim haline getirmeyi amaçlamıştır.
Bilişsel Psikoloji (Cognitive Psychology)
1950’lerde başlayan bilişsel devrim, zihinsel süreçleri ve insan belleğini inceleyerek psikolojiye yeni bir perspektif kazandırmıştır.
İnsancıl Psikoloji (Humanistic Psychology)
Carl Rogers ve Abraham Maslow’un çalışmalarıyla gelişen bu akım, insanın kendini gerçekleştirme sürecine odaklanmıştır.

Türkiye’de psikoloji biliminin gelişimi 20. yüzyılın başlarına dayanır. 1915 yılında İstanbul Üniversitesi’nde ilk psikoloji laboratuvarı kurulmuş ve bu alanda akademik çalışmalar başlamıştır. 1950’li yıllarda Ankara Üniversitesi ve diğer eğitim kurumlarında psikoloji bölümlerinin açılması, psikolojinin Türkiye'deki akademik gelişimini hızlandırmıştır. Günümüzde psikoloji, hem akademik hem de klinik alanlarda önemli bir disiplin olarak varlığını sürdürmektedir.

Etik felsefenin, iyi olan ve kötü olanın kriterlerinin belirlenmesi ve iyi ve kötü davranışın sebeplerinin ve sonuçlarının değerlendirilmesine yönelik alt alanıdır. Psikolojide de etik araştırmacı, eğitmen ya da uygulayıcı olarak psikologun mesleğini icra ederken yapması ve yapmaması gereken şeylerin neler olduğunu belirler. Etik kodlar, genellikle psikoloji meslek dernekleri tarafından yazılı olarak belirlenmiş ve standartlaştırılmışlardır.

Türk Psikologlar Derneği (TPD) 18 Nisan 2004 tarihinde bir etik yönetmelik kabul etti. Yönetmelik büyük oranda APA etik kodlarının bir uyarlamasıydı.

Türkiye'de henüz bir psikologlar meslek yasası ve psikoterapi yasası olmadığı için yasal olarak tanınmış bir karar mekanizması yoktur. Bununla birlikte Türkiye'nin en büyük psikolog meslek örgütü olan Türk Psikologlar Derneği Etik Kurulu böyle bir mekanizma olmaya adaydır.

Türk Psikologlar Derneği'nin 18.04.2004 tarihinde yapılan 27. Olağan Genel Kurulu'nda kabul ettiği Etik Yönetmelik'in ana hatları şöyledir:

Türk Psikologlar Derneği Etik Yönetmeliği'nde psikologun yetkinliği ve yeterliliği ile ilgili şu maddelere yer verilir:

Psikologluk mesleğini icra eden kişinin öncelikle yasal psikoloji eğitimini alması gerekir.
Psikologun yeterliliğini koruması, alandaki yeni gelişmeleri ve gerekli eğitimleri takip etmesi gerekir.
Psikolog yöneleceği bir çalışma alanında çalışmaya başlamadan önce kendisinin alanla ilgili yetkinliğini gözden geçirmeli ve gerekiyorsa uygun eğitimleri almak ya da süpervizyona başvurmak gibi yöntemlerle yetkinliğini arttırmalıdır.
Eğer psikolog mesleğini uygun biçimde yapmasını engelleyecek kişisel sorunlar yaşadığına karar verirse, bu sorunu en uygun biçimde çözmelidir.
Psikolog etik ilke ve kuralları bilmeli, gerektiğinde yardım istemelidir.

Psikolog öncelikle hizmet verdiği kişi ve kurumlara karşı psikoloji bilgisini zarar verici bir şekilde kullanmamakla yükümlüdür. Bu anlamda TPD Etik Yönetmeliği'ne göre:

Hizmet verdiği kişi ve kurumlar için en yüksek yararı gözetmeli,
Danışan kişi ya da kurumlara, araştırma katılımcılarına, öğrencilere, süpervizyon alan kişilere ve deney hayvanlarına zarar verebilecek eylemlerden kaçınmalı ve önceden kestirilebilir bir zarar varsa, bunu en aza indirmek için çalışmalı,
Hizmet verdiği kişi ve/veya kurumun bağlılığını ve güvenini kötüye kullanacak biçimde gücünü ve statüsünü kullanmamalı,
Hizmet verdiği kişilerle ilişkisinin özelleşmesi ve cinselleşmesinden kaçınmalı, onları taciz etmememeli ve onlarla cinsel ilişkiye girmemeli,
Bilgi, statü ve sahip olduğu gücü kullanarak; kendi yararları doğrultusunda, danışanların, öğrencilerin, süpervizyon verdiği kişilerin, araştırma katılımcılarının, kurumsal danışanların ve iş yeri çalışanlarının emeklerini ve finansman kaynaklarını sömürmemelidir.

Çoklu ilişki "mesleki rolü gereği profesyonel bir ilişki içindeyken; psikoloğun, o kişi ile ek bir rolü üstlenmesi ya da o kişinin yakın ilişkide olduğu başka bir kişiyle ilişkiye girmesidir. Ayrıca hizmet verdiği kişiyle ya da o kişinin yakın ilişkide olduğu bir
başka kişiyle gelecekte başka bir ilişkiye gireceğine ilişkin söz vermesi durumları da “çoklu ilişki” kapsamına girer".
Psikolog eğer bir zarar verme ihtimaliyle karşı karşıyaysa çoklu ilişkiden kaçınmalıdır. Ancak böylesi bir zararın sözkonusu olmadığı zamanlarda ve kimi olağanüstü durumlarda çoklu ilişki etik dışı olarak değerlendirilmeyebilir.

Psikologun bilgisini psikolojik baskı aracı olarak kullanmaması gerekir. Bu anlamda:

İnsanlardan zorla bilgi almaz ya da insanları itiraf ettirmek için zorlamaz. Araştırma yaparken amacını önceden açıklayarak katılımcıların izinlerini alır.
Kimseyi, dünya görüşünü, cinsel tercihini, politik, dini ve ahlaki inançlarını açıklamak, yadsımak ya da değiştirmek yönünde zorlamaz.
Psikolojik bilgisinin başkaları tarafından kötüye kullanılmasını önlemeye çalışır.

Psikologun hizmet verdiği kişilere ve topluma karşı sorumluluğu vardır. Bu sorumluluğun farkında davranması gerekir. TPD psikologun başlıca sorumluluklarını Etik Yönetmelik'te şöyle sıralar:

Psikolog, mesleki uygulamalar içinde etik ikilemlerle karşılaşabilir ve bu ikilemleri çözmekle sorumludur. Bu tür sorunları kendi başına çözemediği durumlarda meslektaşlarından ve TPD Etik Kurulundan yardım alabilir.
Çalışması boyunca hizmet verdiği kişi ve kurumlardan edindiği bilgileri gizli tutmakla yükümlüdür.
Kişi ve/veya kuruma ait her türlü bilgi, değerlendirme, görsel kayıt ya da yazılı metinler psikolog tarafından koruma altında tutulur.
Psikolog yazılarında, derslerinde, verdiği eğitimlerde ve halka yönelik açıklamalarında danışanlarının, öğrencilerinin, araştırma katılımcılarının, kurumsal danışanlarının ve diğer hizmet verdiği kişilerin kimliklerini açığa çıkarabilecek bilgileri açıklamaz.
Psikolog mesleki ilişkisini kurarken, hizmet verdiği kişi ya da kuruma çalışmanın koşulları, akışı, bitişi ve takibi hakkında bilgi vererek ve hizmet verilenin onayını alarak bir anlaşma yapar.
Psikolog asistanlarına, öğrencilerine, eğitim ve süpervizyon aldığı ya da verdiği kişilere bilimsel ve mesleki alanda etik davranma sorumluluğuna sahiptir. Psikolojik çalışma yöntemlerini, yöntemlerin güçlü ve güçsüz yönlerini, etik ilke ve kuralları öğrenmesi ve öğretmesi gereklidir. Kendisi ile çalışan psikologların gerekli eğitim ve donanıma sahip, yetkin kişiler olmasını sağlamaya çalışır.Danışanları yönlendirirken, yönlendirilen kişinin yetkinliğinden emin olması ve danışanı bu kişinin eğitim, yaklaşım ve uzmanlığına ilişkin bilgilendirmesi gerekir.

Psikologun topluma, hizmet verdiği kişi ve kurumlara karşı dürüst olmak gibi bir yükümlülüğü vardır. TPD Etik Yönetmeliği'ne göre bu kapsamda:

Kendi eğitimi, verdiği hizmetler, bağlı bulunduğu kurum, verdiği hizmetler ve bu hizmetlerin sonuçları, ücretleri ve yayınları konusunda yanlış ve yanıltıcı bildirimlerde bulunmamalı,
Herhangi bir konuda açıklama yaparken, verdiği bilginin nesnel ve tam olmasını amaçlamalı,
Hizmet verdiği kişi ve kuruma, çalışma öncesinde ya da başında, çalışmanın maddi koşullarına ilişkin bilgi vermeli,
kamuya yönelik yayın organlarını kullanırken açıklama ve önerilerinin bilimsel temellere oturduğundan emin olmalı ve TPD Etik Yönetmeliği'ni dikkate almalı,
Hizmet verdiği kişi ya da kurumlardan ya da özel ilişkileri nedeniyle kendi etkisi altında kalabilecek kişilerden kendi yararına reklam amaçlı açıklama istememeli,
Hizmet talep edilmediği halde kişileri etkileyerek, kendinden ya da çıkar ilişkisi olanlardan hizmet alımına yönlendirmemelidir.

Psikologun her durumda insan haklarına saygı göstermesi gerekir. Yaş, kimlik, cinsiyet, cinsel kimlik, cinsel tercih, etnik köken, din, mezhep, sosyo-ekonomik düzey ve engelli oluşa karşı ayrımcılık yapmaz.

Psikologun hizmet verdiği kişi ve/veya kurumun gizlilik, özgürlük ve seçim haklarına saygı duyması gerekir ve bunları korumak için gereken önlemleri almalıdır.
Meslektaşlarının ve diğer profesyonellerin bilgi, bakış açısı, deneyim,sorumluluk ve uzmanlıklarına saygı göstermelidir.
Kendi kişisel, kültürel ve sosyal geçmişinin, cinsel tercihinin getirdiği kısıtlamaların çalışmalarını etkileyebileceğinin farkında olmalı, bu kısıtlamaların yol açabileceği olumsuzlukları en aza indirgemek için çalışmalıdır.
Kişilerin temel hak ve özgürlüklerine, onurlarına ve değerlerine saygı göstermelidir.

Eğitim veren psikologun eğitim programını oluştururken:

Kendi yetkinliğini değerlendirmesi,
Hedef kitleye uygun, yeterli düzeyde bilgi ve deneyimi sağlayan bir eğitim programı sunması,
Programı eğitim verirken katılımcılara ilişkin en az kişisel bilgiyi almaya uygun şekilde düzenlemesi,
Eğitim sonrası alınacak olan sertifikanın hedeflediği ve belgelendirdiği bilgi ve becerilerin tam olarak kazandırılmasını amaçlaması gerekir.
Ayrıca:

Eğitim programının içeriğinin, eğitim amaç ve hedeflerinin, ücretinin, süresinin ve alınacak olan sertifikanın tüm koşullarını ilgilenenlere sunmalı,
Verdiği dersin içeriğini tanıtırken; derste işlenecek konuları, değerlendirme ölçütlerini ve derste kazanılacak deneyimleri doğru tanıtmak için tüm çabayı göstermeli, verdiği eğitim ve öğretimde doğru ve güncel psikolojik bilgiler sunmalı,
Öğrencileri, eğitim ve süpervizyon alanları, yazılı ya da sözlü olarak, cinsel geçmişleri, travma ve taciz geçmişleri, almış oldukları psikolojik tedaviler, yakın ilişkileri ve politik tercihlerine ilişkin kişisel bilgi vermeye zorlamamalı,
Öğretmen-öğrenci, süpervizyon veren ve alanın ilişkisinde; psikolog başarı ölçütlerini, değerlendirme ve geribildirim sürecinin koşullarını, ilişkinin en başında ve açık bir biçimde açıklamalı,öğrencileri ve süpervizyon alan kişileri katıldıkları program çerçevesinde ve oradaki başarı durumlarına dayanarak değerlendirmelidir.

Danışanın Psikoterapiye Bilgilendirilmiş Onamı:

Psikolog, yardım için başvuran kişiyi, kendisinin yararlı olamayacağını düşünüyorsa, danışan olarak kabul etmeme konusunda karar verme hakkına sahiptir.
Danışanı, mümkün olan en kısa zamanda, "tedavi" süreci, ücreti, üçüncü şahıslar ile ilgili koşullar ve gizliliğin sınırları hakkında bilgilendirmeli, danışanlara sorularının yanıtlanması olanağını sağlamalı,
Danışan henüz reşit ya da kendi kararını verebilecek koşullara sahip değilse; velisinin/velayet sahibinin onayı alınmalı, ama danışanın özerklik hakları olabildiğince göz önüne alınmalı,
Danışanının özgür iradesini tanımalı ve korumalıdır. Danışan profesyonel ilişkiyi istediği zaman başlatma ve bitirme hakkına sahiptir. Kişinin kendi özgür iradesiyle gelmediği durumlarda bile psikologun işbirliği kurmaya çalışması gerekir.
Danışanlar, kullanılacak olan yöntem ve teknikler, tekniklerin yararları ve riskleri ve olası diğer yöntemler konusunda bilgilendirilmeli ve onayları alınmalıdır.
Eğer psikoterapiyi yapan kişi uzmanlığını henüz tamamlamamış bir stajyer ise; psikoterapinin sorumluluğu süpervizöre aittir. Danışan, psikoterapinin başında bu duruma ilişkin bilgilendirilmelidir.
Çift ve aile psikoterapisinde:

Psikolog, yakın ilişki içinde olan birden fazla kişiye hizmet 

İnsanlık tarihinin her döneminde görülen intihar olgusu, çağımızda gün geçtikçe artmakta ve önemli bir toplumsal sorun haline gelmektedir. Dünya Sağlık Örgütü, 2000 yılında tüm dünyada yaklaşık bir milyon kişinin intihar sonucu kendi yaşamlarına son verdiğini tahmin etmektedir. Bunun tüm dünyadaki ortalaması 100.000'de 16'dır. Bir başka deyişle her 40 saniyede 1 kişi intihar ederek ölürken her 3 saniyede 1 kişi de intihar girişimde bulunmaktadır. Yine Dünya Sağlık Örgütü'ne göre, son 45 yılda tüm dünyada intihar oranları %60 artmıştır. İntihar, günümüzde tüm ülkelerdeki ölümlerin ilk 10 nedeni arasında sayılırken; Amerika Birleşik Devletleri’nde 8. sırada yer almaktadır. Yine ABD'de 15-24 yaş arası ölümlerin üçüncü önemli nedeni intihardır. Dünyada ise beşinci sırada yer almaktadır. Bu eğilim, gelişmiş veya gelişmekte olan ülkelerde benzerlik göstermektedir. Geleneksel olarak en yüksek oranlar hala yetişkin erkeklerde görülmekteyse de 15-34 yaş arası gençlerde artış gösteren intihar oranları dikkat çekici bir problem haline gelmiştir.

Tarihsel sürece baktığımızda, insanla ilgili bilimlerin çok eski bir geçmişi olmadıklarını görürüz. İnsan, düşünen bir varlık niteliğini kazandığından bu yana kendiyle ilgili birçok soruya yanıt aramaya başlamıştır. Fakat, bunu sistemli bir biçimde ele alışı ancak günümüze yakın tarihlerde gerçekleşmiştir.
Bunun yanında, insanın bir anlam veremediği, anormal olarak değerlendirdiği insanın kendi canına kıyması eylemi o derece karmaşık ve acı verici bir olaydır. Bundan dolayı intiharın herkes tarafından kabul edilebilir bir tanımını yapmak da son derece güçtür. Çünkü, intihar olgusu ile ilgili bir konuyu açıklayabilmek için sağlam temellere dayanan bir tanım gerekmektedir.
Suicide (intihar) kavramının ortaya çıkışı oldukça yeni sayılır. Latin kökenli kelimelerden oluşmasına rağmen, Latince değildir. İngilizce’de suicide olarak ilk kullanım tarihi 1662’dir.
Ortaçağda Latince’de sui homicido ya da sui ipisus homicidum deyimleri kullanılırdı. İntihar kavramı dilimize Tanzimat döneminde girmiştir. Bu dönemde Türkçe’ye çevrilen eserlerde kendini katletmenin yerine intihar kelimesi kullanılmaya başlanmıştır. Bu kelime Arapça’da kurban anlamına gelen nahr kelimesinden meydana gelmiştir. Günümüzde bazı eserlerde ise intihar yerine öz-kıyım ya da öze-kıyım gibi kavramlar kullanılmaya başlanmıştır.
İntihar olgusu ile doğrudan veya dolaylı olarak ilgilenen herkes, kendi bakış açısından hareket ederek bir tanım yapmaya çalışmıştır. Yani konuyla ilgilenen kişi sayısı kadar çeşitli intihar tanımları vardır. Fakat bu tanımların çoğu, dikkatlice bakıldığında, ya dar kapsamlı ya da tanım olamayacak kadar geniştir.
Genel geçerliliği olabilecek bir tanıma ulaşabilmek için, olgunun çeşitli niteliklerine anlam kazandıracak noktalara temas etmek gerekir. Bu nedenle geçmişte yapılan tanımları inceleyerek ve bunların eksikliklerini vurgulayarak bir tanıma ulaşmak mümkündür.
Belçikalı bir astronom ve istatistikçi olan L. A. Quetelet, topladığı istatistiksel bulgulardaki sonuçlara bakarak, intiharı değişmez bir fenomen olarak, insan istem ve iradesi ile ilgili olmayan, adeta insanlığın ödemek zorunda olduğu bir borç olarak ele alır. Konuya bu şekilde soyut olarak yaklaşılırsa, felsefi anlamda bu tanımın doğruluğu savunulabilir. Çünkü intiharın nedenleri bütünü ile ortaya konulmazsa, sayıları gün geçtikçe hızla artan kurbanların bu borcu ödemeye devam edecekleri kaçınılmaz bir gerçektir. Fakat, Quetelet’in yaptığı gibi, istatistiksel sonuçlardan böylesi yargılara ulaşmak bilimin uğraş alanı dışında kalır. Bu nedenle yukarıdaki gibi bir tanımda insanla ilgili bir konu olan intihar tanımlamasında insan öğesinin tanım dışı bırakılması, tanımın geçersizliğini ortaya koymaktadır.
İntiharı tanımlarken en temel öğe olan insanı ele almak gereklidir. Fakat insan öğesini dikkate alan her tanımlama da doğrudur demek anlamına gelmez bu. Belirli bir bakış açısından yapılan tanımlar, o yaklaşımın temelinde yatan anlayışı sergiler.
Altavilla’nın “intihar, kendini isteyerek öldürmektir” tanımını Faruk Erem de kabul etmiştir. Bu tanıma göre içki, sigara, uyuşturucu madde vb. kullanan kişi de intihar etmiş sayılmaktadır. Fakat bu gibi maddeleri kullananların hemen hepsinin intihar etmek gibi bir niyetlerinin olmaması tanımın eksik olduğunu göstermektedir.
Malapert ise; “intihar hemen daima egoizmin ürünüdür” demektedir. Bu görüş oldukça fazla taraftar toplamasına rağmen, tanım olmaktan uzak ve eleştiriye açıktır. Kimi intihar olayının temelinde vatan sevgisi, ideoloji, başkasının durumuna üzülme gibi nedenler yatmaktadır.
“Bir kimsenin yakın ve kaçınılmaz olan veya öyle zannedilen bir acıyı (şerefsiz bir durum, mahkumiyet, sefalet, çok sevilen bir kişiyi kaybetme vb.) bertaraf etmek niyetiyle hayatına son vermesi intihardır” tanımı ise Ferri’ye aittir.
Kriminoloji alanının uzmanları olan bu kişiler intihar olgusuna suç kavramı açısından yaklaşan düşünürlerdir. Fakat intihar ne sadece egoizmin ürünü, ne de sadece yaklaşan bir acıdan kurtulmaktır. Çünkü, ölümün kendisi acı ve korku veren bir olaydır.
T. G. Masaryk ise intiharı tanımlamadan önce doğal ve doğal olmayan ölüm ayrımını yapar. Kişinin organizmasının herhangi bir nedenle fonksiyon göremedigi durumda yaşamı ölümle noktalanır, ki bu doğal ölümdür. Savaş, cinayet, kürtaj, kaza ve intihar ise doğal olmayan ölümlerdir.
Masaryk’a göre geniş anlamda intihar hayatın tehlikelerine karşı gerek pozitif ve gerek bir katılma veya negatif ve pasif bir tutumla kişinin hayatına kasıtsız bir müdahalesi sonucu ortaya çıkan anormal tip ölümlerdir. Dar anlamda intihar ise kişinin kasıtlı olarak hayatına son vermesidir. Masaryk’a göre intiharda ölümün hemen gerçekleşmesi gerekmez; kişi ölümü yavaş yavaş da arayabilir. Ayrıca, davranışa aktif olarak da katılmayabilir. Günümüz modern toplumlarında intiharın daha yaygın olduğunu savunan Masaryk’a göre, temizlik ve sağlık şartlarına gerekli özenin gösterilmemesinden kaynaklanan birçok ölüm de geniş anlamda intihardır.
Littre’ye göre; “intihar kendisini öldüren insanın eylemidir.” Bu tanıma göreyse, kaza ile zehir içen bir kişinin ölümünü de intihar olarak değerlendirmek gerekir.
İntihar konusunda uzmanlığı tartışılmaz kişilerden biri olan Durkheim ise Littre’nin tanımını eleştirerek belirli sınırlar çizer. Durkheim’a göre; “intihar, bir insanın, doğuracağı sonucu bilerek olumlu veya olumsuz bir eylemle doğrudan veya dolaylı olarak kendini ölüme sürüklemesidir.” Böylece kaza sonucu olan ölümler tanım dışı bırakılmıştır.
Durkheim da, Masaryk gibi, aktif bir eylemin intiharla sonuçlanması yanında, pasif ve dolaylı bazı eylemlerle de aynı sonuca ulaşılabileceğini vurgulamaktadır. Örneğin, din korkusu ile intihar edemeyen kişiler, ölüm cezası verilen bir davranışta bulunarak da aynı sonuca ulaşabilirler.
Halbwachs, Durkheim’in tanımını geniş bulur. Çünkü, Durkheim tanımında intihar edenin ölüm niyetinden, ölüm kararından sözetmez. Halbwachs, onun tanımına “fedakârlık olmayan” ve “kasıtlı ölüm” kaydını koyar ve intiharı şöyle tanımlar: “Kendisini öldürmek niyetiyle olay kurbanı tarafından yapılan bir aksiyonun sonucu olan her tür ölüm intihardır”.
Durkheim’ın tanımı aynı şekilde Delmas tarafından da geniş bulunmuştur. Delmas’a göre, o halde tehlikeli işlere atılan kişileri de intihara kalkışmış saymamız gerekir. Gözüpek canbazların, kendi üzerinde deney yapan doktorların, tehlikeli inişler yapan pilotların az veya çok muhakkak bir yoldan ölüme götürecek davranışta bulundukları sık sık görülür. Ancak bunları intihar olarak isimlendiremeyiz. Delmas, tanımında kişinin aklı başında olduğunu ve ölümle yaşamak arasında tam ve iradeli bir seçme yaptığını belirtir. Delmas’a göre “intihar, aklı başında bir insanın yaşamakla ölmek arasında bir seçme yapabileceği halde, her türlü ahlak baskısı dışında ölümü seçip kendini öldürmesidir”.
Daha sonra Dynes, Clarke, Dinitz gibi araştırmacılarla birlikte, intihar tanımında saldırganlık kavramını görmekteyiz. Bu araştırmacılar intiharı kişinin saldırganlığını kendine yöneltmesi sonucu meydana gelen bir olay olarak ele almışlardır.
Psikoloji alanında söz sahibi olan Sigmund Freud saldırganlık kavramını daha detaylı olarak incelemiştir. Teorilerini bu kavram üzerinde yoğunlaştıran Freud, “intiharı önceleri özdeştirilmiş bir sevgi nesnesine yöneltilmiş saldırganlık neticesi meydana gelen bir depresyonun sonucu olarak yorumlamış; daha sonraları ise ölüm içgüdüsünün etkinlik kazanarak kişinin kendi üzerine çevrilmesi olarak tanımlamıştır.”
Schilder, Freud’un tanımını eksik bularak şöyle bir tanım yapar: “İntihar, bir diğer insana yöneltilmek istenen kızgınlığın kişinin kendi üzerine çevrilmesinin yanı sıra, sevgisini esirgeyen bir insanı cezalandırma veya onunla bir tür barış yapma isteğinin ve de aynı zamanda, baş edilemeyen güçlüklerden kaçışın anlatımıdır.”
Freud ve Schilder’in tanımlarını belli ölçüde kabul eden Bernfeld, saldırganlığın kişinin kendine yönelmesini ele alarak daha katı bir tanım yapar. Bernfeld’e göre, intihar eden kişi gerçekte başka birini öldürmek ister. Bu eylemi kendisine yöneltmesi için karşısındaki o kişiyi güçlü bir biçimde özdeştirmiş olması gerekir. Ancak o zaman kişi, önceleri sevdiği ve sonradan nefret ettiği bu ikinci kişiyi de kendi ölümü ile ortadan kaldıracağına inanır. Ayrıca, öldürme isteğinden ötürü duyduğu suçluluğun karşılığını da ödemiş olur.
Bu tanımların da gösterdiği gibi, psikoloji alanındaki bilim adamları intiharın içsel faktörlerinde odaklaşmış görüşleri benimsemektedirler. Oysa, sadece içsel faktörlerin ele alındığı, toplumsal faktörlere hiç değinmeyen bir tanım, toplumsal bir varlık olan insanın intihar eylemini açıklayabilmekten uzak olacaktır.
Değişik bir tanım ise Richman tarafından yapılmıştır. Richman’a göre, intihar bir iletişimdir; yardım için ağlamaktır; başkalarından yardım istemektir; tehdit veya intikam metodudur; pişmanlık ve bir itiraftır. İntihar anlamında kullanılan iletişim sözlü veya sözsüz olsun, dolaylı veya dolaysız bir mesajdır. Yapılan birçok araş

İşlevselcilik yapısalcılığa tepki olarak doğmuştur. Bu kuramda söz sahibi olan iki bilim adamından biri J. Dewey ve diğeri W. James'dir. 
İşlevselcilikteki en önemli paradigma, insan zihnini anlamak için yapısından çok işlevine bakılması gerektiğidir. Önemli olan insanın bilinçli deneyimleri ile davranışları arasındaki ilişkiyi keşfedebilmektir.
James Angel (1869-1949) işlevselciliği resmen tanınan bir düşünce okuluna dönüştürdü. Angel'a göre "bilincin tüm faaliyetleri -duyumlarımızın, duygu ve heyecanlarımızın ve iradi eylemlerimizin hepsi- organizmamızın hem fiziksel hem de toplumsal çevremize gösterdiği adaptasyonlardır."
Angel'a göre işlevselcilik şunların incelenmesidir;
1. Ögelerin değil, zihinsel faaliyetlerin
2. Bilincin (irade ve yargı gibi süreçler dahil)
3. Zihin-beden ayrımına gitmemenin
İşlevselcilik tarihsel açıdan ise yapısalcılık ile davranışçılık -veya diğer görüşler- arasında önemli bir köprü görevi görmüştür.

Etkileşimli Python, yani Python'u komut satırında çalıştırarak kodlarımızın çıktısını doğrudan görmek. Bunun için komut satırını Ctrl + Alt + T tuşlarıyla açıp python3 komutunu giriyoruz. Bundan sonra şu tarzda bir çıktı aldıysanız artık Python kodlarınız deneyebilirsiniz:

Python 3.4.3 (default, Mar 26 2015, 22:03:40) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Aşağıdaki kodları girdiğimizde:

print("Hello world!")
Şöyle bir çıktı alırız:

'Hello World!'
Anladığınız gibi print fonksiyonu karakter dizilerini ekrana yansıtmamıza yarıyor.
Örnekteki gibi bu tür kodlarınızı etkileşimli Python sayesinde test edebilirsiniz. Bundan sonraki konular için bir editöre ihtiyacınız olacak. Kodlarımızı editör aracılığıyla yazıp kaydedeceğiz. İnternet üzerinden indirebileceğiniz bir çok editör bulunmaktadır, Python için uyumlu olan istediğiniz editörü kullanabilirsiniz.

Python 3.x serisi 2.x serisine göre daha güçlüdür ve 2.x serisinin hatalarından arındırılmıştır. 2.x serisi ile yazılmış bir program 3.x serisi altında çalışmamaktadır. Ters durumda da aynısı geçerlidir. Geliştiriciler hem 2.x hem de 3.x serisi üzerinde çalışmaya devam etmektedirler. Python programlama diline yeni başlayanlar için 3.x serisini öğrenmek, 2.x serisinin ileride kullanılmayacağı düşünüldüğünde daha mantıklıdır.

Bu kitapta Python 3.x serisi Ubuntu (GNU/Linux) üzerinden anlatılacak olup komut satırı ile ilgili temel bilgilerden sonra dil hakkında konular anlatılmaya başlanacaktır. Ubuntu'nun 12.10 sürümünden itibaren hem 2.x hem de 3.x serisi kurulu olarak gelmektedir. Eğer bilgisayarınızda Python 3.x yüklü değilse, kurulumunu yaptıktan sonra kitaba devam etmeniz isabetli olacaktır.

Python programlama dili ile ilgili ilk denemelerimizi yapmadan önce komut satırını kullanmayı bilmemiz gerekmektedir. Komut satırı bizim için kodlarımızı deneyip hızlıca sonuçlarını göreceğimiz bir ortamdır. Bu ortamın kullanılması ile ilgili temel bilgiler bu konu altında bulunmaktadır.

Ctrl + Alt + T tuşlarıyla komut satırına ulaşılabilir.

Aşağıdaki komut ile hangi dizin altında olduğunuzu öğrenebilirsiniz.

pwd
Bu komutu verdikten sonra şuna benzer bir çıktı alırsınız:

/home/Kullanıcı adınız

Dizin altındaki içerikleri listelemeniz gereken durumlar olabilir. Dizin içeriğini öğrenip içerikle ilgili işlemler yapabilirsiniz. Bunun için şu komut kullanılmaktadır:

ls

Dizinler arasında geçiş yapmak için cd komutu kullanılmaktadır. /home/PC dizini altında bulunduğumuzu varsayalım, masaüstüne geçmek için örnek komut kullanımı:

cd Masaüstü
Masaüstündeki "klasör" dosyasına geçiş yapmak için örnek komut kullanımı:

cd /Masaüstü/klasör
Masaüstündeki "klasör" dosyasından tekrar masaüstüne dönmek için yani bir üst dizine geçiş yapmak için örnek komut kullanımı:

cd ..

Mesela yaptığınız bir program farklı bilgisayarlarda çalıştırılacak. Fakat bunun şöyle bir sıkıntısı var, her bilgisayar sahibinin kullanıcı adı farklıdır. Yani sizin bilgisayarınız /home/mehmet olabilir ama başkasının bilgisayarında bu /home/ahmet de olabilir. Bu tür sıkıntıları önlemek için çevre değişkenleri kullanılır. Çevre değişkeni:

$HOME
Örnek kullanım:

cd $HOME/Masaüstü/ProgramAdı
Ayrıca $HOME yerine ~ (tilde) de kullanılabilir:

cd ~/Masaüstü
Durumu anlamak için echo $HOME komutuyla bu değişkenin bilgisayarınızda nasıl bir çıktı verdiğini görebilirsiniz.

Komut satırında bir dizin isminin baş harflerini yazıp tab (sekme) tuşuna basarsanız, komut satırı dizinin geri kalan ismini tamamlar.

Bir dosyaya veya dizine bağlantı içeren dosyalar denir. Mesela karışık ve uzun bir dosyanız var ve buna daha kolay şekilde ulaşmak istiyorsunuz. O halde aşağıdaki komut ile bunu yapabilirsiniz:

ln -s $HOME/çok_uzun_bir_dosya_adı $HOME/dosya
Gördüğünüz gibi gayet kolay.

./deneme komutuyla "deneme" isimli dosyayı çalıştırmanız gerekecek fakat dosyayı çalıştırma yetkiniz yoksa şöyle bir hata verir:

-bash: ./deneme: Permission denied
Böyle bir durumda şu komut ile çalıştırma yetkilerini alabilirsiniz:

chmod +x deneme
İşletim sisteminin tüm kullanıcıları için yetkiyi açmak için:

chmod a+x deneme
Sadece size yani o an açık olan kullanıcı oturumuna yetki vermek için:

chmod u+x deneme
Yetkileri geri almak için:

chmod -x deneme

Kopyalama:

cp özgün_konumdaki_dosya hedef_konumdaki_dosya
Bir dizinin tamamını hedef dizine kopyalamak istiyorsanız:

cp -rf özgün_dizin hedef_dizin_adresi
Silme:

rm silinecek_dosya
Tüm dizini silecekseniz:

rm -rf silinecek_dizin
Taşıma:

mv özgün_konumdaki_dosya hedef_konumdaki_dosya

Python size esnek ve geniş bir değişken imkanı ve özellikleri sunar. Python'da kullancabileceğiniz, sayı, metin, liste, sözlük ve tüpler bulunur. Diğer dillere göre değişken tipi belirlemeye gerek yoktur. Örnek bir sayısal değer tanımlayacak olursak;

Metin olayında da kurallar yine aynıdır;

Örnekte birinde tek tırnak '' diğerinde çift tırnak "" kullanmamızın sebebi Python'un bu konuda da esnek olmasından kaynaklanıyor.
Liste değişkeni Python'un iddialı olduğu konulardan biridir. Python'da listeler metotlarıyla güçlüdür ve esnektir.

Listeyle beraber gelen sıralama, ekleme, çıkarma gibi metotlara diğer konulardan ulaşabilirsiniz.
Listeye öge eklerken tıpkı değer oluşturur gibi tipini belirlemeden ekleyebiliriz;

Sözlük tipinde ise veriler bir anahtar - değer ilişkisine dayanır. Tıpkı özelden genele sıralama yapar gibidir. Örneğin; hayvan sınıfı genel bir ifade ancak kedi bu sınıfın özel bir ifadesidir.

Tüpler listelerin benzeridir. Aralarında bir çok metot farkı vardır. En temel özellik, listeye sonradan öge ekleyip çıkarabiliriz ancak tüplere bu değişiklikleri yapamazsınız.

Oluşturduğumuz bir tüp ve bu tüpün listeye göre avantajı yanlışlıkla da olsa değiştirilemiyor olmasıdır. Bu yönüyle tüpler güvenilirlik açısından tercih edilebilir.

Python nesne yönelimli, tür güvenliği olmayan, çoklu platformlu, basit ve temiz bir dildir. Python'u diğer birçok dilden ayıran en önemli özelliği hemen hemen hiçbir gereksiz kod gerektirmemesidir. Python bu özelliği ile program yazma işini çok kolaylaştırmakta ve zevkli hâle getirmektedir. Python ayrı bir derleyiciye ihtiyaç duymaz; normalde C ve C++ dilleri için kullanılan GCC programı, Python kodlarını derlemek için de kullanılabilir. Ancak istersek Python kodlarını derlemeden de, direkt kaynak koddan çalıştırabiliriz. Zaten son bölümlere kadar Python kodlarını derlemeyeceğiz, direkt kaynak koddan çalıştıracağız. Python'un çoklu platformlu olması dolayısıyla Python'la bir işletim sisteminde yazdığınız bir kod diğer işletim sistemlerinde, kodda bir değişiklik yapmadan veya çok az değişiklik yaparak çalıştırılabilir. Ayrıca Python farklı işletim sistemlerinde kullanılabilir. Ancak bu kitapta Python, Pardus (Linux) üzerinde anlatılmıştır. Pardus'ta Python kurulu olarak geldiği için ayrıca bir kurulum yapmaya gerek yoktur. O yüzden direkt Python'u kullanmaya başlayacağız. Python büyük-küçük harf duyarlılığı olan bir dildir. Bu yüzden harflere dikkat etmeliyiz.

Bir metin editöründe aşağıdaki dosyayı oluşturun ve ismini deneme.py verin:

Bu Python kodu, komut satırı ekranına deneme yazacaktır. Bu dosyayı çalıştırmak için önce dosyayı çalıştırılabilir hâle getirmeliyiz. Bunun için dosyayı sağ tıklayın, "Özellikler"i seçin. Açılan pencerenin "İzinler" sekmesindeki "Çalıştırılabilir" onay kutusunu işaretleyin. Pencereden "Tamam" diyerek çıkın. Şimdi komut istemini açın, komut isteminde bu dosyanın olduğu klasöre geçip ./deneme komutunu verin. Programınız ekrana deneme yazıp kapanacaktır. Programınızı direkt "deneme" yazarak çalıştırmak için dosyamızın YOL üzerinde olması gerekiyor. Dosyamızın YOL üzerinde olmasını iki şekilde sağlayabiliriz: ya dosyamızı YOL üzerinde olan bir klasöre kopyalayacağız ya da dosyamızın içinde olduğu klasörü YOL'a koyacağız. YOL'daki klasörleri komut isteminde echo PATH

Python programlama dili 1990'lı yıllarda Guido van Rossum tarafından geliştirilmiştir. Bu programlama dilinin adı bir yılan olan "piton"dan değil hayranı olduğu bir komedi grubu olan Monty Python'dan gelmektedir. Fakat çoğu yerde Python simgesi yılan şeklindedir. Python'u diğer dillerden ayıran en önemli özellik sadeliği ve basitliğidir. Hiç programlama bilmeyen bir kişi için bu dil oldukça kolaydır. Google, Yahoo, Dropbox gibi büyük şirketlerde bünyelerinde basit olmasına rağmen çok büyük işler yapabilen Python diline ihtiyaç duymaktadırlar. Guido van Rossum 2005-2012 yılları arasında Google'da çalışmış. Daha sonrasında ise Dropbox'a geçmiştir. Google'da çalışırken Python'un daha ileri seviyelere taşınmasını hedeflemiş ve bunun için çalışmalar yapmıştır. 

Derleyiciye ihtiyaç duymaz.
Basittir ve basit olduğu için hızlıdır.
Büyük şirketler tarafından kullanılmaktadır.
Masaüstü uygulamaları, oyun programları, web programlama gibi önemli işler yapılabilir. (Fakat işletim sistemi yazamazsınız.)
Python'a herşeyi tek tek söylemenize gerek yoktur. Bazı isteklerinizi kendisi algılar.

İngilizceniz iyiyse:

           https://developers.google.com/edu/python/

Türkçe çalışmak için:

           http://www.istihza.com/

Temel fikir aynı parmaklara sürekli olarak aynı harflere basılması böylece harflerin yerlerinin kolay ezberlenmesi ve klavyeye bakmadan yazı yazılmasıdır. Böylece yazan kişi yazarken, elleri klavyeyi kapatsa bile harfleri aramak için üzerine eğilmek zorunda kalmaz. On parmak öğrenmedeki en önemli kurallar klavyeye bakmamak, sürekli aynı harfe aynı parmak ile basmak ve ellerin doğru yerleştirilmesidir.

Daha az yorulmak.
Daha hızlı yazmak
Bilgisayar başında daha sağlıklı durmak.
Klavyeye bakma zorunluluğunun ortadan kalkması

Sol elin işaret parmağı bu çıkıntılı F harfine gelecek şekilde resimdeki gibi sırasıyla yerleştirilir. Bundan böyle her iki elin de baş parmakları yalnızca Boşluk, space, tuşuna gelecek şekilde yerleştirilir.

Serçe Parmak: Serçe parmak normalde A harfinin üzerine gelir. Ama [1], [Q], [A], [Z] harflerine ve bu harflerin oluşturduğu hattın sol tarafındanki tuşlara basar.
Yüzük Parmağı: Normalde S harfinin üzerinde hazır durur ama [2], [W], [S], [X] Harflerine de basar.
Orta Parmak: Normalde D harfinin üzerinde hazır durur ama [3], [E], [D], [C] harflerine de basar.
İşaret Parmağı: Normalde Çıkıntılı F harfinin üzerinde hazır bulunur ancak [4], [R], [F], [V] Hattı ile birlikte [5], [T], [G], [B] hattındaki harf ve rakamlara da gerektiğinde basar.
Baş Parmak: Yalnızca Boşluk Tuşu (Space Bar) ' na basacak şekilde yerleştirilir.

Sağ elin işaret parmağı, resimdeki gibi çıkıntılı J harfinden başlamak üzere sıra ile yerleştirilir. Bundan böyle her iki elin de baş parmakları yalnızca Boşluk, space, tuşuna gelecek şekilde yerleştirilir. Kılavyeye, artık sag el hep bu şekilde yerleştirilir.

Baş Parmak: Yalnızca Boşluk Tuşu (Space Bar) ' na basacak şekilde yerleştirilir.
İşaret Parmağı: Normalde Çıkıntılı J harfinin üzerinde hazır bulunur ancak [7], [U], [J], [M] Hattı ile birlikte [6], [Y], [H], [N]
Orta Parmak: Normalde K harfinin üzerinde hazır durur ama [8], [I], [K], [Ö] harflerine de basar.
hattındaki harf ve rakamlara da gerektiğinde basar. Yüzük Parmağı: Normalde L harfinin üzerinde hazır durur ama [9], [O], [L], [Ç] Harflerine de basar.
Serçe Parmak: Serçe parmak normalde Ş harfinin üzerine gelir. Ama [ğ], [ü], [Ş],[i][p] [.] tuşlarına ve bu tuşların oluşturduğu hattın sağ tarafındanki Harf Tuşları Grubuna basar.

Bölüm 1:  R2D2 ye giriş
“R2D2 yi neden öğrenmeliyiz? Neden Kullanışlıdır? Ne İşe yarar?”
R2D2 (which stands for Read, Reflect, Display and Do) şeklinde yazılan toplamda 4 aşamadan oluşan bir öğretim tasarımı modelidir.
R2D2 (Okumanın açılımı, Yansıtmak, Gösterme ve Yapmak) tüm öğrenme stillerini kapsayarak öğrenme aktivitelerine entegre olarak çevrimiçi eğitmenlere ve / veya çevrimiçi ders tasarımcılarına yardımcı olmak için tasarlanmış bir modeldir.
Web-tabanlı öğrenme giderek daha popüler hale gelmiş olsa da, web tabanlı öğrenmede kullanılan birçok faaliyet, baskın olarak metin tabanlı öğrenme faaliyetleri şeklinde kullanılmakta ve öğrenim stilleri göz önüne alınmamaktadır. R2D2 modeli tüm online kurslarda, 4 aşamanın eklenmesini tavsiye eder. Bahsedilen bu 4 aşama dahil edilerek , otomatik olarak oluşturulan öğrenme aktivitelerinde tüm öğrenme
stilleri için cazip olacak ve birçok araçla oluşturulan etkileşimli kursla internet ve online öğrenme sağlanacak.
R2D2 modeli online ders tasarımcıları, online eğitimciler ve / veya onların farklı öğrenme tercihlerine hitap edecek şekilde metinsiz olarak öğretime entegre olan, onlara yardımcı olacak ve online eğitimde öğretmenlere rehberlik sağlayacak bir yardımcı olacak şekilde hazırlanmıştır. Model düşüncesinin yazarları sayesinde metin tabanlı öğrenme aktivitelerinden, desteklenerek ve iş birliği ile
uygulamalı ve aktif öğrenme faaliyetlerine doğru entegre olacaktır.
Modelin dört aşamasını incelemek için lütfen 'Bölüm 2' bağlantısına tıklayın:

Bölüm 1: R2D2'ye giriş
Bölüm 2: R2D2'nin dört aşamasını inceleme
Bölüm 3: Aşama 1 (Okuma) - Sözel/İşitsel
Bölüm 4: Aşama 2 (Yansıtma) - Yansıtıcı ve görsel
Bölüm 5: Aşama 3 (Gösterme) - Görsel
Bölüm 6: Aşama 4 (Yapma) - Pratik
Bölüm 7: Kaynaklar

Bölüm 2: R2D2'nin dört aşamasını inceleme
R2D2 modelinin amacı, mevcut olan öğretim stillerini almak ve onun yerine tüm öğrenme ihtiyaçlarını karşılayacak bir öğrenme stili entegre etme faliyetidir. Bu yazarların tasarladığı online kurs ve/veya öğretim için eğitim tasarımı yerine sadece metin tabanlı öğretim tasarımını göz önünde bulundurmak, çoklu öğrenme stillerindeki öğrencilerin duyduğu keyfi ve derslerdeki başarıyı etkileyecektir.
R2D2 modeli, her biri birbiri ile ilişkili olan dört tür aşamayı özetlemektedir.
Birbiri ile bağlantılı bir şema:

R2D2 modeli metin tabanlı olmayan öğrenim aktiviteleri yapan tasarımcı ve eğitmenlere yol gösterir. Bu model doğrusal değildir. bu nedenle eğitimciler ve tasarımcılar için esneklik sağlanabilir özel olmayan belirli bir dizilimdeki takip eden fikirleri birleştirerek bir ders veya eğitim içinde kullanılır. R2D2 modelini kullanmayı seçmek, öğrenme aktivitelerinde öğrencilerin ve/veya eğitimlerde gerekli
ihtiyaçlarını karşılayacak ve herhangi bir yerde yapılan kurs ve eğitimlerde fayda sağlayacaktır.
Özel kurs veya eğitimlerde öğrencilerin R2D2 modeli hakkındaki bildiği bilgilere bağlı olarak, eğitimin iyileştirilmesine özel bir yardım sağlar. eğer öğrenciler belirlenen öğrenme stili hakkında iyi bir izlenim sunarlarsa, kurs veya öğretimlerde aktivite tasarlamak için bu stil seçilebilir. Aynı doğrultuda, eğer özel öğrenme stilinin iyi sonuçlar getirdiği biliniyorsa, özel olarak sadece bir aşamasıda kullanılabilir.
Bu dört aşamayı http://i.hizliresim.com/lY9kDB.png resmi güzel bi şekilde özetlemektedir.
Modelin birinci aşamasını incelemek için lütfen 'Bölüm 3' bağlantısına tıklayın:

Bölüm 1: R2D2'ye giriş
Bölüm 2: R2D2'nin dört aşamasını inceleme
Bölüm 3: Aşama 1 (Okuma) - Sözel/İşitsel
Bölüm 4: Aşama 2 (Yansıtma) - Yansıtıcı ve görsel
Bölüm 5: Aşama 3 (Gösterme) - Görsel
Bölüm 6: Aşama 4 (Yapma) - Pratik
Bölüm 7: Kaynaklar

Bölüm 3: Aşama 1 (Okuma) - Sözel/İşitsel
Aşama 1'de aktivitelerde kelime ve yazı öğrenmelerinden transfer edilmeye odaklanarak ve modeldeki aşamaya uygun olarak sözel ve işitsel öğrenmeye katkı yapmayı sağlar. 
bu aşama ilk ve en karmaşık aşama olarak öğrencilere bilgi edinmeye odaklanmış aşama olarak kabul edilir, bildiği bilgileri kullanarak başlamadan önce sorular sorabilir. İlk olarak bu aşama gelmektedir çünkü bu modeldeki 3 aşamayı yani okuma gösterme yansıtma ve yapmayı tamamlamak için ilk önce ilk aşama hakkında bilgi edinilmesi gerekir. 
Bu karmaşık bir aşamadır öğrencilere, interneti kullanarak kelimeleri öğretmenin birçok yolu vardır: podcastler,vodcastler,Çevrimiçi Tartışmalar,senkron Sunumlar,sohbet,Anında mesajlaşma,okuma ve incelemeler. yıllarca sadece metin üzerinden öğretim kullanıldı,ancak internet ile bu değişmeye başladı. çünkü sadece bu yazılara güvenme yavaş yavaş sorgulanmaya başladı. multimedya kullanımı öğretimi
daha kolay hale getirdi. çünkü podcastler,vodcastler gibi materyaller internet üzerinden daha kolaydır.
Modelin ikinci aşamasını incelemek için lütfen 'Bölüm 4' bağlantısına tıklayın:

Bölüm 1: R2D2'ye giriş
Bölüm 2: R2D2'nin dört aşamasını inceleme
Bölüm 3: Aşama 1 (Okuma) - Sözel/İşitsel
Bölüm 4: Aşama 2 (Yansıtma) - Yansıtıcı ve görsel
Bölüm 5: Aşama 3 (Gösterme) - Görsel
Bölüm 6: Aşama 4 (Yapma) - Pratik
Bölüm 7: Kaynaklar

Bölüm 4: Aşama 2 (Yansıtma)
İkinci aşamada öğrencilerin kendi veya başkalarının düşüncelerini yansıtmak için fırsatlar sağlar. Yüz yüze soru sormak ve cevap vermek yeri, online öğrenme herkes için bir fırsat sunar. Senkron olmayan ortamlarda bilgi edinme faaliyetleri sağlar. Ayrıca öğrencilerin fikirlerini sunmayı sağlar. Bu yüz yüze öğrenmeden daha zor olmasına rağmen, çevrimiçi öğrenmeyi teşvik etmektedir.
Bazı öğrenciler başkalarının düşüncelerini incelerken bazı sorular sorabilir. Ancak bu da öğrencilerin fikirlerini yansıtır. Yansıtıcı/ gözlemsel öğrenmede genelde öğrenenlerden bir tepki gelmez. Başkalarını dinleyerek kendi çıkarımlarını oluştururlar ve kendi fikirlerine sahip olurlar. Bu öğrenmeyi sağlamak için çeşitli yollara başvururlar: bloglar, tartışmalar, özetler, soru incelemeleri...
Modelin üçüncü aşamasını incelemek için lütfen 'Bölüm 5' bağlantısına tıklayın:

Bölüm 1: R2D2'ye giriş
Bölüm 2: R2D2'nin dört aşamasını inceleme
Bölüm 3: Aşama 1 (Okuma) - Sözel/İşitsel
Bölüm 4: Aşama 2 (Yansıtma) - Yansıtıcı ve görsel
Bölüm 5: Aşama 3 (Gösterme) - Görsel
Bölüm 6: Aşama 4 (Yapma) - Pratik
Bölüm 7: Kaynaklar

3. aşamada daha çok görsel üzerinde durulur. Zor bir konuyu anlatmak zorunda kaldığımızda, görsel araçları, grafikleri şekiller ve tabloları kullanarak bize yardımcı olur. Görseller bir konuyu öğrenmede yardımcı olur. Görsel öğrenme etkinlikleri kolayca diğer faaliyetler ile entegre edilebilir. Podcast veya yazılı metin gibi diğer öğretim stratejileri ile kombine edildiğinde, ikili kodlama gerçekleşir ve öğrenme daha derin oluşur ve daha kolay öğrenilir öğrenenler tarafından hatırlaması daha kolay olur.
bu aşama diğer aşamalara göre daha az gelişmiş gibi görülebilir. Bunun en önemli nedenlerinden biri olarak İnternet'te içeriğin az oluşu gösterilebilir. Ancak İnternet'teki içerik arttıkça bu aşama da kendini geliştirecektir. Bu öğrenmeyi sağlamak için çeşitli yollara başvururlar: Resimler, animasyonlar, videolar, grafikler, akış şemaları, diyagramlar, kartlar, sanal turlar ve haritalar.
Modelin dördüncü aşamasını incelemek için lütfen 'Bölüm 6' bağlantısına tıklayın:

Bölüm 1: R2D2'ye giriş
Bölüm 2: R2D2'nin dört aşamasını inceleme
Bölüm 3: Aşama 1 (Okuma) - Sözel/İşitsel
Bölüm 4: Aşama 2 (Yansıtma) - Yansıtıcı ve görsel
Bölüm 5: Aşama 3 (Gösterme) - Görsel
Bölüm 6: Aşama 4 (Yapma) - Pratik
Bölüm 7: Kaynaklar

Modelin 4.aşamasında öğrencilere öğrenecekleri herşeyi "yapmak" şeklinde öğretilir. bu aşama öğrenilmesi gereken bir bilginin uygulama şeklinde yapılmasına dayanmaktadır. öğrencilerin bir rehber olmadan öğrenecekleri şeyi kendi başlarına öğrenmelerini sağlar. bu diğer aşamalarla entegre edilebildiği gibi diğer aşamalarda anlaşılamayan bir konuyu anlaşılabilir yapar.
ancak belirli bir bilgi birikimi olmayan öğrencilerde bu uygulama geri tepebilir. başarı sağlamak için r2d2 modelindeki diğer aşamalarda yapılmalıdır. öğrenciler öğreneceklerini deney yaparak öğrenecekleri için etkileşim duygusuna sahip olacaklar. bu öğrenmeyi sağlamak için çeşitli yollara başvururlar:
simülatörler,oyunlar,yaparak öğrenme galerileri.
Modelde kullanılan kaynakları incelemek için lütfen 'Bölüm 7' bağlantısına tıklayın:

Bölüm 1: R2D2'ye giriş
Bölüm 2: R2D2'nin dört aşamasını inceleme
Bölüm 3: Aşama 1 (Okuma) - Sözel/İşitsel
Bölüm 4: Aşama 2 (Yansıtma) - Yansıtıcı ve görsel
Bölüm 5: Aşama 3 (Gösterme) - Görsel
Bölüm 6: Aşama 4 (Yapma) - Pratik
Bölüm 7: Kaynaklar

Kaynaklar
Okuma

NPR: http://www.npr.org/rss/podcast/podcast_directory.php
Khan Academy: http://www.khanacademy.org/
Connexions: http://cnx.org
Google Book (the complete plays of William Shakespears): http://books.google.com/googlebooks/shakespeare/
PubMed tutorial: http://www.nlm.nih.gov/bsd/pubmed_tutorial/m1001.html
Yansıtma

Sample blog: http://blogs.howstuffworks.com/category/stuff-you-missed-in-history-class/
Sample electronic portfolios: http://www.ed.uiuc.edu/courses/ci335/eport_examples/index.html
Electronic portfolio consortium: http://www.eportconsortium.org/
Electronic portfolios (Helen Barrett): http://electronicportfolios.com/
Computer Assisted Learning Method (CALM): http://calm.indiana.edu
Gösterme

DNA replication animation: http://www.mcb.harvard.edu/losick/images/trombonefinald.swf
Sample Flowcharts: http://www.rff.com/flowchart_samples.htm
Diagram of the human heart: http://www.rkm.com.au/anatomy/heart.html
Sample charts: http://christianschooljournal.com/?p=526
Smithsonian Museum of Natural History Virtual Tour: http://www.mnh.si.edu/panoramas/flashVersion/index.html
Yapma

PhET: http://phet.colorado.edu/en/simulations/category/physics
Jeopardy Game Review for multiplication facts: http://www.math-play.com/Multiplicaton-Jeopardy/Multiplication-Jeopardy.html
18 virtual autopsies: http://www.merlot.org/merlot/viewMaterial.htm?id=78489
Wikipedia: http://en.wikiversity.org/
Harvard Business School Case Studies: http://harvardbusinessonline.hbsp.harvard.edu/b02/en/cases/cases_home.jhtml
Diğer Kaynaklar
Bonk, C.J., & Zhang, K. (2008). Empowering Online Learning. San Francisco, CA: Jossey-Bass.
Lane, C. Gardner's Multiple Intelligences [Website]. Retrieved from http://www.tecweb.org/styles/gardner.html

Bölüm 1: R2D2'ye giriş
Bölüm 2: R2D2'nin dört aşamasını inceleme
Bölüm 3: Aşama 1 (Okuma) - Sözel/İşitsel
Bölüm 4: Aşama 2 (Yansıtma) - Yansıtıcı ve görsel
Bölüm 5: Aşama 3 (Gösterme) - Görsel
Bölüm 6: Aşama 4 (Yapma) - Pratik
Bölüm 7: Kaynaklar

Bu kitabın doğum günü: 22 Aralık, 2007
Bu sayfa kitabın sunuş bölümüdür. Lütfen tüm değişiklikleri kitabın alt başlıklarında yapınız. Değişikliklerinizden önce lütfen yazarlar için bilgi bölümünü okuyunuz. Yorumlar için lütfen "tartışma" linkini kullanın. 
Bu bir vikikitap projesidir. Açık kaynaklı, ücretsiz ulaşılabilen bir referans kitaptır. Radyasyon Onkolojisi ile ilgilenen başta doktorlar olmak üzere herkes için hazırlanmaktadır. Öncelikli hedef doktorlar olsa da tüm sağlık çalışanları ve hastaların da faydalanacağını düşünmekteyiz. Lütfen içeriği zenginleştirme konusunda kendinizi rahat hissedin.
Teşekkürler...
Editorler:

Kaan Oysul, Tıp Doktoru, Radyasyon Onkolojisi Profesörü - Medicana International Ankara Hastanesi Radyasyon Onkolojisi Bölümü, Ankara, Türkiye

Bu vikikitapta Google kullanarak veya "ara" kutusunu kullanarak arama yapabilirsiniz.
__İçindekiler__

Giriş
Yazarlar için bilgi
Yazar listesi
Radyasyon Onkoloji Nedir?

Giriş
Glioma: Düşük Grade
Glioma: Yüksek Grade
Meningioma
Primer SSS Lenfoması
Pineal Gland Tümörleri
Beyin Metastazı
BOS Tutulumu
Omur
Çeşitli SSS Tümörleri
Çocukluk Çağı:

Kraniofaringioma
Germinoma
Ependimoma
Optic Glioma
Beyin Sapı Glioması
Pilocytic Astrocytoma
Medulloblastoma
SSS PNET
Pineal Gland Tümörleri
Atipik Teratoid Rhabdoid Tümör (AT/RT)
Retinoblastoma
Benign:

Akustik Nöroma (Vestibular Schwannoma)
Trigeminal Nevralji
Sfenopalatin Nevralji
Kronik Cluster Tipi Başağrısı
Arteriovenöz Malformasyon (AVM)
Glomus Jugulare (Paraganglioma)

Kordoma
Kondrosarkom

Genel Baş ve Boyun
Post-operatif Baş ve Boyun
Oral kavite
Farenks:
Nazofarenks
Orofarenks
Hypofarenks
Larenks
Sinonazal Tümörler:
Nazal kavite
Maksiller sinüs
Etmoid Sinüs
Tükürük Bezleri
Primeri Belli Olmayan
Tiroid
IMRT

Koroidal metastazlar
Oküler Melanoma
Graves' Oftalmopatisi
Retinoblastoma

Akciğer Kanseri
NSCLC
SCLC
Karsinoid
Mezotelioma
Timoma
Vena Kava Superior Sendromu

Özefagus
Mide
Pankreas
Safra Yolu (Kolanjiyokarsinoma)
Safra Kesesi
Karaciğer
İnce Barsak
Kolon
Rektum
Anal Kanal
Gastrointestinal Stromal Tümörler

Prostat
Mesane
Böbrek
Testis
Penis
Üretra
Renal Pelvis ve Üreter
Benign

Peyronie's Hastalığı

Vulva
Vagina
Cervix
Cervikal brakiterapi
Uterus
Endometrial karsinoma
Leiomyosarkoma
Fallopian tube
Over

Meme

Hodgkin Lenfoma
Non-Hodgkin Lymphoma
Primer SSS Lenfoma
Lösemi
Multiple Myeloma ve Plasmositoma
Waldenstroms makroglobulinemisi
Mycosis fungoides
Cildin B-hücreli lenfoması
Dalak Işınlaması
Tüm Beden Işınlaması
Çeşitli

Yumuşak Doku Tümörleri:

Yumuşak Doku sarkomları
Retroperitoneal sarkomas
Dermatofibrosarkoma protuberans
Synovyal sarkoma
Anjiyosarkoma
Malign Periferal Sinir Kılıfı Tümörleri
Malign Intraserebral Sinir Kılıfı Tümörleri
Hemanjiyoperisitoma
Kemik Tümörleri:

Osteosarkoma
Kondrosarkoma
Ewing's Sarkoma
Fibrosarkoma
Chordoma
Kemik PNET
Benign:

Anjiyomiksoma

Melanoma
Non-melanoma cilt kanseri
Merkel hücreli karsinoma
Kaposi's Sarkoma
Ekrin Porokarsinoma
Ekstramammary Paget's Hastalığı

Tiroid Meduller Karsinoma
Küçük Hücreli Akciğer Kanseri
Akciğerin Büyük Hücreli Karsinoması
Paraganglioma
Adrenokortikal Karsinoma
Merkel hücresi
Nöroblastoma

Testiküler Germ Hücreli Tümörler
SSS Germ Hücreli Tümörler

Beyin Tümörleri
Kraniofarengioma
Germ Hücreli Tümörler
Ependimoma
Medulloblastoma
Optik Glioma
Pilositik Astrositoma
SSS PNET
Atipik Teratoid Rabdoid Tümör
Nefroblastoma (Wilms')
Nöroblastoma
Rabdomyosarkoma
Retinoblastoma
Ewing's Sarkoma
Kemik PNET
Çocukluk Çağı Hodgkin's
Burkitt's Lenfoma

Çeşitli

Trigeminal Nevralji
Sfenopalatin Nevralji
Kronik Cluster Tipi Başağrısı
Akustik Nöroma (vestibular schwannoma)
Graves' Hastalığı
Heterotopik Ossifikasyon
Ankilozing spondilitis
Topuk Dikeni
Keloid
Anjiyomiksoma
Peyronie's Hastalığı
Vasküler Brakiterapi
Arteriovenöz malformasyon

Palyasyon
Vena Kava Superior Sendromu
Spinal Kord Basısı
Kemik Metastazları
Beyin Metastazları
NSCLC Palyasyon
Pelvik Palyasyon

Toksisitenin derecelendirilmesi
NTCP (Normal doku komplikasyon olasılığı)
Normal Doku Toleransı
Beyin
Baş Boyun
Görme Keskinliği
Parotit
Kalp
Akciğer
Özefagus
İnce Barsak
Genitoüriner Sistem
Kemik İliği
İkinci Kanserler
Cilt

Destek Tedavi
Anemi
Kilo Kaybı
Dispne
Halsizlik
Gastrointestinal Semptomlar
Lökopeni
Cilt Bakımı
Yara Bakımı
Baş Boyun Destek Tedavisi
Sıcak Basması
Pulmoner Semptomlar
Nörolojik Semptomlar
Ağrı
Tromboembolizm

Klasik Radyobiyoloji
Moleküler Radyobiyoloji
Tedavi Süresi
Kanser Biyolojisi
Antikorlar
Küçük Moleküller
Radyasyon Modülatörleri
Radyasyon Duyarlaştırıcıları
Radyasyon Protektörleri
Kromozomların Listesi ve Kanser Genleri
Tümör Belirteçleri

Eksternal Tedavi
Kranial Stereotaktik Radyocerrahi (SRS)
Stereotaktik Beden Radyoterapisi (SBRT)
Tüm Beyin RT (TBRT)
Kraniyo-Spinal Işınlama (KSI)
Tüm Beden Işınlaması (TBI)
Tüm Scalp Işınlaması (TSI)
Yoğunluk Ayarlı Radyoterapi (IMRT)
Görüntü Rehberliğinde Radyoterapi (IGRT)
Adaptif Radyoterapi
Brakiterapi
Intraoperatif RT (IORT)
Partikül Tedavisi
Protonlar
Yüklü Partiküller
Hipertermi

Radyoterapinin Kontrendikasyonları
Anatomi
Kemik İliği Dağılımı
Tedavi Alanları Örnekleri
Tümor Hareketleri
IMRT
Simülasyon aletleri
Kalp Pili Olan Hastaların Tedavisi

Kemoterapi İlaçları
Kemoterapi Kombinasyonları
Hormon İlaçları
Sitokinler ve İmmünomodülatörler|Sitokinler ve İmmünomodülatörler
İmmunosupressif İlaçlar|İmmunosupressif İlaçlar

AJCC/TNM Evreleme Bilgisi
Karnofsky Performans Durum Skalası
Online Araçlar
Şablon:Radyasyon Onkolojisi

Optik Yolak Gliomu

Düşük dereceli astrositik tümörlerdir
Sıklık
Serebral gliomalarn %2>'si
Çocukluk çağı beyin tümörlerinin %5'i
%75'i <10 yaşın altında olmak üzere optik yolak gliomalı hastaların %90'ı <20 yaş, ; %10'u yetişkinlerde
Nörofibromatozis ile ilişkili
Optik yolak gliomu olan hastaların %30'u NF1 hastasıdır
NF1 hastalarının %25'inde optik yolak gliomu gelişir (NF1'de görülen en sık tümör)
Yerleşim yeri
Anterior (orbital, infrakanaliküler, prechiasmal) - prepubertal çocuklarda sık
Posterior (chiasm, hipotalamus, anterior 3. ventrikül) - yetişkinlerde sık

Optik Yolak Gliomun optimal tedavisi tartışmalıdır.
Hastanın yaşı
Tümörün yerleşim yeri
NF1 varlığı
Mümkünse çocuklar yakın takip ile izlenmelidir
Yetişkinler agresif olarak tedavi edilmelidir.
Cerrahi dışı tedavi algoritmi PMID 16411210
<3 yaş veya 3-10 yaşında unrezektable lezyonu olanlar
Radyolojik veya semptomatik progresyona kadar izlem,
Sonrasında Packer rejimi (carboplatin/vincristine); progresyon yoksa izlem; progresyon varsa RT
>10 yaş
Mümkünse proton RT'si, ya da stereotaktik/konformal RT; progresyon yoksa izlem; progresyon varsa protokol
Karar: Kemoterapi tedavide başarısız fakat hastalar nörofizyolojik olarak gelişene kadar radyoterapi ve cerrahiyi geciktiriyor.

Optimal zamanlama açısından fikir birliği yok
Muhtemelen fayda:
Obstrüktif hidrosefalide
Progresif disfigüring proptosis veya körlük yapan tek sinir tutulumlarında
Genç çocuklarda RT geciktirmek önemli
Muhtemel kontra-endikasyon:
Diffüz chiasmal tutulum/yaygın infiltratif hastalık
NF hastaları

Fikir birliği yok; bir çoğu düşük dereceli gliomalar gibi tedavi ediliyorlar.
UCSF çalışması nitrosure-tabanlı KT'nin (TPDCV) aktivitesini göstermiştir.
George Washington çalışması (Packer) karboplatin/vinkristine'nin (şu an da en "standart" KT) iyi sonuçlarını göstermiştir.
Fransız çalışması RT'siz olarak uzun süreli kontrol sağlamıştır.
Children's Oncology Group çalışması CCG A9952 devam etmektedir. (temelde UCSF ve GW protokollerini randomize etmektedir.

Devam Eden

CCG A9952 - Protocol link -- "Phase III Randomized Study of Carboplatin and Vincristine Versus Thioguanine, Procarbazine, Lomustine, and Vincristine in Children With Progressive Low Grade Astrocytoma"
Kapandı. Sonuçları henüz yayınlanmadı. (05/08)

Yayınlanmış

Fransız Pediatrik Onkoloji Derneği, 2003 (1990-1998) PMID 14673044 -- "Progression-free survival in children with optic pathway tumors: dependence on age and the quality of the response to chemotherapy--results of the first French prospective study for the French Society of Pediatric Oncology." (Laithier V, J Clin Oncol. 2003 Dec 15;21(24):4572-8.)
Prospektif. Progresif optik yolak tümörlü 85 çocuk. KT: 3 haftada bir, alterne prokarbazine/karboplatin, etoposide/sisplatin, ve vinkristine/siklofosfamide. Relapsta, RT öncesi ikinci hat KT
5-yıllık sonuçlar: PFS %34, OS %89. RTsiz sağkalım %61
Prognostik faktörler: yaş <1, NF1 ilişkisi hastalıkta progresyona neden oluyor.
Karar: Umut vaadeden OS veya görme fonksiyonu olmaksızın uzatılmış KT ile RT uygulanmayabilir.
Royal Marsden, 2003 (UK) PMID 12892235 -- "Tolerance of nitrosurea-based multiagent chemotherapy regime for low-grade pediatric gliomas." (Lancaster DL, J Neurooncol. 2003 Jul;63(3):289-94.)
Prospektif. Düşük dereceli glioması olan 10 çocuk, başlangıçta karboplatin/vinkristine ile tedavi edimiş, ikinci hat olarak TPCV kullanılmış.
Karar: TPCV is ikinci hat tedavi olarak uygun bir tedavi şeklidir.
George Washington, 1997 PMID 9126887 -- "Carboplatin and vincristine chemotherapy for children with newly diagnosed progressive low-grade gliomas." (Packer RJ, J Neurosurg. 1997 May;86(5):747-54.)
Prospektif. Progresif düşük dereceli glioması olan 78 çocuk (12 beyin sapı glioması). Eşzamanlı karboplatin/vinkristine. Medyan takip 2.5 yıl
3-yıllık PFS: %68. NF+ ve NF - hastalar arasında fark yok. Objektif yanıt %56.
Prognostik faktörler: yalnızca yaş (<3 yaş %74 vs. >3 yaş %39, istatisiki olarak belirgin)
UCSF, 1991 (1983-1989) PMID 1901597 -- "Management of chiasmal and hypothalamic gliomas of infancy and childhood with chemotherapy." (Petronio J, J Neurosurg. 1991 May;74(5):701-8.)
Retrospektif. Chiasmal/hipotalamik glioması olan 19 çocuk. 12'si başlangıçta progresif semptomları nedeniyle tedavi edilmiş, 7'sinde ertelenmiş. KT: TPDCV TPDCV
Progresyona kadar geçen meyan süre: 20. ayda erişilmemişti. tümöre bağlı ölüm yok. Başlangıçtaki yanıt/stabilizasyon 15/18 hastada mevcut.
Salvage: RT
Karar: TPDCV hastalık progresyonuna kadar RT'yi erteliyor.

En iyi sonuçlar 1.8 Gy/fx dozunda toplam 45-56 Gy'de rapor edilmiştir.
Posterior yerleşimli olanların sonuçlarının daha kötü olduğu düşünülür.
Proton RT'si halen araştırılmaktadır.

Harvard, 2005 (1992-1998) PMID 15667955 -- "Stereotactic radiotherapy for localized low-grade gliomas in children: final results of a prospective trial." (Marcus K, Int J Radiat Oncol Biol Phys. 2005 Feb 1;61(2):374-9.)
Prospektif. Lokalize düşük dereceli gliomalı 50 hasta. KT/cerrahi sırasında veya sonrasında progresyon için RT. Medyan takip 6.9 yıl.
RT: Çıkarılabilir kafa çerçevesi. 2-mm marj ile planlanmış. Ortalama doz 1.8 Gy/fx ile toplam 52.2 Gy. Hedef çizimi BT/MR füzyonu ile yapılmış
5-yıllık sonuçlar: PFS %83, OS %98; 6 hastada tedavi alan içinde progresyon, marginal başarısızlık yok
Karar: Stereotaktik RT sınırlı marjlar ile mükemmel lokal kontrol sağlamaktadır.
Heidelberg, 2005 (Germany) (1990-2003) PMID 15936565 -- "Fractionated stereotactic radiotherapy of optic pathway gliomas: tolerance and long-term outcome." (Combs SE, Int J Radiat Oncol Biol Phys. 2005 Jul 1;62(3):814-9.)
Retrospective. 15 patients. Median dose 52.2 Gy (45.2-57.6) in 1.8 Gy/fx. Median F/U 8 years
5-year outcome: PFS 72%, OS 90%. No second malignancies
Conclusion: Good control, normal brain sparing. Longer f/u needed
Institut Curie, 1991 (1970-1986) PMID 1907959 -- "Chiasmal gliomas: results of irradiation management in 57 patients and review of literature." (Bataini JP, Int J Radiat Oncol Biol Phys. 1991 Aug;21(3):615-23.)
Retrospective. 57 patients, 37% chiasm, 63% extended to hypothalamus/posteriorly. RT 40-60 Gy. Mean F/U 7.5 years
5-year (and 10-year) OS: 84%; response: CR 15%, PR 46%, SD 22%
Conclusion: RT effective in cases of rapidly developing visual, neurological, or endocrine symptoms
1956 PMID 13323290 -- "The value of radiation therapy in the management of glioma of the optic nerves and chiasm." (Taveras JM, Radiology. 1956 Apr;66(4):518-28.)
Retrospective. 34 patients treated with RT
Survival: 23/34 at time of publication
Landmark study. Results deemed exceptional. Launched RT as a management strategy

Manchester/London, 2006 PMID 16735710 -- "Second primary tumors in neurofibromatosis 1 patients treated for optic glioma: substantial risks after radiotherapy." (Sharif S, J Clin Oncol. 2006 Jun 1;24(16):2570-5.)
Retrospective. 58/80 NF1 patients with OPG. 18/58 RT alone or in combination. Dose 25-50 Gy
Second CNS tumor: RT 9/18 (50%) developed 12 second tumors in 308 person-years of F/U; No RT 8/40 (20%) developed 9 second tumors in 721 person-years of F/U. RR 3 (SS). Median time-to-diagnosis 12 years. Risk of MPNST was increased RR 5.3 (SS) over non-OPG NF1 controls
Conclusion: Significantly increased 2nd CNS cancer risk in NF1 patients with OPG; RT should be used only if absolutely necessary
Toronto, 1993 (1971-1990) PMID 8315466 -- "Moyamoya phenomenon after radiation for optic glioma." (Kestle JR, J Neurosurg. 1993 Jul;79(1):32-5.)
Retrospective. 47 patients with OPG treated.
Moyamoya phenomenon: 0/19 no RT; 5/28 with RT; 2/23 NF1- vs. 3/5 NF1+ (SS)
Conclusion: High incidence of moyamoya in patients with NF1 and cranial RT

2006 PMID 16411210 -- "Optic pathway gliomas." (Jahraus CD, Pediatr Blood Cancer. 2006 May 1;46(5):586-96.)

Pilositik Astrositoma

WHO Grade I tumors
Çoğunlukla serebellumda iyi sınırlı, kontrast tutan lezyonlardır.
Tekbaşına cerrahi eksizyon başarılı tedavi ve sonucu sağlar. 10-yıllık toplam sağkalım %80

Seyrektir
Klinik bulgular; görme bozuklukları, bayılma ve başağrısıdır. Papilödem sıktır.
Hem sağkalımda hem de nörolojik fonksiyon anlamında iyi prognoza sahiptir.
Birçoğu rezeksiyon (gross veya subtotal) sonrasında sabit kalır ve yakın takip ile herhangi bir adjuvan radyoterapiye ihtiyaç duymaz.
Unrezektabl hastalıkta RT önermek, özellikle nörolojik semptomu olanlarda, mantıklı olabilir.
10-yıllık toplam sağkalım %95

Intergroup NCCTG/RTOG (1986-1994)
Prospektif. Supratentoryal pilositik astrocytomalı 20 yetişkin. Gross total (n=11) veya subtotal (n=6) rezeksiyon sonrası, takip. Yalnızca biyopsi uygulandığında (n=3), ödem +2 cm sınırla 50.4 Gy RT
PMID 15001258 -- "Adult patients with supratentorial pilocytic astrocytomas: a prospective multicenter clinical trial." (Brown PD, Int J Radiat Oncol Biol Phys. 2004 Mar 15;58(4):1153-60.) Medyan takip 10 yıl
10-yıllık sonuç: %95 hayatta. 1 hasta bilinmeyen nedenle çalışmaya dahil edildikten 2.1 yıl sonra ölmüş; 1 hasta çalışmaya dahil edildikten sonra progrese olmuş ve P-32 ile salvage tedavi uygulanmış, 9. yılında progresyonu yok
Karar: İyi prognoza sahip; gross total veya subtotal rezeksiyon sonrasında RT ihtiyacı yok

Radiation Oncology/NHL:TOC

Median age of presentation for non-HIV related primary CNS lymphoma is 6th decade.  HIV related presentation is related to stage of HIV.
Incidence has increased 10-fold in past 30 years, and the increase cannot be totally explained by the advent of HIV.
Has traditionally accounted for 1% of intracranial neoplasms in immunocompetent patients.  The fraction now is estimated at 4%.
Impacts two distinct populations:
Immunocompromised (HIV, organ transplantation, immunodeficiency syndromes) - arise from EBV infection of B-cell lymphocytes
Immunocompetent - no known etiology. B-cells have no normal role in the brain

Usually B-cell histology
T-cell variants account for <5% of PCNSL in developed countries; their behavior is very similar to B-cells
85% are either aggressive or highly aggressive variants of NHL

PCNSL Collaborative Group; 2005 PMID 15800313 -- "Primary CNS lymphoma of T-cell origin: a descriptive analysis from the international primary CNS lymphoma collaborative group." (Shenkier TN, J Clin Oncol. 2005 Apr 1;23(10):2233-9.)
Retrospective. 12 centers in 7 countries. 45 patients. Median age 60 years, 44% ECOG 0-1, 58% cerebral hemispheres, 26% deep lesions. LDH elevated in 32%, CSF elevated in 79%
Outcome: DSS 2-year 51%, 5-year 17%
Positive predictors: ECOG 0-1, MTX use
Conclusion: Presentation and outcome similar to B-cell PCNSL

Restricted to brain, CFS, eyes, or rarely spinal cord
Clinicopathologic variants include intracranial lesions, diffuse leptomeningeal or periventricular, vitreous, and spinal lesions.
Intracranial primary CNS lymphoma are generally 75% supratentorial and 25% infratentorial.
Primary CNS lymphoma is multifocal in 50% of AIDS-related variants, and multifocal in 25% of immunocompetent variants.
MRI significantly underestimates extent of involvement; PCNSL is considered to be a diffuse infiltrating disease
Classified as Stage IE NHL, because they are typically restricted to a single extranodal site

Multiple factors for poor prognosis: Age >60, ECOG PS >1, elevated LDH, elevated CSF protein, deep regions of the brain
European Stratification: 5 variables above. Risk groups: 0-1 factors, 2-3 factors, 4-5 factors
MSKCC Stratification: 2 variables, age and KPS

MSKCC; 2006 (1983-2003) PMID 17116938 -- "Primary central nervous system lymphoma: the Memorial Sloan-Kettering Cancer Center prognostic model." (Abrey LE, J Clin Oncol. 2006 Dec 20;24(36):5711-5.)
338 patients analyzed. RPA analysis. External validation from 3 RTOG prospective trials
RPA: Class I (patients <=50), Class II (patients >=50 and KPS >=70), Class III (>50 and KPS <70)
MSKCC data: median OS 8.5 years vs. 3.2 years vs. 1.1 years
Validation with RTOG data: median OS 5.2 years vs. 2.1 years vs. 0.8 years
Conclusion: Simple, universally applicable
International Extranodal Lymphoma Study Group; 2003 PMID 12525518 -- "Prognostic scoring system for primary CNS lymphomas: the International Extranodal Lymphoma Study Group experience." (Ferreri AJ, J Clin Oncol. 2003 Jan 15;21(2):266-72.)
378 patients analyzed. Five variables developed for prognostic score: 1) age >60, ECOG >1, elevated LDH, high CSF protein, deep regions of the brain.
2-year OS: Score 0-1: 80%; Score 2-3: 48%; Score 4-5: 15%
Conclusion: Prognostic score developed
France; 1993 (1982-1991) PMID 8494713 -- "Multivariate analysis of prognostic factors in patients with non HIV-related primary cerebral lymphoma. A proposal for a prognostic scoring." (Blay JY, Br J Cancer. 1993 May;67(5):1136-41.)
Retrospective. 41 patients with non-HIV PCNSL.
Multivariate predictors: CSF protein >0.6 g/l, ECOG >2, Age >60
Prognostic risk groups: median OS: good 54 months, intermediate 20 months, poor 4 months
Conclusion: heterogenous disease, can be stratified

Debulking surgery typically does not play a role, unless patients have masses that threaten impending herniation
Steroids should not be given, unless necessary to prevent herniation, since they can induce significant tumor regression and mask pathology. However, if steroids are given, immunostaining may still be possible even on dead cells
Treatment for CNS lymphoma traditionally consisted of whole brain radiation therapy.  The results were generally dismal. Although there is a high initial response rate to radiation, the vast majority of patients relapsed within the brain, and died of their disease. Median survival was 1 - 1.5 years, with 5-year OS ~5%
Due to rarity of this disease, most studies are Phase II trials
RTOG 8315 attempted to dose escalate brain treatment, but ultimately found unacceptably high rates of late side effects without significant improvement in overall survival. Ideal dose appears to be somewhere between 40 and 50 Gy; less than 40 Gy leads to worse survival, more than 50 Gy to worse neurotoxicity
Even though CHOP is very effective in systemic NHL, its results in PCNSL have been disappointing
Phase II single arm RTOG 9310 showed that chemo followed by RT consolidation had better outcomes than RT alone compared to historical controls. However, there was high neurotoxicity in patients >60 with combined modality therapy
High dose methotrexate (HD-MTX) based chemo has become the backbone of primary treatment. Consolidative WBRT is too toxic for older patients (>60) and should be deferred. The role of consolidative WBRT in young patients (<60) is unclear, but appears to improve outcome. Median survival with sequential chemo-RT, as well as high dose chemo alone is now ~4 years
Going forward, attempts are to optimize chemo regimens to defer neurotoxicity from consolidative WBRT

Current NCCN guidelines for treatment:

For patient with KPS >40 and creatinine clearance >50, high dose MTX based chemotherapy is considered the standard treatment.
If CSF cytology is positive, consider intrathecal chemotherapy.
For patient with KPS <40 or creatinine clearance <50, WBRT to 45 Gy.
Current indications for radiation therapy:

Consider as post-chemotherapy treatment in initial management of select younger patients (see RTOG 9310).
Recurrent disease resistant to MTX based chemotherapy.
Radiation should be avoided in patients >60 when possible.

RTOG 0227 Protocol -- "Phase I/II Study of Pre-Irradiation Chemotherapy with Methotrexate, Rituximab, and Temozolomide and Post-Irradiation Temozolomide for Primary Central Nervous System Lymphoma"
Opened protocol: Rituximab + Temozolomide + Methotrexate -> WBRT 36/30 in 1.2 Gy BID -> Temozolomide
EORTC 20962 (1997-2002)
Phase II. 52 patients. Non-AIDS-related. MBVP (methotrexate (MTX) teniposide carmustine methylprednisolone)  x 2 cycles with 2x IT-MTX, ara-C, and HC. Followed by 40 Gy WBRT.
2003 PMID 14597741 — "High-dose methotrexate-based chemotherapy followed by consolidating radiotherapy in non-AIDS-related primary central nervous system lymphoma: European Organization for Research and Treatment of Cancer Lymphoma Group Phase II Trial 20962." Poortmans PM et al. J Clin Oncol. 2003 Dec 15;21(24):4483-8. Median F/U 2.2 years.
Outcome: median OS 3.8 years. 3-yr OS 58%.
Toxicity: Grade 3-4 neutropenia 78%; 10% deaths treatment-related
Conclusion: MBVP followed by WBRT has a high response rate, but is very toxic
RTOG 9310 (1994-1997)
Phase II prospective single arm trial. 98 patients. HIV-. Pre-radiation chemotherapy included MTX, vincristine, procarbazine and intraventricular MTX. RT was WBRT to 45 Gy; if ocular lymphoma then eyes 36/20. During study, protocol modified such that if CR after chemo, WBRT 36/30 BID. After RT, patients received hi-dose cytarabine.
Primary outcome; 2002 PMID 12488408 — "Combination chemotherapy and radiotherapy for primary central nervous system lymphoma: Radiation Therapy Oncology Group Study 93-10." DeAngelis LM et al. J Clin Oncol. 2002 Dec 15;20(24):4643-8.
Outcome: Median OS 50.4 months in patients <60, and 21.8 months in patients >60 (overall 36.9 months); 5-year OS 32%, no difference if CR after chemo or not
Toxicity: 15% patients experienced severe delayed neurologic toxicity.
Conclusions: HD-MTX based regimen combined with consolidative RT is superior to RT alone when the overall survival data are compared to historical data.  However, patients over age 60 had significant risk of late toxicity from the combined treatment.
HFX-RT; 2005 PMID 16193393 -- "Secondary analysis of Radiation Therapy Oncology Group study (RTOG) 9310: an intergroup phase II combined modality treatment of primary central nervous system lymphoma." (Fisher B, J Neurooncol. 2005 Sep;74(2):201-5.)
Retrospective. 82 patients, 66 standard WBRT (45/25) and 16 HFX (36/30)
Neurotoxicity: Grade 5 (fatal): 10%, HFX 13% vs. RT 9% (NS); leukoencephalopathy later in HFX group. None of CR to chemo developed Grade 5 neurotoxicity
Outcome: no difference
Conclusion: HFX 25% lower BED dose, but no difference on PFS and OS. It delayed but not eliminate severe neurotoxicity
MSKCC; 2006 (1992-1998) PMID 17008697 -- "Long-term follow-up of high-dose methotrexate-based therapy with and without whole brain irradiation for newly diagnosed primary CNS lymphoma." (Gavrilovic IT, J Clin Oncol. 2006 Oct 1;24(28):4570-4.)
Retrospective. 57 patients, average 65 years old, median KPS 70. Treated with HD-MTX x5 cycles + vincristine. Intra-Ommaya MTX, procarbazine. Then WBRT 45 Gy, followed by Ara-C 2 cycles. WBRT deferred for 68% patients >60. Median F/U 9.6 years for surviving patients
Outcome: median OS 4.2 years, median PFS 10.7 years. Median OS for age >60 was 2.4 years, regardless of RT. Median OS for age <60 (most chemo-WBRT) not reached yet
Conclusion: Excellent survival. For older patients, defer WBRT. For younger patients, deferring WBRT may significantly compromise disease control
Trans-Tasman Radiation Oncology Group, TROG, (1991-97)
Phase II. 46 pts. IV MTX (1 g/m2; days 1,8) + leucovorin. Pts with positive CSF received intrathecal Ara-C 60 mg twice/wk x 3 weeks, continued weekly x 3 after clearance of CSF. WBRT began on day 15, 45 Gy in 25 fx (180 cGy/d) with a b

En sık benign beyin tümörü
Yaklaşık %95
Primer intrakraniyal neoplazmların %20’ sini teşkil eder.
En sık 40-70 yaşta görülür, insidansı yaşla artar, 70 yaşta pik yapar.
Erkek > Kadın   2:1

Daha önceden radyasyon tedavisi
Radyoterapi ile tinea capitis tedavisi, radyasyona bağlı menenjiom için klasik senaryodur.
Proflaktik kraniyal ışınlama menenjiom gelişme riskini normale göre 10 kat artırır.
Radyasyon tedavisi ile menenjiom gelişimi arasındaki ortalama interval ~20 yıldır.
Tip II Nörofibromatozis
Kadınlarda hormon replasman tedavisi

Mayo Clinic; 2008 (1993-2003) PMID 18182668 -- "Is there an association between meningioma and hormone replacement therapy?" (Blitshteyn S, J Clin Oncol. 2008 Jan 10;26(2):279-82.)
Retrospektif. 1390 menenjiomlu kadın hasta, % 11’ inde mevcut/önceden hormon replasman tedavisi
OR  for HRT use and meningioma 2.2 (SS)
Sonuç: Hormon replasman tedavisi ile menenjiom tanısı arasında pozitif ilişki var.

BT
Normal beyin dokusunu iten iyi sınırlı ekstraaksiyal kitle. Düzgün konturlu, bazen kalsifiye
Normal beyin ile izointens, IV kontrast ile hiperintens
MRG
Tercih edilen görüntüleme yöntemi, çünkü dural orjini gösterebilir. (dural kuyruk = periferalde küçülen karakteristik marjinal kalınlaşma )
T1’ de izointens, T2’ de hiperinens,  IV kontrast ile yoğun kontrastlanma
PET
Menejiomun agresifliğinin tayininde rolü olabilir: daha agresif tümörlerde belirgin olarak daha yüksek glukoz utilizasyonu görülür.

Benign (Grade I) - (90%) – meningotelyal, fibröz, transizyonel, psammomatöz, anjioblastik (en agresif)
Atipik (Grade II) - (7%) - Koroid, berrak hücreli, atipik
Anaplastik/Malign (Grade III) - (2%) - papiller, rhabdoid, anaplastik

Korea; 2007 (1986-2004) PMID 17766430 -- "Atypical and anaplastic meningiomas: prognostic implication of clinicopathological features." (Yang SY, J Neurol Neurosurg Psychiatry. 2007 Aug 31)
Retrospektif. Yüksek gradeli 74 hasta (33 atypik, 41 anaplastik). 2000 WHO’ya göre yeniden sınıflandırılmış. Ortalama takip 4.8 yıl
Toplam sağkalım atipiklerde  11.9 yıl vs. anaplastiklerde 3.3 yıl; relapssız sağkalım atipiklerde 11.5 yıl vs. anaplastiklerde 2.7 yıl
Atipik olanlarda beyin invazyonu ve radyoterapi sağkalıma etki etmemiş; anaplastiklerde ise  prognostik faktörler beyin invazyonu, adjuvan RT, p53 overekspresyonu, rezeksiyon genişliği
Sonuç: 2000 WHO klasifikasyonu önceki kriterlere göre daha iyidir.

Tedavi konservatif yaklaşım, definitif cerrahi, adjuvan RT veya definitif RT/radyocerrahi şeklinde olabilir.
Küçük, asemptomatik menenjiomlu hastalar tümör büyüyene ya da semptomatik olana kadar gözlenebilir.
Adjuvan RT için endikasyonlar: Tam olmayan rezeksiyon ve yüksek grade tümör Grade I için 54 Gy, grade II-III için 60 Gy’ dir.
Kavernöz sinüs menenjiomu, cerrahi rezeksiyonun bu bölgede potansiyel morbiditesinden dolayı stereotaktik radyocerrahinin özellikle faydalı olduğu bir senaryodur.
Güncel kılavuz: UpToDate(version 15.2, 4/2007)
Küçük, asemptomatik menenjiom: dikkatli izlem, 3-6 ayda bir görüntüleme
İlk takipte büyüme yoksa, yılda bir periyodik görüntüleme
Büyüme mevcutsa aktif tedavi
Asemptomatik menenjiomlu genç hastalar: cerrahi düşünülmelidir
Semptomatik, geniş, infiltratif ya da ödemli lezyonlar cerrahi ve/veya RT ile tedavi edilmelidir
Anatomik olarak ulaşılabilir: cerrahi rezeksiyon denenmelidir
Simpson Grade I: adjuvan tedavi yok
Simpson Grade II-III ve benign: adjuvan tedavi yok
Simpson Grade II-III ve atipik/malign: adjuvan RT
Simpson Grade IV: adjuvan RT
Unrezektabl tümörü olan, ccerrahi adayı olmayan ve cerrahiyi reddeden hastalara primer RT önerilmelidir

Asemptomatik, tesadüfen tespit edilen menenjiomların çoğu (~2/3) görüntülemede stabildir. Progresyon olursa; yıllık 2-4 mm büyüme görülür, tümör ikilenme zamanı ortalama 20 yıldır.
Kalsifiye ve T2’de hipointens menenjiomlarda progresyon daha nadirdir; yaşlı hastalarda tümör büyümesi daha yavaştır.
Asemptomatik menenjiomlarda, özellikle yaşlı hastalarda ve yüksek operasyon riski taşıyan kafa tabanı tümörlerinde gözlem uygundur. 3. ayda MR, sonrasında 6 ay ve daha sonra yıllık takip önerilir.
Genç hastalarda ve non-kalsifiye tümörlerde daha yüksek büyüme oranı nedeniyle tedavi düşünülmelidir.
Tel Aviv; 2004 (Israil)(1989-1999) PMID 15452322 -- "Natural history of conservatively treated meningiomas." (Herscovici Z, Neurology. 2004 Sep 28;63(6):1133-4.)
Retrospektif. 43 hasta, 51 menenjiom.
% 63’ünde büyüme yok, % 37’sinde büyüme (ortalama yılda 4mm büyüme).
Genç yaş, sphenoid ridge lokalizasyonu, non-kalsifiye, T2 MR’da hiperintens ise  büyüme beklenmelidir.
Hannover; 2003 PMID 12823874 -- "The natural history of incidental meningiomas." (Nakamura M, Neurosurgery. 2003 Jul;53(1):62-70; discussion 70-1.).
Retrospektif. 47 asemptomatik hasta. 41 (87%)’sine konservatif yaklaşım, 6’sına cerrahi.
Volumetrik büyüme ortalaması 0.8 cm3 / yıl, % 66’sında büyüme oranları  <1 cm3 / yıl; tümör çiftlenme zamanı ortalama 22 yıl (1.3 - 143 yıl). Genç hastalarda daha yüksek büyüme oranları. Başlangıçtaki boyut ile çiftlenme zamanı arasında korelasyon yok. Kalsifiye ise progresyon daha nadir.
Sonuç: Tesadüfen tespit edilen menenjiomlarda büyüme minimaldir; konservatif yaklaşım önerilir
Mayo; 1998 PMID 9855530 -- "The natural history of asymptomatic meningiomas in Olmsted County, Minnesota." (Go RS, Neurology. 1998 Dec;51(6):1718-20.)
Retrospektif. 35 asemptomatik, tesadüfen saptanan menenjiom. Ortalama takip 6.2 yıl.
%88 stabil, %12’sinde progresyon, %3 (1 hasta)’da semptom gelişimi. Kalsifiye olanlarda progresyon daha nadir.
Northwestern; 1997 PMID 9153494 -- "Meningiomas: the decision not to operate." (Braunstein JB, Neurology. 1997 May;48(5):1459-62.)
Retrospektif. 12 hasta, konservatif yaklaşım, 100 menenjiom, asemptomatik ya da yüksek operasyon riski. Ortalama takip 8.8 yıl.
1 hastada tümörde büyüme .
Illinois; 1995 PMID 7616265 -- "The natural history and growth rate of asymptomatic meningiomas: a review of 60 patients." (Olivero WC, J Neurosurg. 1995 Aug;83(2):222-4.)
Retrospektif. 60 asemptomatik menenjiomlu hasta. 45 hastaya 3. ay, 9. ay ve sonrasında yıllık takip. Ortalama takip 2.7 yıl(0.5-15).
% 67’sinde büyüme yok (ortalama takip 2.4 yıl, maksimum 6 yıl); % 22 tümörde büyüme (2.4 mm/ yıl, 2 mm - 1 cm ranjda).
Sonuç: Hızlı büyüyen tümörleri ekarte etmek için yakın takip gereklidir.

Genellikle semptomatik, genç hastalarda ve genişleme, infiltrasyon gösteren tümörlerde düşünülür
Komplikasyonlar: Lokalizasyona ve tipine göre % 2-30 oranda görülür
Mortalite: % 1-14; yaşlılarda daha kötü
Rezektabilitenin önemli rolü vardır:
Rezeksiyon genişliği - Simpson Grade PMID 13406590 – lokal rekürrens için belirleyicidir

Gross total rezeksiyon (Grade I-III) ~80% olguda, 10 yıllık progresyonsuz sağkalım ~80%
Subtotal rezeksiyon tipik olarak kavernöz sinüste, petroklival bölgede, posterior superior sagittal sinüste, ve optik sinir kılıfı tümörlerinde; komplet rezeksiyona oranla 4.2 kat daha yüksek rölatif ölüm riski
Grade de önemlidir: 15-yıllık toplam sağkalım benign olanlarda % 80, atipik/anaplastik’ lerde %51 ve rölatif ölüm riski 4.6 kat artmış

Helsinki; 1992 (Finland)(1953-1980) PMID 1641106 -- "Factors affecting operative and excess long-term mortality in 935 patients with intracranial meningioma." (Kallio M, Neurosurgery. 1992 Jul;31(1):2-12.)
Retrospektif. 935 cerrahi ile tedavi edilen hasta.
1-yıllık DSS % 91, 15-yıllık DSS % 78; subtotal rezeksiyonda rölatif ölüm riski  4.2 kat artmış; malign histoloji mevcutsa 4.6 kat artmış risk

UCSF
1987 (1968-78) PMID 3587542 -- "Radiation therapy in the treatment of partially resected meningiomas," (Barbaro NM, Neurosurgery. 1987 Apr;20(4):525-8.
Retrospektif. 51 hasta gros total rezeksiyon, RT yok; 30 hasta subtotal rezeksiyon, RT yok; 54 hasta subtotal rezeksiyon + RT
Rekürrens oranı: GTR % 4, sadece STR %60, STR + adjuvan RT % 32
Sonuç: adjuvan RT rekürrens oranında düşüş sağlar
1994 (1967-90) PMID 8283256 -- "Postoperative irradiation for subtotally resected meningiomas. A retrospective analysis of 140 patients treated from 1967 to 1990," (Goldsmith BJ, J Neurosurg. 1994 Feb;80(2):195-201.)
Retrospektif. 140 hasta (117 benign, 23 malign) adjuvan RT ile tedavi edilmiş, ortalama doz 54 Gy, benign olanlarda 1-2 cm, malignlerde 1-3 cm marjin, ortalama takip 3.3 yıl
5-yıllık toplam sağkalım benignlerde % 85, malignlerde % 58 (SS); benignlerde 10-yıllık progresyonsuz sağkalım ve toplam sağkalım % 77 (malignlerde 10 yıllık sağkalım yok)
RT dozu: 10-yıllık progresyonsuz sağkalım <52 Gy’ de % 65,  >52 Gy’ de % 93 (SS); maliglerde  5-yıllık progresyonsuz sağkalım < 53 Gy’ de  %17, >53 Gy’ de % 63 (SS)
Toksisite: sekonder SSS tümörü yok; % 4 körlük, % 1 (2 hasta) serebral nekroz, 1 hastada ölüm
Sonuç: RT subtotal rezeksiyon uygulanan menenjiomlarda efektif ve güvenlidir. Benign menenjiom için 54 Gy, malign menenjiom için 60 Gy RT önerilmektedir
Gainesville (1964-85) PMID 3403313 -- Taylor WB et al.  "The meningioma controversy: postoperative radiation therapy," Int J Radiat Oncol Biol Phys. 1988 Aug;15(2):299-304.
132 hasta, benign intrakranial menenjiom, minimum 2 yıl takip.
10 yılda lokal kontrol: sadece STR (%€ 18), STR + RT (% 82), GTR (% 77)
Princess Margaret (1966-90) PMID 8598358 -- Milosevic MF et al.  "Radiotherapy for atypical or malignant intracranial meningioma," Int J Radiat Oncol Biol Phys. 1996 Mar 1;34(4):817-22.
59 hasta, atipik veya malign menenjiom. 17 hastada GTR, 35 hastada STR, diğerlerinde biyopsi ve diğer.  Tüm hastalara RT (ortalama doz 50 Gy).
5 yıllık toplam sağkalım % 28, 5 yıllık CSS % 34.
Multivariat analizde; yaş < 58, RT dozu > 50 Gy olması yüksek CSS için bağımsız belirleyiciler idi.
Cleveland Clinic (1979-95) PMID 10656373 -- Goyal LK et al.  "Local control and overall survival in atypical meningioma: a retrospective study," Int J Radiat Oncol Biol Phys. 2000 Jan 1;46(1):57-61.
22 atipik menenjioma, 8 hastaya ortalama 54 Gy (35-59.4) RT, 15 hastaya GTR
GTR uygulanan hastalarda 5 ve 10 yıllık toplam sağkalımlar % 87; STR uygulanan hastal

$APPTYPE  	[ CGI | CONSOLE | GUI ]    Varsayılanı: GUI

$APPTYPE derleyiciye ne tür program üretmek istediğinizi söylemek için kullanılır. Her ne kadar varsayılan GUI olsa da, eğer $APPTYPE talimatı kullanılmazsa RAPID-Q programınızın ne tür bir uygulama olduğunu sadece kaynak koda bakarak anlayacaktır. Bu özelliği kaldırmak için kaynak kodunuzun başına $APPTYPE talimatını ekleyin.
Kullanım: $APPTYPE CONSOLE
$INCLUDE  	[ DosyaAdı ]

$INCLUDE kullanmak dosyanızı çağrı noktasında programınızın içine dahil etmekle aynı etkiyi yapar. Programınızın içinde bir SUB veya FUNCTION haricinde herhangi bir yerde $INCLUDE kullanabilirsiniz fakat daha sık olarak kaynak kodunuzun başına dahil edilir. Dosya adını tırnak içine almak o dosyayı geçerli dizinde ve belirli include yollarında arayacaktır. Dosya adını < ve > arasına almak o dosyayı geçerli dizinde, belirli include yollarında ve çevre arama yollarında arayacaktır.
Kullanım:
$INCLUDE "RAPIDQ.INC"
$INCLUDE <RAPIDQ.INC>

Rapid-Q 32 bitlik çok platformlu bir programlama dilidir. Grafik kullanıcı arabirimi ve konsol programları üretebilir. Derleyici gerçekte Windows, Linux ve Unix yorumlayıcısıdır. Rapid-Q Basic kaynak kodunuzu bayt koda çevirip bir yorumlayıcıya ekler. Rapid-Q kısmen nesneye yöneliktir. QBasic, Power Basic veya Visual Basic konusunda bilgiliyseniz Rapid-Q'da programlamaya başlamak fazla vaktinizi almayabilir.

Rapid-Q derleyicisi William Yu tarafından yazılmış ve geliştirilmiştir. Rapid-Q!nun son sürümü Beta aşamasında idi ve William Yu haklarını Real Basic'in sahibine sattıktan sonra Rapid-Q geliştirilmedi. Ancak Rapid-Q programcıları değişik gruplar kurarak Rapid-Q için yeni kütüphaneler yazmaya devam etmektedir. Rapid-Q'nun Beta aşamasında olması çalışmadığı anlamına gelmiyor, Rapid-Q ile işlevsel programlar yazabilmeniz mümkün!

Realizm, resimcilikte gerçeği yansıtma durumudur. Özellikle realist ressamlar, etkileyici ve gerçekçi resimler yapmaya çalışırlar. Realist ressamların amacı; kendi duygularını içine barındırabilecek, etkileyici ve gerçek resimler oluşturmaktır. Realizmdeki en zor nokta, gerçeğe yakın resim oluşturabilmektir. Çoğu kişi, realist resimler oluşturmak için özel bir yetenek olduğunu düşünür. Bu kesin değildir. En ünlü realist ressamlar: Van Gogh, Rembrandt, Johannes Vermeer, Osman Hamdi Bey vs. Bu ressamlar, realist resimlerinde duygularını, düşüncelerini ve hayal gücünü barındırır.

Realizme konu edilebilecek birçok unsur vardır. En çok kullanılan, amatör realist ressamların en çok kullandığı unsur vazodur. Vazo, ışığın dengelenmesi ve yaratıcılığı için tam olarak bir kaynak unsurdur. Ayrıca, vazonun etrafındaki unsurlar da çok önemlidir. Çevredeki unsurlarda da ışık, gölgelendirme ve yaratıcılık konuşur. Örneğin; resimde bir vazo vardır. Vazonun üstünde türlü desenler bulunmaktadır. Bu desenler, göz alır. Vazonun altında da, bir masa örtüsü bulunsun. Masa örtüsü, vazonun hizasında dalgalanmış olsun. Bununla beraber, vazonun altında masa örtülü sehpa bulunsun. Genellikle, sehpaya çok önem verilmez. Bu resimde vazo ve masa örtüsü geliştirilmiştir. Bu sayede, resim daha etkili yapılmaya çalışılır.

Realist ressamlar, çevresindeki gördüğü olayları düşünceleriyle, kağıda dökerler. Çevrelerindeki üzücü, sevindirici, düşündürücü vs. olaylar karşısında bu sanat dalı ile cevap verirler. Realist bir ressam, kendi düşüncesini barındırmayan bir resim yapması halinde, o resim de o ressam da başarısız olacaktır. Bu nedenle, realizmde unsurlar ve düşünce öğeleri baş role sahiptir. Örneğin, Johannes Vermeer'in resimlerinde özendiği bir hayat yer almaktadır. Realizm, özellikle 19. yüzyıldan önce en önemli devrini yaşamıştır. Bu dönemde, tüm ressamlar realist idi. Bu dönemden sonra, sürrealist ressamlar da ortaya çıkmış ve realizm daha önem kaybetmiştir. Günümüzde de, realizm ile sürrealizm baş başa rekabet içerisindedir.

Sürrealizm (Gerçeküstücülük), sürrealist ressamların gerçekte olmayan unsurlar ve düşünceler kullanarak, kendi hayal güçleriyle oluşturdukları eserlerdir. 
Bu eserler ile düşüncelerini, duygularını ve hayal güçlerini yansıtırlar. Çevrelerindeki gelişmelere karşı, bu yolla cevap verirler. Sürrealizmin amacı, ressamın hayal gücünü yansıtmak ve insanlığa ders vermektir. İnsanların bir kısmı, sürrealizmi saçma ve anlamsız görmektedir; bu tamamen yanlıştır. Realizmdeki gibi ders verir, düşünceleri gösterir. Tek farkı, gerçekte olmayan unsurlardır.

Sürrealizmin, realizm gibi belli başlı unsurları yoktur. Sürrealizmde, sürrealist ressamın hayal gücü ürünü unsurlar yer almaktadır. Bu unsurlar, ressamın düşüncesine bağlıdır. Örneğin; birden fazla unsurun birleştirilmesiyle oluşturulmuş hayal gücü ürünü bir unsur vs. Önemli olan, bu unsurlarda ressamın düşüncesini bulabilmektir. Bunun için, sürrealist resimlerde; realist resimlerin aksine, unsurlar değil hayal gücü ve düşünce konuşur.
Gerçeküstücülük, 1924 yılında şair ANDRE BRETON tarafından Sürrealist Manifestosu ile ortaya atılmış, tüm sanat dallarını kapsamıştır.  Yeni başlayan sürrealist akım, büyük bir kesim tarafından çok saçma görülmüştü. Ancak, zamanla sürrealist ressamların artması ve sürrealist resimlerin büyük kesiminin beğeni toplaması nedeniyle önem kazandı. 20. yüzyılda, sürrealist resimler çok daha değerli görülmeye ve realist resimlerden daha pahalı fiyatlarla satılmaya başlandı. Özellikle Salvador Dali ve Pablo Picasso, bu akımın başlamasında ve güçlenmesinde önemli yere sahiptir. Bu ressamlardan başka: "P. J. Jouve, Pierre Reverdy, Robert Desnos, Louis Aragon, Paul Eluard, Antonin Arnaud, Raymond Queneau, Philippe Soupault, Arthur Cravan, Rene Char, Federico Garcia Lorca" sürrealizm de yeni bir kilometre taşı döşemişlerdir.

Sürrealist eserler yaratmak istiyorsanız: Kesinlikle özgün olmalısınız. Eğer ki özgün olmazsanız, resimcilik camiasında hiçbir şekilde önemli bir yere sahip olamazsınız. Sürrealizmde, hayal gücünüzü konuşturmalısınız. Bu hayal gücü eserleriyle de, insanları düşündürmelisiniz. İnsanların “saçma” demesini aldırmamalısınız. Unsurlar, büyük oranda hayal gücü oranı olmalı ve insanı içine çekmelidir. Ayrıca, sürrealist resimde bir canlılık göze çarpmalıdır. Meşhur sürrealist ressamların resimlerindeki unsurlar tamamen hayal gücüyle üretilmiş, canlı ve düşündüren unsurlardır. Realizmdeki gibi, gerçekçiliği yakalamak önemli değildir. Sürrealizmde; hayal gücü, düşündürmek ve etkileyicilik önemlidir.

Kuyruksuz uçabilen altıgen bir uçurtmadır.Bu uçurtma için:
Malzemeler
1- ) 56 cm uzunluğunda tercihen 3x 10 mm ( veya 3x 8 mm ) kalınlığında 2 adet tahta çıta. Çıtaların illa bu kalınlıkta olması gerekmiyor. Biraz daha kalın veya ince olabilir. Çıtaların esneyebilir olması önemli.
2- ) 67,4 cm uzunluğunda 5 x 5 mm kalınlığında 1 adet çıta.
3- ) İskeleti oluşturmak için pamuklu ambalaj ipi. İpin gerildiğinde uzamaması gerekiyor.Bu yüzden naylon türevi ip kullanmamaya dikkat edin.
4- ) Kaplamak için naylon veya ince dayanıklı kağıt. ( defter kaplama naylonlarý olabilir. )
5- )Yapıştırıcı bant
Yapılışı
Önce bütün çıtaların uçlarını iple rahat bağlayabilmek için hafif yontalım. Uçurtmaların 56 cm'lik olan çıtaların 4 eşit parçaya ayıracak şekilde 5 yerden 2 mm'lik oyuklar yapılacak. Yonttuktan sonra uzun olan (67,4 cm) çıtamızı uçurtmamızın omurgası yapacağız. Bu çıtanın uçlarından 12,7 cm altana çıtaları tam ortasından yerleştireceğiz ve buralardan sıkıca bağlayacağız. Bağladıktan sonra çıtaların uçlarını bir sonraki köşeyle bağlıyacağız. Bağladıktan sonra uçlarını defter kaplar gibi kaplıyacağız.
Yatay olan çıtalarımızın daha önce 5 eşit parçaya bölerek oluşturmuştuk bu bölümleri 1,5 metre kadar aynı çıtanın ipiyle birleştireceğiz. Daha sonra bu ikisini 50 metrelik bir iple birleştireceğiz.
Uçurtmamız artık uçurulmaya hazır.

Ruby yorumlamalı, nesne-temelli bir betik programlama dilidir. Ruby değerli bir mücevherin adıdır ve bu ad ona yaratıcısı Yukihiro Matsumoto, (Matz) tarafından verilmiştir ve yayınlanma yılı 1995'tir. Tarihçesini burada bulabilirsiniz. Birçok özelliklerinin bir listesini de burada bulabilirsiniz.
Bu kitap birçok bölümden oluşuyor be sırasıyla okumanız tavsiye edilir. Başlangıç bölümü sisteminizde Ruby dilini nasıl kuracak ve kullanmaya başlayacağınızı anlatıyor. Ruby Temelleri dilin deyim yapısının ana özelliklerini gösteriyor. Ruby dili bölümü dilin dokümanları gibi organize edilmiştir. Mevcut modüller standart kütüphanelerin bir kısmını içeriyor.  Orta seviye Ruby biraz daha gelişmiş başlıkları içeriyor. Her bölüm kendi içinde diğerlerinden bağımsız düşünülmüştür.

Genel Bakış
Ruby Kurulumu
Ruby Editörler
Notasyon Kuralları
İnteraktif Mod
Ruby Programları Oluşturmak

Merhaba Dünya
Stringler
Alternatif String Yazımları
here Dokümanlar
ASCII
Encoding
Nesnelere giriş
 Temel yapılar
Veri tipleri — number, string, hash ve array
Metod tanımlamak
Sınıflar ve nesneler
Sıradışı Durumlar

Söz Dizimi
Leksikoloji
Belirteçler
Yorumlar
Gömülü Belgelendirme
Ayrılmış Kelimeler
İfadeler
Değişkenler ve Sabitler
Yerel Değişkenler
Oluşum Değişkenleri
Sınıf Değişkenleri
Küresel Değişkenler
Sabitler
Sahte Değişkenler
Ön-Tanımlı Değişkenler
Değer İfadeleri
Sayısallar
Karakter Dizileri
Enterpolasyon
Backslash Notasyonu
% Notasyonu
"Here döküman" notasyonu
Komut Çalıştırmak
Kurallı İfadeler (Regexp)
Array'ler
Hash'ler
Alanlar
Operatörler
Atama
Kendine Atamalar
Çoklu Atamalar
Koşullu Atama
Kapsamlar (Scope)
and
or
not
Kontrol Yapıları
Koşullu Dallanmalar
if işlemi
unless işlemi
if-elsif-else işlemi
kısa-if işlemi
case işlemi
Döngüler
while
until
for
break
redo
next
retry
Miscellanea
return
Metod Çağrıları
Metod Tanımlamaları
Blokları Anlamak, Proc ve Metodlar
Ampersand (&)
Dinamik Metodlar
Özel Metodlar
Sınıflar
Sınıf Tanımlamak
Oluşum Değişkenleri
Erişim Metodları
Sınıf Değişkenleri
Sınıf Oluşum Değişkenleri
Sınıf Metodları
Oluşumlar
Görünürlüğü Belirleme
Private
Public
Protected
Oluşum Değişkenleri
Kalıtım
Modüllerde Karıştırma
Include
Prepend

Burada Ruby'de default olarak bulunan sınıfların bir listesi var. Bunlar "core" (ana kütüphane) içinde tanımlanmış olarak gelir.

Gömülü Fonksiyonlar
Öntanımlı Değişkenler
Öntanımlı Sınıflar
Object
Array
Sınıf
İstisna
FalseClass
GÇ
Dosya
File::Stat
Metod
Modül
Sınıf
NilClass
Numeric
Tamsayı
Bignum
Fixnum
Float
Range
Regexp
String
Struct
Struct::Tms
Symbol
Time
TrueClass

BigDecimal gives you a way to have arbitrary precision Decimal style numbers.  Never succumb to rounding errors again!
Debugger gives you a way to step through debug your Ruby code.
Distributed Ruby (DRb) gives you a way to make remote procedure calls against objects in a different VM.
mkmf is a utility used to generate makefiles for ruby extensions.
Mutex gives you a way to control thread concurrency.
Net::HTTP gives you a way to download web pages.
Open3 gives you a way to run a sub-process and have easy access to its I/O.
OpenSSL is a wrapper to the OpenSSL (C) library, giving you access to secure socket connections.
Pathname gives you an easy way to manipulate filenames and create/remove files.
Profiler gives you a way to profile what is taking up the most time in your code.
OpenURI gives you a way to download files using ruby.
REXML is a way to parse XML in pure Ruby.
Ripper gives you a way to parse pure Ruby code into an AST.
Socket gives you access to Network connectivity.
Tracer gives you a way to see which lines of your code are being executed and in what order.
Win32::Registry gives you a way to query and edit the windows registry.
Win32API gives you a way to call into specific windows core methods easily.
WIN32OLE gives you a way to use Windows OLE.

Database interface modules

GUI toolkit widget modules
Ruby/Tk

Ruby Programlama Dili

Daniel Carrera'nın Ruby Öğrenmek Makalesi

Burada Ruby'nin bazı yönlerine ait daha gelişmiş öğreticiler mevcut.

Unit testing
RubyDoc
Rake
RubyGems
Running Multiple Processes
Using Network Sockets
Building C Extensions
Rails
Embedding Ruby within a separate C program

Ruby homepage
Ruby Documentation Homepage
Ruby-Talk: The Ruby Mailing List 
Ruby's Nitro/Og Web Toolkit 
Ruby on Rails
Why's (Poignant) Guide To Ruby
Programming Ruby(a.k.a.Pickaxe) 1stEdition Online
RubyForge: The Repository for Open-source Ruby Projects 
Etkileşimli Ruby Dersi

←here Dokümanlar | 
Encoding→
Bize göre "Hello world" gibi bir string bir kısım harfler ve ortasında bir boşluk olarak görünüyor. Bilgisayarınıza göre ise her String – gerçekte herşey – bir sayılar serisidir.

Örneğimizde, "Hello world" string'inin her karakteri 0'dan 127'ye kadar olan bir sayı ile ifade edilir. Örneğin bilgisayarınıza göre büyük harf "H" 72 sayısıyla, boşluk ise 32 sayısıyla kodlanır, bu kodlamaya encoding. ASCII standardı orjinalinde telgraf üzerinden yazı göndermek için tasarlandı ve her hangi sayının hangi karaktere karşı geldiğini bildiriyor.
Birçok Unix-benzeri işletim sisteminde tüm ASCII kodlarını terminalde "man ascii" komutu girerek görebilirsiniz. Wikipedia'nın  ASCII sayfasında da ASCII kodlarının listesini görebilirsiniz. ASCII listesini kullanarak bizim "Hello world" string'imizin aşağıdaki ASCII kodlara dönüştürüldüğünü anlayabiliriz.

H  e   l   l   o   space  w   o   r   l   d
72 101 108 108 111 32     119 111 114 108 100

Ayrıca Ruby 1.8 ve öncesinde bir karakterin ASCII kodunu? operatörü kullanarak görebilirsiniz.

puts ?H 
puts ?e
puts ?l
puts ?l
puts ?o

Soru işareti operatörü Ruby 1.9'dan itibaren çalışmaz.  Yerine ord metodu kullanılır.

puts "H".ord
puts "e".ord
puts "l".ord
puts "l".ord
puts "o".ord

Aşağıdaki program çıktısına bakınca "Hello world" string'inin "Hello" parçasının ASCII kodları görünür.

$ ruby ascii.rb
72
101
108
108
111

Space karakterinin ASCII kodunu almak için escape sequence karşılığını girmeliyiz. Gerçekte ? operatörü ile herhangi bir escape sequence ifadesi kullanabiliriz.

puts ?\s
puts ?\t
puts ?\b
puts ?\a

Ama bu kodu Ruby >= 1.9 üzerinde çalıştırmak için

kullanılır. The sonuç:

32
9
8
7

Farkında olmayabilirsiniz ama şimdiye kadar Ruby programlarınızı terminal emülatörü adı verilen bir programın içinde çalıştırıyordunuz –  Microsoft Windows'ta konsol, Mac OS X'te Terminal uygulaması, bir telnet client'da rxvt, veya X Window Sistem'de xterm gibi programlarda.
Ruby programınız "H" harfini yazmaya kalktığında "H" karakterinin ASCII kodunu (72) terminal emülatöre gönderir, ve emülatör de ekrana "H" çizer. Ruby programınız bir bell karakteri yazmaya kalktığında terminal emülatöre başka bir ASCII kodu yollar – ASCII kod 7. Bu durumda terminal emülatör ekrana bir harf çizmez, bunun yerine ya beep sesi çıkarır ya da kısa bir süre flaş çakar. Her kodun nasıl işleneceği genellikle ASCII standardı tarafından belirlenir.

ASCII standardı bir çeşit karakter kodlamasıdır. Yukarıda belirtildiği üzere ASCII standardı karakterler için sadece 0'dan 127'ya kadar sayıları kullanır. İlk icat edenlere bu kadarı yetmiş, ancak dünyada çok daha fazla karakterler kullanılıyor. Diğer karakter kodlama sistemleri – örneğin Latin-1, Shift_JIS, ve Unicode Transformation Format (UTF) – üretilerek Arapça, İbranice, Çince, ve Japonca gibi dillerde bulunan bir sürü karakter ifade edilebildi.

←Stringler | 
here Dokümanlar→
Ruby'de string değerleri ifade etmek için birden fazla yöntem vardır. Bunların çoğu Perl programcılarına tanıdık gelecektir.
Bu alternatif yöntemler:

Tek tırnakları %q operatörü ile ifade: %q(abc) ve 'abc' aynıdır
Çift tırnakları %Q operatörü ile ifade: %Q(abc's) ve "abc's" aynıdır

Diyelim aşağıdaki path değerini ifade için tek tırnak kullanacağız.

Bu kod şu çıktıyı verecektir:

Tek tırnak içinde yazım, \b, \n, ve \t karakter çiftlerinin escape sequence olarak algılanmamasını sağlar (gerçi aynısını Wikibooks'un kod renklendirmesi için söyleyemeyiz).

Şimdi şu string değer yazımını düşünelim:

Bununçıktısı:

Apostrofları ifade için yapmamız gerekenler kodumuzu daha zor okunabilir ve ne çıktı vereceğinde zorlanabilecğimiz bir hale getirdi.
Şanslıyız ki Ruby'de daha iyi bir yol var. %q operatörünü tek tırnak kurallarına uygulayabilirsiniz, ve kendi sınırlayıcınızı seçebilirsiniz. Bu sınırlayıcı string değer girişinin başını ve sonunu belirler.

puts %q!c:\napolean's documents\tomorrow's bus schedule.txt!
puts %q/c:\napolean's documents\tomorrow's bus schedule.txt/
puts %q^c:\napolean's documents\tomorrow's bus schedule.txt^
puts %q(c:\napolean's documents\tomorrow's bus schedule.txt)
puts %q{c:\napolean's documents\tomorrow's bus schedule.txt}
puts %q<c:\napolean's documents\tomorrow's bus schedule.txt>

Tüm satırlar aynı metin çıktısını verir:

Örneklerin dışındaki istediğiniz herhangi bir noktalama işaretini sınırlayıcı olarak belirleyebilirsiniz. 
Tabi ki bu işaret string değer içinde kullanılmıyor olmalıdır, öyle olursa onu da escape etmeniz gerekir.

puts %q#c:\napolean's documents\tomorrow's \#9 bus schedule.txt#

Metni sınırlamak için eşleşen parantezler kullanırsanız, içeride kullanacağınız eşleşen parantezleri escape etmeniz gerekmez.

puts %q(c:\napolean's documents\the (bus) schedule.txt)
puts %q{c:\napolean's documents\the {bus} schedule.txt}
puts %q<c:\napolean's documents\the <bus> schedule.txt>

%Q operatörü (Q büyük harf) string değerlerinizi çift tırnak kuralları kullanarak ifade etmenizi sağlar, fakat sınırlayıcı olarak çift tırnak kullanılmaz. Aynı %q operatörü gibi kullanılır.

Aynı çift tırnak kullanır gibi bu şekil string değer ifadelerinde de enterpolasyon yapabilirsiniz.

←Leksikoloji | 
Değer İfadeleri→
Rubydeki bir değişken isminin başlangıcındaki karakterlerle ayırt edilebilir. Değişkenin isim uzunluğu konusunda bir sınırlama yoktur. (yığın boyutunu saymazsak).

İlk karakter kapsamı bildirir:

Yerel değişkenler — küçük harf ya da alt çizgi
Oluşumdeğişkenleri — @
Sınıf kapsamında oluşum değişkenleri o sınıftan üretilen nesneye aittir
Sınıfa ait nesneler üzerinde örnek değişkenleri tanımlamak için, initialize() içinde @ kullanın
Sınıf değişkenleri — @@
Global değişkenler — $
Sabitler — büyük harf
Sınıf yapılarında değişken kapsamları için ilave bilgi Ruby/Söz Dizimi/Sınıflar sayfasında.

Örnek:

İsmi küçük harf (a-z) ya da altçizgi (_) ile başlayan bir değişken, bir yerel değişken ya da metod çağrısıdır.
Bir yerel değişkene sadece tanımlandığı blok içinde erişilebilir. Örneğin:

Örnek:

Bir değişkenin adı @ karakteri ile başlıyorsa içinde bulunduğu sınıfın oluşum değişkenidir, yani o sınıftan üretilen her nesne için bu değiken ayrı ayrı geçerlidir. Bir oluşum değişkeni nesnenin kendisine aittir. Başlatılmamış oluşum değişkenlerinin değerleri nil olur.

Bir sınıf değişkeni, o sınıftan üretilen tüm oluşum nesnelerinde paylaşılan tek bir değişkendir ve "@@" karakterleri ile başlar. Örnek:

Bir önemli nokta sınıf değişkeni o sınıfın tüm torunlarında da paylaşılır. Örnek:

Bu gösteriyor kii bizim bütün sınıf tanımlamaları aynı değişkenin değerini değiştiriyor. Sınıf değişkenleri kalıtım ağacı kapsamında global değişkenmiş gibi davranıyor. Ruby değişkenleri ilk önce kalıtım ağacına bakarak değerlendirdiği için, eğer iki altsınıf aynı isimde sınıf değişkenleri tanımlarsa (eklerse) sıkıntı olabilir.

Örnek:

İsmi '$' ile başlayan her değişkenin küresel kapsamı vardır; yani değişkene, program çalıştırılırken her yerden erişilebilir.

Kullanım:

İsmi büyük harfle (A-Z) başlayan tanımlar sabitlerdir. Bir sabit başladıktan sonra tekrar değer atanabilir, fakat öyle yapmak hata üretecektir. 
Değer atanmamış bir sabite erişmeye çalışmak NameError (İsimHatası) hatası oluşturur.

Sabitlere erişirken ya bulunduğunuz kapsamda tanımlılara erişirsiniz ya da kapsam ifade (scope resolution) operatörü (örn. '::') kullanırsınız. Örneğin:

Burada şu da görülüyor, B sınıfna da sabite erişir gibi erişiyoruz. Bir diğer örnek:

self

Bulunulan metodun çalıştığı kapsam, metodun olduğu yere göre nesneyi, sınıfı ya da modülü gösterir.
nil

NilClass sınıfının yegane oluşum nesnesi. Hiçbir şeyliği ifade eder.
true

TrueClass sınıfının yegane oluşum nesnesi. true değerini ifade eder.
false

FalseClass sınıfının yegane oluşum nesnesi. false değerini ifade eder.
$1, $2 ... $9

Bunlar regexp eşleşme gruplarının içeriğini saklarlar. Bulunulan thread ve yığın çerçevesinde yerel değişkenlerdir
(nil koşullarda kullanılırken false olarak kabul edilir, nil olmayan tüm değerler true kabul edilir, Ruby'de böyle). Bir sahte değişkenin değeri değiştirilemez. 

Ruby interpreter parametreleri ve regexp değerler ile çalışırken kullanılabilecek kullanışlı ön-tanımlı değişkenler vardır.

Bu kısa isimlerin hem gizemli hem zor olmasından dolayı , standart kütüphane English'te bulunan uzun isimleri de tabloda gösterdik. Bu isimleri kullanmak için "English" kütüphanesini aşağıdaki gibi kodunuza dahil ediniz.
‘English’ olmadan:

English ile:

Ayrıştırma zamanında önceden tanımlanmış bazı sabitlerin de olduğunu unutmayın, bunlar şunlardır:

 __FILE__   (bulunulan dosya adı)
 __LINE__   (bulunulan satır numarası)

ve

 __dir__    (bulunulan klasör)
 __method__ (bulunulan metod)

(new in Ruby 2.0)
Ruby dili dökümantasyonunda bir list of predefined global constants bulunabilir  Öne çıkanlar:

←Kurulum | Notasyon Kuralları→

Integrated development environment ya da IDE bir yazılımdır ve enazından bir debugger, bir kaynak kodu düzenleyici ve derleme otomasyonu araçları içerir.  
Ruby programlama dili için kullanılabilecek text editör/IDE'ler aşağıda alfabetik olarak sıralanmıştır :
Ruby programı yazmak için sıradan bir metin düzenleyici kullanabileceğiniz gibi, bazı metin düzenleyiciler Ruby programcısına yardımcı olacak özelliklere sahiptir. En yaygın özellik syntax highlighting'dir. 
P.S 1: Okuyuculara kolaylık için popüler düzenleyici olan Notepad++ kullanılmıştır, ATOM düzenleyiciler 15 Aralık 2022 itibarı ile GitHub tarafından sonlandırılacak. 
P.S 2: Pulsar , ATOM IDE'nin bir devamı olarak fork edilmiştir. Aşağıda listelenmiştir.

Arcadia
Fiyat:  (Free as in beer)
Websitesi: https://www.arcadia-ide.org/ 

Fiyat:  (Free as in beer)
Websitesi: https://www.gnu.org/software/emacs/

Fiyat:  (Free as in beer)
Websitesi: https://icecoder.net/

Fiyat:  (Free as in beer)
Websitesi: https://www.activestate.com/products/komodo-ide/

Fiyat:  (Free as in beer)
Websitesi: https://notepad-plus-plus.org/

Fiyat:  (Free as in beer)
 Recommended for Freeware 
Websitesi: https://pulsar-edit.dev/
Ruby Paketleri: https://web.pulsar-edit.dev/packages/search?q=ruby

Price:   (Yıllık kullanım bedeli vardır)
 Ücretli yazılımlar içinde önerilir 
Websitesi: https://www.jetbrains.com/ruby/whatsnew/

Fiyat:  (Tek ödemeli ve 3 yıl boyunca sürekli güncelleme hakkı)
Websitesi: https://www.sublimetext.com/

Fiyat:  (Free as in beer)
Websitesi: https://www.vim.org/download.php#pc

Burada değişik seçenekleri gösteren bir spreadsheet var.

←ASCII | 
Nesnelere giriş→

Ruby 1.9'un gelişiyle beraber, Ruby string'ler, IO ve kaynak kodu için US-ASCII'den başka karakter kodlamaları da kullanmaya başladı. Ruby 1.9.3 MRI'ın Mac OSX Lion'da kurulumunda, Ruby aşağıdaki karakter kodlamalarına sahiptir:

ASCII-8BIT
UTF-8
US-ASCII
Big5
Big5-HKSCS
Big5-UAO
CP949
Emacs-Mule
EUC-JP
EUC-KR
EUC-TW
GB18030
GBK
ISO-8859-1
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
ISO-8859-10
ISO-8859-11
ISO-8859-13
ISO-8859-14
ISO-8859-15
ISO-8859-16
KOI8-R
KOI8-U
Shift_JIS
UTF-16BE
UTF-16LE
UTF-32BE
UTF-32LE
Windows-1251
IBM437
IBM737
IBM775
CP850
IBM852
CP852
IBM855
CP855
IBM857
IBM860
IBM861
IBM862
IBM863
IBM864
IBM865
IBM866
IBM869
Windows-1258
GB1988
macCentEuro
macCroatian
macCyrillic
macGreek
macIceland
macRoman
macRomania
macThai
macTurkish
macUkraine
CP950
CP951
stateless-ISO-2022-JP
eucJP-ms
CP51932
GB2312
GB12345
ISO-2022-JP
ISO-2022-JP-2
CP50220
CP50221
Windows-1252
Windows-1250
Windows-1256
Windows-1253
Windows-1255
Windows-1254
TIS-620
Windows-874
Windows-1257
Windows-31J
MacJapanese
UTF-7
UTF8-MAC
UTF-16
UTF-32
UTF8-DoCoMo
SJIS-DoCoMo
UTF8-KDDI
SJIS-KDDI
ISO-2022-JP-KDDI
stateless-ISO-2022-JP-KDDI
UTF8-SoftBank
SJIS-SoftBank

Default olarak Ruby 2.='dan bu yana tüm Ruby kaynak dosyaları UTF-8 olarak kodlanmıştır. Bir dosyanın karakter kodlamasını değiştirmenin genel yolu "sihirli yorum satırı" denen yorum satırını kullanmaktır. Sihirli yorum satırı dosyanın en başında olmalıdır ya da hemen | shebang yorumun arkasında olmalıdır. Sihirli yorumun tek ihtiyacı vardır: Yorumda coding: kelimesi ve takip eden bir karakter kodlama ismi. Yani aşağıdakiler geçerli sihirli yorum satırları:

Sihirli yorum satırı Ruby işleyiciye (interpreter) bu kaynak kodunun ve içindeki tüm string'lerin verilen karakter kodlamasında olduğunu bildirir. Yani şu geçerli bir kod:

Ama bu değil:

Çünkü ilk kodda karakter kodlaması ISO-8859-1 verilmiş (US-ASCII kodlamasına Fransızca ve İspanyolca karakterleri ekleyerek oluşturulan bir karakter kodlaması), bu durumda "é" karakteri geçerli olacaktır. Ancak US-ASCII kodlamasında "é" geçersiz bir karakterdir ve hata verecektir.

$ ruby encode.rb
encode.rb:
encode.rb:2: invalid multibyte char (US-ASCII) 
(SyntaxError)
encode.rb:2: invalid multibyte char (US-ASCII)

Dosyanızın içindeki string'lerin karakter kodlarını bağımsız olarak da verebilirsiniz (her ne kadar string değerlerin ifadesinde hala sihirli yorum tarafından bildirilen kodlamada olması veya escape sequence aracılığıyla eklenmesi gerekse de). Bunu yapmak için String sınıfının iki metodu kullanılır: encode ve force_encoding.
encode kod dönüştürmek için kullanılır. 
Mesela ISO-8859-1 kodlamasıyla verilen "Olé!" string değerini, tüm karakterlerini içeren UTF-8 kodlamaya çevirmek için encode kullanabilirsiniz. Bununla beraber, ISO-8859-1'de verilen bir string'i US-ASCII kodlamaya dönüştürmek isterseniz bu sadece değer ASCII karakterler içerdiğinde (örn. "Hello") mümkündür. encode metodunun birçok opsiyonları vardır ve kapsamlı bir şekilde yapılandırılabilir. Orjinal dökümanına bakabilirsiniz. encode metodunun püf noktası: Karakterlerin görseli ve anlamı aynı kalsa da altta yatan sayılar genelde aynı kalır. encode metodunun string değerin altında yatan byte'ları değiştirme özgürlüğü vardır. Örnek:

force_encoding metodu ise Ruby'ye string değerin bu dönüştürülecek encoding ile aynı sayısal değerlere sahip olduğunu ve değiştirilmemesi gerektiğini deklare eder (mesela ISO-8859-1 kodlamalı bir program içinde UTF-8 kodlamalı bir dosyadan değer okudunuz). force_encoding metodu string değerin altında yatan byte'ları asla değiştirmez. Örnek:

Ruby ayrıca bir sahte karakter kodlaması da içerir: ASCII-8 Bit, veya BINARY. BINARY karakter kodlaması binary veriler için kullanılır.
#encoding: ISO-8859-1

←Ruby | Kurulum→
Ruby is an nesne yönelimli betik dilidir. Ruby dili  Yukihiro Matsumoto (Matz diye de bilinir) tarafından geliştirilmiştir. Ruby programlama dilinin ana web sitesi ruby-lang.org'dur. Geliştirilmeye Şubat 1993'te başlanmış ve ilk alfa versiyonu Aralık 1994'te yayınlanmıştır. Betik diller olan  Perl ve Python gibi dillere alternatif olarak geliştirilmiştir.  Ruby ağırlıklı olarak Perl'den esinlenmiştir ve class kütüphaneleri Perl'ün işlevselliğinin nesne yönelimli bir uyarlamasıdır. Ruby ayrıca Lisp ve Smalltalk'tan da esinlenmiştir. Ruby birçok özelliğini Python'dan almamasına rağmen, Matz bu dili geliştirirken Python kod okumaları kendisine yardımcı olmuştur.
MacOS sistemler Ruby kurulu olarak gelir. Birçok Linux dağıtımı ya Ruby kurulu olarak gelir ya da dağıtım'ın özgür yazılım depolarından kolayca kurulabilir. Teknik olarak daha yetenekli olanlar Ruby kaynak kodunu  indirip Unix, DOS, BeOS, OS/2, Windows, and Linux gibi birçok işletim sistemi için derleyebilir.

Ruby dili Perl, Smalltalk, Eiffel, Ada, Lisp, ve Python'dan özellikleri biraraya getirir.

Ruby tamamen nesne yönelimli bir dil olmak için büyük çaba harcar. Ruby'deki her değer bir nesnedir, hatta en temel veri tiplerindeki değerler , mesela: string'ler, sayılar hatta true ve false değerleri bile. Her nesne'nin bir sınıfı (class) vardır ve her sınıfın da bir üst sınıfı (superclass) vardır. Sınıf hiyerarşisi en tepesinde BasicObject sınıfı vardır, Object sınıfı dahil tüm sınıflar bundan türetilmiştir.
Her sınıfın bu sınıftan üretilen nesnelerde çağrılabilecek metodları olur. Metodlar sadece nesnelerde çağrılır - diğer dillerde olan "sınıf metodları" (class methods) Ruby dilinde yoktur.
Her nesnenin bir dizi oluşum değişkeni (instance variable) vardır, bunlar o nesnenin durumlarını saklar. Oluşum değişkenleri nesnede çağrılan metodlarla oluşturulur ve değerlerine erişilir. Oluşum değişkenleri tamamıyla o nesneye özeldir. Diğer nesneler onları göremez, aynı sınıftan üretilmiş nesneler olsalar bile. Ruby nesneleri arasında tüm iletişim metodlar üzerinden gerçekleşir.

Class yapısı dışında Ruby modüllere de sahiptir (module). Bir modülün class gibi metodları olur ancak nesne oluşumları olmaz. Bunun yerine bir modül bir class içine dahil edilebilir (include) veya karıştırılabilir (mixin), böylece modülün metodları class'a eklenmiş olur. Bu biraz kalıtım yoluyla class elde etmeye benzer ancak bir class bir çok modül içerebileceği için çok daha esneklik getirir. Ayrı özellikleri ayrı modüllere yerleştirerek işlevsellik ayrıntılı şekillerde birleştirilebilir ve böylece kod kolayca yeniden kullanılabilir. Karışımlar Ruby'nin karmaşık ve kısıtlayıcı class hiyerarşilerinden uzak kalmasını sağlar.

Ruby çok dinamik bir programlama dilidir. Ruby programları C vaya Java programları gibi derlenmez. Program içindeki tüm sınıf, modül ve metod tanımları kod çalıştırılırken oluşturulur. Bir program çalışırken kendi tanımlamalarını da değiştirebilir. String ve Integer gibi en çok kullanılan verilerin class tanımları bile açılıp değiştirilebilir. Rubyistler buna monkey patching der ve bu diğer dillerin bir çoğunda yapamayacağınız bir şey.
Ruby'de değişken tipleri dinamik olarak verilir, bunun anlamı değişkenler her türlü nesne içerebilir. Bir nesnede bir metod çağırdığınızda Ruby metodu sadece adıyla arar - nesnenin tipiyle falan ilgilenmez. Buna duck typing denir ve bu sayede sadece aynı metodları uygulayarak diğerine benzer davranışta bulunan sınıflar oluşturabilirsiniz.

Her Ruby nesnesi bir sınıfa sahiptir sözü tam doğru değil. Doğrusu her nesne iki sınıfa sahip: Bir normal class ve bir de singleton class. Bir nesnenin singleton class'ı tek oluşumunu o nesne olan isimsiz bir sınıftır. Her nesnenin kendi singleton class'ı kendisi ile birlikte nesne üretilirken üretilir. Singleton class'lar ait oldukları nesnenin sınıfından kalıtım yoluyla üretilir ve başlangıçta boştur, fakat onları açıp içine metodlar ekleyebilirsiniz, böylece sadece bağlı oldukları nesnede çağrılan metodlar oluşur. Bu Ruby'nin "class metodlarından" kaçınarak basitliği ve zarifliğini korumasının sırrıdır.

Ruby o kadar nesne yönelimli ki class , module ve method'lar bile nesnelerdir. Her class aslında Class sınıfının bir oluşumudur ve her module aslında Module sınıfının bir oluşumudur. Programınız çalışırken metodlarını çağırabilir hatta değiştirebilirsiniz. Bunun anlamı, Ruby kodunu sınıflar ve modüller üretmek için kullanabilirsiniz, bu teknik metaprogramlama diye bilinir. Akıllıca kullanımı kodunuzda son derece soyut tasarım paternleri yakalamanıza ve bir metod çağırır gibi kolaylıkla kullanmanıza olanak tanır.

Ruby'de herşey şekillendirilebilir. Mevcut sınıflara yeni metodlar  subclassing kullanmadan eklenebilir, operatörlerin yaptıkları overloading ile değiştirilebilir ve standart bir kütüphanenin bile davranışı kod çalışırken değiştirilebilir.

Ruby'de değişkenleri veya değişkenlerin kapsamını belirtmenize gerek yoktur. Değişken adı otomatik olarak kapsamını belirler.

x yerel bir değişkendir (veya değişkenden başka bir şey).
$x global bir değişkendir.
@x bir oluşum değişkenidir.
@@x bir class değişkenidir.

Bloklar , Ruby'nin en sevilen biricik özellikleridir. Bir blok, bir metoda yapılan çağrıdan sonra görülebilen bir kod parçasıdır, şöyle ki:

  
Blok is do ve end arasında kalan her şeydir. Blok içindeki kod yazıldığı yerde hemen çalışmaz, örneği düşünürsek kod bir nesne içine paketlenir ve sort metodu olarak tanımlanır. Bu nesne daha sonra aynı bir metod gibi çağrılabilir. sort metodu listedeki iki değeri karşılaştırmak istediğinde bloğu işletir. Bir blok nesnesi, diğer nesneler gibi, bir değişkende saklanabilir, diğer metodlara aktarılabilir vaya kopyalanabilir de.
Birçok programlama dili böyle kod nesnelerini destekler. Onlara closure denir ve herhangi bir dil için çok kuvvetli bir özelliktir, ancak bunlar genellikle yeterince kullanılmaz çünkü bunları oluşturmak için kullanılan kodlar çirkin ve doğal olmayan bir görünüme sahiptir. Bir Ruby bloğu bir closure oluşturup onu bir metoda geçirmek için özel ve temiz kodlu bir sadeliktedir. Bu basitlik sayesinde Rubyistler closure yapıları her çeşit yenilikçi üretimlerinde kapsamlı olarak kullanırlar.

Ruby birçok gelişmiş özellik içerir.

Hataları değerlendirmek için Hata işleme.
Reference counting yerine bir işaretle-ve-süpür  atık toplayıcı .
İşletim sisteminden bağımsız threading, sayesinde DOS gibi işletim sistemlerinde dahi çoklu işlem parçları yazabilirsiniz. (bu özellik native threads kullanan   1.9 sürümü sonrası kalkacaktır)
Ayrıca Ruby'ye C kullanarak eklentiler de yazabilirisiniz ya da Ruby'yi diğer yazılımların içine katabilirsiniz.

←Kaynakça | 
Öntanımlı Değişkenler→

Default olarak mevcut birçok metod vardır. Bunları irb oturumunda methods komutu girerek görebilirsiniz, örn :

>> class A; end
>> A.instance_methods

[:nil?, :===, :=~, :!~, :eql?, :class, :clone, :dup, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :extend, :display, :method, :public_method, :define_singleton_method, :hash, :__id__, :object_id, :to_enum, :enum_for, :gem, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]

Nesne hiyerarşisini inceleyerek bu metodların çoğunun nerede tanımlandığını görebilirsiniz :

>> A.ancestors
=> [A, Object, PP::ObjectMixin, Kernel, BasicObject]

Her metodun nerede tanımlanmış olduğunu görmek için :

>> A.instance_methods.map{|m| [m,  A.instance_method(m).owner] }
=> [[:nil?, Kernel], ...

←Öntanımlı Sınıflar | 
Array→

Object sınıfı Ruby'de üretilen tüm diğer sınıfların ana sınıfıdır. Tüm sınıflarda mevcut olan temel işlevleri (meodları) barındırır, ve her işlevi kullanıcı isterse değiştirebilir (override).
Bu sınıf tüm Ruby sınıfları için kullanışlı bir kısım metod içerir.
Object sınıfı da değişik nesne hiyerarşilerini üretmeye yarayan  BasicObject'den kalıtımla üretilmiştir. Object içindeki metodlar kasıtlı olarak değiştirilmedikçe tüm sınıflarda geçerlidir.
Ruby'de sınıflar ve modüller dahil her şey bir nesnedir. Object ve BasicObject en alt seviye sınıftır.

ARGF komut satırında girilen veya STDIN ile girilen, betiğin işleyeceği dosyayı ifade etmek için tasarlanmış bir akıştır.

ARGV betiği çalıştırırken komut satırında betik adından sonra girilen argümaları içerir.

DATA çalıştırılmakta olan dosyanın veri kısmını içeren bir dosyadır. Veri kısmı dosyada __END__ satırı sonrası yazılanlardır:

ENV sistemin ortam değişkenlerine erişmek için hash benzeri bir değerdir.

Orijinal stderr'i barındırır

Orijinal stdin'i barındırır

Orijinal stdout'u barındırır

←Gömülü Fonksiyonlar | 
Öntanımlı Sınıflar→

Ruby'nin öntanımlı (built-in) değişkenleri tüm programın davranışını etkiler, bu yüzden kütüphanelerde kullanılması tavsiye edilmez.
The values in most predefined variables can be accessed by alternative means.

$!

Son oluşan exception nesnesi. Exception nesnesine ayrıca rescue kısmında => kullanarak da erişilir.

$@

Son yaşanan sıradışı durumun (exception) geri izleme listesi. Bunu son exception'ın Exception#backtrace metoduyla da öğrenebilirsiniz.

$/

Giriş alırken (gets, readline vs. ile) ayırıcı (default olarak newline - \n).

$\

Çıktılarda kayıtlar arası ayırıcı (default değer nil).

$,

Yazılacak çıktılarda argümanlar arasındaki ve Array#join'deki ayırıcı (default değeri nil). Array#join için ayırıcıyı ayrıca belirtebilirsiniz.

$;

Split için default ayırıcı (default değeri nil).  String#split için ayırıcıyı kendiniz de belirtebilirsiniz.

$.

Okunmakta olan dosyadaki bulunulan satır numarası, ARGF.lineno ile aynıdır.

$<

ARGF ile aynı değer.

$>

$defout ile aynı.

$0

Çalıştırılmakta olan Ruby programın adı.

$$

Çalıştırılmakta olan Ruby programın process.pid değeri.

$?

En son sonlandırılan prosesin exit status değeri.

$:

$LOAD_PATH ile aynı.

$DEBUG

Eğer -d veya --debug command-line opsiyonu verildiyse true olur.

$defout

print ve printf için hedef çıktı yama yeri (default değeri $stdout).

$F

-a komut satır seçeneği varsa split'ten çıktıyı alan değişken. Bu değişken, -a komut satırı seçeneği -p veya -n seçeneğiyle birlikte belirtildiğinde ayarlanır.

$FILENAME

ARGF'den okunan dosyanın adı. ARGF.filename ile aynı.

$LOAD_PATH

load ve require metodları ile yüklenmek istenen dosyaların aranacağı klasörler listesi (array).

$SAFE

Güvenlik seviyesi.
    0   Hariçten gelen (şüpheli) verilerde kontrol yapılmaz. (default)

    1   Şüpheli verilerde potansiyel tehlikeli işlemler yasaklanır.

    2   Proses ve dosyalarda potansiyel tehlikeli işlemler yasaklanır.

    3   Tüm yeni üretilen nesneler şüpheli olarak kabul edilir.

    4   Global verilerin değiştirilmesi yasaklanır.

$stdin

Standard giriş yeri (default değeri STDIN).

$stdout

Standard çıktı yeri (default değeri STDOUT).

$stderr

Standard error yeri (default STDERR).

$VERBOSE

Eğer -v, -w, veya --verbose komut satırı opsiyonu girilmişse true olur.

$- x

Interpreter seçeneği -x değeri (x=0, a, d, F, i, K, l, p, v).

Aşağıdakiler yerel değişkenlerdir:
$_

Bulunulan kapsamda gets veya readline ile okunan son string değer.

$~

En son eşleşme bilgisi. Regex#match metodu son eşleşme bilgisini döner.

Takip eden değişkenler $~ 'ya bağlı değerler tutarlar ve kendilerine atama yapılamaz:
$ n ($1, $2, $3...)

Son patern eşleşmesinde n'inci grupla eşleşen string. m bir MatchData nesnesiyse m[n] ile aynıdır.

$&

Son patern eşleşmesinde eşleşen string. m bir MatchData nesnesiyse m[0] ile aynıdır.

$`

Son patern eşleşmesinin öncesinde kalan string. m bir MatchData nesnesiyse m.pre_match ile aynıdır.

$'

Son patern eşleşmesinin sonrasında kalan string. m bir MatchData nesnesiyse m.post_match ile aynıdır.

$+

Son patern eşleşmesinde en son başarılı eşleşen gruba karşı gelen string.

←Operatörler | 
Metod Çağrıları→

Ruby program akışını koşullu dallanmalar kullanarak kontrol edebilir. Bir koşullu dallanma , bir test  ifadesinin  sonucunu alır ve sonucun doğru (true) ya da yanlış (false) olmasına göre bir blok program çalıştırır. Eğer test ifadesi sonucu false veya nil ise yanlış sonucun bloğu çalışır geri kalan tüm olasılıklar doğru sonuç olarak değerlendirilir. Yani sıfır değeri bile doğru olarak değerlendirilir. Diğer birçok programlama dillerinde sıfır, yanlış sonuç olarak değerlendirilir.
Birçok programlama dilinde koşullu dallanmalar deyimlerdir ve hangi kodun işleneceğini karar verirler. Ama kendileri bir değer dönmezler. Ruby'de koşullu dallanmalar aynı zamanda işlemdirler. Diğer işlemler gibi değerleri işlerler. Örneğin if işlemi sadece koda karar vermez aynı zamanda bir değer döner. Mesela aşağıdaki if işlemi 3 değerini geri döner:

yani şöyle denersek:

Ruby'nin koşullu dallanmaları aşağıda açıklanmıştır.

Örnekler:

Ayrıca eğer then kullanırsanız if işlemcisi ve kod bloğunu aynı satıra yazabilirsiniz:

Bu şu şekilde de ifade edilir:

Unless işlemi if işleminin tersidir, eğer koşul sonucu yanlış ise kod bloğu işletilir.
Örnekler:

unless işlemi hemen hemen tam anlamıyla if işleminin tersi olarak çalışır:

Farkı, if işlemi 'W'elsif'W' ile karşılaştırmanın yanlış çıkmasıyla ikinci bir karşılaştırma yapabilir ama unless işleminin elsunless gibi bir devamı yoktur.
Ayrıca aynı if işlemindeki gibi :

Çalıştırılacak kod bloğu içinde tek satır olduğunda tek satırlık şekil daha yakışıklı olacaktır.

elsif (dikkat edin elsif yazılır elseif değil) ve else blokları sayesinde birbiriyle alakalı birçok test yaparak programınızı daha etkili kontrol edebilirsiniz.     elsif ve else blokları sadece if karşılaştırması yanlış ise işlenir. Birçok elsif bloğu olabilir ama sadece bir if ve bir else olabilir.
Yazım:

"kısa-if" işlemi bir karşılaştırma sonucunda değerler dönmek için kestirme yoldur. String birleştirmelerinde koşullu işler yapmak için idealdir. Formatı şöyle :

Buna ternary operatörü de denir ve böyle kısa şekliyle kısa işelrimizde kullanırız, mesela yazı şekilllendirmelerinde vs ama görsel bozukluğu unutulmamalıdır.
Örnek:

Ayrıca bu yapı yerine şu da kullanılabilir :

Atamalar şu şekil yapılabilir :

Yukarıda açıklanan if-elsif-else işlemlerinin bir başka alternatifi olarak case işlemi kullanılır. Ruby'de case işlemi çoklu işlemi destekler. Örneğin bir sayı ile 5 arasındaki ilişkiyi tayin etmek istiyoruz :

Not olarak eşitliği test ederken == kullanılır. Atama yapmak için = kullanılır. Şu durumda Ruby atama yapacaktır:

Bu bizim istediğimiz değil! Biz burada karşılaştırma yapmak istiyoruz.
Daha kestirme bir yol olarak case ile karşılaştırma yapılacak değişkeni baştan verebiliriz:

Not: Range'ler açıkça açıkça belirtilmiş aralıklar olduğu için a'nın istenmeyen değerlerini sınırlamak için kullanılır. Bu kestirme yol olası değerler bilindiğinde çok faydalı olacaktır. Örneğin :

Bu satırları irb'de girerseniz :

 bir meyve
 =>nil

Case hakkında diğer bilgileri Linuxtopia Ruby Programming [1] adresinde bulabilirsiniz.

Ruby'de while ifadesi kullanım olarak if ve diğer dillerdeki while ifadesine benzer:

while < işlem >
  <...kod bloğu...>
end

Kod bloğu işlem sonucu true olduğu sürece tekrar tekrar işlenecektir.
Ayrıca aynı if ve unless ifadelerinde olduğu gibi, şöyle de mümkündür:

<...kod...> while < işlem >

Aşağıdaki ilginç kodu inceleyin...

 line = readline.chomp while line != "bunu arıyordum"

Bu satır çalıştırılınca konsoldan girilen satırları alır ve "bunu arıyordum" yazısı girilene kadar döngü bitmez.

until ifadesi işleyiş olarak while ifadesine benzer.  while ifadesinin tersine until kullanılınca kod bloğu işlemin sonucu false olduğu sürece işlenir.

until < işlem >
  <...kod bloğu...>
end

for döngüsü bir for kelimesi ve arkasından argüman olarak iterasyonda kullanılacak bir yerel değişken adı, arkasından  gelen in kelimesi ve her elemanı üzerinde iterasyon yapılacak değerden oluşur. do kelimesi opsiyoneldrir:

Aynı while ve until gibi do kelimesi opsiyoneldir. for döngüleri yeni bir değişken kapsamı oluşturmaz. 
for döngüsünün dönen değeri üzerinde iterasyon yapılan argümandır, Ama döngüden break ile çıkılırsa nil döner.
Modersn Ruby programlarında for döngüsü sık kullanılmaz.

Bir kod bloğunu acilen terk etmek için break deyimi kullanılır. Aşağıdaki kod üzerinde iterasyon yapılan sayı çift ise bloğu terk eder, döngü biter:

Bir while döngüsünü de break bitirebilirsiniz :

Bu arada p de puts ve print benzeri bir çıktı yazdırma komutu (aslında puts a.inspect eşleniğidir). Bu kod ekrana 0 yazar ve döngüden çıkar, çıkınca da o anki a değeri olan 1 yazar.
break çıktığı noktaya ait bir bilgi içeren ifadeyi argüman olarak alabilir :

redo ile içinde bulunulan döngü adımı tekrar edilir :

Çıktı  [0, 1, 3, 3, 5, 5, 7, 7, 9, 9, 11]

next ile içinde bulunulan döngü adımının sonuna atlanır yani ondan sonraki kısmı pas geçilip , sonraki iterasyon adımına geçilir :

next dönen değeri de argüma olarak alabilir :

Ruby 1.9 ve sonrasında bu deyim yerine redo kullanılmaya başladı.

 return değer  satırı içinde bulunduğu metodun değer ile geri dönmesini sağlar.

←Genel Bakış | Ruby Editörler→
Ruby geliştirmeye başlamanın ilk adımı yerel ortamınızı ayarlamaktır. Birçok işletim sisteminden bir çoğunu inceleyeceğiz. Eğer terminal kullanmayı ve Ruby'yi nasıl kuracağınızı biliyorsanız bu sayfayı geçebilirsiniz (tabi ki Ruby kurduktan sonra). Öyle değilse bilgisayarınıza nasıl Ruby kuracağınız konusunda size klavuzluk edeceğiz.

Eğer programlama yapıyorsanız terminal kullanmak çok faydalıdır. Genellikle grafik arabirimlerin arkasında saklanan komut ve uygulamalara çok daha doğrudan erişiminizi sağlar. Öte yandan yeni başlayanlar için korkutucudur, çünkü bilgisayarın derinlemesine anlaşılması gerektiği düşünülür. Gerçekte ise başlamak için çok temel bazı şeyler bilmek yeterlidir.

Ana döküman  Linux Guide/Using the shell
Unix benzeri işletim sistemlerinde (macOS, GNU/Linux, BSD gibi) en çok kullanılan terminal türü Bash terminali, gerçekte default terminal kabuğu olarak kullanılır. Bash oturumu başlatmak için diğer grafik uygulamalarla aynı anda komut satırında çalışmanıza imkan sunan bir terminal emülatörü kullanılır.
Hangi terminal emülatörünü kullandığınız önemli değildir, genellikle renkli ve unicode desteği olanlar tercih edilir.  MacOS'da Applications > Utilities altında bulunan Terminal.app kullanılabilir. Popüler bir alternatifi ise iTerm. Birçok Linux dağıtımlarında zaten sistemde yüklü default enaz bir terminal emülatörü olur, yoksa da Terminator, Konsole, rxvt-unicode veya farklı başka bir şey kullanabilirsiniz.
Terminalde yeni pencere ya da sekme açtığınızda bir prompt gösterirlir. Neye benzediği birçok yapılandırmaya bağlı, her işletim sisteminde farklıdır (istediğinin görünümü ayarlayabilirsiniz de o iş bu kısa bilgilendirmeyi aşar). Genellikle bulunulan çalışma klasörünü gösterir, username ve hostname gösterir. Başlattığınız terminalde her zaman içinde çalışılan klasör vardır. Yazacağınız komutlarda dosya isimleri hep bu klasöre bağıl olarak belirtilmelidir. İlk başlattığınızda default olarak kullanıcının home klasöründe başlar ve bu klsör genelde tilda (~) karakteriyle kısaca ifade edilir.
Bir komutu çalıştırmak için terminale yazar ve enter basarsınız.
İlk olarak ls komutuna bakalım. Eğer bu komutu yazıp enter basarsanız çalıştığınız klasördeki dosyalar ve alt klasörleri ekrana yazar. İsterseniz başka bir klasörün bağıl path (adresi, yolu) değerini girerek onun içindekileri de listeletebilirsiniz, örn. ls DIR. Eğer dosyalar hakkında daha ayrıntılı bilgi almak isterseniz ls -l DIR kullanabilirsiniz, eğer gizli dosyaları da görmek isterseniz (örn. Unix sistemlerde ismi nokta ile başlayan dosyalar) ls -a kullanırsınız. Tabi ki bu seçenekleri birleştirerek de kullanabilirsiniz, mesela ls -l -a DIR ya da kısaltılmış şekli ile ls -la DIR. Unutmayın birden fazla seçeneği tek bir seçenek olarak kısaltmak sadece tek harfli seçenekler için geçerlidir. Seçenek parametrelerinin uzun şekillleri de var, mesela ls -a aslında ls --all DIR komutunun kısa formudur. Bu formların hangilerinin olup olmadığı kullanılan komuta bağlıdır, her birinin hem kısa hem uzunu olmayabilir.
Şu anda tüm komutları nasıl aklımda tutacağım diye düşünüyorsunuzdur. Şükür ki sadece en önemlilerini hatırlamak yeterli, sık kullanılanları, aksi durumlarda yapabileceğiniz akıllı yöntemler var. Ya man komutunu kullanarak yardım alırsınız. Mesela man ls komutunu çalıştırarak ls komutu hakkında yardım metnini görebilirsiniz. Birçok seferinde daha özet bir yardım almak için komutu --help seçeneği ile çalıştırabilirsiniz, ama bu her komutta çalışmayabilir, manual sayfaları ise her zaman mevcuttur.
Bulunula çalışma klasörleri konusuna geri dönelim. Eğer bulunduğunuz klasörü değiştirmek isterseniz cd komutunu gitmek istediğiniz klasör adı takip edecek şekilde kullanırsınız. İki özel sanal klasör vardır, '.' ve '..'. Tek nokta içinde bulunduğunuz klasörü ifade eder ve çift nokta da bulunduğunuz klasörün içinde bulunduğu üst klasörü (parent directory) ifade eder. Yani cd .. komutu çalıştırmak çalışma klasörünüzü bulunduğunuz klasörün bir üst klasörüne değiştirir, yani sizi bir üst klasöre götürür.
Kısaca diğer bazı kullanışlı komutlar:
cat FILE: FILE ile adı verilen dosyanın içindekileri gösterir.
mkdir DIR: DIR ile adı verilen klasörü üretir.

Ruby kurulumu yapmanın en yaygın ve kolay yolu sistem genelinde (kullanıcıdan bağımsız) kurulum yapmaktır. İşletim sistemine bağlı olarak kurulum prosedürleri farklıdır.

Windows İşletim Sisteminde Ruby programlama dili ön-yüklenmiş olarak gelmez (burada açıklana diğer platformların aksine). Ruby'yi Windows'a kurmak için şu sayfadaki yönlendirmeleri uygulamanız kuvvetle önerilir: https://rubyinstaller.org/ .
Download butonu ile geçeceğiniz sayfada mevcut indirilebilir kurulum dosyalarının bir listesi çıkacaktır, size uygun olanı seçersiniz. Ayrıca yan tarafta size önerilen versiyonu da yazıyor.
Ruby+Devkit opsiyonları dikkatinizi çekmiştir. Bu seçenek native C/C++ eklentileri oluşturmak için gereklidir, ayrıca Ruby on Rails kullanacaksanız da gereklidir. Ayrıca Ruby gem'lerin ihtiyaç duyduğu yüzlerce açık kaynak kütüphaneyi kullanmak için de gereklidir. İleride DevKit temelli sorunlar yaşarsanız Windows sisteminize bir WSL Linux kurarak Ruby çalışmalarınızı orada daha rahat yapabilirsiniz.
Kurulum dosyasını indirin ve çalıştırarak PC'nize kurulumu başlatın. 
Adım 1: "I accept the license" opsiyonunu seçin ve "Next" butonuna tıklayın
 
Adım 2: Kurulumun yapılamasını tercih ettiğiniz klasörü seçin ve "Add Ruby executables to your PATH" ve "Associate .rb and .rbw files with the Ruby installation" seçeneklerini aktif edin. "Next" butonlarına tıklayın.

Adım 3: Kurulum dosyalarının hepsini seçin ve "Next" tıklayın.

Adım 4: "ridk install" seçeneğini seçin ve "Next" butonu ile devam edin.

Kurulumu bitirdikten sonra , Windows arama kutusuna cmd yazarak komut istemini çalıştırın. Açılan terminalde ruby -v komutunu girerek hangi Ruby versiyonunun sisteminizde kurulu olduğunu görün. Bir cevap geldiyse tebrikler, sisteminize Ruby programlama dilini kurmayı başarıyla bitirdiniz.

Ruby, macOS sistemlerde ön-yüklenmiş olarak gelir. Hangi versiyonun yüklü olduğunu kontrol için terminal açıp ruby -v komutunu girin.
Eğer daha yeni bir versiyon Ruby yüklemek isterseniz, şunu yapabilirsiniz:

macOS yeni versiyonuna güncelleme yapın, yeni versiyonda daha yeni bir Ruby kurulmuş olabilir.
RVM veya RBEnv araçları ile birçok Ruby versiyonu aynı anda yönetilebilir (Bu yöntem çok popüler, çünkü Ruby projelerinizi bu araçlar yardımı ile belirli Ruby versiyonlarında çalıştırabilirsiniz)
Mac için kullanılan Fink, MacPorts, Homebrew gibi genel amaçlı paketleme sistemlerini kullanabilirsiniz.

Birçok Linux dağıtımlarında Ruby default olarak yüklüdür. Ruby'nin sisteminizde yüklü olup olmadığını görmek için terminalde ruby -v komutunu çalıştırabilirsiniz.
Kurulu değilse ya da mevcut versiyonu güncellemek istiyorsanız, dağıtımınızda bulunan paket yöneticisini kullanabilirsiniz. Burada çok yaygın Linux dağıtımlarına ait bilgiler verdik, ancak her dağıtımın kullanıcısına o sistemin paket yöneticisini kullanmayı öğrenmesini tavsiye ederiz, bu çok daha etkili bir yazılım yönetme şeklidir. Bunun bir komut satırı uygulaması mı yoksa grafiksel bir uygulama mı olacağı dağıtımın sunduklarına ve kullanıcının kişisel tercihlerine bağlıdır.

Synaptic paket yöneticisi paket yönetimi için grafik uygulama sunar. Ubuntu sistemlerde default kurulu gelir, Debian sistemlerde elle kurulması gerekir (sudo apt-get install synaptic komutunu terminalde çalıştırarak).
Synaptic kullanmak yerine terminalde apt uygulamasını direk olarak kullanabilirsiniz (daha geniş bilgiyi Debian Wiki sayfası  Package Management sayfasında bulabilirsiniz). Ruby kurmak için terminalde sudo apt-get install ruby komutunu çalıştırmanız yeterli.

Terminalde Ruby kurmak için  DNF kullanarak  sudo dnf install ruby komutu giriniz.

Ruby kurmak için Pacman kullanarak terminalde pacman -S ruby komutunu root olarak çalıştırın.

Mandriva Linux'ta Ruby kurmak için urpmi komut satırı aracını kullanın.

 PCLinuxOS'da Ruby kurmak için ya Synaptic grafik uygulamayı ya da apt komut satırı uygulamasını kullanın.

On Red Hat Linux'ta Ruby kurmak için RPM komut satırı paket yönetici aracını kullanın.

Kullanıcı bazında kurulum sistemdeki her kullanıcının kendi özel Ruby versiyonunu diğer kullanıcıları etkilemeden kurmasını sağlar.

Ruby'nin en son versiyonunu kurmak için guix install ruby komutunu girin.

Herhangi bir Microsoft Windows versiyonunda Ruby ön-yüklenmiş olarak gelmez. Ancak Windows'ta Ruby kurmanın çeşitli yolları vardır.

Derlenmiş Ruby binary'lerinden birini Ruby web sitesinden indirerek kurun.
Ruby tek tıklama kurulum dosyasını RubyInstaller adresinden indirin ve kurun.
Cygwin kurun, Windows için hazırlanmış bir kısım özgür yazılım araçlara sahiptir. Kurulum esnasında "Devel, Interpreters" kategorisinden "ruby" paketinin seçili olmasına dikkat edin.

Eğer dağıyımınızda Ruby paketi yoksa veya Ruby özel bir versiyonunu sıfırdan oluşturmak istiyorsanız lütfen bu sayfadaki yönlendirmeleri uygulayın.  Buradan indirebilirsiniz.

Kurulumu test için terminalde şu komutu girin:

$ ruby -v

Cevap olarak şuna benzer bir yazı gelmelidir:

ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]

Eğer bunu görüyorsanız kurulumunuz başarılı olmuş demektir. Ama eğer şuna benzer bir hata alırsanız:

-bash: ruby: command not found

kurulum başarısız olmuş demektir.

←Söz Dizimi | 
Değişkenler ve Sabitler→

Belirteç (identifier) bir değişken, metod veya sınıfı tanımlayan isimdir
Birçok diğer dil gibi, geçerli belirteç isimleri alfanümerik karakterler (A-Za-z0-9) ve alt çizgi (_) içerebilir, ama sayı (0-9) ile başlamamalıdır. Buna ilave olarak Ruby metod isimleri, soru işareti (?), ünlem işareti (!), veya eşit işareti (=) ile bitebilir.
Belirteçlerin uzunluğu ile ilgili bir kısıtlama yoktur (istediğiniz kada ruzun isimler verebilirsiniz, bilgisayarınızın hafızasını doldurana kadar). Son olarak ayrılmış kelimeler belirteç isim olarak kullanılamaz
Örnek:

falan
ruby_kolaydır

Satır yorumları "#" karakteri ile başlar ve satırın sonuna kadar devam eder. Kod yorumları ve dökümanlaması hakkında Ruby dökümanlar sitesinde
temel Ruby kısmına bakalbilirsiniz.
Örnekler:

Örnek:

Aşağıdaki kelimeler Ruby dilinde ayrılmıştır, bunları değişken, metod, sınıf vs adlarında kullanamazsınız.

__FILE__  and    def       end     in      or      self   unless
__LINE__  begin  defined?  ensure  module  redo    super  until
BEGIN     break  do        false   next    rescue  then   when
END       case   else      for     nil     retry   true   while
alias     class  elsif     if      not     return  undef  yield

Bunlar hakkında daha fazla merak ettiğiniz varsa buradaki Ruby döküman sayfasına bakabilirsiniz.

Örnekler:

Bütün değişkenler, değer ifadeleri, operatörler, kontrol yapıları vb birer ifadedir (expression). Bunların birlikte kullanımı programı oluşturur. İfadeleri yenisatırlar ve noktalı virgüller (;) ile ayırabilirsiniz — ama, ters bölü (\) ile geçilen yeni satır aşağıdaki satıra, önceki satırdan devam eder ve uzun satırları ekranda rahat görmek için kullanılabilir.
Ruby kontrol yapıları da ifade olduğu için, aşağıdaki gibi yapılabilir:

Yukarıdaki kodun C gibi dillerdeki karşılığı hata verir, çünkü C dilinde kontrol yapıları bir ifade olarak kabul edilmes.

←İnteraktif Ruby | Stringler→
Klasik Merhaba Dünya! programı Ruby kodlamaya başlamak için iyi bir yol.

merhaba.rb adında bir metin dosyası üretin ve şu kodları içine yazın:

Şimdi terminalde çalıştırın.

$ ruby merhaba.rb
Merhaba Dünya!

Ayrıca bir metin dosyası oluşturmadan da bu kısa kodu deneyebilirsiniz. Buna one-liner program denir.

$ ruby -e 'puts "Merhaba Dünya!"'
Merhaba Dünya!

-e opsiyonu Ruby kodunu çalıştır (evaluate) anlamına gelir. Aynı kodu denemek için  irb de kullanabilirsiniz ancak çıktı biraz farklı olacaktır. puts deyimi "Merhaba Dünya!" çıktısını yazar ama irb ayrıca puts metodunun dönen değerini de yazar — ki bu değer  nil'dir.

$ irb
>> puts "Merhaba Dünya!"
Merhaba Dünya!
=> nil

Like Perl, Bash, Python, ve C Shell gibi Ruby de hash sembolünü (diyez işareti de denir) yorumlar için kullanır. Hash işaretinden satır sonuna kadar olan kısım Ruby tarafından program çalıştırılırken dikkate alınmaz. Örneğin burada bizim merhaba.rb programımızın yorumlu hali var.

Bir yorumu kod satırının sonuna da ekleyebilirsiniz. Hash öncesi olan her şey normal Ruby kodu olarak işlem görür.

Ayrıca bir kerede birkaç satır yorum da yazabilirsiniz:

Blok yorumla =begin ile başlayıp =end ile bitmesine rağmen kendi satırlarına sahiptir. Blok yorumları C, C++ ve Java'da olduğu gibi kod satırı içine koyamazsınız   =end sonrasına aynı satıra yazdığınız kod da çalışmaz.

buradaki puts komutu çalışmaz, yorum bloğuna ait bir satırın içinde.

Her seferinde programımızı çalıştırmak için ruby yazmak sıkıcı. Bunu değiştirmek için aşağıdakileri uygulayın.

Unix-benzeri işletim sistemlerinde – örneğin Linux, Mac OS X, ve Solaris gibi sistemlerde, Ruby betiklerinizi chmod komutu kullanarak tek başına çalıştırılabilir hale getirmek isteyebilirsiniz. Bu ayrıca Windows'ta Cygwin ile kurulan Ruby versiyonlarında da geçerlidir.

$ chmod +x merhaba.rb

Bunu her yeni Ruby betiği ürettiğinizde yapmalısınız. Eğer betik adını değiştirir ya da içindeki kodu değiştirirseniz "chmod +x" komutunu tekrar çalıştırmanız gerekmez, o dosya artık çalıştırılabilir olarak işaretlendi.
Sonra Ruby betiğinizin en ilk satırına bir shebang satırı ekleyin. Shebang satırı sistem tarafından betiğin hangi programla çalıştırılacağını öğrenmek için okunur. Bu satır öncesinde herhangi bir satır ya da boşluk bulunamaz. Shebang satırı olan merhaba.rb Ruby dosyamız şöyle olacaktır:

Eğer ruby uygulamanız /usr/bin klasöründe değilse, shebang satırını doğru path gösterecek şekilde değiştirin. bir diğer kullanılan Ruby uygulaması path değeri de/usr/local/bin/ruby'dir.
Shebang satırı hash karakteri ile başladığı için Ruby tarafından dikkate alınmaz, Ruby satırı bir yorum olarak görür. Bu nedenle Ruby betiğinizi Windows gibi shebang satırı desteklemeyen sistemlerde hala çalıştırabilirsiniz.
Şimdi Ruby betiğinizi ruby kelimesi kullanmadan da çalıştırabilirsiniz. Ancak güvenlik sebepleriyle Unix-benzeri sistemler bulunulan klasör içinde çalıştırılabilir dosyaları aramaz - klasör adı PATH ortam değişkeninde belirtilmediyse. Bu durumda şunlardan birini yapmalısınız:

Ruby betiğinizi zaten PATH içinde tanımlı bir klasör içinde yazın.
Betiğinizin olduğu klasörü PATH içine ekleyin(tavsiye edilmez).
Betiğinizi her çalıştırdığınızda klasör yolunu belirterek adını yazın.
Birçok kişi 3. seçeneği kullanır. Çalıştırılabilir Ruby betiğimizi bulunduğumuz klasörde çalıştırmak için şu komutu giriniz:

$ ./merhaba.rb

Bir betiği yazmayı tamamladığınızda genel eğilim ~/bin klasörünü oluşturmak ve onu PATH içine koymaktır. Böyle yaparak sürekli kullanacağınız bir betiği herhangi bir klasör altında şöyle çalıştırabilirsiniz:

$ merhaba.rb

Eğer ruby uygulamasının bulunduğu yerden emin olamiyorsanız env komutunu shebang satırında kullanarak ruby uygulamasını PATH içinde bulup kullanmasını sağlayabilirsiniz. Böylece Ruby betiğinizi başka bir yere kurulu Ruby olan bilgisayara taşıdığınızda da çalışmasını garanti edersiniz.

Eğer Ruby One-Click Installer kullanarak standart Windows Ruby versiyonu kurduysanız, kurulum Windows'un Ruby betiklerinizi çalıştırmak için ayarları yapılmış demektir. Sadece dosya adını yazarak çalıştırabilirsiniz.

$ merhaba.rb
Merhaba Dünya!

Eğer böyle çalışmıyorsa ya da Ruby kurulumunu başka bir şekilde yaptıysanız, şu adımları takip ediniz.

administrator olarak sisteme giriş yapın.
Standard Windows "komut isteği" cmd çalıştırın.
komut isteğinde aşağıdaki Windows komutlarını çalıştırın. ftype satırını uygularken, parametreleri bilgisayarınızdaki ruby.exe uygulama dosyasının yerine göre değiştirin.
$ assoc .rb=RubyScript
.rb=RubyScript

$ ftype RubyScript="c:\ruby\bin\ruby.exe" "%1" %*
RubyScript="c:\ruby\bin\ruby.exe" "%1" %*

Bu komutlar hakkında bilgi almak isterseniz  "help assoc" ve "help ftype" komutlarını girebilirsiniz.

←Veri tipleri | 
Sınıflar ve nesneler→
Bir metodun tanımlaması def deyimi ile başlar ve end kelimesi ile biter. Bazı programcılar Ruby metod tanımlamalarını Python dilindekine benzetir.

Parametreleri olan bir metod tanımlarken de metod isminden sonra parametrelerin değişken isimleri parantez içinde yazılır. Metod çağrıldığında verilen argümanlar aynı bu parametre isminde yerel değişken olarak metod içindeki kodda kullanılır.

Eğer bir'den çok parametre varsa bunların isimleri aralarında virgül konarak yazılır.

Metodun çağrılması, kodun başka bir yerinde adının ve parametre değerlerinin (argümanlarının) verilmesi yoluyla çalıştırılmasıdır — bizde "metod çağrılması", onlarda "invoking method" denir. Metodları çağırırken isimleri yanında parantez kullanmak ya da kullanmamak size kalmış, her ikisi de geçerlidir. Diğer dillerden gelen yazılımcılar genellikle bir metod olduğunu belirtmek için görsel olarak parantezli kullanmayı tercih eder.

Eğer parametreleri olan bir metod çağıracaksanız, parametreleri parantez içinde virgülle ayrılmış yazarsınız (ya da parantez kullanmayabilirsiniz ve görünmeyen parantez içine yazarsınız).

Ayrıca metoda argüman olarak (parametre değeri) bir değişken de verilebilir.

Sıklıkla karşılaşılan bir şey de metod parametrelerinin bir ya da birkaçının default değeri (eğer başka bir değer verilmediyse, kabul edilen değeri) olmasıdır. Çok parametreli metodları çağırırken çoğunlukla aynı olan değerleri tekrar tekrar yazmak sıkıcı olacaktır. Bu yüzden böyle parametreler için default değer tanımlanabilir. Bunu yapmak çok kolay — metod tanımlamasında parametre adını verirken yanına da bir değer ataması eklersiniz. Default değeri olan ve olmayan parametreleri karışık şekilde kullanabilirsiniz.

Sıklıkla bir metodun işini bitirdikten sonra bir değer üretmesini ve bu değeri kullanmak istersiniz. Buna metoddan dönen değer denir. Bunu yapmak için return ifadesini kullanırsınız.

myMethod() metodu işini bitirdikten sonra end satırı öncesinde en son return satırında "Hello" string değerini geri dönüyor. puts metoduna bu metodumuzu parametre olarak verdiğimiz için , önce metodu çalıştırır ve metoddan dönen değeri ekrana yazar.
Bununla beraber , Ruby geliştiricileri tembel olduğu için , bir özellik eklemişler — son elde edilen değer (bazen hangi değer olduğunu tahmin etmek kabiliyet ister) metoddan dönen değer olur (eğer return yoksa). Bunu bilerek yukarıdaki örneği şöyle de yazabilirsiniz:

Burada önemli bir bilgi, return ifadesi metodun işlemesini bitirir. return deyimini bir değer vermeden dönmek sayesinde kodun ilerleyen yerlerinde belli koşullar sağlanınca metodu bitirmek bazen çok gereklidir.

Bu sayfa Ruby metod tanımlamaları ve kullanmaları için bir ön bilgi niteliğinde, çünkü bu bir programlama dili için çok önemli bir konsept.
Bununla beraber burada geçmeyen bazı diğer harika şeyler daha detaylı olarak bu sayfada işlenmiştir.

←Kontrol Yapıları | 
Sınıflar→

Ruby'de method geriye değer dönen bir ifadeler grubudur. Metodlar sayesinde programcılar kodlarını daha sonra istedikleri yerden çağırabilecekleri kod parçaları şeklinde düzenlerler. Diğer diller buna bazen fonksiyon derler. Bir metod bir sınıfın parçası olduğu gibi bağımsız da olabilir (aslında bu durumda da "Main" sınıfının bir parçası olur).

Metodlar aşağıdaki ifadeyle çağrılır:

Eğer metodun parametreleri yoksa parantez kullanılmadan sadece ad yazılarak da aşağıdaki gibi çağrılabilir:

Ruby metodları parantezler kullanmadan da çağırmanıza izin verir:

Kolayca tahmin edilebilir ki, son satırda eğer parantez kullanmazsak , önce "parametre2.reverse işlemi yapılır, onun sonucu metoda ikinci parametre olarak verilir.

Metodlar def deyimini takip eden metod ismi ile tanımlanır.  
Metod parametreleri , metod isminin arkasından parantez içinde belirtilir.  Metod gövdesi bu tanımlama satırı ve aşağıda end deyiminin bulunduğu satır arasında kalan kısımdır. Ruby'cilerin genel teamülü bir'den fazla kelimeden oluşan metod isimlerinde kelimeleri alt çizgi ile ayırmaktır. 
Örneğin:

Metodlar işlenen kodda oluşan en son değeri geri dönerler. Örneğin aşağıdaki metod x+y hesaplaması sonucunu deöner.  

Dönen değeri daha açık ifade etmek isterseniz, metod bitmeden hemen öncesine return deyimi kullanırsınız. Bu deyim sayesinde end satırına gelmeden bir döngüden çıkarak ya da bir karşılaştırma işlemi sonucuna göre de metodu bitirip geri dönebilirsiniz.

Not, bir blok içinde """return""" kullanırsanız bloğun dışına değil , metodun dışına çıkarsınız. Sadece bloğu sonlandırıp dışına çıkmak için break kullanılır. break deyimine bir argüman girerek bloktan dönen değer olarak kullanabilirsiniz :

Bu kısa kod çalışınca "six" değişkeni "6" değerine sahip olacaktır.

Metod tanımlarken bir parametre için default bir değer de verilebilir, böylece metod eğer o parametreye bir değer vermeden çağrılırsa , default değer metod işletilirken kullanılır.

Yukarıdaki kod şu çıktıyı verir:

Ruby 1.8 ve öncesi bu kod hata veriyordu: 

Bu kod Ruby 1.9.2'de çalışır ve mantık olarak aşağıdaki ile arasında fark yıktur :

Bir metod tanımında son parametre başına bir yıldız (*-asterisk karakteri) konabilir. Buna bazen splat operatör de denir ve metoda daha fazla sayıda (değişken sayıda) parametre verilebileceğini ifade eder. Bu parametreler üretilen bir array içinde toplanır.

Bu örnekte çıkıt ['a', 'b', 'c'] şeklinde olacaktır.
Yıldız operatörü ayrıca metoda parametreleri bir array içinde vermek için metod çağırırken kullanılabilir. 

şu kodla aynı sonucu verir :

Ruby'nin izin verdiği bir diğer teknik de metodlarla çalışırken size Hash argüman girme imkanı sunması, ki bu harika bir özellik. Değişken sayıda argümanı isimlendirilmiş olarak verebilirsiniz.

Gördüğünüz üzere hash_alabilir metodu verilen  Hash değeri işleyebiliyor. Bu teknik efsane web geliştirme ortamı Ruby On Rails tarafından çok etkili bir şekilde kullanılır.
Ayrıca hash argümanı girerken :arg1 => '...' kodu etrafında hash yapı tanımlarken kullandığımız { } süslü parantezlerini girmeye gerek olmadığını da görmüşsünüzdür. Yukarıdaki kod daha değişik ifadelerle şöyle de yazıılabilir :

Ruby 2.0'dan beri isimlendirilmiş argümanlar girmek mümkündür, bu şekilde metod çağrı kodları daha açıklamalı olabilir. Deyim yapısı şöyle :

Yukarıdaki metod şu şekillerde çağrılabilir :

Tekrar söyleyelim, eğer metoddan dönen değeri zincirleme başka bir metoda bağlamayacaksanız parantezlere gerek yoktur. Bir şey daha belirtelim, bu şekil kullanımda ille de isim belirtmek zorundasınız. Yani test_method(1, 2, 3, 4) çalışmaz, default değerlerle karıştırılmasın.
Bu arada argüman kelimesini biraz açıklayalım. Metod tanımlanırken parametreler belirtilir. Metod çağrılırken bu parametrelere değerler verilerek çağrılır. İşte metodu çağırırken verdiğimiz bu değerlere "argüman" denir.
İsimlendirilmiş argümanlar özellikle birçok ihtiyaç duyulmama ihtimali olan parametresi olan metodların çağrılmasında çok faydalıdır. Ayrıca argüman değerlerini isimlendirerek kullanmak metod çağrısı kodunun çok daha okunabilir olmasını sağlar, Ruby'ciler tarafından çok kullanılır.

Aynı asterisk gibi ampersand karakteri de metoda verilen son parametre önüne konan bir operatördür. Bu metodun parametresinde bir kod bloğu beklediğini ifade eder. Pas edilecek kodu içeren bir Proc nesnesi üretilir ve parametreye girilir.
Ayrıca ampersand operatöre benzer olarak, Proc nesnesi başına ampersand girilerek metoda parametre olarak verilirse metod içinde yield kullanılabilir.

Ruby closure, yüksek seviye fonksiyon ve birinci sınıf gibi isimler verilen güçlü fonksiyonel programlama özelliklerini programcıya sağlar [1]. Bu özellikler Ruby'ye kod blokları, Proc nesneleri ve metodlarla kazandırılmış (bunlarda aslında birer nesnedir) — konseptler aşağı yukarı aynıdır ama küçük farklılıklar vardır. 

Ruby dökümanlarına bakacak olursak Proc'lar şöyle tanımlanıyor : Proc nesneleri yerel değişkenlere bağlanabilen kod bloklarıdır. Bir kere bağlandı mı kod değişik şekillerde çağrılabilir.
Örnekler:

Procs'lar Ruby'de fonksiyon rolü oynarlar. Onları fonksiyon nesnesi diye çağırmak daha doğru olabilir, çünkü Ruby'de herşey bir nesnedir. Bu gibi nesnelere verilen bir isim vardır - functor. Functor sıradan bir fonksiyon gibi çağrılabilen bir nesne tanımlamasıdır, genellikle aynı deyim yapılarını kullanır, bu da tam olarak Proc nesnesidir.
Yukarıdaki tanımlama ve örneklere bakarsak, Ruby Proc'ların açıkça closure davranışı gösterdiği görülebilir. 

Proc'lar birinci sınıf nesnelerdir, çalışma zamanında üretilirler, veri yapılarında saklanırlar, diğer fonksiyonlara argüman olarak verilirler, bir fonksiyondan dönen değer olabilirler. Aslında yukarıdaki gen_times örneği tüm bunları gösteriyor, sadece diğer fonksiyona argüman olarak verilmesi yok. Bunu da şöyle gösterelim :

Ayrıca Proc nesnesi oluşturmanın bir kısa yolu var — Kernel metodu lambda [2] (metodlara geleceğiz ama şimdilik kernel metodu, her yerde çağırabileceğiniz global bir fonksiyona benzer olduğunu kabul ediniz). Lambda kullanarak önceki örnekteki Proc nesnesi şöyle üretilir :

Aslında lambda ve Proc.new arasında küçük farklar var. İlki argüman kontrolü. Lambda için Ruby dökümanı şunu der: Proc.new ile aynıdır, ama Proc nesneleri verilen argüman sayısını test eder. Buna bir örnek :

İkincisi return deyiminin işleyişinde görülür. Proc.new'den yapılan bir return işlemi, kapsayan metodu da bitirir :

Ama lambda dönüşleri beklenen gibi hareket eder, çağıran yere değer döner :

Bunların ışığında sizlere, eğer diğerinin davranışı size gerekli değilse, Proc.new yerine lambda kullanmanızı öneririm. Hem iki harf daha kısa , hem daha düzgün görünüm hem de daha az sürprizli.

Basitçe söylemek gerekirse bir metod, bir kod bloğudur. Ancak Proc aksine metodlar yerel değişkenlere bağlanmaz. Yerine bir nesneye bağlanırlar ve onun oluşum değişkenlerine erişim yetkileri vardır [3]:

Metodlar için kullanışlı görülen bir söylem, bağlı oldukları nesneye mesaj gönderdiğinizdir. Kendisine mesaj gönderdiğimiz bir alıcı vardır - metod tanımlanmış bir nesne -, ve adını verdiğimiz metodu belki de argümanları olacak şekilde içerir. Yukarıdaki örnekte arbo metodunu argüman olmadan çağırmak, sanki o nesneye sadece "arbo" diye bir mesaj göndermeye benzetilir. 
Ruby'nin Object sınıfında (tüm nesnelerin ebeveyni olan sınıf) bulunan send metodu bu mesaj gönderme benzetmesini daha direk olarak gerçekleştirir. Aşağıda verilen 3 örnek arbo metodu çağırmanın alternatif yollarıdır :

Not olarak, metodlar "top-level" kapsamda, yani betiğin root kapsamında, bir sınıfa ait olmadan da tanımlanabilir. Örneğin :

Her ne kadar say metodu kendi kendine duruyormuş gibi görünse de Ruby onu sessizce uygulamanızın kapsamı olan Object sınıfına bağlar:

Bu arada daha önceye nesneye mesaj göndermek için kullandığımız send metodunu şimdi Object sınıfına mesaj göndermek için kullandığımız dikkatinizi çekmiş olabilir. Öyle tanımlanmış olmalı, aynısını az önce tanımladığımız "Boogy" metodu için yapamayız.

say metoduna geri dönelim, her şeye rağman biz hala bu metodu tüm pratik kullanım amaçlarımızda bağımsız bir metod olarak düşünebiliriz. Perl ve C gibi bazı dillerde bunlara fonksiyon denir. Aşağıdaki Proc da birçok yönden benzerdir :

[ ] yapısı Proc call ile aynı işi yapar [4]. Bununla beraber metodlar, Proc'lara nazaran Ruby'nin önemli bazı özelliklerini destekler. Bunu blokların ne olduğunu gördükten sonra anlatacağız.

Bloklar Procs ile o kadar güçlü bir şekilde ilişkilidir ki, birçok yeni başlayanın aslında nasıl farklı olduklarını anlamaya çalışması baş ağrısına neden olur. Anlaşılmasını kolaylaştırmak için (umarım çok da klişe olmayan) bir metafor kullanmaya çalışacağım. Benim görüşüme göre bloklar doğmamış Proc'lardır. Bloklar larva ise Proc'lar böceklerdir. Bir blok kendi kendine yaşayamaz - kodu yaşama hazır hale getirir ve bir Proc'a bağlanıp dönüştürüldüğünde yaşamaya başlarlar :

İşte bu kadar, bütün bu yaygara bunun için mi, o zaman? Hayır, hepsi bu değil. Ruby'nin tasarımcısı Matz şunu der, Proc'ları metodlara göndermek (ve diğer Proc'lara) güzeldir ve üst düzey işlevlere ve her türlü büyülü işlevsel şeye izin verir, diğer tüm herşeyin üstünde duran bir şey vardır - bir blok kodu bir metoda göndermek çok yararlı işler yapmanızı sağlayabilir, mesela iterasyon.  Ve çok yetenekli bir tasarımcı olarak Matz, bu özel durumu vurgulamanın ve onu hem daha basit hem de daha verimli hale getirmenin değerli olduğuna karar verdi.

Hiç şüphe yok ki Ruby ile en azından birkaç saat geçiren herhangi bir programcıya Ruby'nin ihtişamının aşağıdaki örnekleri (veya buna çok benzer şeyler) gösterilmiştir:

(Not olarak do |x| ... end ile { |x| ... } eşleniktir )
Benim naciz fikrime göre bu şekil kodlama Ruby'yi kolay okunabilir ve harika bir dil yapıyor.  Burada arka planda olup bitenler oldukça basittir veya en azından çok basit bir şekilde anlatılabilir.  Gerçak hayata yakın ve kolay anlaşılabilir bir kod olması için herşeyi yap

←Encoding | 
Temeller→
Smalltalk gibi, Ruby de tamamıyla nesne yönelimli bir dildir — her şey bir nesnedir. Bunun aksine C++ ve Java gibi diller dünyalarını nesneler ve primitive tipler arasında bölüştüren melez (hibrit) dillerdir. Bu melez yaklaşım bazı uygulamalarda daha iyi performans verir ama tamamen nesne yönelimli yaklaşım daha tutarlı ve kullanımı kolaydır.

Smalltalk termniolojisini kullanırsak bir nesne şu üç şeyi yapabilir.

Diğer nesnelere olan referanslar dahil durmunu korur.
Hem kendisinden hem de diğer nesnelerden bir mesaj alır.
Bir mesajın işlenmesi sırasında hem kendisine hem de diğer nesnelere mesajlar gönderir.
Eğer Smalltalk background'unuz yoksa, bu kuralları şöyle değerlendirmek daha anlamlı olacaktır:

Bir nesne diğer nesnelere olan referanslar dahil veriler içerebilir.
Bir nesne, verilerine özel erişim sağlayan metodlara sahip olabilir.
Bir nesnenin metodları diğer metodları/fonksiyonları çağırabilir/çalıştırabilir.

Nesneleri daha iyi anlamak için bir irb çalıştıralım.

$ irb --simple-prompt
>> comedian = "Stephen Colbert"
=> "Stephen Colbert"

İlk satırda içeriğinde "Stephen Colbert" yazısı bulunan bir String nesnesi ürettik. Ayrıca Ruby'ye comedian isimli değişkenin bu nesneyi gösterdiğini bildiriyoruz.
Şimdi Ruby'ye favorite_comedian değişkeninin de aynı String nesnesini göstermesini sağlayalım.

>> favorite_comedian = comedian
=> "Stephen Colbert"

Şimdi aynı String nesnesine referans olarak kullanan iki değişkenimiz mevcut — comedian ve favorite_comedian. Her ikisi de aynı nesneyi gösterdiği için eğer nesne değişirse (aşağıda görüldüğü gibi), değişiklik her iki değişkende de yansıyacaktır.

Ruby'de, ismi ünlem işareti ile biten metodlar (ayrıca "bang" adı da verilir) uygulandığı nesneyi değiştirir. Örneğin String nesnenin upcase! metodu yazının içindeki harfleri büyük harf yapar.

>> comedian.upcase!
=> "STEPHEN COLBERT"

Değişkenler comedian ve favorite_comedian aynı String nesnesini işaret ettiği için, her iki değişkeni de incelesek yazıların büyük harf olduğunu görürüz.

>> comedian
=> "STEPHEN COLBERT"
>> favorite_comedian
=> "STEPHEN COLBERT"

Ünlem işareti ile bitmeyen metodlar değer dönerler ama nesneyi değiştirmez. Örneğin downcase! metodu bir String nesnenin tüm harflerini küçük harf yapar, ancak downcase metodu String nesnedeki yazının küçük harflere dönüştürülmüş bir kopyasını geri döner ama String nesne değişmez.

>> comedian.downcase
=> "stephen colbert"
>> comedian
=> "STEPHEN COLBERT"

Şimdi aklınıza şu gelebilir, orjinal nesne hala "STEPHEN COLBERT" yazısı içerdiğine göre tamamı küçük harften oluşan yazı nesnesi nereye konur? Şöyle ki, irb o içeriği yayınladıktan sonra, bir değişkene de bağlamadığımız için, ona bir daha erişilemez. Esasında o değer artık gitti ve Ruby onu yok edecek.

Peki ya favori komedyeniniz Stephen Colbert değilse? Hadi  favorite_comedian değişkeninin yeni bir nesneyi işaret etmesini sağlayalım.

>> favorite_comedian = "Jon Stewart"
=> "Jon Stewart"

Şimdi her bir değişken farklı nesneleri gösteriyor.

Kafa karışmış olabilir ama lütfen yavaş yavaş ve anlayarak okuyun. 
Diyelim tekrar karar değiştirdik. Şimdi favori komedyenimiz Ellen DeGeneres olsun.

>> favorite_comedian = "Ellen DeGeneres"
=> "Ellen DeGeneres"

Şimdi hiçbir değişken "Jon Stewart" String nesnesini işaret etmiyor. Ruby onu da yok edecek.

←Ruby Editörleri | İnteraktif Mod→

Bu öğreticide komut satırında program çalıştırmayı amaçlayan örneklerde $ işareti komut satırını ifade eder. Sizin yazacağınız komutlar kalın vurgulu yazılacaktır dolar işareti komut satırını belirttiği için lütfen yazmayın.
Örneğin sisteminizde hangi Ruby versiyonu yüklü olduğunu öğrenmek için:

$ ruby -v

çalıştırın. Tekrar söyleyelim dolar işaretini yazmayın – sadece ruby -v yazacaksınız.  Windows kullanıcıları olasılıkla komut satırı başında C:\> görmeye alışıktır. Bu dolar işareti hepsini ifade ediyor, hangi sistemde satırın başına sistem ne yazıyorsa işte. Ortak bir gösterim olsun diye genelde bu tercih edilir.
Bir örnek ayrıca programın çıktısını da gösteriyor olabilir.

$ ruby -v
ruby 1.8.5 (2006-08-25) [i386-freebsd4.10] 

Yukarıdaki örnekte,  "ruby 1.8.5 (2006-08-25) [i386-freebsd4.10]" cevabı sizin girdiğiniz "ruby -v" komutunun sonucunda Ruby uygulamasının size cevap olarak yazdığıdır. Sizdeki  "ruby -v" komutunun cevabı hangi versiyon Ruby kurulu olduğuna ve kullandığınız işletim sistemine göre değişecektir.

Basitlik olsun diye terminalde Ruby betikleri çalıştırılırken aşağıdaki gösterim kullanılır.

$ hello-world.rb
Hello world

Bununla beraber Ruby betiğinizi çalıştırmak için gireceğiniz komut, işletim sisteminize ve ayarlarına göre değişir. Lütfen Merhaba Dünya sayfasında Çalıştırılabilir Ruby betikleri bölümünü okuyarak sisteminizde Ruby betiklerini çalıştırmanın en doğru yolunu öğrenin.

Ruby standart olarak "interactive ruby" (irb) uygulaması ile birlikte kurulmuş olur. Bu Ruby kodlarını direk çalıştırıp denemeniz için bir REPL'dir, örneğin:

$ irb
>> 3 + 4
=> 7
>> 'abc'
=> "abc"

←Değer İfadeleri | 
Kontrol Yapıları→

Yüksek öncelikliler (yukarıdaki tabloda önceliği küçük olan operatörler) argümanlarının daha önce işlenmesi hakkına sahiptir. Öncelik sırası parantez blokları ile değiştirilebilir. Örneğin * operatörü +'ya göre önceliklidir :

1 + 2 * 3 == 7
(1 + 2) * 3 == 9

İşlem yönü , aynı önceliğe sahip bir'den fazla operatör kullanılınca hangisinin önce işleneceğini kontrol eder. Örneğin  - sol yöne sahip olduğu için :

1 – 2 – 3 == (1 – 2) – 3 == -1 – 3 == -4

yani şöyle değil :

1 – 2 – 3 == 1 – (2 – 3) == 1 - -1 == 2

** operatörü sağ yön olduğu için :

2 ** 3 ** 2 == 2 ** (3 ** 2) == 2 ** 9 == 512

dir. Yani şöyle değil :

2 ** 3 ** 2 == (2 ** 3) ** 2 == 8 ** 2 == 64

{} blokları yukarıdaki listenin hepsinden düşük önceliklidir, arkasından do/end blokları gelir. [] kullanarak array elemanlarına erişimler ise yukarıdakilerden daha yüksek önceliğe sahiptir.
Operatör ** 'dan !~ 'ya kadar olanların işlevi değiştirilebilir (override) — yeni sınıflar için yeni tanımlama yapılabilir veya mevcut işlevleri değiştirilebilir.
rescue, if, unless, while, ve until tek satır kodlarda (one-liner) operatördürler (yukarıda örnekler gibi) , ama aynı zamnada deyim olarak da kullanılırlar.

Nokta operatörü . nesneler üzerinde metod çağırmak için kullanılır, buna nesneye mesaj göndermek de denir.
Ruby 2.3.0 ile &. operatörü kullanıma başladı , ayrıca "lonely operator". olarak bilinir. Bu sayede

yerine

yazılabilir.
.dig() metodu da hash ve array için getirildi :

aşağıdakinden daha güvenlidir :

Ruby'de atama eşit işlemcisi "=" kullanılarak yapılır. Bu nesnelerde de değişkenlerde de böyledir, çünkü Ruby'de stringler, floatlar, integerlar hepsi nesnedir ve siz her zaman nesnelere atama yaparsınız.
Örnekler:

C ve C++ bilenlerden sık gelen bir soru "Bir değişkenin artırım ve azaltımı nasıl yapılacak? ++ ve -- işlemleri nasıl yapılır?"
Ruby'de x+=1 artırma için x-=1 azaltım için kullanılır.

Örnekler:

||= operatörü yaklaşık olarak aşağıdakinin kısaltılmışıdır:

||= operatörü şu kodun kısaltılmışı olarak kullanılabilir:

 x = "default" if x.nil?

Operator ||= şunun kısaltılmışı olabilir:

Aynı şekilde &&= operatörü çalışır:

Operator &&= şunun kısaltılmışı:

Ruby'de temel olarak yerel kapsam, genel kapsam, oluşum kapsamı ve sınıfsal kapsam olarak değişkenler işlenir.

Örnek:

Bu hata oluşur çünkü üçüncü satırdaki x(üst seviye) do..end bloğu içindeki x(yerel) ile aynı değildir. Yerel x blok içinde tanımlanmış bir değişkendir bu yüzden biz blok dışında x değişkeni çağırdığımızda Ruby tanımadığını belirtecektir.

Bu çalışır çünkü bir değişken adının önüne dolar işareti koymak onu global yapar. 

Bir sınıfın metodları arasında değişkenleri paylaşmak için önüne @ karakteri koyarak oluşum değişkeni yaparsınız.

Gördüğünüz gibi iki nesnenin @instvar değişkeni farklı değerlerde olur.

Bir sınıf değişkeni Java dilieki "static" değişken gibidir. O sınıfın tüm oluşum nesnelerinde aynı değişken paylaşılır.

Şimdi de değişik tipleri gösteren bir demo :

Bu kod önce "kiwi" ve "kiwi dedim sana!!" satırlarınıa yazar, sonra bir hata mesajı verir. var.print_instvar metodu @instvar oluşum değişkeni değerini yazar. Test.new komutu ile Test sınıfının initialize metodu otomatik olarak çalışır, ve new() metoduna argüman verilmediği için default değer olan "kiwi" değeri @instvar oluşum değişkenine atanır. Yine initialize metodu içinde @@classvar sınıf değişkenine de "kiwi dedim sana" değeri konur. var.print_localvar metodu çağrılınca metod tanımının ilk satırı @@classvar değerini yazar, ama ikinci satıra geçince localvar değerini yazamaz , çünkü localvar başka bir metod içinde tanımlandı ama bu metod onun içinde tanımlanan bu yerel değişkene erişemez. Diğer yandan sınıf değişkeni @@classvar ve oluşum değişkeni olan @instvar sınıfın tüm metodları tarafından erişilebilir, sınıf değişkeni aslında tüm oluşum nesneleri arasında paylaşılır.

Sınıf değişkenleri ebeveyn ve çocuk sınıfları kapsar, bu değişkenler sınıflar arası da paylaşılır, ve çocukları da etkileyebilir (soyuna çekmek gibi) ;-)

Bu çocukta da @@classvar sınıf değişkeni var ve üst sınıfla ve diğer çocuklarla aynı değeri gösteriyor (paylaşılıyor). newvar nesnesi ile oynamadığımız halde subtest nesnesinde @@classvar değerini değiştirince newvar nesnesinin print_classvar metodu da aynı değeri yazacaktır.

Eğer kodunuz herhangi bir kapsam sınırlayıcı içinde değilse mesela direk :

Bu default kapsamda yani main adı verilen nesnede geçerlidir.
Örneğin betiğiniz şunu derse :

ve "diğer_betik.rb" de şunu derse :

İki betik aynı oluşumdeğerini paylaşabilir.
Ancak iki betik aynı yerel değikenleri paylaşamaz.

Bir sınıf tanımı içinde metodlar tanımlarken şöyle yapabilirsiniz.

Bu bir betik dil olduğu için koşullu olarak değişik metod tanımları yapılabilir, interpreter programı satır satır işlerken hangi tanıma gelirse o geçerli olur. Bu örnekte a değişkeni aynı seviyede bulunduğu if bloğunun koşulunda kullanılabilir. Mesela proc blokları da kendilerini çevreleyen kapsamdaki değişkenlere erişebilir.

Bununla beraber class ve def kelimeleri, tamamen yeni bir kapsama sahiptirler.

Bu kısıtlamanın dışına define_method kullanarak da kaçabilirsiniz (not edelim istediğiniz blok şekli kullanabilirsiniz buradaki sadece örnek verildi).

Başka bir blok kullanma örneği

veya bu :

"and" işlemi verilen iki operandın mantıksal ve işleminin sonucunu verir. "&&" işlemi ile aynı sonucu verir, ama önceliği daha düşüktür.
Örnek:

"or" işlemi verilen iki operandın mantıksal veya işleminin sonucunu verir. "||" işlemi ile aynı sonucu verir, ama önceliği daha düşüktür.
Örnek:

Ruby programının oluşturulması çok kolaydır, tüm gereken sadece bir metin düzenleyicidir; Ruby kurulumu kayda değer sayıda metin editörünü de beraberinde getirir SciTe; Ruby dizininin altındaki Scite dizininden Scite uygulamasını kullanabilirsiniz. Söz dizimi kontrolü ve renklendirmesi yapmasına karşın oldukça küçük boyutludur.

Önce düzenleyicinizi hazırlayın, şimdi ilk Ruby scriptinizi yapma zamanı, basit bir 'Merhaba Dünya'.
Aşağıdakini yazınız ve 'merhaba.rb' olarak kaydediniz:

puts "Merhaba Dünya"

Çalıştırmak için, sadece komut satırınıza şunu yazın:

$ ruby merhaba.rb

Bu komut satırına basitçe "Merhaba Dünya" yazacaktır.

Şimdi Rubynin Nesneye-Yönelimli doğası ile daha iyi bir "Merhaba Dünya" programı oluşturacağız, bir sınıf inşa edip dünyayı selamlayacağız.
Aşağıdakini yazınız  (ya da Kopyala-yapıştır!) ve 'merhaba_class.rb' olarak kaydediniz:

 class MerhabaDunya

def initialize
 puts "Merhaba Dünya"
end

end

# we can instantiate the class in the same script outside the class
# definition
md = MerhabaDunya.new

class anahtar kelimesi Ruby sınıfının başlangıcını tanımlar.  def anahtar kelimesi ise Ruby fonksiyonunun başladığını anlatır. end anahtar kelimesi de bir Ruby sınıfının, fonksiyonunun ya da modülünün bitişini işaret eder.
initialize fonksiyonu daha çok kuruculuk rolünü almasından beri Ruby sınıfları ile ilgili özel bir fonksiyondur , ve her ne zaman sınıf oluşturulursa ya da örneklendiriliyorsa kullanılır.
# harfinden sonra yazılan herşey Ruby tarafından bir açıklama olarak es geçilir.
 mb = MerhabaDunya.new  satırı Ruby'ye MerhabaDunya sınıfının yeni bir örneğini oluşturmasını ve onu md değişkenine atamasını söyler.
Çalıştırmak için , komut satırına yazınız:

$ ruby merhaba_class.rb

Tekrar basitçe "Merhaba Dünya" yazdıracak ve komut satırına geri dönecektir.

Bu yazı http://www.math.umd.edu/~dcarrera/ruby/0.3/ adresindeki "Learning Ruby" makalesinin Türkçe çevirisidir. Bu makale Gnu FDL lisanslı olup Wikikitap standartlarına uygundur.
Ruby Öğrenmek
Copyright (c) 2003 Daniel Carrera
Free Documentation License
Where to get help
Ruby nasıl kurulur?
1.Temeller

Bu bölüm hakkında
1.1. İlk Adımlar
1.2. Dizeler
1.3. Eski şeyler için yeni adlar
1.4. Değişkenler
1.5. İlk Programınız
1.6. İyi Programlar Yazmak
2.Akış Denetimi

Bu bölüm hakkında
2.1. Döngüler
2.2. Getting user input
2.3. Conditionals
2.4. While döngüleri
2.5. İyi Programlar Yazmak
3.Veri Yapıları

Bu bölüm hakkında
3.1. Diziler
3.2. Diziler ne yapabilir?
3.3. Iterators
3.4. Hashes
3.5. Örnek: Adres Defteri
3.6. Adres Defteri'ni yazdırmak
3.7. Adres Defteri'ni sıralamak
3.8. İyi Programlar Yazmak
4.Defining your own classes and methods

Bu bölüm hakkında
4.1. İşlevler
4.2. Sınıflar ve yöntemler
4.3. More on classes
4.4. Implementing AddressBook
4.5. Writing iterators
4.6. Daha fazla özellik
4.7. İyi Programlar Yazmak
5.Tk ile Grafik Kullanıcı Arayüzleri

Bu bölüm hakkında
5.1. Niçin Tk?

Ruby

←Merhaba Dünya | 
Alternatif String Yazımları→
Python, Java, ve .NET Framework gibi Ruby de bir String sınıfına sahiptir. 

Bir Ruby programında bir string değer ifade etmenin bir yolu tek ya da çift tırnak içinde yazmaktır, buna string literal denir. Daha önce bunu Merhaba Dünya programımızda yapmıştık. Programımızda kısa bir güncelleme yaparak hem tek hem de çift tırnak ile ifade etmeyi görelim.

Hem tek hem de çift tırnak içinde string değer ifade etmek Perl diline benzer, fakat C ve Java gibi çift tırnağı string değer ifade ederken ve tek tırnağı tek karakter ifade ederken kullanan dillerden farklıdır.
Peki Ruby'de tek ve çift tırnak arasında ne fark var?  Yukarıdaki kodda bir fark yok, ama aşağıdaki koda bir bakalım:

"Eda'nın" kelimesi apostrof (tek tırnak) içerdiği için ikinci satırda Ruby'nin string değer ifadesi bitmiş olarak algılamaması için önüne bir ters bölü koyarak tek tırnağın string değer içinde olduğunu belirtiyoruz. Ters bölü arkasından gelen tek tırnak yapısı escape sequence olarak bilinir.

Tek tırnaklar sadece iki escape sequences içerebilir.

\' – tek tırnak
\\ – tek ters bölü
Bu ikisi dışında tek tırnak içinde olan tüm ters bölü ile başlayan şeyler olduğu gibi alınır.

Çift tırnak içinde tek tırnaktan çok daha fazla çeşit escape sequence kullanılabilir. Çift tırnak içinde ayrıca bir Ruby değişkeni değerini de yazdırmak mümkündür, buna enterpolasyon denir.

Aşağıda çift tırnak ifadeler içinde çok kullanılan escape sequence ifadeleri görülüyor.

\" – çift tırnak
\\ – tek backslash
\a – bell/alert
\b – backspace
\r – carriage return
\n – newline
\s – space
\t – tab tuşu
Bu örnek kodu deneyerek escape sequence'ler hakkında daha iyi bilgi sahibi olabilirsiniz.

Sonuç:

$ çift_tırnaklar.rb
Merhaba		dünya
MeHoşçakal dünya
Başa dön, dünya
1. Merhaba
2. dünya

Dikkat ederseniz son satırdaki \n alt satıra geçerken \r kursörü satırın başına getirip eski yazının üstüne yazdı.
Bell karakteri, escape kodu \a ile ifade edilir ve bir kontrol karakteri olarak bilinir. Alfabeden bir harf, bir noktalama işareti veya yazılı herhangi bir sembol ile gösterilmez. Bunun yerine terminal emülatöre istekte bulunarak (Microsoft Windows'da konsol olarak bilinir) kullanıcıya uyarı yapmasını talep eder. Buna karşılık nasıl davranacağı terminal emülatörüne kalmıştır, bu genellikle kısa bir beep sesidir. Bazı terminal emülatörleri kısa bir süre yanıp söner.
Terminal emülatörünüzün bell karakterini nasıl algıladığını test için aşağıdaki Ruby kodu deneyiniz.

Şimdiye kadar yazı çıktısı almak için puts metodunu kullandık.  Whenever puts bir yazı çıktısı yazdığında arkasından yeni satıra geçer (sonuna newline ekler). Örneğin aşağıdaki kodu deneyin.

Sonuç:

$ ./merhaba.rb
tüm
dünyaya
merhaba
de

Aksine Ruby'de print sadece siz belirtirseniz newline karakteri koyar. Örneğin aşağıdaki kodu deneyin. Burada newline karakterini print'in argümanlarının en sonuncusu olarak verdik, böylece terminalde prompt yazıdan sonra alt satırda görünür.

Sonuç:

$ ./merhaba.rb
tümdünyayamerhabade

Aşağıdaki kod da aynı sonucu oluşturur, yani print ve puts deyimleri aslında her argüman için ayrı ayrı çalıştırılıyor.

Karakter Dizileri

Leksikoloji
Belirteçler
Yorumlar
Gömülü Belgelendirme
Ayrılmış Kelimeler
İfadeler
Değişkenler ve Sabitler
Yerel Değişkenler
Oluşum Değişkenleri
Sınıf Değişkenleri
Küresel Değişkenler
Sabitler
Sahte Değişkenler
Ön-Tanımlı Değişkenler
Değer İfadeleri
Sayısallar
Karakter Dizileri
Enterpolasyon
Backslash Notasyonu
% Notasyonu
"Here döküman" notasyonu
Komut Çalıştırmak
Kurallı İfadeler (Regexp)
Array'ler
Hash'ler
Alanlar
Operatörler
Atama
Kendine Atamalar
Çoklu Atamalar
Koşullu Atama
Kapsamlar (Scope)
and
or
not
Kontrol Yapıları
Koşullu Dallanmalar
if işlemi
unless işlemi
if-elsif-else işlemi
kısa-if işlemi
case işlemi
Döngüler
while
until
for
break
redo
next
retry
Miscellanea
return
Metod Çağrıları
Metod Tanımlamaları
Blokları Anlamak, Proc ve Metodlar
Ampersand (&)
Dinamik Metodlar
Özel Metodlar
Sınıflar
Sınıf Tanımlamak
Oluşum Değişkenleri
Erişim Metodları
Sınıf Değişkenleri
Sınıf Oluşum Değişkenleri
Sınıf Metodları
Oluşumlar
Görünürlüğü Belirleme
Private
Public
Protected
Oluşum Değişkenleri
Kalıtım
Modüllerde Karıştırma
Include
Prepend

←Değişkenler ve Sabitler | 
Operatörler→

123                       # Fixnum
-123                      # Fixnum (işaretli)
1_123                     # Fixnum (altçizgi dikkate alınmaz)
-543                      # Negatif Fixnum
123_456_789_123_456_789   # Bignum
123.45                    # Float
1.2e-3                    # Float
123.45r                   # Kesirli sayı ruby > 2.1 - 2469/20r aynı
0xaabb                    # (Hexadecimal - 16'lı) Fixnum
0377                      # (Octal - 8'li) Fixnum
-0b1010                   # (Binary [negatif] - ikili) Fixnum
0b001_001                 # (Binary - ikili) Fixnum
?a                        # 'a' için ASCII karakter kodu (97)
?\C-a                     # Control-a (1)
?\M-a                     # Meta-a (225)
?\M-\C-a                  # Meta-Control-a (129)

Not: "?a" notasyonu Ruby 1.9 ve sonrasında değişti. 1.9 sonrası ASCII kodu değil karakteri ifade eder, yani  ?a == 'a'

Örnekler:

"bu bir string"
=> "bu bir string"

"üç artı üç eşittir #{3+3}"
=> "üç artı üç eşittir 6" 

foobar = "blah"
"foobar'ın değeri #{foobar}"
=> "foobar'ın değeri blah" 

'foobar\'ın değeri #{foobar}'
=> "foobar'ın değeri #{foobar}"

Bir string tek tırnak ya da çift tırnak ile başlar ve biter. Çift tırnaklı stringler backslash notasyonu ve enterpolasyon için kullanılır. Tek tırnaklı stringler \' ve \\ haricinde kullanılamaz.

escape karakterleri veya escape dizileri olarak da tanımlanır. Bir string içine özel karakterler eklemek için kullanılır.
Örnek:

"bu string \niki satırdan oluşur"
"bu stringin içinde \"çift tırnaklar\" var"

Desimal değeri olan karakterler için şu yapılabilir:
"" << 197 #string'e desimal değeri 197 olan karakteri ekler
=> Å

Enterpolasyon ile string içine bir Ruby kodu yazılabilir. Bu kod işleminin sonucu string içine yerleştirilir:

 "1 + 2 = #{1 + 2}"    #=> "1 + 2 = 3"

 #{işlem}

İşlem herhangi bir Ruby kodu olabilir. Ruby string içi kodlarda çok iyidir. Kod string dışındayken nasıl çalışıyora hataları bile aynı şekil çalışır:

"hayatın manası = #{1/0}"
=> divided by 0 (ZeroDivisionError)

Ayrıca bir de Perl'den esinlenen tuhaf bir string ifade yolu vardır: % (yüzde karakteri) ve bir sınırlayıcı kullanarak string ifade edilebilir, örneğin:

%{Ruby %100 "çok akıllı" bir dil}
=> "Ruby %100 \"çok akıllı\" bir dil"

Tabii bu Türkçe karakterleri irb'de göremiyorsanız $KCODE="UTF8" komutunu kullanın (son sürümler UTF8 default).
Alfanümerik olmayan herhangi bir karakter string sınırlayıcı olarak kullanılabilir. %[bu olabilir], %?ya da bu?, %~ya da bunlar~. Bu string tanımlama şeklini kullandığınızda " (çift tırnak) veya ' (tek tırnak) karakterleri escape karakter yapmadan direkt kullanılabilir, ama tabii ki sizin kullandığınız sınırlayıcının backslash edilmesi gerekir. Ama eğer %(parentez), %[köşeli parantez], %{süslü parantez} veya %<küçük büyük işareti> kullanırsanız bunlar açılıp kapanan şeyler olduğu için backslash kullanmadan birbirlerini karşıladıkları müddetçe kullanılabilir:

%(string (deyimleri) çok esnektir)
=> "string (deyimleri) çok esnektir"

% işaretinden sonra bir şekil verici karakter kullanılabilir %q[], %Q[], %x[] gibi — bu karakter stringin nasıl işleneceğini ve sonuçta ortaya ne tür bir nesne çıkacağını belirler:

Burada birkaç örnek:

%Q{bir\niki\n#{ 1 + 2 }}
=> "bir\niki\n3"

%q{bir\niki\n#{ 1 + 2 }}
=> "bir\\niki\\n#{ 1 + 2 }"

%r{nemo}i
=> /nemo/i

%w{bir iki üç}
=> ["bir", "iki", "üç"]

%i{bir iki üç} # Ruby 2.0 sonrası
=> [:bir, :iki, :üç]

%x{ruby --copyright}
=> "ruby - Copyright (C) 1993-2009 Yukihiro Matsumoto\n"

Bir string yapmanın here document denen bir yolu daha vardır, bunda sınırlayıcılar herhangi bir string olabilir:

string = <<END
on the one ton temple bell
a moon-moth, folded into sleep,
sits still.
END

Deyim << ile başlar ve hemen arkasından sınırlayıcı gelir. Stringin sonunda sınırlayıcı en son satıra ilk karakterden başlayarak tek başına konur.
Aşağıdaki şekil biraz daha iyi görünümlü olabilir. Burada sonlandırıcı yeni satırın en başında olmak zorunda değildir önünde boşluklarla satırda girinti olabilir:

string = <<-FIN
           on the one ton temple bell
           a moon-moth, folded into sleep,
           sits still.
         FIN

Alfanümerik olmayan karakterleri sınırlayıcıda kullanmak için çift tırnak içine alınmalıdır:

string = <<-"."
           orchid breathing
           incense into
           butterfly wings.
         .

Here dökümanları sınırlayıcı etrafına tek tırnak konulmadığı müddetçe enterpolasyon alır.
Öndeki sınırlayıcının arkasından gelen aynı satırdaki şeyler string içine alınmaz, şöyle bir şey yapabilirsiniz:

strings = [<<END, "short", "strings"]
a long string
END

=> ["a long string\n", "short", "strings"]

Here döküman değeri (burada "a long string\n") başlatıldığı yere konuyor dikkat ederseniz. 
Birçok here döküman string birleşebilir:

string = [<<ONE, <<TWO, <<THREE]
  the first thing
ONE
  the second thing
TWO
  and the third thing
THREE

=> ["  the first thing\n", "  the second thing\n", "  and the third thing\n"]

Hatta metod da kullanabilirsiniz.

s = <<END.chomp.upcase # Sondaki "\n" çıkarılmış ve büyük harf yapılmış.
abc
END

=> "ABC"

Terminal komutlarını ya da harici programları çalıştırıp çıktı almayı , backtick (sola yatık tek tırnak - Türkçe klavyede AltGr+, ile) ile sınırlanan yazılarla yapabilirsiniz.

Bir array negatif olmayan bir tamsayı ile endekslenebilen bir nesne kümesidir.
Bir array nesnesini Array.new komutuyla, değerleri köşeli parantez içine virgül ile ayırarak koyarak veya array içinde sadece string nesneler varsa başına %w kodu koyarak boşluklarla ayrılmış olarak tanımlayabilirsiniz

Son metod, %w kullanmak, aslında String sınıfının split metodunu sadece boşluklarla string parçalamak için kullanılmasının kısayoludur. Aşağıdaki örnekte bahsi geçen iki şekilde string array'ler üretilmiş ve eşitlikleri test edilmiştir.

Hash'ler (sözlükler) temelde arraylere benzerler ama farklı olarak sadece değerler değil , bu değerleri işaret eden anahtarlar (key kelimeleri) da içerir. Her anahtar hash içerisinde sadece bir kez kullanılır. Bir hash nesnesi üretmek için ya Hash.new yazılır ya da süslü parantez içine virgülle ayrılmış anahtar => deger çiftleri ile tanımlanır.

Genellikle Semboller anahtar olarak kullanılır (hızlı erişim sağlarlar), bu şekilde hash tanımlaması şöyle olur:

Ruby 1.9 da 2. sıradaki bu yeni şekil sunuldu.

Ruby 1.8'de hash elemanları üzerinde iterasyon "rastgele" bir sıradaydı. Ruby 1.9 ile beraber elemanlar üzerinde iterasyon eklendikleri sırra ile oldu. Ancak bir anahtarı tekrar eklerseniz ya da anahtar değerini değiştirirseniz, iterasyondaki sırası değişmeyecektir.

Bir alan (range) bir veri türünün bir parçasının tüm olası değerlerini ifade eder, daha açıkçası, bir başlangıç ve bir son değeri arasındaki olası tüm değerleri ifade eder.
Şunlar olabilir:

0 ve  5 arasındaki tüm tamsayılar.
0 ve 1 arasındaki tüm sayılar (tamsayı olmayanlar dahil), 1 hariç.
't' ve 'y' arasındaki tüm karakterler.

Ruby'de bu alanlar şöyle tanımlanır:

0..5
0.0...1.0
't'..'y'

Demek ki alanlar bir başlangıç değeri, bir son değeri ve son değeri kapsayacaksa iki nokta, kapsamayacaksa üç nokta içermektedir.
Bir alan değerler topluluğudur, bir sıralamayı ifade etmez. Bu durumda,

5..0

dizimi mantıken doğrudur ama sıfır uzunlukta bir alan döner.
alanlar sadece aynı sınıftan oluşumlarla ya da aynı atalara sahip sınıfların oluşumları ile oluşturulabilir , ama karşılaştırılabilir olmalıdırlar (<=> operatörü kullanabilir).
Alanlar Range sınıfının oluşumlarıdır ve metodları vardır. Örneğin bir değerin alan içinde olup olmadığını test için:

Tüm Range metodlarının ayrıntıları için bakınız : Range sınıfı dökümanı ya da class Range.

←Metod Çağrıları | 
Öntanımlı Sınıflar→
Sınıflar, oluşum nesnelerinin  üretildiği temel şablonlardır. Bir sınıf dahili durumu temsil eden değişkenler topluluğu ve bu durumlardaki davranışları belirleyen metodları barındırır.  

Ruby'de sınıflar class ifadesini takip eden bir isimle tanımlanır. İsim büyük harfle başlamalıdır ve genel görüş olarak bir'den fazla kelimeden oluşan isimlerde her kelimenin ilk harfi büyük ve bitişik olarak yazılır, kelimeler arası ayırıcı karakter konmaz (CamelCase). Sınıf tanımlama bloğu içinde metodlar, sınıf değişkenleri, ve oluşum değişkenleri için tanımlamalar olabilir, bir de attr_accessor gibi sınıf içine dışarıdan erişimler için kısa yol tanımları olabilir. Sınıf tanımlamaları end ifadesi ile biter.
Örnek :

Oluşum değişkenleri, sınıftan oluşturulan her nesne için üretilir ve o nesne içinde kullanılabilir. Kendilerine @ operatörü ile erişilir. Sınıf tanımlama bloğu dışında bu oluşum değişkenlerine, sadece oluşumun metodlarına kodlar ekleyerek erişilebilir. 
Örnek :

Bu kodun çıktısı, süpriz bir şekilde :

 nil
 2

olur.  İlk çıktıda nil değeri var, sebebi ise @one değişkeni class Sınıf altında tanımlanmış bu tanım olarak bir oluşum değişkeni gibi görünmesine karşılık, kapsam olarak sınıf değişkeni gibi duruyor (ama @@one şeklinde sınıf değişkeni ismi yok). Buna karşılık birşey_yap metodu içinde tanımlanan @one ise bir oluşum değişkeni ve sınıftan üretilmiş olan nesneye ait. Bunlar aslında iki farklı değişken ve ilkine sadece bir sınıf metodu içinden erişilebilir.

Daha önce söylediğimiz gibi bir oluşum değişkenine sadece nesne metodlarının içinde erişebilirsiniz. Eğer dışarıdan oluşum değişkenine erişmek isterseniz , bu amaçla hazırlanmış erişim metodları (Accessor Methods) tanımlamalısınız. Örneğin :

Dikkat ettiyseniz Ruby değişkene direk olarak erişip değiştirmek için enteresan kabiliyetlere sahip

satırları sırasıyla foo ve foo= metodlarını çağırır.

olması doğru gösterim gibi , ancak Ruby yukarıdaki daha temiz görünümü mümkün kılmış. 
Bu metodlara çok fazla gereksinim olacağı düşünülerek bu okuma ve yazma metodlarını üreten bir kısa yol eklenmiş:

önceki programla aynı işi yapar. attr_accessor metodu Ruby sınıftan nesne üretirken çalışır ve foo ve foo= metodlarını üretir.
Bununla beraber erişim metodları sadece oluşum değişkenlerine erişebilmek için gerekmez. Örneğin foo değişkenine değeri yazmadan evvel bir yuvarlama yapmak isteyebiliriz:

bu durumda metodlarımızı kendimiz yazmamız daha doğru olacaktır. Yine de okuyucu metodumuz hala standart, bunu kısaltmanın da bir yolu var.

Ruby attr_reader ve attr_writer kısa yolları okuma ya da yazma işlerinden sadece birini standart yapıda kullanmak durumunda işimizi görecektir.

Sınıf değişkenlerine @@ operatörü ile erişilir. Bu değişkenler, sınıftan üretilen bir nesne yerine sınıf hiyerarşisine iliştirilirler ve tüm oluşum nesneleri tarafından aynı değeri paylaşırlar (bu Java veya C++ dilleindeki "static" değişkenlere benzer).
Örnek :

çıktısı :

 1
 2
 2

Yukarıda örneğini verdiğimiz sınıf değişkenleri, sınıftan kalıtım yoluyla üretilmiş, hiyerarşideki tüm sınıflarda paylaşılır. Ama sınıflar kalıtım zincirinde diğer sınıflarla paylaşılmayan değişkenlere de sahip olabilir.

Daha fazla detay için, bakınız MF Bliki: ClassInstanceVariables

Sınıf metodları, normal metodlar gibi tanımlanır, tek farkı isminin başına self. ibaresi eklenir veya sınıf adını takip eden nokta konur.  These methods are executed at the Class level and may be called without an object instance.  They cannot access instance variables but do have access to class variables.
Example:

ya da 

Çıktısı :

 "birşey"

Bir sınıftan bir nesne üretme işlemine instantiation (örnekleme) denir. Ruby'de bu işlemi sınıfın new öntanımlı metodu ile yaparız.
Örnek :

Bu fonksiyon nesneyi hafızaya yerleştir ve kontrolü (eğer mevcutsa) sınıfın initialize metoduna aktarır. new fonksiyonuna girilen parametreler de initialize metoduna aktarılır.

Default olarak Ruby sınıflarındaki tüm metodlar public'tir — herkes tarafından erişilebilir. Yine de bu kuralın iki istisnası var : Object sınıfı altında tanımlanmış global metodlar ve herhangi bir sınıfın initialize metodu dolaylı olarak özeldir (private). 
Eğer istenirse nesne metodları public, private, protected olarak kısıtlanabilir.
İlginçtir burada kullanacağımız ifadeler bir deyim değildir, aslında sınıfta çalışan metodlardır, metodların görünürlüğünü dinamik olarak değiştirirler, ve sonuç olarak bu ifadeleri kullandıktan sonra sınıf bloğu sonuna kadar ya da yeni bir kısıtlama bildirilene kadar tanımlanacak tüm metodlar bu kısıtlamaya tabi tutulur.

Basit bir örnek :

Eğer private ifadesi argüman olmadan verilirse ondan sonra gelen tüm metodları kasteder. Ayrıca isim verilerek de kullanılabilir. 
İsim ile private metod örneği :

Burada private bir argüman ile çağrılır, ve methodP görünürlüğünü özele çekiyor.
Not olarak — def SınıfAdı.metod_adı şeklinde tanımlanan sınıf metodları private_class_method ifadesi ile özel yapılır.
Bu private_class_method ifadesinin genelde kullanımı üretici metod olan new metodunu erişilemez yapmaktır, başka bir şekilde nesne üretmeye zorlamak için mesela. Tipik bir örnek :

Her ne kadar C++'ta private "bu sınıfa özel" anlamına da gelse, Ruby'de bu oluşum nesnesine ait demektir. 
Gerçekşu ki private metodlar aşağıdaki temsili şekilde dışarıdan diğer metodlar yardımıyla çağrılabilir.

Burada, diğer_nesne deki a metodu private olduğu için erişilemez. Ama eğer "protected" olsa metoda yine dışarıdan direk erişilemezdi ancak accessing_private metodu içinden erişilebilirdi.

Bir metod için default görünürlük "public" dir. Bunu kendiniz kontrol etmek için de public ifadesini kullanabilirsiniz.  
Neden bu var kesin emin değilim ama bir metodu private yaptıktan sonra dinamik olarak tekrar public yapmak için kullanılabilir.
Ruby'de görünürlük tamamen dinamiktir ve çalışma zamanında bile görünürlük değiştirilebilir!

Şimdi, “protected” daha fazla açıklamayı hak ediyor. Java ya da C++'dan gelenler için, eğer bir metod "private" ise görünürlüğü tanımlandığı sınıf içinde kısıtlanır. Eğer bir metod “protected” ise bu sınıfın çocuklarından da (bu sınıftan kalıtımla üretilen sınıflar) veya aynı paketteki diğer sınıflardan da erişilebilir.
Ruby'de "private" görünürlük, Java'daki "protected" a benzer. Ruby'de "private" metodlara sınıfın çocuklarından da erişilebilir. Tam bir private metod Ruby'de yapılamaz, bir metodu komple gizleyemezsiniz.
Protected ve private arasındaki fark hemen göze çarpmaz. Eğer bir metod protected ise tanımlandığı sınıf ya da onun alt sınıflarında kullanılabilir. Eğer bir metod private ise sadece çağıran nesnenin kapsamında erişilebilir — başka bir oluşumun private metoduna direk olarak erişilemez, nesne aynı sınıftan üretilmiş olsa bile. Protected metodlara ise aynı sınıftan üretilmiş nesneler içinden ulaşılabilir(veya çocukları).

Ne güzel , yaş adında bir parametre, @yaş adında bir oluşum değişkeni ve yine yaş adında bir metod var. Burada yaş metodu protected olduğu için aynı sınıftan üretilen diğer nesnenin yaş metodu çağrılabiliyor ve kişilerin yaşları karşılaştırılıyor. Eğer yaş metodu private olsaydı diğer nesne içinden çağrılamayacak ve hata verecekti. Ama protected de olsa kişi1.yaş çağrısı erişim hatası verecektir.

Dikkat ederseniz nesne oluşum değişkenleri private değildir, sadece onları göremezsiniz. Bir oluşum değişkenine erişmek için okuma ve yazma metodları oluşturursunuz.
Aşağıdaki örneğe bakın :

Ne iyi ki bunu kısa yoldan yapacak özel deyimlere sahibiz : attr_accessor, attr_reader, attr_writer.
attr_accessor size hem okuma hem yazma işlevlerini kazandırır, attr_reader sadece okuma işlevi ve attr_writer sadece yazma işlevi kazandırır.
Şimdi kodumuzu kısaltalım:

Bir sınıf işlevlerini ve değişkenlerini bir superclass'dan miras yoluyla alabilir, bu üst sınıfa bazen ebeveyn sınıf ya da temel sınıf dendiği de olur. Ruby çoklu mirasçılığı desteklemez, bu yüzden Ruby'de sadece birtek ebeveyn sınıf olabilir. Deyim yapısı şöyledir :

  
Çıktısı :

  a
  b

Ebeveyn sınıftaki tüm private olmayan değişken ve metodlar, kalıtım yoluyla çocuk sınıfta aynen geçerlidir.
Eğer mirasçı sınıfta ebeveyn sınıfın bir metodunun üzerine yazarsanız bile ebeveyn sınıfın metoduna "super" kelimesi kullanarak erişebilirsiniz.

Çıktısı :

  b
  a

(çünkü bir_metod ebeveyn sınıftaki orjinali de çağırıyot).
Eğer daha derin bir kalıtım hattınız varsa (mirasçının mirasçısı gibi) ve hala yukarılardaki üst sınıfların metodlarına ulaşmak isterseniz, bunu yapamazsınız. Ancak bunu çözmek için bir yöntem vardır, aşağıya geçirmek istediğiniz metoda alias ile değişik bir takma isim vererek. Sonra aşağıdaki sınıftan yukarıdaki sınıfa bu takma isimle erişebilirsiniz.

Çıktısı :

 hello
 helloy
 helloz

Modülleri öncelikle Ruby modules'de okumanız iyi olur. Modüller bir kısım değişkenleri, fonksiyonları ve sınıfları bir grupta toplama yoludur, ama daha çok diğer dillerdeki namespace(ad alanmları)'lere benzerler. Bir modül, bir sınıf değildir, bir modülden kalıtımla mirasçı yapamazsınız ve bir modül self ile kendisini referans etmez. Modüllerin, modüle metodları olabilir (sınıfların sınıf metodları olması gibi) ve oluşum metodları da.
Bir modülü bir sınıfa dahil edebilirsiniz, yani içine karıştırabilirsiniz. 

Çıktısı :

Modüller sınıflara birkaç değişik şekilde karıştırılabilir.  Before diving into this section, it's important to understand the way that objects resolve messages into method names.

Çıktısı :

include kullanınca modülden gelen metodlardan önce sınıftaki metodlar taranır. Yani önce sınıf içinde tanımlanan metod bulunur ve o çalıştırılır.

Çıktısı :

prepend kullanılınca karıştırılan modüldeki metodlar daha önce taranır. Yani modüldeki metod daha önce bulunacak ve o çalıştırılacaktır.

Ruby'de her şeyin bir nesne olması prensibine bağlı kalmak amacıyla sınıfların kendileri de Class sınıfının oluşumlarıdır. Tanımlandıkları modül içinde sabitlerde saklanırlar. Bir nesne oluşumunda bir metod çağrısı nesnenin sınıfın

←Metod tanımlamak | 
Sıaradışı Durumlar→

Önce de söylediğimiz gibi Ruby'de her şey bir nesnedir. Her nesnenin de üretildiği bir sınıf (class) vardır. Mesela "Ahmet" nesnesi "İnsan" sınıfından üretilmiştir gibi. Bir nesnenin sınıfının ne olduğunu öğrenmek için class metodu kullanılır. Örneğin şunu deneyin:

Her neyse bunları daha önce de gördünüz. Ancak bununla beraber nasıl kendi sınıfınızı tanımlayabileceğinizi veya Ruby sınıflarını nasıl devşirip geliştireceğinizi bilmiyorsunuz.

Bir sınıfın oluşumu bir nesne'dir (object) ve o sınıfa aittir. Örneğin "chocolate" nesnesi String sınıfının bir oluşumudur. Bildiğiniz gibi string'ler, array'ler, hash'ler, number'lar, ve diğer bir kısım ön-tanımlı tipleri tırnaklar, köşeli parantezler, süslü parantezler vs. kullanarak üretebiliyorsunuz, ama bunları new metodunu kullanarak da üretebilirsiniz. Örneğin my_string = "" ve my_string = String.new satırları aynı işi yapar. Hemen tüm sınıflarda new metodu vardır: array'ler, hash'ler, her neyse. (Bazı sınıflar , mesela Integer ve Numeric new metoduna sahip değildir. Bu sınıflar oluşum nesneleri içinde kopyalamaya izin vermez.) Kendi sınıfınızı tanımladığınızda da new metodu ile oluşum nesneleri üretirsiniz.

Sınıflar bir nesnenin veri tipini temsil eder, mesela bir kitap, bir balina, bir üzüm veya çikolata. Herkes çikolata sever (doğru mu?), hadi o zaman bir çikolata sınıfı tanımlayalım:

Koda bir bakalım. Sınıflar class ifadesi ile üretilir. Bundan sonra sınıfın adı gelir. Tüm sınıf isimleri büyük harfle başlamalıdır. Teamüllere göre sınıf isimlerinde CamelCase kullanıyoruz. Yani ParçaÇikolata isimli bir sınıfımız olabilir ama Parça_Çikolata şekli (SnakeCase) tercih edilmesi tavsiye edilmez.
Sonraki kısımda bir sınıf metodu kullanacağız. Sınıf metodu, bir sınıf için özel tanımlanmış bir metoddur. Örneğin String sınıfının length metodu:

Bizim Çikolata sınıfımızın ye metodunu , bu sınıftan oluşturulan bir nesnede kullanmak için şu kodu kullanabiliriz:

Ayrıca bir metodu çağırmak için send de kullanabilirsiniz. Hani bir zaman "metodlar nesnelere gönderilen mesajlardır" demiştik:

Ancak send kullanımı, eğer dinamik bir davranış istemiyorsanız çok seyrektir, metod adını değer ifadesi olarak yazmamıza pek gerek olmaz. Ama olursa buraya bir değişken koyup değişik isimlerdeki metodları aynı satırla çağırabiliriz, ihtiyaca göre değişir, ama temiz bir kod görünümü değil.
Dikkat ettiyseniz Ruby'de tipik metod tanımlaması def deyimi ile başlar. Ancak metod adının da dinamik davranışta olması için define_method() yapısını send ile birleştirerek de kullanabilirsiniz:

Bir sınıfının metodu içinde self sahte değişkeni (pseudo değişken denir ve değiştirilemez) bulunulan oluşum nesnesini ifade eder. Örneğin:

Mevcut Integer sınıfına metod ilave ettik fark ettiyseniz.

Ayrıca , oluşturulan nesnede değil sınıfta çalışacak metodlar da tanımlanabilir. Örneğin:

Ama bu metodları oluşum nesnesinde çağırırsanız bulunamayacaktır:

undefined method `renk' for #<Çilek:0x...> (NoMethodError)

Çünkü bunlar nesnenin değil sınıfın metodlarıdır.
3 değişik tanımlama tekniği kullanılmış: SınıfAdı.metod_adı ve self.metod_adı şekli aşağı yukarı aynı yapıda — metod tanımı bloğu dışında sınıf içindeki self sınıfın kendisini temsil eder. En sonuncu yapı ise birçok metod tanımlayacaksak her seferinde self kullanmamızı ve daha temiz bir görünümü sağladığı için tercih edilir. Buradaki class << self yapısı bizi sınıfın meta-sınıfı bağlamına götürür (bazen öz-sınıf da denir). Meta-sınıf aslında o sınıfın devşirildiği bir üst sınıfı ifade ediyor ama endişelenmeyin burada sadece self. kelimesini habire tekrarlamadan metod tanımı yapmanızı sağlıyor o kadar.

←Sınıflar ve nesneler | 
Söz Dizimi→
Bu sayfanın orjinalinde birşey yok. Ben size ruby-doc.com sayfasından öğrendiklerimi yazayım.
Şimdiye kadar kodlarımızı mükemmel dünyada yazdık, hiçbir şeyin yanlış gitmediği. Tüm kütüphane çağrıları başarılı, kullanıcılar her zaman doğru bilgi giriyor, kaynaklar bol ve ucuz. Artık bu değişecek, gerçek dünyaya hoş geldiniz!
Gerçek dünyada hatalar oluşur. İyi programlar (ve programcılar) bunları öngörür ve bunları zarif bir şekilde ele almak için gerekli ayarlamaları yaparlar. Sıklıkla , kodlar hataya düştüklerinde ne yapacaklarına dair bilgi sahibi değildir. Örneğin olmayan bir dosyayı açmak istediğinizde bir fatal hata oluşur, sizin dosya işleme modülünüz ne yapacak?
Geleneksel erişim dönen değerleri kullanmaktır. open metodu , hataya düştüğünü belirten bazı değerler döner. Bu değer çağıran rutinlerde , biri onunla ilgilenene kadar yukarı doğru yayılır (propagate).
Ama mesela open , read ve close her biri bir hata dönebilir. Kodumuzda her birini çağırırken dönen değeri işlemek ve ona göre davranış belirlemek çok sıkıntı verecektir. 
Bu tip durumlarla başa çıkmak için bütün dillerde "Sıradışı Durumlar" (Exceptions) adıyla bilinen teknikler kullanılır.  Exception'lar hata hakkında bilgiyi bir nesnede toplamanızı sağlar ve bu sıradışı durum nesnesi sistem bu durumu bildiğini belirten bir kod bulana kadar çağrı sıralamasında geri doğru yayılır.

Sıradışı durum hakkında bilgi içeren paket Exception sınıfı ya da onun çocuklarından bir sınıfın oluşumudur. Sınıf Hiyerarşisi şöyle:

Exception
NoMemoryError
ScriptError
LoadError
Gem::LoadError
NotImplementedError
SyntaxError
SecurityError
SignalException
Interrupt
StandardError
ArgumentError
Gem::Requirement::BadRequirementError
EncodingError
Encoding::CompatibilityError
Encoding::ConverterNotFoundError
Encoding::InvalidByteSequenceError
Encoding::UndefinedConversionError
FiberError
IndexError
KeyError
StopIteration
IOError
EOFError
LocalJumpError
Math::DomainError
NameError
NoMethodError
RangeError
FloatDomainError
RegexpError
RuntimeError
Gem::Exception
SystemCallError
ThreadError
TypeError
ZeroDivisionError
SystemExit
Gem::SystemExitException
SystemStackError

Genel yapı şu şekildedir:

begin ile başlayan blok bir hata olmazsa çalışacak kodları içerir. rescue bloğu ise bir exception (sıradışı durum) oluştuğunda çalışacak kodları içerir. Orada kullanılan $! gloabal değişkeni oluşan hataya karşılık Ruby sisteminin ürettiği hata mesajını içerir. Bu kodun çıktısı:

Başarısız : divided by 0

olur, ayrıca bölme hatası olduğu için zaten Ruby'dehata mesajı verecektir. Bu sadece örnek olarak verilmiş kısa bir kod. 

Sıradışı durum işleme bloğu içinde birden fazla rescue bloğu olabilir.

Bu kodu eğer :

ile çalıştırırsak

String derlenemedi: undefined method `put' for main:Object

hatası verir. Eğer:

ile çalıştırırsak

Kod çalıştırılırken hata oldu: divided by 0

hatası verir.

Şimdiye kadar oluşan hataları işledik. İstersek kendimiz de kodumuzla hata üretebiliriz.

bize 

excep.rb:1:in `<main>': unhandled exception

verir.

bize 

excep.rb:2:in `<main>': İsim yok (RuntimeError)

verir.

bize 

excep.rb:4:in `<main>': 4 >= 3 (boyutu aştı) (IndexError)

verir.

bize 

excep.rb: İsim çok uzun (ArgumentError)

verir. Bu örnekte parametrede caller metodunu vermesek

excep.rb:1:in `<main>': İsim çok uzun (ArgumentError)

verecekti.

←Nesnelere giriş | 
Veri tipleri→
Bu öğreticinin devam eden bölümlerinde programlama dili konseptlerini (örn. If yapısı, while döngüsü) biraz bilmek ve nesne-yönelimli programlama hakkında biraz bilgi sahibi olmak sizlerden beklentimiz olacaktır.

Değişkenlerle çalışmayı sınıflar ve nesneleri konuşurken daha derinlemesine inceleyeceğiz. Şimdilik basit yerel değişkenlerin küçük harf ya da alt çizgi ile başlaması gerektiğini, içinde büyük ya da küçük harfler, sayılar ve alt çizgiler olması gerektiğini bilelim yeter. Global değişken isimleri de $ işareti ile başlar.

Ruby'de oldukça standart döngü ve dallanma yapıları vardır: if, while ve case
Örneğin, burada if yapısı kullanımı görülüyor:

[Diğer birçok programlama dili gibi rand fonksiyonu 0 ile 1 arasında rastgele sayı üretir]
Koşullu dallanma yapıları hakkında ilerideki bölümlerde oldukça tartışacak zamanımız olacak. Yukarıdaki örnek oldukça anlaşılabilir yazıldı.
Ruby ayrıca if yapısının ters mantığıyla çalışan unless yapısına da sahiptir, şöyle ki:

Geneli konuşursak Ruby if yapısı kullanılırken (if ...) ve bağlı kod bloğu ayrı satırlarda yazılır. Eğer her şeyi tek bir satırda birleştirmek zorundaysanız, koşuldan sonra then kelimesi kullanarak bloğu arkasına yazarsınız.

Şunu da söyleyelim if deyimi aynı zamanda bir eşitliktir; ve değeri de kodun son satırı işlendiğinde oluşan değerdir. Bu yüzden yukarıdaki kod şöyle yazılabilir:

Ayrıca Ruby'nin Perl'den almış olduğu şeylerden biri de, if ve unless ifadeleri başka bir ifadeden sonra ona koşul bağlamak için kullanılabilir. Örneğin:

while ifadesi diğer dillerdeki gibi davranır — takip eden kod bloğu koşulun doğru olduğu müddetçe sıfır ya da daha fazla kere tekrar çalıştırılır

Ve aynı if gibi, while ifadesinin de ters mantıkla çalışan versiyonu vardır, o da until ifadesidir ve koşul doğru olana kadar tekrarlar.

Son olarak burada kısa bir örnekle açıklayacağımız case ifadesi var. case aslında if ... elsif... sisteminin kolaylaştırılmış bir halidir.
a = rand(11) # 0 ile 10 arasında bir rastgele tamsayı üretir

Bu örnekte henüz görmediğimiz başka ilginç şeyler de var ama biz burada case ifadesini dikkatimize alıyoruz.

Ruby'nin her-zaman-tamamı-nesne-yönelinli tasarımını korumak için fonksiyonlar, nesne metodları gibi düşünülür, fark yoktur. Nesneler ve sınıflara gelidğimizde metodları çok daha ayrınıtılı inceleyeceğiz. Şimdilik temel metod tanımlaması şuna benzer (aşağıdaki kodu func1.rb isimli betik dosyası olarak kaydediniz):

şimdi betiği çalıtıralım:

$ ruby func1.rb
Merhaba Zürafa
Sihirli kelimemiz 6 karakter uzunluğunda

Metodlar def deyimi ile tanımlanır, arkasından metod adı gelir. Değişkenler gibi yerel ve sınıf metodların isimleri de küçük harfle başlamalıdır. 
Bu örnekte fonksiyonumuz sadece bir argüman alır (a), ve bir değer döner. Dikkat ederseniz argümanın tipi belirtilmedi (a string değer olmak zorunda değil)... bu bize çok esneklik kazandırması dışında çok fazla soruna da sebep olabilir. Ayrıca fonksiyon return ifadesi ile bir değer dönüyor. Teknik olarak değer dönmeye gerek yoktur — son satırdaki oluşan değer fonksiyondan dönen değer olur — fakat return satırını kullanmak kodun okunurluğu bakımından daha iyi bir görsel oluşturur.
Diğer diller gibi Ruby de hem argümanlar için default değerleri hem de değişken uzunlukta argüman listesini destekler, ilerledikçe hepsini göreceğiz. Ayrıca kod blokları da aşağıda göreceğimiz gibi desteklenmektedir.

Ruby'nin en önemli konseptlerinden biri de kod bloklarıdır. Aslında bu devrim niteliğinde bir konsept değil — C veya Perl gibi dillerde ne zaman if  ... {  ... } yapısı kullanırsanız aslında bir kod bloğu oluşturuyorsunuz, ama Ruby'de kod bloklarının bazı gizli süper güçleri var....
Ruby'de kod blokları ya do..end ya da süslü parantez içinde {..} yapısıyla ifade edillir.

Bu kod çalışan bir kod değil, sedece blok yapısının nasıl olduğunu göstermek için böyle verdik. Kod bloklarının en etkili kullanıldığı yerlerden biri, metodların bloğu parametre olarak alması ve metoda verilen tanıma göre bloğu çalıştırmasıdır. 
[editör notu: the Pragmatic Programmers kitabı bu şekilde açıklamayı kullanışlı bulmuyor. Yerine kod bloğunu metodun zaman zaman kontrolü devrettiği bir ortak olarak anlatır]
Konsept ilk bakışta anlaşılması zor gelebilir. Bir örnekle devam edelim:

$ irb --simple-prompt
>> 3.times { puts "Hi!" }
Hi!
Hi!
Hi!
=> 3

Süpriiiz! , 3 değerinin bir sayı olduğunu düşünüyordunuz, ama aslında bir nesne ( Fixnum veri tipinde). Bir nesne olduğu için  times adında parametresinde bir blok alan bir üye metodu var. Metod parametresinde verilen kod bloğunu 3 defa çalıştırır. 
Bloklar da aslında parametre alabilir, özel bir notasyon kullanarak (|..|). Bu durumda times metodu dökümanına kısa bir bakış attığımızda bloğa tek bir değer aktardığını görürüz, hangi turda olduğu sayısı:

$ irb --simple-prompt
>> 4.times { |x| puts "Döngü #{x}" }
Döngü 0
Döngü 1
Döngü 2
Döngü 3
=> 4

times metodu her turda bloğa bir sayı gönderiyor. Blok bu sayıyı x değişkeni içine alıyor (|x| olarak ifade edildiği için), ve sonra blok içindeki kodu çalıştırıyor.
Metodlar bloklarla yield deyimiyle de iletişim kurabilir. Metod yield ifadesine her geldiğinde kontrol bloğa devredilir. Blok kodu işini bitirince kontrol tekrar metoda döner ve kaldığı yerden devam eder. Basit bir örnek verelim:

$ block2.rb
Hello!
Hello!

simpleFunction metodunda sadece iki defa kontrol bloğa devrediliyor — yani bloğa iki defa girildiği için çıktı da iki defa yazılıyor.  Şimdi de bloğa bir argüman gönderen metod görelim:

$ block1.rb
Merhaba, Kaplan
Merhaba, Zürafa

Burada olanları anlamak için birkaç defa okumak gerekebilir. Bir "hayvanlar" metodu tanımladık — bşr kod bloğu alıyor. Çalıştırıldığında metod iki defa kontrolü kod bloğuna devrediyor, ilkinde argüman değeri "Kaplan" ve ikincide "Zürafa" olarak bloğa geçiyor. Dikkat ederseniz yield metoduna verilen argümanlar kod bloğuna geçiriliyor. Bu örnekte sadece hayvanlara selam ceren basit bir kod bloğu kullandık. Farklı bir blok da yazabilirdik, örneğin:

Kaplan kelimesi 6 karakter uzunluğunda
Zürafa kelimesi 6 karakter uzunluğunda

Aynı metodu iki değişik blokla çalıştırdık ve tamamen farklı iki sonuç aldık. 
Blokların birçok etkili kullanımı var. En başta gelenlerden biri array'ler üzerinde each metodu uygulanmasıdır — array içindeki her eleman için kod bloğunu bir kez çalıştırır — listeler üzerinde iterasyon için çok etkili bir yöntemdir.

Ruby tamamıyla nesne yönelimlidir. Herşey bir nesnedir — hatta sabit zannettiğiniz şeyler bile. Bu aynı zamanda "standart fonksiyonlar" olarak düşünebileceğiniz şeylerin büyük çoğunluğunun bir kütüphanede ortalıkta dolaşmadığı, bunun yerine belirli bir değişkenin metodları olduğu anlamına gelir. 
Şu örneği görmüştük:

Her ne kadar 3 sabit bir sayı olarak görünse de, aslında Fixnum sınıfının bir oluşum nesnesidir (Fixnum sınıfı Numeric sınıfından, o da Object sınıfından kalıtım yoluyla türetilmiştir). Bu times metodu da  Fixnum sınıfından gelir ve kendisine tanımlanan işleri yapar.  
işte bazı diğer örnekler

$ irb --simple-prompt
>> 3.abs
=> 3
>> -3.abs
=> 3
>> "giraffe".length
=> 7
>> a = "giraffe"
=> "giraffe"
>> a.reverse
=> "effarig"

İlerleyen bölümlerde Ruby'nin nesne-yönelimli çalışması hakkında öğrenmeye devam edeceğimiz çok zamanımız olacak.

←Temel teknikler | 
Metod tanımlamak→

Önceki bölümde bahsettiğimiz gibi Ruby'de her şey bir nesnedir. Ruby 8 ana veri tipi ve 3 tane de Numeric üst sınıfından devşirme veri tipine sahiptir. Her şeyin bir sınıfı var. İnanmıyor musunuz? Aşağıdaki kodu deneyin:

çıktısı

Gördünüz mü? Her şey bir nesne. Her nesnenin class metodu o nesnenin sınıfını dönüyor. Hemen her şeyde metod çağırabilirsiniz. Daha önce 3.times metodunda bunu görmüştük (Teknik olarak bir nesnede metod çağırdığınızda o nesneye bir mesaj gönderiyorsunuz, ama buna daha sonra değineceğiz)
Bu aşırı nesne yönelimlilik aslında çok eğlenceli, istediğiniz sınıf yapısına değişkenler veya metodlar ekleyip program çalışırken yapısını değiştirebilirsiniz. Ama biz burada veri tiplerini inceleyeceğiz, yani oynanmamış hali.

Önce sabitler (constant) ile başlıyoruz , çünkü o daha basit. Sabitler hakkında hatırlamanız geren 2 şey var:

Sabit isimleri büyük harf ile başlar. Constants start with capital letters. Sabit bir sabittir, ama sabit bir sabit değildir.
Sabitlerin değerini değiştirebilirsiniz (diğer hemen bütün programlama dillerinde bunu yapamazsınız), ama Ruby size bir uyarı mesjı verir (biliyorum saçma ama bunu yapabilirsiniz)

$ ruby types.rb
4
types.rb:4: warning: already initialized constant 
Sabit
types.rb:2: warning: previous definition of Sabit 
was here
5

Uyarıyor ama işlemi yapıyor. Tebrikler! artık Ruby sabitler hakkında uzman sayılırsınız.

Bu sayfada verdiğimiz ilk kod örneğine dikkat ettiniz mi? "İki nokta üstüste karakteri ile başlayan bu zımbırtı da ne?". Ruyb'nin her şeyi nesne olarak görmesinin bir kötü bedeli var, bir sürü nesne kodun çalışmasını yavaşlatıyor. Ne zaman bir metin yazsanız Ruby yeni bir String nesnesi oluşturuyor. İki tane metin aynı bile olsa Ruby onlara yeni nesne muamelesi yapacağı için ayrı nesneler üretilir. Kodunuzda örneğin "çok yaşa padişahım" metnini kullansanız, sonra başka bir yerde bir daha kullansanız Ruby bunların aynı şey olduğunu düşünmez (aslında düşünmek istemez). Örnek bir irb oturumunda gerçekleri görelim:

$ irb --simple-prompt
>> "çok yaşa padişahım".object_id
=> 43300
>> "çok yaşa padişahım".object_id
=> 46400

Dikkat ettiyseniz aynı iki string değer için Ruby farklı nesne ID değerleri döndü, yani ikisi farklı nesne.
Bu hafıza aç gözlülüğünü halletmek için Ruby'de "semboller" kullanılabilir.  Symbol dahili lojikte ve karşılaştırmalarda kullanmak için tasarlanmış hafif nesnelerdir. Eğer kullanıcı görmeyecekse string yerine neden semboller kullanılmasın? Kodunuz bunun için size minnettar kalacaktır. Hadi yukarıdaki kodu string yerine sembol kullanarak deneyelim:

>> :sembolüm.object_id
=> 3078748
>> :sembolüm.object_id
=> 3078748

Semboller adları önünde iki nokta üstüste ile ifade edilir: :sembol_ismi. Kelimeleri birleşik yazmak ya da aralarında alt çizgi kullanarak birleştirmek gerekir. Ama çok da isterseniz şöyle yapılabilir:

>> :"çok yaşa padişahım".object_id
=> 3082548
>> :"çok yaşa padişahım".object_id
=> 3082548
>> puts :"çok yaşa padişahım"
çok yaşa padişahım

Hash'ler benzetmek gerekirse sözlük gibidir. Bir anahtar (key) ve bir de döküman (reference) değer çiftlerinden oluşur, ve bilgiyi bulmak için içinde arama yaparsınız. 
Bunu hayal etmenin en iyi yolu küçük bir deneme yapmak olacak:

bu kodun çıktısı:

Ayrıca bu kodu şöyle de yazabiliriz:

Bu kod hash değerin her elemanı için iterasyon yapar, anahtar değeri key ve açıklamayı da value değişkenine koyar. Döngü içinde de sadece value değeri yazdırılıyor. Sonuç çıktı önceki ile aynı olacaktır.
Hash değeri tanımlarken daha ayrıntılı olabilirim; şöyle de tanımlayabilirim:

Eğer Luke'u başımdan savmak istersem, şöyle bir şey yaparım:

Artık Luke hash değerimiz elemanlarında yok.
Ya da diyelim çitçilerle aramda husumet var, şunu yapabilirim:

Bu tüm hash elemanları üzerinde silme yapmak amacıyla iterasyon yapar ama sadece kod bloğu true değer dönerse. Blok içinde emin olmak için önce value değerini küçük harfe dönüştürdük (içinde çiftçi olan bir kelime "ÇiFtçi!1!" gibi de yazılsa bulsun bana), sonra değer de "çiftçi" kelimesi var mı? sorguladık. 3 değerden sadece birinde "çiftçi" kelimesi olduğu için iterasyonda o elemanda bloğumuz true değer dönecek ve o eleman (yani :luke anahtarı olan çift) silinecektir. Düzenli ifadeler (regular expressions) kullanarak da eşleşme bakabiliriz ama o tamamıyla ayrı ve geniş bir konu başlığı olacak.
Hash değerimize "Lando" içinde bir açıklama ekleyelim:

Hash değer içindeki eleman sayısını hash.length ile öğrenebiliriz. Sadece anahtar değerlere hash.keys metodu ile bakabiliriz, bu bize anahtar değerlerden oluşan bir Array dönecektir. Şimdi de ona bakalım...

Array'ler çok bakımdan Hash'lere benzer, ama key değerleri yazılmaz, sıfırdan başlayan sıra numaraları vardır (bunlara "key" değil "index" denir). Beş elemanlı bir Array'in son elemanını bulmak için  array[4] yazılır, ve ilk elemanını bulmak için de array[0] yazılır. Ek olarak Hash için gördüğümüz tüm metodlar Array için de kullanılabilir.
Burada bir Array tanımlamanın iki yöntemi görülüyor:

Tahmin edebileceğiniz gibi << operatörü bir Array'in sonuna yeni bir eleman ekler. Eğer bu iki array tanımlamasını yaptıktan sonra puts array2[4] satırnı girersek, çıktıda değer! yazacaktır. Eğer bu değer! elemanını array2 içinden silmek istersem, sadece Array.pop yazarım, bu metod uygulandığı array'in son elemanını döner ve arkasından elemanı siler.

$ ruby types.rb
değer!
["Bu", "da", "bir", "array"]

array2.pop metodu sildiği son elemanın değeini (yani "değer!" kelimesini) dönüyor, ve array2 artık daha kısa boyutlu.
Eğer bunu yapmaya devam edersem array2'de hiç bir eleman kalmayacaktır. Eleman kalmamasını Array.empty? metodu ile öğrenebilirim. Örneğin aşağıdaki kısa kod bir array içindeki tüm elemanları diğerine ilave eder:

$ ruby types.rb
["merhaba", "bu", "bir", "array", "değer!", "değer!", "array", "bir", "da", "Bu"]

Biraz ters oldu ama neyse. Brada beni gerçekten çok etkileyen bir şey var: Array'ler birbirinden çıkarılabilir ya da toplanabilir. Ortalıkta bulunan her dil için kefil olamam ama eminim Java, C++, C# ve Perl bilenler aşağıdaki kodu denediğimi görünce bana deliymişim gibi bakarlar:

$ ruby types.rb
["merhaba", "bu"]
["merhaba", "bu", "bir", "array", "değer!", "Bu", "da", "bir", "array", "değer!"]

Bu kod çalıştırıldıktan sonra tüm şunlar doğrudur:

array3 içinde array1'in array2 elemanlarından biriyle aynı olamayan tüm elemanları vardır.
array1'in tüm elemanlarından array2'nin elemanlarının çıkartılmış hali şimdi array3 içindedir.
array4 hem array1 hem de array2 elemanlarının toplamını içinde barındırır, dikkat ederseniz aynı elemanlar yine de yazılmıştır.

array1 değişkeni elemanları içinde herhangi bir değeri Array.include? metodu ile arayabilirsiniz:
array1.include?("Burada bu var mı?")

Eğer tüm Array'i tek bir String'e dönüştürmek isterseniz şöyle yapabilirsiniz:

Eğer array2 örnekte verdiğimiz elemanlara sahipse string şöyle olacaktır:

 
Bu Array.join metodunu argüman girmeden de çağırabiliriz:

string'in değeri şimdi:

Eğer henüz okumadıysanız stringler ve alternatif string yazımları sayfalarını okumanızı tavsiye ederim. Bu bölümde String hakkında gelişmiş bilgiler olacak ve bu iki sayfada anlatılanları bildiğinizi kabul ediyorum.
Ruby'de Stringler söz konusu olunca harika bazı metodlar mevcuttur. Örneğin onları çarpmaya tabi tutabilirsiniz:

 
şunu üretir: 

String'ler ayrıca karşılaştırılabilir:

şunu üretir:

Yukarıdaki kod aslında iki karakterin ASCII kod değerlerini karşılaştırır. Ruby versiyon 1.9 öncesinde bir karakterin ASCII kodunu öğrenmek için:

yapısı kullanılırdı. Ancak Ruby versiyon 1.9 ve sonrasında bu artık çalışmıyor. Yerine String.ord metodu kullanılır:

Her iki komut aynı çıktıyı verir, A karakterinin ASCII kodu olan 

sayısını. Başka karakterler için sadece A harfi yerine kodunu bulmak istediğiniz harfi yazın.
Tersine dönüştürme yapmak için (65'ten A'ya) Integer.chr metodunu kullanın:

 
çıktısı:

Concatenation (yazıları birleştirme) birçok diğer dile benzer yapılır: birleştirmek istediğiniz iki String değer arasına + operatörü koyarak iki string birbiri arkasına eklenir:

şunu üretir:

Bu belalı String'leri birleştirme operatörü olmadan da işlemek için enterpolasyon da kullanabilirsiniz. Aşağıdaki kodun çalışması sonucunda String1, String2 ve String3 eşit içeriğe sahip olacaktır:

Eğer bir String nesnenin harfleri üzerinden iterasyon yapmank isterseniz String.scan metodunu kullanırsınız:

Bu kod thing değişkeni içindeki değerin her harfini tek tek ekrana basar (puts otomatik olarak alt satıra geçer):

Peki parametredeki şu gıcık "/./" şeyi nedir? Evet arkadaşım, buna regular expression (kurallı ifade) denir. Güçlü küçük yardımsever şeylerdir, fakat bu sayfada ayrıntısına girmeyeceğiz. Şimdilik tüm bilmeniz gereken /./ bir "regex" dir ve herhangi "tek bir" karakter ifade eder. Eğer /../ ifadesi kullanmış olsaydık Ruby bu sefer her iki yanyan karakter üzerinden iterasyon yapacaktı, ve tek sayıda karakter olunca sonuncuyu pas geçecekti!
Kurallı ifadelerin başka bir kullanım yeri =~ operatörüdür. Bir String değerin içinde bir kurallı ifade ile eşleşme olup olmadığı eşleşme operatörü =~ kontrol edilir:

çıktısı

String.match metodu aşağı yukarı aynı çalışır, ama parametre olarak String değer alır. İşte bir örneği:

Tamam, bu kadar kurallı ifadeler konuşmak yeter. AŞağıdaki iki örnekte kurallı ifadeler de kullanılailir, ama biz standart eski String'leri kullanacağız. Diyelim Doğruluk Bakanlığı'nda çalışıyorsunuz ve bir String içinde bir kelimeyi başkasıyla değiştirmek istiyorsunuz. Şöyle bir şey deneyebilirsiniz:

Şimdi string2 içeriğinde 2 + 2 = 5 var. Fakat ya bu String bir'den fazla doğrultulması gereken yalan içeriyorsa?  String.sub metodu sadece kelimeyi ilk bulduğu yeri değiştirir! Tahminim String üzerinde String.match metodu kullanarak ve bir while döngüsü kullanarak halledersiniz. Ama bunu yapmanın çok daha etkili bir yolu var:

Big Brother çok gurulanacak! String.gsub metodu  "global substitute" fonksiyonudur. "Down

←Alternatif String Yazımları | 
ASCII→
Çok satırlı string değerler için Ruby here dokümanları destekler (heredocs). Bu özellik Bourne shell kökenlidir ve Perl ve PHP'de de mevcuttur.

Bir here dokümanı oluşturmak için << operatörünü takip eden ve doküman sınırını belirten bir işaretleyici kelime kullanılır. Sondaki işaretleme kelimesi terminatör (sonlandırıcı) olarak bilinir ve öncesinde baştan beri gelen tüm metin newline ve boşluklarla beraber birleştirilip string değeri oluşturur.

Sonuç:

Eğer puts metoduna birden çok argüman verirsek, here dokümandan elde edilen string değer, argüman listesindeki << operatörünün olduğu yerde belirir.
Aşağıdaki kodda here-doküman (dört market elemanı ve bir satır boşluktan oluşan) 3üncü argüman olarak metoda verilir. Yukarıdakiyle aynı sonucu elde ederiz.

Bir argüman listesinde birden fazla here-doküman de olabilir. Okunabilirliği sağlamak için her here-doküman sonuna bir boş satır ekledik.

Bu kodu çalıştırınca göreceğimiz:

Örneklerimizde puts metodu kullandık, fakat string parametre alan her metoda bu uygulanabilir.

Here doküman içinde satırlarda girinti yaparsanız bunlar string değere yansır, ancak sonlandırıcı öncesinde herhangi bir boşluk olmamalıdır.

Sonuç:

Kod okunabilirliği için sonlandırıcıyı da girintilemek isterseniz here-dokümanı <<- operatörü ile yazın. 

Not, here-doküman içindeki girintiler hala geçerliğini koruyor.

Here dokümanlar için de tek tırnaklar veya çift tırnaklar kurallarını kullanabilirsiniz.

Eğer bizim örneklerimizde olduğu gibi sınırlayıcı etrafında tırnaklar yoksa here-doküman gövdesi çift tırnak kurallarına göre işlenir.

Bu örneğin çıktısı:

Eğer sınırlayıcı etrafına çift tırnak koyarsanız da çift tırnak kuralları geçerli olur. Ancak sonlandırıcı etrafına çift tırnak koymayın.

Tek tırnak kurallarına uyan here-doküman oluşturmak için sınırlayıcı kelime etrafına tek tırnak koyun.

The sonuç:

←Notasyon Kuralları | Merhaba Dünya→
Bu kitapta sık sık kendinizi deneyeceğiniz alıştırmalar yapacağız. Her küçük deneyim için bir program geliştirmektense Ruby'yi interaktif olarak kullanmak isteyeceksiniz. Ruby'nin interaktif modu ('irb' diye çağrılarak çalıştırılır) size bir çok özelliği olan interaktif bir komut satırı verecektir.
Kullanmak için, sadece irb yazınız.

$ irb --simple-prompt
>>

>> promptu size artık programın girdi alımına hazır olduğunu gösterir. Eğer --simple-prompt opsiyonunu belirtmezseniz prompt satır numaralarını da belirten daha uzun başlıklı olacaktır. Örneğin:

$ irb
irb(main):001:0>

Basit bir irb oturumu şuna benzer:

$ irb --simple-prompt
>> 2+2
=> 4
>> 5*5*5
=> 125
>> exit

Örnekte kullanıcının girdikleri 'koyu gösterilmiştir.  irb size her yazdığınız kod satırının dönen değerini => işareti arkasından yazar. 

Eğer Cygwin Bash shell ile Microsoft Windows'ta kurulum yaptıysanız ama Cygwin'in Ruby versiyonu yerine Windows standart Ruby kurulumunu kullanmak istiyorsanız bu bölümü okuyun.
Cygwin Bash terminalde irb uygulaması normal versiyonu çalıştırmak istiyorsanız irb.bat çalıştırın.
Cygwin'in Bash termianli Windows konsol içinde çalışır, ve irb.bat Windows versiyonu düzgün çalışacaktır. Ancak Cygwin terminali  Cygwin'in  rxvt terminal emülatörü içinde çalıştırmak isterseniz irb.bat düzgün çalışmayacaktır. Ya terminali (ve irb.bat'ı) Windows konsolda çalıştırın, ya da Cygwin'in Ruby versiyonunu yükleyin.

irb her yazdığınız kod satırının dönen değerini yazar. Bunu aksine bir Ruby programı sadece koda puts gibi bir çıktı komutu yazdığınızda çıktı verir.
Örneğin:

$ irb --simple-prompt
>> x=3
=> 3
>> y=x*2
=> 6
>> z=y/6
=> 1
>> x
=> 3
>> exit

Buradaki , x=3 sadece x değişkenine bir değer atamaz aynı zamanda x'e atanan değeri de geri döner, bu değeri de irb yazar. Ancak bu satırı bir Ruby program kodu içine yazarsanız konsola hiçbir şey yazmaz. Değişkenler değerleri alır ama bir çıktı yazılmaz.

x=3
y=x*2
z=y/6
x

Eğer Ruby programı içinde bir değeri çıktıya yazdırmak istiyorsanız, puts gibi metod kullanırsınız.

x=3
puts x

Daha ileriki çalışmalar için şu şartları okuyun:

Rusça sözcükler, ve onların Türkçe çeviri yazılarıyla, çevirimleri aşağıdaki gibi belirtilecektir.
Rusça sözcük [Türkçe çeviri yazı] (Türkçe çevirim)
Rusça fıkra [Türkçe çeviri yazı] - Türkçe çevirim
Örneğin: языковедение [yazikov'ediniye] (dilbilim)
Ö: - örneğin
( ' ) - Türkçe çeviri yazılarda harfleri yumuşatır. Sert sessiz harflerin önünde durursa, harfin sesini yumuşatır.
Ö: кухня [kúhn'a] (sesi Türkçedeki "bela" kelimesinde bulunan a' sesine benzer), лёд [l'ot] (ö sesine benzer), дед [d'et] (sesi Türkçedeki "lale" kelimesinde bulunan e' sesine benzer), люди [l'údi] (ü' sesine benzer)
Boğuk ve tonlu sessiz harflerin sonuna konursa, harfin sesini yumuşatır

Ö: даль [dal'], тень [t'en'], рать [rat'], килька [ki ́l'ka], зелье [z'él'ye]

Rusça dilini öğrenmeye geçmeden önce, bu dilin alfabesini bilmeniz gerekir. Rus alfabesinde 33 harf mevcuttur.

Daha ileri çalışmamız için şu işaret ( ́ ) vurgu göstermek için okuyun.
Rusça sözler için vurguların varlığı tipiktir. Rusça sözcüklerde vurgunun belli bir yeri yoktur (mesela Fransızca gibi). Dolayı sözcükleri öğrenirken vurguyu ve telaffuzu doğru öğrenmek önemlidir. Rusça kelime okunuş vurgu bulunduğu yere bağlı olarak değişebilir. Mesela: золото [zólata] - золотой [zalatóy]

Rusçada sesliler iki gruba ayrılır: sert ve yumuşaktır. 

Sert sesliler: а, о, у, ы, э, ъ
Yumuşak sesliler: я, ё, ю, и, е, ь
Sert sesliler ч ve щ’den sonra olursak, daima yumuşaktır. Aynı Türkçe gibi.

Ö: чашка [çáşka] (fincan), щука [şçúka] (turnabalığı), чаща [çáşça] (çalılık)
Yumuşak sesliler ц, ш ve ж’den sonra olursak, daima serttır

Ö: центр [tsentr] (merkez), шея [şéya] (boyun), жизнь [jızn'] (hayat)

Tonlu sessizler:  б, в, г, д, ж, з
Boğuk sessizler: п, ф, к, т, ш, с
Tonlu ve boğuk harfleri telaffuz ederken diliniz ve damağınız aynı seviyededir, fakat tonlu harfler biraz daha yüksek sesle telaffuz edilir.
Tonlu sessiz harfi sözcüğün sonunda olursa, her zaman boğuk ses söylenir.

Ö: зуб [zup], рог [rok], раз [ras], рожь [roş]
Tonlu sessiz harfinden sonra boğuk sessiz harf varsa, ikisi sessizler boğuktur.

Ö: автобус [aftóbus], ложка [lóşka], легко [lihkó], мягкий [m’ahkiy]
Boğuk sessiz harfinden sonra tonlu sessiz harf varsa, ikisi sessizler tonludur.

Ö: вокзал [vagzál], отговорка [adgavórka] сдача [zdáça]

1. 

a – Türkçe’nin a’ya benzer, bir sadece Rusça sözcüklerde a’ya vurgu düşmese, a zayıf söyleniyor (a, ı’yla karışıktır), bundan ileri çalışmamızda vurgusuz a için [a] verelim.
Ö: самовар [samavár], лодка [lótka], паровоз [paravós]
- eğer a vurgusuzsa, ve ч’den ya da щ’den sonra olursa, [i] okunur
Ö: часы [çisı́], чаша [çáşa], часовой [çisavóy], щадить [şçidi ́t’]
2.

е – е harfi Rusçada her zaman yumuşaktır, fakat yabancı dillerden orijinal olmayan sözlerde sert olabilir
Ö: энергия [enérgiya], энерция [enértsıya], кафе [kafé]
- eğer e harfi vurguluysa, ve sözçüğün başında olursa, [ye] okunur, her vurgusuzsa, ve sözçüğün hecesinde olursa, [yi] okunur
Ö: егерь [yégir’], ель [yel’], есть [yest’], еда [yid`a], ежевика [yijıvi ́ka]
- eğer e vurguluysa, ve sözcüğün içinde ya da sonunda olursa, [’e] okunur, eğer vurgusuzsa, [i] okunur
Ö: белый [b’élıy], зелень [z’élin’], человек [çilav’ék]
- eğer e vurgusuzsa, ve onun ilerinde sert ya da yumuşak sessiz harf varsa, [ye] okunur
Ö: сиденье [sid’én’ye], затмение [zatm’éniye], положение [palajéniye], второе [ftaróye]
3.

ё – sözcüklerde ё tek vurgulu olabilir. Hariç birkaç sözler var
Ö: трёх- [tr’oh-], четырёх- [çitır’oh-] – трёхмерный [tr’ohm’érnıy] – üçboyutlu, четырёхдневный [çitır’ohdn’évnıy] – dört günlü
- [yo] sözcüğün hecesinde hem [’o] sessiz harf sonra varsa okunur
Ö: лёд [l’ot], берёза [bir’óza], ёж [yoş], серьёзный [sir’yóznıy]
4.

и – и’den sonra ъ asla gelmez. (ъи) ikilisi yazılmaz ve okunmaz asla. (ъи) ikilisi (ы) ile değiştirir ve okunur
Ö: сыграть [sıgrát’] – с- играть, взыскание [vzıskániye] – вз- искание, розыск [rózısk] - роз- иск
5.

й – й harfinin telaffuzu Türkçe'deki y gibidir.
6.

o – eğer o vurguluysa, ve sözcüğün hecesinde, içinde ya da sonunda olursa, [o] okunur, eğer vurgusuzsa, [a] ya da [a] (№1’e bak) okunur
Ö: молоко [malakó], здоровье [zdaróv’ye], корова [karóva], молоток [malatók]
7.

р – Türk r’den tersine Rus p daha titrel.
8.

x – Türk h’den tersine Rus x’yi söylediğiniz zaman dilinizin kök ile üste ince baskı yapmanız gerek.
9.

щ – Türk ş'ye benzer, ama daha ıslıklıdır.
10.

ъ – ъ işaretin önce tek boğuk ya da tonlu sessiz olabilir ve onun sonra tek yumuşak sessiz olabilir (и saymadan (№4’ya bak)). ъ işaretin ayrı bir sesi yoktur, bu yüzden Türkçe çeviri yazılarda belirtmek gereksizdir. İleri çalışmamızda ъ göstermek için [.] işareti verilim.
Ö: съезд [s.yest], объём [ab.yóm], изъян [iz.yán], конъюктура [kan.yuktúra]
11.

ь – ь'nın başında tek tonlu ya da boğuk sessiz olabilir ve ь işareti onları yumuşatıyor. ь kullanan sistemi Türk y'ye benzer. ь işaretin ayrı sesi yok, bu yüzden Türkçe çeviri yazılarda onu söylemek gereksizdir. İleri çalışmamızda ь göstermek için ['] işareti verilim.
Ö: стержень [st'érjın'], боль [bol'], зелье [zél'ye], Анталья [antál'ya]
12.

я – eğer я ilerinde sert ya da yumuşak vurgulu sessiz varsa, [yi] okunur
Ö: пояс [póyis], заяц [záyits], маятник [máyitnik]
- eğer я harfi sözcüğün başında durursa ve vurgulu olursa, [ya] okunur, eğer vurgusuz olursa, [yi] okunur
Ö: яйцо [yiytsó], ямщик [yámşik], якорь [yákar’], ябеда [yábida]

ё harfi Rus kitaplarda, gazetlerde ve diğerlerde genellikte е yazılır, fakat ё (yani [yo] ya da [’o]) okunur.
Rus sözcüklerin başında ы, ъ ve ь asla olmaz.
Rus sözcüklerin sonunda ъ asla olmaz.

Rusça'da sayılar 2 gruba ayrılır:

1. Единственное число [yidi ́nstvinaye çisló] – Tekil sayı
2. Множественное число [mnójıstvinnaye çisló] – Çoğul sayı
Ö: рука - руки [ruká - rúki] (el - eller), дом - дома [dom - domá] (ev - evler), дерево - деревья [d'ériva - dirév'ya] (ağaç - ağaçlar), год - года [god - godá] (yıl - yıllar)
Rusça'da tekil olup, çoğul yazılan sayılı bazı sözcükler vardır. Çoğul yapılmazlar.
Ö: очки [açki ́] (gözlük), часы [çisı́] (saat (şey)), брюки [br'úki] (pantolon)

Rusçanın cinslerde özel ve zor fonksyon var. Rus cinsli sözcükleri doğru ayrılmak için Rusça konuşma pratik çekmek zorundasınız.
Rus cinsler 3 gruba ayrılır:

1. Мужской род [muşskóy rot] - Erkek cinsi
2. Женский род [jénskiy rot] - Bayan cinsi
3. Средний род [sr’édniy rot] - Orta cinsi
Ö: Дима читает книгу [di ́ma çitáyit kni ́gu] (Dima kitap okuyor).
Дима (Dima) bir Rus erkek ismidir, bu yüzden Дима her zaman erkek cinsi olur. Книга (kitap) varlık ismi bayan cinstir.
Маша принесла цветок [Máşa prinislá tsvitók] (Maşa çiçeği getirmiş).
Маша (Maşa) bir Rus bayan ismidir, bu yüzden Маша her zaman bayan cinsi olur. Принесла (getirmiş) geçmiş zaman bayan cins fiili. Маша kelimenin kombinasyona göre принесла kelimesi aynı bayan cins olur. (Unutmayın: Rus gramer kurallara göre geçmiş zaman fiili cinsli olur, buna göre sözün ayrı sonek var. Mesela принесла sözünde "ла" soneki geçmiş zaman bayan cins demelidir.) Цветок (çiçek) erkek cins varlık ismidir.
Когда взошло солнце, Дима с Машей пошли на улицу гулять [Kagdá vzaşló sólntse Di ́ma s Máşey paşli ́ na úlitsu gul'át'] (Güneş çıktı zaman Dima Maşa ile dolaşmak için dışarı çıktılar). Солнце (güneş) varlık ismi orta cinsi. Взошло (çıktı) geçmiş zaman orta cins fiili. Солнце kelimenin kombinasyona göre взошло kelimesi aynı orta cins olur.
Bazı durumlarda bile 2 gruplar da olabilir

4. Общий род [ópşiy rot] - Genel cinsi
5. Обоюдный род [abayúdnıy rot] - İkili cinsi

Rusçada zaman 2 gruba ayrılır:

1. Абсолютное время [apsal'útnaye vr'ém'a] - Mutlak zamanı
2. Относительное время [atnasi ́til'naye vr'ém'a] - Göreli zamanı

1. Настоящее время [nastayáşiye vr'ém'a] - Şu anki zamanı
2. Прошедшее время [praşétşıye vr'em'a] - Geçmiş zamanı
3. Будущее время [búduşiye vr'ém'a] - Gelecek zamanı
Şu anki zamanı:
Ö: Мы работаем на заводе [mı rabótayim na zavódi] - Fabrikada çalışıyoruz; Я нахожусь в Москве [ya nahajús' v maskv'é] - Ben Moskova'da bulunuyorum
Geçmiş zamanı:
Ö: Он раньше жил в России [on rán'şı jıl v rasi ́yi] - O önce Rusya'da yaşamış.
Gelecek zamanı:
Ö: Мы поедем отдыхать в Анталью [mı payédim addıhát' v antál'yu] - Antalya'ya dinlenmek için gideceğiz

1. Предшествование [pritşéstvavaniye] - Öncelik
2. Одновременность [adnavrim'énnast'] - Eşzamanlılık
3. Следование [stl'édavaniye] - Yapışma
Öncelik:
Ö: Наигравшись, дети пошли спать [nayigráfşıs', d'éti paşli ́ spat'] - Oyun bittikten sonra, çocuklar uyumak gitmişler.
Eşzamanlılık:
Ö: Мы шли по лесу, напевая песню [mı şli pa l'ésu, napiváya p'ésn'u] - Ormana dolaştık, şarkı söyleyip

Rusça'da söz bölükler 2 gruba ayrılır.

1. Самостоятельные части речи [samastayátil'nıye çásti r'éçi] - Bağımsız söz bölükleri
2. Служебные части речи [slujébnıye çásti r'éçi] - Servis söz bölükleri
Bağımsız söz bölükleri:
1. Имя существительное [i ́m’a suşçistvi ́til’naye] – Varlık ismi
2. Имя прилагательное [i ́m’a prilagátil’naye] – Sıfat ismi
3. Глагол [glagól] – Fiil.
4. Имя числительное [i ́m’a çisli ́til’naye] – Sayı sıfat ismi
5. Местоимение [mistayim'éniye] - Zamir
6. Наречие [nar'éçiye] - Belirteç
7. Предикатив [pridikati ́f] - Predikatif
8. Причастие [priçástiye] - Komünyon
9. Деепричастие [diyipriçástiye] - Ortaç
Servis söz bölükleri:
1. Предлог [pridlók] - Öntakı
2. Союз [sayús] - Bağlaç
3. Частица [çisti ́tsa] - Parça
4. Междометие [mijdam'étiye] - Ünlem
5. Вводное слово [vvadnóye slóva] - Söztakı

Her bir ismi kendi sorulara cevap veriyor:
1. Varlık ismi: 

(кто?) [kto] - kim?;
(что?) [şto] - nedir?
Ö:
кто? (kim?) - человек [çelav'ék] (insan), мужчина [muşi ́na] (erkek), Мехмет [mihm'ét] (Mehmet), Сергей [sirg'éy] (Sergey), Ясемин [yasimi ́n] (Yasemin);
что? (nedir?) - дерево [d'ériva] (ağaç), компьютер [kamp'yúter] (bilgisayar), школа [şkóla] (okul)
2. Sıfat ismi: 

(какой?) [kakóy] – nasıl? hangi? (biricik sayının erkek cins sorusu)
(какая?) [kakáya] – nasıl? hangi? (biricik sayının bayan cins sorusu)
(какое?) [kakóye] – nasıl? hangi? (biricik sayının orta cins sorusu)
(какие?) [kaki ́ye] – nasıl? hangi? (çoğul sayı sorusu)
Ö:
какой цвет? - синий [kakóy tsv'et - si ́niy] (hangi rengi? - mavi); какой человек? - умный [kakóy çilav'ek - úmnıy] (nasıl insan? - hakıllı) (biricik sayının erkek cins örneği)
какая погода? - хорошая [kakáya pagóda - haróşaya] (hava nasıl? - iyi); какая девушка?  - красивая [kakáya d'évuşka - krasi ́vaya] (nasıl kız? - güzel) (biricik sayının bayan cins örneği)
какое настроение? - хорошее [kakóye nastrayéniye - har`óşıye] (keyfi nasıl? - iyi); какое число? - двадцать первое [kakóye çisló - dvátsat' p'érvaye] (hangi sayı - yirmi birinci) (biricik sayının orta cins örneği)
какие сапоги? - резиновые [kaki ́ye sapagi ́ - rizi ́navıye] (nasıl çizme? - lastik); какие девушки? - красивые [kaki ́ye d'évuşki - kras`i ́vıye] (nasıl kızlar - güzel) (çoğul sayı örneği)
3. Fiil:

что делает? [şto d'élayit] - ne yapıyor?
что сделает? [şto zd'élayit] - ne yapacak?
что делают? [şto d'élayut] - ne yapıyorlar?
что сделают? [şto zd'élayut] - ne yapacaklar?
Ö:
что делает? - играет [şto d'élayit - igráyit] (ne yapıyor? - oynuyor)
что сделает? - сыграет [şto zd'élayit - sıgráyit] (ne yapacak? - oynayacak)
что делают? - играют [şto d'élayut - igráyut] (ne yapıyorlar? - oynuyorlar)
что сделают? - сыграют [şto zd'élayut - sıgráyut] (ne yapacaklar? - oynayacaklar)
4. Sayı sıfat ismi: 

который? [katórıy] - kaçıncı? kaç?
сколько? [skól'ka] - ne kadar? kaç?
Ö:
Который день идёт праздник? - Седьмой [katórıy d'en' id'ót práznik - sid'móy] (Bayramın kaç gün oldu? - Yedi)
Сколько время? - Пять часов [skól'ka vr'ém'a - p'at' çisóf] (Saat kaç? - Beş saat)

Rusça belirteçte ayrı özel söz var ve hiç diğer sözlere eğik değildir.
Rusça belirteçler 2 gruba ayrılır:

1. Обстоятельственные наречия [apstayátil'stvinıye nar'éçiya] - Durum belirteç
2. Определительные наречия [apridili ́til'nıye nar'éçiya] - Tanım belirteç

Rusçada zamir 9 gruba ayrılır:

1. Личные [li ́çnıye] - kişi zamir
2. Возвратные [vazvrátnıye] - iade zamir
3. Притяжательные [pritijátil'nıye] - bağ zamir
4. Вопросительные [vaprasi ́til'nıye] - soru zamir
5. Относительные [atnasi ́til'nıye] - göreli zamir
6. Указательные [ukazátil'nıye] - işaret zamir
7. Определительные [apridili ́til'nıye] - belir zamir
8. Отрицательные [atritsátil'nıye] - negatif zamir
9. Неопределённые [niapridil'ónıye] - tanımsız zamir
Kişi zamir:

İade zamir:

Soru zamir:

Göreli zamir:
Aynı soru zamir gibi, fakat baş fıkraya ast fıkrayı bağlanır.

İşaret zamir:

Belir zamir:

Negatif zamir:

Tanımsız zamir:
некто [n'ékta] (kimse, biri)
нечто [n'éçta] (bir şey)
некий [n'ékiy] (bir)
некоторый [n'ékatarıy] (bazı)
Soru zamir кое- [kóyi] öntakı ile ya da -то [-ta], -либо [liba], -нибудь [-nibut']: кое-кто [kóyi-któ], где-то [gd'é-ta], кому-либо [kamú-liba], что-нибудь [ştó-nibut'] sonekler ile.

Мужской род имён существительных [muşskóy rot im’ón suşçistvi ́til’nıh] – Varlık isimlerin erkek cinsi:
Ö: круг [kruk] – çevre, снег [sn’ek] – kar, день [d’en’] – gün
Женский род имён существительных [jénskiy rot im’ón suşçistvi ́til’nıh] – Varlık isimlerin bayan cinsi:
Ö: зима [zimá] – kış, дорога [daróga] – yol, метель [mit’él’] – tipi, ночь [noç’] – gece   
Средний род имён существительных [sr’édniy rot im’ón suşçistvi ́til’nıh] – Varlık isimlerin orta cinsi:
Ö: лето [l’éta] – yaz, небо [n’éba] – hava, стекло [stikló] – cam, окно [aknó] - pencere
Мужской род имён прилагательных [muşskóy rot im’ón prilagátil’nıh] – Sıfat isimlerin erkek cinsi:
Ö: сильный [si ́l’nıy] – güçlü, закрытый [zakrı́tıy] – kapalı, белый [b’élıy] – beyaz, красный [krásnıy] – kırmızı 
Женский род имён прилагательных  [jénskiy rot im’ón prilagátil’nıh] - Sıfat isimlerin bayan cinsi:
Ö: сильная [si ́l’naya] – güçlü, закрытая [zakrı́taya] – kapalı, белая [b’élaya] – beyaz, красная [krásnaya] – kırmızı
Средний род имён прилагательных [sr’édniy rot im’ón prilagátil’nıh] – Sıfat isimlerin orta cinsi:
Ö: сильное [si ́l’naye] – güçlü, закрытое [zakrı́taye] – kapalı, белое [b’élaye] – beyaz, красное [krásnaye] – kırmızı
Мужской род имён числительных [muşskóy rot im’ón çisliti ́l’nıh] - Sayı sıfat isimlerin erkek cinsi:
Ö: один [adi ́n] – bir, первый [p’érvıy] – birinci, седьмой [sid’móy] – yedinci
Женский род имён числительных [jénskiy rot im’ón çisli ́til’nıh] - Sayı sıfat isimlerin bayan cinsi:
Ö: одна [adná] – bir, первая [p’érvaya] – birinci, седьмая [sid’máya] – yedinci
Средний род имён числительных [sr’édniy rot im’on çi ́slitil’nıh] - Sayı sıfat isimlerin orta cinsi:
Ö: одно [adnó] – bir, первое [p’érvaye] – birinci, седьмое [sid’móye] – yedinci

Мужской род имён существительных [muşsk`óy rot im`’ón suşçistv`i ́til’nıh] – Varlık isimlerin erkek cinsi:
Ö: круги [krugi ́] – çevreler, снега [snigá] – karlar, дни [dni] – günler
Женский род имён существительных [j`énskiy rot im`’ón suşçistv`i ́til’nıh] – Varlık isimlerin bayan cinsi:
Ö: палки [pálki] – tahtalar, дороги [darógi] – yollar, метели [mit’éli] – tipiler, ночи [n`óçi] – geceler 
Средний род имён существительных [sr’édniy rot im’ón suşçistvi ́til’nıh] – Varlık isimlerin orta cinsi:
Ö: небеса [nibisá] – havalar, стёкла [st’ókla] – camlar, окна [ókna]
- pencereler
Çoğul sayı sözlerin için sıfat isimler cinsleri yoktur.

Rusçada hali 11 gruba ayrılır:
Temel hali:

Именительный [imini ́til'nıy] - Yalın
Родительный [radi ́til'nıy] - -in hali
Дательный [dátil'nıy] - Datif
Винительный [vini ́til'nıy] - Akuzatif
Творительный [tvari ́til'nıy] - Enstrümental
Предложный [pridlójnıy] - Prepozitif
Ek hali:

Звательный [zvátil'nıy] - Vokatif
Количественно-определительный [kali ́çistvina-apridili ́til'nıy] - Par

İlkönce SDL ana sayfasını açın. http://www.libsdl.org
Daha sonra Download -> SDL 1.2 bağlantısına tıklayın.

Development Libraries (Geliştirme Kütüphaneleri) -> Win32 altında SDL-devel VC6 paketinin son sürümünü indireceksiniz.

Bunu yapmadan önce C:\ dizininde SDL (ya da başka isimli) yeni bir klasör oluşturun. SDL'in DLL ve kütüphane dosyalarını bu dizinde saklayacağız. Sıkıştırılmış dosyayı bu dizine kaydedin.

Zip dosyasını açın. İndirdiğiniz SDL sürümünü gösteren bir klasör oluşturacak. Eğer bu klasörü açarsanız şuna benzer birşeyler görmelisiniz:

Visual Studio NET'i başlatın. Daha sonra Tools-> Options'ı tıklayın. Daha sonra Projects tabına tıklayıp VC++ Directories'ı seçin. Üstteki açılır menüden "Include Files" ı seçin ve klasör işaretine benzeyen düğmeye basarak C:\SDL\SDL-1.2.9\include dizinini bu listeye ekleyin.

Yukardaki açılır menüden bu sefer "Library Files" ı seçin. Daha sonra bu listeye de aynı şekilde C:\SDL\SDL-1.2.9\lib dizini ekleyin.
Artık işlemimiz tamam. Bu şekilde derleyici artık SDL başlık ve kütüphane dosyaları için hangi dizine bakması gerektiğini biliyor. Bu şekilde ayarları global olarak ayarladık ve bu ayarlar oluşturduğumuz her proje için varsayılan olacak.

File (Dosya) -> New Project (Yeni Proje) menüsünü izleyerek yeni bir proje oluşturuyoruz. Visual C++ Projects klasörünü seçip proje türü olarak Win32 Project seçiyoruz. Proje ismini ve nereye kaydedeceğimizi seçtikten sonra OK (Tamam)'a tıklıyoruz.

Application Settings (Uygulama Seçenekleri) kısmından Additional Options (Ek Seçenekler) seçip uygulama türünü Console Application ve Empty Project (Boş Proje) olarak belirliyoruz.

Solution Explorer'ı açıp proje isminin üzerindeyken sağ tıklayıp Add->Add New Item 'ı seçiyoruz.

Daha sonra bir C++ kaynak dosyası ekliyoruz.

Solution Explorer'ı açıp proje isminin üzerine geliyoruz. Buradan sağ tıklayarak Properties (Özellikleri) seçiyoruz.

C/C++ tabı altında solda Code Generation kısmını seçip sağda Runtime Library açılır menüsünden Multi-Threaded DLL veya eğer hata ayıklama özelliğini kullanacaksak Multi-Threaded Debug DLL seçiyoruz.

Şimdi test etmek için boş bir OPENGL penceresi oluşturan bu kodu kopyala-yapıştır yöntemiyle oluşturduğunuz C++ kaynak dosyasına yapıştırın.
Yalnız bu kod Linux altında yazıldığı için ufak-tefek değişiklikler yapmanız gerekecek.

#include <windows.h> ile en başa windows başlık dosyasını ekliyoruz
#include "SDL/SDL.h" 'ı #include <SDL.h> olarak değiştiriyoruz
#include satırlarının hemen altına şunları ekliyoruz:
 #pragma comment(lib, "opengl32.lib") 
 #pragma comment(lib, "glu32.lib") 
 #pragma comment(lib, "sdl.lib") 
 #pragma comment(lib, "sdlmain.lib") 
 

int main () işlevini int main(int argc, char *argv[]) olarak değiştiriyoruz.
Daha sonra projeyi oluşturmak için Build menüsünden Build Solution'ı tıklıyoruz. (Kısayol tuşu F7)

Eğer bir eksiklik yapmadıysanız sorunsuz olarak projeniz derlenmiş olmalı.
Oluşturduğumuz programı çalıştırmak için iki yöntemimiz var. Ya her seferinde SDL.dll dosyasını programımızın olduğu dizindeki Debug klasörüne atmak ya da windows'un tarafından erişilebilen PATH dizinlerinden birine atmak.

En kolayı 98/ME altında SDL.DLL dosyasını bir kere C:\Windows\System 2000/XP altında C:\WINDOWS\system32 dizinine atarak her seferinde SDL.DLL'yi oluşturduğumuz projenin debug dizinine atmaktan kurtulabiliriz..

SQL(Yapısal Sorgulama Dili), ilişkisel veritabanlarında veri oluşturmak, silmek, değiştirmek ve almak için geliştirilmiş olan bir dildir.
SQL bildirimsel bir programlama dilidir, yani SQL'de sadece ne yapılması istendiğini ifade ederiz, nasıl yapılacağını ifade etmeyiz. Bu yönüyle bazen prosedürel olmayan diller sınıfına da dahil edilir. Biz sadece şu tablodan şu ve şu bilgileri oku deriz, bunun nasıl yapılacağını kodla belirtmeyiz.
SQL komutları ve ifadeleri genelde aşağıdaki gibi gruplandırılmaktadır:

Data Query Language (DQL)- Veri sorgulama dili
SELECT - bir veya daha fazla tablodan belli kayıtları okumak için kullanılır.
Örnek:
SELECT * FROM ogrenciler_tablosu WHERE yas > 10;
yaşı 10 dan büyük olan öğrencileri seçer.
Data Manipulation Language (DML)- Veri İşleme Dili
INSERT - Kayıt oluşturmak için kullanılır.
Örnek:
INSERT INTO ogrenciler_tablosu (ad,soyad) VALUES ('Ali','Doğan') ;
ogrenciler_tablosuna adı Ali soyadı Doğan olan öğrenci ekler.
UPDATE - Belli kayıtları güncellemek için kullanılır.
Örnek:
UPDATE ogrenciler_tablosu SET sinif= '4D' WHERE (yas=10) ;
ogrenciler_tablosuda 10 yaşında olan öğrencileri sınıfını 4D olarak değiştirir.
DELETE - Belli kayıtları silmek için kullanılır.
Örnek:
DELETE FROM ogrenciler_tablosu WHERE (ad= 'Ali') ;
ogrenciler_tablosuda adı Ali olan öğrencileri siler.
Data Definition Language (DDL) - Veri Tanımlama Dili
CREATE - Yeni bir veri tabanı, tablo, görünüm veya başka bir veri tabanı nesnesi oluşturmak için kullanılır.
ALTER - Mevcut veri tabanı nesnelerinden örneğin bir tabloyu yapısal olarak değiştirmek için kullanılır.
DROP - Mevcut veri tabanı nesnelerinden (tablo, görünüm vs.) birini silmek için kullanılır.
Data Control Language (DCL)- Veri Kontrol Dili
GRANT - Kullanıcılardan birisine yetki/ayrıcalık vermek için kullanılır.
REVOKE - Kullanıcıların yetki ve ayrıcalıklarını geri almak için kullanılır.
SELECT, INSERT, UPDATE, DELETE gibi temel bazı komutların yanı sıra kullanılan veri tabanına göre kullanımı ya da parametreleri de değişen farklı ek komutlar da vardır, EXECUTE, TRUNCATE vb ...

SELECT sorgularının tüm seçenekleriyle birlikte yazılımı aşağıdaki gibidir:

Şimdi toplanti isimli tabloyu oluşturalım:

...bilgileri girelim:

Yukarıda oluşturduğumuz tablodaki verileri listeleyen ilk sorgumuzu yazalım :

Sorgu:

Sonuç:
|-----------------------------------------------------------------------------------------------------------------------------------------------------------|
|kod        |isim         |aciklama                                         |oncelik  |planlandi |tarih      |saat     |sure     |ofisno    |pdf_raporu     |
|-----------|-------------|-------------------------------------------------|---------|----------|-----------|---------|---------|----------|---------------|
|1          |Planlama     |Proje planı hazırlanmalı..                       |A        |1         |2008-03-24 |10:30:00 |60       |35        |48644...846348 |
|2          |İlerleme     |Neler yaptık?                                    |C        |1         |2008-05-12 |14:00:00 |30       |13        |9862...15676   |
|3          |Değişim      |Projede neler değiştirilmeli?                    |B        |1         |2008-06-03 |9:30:00  |90       |41        |34876...4846548|
|4          |Sunum        |Proje Sunumu                                     |D        |0         |2008-09-11 |15:30:00 |120      |27        |NULL           |
|5          |Raporlama    |Projeye sonradan katılanlara yönelik açıklamalar |B        |1         |2009-03-15 |14:00:00 |60       |7         |19739...37718  |
|6          |Öğrenme      |Yeni yazılım yüklendi.                           |B        |1         |2009-09-21 |16:00:00 |120      |11        |785278...37528 |
|-----------------------------------------------------------------------------------------------------------------------------------------------------------|

Sonucun göründüğü biçim, istemci uygulamaya göre değişiklik gösterebilir. Bazılarında sadece metin olarak görünürken, bazılarında HTML veya başka bir uygulama nesnesi olarak görünebilir. SQL komutları ve ifadelerinin (SELECT, FROM vs.) büyük ya da küçük harfle yazılması önemli değildir. Genelde okunurluğunu artırmak için büyük harflerle yazılmaktadır.
SELECT ve FROM ifadeleri bir SELECT sorgusu için gerekli olan ifadelerdir:

FROM : sorgunun veriyi getireceği tabloların listesi,
SELECT : gelen verilerin listelenmesini sağlar.

WHERE bir sorguda hangi kayıtların (satır) döneceği üzerinde etkisi vardır. Kayıtları filtreleme imkanı sağlayan bir şart ifadesinin yazılmasını sağlar. WHERE ifadesinden sonra sağlanan şart doğru veya yanlış olabilir. Bazı durumlarda bu şartlar bilinmeyen (NULL) sonuç üretebilir, SQL bu tür durumlarda da problemsiz çalışır. 
Aşağıdaki örnekte öncelik seviyesi B olan toplantıları listeler:

Sorgu:

Sonuç:
|----------------------------------------------------------------------------------------------------------------------------------------------------|
|kod        |isim         |aciklama                                                 |oncelik  |planlandi |tarih       |saat     |sure     |ofisno |pdf_raporu         |
|-----------|-------------|---------------------------------------------------------|---------|--------|-----------|---------|---------|----------|----------------|
|3          |Değişim      |Projede neler değiştirilmeli?                            |B        |1       |2008-06-03 |9:30:00  |90       |41        |34876...4846548 |
|5          |Raporlama    |Projeye sonradan katılanlara yönelik açıklamalar         |B        |1       |2009-03-15 |14:00:00 |60       |7         |19739...37718   |
|6          |Öğrenme      |Yeni yazılım yüklendi.                                   |B        |1       |2009-09-21 |16:00:00 |120      |11        |785278...37528  |
|----------------------------------------------------------------------------------------------------------------------------------------------------------------|

Tek bir tablodan veri alınırken tablo ismi yazılmayabilir.

Karşılaştırılan değerlerden birincisi ikincisine :

eşit olabilir: =
farklı olabilir: <>
küçük olabilir: <
küçük veya eşit olabilir : <=
büyük olabilir: >
büyük veya eşit olabilir: >=
Aşağıdaki sorgu toplanti tablosundaki toplantılardan öncelik seviyesi B olmayanları listeler:

Sorgu:

Sonuç:
|----------------------------------------------------------------------------------------------------------------------------------------------------|
|kod        |isim         |aciklama                                   |oncelik  |planlandi |tarih      |saat     |sure     |ofisno    |pdf_reporu      |
|-----------|-------------|-------------------------------------------|---------|----------|-----------|---------|---------|----------|----------------|
|1          |Planlama     |Proje planı hazırlanmalı..                 |A        |1       |2008-03-24 |10:30:00 |60       |35        |48644...846348  |
|2          |İlerleme     |Neler yaptık?                              |C        |1       |2008-05-12 |14:00:00 |30       |13        |9862...15676    |
|4          |Sunum        |Proje Sunumu                               |D        |0       |2008-09-11 |15:30:00 |120      |27        |NULL            |
|----------------------------------------------------------------------------------------------------------------------------------------------------|

WHERE clause can have several conditions using the operators AND (bütün şartlar doğru olmalıdır) and OR (sadece bir şartın doğru olması yeterlidir).  The operator OR is inclusive (birden fazla şart doğru olabilir).  The order of evaluation can be indicated with brackets.  NOT inverts a condition.  The following query returns the reunions which have a B priority level and last more than an hour or which take place on 2008/05/12:

Query:

Result:
|----------------------------------------------------------------------------------------------------------------------------------------------------|
|id_reunion |name         |description                                |priority |planned |date       |hour     |duration |id_office |pdf_report      |
|-----------|-------------|-------------------------------------------|---------|--------|-----------|---------|---------|----------|----------------|
|2          |Progress     |What we have done.                         |C        |1       |2008-05-12 |14:00:00 |30       |13        |9862...15676    |
|3          |Change       |What we need to change in the project.     |B        |1       |2008-06-03 |9:30:00  |90       |41        |34876...4846548 |
|6          |Learning     |A new software version has been installed. |B        |1       |2009-09-21 |16:00:00 |120      |11        |785278...37528  |
|----------------------------------------------------------------------------------------------------------------------------------------------------|

LIKE allows simplified regular expression matching.  It can be applied on the text columns (CHAR, VARCHAR,...).

Alphanumerical characters only match identical text,
% is a wildcard that matches any text,
_ is a wildcard that matches any single character,
The following query returns the reunions which end with "ing" and which contain " the " in its description:

Query:

Result:
|----------------------------------------------------------------------------------------------------------------------------------------------------|
|id_reunion |name         |description                                |priority |planned |date       |hour     |duration |id_office |pdf_report      |
|-----------|-------------|-------------------------------------------|---------|--------|-----------|---------|---------|----------|----------------|
|1          |Planning     |We need to plan the project.               |A        |1       |2008-03-24 |10:30:00 |60       |35        |48644...846348  |
|5          |Reporting    |Explanation to the new beginner.           |B        |1       |2009-03-15 |14:00:00 |60       |7         |19739...37718   |
|----------------------------------------------------------------------------------------------------------------------------------------------------|

BETWEEN matches a range of values that can be numbers, dates or times.  IN matches a list of allowed values.  The following query returns the reunions which take place between 2008-04-01 and 2009-04-01 and have an A, B or D priority level:

Query:

Result:
|----------------------------------------------------------------------------------------------------------------------------------------------------|
|id_reunion |name         |description                                |priority |planned |date       |hour     |duration |id_office |pdf_report      |
|-----------|-------------|-------------------------------------------|---------|--------|-----------|---------|---------|----------|----------------|
|3          |Change       |What we need to change in the project.     |B        |1       |2008-06-03 |9:30:00  |90       |41        |34876...4846548 |
|4          |Presentation |Presentation of the project.               |D        |0       |2008-09-11 |15:30:00 |120      |27        |NULL            |
|5          |Reporting    |Explanation to the new beginner.           |B        |1       |2009-03-15 |14:00:00 |60       |7         |19739...37718   |
|----------------------------------------------------------------------------------------------------------------------------------------------------|

EXISTS is usually used with a subselect.  This predicate is true if the list (i.e. the result set of a subselect) is not empty.  This keyword allows to filter the returned rows using data that are not directly associated to the returned rows (i.e. they are not joined, not linked, not related... to the returned rows) so you can not use junction in this case.  For instance, we want to retrieve all the reunions for which there is at least one reunion two times longer:

Query:

Result:
|----------------------------------------------------------------------------------

Salarca, Çin'in başta Qinghai ve Gansu eyaletlerinde, ve Sincan Uygur Özerk bölgesinde Ili'de, Salar olarak bilinen halkın konuştuğu Oğuz kökenli dildir. Bir Oğuz boyu olan Salarlar, Oğuzların en doğu kolu kabul edilir. (Ölmez, 2009).
Bu online kitapta Türkçe kaynakların yetersizliği sebep gösterilerek Çince, Rusça ve İngilizce kaynak kitaplardan Salarca grameri öğretmek amaçlanmıştır. Alıntılanan bilgi ve metin APA formatında kaynakçaya eklenecektir.

Salarca/Selamlama
Salarca/Kişi zamirleri
Salarca/İsmin halleri
Salarca/Şimdiki zaman (Dolaylı ve Dolaysız Şimdiki Zaman)
Salarca/Gelecek zaman (Dolaylı ve Dolaysız Gelecek Zaman)
Salarca/Geçmiş zaman (Dolaylı ve Dolaysız Geçmiş Zaman)
Salarca/Geniş zaman
Salarca/-ebilirlik
Salarca/İstek ve emir kipi
Salarca/İsim-fiiller
Salarca/Sıfat-fiiller
Salarca/Zarf-fiiller
Salarca/Etken ve edilgen
Salarca/Geçişli ve geçişsiz
Salarca/Dönüşlü ve işteş

Ölmez, M. (2009). Oğuzların en doğudaki kolu: Salırlar ve dilleri. IV. Uluslararası Büyük Türk Dili Kurultayı Bildiri Kitabı, 436-438.
Thomsen, Kaare (1985). Sarı Uygurların Dili ve Salarca. Türk Dili Araştırmaları Yıllığı - Belleten, 33, 191-197.

Salarcada yetenek bildiren yapım eki, Türkçeden farklı olmakla birlikte zamana göre de farklılık gösterebilir.
1.	-AlAr: Geniş zamanda yetenek ve beceri bildirmek içindir. Olumsuzu -AlmAs şeklindedir.
	•	Gaşqan atnı tutalar, yişığan sözni yixalmas. → Kaçan atı tutabilirsin, ama söylediğin sözü geri alamazsın. (Ayso, 2008: s. 55; Ma Chengjun, 2010: s. 345)
Burada kişinin başarıp başaramayacağı durumlardan bahsedilmiş ve hem olumlu hem de olumsuz cümle örneğini tek cümlede vermiştir.
2. -Albır (doğrudan) ve -Alba(r) (dolaylı): Şimdiki zamanda yetenek ve beceri bildirmek içindir. Olumsuzu; doğrudan deneyimde fiilin yalın haline yoqdır takısı eklenerek, dolaylı deneyimde -Almır ile sağlanır.
	•	U yumaq oynalba(r). Men yumaq oynal yoqdır. → O top oynayabiliyor. Ben top oynayamıyorum. (Lin Lianyun, 1985: s. 70).
	Kişi, onun top oynayabildiği kanısına varmıştır. Ancak kendisinin oynayamadığından emindir.
	•	Men varalmır. → Ben gidemiyorum. (Ma Wei, 2016: s. 55).
	Kişi, daha önce gitmeye çalışmamıştır, emin değildir ama dolaylı olarak bu kanıya varmıştır.
Kalın ünlü bazen dar okunur:
	•	Bixi teğü men çıxılmır. → Yüksek basamakları ben çıkamıyorum. (Lin Lianyun, 1985: s. 70).
	Kişi çıkmayı daha önce deneyimlememiştir ama çıkamayacağını farkındadır.
	3.	-AlcI ve -AlmIş: Geçmiş zamanda yetenek ve beceri bildirmek içindir. Olumsuzluk fiile gelen -mA- eki ile sağlanır.
	•	Men varalcı. → Gidebildim. (Ma Wei, 2016: s. 55).
	•	Men varalmacı. → gidemedim. (Ma Wei, 2016: s. 55).
	•	Men varalmış. → Gidebilmişim.
	•	Men varalmamış. → Gidememişim.
	4.	-AlgUr ve -AlgA(r): Gelecek zamanda yetenek ve beceri bildirmek içindir. Olumsuzluk fiile gelen -mA- eki ile sağlanır.
	•	Ette u gelalmağa(r). → Yarın o gelemeyecekmiş. (Lin Lianyun, 1985: s. 70).
Kişi, kişinin gelemeyeceğini dolaylı olarak öğrenmiştir. Doğrudan gelemeyecek kişiden duymamıştır.
(Lin Lianyun, 1985: 70; Ma Wei, 2016: s. 55).

张, 进锋 (Ayso Cañ Cinfen) (2008) 乌璐别格 (Ulubeğ), 鄭初陽 (Çuyañ Yebey oğlı Ceñ), editors, Salar İbret Sözler 撒拉尔谚语 [Salar Atasözleri]‎, China Salar Youth League.
Dwyer, Arienne M. (1998). The Turkic strata of Salar: An Oghuz in Chaghatay clothes? Turkic Languages 2: 49-83. (İngilizce).
Dwyer, Arienne M. (2007). Salar: A study in Inner Asian language contact processes. Part I: Phonology. Turcologica 37, 1. Wiesbaden: Harrassowitz Verlag. (İngilizce).
Kakuk, S. (1962). “Un Vocabulaire Salar.” Acta Orientalia Academiae Scientiarum Hungaricae 14, no. 2: 173–96. (Fransızca).
林莲云 [Lin Lianyun] (1985). 撒拉语简志 [A Brief History of Salar]‎, Beijing: 民族出版社: 琴書店. (Çince).
Ma, Chengjun, Han, Lianye, Ma, Weisheng (December 2010) “nang”, in 米娜瓦尔 艾比布拉 (Minavar Abibra), editor, 撒维汉词典 (Sāwéihàncídiǎn) [Salar-Uyghur-Chinese dictionary] (in Chinese), 1st edition, Beijing.
Ma, W. (2014). 中国少数民族语言会话读本: 撒拉语——366句会话句 [Conversational Textbook of Chinese Minority Languages: Salar Language – 366 Conversational Sentences]. 社会科学文献出版社 [Social Sciences Academic Press].
Ma, W. (2016). 国家社会科学基金项目: 濒危语言——撒拉语研究 [National Social Science Fund Project: Research on the Endangered Language – Salar].
Potanin, G.N. (1893). Тангутско-Тибетская окраина Китая и Центральная Монголия (Rusça).
Tenişev, Edhem (1976). Stroj salárskovo jazyká [Salar Grameri], Moskova. (Rusça).
Yakup, Abdurishid. (2002). An Ili Salar Vocabulary: Introduction and a Provisional Salar-English Lexicon‎, Tokyo: University of Tokyo.

Salarca tıpkı diğer zaman kiplerinde olduğu gibi gelecek zamanda da, doğrudan ve dolaylı olmak üzere kiplere ayrılır. Ancak şimdiki zaman kiplerinin aksine gelecek zamanda ünlü uyumu barındırır. (Ma Wei, 2014: s. 20; Ma Wei, 2016: s. 115-116).
	1.	-GUr: Doğrudan gözlemlenecek ya da tecrübe edilecek eylemler içindir. Olumsuzluk fiile gelen -mA- eki ile sağlanır.
	•	Men oxağur. → Ben okuyacağım.
	Kişi gelecekte okuma eylemini yaparken doğrudan eylemi gerçekleştiren olacaktır.
	•	Sen neçe keliğür i? → Sana ne kadar gerekecek? (Ma Wei, 2016: s. 52).
	Kişi, ihtiyaç miktarı bilgisine doğrudan sahip olduğundan ötürü soru bu şekilde sorulmuştur.
	•	Sen nañ vaqqur i? → Ne izleyeceksin? (Ma Wei, 2016: s. 52).
	Kişi izleyeceği şeyi kendi belirlemiştir. Doğrudan muhattaptır.
	2.	-GA(r): Dolaylı bir gözlemden elde edilecek bilgi içindir. Olumsuzluk fiile gelen -mA- eki ile sağlanır.
	•	Kişçük gaşqa. → Adam kaçacak(mış). (Ma Wei, 2016: s. 52).
	Kişi adamın kaçacağını biliyordur ancak kaçma eylemini gerçekleştirirken yanında bulunmayacaktır ve bu bilgiye dolaylı olarak ulaşmış olabilir.
	•	Selere yol başlağucı keleğer o? → Size bir tur rehberi gerekecek mi(ymiş)? (Ma Wei, 2014: s. 100).
	Kişi bu bilgiye doğrudan sahip değildir, arkadaşlarına danışacak olabilir.
	•	Men yiğüsi algur. U da yiğüsi algar u? → Ben yemek alacağım. O da yemek alacak mı(ymış)? (Ma Wei, 2014: s. 77).
Kişi kendi yapacağı eylemin doğrudan gerçekleştireni olduğu için doğrudan gelecek zaman eki kullanmış olup, bir başkasını yapacağı işi aracıya sorduğu ve dolaylı bir bilgi talep ettiği için dolaylı gelecek zaman eki kullanmıştır.
	3.	-(A)r: Esas olarak geniş zamanı ifade eden bu kip bazen gelecek zamanı da ifade eder. Olumsuz hâli -mAs ile sağlanır. (Ma Wei, 2016: s. 52).
	•	U buğün varar. → O bugün gidecek. (Ma Wei, 2016: s. 52).
(Ma Wei, 2014: s. 20; Ma Wei, 2016: s. 52).

Dwyer, Arienne M. (1998). The Turkic strata of Salar: An Oghuz in Chaghatay clothes? Turkic Languages 2: 49-83. (İngilizce).
Dwyer, Arienne M. (2007). Salar: A study in Inner Asian language contact processes. Part I: Phonology. Turcologica 37, 1. Wiesbaden: Harrassowitz Verlag. (İngilizce).
Kakuk, S. (1962). “Un Vocabulaire Salar.” Acta Orientalia Academiae Scientiarum Hungaricae 14, no. 2: 173–96. (Fransızca).
林莲云 [Lin Lianyun] (1985). 撒拉语简志 [A Brief History of Salar]‎, Beijing: 民族出版社: 琴書店. (Çince).
Ma, Chengjun, Han, Lianye, Ma, Weisheng (December 2010) “nang”, in 米娜瓦尔 艾比布拉 (Minavar Abibra), editor, 撒维汉词典 (Sāwéihàncídiǎn) [Salar-Uyghur-Chinese dictionary] (in Chinese), 1st edition, Beijing.
Ma, W. (2014). 中国少数民族语言会话读本: 撒拉语——366句会话句 [Conversational Textbook of Chinese Minority Languages: Salar Language – 366 Conversational Sentences]. 社会科学文献出版社 [Social Sciences Academic Press].
Ma, W. (2016). 国家社会科学基金项目: 濒危语言——撒拉语研究 [National Social Science Fund Project: Research on the Endangered Language – Salar].
Potanin, G.N. (1893). Тангутско-Тибетская окраина Китая и Центральная Монголия (Rusça).
Tenişev, Edhem (1976). Stroj salárskovo jazyká [Salar Grameri], Moskova. (Rusça).
Yakup, Abdurishid. (2002). An Ili Salar Vocabulary: Introduction and a Provisional Salar-English Lexicon‎, Tokyo: University of Tokyo.

Salarcada geniş zaman Türkçe ile benzerdir. Diğer zaman kiplerinin aksine doğrudan ve dolaylı ayrımı bulunmaz. Tek bir ekle sağlanır.
1. -(A)r: Sürekli tekrarlanan, sık gerçekleştirilen veya düzenli bir eylemi belirtmek için kullanılır. Olumsuz hâli -mAs ile sağlanır. (Ma Wei, 2016: s. 52).
Pise(r) Cumağa Altiule varar. → Biz Cuma namazına Altiul'e gideriz. (Ma Wei, 2016: s. 52).
Sürekli ve düzenli yapılan bir eylem olduğu için geniş zaman kullanılmıştır.
Atasözlerinde sık tercih edilir:
Tırna ülse ün galar, adam ülse ad galar. → Turna ölürse sesi kalır, adam ölürse adı kalır. (Ayso, 2008: s. 55).
Bir ağız cadaq söz, on yilniği bergetni buzar. → Bir kelime büyük söz, on yılın bereketini bozar. (Ayso, 2008: s. 83).
Her iki örnek de genelleme içerir. Birer atasözüdür. Bu nedenle geniş zaman kullanılmışır.
Biler mu, bilmes mu? → Bilir mi, bilmez mi? (Potanin, 1893: s. 432).
Ancak bazen kalın ünlülerde dar okunur:
Bu ziutaña dött sucaq su sıxır. → Bu tanka dört kova su sığar. (Ma Chengjun, 2010: s. 256).
(Ma Wei, 2016: s. 52).
İsim cümlelerinde ise dolaylı ve doğrudan deneyim belirtilir.
2. ira: Dolaylı deneyimi belirtmek için kullanılır; (i)-dIr ise doğrudan deneyimi tanımlamak için kullanılır. Her ikisi de isim cümlelerinin sonuna gelir. (Ma Wei, 2016: s. 112).

张, 进锋 (Ayso Cañ Cinfen) (2008) 乌璐别格 (Ulubeğ), 鄭初陽 (Çuyañ Yebey oğlı Ceñ), editors, Salar İbret Sözler 撒拉尔谚语 [Salar Atasözleri]‎, China Salar Youth League.
Dwyer, Arienne M. (1998). The Turkic strata of Salar: An Oghuz in Chaghatay clothes? Turkic Languages 2: 49-83. (İngilizce).
Dwyer, Arienne M. (2007). Salar: A study in Inner Asian language contact processes. Part I: Phonology. Turcologica 37, 1. Wiesbaden: Harrassowitz Verlag. (İngilizce).
Kakuk, S. (1962). “Un Vocabulaire Salar.” Acta Orientalia Academiae Scientiarum Hungaricae 14, no. 2: 173–96. (Fransızca).
林莲云 [Lin Lianyun] (1985). 撒拉语简志 [A Brief History of Salar]‎, Beijing: 民族出版社: 琴書店. (Çince).
Ma, Chengjun, Han, Lianye, Ma, Weisheng (December 2010) “nang”, in 米娜瓦尔 艾比布拉 (Minavar Abibra), editor, 撒维汉词典 (Sāwéihàncídiǎn) [Salar-Uyghur-Chinese dictionary] (in Chinese), 1st edition, Beijing.
Ma, W. (2014). 中国少数民族语言会话读本: 撒拉语——366句会话句 [Conversational Textbook of Chinese Minority Languages: Salar Language – 366 Conversational Sentences]. 社会科学文献出版社 [Social Sciences Academic Press].
Ma, W. (2016). 国家社会科学基金项目: 濒危语言——撒拉语研究 [National Social Science Fund Project: Research on the Endangered Language – Salar].
Potanin, G.N. (1893). Тангутско-Тибетская окраина Китая и Центральная Монголия (Rusça).
Tenişev, Edhem (1976). Stroj salárskovo jazyká [Salar Grameri], Moskova. (Rusça).
Yakup, Abdurishid. (2002). An Ili Salar Vocabulary: Introduction and a Provisional Salar-English Lexicon‎, Tokyo: University of Tokyo.

Salarcada geçmiş zaman kipleri Türkçe ile oldukça benzerdir. Tıpkı diğer zaman kiplerinde de olduğu gibi doğrudan ve dolaylı olarak gruplara ayrılır. (Ma Wei, 2014: s. 20; Ma Wei, 2016: s. 115).
	1.	-cI: Doğrudan gözlemlenen ya da tecrübe edilen eylemler içindir. Olumsuzluk fiile gelen -mA- eki ile sağlanır.
	•	Men satcı. → Ben sattım.
Satma eylemini kişi doğrudan gerçekleştirmiştir.
	•	U bile bile beliği etci. → O bildiği halde böyle yaptı. (Ma Wei, 2016: s. 56).
	Kişi, iş gerçekleştirilirken bunu doğrudan gözlemlemiştir.
	•	Ana, sen gadan gelci? → Kız, sen nerelisin? (Ma Wei, 2016: s. 72).
	Soru sorulan kişi nereli olduğu bilgisine dolaysız olarak sahiptir.
	2.	-mIş: Dolaylı bir gözlemden elde edilen bilgi içindir. Olumsuzluk fiile gelen -mA- eki ile sağlanır.
	•	Munı sen vaqsa kim etmiş i?. → Sizin bakış açınızla, bunu kim yapmış olabilir? (Ma Wei, 2016: s. 72).
Soru sorulan kişi yapılan işi doğrudan gözlemlememiştir.
	•	Moñısqırçıq başını darağışili ganını simürmiş deba. → Pythonus'un saçlarını tararken kan emdiği söylenir. (Ma Wei, 2016: s. 161).
Söylenti kişinin kulağına dolaylı yoldan gelmiştir.
	•	Sükseöre belenmiş bu. → Bu, süpürgeye dönüşmüş. (Ma Wei, 2016: s. 165).
Cümlede kullanılan kipten ve metnin konusundan bunun bir masal ya da efsane olduğunu, dolayısıyla doğrudan tanık olunan bir durum olamayacağını söyleyebiliriz.
	3.	-gAn: Belirli bir sürede tamamlanan eylemi belirtir. Doğrudan bir deneyim oluşturmak için var, olumsuzu yoq, dolaylı bir deneyim oluşturmak için vara, olumsuzu doğrudan deneyimde yoqdır ve dolaylı deneyimde yoxa, kullanılır. (Ma Wei, 2016: s. 53).
	•	Men Beycinne vağan var. → Ben Pekin'de bulundum. (Ma Wei, 2016: s. 72).
	•	Men Beycinne vağan vara. → Ben Pekin'de bulunmuşum. (Ma Wei, 2016: s. 72).
	•	Men Beycinne vağan yoqdır. → Ben Pekin'de bulunmadım. (Ma Wei, 2016: s. 72).
	•	Men Beycinne vağan yoxa. → Ben Pekin'de bulunmamışım. (Ma Wei, 2016: s. 72).
Ağızlarda takının düştüğü de olmaktadır. Bu durumda olumsuzluk, fiile gelen olumsuzluk ekiyle sağlanır. (Ma Wei, 2016: 95).
	•	Men aña vamağan. → Ben oraya gitmedim. (Ma Wei, 2016: s. 95).
(Ma Wei, 2014: s. 20; Ma Wei, 2016: s. 115).

Dwyer, Arienne M. (1998). The Turkic strata of Salar: An Oghuz in Chaghatay clothes? Turkic Languages 2: 49-83. (İngilizce).
Dwyer, Arienne M. (2007). Salar: A study in Inner Asian language contact processes. Part I: Phonology. Turcologica 37, 1. Wiesbaden: Harrassowitz Verlag. (İngilizce).
Kakuk, S. (1962). “Un Vocabulaire Salar.” Acta Orientalia Academiae Scientiarum Hungaricae 14, no. 2: 173–96. (Fransızca).
林莲云 [Lin Lianyun] (1985). 撒拉语简志 [A Brief History of Salar]‎, Beijing: 民族出版社: 琴書店. (Çince).
Ma, Chengjun, Han, Lianye, Ma, Weisheng (December 2010) “nang”, in 米娜瓦尔 艾比布拉 (Minavar Abibra), editor, 撒维汉词典 (Sāwéihàncídiǎn) [Salar-Uyghur-Chinese dictionary] (in Chinese), 1st edition, Beijing.
Ma, W. (2014). 中国少数民族语言会话读本: 撒拉语——366句会话句 [Conversational Textbook of Chinese Minority Languages: Salar Language – 366 Conversational Sentences]. 社会科学文献出版社 [Social Sciences Academic Press].
Ma, W. (2016). 国家社会科学基金项目: 濒危语言——撒拉语研究 [National Social Science Fund Project: Research on the Endangered Language – Salar].
Potanin, G.N. (1893). Тангутско-Тибетская окраина Китая и Центральная Монголия (Rusça).
Tenişev, Edhem (1976). Stroj salárskovo jazyká [Salar Grameri], Moskova. (Rusça).
Yakup, Abdurishid. (2002). An Ili Salar Vocabulary: Introduction and a Provisional Salar-English Lexicon‎, Tokyo: University of Tokyo.

A: Siniği adıñnı nañ çalar i?
B: Mini ... çalar. (Ma Wei, 2014: s. 27).
Salarcada isim sorusu, Moğolca kökenli çala- fiili ile sağlanmaktadır. Çağatay Türkçesinde çarla- olarak geçen sözdür. Çala-, Salarcada çağırmak anlamına gelmektedir. (Tenişev 1976: s. 307). Çincede de sorunun soruluş şekli farklı değildir. (你叫什么名字？). Kelimesi kelimesine çevirisi “Senin adını ne çağırır?” olmakla birlikte, cevap “Beni ... çağırır” şeklinde olacaktır. i ise pekiştirmedir.

Dwyer, Arienne M. (1998). The Turkic strata of Salar: An Oghuz in Chaghatay clothes? Turkic Languages 2: 49-83. (İngilizce).
Dwyer, Arienne M. (2007). Salar: A study in Inner Asian language contact processes. Part I: Phonology. Turcologica 37, 1. Wiesbaden: Harrassowitz Verlag. (İngilizce).
Kakuk, S. (1962). “Un Vocabulaire Salar.” Acta Orientalia Academiae Scientiarum Hungaricae 14, no. 2: 173–96. (Fransızca).
林莲云 [Lin Lianyun] (1985). 撒拉语简志 [A Brief History of Salar]‎, Beijing: 民族出版社: 琴書店. (Çince).
Ma, Chengjun, Han, Lianye, Ma, Weisheng (December 2010) “nang”, in 米娜瓦尔 艾比布拉 (Minavar Abibra), editor, 撒维汉词典 (Sāwéihàncídiǎn) [Salar-Uyghur-Chinese dictionary] (in Chinese), 1st edition, Beijing.
Ma, W. (2014). 中国少数民族语言会话读本: 撒拉语——366句会话句 [Conversational Textbook of Chinese Minority Languages: Salar Language – 366 Conversational Sentences]. 社会科学文献出版社 [Social Sciences Academic Press].
Ma, W. (2016). 国家社会科学基金项目: 濒危语言——撒拉语研究 [National Social Science Fund Project: Research on the Endangered Language – Salar].
Potanin, G.N. (1893). Тангутско-Тибетская окраина Китая и Центральная Монголия (Rusça).
Tenişev, Edhem (1976). Stroj salárskovo jazyká [Salar Grameri], Moskova. (Rusça).
Yakup, Abdurishid. (2002). An Ili Salar Vocabulary: Introduction and a Provisional Salar-English Lexicon‎, Tokyo: University of Tokyo.

Fiili sıfat yapmak için kullanılan en temel ektir. Türkçe -An sıfat fiili ile kökteştir.
	•	gelgen kiş → gelen kişi (Lianyun, 1985: s. 73)
	•	âdil vo(l)mağan → adil olmayan (Yakup, 2002: s. 32)
	•	arıtğan at → iğdiş edilmiş at (Lianyun, 1992: s. 10; Yakup, 2002: s. 32)

Gelecek zaman sıfat fiili yapar.
	•	gelgüci kiş → gelecek kişi (Lianyun, 1985: s. 74)
Meslek anlamı vererek isim fiil olarak da kullanılır.
	•	örgetgüci → öğretici, öğretmen (Lianyun, 1985: s. 74)

张, 进锋 (Ayso Cañ Cinfen) (2008) 乌璐别格 (Ulubeğ), 鄭初陽 (Çuyañ Yebey oğlı Ceñ), editors, Salar İbret Sözler 撒拉尔谚语 [Salar Atasözleri]‎, China Salar Youth League.
Dwyer, Arienne M. (1998). The Turkic strata of Salar: An Oghuz in Chaghatay clothes? Turkic Languages 2: 49-83. (İngilizce).
Dwyer, Arienne M. (2007). Salar: A study in Inner Asian language contact processes. Part I: Phonology. Turcologica 37, 1. Wiesbaden: Harrassowitz Verlag. (İngilizce).
Kakuk, S. (1962). “Un Vocabulaire Salar.” Acta Orientalia Academiae Scientiarum Hungaricae 14, no. 2: 173–96. (Fransızca).
林莲云 [Lin Lianyun] (1985). 撒拉语简志 [A Brief History of Salar]‎, Beijing: 民族出版社: 琴書店. (Çince).
Ma, Chengjun, Han, Lianye, Ma, Weisheng (December 2010) “nang”, in 米娜瓦尔 艾比布拉 (Minavar Abibra), editor, 撒维汉词典 (Sāwéihàncídiǎn) [Salar-Uyghur-Chinese dictionary] (in Chinese), 1st edition, Beijing.
Ma, W. (2014). 中国少数民族语言会话读本: 撒拉语——366句会话句 [Conversational Textbook of Chinese Minority Languages: Salar Language – 366 Conversational Sentences]. 社会科学文献出版社 [Social Sciences Academic Press].
Ma, W. (2016). 国家社会科学基金项目: 濒危语言——撒拉语研究 [National Social Science Fund Project: Research on the Endangered Language – Salar].
Potanin, G.N. (1893). Тангутско-Тибетская окраина Китая и Центральная Монголия (Rusça).
Tenişev, Edhem (1976). Stroj salárskovo jazyká [Salar Grameri], Moskova. (Rusça).
Yakup, Abdurishid. (2002). An Ili Salar Vocabulary: Introduction and a Provisional Salar-English Lexicon‎, Tokyo: University of Tokyo.

Salarcada birden fazla isim fiil bulunur. Ancak ismin yalın hali olarak -gUsI tercih edilir.
1. -gUsI: İsmin yalın hali. (Yakup, 2002; Ma Wei 2016, ss. 49-50).
• Saña vaqqusı nañ var-i? → Sana bakması neden? (Ma Wei 2016, s. 57)
• Örgengüsi hama engik ir-a. → Öğrenmek oldukça zordur. (Ma Wei 2016, s. 70)
• Oynağusı vaq. → Oynama vakti.
Ancak sıfat fiil olarak da kullanımı vardır.
• Yigüsi emek. → Yemelik ekmek.
İstek bildiren sözcüklerde gel- yardımcı fiili ile kullanılır. (Ma Wei 2016, s. 54)
• Men öye vağusı geler. → Eve gitmek isterim.
• U su işgüsi gelba(r). → O su içmek istiyormuş.
• Sen alğusı geler mo? → Satın almak ister misin?
2. -(I)š: Bir işin yapılış şeklini, yöntemini belirtir. Türkçedeki -Xş eki ile kökteştir.
• Anigi piddişi doğra. → Onun yazışı doğru. (Lin Lianyun 1985, s. 79).
• Anigi itiş(i) yaqşı ir-a. → Onun yöntemi iyiymiş. (Ma Wei 2016, s. 57).
• U mallaçüknigi oxaşı yaçücügü ir-a. → O öğrencinin okuyuşu en iyisiymiş. (Ma Wei 2016, s. 57).
3. -mA: Fiile gerekçe anlamı katar. Türkçe -maya ile kökteştir. (Ma Wei, 2016: s. 52).
• Ağrıq vaqma varci. → Hasta bakmaya gitti. (Yakup 2002, s. 175.)
• Bugün 开会 (kāihuì) etme gelgen 学生 (xuéshēng) ottus var-a. → Bugün toplantı yapmaya gelen öğrenciler otuz vardır. (Lin Lianyun 1985, s. 99).

Salarcada yönelme eki tek heceli ünsüz ile biten sözcüklerde +A olurken, tek heceli olup ünlü ile biten sözcüklerde ve çok heceli sözcüklerde +gA olmaktadır. (Ma Wei 2016, s. 48).
• dam + +A → dama “duvara” (Ma Wei 2016, s. 48)
• bala + +GA → balağa “çocuğa” (Ma Wei 2016, s. 191)
• kafey + +GA → kafeyğa “kafeye” (Ma Wei 2014, s. 36)
• i + +GA → ige “kendine” (Ayso, s. 11)
• kiş + +A → kişe “insana” (Ma Wei 2016, s. 48)
• gölik + +GA → gölikge “ineğe” (Ayso, s. 44)
• heli + +GA → helige “paraya” (Ayso, s. 44)
• kişler + +GA → kişle(r)ğa “insanlara” (Ma Wei 2016, s. 42)
• Piser dağğa rıtıq vurma varci. – Bizler dağa av vurmaya gittik. (Lin Lianyun 1985, s. 107)
Sözcük son seste p ile bitiyorsa ünlü ile başlayan ek aldığı için ötümlüleşir:
• qap + +A → qaba “kaba” (Lin Lianyun 1992)
• sap + +A → saba “sapa” (Lin Lianyun 1992, s. 58)
• çöp + +A → çöbe “ota” (Lin Lianyun 1992)
Çünkü Salarcada Eski Türkçe /p/ fonemi genelde /f/ fonemine dönme eğilimindedir. (örn. süfse “süpürge” (<*süpse), arfa “arpa” (<*arpa), yafraq “yaprak” (<*yapurgak)...)

Şimdiki zamanda Salarcada iki farklı ek dikkate alınır. Bunlar tıpkı Türkçe -yor gibi ünlü uyumuna tabi değildir. Ancak Türkçeden farklı olarak ikiye ayrılır:
	1.	-bır: Doğrudan gözlemlenen ya da tecrübe edilen eylemler içindir. Olumsuzluk fiilin yalın halinden sonra gelen yoq takısı ile sağlanır.
	•	Men işbır. → Yemek yiyorum.
	•	Men iş yoq. → Yemek yemiyorum.
Yemek yeme eylemini kişi doğrudan dolaysız olarak yapmaktadır.
	•	Beliği neğe yığlabır i? → Böyle neden ağlıyorsun? (Ma Wei, 2016: s. 181).
	Ağlayan kişinin ağladığını doğrudan gözlemlemektedir.
	1.1. Geçmiş zaman yerine kullanımı.
	•	Geci sen geğende, men neme işbır. → Dün sen geldiğinde yemek yiyordum. (Ma Wei, 2016: s. 115).
	Yemek yiyen kişi yemek yemeyi doğrudan deneyimlemektedir. Örnekte görüldüğü üzere, geçmiş zamanın şimdiki zamanı yerine de kullanılabilmektedir.
	1.2. Geniş zaman yerine kullanımı.
	•	Siniği gagañ her güne er 几点de (jidiende) 上班 (Shangban) etbır i?. → Senin ağabeyin her gün sabah saat kaçta işbaşı yapıyor? (Ma Wei, 2014: s. 48).
Soru sorulan kişi ağabeyin işbaşı yaptığını doğrudan gözlemlemektedir. 
	2.	-ba(r): Dolaylı bir gözlemden elde edilen bilgi içindir. Olumsuzluk fiilin yalın halinden sonra gelen yoxa takısı ile sağlanır.
	•	İtçük uklıba(r). → Köpek uyuyormuş. (dolaylı gözlem) (Ma Wei, 2016: s. 53).
	•	İtçük uklı yoxa. → Köpek uyumuyormuş. (dolaylı gözlem) (Ma Wei, 2016: s. 53).
Kişi köpeğin uyuduğunu doğrudan gözlemlememiştir. Birinden duymuş olmalıdır.
	2.1. Geçmiş zaman yerine kullanımı.
	•	Mi(niği) abam ülğende, men ağırba(r). → Babam öldüğünde ben hastaymışım. (Lin Lianyun, 1985: s. 67).
Kişi babasının öldüğü zamanı hatırlamamaktır ama dolaylı olarak bu bilgiye ulaşmıştır.
(Ma Wei, 2014: s. 20; Ma Wei, 2016: s. 53).

Dwyer, Arienne M. (1998). The Turkic strata of Salar: An Oghuz in Chaghatay clothes? Turkic Languages 2: 49-83. (İngilizce).
Dwyer, Arienne M. (2007). Salar: A study in Inner Asian language contact processes. Part I: Phonology. Turcologica 37, 1. Wiesbaden: Harrassowitz Verlag. (İngilizce).
Kakuk, S. (1962). “Un Vocabulaire Salar.” Acta Orientalia Academiae Scientiarum Hungaricae 14, no. 2: 173–96. (Fransızca).
林莲云 [Lin Lianyun] (1985). 撒拉语简志 [A Brief History of Salar]‎, Beijing: 民族出版社: 琴書店. (Çince).
Ma, Chengjun, Han, Lianye, Ma, Weisheng (December 2010) “nang”, in 米娜瓦尔 艾比布拉 (Minavar Abibra), editor, 撒维汉词典 (Sāwéihàncídiǎn) [Salar-Uyghur-Chinese dictionary] (in Chinese), 1st edition, Beijing.
Ma, W. (2014). 中国少数民族语言会话读本: 撒拉语——366句会话句 [Conversational Textbook of Chinese Minority Languages: Salar Language – 366 Conversational Sentences]. 社会科学文献出版社 [Social Sciences Academic Press].
Ma, W. (2016). 国家社会科学基金项目: 濒危语言——撒拉语研究 [National Social Science Fund Project: Research on the Endangered Language – Salar].
Potanin, G.N. (1893). Тангутско-Тибетская окраина Китая и Центральная Монголия (Rusça).
Tenişev, Edhem (1976). Stroj salárskovo jazyká [Salar Grameri], Moskova. (Rusça).
Yakup, Abdurishid. (2002). An Ili Salar Vocabulary: Introduction and a Provisional Salar-English Lexicon‎, Tokyo: University of Tokyo.

Kitap size nasıl sabit olmayan Debian "sid"'ini hızlı
ve acısız bir şekilde Sidux LiveCD ile indireceğinizi gösterir, kendisi basit konfigürasyona ve
en önemlisi - kullanışlı uygulamalara sahiptir - en iyi işletim sistemi bile bir ev bilgisayarında
bir teması olmassa kullanışsızdır.

Sidux bir Linux dağıtımıdır, ve sürücü kurulum seçeneğiyle CD/DVD içinde çalıştırılabilir.
Sidux Aptosid takımı tarafından geliştirilmektedir (önceden: Berlin içinde kurulmuş kar amacı gütmeyen kuruluş sidux).
Proje yazın 2010 zamanında bitmiştir ve Aptosid olarak yeniden başlanmıştır.

1. Debian "sid"'in her zaman yeni sürüm paketleri vardır.
2. Debian'ın bir sabit olmayan versiyonu elbette çok sabittir.
3. Debian "sid" asla donmaz - yani eğer onu indirdiysen, tekrar indirmene gerek yok.
tekrar ve tekrar yeni versiyona çünkü o var değil.
4. Eski makinelerde bile hızlı ve efektif çalışabilir.
5. En yüksek paket/uygulama sayısına sahiptir.
6. Sidux geliştiricileri birkaç ilginç eklentiler yaratmıştır.

Sistem kurulumu
Harici disk içinde sistem kurulumu
Yükleme sonrası işler
Sistem ve paket yönetimi, uygulamaların kurulumu
Kullanışlı uygulamalar
Problemleri çözmek

Aptosid ana sayfası: http://aptosid.com/
Aptosid manuel sayfa: http://manual.aptosid.com/
Debian ana sayfası: http://www.debian.org/
Debian çoklumedya sayfası: http://debian-multimedia.org/
DistroWatch içinde Aptosid: http://distrowatch.com/table.php?distribution=aptosid

Şef Mehmet Gürs’ün “Siyez Bulgur ve Malatya Kayısı” Tatlısı
Siyez Bulgur ve Malatya Kayısı, tatlısı için öncelikle ön hazırlık karışımı yapılır. Bu hazırlık karışımı belirli bir süre dinlendirildikten sonra Bulgur Dondurması ve Marine Kayısı şeklinde iki ara ürün olacak şekilde ayrıştırılır. Sonrasında ise final “Siyez Bulgur & Malatya Kayısı” tabağı hazırlanır.

Malzemeler:

100gr		Siyez Bulguru
1 Lt		Su I
300 gr		Toz şeker
180 gr		Malatya kayısı (gün kurusu)
2 gr		Çubuk tarçın
4 gr		Portakal kabuğu
1 Lt		Su II
1 yaprak	Taze nane
8 gr		Kuşboku fıstık
Hazırlanışı:
1- Bulguru Su I ile orta harlı ateşte 8 dakika kaynat ve süzdür.
2- Ayrı bir kapta şeker, tarçın, portakal kabuğu ve Su II’yi kaynatarak şurup yap, sıcak şurubun içine kayısıları ilave et.
3- Önceden pişmiş olan bulguru da ilave edip karışımı +4 soğuk dolapta 12 saat dinlendir.
4- Dinlendirilmiş hazırlık ürününün içinden kayısılar ile tarçını al ve başka bir kaba ayır.
5- Bulguru ve portakal kabuğunu süzdür ve blender kabına al.
6- Bulgurun üzerine 750gr’ı tamamlayacak kadar şurup ilave et ve blender da iyice çek, karışımı Paco Jet kabına koy ve 12 saat dondur.
7- Ayırdığın kayısıların üzerine dondurmadan arta kalan şurubu ve tarçın çubuklarını koy, +4 soğuk dolapta soğut.
8- Bir adet kayısıyı önce ikiye böl ve sonra 3er elma dilim şeklinde toplamda 6 dilim olarak kes.
9- Kayısı dilimlerini içleri yukarı bakacak şekilde tabakta saat 5 ten 1 yönüne birbirine yaslanır halde çapraz şekilde diz.
10- Kayısının üzerine çok ince dilimlenmiş nane yapraklarını serpiştir.
11- Kayısıların sol tarafına tabağın ortasına kırık kuşboku fıstığı koy.
12- Dondurma karışımını Paco Jet te çek ve kaşık ile quenelle şeklinde alarak fıstığın üzerine saat 5’ten 11 yönünde koy.

Şef Vedat Başaran’ın Siyez Bulgurlu Pazı Sarması
Malzemeler:

500 gr Siyez bulguru
1 demet reyhan
2 adet kuru soğan (ince kıyılmış)
50 gr biber salçası
2 gr karabiber
3 gr tuz
2 bağ pazı
200 gr yeşil erik
30 gr tereyağı
30 gr zeytinyağı
Yapılışı:
Siyez bulguru bir kaba konulup üzerini aşacak kadar ılık su ile ıslatılır. Ayrı bir kapta kuru soğan tuz ile ovulur. Biber salçası ve karabiber ilave edilip karıştırılır. Islatmış olduğumuz bulgur ve reyhan eklenerek iç malzeme hazır hale gelir.  Pazı kaynar suda haşlanıp soğutulduktan sonra pazılara içi malzeme konularak tek tek sarılır tencereye dizilir.  Üzerine yeşil erik konulur ( yeşil erik yoksa, ekşi kayısı veya ekşi  kuru erik veya koruk taneleri kullanılabilir).  Yağlar eklenip  1 su bardağı su ilave edildikten sonra kısık ateşte 40 dakika pişirilir.

Antrenmana başlamadan önce bazı hazırlıklar yapmalıdır. Beden hazırlığı, ruh hazırlığı, silah hazırlığı gibi. Bu hazırlıkların tamamlanmasından sonra vaziyet alınır ve antrenmana başlanabilir.

Tabanca, tüfekten çok daha tehlikelidir. Zira tüfek namlusu, boyunun uzunluğu sebebiyle çok çabuk yön değiştiremez. Fakat tabanca sadece elle tutulduğundan ve bilek çok oynak olduğundan, kolumuzu oynatmadan bile namluyu, sadece bilek hareketiyle hemen her yöne süratle çevirebiliriz. Bu da büyük tehlike yaratır. İşte bu sebeple, tabancayı elimize aldığımız andan itibaren, bileğimiz kesinlikle sabitlenme alışkanlığı kazanmalıdır. Bu çalışmaları elimizde silah yokken de yapabiliriz.
Tabancayı elimize aldığımız andan itibaren bileğimiz sabit olmalıdır. Bilek hiçbir yöne kıvrılmamalıdır. Silahı her elimize aldığımız an bileğimizin adeta kilitlendiğini hissedecek kadar çok çalışma yapmalıyız. 
Silah atışında bacakların kuvvetli olması, kollardan daha önemlidir. Unutmamalıdır ki yere sağlam basamayan bir vücudun üst tarafının kuvvetli olması hiçbir şey ifade etmez. Yere çok sağlam basmalıyız ve dengeli durmalıyız ki, vücudun üst kısmında bulunan kollarımız sabit kalabilsin, sallanmasın. Bu husus genellikle gözden kaçmaktadır.
Bir atış müsabakası öncesinde öncelikle bacak kaslarımızı sonra da kol kaslarımızı güçlendirecek ve denge yeteneğimizi artıracak basit çalışmalar yapmalıyız.
Sol ayağımız hafifçe önde; iki ayak arasında 1 karıştan biraz fazla açıklık olacak şekilde durur, iki elimizi kavuşturarak ileri uzatırız. Çok yavaş hareket ederek yere çömelir, ve gene çok yavaşça kalkarız. Yere çömelirken nefes verir, ayağa kalkarken nefes alırız. Nefes verme ve alma süreçleri, çömelme ve kalkma süreçleriyle eşdeğerli olmalıdır.
Bu hareketleri yoruluncaya kadar yaparız. Bu çalışmalar, zaman içinde, bacak kaslarımızın yeterince güçlenmesine yardımcı olacaktır.
Daha sonra denge hareketleri yapmalıyız. Önce sol ayak üzerinde durarak, sağ bacağımızla önce saat yönünde 8-10 defa; sonra saat yönünün tersine aynı miktarda, geniş yuvarlaklar çizmeliyiz.
Bu hareketler sol bacak üzerinde dururken de tekrarlanmalıdır.
Yinelemekte yarar görüyorum; çökme-kalkma ve denge hareketleri oldukça yavaş yapılmalıdır.
Kollarımızın çok kuvvetli olmasına gerek yoktur. Ancak dayanıklılığını artırmak zorundayız. Yani, kollarımız ileriye veya yana tam uzatılmış olduğu halde uzunca durabilmeliyiz.
Bunun için de basit bazı hareketler yapabiliriz. İki elimize birden alacağımız birer Kg civarında herhangi bir ağırlığı, kollarımızı bükmeden ve yavaşça omuz hizasına kadar kaldırıp indiririz. Bu hareketleri önce kollarımızı yan tarafa, sonra da ileri doğru kaldırıp indirerek tekrarlarız. Bu hareketler de oldukça yavaş olmalıdır. Kollar kaldırılırken nefes alma; indirilirken nefes verme aynı rejimde devam ettirilmelidir.
Daha sonra gene dirseklerimizi bükmeden, kollarımızı yan tarafa açarak, kıpırdamadan, yoruluncaya kadar bekleriz. Bu hareketi, kollarımızı ileri uzatarak da tekrarlarız.
Zaman içinde bacaklarımızın ve kollarımızın yeterince güçlendiğini ve hareketlerimizin artık eskisine göre daha kontrollü olabildiğini hissetmeye başlarız.

Silah atışında, her sporda olduğu gibi, hatta daha fazla ruh sağlığına sahip olmamız lâzımdır. Atış öncesi, sinirli ve yorgun olmamamız gerekir. Gün boyu iş hayatının yorgunluğu üzerine “Hadi, şöyle bir atışa gideyim de dinleneyim” demek kadar sakıncalı bir durum daha düşünülemez. Veya “Bugün sinirlerim çok bozuk! Biraz silah atışı yapayım da, stres atayım” düşüncesiyle atış yapılmaz.
Silah atışı için mutlaka sakin bir gün ayarlamalı, huzurlu, telaşsız bir zaman ve ortam seçilmelidir. Bu spor, ancak dinlenmiş bir vücut ve kafa yapısıyla yapılır. Araba kullanmayla kıyaslayacak olursak; nasıl ki yorgun veya uykusuzken direksiyon başına oturmak sakıncalıysa, silah atışı yapmak da o derece, hattâ daha fazla sakıncalıdır.

Atış antrenmanları mutlaka nizami poligonlarda yapılmalıdır. Buralarda mermi sekmesi ve diğer birçok sebeplerden kaynaklanabilecek kaza riskleri en aza indirilmiştir. Poligon haricinde antrenman tavsiye edilmez.
Poligona gelmeden önce silah bakımımız yapılmış, özellikle namlunun iç kısmı yağlardan temizlenmiş olmalıdır.
Poligonda, ancak atış departmanının kabinine girdikten sonra silahımızı çıkartırız. Daha önce silahımız muhafazasında bulunmalıdır.
Atışlar beşer mermi ile yapılır. Bu bakımdan silahımızın içine yalnızca 5 adet mermi koyarız.

Serbest atış; çift el veya tek elle yapılır.

Atışa hazır oluncaya kadar parmak tetiğe uzatılmamalı, tetik muhafazası yanında durmalıdır.

Serbest atışlarda hedef harekesizdir.
Silahı kurarız. (Revolver tabancaysa horozu kaldırırız; şarjörlü tabancaysa kapak takımını çalıştırarak namluya mermiyi süreriz.). Bu andan itibaren artık hiçbir nedenle elimizdeki silahı hedefin dışında bir yöne çevirmeyiz.
Sol ayağımız hafifçe önde; iki ayağımız arasında 1 karıştan biraz fazla mesafe olacak kadar açıkta duracak şekilde yere sağlam basarız.
Silahı sağ elimize alırız. Sağ elimizin 3 parmağı kabzayı kavrarken, işaret parmağımız tetiğin üzerinde; ancak tetiği saracak şekilde değildir. Tetik, işaret parmağımızın ucuyla ilk boğumu arasındaki mesafeye dayanacak şekildedir. Bu durumda, tetiğe uzanan parmağımızın iç yüzeyi kabzadan uzaktadır. Yani kabzaya temas etmez. Bu tutuşta, tetik ezilirken parmağın hareketi, kabzaya temas etmediği için, silahın oynamasına ve hedefin şaşmasına sebebiyet vermez.
Başparmağımız kabzanın sol yanında ve hedefi gösterir yöndedir (Şekil 1).
Sol elimizin işaret parmağı ve başparmak hariç, diğer üç parmağımızla, kabzayı kavramış elimizin üstüne sararız. Başparmağımız, kabzanın sol tarafında; sağ elimizin başparmağının altında, ve ona hafifçe dayanacak şekilde ve hedefi gösterir konumdadır. Sol elimizin işaret parmağı ise tetik muhafazasının önüne yerleştirilir. Bu şekilde, sağ elimiz silahın ağırlığını taşırken ve sol elimiz de, sağ elimizin sallanmasını engellerken, işaret parmağımız da namlunun yönünü sabit tutmamızı sağlar.
Ellerimizle silahı fazla sıkmamalıyız; fazla da gevşek tutmamalıyız. Bunun için şöyle bir benzetme yapılır:
“Silahı, elinizde kuş tutar gibi tutmalısınız. Gevşek tutarsanız kuş kaçar; çok sıkarsanız ölür.”
Silahı bu şekilde kavradıktan sonra, kollarımız ön aşağı doğru, vücudumuzla yaklaşık 15 derecelik bir açı yapacak şekilde vaziyet alırken, arpacığı gezin içinde görecek şekilde ayarlarız. Bu işlemler sırasında elimiz tetik üzerinde değil, yanında durur.
Atışa hazırlanırken kollarımızı belli bir açıyla tutmamızın sebebi, silahın kazara ateş alması durumunda, merminin, geri sekmeyecek bir durumda olmasını sağlamak içindir.

Bu durumda silahı tutuşumuz farklıdır. Sağ elimize alarak kavradığımız silahı, bu defa gövdemize dik değil, sol-sağ omuz hizamızda (tamamen sağ yanımıza doğru) tutarız. Bu tutuştaki amaç, gez ve arpacığın gözümüzden olabildiğince uzaklaşmasını sağlamaktır. Başımızı sağ tarafımıza çevirerek nişan alırız.
Bu durumda, çift elle atışa göre elimiz daha fazla titreyecek ve daha fazla gezinecektir.

Kollarımızı dik bir şekilde ve yavaşça  yukarı doğru kaldırırken yavaşça nefes almaya başlarız. Bu kaldırma hareketi sırasında, gözümüzle, arpacığın, devamlı gez içinde kalmasına gayret ederiz. Bu esnada kollarımız, vücudumuzdan hedefe doğru dik olarak çizdiğimiz hayalî bir çizginin üzerinde olmalıdır; gövdemize göre ne sağ tarafa ne de sol tarafa kaçmış olmalıdır.
Silah göz hizasına kadar kalktıktan sonra, nefesimizi tutarız. Nefes alırken öyle ayarlamalıyız ki, silah aşağıdayken nefes almaya başlamalı ve silah tam göz hizamıza geldiğinde nefes alışımızı tamamlamış olmalıyız. Ciğerlerimize aldığımız hava ne çok, ne de az olmalı. Derin nefes almış olursak da, az nefes almış olursak da, nefesimizi yeterli süre tutamayız ve dikkatimiz dağılır. Bu beceri de çalışmayla kısa sürede kazanılır. Nefes alma ve tutma çok önemlidir.

Serbest atışta tek göz ile nişan almanın sakıncası yoktur. İki göz açık olarak atış; hareketli atışta lâzım olacaktır. Gene de alışkanlık elde etmek için, iki göz açık olarak atışı tercih etmekte yarar vardır.
Silah artık göz hizamızda ve arpacık, ‘gez’in içindedir. Ancak bu yeterli değildir. Gezin içinde duran arpacığın üst hizası, gezin en üst hizasında olmalı; arpacıkla gez arasında sağ ve sol yanlarda kalan boşlukların mesafesi de eşit olmalıdır. Böylelikle gez ile bütünleşmiş olan arpacık, hedefe yöneltilir.
Elimiz artık tetikte ve tetik düşürmeden önce bu vaziyette en fazla 10 saniye kadar durularak hedef bulunmaya çalışılır. Şayet bu zaman içerisinde karar vererek tetik düşürememişsek, atış ertelenir. Kollarımızla silah aşağı doğru ve vücudumuzla 15 derecelik bir açı yapacak şekilde yavaşça aşağı indirilerek atış öncesi konuma gelinirken nefes bırakılır.
Bu vaziyette yeterince beklenirken birkaç defa derin nefes alınır verilir; kollar dinlendirilir. Yeterince dinlendiğimize inanınca nefes alma ve nişan alma hareketleri tekrarlanır.
Nişan alınırken, tetik düşürmede bazen kararsızlık geçirme söz konusudur. Bu sebeple dinlenme hareketine birkaç defa geçmekte sakınca yoktur.

Yapısı itibariyle göz; ya yakına veya uzağa net yapar. Aynı anda hem uzağı ve hem de yakını net görmek genellikle pek mümkün değildir. Oysa nişan alırken gez ve arpacık bize yakın; hedefse uzaktır. Gözümüzü gez ve arpacığa net yapsak, hedefi bulanık görürüz. Uzağa net yaparsak, gez ve arpacığı bulanık görürüz.
Bu durumda; yardımcı araç kullanmıyorsak hangi şartı seçmemiz gerekir? Elbette gez ve arpacığı net görmeyi seçmemiz gerekir; hedefi değil!. Zira nişan almada silahta yapacağımız ufak bir hata hedefe olan mesafe oranında büyüyecektir ve hedefte sapma çok büyük olacaktır.
Yardımcı araçlar kullanarak bu sakıncayı ortadan kaldırmamız da mümkündür. Şayet gözümüz sağlıklı değil de dereceli gözlük kullanıyorsak, gözlük üzerine takılan diyaframlı optik bir derinlik sağlayıcı aygıt kullanabiliriz. Aksine, gözümüz sağlıklı ve dereceli gözlük kullanmıyorsak, kendimize düz camlı bir gözlük yaptırarak, diyaframlı optik derinlik sağlama aygıtını o

Bazı Kurallar:

Temel kural: “Silah boşken, dolu olduğu zamankinden daha tehlikelidir.”
Silah doluyken, insan dikkatli davranır. Silah boşken daha rahat davranır. Halbuki silahın boş olduğundan emin olunamaz. Her ne kadar emin olsak dahi, sanki doluymuş ve ateşe hazırmış gibi davranmamız gerekir.

Silahla asla şaka yapılmaz.
Her silah, ortalama üç yılda bir istem dışı ateş alır.
Her profesyonelin bile elinde silahın istem dışı patladığı görülmüştür. Silah kuruluyken ve namluda mermi varken, yere düştüğünde ateş alabileceği gibi, elde tutarken de horozun kendiliğinden düşmesiyle istem dışı ateş aldığı görülmüştür. Böylesi olaylara oldukça fazla rastlanmıştır; rastlanmaktadır. Bu husus hiç akıldan çıkartılmamalıdır. 

Silahın namlusu asla canlıya çevrilmez.
Bu hususa, gene, silah boşken de riayet etmek gerekir. Silah, ister elde tutulurken; ister masanın üzerinde dururken, her an ateş alacakmış gibi kabul edilir ve namlusu canlılara doğru yönlendirilmez.

Silah, doldurulurken, boşaltılırken veya başkasına verilirken, namlusu mutlaka güvenli bir alana doğrultulur. Ateş alması halinde, mermi çekirdeğinin canlıya isabet etmeyeceği bir yöne çevrilmelidir.
Silah doldurulurken, parmak tetikten uzak durmalıdır.
Silah başkasına verilirken önceden mutlaka boşaltılmalıdır. Dolu silah verilmez.
Silah şarjörlü ise, kapak takımı açık olarak kilitlenir. Namlu içinde mermi olmadığı gözlemlenir (varsa çıkartılır). 
Şayet silah toplu (revolver)  ise, topun içindeki mermiler boşaltıldıktan sonra, top yana açılmış vaziyette verilir.
Silah bu durumda açıkken dahi başkasına verilirken, namlusunun canlıya dönük olmaması şarttır.

Atış sırasında, tetik çekildikten sonra silahın ateş almaması halinde, silahın yönü değiştirilmeden, 15 ila 20 saniye kadar beklemek gerekir. Zira nadiren de olsa, barutun geç ateş alması söz konusudur. Bu arada silahın yönünü değiştirirsek, kaza riskimiz vardır.
Silah boşken veya doluyken asla namlu ağzından içine bakılmaz.
Silah, namlusundan tutulmaz.
Parmak tetikte tutulmaz. Yalnızca ateş etmek için tetiğe dokunulur.
Asla suya ve sert yüzeylere ateş edilmez. Sekebilir ve tehlike yaratır.
Silah kullanılmadan önce namlu içinin yağı mutlaka kuru bir bezle silinmelidir.
Silah; geçici de olsa, kimseye verilmez.
Başkasına ait bir silaha el sürülmez. Özellikle çok iyi tanımadığımız bir kişiye aitse... Silahta parmak iziniz kalacaktır. Şayet o silahla, ya siz onu tutmadan evvel veya tuttuktan sonra bir yaralama veya öldürme söz konusu ise, yapılan araştırmada parmak izinize rastlanabilecek ve sorumlu düşmeniz ihtimali olabilecektir.
Evde bulundurulan silah, şayet şarjörlü ise kullanılabilir vaziyette bırakılmaz. Sökülür ve namlusu ayrı bir yerde muhafaza edilir. Zira eve gelmesi muhtemel yardımcının, veya bir misafir çocuğunun silahı kurcalaması söz konusudur.
Özellikle çocuklar ve henüz belli bir olgunluğa erişmemiş, eğitim almamış gençlerin silah merakı büyük bir tehlikedir. “Silahı kurmaya çocuğun gücü yetmez ki” diye düşünmek veya “Çocuklar buraya yetişemez”  diyerek yüksek bir yere kaldırmak da yeterli değildir. Çocuklar, akla hayale gelmeyecek şeyler yapabilirler. Bu bakımdan eve bir çocuk veya bir genç gelmesi söz konusuysa, namlusu sökülerek ayrı bir yere kaldırılmış silah en güvenli şarttadır. Evlere hırsız girmesi ve silahınızı çalması da söz konusudur. Sizin silahınızla meydana gelebilecek bir yaralanma başınıza büyük işler açar. Ancak namlusuz bir silah sorun çıkartamaz.
Şayet silah revolver ise, namlu sökülemeyeceğinden mutlaka bir kasaya kilitlenmelidir. Mermiler ise ayrı bir dolapta kilitli bulundurulmalıdır. Silahla mermi aynı ortamda bulunmamalıdır.
İstenmeyen kişiler tarafından kullanılmasını engellemek için tetik kilitleri de mevcuttur (Şekil-1, 2, 3). Tetik kilidiyle koruma altına alınmış dahi olsa silahın boş olması ve mermilerden uzak bir yerde bulunması gerekli bir tedbirdir.

Güvenli alan; silahın ateş alması halinde, mermi çekirdeğinin doğrudan veya dolaylı (sekerek) canlıya isabet etmesi kesinlikle mümkün olmayan alandır.
Açık arazide güvenli alan, toprak bir settir. Arkası sonsuza açılan boş bir arazi asla güvenli değildir. Zira herhangi bir setin, bir ağacın, bir çalı kümesinin arkasında, bir çukurun içinde;  fark edemediğimiz birinin bulunması ve ateş ettiğimiz anda menzil içine girmesi söz konusu olabilir.
Yön olarak bir duvar seçimi de güvenli değildir. Zira silahın ateş alması halinde, çekirdek sert duvardan sekebilir. Bu durum son derece tehlikelidir. Çekirdeğin hangi istikamete doğru sekeceği hiç belli olmaz.
Çünkü merminin bir de kendi ekseni etrafında dönüşü vardır. Genellikle sağa doğru döner. Duvara çarpan mermi kendi ekseni etrafında dönüşü sebebiyle yeniden hız kazanabilir.
Bu bakımdan açık arazide, namlu, yüksek bir toprak sete çevrili olmalıdır ki, silahın ateş alması halinde çekirdek toprağa saplansın. Böyle bir toprak set yoksa, silah yere doğru tutularak doldurma-boşaltma işlemi yapılır. Zeminin gene toprak olması şarttır.
Kapalı alanlarda ise doldurma ve boşaltma işlemi yapmak sakıncalıdır. Zira her yan duvarlarla çevrilidir. Çekirdek sekebilir. Bu gibi durumlarda namlu, içi toprak dolu büyük bir saksıya doğru çevrilir. Saksı yoksa, duvara dayalı ahşap ve kapağı kapalı bir dolap aynı işi görebilir. (Dolabın içinde canlı bulunmadığından emin olunmalıdır. Özellikle çocuklar, oyun için, dolaba saklanmayı pek severler)
Namlu asla bir kapıya çevrilmemelidir. Kapıyı delip geçebilecek olan çekirdek, kapı arkasındaki bir canlıya isabet edebilir.

Elbette silahı şeytanın doldurması söz konusu değildir. Silahı biz doldururuz. Bu tabirle anlatılmak istenen, silahın boş olmasına güvenilmeyeceğidir.
Bu “Şeytan doldurur” sözü genellikle şarjörlü tabancalar için kullanılmaktadır. Zira şarjörü çıkartılmış bir tabanca boş zannedilir fakat namlusunun içinde bir ihtimal mermi unutulmuştur. Tetik çekildiğinde bu mermi ateş alır. Bu sebeple çok kaza olmuştur ve olmaktadır. İşte “Silah boşken, dolu olduğundan daha tehlikelidir” denmesinin sebebi de budur. Ama her şeye rağmen, revolver tabancalar için de aynı düşünceye sahip olmamız gerekir. Zira topun içindeki mermileri boşaltırken, bir adedinin gözden kaçmış olması, az da olsa ihtimal dahilindedir.

Genel olarak silah değil de tabanca konusunu ele aldık. Toplumumuzun bugün en çok tartıştığı konulardan biri tabanca ve buna rağmen yazılı tek bir eğitici kaynak yok.
Hemen herkesin belinde bir tabanca var. Türk toplumu silaha meraklı. Genetik yapımız böyle. Bunu hepimiz biliyoruz. 1980’li yıllardan sonra da taşınması halkımız arasında oldukça yaygınlaştı. Bu bir hataydı. Hata nerede yapılmıştı derseniz... ülkede bir alt yapı oluşturulmadan, kurumlar teşekkül ettirilmeden, eğitim verilmeden, sadece kanun çıkartmakla hemen uygulama başladı ve silah taşıma yaygınlaştı.
Ruhsat alma işlemleri sırasında kimse sormuyor ki, silah alan adam silah nedir biliyor mu? Şimdiye kadar hiç silah görmüş mü veya eline silah almış mı? Tehlikeleri nelerdir? Ne gibi bilgilere sahip olmalı? Hangi disiplin çerçevesinde eğitim almalı?
Sadece bu kadar da değil! En basit bir alet alıyorsunuz, içinden kullanım kılavuzu çıkıyor; fakat silah aldığınız zaman, yanında, değil bir kullanım kılavuzu, en ufak bir bilgi yok. Silah bakımı nasıl yapılır? Silah, nasıl sökülür, nasıl temizlenir ve nasıl toplanır? Nasıl muhafaza edilir? Ateşli silahlar kanununda ne yazar? Sorumluluklar ve cezai müeyyideler nelerdir? vs...
Parayı ödeyen, hastanelerde eziyetli kuyruklar beklemeye razı olan; yüzeysel bir asabiye muayenesi ve formalitelerden geçmeyi göze alan herkes silah sahibi oldu.
Ama önlem alındığı söylenmekte. Gerekli kanunların çıkartıldığı, silah sahibi olmanın zorlaştırıldığı gibi.... Nasıl? Muameleleri zorlaştırarak ve formaliteleri arttırarak; silah ruhsatı almayı eziyet haline getirerek! Bu arada; kulak muayenesinde belirli miktarda "İşitme kaybı" olanlar ne bulundurma ne de taşıma ruhsatı alabiliyor. Ne demekse!.. Silah kullanan kişide zaten işitme kaybı olmaz mı? Silah ruhsatı savunma için veriliyorsa, bir miktar işitme kaybı olan kendini savunma hakkına sahip olmamalı mı?
Bir de sanayici veya iş sahibi savunma için silah alıyorsa, cirosu belirli miktarda olmalı; vergi borcu olmamalı. Yani silah alma hakkı savunma için veriliyorsa; sanayicinin ve iş adamının cirosu düşükse ve/veya vergi borcu varsa kendini savunma hakkı ve can güvenliği olmasın mı? Şayet konu gerçekten savunmaysa, bugün artık şoförlerin bile can güvenliği yok. Şoförler fazla ciro yapamıyorlar diye silah almamalı mı?
Elbette gönül ister ki kimse silah taşımasın!..
Sonunda, her konuda olduğu gibi bu konuda da zıt görüşler belirdi. Silaha karşı olanlar ve silah sevenler.
Bu konu çok tartışıldı. Hâlâ tartışılıyor. Daha çok tartışılacak da... Ama ben bu tartışmaları yersiz buluyorum. Yasaklar getirsek ne olacak? Yasaklara kimler uyar, kimler uymaz?
Milletçe asker yapımız var, silaha meraklı bir yapımız var. Ne yasak getirirsek getirelim, önlem almamız hemen hemen imkânsız. Zaten yasaklara uyanlar, toplumun medenî kesimi. Cahil ve görgüsüze yasak mı işliyor ki?.. Ceza da alsa gene aynı suçu işliyor. Ayrıca ceza kanunlarımızın tam bir caydırıcılığa sahip olmadığı inancı yaygın.
Şayet gene yasak getirecek olursak, sadece belirli bir kültür seviyesi olanlar bu yasaklara uyacak, cahil ve görgüsüzler için değişen bir şey olmayacak. Ve şayet silah taşıma bir savunma aracı olarak kullanılacaksa; cahil ve görgüsüzler, gerçek ihtiyaç sahiplerine göre avantajlı duruma geçecekler. Olacak bundan ibaret. Kazalar, yaralanma ve ölümler sürüp gidecek. Yani kısacası, bu konuda yasak çözüm değil.
1980’den sonra Sn. Kenan Evren’in talimatıyla tüm silahlar toplatıldı. Silahını kimler teslim etti? Sadece kanunlara saygısı olan, suç işlemekten uzak, kültürlü kesim. Sanki çatışmayı onlar yaratıyorlarmış gibi... Peki olaylar durdu mu? Hayır! Cahil, görgüsüz çatışmacı kesimin elinde silahları olduğu gibi kaldı. Peki ne yapmış olduk? Sadece masum vatandaşı korunmasız bırakmış olduk.
Denenmişi bir daha denemenin ne anlamı var?

Silah taşımayı savunmak mümkün değil. Ancak silah taşımaya mutlaka onay verilecekse,  kesin kurallar koyarak insanları serbest bırakmalı. Kim nasıl istiyorsa öyle düşünsün ve düşündüğünü uygulasın. Ancak altını çizerek tekrar ediyorum: anlamlı ve kesin kurallar koyarak ve bu kuralları en sert bir şekilde uygulayarak... Nasıl mı? Yalnız ruhsat alarak değil, ayrıca ehliyet de alarak.
Ruhsat silaha ait olmalı, ehliyetse kullanıcının bulundurma/taşıma yetki belgesi... Nasıl ki arabamızın ruhsatı var, fakat ehliyet almadan direksiyon başına oturamıyoruz; tabanca için de ruhsatımız olmalı ama bulundurmak veya taşımak için de ayrıca ehliyet almalıyız. Araba kullanmak için nasıl önce kurslarda aylarca eğitim alıyoruz, yazılı ve uygulamalı imtihan oluyoruz... Trafik kurallarını öğrenip öğrenmediğimize bakılıyor... Silah konusunda da benzer işlemler yapılmalı. Bir araç kullanmak için bunca eğitim gerekiyor da, doğrudan can almaya yönelik bir alet için neden bu işlemler gerekmiyor, anlamak mümkün değil!
Tabanca taşıma veya bulundurma ruhsatı için anlamsız zorluklar çıkartıp ruhsatsız silah bulundurmayı/taşımayı adeta teşvik ederek sorunu çözmüş görünmek yerine; gerçekten işe yarar, anlamlı kurallar getirilmeli. Mademki silah bulundurma ve taşıma müsaadesi veriliyor...

Silah taşımak demek, iki dertten birini seçmeye razı olmak demektir. Ya namusunu veya canını korursun, silahı kullanırsın; yasalarla başın derde girer... ya da gerek olduğunda ve davrandığında fırsat bulamadan karşı taraf kullanır; canın gider.
Bunun dışında da riskler var. Kaba kuvvet saldırısına uğradığında, hemen silah çekecek değilsin ya... İtişme-kakışma sırasında senin silahın karşı tarafın eline geçerse, gene başın dertte.
İş bu kadarla da kalmıyor. Ne kadar eğitim alırsak alalım, kaza ihtimali sıfır değil. Zihnen veya bedenen yorgun olduğumuz bir dönemde hata yapabiliriz ve silah gereksiz yere ateş alabilir. Söküp takarken veya temizlerken de...
Dünyaca yapılmış bir istatistikten bahsederler:
“Ortalama olarak her silah üç yılda bir istem dışı ateş alır.”
Ne kadar doğrudur bilinmez ama, istem dışı ateş aldığına ben şahit oldum. Biraz şans eseri, biraz da eğitimli olma sonucu kaza olmadı.
Peki silah taşımak bir işe yarar mı?
Tabanca, savunma silahı olamaz. O sadece bir saldırı silahıdır. Aksini tartışmaya gerek bile yok. Silah taşıyanlar istedikleri kadar “Savunma için” desinler, bu bir aldatmacadan öte değildir. Zira saldıran her zaman hazırlıklıdır. Savunmaya geçen ise saldırıdan sonra davranacaktır. O zaman da zaten ‘geçmiş ola’...
Saldırıya uğrama durumunda veya saldırı tehlikesi baş gösterdiğinde yapılacak en büyük hata silah göstererek savunmaya geçmektir. Karşınızdaki de silahlıysa, siz elinizi silaha götürürken  sizden önce silaha davranabilecektir. Ve de mutlak ateş etmek üzere... Zira sizin ona silah göstermekle yetineceğinize güvenemez. Siz silah gösterdiğinizde, karşıdakinin de silahı varsa, tek şansı ateş etmektir. Silaha davranmakla, daha işin başında, karşınızdakinin silahı varsa, ateş etmeye karar vermesine sebep oldunuz demektir. Halbuki saldırgan, silahlı olmasına rağmen belki de silah kullanmaya niyetli değildi. Sadece kaba kuvvet göstererek işi kapatacaktı. Belki de basit bir hırpalanmayla, başınız büyük derde girmeden kurtulacaktınız.
İşte bu sebeple silah gösterilmez; çekildiği anda ateşlenir. Hem de yaralamak veya öldürmek üzere... Bu da başka bir kuraldır.
Silah taşımak zor iştir. Onu kullanma kararını vermek ise daha zor... Yapılacak en ufak bir hata, cana mal olacaktır.
Hele sinirli insanların silah taşımaları asla tavsiye edilmez. Kontrolünü kaybeden insan, hata yapma riski en yüksek olandır. Şuursuzca silahına davranabilir ve gereksiz yere herhangi bir olayı büyütebilir. Mutlaka silah taşımaya karar vermiş bir insan öncelikle, her konuda kendine hakim olabileceğinden emin olmalıdır.

“Yirmili yaşlardayken, her delikanlı gibi ben de silaha merak sarmıştım. Ne var ki o zamanlar silah taşıma ruhsatı almak pek mümkün değildi. Ruhsatsız silah edinmekse benim işim değildi. Ben de kurusıkı bir gaz tabancası almıştım.  Fişeklerinin ucu çekirdek yerine balmumuyla doldurulmuştu. Bunlardan hâlâ piyasada var. Ateş edince yakın mesafeden yaralıyor da... Fişeğin ucundan çıkan balmumu ikiye ayrılıyor ve karşıdakinin canını yakabiliyor. 
Belimde bu tabancayla dolaşıyordum. Bir gün bir olay oldu ve saldırıya uğradım. İki kişiydiler. Biri arkadan benim kollarımı tutuyor, diğeri suratıma yumruk atıyordu. Elim belime yakındı ve kolaylıkla kurusıkı silahımı çekebilirdim. Ne var ki iş dayaktan öteye gitmeyecekti ve ben de dayak yemeye razı oldum ve kurusıkı silahımı çekmedim. Olay o kadarla kapandı. Sonuçta sadece dayak yemiştim. 
Tersine davransaydım, karşımdakinin gerçek silahı olması halinde hayatım tehlikeye girerdi. Bunu düşünebildim ve hata yapmadım.”
Silah taşıyacak kişi, kendinden en az bu kadar emin olmalıdır.

Hüsamettin Yalhı, olayı yaşayan arkadaşından dinlemiş. Olay, 1930’lu yıllarda Koyulhisar’da geçiyor.
Delikanlı, nişanlanmak üzere olan kız arkadaşıyla tenhaca bir parkta geziyor. Karşılarına üç kişi çıkıyor. Soyguncular... Delikanlının ve kız arkadaşının üzerinde bulunan tüm değerli eşyayı alıyorlar. Bu arada delikanlının üzerinde de küçük bir tabanca buluyor, onu da alıyorlar. Delikanlı buna çok üzülüyor ve:
- Ağabey, silahı daha yeni aldım. Hiç değilse onu bana bırak... diyor.
Eşkıya soruyor:
- Ne yapacaksın silahı?
- Ağabey, bakarsın lâzım olur...
Eşkıya cevap veriyor:
- Hadi ordan!.. Şimdi lâzım oldu; kullanamadın. Başka nasıl lâzım olacak da kullanacaksın!..
Böyle diyor eşkıya ve silahı da alıp oradan uzaklaşıyor.

Silah taşıma önerilemez. Fakat insan, aklına koyduğu zaman illa alacak ve/veya bir türlü taşıyacak. Her şeye rağmen silah bulundurmak veya taşımak isteyenlere veya atıcılığa merak salmış olanlara birkaç satırla yardımcı olmak gerekir. Zira bu konuda, toplumumuzun bilinçlenmesi gerek.

Silah rusatı sistemi değişmeli, Kent Haber, Rize Valisi Kasım Esen

Genç yaşlarda, hattâ daha çocukken, toplumumuzda, erkek çocuklar silaha merak salarlar. Bu belki içgüdüyle, belki de anne babanın aldığı oyuncaklardan etkilenmekle oluşur bu istek. Belki de her iki sebeple de... Kültür genetiği sebeptir belki de...
Hiçbir canlıyı öldüremeyen, buna rağmen silah merakı olan bazı silah severlerin ifadesi daha başka. Diyorlar ki:
“Ulaşılamayan hedeflere ulaşabilme arzusunu tatmin.”
Sanki bu düşünce biraz daha akla yatkın gibi...
Hangi amaca yönelik olursa olsun, silah almadan önce bir düşünelim.

Neden silah edinmek istiyoruz?

Saldırı için mi?
Ayrıcalıklı olma veya gösteriş için mi?
Savunma için mi?
Ulaşılamayan hedeflere ulaşma arzusunu tatmin için mi?
Önce şunu bilmemiz gerekir ki, silah taşıyor olmak ayrıcalıklı olmak demek değildir. Tam tersine toplumda rağbet görme yerine itici olmaya sebeptir. İnsanlar size ya tehlikeli bir insan gözüyle bakarlar, ya da her an tehlikeyle karşı karşıya olan insan gözüyle... Hangi sebeple olursa olsun iticisinizdir. Kimse sizinle birlikte olmaktan mutluluk duymaz.
Çevreye karşı bir üstünlük de sağlayamazsınız. Zira her isteyenin temin edeceği bir şeydir bu. Silah almak çok kolay; böyle ayrıcalık olmaz. Ayrıcalık odur ki, büyük gayretle veya yetenekle sayılı kişiler tarafından elde edilsin... Yoksa her müracaat edenin elde edebildiği şey ne üstünlük olur, ne de ayrıcalık.
Bu niyetle silah alacak olanlar duygularını tekrar gözden geçirmeli.
Saldırı için alınan silaha söylenecek bir söz yok. Allah akıl fikir versin; doğru yola iletsin!
Savunma için alınmışsa durumu bir gözden geçirelim:

Sanayiciler,
Mutemetler,
Hukukçular,
Kuyumcular,
Kırsal alanda çalışanlar, ve müteahhitler vs...
Daha önce de belirtildiği gibi, savunma için pek işe yaramamasına rağmen nadir durumlarda işe yarayabileceği varsayılır.
Bir saldırı vaki olmuş ve kurtulabilmiş, bir yere sığınabilmişseniz, vakit kazanmış ve silahtan yararlanabilir bir duruma gelmişsiniz demektir. Aksi halde, saldırgan her zaman avantajlıdır. Zira hedefini seçmiştir. Siz ise hedefsiz ve hazırlıksızsınızdır. Silah sahibi olmanıza rağmen korunma ve savunma şansınız zayıftır. Ayrıca gene daha önce bahsettiğim gibi, kendinizi silahla koruyabildiğiniz zaman da yasalarla başınız derde girecektir. Bu bakımdan Allah muhtaç etmesin!
Belirli adedin üzerinde işçi çalıştıran sınai işletme yöneticilerine silah taşıma ruhsatı veriliyor. Ne amaçla işçi sayısına bakılmaktadır diye düşündüğümüzde bir mantık bulabiliyoruz. Toplum psikolojisi sebebiyle meydana gelebilecek olaylara karşı diyebiliyoruz.
İşçinin provoke edilmesiyle meydana gelebilecek, şuursuz bir ayaklanma karşısında havaya ateş açılması, insanların bir anda kendine gelmesine yardımcı olabilir ve “Ben ne yapıyorum?” diyerek davranışlarını kontrol altına alabilir. Yoksa şahsa ateş edilebilir anlamı taşımaz.
Sınaî işletme yöneticisinin saldırıya uğrama ihtimali varsa, genellikle fabrika alanı içindedir. İşçi, iş alanına, üst aramasından geçerek girdiğinden silahsız olduğu muhakkaktır (diye düşünülür). Sınai işletme yöneticisinin kütlesel bir kaba kuvvete maruz kalma riski vardır; silahlı saldırıya uğrama riski çok zayıftır. Bu bakımdan, zaruret halinde silah kullanımı, havaya ateş açma şeklinde olacaktır. Bu da can kaybına sebebiyet vermeyecektir.
Diğer iş sahiplerinin silah taşımaları ise doğrudan can güvenliğine dayalıdır. Tabi ne kadar işe yarayacaksa!
Özellikle mutemetler, kuyumcular ve hukukçuların silah taşımaları ayrı bir risk unsurudur. Zira bu iş sahiplerinin, saldırıya uğrama riski, sınai işletme yöneticisinden farklı olarak, genellikle sivil toplum içinde, halkın arasındayken vardır. Bu durumda silah kullanmak son derece sakıncalıdır. Zira havaya ateş etmek saldırı riskini azaltmayacak, tam tersine artıracaktır. Saldırgan silahlıysa, toplum içinde sorumsuzca ateş edebilecek fakat iş sahibi silahını çekmesine rağmen kullanma kararını bir türlü veremeyecektir. Zira halka zarar vermesi söz konusudur. Saldırgan ise; karşısındaki silah çektiğinden, kendini korumak için çekinmeden ve sorumsuzca ateş edebilecektir.
Burada da görülüyor ki, silah taşıma, pek bir işe yaramıyor.
Hangi meslek sahibi olursa olsun, silah taşımayı ciddi bir biçimde ve defalarca gözden geçirmelidir.
Öyle görülüyor ki, silah, aklı başındaki insanlar için amatörce bir zevkten öteye geçemiyor. Şu halde gelin, silah taşımak yerine amatörce bu zevkimizi tatmin edelim.
Bunun için de kurallara sadık kalmak mecburiyeti var.
Bazı silah sporuna meraklı olanların bir iddiası var:
“Silahlı spor, en tehlikesiz spordur!”
Elbette büyük bir iddia!.. Ne var ki, gerçekten de atış sporlarında (avcılık dışında) herhangi bir kaza olduğu pek görülmüyor. Bu iddiada bulunanların tezi şu:
“Silah sporunda dikkat yok; mutlak kural var!”.
Diyorlar ki:
“Hangi sporda kurallara uyarsanız uyun kaza olur. Fakat silahlı sporda kurallara uyulduğunda, kaza söz konusu değildir.”
Bu iddialar ne kadar doğrudur bilinmez. Ancak akla yatkın gelen husus, kurallara mutlak uymak...

'Silah, Çeşitleri ve Seçimi:
Silahlar (tabancalar), mermi muhafaza bölümlerine göre şarjörlü veya toplu (revolver) olarak adlandırılırlar. Ayrıca kullanılan mermilerin çaplarına göre sınıflandırılırlar.
Şarjörlü tabancaların kendine göre; toplu tabancaların da kendilerine göre avantaj ve dezavantajları vardır.

Şarjörlü tabancaların emniyet kilidi vardır. Emniyet kilidi kapalı olsa dahi, namlu canlıya çevrilmez. Her ne kadar adı “Emniyet kilidi” de olsa, silaha güven olmaz. Neticede bir makinedir ve her an mekanik bir aksaklık söz konusudur. Emniyet kilidi sadece bir miktar emniyettir. Güvenilmez. 
Şarjörlü tabancalar, toplu tabancalara göre daha fazla mermi alırlar. Mermi alış miktarları 6+1’den 15+1’e kadar değişir.

Şarjörün aldığı miktardan 1 fazlası demektir ki bu mermi de namluya sürülen mermidir.

Toplu tabancalar zannedildiğinin aksine mekanizmaları dolayısıyla yarı otomatiklerden daha basit ve  tehlikeli silahlardır. Herhangi bir düşürme ve benzeri durumda ateş alma özelliği vardır.

Bazı tabancaların çapları kalibre (Cal) cinsinden, bazılarınınki de mm cinsinden ifade edilirler. Kalibre, 1 İnç’in %10’udur.
mm cinsinden ifade edilenler 6, 35 mm, 7,65 mm, 9 mm gibi.
Kalibre cinsinden ifade edilenler 22 Cal, 32 Cal, 38 Cal ve 44 Cal gibi.
Bunların kaç milimetreye eşdeğer olduklarını hesaplamak için belirli bir kalibreyi 0,254 ile çarpmak yeterlidir.
Örnek: 38 kalibrenin kaç mm’ye eşdeğer olduğunu anlamak istersek; 38 x 0,254 = 9,652 mm buluruz.
Kalibre cinsinden ifade edilen silahlar genellikle Toplu (Revolver) tabancalardır. Şarjörlü tabancalar ise genellikle mm cinsinden ifade edilirler.
357 Magnum olarak tabir edilen silahların mermi çapları 38 kalibre olup, 38 kalibre mermiye göre barut hakkı daha fazla ve mermileri 38 kalibreye göre daha uzundur. 357 Magnum bir silahta 38 kalibrelik mermi kullanımı mümkün olup bunun tersi mümkün değildir. Yani 38 kalibrelik bir silahta 357 Magnum mermi kullanılamaz.

Menzil; “Azami menzil” ve “Etkili menzil” olarak iki türlü tanımlanır. Azami menzil; merminin ulaşabileceği en uzak mesafedir. Etkili menzil ise, merminin öldürücü tesirinin olduğu en uzak mesafedir.
Her mermi namluyu terk ettikten sonra belli bir mesafe düz (düz kabul edilecek kadar az bir sehim [sarkma] yapar) gider, daha sonra düşmeye başlar. Düşmeye başlamasıyla birlikte öldürücü etkisini de kaybeder.
Mermiler, namludan belli bir hızda çıkarlar. Hızları ve menzilleri; silahın namlu uzunluğu, merminin çapı ve merminin barut hakkına göre değişim gösterirler. Meselâ, 357 Magnum mermisi 38 kalibre olmasına rağmen, menzili 38 kalibreye göre daha fazladır. Zira kovandaki barut miktarı 38 kalibre mermiden daha fazladır.
Silahların namluları uzadıkça ve mermilerin çapı büyüyüp çekirdeğin ağırlığı arttıkça hızları da menzilleri de artar. 
Kabaca bir bilgi vermek gerekirse; 9 mm’lik bir Parabellum mermisinin çekirdeği 8,1 gr civarında olup, 365 m/s bir hıza sahiptir. 357 Magnum 10,35 gr civarında olup 425 m/s hıza sahiptir. 44’lük Magnum ise 15,65 gr bir çekirdeğe sahip olup hızı 445 m/s’dir.
Tesirli menzilleri ise, silahın namlu uzunluğuna göre, 300 m ila 600 m arasında değişir.

Silah seçilirken dikkat edilmesi gereken en önemli husus, silahın çeşidi değil, elimize oturup oturmadığıdır. Elimizle tam kavrayamadığımız bir silahla sağlıklı atış yapamayacağımız ortadadır. Bu bakımdan tercihimiz olan silahların elimize ne kadar oturduğunu tetkik etmeliyiz. Ellerimiz küçükse veya parmaklarımız kısaysa, kalın kabzalı bir silahı tam kavrayamayız ve sol işaret parmağımız tetik muhafazasının önüne ulaşamaz.
Bunun tam tersi, parmaklarımız uzun ve elimiz büyükse; küçük ve dar kabzalı bir silahı elimizle gene tam kavrayamayız.
Şu halde seçimimizi yaparken, sağ ve sol ellerimizin kabzayı tam olarak kavrayarak, silahın güvenle elimize oturduğunu, sol elimizin de, sağ elimizi kavrayarak, işaret parmağının tetik muhafazasının önüne geçebildiğini ve rahatça kavradığını hissetmeliyiz (Şekil 2). Şayet parmağımız bu noktaya erişemiyorsa, parmağımız kısa veya silahın boyu elimize göre uzun demektir. Böyle bir silahı seçmemeliyiz.
İşaret parmağımızın ucu tetiğe rahatça dayandığında, parmağımızın iç yüzünün kabzaya sürtünmemesine dikkat ederiz (Şekil 1). Şayet sürtünüyorsa, seçtiğimiz silahın kabzası elimize göre geniş; veya, parmağımız kısa demektir. Bu durumda kabzası daha dar bir silah seçmek zorundayız demektir.
Aksi halde çok beğenerek alığımız silahımız, tehlikeli bir oyuncaktan öte geçemez. Ne kadar çalışma yaparsak yapalım, iyi bir atıcı olma şansımız yok demektir.

Genel olarak tabancaları saldırı amaçlı ve savunma amaçlı olarak ayırabiliriz. Her silah ölümcül olmakla beraber, çapı büyüdükçe hayat hakkı tanımaz hale gelir. Bu bakımdan 9 mm ve 38 kalibre ile bu çapların üstündeki çaplarda olanlara “Durdurucu” denir. İnsanın ölümcül bölgelerine değil de bu bölgelerin yakınlarına dahi isabet etse, öldürücü etki gösterirler. İsabet almış kişiler, karşı saldırıda bulunma şansını o anda kaybettikleri için bu çaplar ve üstündeki çaplara “Durdurucu” denmiştir.
Büyük çaplı silahların, çelik yeleğe rağmen öldürücü etkisi söz konusudur. Çelik yeleği delemezse de, kalp çevresine isabet etmiş bir mermi, meydana getirdiği sert darbe neticesinde kalbin ritmini bozarak ölüme sebebiyet verebilir.
Büyük çaplı silahların, ateş edildiğinde tepmeleri yüksektir. Bu bakımdan spor amaçlı kullanılmaları pek 
anlamlı değildir.
Tip:
Silah seçiminde diğer husus, “Şarjörlü” veya “Toplu” tabanca seçimidir. Burada gene amaç önemlidir.
Her ikisinin avantaj ve dezavantajlarını gözden geçirelim ve seçimimizi ona göre yapalım:
Toplu tabancalar yalnızca 6 mermi alırlar. Namluda mermi bulunmaz. İlk atışta kurmaya ihtiyaç yoktur. Tetik çekildiğinde ateş alır.
Şarjörlüler ise 7 taneden 15 taneye kadar değişen miktarlarda mermi alırlar. Bir de namluya sürersek +1 olurlar. İlk atıştan önce mekanizmayı kurarak mermiyi namluya sürmek gerekir.
Toplu tabancalarda 6 adet mermiyi kullandıktan sonra topun içinde kalan boş kovanları topun ön eksenindeki iticisi vasıtasıyla dışarı atmak ve yeniden doldurmak (Topun içine mermileri tek tek yerleştirmek) zaman alır. Bu sakıncası sebebiyle bir çözüm üretilmek istenmiş ve aksesuar olarak topa benzer altılı bir yuva üretilmiştir. Bu yuvaya vaktiyle yerleştirilmiş mermiler, topa yaklaştırılarak itildiğinde bir defada 6 mermi birden topa girmektedir. Ancak bu yaklaşım da pek pratik olmadığından çokça kullanılmamaktadır.
Şarjörlü tabancalarda, mermiler şarjörlerin içine vaktiyle yerleştirildiğinden, silah boşaldığında bir parmak hareketiyle boş şarjör dışarı atılır, yenisi tek bir hareketle yerine sürülür. Silahı yeniden kurmaya da gerek yoktur. Son merminin de atılmasından sonra açık kalan kapak takımı, başparmağın bir hareketiyle yerine otururken yeni mermiyi de namluya sürer. Silah atışa hazırdır. Çok sayıda mermi atışı gerektirecek durumlarda tercih edilmelidirler.
Toplu tabancalarda atış sırasında, herhangi bir sebeple merminin ateş almaması halinde, atışa devam edip tetiği yeniden çektiğimizde, topun dönmesiyle horozun karşısına yeni bir mermi geldiğinden atış garantidir. Mekanizma sıkışması veya tutukluk söz konusu değildir.
Şarjörlülerde ise, tetik çektiğimizde mermi ateş almazsa, mekanizmayı yeniden kurarak ve namludaki mermiyi dışarı atarak, yeni mermi sürmek suretiyle ancak ikinci defa atış şansını elde edebiliriz. Ne var ki bazen bu da mümkün olamaz; mermi, namlu ile kapak takımı arasına sıkışıp kalabilir. Bu durumda bakım yapılıncaya kadar silah atış dışı kalır.
Toplu tabancalarda emniyet yoktur. Tetiğin her çekilişinde silah ateş alır. Dolu bir silahı, ilk atış için kurmaya gerek yoktur. Ancak tetiği çekerken; tetik, horozu da kuracağından parmağın bir miktar kuvvet harcaması gerekecektir. Harcanan bu kuvvet yüzünden el oynar ve hedef şaşar. Bu sakıncayı ortadan kaldırmak için, her ateşten önce horozu kurmak yararlıdır. Horoz kurulduktan sonra, tetiğe küçük bir kuvvet uygulanması horozu düşürecek ve silah ateş alacaktır. Ancak bu işlem bir vakit kaybıdır. Hedefe art arda ateş etmek gerektiğinde ya her atış için zaman kaybederek horozu kurup hedefi şaşmamak; ya da zaman kazanmak için horozu her sefer kurmadan peş peşe tetiği çekerek hedefe isabet ettirmeyi riske etmek gerekecektir.
Şarjörlü silahlarda ise durum farklıdır. Silah doldurulduktan sonra, kapak takımı tabir edilen mekanizmayı bir defaya mahsus geri çekip bırakarak kurmamız gerekecektir. Bu sayede ilk mermi de namlunun içine girecektir. Kapak takımı geri çekilirken horoz da kurulmuştur. Tetiğe hafif bir basınç uygulamakla horoz düşecek, silah ateş alacaktır. Her atıştan sonra geri tepen kapak takımı, geriye gelerek horozu kendiliğinden kuracak ve yayın etkisiyle tekrar yerine dönerken mermiyi de namluya sürecektir. Bu bakımdan art arda yapılacak atışlarda vakit kaybetmeden, parmağa fazla kuvvet uygulamadan, hedefi pek şaşmadan vurabilmek imkânı toplu tabancalara göre daha fazladır. Ancak burada unutmamak gerekir ki, silah ateş aldıktan sonra tepkime nedeniyle elimiz gene sallanacak ve ikinci atış için hedefe yeniden nişan almak gerekecektir. Ama gene de toplu tabancalara göre seri atışlarda isabet şansı daha yüksektir.
Daha küçük çaplardaki silahlar ise; mermilerinin isabet ettiği kişilerde, mermi doğrudan öldürücü bölgeye, yani kalp, şah damarı, atardamar gibi bölgelere gelmemişse, yalnızca iç kanamaya sebebiyet verirler. Yaralının kısa sürede hastaneye kaldırılıp müdahale edilmesi durumunda hayat kurtarılabilir. Bu silahlar (Küçük çaplı) genellikle savunma ve sportif amaçlar için tercih edilirler. Çünkü savunmada amaç öldürmek değil, saldırganı etkisiz hale getirmektir. Tepmeleri fazla olmadığından spor amaçlı kullanıma da daha uygundurlar.

Son Söz
Silah, tehlikeli bir merak... Sadece merak sebebiyle silah sahibi olmanın doğru olmayacağı düşünülmelidir. Merak sahipleri, silah edinmek yerine poligonlarda bu meraklarını giderebilirler. Savunma için silah taşımanın da pek bir işe yaramayacağı bellidir. Ama mutlaka bir silaha sahip olacaksak da kurallara kesinlikle uymamız gerektiğini bir kere daha hatırlatmak doğru olur.
AB ülkelerinde silah taşımak mümkün değil. Biz de bütün yasalarımızı değiştirerek AB’ye girme çabasında olduğumuza göre, bu konuda hükümetlerin ne düşündüğü de doğrusu merak konusu. Şayet bugünkü silah yasasını değiştirip (silah taşıma yetkisini kaldırıp), AB’ye uyum sağlanacaksa, o kadar çok itirazla karşılaşılacaktır ki, sırf bu sebeple bile AB’ye girmemiz mümkün olmayabilir (tabi mutlaka girmemiz gerekiyorsa...)
Dileğimiz o ki, güvenlik güçlerinin dışında kimse silah taşımasın, silaha ihtiyaç duymasın.

İlk Kullanımdan Önce:
Toplum olarak heyecanlı ve aceleci bir yapımız var. Bir silah sahibi olur olmaz, bir an önce uygun bir ortama giderek atış yapmak isteriz. Halbuki önceden yapmamız gereken bazı işler vardır ve silah kullanımı sakin ve bilinçli olmayı gerektirir. Heyecan, sinirlilik, acelecilik gibi durumlar tehlikeyi de beraberinde getirir. Silah taşınması ve kullanılması mutlak bir eğitim ve disiplin işidir. Eğitimden ve disiplinden yoksun olan kişilerin mutlaka silahtan uzak durması gerekir.
O halde, öncelikle yapmamız ve yapmamamız gereken durumları kısaca gözden geçirelim:

Silah sahibinin, kullanımdan önce silahını sökme ve takmasını öğrenmesi gerekir. Zira her silah atış öncesinde ve sonrasında mutlaka temizlenmelidir. Bunun için de mekanizmanın tamamen sökülmesi gereklidir. Sökme ve takma sırasında namluda mermi olmadığından emin olunmalıdır.
Her silahın farklı bir mekanizması olması sebebiyle sökülmesi ve takılması değişik şartları içerir. Bu bilgileri, silahı aldığımız kişi veya kurumdan öğrenebileceğimiz gibi, Emniyet Teşkilatından veya Silah Atış Poligonları yetkililerinden de öğrenebiliriz. Bu hususta yardım almak için mutlaka ehliyetli kişi veya kurumları aramak gerekir. “Ben bilirim” diyen kişilerden de uzak durulmalıdır. Bu da bir eğitim ve disiplin işidir.

Silaha mermi doldurulması ve boşaltılması yalnız ve güvenli bir ortamda yapılmalıdır.

Dikkat edilmesi gereken en önemli husus, şarjörün (Şekil-1) tıka basa doldurulmamasıdır. Şarjörün alabildiği kadar mermiyle doldurulması, mermileri itecek olan yayın sıkışması anlamını taşır. Uzun süre bunca baskı altında duran bir yayın bir de sonuna kadar sıkışması, mermilerin rahat hareket etmesini önleyebilir. Kullanım sırasında namluya yeni mermi yüklemesine engel teşkil edebilir. Bu sebeple şarjöre konulacak mermi sayısı, kapasitesinden en az 1 eksik olmalıdır.

Topun bütün gözlerinin dolu olmasında teknik açıdan bir sakınca yoktur. Ancak silah üzerimizde değilken, topun yana açılmış olarak ve içinde mermi olmaksızın bırakılması güvenlik açısından gereklidir (Şekil-2).
Toplu silahlarda emniyet mandalı olmadığından, bazı kişiler bir mermi eksik koyarlar ve boş olan yuva, tetik çekildiğinde namlunun önüne gelecek şekilde topu ayarlarlar. Bu şekilde, tetiğin ilk çekilmesinde silahın ateş almasını önlerler. Böylece kısmi bir emniyet sağlanmış olduğu düşünülür.

Silah sahibi olduktan hemen sonra bazı malzemeler edinmemiz gerekir:

Şayet silah taşıyacaksak, bunu usulüne göre yapmamız gerekir. Yani bir kılıf almamız... Pantolonun kemerine silah sıkıştırmak ciddiyetten uzak olunduğunu gösterir. Böylesine bir davranış, en hafif tabiriyle görgüsüzlüktür. Daha sert ifadeler kullanılması da yersiz sayılmaz. Bu bakımdan bir taşıma kılıfı edinmemiz gerekmektedir.
Taşıdığımız silahın, çevre tarafından görülmesine engel olacak bir tarz seçmemiz gerekir. Aksi halde saygınlığımızı yitiririz. Esasen hukuken de taşınan silahın çevreye gösterilmesi, teşhir edilmesi suç teşkil eder. Bu bakımdan seçilecek kılıfın kıyafetimizle uygun olması, silahın üzerimizde görünmesini mümkün olduğu kadar engellemesi şartı aranır. 
Yazlık ve kışlık kıyafetle kullanılacak kılıflar farklıdır. Bu bakımdan, yaz ve kış, devamlı silah taşıyacaksak, birden fazla kılıfımız olması gerekecektir.
Silah kılıflarının; pantolonun bel kemerine, gömlek altına, ceket altına takılan çeşitleri vardır. 
Ceket giyeceksek; omuzdan atkılı, koltuk altı kılıfı seçilebileceği gibi, pantolon kemerine takılacak kılıf da seçilebilir.
Ceket giymeyeceksek; iç çamaşırı üstüne, askısız, vücuda sarılan, yelek şeklinde kılıf kullanabileceğimiz gibi, gene pantolon kemerine takılan kılıfı da seçebiliriz. Ancak, pantolon kemerine takılacak kılıfı seçersek, bu kılıf, pantolonun iç kısmında duracak şekilde takılmalı ve mutlaka gömleğimiz dışarı sarkarak silahı örtmelidir. Yani bu durumda gömlek, pantolon içine sokulmamalıdır. Silahın herhangi bir patlama sonucu size büyük zararlar verebilir ve bu konuda dikkatli olunması şarttır.

Daha önce de değindiğimiz gibi, her atıştan önce ve sonra silahın temizlenmesi gerekir. Bu temizleme işlemleri bazı basit araçlarla yapılmaktadır. Her silahın çapına göre temizleme takımı vardır. Bir çapa göre olan temizleme takımı, diğer bir çaptaki silahı temizlemeye yaramaz. Her çap için ayrı bir temizleme takımı gerekir. 
Temizleme takımı genellikle namlunun içini temizlemek için fırçalardan oluşur. Bu fırçalar, saplarına bağlı olduğu noktada sağa sola dönebilmelidir. Namlunun içinde ileri ve geri hareket ettirilirken, yiv ve setlerin döngülerine uyum sağlayarak dönebilmelidir. 
Fırçalar kıl ve sarı (pirinç) malzemelerden yapılmışlardır. Normal olarak kıl fırça kullanımı temizlik için yeterlidir. Sarı fırçalar, kıl fırçayla yapılan temizliğin yeterli olmaması halinde kullanılırlar.

Atış sırasında, barutun patlamasıyla meydana gelen anî gaz basıncının küçük bir kısmı namlunun arkasından da kaçar. Bu sırada, tam yanmamış küçük barut parçacıklarını da namlunun arkasından atabilir. Bu, sadece bir ihtimaldir. Ama her ihtimale karşı, bu parçacıkların ve gazın göze gelmesini önlemek amacıyla gözlük kullanımı bir disiplin gereği olarak uygulanmaktadır.

Silah ateş aldığında meydana gelen patlama sesi, özellikle kapalı alanlarda, kulaklara telafisi mümkün olamayacak zararlar verir. Bu bakımdan, atış sırasında kulaklık takmak şarttır. Açık alanda ses etkisi daha az olmasına rağmen kulaklar zarar görmeyecek anlamı taşımaz. Dolayısıyla, atış ortamının kapalı veya açık olmasına bakılmaksızın kulaklık takılmalıdır.
Kulaklıkların da çeşitleri vardır. Kulak içine girebilen, küçük silikon veya lastik parçalarından yapılmış olanlar, taşıma kolaylığı sağladığından tercih edilebilirse de kulağı tam olarak kapatan büyük kulaklıklar daha güvenlidir.

Herkesin gözlerinin çok sağlıklı olması beklenemez. Ancak nişan alarak atış yapabilmek için iyi görme şartı vardır. Bunun için gözleri bozuk olanların dereceli gözlükle atış yapması gerekir.
Doğru atış, iki gözün de açık olduğu durumda yapılır. Zorunluluk durumlarında tek göz kapatılabilirse de tercih edilen bir durum değildir. Zira, tek gözün kapalı olması durumunda, görme alanımız daralacağından, etrafımızdaki hareketliliği gözlemlememiz sınırlanacak demektir. Sol gözümüzü kapatarak nişan alıyorsak, sol tarafımızdaki hareketlilikten haberimiz olamayacak demektir.
İki gözün de açık bulunduğu konumda sağlıklı atış yapabilmemiz için kendimizi küçük bir göz muayenesine tabi tutmalıyız.
Elimizin solak olup olmadığını bilmemiz kadar, gözümüzün de solak olup olmadığını bilmemiz gerekir. Bazı durumlarda eli solak olmayan kişilerde göz solaklığı söz konusu olabilir. Böyle bir kişinin iki gözü açık olarak nişan alması söz konusu olamaz. Mecburen silahı tuttuğu el tarafındaki gözünü açık tutup, diğer gözünü kapamak zorundadır. Eli solak olup da gözü solak olmayan kişilerde gayet tabiidir ki bunun tersi söz konusudur.
Neden dersek; yaratılış itibariyle herkesin iki gözünden bir tanesi hakimdir. Sağ veya sol... Şu halde gözümüzün solak olup olmadığını araştırmamız lâzımdır. Bunun için göz doktoruna gitmemize gerek yoktur. Yapacağımız küçük bir deneyle gözümüzün solak olup olmadığını anlayabiliriz.
İki gözümüz de açık durumdayken elimizi uzatarak tek parmağımızla bizden üç metre kadar veya daha uzakta olan bir noktayı işaret edelim.  Elimizi hiç oynatmadan, sol gözümüzü kapatalım. Parmağımız hâlâ işaret ettiğimiz noktadaysa, gözümüz solak değildir. Yok, eğer, iki gözümüzün açık olduğu durumdayken işaret ettiğimiz yer sağa kaçmışsa, gözümüz solak demektir. Kullandığımız el sağ, gözümüz ise solak olduğundan iki gözle nişan alma şansımız yok demektir. Bu durumda nişan alırken, silahı tuttuğumuz elimiz tarafındaki gözümüzü açık tutarak diğerini kapatmamız gerekecektir. Elbette bunun tersi de söz konusudur.

Kullanımdan önce silah namlusunun yağsız olduğundan emin olunmalıdır. Zira namlusunun içi yağlı bir silahla ateş etmek tehlikelidir! Namlu dağılabilir. Çekirdeğin namlu içindeki sürtünmesiyle meydana gelen ısı; ve/veya barutun yanmasıyla meydana gelen ısı; ve/veya barutun yanmasıyla meydana gelen gazların yağla etkileşimi sonucu namlunun patlayarak dağılacağı söylemi yaygındır. Kimyasal ve/veya fiziksel olabilecek bu olgunun nedenlerini bilmemekteyim. Ne var ki kesin kural olarak, her atıştan önce silahın sökülerek, namlusunun içinin ve dışının kuru bir bezle silinmesi şarttır. Namlu içinde “Yiv” ve “Set” olarak tanımlanan döner kanallar vardır. Bu kanalların arasında yağ veya nem kalmayacak şekilde temizlenmesine özen gösterilmelidir.

Silahı yeni aldığımızda, ve silah boşken, merak ve heyecanla hemen tetik çekeriz. Hem de peş peşe... En büyük hatayı burada yaparız. Zira horoz düştüğünde iğneye vurur. İğne ise karşısında merminin kapsülünün bulunduğu yumuşak bir pirinç parçayla karşılaşmak ister. Halbuki silah boş olduğundan, iğnenin horozdan aldığı darbe tek taraflı kalacak ve iğnenin ucu boşta kalmanın etkisiyle kırılma riskine girecektir. Yumruk attığımızda, karşımızdakinin çekilmesi halinde yumruğumuzun boşta kalmasıyla geçirdiğimiz sarsıntı ve omzumuzun acıması gibi... Silahımızın zarar görmesini istemiyorsak, boş silahla tetik çekmemeliyiz. Elbette birkaç denemeyle bir şey olmaz ama sakıncalıdır.

Bu çorba, genellikle karidesle pişirilen bir tür sıcak ve ekşi bir Tay çorbasıdır. "tom" ve "yum" olan iki Tayca kelimeden türetilmiştir. Tom kaynatma sürecini ifade ederken, yum 'karışık' anlamına gelir.

400 gram orta boy karides
4 su bardağı su
2 sap limon otu
4 su bardağı kavak mantar
Yarım su bardağı süt
Çeyrek su bardağı Thai chili biber salçası
Çeyrek su bardağı lime suyu
3 yemek kaşığı balık sosu
10 adet galanga (ince halkalar halinde kesilmiş)
1 - 1.5 çay kaşığı kadar kişniş
7 kafir limon (Kaffir Limi) yaprağı

Karidesleri soymadan ve temizlemeden önce durulayın. Tencereye karideslerin baş ve kabuklarını ekleyin ve orta ateşte ocağa yerleştirin. Karides kabuklarını,  kokusu çıkmaya başlayana ve tencerenin dibine yapışanlar, hafif kahverengileşmeye başlayana kadar sotelemelisiniz.
Suyu da ilave edip tencereye yapışan ve kızaran parçaları sıyırın. 16 dakika pişirin ve kabukları tencereden çıkarmak için oluklu bir kaşık kullanın, mümkün olduğunca fazla sıvı akıttığınızdan emin olun. Daha sonra limon otunu parçalara ayırmadan önce parçalayın. Kafir limon yapraklarını yırtın ve biberleri bir havanda ezin ya da ince doğrayın. Önceden yapılmış stoğu kaynatın ve limon otu, havlıcan, kafir limonu yaprakları ve biberleri ekleyin. Yaklaşık 6 dakika daha kaynatın, otları çıkarın. Buharlaşan sütü ekleyin, karışımı kaynatın. Mantarları ekleyin ve yaklaşık 1 dakika pişirin. Daha sonra biber salçası ve balık sosu ekleyin ve çözünmesi için karıştırın. Karidesin etini ekleyin ve bitene kadar yaklaşık 20 saniye pişirin. Ocağı kapatıp çorbayı hafifçe soğumaya bırakmalısınız. Limon suyu ve uzun kişniş veya kişniş yaprakları ile karıştırma yapınız. Sıcak veya ılık servis edebilirsiniz.
not: Limon otu, Kaffir Limi yaprakları gibi malzemelerin, ideal olarak çıkarılması gereklidir. Eğer çorbanın üzerine biraz garnitür olarak bırakırsanız, misafirlere bunları yememelerini söyleyiniz.

Bu kitap topolojiyi çok çeşitli yönleriyle  birlikte ele almaktadır. Başlamadan önce topolojinin ne olduğu hakkında genel bir izlenim edinmek için ilk olarak ilgili Vikipedi maddesini bir gözden geçirmenizi tavsiye ederiz.
Topolojiye giriş yapmadan önce en azından kümeler kuramı hakkında temel bilgilere sahip olmanız gerekmektedir. Konuları anlayabilmenizdeki anahtar noktanın, topolojiyi kendi meseleniz gibi sahiplenmeniz ve çalışmalarınızı yazarak ve özellikle de şekil çizmeye çalışarak yürütmeniz olduğunu unutmayın.
Bu kitapta her konu başlığı ayrıntılarıyla birlikte incelenecek, konu içeriğiyle ilgili temel teoremlerin ispatları verilecek, konu çizim ve örneklerle genişletilecek ve her bölüm sonunda zaman kaybetmek istemeyenler için kısaltılmış tanım ve teorem ifadelerinden oluşan, daha sonra gerekebileceği kadarını içeren kısa bir özet sunulacaktır.
Topoloji ile ilgili terimler Türkçeye çok farklı çevrilebildiklerinden, kitabın başlarında birbirlerinin yerine kullanılabilen sözcükler için bir sözlüğe yer verilmiştir. Aynı zamanda daha kullanışlı olacağı düşüncesiyle kitabın başında kapsamlı bir dizin yerleştirilmiştir. Kitabın sonunda ise topolojinin bazı alt dallarına genel bir bakış yapılmıştır.

Önsöz
Kitapta Kullanılan Gösterimler
Eşanlamlı Terimler Sözlüğü
Dizin

Giriş (Temeller)
Mantık
Kümeler
Küme İşlemleri
Bağıntılar
Sıralama Bağıntıları
Denklik Bağıntıları
Fonksiyonlar
Kümelere Yükseltilmiş Fonksiyonlar
Küme Aileleri
Sayılabilirlik
Seçme Aksiyomu
Sayıların Bazı Özellikleri
Cebirsel Yapılar
Özet (Temel Bilgiler)

Giriş (Topolojik Uzaylar)
Topolojik Uzay
Açık ve Kapalı Kümeler
Bazı Özel Topolojik Uzaylar
İç, Dış, Sınır
Yığılma ve Değme Notaları
Kapanış
Yoğun ve Seyrek Kümeler
Komşuluklar
Topolojik Altuzay
Kalıtsal Özellik Kavramı
Topolojilerin Karşılaştırılması
Topolojinin Denk Tanımları
Özet (Topolojik Uzaylar)

Açık ve Kapalı Fonksiyonlar
Süreklilik
Fonksiyonların Ürettiği Topolojiler
Homomorfizm
Topolojik Özellikler
Topolojik Limit

Tabanlar
Yerel Tabanlar
Alt Tabanlar
Komşuluk Tabanı
Tabanlarda Süreklilik

Metrik Uzaylar
Bazı Özel Metrikler
Sınırlılık
Metriğin Ürettiği Topoloji
Metrik Topolojinin Özellikleri
Düzgün Süreklilik
Metriklerin Denkliği
İzometri
Normlu Uzaylar
İç Çarpım Uzayları

T0 Uzayları
T1 Uzayları
Hausdorff Uzayları
T3 Uzayları
T4 Uzayları

1. Sayılabilir Uzay
2. Sayılabilir Uzay
Ayrılabilir Uzay

Dizilerin Yakınsaması
Dizilerde Kaplama Noktası
Dizisel Süreklilik
Alt Diziler
1. Sayılabilir Uzaylarda Diziler

Örtüler
Kompakt Uzaylar
Hausdorff Uzayında Kompaktlık
Kompaktlık ve Süreklilik
Yerel Kompaktlık
Dizisel Kompaktlık
Sayılabilir Kompaktlık
Limitsel Kompaktlık
Lindelöf Uzayları
Metrik Uzaylarda Kompaktlık

Süzgeçler
Süzgeçlerin Yakınsaması
Süzgeçlerde Kaplama Noktası
Süzgeç Tabanları
Topolojik Uzaylarda Süzgeçler
Aşkın Süzgeçler
Süzgeçler ve Kompaktlık
Topolojik Yapıların Süzgeçlerle Kurulması

Topolojik Uzayların Sonlu Çarpımı
Topolojik Uzaylar Ailesinin Çarpımı
Çarpım Uzayında Süreklilik ve Yakınsaklık
Metrik Uzayların Çarpımı
Çarpımsal Özellikler
Kutu Uzayları

Topolojik Uzayların Toplamı
Topolojik Uzayların İliştirilmesi

Bölüm Uzayı

Ayrılmış Kümeler
Bağlantılı Uzaylar
Bağlantılı Kümeler
Bileşenler
Tamamen Bağlantısız Uzaylar
Yerel Bağlantılı Uzaylar
Eğrisel Bağlantılı Uzaylar
Yol Bileşenleri
Yaysal Bağlantılı Uzaylar

Cauchy Dizileri
Tam Metrik Uzaylar
Tamlanış
G-delta ve F-sigma Kümeleri

Nokta-Açık Topoloji
Kompakt Açık Topoloji
Fonksiyon Uzaylarında Yakınsaklık

Reel Doğrunun Kompaktlaştırılması
Alexandroff Tek Nokta Kompaktlaştırması
Stone–Čech Komaktlaştırması
Kompaktlaştırmaların Sıralanışı

Yönlendirilmiş Kümeler
Ağlar
Ağlar ve Süzgeçler
Ağların Yakınsaması
Ağlarda Kaplama Noktası
Alt Ağlar
Aşkın Ağlar

Düzgün Yapılar
Düzgün Uzaylar için Tabanlar
Düzgün Topoloji
Düzgün Uzaylarda Tamlık

Parakompakt Uzaylar
Sigma Kompakt Uzaylar
Metakompakt Uzaylar

Yerel Sonluluk
Metrikleşme Teoremleri
Gömme Teoremleri
Düzgün Uzaylarda Metrikleşme

Topolojik Gruplar
Topolojik Uzaylarda Boyut
Tychonoff Uzayları
Kantor Kümesi
Kapı Uzayları
Ağırlıklı Yığılma Noktaları
Düzenli Açıklık ve Düzenli Kapalılık
T0 Denkleştirmesi
Sayılabilir Zincir Koşulu

Topolojik Uzaylar Arasındaki İlişkiler Tablosu
Kalıtsal Özellikler Tablosu
Topolojik Özellikler Tablosu
Sonlu Çarpımsal Özellikler Tablosu
Çarpımsal Özellikler Tablosu
Bölümsel Özellikler Tablosu

Belirtisiz Kümeler ve Topoloji
Belirtisiz Kümeler
Belirtisiz Topolojik Uzaylar
Lowen Anlamında Belirtisiz Topolojik Uzaylar
Šostak Uzayları
Pürüzsüz Topolojik Uzaylar Uzaylar
Sezgisel Belirtisiz Kümeler ve Topoloji
Genelleştirilmiş Sezgisel Belirtisiz Kümeler ve Topoloji
Aralık Değerli Sezgisel Belirtisiz Kümeler ve Topoloji
Nötrosofik Kümeler ve Topoloji

Ülkemizdeki çeşitli üniversitelerde çeşitli topolojik kavramlar için çok çeşitli karşılıklar kullanılabilmektedir. Bu sözlük öğrenciye bu konuda yardımcı olmak amacını taşımaktadır. Yer yer birden fazla değişik anlamda kullanılan sözcüklerin ayrımları üst simgeli rakamlarla ayırt edilmiş ve karıştırılmamaları için sonlarına bir ";" ile başlayan kısa bir açıklama eklenmiştir.

Ağ  1 : - ; dizilerin genelleştirilmesi 
Ağ  2 : Örgü 1 ; tamamen sınırlılığın tanımında kullanılan sonlu küme 
Ağırlık : Kardinalite 
Ağırlık sayısı : Kardinal sayı 
Aksiyom : Belit 
Alışılmış topoloji : Doğal topoloji, Mutlak topoloji, Reel topoloji, Doğru/Düzlem/Uzay topolojisi 
Ardışan küme : Tümevarımsal küme 
Aşikâr topoloji : Bitişik topoloji, İndiskret topoloji 
Ayrık topoloji : Diskret topoloji, Noktasal topoloji

Baz : Taban 
Belirtisiz: Bulanık 
Belit : Aksiyom 
Bitişik topoloji : İndiskret topoloji, Aşikâr topoloji 
Bulanık: Belirtisiz 
Büyükçe eleman : Maksimal eleman

Civar : Komşuluk 
Cümle : Küme 

Damga : İndis, İndeks 
Değme noktası : Kaplama noktası 
Diskret topoloji : Ayrık topoloji, Noktasal topoloji 
Doğal topoloji : Alışılmış topoloji, Mutlak topoloji, Reel topoloji, Doğru/Düzlem/Uzay topolojisi 
Doğru topolojisi : Reel sayılardaki doğal topoloji 
Düzlem topolojisi : R2'deki doğal topoloji

En büyük alt sınır : İnfimum 
En büyük eleman : Son eleman 
En küçük üst sınır : Supremum  
En küçük eleman : İlk eleman  
Eşsonlu topoloji : Sonlu tümleyenler topolojisi, Tümleyenleri sonlu topoloji 
Eşsayılabilir topoloji : Sayılabilir tümleyenler topolojisi, Tümleyenleri sayılabilir topoloji 

Gerçel : Reel 

Hausdorff uzayı : T2 uzayı 
Hiçbir yerde yoğun (olmayan) küme : Seyrek küme 

İlinge : Topoloji 
İlk eleman : En küçük eleman  
İndeks : İndis, Damga 
İndis : Damga, İndeks 
İndiskret topoloji : Bitişik topoloji, Aşikâr topoloji 
İnfimum : En büyük alt sınır  
İspat : Kanıt 

Kafes : Latis, Örgü 2 
Kanıt : İspat 
Kardinalite : Ağırlık 
Kardinal sayı : Ağırlık sayısı 
Kapanış : Kaplam 
Kaplam : Kapanış 
Kaplama noktası : Değme noktası 
Kısmî sıralı : Tikel sıralı 
Kompakt : Tıkız 
Komşuluk : Civar 
Kontinyum : Sürey 
Küçükçe eleman : Minimal eleman 
Küme : Cümle 

Latis : Kafes, Örgü 2 
Limit kümesi : Yığılma noktaları kümesi, Türev kümesi 

Maksimal eleman : Büyükçe eleman 
Minimal eleman : Küçükçe eleman 
Mutlak topoloji : Doğal topoloji, Alışılmış topoloji, Reel topoloji, Doğtu/Düzlem/Uzay topolojisi 

Noktasal topoloji : Ayrık topoloji, Diskret topoloji

Oransal : Rasyonel 

Örgü  1 : Ağ ; tamamen sınırlılığın tanımında kullanılan sonlu küme 
Örgü 2 : Latis, Kafes ; bir tür sıralı yapı 

Reel : Gerçel 
Reel topoloji : Doğal topoloji, Alışılmış topoloji, Mutlak topoloji, Doğtu/Düzlem/Uzay topolojisi 
Rasyonel : Oransal 

Sayılabilir tümleyenler topolojisi : Eşsayılabilir topoloji, Tümleyenleri sayılabilir topoloji 
Seyrek küme : Hiçbir yerde yoğun (olmayan) küme 
Son eleman : En büyük eleman 
Sonlu tümleyenler topolojisi : Eşsonlu topoloji, Tümleyenleri sonlu topoloji 
Sürey : Kontinyum 
Supremum : En küçük üst sınır  

T2 uzayı : Hausdorff uzayı 
Taban : Baz 
Tamamen sınırlı : Total sınırlı 
Tıkız : Kompakt 
Tikel sıralı : Kısmî sıralı 
Topoloji : İlinge 
Total sınırlı : Tamamen sınırlı 
Tümevarımsal küme : Ardışan küme 
Tümleyenleri sayılabilir topoloji : Eşsayılabilir topoloji, Sayılabilir tümleyenler topolojisi 
Tümleyenleri sonlu topoloji : Eşsonlu topoloji, Sonlu tümleyenler topolojisi 
Türev kümesi : Yığılma noktaları kümesi, Limit kümesi 

Uzay topolojisi : R3, R4, ... ve daha büyük sonlu boyutlu uzaylardaki doğal topoloji

Yığılma noktaları kümesi : Türev kümesi, Limit kümesi

Bu bölümde topoloji ile ilgili konulara geçebilmek için daha önceden biliniyor olması gereken bazı temel konular ele alınacaktır. Bu konuların birçoğu soyut matematik derslerinde incelenmektedir. Bu alt yapının sağlanmış olduğu düşünülüyorsa bu bölüm atlanarak, çalışmalara Topolojik Uzaylar bölümündeki konulardan başlanabilir ve ilerleyen konularda ihtiyaç duyulduğunda yeniden bu bölüme geri dönülerek yalnızca ihtiyaç duyulan kısımların incelenmesiyle yetinilebilir.
Topoloji, matematiğin dallarından birinin adı olmakla birlikte aynı zamanda bu dalın incelediği temel yapının da adıdır, yani matematikte topoloji olarak adlandırılan bir matematiksel yapı çeşidi bulunmaktadır ve topoloji bilimi de bu yapıyı, bu yapının benzerlerini ve bu yapıdan kaynaklanan özellikleri incelemektedir. Topolojiler de dâhil, hemen hemen her matematiksel yapı, kümeler üzerinde kurulur. Bu bakımdan, topolojiye giriş yapmadan önce mutlaka, kümeler ile ilgili bilgi sahibi olmak gerekmektedir.
Kümelerle ilgili kavramların çoğu, mantık ilkeleriyle oldukça yakından ilgilidir. Örneğin iki kümenin birleşimi, iki önermenin “veya” bağlacıyla bağlanmasını gerektirmektedir. Karşımıza çıkacak ispatların hepsi de mantık ilkelerine dayanmaktadır. Bu sebeple, bu bölümde ilk olarak matematiksel mantık ile ilgili temel konular incelenecektir.Bunlar dışında, her biri kümelerin bir uzantısı olan fonksiyon, bağıntı ve sayılabilirlik benzeri topoloji için temel oluşturan konular da yine bu bölümde incelenecektir.

Bu alt bölümde verilen lemmaların her birinde 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 bir topolojik uzayı, 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 ve 
  
    
      
        B
         
      
    
    {\displaystyle B\ }
  
, 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
'in iki alt kümesini göstermektedir. Büyük kesişim ve birleşimler 
  
    
      
        α
        ∈
        J
         
      
    
    {\displaystyle \alpha \in J\ }
  
'ler üzerinden alınmaktadır.
Lemma : 
  
    
      
        A
        ⊂
        B
         
      
    
    {\displaystyle A\subset B\ }
  
 ise 
  
    
      
        
          
            
              A
              ¯
            
          
        
        ⊂
        
          
            
              B
              ¯
            
          
        
      
    
    {\displaystyle {\bar {A}}\subset {\bar {B}}}
  
 .
İspat : Her zaman 
  
    
      
        B
        ⊂
        
          
            
              B
              ¯
            
          
        
         
      
    
    {\displaystyle B\subset {\bar {B}}\ }
  
  olduğunu biliyoruz. 
  
    
      
        A
        ⊂
        B
         
      
    
    {\displaystyle A\subset B\ }
  
 olduğundan  
  
    
      
        A
        ⊂
        
          
            
              B
              ¯
            
          
        
         
      
    
    {\displaystyle A\subset {\bar {B}}\ }
  
 'dir. 
  
    
      
        
          
            
              A
              ¯
            
          
        
         
      
    
    {\displaystyle {\bar {A}}\ }
  
, 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 'yı kapsayan bütün kapalı kümelerin kesişimi, 
  
    
      
        
          
            
              B
              ¯
            
          
        
         
      
    
    {\displaystyle {\bar {B}}\ }
  
 da 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 'yı içeren kapalı kümelerden biri olduğundan 
  
    
      
        
          
            
              A
              ¯
            
          
        
        ⊂
        
          
            
              B
              ¯
            
          
        
         
      
    
    {\displaystyle {\bar {A}}\subset {\bar {B}}\ }
  
 . ■
Lemma :  
  
    
      
        
          
            
              A
              ∪
              B
            
            ¯
          
        
        =
        
          
            
              A
              ¯
            
          
        
        ∪
        
          
            
              B
              ¯
            
          
        
      
    
    {\displaystyle {\overline {A\cup B}}={\bar {A}}\cup {\bar {B}}}
  
 .
İspat :

  
    
      
        A
        ⊂
        A
        ∪
        B
         
      
    
    {\displaystyle A\subset A\cup B\ }
  
, 
  
    
      
        B
        ⊂
        A
        ∪
        B
         
      
    
    {\displaystyle B\subset A\cup B\ }
  
 olduğundan 
  
    
      
        
          
            
              A
              ¯
            
          
        
        ⊂
        
          
            
              A
              ∪
              B
            
            ¯
          
        
      
    
    {\displaystyle {\bar {A}}\subset {\overline {A\cup B}}}
  
 ve 
  
    
      
        
          
            
              B
              ¯
            
          
        
        ⊂
        
          
            
              A
              ∪
              B
            
            ¯
          
        
      
    
    {\displaystyle {\bar {B}}\subset {\overline {A\cup B}}}
  
 
  
    
      
        ⇒
         
      
    
    {\displaystyle \Rightarrow \ }
  
 
  
    
      
        
          
            
              A
              ¯
            
          
        
        ∪
        
          
            
              B
              ¯
            
          
        
        ⊂
        
          
            
              A
              ∪
              B
            
            ¯
          
        
      
    
    {\displaystyle {\bar {A}}\cup {\bar {B}}\subset {\overline {A\cup B}}}
  
 .......(i)
Diğer taraftan 
  
    
      
        A
        ⊂
        
          
            
              A
              ¯
            
          
        
         
      
    
    {\displaystyle A\subset {\bar {A}}\ }
  
, 
  
    
      
        B
        ⊂
        
          b
          a
          r
        
        
          B
        
         
      
    
    {\displaystyle B\subset {bar}{B}\ }
  
 olduğundan 
  
    
      
        A
        ∪
        B
        ⊂
        
          
            
              A
              ¯
            
          
        
        ∪
        
          
            
              B
              ¯
            
          
        
         
      
    
    {\displaystyle A\cup B\subset {\bar {A}}\cup {\bar {B}}\ }
  
. İki kapalı kümenin birleşimi kapalı olduğundan 
  
    
      
        
          
            
              A
              ¯
            
          
        
        ∪
        
          
            
              B
              ¯
            
          
        
         
      
    
    {\displaystyle {\bar {A}}\cup {\bar {B}}\ }
  
, 
  
    
      
        A
        ∪
        B
         
      
    
    {\displaystyle A\cup B\ }
  
 kümesini kapsayan bir kapalı kümedir ve dolayısıyla 
  
    
      
        A
        ∪
        B
        ⊂
        
          
            
              A
              ∪
              B
            
            ¯
          
        
        ⊂
        
          
            
              A
              ¯
            
          
        
        ∪
        
          
            
              B
              ¯
            
          
        
         
      
    
    {\displaystyle A\cup B\subset {\overline {A\cup B}}\subset {\bar {A}}\cup {\bar {B}}\ }
  
 .......(ii)
(i) ve (ii)'den

  
    
      
        
          
            
              A
              ∪
              B
            
            ¯
          
        
        =
        
          
            
              A
              ¯
            
          
        
        ∪
        
          
            
              B
              ¯
            
          
        
        <
        
          /
        
        m
        
          a
          ‴
        
        L
        e
        m
        m
        a
        
          :
          ‴
        
        <
        m
        a
        t
        h
        >
        {
        
          A
          
            α
          
        
        
          }
          
            α
            ∈
            J
          
        
         
      
    
    {\displaystyle {\overline {A\cup B}}={\bar {A}}\cup {\bar {B}}</ma'''Lemma:'''<math>\{A_{\alpha }\}_{\alpha \in J}\ }
  
 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 'in alt kümelerinin bir ailesi ise 
  
    
      
        
          
            
              ⋃
              
                A
                
                  α
                
              
            
            ¯
          
        
        ⊃
        ⋃
        
          
            
              A
              
                α
              
            
            ¯
          
        
         
      
    
    {\displaystyle {\overline {\bigcup A_{\alpha }}}\supset \bigcup {\overline {A_{\alpha }}}\ }
  
 .
İspat : 
  
    
      
        ∀
        α
        ∈
        J
         
      
    
    {\displaystyle \forall \alpha \in J\ }
  
 için 
  
    
      
        
          A
          
            α
          
        
        ⊂
        ⋃
        
          A
          
            α
          
        
         
      
    
    {\displaystyle A_{\alpha }\subset \bigcup A_{\alpha }\ }
  
 olduğundan 

  
    
      
        ∀
        α
        ∈
        J
         
      
    
    {\displaystyle \forall \alpha \in J\ }
  
 için 
  
    
      
        
          
            
              
                A
                
                  α
                
              
              ¯
            
          
        
        ⊂
        
          
            
              ⋃
              
                A
                
                  α
                
              
            
            ¯
          
        
         
      
    
    {\displaystyle {\bar {A_{\alpha }}}\subset {\overline {\bigcup A_{\alpha }}}\ }
  

  
    
      
         
      
    
    {\displaystyle \ }
  
 
  
    
      
        ⇒
         
      
    
    {\displaystyle \Rightarrow \ }
  
 
  
    
      
        ⋃
        
          
            
              A
              
                α
              
            
            ¯
          
        
        ⊂
        
          
            
              ⋃
              
                A
                
                  α
                
              
            
            ¯
          
        
         
      
    
    {\displaystyle \bigcup {\overline {A_{\alpha }}}\subset {\overline {\bigcup A_{\alpha }}}\ }
  
 ■
Sonsuz birleşimde eşitlik sağlanmayabilir.
Örnek : 
  
    
      
        
          R
        
         
      
    
    {\displaystyle \mathbb {R} \ }
  
'de alt kümelerin 
  
    
      
        
          
            A
          
        
        =
        {
        {
        x
        }
        
          |
        
        x
        ∈
        
          Q
        
        }
         
      
    
    {\displaystyle {\mathcal {A}}=\{\{x\}|x\in \mathbb {Q} \}\ }
  
 ailesini ele alalım.

  
    
      
        
          ⋃
          
            x

Burada kitap içerisinde değişmez olarak kullanılacak gösterimler listelenmektedir.

        =
         
      
    
    {\displaystyle =\ }
  
 : Eşittir

  
    
      
        ≠
         
      
    
    {\displaystyle \neq \ }
  
 : Farklıdır

  
    
      
        ∧
         
      
    
    {\displaystyle \land \ }
  
 : Ve

  
    
      
        ∨
         
      
    
    {\displaystyle \lor \ }
  
 : Veya

  
    
      
        ⇒
         
      
    
    {\displaystyle \Rightarrow \ }
  
 : İse, Gerektirir, İçin gerek şart

  
    
      
        ⇐
         
      
    
    {\displaystyle \Leftarrow \ }
  
 : Ancak, İçin yeter şart

  
    
      
        ⇔
         
      
    
    {\displaystyle \Leftrightarrow \ }
  
 : Ancak ve ancak, İçin gerek ve yeter şart

        ∀
         
      
    
    {\displaystyle \forall \ }
  
 : Her, Bütün

  
    
      
        ∃
         
      
    
    {\displaystyle \exists \ }
  
 : Vardır, En az bir

  
    
      
        ∃
        !
         
      
    
    {\displaystyle \exists !\ }
  
 : Yalnızca bir tane vardır, Vardır tek türlü

        ∈
         
      
    
    {\displaystyle \in \ }
  
 : Elemanıdır

  
    
      
        ∉
         
      
    
    {\displaystyle \notin \ }
  
 : Elemanı değildir

  
    
      
        ⊂
         
      
    
    {\displaystyle \subset \ }
  
 : Altkümesidir

  
    
      
        ⊃
         
      
    
    {\displaystyle \supset \ }
  
 : Kapsar

  
    
      
        
          A
          
            c
          
        
         
      
    
    {\displaystyle A^{c}\ }
  
 : A'nın tümleyeni

  
    
      
        ∪
         
      
    
    {\displaystyle \cup \ }
  
 : Birleşim

  
    
      
        ∩
         
      
    
    {\displaystyle \cap \ }
  
 : Kesişim

  
    
      
        A
        ∖
        B
         
      
    
    {\displaystyle A\setminus B\ }
  
 : A kümesinin B kümesinden farkı

  
    
      
        A
        
          /
        
        B
         
      
    
    {\displaystyle A/B\ }
  
 : A kümesinin B bağıntısına bölüm kümesi

  
    
      
        
          A
          
            X
          
          
            c
          
        
         
      
    
    {\displaystyle A_{X}^{c}\ }
  
 : A kümesinin X evreni içerisindeki tümleyeni

  
    
      
        ×
         
      
    
    {\displaystyle \times \ }
  
 : Kartezyen çarpım

  
    
      
        ⋃
         
      
    
    {\displaystyle \bigcup \ }
  
 : Çoklu birleşim

  
    
      
        ⋂
         
      
    
    {\displaystyle \bigcap \ }
  
 : Çoklu kesişim

  
    
      
        ⨄
         
      
    
    {\displaystyle \biguplus \ }
  
 : Ayrık birleşim (birleşen kümeler birbirinden ayrık, ikişerli kesişimleri boş)

  
    
      
        ∏
         
      
    
    {\displaystyle \prod \ }
  
 : Çoklu kartezyen çarpım

              P
            
          
          
            A
          
        
         
      
    
    {\displaystyle {\mathcal {P}}_{A}\ }
  
 : Bir A kümesinin kuvvet kümesi (bütün alt kümelerini içeren sınıf)

  
    
      
        
          
            E
          
        
         
      
    
    {\displaystyle {\mathcal {E}}\ }
  
 : Evrensel sınıf

  
    
      
        
          
            
              a
              ¯
            
          
        
         
      
    
    {\displaystyle {\bar {a}}\ }
  
 : a elemanını içeren denklik sınıfı

  
    
      
        
          N
        
        =
        {
        1
        ,
        2
        ,
        3
        ,
        .
        .
        .
        }
         
      
    
    {\displaystyle \mathbb {N} =\{1,2,3,...\}\ }
  
 : Doğal sayılar kümesi (Bu kitapta doğal sayıların 1'den başladığı kabul edilmektedir).

  
    
      
        
          
            N
          
          
            0
          
        
        =
        {
        0
        ,
        1
        ,
        2
        ,
        ,
        .
        .
        .
        }
         
      
    
    {\displaystyle \mathbb {N} _{0}=\{0,1,2,,...\}\ }
  
 : 0 Negatif olmayan tamsayılar kümesi

  
    
      
        
          Z
        
         
      
    
    {\displaystyle \mathbb {Z} \ }
  
 : Tamsayılar kümesi

  
    
      
        
          Q
        
         
      
    
    {\displaystyle \mathbb {Q} \ }
  
 : Rasyonel sayılar kümesi

  
    
      
        
          I
        
         
      
    
    {\displaystyle \mathbb {I} \ }
  
 : [0,1] birim kapalı aralığı

  
    
      
        
          R
        
         
      
    
    {\displaystyle \mathbb {R} \ }
  
 : Reel sayılar kümesi

  
    
      
        
          
            Z
          
          
            +
          
        
         
      
    
    {\displaystyle \mathbb {Z} ^{+}\ }
  
 : Pozitif tamsayılar kümesi (Doğal sayılar kümesiyle aynı)

  
    
      
        
          
            Z
          
          
            −
          
        
         
      
    
    {\displaystyle \mathbb {Z} ^{-}\ }
  
 : Negatif tamsayılar kümesi

  
    
      
        
          
            Q
          
          
            +
          
        
         
      
    
    {\displaystyle \mathbb {Q} ^{+}\ }
  
 : Pozitif rasyonel sayılar kümesi

  
    
      
        
          
            Q
          
          
            0
          
          
            +
          
        
         
      
    
    {\displaystyle \mathbb {Q} _{0}^{+}\ }
  
 : Negatif olmayan sayılar kümesi

  
    
      
        
          
            Q
          
          
            −
          
        
         
      
    
    {\displaystyle \mathbb {Q} ^{-}\ }
  
 : Negatif rasyonel sayılar kümesi

  
    
      
        
          
            Q
          
          
            0
          
          
            −
          
        
         
      
    
    {\displaystyle \mathbb {Q} _{0}^{-}\ }
  
 : Pozitif olmayan rasyonel sayılar kümesi

  
    
      
        
          
            R
          
          
            +
          
        
         
      
    
    {\displaystyle \mathbb {R} ^{+}\ }
  
 : Pozitif reel sayılar kümesi

  
    
      
        
          
            R
          
          
            0
          
          
            +
          
        
         
      
    
    {\displaystyle \mathbb {R} _{0}^{+}\ }
  
 : Negatif reel sayılar kümesi

  
    
      
        
          
            R
          
          
            −
          
        
         
      
    
    {\displaystyle \mathbb {R} ^{-}\ }
  
 : Negatif reel sayılar kümesi

  
    
      
        
          
            R
          
          
            0
          
          
            −
          
        
         
      
    
    {\displaystyle \mathbb {R} _{0}^{-}\ }
  
 : Pozitif olmayan reel sayılar kümesi

  
    
      
        
          C
        
         
      
    
    {\displaystyle \mathbb {C} \ }
  
 : Kompleks sayılar kümesi

  
    
      
        
          P
        
         
      
    
    {\displaystyle \mathbb {P} \ }
  
 : Asal sayılar kümesi

  
    
      
        
          A
          
            n
          
        
         
      
    
    {\displaystyle A^{n}\ }
  
 : 
  
    
      
        
          ∏
          
            i
            =
            1
          
          
            n
          
        
        A
         
      
    
    {\displaystyle \prod _{i=1}^{n}A\ }
  

  
    
      
        
          A
          
            ω
          
        
         
      
    
    {\displaystyle A^{\omega }\ }
  
 : 
  
    
      
        
          ∏
          
            n
            ∈
            
              N
            
          
        
        A
         
      
    
    {\displaystyle \prod _{n\in \mathbb {N} }A\ }
  

        (
        a
        ,
        b
        )
         
      
    
    {\displaystyle (a,b)\ }
  
 : a b açık aralığı

  
    
      
        [
        a
        ,
        b
        ]
         
      
    
    {\displaystyle [a,b]\ }
  
 : a b kapalı aralığı

  
    
      
        {
        a
        ,
        b
        }
         
      
    
    {\displaystyle \{a,b\}\ }
  
 : Elemanları a ve b olan küme

  
    
      
        <
        a
        ,
        b
        >
         
      
    
    {\displaystyle <a,b>\ }
  
 : İlk koordinatı a, ikinci koordinatı b olan çarpım kümesi elemanı, sıralı ikili

  
    
      
        ⟨
        a
        ,
        b
        ⟩
         
      
    
    {\displaystyle \langle a,b\rangle \ }
  
 : a ile b'nin iç çarpımı

  
    
      
        (
        
          x
          
            n
          
        
        )
         
      
    
    {\displaystyle (x_{n})\ }
  
 : Dizi

  
    
      
        <
        
          x
          
            i
          
        
        
          >
          
            i
            ∈
            I
          
        
         
      
    
    {\displaystyle <x_{i}>_{i\in I}\ }
  
 : 
  
    
      
        
          ∏
          
            i
            ∈
            I
          
        
        
          A
          
            i
          
        
         
      
    
    {\displaystyle \prod _{i\in I}A_{i}\ }
  
 şeklindeki bir çarpım kümesinin elemanı

  
    
      
        (
        
          x
          
            i
          
        
        
          )
          
            i
            ∈
            I
          
        
         
      
    
    {\displaystyle (x_{i})_{i\in I}\ }
  
 : Ağ

        f
        :
        A
        →
        B
         
      
    
    {\displaystyle f:A\to B\ }
  
 : f, A kümesinden B kümesine bir fonksiyondur

  
    
      
        x
        ↦
        y
         
      
    
    {\displaystyle x\mapsto y\ }
  
 : x elemanını y elemanına taşıyan fonksiyon

  
    
      
        x
         
        
        

Küme kavramı, matematikle ilgisi olan herkes tarafından az çok bilinir. Bununla birlikte kümeyi matematiksel olarak tanımlamak hiç de kolay değildir. Bu sebeple genelde kümenin sözel tanımı ile yetinilir. İlk olarak bu tanımların bazılarını vereceğiz.

Tanım : Küme, nesnelerin iyi tanımlı bir topluluğudur.
Tanım : Küme, belli bir kurala göre verilmiş nesnelerin listesidir.
Tanım : Küme, hangi nesneleri içerdiği tam olarak bilinen en basit matematiksel yapıdır.
Bu tanımların yanında yine belirli, ancak daha küçük varsayımlarda bulunarak kümenin matematiksel bir tanımını yapmak zor olmakla birlikte büyük oranda mümkündür. Önümüzdeki konuda, yalnızca genel bir bilgi olması açısından, bu tanımın nasıl yapıldığını söyleyeceğiz.

Küme kavramının işleyişi ve özellikleri insan aklına oldukça yatkın olduğundan kümelerin net bir şekilde tanımlanmasına genelde ihtiyaç duyulmaz. Ancak dürüst olmak gerekirse kümenin matematiksel olarak tanımlanması gerekmektedir. Her ne kadar sezgisel olarak küme kavramı kolayca kavranabiliyor ise de, dikkatlice düşünen birinin aklında bazı soru işaretleri kalabilir. Örneğin kümelerin kesişimi ile ilgili birçok özelliği ispatlayabiliriz. Ancak 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 ve 
  
    
      
        B
         
      
    
    {\displaystyle B\ }
  
 kümeleri verildiğinde 
  
    
      
        A
        ∩
        B
         
      
    
    {\displaystyle A\cap B\ }
  
’nin de bir küme olacağını garanti edemedikten sonra, bu özellikleri ispatlamanın aslında bir anlamı yoktur. Veya hemen hemen her çalışmada kullanılan boş küme, gerçekten de var mıdır, varsa tek midir, gerçekten boş mudur, evrensel küme diye bir şey var mıdır? Bu soruların cevaplarının bulunabilmesi için kümenin mantık kurallarına bağlı kesin bir tanımının verilmesi gerekmektedir. Aşağıda bu tanımın nasıl yapıldığını göreceğiz, ancak bu kitabın seviyesini ve konusu aşacağı için kümeler ile ilgili gerçekleri bu tanım yardımıyla ispatlamaya çalışmayacağız.
Eğer mantık kurallarına matematiğin anayasası diyeceksek ki diyebiliriz, bir matematiksel yapının aksiyomatik sistemi o yapının kendine özgü yerel yasası olur. Örneğin bir problemde bize bir grup verildiğinde grubun cebirsel anlamda kapalı, birleşmeli, birim elemana ve her elemanı için bir ters elemana sahip bir küme-işlem ikilisi olduğunu kabul ederiz çünkü bir küme-işlem ikilisinden bir grup olarak bahsedilebilmesi için bu şartların sağlanması gerekmektedir. Bu yüzden bir grup verildiğinde bu şartların sağlandığı kesindir çünkü “grup olma yasası” bunu gerektirir. Bu yasanın ayrı ayrı maddelerine de grup aksiyomları adı veririz.
Yukarıdaki örneğe benzer şekilde, kümeler için de bir yasanın (aksiyomatik sistemin) bulunması gereklidir. Bu yasanın maddelerine (aksiyomlarına) küme aksiyomları adı verilecektir. Küme aksiyomları yalnızca kümelerin kendi doğasından dolayı sahip olması gereken özellikleri belirtir, bunlar yoluyla kümenin tanımını vermez, kümenin tanımı genelde bu aksiyomlardan ayrı yerde yapılır. Yine de küme tanımı da bu aksiyomlara eklenerek grup aksiyomlarına benzer şekilde, küme olmayı tam anlamıyla karakterize eden (belirleyen) bir aksiyomatik sistem oluşturulabilir.
Her ne kadar kümenin bilimsel tanımını verecek olsak da, burada açıkça tanımlamamız mümkün olmayan bazı kavramlar bulunmaktadır. Bunlardan ilki değişken veya sabitleri gösteren 
  
    
      
        x
        ,
        y
        ,
        z
        ,
        A
        ,
        B
        ,
        α
        ,
        β
         
      
    
    {\displaystyle x,y,z,A,B,\alpha ,\beta \ }
  
 gibi harflerdir. Aşağıdaki aksiyomları incelerken bilmemiz gereken, bu harflerin her birinin birer nesne olduğudur.
Bir ikili bağıntı, biri doğru biri yanlış olmak üzere iki farklı şekli bulunan ve herhangi iki nesnenin arasına bu şekillerinden yalnızca biri yerleştirilebilen bir semboldür. Bu kavramı, az sonra göreceğimiz eşittir ve elemanıdır ikili bağıntıları ile somutlaştırabiliriz.
Eşittir, tartışmasız matematikte en çok kullanılan ikili bağıntıdır. İkili bağıntı olduğu için eşittirin iki farklı şekli vardır. Doğru şekli  
  
    
      
        =
         
      
    
    {\displaystyle =\ }
  
, yanlış şekli de 
  
    
      
        ≠
         
      
    
    {\displaystyle \neq \ }
  
 ile gösterilir. Yine ikili bağıntı olmasından dolayı, her nesne ikilisinin arasına iki şeklinden yalnızca biri girmek zorundadır yani karşımıza çıkacak her 
  
    
      
        a
         
      
    
    {\displaystyle a\ }
  
 ve 
  
    
      
        b
         
      
    
    {\displaystyle b\ }
  
 nesne ikilisi için 
  
    
      
        a
        =
        b
         
      
    
    {\displaystyle a=b\ }
  
 veya 
  
    
      
        a
        ≠
        b
         
      
    
    {\displaystyle a\neq b\ }
  
 durumlarından yalnızca biri geçerlidir. Ayrıca eşittir ikili bağıntısı simetriktir yani 
  
    
      
        a
        =
        b
         
      
    
    {\displaystyle a=b\ }
  
 olması durumunda kesinlikle 
  
    
      
        b
        =
        a
         
      
    
    {\displaystyle b=a\ }
  
’dır. İki nesnenin eşit olması demek sezgisel olarak; onların arasında görünüş farkı bile olsa nitelik olarak hiç fark bulunmaması, onların özünde aynı şeye verilen iki farklı isim olmaları demektir. Örneğin, dış görünüşleri çok farklı olmasına rağmen 
  
    
      
        2
         
      
    
    {\displaystyle 2\ }
  
 ile 
  
    
      
        1
        +
        1
         
      
    
    {\displaystyle 1+1\ }
  
 ’in birbirine eşit olduğu kabul edilir çünkü bunlar aslında tek bir nesnenin, iki farklı adla yazımından başka bir şey değildir.
Kümelerle ilgili aksiyomları vermeden önce son olarak eşittirden farklı bir ikili bağıntının varlığını kabul edeceğiz. Bu bağıntıya elemanıdır adını vereceğiz ve olumlusunu  
  
    
      
        ∈
         
      
    
    {\displaystyle \in \ }
  
, olumsuzunu 
  
    
      
        ∉
         
      
    
    {\displaystyle \notin \ }
  
 ile göstereceğiz. Şimdilik elemanıdır hakkında, bir ikili bağıntı olduğundan başka hiçbir şey bilmiyoruz yani elimizde yalnızca, 
  
    
      
        a
         
      
    
    {\displaystyle a\ }
  
 ve 
  
    
      
        b
         
      
    
    {\displaystyle b\ }
  
 nesneleri verildiğinde ya 
  
    
      
        a
        ∈
        b
         
      
    
    {\displaystyle a\in b\ }
  
, ya da 
  
    
      
        a
        ∉
        b
         
      
    
    {\displaystyle a\notin b\ }
  
 olacağından başka bir bilgi yok. Bu durumda, eşittir ikili bağıntısından farklı olarak 
  
    
      
        a
        ∈
        b
         
      
    
    {\displaystyle a\in b\ }
  
 olması, 
  
    
      
        b
        ∈
        a
         
      
    
    {\displaystyle b\in a\ }
  
 olmasını gerektirmez; aksine, her ne kadar burada ispatlamayacak olsak da aslında 
  
    
      
        a
        ∈
        b
         
      
    
    {\displaystyle a\in b\ }
  
 ise mutlaka 
  
    
      
        b
        ∉
        a
         
      
    
    {\displaystyle b\notin a\ }
  
 olması gerekir, diğer taraftan 
  
    
      
        a
        ∉
        b
         
      
    
    {\displaystyle a\notin b\ }
  
 ise 
  
    
      
        b
         
      
    
    {\displaystyle b\ }
  
 ile 
  
    
      
        a
         
      
    
    {\displaystyle a\ }
  
 arasına elemanıdır ikili bağıntısının her iki (olumlu veya olumsuz) şeklinin de girmesi olasıdır.
Aşağıda küme aksiyomları listelenmiştir. Bu aksiyomların içerisinde şimdiye kadar tanımlanmamış bazı semboller ve kavramlar bulunmaktadır, bunlar daha sonra tanımlanacaktır. Zaten bu aksiyomları da anlamanız gerekmemektedir.
1. Bütün 
  
    
      
        x
         
      
    
    {\displaystyle x\ }
  
’ler için, 
  
    
      
        x
        ∈
        A
        ⇔
        x
        ∈
        B
         
      
    
    {\displaystyle x\in A\Leftrightarrow x\in B\ }
  
 oluyorsa 
  
    
      
        A
        =
        B
         
      
    
    {\displaystyle A=B\ }
  
'dir. (Genişleme Aksiyomu)
2. 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 bir küme ise 
  
    
      
        
          {
          
            x
            
              |
            
            x
            ∈
            A
             
            
              ve
            
             
            x
             
            .
            .
            .
          
          }
        
         
      
    
    {\displaystyle \left\{x|x\in A\ {\text{ve}}\ x\ ...\right\}\ }
  
 bir kümedir. (Burada 
  
    
      
        .
        .
        .
         
      
    
    {\displaystyle ...\ }
  
, 
  
    
      
        x
         
      
    
    {\displaystyle x\ }
  
'in sağlaması istenen herhangi bir şartı gösterir). (Ayırma Aksiyomu)
3. Öyle bir 
  
    
      
        ∅
         
      
    
    {\displaystyle \varnothing \ }
  
 kümesi vardır ki her 
  
    
      
        x
         
      
    
    {\displaystyle x\ }
  
 için 
  
    
      
        x
        ∉
        ∅
         
      
    
    {\displaystyle x\notin \varnothing \ }
  
'dir. (Boş Küme Aksiyomu)
4. 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 ve 
  
    
      
        B
         
      
    
    {\displaystyle B\ }
  
 birer küme ise 
  
    
      
        {
        A
        ,
        B
        }
         
      
    
    {\displaystyle \{A,B\}\ }
  
 bir kümedir. (Çiftleme Aksiyomu)
5. 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 bir küme ise 
  
    
      
        
          ⋃
          
            B
            ∈
            A
          
        
        B
         
      
    
    {\displaystyle \bigcup _{B\in A}B\ }
  
 bir kümedir. (Birleşim Aksiyomu)
6. 
  
    
      
        A
         
      


Daha önce Kümeler bölümünde listelediğimiz küme aksiyomları kümeler hakkındaki bütün önermeleri varsayımlar ile sonuca ulaştırmak için yeterli değildir. Sürekli olarak yeni aksiyomlar eklenerek teorinin temelleri sağlamlaştırılmaya devam edilse bile, sonlu sayıdaki aksiyomlar ile mümkün olan her sorunun “doğru” veya “yanlış” şeklinde kesin bir cevaba sahip olmayacağı anlaşılmıştır. Kümeler teorisinin çalışılmasına devam edildikçe yer yer (doğru veya yanlış) herhangi bir cevabı bulunmayan sorularla karşılaşılmakta ve bu sorunun cevabının ne olması isteniyorsa ona göre yeni bir aksiyom kümeler teorisine eklenebilmektedir.
	Boş kümeyi içermeyen ve içerisindeki bütün kümeler birbirinden ayrık (yani ikişerli kesişimleri boş) olan bir 
  
    
      
        
          
            A
          
        
         
      
    
    {\displaystyle {\mathcal {A}}\ }
  
 ailesini ele alalım. Bu 
  
    
      
        
          
            A
          
        
         
      
    
    {\displaystyle {\mathcal {A}}\ }
  
 ailesindeki her bir kümeden birer eleman seçerek yeni bir küme oluşturabilir miyiz? Örneğin 
  
    
      
        
          
            A
          
        
         
      
    
    {\displaystyle {\mathcal {A}}\ }
  
’nın 
  
    
      
        
          R
        
         
      
    
    {\displaystyle \mathbb {R} \ }
  
 reel sayılar kümesinin boş olmayan bazı alt kümelerini içeren ve içerdiği alt kümelerin hepsi birbirinden ayrık olan bir sınıf olduğunu kabul edelim. Bu durumda 
  
    
      
        A
        ,
        B
        ∈
        
          
            A
          
        
         
      
    
    {\displaystyle A,B\in {\mathcal {A}}\ }
  
 olduğunda 
  
    
      
        A
        ,
        B
        ⊂
        
          R
        
         
      
    
    {\displaystyle A,B\subset \mathbb {R} \ }
  
 ve 
  
    
      
        A
        ≠
        B
         
      
    
    {\displaystyle A\neq B\ }
  
 için 
  
    
      
        A
        ∩
        B
        ≠
        ∅
         
      
    
    {\displaystyle A\cap B\neq \varnothing \ }
  
 diyebiliriz. Acaba bu sınıftaki kümelerin hepsinden yalnızca birer eleman seçerek yeni bir 
  
    
      
        C
         
      
    
    {\displaystyle C\ }
  
 kümesi oluşturabilir miyiz?
Bu sorunun cevabı, ne “evet” ne de “hayır”dır. Aslında kümelerden (ne olduğu fark etmeden) herhangi bir eleman seçilmesi yeterliymiş gibi görünmektedir ama bu seçimin nasıl yapılacağıyla ilgili hiçbir genel kriter oluşturulmasının mümkün olmadığı bilinmekte ve böyle bir rasgele seçimin bazen olanaklı olamayabileceğine inananlar çıkabilmektedir. Bu konu hakkında genel kabul görecek bir yorum yapmak imkânsızdır çünkü bu önerme mevcut küme teorisi yardımıyla ne ispatlanabilir ne de bu önermenin yanlış olduğu gösterilebilir. Bu soru küme aksiyomları yardımıyla ulaşılamayacak bir yerde bulunmaktadır. Bu durumdan kurtulmanın yolu ise kabulde bulunmak, yani bu önerme “doğrudur” veya “yanlıştır” şeklinde tercihe kalmış bir ön karar vermektir.
Bu bölüm içerisinde bu tür “açık” önermelerin başka örnekleriyle de karşılaşacağız. Ancak Seçme Aksiyomu’nun topolojide çok önemli bir yeri vardır. Yapılacak birçok ispatta Seçme Aksiyomu’nun doğru olduğu kabul edilerek sonuca ulaşılacaktır. Özellikle ezici bir çoğunluğa göre topolojinin en önemli teoremi sayılan teoremin ispatı tamamen, az sonra ifade edeceğimiz Seçme Aksiyomu’na bağlıdır.
Tanım : 
  
    
      
        
          
            A
          
        
        =
        {
        
          A
          
            i
          
        
        
          }
          
            i
            ∈
            I
          
        
      
    
    {\displaystyle {\mathcal {A}}=\{A_{i}\}_{i\in I}}
  
  boş olmayan kümelerin bir sınıfı olsun. Her 
  
    
      
        i
        ∈
        I
         
      
    
    {\displaystyle i\in I\ }
  
 için 
  
    
      
        f
        (
        i
        )
        ∈
        
          A
          
            i
          
        
         
      
    
    {\displaystyle f(i)\in A_{i}\ }
  
 olacak şekildeki bir 
  
    
      
        f
        :
        I
        →
        
          ⋃
          
            i
            ∈
            I
          
        
        
          A
          
            i
          
        
         
      
    
    {\displaystyle f:I\to \bigcup _{i\in I}A_{i}\ }
  
 fonksiyonuna seçme fonksiyonu adı verilir.
Seçme Aksiyomu : Boş olmayan kümelerden oluşan her aile için, en az bir seçme fonksiyonu vardır.
Seçme Aksiyomu’nun, seçme fonksiyonunu kullanmayan denk bir ifadesi de mevcuttur.
Seçme Aksiyomu : 
  
    
      
        
          
            A
          
        
        =
        {
        
          A
          
            i
          
        
        
          }
          
            i
            ∈
            I
          
        
         
      
    
    {\displaystyle {\mathcal {A}}=\{A_{i}\}_{i\in I}\ }
  
 boş olmayan ayrık kümelerin bir ailesi ise her 
  
    
      
        i
        ∈
        I
         
      
    
    {\displaystyle i\in I\ }
  
 için 
  
    
      
        B
        ∩
        
          A
          
            i
          
        
         
      
    
    {\displaystyle B\cap A_{i}\ }
  
 kümesi tek elemandan oluşacak şekilde bir 
  
    
      
        B
         
      
    
    {\displaystyle B\ }
  
 kümesi vardır.
Seçme aksiyomunun bu kitapta belirtmeyeceğimiz başka birçok denk ifadesi bulunmaktadır.   Bunun yanında bu bölümde karşımıza çıkacak “herhangi sayıdaki boş olmayan kümelerin çarpımının boş olmaması”, “üçe ayırma kuralı”, “Zorn Lemması”, “Zermelo Teoremi” veya ilerleyen bölümlerde karşılaşacağımız “kümelerin kapanışının çarpımının çarpımının kapanışına eşit olması”, “kompakt uzayların çarpımının kompakt olması” gibi teoremler aslında seçme aksiyomunun denk ifadeleri arasındadır. Seçme aksiyomuna denk olmamakla birlikte, ispatında seçme aksiyomu kullanılan teoremlerin altında bu durum belirtilmeye çalışılmıştır.
Matematikçilerin oldukça büyük bir çoğunluğu Seçme Aksiyomu’nu bir küme aksiyomuymuş gibi kabul eder. Ancak seçme aksiyomunun, diğerlerinden farklı bir tarafı vardır. Seçme aksiyomu, belirli şartlar altında bir şeyin var olduğunu söyler, ancak onu bulmamız için bir yol göstermez. Gerçekten Seçme Aksiyomu sayesinde öyle kümelerin varlığı gösterilebilir ki, varlığı bilinmesine rağmen o kümeleri bulmak veya oluşturmak mümkün değildir. Hatta Seçme Aksiyomu yardımıyla sonuçları mantığa aykırıymış gibi görünen, bunun ötesinde sezgisel aldanmalardan dolayı paradoks olarak da nitelendirilebilen ilginç ve anormal teoremlerin ispatlandığı da olmuştur. Bunlardan en ünlüsü Banach-Tarski Teoremi'dir. Bu teoreme göre bir küre verildiğinde bu küre öyle birkaç parçaya ayrılabilir ki parçalar yalnızca döndürülüp hareket ettirildikten sonra uygun şekilde bir araya getirildiklerinde, baştaki küreyle aynı boyutta iki küre elde edilebilir. Yani bu teorem özetle; bir nesne doğru şekilde parçalara ayrılıp birleştirildiğinde aynı nesneden iki tane elde edilebileceğini ifade eder ve seçme aksiyomunun yardımıyla matematiksel bir doğru olarak ispatlanmıştır. Bu ve benzeri sebeplerden dolayı, günümüzde artık az sayıda kalmış da olsa, Seçme Aksiyomu’nu reddeden matematikçiler de bulunmaktadır.

SORU : (a) Tanım kümesi üzerinde ayrık topoloji bulunan her fonksiyon süreklidir, gösteriniz.
(b) Değer kümesi üzerinde indiskret topoloji bulunan her fonksiyon süreklidir, gösteriniz.
Çözüm : (a) 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 ve 
  
    
      
        Y
         
      
    
    {\displaystyle Y\ }
  
 topolojik uzay, 
  
    
      
        f
        :
        X
        →
        Y
         
      
    
    {\displaystyle f:X\rightarrow Y\ }
  
 bir fonksiyon olsun. 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 üzerindeki topolojinin ayrık topoloji olduğunu düşünelim.

  
    
      
        G
        ⊂
        Y
         
      
    
    {\displaystyle G\subset Y\ }
  
, 
  
    
      
        Y
         
      
    
    {\displaystyle Y\ }
  
'de bir açık küme olsun. Bu durumda 
  
    
      
        
          f
          
            −
            1
          
        
        [
        G
        ]
        ⊂
        X
         
      
    
    {\displaystyle f^{-1}[G]\subset X\ }
  
 'tir. 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 üzerinde ayrık topoloji bulunduğundan 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
'in her alt kümesi açıktır ve buradan 
  
    
      
        
          f
          
            −
            1
          
        
        [
        G
        ]
         
      
    
    {\displaystyle f^{-1}[G]\ }
  
 kümesi de 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
'te açıktır ve böylece 
  
    
      
        f
         
      
    
    {\displaystyle f\ }
  
 sürekli olur.
(b) 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 ve 
  
    
      
        Y
         
      
    
    {\displaystyle Y\ }
  
 topolojik uzay, 
  
    
      
        f
        :
        X
        →
        Y
         
      
    
    {\displaystyle f:X\rightarrow Y\ }
  
 bir fonksiyon olsun ve 
  
    
      
        Y
         
      
    
    {\displaystyle Y\ }
  
 üzerindeki topolojinin indiskret topoloji olduğunu düşünelim. Bu durumda 
  
    
      
        Y
         
      
    
    {\displaystyle Y\ }
  
'deki açık kümeler yalnızca 
  
    
      
        Y
         
      
    
    {\displaystyle Y\ }
  
 ve 
  
    
      
        ∅
         
      
    
    {\displaystyle \varnothing \ }
  
'dir. Üstelik 
  
    
      
        f
        :
        X
        →
        Y
         
      
    
    {\displaystyle f:X\rightarrow Y\ }
  
 olduğundan,

olur. 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 üzerindeki topoloji ne olursa olsun 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 ve 
  
    
      
        ∅
         
      
    
    {\displaystyle \varnothing \ }
  
 açık kümeler olacaklarından 
  
    
      
        Y
         
      
    
    {\displaystyle Y\ }
  
'den alınan her bir açığın ters görüntüsü 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
'te açıktır ve böylece 
  
    
      
        f
         
      
    
    {\displaystyle f\ }
  
 sürekli bir fonksiyondur.

  
    
      
         
      
    
    {\displaystyle \ }

Tanım: Aşağıdaki koşulları sağlayan bir 
  
    
      
        s
        ⊂
        
          
            P
          
        
        (
        X
        )
         
      
    
    {\displaystyle s\subset {\mathcal {P}}(X)\ }
  
 ailesine X kümesi üzerinde bir süzgeç adı verilir.
(i)  
  
    
      
        s
        ≠
        ∅
         
      
    
    {\displaystyle s\neq \varnothing \ }
  
 ve 
  
    
      
        ∅
        ∉
        s
         
      
    
    {\displaystyle \varnothing \notin s\ }
  

(ii)  
  
    
      
        A
        ∈
        s
         
      
    
    {\displaystyle A\in s\ }
  
 ve 
  
    
      
        B
        ∈
        s
         
      
    
    {\displaystyle B\in s\ }
  
 ise 
  
    
      
        A
        ∩
        B
        ∈
        s
         
      
    
    {\displaystyle A\cap B\in s\ }
  

(iii)  
  
    
      
        A
        ∈
        s
         
      
    
    {\displaystyle A\in s\ }
  
 ve 
  
    
      
        A
        ⊂
        B
         
      
    
    {\displaystyle A\subset B\ }
  
 ise 
  
    
      
        B
        ∈
        s
         
      
    
    {\displaystyle B\in s\ }
  

  
    
      
         
      
    
    {\displaystyle \ }
  

Buna göre bir küme üzerinde bir süzgeç, aynen bir topoloji gibi o kümenin alt kümelerinin belirli özellikleri sağlayan bir ailesidir. Bir küme üzerindeki süzgeçler, bu kümenin noktalarına benzer özellikler gösterdiğinden burada, süzgeçlerin küçük harflerle gösterilmesi uygun görüldü.
Yukarıdaki tanımın ilk aksiyomuna göre bir 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 kümesi üzerindeki bir süzgeç, bir topolojinin aksine 
  
    
      
        ∅
         
      
    
    {\displaystyle \varnothing \ }
  
'yi içermez. Süzgecin kendisi de boş olamaz, yani 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
'in en az bir alt kümesini içerir. İkinci aksiyoma göre bir süzgeçteki herhangi iki kümenin kesişimi yine bu süzgeçtedir. Bu yönüyle süzgeçler topolojilerle benzerlik gösterir. Son aksiyom ise bir süzgeçte bulunan herhangi bir kümenin bütün üst kümelerinin o süzgece ait olduğunu söyler. Bu üç özelliğin, bir topolojik uzayda bir noktanın komşuluklarının sağladığı özelliklere oldukça yakın olduklarını gözlemleyebiliriz.
Şimdi süzgeçlerle noktalar arasındaki bağlantıyı daha zarif bir biçimde görmemizi ve süzgeç kavramının işleyişini daha güzel anlamamızı sağlayacak bir gösterim tanımlayacağız.
Tanım : 
  
    
      
        x
         
      
    
    {\displaystyle x\ }
  
 herhangi bir nesne, 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 bir küme olmak üzere 
  
    
      
        ∋
         
      
    
    {\displaystyle \ni \ }
  
 bağıntısı

kuralıyla tanımlanır ve bu durumda 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 ters elemanıdır 
  
    
      
        x
         
      
    
    {\displaystyle x\ }
  
 denir. Eğer 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 
  
    
      
        x
         
      
    
    {\displaystyle x\ }
  
'in ters elemanı değilse 
  
    
      
        A
        ∌
        x
         
      
    
    {\displaystyle A\not \ni x\ }
  
 yazılır.
Öyleyse bir 
  
    
      
        A
         
      
    
    {\displaystyle A\ }
  
 kümesinin, bir 
  
    
      
        x
         
      
    
    {\displaystyle x\ }
  
 noktasının ters elemanı olması demek, o noktayı içermesi demektir yani burada aslında yeni tanımlanan bir kavram yoktur. Yalnızca 
  
    
      
        ∋
         
      
    
    {\displaystyle \ni \ }
  
 gösteriminin

kuralıyla tanımlandığını bilmek yeterlidir ve aslında bu gösterimi kullanmanın tek nedeni, alışıldığı üzere elemanı kümeden önce yazmak yerine, sonra yazmak arzusudur.
Şimdi bu gösterimi kullanarak süzgeç olma koşullarını bir kez daha yazalım:
Bir 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 kümesinin alt kümelerinin aşağıdaki koşulları sağşayan boştan farklı bir ailesine X üzerinde bir süzgeç adı verilir.
(i)   
  
    
      
        s
        ∌
        ∅
         
      
    
    {\displaystyle s\not \ni \varnothing \ }
  

(ii)   
  
    
      
        s
        ∋
        A
         
      
    
    {\displaystyle s\ni A\ }
  
  ve  
  
    
      
        s
        ∋
        B
         
      
    
    {\displaystyle s\ni B\ }
  
  ise  
  
    
      
        s
        ∋
        A
        ∩
        B
         
      
    
    {\displaystyle s\ni A\cap B\ }
  

(iii)   
  
    
      
        s
        ∋
        A
        ⊂
        B
         
      
    
    {\displaystyle s\ni A\subset B\ }
  
  ise  
  
    
      
        s
        ∋
        B
         
      
    
    {\displaystyle s\ni B\ }
  

  
    
      
        ∋
         
      
    
    {\displaystyle \ni \ }
  
 sembolünü, 
  
    
      
        ∈
         
      
    
    {\displaystyle \in \ }
  
 sembolüne benzermiş gibi düşündüğümüzde bir süzgecin bir noktanın sağladığı özellikleri sağladığını görürüz. Böylece süzgeçleri artık noktalar gibi düşünüp öyle işlem yapacağız ancak bir yandan da aslında küme aileleri olduklarını unutmayacağız. Elbette bir 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 kümesindeki her nokta yukarıdaki üç koşulu sağlar. Bu, X'in her noktasının bir süzgeç olduğu beklentisine neden olur ki, gerçek de böyledir. Ancak süzgeçler noktaların sahip oldukları her ayrıcalığa sahip olamayabilirler.
Bu bölümde süzgeçlere oranla sıradan noktalara çok daha fazla benzerlik gösteren aşkın süzgeçleri de ele alacağız ve aslında kümelerin bir ailesi olup da noktaymış gibi davranış gösteren süzgeçlerin üstüne bir de diziler gibi yakınsama yapan nesneler olduklarını, üstelik bunu dizilerden çok daha iyi başardıklarını göreceğiz. Durum böyleyken, süzgeçlerin topolojide ne denli önemli yerleri olabileceğini tahmin edebilirsiniz. Süzgeçlerin kullanımı birçok önemli teoremin ispatını kaydadeğer biçimde kolaylaştırmaktadır ve süzgeçler yardımıyla topoloji kavramı

  
    
      
         
      
    
    {\displaystyle \ }

Tanım : 
  
    
      
        X
        ≠
        ∅
         
      
    
    {\displaystyle X\neq \varnothing \ }
  
 bir küme ve 
  
    
      
        τ
        ⊂
        
          
            P
          
        
        (
        X
        )
         
      
    
    {\displaystyle \tau \subset {\mathcal {P}}(X)\ }
  
 olsun.
i) 
  
    
      
        ∅
        ,
        X
        ∈
        τ
         
      
    
    {\displaystyle \varnothing ,X\in \tau \ }
  

ii) 
  
    
      
        ∀
        i
        ∈
        I
         
      
    
    {\displaystyle \forall i\in I\ }
  
 için 
  
    
      
        
          A
          
            i
          
        
        ∈
        τ
        ⇒
         
      
    
    {\displaystyle A_{i}\in \tau \Rightarrow \ }
  
 
  
    
      
        
          ⋃
          
            i
            ∈
            I
          
        
        
          A
          
            i
          
        
        ∈
        τ
      
    
    {\displaystyle \bigcup _{i\in I}A_{i}\in \tau }
  

iii) 
  
    
      
        A
        ,
        B
        ∈
        τ
        ⇒
        A
        ∩
        B
        ∈
        τ
         
      
    
    {\displaystyle A,B\in \tau \Rightarrow A\cap B\in \tau \ }
  

koşulları sağlanıyırsa 
  
    
      
        τ
         
      
    
    {\displaystyle \tau \ }
  
 'ya 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 üzerinde bir topoloji, 
  
    
      
        (
        X
        ,
        τ
        )
         
      
    
    {\displaystyle (X,\tau )\ }
  
 ikilisine de bir topolojik uzay denir.
Bu tanım biraz daha sözel olarak şu şekilde de verilebilir.
Tanım : 
  
    
      
        τ
         
      
    
    {\displaystyle \tau \ }
  
 boştan farklı bir 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 kümesinin alt kümelerinin bir sınıfı olsun.
i) 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 ve 
  
    
      
        ∅
         
      
    
    {\displaystyle \varnothing \ }
  
 
  
    
      
        τ
         
      
    
    {\displaystyle \tau \ }
  
 'dadır.
ii) 
  
    
      
        τ
         
      
    
    {\displaystyle \tau \ }
  
'da bulunan kümelerin herhangi bir birleşimi daima 
  
    
      
        τ
         
      
    
    {\displaystyle \tau \ }
  
 'dadır.
iii) 
  
    
      
        τ
         
      
    
    {\displaystyle \tau \ }
  
 'daki herhangi iki kümenin kesişimi her zaman yine 
  
    
      
        τ
         
      
    
    {\displaystyle \tau \ }
  
 'dadır.
koşullarını sağlıyorsa 
  
    
      
        τ
         
      
    
    {\displaystyle \tau \ }
  
 'ya 
  
    
      
        X
         
      
    
    {\displaystyle X\ }
  
 üzerinde bir topoloji, 
  
    
      
        (
        X
        ,
        τ
        )
         
      
    
    {\displaystyle (X,\tau )\ }
  
 ikilisine de bir topolojik uzay denir.

  
    
      
         
      
    
    {\displaystyle \ }

Türk Mutfağı, içerdiği yemek çeşitlerinin çokluğu nedeniyle, zengin bir mutfak sayılabilir. Türk mutfağı, bazı yemekleriyle de Dünya Mutfağında hatırı sayılır bir yer edinmiştir. Ancak bazı yemekler ve ürünler, birtakım komşu ülkelerin de mutfağına yer almaktadır ve hatta sahiplenilme adına Türk mutfağında olmadığı şeklinde iddialar mevcuttur. Türk Mutfağı, özellikle hamurlu ve zeytinyağlı çeşitleriyle olmak üzere, geniş seçeneklerle doludur. Mutfağa ait çorbaların ortak özelliği, genellikle sıcak içilmesidir. Türk mutfağına mal olmuş bir soğuk çorba çeşidi bulunmamaktadır. Makarnalar ise Türk mutfağında yeni sayılır. Balık yemekleri de görece cılız varlık gösterir. Hamurlu tatlılar da Türk mutfağında iyi bilinir ve özellikle "Baklava" Türk mutfağının 1 numarası olma özelliğini yitirmemiştir. Osmanlı dönemi, Türk mutfağı açısından genişleme ve çeşitlenmenin tavan yaptığı dönem olarak hatırlanmaya değerdir. Durum olarak, Asya yemeklerinin yanı sıra Arap, İran, Yunan ve Ermeni mutfaklarına kadar pek çok ilham ve esinlenme ile birlikte, Kafkas ve Balkanlar'dan yapılan katkılarla da dikkat çeken bir mutfaktır. Türk mutfağı, öncelikle İstanbul ve çevresinde, sonra İzmir başta olmak üzere ve Ege'de ilerlemiştir. Türk mutfağının önde gelen yemekleri olarak sunduğumuz yemeklere, örneğin kebaplara gelince, bunu şimdilerde Hint halkları, Arap halkları ve diğerleri de iddialı şekilde yapmaya devam ediyor. Türk mutfağı Türkiye'de bölgelere hatta şehirlere göre değişir. Ancak çoğu yiyecek tüm Türkiye ve bazıları tüm Dünya'da meşhurdur.

Türk adına gerek kaynaklarda, gerek araştırmalarda türlü anlamlar verilmiştir. Miğfer, terk edilmiş, olgunluk çağı, deniz kıyısında oturan adam, vb.

A. Wembry'ye göre Türk kelimesi türemekten gelmektedir.
Ziya Gökalp'e göre Türk kelimesi türeli (kanun, nizam sahibi) anlamına gelmektedir.
K. Müller Türk adının güçlü, kuvvetli anlamına geldiğini gösteren bir belge yayımlamıştır.
Coğrafi ad olarak Türkiye tabiri ilk defa Bizans kaynaklarında Orta Asya için kullanılmıştır.

Anav (en eski kültür)
Afanesyevo (Türklerin en eski kültür merkezi)
Andronova (prototürkler)
Karasuk
Tagar (en yeni ve gelişmiş kültür)

Orta Asya'da:

İskitler
Büyük Hun Devleti
I. Göktürk Devleti
II. Göktürk (Kutluk) Devleti
Uygurlar
Avarlar
Karluklar
Kırgızlar
Hazarlar
Oğuzlar
Türgişler
Sabirler
Avrupa'da:

Avrupa Hun Devleti
Macarlar
Bulgarlar
Avarlar
Kıpçaklar
Peçenekler
Uzlar
Başkurtlar

Bilinen en önemli hükümdarları Alp Er Tunga ve Tomris Hatun'dur.
Eyer, üzengi, gem gibi atı etkin kılan araçları icat etmişlerdir.
Kemerli pantolonlar kullanmışlardır.
Kurgan tipi mezarlıklar en önemli kalıntılarıdır.

Teoman tarafından kurulmuştur.
Başkenti Ötüken'dir.
Mete zamanında devlet en geniş sınırlarına ulaşmıştır.
MÖ 58'te kuzey ve güney olarak parçalanmışlardır. Kuzey batıya göç ederken Güney Çin hakimiyetine girmiştir.
Hun hükümdarları imparator anlamına gelen Tan-hu, Şan-yu unvanlarını kullanmışlardır.
Mete kurultay ve onlu sistemin kurucusu olarak bilinir.
Çi-çi Çin'e boyun eğmediği için hayatını kaybetmiştir.
Tanrı, kut, böri, il, ordu, tuğ, kılıç, vb. Hunlardan kalma kelimelerdir.
Çi-çi'nin öldürülmesi üzerine batıya göç eden Hunlar Avrupa Hun Devleti'ni kurmuşlar ve kavimler göçüne neden olmuşlardır.

Balamir tarafından kurulmuştur.
Attila zamanında en parlak zamanlarını yaşadı. Attila Doğu Roma üzerine iki sefer düzenleyerek Margus ve Anatolios Antlaşmalarını yapmıştır.

Afganistan'da kurulmuştur.
Eftalit olarak da anılırlar.
Sasani ve Göktürklerle İpek Yolu mücadelesine girişince yıkılmışlardır.

Bumin Kağan tarafından kurulmuştur. Ülkenin batı kısmını yabgu unvanıyla kardeşi İstemi Kağan yönetmektedir.
Mukan Kağan döneminde en parlak zamanını yaşamıştır.
İpek Yolu'nu hakimiyet altına almak için Ak Hunlara karşı Sasanilerle, Sasanilere karşı Bizans'la ittifak kurmuşlardır.
Orta Asya ile Roma arasında ilk diplomatik ilişki bu devlet zamanında yaşanmıştır. Doğu Roma elçileri İstemi'yi, sonra oğlu Tardu'yu başkentlerinde ziyaret etmiştir.

Türk mutfağı, Türkiye'nin ulusal mutfağıdır. Orta Asya, Selçuklu ve Beylikler ile Osmanlı kültürünün mirasçısı olan Cumhuriyet Dönemi Türk Mutfağı hem Balkan ve Orta Doğu mutfaklarını etkilemiş hem de bu mutfaklardan etkilenmiştir. Ayrıca Türk mutfağı yörelere göre de farklılıklar gösterir. Karadeniz mutfağı, Güneydoğu mutfağı, Orta Anadolu mutfağı gibi birçok yöreler kendilerine ait zengin bir yemek haznesine sahiptirler.
Yöreden yöreye farklılaşan lezzetleri barındıran yeme-içme biçimleri, özel gün, kutlama ve törenlerde ayrı bir anlam hatta kutsallık taşır. Türk Mutfağı, çeşit zenginliği ve damak tadına uygunluk yönünden olduğu kadar birçok yemek ve yiyecek türü ile sağlıklı ve dengeli beslenmeye ve vejetaryen mutfağına kaynaklık edebilecek örnekleri barındırmaktadır[1]

Ezogelin çorbası
Çorba özellikle kış aylarında Türk mutfağının vazgeçilmez bir parçasıdır. Mercimek çorbası, ezogelin çorbası, yoğurt çorbası ve tarhana çorbası en çok tercih edilen çorbalardır. Ancak Türk mutfağı bunların yanı sıra sayısız miktarda çorbalar içerir. Etler, sebzeler ve baklagiller genellikle çorbaların ana malzemeleridir. Et suyu, un, yoğurt ve şehriye bu malzemeleri çorba haline getirmek için kullanılır.
İşkembe çorbasının alkollü içkilerin neden olduğu baş ağrısına iyi geldiği inancı yaygındır. Özellikle şehirlerde yer alan işkembeci lokantaları geç saatlere kadar açık kalarak müşterilere işkembe çorbası servisi yaparlar.
Et yemekleri
Döner kebap
Türk mutfağındaki et yemeklerinin çoğu kebaplar, köfteler ve tencere yemekleri sınıfındaki yemeklerdir.
Türk mutfağında kebap, et, lahmacun kebap yemeği anlamı içerir. Genelde kebaplar lokantalarda yenen ve ızgara yöntemiyle hazırlanan yemeklerdir. Kebaplar arasında döner kebap en sevilen kebaplar arasındadır. Ayrıca Cağ kebabı, Bursa kebabı, Adana kebabı, Urfa kebabı, Tokat kebabı ve pirzola da çok yaygındır.
Köfteler kıymanın ekmek içi, soğan ve çeşitli baharatlarla yoğrularak, şekillendirilip pişirilmesi yoluyla yapılan yemeklerdir. Izgara, fırınlama, kızartma veya sulu yemek olarak yapılabilir. Akçaabat Köftesi, İnegöl Köftesi, Tekirdağ köftesi yurt çapında en çok sevilen köfteler arasındadır.
Sulu et yemekleri arasında Güveç, Kağıt Kebabı ve çeşitli Türlü ve Yahniler sayılabilir. Ayrıca Türk mutfağında çok sayıda balık, tavuk ve sakatat yemekleri mevcuttur.
Sebze yemekleri
Yaprak sarması
Türk mutfağı sebze yemekleri açısından çok büyük bir çeşitliliğe sahip bir mutfaktır. Dolmalar ve sarmalar, etli sebze yemekleri, kızartma sebzeler ve zeytinyağlıların sayısız çeşitleri mevcuttur.
Dolmalar ve sarmalar hem etli hem de etsiz (yalancı dolma) olarak hazırlanabilirler. Etli dolmalar kıyma, pirinç, soğan, domates ve biber salçası, çeşitli baharat içerirler. Yalancı dolmalar ise pirinç, soğan, kuş üzümü ve çam fıstığı kullanılarak yapılır. Lahana ve asma yaprağı sarmaları hazırlamak için kullanılır. Dolmalar için en çok kullanılan sebzeler biber, kabak, domates, patlıcan ve soğan gibi sebzelerdir.

Karnıyarık
Etli sebze yemekleri kıyma ve parça etin sebzelerin yanı sıra pişirilmesi yoluyla hazırlanırlar. Etli fasulye, karnıyarık, patlıcan musakka, etli kabak, etli bezelye, etli türlü, etli mercimek ve nohut, etli ıspanak, lahana ve pırasa dahil çok sayıda yemek mevcuttur.
Birçok sebze kızartılarak ve ızgara yöntemiyle pişirilebilir. Patlıcan kızartma, kabak kızartma, biber, domates, havuç ve mücver çok sevilen kızartma çeşitleri arasındadır.
Ayrıca zeytinyağlılar Türk mutfağında kendine has bir yer kaplar. Bu yemekler bazen daha ucuz olan diğer sebze yağlarıyla da hazırlanabildikleri halde zeytinyağlılar olarak bilinirler. Zeytinyağlı taze fasulye, fasulye pilaki, zeytinyağlı dolma, zeytinyağlı enginar ve bakla bu sınıfa giren yemekler arasındadır.
16. yüzyılın ikinci çeyreğinden sonra Türk mutfağında yerini alan sebzeler arasında patlıcan çok özel bir önem taşır. Patlıcan sebze olarak dünyanın birçok ülkesinde yendiği halde çeşitlilik açısından Türk mutfağını dünyanın en çok patlıcan yemeğine sahip mutfak olarak saymak bir abartma sayılamaz. Türk mutfağında patlıcan dolma, kızartma, musakka, pilav, salata ve ızgara dahil sayısız patlıcan yemeği mevcuttur.
Hamur işleri
Lahmacun
Lahmacun, Etli ekmek, pide, mantı ve börekler Türk mutfağının en sevilen hamur işleri arasındadır. Ayrıca pilav ve makarnalar da bu sınıfa katıldığında çok geniş bir çeşitlilik ortaya çıkar.
Göçebe yaşamış olan Türkler et ve et ürünlerinde, süt ve süt ürünlerinin yenilebilir gıdaya çevrilmesinde uzmanlaşmıştır. Bunlara ilave olarak yanlarında taşıyabilecekleri hububat ürünleri yanı hamur işi tariflerinde de yeterli tecrübeye sahip olmuşlardır.[2] Türk mutfağı sadece Türkiyeden ibaret değildir. Türk cumhuriyetleri'nin mutfakları birbiri ile büyük benzerlikler taşır. Bunlardan biri de selçuklular zamanında Arap ve Pers kültüründen Anadolu coğrafyasında Azeri Türkleri vesilesi ile geçen önce tandırlarda, daha sonra kara fırınlarda pişirilen pide ve pide çeşitleridir.[3] Bunlardan biride karadeniz pidesidir.
Lahmacun ve pideler genellikle lokantalarda fırınlama yöntemiyle hazırlanırlar. Bu yemeklerin çok sevilmesi nedeniyle Anadolu mutfak kültüründe selçuklu döneminden sonra ise ahilik anlayışında ileri gelenler tarafından lahmacun ve yöresel pideler ticari anlamda ortaya çıkmıştır.[2][4]
17. yy. ve 18. yy. lın ikinci çeyreğinde sıkça rastladığımız[5] börek kelimesinin kökeni: "bürmek” sözcüğünden gelmektedir. Türkçe “büzmek, burmak, bükmek” anlamındaki “”bür-” sözcüğü ile, bıç-ak ve kür-ek gibi sözcüklerin türetilmesinde de bulunan -ak/-ek ekinin bir araya gelmesinden “bürek” sözcüğü olarak ortaya çıkmış, zamanda “ü” sesinin “ö” sesine dönmüştür.[6] Çok sayıda yağlı ekmek, çörek ve simit çeşitlerinin farklı yöresel tariflerinden olan börekler Fırınlama veya kızartma yöntemleriyle hazırlanabilirler. Gene börek konusunda ihtisaslaşmış börek salonları 18.yy ikinci çeyreğinden sonra istanbul ve Anadolu illerinde mevcuttur. Kıyma, peynir, patates ve ıspanak en yaygın börek içleri arasındadır. Evlerde hazırlanan börek hazır yufka veya undan açılan yufka kullanılarak hazırlanır. Hazırlaması oldukça zahmetli olan Su böreği ise açılan yufkanın suda kaynatılmasından sonra kullanılmasını gerektiren bir börek türüdür.
İçecekler
Türk kahvesi
Dünyanın her yerinde tüketilen gazlı içecekler ve meyve sularının yanı sıra Türk mutfağının kendine has içecekleri de mevcuttur. Yoğurdun sulandırılmasıyla yapılan ayran tamamen Türkiye'ye özgü bir içecektir. Bunun dışında boza, kefir, şalgam suyu ve şerbet de Türkiye'nin kendine özgü soğuk içecekleri arasındadır.

Ayran
Sıcak içecekler arasında Türk kahvesi ve Türk çayı özel bir yer kaplar. Türk kahvesi kabaca çekilmiş kahvenin cezve denilen uzun saplı kaplar içinde pişirilmesiyle hazırlanır. Dünya çapında ün kazanmış olan Türk kahvesi fincan denilen küçük bardaklar içinde servis edilir. Türk çayı günümüzde tercih edilme açısından kahvenin tahtına oturmuş bir sıcak içecektir. İki parça çaydanlık veya semaver kullanılarak toz çaydan hazırlanır. İnce belli çay bardaklarında servis edilir. Türk çayı da hazırlanma yöntemi nedeniyle dünya çapında bir ün kazanmıştır.

Rakı
Alkollü içkiler arasında rakı Türk mutfağında en çok tercih edilen içkidir. Üzümden elde edilen alkolün anason tohumu ile iki veya üç kez damıtılmasından elde edilir. Türk mutfağının geçmişi çok eskilere dayanan tarihsel alkollü içkisidir. Rakının çok arkasında gelmesine karşılık bira ve şarap ta giderek yaygınlık kazanmaktadır. Yerli üzümler kullanarak hazırlanan Türk şarapları lezzet ve çeşitlilik açısından dünyada adlarını duyurmaya başlamıştır.
Tatlılar
Her ne kadar eski Türk mutfak kültüründe tatlı kültürü olmasa da yerleşik düzene geçildikten sonra özellikle Balkanlar ve Anadoluda kültürler arası füzyon mutfağı birleşimleri ile zenginleşen Türk mutfağı tatlılar açısından Selçuklu ve Osmanlı imparatorluğu döneminde gerçek zenginliğine ve çeşitliliğe sahip olmuştur. Ortadoğu'da Levanten mutfağının[7] oluşması ile birlikte Baklava, kadayıf, künefe, lokma gibi hamurlu tatlılar, muhallebi, keşkül, kazandibi, sütlaç gibi sütlü tatlılar, hoşaf ve kompostolar, revani, helva, aşure ve kabak tatlısı gibi tatlılar geniş bir yelpazeye sahiptirler.

Türk mutfağındaki bazı tatlılar: Baklava, şekerpare ve şöbiyet.
Osmanlı döneminde sefere çıkan yeniçerilerin enerji ihtiyacının giderilmesi amacı ile keşfedilen ve helvahane mutfağındaki tatlıcılar tarafında geliştirilen baklava Türk mutfağının dünyaca tanınan en ünlü tatlıları arasındadır. Başlangıcında üst üste 40 kat konarak nişasta yardımı ile açılan ince yufkaların arasına fındık, ceviz veya antep fıstığı ile birlikte pişirilmesinden sonra şeker, bal ve pekmez'den yapılan şerbetler ile tatlandırılması yoluyla hazırlanmıştır. Tel kadayıf ise çok ince teller halinde satılan hamurla hazırlanır ve baklavanın içine benzer fındık, fıstık, ceviz gibi malzemeler ile doldurularak fırında pişirildikten sonra şerbet çeşitleri ile tatlandırılır.
İlk örneklerini roma döneminde gördüğümüz sütlü tatlılar sütün şekerle kaynatıldıktan sonra nişasta, pirinç veya pirinç unu ile katılaştırılması yoluyla hazırlanırlar. Kazandibi ise muhallebi gibi hazırlandıktan sonra elde edilen tatlının bir tepside kızartılarak karamelleştirilmesi sonucu elde edilen ilginç bir Türk tatlısıdır. Tavuk göğsü de sütlü bir tatlıdır, söz edilen bu malzemelerin yanı sıra ince bir şekilde didiklenen tavuk etinin göğüs kısmını da içerir.
Revani, İrmik helvası gibi bazı tatlıların yapımında irmik kullanılır. Türkiye'deki dinsel inançlar arasında özel bir yeri olan aşure buğday, kuru üzüm, fasulye ve nohut gibi birçok bitkisel malzemeler kullanılarak hazırlanan bir tatlıdır. Kabak tatlısı balkabağının şekerle pişirilmesi yoluyla hazırlanır. Sonbahar ve kış aylarında tercih edilen Türk mutfağına has bir tatlıdır.
Maraş dövme dondurması Ahır Dağı'nın eteklerinden beslenen keçilerin sütünden yapılır. 90 °C sıcaklığa ısıtılan sütler, mikro organizmalardan arındırılır. Daha sonra bu süte önce Ahir dağından toplanan salebe şeker ka

Çağdaş Türkmence (ya da Türkmen Türkçesi) Türk Dillerinin Oğuz grubundaki diğer dillerden (Türkçe, Azerice, Gagavuzca ve Horasan Türkçesi) bu dillerde bulunmayan niyet kipini içermesiyle ayrılır. Niyet Kipi'nde kullanılan -makçy(okunuşu makçı)/ -mekçi eklerine diğer Oğuz Dillerinde bulunmazken Özbekçe'de, Kazakça'da, Kırgızca'da, Yeni Uygurca'da, Karakalpakça'da, Kazan Tatarcası'nda ve Başkurtça'da rastlanır.
-makçy/-mekçi ekleri kullanıldığı eylemlerde öznenin herhangi bir hareketi yapmaya niyetlendiğini anlatır. Bu kipin anlamı Türkiye Türkçesi'ne -mak/-mek niyetinde olarak aktarılabilir. Örneğin;
Hasan bu düýesini ýyrtyjydan goramakçy. = Hasan, bu devesini bir yırtıcıdan korumak niyetinde.
Mugallym okatmak üçin mektep açmakçy. = Muallim, okutmak için mektep açmak niyetinde.
Ya da daha basit örneklerle anlatırsak;
açmakçy:açmak niyetinde, goramakçy: korumak niyetinde.

aýal: karı, kadın, hanım

Öýüme girenimde güler ýüzli aýalym meni gujak açyp garşy alýar. Evime girdiğimde güler yüzlü karım beni kucak açıp karşılıyor.

ägä bolmak: dikkat etmek

Özüňe ägä bol! Kendine dikkat et!

Bular ýaly adamlardan ägä boluň. Bunlar gibi insanlara dikkat edin.

bolmak: olmak

Bolýar! Olur! / Tamam!

Saña näme boldy? Sana ne oldu?
boýunça: üzerine, -e göre, boyunca

Yslam dini boýunça soraglar we jogaplar İslâm dini üzerine sorular ve cevaplar

Plan boýunça işledik. Plana göre çalıştık.

çlen: üye

Ýazyjylar soýuzynyň çleni Yazarlar birliğinin üyesi

eje: anne

Ejem juda mähirli adamdy. Annem çok şefkatli insandı.
ekzamen: sınav

Ekzamenlere taýýarlanmagyň tärleri Sınavlara hazırlanmanın yolları

Irden ekzamenim bolsa-da ýatasym gelmedi. Sabah sınavım olsa da yatasım gelmedi.
ertir: sabah; yarın

Ertir namazynyň wagty Sabah namazının vakti

Ertiriňiz haýyrly! Günaydın! / Sabahınız hayırlı olsun!

Bu gün bolmaz, ertir gel. Bugün olmaz, yarın gel.
ertirlik: kahvaltı

Bizi ertirlik edinmäge çagyrdy. Bizi kahvaltı etmeye çağırdı.

gurluşyk: inşaat

Türkmen gazynyň Hytaýa iberilmegi üçin gurluşyk dowam edýär. Türkmen gazının Çin'e gönderilmesi için inşaat devam ediyor.
gürleşmek: konuşmak (karşılıklı)

Türkmen prezidenti özbek prezidenti bilen gürleşdi. Türkmen Cumhurbaşkanı, Özbek Cumhurbaşkanı ile konuştu.

hawa: evet

Ol hem "Hawa!" diýip jogap beripdir. O da "Evet!" diye cevap vermiştir.

irden: erkenden, sabahleyin

Olaryň iş wagty irden sagat 8:00-dan agşam 20:00-a çenli kesgitlenendir.  Onların iş vakti sabah saat 8:00'den akşam 20:00'ye kadar belirlenmiştir.
iýmek: yemek

Ol ýabylary we adamlary iýýär eken.  O, atları ve insanları yiyormuş.

jyňňyrdamak: çalmak (telefon, zil vb.)

Gapynyň jaňjagazy jyňňyrdady. Kapının zili çaldı.

kaka: baba

Kakam agşamlary näme üçin öýe gelenok? Babam akşamları niçin eve gelmiyor?

maşgala: aile

Adam öz öýi, maşgalasy üçin işleýär. İnsan kendi evi, ailesi için çalışıyor.

okuw: tahsil, öğrenim; ders

Okuwda Türkçe sapak berilýär. Öğrenimde Türkçe ders veriliyor.

Bu gün okuw ýok. Bugün ders yok.
oňat: iyi

Çagalar, kitaby oňat saklaň! Çocuklar, kitabı iyi koruyun!

ökünmek: pişman olmak

Myrat köp ökündi. Murat çok pişman oldu.

örän: çok

Muny çak etmek örän kyn. Bunu tahmin etmek çok zor.

paýtagt: başkent

Ankara Türkiýäniň paýtagtydyr. Ankara, Türkiye'nin başkentidir.

saçak: sofra

Saçak başynda gürrüň etdik, gülüşdik. Sofra başında sohbet ettik, gülüştük.
student: öğrenci (özellikle üniversitede)

Olaryň ogullary Halkara Gatnaşyklary Institutynyň studentidir. Oğulları Uluslararası İlişkiler Enstitüsünün öğrencisidir.

tanymal: tanınmış, meşhur, ünlü

Ol Türkiýäniň tanymal şahyrlaryndan biridir. O, Türkiye'nin tanınmış şairlerinden biridir.

taýýarlamak: hazırlamak

Çaý-nahar taýýarladym. Sofra hazırladım.

tolgunmak: heyecanlanmak

Örän tolgunýaryn. Çok heyecanlanıyorum.

uklamak: uyumak

Birden üstüme agyrlyk basdy we ukladym. Birden üstüme ağırlık çöktü ve uyudum.

ýadaw: yorgun

Ol ýadaw, argyn halda tokaýdan geldi. O yorgun argın halde ormandan geldi.
ýagşy: iyi

Ol ýagşy bilеn ýamany sеljеrmеýär. O, iyi ile kötüyü ayırt etmiyor.
ýöne: fakat, ancak; bedava, parasız

Sen ýalylaryň sany ýylba-ýyl artýar, ýöne biz azalyp barýarys. Senin gibilerin sayısı yıl-be-yıl artıyor, fakat biz azalıp gidiyoruz.

Türkçe, malumunuzdur ki her yerde aynı şekilde konuşulmaz, konuşulduğu yere göre farklılıklar gösterir. Bunlar, aslında dilin zenginlikleridirler. Çünkü bu, bir dile kelime ve deyiş zenginliği kazandırır, belki de o bölgedeki halkarın dillerinden de bir şeyler katar.
Bu kitapta ağızların nerede, nasıl konuşuldukları, sözcük hazineleri, neden böyle konuşulduklarından bahsedilecektir.
Kitabı okurken iyi zaman geçirmenizi dileriz.

Adana ağzı
Alanya ağzı
Amasya ağzı
Ankara ağzı
Antalya ağzı
Balıkesir ağzı
Beypazarı ağzı
Bolu ağzı
Burdur ağzı
Bursa ağzı
Çamlıhemşin ağzı
Çanakkale ağzı
Çankırı ağzı
Çorum ağzı
Elazığ ağzı
Elbistan ağzı
Erzincan ağzı
Erzurum ağzı
Gaziantep ağzı
Gerede ağzı
Giresun ağzı
Görele ağzı
Göynük ağzı
Isparta ağzı
Kastamonu ağzı
Kaş ağzı
Kemaliye ağzı
Kocaeli ağzı
Konya ağzı
Kütahya ağzı
Malatya ağzı
Mudurnu ağzı
Nallıhan ağzı
Ordu ağzı
Rize ağzı
Sakarya ağzı
Seben ağzı
Sinop ağzı
Sivas ağzı
Şile ağzı
Trabzon ağzı
Tunceli ağzı
Ünye ağzı

Çatalca ağzı
Edirne ağzı
Gelibolu ağzı
İstanbul ağzı
Keşan ağzı
Kırklareli ağzı
Lüleburgaz ağzı
Tekirdağ ağzı

Kıbrıs ağzı

Bir duyguyu, bir düşünceyi, bir olayı vb. anlatmak için anlamlı ve görevli sözcüklerle oluşturulan söz dizisine "cümle" denir.
Cümlenin asıl amacı bilgi vermek, bir durumu bu cümlenin muhatabı olan kişiye bildirmektir. Bu yüzdenne kadar çok bilgi verilmek isteniyorsa cümle de o kadar genişletilebilir:
Geldi.  : Yalnız eylem
Halil geldi:  Eylem ve eylemi gerçekleştiren
Halil dün geldi:  Eylem, eylemi gerçekleştiren ve eylemin gerçekleşme zamanı
Halil dün seni görmeye geldi. : Eylem, eylemi gerçekleştiren, eylemin gerçekleşme zamanı ve gerçekleşme sebebi.

Görüldüğü gibi bir cümle, anlatılmak istenenlere göre bir kelimeden oluşabileceği gibi, birçok kelimeden de oluşabilir.
Bir soruya cevap olarak verilen ve bir eylem ifadesi taşımayan kelimeler de cümle olarak kabul edilir:
-Ne zaman yola çıkıyorsun?
- Yarın. (Yarın yola çıkıyorum.)

Cümle öğeleri bulunurken tamlamalar, kelime grupları birbirinden ayrılmaz. Küçük bir örnekle buna değinilecek, açıklama öğeler başlığı altında yapılacaktır.
Bahçedeki köpek herkese saldırıyor.  cümlesinde "bahçedeki köpek" bir sıfat tamlaması olduğu için öğe bulurken bölünemez, aynı öğe içinde yer alır.

Yüklem, iş, oluş  ve hareket bildirir ve cümlenin var olmasının asıl sebebidir. Bir cümle yüklemden ibaret olabilir. Yükleme eklenen şahıs eki, yüklemde bildirilen işin kimin tarafından yapıldığını, yani özneyi de verir.Meselâ:
Bıraktım.  kelimesi bir cümledir, çünkü tek başına da olsa bir hareket bildirir. Ayrıca yüklemdeki şahıs ekinden bırakan kişinin kim olduğu da anlaşılmaktadır. (Ben- 1. teklik şahıs)

Bir cümlede yüklem, fiil olabileceği gibi isim soylu bir kelime de olabilir.
Ödevime başladım. cümlesinde "başla-" bir fiil gövdesidir. Sonuna "-mak" mastar eki getirilebilir.
Film çok güzeldi. cümlesindeki "güzeldi" yüklemi ise, isim soylu bir yüklemdir.

Yüklem eğer bir isim ya da sıfat tamlaması, kalıplaşmış bir ifade, bir deyim ise bu tamlama, deyim bölünmemeli, bir bütün olarak yüklem kabul edilmelidir.
Bizi hüzünlendiren,gençlik hatıralarımızdı. cümlesindeki yüklem "gençlik hatıralarımızdı" ifadesidir. Çünkü bu kelime grubu, bir belirtisiz isim tamlamasıdır.
Olanları duyunca öfkeden deliye döndü. cümlesinin yüklemi de "deliye dönmek" kelime grubudur. Zaten yalnızca "dönmek" i yüklem olarak alırsak, diğer öğeleri bulmak için soracağımız sorular da mantıksız gelecektir. (Neye döndü, neden döndü gibi.)

Eğer cümlede yüklemi bulmakta zorlanıyorsanız, genellikle işe yarayan yöntem, hangi kelimenin veya kelime grubunun kip ve/veya  şahıs eki aldığına bakmaktır.
Keşke siz de gelseydiniz. (gel-se-y-di-niz: Hem zaman hem de şahıs eki mevcuttur.)

Yüklemde bildirilen işi yapan kişi veya varlıktır. Yükleme sorulan "yapan ne?/ yapan kim?" sorularının cevabı, cümle içindeki özneyi verir.
Çiçekler çok güzel kokuyor.  = Yüklem: kokuyor     Kokan ne? Çiçekler: özne
Bu sınıfın öğrencileri çok çalışkandır.   = Yüklem: çalışkandır.  Çalışkan olan kim? Bu sınıfın öğrencileri.: özne

Türk alfabesi, Türkiye Türkçesinin yazımında kullanılan alfabedir.

Türk alfabesi, Latin harfleri temel alınarak, 1 Kasım 1928 gün ve 1353 sayılı yasayla tespit ve kabul edilmiştir. Bu kanuna göre, Türk alfabesinde 29 harf bulunur. Alfabeyi oluşturan büyük ve küçük harfler, sırasıyla aşağıdaki biçimde yazılır.
Alfabede 29 harf bulunur. Ancak 1990'lı yıllarda toplanan bir uluslararası Türkçe kurultayında Türkiye alfabesine ñ(gırtlak n'si), é(ince e), q, w, x 'in de katılması ile oluşacak ortak alfabeden diğer Türk devletlerinin kendi alfabelerini seçmesi karara bağlanmıştır. Bunun ardından Azerbaycan kendi alfabesini 34 harflik bu alfabeden seçip kullanmaya başlamıştır.
Ayrıca sesli a, u, ı harflerinin üzerinde yabancı kökenli sözlerde inceltme imi (^) kullanılmaktadır. O harfinde inceltme imi kullanılmaz.

Türk alfabesindeki harflerin kullanım sıklıklarına göre sıralaması çoktan aza doğru A, E, I, N, R, L, İ, D, K, M, U, Y, T, B, S, O, Ü, Ş, Z, G, Ç, H, Ğ, V, C, Ö, P, F, J şeklindedir.

a, e, ı, i, o, ö, u ve ü harfleri ünlü harfler, diğer harfler ise ünsüz harfler olarak adlandırılır.

Sesli harfler, çıkış yeri ve dilin durumuna, dudakların durumuna, ağzın açıklığına göre şu şekilde sınıflandırılır:

Çıkış yeri ve dilin durumuna göre
Kalın sesliler: a, ı, o, u
İnce sesliler: e, i, ö, ü
Dudakların durumuna göre
Düz sesliler: a, e, ı, i
Yuvarlak sesliler: o, ö, u, ü
Ağzın açıklığına göre
Geniş sesliler: a, e, o, ö
Dar sesliler: ı, i, u, ü
seslilerin nitelikleri aşağıdaki çizelgede toplu olarak gösterilmiştir:

Türk alfabesi, Latin harflerini kullanmasına rağmen, bu harfleri kullanan diğer batı dillerinin alfabelerindeki bir takım harfleri içermemekte, bunun yanı sıra bu alfabelerde genel olarak kullanılmayan başka harfler içermektedir.

Q/q, W/w ve X/x harfleri pek çok batı dilinde hatta Azerice gibi  latin harflerine geçilen Türki dillerde bile kullanılmasına rağmen mevcut Türk alfabesinde bir eksik olarak yer almamaktadır.   Bu harflere karşılık gelen sesler sırasıyla k, v ve ks ile ifade edilir. Örneğin: Kemal, taksi. X harfi sözcüğün yapısına göre iks ya da ksi olarak da söylenirken, W harfi çift ve olarak okunur. Benzer biçimde İspanyol alfabesinde yeralan Ñ/ñ (Bu ses İtalyanca ve Fransızca'da gn, Portekizce'de nh harf bileşimleri ile elde edilir) harfine karşılık gelen ses ny ile ifade edilir. Örneğin, İspanyolca'da İspanya anlamına gelen España sözcüğü Türkçe harflerle Espanya olarak yazılır. Anadolunun pek çok yerinde ve Türki şivelerde kadın yerine qadın denmesine rağmen bu teleffuzu verecek "q" harfi Türkçede yoktur. Bu eksiklğin latin harflerine geçerken yapılmış bir hata olduğu Azerilerce değerlendirildiğinden q harfini Azeriler almışlardır. Ayrıca Türkçenin Anadolu ağızlarında yaygın bir şekilde kullanılan genizcil n sesini karşılayan bir harf de alfabeye dahil edilmemiştir. Bunun nedeni alfabe hazırlanırken İstanbul Türkçesi dikkate alındığından ve Trakya ağzında genizcil n sesinin bulunmadığından bu sesin alfabede temsil edilmemesine karar verilmesidir. Osmanlı Türkçesi alfabesinde ڭ harfiyle temsil edilen genizcil (nazal) n sesi resmi Türkçede tamamen ortadan kalkmıştır. Yerel ağızlarda ise hala varlığını sürdürmektedir.

Türkçedeki Ç/ç, Ü/ü ve Ö/ö harfleri İngiliz alfabesinde bulunmamaları nedeniyle ASCII standardına dahil değildir. Ancak bu harfler diğer batı dillerinde yaygın olarak kullanılmakta ve ISO-8859-1 (Latin-1) standardının içinde yeralmaktadır. Küçük ı, büyük İ, Ğ/ğ, Ş/ş harfleri ise ISO-8859-9 (Latin-5) standardının içinde yeralmaktadır.
Türkçede noktalı i harfi büyük harfle yazılıyorken de noktası koyulur: İ. Benzer biçimde noktasız büyük I harfi, küçük harfle yazılıyorken noktası koyulmaz: ı. Ancak yabancı dildeki sözcükler büyük harfle yazılıyorken I harfi noktasız yazılır. Türkçenin dışında Azerice ve Tatarcada da ı ve i harflerinin kullanımı bu biçimdedir.
Ş/ş harfinin sesi, İtalyancada sc(i), Fransızcada ch, İngilizcede sh, Almancada sch ve Galiçyacada x harfleriyle elde edilir. Bu harf kimi zaman Rumencedeki Ș/ș (virgüllü s) harfinin yerine kullanılmasına rağmen farklı bir harftir. Türkçenin dışında Azerice, Kürtçe, Zazaca Tatarca ve Türkmence dillerinde kullanılmaktadır.
Ğ/ğ (yumuşak ge) harfinin kendine ait bir sesi yoktur, yalnızca kendisinden önce gelen ünlü harfi uzatmakta kullanılır. Bu harf Türkçe sözcüklerin başında yeralmaz. Türkçenin dışında Azeri Türkçesi, Gürcüce ve Tatarca dillerinde kullanılmaktadır.
ASCII standardında yeralmayan Türkçe harfler ve Evrensel kod değerleri yandaki çizelgede verilmiştir.

Altun, Mustafa (2004), "Alfabe Değişiminin Tarihsel Gelişimi Üzerine Bir Değerlendirme", Cumhuriyetin 81. Yılına Armağan, Sakarya Üniversitesi Atatürk İlkeleri ve İnkılâp Tarihi Araştırma ve Uygulama Merkezi, Adapazarı, s.57-63
TDK Yazım Kılavuzu

Cümlede anlamı belirtmek, sıralı kelimeleri ayırmak gibi görevlerde kullanılır. İçinde virgül bulunan cümle yapısı bakımından sıralı cümledir.
Uzun cümlelerde yüklemden uzak düşmüş olan özneyi belirtmek için konur.

Kardeşi marketten süt, yoğurt, ekmek, meyve suyu, şeker ve sakız almış.
Genç, doktora derdini anlattı.
Saniye Hanımefendi, merdivenlerde oğlunun ayak seslerini duyar duymaz, hasretlisini karşılamaya atılan bir genç kadın gibi koltuğundan fırlamış ve ona kapıyı kendi eliyle açmaya gelmişti.
İkinci örnekteki gibi yerlerde kullanılan virgül anlam karışıklığını önler. O cümlede virgül olmasa "Genç doktora  derdini anlattı." şeklinde bir anlam çıkar.

Cümlenin bittiğini gösteren noktalama işaretidir. Bazı kısaltmaların sonuna konur. Sayılardan sonra sıra bildirmek için konur. Arka arkaya sıralandıkları için virgülle veya çizgiyle ayrılan rakamlardan yalnızca sonuncu rakamdan sonra nokta konur. Bir yazının maddelerini gösteren rakam veya harflerden sonra konur. Tarihlerin yazılışında gün, ay ve yılı gösteren sayıları birbirinden ayırmak için konur.

Manzara o kadar güzeldi ki ağzım bir karış açık kaldı.
Bugün işe çok geç geldi.
Ben yarın gideceğim.
Kardeşim pazardan geliyor.
Alb. (albay), Dr. (doktor), Yrd. Doç. (yardımcı doçent)
3. (üçüncü), 15. (on beşinci); II. Mehmet, XIV. Louis
3, 4 ve 7. maddeler; XII – XIV. yüzyıllar arasında
1. A. B. II. VI.
29.5.1453, 29.X.1923

Soru sorulduğu zaman veya doğruluğu kesin olmayan bilgilerin yanında yazılır.

Çok geç kalmadın mı?
Bu saate kadar neredeydin?
O ressam 1204'te (?) doğdu.

Sevinç, şaşkınlık, kızma gibi anlamlar ifade eden cümlelerde kullanılır. Alay bildirmek için ise parantez içine alınarak kullanılır.

Yaşasın, sınavda birinci olmuşum!
A, karşıdaki dayın!
Okulun çalışkan (!) öğrencilerindenmiş.

Cümle içinde farklı sıralı kelimeleri ayırırken kullanılır.

Şeftali, erik, yaz; portakal ve mandalina kış meyveleridir.
Dün pazardan erik, elma, armut; domates, salatalık ve patlıcan aldım.

Açıklama veya alıntı yaparken kullanılır.

Ona şunu söyledim: "Çok dikkatli olman gerekir."
Böyle bir şey demişti: "Kimseye güvenme."

Tamamlanmamış cümlelerde ve yazılmaması gereken sözcüklerin yerine ve anlamı pekiştirmek için kullanılır.

Nerede o eski günler...
Yapsam ne eder, yapmasam ne...
Adam hep ... diyor.

Türkçede biri ek, biri bağlaç olmak üzere iki türlü “de” bulunmaktadır. Ses ve yazılış bakımından gösterdikleri benzerlik yüzünden birbirine karıştırılmaktadır. Bu nedenle bu iki ögeyi ayrı ayrı ele alacağız.
“de” Ekinin Yazımı

Ad durum eklerinden biri olan –de, bir bulunma, kalma durumu gösterir. Kendinden önce gelen sözcüğe bitişik olarak yazılır.
Bu ek hem ünlü uyumuna, hem de ünsüz benzeşmesine uyar. Eklendiği sözcüğün son ünlüsü inceyse –de, kalınsa –da biçiminde yazılır.
Sözcüğün sonunda sert bir ünsüz varsa, -de eki ünsüz benzeşmesine uyarak, –te biçimine dönüşür.
ÖRNEK: "Türkiye'de yedi coğrafi bölge vardır.", "Sivas'ta yaşamaya başlayalı beş yıl oldu.", "Sende ikinci bir telefon var mı?"
“de” Bağlacının Yazımı

Bağlaç olan de sözcükleri, cümleleri birbirine bağlayan bir sözcüktür. Kendinden önce gelen sözcükten ayrı yazılır. Söz konusu sözcüğü ya da cümleyi daha önceden geçen ya da geçmiş sayılabilen aynı görevdeki bir sözcüğe benzerlik, eşitlik, katılma anlamlarıyla bağlar. Yalnızca kendinden önceki sözcüğün son ünlüsüne göre büyük ünlü uyumuna uyar. Ancak, ayrı yazıldığı için ünsüz benzeşmesine uymaz.
“de” bağlacı kimi zaman da pekiştirme görevindedir.
ÖRNEK: "Ben de seninle gelebilir miyim?", "İtalya da 1940'ta savaşa katıldı.", "Hasta olsa da okula gider."
UYARI: Bir cümlede “de”yi çıkardığımızda cümlenin anlamı tamamen bozuluyorsa “ek”tir; anlam tamamen bozulmuyorsa, anlamda değişiklik oluyorsa “bağlaç”tır.
UYARI: Ayrı yazılan da, de hiçbir zaman ta, te biçiminde yazılmaz.
UYARI: Ya sözüyle birlikte kullanılan da mutlaka ayrı yazılır: ya da.
UYARI: Da, de bağlacını kendisinden önceki kelimeden kesme ile ayırmak yanlıştır.
UYARI: Da, de bağlacının bulunma durumu eki olan -da, -de, -ta, -te ile hiçbir ilgisi yoktur. Bulunma durumu eki getirildiği kelimeye bitişik yazılır.
"de" Bağlacının Cümleye Kattığı Anlamlar
-Eşitlik, gibilik  anlamı katar.
-Abartma anlamı katar.
-Küçümseme anlamı katar.
-Sitem anlamı katar.
-Şaşma, inat, sebep, korkutma anlamı katar.
-Ama, fakat anlamında kullanılır.

Türkçede -ki eki ve ki bağlacı da birbirine karıştırılan ögelerdendir. Oysa biri ektir, ötekiyse bağlaç, yani başlı başına bir sözcüktür.
Ek Olan "ki"nin Yazılışı

İlgi eki olan –ki kendinden önce gelen sözcüğe bitişik yazılır. Eklendiği sözcüğe bağlı olma, ilgili bulunma anlamlarını verir. Ünlü uyumlarına uymaz. Dolayısıyla son hecesinde kalın ünlü bulunan bir sözcüğe eklenirken de aynı kalır; başka bir deyişle ünlü uyumuna aykırı olarak kullanılır.
ÖRNEK: "Ondaki çeviklik kimsede yok.", "Seninki burada.", "Amerika'daki toplumsal yapıya dair araştırma yapıyorum."
UYARI: Ancak, bu ek ince yuvarlak ünlü (ü) bulunan kimi sözcüklerde küçük ünlü uyumuna uyarak yuvarlaklaşır.
Bağlaç olan "ki"nin Yazımı

Bağlaç olan ki bir sözcüktür, ayrı yazılır. Cümleler, cümle değerindeki sözcükler arasında anlam bağı kurar.
ÖRNEK: "Öylesine neşeliydi ki dakikalarca güldü.", "Biz ki yıllarca yurt dışında yaşadık.", "Öyle ki insanlar ne yapacağını bilemedi."
UYARI: ki bağlacı, kimi örneklerde sözcüğe bitişerek kalıplaşmıştır.
ÖRNEK: Oysaki, mademki gibi.

İken ayrı olarak yazılabildiği gibi kelimelere eklenerek de yazılabilir. Bu durumda başındaki -i ünlüsü düşer. Getirildiği kelimenin ünlüleri kalın da olsa, bu ekin ünlüsü ince kalır.
İken, ünlüyle biten kelimelere ek olarak getirildiğinde başındaki i ünlüsü düşer ve araya y ünsüzü girer.

Belirtisiz isim tamlamaları, sıfat tamlamaları, isnat grupları, birleşik fiiller, ikilemeler, kısaltma grupları ve kalıplaşmış çe­kimli fiillerden oluşan ifadeler, yeni bir kavramı karşıladıklarında birleşik kelime olurlar: yer çekimi, hanımeli, ses bilgisi; beyaz peynir, açıkgöz, toplu iğne; eli açık, sırtı pek; söz etmek, zikretmek, hasta olmak, gelebilmek, yazadurmak, alıvermek; çoluk çocuk, çıtçıt, altüst; başüstüne, günaydın; sağ ol, ateşkes, külbastı.
Birleşik kelimeler belirli kurallar çerçevesinde bitişik veya ayrı olarak yazılır.

Birleşik kelimeler aşağıdaki durumlarda bitişik yazılırlar:
1. Ses düşmesine uğrayan birleşik kelimeler bitişik yazılır: kaynana (< kayın ana), kaynata (< kayın ata), nasıl (< ne asıl), niçin (< ne için), pazartesi (< pazar ertesi), sütlaç (< sütlü aş), birbiri (< biri biri).
2. Et- ve ol- yardımcı fiilleriyle birleşirken ses düşmesine veya ses türemesine uğrayan birleşik kelimeler bitişik yazılır: emretmek (<emir etmek), kaybolmak (<kayıp olmak); haletmek (<hal’ etmek=tahttan indirmek), meno­lunmak (<men’ olunmak); affetmek (<af etmek), reddetmek (<ret etmek).
UYARI : Sadece söyleyişte tonlulaşma biçiminde ses değişmesine uğrayanlar ayrı yazılır: azat etmek, hamt etmek, izah etmek, iktisap et­mek. Bu örneklerde tonluluk söyleyişte belirtilir.
3. Kelimelerden her ikisi veya ikincisi, birleşme sırasında benzetme yoluyla anlam değişmesine uğradığında bu tür birleşik kelimeler bitişik yazılır.
a. Bitki adları: aslanağzı, civanperçemi, keçiboynuzu, kuşburnu, turnagagası, açıkağız, akkuyruk (çay), alabaş, altınbaş (kavun), altıparmak (palamut), beşbıyık (muşmula), acemborusu, çobançantası, gelinfeneri, karnıkara (börülce), kuşyemi, şeytanarabası, venüsçarığı, yılan­yastığı, akşamsefası, camgüzeli, çadıru­şağı, gecesefası, ayşekadın (fasulye), hafızali (üzüm), havvaanaeli, meryemanaeldiveni.
b. Hayvan adları: danaburnu (böcek), akbaş (kuş), alabacak (at), bağrıkara (kuş), beş­parmak (deniz hayvanı), beşpençe (deniz hayvanı), çakırkanat (ördek), elmabaş (tepeli dalgıç), kababurun (balık), kamçıkuyruk (koyun), kamışkulak (at), karabaş, karagöz (balık), kara­fatma (böcek), kızılkanat (balık), sarıkuyruk (balık), yeşilbaş (ördek), sazkayası (balık), sırtı­kara (balık), şeytaniğnesi, yalıçapkını (kuş), bozbakkal (kuş), bozyürük (yılan), karadul (örümcek), sarısabır (bitki).
c. Hastalık adları: itdirseği (arpacık), delibaş, karabacak, karata­ban.
ç. Alet ve eşya adları: balıkgözü (halka), deveboynu (boru), domuzayağı (çubuk), domuztır­nağı (kanca), horozayağı (burgu), kargaburnu (alet), keçitırnağı (oyma kalemi), kedigözü (lamba), leylekgagası (alet), sıçankuyruğu (törpü), baltabaş (gemi) gagaburun (gemi), kancabaş (kayık), adayavrusu (tekne).
d. Biçim adları: ayıbacağı (yelken biçimi), balıksırtı (desen), civankaşı (nakış), eşek­sırtı (çatı biçimi), kazkanadı (oyun), kırlangıçkuyruğu (işaret), koçboynuzu (işaret), köpekkuyruğu (spor), sıçandişi (dikiş), balgümeci (dikiş), beşikörtüsü (çatı biçimi), turnageçidi (fırtına).
e. Yiyecek adları: dilberdudağı (tatlı), hanımgöbeği (tatlı), hanımparmağı (tatlı), ka­dınbudu (köfte), kadıngöbeği (tatlı), kargabeyni (yemek), kedidili (bisküvi), tavukgöğsü (tatlı), vezirparmağı (tatlı), bülbülyuvası (tatlı), kuşlokumu (kurabiye), alinazik (kebap).
f. Oyun adları: beştaş, dokuztaş, üçtaş.
g. Gök cisimlerinin adları: Altıkardeş (yıldız kü­mesi), Arıkovanı (yıldız kümesi), Büyükayı (yıldız kümesi), Demirkazık (yıldız), Küçükayı (yıldız kü­mesi), Kervankıran (yıldız), Samanyolu (yıldız kümesi), Yedikardeş (yıldız kümesi).
ğ. Renk adları: baklaçiçeği, balköpüğü, camgöbeği, devetüyü, fildişi, gülkurusu, kavuniçi, narçi­çeği, ördekbaşı, ördekgagası, tavşanağzı, tavşankanı, turnagözü, vapur­dumanı, vişneçürüğü, yavruağzı.
4. -a, -e, -ı, -i, -u, -ü zarf-fiil ekleriyle bilmek, vermek, kalmak, durmak, gelmek, görmek ve yazmak fiilleriyle yapılan tasvirî fiiller bitişik yazılır: alabildiğine, düşünebilmek, yapabil­mek; uyuyakalmak; gidedurmak, yazadurmak; çıkagelmek, olagelmek, süregelmek; düşeyazmak, öleyazmak; alıvermek, gelivermek, gülüvermek, uçuvermek; düşmeyegör, ölmeyegör.
5. Bir veya iki ögesi emir kipiyle kurulan kalıplaşmış birleşik keli­meler bitişik yazılır: alaşağı, albeni, ateşkes, çalçene, çalyaka, dönbaba, gelberi, incitmebeni, rastgele, sallabaş, sallasırt, sıkboğaz, unutmabeni; çekyat, geçgeç, kaçgöç, kapkaç, örtbas, seçal, veryansın, yapboz, yazboz tahtası.
6. -an/-en, -r/-ar/-er/-ır/-ir, -maz/-mez ve -mış/-miş sıfat-fiil eklerinin kalıplaşmasıyla oluşan birleşik kelimeler bitişik yazılır:
ağaçkakan, alaybozan, cankurtaran, çöpçatan, dalgakıran, demirkapan, etyaran, filizkıran, gökdelen, oyunbozan, saçkıran, yelkovan, yolgeçen;
akımtoplar, altıpatlar, barışsever, basınçölçer, betonkarar, bilgisayar,  çoksatar, dil­sever, füzeatar, özezer, pürüzalır, uçaksavar, yurtsever;
baştanımaz, değerbilmez, etyemez, hacıyatmaz, kadirbilmez,  karıncaez-mez, kuşkonmaz, külyutmaz, tanrıtanımaz, varyemez;
çokbilmiş, güngörmüş.
7. İkinci kelimesi -dı (-di / -du / -dü, -tı / -ti / -tu / -tü) kalıplaşmış belirli geçmiş zaman ekleriyle kurulan birleşik kelimeler bitişik yazılır: albastı, ciğerdeldi, çıtkırıldım, dalbastı, fırdöndü, gecekondu, gündöndü, hünkârbeğendi, imambayıldı, karyağdı, külbastı, mirasyedi, papazkaçtı, serdengeçti, şıpsevdi, zıpçıktı.
8. Her iki kelimesi de -dı (-di / -du / -dü, -tı / -ti / -tu / -tü) belirli geçmiş zaman veya -r /-ar /-er geniş zaman eklerini almış ve kalıplaşmış bulunan birleşik kelimeler bitişik yazı­lır: dedikodu, kaptıkaçtı, oldubitti, uçtuuçtu (oyun); biçerbağlar, biçerdö­ver, göçerkonar, kazaratar, konargöçer, okuryazar, uyurgezer, yanardö­ner, yüzergezer.
Aynı yapıda olan çakaralmaz kelimesi de bitişik yazılır.
9. Somut olarak yer bildirmeyen alt, üst ve üzeri sözlerinin sona getirilmesiyle kurulan birleşik kelimeler bitişik yazılır: ayakaltı, bilinçaltı, gözaltı (gözetim), şuuraltı; akşamüstü, akşamüzeri, ayaküstü, ayaküzeri, bayra­müstü, gerçeküstü, ikindiüstü, olağanüstü, öğleüstü, öğleüzeri, suçüstü, yüzüstü.
10. İki veya daha çok kelimenin birleşmesinden oluşmuş kişi adları, soyadları ve lakaplar bitişik yazılır: Alper, Aydoğdu, Birol, Gülnihal, Gülseren, Gündoğdu, Şenol, Varol; Abasıyanık, Adıvar, Atatürk, Gökalp, Güntekin, İnönü, Karaosmanoğlu, Tanpınar, Yurdakul; Boynueğri Mehmet Paşa, Tepedelenli Ali Paşa, Yirmisekiz Çelebi Mehmet, Yedisekiz Hasan Paşa.
11. İki veya daha çok kelimeden oluşmuş Türkçe yer adları bitişik yazılır: Çanakkale, Gümüşhane; Acıpayam, Pınarbaşı, Şebinkarahisar; Beşiktaş, Kabataş.
Şehir, kent, köy, mahalle, dağ, tepe, deniz, göl, ırmak, su vb. kelime­lerle kurulmuş sıfat tamlaması ve belirtisiz isim tamlaması kalıbındaki yer adları bitişik yazılır: Akşehir, Eskişehir, Suşehri, Yenişehir; Atakent, Batıkent, Konutkent, Korukent, Çengelköy, Sarıyer, Yenimahalle; Karabağ, Karadağ, Uludağ; Kocatepe, Tınaztepe; Akdeniz, Karadeniz, Kızıldeniz; Acıgöl; Kızılırmak, Yeşilırmak; İncesu, Karasu, Sarısu, Akçay.
12. Kişi adları ve unvanları oluşmuş mahalle, meydan, köy vb. yer ve kuruluş adlarında unvan kelimesi sonda ise, gelenekleşmiş olarak bitişik yazılır: Abidinpaşa, Bayrampaşa, Davutpaşa, Ertuğrulgazi, Kemalpaşa (ilçesi); Necatibey (Caddesi), Mustafabey (Caddesi).
13. Ara yönleri belirten kelimeler bitişik yazılır: güneybatı, güney­doğu, kuzeybatı, kuzeydoğu.
14. Bunlardan başka dilimizde her iki ögesi de asıl anlamını koru­duğu hâlde yaygın bir biçimde gelenekleşmiş olarak bitişik yazılan keli­meler de vardır:
a. Baş sözüyle oluşturulan sıfat tamlamaları: başağırlık, başbakan, başçavuş, başeser, başfiyat, başhekim, başhemşire, başkahraman, başka­rakter, başkent, başkomutan, başköşe, başmüfettiş, başöğretmen, baş­parmak, başpehlivan, başrol, başsavcı, başşehir, başyazar.
b. Bir topluluğun yöneticisi anlamındaki başı sözüyle oluşturulan belirtisiz isim tamlamaları: aşçıbaşı, binbaşı, çarkçıbaşı, çeribaşı, ele­başı, mehterbaşı, onbaşı, ustabaşı, yüzbaşı.
c. Oğlu, kızı sözleri: çapanoğlu, eloğlu, hinoğluhin, elkızı.
ç. Ağa, bey, efendi, hanım, nine vb. sözlerle kurulan birleşik kelime­ler: ağababa, ağabey, beyefendi, efendibaba, hanımanne, hanımefendi, hacıağa, hıyarağalık, kadınnine, paşababa.
d. Biraz, birkaç, birkaçı, birtakım, birçok, birçoğu, hiçbir, hiç­biri, herhangi belirsizlik sıfat ve zamirleri de gelenekleşmiş olarak biti­şik yazılır.
15. Ev kelimesiyle kurulan birleşik kelimeler bitişik ya­zılır: aşevi, bakımevi, basımevi, doğumevi, gözlemevi, huzurevi, ko­nukevi, orduevi, öğretmenevi, polisevi, yayınevi.
16. Hane, name, zade kelimeleriyle oluşturulan birleşik kelime­ler bitişik yazılır: çayhane, dershane, kahvehane, yazıhane; beyanname, kanunname, se­yahatname, siyasetname; amcazade, dayızade, teyzezade.
UYARI: Eczahane, hastahane, pastahane, postahane sözleri kullanımdaki yaygınlık dolayısıyla eczane, hastane, pastane, postane biçiminde yazılmaktadır.
17. Farsça kurala göre oluşturulan isim ve sıfat tamlamaları ile ka­lıplaşmış biçimler bitişik yazılır: cürmümeşhut, darıdünya, ehli­beyit,   ehvenişer, erkânıharp, fecrisadık, gayrimenkul, gayrimeşru, hüsnükuruntu, hüsnüniyet, suikast, hamdüsena, hercümerç.
18. Arapça kurala göre oluşturulan tamlamalar ve kalıplaşmış biçimler bitişik yazılır: aliyyülâlâ, ceffelkalem, darülaceze, darülfünun, daüssıla, fevkalade, fevkalbeşer, hıfzıssıhha, hüvelbaki, şey­hülislam, tahtelbahir, tahteşşuur; âlemşümul, cihanşümul, aleykümselam, Allahualem, bismillah, fenafillah, fisebilillah, hafazanallah, inşallah, maşallah, velhasıl, velhasılıkelam.
19. Müzik makam adları bitişik yazılır: acembuselik, hisarbuselik, muhayyerkürdi.
Bir sıfatla oluşturulan usul adlarında sıfat ayrı yazılır: ağır aksak, yürük aksak, yürük semai.
20. Kanunda bitişik geçen veya bitişik olarak tescil ettirilmiş olan kuruluş adları bitişik yazılır: İçişleri, Dışişleri, Genelkurmay, Yükseköğretim.

1. Etmek, edilmek, eylemek, kılmak, kılınmak, olmak, olunmak yar­dımcı fiilleriyle kurulan birleşik fiiller herhangi bir ses düşme­sine veya türemesine uğramazsa ayrı yazılır: alt etme

1. Kuruluş, kitap, dergi ve yön adlarının kısaltmaları genellikle her kelimenin ilk harfinin büyük olarak yazılmasıyla yapılır.
Gelenekleşmiş olan T.C. (Türkiye Cumhuriyeti) ve T. (Türkçe) kısaltmalarının dışında büyük harflerle yapılan kısaltmalarda nokta kullanılmaz.
2. Kuruluş, kitap, dergi ve yön adlarıyla element ve ölçülerin dışında kalan kelime veya kelime gruplarının kısaltılmasında, ilk harfle birlikte kelimeyi oluşturan temel harfler dikkate alınır. Kısaltılan kelime veya kelime grubu; özel ad, unvan veya rütbe ise ilk harf büyük; cins isim ise ilk harf küçük olur.
3.Küçük harflerle yapılan kısaltmalara getirilen eklerde kelimenin okunuşu esas alınır.
4. Büyük harflerle yapılan kısaltmalara getirilen eklerde ise kısalt­manın son harfinin okunuşu esas alınır.
5.Sonunda nokta bulunan kısaltmalar kesmeyle ayrılmaz. Bu tür kı­saltmalarda ek, noktadan sonra ve kelimenin okunuşuna uygun olarak yazılır.
6.Tonsuz (sert) ünsüzle biten kısaltmalar, ek aldıkları zaman oku­nuşta tonsuz ses tonlulaştırılmaz.
UYARI: Ancak birlik kelimesiyle yapılan kısaltmalarda söyleyişte k'nin yu­muşatılması normaldir.

1.  Sayılar rakamla da yazıyla da yazılabilir. Sayıların ne zaman yazıyla, ne zaman rakamla gösterileceği konusunda dilimizde açık bir kural verilemez. Ancak, uygulamada birtakım ilkeler oluşmuştur. Bu ilkelere göre, küçük sayılar, yüz ile bin sayıları ve daha çok edebî karakter taşıyan metinlerde geçen sayılar yazıyla gösterilir.
2.  Birden fazla kelimeden oluşanlar ayrı yazılır.
3.  Beş ve beşten çok rakamlı sayılar sondan sayılmak üzere üçlü gruplara ayrılarak yazılır.
4.  Sayılarda kesirler virgül ile ayrılır.
5.  Sıra sayıları yazıyla ve rakamla gösterilebilir. Rakamla gösterilmesi durumunda ya rakamdan sonra bir nokta konur veya rakamdan sonra kesme konularak derece gösteren ek yazılır.
6. Üleştirme sayıları rakamla değil yazıyla belirtilir.
UYARI : Sıra sayıları ekle gösterildiğinde rakamdan sonra sa­dece kesme işareti ve ek yazılır; ayrıca nokta konmaz.

Arap ve Fars kökenli kişi ve yer adları Türkçenin ses ve yapı özelliklerine göre yazılır: Ahmet, Bedrettin, Fuat, Mehmet, Necmettin, Nizamettin, Ömer, Rıza, Saadettin; Cezayir, Fas, Filistin, Mısır, Suudi Arabistan; Bağdat, Cidde, Erdebil, Halep, İsfahan, İskenderiye, Medine, Mekke, Şam, Şiraz, Tahran, Tebriz, Trablusgarp.

1. Latin yazı sistemini kullanan dillerdeki özel adlar özgün biçimleriyle yazılır: Beethoven, Byron, Cervantes, Chopin, Eminescu, Grimm, Horatius, Molière, Puccini, Rousseau, Shakespeare; Bologna, Buenos Aires, Iorga, Ile-de-France, Karlovy Vary, Latium, Loire, Mann, New York, Nice, Rio de Janeiro, Vaasa, Wuppertal. Ancak Batı dillerinde kullanılan adların okunuşları ayraç içinde gösterilebilir: Shakespeare (Şekspir) vb.
Yabancı özel adlardan türetilmiş akım adları Türkçe söylenişlerine göre yazılır: Dekartçılık, Epikürcülük, Kalvenci, Kalvencilik, Kalvenizm, Kartezyenizm, Lüterci, Lütercilik, Marksçılık, Marksist, Marksizm.
2. Batı kökenli kişi ve yer adlarının bir bölümü eskiden beri dili­mizde yerleştiği biçimiyle yazılır: Napolyon, Şarlken, Şarl (Demirbaş Şarl); Atina, Brüksel, Cenevre, Londra, Marsilya, Münih, Paris, Roma, Selanik, Venedik, Viyana, Zürih; Hollanda, Letonya, Lüksemburg.
3. Ait olduğu dilde ayrı yazılan yer adları Türkçede de ayrı yazılır: Buenos Aires, Frankfurt am Main, Freiburg im Breisgau, Hyde Park, Mont Blanc, New Orleans, New York, Rio de Janeiro, San Marino, Wiener Neustadt, Titov Veles.

Rusça özel adlarda Rus harflerinin ses değerlerini karşılayan Türk harfleri kullanılır: Bolşevik, Brejnev, Çaykovski, Çehov, Dostoyevski, Gogol, Gorbaçov, İlminskiy, İlyiç, Katayev, Klyaştornıy, Malov, Mendeleyev, Prokofyev, Puşkin, Şolohov, Tolstoy, Yeltsin; Moskova, Omsk, Orenburg, Petersburg, Volga, Yenisey.

1. Çince adlar, Türkçede yerleşmiş biçimlerine göre yazılır: Honan, Huangho, Kanton, Nankin, Pekin, Şanghay, Vuhan.
Çincede soyadları küçük adlardan önce gelir. Soyadları çoklukla tek hecelidir, küçük adlar ise bir veya iki heceden oluşur. Bu adlar büyük harfle başlar; heceler arasına çizgi konur: Sun Yat-sen, Lin Yu-tang. Yalnız Konfüçyüs gibi yaygınlık kazanmış adlar bitişik yazılır.
2. Japon yer ve kişi adları da Türkçede yerleşmiş biçimlerine göre yazılır: Tokyo, Hiroşima, Nagazaki, Osaka, Hokkaydo, Kyoto; Hirohito, Nobuo Haneda, Kayako Hayashi, Sbuishi Kato, Masao Mori.

Türk devlet ve topluluklarındaki özel adlar Türkçede yerleşmiş  söyleniş biçimlerine göre yazılır: Azerbaycan, Özbekistan; Taşkent, Semerkant, Bakü, Bişkek; Abdullah Tukay, Abdürrauf Fıtrat, Bahtiyar Vahapzade, Baykonur, Cafer Cebbarlı, Cemal Kemal, Cengiz Aytmatov, İslam Kerimov, Muhtar Avazov, Osman Nasır.

Canlı ve cansız varlıkları, duygu ve düşünceleri, çeşitli durumları bildiren kelimelere isim denir.

İsimlerin sayı bakımından çokluğunu bildirirler.
Kelimenin sonuna -ler, -lar eki gelir.
örnek:
elma → elmalar
çocuk → çocuklar
öğrenci → öğrenciler

Eki yoktur. İsme sorulan ne, kim sorusunu yanıtlar.
Örnek:
elma 
çocuk
öğrenci

Gösterme hali olarak da adlandırılabilir. Kelimeye -(y)i, -(y)ı, -(y)ü, -(y)u ekleri gelir. İsim fiile sorular neyi, kimi sorusunu yanıtlar.
örnek:
elma → elmayı
çocuk → çocuğu
öğrenci → öğrenciyi
kız → kızı
süs → süsü

Kelimeye -(y)e, -(y)a ekleri gelir. İsim fiile sorular neye, kime sorusunu yanıtlar.
örnek:
elma → elmaya
çocuk → çocuğa
ev → eve
okul → okula

Kelimeye -de, -da, -te, -ta ekleri gelir. İsim fiile sorular neyde, kimde sorusunu yanıtlar.
örnek:
elma → elmada
çocuk → çocukta
ev → evde
okul → okulda
masa → masada

Kelimeye -den, -dan, -ten, -tan ekleri gelir. İsim fiile sorular neyden, kimden sorusunu yanıtlar.
örnek:
elma → elmadan
çocuk → çocuktan
ev → evden
okul → okuldan

Kelimeye -ce, -ca, -çe, -ça ekleri gelir. İsim fiile sorular nece, kimce sorusunu yanıtlar.
örnek:
çocuk → çocukça
okul → okulca

Kelimeye ile -(y)le, -(y)la ekleri gelir. İsim fiile sorular neyle, kimle sorusunu yanıtlar.
örnek:
çocuk → çocuk ile → çocukla
okul → okul ile → okulla
araba → araba ile → arabayla

Kelimeye ile -(n)in, -(n)ın, -(n)ün, -(n)un ekleri gelir. İsim fiile sorular neyin, kimin sorusunu yanıtlar.
örnek:
çocuk → çocuğun
okul → okulun
araba → arabanın

FİİL:
 

Yakın Bilinen Geçmiş Zaman:

 

-dı/-di/-du/-dü ile kurulan geçmiş zamandır. Yakın zamanda gerçekleşen bir eylemi anlatmak için kullanılır: 

 

Aldım                          Kördüm                       Turdum                        Yeşdim            

 

Aldıñ                           Kördüñ                        Turduñ                         Yeşdiñ

 

Aldı                             Kördü                         Turdu                          Yeşdi

 

Aldı                             Kördü                         Turdu                          Yeşdi

 

Aldıq                           Kördük                       Turduq                        Yeşdik

 

Aldıñız             Kördüñüz                    Turduñuz                     Yeşdiñiz

 

Aldı(-lar)         Kördü(-lär)                  Turdu(-lar)                   Yeşdi(-lär)

 

Aldı(-lar)         Kördü(-lär)                  Turdu(-lar)                   Yeşdi(-lär)

 

Fiil çekilirken üçüncü tekil ve çoğul şahıslara -lar ekini eklemek isteğe bağlıdır. Kullanımı konuşmada ciddiyeti, bilimselliği, resmiliği arttırır.  

 

Uzak Bilinen Geçmiş Zaman:

 

-gan/-gän eki ile kurulan geçmiş zamandır.  Geçmişte gerçekleşen bir eylemi anlatmak için kullanılır, bu geçmiş bildiğimiz ama artık geride kalan bir geçmiştir. Fiil bu zamanla çekilirken zaman ekinden sonra isim çekerken kullanılan şahıs ekleri eklenilir.

 

Alganman                    Körgänmän                  Turganman                   Yeşgänmän

 

(Aldım)                        (Gördüm)                    (Kalktım)                     (Çözdüm)        

 

Algansan                      Körgänsän                   Turgansan                    Yeşgänsän

 

Algan(-dır)                   Körgän(-dir)                Turgan(-dır)                 Yeşgän(-dir)

 

Algan(-dır)                   Körgän(-dir)                Turgan(-dır)                 Yeşgän(-dir)

 

Alganmız                      Körgänmiz                   Turganmız                    Yeşgänmiz

 

Algansıñız                    Körgänsiñiz                  Turgansıñız                   Yeşgänsiñiz

 

Algan(-dırlar)               Körgän(-dirlär)            Turgan(-dırlar)             Yeşgänlär

 

Algan(-dırlar)               Körgän(-dirlär)            Turgan(-dırlar)             Yeşgän (-dirlär)

 

Fiil çekilirken üçüncü tekil şahıslara –dır  ve üçüncü çoğul şahıslara -dırlar ekini eklemek isteğe bağlıdır. Kullanımı konuşmada ciddiyeti, bilimselliği, resmiliği arttırır.  

 

Öğrenilen Geçmiş Zaman:

 

Öğrenilen geçmiş zaman kendimizimn tecrübe etmediği, başkalarından işittiğimiz, öğrendiğimiz olayları kullanırken kullanılan zamandır. Türükçä’de iki türlü üretilir. Birincisi –mış/-miş/-muş/-müş ekleri kullanılarak türetilendir. Bu ek yalnızca hikaye ya da öykü anlatırken ya da gerçek üstü ve inanılmaz tasvirler yapılırken kullanılır. Bu ek kullanıldığında içinde “ben böyle bir şey olacağına inanmıyorum ama anlatıyorlar işte” iması gizlidir.

 

Almışman                     Körmüşmän                 

 

(Almışım)                     (Görmüşüm)     

 

Almışsan                      Körmüşsän                  

 

Almış(-dır)                   Körmüş(-dür)              

 

Almış(-dır)                   Körmüş(-dür)              

 

Almışmız                      Körmüşmüz                 

 

Almışsıñız                     Körmüşsüñüz   

 

Almış(-dırlar)               Körmüş(-dürlär)                      

 

Almış(-dırlar)               Körmüş(-dürlär)

 

Fiil çekilirken üçüncü tekil şahıslara –dır  ve üçüncü çoğul şahıslara -dırlar ekini eklemek isteğe bağlıdır. Kullanımı konuşmada ciddiyeti, bilimselliği, resmiliği arttırır.  

 

Öğrenilen geçmiş zamanı üretmenin ikinci yolu, -ıp/-ip/-up/-üp eklerinden yararlanmaktır. Bu ek kullanıldığında söylenen şey “Ben görmedim ama olmuş olabilir” anlamını da taşır.

 

Alıpman                       Körüpmän                   

 

(Almışım)                     (Görmüşüm)     

 

Alıpsan                         Körüpsän                    

 

Alıp(-dır)                     Körüp(-dür)                

 

Alıp(-dır)                     Körüp(-dür)                

 

Alıpmız                         Körüpmüz                   

 

Alıpsıñız                       Körüpsüñüz     

 

Alıp(-dırlar)                 Körüp(-dürlär)             

 

Alıp(-dırlar)                 Körüp(-dürlär)

 

Şimdiki Zaman:

 

Anlamca biri birinden ufak nüansı bulunan üç ayrı yolla anlatılır. Birinci yolda –ip yürmäk fiili kullanılır ve bu fiil gelecek geniş zamanla çekilir. Ancak yürmäk ( yürümek) fiili anlamın şimdiki zaman olduğunu bildirir. Bu şekilde kurulan şimdiki zamanda eylemin geçmişi belli olmayıp  şimdi sürmektedir ve gelecekte bir süre daha süreceği bilinmektedir.

 

Alıp yürämän               Körüp yürämän                       

 

(Alıyorum)                   (Görüyorum)    

 

Alıp yüräsän                 Körüp yüräsän             

 

Alıp yürä(-dir)              Körüp yürä(-dir)                      

 

Alıp yürä(-dir)              Körüp yürä(-dir)                      

 

Alıp yürämiz                 Körüp yürämiz             

 

Alıp yüräsiñiz               Körüp yüräsiñiz            

 

Alıp yürä(-dirlär)          Körüp yürä(-dirlär)                  

 

Alıp yürä(-dirlär)          Körüp yürä(-dirlär)

 

Fiil çekilirken üçüncü tekil şahıslara –dır  ve üçüncü çoğul şahıslara -dırlar ekini eklemek isteğe bağlıdır. Kullanımı konuşmada ciddiyeti, bilimselliği, resmiliği arttırır.  

 

İkinci yolda ise, - ıp yatmaq fiili kullanılır. Fiil gelecek zamanla çekilse de yatmaq fiilinin kendisi şimdiki zamanı işaret eder. Bu şekilde kurulan şimdiki zamanda eylemin geçmişte başlamışlığı bilinmektedir ve şu anda eylem gerçekleşmektedir ancak az sonra sona erecektir.

 

Alıp yataman                Körüp yataman                        

 

(Alıyorum)                   (Görüyorum)    

 

Alıp yatasan                 Körüp yatasan             

 

Alıp yata(-dır)              Körüp yata(-dır)                      

 

Alıp yata(-dır)              Körüp yata(-dır)          

 

Alıp yatamız                 Körüp yatamız             

 

Alıp yatasıñız                Körüp yatasıñız            

 

Alıp yata(-dırlar)          Körüp yata(-dırlar)                  

 

Alıp yata(-dırlar)          Körüp yata(-dırlar)                  

 

Fiil çekilirken üçüncü tekil şahıslara –dır  ve üçüncü çoğul şahıslara -dırlar ekini eklemek isteğe bağlıdır. Kullanımı konuşmada ciddiyeti, bilimselliği, resmiliği arttırır.  

 

Üçüncü yolda ise, fiil köküne -maqda/-mäkdä eki eklenmek yoluyla şimdiki zaman kurulur. Bu şekilde kurulan şimdiki zamanda eylem geçmişte başlamış, şu an sürmekte ve büyük olasılıkla az sonra da sürüyor olacaktır.

 

Almaqdaman               Körmäkdämän

 

(Alıyorum)                   (Görüyorum)    

 

Almaqdasan                 Körmäkdäsän              

 

Almaqda(-dır)              Körmäkdä(-dir)                       

 

Almaqda(-dır)               Körmäkdä(-dir)                                  

 

Almaqdamız                 Körmäkdämiz              

 

Almaqdasıñız               Körmäkdäsiñiz

 

Almaqda(-dırlar)          Körmäkdä(-dirlär)       

 

Almaqda(-dırlar)          Körmäkdä(-dirlär)

 

Fiil çekilirken üçüncü tekil şahıslara –dır  ve üçüncü çoğul şahıslara -dırlar ekini eklemek isteğe bağlıdır. Kullanımı konuşmada ciddiyeti, bilimselliği, resmiliği arttırır.  

 

Geniş Zaman: 

 

Fiil köküne gelen  -ar/-är/-r ekleri ile oluşturulur. Eylemin geçmiş, şimdiki ve gelecek zamanların tümüne ait olduğunu gösterir.

 

Alarman                       Körärmän

 

(Alırım)                        (Görürüm)

 

Alarsan                        Körärsän

 

Alar                             Körär

 

Alar                             Körär

 

Alarmız                        Körärmiz

 

Alarsıñız                       Körärsiñiz

 

Alar(-lar)                     Körär(-lär)

 

Alar(-lar)                     Körär(-lär)

 

Fiil çekilirken üçüncü çoğul şahıslara -lar ekini eklemek isteğe bağlıdır. Kullanımı konuşmada ciddiyeti, bilimselliği, resmiliği arttırır.  

 

Gelecek Zaman:

 

Belirsiz Gelecek Zaman: 

 

Belirsiz gelecek zaman fiil kökü ünsüzle bitiyor ise, fiil kökü sonuna  -a/- ä, ünlü ile bitiyorsa, fiil kökü sonuna  -ya/yä getirilmesi ile kurulur. Bu çekim gelecekte bir eylemin gerçekleşeceğini, ancak bunun kesin, planlanmış ve bir programa bağlanmış zamanının olmadığını bildirir.

 

Alaman                        Oquyaman                   Körämän

 

(Alacağım)                   (Okuyacağım)              (Göreceğim)

 

Alasan                         Oquyasan                    Köräsän

 

Ala(-dır)                      Oquya(-dır)                 Körä(-dir)

 

Ala(-dır)                      Oquya(-dır)                 Körä(-dir)

 

Alamız                         Oquyamız                    Körämiz

 

Alasıñız                        Oquyasıñız                   Köräsiñiz

 

Ala(-dırlar)                  Oquya(-dırlar)             Körä(-dirlär)

 

Ala(-dırlar)                  Oquya(-dırlar)             Körä(-dirlär)

 

Fiil çekilirken üçüncü tekil şahıslara –dır  ve üçüncü çoğul şahıslara -dırlar ekini eklemek isteğe bağlıdır. Kullanımı konuşmada ciddiyeti, bilimselliği, resmiliği arttırır. Belirsiz gelecek zaman birçok halde şimdiki zaman ve geniş zaman yerine de kullanılabilir, bunu cümlenin kurulacağı andaki bağlam belirler.

 

Belirli Gelecek Zaman:

 

Gelecek zamanın bu biçimi, eylemin kesin biçimde gerçekleşeceğini, olayla ilgili her şeyin belli olduğunu, plan ve ayarlamaların yapıldığını ve çok büyük olasılıkla da dönüşü olmadığını gösterir, belirli olduğu kadar kesindir.  Fiil köküne –açaq/-äçäk ekinin getirilmesi ile kurulur.

 

Alaçaqman                  Köräçäkmän

 

(Alacağım)                   (Göreceğim)

 

Alaçaqsan                    Köräçäksän

 

Alaçaq(-dır)                 Köräçäk(-dir)

 

Alaçaq(-dır)           

Türükçä’de toplam 33 ses ve bu sesleri gösteren 33 harf bulunur. Bunlardan “a, ä, e, ı, i, o, ö, u, ü” olmak üzere toplam dokuzu ünlü, “b, c, ç, d, f, g, ğ, h, x, j, k, q, l, m, n, ñ, p, r, s, ş, t, v, y, z” olmak üzere yirmi dördü ise ünsüzdür.
Ünlü seslerden “ä” Türkçedeki “e” sesine göre biraz daha açık, a sesine yaklaşan bir e sesi vermelidir, öte yandan “e” harfi ile gösterilen sesin, Türkçedeki “e” sesine göre biraz daha kapalı, i sesine yaklaşan bir e sesi vermesi gerekir. Diğer ünlüler içerisinde Türkçeden ses olarak ayrılan bulunmaz.
Ünsüz harfler ise aşağı yukarı Türkçe ile özdeş sesletime sahipken, içlerinden farklı seslendirilenler aşağıda açıklanacaktır.
ğ: Her zaman için, önünde ya da ardında yer aldığı harfe bakılmaksızın gırtlağa yakın telaffuz edilen Türkçedekinden daha belirgin bir ğ sesi olup Anadolu’da kimi lehçelerde görülür.
x: Batı dillerinden alışıldığının aksine ks sesini değil, Türk dünyasının çoğunda rastlanan sert h sesini verir. Bu h Türkçede alışageldiğimizden daha hırıltılı ve gırtlaktan çıkan bir h sesidir.
q: Yine Batı dillerinde gördüğümüz bu karakter, Türk dillerinde bilinen k sesinin ötesinde, sert k sesi verir. Bu k alışılmışın ötesinde daha gırtlaktan ve belirgindir. Genellikle kalın ünlülerin önünde ya da ardında olur. Anadolu’da da korunan, işitilen seslerdendir.
ñ: Anadolu ağızlarında sıkça görülen, Osmanlı yazısında (ﯓ) harfi ile gösterilen, sağır kef, kef-i Türki ya da nef olarak adlandırılan genizcil n sesidir. Mangal, Ankara, Engel gibi sözlerde hala fark edilmeksizin seslendirilen bu art damak ünsüzünü çıkarmak için dilin ardı genze yakın tutularak n denilir.
KİMİ SES ÖZELLİKLERİ:
1-Türkçede “g” ile başlayan Türkçe kökenli sözler Türükçä’de ” k” ile başlar, Örneğin:
Gelmek > Kelmäk,
Giriş > Kiriş
Göl > Köl
Gülmek > Külmäk,
2-Türkçede “d” ile başlayan demek hariç Türkçe kökenli sözler Türükçä’de “t” ile başlar, Örneğin:
Dağ > Tağ
Dil > Til
Doğru > Toğra
Düz > Tüz

3-Türkçede Türkçe kökenli sözlerde bulunan “c“ sesi Türükçä’de “ç”dir, Örneğin:
Acıkmak > Açıqmaq
Cengiz > Çiñgiz
Demirci > Temirçi
Yolcu > Yolavçı
4-Türkçe kökenli olup “v” ile başlayan var, varmak, vermek sözleri Türükçä’de b ile başlar, Örneğin:

Var > Bar

5- Türkçede -cı, -ci, -cu, -cü, -çı, -çi, -çu, -çü biçimlerinde bulunan ek Türükçä’de yalnızca kendinden önceki ünlülerin kalın ya da ince oluşu dikkate alınmak kaydıyla -çı ve çi biçimlerinde bulunur

6- Türükçä’de bir sözcüğün birinci hecesinde kalın bir ünlü (a, ı, o, u) bulunuyorsa, diğer hecelerdeki ünlüler de kalın; ince bir ünlü (ä, e, i, ö, ü) bulunuyorsa diğer hecelerdeki ünlüler de ince olur: adım, ağız, ayaq, boyunduruq, burun, qarlığaç; beşik, biläzik, kelin, közlük, talaq, tuzaq, üzäñgi, yüzük gibi.

7- Türükçä’de bir sözcüğün ilk hecesinde düz ünlü (a, ä, e, ı, i) varsa sonraki hecelerde de düz ünlü bulunur: añlaşmaq, yaqınlaşmaq, qayıqçı, yılıtmaq, keñäşmäk, yeläk, biläk, çiyäläk vb. Bu kuralın tek istisnası fiil köküne getirilerek fiilden ad türetmeye yarayan -uv/-üv ekidir: kirüv, bilüv, sınuv, vb…

8- Türükçä’de bir sözcüğün ilk hecesindeki düz ünlü (e) ya da (i) ise, izleyen ya (ä) ya da (i) dir: kelmäk, keñäşmäk, yeläk, biläk, çiyäläk, keliş, temir, vb.

9- Türükçä’de bir sözcüğün ilk hecesinde yuvarlak ünlü (o, ö, u, ü) varsa bunu izleyen ilk hecede dar yuvarlak (u, ü) veya geniş düz (a, ä) ünlü bulunur: boyunduruq, moru, otun, , yoqlamaq, urmaq, yumurtga, ağıruv, vb.

10-Sözlere eklenen -uv/-üv, -çı/-çi, -gı/-gi (bkz: İsimden İsim Yapan Ekler),-gıç/-giç (bkz: İsimden İsim Yapan Ekler) ve –gıl/-gil (bkz: Emir) dışındaki bütün ekler bu kurallara uyarlar.

Türükçä’deki yapım ekleri çoğunlukla Türkçedekilerle aynıdır. Ancak bazılarında küçük ama önemli ses değişiklikleri bulunmaktadır. Bu nedenle özellikle şu üç kural önemlidir:
1-İçinde c geçen -cı, -cılık, -ıncı ekleri Türükçä’de ç ile yazılır ve okunur; (tilçi, temirçilik, ekinçi vb.)
2- Ünlü uyumunun gereği olarak -lık/-lik eki Türükçä’de -lıq/lik/-luq/lük biçimlerini alır; (yoqsulluq, köplük, birinçilik vb…)
3-Arapça nispet eki -î, Türükçä’de -iy biçiminde yazılır. Milliy, Türkiy, Şaxsiy
Türkçede bulunmayan ya da sadece kalıplaşmış sözlerde görülen Türükçä yapım ekleri şunlardır:
İsimden İsim Yapan Ekler:
-ça/-çä: kökräkçä (yelek), bölükçä ( parça)
-çan/-çän: Severlik, severek yapma anlamı katar: çaquvçan ( ispiyoncu, jurnallemeyi seven), işçän (çalışkan, hamarat, işini severek yapan, aktif), Sevişçän (mihriban, sevecen, sevgi ve ilgisini esirgemeyen)
-çıl/çil: Meyil, sevme, hoşlanma, yandaşlık bildirir: etçil ( etobur), otçul ( otobur)
-daş/däş: zamandaş (çağdaş), eldäş ( hemşehri)
-gı/-gi-: keçägi ( geceki), ölkädägi (ülkedeki), astdagı (aşağıdaki), qoluñuzdagı ( elinizdeki)
-ımtır/-imtir: Benzerlik, andırma bildirir, genellikle renkler ile kullanılır: sarımtır (sarımsı), kökümtür (mavimsi), qaramtır (siyahımsı), alımtır (pembemsi)
-laq/-läk: eğinläk (geniş omuzlu), qarınlaq ( göbekli), etläk ( etleri sarkan)
Küçültme Ekleri:
Türkçeden farklı olanları vardır, Başlıcaları şunlardır:
-çaq/-çäk: tayçaq ( taycık), kelinçäk ( gelincik), çağaçaq ( bebecik)
-gına/-ginä: azgına ( azıcık), balagına ( çocukçağız), qızgına (kızcağız), Öyginä (evcik)
-qay/-käy: başqay ( başçık), qoñşuqay ( komşucuk), siñilkäyim ( bacıcığım)
-tay/-täy : oğultay ( küçük oğul), erkätäy ( nazlı, şımarık, gözde)
Sayılara Eklenen Ekler ve Anlamları:
-ala/-älä: üçälä kitap (üç kitap birden, üç kitap da ), onalamız ( onumuz birden, onumuzdan her biri de), qırqala adam ( kırk adam birden, kırk adam da)
-ar/-är/-şar/-şär: birär (birer), ekişär ( ikişer), altışar ( altışar), yetişär ( yedişer)
-avı/-ävi: ekävimiz ( ikimiz), toquzavımız ( dokuzumuz); birliktelik anlamı verir, ona kadar kullanılabilir.
-lap/-läp: onlap ( onlarca), yüzläp (yüzlerce), miñläp ( binlerce)
-ta/-tä: birtä ( bir tane), altıta ( altı tane), onta ( on tane)
-taça/täçä: birtäçä ( bir tane kadar), altıtaça ( altı tane kadar), ontaça ( on tane kadar)
Farsçadan alınma -xanä (-hane) sözü Türkçeye göre fazla işletilir: yazuvxane (ofis), yataqxanä (öğrenci yurdu), aşxanä (mutfak, yemekhane, lokanta, restoran), emxänä (eczane), ağıruvxanä (hastane)
İsimden Fiil Yapan Ekler:
-ay/-äy : azaymaq (azalmak), köpäymäk (çoğalmak), qaraymaq (kararmak), ulgaymaq (büyümek)
-qar/kär: başqarmaq (yönetmek), eskärmäk ( hatırda tutmak, akılda tutmak)
-r: eskirmäk (eksimek), qısqarmaq (qısalmak)
-ra/rä: qarañıramaq (alacakaranlık olmak), telbärämäk ( delirmek)
-sıra/-sirä: yoksun olma, bulunmama anlamı katar; elsirämäk (devletsiz olmak, devletsiz kalmak), añsıramaq ( mantıksız olmak, mantıksızlaşmak). Aynı yapı ihtiyaç duyma, isteme de bildirebilir.
Mastar: Fiil ismini anlatmak üzere Türükçä üç eki sıklıkla işletir:
1) –maq/-mäk: Bolmaq ( Olmak), Kelmäk (Gelmek), Almaq (Almak), Bilmäk (Bilmek) ; Asli mastar ekidir.
2) –uv/-üv/-v: Qorquv ( Korku, Korkma), Sevüv ( Sevgi, Sevme, Aşk), Sunuv ( Sunu, Sunma); Bu mastar eki daha çok eylem cümlenin öznesi iken kullanılsa daha iyi olur.
3) –ış/-iş: Körüş ( Görüş, Görme), Alış ( Alış, Alma), Baqış ( Bakış), Çıqış ( Çıkış)
 Fiilden İsim Yapan Ekler:
-alga/-älgä: qoñalga ( helikopter pisti), tüşälgä (pist),
-arman/-ärmän/-rman/-emän : öğrätärmän ( antrenör), oqurman ( okuyucu)
-çaq/-çäk: tartınçaq ( çekingen), erinçäk (üşengeç)
-dıq/dik: qaldıq ( kalıntı, artık, posa), tapıldıq ( buluntu, bulgu)
-gıç/-giç: öçürgiç ( silgi), qapyuvgıç ( bulaşık makinesi), körsätgiç ( işaret, ibare, gösterge)
-gir/-kir: ötkür ( keskin, sivri), sezgir ( duyarlı, hassas), bolmagır ( yaramaz)
-ımta/-imtä: süzümtä (netice, sonuç), barımta ( gidişat)
-ma/-mä: basma (basımevi)
-qaq/-gaq/-käk/-gäk: batqaq ( batak, bataklık), eşkäk ( kayık küreği), uyuşqaq ( uyumsağlayan)
-uvçı/üvçi: belli bir eylemi yapan kişi adları türetir; oquvçı ( okuyucu), aluvçı ( alıcı),
berüvçi (verici)
Fiilden Fiil Yapan Ekler:
-gız/-giz: yürgüzmäk ( yürütmek), oturguzmaq ( oturtmak), yatqızmaq ( yatırmak), kirgizmäk(girdirmek, sokmak),
-ız/-iz: emizmäk ( emdirmek, emzirmek), aqızmaq ( aktırmak, akıtmak)
-qaz/-gaz/-käz/-gäz: otqazmaq ( oturtmak), körgäzmäk ( göstermek)
-sät: körsätmäk ( göstermek)

Men, Sen, An, Ol, Biz, Siz, Alar, Olar. An ve Alar'ın insanlardan söz ederken,Ol ve Olar'ın ise hayvanlar bitkiler, cansız varlıklar ve kavramlardan söz ederken kullanılması gerektiğini unutmayınız. Siz sözü tek kişiye kullanıldığında nezaket ifade eder. Aynı nezaketli tavır birden fazla kişiye sergilenmek istediğine Siz sözüne –lär çoğul eki getirilir, ancak sizlär zamirinin nezaket anlamı dışında siz zamirinden ne dilbilim açısından ne de işlev açısından bir farkı yoktur.
Hal ekleri ile zamirlerin kullanışları aşağıdaki gibidir:

Ol, Bul, Şul, Olar, Bular, Şular. Ol ve çoğulu Olar bulunduğumuz noktadan en uzaktır. Şul veçoğulu Şular bulunduğumuz noktaya yakındır. Bul ve çoğulu Bular, bulunduğumuz noktadadır, yanımızdadır.
Eğer yanımızdaki iki farklı nesne ya da nesnlere işaret ediyorsak, birine bul ya da bular, diğerine ise şul ya da şular diye işaret ederiz. İşaret zamirlerinin hal eki almış şekilleri aşağıdaki gibidir:

Özüm, Özüñ, Özü, Özümüz, Özüñüz, Özläri

İSİM:
Çokluk Eki: -lar/lär: qızlar (kızlar), erkäklär ( erkekler)
İYELİK:

İlgi Hali Eki: -nıñ/-niñ/-nuñ/-nüñ : Aliniñ, Ağañnıñ, Öyümüznüñ , Yurtnuñ
Yükleme Hali Eki: -nı/-ni/-nu/-nü: Alini, Ağañnı, Öyümüznü, Yurtnu
Yaklaşma Hali Eki:
Adın yalın hali ile üçüncü tekil ve çoğul şahıs iyelik eki almış halinde, -ga, -gä:
Aligä, Ağaga, Balalarıga, Bilimgä, İstanbulga, Qızga, Öygä, Yurtuga, Yurtlarıga
Adın tekil ve çoğul üçüncü şahıs iyelik hali dışındaki şahıs iyelik eki almış hallerinde,-a/-ä:
Ağaña, Balamıza, Bilimiñizä, Qızıma, Öyümä, Sözüñä, Yurtumuza, Yurtuñuza
Bulunma Hali Eki:-da/dä: Alidä, Ağada, Balalarda, Bilimdä, İstanbulda, Qızda, Öydä, Yurtda, Yurtumuzda
Uzaklaşma Hali Eki:-dan/dän: Alidän, Ağadan, Balalardan, Bilimdän, İstanbuldan, Qızdan, Öydän, Yurtdan,Yurtumudan
Vasıta Hali:Bilän bağlacı ile gerçekleştirilir:Men bilän kelmädi,Ekmäkni ağzımız, tilimiz yenä tişlärimiz bilän yermiz.
SORU:
-mı/-mi/-mu/-mü ekleri ile cümleye soru anlamı verilir. Soru eki cümlede en son yer alan ektirve cümleye birleşik yazılır, ayrılmaz, örneğin;Ertägä mäktäpgä keläçäksänmi? (Yarın okula gelecek misin?)Bul Aliniñgimi? ( Bu Ali’ninki mi?)
İSİM ÇEKİMİ:

 İsim çekilirken üçüncü tekil ve çoğul şahıslara –dir ekini eklemek isteğe bağlıdır. Kullanımıkonuşmada ciddiyeti, bilimselliği, resmiliği arttırır.İsmin olumsuz çekimi emäz (değil) ya da teğil (değil) sözleri ile yapılır. lendirmedenteğil sözünün kullanımının çok edebi haller, aşırı resmi durumlar, akademik konuşmalar,nezaket gerektiren durumlar gibi belirli alanlarla sınırlı olduğunu hatırlatalım.

Oquvçı: Öğrenci
Men bala emäzmän
Sen bala emäzsän
An bala emäz(-dir)
Ol bala emäz(-dir)
Biz bala emäzmiz
Siz bala emäzsiñiz
Alar bala emäz(-dir)
Olar bala emäz(-dir)

Uskuru dolması.Denizin derinliklerinden çıkan çok lezzetli ve değişik bir balık yemeği. 
Malzemeler(8 Kişilik)

8 Adet porsiyonluk boy uskumru
3 Adet soğan
1 Kahve fincanı zeytin yağı
1 Adet limon
2 Çay bardağı dövülmüş ceviz
1 Su bardağı ufalanmış bayat ekmek içi
1 Bir tatlı kaşığı kırmızı pul biber
1 Demet maydanoz
1 Demet dereotu
1 Kahve fincanı domates püresi
Yeteri kadar tuz
Kızartma Malzemesi

Bir su bardağı un
2 Su bardağı kızartma yağı
3-4 Adet yumurta
1 Su bardağı galeta unu

Hazırlanışı
'Balıkların boşaltılması'
1.Bir uskumruyu elinize alın. Solungaçlarını çıkartın. Baş altından balığın karnını yarmadan iç organlarını çekip alın.
2.Parmaklarınızla hafif mıncıklayarak ve sıkarak balık etini yumuşatın.
3.Balığın kuyruk kısmını sağa sola , aşağı yukarı hakaret ettirerek kılçığı kuyruktan kırın.
4.Balığın baş kısmını sağa sola ,aşşağı yukarı hareket ettirerek kılçığı baş tarafından başı koparmamaya dikkat ederek kırın.
5.Kuyruk ve baş kısmından kırılmış kılçığı baş kısmın alt tarafından çekerek çıkartın.
Kılçığa yapışan etleri sıyırarak bir kaba alın, kılçığı atın.
6.Uskumruyu düz bir zemine yatırın. Sağ elinizin alt kısmını balığın kuyruk kısmına koyun. Elinizi sıvazlayarak balığın baş tarafına doğru hareket ettirin. Böylece balığın etlerini baş kısmından çıkartım. Sıvazlama işlemine balığın tüm etlerini boşaltıncaya kadar devam edin. Balık sadece dış derisi ile kalacaktır. Çıkan etleri kılçıktan ayırdığınız etlerin yanına koyun. Bütün bu işlemleri yaparken dıkkat edin balığın derisi yırtılmamalı. 
Son olarak , diğer uskumruları da bu şekilde boşaltacaksınız.
'Dolma harcını hazırlamak'
1.Rendelenmiş soğanları zeytin yağı eşliğinde tavaya koyun. Orta ateşte kavurun. 
2.Üzerine tasa koyduğunuz artan uskumru etlerini ekleyin. Balık etlerini de saldıkları suyu çekmeye başladıklarında ateşten indirin. Limon ekleyip iyice karıştırın.
3.Kızarttığınız harcın etlerini bir kaba çıkarın. Üzerine dövülmüş ceviz içlerini ,bayat ekmek içini , pul biberi, ince kıyılmış maydanozu ,dereotunu, domates püresini ve tuzu koyun. Tüm malzemeleri iyice karıştırın.
4. Hazırladığınız harcı etleri boşaltılmış balıkların içine kesik baş tarafından küçük bir kaşıkla doldurun.
'Kızartmak'

Harçla doldurulmuş uskumruları tek tek unlayın. Fazla un almaması için hafifçe silkelemeyi unutmayın.
Kızartma yağını tavaya koyun.Orta ateşte yakmadan kızdırın.
Kızgın yağda unlanmış balıkları önce çırpılmış yumurtaya , sonra galeta ununa bulayarak parti, parti kızartın. Kızaranların yağını süzerek servis kabına alın.
Servis kabını yeşilliklerle süsleyerek servis edebilirsiniz. Afiyet olsun

1. UZAKTAN ALGILAMAYA GİRİŞ
Tanımı: Herhangi bir temas olmaksızın, algılayıcı sistemleri kullanarak yeryüzü hakkında bilgi ednme sanatı/ bilimidir. Uzaktan Algılama teknolojileri yer yüzeyinden yansıyan ve yayılan enerjinin algılanması, kaydedilmesi,elde edilen materyalin bilgi çıkarmak üzere işlenmesi ve analiz edilmesinde kullanılır.
Tarihçesi: Bir nesne tanınmlanmak istenildiğinde öncelikle nesne görülür, şekli ve büyüklüğü hakkında ön bilgi toplanır,ardından eğer daha önce nesne konusunda bilgi varsa; bilgiler ile gözlemler karşılaştırılır,nesne ulaşılabilir mesafedeyse dokunarak,vb. diğer duyu organları ile nesne hakkında daha kesin bilgiye sahip olunur. Bu eylemler dizgesi farklı algılama türlerinden oluşur. 1909 yılında Wilbur Wright tarafından bir uçak kullanılarak ilk defa sıralar halinde Hava Fotoğrafı çekimi ile başlayan uzaktan algılama, 1957 yılında SPUTNIK-1 ile başlayan Uzay Çağı, 1972 yılında LANDSAT uydusunun fırlatılması ile devam etmiş ve günümüze dek uzanmıştır. Uzaktan algılamanın ilk askeri amaçlı kullanılmıştır. II. Dünya savaşının sonlarında uçaklardan çekilen hava fotoğraflarının keşif amaçlı kullanımı büyük önem kazanmıştır. Bu yıllarda özel filmler geliştirilmiştir.(örnek: kızıl ötesine duyarlı filmler). Günümüzde hala hava fotoğrafları istihbarat ve keşif amaçlı kullanılmaktadır (örnek: IHA görüntüleri). Daha sonra uzaktan algılama uydularının da fırlatılması ile askeri amaçların yanı sıra yeryüzü hakkında bilgi toplama  amacı da ortaya çıkmıştır. Özellikle; bitkilerin gelişiminin izlenmesi, meteorolojik gözlemlerin yapılması,su kaynaklarının belirlenmesi,doğal felaketlerin izlenmesi gibi incelemeler uzaktan algılama teknolojisi kullanılarak yapılmaya başlanılmıştır.
1.1 Uzaktan Algılama Bileşenleri
Uzaktan Algılama işlemleri, iki temel aşamadan oluşur. Bunlar "Veri Elde Etme" ve "Veri İşleme" aşamalarıdır.
1.1.1. Veri Elde Etme:
Enerji Kaynağı: Veri elde etmek için hedefe bir kaynak tarafından enerji gönderilmesi gerekmektedir. Bu kaynak hedefi aydınlatır veya hedefe elektromanyetik enerji gönderir. Optik uydular için enerji kaynağı güneştir, ancak radar uyduları kendi enerji kaynaklarını üzerlerinde taşır ve elektromanyetik enerji üreterek hedefe yollarlar.
Işınım ve Atmosfer: Enerji, hedefe yol alırken atmosfer ortamından geçer ve bu yol boyunca bazı etkileşimlere maruz kalır.
Hedef ile Etkileşim: Atmosferden geçen elektromanyetik dalga, hedefe ulaştığında hem ışınım hem de hedef özelliklerine bağlı olarak farklı etkileşimler oluşur.
Enerjinin Algılayıcı Tarafından Kayıt Edilmesi: Algılayıcı, hedef tarafından yayılan ve saçılan enerjiyi algılar ve buna ilişkin veri kayıt edilir.
Verinin İletimi, Alınması, ve İşlenmesi: Hedeften toplanan enerji miktarına ait veri, algılayıcı tarafından kayıt edildikten sonra, görüntüye dönüştürülmek ve işlenmek üzere bir uydu yer istasyonuna gönderilir.
1.1.2. Verinin İşlenmesi:
Yorumlama ve Analiz: Görüntü görsel, dijital ve elektronik işleme teknikleri ile zenginleştirilir, analiz edilir ve nicel sonuçlar elde edilecek veriye sahip olunur.
Uygulama: İşlenmiş veriden bilgi çıkarılır, bazı sonuçlara ulaşılır. Ayrıca elde edilen sonuçlar, başka veri kaynakları ile birleştirilerek kullanılabilir.
1.2. Elektromanyetik Spektrum
Uzaktan algılama platformlarındaki sensörler, elektromanyetik yayımı kaydederek görüntüyü oluştururlar. Bu yayımın kategorize edilmesi ile Elektromanyetik Tayf oluşmuştur. Tayf; gama ve x ışınlarını da içeren kısa dalga uzunluğu ile, microwave ve TV / radyo dalgalarını kapsayan uzun dalga uzunluğu arasında yer almıştır. Elektromanyetik tayf uzaktan algılama açısından önem taşıyan muhtelif bölgelere ayrılmıştır. Aşağıdaki şekillerde  tayfın içerdiği genel bölgeler ile Ultraviole (UV), Görünen Işık (Visible Light), Infrared (IR) ve  Microwave bölgelerinin dalga uzunluğu ve frekans durumu gösterilmiştir.
1.3. Işığın Cisim Ve Atmosfer İle Etkileşimi
1.3.1. Işığın Cisim İle Etkileşimi:
Çevremizdeki cisimleri gözümüzle tanıyıp algılamaya çalışırız. Çünkü etrafımızda gerçekleşen birçok olayı gözümüze tanır ve algılarız. Göreme olayı tamimiyle ışıkla gerçekleşmektedir. Bir ışık kaynağından yayılan ışığın aynı ortamda doğrusal olarak ilerlediğini biliyoruz. Peki, bu kaynağın yaydığı ışık nereye kadar gidebilir? Bazen ışığın kendimize kadar geleceğini daha ilersine gidemeyeceğini düşünürüz. Ama bu düşünce yanlıştır. Bunun en büyük kanıtı Güneş’ten gelen ışığın Dünya’ya ulaşmasıdır. Güneş’ten yayılan ışık, gezegenler ve yıldızlar arasındaki boşlukta her yönde ilerler. Dünya’mız yönünde ilerleyen Güneş ışığının yaklaşık 8,5 dakikalık yolculuktan sonra bu yönde çarptığı ilk yer atmosferdir. Işık bu seyrek maddesel ortamı geçtikten sonra saydam olmayan herhangi bir cisme çarpıncaya kadar ilerler. Etrafımızdaki cisimlerden bir kısmı ışık yayarak görünür. Örnek olarak; güneş, yıldızlar, lamba, ataş böceği verilebilir. Birde ışık yaymadıkları halde ışık kaynağından ışık aldıkları için görünen cisimler vardır. Örnek olarak; çiçek, ev, masa, sandalye verilebilir.
Cisimleri görmemizi sağlayan, göze gelerek cismi bize tanıtan enerjiye ışık denir.
Işığın Farklı Maddeler İle Etkileşimi: 
Işık ışınları, yayıldıklarında doğrusal yol izlerler. Güneş ışığının ağaç yapraklarının arasından süzülüp yere düşmesi, ışık kaynağı önündeki bir cismin gölgesinin cisimle aynı şekle sahip olması ışığın doğrusal bir şekilde yayılmasının sonuçlarındandır. Güneşten gelen ışınlar atmosferi geçtikten sonra herhangi bir engel ile karşılaşana kadar yoluna devam eder. Güneş ışığı maddeye çarptığı an madde ile etkileşme meydana gelir. Ama ışık ile madde etkileşme bütün maddelerde aynı biçimde gözlenmez.
Bir cismin üzerine düşen ışık, cismin özelliğine göre; Ortamdan geçebilir, ortamdan geçemez,geldiği ortama geri döner. Bir el fenerini aynaya tuttuğumuzda ışığını ayan üzerine düşürmüş oluruz. Işığın geldiği ortama geri döndüğü gözlemlenir.  Işığın bu şekilde bir yüzeye çarpıp geldiği ortama geri dönmesine yansıma denir. Her ortam ışığı aynı oranda yansıtamaz. Mesela; teksir kâğıdının yansıtmış olduğu ışık, aynanın yansıttığı ışıktan azdır. Bunun nedeni aynanın yüzeyinin daha parlak olmasıdır. Diğer taraftan bir düz pencere camı ise üzerine düşen ışığın büyük bir kısmını geçirirken, siyah kedinin üzerine düşen ışığın çok az kısmı yansımaktadır. Pencere camından dışarısı rahatlıkla gözükürken, buzlu camın arkasında duran bir cisim net olarak gözükmez ve tanınmaz.  Bu bilgilere dayanarak; ışığı geçiren ortamlara saydam ortam, kısmen geçiren ortamlara yarı saydam ortam, hiç geçirmeyen ortamlara ise; saydam olmayan ortam denir.
Işığın farklı yüzeylerden yansıma olayı:
Düz ayna gibi parlak yüzeye sahip cisimler ışığı rastgele yansıtmaz. Yansıma belli bir kurala göre olmaktadır. Bir noktadan çıkan ve bir
çizgi boyunca ilerleyen ışığa ışık ışını denir. Işığın yayılma ve ilerleme doğrultusunu belirtmek için doğrusal olan çizgi üzerine bir ok koyulur. Işığın bir yüzeye çarptığı anda yansıma olduğunu biliyoruz. 
Şimdi de bununla ilgili kuralların kavramlarını açıklayalım:
Gelen ışın: yüzeye gönderilen ışına gelen ışın denir. Yansıyan ışın: yüzeyden yansıyarak dönen ışına yansıyan ışın denir. Gelme açısı: gelen ışının normalle yaptığı açıya gelme açısı denir. Yansıma açısı: yansıyan ışının normalle açıya yansıma açı denir.  Yüzey ile 90°’lik açı yapacak biçimde çizilen çizgiye yüzeyin normali denir. Yüzeyin duruş şekli nasıl olursa olsun normal, ışığın yüzeye değdiği noktadan yüzeye dik olarak çizilir. Yansıma olayının kanunları vardır. Bunlar;

Gelen ışın, yansıyan ışın ve yüzeyin normali aynı düzlemdedir.
Gelme açısı yansıma açısına eşittir.
1.3.2. Işığın Atmosfer İle Etkileşimi:
Atmosferde çok sayıda optik olay meydana gelir. Açık havada gökyüzü mavi ufuk ise süt beyazdır. Gündoğumu ve günbatımında göyüzü pembe, kırmızı, turuncu ve morun parlak renklerini içeren bir görünüm kazanır.  Gece, yıldızlardan, gezegenlerden ve aydan gelen ışık dışında göyüzü karanlıktır. Gece boyunca ayın büyüklüğü ve renkleri değişir. Gece yıldızlar sürekli olarak göz kırpıyormuş gibi görünürler.  Tüm bunları anlayabilmek için güneş ışığının atmosferle olan etkileşiminin yakından incelenmesi gerekmektedir.
Renkler: 
Atmosfere ulaşan güneş radyasyonunun yaklaşık yarısı görünür ışık formundadır. Güneş ışığı atmosfere girdiğinde absorbsiyon, yansıma ve saçılmaya uğrar ya da herhangi bir engelle karşılaşmaksızın yoluna devam eder. Yeryüzündeki cisimlerin  gelen güneş enerjisine karşı davranışları, gelen ışığın dalga boyuna ve bu cisimlerin renk, yoğunluk, bileşim vb özelliklerine bağlıdır.  Görme olayı, elektromanyetik dalgaların gözümüzün retina tabakasındaki sinir uçlarını uyarması sonucu gerçekleşir. Çünkü retina gözün ışığa duyarlı tabakasıdır. Retina görme alıcılarına sahiptir. Bu alıcılar iki tip olup koni ve basil olarak adlandırılır. Basiller görünür ışığın tüm dalga boylarına duyarlıdırlar ve aydınlığı karanlıktan ayırmamızı sağlar.  Eğer retina yalnızca basil tipi alıcılara sahip olsaydı doğayı yalnızca siyah ve beyaz olarak algılayacaktık.  Koni tipi alıcılar da (basiller gibi) görünür ışığın tüm dalga boylarına karşı duyarlıdır. 0.4-0.7 μm arasındaki dalga boylarına karşı gelen güneş radyasyonu koni tipi alıcılar tarafından sinir sistemi yoluyla bir impuls şeklinde beyne iletilir. Bu impulsu renk duyusu olarak algılarız. 0.4 μm’den daha kısa veya  0.7 μm’den daha uzun dalga boyları insan gözü için renkli görme yetisini harekete geçiremez.
Tüm görünür dalga boyları hemen hemen eşit şiddette koni tipi alıcılara ulaştığında bunu beyaz ışık olarak algılarız. Güneş, toplam enerjisinin yaklaşık yarısını görünür ışık bandında yayınlar. Öğle vakti güneşin yayınlamış olduğu tüm görünür dalga boylarındaki ışık konilere ulaşır, bu durum güneşi beyaz olarak görmemize neden olur. Güneşten daha soğuk yıldızlar enerjilerinin çoğunu biraz daha büyük dalga boylarında yayınlarlar, bu nedenle daha kırmızı görünürler. Diğer taraftan güneşten daha sıcak olan yıldızlar enerjilerinin çoğunu daha kısa dalga boylarında ya

1893 - The Eddy Diamond and the Hargraves Box uçurtmaları meteorolojik araştırmalarda kullanılmaya başlandı. 
1899 - The Wright Kardeşler ilk uçan makine (uçak ) teorilerini ispatlamak için uçurtma kullandılar. 
1901 - Guglielmo Marconi , Kuzey Amerika ile Avrupa arasındaki ilk tarihi radyo bağlantısını yapmak için antenini uçurtma ile kaldırdı. 
1902 - Fransız ordusu , askeri gözlemler yapmak için uçurtma kullandı.
1906 - San Francisco depreminin verdiği hasarın fotoğrafları uçurtmaya bağlanan bir fotoğraf makinesından çekildi.
1907 - Dr. Alexander Graham Bell ,ilk insan taşıyan uçurtmayı yaptı.
1919 - Bir Alman , uçurtma trenini 31,955 feet (9.74 km ) yüksekliğine çıkardı.
1939-1945 - Uçurtmalar 2. Dünya Savaşında gözlem amaçlı kullanıldı.
1964 - Domina Jalbert bir parafoil tasarladı ve bu tasarım paraşüt yapımında kullanıldı.
1975 - Peter Powell ilk 2 ipli uçurtmayı icat etti.
1978 - Kuzuhiko Asaba 4,128 adet uçurtmayı tek bir ip ile uçurdu (Uçurtma Treni)
Ünlü Niagara şelalesinin üzerindeki ilk köprünün halatlarının karşıdan karşıya geçirilmesi yine uçurtma marifetiyle olmuştur.

Bridle : Denge 
Keel : Delta ve benzeri tip uçurtmalarda dengeyi sağlamak için kullanılan üçgen biçiminde parça ve en önemli kısımdır
Bowline : Uçurtmaya geriye doğru eğim vermek için kullanılan ip
Leading Edge : Uçurtmanın rüzgara bakan Ön kısmı
Trailing Edge : Uçurtmanın arka kısmı
Spine : Uçurtmanın dik çıtası
Cross Spar : Spine'a dik olarak gelen çıta
Leading Edge Spar : Uçurtmanın Rüzgara bakan ön kısmıdaki çıta
Spreader : Leading Edge Spar'ları gergin tutmak için kullanıla çıta

Üç köşegenli altıgen uçurtma 
Rokaku tipi uçurtma 
Delta Conye 
Dörtgen Uçurtma 
Pocket Sled
Eddy
Bow Tipi
Özel Uçurtmalar
Uçurtma Kuyruğu Yapma

3 adet 60 - 80 cm boyutlarında 6-7 mm kalınlığında çıta
Çıtalardan bir tanesi yaklaşık olarak 8 - 10 cm kısa olmalı
1 adet istediğiniz renk yağlı kağıt (kitap kaplama jelatini veya çöp poşeti de olabilir)
1 adet ufak çivi yeterli (tam ortadan çivilemek için, çivi yoksa şart değildir.)
Pamuklu ip
Uçurmak için kullanacağımız naylon ip.
İpi dolamak için bir çubuk

Çıtalarınızın aynı boy olması gerekiyor eğer değilse aynı boya kadar alın ve çıtalardan birinin ucuna bağlayın. Uçurtmanızın tam bir altıgen görünümünde olması için çok dikkatli olmanız gerekiyor. Çıtanın ucuna bağladığınız ipi 37,5 cm (çıtanın ucu ile merkezi arasındaki mesafeyi de ölçü olarak kullanabilirsiniz ya da cetvelinizi) uzatarak komşu çıtanın ucuna dolamaya başlayın ve 3 tur attırdıktan sonra bir düğüm atın. Bu işlemi ipi ilk bağladığınız uca kadar devam ettirin. Son düğümü atarken iskele iplerinizin biraz gergin olduğunu kontrol edin. Artan ipi kesin. Evet iskelenizin tam bir altıgen görünümünde olması uçurtmanızı havada güzel gösterecektir. Eğer sizinki tam altıgen olmadı ise de zararı yok, uçurtmanızın uçmasına engel olmayacaktır.
Şimdi kağıdınızı yere yayın ve iskelenizi ortadaki düğüm alta gelecek şekilde kağıdınızın üzerine koyun. Kesmeye başlamadan önce yapıştırıcı bandınızla, iskeleyi kaymaması için bir-iki yerden kağıda tutturun. Makasınızla üstte gösterilen şekilde kesin ve bu kestiğiniz çıkıntıları katlayarak bant veya tutkalla yapıştırın. Bunu yaparken kağıdınızın biraz bol (çok gergin değil) olmasına dikkat edin yoksa uçurtmanız rüzgarı tutamayabilir.
Evet en zor kısım bitti. Şimdi uçurtmanızı çevirin ve tam ortasında küçük bir delik açın.İskelenin ortasında bıraktığınız ipinizin her iki ucunu da bu delikten dışarı çıkartın. Keyifli anlar

Kuyruk uzunluğu yaklaşık olarak çıta boyunuzun 5-6 katı civarındadır. Ancak çok şiddetli rüzgarlarda bu uzunlukta bir kuyruk kısa gelebilir ve uçurtmanızın takla atmasına neden olabilir. Kaplama kağıdınızın arta kalan kısmından eni 1 cm civarı uzunluğu 50 cm civarı şeritler kesin ve bunları 2 cm arayla kuyruk ipine bağlayın. Kuyruğunuz yeterli uzunluğa gelene kadar devam edin. Kaplama kağıdınız muhtemelen yetmeyecektir. Kuyruk için herhangi bir ambalaj kağıdını veya naylon torba da kullanabilirsiniz. Bittiğinde kuyruk ipinin bir ucunu, kuyruk dengesinin tam ortasına bağlayın.
Uçurtmanızı uçurmak için kullanacağınız naylon ipinizi ortadan çıkan ve üst dengeye bağladığınız pamuklu ipin ucuna sıkıca bağlayın.
Uçurtmanız uçmaya hazır.

Visual Basic birçok işlemi görsel olarak yapmamızı sağlayan bir arayüz programıdır. Visual Basic, yazılımcının kodlarla uğraşarak menüler veya arayüz hazırlama sorununu ortadan kaldırmaktadır.
Visual Basic programını açtığımızda “Project1” adında bir proje hazırlamakta ve bu projeye “Form1” adında bir form otomatik olarak dahil edilmektedir. Formlar kullanıcının programı kullanabilmesi için gerekli olan düğmelerin veya metin kutuların bulnduğu alandır. Herhangi bir uygulama çalıştırıldığında formlar pencereye dönüşür. Her Visual Basic uygulaması en az bir form içermek zorundadır. Bu formun içeriği başlangıçta boştur.
İlk önce basitçe programımızı tanıyalım. Programımızı açtığımızda karşımıza zaten boş bir yeni form gelmişti, bu formun üstüne sağ tıkladığımızda en çok işimize yarayacak olan seçenekler şunlardır:

View Code
Menu Editor
Lock Kontrols
Properties
Yapacağımız programımıza kod yazabilmek için ilk önce kod penceresini açabilmemiz gerekir, bunun için F7 tuşunu kullanabiliriz ya da formumuzun üstündeki herhangi bir nesneye veya formumuzun boş bir alanına tıklayarak da kod penceresine ulaşabiliriz. Açılan kod penceresinin Form1'e ait olduğunu pencerenin üst tarafından da anlayabiliriz. Şu an kod penceremizin ilk satırında Private Sub Form_Load () şeklinde bir yazı bulunmaktadır. Visual Basic programları dahilinde hazırlanan alt program veya yordamlar Sub bildiri deyimi ile başlar ve End Sub bildiri deyimi ile biterler. İlk satırımızın ilk kelimisindeki Private bildiri deyimi ile alt programın geçerlilik alanı belirlenmektedir. Kısacası ilk olarak kod penceresinde şunlar yazıyor:

Bu kod Form açıldığında çalışacak olan komutları işlememizi sağlar, yani bu kodların içine yazdığımız komutlar, formumuz çalıştığında (yüklendiğinde de denilebilir) işleme koyulacaktır. Örnek bir uygulama yapacak olursak; mesela Proje1 formumuz çalıştığında form üzerinde "İlk programım!" yazsın.

Uygulamamızı F5 tuşuna basarak çalıştıralım, ekranda göreceğimiz şey, formuzun sol üst köşesine sıfır konumlanmış "İlk programım!" yazısı olacaktır. Bu yazının konumunu değiştirmek istersek CurrentX ve CurrentY kodlarını kullanacağız. Uygulamamızı durdurarak yeniden kod sayfamıza gelelim ve aşağıdaki şekilde düzenleyelim:

Uygulamamızı yeniden çalıştırdığımızda yazımızı formun ortalarında bir yerde göreceğiz. CurrentX komutu yazımızı yatay düzlemde ortalarken CurrentY komutu ise yazımızı dikey düzlemde ortaladı. Burada kullandığımız 1440 değeri cm veya mm değil, Basic dilinde kullanılan özel bir uzunluk birimi olan "Twip"tir. Twip'i cm'ye çevirmek isteseniz aşağıdaki bilgilerden yararlanabilirsiniz:
1 Inch = 1440 Twip
1 Inch = 2.54 cm
Form üzerine yazdırdığımız yazının boyutunu, kalınlığını ve yazı tipini de ayarlayabiliriz, bunun için aşağıdaki kodları inceleyebilirsiniz:

Yaptığımız bu projeyi daha sonra düzenleyebileceğimiz şekilde kaydetmek için Visual Basic'in menüsünden "File > Save Project As" youlunu izleyelim, dosyamızın ismini yazıp, nereye yükleyeceğimizi seçtikten sonra "Kaydet" düğmesine basabilirsiniz.

Özet: Bu bölümde webbrowser bileşeni kullanılarak wikibot yazılımı oluşturmaktan bahsedilmektedir.

Aşağıdaki kod karşımıza oturum açma sayfasını çıkartır. Burada adrese girilen bot kullanıcı adı ve şifresi sayfadaki kutucuklara otomatik olarak yazılır:

Yukarıdaki kodu formunuzun load olayına yazabilirsiniz. Ancak oturum aç düğmesini tıklamak için kullanılan aşağıdaki kodu sayfa yüklendikten sonra kullanabilirsiniz:

veya

Vikilerde herhangi bir maddede değişiklik yapabilmek için ilk önce maddenin olduğu sayfaya girilir ve değiştir sekmesi tıklanarak sayfa kaynağına ulaşılır. Ancak bot programınız bundan farklı olarak doğrudan doğruya kaynağa girebilir ve bu daha kısa zamanda daha çok değişiklik yapmanıza olanak sağlar.

Ancak yukarıdaki madde adı içerisinde Türkçe karakter bulunması halinde örneğin siz kağıt maddesine ulaşmaya çalışırken karşınıza kaðýt diye bir madde çıkabilir. İşte bu durumu bertaraf edebilmek için aşağıdaki kodu kullanabilirsiniz:

Yukarıda maddenin değiştir sekmesinin adresini açmak için WebBrowser bileşenine girdik. Sayfa üzerinde değişiklik yapmak bu sayfanın yüklenmesinden sonra mümkün olabilir. Bunun için WebBrowser bileşeninin DocumentComplete olayına aşağıdaki gibi bir kod yazabilirsiniz:

Sayfada maddenin kaynağını görmek ve değiştirmek için kullanılan metin kutusunun içeriğini değiştirmek için aşağıdaki kod kullanılabilir:

Eğer küçük değişiklikler yapıyorsanız aşağıdaki kodu kullanarak Küçük değişiklikler kutucuğunu işaretletebilirsiniz:

Aşağıdaki kod ile sayfa kaydedilir:

Not: Bot oluşturma ile ilgili daha ayrıntılı bilgi için İngilizce vikipedideki Creating a bot maddesine bakabilirsiniz.

Şablon:Politikalar
Vikikitap, çevrimiçi bir kütüphanedir ve bu amaca ulaşmak için bir araya gelmiş, karşılıklı saygı çerçevesinde yüksek kalitede kitaplar ve sayfalar oluşturmakla ilgilenen kişilerden oluşan çevrimiçi bir topluluktur. Bu sebeple, Vikikitap'ta kesinlikle olmadığı belirli şeyler vardır:

Vikikitap ne bir bağlantı yönlendirme alanıdır, ne de resim ve benzeri medya dosyalarını depolama yeridir. Buraya eklenen tüm içerik, bir kütüphane olduğu göz önüne alınarak tarafsız olmalıdır. Bir içerik ekleyerek, onun GNU lisansı ile özgürce kullanılmasına izin vermiş olursunuz.
Vikikitap sayfaları aşağıdakilerden değildir:

Sırf dış bağlantılardan oluşan koleksiyonlar veya İnternet dizinleri. Bir maddeye, ilgili birkaç dış bağlantı eklemenin hiçbir sakıncası yoktur; ancak, gereğinden fazla dış bağlantı, maddeleri Vikipedi amaçlarından saptırabilir.
Sırf iç bağlantılardan oluşan koleksiyonlar. (Anlam ayrımı sayfaları ve maddelerin düzenlenmesini kolaylaştıran bazı liste sayfaları hariç.)
Sırf kamu malı olan kaynak niteliğindeki belge koleksiyonları. Örneğin kitapların tümü, yazılımların kodları, tarihi belgeler, yazışmalar, bildirgeler gibi sadece orijinalken bir değer ifade eden içerikler. Bu tip kaynakların yeri Vikikaynak'tır. 1911 Encyclopædia Britannica gibi kamuya açık (telifsiz) kaynaklardaki ansiklopedik tanımların Vikipedi'ye girilmesinde bir sakınca yoktur.
Madde ile ilgili hiç yazı olmayan, fotoğraf veya diğer medya dosyaları koleksiyonları. Eğer bir fotoğrafı sergilemek istiyorsanız, lütfen ansiklopedik bir içerik eşliğinde yayınlayın ya da Wikimedia Commons'a ekleyin.

Vikikitap bünyesine kendinize ait internet sayfanızı, blog ya da wiki'nizi koyamazsınız. Eğer wiki teknolojisine veya benzeri bir şey üzerine işbirlikli güç sarfetmeye dayalı sayfa üretmeye meraklı iseniz, bu amacınıza hizmet veren, bazısı bedava bazısı paralı birçok siteye başvurabilirsiniz (Örneğin Miraheze, Fandom, ShoutWiki). Ayrıca kendi wiki'nizi kurabilirsiniz. Vikipedi sayfaları;

Kişisel sayfalar oluşturma yeri değildir. Vikikitap bünyesinde yer alan Vikipedistlerin kullanıcı sayfalarının amacı kişinin Vikikitap bünyesindeki çalışmalarına yönelik bilgi içermesidir. Eğer uygunsuz çalışma ile ilgili olmayan ve kendiniz ile ilgili bilgi vermeye yönelik (örnek: özgeçmiş) sayfaya ihtiyacınız var ise, lütfen internetteki bedava kişisel sayfa sağlayan siteleri deneyiniz.
Dosya deposu değildir. Lütfen sadece maddelerde kullanılacak dosyaları yükleyiniz (resim, müzik vs). Kullanılmayanlar silinecektir.

Vikikitap’ta gelişigüzel bilgi bulunamaz. Kesinlikle doğru olsa da, kütüphanelik değer içermeyen yazılar eklenemez. Neler kitaplık konusu tam olarak belirlenmemiş olsa da, şimdiye kadar hemfikir olunan sayfalara göre, Buradaki sayfalar;

Ansiklopedi değildir. Bu tür ihtiyaçlarınız için Vikipedi kardeş projesini kulllanabilirsiniz.
Özlü sözler listeleme yeri değildir. Bu tür ihtiyaçlar için Vikisöz kardeş projesini kullanabilirsiniz.
Seyahat rehberi değildir. Elbette İstanbul maddesinde w:tr:Topkapı Sarayı veya w:tr:Galata Kulesi gibi önemli mekanlar geçecektir ama en sevdiğiniz otelin adresi, telefon numarası ya da w:tr:İstiklal Caddesi'nde satılan yiyeceklerin fiyatı gibi bilgiler değil. Bu tür bilgiler Vikigezgin kardeş projesinde işlenebilir.
Kişilerin anısına yazılmış maddeler yer alamaz. İnsanların ölümü üzücü olsa da, Vikikitap onları anma yeri değildir. Adına madde yapılması düşünülebilir, ama adı geçen kişinin ailesi dışındakiler tarafından da tanınan ünlü biri olması ve ansiklopedik içerik çerçevesinde duygular katılmadan yazılmalıdır.
İş adres rehberi veya işyeri güncel projeleri listesi olamaz. Örneğin bir radyo istasyonu ile ilgili madde; telefon numarası, önümüzdeki günlerdeki aktiviteler ya da dağıtılacak hediyeler gibi bilgiler içeremez. Dahası, maddenin tartışma sayfası da sadece madde ile ilgili olabilir, maddedeki işyerinin idari konularıyla ilgili değil.

Her kullanıcının diğer kullanıcıyla medeni ve soğukkanlı bir iletişim ve yardımlaşma içerisinde olması beklenir. Sizinle aynı düşüncede olmayan kullanıcıya hakarette bulunmayın, taciz etmeyin, bezdirmeyin ya da gözünü korkutmaya çalışmayın. Bunun yerine soruna akılcı yaklaşarak düzeyli bir tartışma yürütmeye çalışın. Kendi düşüncenizi ispatlamak uğruna madde değiştirmeyin. Vikikitap'a, Vikikitapçılara ya da Wikimedia Foundation'a kanuni ya da diğer tür tehditlerde bulunmayın. Vikikitap'ta tehdide müsamaha gösterilmez ve bazı durumlarda yaptırımlar sürekli engellemeye kadar varabilir.

Vikipedi özgür ve açık bir ansiklopedidir ama bu özgürlük ve açıklık ansiklopedi oluşturmak çerçevesinde sınırlıdır. Diğer bir deyişle, Vikikitap özgür konuşma platformu değildir. Vikipedi'nin açık ve kendini yöneten yapısındaki hiçbir bölüm hiçbir grubun görüşlerini ya da yaşantısını desteklemek amacında olamaz. Bizim gayemiz ansiklopedi oluşturmak, kaosun limitlerini test etmek değildir.

Vikikitap çoğunluk demokrasisi denemesi değildir. Doğrusunu bulmak için öncelikli yöntem tartışmadır, oylama değil. Yani sayısal çoğunluğun dediği her zaman Vikikitap kuralı olarak kabul edilemez. Ancak fikir birliğinden ziyade tercihin öne çıktığı durumlarda (örn: Yeni bir anasayfa tasarımının seçilmesi) oylama sonuçlarıyla kararlar alınabilir ya da karar için etkin bir faktör olarak düşünülebilir.
Ancak demokrasiyi özgür tartışmanın bir sonucu veya sonuçtan etkilenecek olan herkesin karar aşamasına katılabildiği bir sistem olarak tanımlayan teorisyenlerin bakış açılarına göre, Vikikitap bir demokrasidir.

Vikikitap kanun sistemi ile yönetilmez: w:tr:farazi mahkeme değildir ve kurallar topluluğun amacı değildirler. Aşırı talimatcılıktan, direktiflerin sayısının ve büyüklüğünün kontrol edilmeyecek boyutlara ulaşmasından kaçınılmalıdır. Vikikitap politika ve yönergeleri açıklayıcıdırlar ama amirane değildirler. Vikikitabın nasıl daha iyi geliştirilebileceği konusunda gelişen (evrilen) topluluğun fikir birliğini yansıtırlar; ve kanun değildirler. Herhangi bir şeyi, ister bir fikir ya da adaylık olsun, eklerken yapılan bir prosedür hatası, eklemeyi geçersiz hâle getirmek için yeter şart değildir. Aynı şekilde, yönergelerin metnini, ilkelerin temelini ihlal edecek kadar aşırı sıkı ve harfi harfine bir yorum ile izlemeyin. Eğer kurallar sizi kütüphanenin geliştirilmesinden alıkoyuyorsa, onları yok sayın. Anlaşmazlıklar; kurallara veya prosedürlere sıkıca bağlı kalınarak değil, uzlaşmacı tartışmalarla çözülmelidir.

Vikikitap, gönüllülerden oluşan bir topluluktur. Kullanıcıların istediklerinden daha fazla zaman ayırmalarını ve çaba göstermelerini gerektirmez. Kullanıcılardan daha fazla katkıda bulunmalarını istemek yerine ansiklopediyi geliştirmeye odaklanın. Kullanıcılar, herhangi bir zamanda mola vermekte veya ayrılmakta özgürlerdir.

Eğer "örnek kitap" hazırlamak düşüncesindeyseniz, kendinize şu soruyu sorun: "Okuyucu örnek bir sayfada ne görmeyi bekler?"
Eğer yukarıda bahsedilen kuralların herhangi bir kitapta ihlal edildiğini düşünüyorsanız şunlardan birini veya birkaçını yapabilirsiniz:
Maddenin tartışma sayfasında tartışarak ve diğer Vikikitapçılarla bir ortak karara vararak maddeyi uygun şekilde değiştirin ve bu hâliyle kaydedin.
Maddeyi silinmeye aday gösterin. Vikikitap sayfalarını silme yetkisi sadece hizmetlilere verilmiştir.

Bu kitabın amacı size Vikikitap'ı en iyi şekilde öğretmektir. Bu kitap her türlü kullanıcı kitlesine (okur, yazar, hizmetli) hitap etmektedir.

Bu kitap hakkında
Vikikitap nedir?
Kullanıcı hesabı oluşturma
Tartışma ve karar alma
Politika ve yönergeler

Vikipedi'den gelenler için
Sınıf projeleri için
Yeni bir kitap başlatma

Vikikitap'ta kitap bulma
Vikikitap'taki kitapları yazdırma
Vikikitap'taki kitapları sınıfta kullanma
Hataları düzeltme
Sayfaları değerlendirme

Kitaplarda nasıl değişiklik yaparım?
Viki işaretleme dili
Temizlik ve bakım
Gelişmiş teknikler
Sayfalara resim koyma

Var olan bir kitaba katkıda bulunma
Yeni bir kitap başlatma
Vikikitap'a kitap bağışlama
Kitap planlaması
Kitaplıklar, kategoriler ve sınıflandırmalar
Okurları cezbetmek
Yazdırılabilir sürümler ve PDF'ler

Hizmetlilerin rolleri
Silme, silmeyi geri alma ve içe aktarma
Vandalizm
İleri konular

Bu kitap, Vikikitap'taki diğer tüm kitaplar gibi sizin gibi sıradan kullanıcılar tarafından yazıldı. Vikikitap'ı ziyaret eden herhangi bir kişi, herhangi bir zamanda, hemen hemen her sayfayı değiştirebilir. Vikikitap'taki kullanıcıların bazıları tecrübelidir, bazıları da tecrübesiz yeni kullanıcılardır. Yeni kullanıcılar genellikle sadece basit yazım hatalarını düzeltirler. Bu kitabın yazımına siz de yardım edebilirsiniz. Ne şekilde ve ne kadar yardım edeceğiniz tamamen size kalmış. Gördüğünüz hataları düzeltebilir veya bilgi birikiminiz ölçüsünde içerik ekleyebilirsiniz. Eğer Vikikitap'ı kullanma hakkında sorunuz varsa sorun! Aldığınız cevapları diğer kullanıcıların faydalanması için bu kitaba ekleyebilirsiniz.

Vikikitap'ın en güzel özelliklerinden biri kullanıcıların kolayca bir kitap hakkında görüş bildirebilmeleridir. Bu kitap hakkında olumlu-olumsuz her türlü görüşünüzü kitabın tartışma sayfasında dile getirin. Tek bir sayfayı ilgilendiren görüşlerinizi ise o sayfanın tartışma sayfasında dile getirin.

Kitap, kullanıcıların Vikikitap'tan faydalanma/katkıda bulunma şekli göz önüne alınarak düzenlenmiştir. Örneğin Vikikitap'a sadece okuma amacıyla gelen bir kullanıcının sadece kitabın "Okurlar" kısmını okuması yeterlidir. Benzer şekilde kitabın "Yazarlar" kısmı yeni bir kitap oluşturmak veya var olan kitaplara katkıda bulunmak isteyenler içindir. Hizmetliler ise kendi ek yetkilerini ve sorumluluklarını anlatan "Hizmetliler" bölümünde kendileri için güzel bilgiler bulacaklardır. Hizmetli yetkisine sahip olmayan bir kullanıcının bu kısmı okumasına gerek yoktur. Kitabın "Başlangıç" kısmı ise belirli bir gruba koyulamayacak sayfaları barındırır.

Bu kitap kolay yazdırılabilmesi gayesiyle basit bir görsel düzen kullanır. Diğer kitaplar bu görsel düzeni taklit edebilirler, ancak şart değildir. Her kitabın kendi özel ihtiyaçları olabilir. Kendi başlattığınız kitaplara her türlü öğrenmeyi kolaylaştırıcı görseller, interaktif kısımlar vs. eklemekte serbestsiniz.

Daha önceki bölümlerimizde bazı şablonların kullanımından, hangi durumlarda sayfaya hangi şablonların yerleştirilmesi gerektiğinden kısaca bahsetmiştik. Ancak şablonlar aslında çok geniş kapsamlı bir konudur. Özellikle şablonların hazırlanması son derece kompleks bir konudur ve bilgi birikimi gerektirir. Ancak şunu belirtmek gerekir ki şablonlar tek başına kitap olabilecek bir konudur. O yüzden bu bölümde şablonlar hakkında her şeyi öğrenmeyi beklemeyin. Vikimetni Düzenleme kitabı -tam kapsamlı olmamasına rağmen- şablonlar hakkında bu kitaptan daha fazla bilgi vermektedir. Şablonları öğrenmenin en iyi yolu şablonları kullanırken incelemek veya karşılaştığınız bir sorunda aktif editörlere danışmak ve editörlerin getirdiği çözümlere kafa yormaktır.
Şablonların çeşitli faydaları vardır. İlk olarak şablonlar uzun, karmaşık kodları sayfada gizler. Bu sayede yeni kullanıcılar bir sayfaya katkıda bulunurken karmaşık ve korkutucu kodlarla muhatap olmazlar. İkinci olarak şablonlar, aynı veya benzer uzun kodların birden fazla sayfaya ve/veya bir sayfada birden fazla yere kopyala-yapıştıra gerek kalmadan kolayca eklenebilmesini sağlar. Son olarak ise, şablonlar parametre kullanımı sayesinde elle yapılması gereken birçok yorucu işin otomatikleştirilmesine yardımcı olurlar.
Şablonlar "sayfa yansıtma"nın özel bir halidir. Sayfa yansıtma demek bir sayfanın içeriğini çok az kod yazarak başka bir sayfada göstermek demektir. Yani bir nevi sayfa kopyalamadır. Sayfa kopyalamadan tek farkı orijinal sayfadaki değişikliklerin yansıyan sayfayı da etkilemesidir. Bir sayfayı geçerli sayfada göstermek için (sayfa yansıtmak için) {{alan adı:sayfa adı}} söz dizimi kullanılır. Eğer yansıtılacak sayfa ana alan adındaysa alan adı kısmı boş bırakılıp sadece {{:sayfa adı}} kısmı yazılır. Varsayılan alan adı Şablon:dur. Yani  {{sayfa adı}} gibi bir kullanımda Şablon:sayfa adı sayfasının içeriği yansıtılmaya çalışılacaktır. Varsayılan türün şablon olması yansıtılmak için en kullanışlı türün şablon olmasını sağlar.
Şimdi aşağıdaki kodu deneme tahtasına yazarak ana sayfayı deneme tahtasında göstermeyi deneyin

{{:Ana Sayfa}}

Kitapların yazdırılabilir sürümleri sayfa yansıtma kullanılarak oluşturulur. Kitabın her sayfası sırayla yazdırılabilir sürüme yansıtılır. Yansıtılacak sayfadaki yansıtılmak istenmeyen kodlar <noinclude> ve </noinclude> arasına alınır. Bu sayede yazdırılabilir sürüm oluşturulurken orijinal sayfalardaki dolaşım kısımlarının (önceki sayfaya, sonraki sayfaya, içindekiler sayfasına gitme düğmeleri) ve diğer yazdırılabilir sürümde işlevsiz duracak kodların yazdırılabilir sürüme geçirilmemesini sağlayabiliriz. Ayrıca bir de <noinclude>'ün yaptığının tam tersini yapmaya yarayan <includeonly> tagi vardır. Sadece yansıtılacak sayfada görünmesini istediğimiz, orijinal sayfada görünmesini istemediğimiz kodları <includeonly> ve </includeonly> arasına koyarız. Örneğin orijinal kitabın ilk sayfasına <includeonly>Bu bir yazdırılabilir sürümdür. Kitabın orijinali...</includeonly> yazarak bu yazının sadece yazdırılabilir sürümde gözükmesini sağlayabiliriz.
Şablonlar da aynı yöntemi farklı amaçlarla ve bazı ekstra özelliklerle kullanırlar. Bir şablonu bir sayfaya yapıştırmak için, daha doğrusu yansıtmak için sayfaya {{şablon adı}} kodunu ekleriz. Örnek bir şablon kullanımı:

{{taslak}}

Bu kodun sonucunda sayfaya aşağıdaki eklenir:

Bu kullanım vakit kazanmak içindir. Ayrıca bu yöntem taslak halindeki kitap ve sayfaları listelemek için de biçilmiş kaftandır. Şablon:Taslak sayfasına gider ve sol paneldeki "Sayfaya bağlantılar"ı tıklarsanız ilgili şablonun kullanıldığı, dolayısıyla taslak halindeki sayfa ve kitapları görebilirsiniz. Bir editör taslak halindeki sayfaları/kitapları görmek için bu yöntemi kullanabilir. 
Sayfaya {{taslak}} yazdığınızda ilgili şablonun içindeki her şeyi sayfaya yazmış olursunuz.
Tıpkı sayfa yansıtmada olduğu gibi <includeonly> ... </includeonly> kodunu sadece şablonun kullanıldığı yerde gözükmesini istediğimiz kodları belirtmek için; <noinclude> ... </noinclude> kodunu ise sadece şablonun kendi sayfasında gözükmesini istediğimiz kodları belirtmek için kullanırız. Bu iki tagin şablonlardaki en yaygın kullanımı şablonun kendisini ayrı bir kategoriye koyup şablonun kullanıldığı sayfaları ayrı bir kategoriye koyma amaçlıdır. <includeonly> taginin başka bir kullanımı ise şablonun kullanımı hakkında bilgi veren şablon dokümantasyonunun sadece şablonun kendi sayfasında gözükmesini sağlamaktır. Şimdi isterseniz bir şablon yapmayı deneyelim. Şimdi Şablon:Deneme sayfasına gidip, şablonun içeriğini aşağıdakiler ile değiştirin:

<includeonly>
'''Bu sayfaya deneme şablonu yapıştırılmıştır.'''
[[Kategori:Deneme şablonu yapıştırılan sayfalar]]
</includeonly>
<noinclude>
'''Kullanım:'''
:Bu şablonu deneme amaçlı kullanabilirsiniz.
[[Kategori:Deneme şablonları]]
</noinclude>

Şimdi bu deneme şablonunu {{deneme}} yazarak deneme tahtasına yapıştırın. Deneme tahtasına sadece Bu sayfaya deneme şablonu yapıştırılmıştır. metni geçirilecek, şablonun kendi sayfasında ise sadece kullanımla ilgili bilgi gözükecektir. Ayrıca deneme tahtası Kategori:Deneme şablonu yapıştırılan sayfalar kategorisine, şablonun kendi sayfası da Kategori:Deneme şablonları kategorisine eklenecektir.

{{Mkutusu}} şablonu biraz daha karmaşıktır, çünkü parametre kullanır. Parametreler, bir şablonu kullanırken şablona verdiğimiz ekstra bilgilerdir. Şablona verdiğimiz parametreler değiştikçe şablonun çıktısı değişebilir. Elbette ki bu değişim sadece şablonun yansıtıldığı sayfada geçerli olacaktır. Yoksa parametrelerin şablonun kendi sayfası için bir etkisi yoktur. Mkutusu şablonunun parametre alan bir şablon olduğunu söylemiştik, ama gıcıklık olsun parametre kullanmayalım:

{{Mkutusu}}

kodunun çıktısı

olacaktır. Mkutusu şablonu ekrana son derece şık duran bir kutu içinde yazı yazdırmaya yarayan bir şablondur. Ayrıca başka parametrelerle kutunun içindeki resmi, kutunun rengini vs. değiştirebilirsiniz. Bu şablona kutunun içinde olacak yazıyı parametre olarak veririz. Hiç parametre vermeyince ekrana Metni girin yazdı. Eğer şablonu şöyle kullanırsak:

{{Mkutusu|tür=fikir|metin=Aklıma bir fikir geldi!}}

kodunun çıktısı

olacaktır. Gördüğünüz gibi şablona "tür" parametresi ekleyerek ve bu parametreye "fikir" değeri vererek kutunun rengini ve resmini değiştirdik. "metin" parametresine de kutunun içine yazmak istediğimiz metni girdik. Bu şablonun kullanımı hakkında daha fazla bilgi almak için Şablon:Mkutusu sayfasına bakabilirsiniz.
Şablonları kullanırken boşluklara ve ilk harfin büyük-küçük olduğuna kafayı takmanıza gerek yok. Ancak elbette diğer sayfa isimlerinde olduğu gibi ilk harf dışında kalan harflerin büyük-küçük olma durumu önemlidir. Örneğin:

{{MKutusu|tür=fikir|metin=Aklıma bir fikir geldi!}}

kodunun çıktısı
Şablon:MKutusu
olacaktır. Çünkü şablonun gerçek ismi "Mkutusu"dur.
Şimdi başka bir şablonu inceleyelim. İnceleyeceğimiz şablon aşama şablonu. Bu şablonun içeriği (kaynak kodu) aşağıdaki gibidir:

[[Dosya:{{{1}}}von10.png|Gelişim aşaması: {{{1}}}0% ({{{2}}})]]
<noinclude>
{{Belgeleme}}
</noinclude>

Evet biraz karmaşık değil mi? Aslında o kadar da karmaşık değil. Üçer süslü parantezle çevrilmiş sayılar şablona parametreyle verilen değerleri temsil ediyor. Kaynak koda bakarak bu şablonun 2 parametre aldığını söyleyebiliriz. İlk parametre şablonda iki yerde, ikinci parametre ise bir yerde kullanılmış. Parametrelere isim verilmemiş. O halde biz de şablonu kullanırken parametrelere isim vermeyeceğiz. Şablon, hangi parametrenin hangisi olduğunu parametrelerin sırasından anlayacak. Şablonun belgelemesi, şablonun "Belgeleme" alt sayfasından yansıtılarak oluşturulmuş. Şimdi isterseniz bu şablonu kullanalım:

{{aşama}}

Bu kodun çıktısı 
şeklinde olur. Şablona hiç parametre vermediğimiz için yerinde parametre olması gereken kısımlar olduğu gibi çıkar. Şimdi başka bir örnek:

{{aşama|2}}

Bu kodun çıktısı 
şeklinde olur. Aşama şablonu kitap ve sayfaların tamamlanma durumunu belirtmek için kullanılır. İlk parametre 0'dan 10'a kadar değer alır ve resimde kaç tane çiziğin işaretleneceğini belirtir. Şablonun kaynak koduna bakarak Commons deposunda 1von10.png, 2von10.png, 3von10.png, ... isminde resim dosyaları olduğu yorumunu yapabiliriz. Ayrıca yine kaynak koda bakarak bu yazdığımız parametrenin fare işaretçisi resmin üzerine geldiğinde görünecek yazıyı da etkilediği sonucuna varabiliriz. Ayrıca henüz ikinci parametreyi belirtmedik, bu yüzden ikinci parametrenin olması gereken yerde {{{2}}} var. Şimdi ikinci parametreyi de belirtelim. Aşama şablonunun ikinci parametresi hangi tarih itibarıyla belirtilen tamamlanma durumunun geçerli olduğunu belirtmek için kullanılır.

{{aşama|5|8 Ağustos 2010}}

Çıktısı: 
Fare işaretçisini bu çıktının üzerine getirdiğinizde "Gelişim aşaması: 50% (8 Ağustos 2010)" yazısını göreceksiniz. Şimdi deneme şablonunun içeriğini şu kodlarla değiştirin:

[[Dosya:{{{1|Wiki.png}}}}]]

Burada eğer şablona parametre verilmezse ilgili parametre Wiki.png sayılacak. Yani süslü parantezler arasındaki sayının sağına | işareti koyup ilgili parametrenin varsayılan değerini belirtebiliriz. Başka bir örnek:

[[Dosya:{{{resim|Wiki.png}}}]]

Burada ise parametremize isim verdik. Artık şablonu {{deneme|resim=dosya.jpg}} olarak kullanacağız.
NOT: Eğer varsayılan değeri olmayan bir parametreye değer vermezsek şablonun parametre değeri olması gereken yerde üçer süslü parantez arasında parametrenin ismi veya -parametreye isim vermemişsek- 1, 2, 3,... gibi sayılar olur.
NOT: Şablonda parametrelere isim verilmişse şablonu kullanırken parametreleri hangi sırada yazdığımız önemli değildir. Ancak eğer isim verilmemişse parametreleri belirtilen sırada yazmalıyız.
Mükemmel şablonlar hazırlamak için hayal gücüne, HTML ve CSS bilgisine (şablonları daha güzel yapmak için) ve MediaWiki yazılımına özgü değişken ve ayrıştırıcıları bilmeye ihtiyacınız var. MediaWiki yazılımı performansı düşünerek şablon kullanımında bazı sınırlamalar getirmiştir. Örneğin A, B, C ve D isminde dört say

Burada sadece okumak için bulunuyor olabilirsiniz, ancak isterseniz istediğiniz sayfada değişiklik de yapabilirsiniz. Vikiyazarlar mükemmel değildir ve kitap yazımında -çoğunluğu küçük imla ve gramer hataları olmak üzere- hata yapabilirler. Hata gördüğünüzde bir vikiyazarı hata hakkında uyarabilirsiniz ancak hatayı kendiniz düzeltmeniz genellikle daha kolay olacaktır. Eğer sık sık hata düzeltmelerinde bulunuyorsanız bu kitabın "Editörler" bölümünü okuyarak nasıl daha efektif hata düzeltiminde bulunabileceğinizi öğrenebilirsiniz.
Vikiler klasik basılı kitapların aksine statik ve değişmez değildirler, interaktif ve değişkendirler. Siz de dahil olmak üzere herkes, herhangi bir zamanda değişiklik yapabilir. Bu konsept birçok kişi için son derece güzeldir. Bu bölüm Vikikitap'ta değişiklik yapmak isteyenler için giriş niteliğindedir.

Bulduğunuz bir hatayı düzeltmek için sayfanın üst kısmındaki "değiştir" düğmesine tıklayın, kaynak metinde (vikimetinde) hatayı bulun, düzeltin ve "Sayfayı kaydet" düğmesine tıklayın. Bu basit bir işlemdir, ancak Vikikitap'ta yapabileceğiniz çok daha karmaşık şeyler de vardır. Bu karmaşık şeylerin çoğu bu kitabın "Editörler" kısmında anlatılmıştır. Sayfa düzenlemeyle ilgili verebileceğimiz başka ipuçları da vardır:

Bir sayfanın sadece tek bir bölümünde değişiklik yapmak için ilgili bölümün başlığının yanındaki "[değiştir]" bağlantısına tıklayın. Sayfanın üst kısmındaki "değiştir" düğmesi ise bütün sayfayı değiştirmek için kullanılır. Eğer sayfa oldukça uzunsa o uzun metinde küçük bir hatayı bulmak zor olabilir. Ancak sadece tek bir bölümü değiştirirseniz bakacağınız daha az cümle olacağı için hatayı bulmanız çok daha kolay olacaktır.
Yavaş yavaş başlayın! Burada önemli bir kullanıcı olmak için bütün bir bölümü veya sayfayı yazmak zorunda değilsiniz, her küçük düzeltmeniz kayıt altına alınmaktadır. Yanlış yazılmış bir kelimeyi veya yanlış yerde kullanılmış bir virgülü düzelterek işe başlayabilirsiniz.
Değişikliğinizi kaydetmeden önce "Ön izlemeyi göster" düğmesine tıklayarak sayfayı kaydettiğinizde sayfanın nasıl görüneceğini anlayabilirsiniz. Bu sayede doğru yeri değiştirdiğinizden emin olabilirsiniz.
Biçimlendirme kodlarını görmezden gelin. Vikimetinde kafa karıştırıcı olabilecek birçok işaret vardır. Şimdilik bunlara kafa yormayın. Bu işaretlerin arasındaki cümlelere odaklanın.
Her düzelttiğiniz hata ilgili kitabın kalitesini artırmaktadır.

Vikikitap'ta çok fazla kitap mı okuyorsunuz? Cevabınız evet ise Vikikitap'ın sayfa değerlendirme özelliği tam size göre demektir. Bir değerlendirici (eleştirmen) olmak için köy çeşmesinde bu isteğinizi dile getirin. Eleştirmen olduğunuzda sayfaları değerlendirme yetkisine sahip olacaksınız. Bu kitabın bir sonraki sayfasının konusu "sayfa değerlendirme"dir.

Bazen bir sayfanın biçimlendirmesi çok karmaşık olabilir ve kendinizi bataklığa saplanmış hissedebilirsiniz. Böyle bir durumda yapabileceğiniz en iyi şey köy çeşmesini kullanarak Vikikitap topluluğundan yardım istemektir. Yardıma ihtiyacınız olduğunda lütfen yardım istemekten çekinmeyin - Vikikitap'ta size takıldığınız konularda yardım etmek isteyen birçok kişi vardır.
Bir sayfada hata görmüşseniz ama hatayı nasıl düzelteceğinizi bilmiyorsanız veya ilgili sayfanın nasıl geliştirileceği hakkında aklınızda bir fikir varsa ve bu fikri topluluğa sunmak istiyorsanız yapabilecekleriniz şunlar:

İlgili sayfanın tartışma sayfasına bir bölüm ekleyin. Bölümün başlığı sorunu/fikri kısaca özetlesin, bölümün içeriğinde de sorunu/fikri ayrıntılı bir şekilde yazın. Diğer kullanıcılar başlattığınız tartışmayı görecekler ve fikirlerini sunacaktır.
Sorunu/fikri köy çeşmesine yazın. Bu yöntem bir kitaptaki birçok sayfayı veya birden fazla kitabı etkileyen büyük çaplı sorunlar/fikirler içindir. Köy çeşmesi, kitaplardaki küçük sorunları bildirmek için kullanılmaz. Ayrıca kitabın tartışma sayfasında açtığınız bir konuda fikir birliğine varılamazsa izleyeceğiniz yol konuyu bu sefer köy çeşmesinde açmaktır. Bu sayede konuya ilgi artacak ve konunun çözümlenme olasılığı artacaktır.

Diğer vikiyazarlarla iletişim kurmanın birçok nedeni vardır: Üstün çalışmalarını tebrik etmek, çözemediğimiz bir konu için yardım istemek, önerilerde bulunmak, bir kitap veya sayfa hakkındaki görüşlerimizi bildirmek veya sadece "merhaba" demek için başkalarıyla iletişim kurma gereksinimi görebiliriz. Diğer vikiyazarlarla iletişim kurmak sonra derece basittir ve iletişim kurmanın çeşitli yolları vardır:

Kullanıcı mesaj sayfaları. Her kullanıcının bir kullanıcı mesaj sayfası vardır. Eğer bir kullanıcının kullanıcı adı "Ahmet" ise bu kullanıcının kullanıcı mesaj sayfası "Kullanıcı mesaj:Ahmet" olur. Yani Vikikitap'taki bu sayfaya bir şeyler eklerseniz Ahmet'e mesaj göndermiş olursunuz. Kullanıcı mesaj sayfaları belirli bir kullanıcıyla iletişim kurmak için en iyi yoldur.
Tartışma sayfaları. Vikikitap'taki her sayfanın bir tartışma sayfası vardır. İlgili sayfanın üst kısmındaki "tartışma" düğmesine tıklayarak ilgili sayfa hakkında tartışma yapabileceğiniz bir sayfa açılır. Tartışma sayfaları belirli bir kitap veya sayfa hakkında tartışma yapmak için en iyi yoldur.
Köy çeşmesi. Vikiyazarlar geniş kapsamlı konuları köy çeşmesinde tartışır. Belirli bir kitabı ilgilendirmeyen her türlü tartışma, soru sorma, sorun bildirme, duyuru yapma, vb. köy çeşmesinde yapılır.
Bu sayfaları kullanmak son derece kolaydır. İlgili sayfanın üst kısmındaki "değiştir" düğmesine tıklarsınız, uygun yeri bulursunuz (eğer yeni bir konu başlatacaksanız sayfanın en altını kullanırsınız), sorunuzu/görüşünüzü vb. yazarsınız, sonra "Sayfayı kaydet" düğmesine tıklarsınız. Eğer yeni bir konu başlatacaksanız kullanabileceğiniz başka bir yöntem de sayfanın üstündeki "+" işaretine tıklayıp, açılan sayfada başlığı ve içeriği yazıp, son olarak "Sayfayı kaydet" düğmesine tıklamaktır. Hangi yöntemi kullanacağınız size kalmış ancak her iki yöntemi de denemenizi tavsiye ederiz.
Ayrıca bu sayfaları kullanırken yazacaklarınızı bitirdiğinizde yazınızın sonuna --~~~~ ekleyerek imza atmanız gerekmektedir. İmza, kullanıcı adınızı ve mesajın gönderildiği zamanı içerir. Bu sayede diğer kullanıcılar kiminle muhatap olduklarını ve ilgili mesajın ne zaman gönderildiğini anlayabilirler.

Bazen bir vandal sayfaya uygunsuz içerik ekleyebilir veya sayfanın bütün içeriğini silebilir. Bunu düzeltmek zaman alabilir. Böyle bir vandalizmle karşılaştığınızda bunu Vikikitap:Hizmetli panosu sayfasına bildirin. Gönüllü ve hizmetliler sorunu düzeltecektir. Gönüllü ve hizmetlilerin bunu nasıl yaptığını öğrenmek için bu kitabın "Editörler" ve "Hizmetliler" bölümünü okuyabilirsiniz.

Vikiyazarlar tamamıyla gönüllülerden oluşur, rollerini ve katılım seviyelerini kendileri belirlerler. Eğer küçük hataları şimdiden düzeltmeye başlamışsanız editör veya yazar olmanın ilk basamağını atlamışsınız demektir. Vikikitap'ta kendinize yapıp sevebileceğiniz görevler belirlemeniz önemlidir. Eğer Vikikitap'ta daha aktif bir katılımcı olmak istiyorsanız izleyebileceğiniz çeşitli yollar vardır.
Editör olma üzerine daha fazla ipucu alıp Vikikitap'ı daha güzel bir yer haline getirmek istiyorsanız kitabın "Editörler" kısmını, yazar olma üzerine daha fazla ipucu alıp yeni kitaplar oluşturmak / var olan kitaplara içerik eklemek istiyorsanız kitabın "Yazarlar" kısmını okuyun.
Şunu unutmayın ki yazar veya editör olmak bir ayrıcalık değildir ve kolayca editör veya yazar olabilirsiniz veya kendinize bu iki görev dışında görevler de bulabilirsiniz. Önemli olan sevebileceğiniz bir görev seçmektir.

Vikimetni düzenleme hakkında bütün kaideleri içeren ve sadece Vikikitap için değil, bütün vikiler için faydalı olabilecek ayrı bir kitabımız var. Var olan sayfalarda değişiklik yapma ve güzel sayfalar oluşturma hakkında daha fazla bilgi için Vikimetni Düzenleme kitabına bakabilirsiniz.
Neden Vikikitap'ta değişiklik yapmalısınız...
İnsanlar Vikikitap'ta çeşitli sebeplerle değişiklik yapmaya karar verirler, yani denemesi ustalık ve dikkat ister.
Bazı insanlar, kitabı okurken kitapta bir gramer hatası bulur ve bu hata o okuyucuyu rahatsız eder; ve o kişi hatayı bir başkasının düzeltmesini beklemektense kendisi düzeltmeye karar verir.
Bir hatayı başkasına bildirmektense kendiniz düzeltmeniz çok daha kolay ve hızlıdır.
Bazı insanlar bildiklerini paylaşarak diğer öğrencilerin parayla kitap almasındansa ücretsiz olarak bilgiye ulaşmasını sağlayarak bu öğrencilere yardım etmek isterler.
Bazı insanlar canları sıkıldığından ve bu can sıkıntısını iyi bir şeyle değerlendirmek istediklerinden değişilik yaparlar.
Bazı insanlar öğretmenleri istediği için değişiklik yaparlar. (Bakınız: Sınıf projeleri için Vikikitap)
Bazı insanların işi şirketleri için vikiler üretmektir. Bu insanlar vikilere dikkatli bakma alışkanlığı edinmişlerdir. Bu nedenle Vikikitap'taki hataları kolayca bulup bu hataları düzeltme eğilimindedirler.
İnsanların birçok değişiklik yapma nedeni vardır, ancak son tahlilde neden pek de önemli değildir. Önemli olan Vikikitap projesine girmek ve Vikikitap topluluğuna katılmak için ilk adımları atmaktır.

Hemen hemen her sayfanın üst kısmında "değiştir" düğmesi vardır. Bu düğmeye tıkladığınızda hangi sayfadaysanız o sayfanın "vikimetin" olarak içeriği ekrana gelir. Bu vikimetinde değişiklik yapıp sayfayı kaydettiğinizde artık ilgili sayfa değişmiş olacaktır. Sayfanın değiştiğini ilgili sayfayı tekrar ziyaret ederek görebilirsiniz. Hemen hemen her sayfanın üst kısmında "değiştir" düğmesi vardır, çünkü bazı sayfalar çeşitli sebeplerden ötürü değiştirilmesini engellemek için koruma altına alınmıştır. Eğer sayfa koruma altına alınmışsa "değiştir" düğmesi artık "kaynağı gör" olacaktır. Kaynağı gör düğmesine tıklayarak ilgili sayfayı oluşturan vikimetni görebilir ama bu vikimetinde değişiklik yapamazsınız.
Vikimetinde değişiklik yaptığınızda (metin ekleme, silme, değiştirme) ilgili değişiklikleri kaydetmek için değiştirme kutusunun alt kısmındaki "Sayfayı kaydet" düğmesine tıklarsınız.
Vikimetinde değişiklik yapıp "Ön izlemeyi göster" düğmesine bastığınızda yeni sayfanın ön izlemesi değiştirme kutusunun üst kısmında gösterilir. Bu aşamada yaptığınız değişiklikler henüz kaydedilmez, sadece sayfayı kaydettiğinizde olacak şeyi görürsünüz.
Eğer küçük bir değişiklik yapmışsanız sayfayı kaydetmeden önce değiştirme kutusunun altındaki "Küçük değişiklik" ismindeki onay kutusunu işaretlersiniz. Böyle yaparak diğer editörlere bu değişikliğin küçük bir değişiklik olduğunu ve ayrıntılı inceleme yapmalarına gerek olmadığını söylemiş olursunuz.

"Özet" ismindeki metin kutusu yaptığınız değişikliğin ne olduğunu ve o değişikliği neden yaptığınızı açıklamanızı sağlar. Özet kutusuna bir şey yazmanız zorunlu değildir, ancak tavsiye edilir. Eğer imla veya gramer düzeltmesi gibi küçük bir değişiklik yapmışsanız özet kutusuna "imla" veya "gramer" veya "düzeltme" yazmanız yeterlidir. Eğer daha büyük ve önemli bir değişiklik yapmışsanız yaptığınız değişikliği ve neden yaptığınızı kısaca yazmanız tavsiye edilir. Yazdığınız bu özetler yaptığınız değişikliği denetleyen diğer kullanıcılara yardımcı olacaktır.
Ayrıca kullanıcılar sayfanın geçmişini görüntülediklerinde sadece özeti direkt olarak göreceklerdir. Bir kişi sayfanın nasıl geliştiğini görmek istediğinde ya sayfa geçmişinde özetlere bakacak ya da her bir değişikliğin ayrı ayrı farklarına bakacaktır. İkinci yöntem hem çok zor hem zaman alıcıdır. O yüzden değişiklik özeti kullanmak önemlidir.
Son olarak değişiklik özetleri, bir kullanıcının vandal mı yoksa Vikikitap'ı keşfetmeye çalışan yeni bir kullanıcı mı olduğu hakkında fikir veren en önemli göstergelerden biridir. Özet kutusuna Bir şeyleri düzeltmeye çalıştım ama doğru mu yaptım bilmiyorum. veya Yardıma ihtiyacım var! gibi bir şeyler yazmanız vandal olmadığınızı Vikikitap topluluğuna bildirir ve son değişiklikleri izleyen vikiyazarlar size yardım etmek isteyebilir.

Vikikitap'ta yapılan değişiklikleri takip etmeniz için çeşitli yollar vardır. Kendi değişikliklerinizi, belirli bir sayfaya yapılan değişiklikleri veya bütün topluluk tarafından yapılan değişiklikleri ayrı ayrı takip edebilirsiniz. Bu bölümde bu yöntemler anlatılacaktır.

Vikikitap'taki bütün kullanıcılar tarafından bütün sayfalara yapılan değişiklikler Son değişiklikler sayfasında listelenir. Bu listeye Vikikitap arayüzünün sol panelindeki "gezinti" bölümünden "Son değişiklikler" bağlantısına tıklayarak erişebilirsiniz. Bu listede, yapılan değişiklikleri yeniden eskiye sıralanmış görürsünüz. Her değişiklik, değiştirilen sayfanın başlığınından, değişikliği yapan kullanıcının kullanıcı adından (kullanıcı giriş yapmamışsa IP adresini) ve diğer çeşitli bilgilerden oluşur. Bu diğer bilgilerden bazıları şunlardır:

K veya Y
K değişikliğin küçük bir değişiklik olduğunu belirtir. Y ise değişikliğin ilgili sayfadaki ilk değişiklik olduğunu, yani sayfanın yeni oluşturulduğunu belirtir. Herhangi bir değişiklikte duruma göre K ve Y'den her ikisi veya herhangi birisi olabilir veya hiçbirisi olmayabilir.
(+123)
Parantez içindeki sayılar ilgili sayfaya kaç karakter eklendiğini veya çıkarıldığını belirtir. Eğer sayı küçükse bu muhtemelen küçük bir değişikliktir. Eğer sayı büyükse bu da muhtemelen büyük bir değişikliktir. Sayı yeşil renkteyse karakter eklenmiş, kırmızı renkteyse karakter çıkarılmıştır. Eğer eklenen veya çıkarılan karakter sayısı büyükse bu sayılar daha koyu bir tonda (kırmızı veya yeşil) gösterilecektir.
Değişiklik özeti
Eğer kullanıcı değişikliğini kaydetmeden önce bir değişiklik özeti yazmışsa bu değişiklik özeti gözükür. Ancak bazen kullanıcı değişiklik özeti yazmamış olsa bile bir değişiklik özeti gözükebilir. Örneğin eğer kullanıcı sayfanın tamamında değişiklik yapmamış, ilgili başlığın "[değiştir]" bağlantısına tıklayarak sadece bir alt bölümü değiştirmişse özette bu alt bölümün başlığı gözükür.

Eğer bir hesap oluşturmuş ve bu hesabınızla giriş yapmışsanız kendi izleme listenize erişebilirsiniz. İzleme listenizde takip etmek istediğiniz sayfalar listelenir. Vikikitap arayüzünün sağ üst kısmındaki "izleme listem" bağlantısına tıklayarak veya Özel:İzlemeListesi sayfasına giderek izleme listenizdeki sayfalara yapılan son değişiklikleri görebileceğiniz izleme listenize erişirsiniz. İzleme listeniz, bir nevi son değişiklikler sayfasının sadece izleme listenizdeki sayfalara göre revize edilmiş halidir.
Bir sayfayı izleme listenize eklemenin birkaç yolu vardır. Bir sayfayı değiştirirken değişiklik kutusunun altındaki "Sayfayı izle" onay kutusunu işaretleyip sayfayı kaydederek ilgili sayfayı izleme listenize ekleyebilirsiniz. Başka bir yol ilgili sayfadayken üst kısımdaki "izlemeye al" düğmesini tıklamaktır. Daha karmaşık bir yolsa Özel:İzlemeListesi/raw sayfasına gitmektir. Bu sayfada her satırdaki bir başlık izleme listenizdeki bir sayfayı temsil eder. Yani buraya izlemeye almak istediğiniz sayfaların başlıklarını yazarsınız. Her satıra bir başlık yazabilirsiniz ve büyük küçük harf durumuna dikkat etmeniz gerekir. Bu özel sayfaya izleme listenize gidip, buradan "Ham izleme listesini düzenle" bağlantısına tıklayarak da gidebilirsiniz.
İzleme listeniz, izleme listenizdeki her sayfaya yapılan son değişiklikleri gösterir, ilgili sayfalardaki bütün değişiklikleri göstermez. Yani eğer siz görmeyeli bir sayfada 10 değişiklik olmuşsa izleme listeniz bu 10 değişikliği değil, sadece son yapılan değişiklikleri gösterir.
Tercihlerim sayfanızın İzleme listesi sekmesinde izleme listenizle ilgili çeşitli ayarlar bulunur. Burada değişiklik yaptığınız veya oluşturduğunuz sayfaların otomatik olarak izleme listenize eklenmesini sağlayabilirsiniz. Bu, eğer yeni bir kitap oluşturuyor ve oluşturduğunuz her sayfanın otomatik olarak izleme listenize eklenmesini istiyorsanız son derece kullanışlıdır.

Her sayfanın bir geçmiş sayfası vardır. Bir sayfanın geçmişini görmek için ilgili sayfadayken üst kısımdaki "geçmiş" düğmesine tıklarsınız. "geçmiş" düğmesi "değiştir" düğmesinin hemen sağındadır.
Geçmiş sayfalarıyla bir sayfanın zamanla nasıl değiştiğini görebilirsiniz. Geçmiş sayfası son değişiklikler sayfasında ve izleme listenizde gördüğünüz bilgilerin aynısını içerir.
Geçmiş sayfaları sayesinde bir sayfanın eski sürümlerini de görebilirsiniz. Geçmiş sayfasında bir sayfanın eski sürümlerini görmek için bu listedeki ilgili sürümün bağlantısına (saat ve tarih) tıklarsınız.

Son değişiklikler listesi, bütün Vikikitap ve geçmiş sayfaları RSS ve ATOM beslemeleri desteğine sahiptir. RSS veya ATOM izleme programlarına sahip olanlar bu fonksiyonu kullanışlı bulabilirler.
Ancak izleme listeniz için RSS veya ATOM imkanı yoktur. Bu, yaygın bir sorundur ve yazılım geliştiricilerden en çok istenen özelliklerden biridir.

IRC'ye aşina olanlar irc://irc.wikimedia.org/#tr.wikibooks adresinden değişiklikleri gerçek zamanlı izlemek isteyebilirler. Bu besleme, bütün değişiklikleri olduğu an, gerçek zamanlı, son değişikliklerde gördüğünüz bilgilerle birlikte gösterecektir.
Canlı beslemeye ek olarak, çeşitli Vikikitap üyeleri çeşitli devriye botları yönetirler. Bu botlar değişiklik beslemesindeki şüpheli değişiklikleri ararlar. Daha sonra buldukları şüpheli değişiklikleri irc://irc.freenode.net/#vandalism-en-wb adresinde listelerler. Vandalizmle mücadeleye ilgi duyan kişilerin bu adresi kullanmaları kullanışlı olabilir.

Bir kitaptaki bütün sayfaları izlemek yeni kullanıcılar tarafından dile getirilen yaygın bir istektir. Ayrıca bazı çalışkan yazarlarımız birkaç kitaptaki bütün sayfaları izlemek istemektedirler. Bunu başarmanın çeşitli yolları vardır:

Kitaptaki bütün sayfaları izleme listenize ekleyin. Eğer yeni bi

Vikikitap hesabı oluşturmanın ve katkılarınızı bu hesap altında yapmanın çeşitli avantajları vardır. İşte bu avantajlarından bazıları:

Anonimlik
Bir hesap oluşturduğunuzda anonim bir kullanıcıdan daha anonim olursunuz. Çünkü anonim olarak katkılar yaptığınızda IP adresiniz herkesin görebileceği şekilde Vikikitap'a kaydedilir (ki IP adresiniz aracılıyla bulunduğunuz yer tespit edilebilir). Bir kullanıcı hesabı oluşturduğunuzda ise IP adresiniz gizlenir. Bu durumun tek istisnası "Denetçiler" adlı özel yetkilere sahip seçilmiş kullanıcıların eğer bir problem olursa IP adresinize erişebilmeleridir. Ancak denetçiler bu yetkilerini ortada bu denetimi gerektirecek bir durum oluşursa (örneğin sizin iki hesaba sahip olup bu hesapları oylamalarda haksız bir şekilde kullandığınız kuşkusu oluşursa) kullanabilirler.
Kullanıcı alanı
Bir kullanıcı hesabı oluşturduğunuzda bir kullanıcı sayfasına ve ihtiyaç duyarsanız oluşturabileceğiniz kullanıcı sayfanızın alt sayfalarına sahip olursunuz. Bütün bu sayfaların birleşimine kullanıcı alanınız denir. Bazı kullanıcıların çeşitli amaçlar için kullandıkları yüzlerce kullanıcı alt sayfası vardır. Kullanıcı alanınızda kendiniz hakkında bir şeyler veya istediğiniz herhangi bir şey yazabilirsiniz. Birçok kullanıcının kullanıcı alanında, ilgili kullanıcının yazdığı kitaplar, ileride yapmayı planladıkları şeyler ve benzeri yazılıdır. Ayrıca kullanıcılar kendi kişisel javascript ve  CSS dosyalarına da sahip olabilirler. Bu dosyalar Vikikitap arayüzünü özelleştirip kişiselleştirmek amacıyla kullanılır. Bazı kullanıcıların kullanıcı sayfası son derece basit ve sadedir, bazı kullanıcıların da gösterişlidir. Kullanıcı sayfanız ve -eğer oluşturursanız- kullanıcı sayfanızın alt sayfaları tamamen sizindir. Bu sayfaları istediğiniz gibi kullanabilirsiniz.
Kullanıcı mesaj sayfası
Kendiniz hakkında bir şeyler yazabildiğiniz kullanıcı sayfanızın yanında ayrıca diğer kullanıcıların size mesaj bırakabileceği bir kullanıcı mesaj sayfasına da sahip olursunuz. Birisi size mesaj yazdığında sayfanın üstünde bir bildirim gözükecektir. Vikikitap aracılığıyla bu şekilde mesajlaşmak e-posta, telefon gibi iletişim araçlarından çok daha kullanışlıdır.
Tercihler
Vikikitap'a kaydolduğunuzda kendinize göre ayarlayabileceğiniz çeşitli ayarlar olacak. Bu ayarları tercihler sayfasından yapacaksınız. Bu sayfayla yapabileceğiniz ayarlardan bazıları şunlar: diğer kullanıcıların size e-posta gönderebilmesi için bir e-posta adresi belirtme, temayı değiştirebilme (bu şekilde sitenin görünümünü değiştirebilirsiniz), zaman dilimini ve zamanın görüntülenme biçimini değiştirme. Bunlar sadece bir numunedir. Tercihler sayfasında bunlar gibi daha birçok ayar bulabilirsiniz.
İzleme listesi
İzleme listenizde, izlemeye aldığınız sayfalarda yapılan son değişiklikler listelenir. Birçok kullanıcı oluşturduğu sayfaları veya katıldığı tartışma sayfalarını izleme listesine ekler. Siz de bunun gibi ilgilendiğiniz sayfaları izleme listenize ekleyebilirsiniz.
Oylama ve tartışmalar
Anonim kullanıcılar tartışmalara katılabilirler, ama görüşlerine diğer kayıtlı kullanıcılar tarafından daha az önem verilebilir. Çünkü kayıtlı kullanıcılar tarafından "Vikikitap'a fazla ilgisi yok, o yüzden kullanıcı hesabı bile oluşturmaya gerek görmemiş" muamelesi görebilirler. Kullanıcı hesabı oluşturduğunuzda tartışmalarda -ilk günlerinizde bile- görüşlerinize diğer kullanıcılar kadar önem verildiğini göreceksiniz.
Bu liste uzun bir listedir ama halen bütün avantajları kapsamamaktadır. Kayıtlı kullanıcıların bu listede listelenmeyen daha birçok avantajları vardır. Eğer Vikikitap'a bol bol katkı yapmayı düşünüyorsanız hesap oluşturmanız sizin için daha da önemlidir. Hesap oluşturmak ücretsiz, hızlı ve kolaydır. Kaydolurken herhangi bir kişisel bilgi vermek zorunda değilsiniz, yani isterseniz her zaman anonim kalabilirsiniz.

Kullanıcı hesabı oluşturmak hızlı ve kolaydır. İki dakikadan kısa bir sürede kaydınızı tamamlayabilirsiniz. Ama bu işleme başlamadan önce aklınızda bir kullanıcı hesabı belirlemelisiniz. Bu kullanıcı adı önemlidir. Çünkü kaydolduktan sonra yaptığınız bütün katkılar bu kullanıcı adının altında duracaktır. Ayrıca seçtiğiniz bu kullanıcı adı Vikikitap'ta daha önceden alınmamış olmalı ve birazdan sayacağımız kriterleri karşılamalıdır.
Kullanıcı adınızı kafanızda belirledikten sonra herhangi bir sayfadayken sağ üst köşedeki "Oturum aç ya da yeni hesap edin" bağlantısına tıklayın. Açılan sayfada "Eğer şimdiye kadar kayıt olmadıysanız bu bağlantıyı takip edin." bağlantısına tıklayın. Gelen sayfadaki forma resimdeki captcha kodunu, kullanıcı adınızı ve parolanızı (iki defa) girin. E-posta adresinizi girmek zorunda değilsiniz. Ama girerseniz Vikikitap'taki diğer kullanıcılarla e-posta yoluyla iletişim kurabilir ve parolanızı unuttuğunuzda yeni parolanızın e-posta adresinize gönderilmesini sağlayabilirsiniz. Son olarak eğer isterseniz "Parolayı hatırla" onay kutucuğunu işaretleyerek o bilgisayarda bir daha size şifre sorulmamasını sağlayabilirsiniz. Artık "Yeni hesap aç" düğmesine tıklayın. Artık bir kullanıcı hesabına sahip oldunuz. Eğer bir e-posta adresi belirtmişseniz Vikikitap e-posta adresinize bir e-posta gönderecektir. Vikikitap'ın e-posta fonksiyonunu kullanabilmeniz için bu e-postada gönderilen linke tıklamanız gerekiyor.
ÖNEMLİ NOT: Bu sayfanın tamamını okumadan hesap oluşturmayın. Daha bilmeniz gereken şeyler var.

Vikikitap'ta kayıtlı yüzlerce kişi var. Dolayısıyla aklınızdaki kullanıcı adı başka birisi tarafından daha önce alınmış olabilir. Ancak hemen üzülmeyin! Eğer istediğiniz kullanıcı adını alan kişi Vikikitap'ta hiç olumlu katkı yapmamışsa bir bürokrat istediğiniz kullanıcı adını o kişiden alıp size verebilir. Ancak bu garanti değildir. Eğer daha önceden alınmış bir kullanıcı adını kendinize geçirmek istiyorsanız bu isteğinizi, kendinize geçirmek istediğiniz kullanıcı adını ve -varsa- mevcut kullanıcı adınızı köy çeşmesinde yazın.

Resim yüklemek için otomatik onaylanmış bir kullanıcı olmanız gerekiyor. Bir kullanıcı hesabı oluşturulduktan 4 gün sonra otomatik onaylanmış kullanıcı statüsüne kavuşur. Yani eğer Vikikitap'a resim yükleyemiyorsanız kaydolalı henüz 4 gün olmamış demektir.
Ancak hemen üzülmeyin! Wikimedia Commons isminde resim yükleyeceğiniz başka bir proje daha var. Üstelik bu projeye resimleri beklemeden yükleyebiliyorsunuz. Ayrıca buraya yüklenen resimler Vikikitap'ta (ve Wikimedia Vakfı'nın diğer projelerinde) kullanılabiliyor. Ancak Commons'a sadece özgür lisanslı resimleri yükleyebiliyorsunuz. Çünkü buraya yüklenen resimler her yerde kullanılabiliyor. Adil kullanım resimlerini sadece Vikikitap'a yükleyebilirsiniz. Tabii bu sefer kaydolalı 4 gün geçmiş olması gerekiyor.

Vikikitap'taki sükunet ortamının bozulmaması için aşağılayıcı veya kafa karıştırıcı kullanıcı adlarını seçmemeniz önemlidir. Kullanıcı adı seçimi konusunda henüz Vikikitap'ta bir politika yoktur. Ancak Vikikitap:Kibar ol politikası kullanıcı adlarını da kapsamaktadır. Aşağıdaki kullanıcı adlarından kaçınmanızı tavsiye ediyoruz. Bu kullanıcı adlarından birini veya birkaçını seçen kullanıcı hizmetliler tarafından süresiz olarak engellenebilir.

Kafa karıştırıcı kullanıcı adları:
Vikikitap'ta kayıtlı başka birinin kullanıcı adına çok benzeyen kullanıcı adları.
Bir Vikikitap işleminin, alan adının veya araç çubuğu ögesinin ismi.
Yanlış anlaşılmaya müsait kullanıcı adları:
Kullanıcının, Wikimedia Vakfı'nın veya Vikikitap'ın resmi bir çalışanı veya Vikikitap'ta bir hizmetli olduğunu ima eden kullanıcı adları.
Eğer gerçekten o kişi değilseniz; yaşayan veya yeni ölmüş ünlü insanların ad ve soyadları. Eğer gerçekten o kişiyseniz bunu kanıtlamanız ve ayrıca kullanıcı sayfanızdan gerçekten o kişi olduğunuzu belirtmeniz gerekir.
Kargaşaya yol açabilecek kullanıcı adları:
Daha önce ısrarlı bir şekilde vandalizm yapmış ve engellenmiş kullanıcıların rumuzlarına benzeyen kullanıcı adları.
Belirli bir kullanıcıya yönelik kışkırtıcı ifadeler barındıran kullanıcı adları.
İnsanların telefon numarası, adresi gibi kişisel bilgilerini içeren kullanıcı adları.
Hacker, troll, vandal gibi buraya kötü amaçlarla geldiğinizi ima eden, yasal tehdit içeren, bir bilgisayar zararlısıyla eşleşen (virüs, casus yazılım gibi) kullanıcı adları.
Küfür, müstehcenlik içeren veya insan vücudunun genital organlarını ima eden kullanıcı adları.
Reklam amaçlı kullanıcı adları:
Tanınmış bir şirketin veya ürünün adıyla eşleşen kullanıcı adları. Eğer kullanıcı adı söylendiğinde ilk akla gelen şey şirket veya ürün değil de başka bir şeyse o zaman kullanıcı adında bir sorun yok demektir.
Saldırgan kullanıcı adları:
Diğer kullanıcıları kızdırabilecek kullanıcı adları.
Bir kişi veya gruba hakaret veya iftira niteliği taşıyabilecek kullanıcı adları.
Belirli bir dine veya dinî figüre karşı aşağılayıcı ifadeler içeren veya belirli bir dini yayma amacı güttüğü hissedilen kullanıcı adları. (Basit din kaynaklı terimler kışkırtıcı olmadıkları müddetçe kullanılabilir, ama yine de tavsiye edilmez.)
Şiddet eylemlerini ima eden kullanıcı adları.
Irkçılık, cinsiyet ayrımcılığı gibi her türlü ayrımcılığı ima eden kullanıcı adları.
Bir sağlık sorununa veya engelli olma durumuna alaycı bir üslupla gönderme yapan kullanıcı adları.
Vücudun üreme veya boşaltım ile ilgili fonksiyonlarını ima eden kullanıcı adları.
@ işareti içeren kullanıcı adları
Teknik kısıtlamalardan dolayı @ işareti içeren kullanıcı adları yasaklanmıştır.

Hesabınızın sağlam ve güvenli kalması için tahmin edilmesi zor bir parola seçmelisiniz.
Kolay tahmin edilen parolalar:
Sözlükte geçen kelimeler, özel adlar, kullanıcı adınıza benzeyen kelimeler, veya bu kelimelerin çeşitli varyasyonları kolay tahmin edilebilen parolalardır. Özellikle doğum tarihiniz veya evcil hayvanınızın ismi en kolay tahmin edilen parolalardır.
Kolay tahmin edilebilen parola örnekleri:

admin - çok kolay tahmin edilebilir
abc123 -- çok kolay tahmin edilebilir
zzz - tekrar edilen veya klavyede art arda gelen harfler (örn. qwerty)
ahmet - yaygın kullanılan bir isim
password - kol

Köy çeşmesi önemli bir tartışma alanıdır, ve Vikikitap'ı ilgilendiren birçok tartışma orada yapılır. Ancak bir politika veya yönerge hakkındaki tartışmalar ilgili politika veya yönerge sayfasının tartışma sayfasında yapılır. Bu tür tartışmaların topluluğun ilgisini çekmesi için köy çeşmesinde ilgili politika veya yönerge sayfasının tartışma sayfasında bir tartışma olduğu duyurulabilir.

Vikikitap'ta çeşitli politikalar vardır. Vikiyazarlar, Vikikitap'ın düzgün işleyişinin sağlanması için bu politikalara katiyen uymalıdır. Bu uyumu kolaylaştırmak için politikaların sayısını olabildiğince az tuttuk. Ayrıca bu politikalar değişemez diye bir şart yoktur. Politikalar değiştirilebilir, kapsamı genişletilip daraltılabilir ve tamamen yeniden yazılabilir. Bu sayede Vikikitap'taki bu politikaların olabilecek en iyi politikalar olması sağlanır.
Burada en temel politikalar listelenmiştir, bunların bazılarını sayfanın ilerleyen kısımlarında tekrar ele alacağız.

Cesur ol
...ama umursamaz olma. "Cesur ol" Vikikitap'ın en önemli ilkelerinden biridir. Herkes buradaki sayfaları değiştirebilir, biz insanlardan izin almadan sayfaları değiştirmelerini istiyoruz. Beğenmediğiniz bir şey mi gördünüz? Onun hakkında şikayette bulunmayın, ilgili beğenmediğiniz şeyi düzeltin! Ancak bazen cesur olmak değişiklik yapmamayı, önce diğer insanların görüşünü almayı gerektirir. Tartışmalı ve büyük değişiklikleri yapmadan önce topluluğun görüşünü almanız önemlidir. Yani "cesur ol" politikası yalnızca bariz ve/veya küçük hatalarda geçerlidir.
Tarafsız bakış açısı
Genellikle "TBA" olarak kısaltılır, bu politikanın anlamı Vikikitap'ı kendi sosyal, politik, dinî veya kişisel görüşümüzü yaymak veya ifade etmek için kullanamamamızdır. Yani Vikikitap'taki bir kitabı okuyan birisi o kitabı okurken kitabın yazarı hakkında sosyal, politik, dinî veya kişisel hiçbir çıkarım yapamamalıdır.
Kibar ol
Bazı insanların uğraşması zor insanlar olduğunu biliyoruz. Vikiyazarlar, bu insanlarla tartışırken bazen sinirlenebiliyor ve ağızlarından kötü şeyler çıkabiliyor. İşte bunu yapmayın. Vikikitap'ta birbirinize karşı daima kibar olmalısınız. Karşıdakine karşı her zaman güler yüzlü olun demiyoruz. Sadece saygı duyun. Eğer kendinizi kontrol edememeye başlamışsanız bir yürüyüşe çıkın, TV izleyin veya e-postanızı kontrol edin. Ne yaparsanız yapın muhatabınızla konuşmaya başlamadan önce sakinleşin. Çünkü sakinleşmeden tartışmaya başladığınızda tartışma bittiğinde pişman olacaksınız.
Olgun ve profesyonel ol
Bazı şeyler uygun değildir, bu uygun olmayan şeyleri listelemeyeceğiz ancak şunları söylemek isteriz: en iyi muhakemenizi yapın, daima olgun ve profesyonel kalın. Bazı insanlar bu kuralı çiğnerler ve buraya kötü şeyler yazarlar, bu insanlara "vandal" diyoruz.
Bunlar en önemli politikalardır, ancak bunlardan başka daha birçok politika vardır. Vikikitap'taki bütün politikaların tam listesini Vikikitap:Politika ve yönergeler sayfasında bulabilirsiniz. Bir topluluk olarak politika veya yönerge hâline getirmediğimiz kurallar da olabilir. Bunların önemli olanları "Yardım" veya "Vikikitap" isim alanındaki çeşitli sayfalarda bulunabilir. Bunlardan bazılarına zamanla alışır, uygularsınız, bazılarını da uygulamadığınız için uyarılar alabilirsiniz. Örneğin Vikikitap'ta tartışma ve mesaj sayfalarına yazdıklarınıza imza atmalı ama normal sayfalara yazdıklarınıza imza atmamalısınız. Ancak bu bir politika veya yönerge değildir. Bunun gibi Vikikitap'ta yapmanız veya yapmamanız gereken şeylerin hepsini politika veya yönerge hâline getirmek oldukça zordur. Ancak Vikikitap'ta zaman geçirdikçe yazılı olmayan kurallara da uyacağınızı tahmin ediyoruz.

Önce herhangi bir kişi, yeni bir politika fikri olduğunu köy çeşmesinde duyurur. Sonra diğer kişiler ilgili politika önerisi hakkındaki olumlu/olumsuz yorumlarını yazarlar. Ancak bir politikanın işlerlik kazanması o kadar kolay değildir. Bir politikanın işlerlik kazanması için hiçbir olumsuz yorum olmaması gerekir. Ayrıca bir politika tartışmasına yeterli kişinin katılmaması o politikanın reddedildiği anlamına gelir ve bir politikanın kabul edilebilmesi için tartışmaya en azından bir hizmetlinin katılmış olması gerekir.

Hiçbir politika değişmez değildir. Bir politikanın hoşunuza gitmeyen kısımlarını değiştirme önerinizi ilgili politikanın tartışma sayfasında dile getirebilirsiniz. Ancak çok güçlü bir destek olmadığı müddetçe bir politikanın değişmesi oldukça zordur.

Burada Vikikitap'ın politika ve yönergelerinden bazıları listelenmiştir. Politika ve yönergelerin tam listesi Vikikitap:Politika ve yönergeler sayfasında bulunur.

Bunlar en önemli politikalarımızdır; Vikikitap'ın nasıl işlediğini, Vikikitap'ta ne tür kitapların bulunabileceğini ve kullanıcıların nasıl davranması gerektiğini anlatır.

Vikikitap:Vikikitap nedir?
Bu politika Vikikitap'taki en önemli politikalardan biridir. Bu politika, Vikikitap'ta ne tür içeriğin bulunabileceğini, ne tür içeriğin taşınacağını ve ne tür içeriğin silineceğini anlatır.
Vikikitap:Alıntılanmış metinler
Bu politika, hangi alıntı metinlerin nasıl Vikikitap'a aktarılabileceğini ve Vikikitap'ın kardeş projesi olan Vikikaynak'la ilişkisini anlatır.
Vikikitap:Adlandırma politikası
Kitapların ve sayfaların nasıl adlandırılacağını ve kitapların nasıl organize edileceğini anlatır.
Vikikitap:Tarafsız bakış açısı
Kullanıcıların kitap yazarken kendi dinî, siyasî, vb. görüşlerini bir kenara bırakması üzerine temellenen bir politikadır.
Vikikitap:Silme politikası
Bu politika, hangi sayfaların silinebileceğini ve sayfa silmeyle ilgili diğer prosedürleri anlatır.
Vikikitap:Küfür
Vikikitap'ın küfür, hakaret vb. ile savaşmayla ilgili kurallarını anlatır.
Vikikitap:Kibar ol
Vikiyazarların birbiriyle tartışırken kullanması gereken üslubu anlatır.
Vikikitap:Hizmetliler
Vikikitap'taki hizmetlilerin görev ve sorumluluklarını ve hizmetli seçimi/azledilmesi ile ilgili prosedürleri anlatır.

Yönergeler, politikaların aksine uyulması zorunlu tutulan değil, tavsiye edilen kurallardır. Burada bazı önemli Vikikitap yönergeleri listelenmiştir:

Vikikitap:Karar alma
Karar alma yönergesi, kararların nasıl alınacağını vs. anlatır.
Vikikitap:Değişiklik yapma
Sayfalarda değişiklik yapmanın püf noktalarını anlatır.
Vikikitap:Sayfaları güncellerken cesur ol
Sayfa güncellerken cesur olmanın önemini anlatır.
Vikikitap:Yeni kullanıcıları ısırma
Gelen yeni kullanıcıların iyi birer vikiyazara dönüşmesi için dikkat edilmesi gereken hususları anlatır.
Vikikitap:Biçem rehberi
Bu yönerge, vikiyazarların kaliteli kitaplar yazması için uyması gereken hususları anlatır.

Resimler Vikikitap'ın önemli bir parçasıdır. Vikikitap'ta, önemli bir noktayı resmetmek veya okuyucunun anlatılanı anlayabilmesine yardımcı olmak için resimler kullanılır. Resimlerin düzgün kullanımı sayfanın görünümünü önemli ölçüde geliştirebilir.
Vikikitap'ta bir sayfaya resim koymak için şu temel söz dizimini uygularız:

[[Dosya:{dosyanın ismi}|{biçim}|{yer}|{boyut}|{border}|{alternatif metin}]]

{dosyanın ismi} ilgili dosyanın Vikikitap'taki (veya Commons'taki) ismidir. Örneğin: Commons-logo.svg. Vikikitap'taki veya Commons'taki her resim dosyasının bir ismi vardır.
{biçim} resmin sayfaya yerleştirilme biçimini belirtir. Buraya "thumb" yazıldığında resim sağa yaslanır, metin resmin solundan akar, resmin etrafına bir kenarlık çekilir ve eğer resmin boyutu sayfayı görüntüleyen kullanıcının kullanıcı tercihlerinde (Tercihler -> Görünüm -> Dosyalar) ayarlı küçük resim boyutundan büyükse resim oradaki ayarlı boyuta düşürülür. Küçük resimler için varsayılan değer 180 pikseldir ve bu değer kayıtlı olmayan veya giriş yapmamış kullanıcılar için de kullanılır. Buraya "frame" yazdığımızda ise resmin boyutlarında değişiklik yapılmaz ama diğer özellikleri (çerçeve, yaslama) "thumb" ile aynıdır. Buraya hiçbir şey yazmamak resmin kenarlıksız ve orijinal boyutta (veya {boyut} belirtilmişse o boyutta) sayfaya yerleştirilmesini sağlar.
{yer} resmin sayfada nereye yerleştirileceğini belirtmemizi sağlar. "left", "right" ve "center" resmi sırayla sola, sağa veya ortalanmış halde yerleştirir ve ayrıca "left" ve "right"da metin resmin etrafında akar. "none" yazılırsa resimden önceki metin resmin üstüne, resimden sonraki metin resmin altına gider. Yani resmin yanına hiçbir yazı gelmez. Eğer burası atlanırsa resim bir "satır içi" resim, yani yazının içindeki sıradan bir harf gibi muamele görür. Eğer resim bir yazı karakteri kadar küçükse bu son yöntem uygundur, aksi takdirde çok çirkin bir görüntü oluşur.
{boyut} resmin genişliğini piksel olarak belirtmek için kullanılır. İlgili değeri yazdıktan sonra "px" takısını eklemek gerekir. Örneğin resmin genişliğinin 200 piksel olmasını istiyorsak buraya 200px yazarız. Resmin yüksekliği, genişlik değiştikçe en-boy oranı sabit olacak şekilde değişecektir. Resmin boyut bilgisi yazılmazsa resim orijinal boyutta veya resmin "thumb" olduğu belirtilmişse maksimum, sayfayı görüntüleyen kullanıcının tercihlerinde küçük resimler için ayarlanmış olan boyutta olacaktır. Eğer resmin "thumb" olduğu belirtilmişse belirttiğiniz boyut -bu boyut küçük resimler için belirtilen boyuttan (varsayılan olarak 180 piksel) küçük olsa bile- işlevsiz hale gelecektir. Ancak resmi thumb olarak belirtmişseniz olsanız bile sayfayı görüntüleyen kullanıcının tercihlerinde küçük resimler için ayarlanmış değerden ve resmin orijinal boyutundan daha küçük bir değer seçerek resmin thumb olarak görüntülenmesi gereken boyuttan daha küçük bir boyutta görüntüleyebilirsiniz.
NOT: Vektörel resimlerin (örneğin SVG resimlerinin) orijinal boyutlarını +∞ kabul ederiz.
{border} kullanılırsa resmin etrafına gri bir çerçeve çizer. Kullanılmazsa {biçim}'de belirtilmediği müddetçe çerçeve eklenmez.
{alternatif metin} duruma göre farklı vazifeler görür. Eğer resim "thumb" veya "frame" değilse buraya yazdığımız metin, fare işaretçisi resmin üzerine getirildiğinde gözükecek metin vazifesi görür. Bu durumda metne yaptığımız bütün viki biçimlemeleri işlevsiz hale gelir. Eğer resim "thumb" veya "frame" olarak belirtilmişse buraya yazdığımız metin resmin hemen altına konur, yani bir açıklayıcı yazı vazifesi görür. Bu durumda ise metne yaptığımız bazı viki biçimlemeleri (örneğin bağlantılar) geçerlidir.
Dosyanın ismi dışındaki seçenekler yer değiştirebilir. "thumb" ve "frame"i aynı anda kullanırsak biçim "frame" sayılacaktır. Birden fazla {yer} kullanılırsa son kullanılan {yer} kabul edilecektir. Birden fazla {boyut} kullanımında da aynı kural söz konusudur..

Sade, biçimlendirilmemiş bir resim sayfaya [[Dosya:DosyaAdı]] yazılarak yerleştirilir. Bu durumda resim sayfaya orijinal boyutunda ve sayfadaki metinle uyumsuz olabilecek bir şekilde yerleştirilir. Bu tür resim yerleştirimi aşağıda gösterilmiştir.
Sayfanın ortasına

[[Dosya:Vista-folder.png]]

kodunu yazmak aşağıdaki gibi bir çıktı verir:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis tellus. Donec ante dolor, iaculis nec, gravida ac, cursus in, eros. Mauris vestibulum, felis et egestas ullamcorper, purus nibh vehicula sem, eu egestas ante nisl non justo. Fusce tincidunt, lorem nec dapibus consectetuer, leo orci mollis ipsum, eget suscipit eros purus in ante.
 Mauris at ipsum vitae est lacinia tincidunt. Maecenas elit orci, gravida ut, molestie non, venenatis vel, lorem. Sed lacinia. Suspendisse potenti. Sed ultricies cursus lectus. In id magna sit amet nibh suscipit euismod. Integer enim. Donec sapien ante, accumsan ut, sodales commodo, auctor quis, lacus. Maecenas a elit lacinia urna posuere sodales. Curabitur pede pede, molestie id, blandit vitae, varius ac, purus.
Elbetteki bu hoş bir görünüm değildir. Metin resme düzgün yaslanmamış ve resim çok büyük gözükmektedir.

Kodu biraz değiştirerek resmin sayfadaki konumunu belirleyebiliriz. Sayfada nasıl bir yerleşim görmek istediğimize göre değişen bazı seçenekler var.

[[Dosya:Vista-folder.png|sağ]]

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis tellus. Donec ante dolor, iaculis nec, gravida ac, cursus in, eros. Mauris vestibulum, felis et egestas ullamcorper, purus nibh vehicula sem, eu egestas ante nisl non justo. Fusce tincidunt, lorem nec dapibus consectetuer, leo orci mollis ipsum, eget suscipit eros purus in ante.

 Mauris at ipsum vitae est lacinia tincidunt. Maecenas elit orci, gravida ut, molestie non, venenatis vel, lorem. Sed lacinia. Suspendisse potenti. Sed ultricies cursus lectus. In id magna sit amet nibh suscipit euismod. Integer enim. Donec sapien ante, accumsan ut, sodales commodo, auctor quis, lacus. Maecenas a elit lacinia urna posuere sodales. Curabitur pede pede, molestie id, blandit vitae, varius ac, purus. Morbi dictum. Vestibulum adipiscing pulvinar quam. In aliquam rhoncus sem. In mi erat, sodales eget, pretium interdum, malesuada ac, augue. Aliquam sollicitudin, massa ut vestibulum posuere, massa arcu elementum purus, eget vehicula lorem metus vel libero. Sed in dui id lectus commodo elementum. Etiam rhoncus tortor. Proin a lorem. Ut nec velit. Quisque varius. Proin nonummy justo dictum sapien tincidunt iaculis. Duis lobortis pellentesque risus. Aenean ut tortor imperdiet dolor scelerisque bibendum. Fusce metus nibh, adipiscing id, ullamcorper at, consequat a, nulla.
Phasellus orci. Etiam tempor elit auctor magna. Nullam nibh velit, vestibulum ut, eleifend non, pulvinar eget, enim. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Integer velit mauris, convallis a, congue sed, placerat id, odio. Etiam venenatis tortor sed lectus. Nulla non orci. In egestas porttitor quam. Duis nec diam eget nibh mattis tempus. Curabitur accumsan pede id odio. Nunc vitae libero. Aenean condimentum diam et turpis. Vestibulum non risus.

[[Dosya:Vista-folder.png|frame|sağ|Açıklama buraya geliyor]]

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis tellus. Donec ante dolor, iaculis nec, gravida ac, cursus in, eros. Mauris vestibulum, felis et egestas ullamcorper, purus nibh vehicula sem, eu egestas ante nisl non justo. Fusce tincidunt, lorem nec dapibus consectetuer, leo orci mollis ipsum, eget suscipit eros purus in ante.

 Mauris at ipsum vitae est lacinia tincidunt. Maecenas elit orci, gravida ut, molestie non, venenatis vel, lorem. Sed lacinia. Suspendisse potenti. Sed ultricies cursus lectus. In id magna sit amet nibh suscipit euismod. Integer enim. Donec sapien ante, accumsan ut, sodales commodo, auctor quis, lacus. Maecenas a elit lacinia urna posuere sodales. Curabitur pede pede, molestie id, blandit vitae, varius ac, purus. Morbi dictum. Vestibulum adipiscing pulvinar quam. In aliquam rhoncus sem. In mi erat, sodales eget, pretium interdum, malesuada ac, augue. Aliquam sollicitudin, massa ut vestibulum posuere, massa arcu elementum purus, eget vehicula lorem metus vel libero. Sed in dui id lectus commodo elementum. Etiam rhoncus tortor. Proin a lorem. Ut nec velit. Quisque varius. Proin nonummy justo dictum sapien tincidunt iaculis. Duis lobortis pellentesque risus. Aenean ut tortor imperdiet dolor scelerisque bibendum. Fusce metus nibh, adipiscing id, ullamcorper at, consequat a, nulla.
Phasellus orci. Etiam tempor elit auctor magna. Nullam nibh velit, vestibulum ut, eleifend non, pulvinar eget, enim. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Integer velit mauris, convallis a, congue sed, placerat id, odio. Etiam venenatis tortor sed lectus. Nulla non orci. In egestas porttitor quam. Duis nec diam eget nibh mattis tempus. Curabitur accumsan pede id odio. Nunc vitae libero. Aenean condimentum diam et turpis. Vestibulum non risus.

[[Dosya:Vista-folder.png|sol]]

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Duis tellus. Donec ante dolor, iaculis nec, gravida ac, cursus in, eros. Mauris vestibulum, felis et egestas ullamcorper, purus nibh vehicula sem, eu egestas ante nisl non justo. Fusce tincidunt, lorem nec dapibus consectetuer, leo orci mollis ipsum, eget suscipit eros purus in ante.

 Mauris at ipsum vitae est lacinia tincidunt. Maecenas elit orci, gravida ut, molestie non, venenatis vel, lorem. Sed lacinia. Suspendisse potenti. Sed ultricies cursus lectus. In id magna sit amet nibh suscipit euismod. Integer enim. Donec sapien ante, accumsan ut, sodales commodo, auctor quis, lacus. Maecenas a elit lacinia urna posuere sodales. Curabitur pede pede, molestie id, blandit vitae, varius ac, purus. Morbi dictum. Vestibulum adipiscing pulvinar quam. In aliquam rhoncus sem. In mi erat, sodales eget, pretium interdum, malesuada ac, augue. Aliquam sollicitudin, massa ut vestibulum posu

Vikikitap Flagged revisions veya kısaca flaggedrevs isminde bir yazılım eklentisine sahiptir. Bu eklenti kullanıcılara sayfaları değerlendirme ve bir kalite notu verme imkanı tanır. Okur ve editörler en iyi eleştirmenlerdir. Çünkü bu iki grup Vikikitap'taki birçok sayfayı görür. Yazarlar, daha çok kendi yazdıkları kitap üzerine odaklanmaya eğilimlidir; hizmetlilerin de daha önemli işleri vardır.
"Editör" veya "eleştirmen" yetkisine sahip kullanıcılar Flaggedrevs ile değerlendirme ve not verme yetkisine sahiptir. Editör yetkisi, Vikikitap'ta belirli bir süreyi geçirmiş ve belirli sayıda katkı yapmış olan kullanıcılara otomatik olarak verilir. Editör yetkisine daha erken sahip olmak veya aktif bir kullanıcı olmayıp bu yetkileri edinmek istiyorsanız bu isteklerinizi Vikikitap:İzin istekleri sayfasına yazın.
Flaggedrevs'te üç tane değerlendirme kriteri vardır: nitelik, doğruluk ve kapsam. Nitelik yazının kalitesidir; devrik ve karmaşık cümleler, imla hataları, biçimlemenin güzel olmaması veya hatalı olması vb. birer nitelik sorunudur. Doğruluk, yazının doğruluğu ve kanıtlanabilirliğidir. Kapsam ise konunun ne kadarının hangi derinlikte incelendiği ile ilgilidir. Her kriterde 5 tane kalite seviyesi vardır: zayıf, idare eder, iyi, harika, seçkin. "Seçkin" notu en iyi sayılan ve diğer sayfaların örnek alması gereken sayfalara verilir. Editör yetkisine sahip kullanıcılar bir sayfayı zayıf, idare eder veya iyi olarak işaretleyebilirler. Eleştirmenler ise sayfayı harika veya seçkin olarak işaretleyebilirler. Bu yüzden eleştirmenler dikkatli bir göze sahip olmalı Vikikitap'ın konuyla ilgili tartışmalarına aşina olmalıdır. Vikikitap:Seçkin kitaplar ve Vikikitap:Silme istekleri sayfaları Vikikitap'taki kitapların kalitelerini tartıştığımız yerlerdir.

Eğer izniniz varsa bir sayfayı değerlendirmek kolaydır. Değerlendirilebilen sayfaların alt kısmında içerisinde çeşitli kontroller ve bir "Kaydet" düğmesi olan bir kutu vardır. Bir sayfayı değerlendirmek için kutudaki uygun notu seçin ve "Kaydet" düğmesine tıklayın. Bazı durumlarda neden o notu verdiğiniz yazılı bir açıklama ile istenebilir.
Eğer notunuz için bir açıklama yapmışsanız verdiğiniz notla yaptığınız açıklama birbirine paralel olmalıdır. Yani yaptığınız açıklama "zayıf" olup verdiğiniz not "idare eder" olmamalıdır. Ayrıca en az bir "zayıf" notu olan bir sayfa kararlı sayılmaz. Bir sayfanın kararlı sayılması için nitelik, doğruluk ve kapsam kriterlerinde en az "idare eder" notunu almış olması gerekir. Bu kriteri sağlamayan sayfalar "kararlı değil" kabul edilir ve bu sayfaya yapılan tüm katkılar (editör yetkilerine sahip olmayanlar tarafından yapılanlar bile) anında sayfada görünür.

Bir sayfa, her birinde 5 ölçüt olan 3 farklı kategoride değerlendirilir. Bu üç kategori kapsam, doğruluk ve niteliktir. Bir sayfanın nasıl değerlendirildiğini bilmek demek bütün bu kategorilerin ne demek olduğunu ve bu kategorileri kullanarak kitapların nasıl değerlendirildiğini bilmek demektir. Her kriterdeki notlar sadece bir nottan fazlasıdır, bu notlar ilgili kitabı seçkin kitap yapmak isteyen vikiyazarlar için bir kontrol listesi mahiyetindedir. Vikiyazarlar bu notlara bakıp kitabın hangi noktalarda gelişmeye ihtiyaç duyduğunu anlayabilirler. Eğer bir kitabın bütün sayfalarına "seçkin" notu verilmişse kitap kolaylıkla seçkin kitap adayı gösterilebilir. Ancak elbette ki bir kitabın bütün sayfalarına seçkin notu verilmiş olması otomatikman o kitabın bir seçkin kitap olacağı anlamına gelmez. Bir kitabın seçkin olması için sayfalarının düzgün sıralanmış olması, mantık ve süreklilik yönünden birbiriyle ilişkili olması gerekir. Eğer böyle bir durum söz konusu değilse kitap, bir kitaptan ziyade birden fazla ansiklopedi maddesinin birleşimi mahiyetinde olacaktır ve kitaplaşması için üzerinde çalışılması gerekecektir.

Nitelik bir sayfanın en temel kalite ölçütüdür: Bu ölçütte "sayfa ne kadar iyi yazılmış?" sorusunun cevabı aranır. Vikikitap metin tabanlı bir sitedir, bu yüzden buradaki her şey yazım kalitesi etrafında döner. Bir vikide her şeyin ilk yazıldığında mükemmel olması beklenmez. Bunun yerine editör ve yazarların küçük küçük katkılarla sayfayı yavaş yavaş geliştirmeleri beklenir. Nitelik bakımından iyi olan bir sayfanın imla veya gramer hatası içermemesi, akıcılığı ve devamlılığı olması ve yapısal hata içermemesi gerekir. Okuyucular uzun paragraflardan nefret ederler. Metin; alt başlıklar, listeler, şablonlar, tablolar ve resimler ile daha kolay okunur hale getirilmelidir.

Bilgi ne kadar doğruysa o kadar iyidir. Yani bir bilginin "iyi"liği için tek ölçüt doğru olmasıdır. Bir sayfa iyi yazılmış ve iyi kapsamlı, ancak doğru olmayan ve yanıltıcı bilgilerle doluysa bizim için bu sayfanın değeri sıfırdır. Vikikitap eğitici bir kaynaktır ve okuyuculara doğru bilgi öğretmek için vardır. Doğruluk ölçütü, sayfadaki bilgilerin ne kadar doğru ve güvenilir ve bir eğitici materyal olmaya ne kadar uygun olduğunu gösterir. Doğruluğun beş seviyesi vardır:

Kapsam, sayfada bulunan bilginin miktarı ile ilgilidir. Mevcut bilgi ile olması gereken oranlanarak kapsam notu verilir. İyi kapsam, sayfada niyetlenilen her şeyin son derece ayrıntılı bir şekilde anlatıldığını ifade eder. Örneğin "Aritmetik" ismindeki bir sayfanın sadece toplamayı anlatması, "Hayvanlar" ismindeki bir sayfanın sadece memelileri anlatması, birçok konu hakkında kısa kısa ve ilginç olmayan bilgiler içeren sayfalar kapsam notu kötü olan sayfalardır. Kapsamın 5 seviyesi vardır:

Vikikitap iş birliğiyle kitap yazmak amacıyla başlatılmış bir projedir. Vikikitap iş birliğine açık yapısı nedeniyle grup projeleri için son derece uygundur. Geçmişte Vikikitap'ta bu tür grup projeleri gerçekleştirilmiş ve son derece de başarılı olmuştur. Bu projelerden bazıları sınıf projeleri listesinde listelenmiştir. Bu liste kapsamlı değildir, ancak eğer yeni bir grup projesi başlatacaksanız bu projenizi listeye eklerseniz mutlu oluruz.
Bu sayfa sınıf ve grup projeleri için bir hızlı başlangıç rehberi olma özelliğine sahiptir. Grup lideri veya sınıf öğretmeninin projeyi başlatmadan önce bu sayfayı okuması şiddetle tavsiye edilir. Ayrıca bazı kısımları da katılımcıların (örneğin öğrencilerin) okuması önerilir. Vikikitap aktif bir topluluktur, ancak isterseniz projeniz ve katılımcıları ile Vikikitap topluluğu arasındaki etkileşim kesilebilir.

Bir sınıf projesi başlattığınızda projenin kapsamını belirtmek önemlidir: Kitap(lar)ın isim(ler)i ne olacak? Kitap(lar) ne tür içerik barındıracaklar?  Konular hangi derinlikte incelenecek? Hedef kitle kim? Her şeyin düzgün işlemesini sağlamak için sınıf projenizi başlatmadan önce bütün bu soruların cevaplanması gerekiyor. Eğer sınıf üyeleri farklı bölümlerde eş zamanlı olarak çalışacaklarsa her bölümün içeriğini ve -varsa- her bölümün içermesi gereken kısımları (sözlük gibi) belirlemek önemlidir.
Ayrıca gözden geçirmeniz gereken yasal konular da var. Vikikitap'taki metinler, resimler ve diğer materyaller GNU Özgür Belgeleme Lisansı, 1.2 versiyonu ile lisanslanır. Projenizdeki bütün katılımcılar katkılarını bu lisans ile lisanslamayı kabul etmiş olmalıdırlar. Gruplar veya tek tek katılımcılar katkılarını GÖBL ile uyumlu başka bir lisans ile de lisanslayabilirler, ayrıca isteyenler katkılarını kamu malı olarak da lisanslayabilirler. Bütün bu seçenekler kabul edilebilir.
Eğer grubunuz kitap yazmak yerine her türlü eğitici materyal hazırlamak istiyorsa bu durumda projenizi Vikiversite'de organize etmelisiniz. Vikiversite, Vikikitap'la ilgili olan ancak amacı kitap yazmak yerine her türlü eğitici materyal hazırlamak olan bir topluluktur.

Projedeki bütün katılımcıların, özellikle proje liderinin, Vikikitap'a kaydolmaları gerekir. Bir kullanıcı Vikikitap'a kaydolduğunda kişisel bilgilerini yazabileceği bir kullanıcı sayfasına, diğerlerinden mesaj alabileceği bir kullanıcı mesaj sayfasına ve o kullanıcı tarafından yapılan katkıların kistelendiği bir katkı geçmişi sayfasına sahip olur. Grup liderleri için kuşkusuz en önemli sayfalar katkı geçmişi sayfalarıdır, çünkü bu sayfalar belirli bir kullanıcının Vikikitap'ta neler yaptığını listeler. Ancak şunu hatırlatmak isteriz ki bu sayfalar, kullanıcının yaptığı katkıların kendi çalışması mı, yoksa kopyala-yapıştır yoluyla mı olduğu konusunda bir fikir vermez. İşte bu nedenle sınıf liderinin zamanının büyük kısmında öğrencilerinin eser hırsızlığı yapıp yapmadığını denetlemesi gerekebilir.
Projenizi Vikikitap:Sınıf projelerinin listesi sayfasına ekleyin, bu sayede Vikikitap topluluğu projenizi takip edebilir ve size ekstra yardımda bulunabilir. Bu sayfada katılımcılarınızın kim olduğunu (bir sınıf, bir öğrenci grubu, vb.), ve hedeflerinizin ne olduğunu (yeni bir kitap yazmak, var olan bir kitabı geliştirmek, vb.) belirtin.

Vikikitap bir eğitmen değildir ve size öğrencilerinize hangi notları vereceğinizi söyleyemez. Ayrıca Vikikitap'ı bir sınıf projesi için kullanan eğitmenlerden deneyimleriyle ilgili geribildirim bırakmalarını istemekteyiz, bu geribildirimlerden bazılarını yararlı öneriler olarak derledik.
Öğrenci projeleriyle ilgili yaygın sorunlardan biri, öğrencilerin dikkatlerini kendi çalışmaları üzerinde çok fazla yoğunlaştırmalarıdır. Öğrencilerinizi, diğer grupların veya öğrencilerin yazmış olduğu materyalleri de değiştirmesi, okuması, gözden geçirmesi için cesaretlendirin. Diğerlerini çalışmalarını değerlendirmek, öğrencilerinizi kendi çalıştıkları konuların yanında başka konularda da bilgi sahibi olmaları konusunda cesaretlendirebilir, ayrıca yaratıcı süreci daha ilerilere götürebilecek olumlu geribildirimler oluşturabilir. Viki sisteminin basit yapısı, katılımcıların vakitlerini biçim ve sunumdan çok içeriğe odaklamalarını sağlar. Bu sayede katılımcılar yazarken öğrenir. Ancak bu iki kelime birbiriyle ilişkili olmasına rağmen eş anlamlı değildir. Öğrencilerinizin yazarken öğrendiğinden emin olmak için sayfa geçmişlerinden işleri nasıl yürüttüğünü ve kendisine yöneltilen eleştiri ve yorumlara nasıl cevap verdiğini görebilirsiniz. Öğrencilerin ne zaman, hangi katkıyı yaptığını gösteren geçmiş sayfaları sayesinde hangi öğrencilerin son derece disiplinli ve çalışkan olduğunu, hangi öğrencilerin de işini son dakikaya bıraktığını daha kolay anlayabilirsiniz.
Öğrencilerinizle iletişim kurmak için kitabınızın tartışma sayfalarını ve öğrencilerinizin kullanıcı mesaj sayfalarını kullanın, ancak kitabınızın tartışma sayfasının asli vazifesi kitabın içeriğini geliştirmeye yönelik kitap hakkındaki tartışmalardır. Öğrencilerinizden önemli sayfaları (özellikle sınıf öğretmeninin kullanıcı mesaj sayfasını) izleme listelerine eklemelerini isteyin. Bu şekilde birisi öğretmenin mesaj sayfasına bir mesaj bıraktığında o sınıftaki herkes o mesajdan haberdar olabilir. Öğrencilerinizden sadece kendi işleriyle ilgilenmelerini değil, ayrıca başka öğrencilerin de çalışmalarını okuyup eleştirmelerini isteyin. Öğrencilerinize birbirlerine gramer, imla, biçim ve üslup konusunda yardımcı olmalarını söyleyin. Öğrencilerin hem kendi görevlerini yerine getirmeleri, hem başkalarının çalışmalarına yorum yapmaları ve -varsa- başkalarının yanlışlarını gidermeleri öğrencilerin projenin gereklerini tam anlamıyla yerine getirdiklerini gösterir. Her öğrencinin katkılar sayfası ilgili öğrencinin Vikikitap'ta yaptığı her türlü katkıyı (kitap yazımı, başkalarının hatalarını düzeltme, tartışma yapma, eleştiri vs.) listeler. Ancak bu liste öğrencilerin e-posta, telefon veya anında mesajlaşma yoluyla yaptıkları iletişimi göstermez, bu nedenle öğrencilerin kendi aralarındaki iletişimi sadece Vikikitap arayüzü üzerinden yapmalarını isteyin, bu sayede yaptıkları bütün iletişim faaliyetleri kayıt altına alınabilir.
Eğer bütün öğrenciler farklı bir sayfa veya konuda çalışıyorlarsa sınıfı tek bir konu üzerinden sınava tabi tutmak zor olabilir. Ancak eğer bütün sınıf tek seferde sadece tek bir sayfa veya konu üzerinde çalışıyorlarsa bu sefer de herkesin eşit miktarda katkıda bulunabilmesi oldukça zorlaşır. Sınıfınız için belirli yönergeler, son teslim tarihi ve not verme kriteri belirlediğinizden emin olun. Eğer herkes aynı hızda ilerler ve belirli noktalara aynı zamanda gelirlerse herkese belirli değerlendirme ölçütlerine göre not vermek kolaylaşır. Zaman çizelgesini ve not verme kriterini bir referans olarak kitabınızın tartışma sayfasına yazmanız kuşkusuz sizin ve sınıfınızın yararınadır.
Eğer sınıf lideriyseniz ve bize geribildirim bırakmak istiyorsanız, bundan memnun olacağız. Yorum, öneri ve endişelerinizi sınıf projeleri tartışma sayfasına yazın.

Vikikitap'a sıradan gönüllüler tarafından katkıda bulunulmaktadır. Bu insanlar (Vikikitap kadrosu da diyebiliriz) sınıf projenize yardımcı olmaktan mutluluk duyacaklar ve muhtemelen katılımcılarınızın her türlü sorusuna cevap vermekten imtina etmeyeceklerdir. Ayrıca eğer sizin de grup lideri olarak soru(nu)nuz varsa bunu köy çeşmesinde dile getirmekten çekinmeyin. Bazen de Vikikitap kadrosu size veya katılımcılarınıza soru sorabilir, bu tür yazışmalar son derece kibar olacaktır. Bir öğrenciniz yanlış anlaşılabilecek bir şey yaptığında Vikikitap kadrosundan birisi ilgili yanlış anlaşılabilecek şeyi düzeltmeden önce katılımcınıza yaptığı şeyi ne amaçla yaptığını sorabilir. Eğer sizin veya katılımcılarınızın yaptığı bu tür şeylerin Vikikitap topluluğunca düzeltilmesini istemiyorsanız size veya katılımcınıza mesaj gönderen kişiye bu durumu bildirin.
Vikikitap aktif bir topluluktur, sizin veya öğrencilerinizin toplulukla iletişim kurabilecekleri çok çeşitli mecralar vardır. Öğrencilerinizin projeye başlamadan önce bilmesi gereken en önemli şeylerden birisi burasının bir topluluk olduğudur. Topluluk çeşitli faydalar sağlar, ancak katılımcılara çeşitli sorumluluklar da yükler. Eğer siz veya öğrencileriniz Vikikitap politikaları ihlal ederlerse, veya birbirlerine veya topluluğa karşı saygısız bir üslup benimserlerse disiplin kuralları işlemeye başlayabilir.
Topluluk muhteşem bir kaynak olabilir. Sorularınızı cevaplayabilir ve kitabınızın yazım sürecine yardımcı olabiliriz. Muhtemelen topluluk bazı konularda sizden daha bilgili olacaktır size bu konularda yardım edebileceklerdir. Topluluk kitabınızın daha hoş ve profesyonel görünmesini sağlayabilir ve hatta işinizi daha üretken hale getirebilirler. Eğer bir şeye ihtiyacınız varsa bunu istemekten çekinmeyin.

Vikikitap açık içeriklidir. Yani herkes hemen hemen herhangi bir zamanda her sayfayı değiştirebilir. Yani eğer sınıfınız bir kitap üzerinde çalışıyorsa dünyanın dört bir yanındaki insanlar kitabınızın yazımına yardım edebilirler. Birçok kez bu yardımlar imla, gramer veya biçim alanındaki küçük değişikliklerdir, ancak bazen de katkı büyük olabilir ve projenizi tamamen etkileyebilir. Bariz vandalizm dışındaki iyi niyetli katkılar geri alınmayacak veya kısıtlanmayacaktır.
Kendi öğrencileriniz ve diğer kullanıcılar tarafından yapılan katkıları ayırt etmek için geçmiş sayfalarını kullanın. Geçmiş sayfaları ilgili sayfaya yapılan katkıları, bu katkıları kimin yaptığı ve katkı zamanlarını listeler. Bir sayfanın geçmişini sayfanın üst kısmındaki "geçmiş" düğmesine tıklayarak görebilirsiniz.
Siz ve öğrencileriniz kendi görevleri yanında Vikikitap'taki diğer sayfalarda da değişikliklik yapabilirler, grup üyeleri diğer sayfalara katkıda bulunurken grup liderinin koyduğu kurallara uymak zorunda değildirler.

Vikikitap, kullanıcılarının uyması gereken kurallara sahiptir. Grup lideri olarak bu kurallardan bazılarına aşina olmanız önemlidir, çünkü bu kurallar projenizi önemli ölçüde etkileye

Vikikitap'taki kararları Vikikitap'a katkıda bulunan herkes alıyor. Kararlar alındıktan sonra da bu kararlar politikalar veya yönergeler hâline gelip topluluğun uymak zorunda olduğu yazılı belgeler haline geliyorlar. Bir kullanıcı hesabı edinerek siz de bu kararlarda söz sahibi olabilirsiniz. Sözün tamamen kullanıcılarda olduğu bu yapısı, Vikikitap'ın çok demokratik bir ortam olmasını sağlıyor.

Vikikitap'ta -birçok devletin karar alma mekanizmasının aksine- lider niteliğindeki kişiler yoktur. Diğer bir deyişle Vikikitap'taki herkes liderdir.
Vikikitap'taki kararlar "konsensüs" denilen bir metotla alınır. Konsensüste birinci şart herkesin üzerinde fikir birliğine vardığı bir uzlaşmadır. Önce birisi Vikikitap'ta bir şeyi değiştirmek istediğini belirten bir konu açar. Sonra diğer kullanıcılar ilgili değişiklik hakkında yorumlarını yapar. Kullanıcılar ilgili değişiklikliği neden istediğini veya istemediğini mantıklı argümanlarla açıklamaya çalışırlar. Sonra konuyu açan kişi ilgili değişikliği istemeyen kullanıcıyı ikna etmek için kendi mantıklı argümanlarıyla savunma yapabilir. Ancak bütün bunlarda birinci planda tutulması gereken şey mantıktır. Yani kişisel inanç, zevkler, kişisel istekler bu tür tartışmalarda geçersizdir.
Vikikitap'ta oylama nadiren yapılır. Genellikle tartışma oylamaya yeğlenir. Yalnızca bazı özel durumlarda oylamaya başvurulur. Bunlardan bazıları şunlardır:

Hizmetli, bürokrat vb. seçimi gibi mantık çerçevesinde tartışma imkanının sınırlı olduğu veya hiç olmadığı durumlar.
Topluluğun onayı kesin olan, ancak sadece işi resmileştirmek için formalite amacıyla açılan oylamalar.
Mantık çerçevesinde tartışmanın imkansız olduğu diğer durumlar. Örneğin bir sayfanın yeni tasarımının güzel olup olmadığı gibi yalnızca beğeniye hitap eden durumlar.
Bunların dışında mantık ekseninde tartışılabilecek tüm konularda oylama yerine tartışma yapılır. Ayrıca oylamalarda "oyların % 51'ini alan kazanır" gibi bir durum söz konusu değildir. Oyların en azından % 70'inin olumlu olması gerekir ve ayrıca ilgili oylamada kullanılan oyların önceden belirlenen şartların tamamını sağlanmış olması gerekir. Her oylamanın kendine özgü şartları olabilir.

Vikikitap'taki merkezî tartışma noktası köy çeşmesidir. Sadece bir kitapla veya sayfayla ilgili olmayan, Vikikitap'ın genelini ilgilendiren tüm tartışmalar ve oylamalar burada yapılır.

Tıpkı diğer sayfaları değiştirdiğiniz gibi köy çeşmesi sayfasını da değiştirebilirsiniz. Ancak köy çeşmesi sayfasını sadece soru, görüş, istek vb. eklemek için kullanabilirsiniz. Köy çeşmesinin mevcut içeriğini değiştiremez veya silemezsiniz. Ayrıca köy çeşmesine eklediğiniz mesajınızın sonuna dört tilde (~~~~) koyarak imza atmayı unutmayın.

Gramer, imla ve biçimlendirme hatalarının düzeltilmesi Vikikitap'ın en çok ihtiyaç duyduğu katkı biçimlerinden biridir. Ancak, sıradan kullanıcıların yapabileceği daha başka birçok bakım ve organizasyon görevleri de vardır. Genel bakım projelerini öğrenmek için Vikikitap:Bakım sayfasına bakabilirsiniz. Ayrıca Vikikitap:Tüm kitaplar sayfası çeşitli organizasyonel projeler için merkezi bir noktadır.
Bir kitabın yardıma ihtiyacı olduğunu belirtmek için kullanılan çeşitli şablon mesajlarının bir listesi Vikikitap:Şablon mesajları sayfasında bulunur. Yardıma ihtiyacı olan bir kitap bulduğunuzda, bundan başkalarını da haberdar etmek için kitabı uygun bir şablonla etiketleyin.
Bu sayfada bazı çok bilinen temizlik ve bakım görevlerini anlatacak, ancak sadece hizmetlilerin yapabileceği görevleri anlatmayacağız.

Bir bakım görevini gerine getirirken bunun hakkında bilgilenmek isteyen başka insanlar da olacaktır. Sorunlu bir sayfa bulduğunuzda o sorunu yaratan kişiye sorunla ilgili bir mesaj göndermeniz faydalı olabilir. Örneğin bir kullanıcı lisansı olmayan bir resim yüklemişse ilgili kullanıcıya mesaj göndererek bu sorundan haberdar ediniz.
Eğer lisanssız resimleri veya hızlı silinmesi gereken sayfaları etiketlemeye başlamışsanız bu sayfaları/resimleri ayrıca hizmetli panosunda bildirmeniz güzel olacaktır, böylelikle hizmetlilerin durumdan haberi olabilir.
Eğer bir sayfayı {{yanlışlıkla}}, {{temizlik-ap}}, {{temizlik}}, {{tba}}, {{tartışmalı}} ve {{genişlet}} gibi çeşitli temizlik şablonlarıyla veya çeşitli taşıma, birleştirme şablonlarıyla etiketlemişseniz ilgili şablonu yapıştırdığınızı ve neden yapıştırdığınızı ilgili sayfanın tartışma sayfasında dile getirmeniz çok güzel olacaktır.
Yani kısaca insanlarla iletişim halinde kalmak çok önemlidir.

Ana madde: Vikikitap:Yeni sayfaları denetlemek
Vikikitap'ta sayfalar çeşitli sorunları bulmak için çeşitli şekillerde denetlenir. Sorunları denetlemenin en iyi yollarından biri  Özel:Yenisayfalar sayfasını izlemektir. Eğer bir sayfa ileride problem teşkil edecekse genelde ilk oluşturulduğu zaman bunu belli eder. Bir sayfanın yanlışlıkla oluşturulduğunu düşünüyorsanız {{yanlışlıkla}} şablonunu, sayfanın silinmesini gerektiğini düşünüyorsanız {{sil}} şablonunu, sayfanın genel bir yardıma ihtiyacı olduğunu düşünüyorsanız {{temizlik}} şablonunu kullanın. Ancak bütün bu şablonları son derece dikkatli kullanın ve daima Wikimedia Vakfı'na en çok faydası dokunacak yolu seçin. Örneğin bir sayfada biraz içerik var, ancak bu içerik Vikikitap'a uygun değilse, sayfaya direkt "sil" şablonu yapıştırmak yerine başka bir Wikimedia projesine taşınıp taşınamayacağını düşünün. Eğer taşınabileceğine karar verdiyseniz {{transwiki}} şablonunu kullanın.
İçeriği olmayan veya mantıklı içeriği olmayan kısa sayfaları Özel:KısaSayfalar sayfasını kullanarak bulabilirsiniz, içeriği olmayan sayfalar genelde silinebilir. Boş olmayan ancak kısa içerikli olan sayfalara {{taslak}} şablonunu, zengin içeriği olup bazı bölümleri kısa olan sayfalara {{bölümtaslak}} şablonunu (sadece ilgili bölüme) yapıştırabilirsiniz.

Son yüklenen resimleri görmek için yükleme kaydını kullanabilirsiniz. Tıpkı sayfalarda olduğu gibi, resimler de ileride bir problem teşkil edecekse genelde bunu ilk yüklendiği zaman belli eder. Vikikitap'a yüklenen her resmin geçerli bir lisans etiketi olmalıdır, belirli bir lisans etiketi olmayan resimlere {{subst:nld}} şablonu yapıştırılır. Bu sayede hizmetliler, ilgili resmin potansiyel bir telif hakkı ihlali olduğu ve ilgilenilmesi gerektiği konusunda bilgileneceklerdir.
İçerisinde telif hakkı saklı metin bulunan bir sayfa gördüğünüzde {{telif}} şablonunu kullanın. Bunu yaparken iddianıza kanıt sunmayı da ihmal etmeyin. Eğer sayfada telif ihlali yok ancak içeriğin doğruluğunu kanıtlayacak kaynaklar konusunda eksikliği varsa {{kaynaksız}} şablonunu kullanın. Eğer sayfa başka bir Vikikitap sayfasından kopyala+yapıştır yöntemiyle aktarılmışsa {{önceki geçmiş}} şablonunu kullanarak sayfanın önceki konumu konusunda diğer kullanıcıları bilgilendirin, bu şablonu kullanırken GÖBL'e çok dikkat edin.
Hiçbir kitapta kullanılmayan resimleri Özel:KullanılmayanDosyalar sayfasında görebilirsiniz. Hiçbir kitapta kullanılmayan adil kullanım resimleri silinmeye aday gösterilebilir ({{sa}}) veya hatta hızlı silinebilir.
Vikikitap'a yüklenmiş özgür lisanslı resimleri Wikimedia Commons'a taşıyabilirsiniz. Bu işlemi CommonsHelper gibi araçlarla daha kolay yapabilirsiniz. Bir resmi siz veya bir başkası Commons'a taşıdığında bunu diğer kullanıcılara bildirmek için {{artıkcommonsta}} şablonunu kullanın.

Vikikitap'ta, birden fazla kitabın veya sayfanın birleştirilmesi gerektiğini belirten {{birleştir}}, {{şununlaBirleştir}}, {{şunuBirleştir}} ve {{bölüm birleştir}} şablonları vardır. Sayfanın yeni bir konuma taşınması gerektiğini ise {{taşı}} şablonu ile belirtiriz. Bu şablonlar konuyla ilgilenen diğer vikiyazarlara ilgili sorunu bildirmek için kullanılır. Taşıma veya birleştirme işlemine başlamadan önce ilgili şablonun sayfada bir hafta veya daha fazla kalması gerekir. Taşıma/birleştirme işlemini gerçekleştirdikten sonra bu durumu {{birleştirildi}} ve {{taşındı}} şablonlarıyla diğer kullanıcılara bildirin.

Her yeni kitap {{yeni kitap}} şablonuyla etiketlenmelidir. Bu sayede topluluk ilgili kitabın yeni oluşturulduğunu anlar ve kitap otomatik olarak "yeni kitaplar" listelerine eklenir. Yeni kitaplar ayrıca uygun bir kategoriye de koyulmalıdır. Bir kitabı belirli bir kitaplığa eklemek için {{kitaplık}} şablonunu kullanın. Bütün kitaplıkların listesini Vikikitap:Kitaplıklar sayfasında bulabilirsiniz.
Kitapların her sayfası da belirli bir kitap kategorisine koyulmalıdır. Kitabın ismi "Benim Kitabım" ise kitabın her sayfası "Kategori:Benim Kitabım" kategorisine konmalıdır. {{kitaplık}} şablonu kitabın sadece ana sayfasına konurken kategori kodları kitabın her sayfasına konmalıdır. Bu kurallara uymak çok önemlidir, aksi takdirde Vikikitap'ın organizasyon sisteminde karışıklığa neden olursunuz. Sayfaları hangi kitap kategorisine koyacağınızı veya bir sayfayı belirli bir kategoriye nasıl koyacağınızı bilmiyorsanız kitaptaki her sayfaya {{KitapKat}} şablonunu yapıştırın. Bunun sonucunda kitabın her sayfası otomatik olarak uygun kategoriye eklenecektir.

Yalnız sayfalar kendisine hiç bağlantı verilmemiş sayfalardır. Yalnız kitaplara -henüz yapıştırılmamışsa- {{kitaplık}} şablonunu yapıştırın. Yalnız sayfaların listesini Özel:YalnızSayfalar sayfasında, yalnız resimlerin listesini ise Özel:KullanılmayanDosyalar sayfasında bulabilirsiniz.

Yalnız adil kullanım resimleri silinebilir.
Yalnız "GÖBL sanılan" resimler silinebilir.
Yalnız özgür lisanslı resimlerin Commons'a taşınması tavsiye edilir.
Yalnız sayfalara gerekli ise {{birleştir}}, {{taslak}} ve/veya {{sil}} şablonları yapıştırılabilir.

Vikikitap'ta birkaç değişiklik yapan yeni bir kullanıcıya kayıtlı bir kullanıcı olup olmama durumuna göre {{anonim hoşgeldin}} veya {{hoşgeldin}} şablonlarından biri ile "hoş geldin" denilebilir. Yeni kullanıcıların köy çeşmesinde kendilerini ve projelerini tanıtmaları teşvik edilmelidir. Deneyimli kullanıcıların da Vikikitap:Köy çeşmesi sayfasını izleme listesine almaları ve orada sorulan sorulara cevap vermeleri tavsiye edilir.
Yanlış davranışlarda bulunan veya Vikikitap politikalarıyla uyuşmayan değişiklikler yapan yeni kullanıcılar, mesaj sayfalarına {{denemeyapma}}, {{barizvandalizm}}, {{hayırteşekkürler}}, vb. şablonları göndermek suretiyle uyarılmalıdır. Uyarılara rağmen kötü davranışına devam eden kullanıcılar bir hizmetliye bildirilmelidir.

Bozuk yönlendirme, olmayan bir sayfaya yapılan yönlendirme; çift yönlendirme ise, yönlendirme sayfasına yapılan yönlendirme demektir. Çevrimsel yönlendirmeler de (A sayfasının B'ye, B sayfasının A'ya yönlendirilmesi) bir çift yönlendirme türüdür.

Bozuk yönlendirmeler Özel:BozukYönlendirmeler
Çift yönlendirmeler de Özel:ÇiftYönlendirmeler sayfasında listelenir.

Genelde, bilgilerini burada paylaşmak isteyen yeni kullanıcılar yeni bir kitap başlatma eğilimindedirler. Ancak bu her zaman iyi bir fikir olmayabilir. Vikikitap'ta birçok konuda birçok kitap vardır. Yeni kitap başlatmadan önce Vikikitap'ta, konusu yazacağınız kitabın konusuyla eşleşen bir kitap olup olmadığını araştırmalısınız.
Yazmayı planladığınız konuyu anlatan ve hedefi hedeflerinizle örtüşen bir kitap bulduğunuzda öncelikle bu kitaba katkıda bulunmayı deneyin. Aynı konuyu işleyen birden fazla kitap yazmaktansa insanların güçlerini birleştirip tek bir kitaba odaklanması çok daha güzel ve kaliteli işlerin ortaya çıkmasını sağlayacaktır.
Bu sayfada var olan kitaplara nasıl katkıda bulunacağınız anlatılacaktır. Ancak bu, vikiyazarların Vikikitap'ta yapabileceği tek şey değildir. Bu kitabın daha sonraki bölümlerinde yeni kitapların sıfırdan nasıl yazılacağı da anlatılacaktır.

Her kitabın bir tanıma ihtiyacı vardır. Kitap tanımı, kitabın hedeflerini ve hangi doğrultuda gelişeceğini anlatır, bu sayede vikiyazarlar kitap üzerinde ortaklaşa çalışabilirler. Bir tanım bariz veya dolaylı olarak aşağıdaki bilgileri içermelidir:

Hedef kitle
Kitap kimin için yazılıyor? Farklı hedef kitleleri farklı arkaplan bilgisine sahiptir, ki kitap da bu arkaplan üzerine oturtulur. Bazen belirli bir hedef kitlesi yerine ön gereklilikleri (kitabı okumaya başlamadan önce bilinmesi gereken şeyler) belirtebilirsiniz. Kitabı okuyan herkesin aynı seviyede olduğundan emin olduğunuzda bir sürü arkaplan bilgisi anlatmaktan kurtulmuş olur ve daha ileri bilgileri yazmaya odaklanabilirsiniz.
Konu
Kitabınız ne hakkında?
Kapsam ve derinlik
Hangi konu hakkında yazdığımızı biliyoruz, ancak konunun ne kadarını hangi derinlikte kapsayacağız? Hangi detayları anlatacağız veya anlatmayacağız? Kapsam konunun ne kadarını anlatacağımızı, derinlik ise konuda ne kadar detaya ineceğimizi belirtir.
Aynı konudaki iki kitabın birbirinden tamamen farklı tanımları olabilir. Hedefinizdeki kitabın konusuyla aynı konuya sahip, ancak tanımı hedefinizdeki tanımla uyuşmayan bir kitap varsa yeni bir kitap başlatabilirsiniz. Eğer kitabın tanımı da hedefinizle uyuşuyorsa bu sefer o var olan kitaba katkıda bulunmanız, yeni bir kitap başlatmamanız tavsiye edilir.

Eğer kitaba aktif olarak katkıda bulunan kimse kalmamışsa sorumluluğu üstünüze alın ve kitabın gelişebileceği konularda elinizden geldiğince katkıda bulunun. Varsa yerel biçimlendirme rehberini (bazı kitaplarda bu rehber çok kapsamlı olur) okuyun, bu sayede ekleyeceğiniz yeni içerik kitabın mevcut içeriği ile uyumlu olacaktır. Genelde kitabın mevcut biçemini temel alarak yeni biçemleri bu biçem üzerine oturtmak, bütün biçemi değiştirip sıfırdan yeni bir biçem oluşturmaktan daha iyidir. Bazen, kitabın görünümündeki çok büyük değişiklikler kitabın sadece bazı şablonlarını değiştirmekle elde edilir. Ancak çok kullanılan şablonlarda değişiklik yaparken temkinli olun, çünkü ilgili değişiklik aynı şablonu kullanan başka kitapları olumsuz etkileyebilir.
Birçok kitabın yerel biçem rehberi yoktur. Bu durumlarda, kitabın ihtiyaç duyduğu her türlü katkıyı yapmakta özgürsünüz. Burada akılda bulundurmanız gereken tek şey altından kalkamayacağınız işlere girişmemeniz. Örneğin yerel biçem rehberi olmayan bir kitabın biçemini daha güzel olacak şekilde değiştirmek istediniz ve işe giriştiniz. Kitabın yarısının biçemini değiştirdikten sonra sıkıldınız ve işi boşladınız. Tahmin edersiniz ki böyle bir durum hiç hoş olmayacak ve hatta kitabı ilk aldığınızdaki hali şimdiki halinden daha iyi olacaktır.
Kitapları geliştirirken cesur olun ve büyük değişiklikler yapın. Bir kitabı daha güzel yapmak için sayfa taşımak, sayfa silmek veya sayfanın içeriğini tamamen değiştirmek gerekiyorsa bu değişiklikleri yapmakta tereddüt etmeyin. Elbette kitaba katkıda bulunan başka insanlar da varsa bu tür büyük değişiklikleri yapmadan önce onlarla tartışıp fikir birliğine varmanız daha hoş olacaktır.

Vikikitap, imece usulüyle işleyen bir düzenektir ve katıldığınız birçok kitap projesinin mevcut katkıcıları olacaktır. Bu katkıcıların farklı çalışma programları, aktiflik seviyeleri ve kazanılmış hakları olabilir. İlgili kitaba yaptığınız büyük değişiklikler kitabın önceki katkıcılarının hoşuna gitmeyebilir.
Mevcut katkıcıları olmayan kitapları düzenlemek kolaydır. Bir sayfa bulur ve istediğiniz değişiklikleri o sayfaya yaparsınız. Mevcut katkıcıları olan kitaplarda ise (ilgili katkıcılar sadece izleyici olsa bile) durum bir hayli farklıdır. Birden fazla insanın aynı kitap üzerinde çalıştığı durumlarda iletişim ve iş birliği çok önemli hale gelir. Diğer insanların fikirlerine önem verin, başkalarının katkılarını geliştirin ve başkalarının da sizin katkılarınızı geliştirmelerine müsaade edin. Genelde birden fazla yazarın üzerinde çalıştığı kitaplar, tek bir yazarın yazdığı kitaplara oranla daha hızlı bir kalitelileşme süreci yaşarlar.
Tek yazarı olan kitaplar, yalnızca yazarının gücü yettiği/önemsediği ölçüde kaliteli olacaktır. Kitap yalnızca o tek yazarın sahip olduğu perspektifi, bilgi birikimini içerecek, o tek yazarın aşina olmadığı bilgiler ve örnekler kitaba girmeyecektir. Ancak iş birliği sayesinde kitap, her bir yazardan bir veya birden fazla olumlu özellik alacak ve her bir yazar kitabın bir veya birden fazla olumsuz özelliğinin yok olmasını sağlayacaktır.

Fikir birliği, anlaşılması zor bir konudur; siz ve diğer vikiyazarlar kendi görüşlerini diretince daha da zor hale gelir. Birçok sorunun tek bir doğru veya yanlış cevabı yoktur, birçok karar "evet" veya "hayır"dan, "benim görüşüm" veya "başkalarının görüşü"nden daha karmaşıktır. Sizin görüşünüz doğru olmayabilir, başkalarının görüşü yanlış olmayabilir. Hiçbir görüş tek başına doğru değildir. Viki, ortaya çıkma prensibine dayalıdır; bütün, parçalarından daha iyidir. Sizin fikirleriniz başkalarının fikirleriyle birleşir, bu sayede ortaya çıkan fikir tek bir kişinin görüşlerinden ziyade, herkesin bir şey ilave ettiği bir çorba gibidir.
Başkalarıyla çalışırken tek bir bakış açısına sahip olmayın, başkalarının görüşlerinin de mantıklı olabileceğini aklınızdan çıkarmayın. Ancak bu sayede her biri farklı bir bakış açısına sahip olan okuyucuları tatmin edebilirsiniz. Kitabınız ne kadar farklı bakış açısı içerirse o kadar iyidir.
Fikir birliği, "ortaya çıkma" ilkesinin benimsenmesini gerektirir. Eğer kitabınızın gelişmesini ve büyümesini istiyorsanız ortaya atılan fikirleri dinlemeli ve bu fikirler arasında bir uzlaşma oluşturmaya çalışmalısınız. Eğer bunu yapmazsanız kitaba ve topluluğa zarar vermiş ve vaktinizi gereksiz yere harcamış olursunuz.

Vikikitap'taki bazı kitaplar başlatılmış ancak çeşitli sebeplerle boşlandığı için yarım kalmış olabilir. Bu kitapların tamamlanma seviyeleri birbirinden farklı olabilir, bazı kitaplara küçük dokunuşlar yetebilirken bazıları içinse kitabı yeniden yazmak daha uygun olabilir. Eğer kitap çok kötü bir durumdaysa ve kitabın mevcut durumundan daha iyi bir kitap oluşturacağınızı düşünüyorsanız kendi vizyonunuza hitap eden yeni bir kitap başlatabilirsiniz.
Sadece kötü durumdaki (örneğin taslak halindeki) kitapları yeniden yazmayı düşünün. Aktif katkıcıları olan ve/veya azımsanmayacak miktarda içerik barındıran kitapları kesinlikle silip yeniden yazmaya kalkışmayın.

Bazen iki veya daha fazla tamamlanmamış kitap daha iyi bir iş ortaya çıkarmak üzere tek bir kitap olacak şekilde birleştirilebilir. Ayrıca kitabınızı yazmaya başladığınızda Vikikitap'taki taslak halindeki veya tamamlanmamış kitapları kitabınıza ilave edebilirsiniz.
Başka kitaplarla birleştirilmesini istediğiniz kitaplara {{birleştir}}, {{ŞununlaBirleştir}} ve {{ŞunuBirleştir}} şablonlarını yapıştırın. Bu şablonların amacı diğer vikiyazarları olası birleştirme hakkında bilgilendirmektir. Bazen diğer vikiyazarlar çeşitli sebeplerle birleştirmeye karşı çıkabilirler, bu durumda birleştirme işlemi yapılamaz. Birleştirme şablonları sayfada en az bir hafta kalmalıdır, bu sayede diğer vikiyazarlar ilgili şablonları görmek ve tartışmaya katılmak için yeterli zamana sahip olacaklardır.
Birleştirme zamanı geldiğinde eski sayfaları yeni sayfalara yönlendirin, içeriği birleştirin ve bir hizmetliye -gerekliyse- geçmişleri birleştirmesini söyleyin.

Viki işaretleme dili çok basittir ve bu dili öğrenmenin en iyi yolu incelemek ve deneme yapmaktır. Hoşunuza giden bir biçimlendirmeye sahip bir sayfa gördüğünüzde sayfanın kodunu görmek için sayfanın üst kısmındaki "değiştir" düğmesine tıklayın. Sadece koda bakarak bazı kodların ne işe yaradığını anlayabilirsiniz, ancak bazılarında ise bu o kolay değildir ve ekstra bilgi öğrenmek gerekir.
Daha önce söylediğimiz gibi viki dilinde HTML ve CSS kodları da kullanabilirsiniz. Eğer HTML ve CSS'e aşina değilseniz bazı gelişmiş biçimlendirmeleri yapmak sizin için zor olabilir. Ancak umudunuzu kesmeyin! Vikikitap'ta her şeyi mükemmel yapmak zorunda değilsiniz; ayrıca gerek viki dilini, gerekse de HTML ve CSS dillerini öğrenmek ve burada bu kodları denemek için bolca vaktiniz var.
Viki dilini denemek için deneme tahtasını kullanabilirsiniz. Deneme tahtası herhangi bir sayfaya zarar vermeden istediğiniz denemeleri yapabileceğiniz bir sayfadır. Eğer denemek istediğiniz bir şey varsa bu deneyinizi deneme tahtasında yapın.

Yeni paragraflar kodda da yeni bir paragraf oluşturarak (iki kere enter'a basıp arada boş bir satır oluşturarak) yapılır. Örnek:

Bu kod 2 paragraf oluşturacak. Bu birincisi.

Bu da ikincisi.

kodu sonucunda şu oluşur:

Metin, belirli bir kelime ve kelime grubuna vurgu yapmak amacıyla koyu ve/veya eğik yapılabilir. Bir metni koyu yapmak için metnin başına ve sonuna üçer kesme işareti (''') koyulur. Örnek:

'''Bu metin koyu yazılmıştır.'''

kodu sonucunda şu oluşur:

Metin koyulaştırmaya genellikle önemli bir terimin ilk kullanılışında başvurulur, örneğin matematik kitabında "İntegral, ...", diye integralin tanımını yaptığınız bir cümle kurduğunuzda koyulaştırma sıkça kullanılır.Koyulaştırmanın başka bir kullanımı ise çok önemli bilgi veren cümle veya cümleleri vurgulamak amacıyladır, örneğin kimya kitabında barutu üretme deneyi yapılabilir ve deneyin hemen altında "Bunu evde denemeyin!" yazabilir. Elbette ki metin koyulaştırmanın kullanılabileceği birçok yer vardır, burada sadece birkaç örnek verilmiştir.
Bir metni eğikleştirmek (italik yapmak) için metnin başına ve sonuna ikişer kesme işareti ('', tırnak işareti (") değil) koyun. Örnek:

''Bu metin italiktir''

kodu sonucunda şu oluşur:

İtalik metin, bir şeye dikkat çekmek için kullanılır. Örneğin: "Bunu yapmaya kesinlikle ihtiyacınız yok". Bu cümlede "kesinlikle" kelimesi insanların kafalarına normal "kesinlikle"den daha etkili bir şekilde girecektir. Metin eğikleştirme ayrıca kitap ve filmlerin adlarını söylerken kullanılabilir, örneğin "Sinan Çetin'in Komiser Şekspir filminde ...".
Bu iki biçimlendirme kodu birlikte kullanılabilir. Örnek:

'''''Hem koyu hem eğik yazı'''''

kodu sonucunda şu oluşur:

Hem koyu hem italik biçimleme, önemli bir bilgi verirken italik metnin dikkat çekiciliğini de işin içine katmak istediğimizde kullanılabilir. Ayrıca bir kitap hakkında açıklama metni yazarken de bu biçimlemeyi kullanabilirsiniz. Örnek:

'''''Bu kitap ÖSS'ye yönelik olarak hazırlanmıştır.'''''

kodu sonucunda şu oluşur:

Madde işaretli bir liste oluşturmak için tek yapmanız gereken listenin her ögesinin başına * işareti koymaktır. Örnek:

*Bir numara
*İki numara
*Üç numara

kodu sonucunda şu oluşur:

Ayrıca istediğiniz liste ögelerini içeri kaydırabilirsiniz. Bunu yapmak için ilgili liste ögesinin başına bir * daha ekleyin. Örnek:

*Bir numara
**İki numara
*Üç numara

kodu sonucunda şu oluşur:

Numaralı listeler de kolaydır. Her liste ögesinin başına # işareti koyarak numaralı liste oluşturabilirsiniz. Örnek:

#Bir numara
#İki numara
#Üç numara

kodu sonucunda şu oluşur:

Numaralı listelerden de istediğimiz ögeleri içe kaydırabiliriz. Bunu yapmak için ilgili liste ögesinin veya ögelerinin başına bir # işareti daha ekleriz. Örnek:

#Bir numara
#iki numara
##İki numara - 1
##İki numara - 2
#Üç numara

kodu sonucunda şu oluşur:

Önceden biçimlendirilmiş metin, Courier gibi sabit genişlikli bir yazı tipinde ve bütün boşluklar korunmuş halde sayfaya geçirilen metin demektir. Önceden biçimlendirilmiş metin, yazılım kodlarının ve mutlaka belirli bir sırada dizilmesi gereken metinlerin yazımı gibi birçok konuda son derece faydalı bir çözüm sunar. Normalde tablo veya div kodları kullanmak verileri yaslamak için daha çok önerilir, ancak bazen önceden biçimlendirilmiş metin bunu daha iyi yapar.

Bu önceden biçimlendirilmiş bir metindir. Metin vikimetinde tam olarak nasıl yazılmışsa
sayfaya öyle geçirilir. Burayı, vikimetinde her satırın başına bir boşluk ekleyerek
oluşturduk. Ayrıca buranın bir kutu içine alındığına dikkat edin. Önceden biçimlendirilmiş
metinlerde istediğimiz metni istediğimiz yere yazabiliriz. Örnek:

   A
             B
                       C

Önceden tanımlı metinlerin dezavantajı sayfanın okunabilirliğini azaltması ve her boşluk sayfaya geçirildiği için editörün rahatça boşluk, enter gibi kaynak kodun görünüşünü kolaylaştıran yöntemlere başvurmasını engellemesidir.

Vikikitap'ta diğer sayfalara bağlantı vermenin iki yolu vardır. İlk yol koda sayfanın URL adresini yazmaktır. Örnek:

http://tr.wikibooks.org/wiki/Ana_Sayfa

kodunun sonucunda şu oluşur:

Eğer vereceğimiz bağlantı Vikikitap'taki bir bağlantı içinse bu yöntem hiç de iyi bir yöntem değildir, çünkü şık gözükmez ve bu tür bir bağlantı kullanımı daha çok kaynak gösterme ve ek okuma listesi sunma amacıyla başka web sitelerine dış bağlantı vermek için kullanılır. Örneğin arama motorları hakkında yazılan bir kitabın dış bağlantılar bölümüne  http://www.google.com.tr yazabiliriz.
Vikikitap'taki başka sayfalara bağlantı vermek için bizim için gerekli olan sadece sayfanın adı, yani http://tr.wikibooks.org/wiki/ adresinden sonra gelen kısımdır, URL'nin tamamı değildir. Yukarıdaki örneği düşündüğümüzde bizim için tek gerekli olan sadece "Ana_Sayfa" dır. Bu Ana_Sayfa yazısının etrafına ikişer köşeli parantez koyarsak bu sayfaya bir iç bağlantı vermiş oluruz:

[[Ana_Sayfa]]

kodunun sonucunda şu oluşur

Ana_Sayfa Vikikitap'ın ana sayfasının adıdır. Ayrıca istersek alt çizgileri (_) boşluk ile değiştirebiliriz. Normalde MediaWiki yazılımı sayfa adlarında boşluk karakteri kabul etmez, bu yüzden bağlantılardaki boşlukları _ ile değiştirir. Yani aslında [[Ana_Sayfa]] veya [[Ana Sayfa]] demek arasında pratikte bir fark yoktur. Sayfa adlarıyla ilgili diğer önemli bir husus da sayfaların daima büyük harfle başlaması ve Vikikitap'ı çalıştıran yazılım olan Mediawiki'nin bağlantıların ilk harflerini otomatik olarak büyütmesidir, yani  [[ana Sayfa]] diye bir bağlantı verdiğinizde yine Vikikitap'ın ana sayfasına gidersiniz.
Vikikitap sayfaları büyük-küçük harf duyarlılığına sahiptir. Bu yüzden [[ana Sayfa]] ve [[ana sayfa]] aynı sayfaya bağlantı vermeyecektir. Örnek:

[[ana Sayfa]] ve [[ana sayfa]] arasında fark var!

Şimdi şunu merak edebilirsiniz: "Madem her iki sayfa farklı. Neden ben ikisine de tıkladığımda da aynı yere gittim?". Aynı yere gittiniz çünkü Ana sayfa sayfası aslında bir yönlendirme sayfasıydı ve sizi Ana Sayfa sayfasına yönlendirdi.
Yönlendirme bağlantı vermeyi kolaylaştıran çok güzel bir özelliktir. Vikiyazarlar bir sayfaya hangi isimlerle ulaşılabileceğini düşünürler ve bu isimleri asıl sayfaya yönlendiriler. "Ana sayfa" sayfası "Ana Sayfa" sayfasına yönlendirilerek acemi vikiyazarların yapabileceği olası bağlantı hatalarının önüne geçilebilir.
Vikikitap'taki kitap sayfalarına bağlantı verirken hem kitabın, hem de sayfanın ismini belirtmeliyiz. Örnek:.

[[Vikikitap'ı Kullanma/Vikikitap nedir?]]

çıktısı:

Açıkçası bu, pek de şık bir bağlantı değildir ve URL'yle bağlantı yöntemine benzemektedir. Bu sorunu çözmek için | karakteri kullanılır. Sayfa adından sonra bu işareti koyup ardından başka bir isim yazarsak ve son olarak bunları ikişer köşeli parantez arasına alırsak bağlantıya tıkladığımızda gittiğimiz sayfa değişmez, ama bağlantı yazısı değişir. Bu sayede  Vikikitap'ı Kullanma/Vikikitap nedir? gibi uzun bir bağlantı yazısından kurtulmuş oluruz. Örnek:

[[Vikikitap'ı Kullanma/Vikikitap nedir?|Vikikitap nedir?]]

kodunun sonucunda şu oluşur:

İsterseniz bağlantı kullanırken çeşitli yerlere boşluk koyup kaynak kodda okunurluğu artırabilirsiniz. Örnek:

[[ Vikikitap'ı Kullanma/Vikikitap nedir? | Vikikitap nedir? ]]

ancak bu kodun sayfadaki görünüşü değişmeyecektir:

Vikikitap'ta kitap bulmanın çeşitli yolları vardır. Bu sayfada bu yollardan bazıları anlatılacaktır.

Vikikitap arayüzünde sayfanın sağında bir arama kutusu bulunur. Aramak isteğiniz konuyu bu kutuya girip hemen altındaki "Ara" düğmesine tıklayarak Vikikitap'ta arama yaparsınız. Bu işlem sonucunda içinde aradığınız metin geçen tüm kitap ve sayfalar listelenecektir.
Başka bir seçenek ise direkt kitabın ismini yazmaktır. Eğer kitabın ismini biliyorsanız (veya bildiğinizi düşünüyorsanız) kitabın ismini arama kutusuna yazar ve bu kutunun altındaki düğmelerden "Git" düğmesini tıklarsınız. Bunun sonucunda -eğer varsa- ismi arama kutusuna yazdığınız metin olan sayfa veya kitap görüntülenecektir. Eğer bu isimde bir kitap veya sayfa yoksa "Git" düğmesi de "Ara" düğmesi gibi işlem görecektir.
Matematik ve İngilizce gibi bazı temel konular Vikikitap'ta birer kitapla temsil edilmektedir. Bu tür yaygın konuların kitabına gitmek için en kullanışlı yol kitabın ismini arama kutusuna yazıp "Git" düğmesine tıklamaktır.

Vikikitap'ta kitaplıklar aracılığıyla gezinebilirsiniz. Kitaplıklarda kitaplar konularına, seviyelerine, hedef kitlelerine ve diğer ölçütlere göre listelenir. Her kitaplık belirli bir konudaki kitapları barındırır. Vikikitap'taki tüm kitaplıklar Vikikitap:Kitaplıklar sayfasında bulunur.

Vikikitap:Seçkin kitaplar sayfasında Vikikitap'ın seçkin kitapları bulunur. Seçkin kitaplar mükemmel değildir, ancak Vikikitap'ın şimdiye kadar yazılmış en iyi kitaplarıdır ve yazılacak diğer kitaplar için çok güzel birer örnek teşkil ederler.
Seçkin olmasını istediğiniz kitapları Vikikitap:Seçkin kitap adayları sayfasından aday gösterebilirsiniz. Eğer topluluk da sizin görüşünüze katılırsa ilgili kitap seçkin kitap statüsüne kavuşur.

Vikikitap'taki kitaplar klasik basılı kitaplara özgür ve kaliteli birer alternatif oluşturmak amacıyla yazılmaktadır. Bu, klasik kitaplara parası yetmeyen öğrenci ve okullar için şüphesiz çok önemli bir şeydir.
Dünyanın dört bir yanındaki bazı öğretmenlerin, sınıflarında Vikikitap'taki kitapları kullanması (basılı hale getirip) kuşkusuz bir sürpriz değildir.
Vikikitap'taki kitapların büyük bir kısmı yazım aşamasındadır. Vikikitap'taki kitaplar hiçbir zaman tam anlamıyla tamamlanmış sayılmazlar, çünkü mevcut durumu nasıl olursa olsun her kitap güncellenebilir, geliştirilebilir, içeriği artırılabilir ve biçiminde oynamalar yapılabilir. Ancak her şeye rağmen diğerlerinden daha iyi olan kitaplarımız, örneğin seçkin kitaplar, sınıfta kullanım için yeterince iyidir. Ancak bu sadece seçkin kitapların sınıfta kullanılabileceği anlamına gelmez. Kuşkusuz seçkin kitaplar dışındaki birçok kitap da sınıfta kullanım için yeterince iyidir.

Vikikitap'ta kitap bulmak son derece basittir, Vikikitap'ta nasıl kitap bulacağınız bu kitabın önceki bölümlerinde anlatılmıştır. Ancak en basitini söylemek gerekirse Vikikitap:Tüm kitaplar sayfasına gider ve istediğiniz isimdeki kitabı bulursunuz. Kitabı bulduktan sonra okur ve sınıfta kullanım için uygun olup olmadığını değerlendirirsiniz. Daha sonra kitabı öğrencilerin de edinmesi gerekir.
Genellikle kaliteli kitapların yazdırılabilir sürümü ve/veya PDF sürümü ve/veya koleksiyon hali mevcuttur. Bu özelliklere haiz olan kitaplar Kategori:Yazdırılabilir sürümü mevcut kitaplar, Kategori:PDF sürümü mevcut kitaplar ve Kategori:Herkese açık koleksiyon hali mevcut kitaplar kategorilerinde listelenir.
Diğer taraftan, Vikikitap:Kitaplıklar sayfasından hiyerarşik olarak ilerleyerek kitaplıklar aracılığıyla istediğiniz kitabı bulabilirsiniz. Kitaplıklar, belirli bir konudaki kitapları listeleyen sayfalardır. Ayrıca birçok kitaplıkta ilgili kitaplıktaki seçkin kitaplar, yazdırılabilir sürümü mevcut kitaplar, PDF sürümü mevcut kitaplar, vb. ayrı bir grup olarak listelenir.

Vikikitap, "Flagged Revisions" veya kısaca "flaggedrevs" isminde bir yazılım eklentisine sahiptir. Bu eklenti, Vikikitap'taki her sayfanın içeriğine, doğruluğuna ve kapsamına göre değerlendirilebilmesini sağlar. Bu sayede bir sayfayı görüntülerken sayfanın daha önce değerlendirilip değerlendirilmediğini, eğer değerlendirilmişse diğer eleştirmenlerin bu değerlendirme hakkında ne düşündüğünü görebilirsiniz. Elbette ki öğretmenin görüşü rastgele İnternet kullanıcılarının görüşünden daha önemlidir, ancak eleştiriler ilgili sayfa hakkında diğerlerinin ne düşündüğü ve diğerlerinin hangi özelliklere önem verdiği hakkında bir fikir verecektir.
Bir kitabı değerlendirirken eleştirilerinizi buraya yazmanız bizi çok mutlu edecektir. Eleştirmenlerin yetki ve görevleri bu kitabın ilerleyen kısımlarında anlatılacaktır. Sayfa hakkındaki görüş, soru ve yorumlarınızı ayrıca ilgili sayfanın tartışma sayfasına da yazabilirsiniz. Bu sayede kitap hakkında yazdığınız sorunlar başka gönüllü editörlerce düzeltilebilir.

Sınıfınızda kullanacağınız kitabı seçtikten sonra ilgili kitabı öğrencilerinize nasıl dağıtacağınızı belirlemelisiniz. İsterseniz sadece kitabın URL adresini öğrencilerinize dağıtabilirsiniz, ancak bu pek de sağlıklı bir yaklaşım değildir, çünkü kitapta yapılabilecek değişiklikler ders planınızı kontrol etmesi zor hale getirebilir. Ayrıca öğrencileriniz kitapta olumsuz katkılar yapabilir ve bu olumsuz katkılar diğer öğrenciler tarafından görülebilir. Çözüm ise kitabın sizin ve sınıfınızın güvenebileceği kararlı bir versiyonunu edinmektir. "Kararlı versiyon"dan kastımız şunlar:

Kalıcı bağlantı: Vikikitap arayüzünün sağ panelinde "araçlar" kısmında "Bu haline bağlantı" diye bir bağlantı vardır. Bu bağlantıya tıklarsanız ilgili sayfanın geçerli ve değişmez sürümü görüntülenecektir. Bu sürüm, ilgili sayfada ileride hangi değişiklik olursa olsun sabit kalacaktır.
PDF sürümler: Vikikitap'taki bazı kitapların PDF sürümü vardır. PDF sürümü indirdiğinizde artık sayfada olan hiçbir değişiklik PDF dosyanızı etkilemeyecektir. PDF sürümün dezavantajı ise ilgili kitaba yapılmış her katkıyı içermeyebilmesidir. PDF sürüm oluşturulduktan sonra orijinal kitapta önemli değişiklikler yapılmış olabilir.
Koleksiyondan PDF oluşturmak: Vikikitap'ın yazılımı (Mediawiki) bir sayfa koleksiyonundan otomatik olarak indirilebilecek PDF veya ODT dosyası oluşturulmasına izin verir. Bu sayede PDF dosyasının içeriği güncel olur. Ancak elbette ki bu güncellik ilgili PDF dosyasının üretildiği an itibarıyladır. PDF dosyası üretildikten sonra orijinal kitapta yapılan değişiklikler PDF dosyasına yansımaz. Eğer mevcut bir koleksiyonunuz varsa  Özel:Kitap sayfasına gidip "indir" dümesine tıklamanız durumunda koleksiyonunuzdaki sayfaları PDF veya ODT'ye dönüştürüp indirebilirsiniz.
Koleksiyonu bir baskı ortağımıza bastırmak: PDF sürümler ve kalıcı bağlantılar sınıfınızın bilgisayar ve/veya İnternet bağlantısı varsa iyi bir çözümdür. Ancak bazen en iyi çözüm Vikikitap'taki ilgili kitabı basılı hale getirmektir. Bu sayede sınıfın bilgisayar ve/veya İnternet'e sahip olma zorunluluğu ortadan kalkar. Eğer böyle bir düşünceniz varsa talebe-göre-baskı ortağımız PediaPress ile bu işinizi halledebilirsiniz. Eğer mevcut bir koleksiyonunuz varsa Özel:Kitap sayfasının "Basılı bir kitap olarak sipariş et" bölümü işinize yarayacaktır. Bir kerede bir veya 30 kopya sipariş edebilirsiniz.

Geleneksel olarak kitaplar sabit bilgi kaynaklarıdır ve tek başına öğrencilere bir şeyler öğretmek için yeterli değildir. Öğrencilerin dersi sabit bir kitaptan çalışmak yerine interaktif bir ortamda çalışmaları öğrenme sürecini çok daha kolay hale getirecektir. İşte Vikikitap bu aşamada devreye girebilir. Öğrenciler Vikikitap'ta topluca kitap yazabilir, ve bunun daha önce olmuş birçok örneği vardır. Vikikitap'ta topluca kitap yazmak isteyen gruplara Vikikitap topluluğu elinden geldiğince yardımcı olmaya çalışacaktır. Ayrıca sınıf projeleri ile yazılan bir kitaptan bir yıl sonra aynı sınıfa geçen diğer öğrenciler faydalanabilir.

Vikikitap proje gerçekleştirmek isteyen sınıflar için aşağıdaki nedenlerden ötürü son derece caziptir:

Tamamen izole değildir: Vikikitap tüm dünyaya açık bir platformdur ve bu tüm dünyadaki kişilerle kitaplar üzerine tartışma yapabilirsiniz. Ancak İnternet'in kötü insanlarından göreceli olarak izole haldeyiz, çünkü Vikikitap'ta sadece öğrenmek ve öğretmek isteyen insanlar vardır, başka bir amacı olan insanlar engellenir. Vikikitap'ın bu birincil amacı dışında başka ülkelerden ve kültürlerden bambaşka insanlarla çalışmayı öğrenmek de kuşkusuz önemli bir şeydir.
Yardımsever topluluk: Vikikitap'ta projenizin başarılı sonuçlanması için size her türlü yardımı yapmaktan imtina etmeyecek birçok insan vardır. Bu insanlar sorunları düzeltebilir, biçimi geliştirebilir ve Vikikitap maceranız boyunca size faydalı önerilerde bulunabilir. Ayrıca siz de geri bildirim ve görüşlerinizle daha güzel ve kaliteli bir ortam oluşmasına yardımcı olabilirsiniz.
Her şey açıktır: Vikikitap'ta hangi insanın ne yaptığını rahatlıkla görebilirsiniz. Vikikitap'ta bir öğrencinizin yaptığı tüm katkıları ve zamanlarını görebilir, öğrencinize vereceğiniz notta bu verileri baz alabilirsiniz. Ayrıca öğrencilerinizin mesaj sayfaları aracılıyla birbirleriyle yaptığı mesajlaşmalar ve bu mesajlaşmalar sonucunda kitaplarda olan değişiklikler/gelişmeler de herkese olduğu gibi size de açıktır.
Kullanımı kolaydır: Vikikitap'ta kullanılan dil olan "viki işaretleme dili" kısa ama güçlü bir dildir, sizin ve sınıfınızın muhatap olacağı düzenleme işlerinin büyük bir kısmı son derece basit olacaktır. Viki dili standart HTML'den çok daha kolaydır, ancak eğer ihtiyaç duyulursa bazı HTML kodları da kullanılabilir.

Öğrenciler için bir proje seçmek neredeyse projenin kendisini yapmak kadar zordur. Bazı öğretmenler projenin zorluğunu küçümseyebilir. Ancak şunu söylemek isteriz ki bir proje gerçekleştirmek hiç de o kadar kolay değildir. Ayarıca bazı öğretmenler öğrencilerin siteye alışması için geçmesi gereken süreyi de yanlış tahmin edebilirler. Öğrencilerin tamamlayabileceği bir projeyi seçmek ve bu projenin tamamlanması için ayarlanmış süreyi doğru planlamak çok önemlidir. Tamamlanmadan bırakılan bir proje öğrencilerde hayal kırıklığı oluşturabilir. Bu tür bir hayal kırıklığı oluşmaması için yapabileceğimiz önerilerden bazıları şunlardır:

Var olan bir kitabı geliştirin: Sınıfınıza uygun bir kitabı seçin ve kitabı örnekler, resimler ve notlar ekleyerek geliştirin.
Atıl bir kitabı hayata döndürün: Artık geliştirilmeyen bir kitabı bulun ve projenizi bu kitap üzerine inşa edin. Kitabın mevcut kalitesini değerlendirin ve kitabı hangi kaliteye getireceğinizi belirleyin.
Yeni bir kitap oluşturun: Bu en zor görevdir. Vikikitap'ta olmayan bir konu seçin ve bu konuyu anlatan bir kitap başlatın. Bu projeyi iyi planladığınızdan ve politikalarımıza uyduğunuzdan emin olun. Eğer yardıma ihtiyacınız olursa Vikikitap gönüllülerine derdinizi anlatmaktan çekinmeyin.

Projeyi yönetme şekliniz projenin başarısını önemli ölçüde etkiler. Burada seçebileceğiniz çeşitli opsiyonlar listelenmiştir:

Her öğrenci bir bölümü yazar
Böyle bir durumda kitaptaki bütün bölümlerin sınıfta işlendiğinden emin olun. Aksi takdirde ciddi adaletsizlik söz konusu demektir.
Herkes birlikte bir bölümü yazar
Bu yöntemde sınıfta en son işlenen konuyu bütün öğrenciler imece usulüyle yazarlar. Ancak böyle bir durumda da sayfa çakışmalarının sinir bozucu olacağını söylemek isteriz. Ayrıca bazı öğrenciler, yazacak bir şey kalmadığı için projeye dahil olamayabilirler.
Herkes bir bileşeni yazar
Her öğrenci bir sayfanın belirli bir bileşenini yazar. Bu özellik bir örnek, bir başlık, bir tablo, vb. olabilir. Bu yöntemde de herkes bir sayfa üzerinde çalışır ancak bu yöntemde bir veya daha fazla öğrencinin projeye dahil olamaması gibi bir durum söz konusu olmaz. Ancak bu yöntemin dezavantajı ise görevlerin eşit zorlukta olmayabilmesidir.
Öğrenciler hem yazar hem eleştirir
Bu yöntemde öğrenci

Vikikitap'taki birçok kitabın yazdırılabilir sürümü ve/veya PDF sürümü ve/veya koleksiyon hali mevcuttur. Bunlar bütün bir kitabı sabit diskinize indirmek veya yazdırıp bilgisayara muhtaç olmadan klasik kitap gibi okumanızı sağlar. Bu bölümde, bütün bunlar ve bütün bunların nasıl kullanılacağı anlatılacaktır.

Yazdırılabilir sürüm, bir kitabın bütün sayfalarının tek bir web sayfası haline getirildiği ve genellikle yazdırılmaya uygun olacak şekilde biçimlendirildiği halidir. Büyük kitapların yazdırılabilir sürümlerini tarayıcınızda görüntülemek uzun zaman alabilir (özellikle yavaş bir İnternet bağlantısına sahipseniz). Bazı çok büyük kitapların yazdırılabilir sürümleri de viki sunucuları veya tarayıcılara sıkıntı verebilme ihtimali göz önünde bulundurularak birden fazla parçaya bölünmüştür.
Yazdırılabilir sürümlerin, PDF sürümlerin aksine ilgili kitabın herhangi bir sayfası güncellendiğinde kendini otomatik olarak güncelleme özelliği vardır. Yani bir yazdırılabilir sürüm daima ilgili kitabın en güncel halini gösterir. Yazdırılabilir sürümler yazdırıldığında güzel görünecek şekilde biçimlendirilir, o yüzden tarayıcınızda güzel gözükmeyebilir. Bir yazdırılabilir sürümün yazdırıldığında nasıl görüneceğini tarayıcınızın "yazdırma önizleme" fonksiyonunu kullanarak görebilirsiniz.
Eğer bir kitabın yazdırılabilir sürümü varsa genellikle kitabın ana sayfasında bunun hakkında bir ileti görürsünüz. Eğer bunun hakkında bir ileti yoksa bu muhtemelen ilgili kitabın yazdırılabilir bir sürümü olmadığı anlamına gelir. Eğer kitabın bir yazdırılabilir sürümü yoksa ve olmasını istiyorsanız bu isteğinizi kitabın yazarlarına bildirebilir veya kolları sıvayıp kendiniz bir yazdırılabilir sürüm hazırlayabilirsiniz. Yazdırılabilir sürümlerin nasıl hazırlandığını kitabın Yazarlar kısmındaki Yazdırılabilir sürümler ve PDF'ler sayfasından bulabilirsiniz.

Bazı kitaplarda vikiyazarlar biraz daha ileri gider ve kitabın PDF sürümünü oluşturur. PDF sürümleri bilgisayarınıza indirip Adobe Acrobat veya OpenOffice.org gibi bir PDF okuyucu ile görüntüleyebilirsiniz. PDF dosyalarının oluşturulması yazdırılabilir sürümlere oranla biraz daha zordur ve kitabın orijinal sayfaları güncellendiğinde kendini otomatikman güncelleme gibi bir fonksiyonu yoktur. Ancak bilgisayara kolayca indirebilmesi ve daha şık ve kompakt olması ile yazdırılabilir sürüme oranla avantajlıdır.
PDF sürümler üretmek zor olduğu için PDF sürümler her zaman güncel olmayabilir. PDF sürümü okurken herhangi bir yerde en güncel bilgiye ihtiyaç duyarsanız Vikikitap'taki ilgili kitabı ziyaret edebilirsiniz.

Vikikitap'ın koleksiyon eklentisi isminde özel bir yazılım eklentisi vardır. Bu eklenti sayesinde istediğiniz, hoşunuza giden sayfaları koleksiyon adı verilen bir yapı içinde bir araya getirebilirsiniz. Genellikle koleksiyonlar aynı kitabın tüm sayfalarını bir araya getirmek için kullanılır ama bu zorunlu değildir: eğer isterseniz çeşitli kitapların sayfalarını aynı koleksiyon altında toplayabilirsiniz.
Vikikitap arayüzünün sağında "Yazdır/dışa aktar" bölümü bulunur. Bu bölümdeki bağlantıları kullanarak koleksiyon oluşturabilir mevcut bir koleksiyonu görüntüleyebilirsiniz. Kitabın "Yazarlar" bölümünde koleksiyonların nasıl oluşturulduğu ve kullanıldığı daha ayrıntılı bir şekilde açıklanmıştır.
Bir koleksiyon oluşturduğunuzda veya mevcut bir koleksiyonu görüntülediğinizde çeşitli seçenekleri görmek için Özel:Kitap sayfasına gidebilirsiniz. Burada koleksiyonunuzu kaydedebilir, PDF veya ODT olarak indirebilir veya talebe-göre-basım ortağımız PediaPress'ten ilgili koleksiyonun basılı halini talep edebilirsiniz. PediaPress koleksiyonunuzu bir kitap halinde basıp ciltleyecek ve adresinize makul bir ücret karşılığında gönderecektir. Bu kitap satış işleminden elde edilen paranın bir kısmı Wikimedia Vakfı'na gider. Hiçbir yazarımız bu satıştan telif ücreti alamaz, bu sayede kitaplar normal fiyatından ciddi anlamda daha ucuz olarak satılır.
Koleksiyonlar hakkında daha fazla bilgi için Yardım:Koleksiyonlar sayfasını veya bu kitabın Yazarlar bölümündeki Yazdırılabilir sürümler ve PDF'ler sayfasını okuyun.

Vikikitap, işbirliği ile kitap yazımına izin veren bir sitedir. Vikikitap'ta dünyanın her tarafından yüzlerce kişi imece usulüyle kitap yazabilir. Vikikitap, Wikimedia Vakfı'nın bir projesidir. Aynı vakfın diğer projeleri arasında Vikikitap'tan çok daha popüler olan Vikipedi de vardır. Vikikitap'taki bu sayfa dahil hemen hemen her sayfayı, herhangi bir zamanda herkes değiştirebilir. Bu, Vikikitap'ın ana prensibidir.

İngilizce Vikikitap 2003'te, Türkçe Vikikitap da 2006'da başladı. O yıldan bu yana İngilizce Vikikitap ciddi ilerleme kat etse de Türkçe Vikikitap'ta ne yazık ki pek ilerleme gözlenememiştir. Amacımız Türkçe Vikikitap'ın da İngilizce Vikikitap gibi geniş ve kaliteli bir e-kitap arşivi haline gelmesidir.

Vikikitap'taki bütün kitaplar, tamamen gönüllülerin çabalarıyla yazılmaktadır. Burada hiç kimse yaptığı katkıların karşılığı olarak para almamaktadır.
Vikikitap'taki kullanıcıların mahremiyet seviyeleri tamamen kendi inisiyatifindedir. Bir kullanıcı kendi isteğiyle gerçek adını, mesleğini, vs. özel bilgilerini kullanıcı sayfasında (veya başka bir yerde) söylemediği müddetçe diğer kullanıcılar o kullanıcıyı sadece rumuzuyla tanırlar.
Vikikitap merkezi bir karar alma organına sahip değildir. Nasıl ki Vikikitap'taki bütün sayfalar sadece vikiyazarlar tarafından hazırlanıyorsa tartışmalar da sadece vikiyazarlar arasında yapılır. Bir üst mercînin "o öyle değil böyle olacak" deme hakkı yoktur.

Wikimedia Vakfı; Vikipedi, Vikikitap gibi projelerin bağlı olduğu kâr gütmeyen bir organizasyondur. Bu vakfın diğer projelerinden bazıları şunlardır:

Vikiversite
Vikikaynak
Vikihaber
Vikisöz
Wikimedia Commons

Hawaii dilinde "hızlı" anlamına gelen "WikiWiki" kelimesinden türetilen "viki" kelimesi, içeriğin kullanıcılar tarafından kolay ve hızlı bir şekilde oluşturulabilmesine izin veren bir programdır. Hemen hemen her vikideki hemen hemen her sayfada bir değiştirme düğmesi vardır. Dünyanın herhangi bir yerindeki herhangi bir kişi bu düğmeye tıkladığında o sayfayı değiştirebilir veya o sayfaya yeni içerik ekleyebilir. Bazı viki sitelerinde sayfalar sadece bazı kişiler tarafından değiştirilebilir. Ancak Vikikitap'ta böyle bir sınırlama yoktur.

Vikikitap'taki sayfalar viki işaretleme diliyle yazılır. Bu dil aslında HTML'in basitleştirilmiş hâlidir. Viki işaretleme dili, Vikikitap'ta ihtiyaç duyacağınız biçimlendirme fonksiyonlarının çoğunu size verir. Viki dilini yetersiz gördüğünüz yerlerde HTML, CSS ve JavaScript'i de -belirli ölçülerde- kullanabilirsiniz.
Viki dilinin avantajı basit olması ve kullanıcılara çok az zahmet vererek içerik hazırlamaya imkan vermesidir. Viki dili sayesinde vikiyazarlar sayfanın tasarımıyla uğraşmak yerine sadece içeriğe odaklanırlar.

Vikikitap'ta kurgusal olmayan (bilgi veren) kitaplar bulunabilir. Ancak bu, her bilgi veren kitabın Vikikitap'ta bulunabileceği anlamına gelmez. Örneğin bir kitabın içeriği kayda değer olmayabilir veya içerik son derece kaba bir şekilde ele alınmış olabilir. Böyle durumlarda söz topluluktadır. Topluluk kararıyla kitap silinebilir, kalabilir veya içeriği düzeltilebilir.
Bazen bir içerik bir kardeş proje olan Vikiversite'ye de koyulmaya uygun olabilir. Böyle bir durumda ilgili içeriği hangi projeye koyacağınız tamamen size kalmış.
Vikikitap'ta bir kitabın barındırılmasından ziyade oluşturulmasına büyük önem verilir. Ancak elbetteki offline olarak hazırladığınız bir dokümanı buraya aktarabilirsiniz. Bundan büyük sevinç duyacağız. Burada kastettiğimiz elinizde imkan varsa (örneğin İnternet bağlantınız varsa) dokümanı offline olarak hazırlayıp buraya aktarmaktansa Vikikitap'ta hazırlamanız bizim "işbirliği" prensibimize daha uygun olacaktır. Ayrıca telif hakkı düşmüş ve sizin hazırlamadığınız belgeleri buraya değil, Vikikaynak'a gönderin.

Vikipedi, Vikikitap'ın önemli bir kardeş projesidir ve birçok Vikikitap kullanıcısı Vikikitap'a gelmeden önce Vikipedi'yle haşır neşir olmuştur. İki proje arasında özellikle yazılımsal benzerlikler olmak üzere birçok benzerlik olmasına rağmen ilk bakışta göze çarpmayan ve vikipedistlerin kafasını karıştırabilecek çeşitli farklar da vardır. Bu sayfa, Vikikitap'a Vikipedi'den gelenlerin Vikikitap'a hızlı bir şekilde alışması amacıyla bir hızlı başlangıç rehberi olarak hazırlanmıştır.

Vikipedi ansiklopedi maddeleri, Vikikitap ise kitaplar içindir. Kuşkusuz kitap ve ansiklopedi maddesi kavramları birbirinden farklıdır. Bir ansiklopedi maddesi sadece bilgi verme amacı güderken bir kitabın amacı ise öğretmektir. Aynı miktarda cümle içeren bir ansiklopedi maddesiyle bir kitap sayfasını kıyasladığımızda kitap sayfasının daha az bilgi verdiğini ama daha çok açıklama, örnek vb. içerdiğini görürüz.
Vikikitap'taki kitaplar normal kitaplarla aynı mantıkla oluşturulur. Her kitabın bir "içindekiler" sayfası vardır. Ayrıca kitabın içeriği sayfalara ayrılmalıdır. Kitap ve sayfaları hiyerarşik bir düzende oluşturulmalıdır. Kitabın kendi sayfası hiyerarşinin tepesinde olmalı ve kitabın diğer sayfaları onun altında yer almalıdır. Bu sayede hangi sayfaların hangi kitaplara ait olduğu karışmaz.
Vikikitap'taki kitaplar da normal kitapların sahip olduğu aşağıdaki bölümlere sahip olabilir:

Kapak
Kitabın adı, kapak resmi ve kitap hakkında kısa bir özet yer alır
Önsöz
Kitap hakkında bilgi veren ve yazar(lar) tarafından yazılmış bir sayfa
Sözlük
Kitapta kullanılan terim ve ifadelerin anlamları
Ek(ler)
Kitabın asıl içeriğine yardımcı olan, okunması kitabın öğrettiği konuyu tam olarak hazmetmek için gerekli olan sayfa(lar)
Ansiklopedi maddesiyle kitap arasında bu farklardan başka farklar da vardır. Örneğin bir kitabın sayfaları birbiriyle alakalı olmalıdır. Sayfaların sırası daha iyi öğretecek şekilde olmalıdır. Sayfalar sanki bir bütünden parçalara ayrılmış izlenimi vermelidir. Kitap, benzer konudaki ansiklopedi maddelerinin bir araya getirilmişi değildir. Sadece yemek kitabı gibi bazı kitaplar basit bir sayfa koleksiyonu şeklindedir. Ancak bu kitaplar sadece birer istisnadır. Eğer bir kitabın sayfalarının belirli bir okuma sırası ve merkezi dayanak noktası yoksa en azından eğitici olmalıdır.

Birçok kitap bir ansiklopedi maddesi gibi veya ansiklopedi maddelerinin bir koleksiyonu gibi başlar. Bir ansiklopedi maddesi koleksiyonu bir kitap sayılmaz. Ancak gelişim aşamasında bir kitabın ansiklopedi maddesi koleksiyonu gibi durmasında bir sakınca yoktur. Bunun çeşitli sebepleri vardır. İlk olarak; birçok kitap, temeli oluşturmak amacıyla Vikipedi'den içerik aktarılmasıyla başlar. İkinci olarak ise; genellikle önce bilgiyi yazmak, sonra bilgiyi organize etmek ve düzenlemek daha kolaydır. Ansiklopedi maddesi koleksiyonları eğer uzun bir süre boyunca kitaplaştırılmazsa silinmeye aday gösterilebilir.
Vikikitap'taki sayfalarda sık bağlantı kullanılması pek önerilmez. Bunun çeşitli sebepleri vardır. Örneğin kitaplar "kendini açıklayan" türde olmalıdır. Yani kitabı okuyan kişi kitabı okurken başka sayfalara gitme gereksinimi görmemelidir. Aksi takdirde kişinin okuma verimi düşer ve kişi okumaktan sıkılabilir. Ayrıca kitabınızda çok fazla bağlantı olması kitabınızın yeterince kapsamlı olmadığı anlamına gelir.
Vikikitap'ta, Vikipedi'de yaptığınız gibi [[yaygın]] kelimelere [[parantezler]] koyarak bağlantı oluşturmak kesinlikle tavsiye edilmez. Çünkü bu tür yaygın kelimelerle kitap başlatılması Vikikitap'ta pek mümkün değildir. Ayrıca bu bağlantıların "pipped link" kullanılarak Vikipedi'ye yönlendirilmesi de tavsiye edilen bir şey değildir. Çünkü bu tür bağlantılar her zaman doğru olmayabilir. Çünkü ilgili sayfa silinmiş, taşınmış vs. olabilir. Ayrıca okuyucuyu projeler arasında mekik dokutmak pek tavsiye edilmez.
Burada söylediğimiz bütün şeyler sadece satır içi bağlantılar içindir. Satır içi bağlantı türü dışında çeşitli bağlantı türleri de vardır. Örneğin bir kitabın Vikipedi'deki ilgili maddesine bağlantı vermek için  {{vikipedi}} şablonunu kullanabilirsiniz. Ki bu da tavsiye edilen bir şeydir. Ayrıca kitabınız için bir "Kaynakça" sayfası oluşturabilir ve kitabı yazarken faydalandığınız kaynakları bu sayfaya ekleyebilirsiniz.

Soru: Vikipedi projelerinin Vikikitap'ta karşılığı var mı?
Yanıt: Var. Kitaplıklar bu işi görüyor. Bir kitaplık sayfasında o kitaplıktaki kitapları, o kitapların hangi alanda geliştirilebileceğini, vs. öğrenebilir, ilgili kitaplık sayfasının tartışma sayfasında o kitaplık hakkında tartışabilirsiniz.
Soru: Neden yazdığım maddenin "yeniden vikileştirilmesi" gerekiyor?
Yanıt: Vikikitap'ta adlandırma Vikipedi'de olduğu gibi değildir ve [[herhangi]] [[bir]] [[kelime]]ye giden bağlantılar Vikikitap'ta muhtemelen herhangi bir sayfaya işaret etmeyecektir. Ayrıca kitaplarda çoğu dış bağlantı ve kaynaklar birlikte, toplu bir kaynakça içerisinde sunulur. Ayrıntılar için Vikikitap:Yeniden vikileştirme sayfasına bakın.
Soru: Sayfa adlandırma yöntemi nasıldır?
Yanıt: Kitabın ana sayfası genel olarak "Kitap Adı" şeklinde, alt sayfalar da "Kitap Adı/Alt Sayfa" veya "Kitap Adı/Bölüm/Alt Sayfa" şeklinde adlandırılır. Vikikitap, Vikipedi'de anlam ayrımında kullanılan "Kitap Adı (Sayfa Adı)" şeklindeki adlandırma yöntemini kullanmaz.
Soru: Vikikitap'ın politikaları nelerdir, Vikipedi'ninkiler ile arasındaki farklar nelerdir?
Yanıt: Büyük veya küçük birçok fark vardır. Eğer politikalarla ilgileniyorsanız, Vikikitap politikalarının tam listesine bakın. Vikikitap Vikipediden daha minimalist olma eğilimindedir, dolayısıyla politika ve yönergelerimiz Vikipedi'ninkilere göre çok daha azdır.
Soru: Sayfa oluşturmak ve düzenlemek için önerilen biçem nedir?
Yanıt: Belirlenmiş tek bir biçem (stil, tarz) bulunmamakla beraber yeni Vikikitap kullanıcıları için önerilerimiz vardır. Önerilerimizi inceleyin ama bunların sadece birer yönerge, yani yönlendirme amaçlı olduğunu unutmayın. Bir kitap yazarı olarak kitabınızın tasarımında size birçok özgürlük verilmiştir. Yazarlar anlaşmazlığa düştüğünde, fikir birliği oluşturmaya çalışmalısınız.
Soru: Yeni bir kitabın düzeni/kime yönelik olduğu/biçemi/dolaşımı gibi özelliklerine kim karar verir? İzlenecek tek bir doğru yol mu vardır?
Yanıt: Bir kitap ile ilgili kararları kim verir? Tabii ki siz! İş kitap yazmaya gelince Vikikitap yazarlarına çok geniş özgürlükler verilir. Tek istediğimiz kitabın tüm sayfalarında aynı belirlenmiş düzeni uygulamanız. Böylece sayfalar arasında bütünlük ve devamlılık sağlanmış olur. Farklı kitapların farklı hedef okuyucu kitleleri vardır, dolayısıyla bu farklı okuyucu kitlesi için kitaplar farklı stiller uygulayabilir. Örneğin çocuklara yönelik bir kitapta bol bol renkler ve resimler kullanılırken yetişkinlere yönelik bir kitap daha sade olabilir.
Soru: Burada anlam ayrım sayfaları var mı?
Yanıt: Hayır. Burada da bazı yönlendirmeler ve kitaplıklar gibi organizasyon sayfaları var. Ancak "Yemek:" alan adındaki bazı sayfalar dışında anlam ayrım sayfaları kullanılmıyor.
Soru: Vikipedi'den madde ya da maddeleri Vikikitap'a taşıyıp üzerinde kitap oluşturacak şekilde çalışmak istiyorum. Bunun hakkında bir politika var mı?
Yanıt: Tek yapmanız gereken Vikikitap:İçe aktarma istekleri sayfasından ilgili madde isteğinde bulunmak. Daha sonra içeri aktarılmış sayfaya eklenen talimatlara uymanız gerekiyor.

Soru: Vikikitap'ta yapılabilecek ne tür temizlik işleri var?
Yanıt: Vikipedi'deki işlerin çoğu Vikikitap'ta da vardır. Vikikitap'ta da sayfalar düzenlenir, kategorilenir, vandalizmle mücadele edilir, çift yönlendirmeler düzeltilir ve bu liste daha da uzar. Yapabileceğiniz çeşitli işlerin bir listesi için Vikikitap:Bakım sayfasına bakın.
Soru: Nasıl aranıza katılabilirim?
Yanıt: Aramıza katılmanın birçok yolu vardır. Köy çeşmesinde Vikikitap ile ilgili her türlü tartışma yapılır. Vikikitap:Seçkin kitaplar sayfasında Vikikitap'ın en iyileri belirlenir. Vikikitap'tan silinmesi istenen kitaplarla ilgili tartışmalar ise Vikikitap:Silme istekleri sayfasında yapılır.

Vikikitap, geleneksel bir kitap yayınlama ortamı değildir, bu yüzden Vikikitap'taki kitapların geleneksel kitap tanımına uyması beklenemez. Vikikitap'taki kitaplar viki dili kullanılarak yazılır. Ayrıca Vikikitap'ta yalnızca, bilgi veren (eğitici) kitaplar bulunabilir. Diğer tür kitaplar (hikaye, şiir vb.) burada yayınlanamaz.
Vikikitap'taki kitaplar geleneksel kitaplar gibi olmak zorunda değildir, Vikikitap'taki kitaplarla geleneksel kitaplar arasındaki farklardan bazıları şunlardır:

Uzunluk
Vikikitap'taki kitaplar basılı kitapların uzunluk bakımından getirdiği kısıtlamalara tabi değildir. Vikikitap'taki kitapların önceden belirlenmiş minimum veya maksimum uzunluğu yoktur. Bazı kitaplar çok kısa, bazıları da çok uzun olabilir. Vikikitap'ta önemli olan kitabın uzunluğu değil, kitabın gerekli bilgiyi içerip içermediğidir.
Sürümler
Her ne kadar bazı kitaplar "tamamlanmış" sayılsa da aslında Vikikitap'taki tüm kitaplar bir sürekli gelişim döngüsü içindedirler. Genel olarak Vikikitap'taki kitapların sabit bir sürümü yoktur. Bu durumun tek istisnası PDF sürümlerdir. PDF sürümler göreceli olarak daha uzun süre sabit kalırlar.
Biçem
Vikikitap'taki birçok kitap, yazınsal biçem olarak geleneksel kitaplara benzeme eğilimindedir, ancak böyle bir şey zorunlu değildir. Vikikitap'taki kitaplarda geleneksel kitaplarda bulunamayacak dolaşım linkleri ve çoklu ortam gibi web tabanlı özellikler bulunabilir. Vikikitap sayesinde yazar, geleneksel kitaplardaki kısıtlı sunum imkanlarından sıyrılır ve daha önce denenmemiş birçok sunum kombinasyonunu deneyebilir, geleneksel kitaplarda Vikikitap'taki kadar geniş sunum türü imkanı yoktur.

Birçok insan kitap yazmanın çok büyük bir iş olduğunu düşünür ve bu yüzden kitap yazmaya başlama cesaretini kendinde bulamaz. Ancak aslında Vikikitap'ta kitap yazmak o kadar da zor değildir. Eğer kitabı tek başınıza başlatmaya cesaret edemiyorsanız Vikikitap'ta (örneğin köy çeşmesinde) veya başka bir yerde kitabınızın tanıtımını yapabilir ve başka kullanıcıların yüklendiğiniz sorumluluğu azaltmasını sağlayabilirsiniz.
Kitap yazmaya başladığınızda başka editörler herhangi bir konuda (örneğin organizasyon veya biçimlendirme) size yardım edebilir. Kitap yazarken takıldığınız herhangi bir noktada köy çeşmesini kullanarak başka kullanıcılardan yardım isteyebilirsiniz.
Ancak şunları yanlış anlamayın: Vikikitap'ta kitap yazmak büyük bir iştir. Kitaplar büyük ve göz korkutucudur. Ancak viki, kitapların istediğiniz zamanda istediğiniz kadarını yazmanıza ve başka yazar ve editörlerden yardım istemenize olanak tanır. Yeni bir kitap yazmaya başlamadan önce kendinize, kitabı başlatıp büyütmek ve başka editörleri kitabınıza çekerek katkı yapmalarını sağlamak için yeterli zaman ve azminiz olup olmadığını sorun. Eğer bunlara sahip değilseniz kitabınız, başladıktan kısa bir süre sonra atıl hale gelebilir.

Eğer yazmak istediğiniz kitap Vikikitap'ta yoksa başlatabilirsiniz. Kitabı zamanla büyütüp geliştireceğini düşünen herkes yeni bir kitap başlatabilir.  Ancak, Vikikitap'ta bulunabilecek kitaplar konusunda bir sınırlama vardır. Vikitap'ta hangi kitapların bulunup, hangi kitapların bulunamayacağını Vikikitap:Vikikitap nedir? sayfasından öğrenebilirsiniz.
Yeni bir kitap oluşturma işleminin çeşitli faydaları vardır:

Kitabı oluşturan olarak size, bildiğiniz bir konuyu anlatma imkanı verir.
Okuyucuların para ödemeden konuyu öğrenmelerine imkan verir.
Başka vikiyazarların kitabınıza -küçük de olsa- katkıda bulunmalarını sağlar, bu sayede kitabınız daha iyi bir kaynak olur.
Bir konuyu öğrenmenin en iyi yolu o konuyu öğretmektir, yani yukarıdaki ilk madde ile bir taşla birçok kuş vurmuş olursunuz. Sadece konuyu başkalarına öğretme değil, kendi bilgi birikiminizi pekiştirme ve topluluktan saygı görme kazanacağınız şeylerdendir.
Yukarıdaki ikinci madde ise başka bir önemli noktadır. Geleneksel basılı kitaplar tipik olarak son derece pahalıdır. Zaten bu yüzden yayıncılar birkaç yıl arayla kitabın yeni baskılarını çıkartırlar. Kitabın yeni baskısı çıktığında eski basım, daha çok bulunsa veya daha ucuz olsa bile güncelliğini yitirmiş sayılır. Vikikitap'taki kitaplar, internette bulunduğu için ücretsiz olarak okunup, bilgisayara ücretsiz olarak indirilebilir.
İyi bir kitabın aşağıdaki özelliklere sahip olması gerekir:

iyi bir plan
Sağlam bir altyapı
Belirli bir odak noktası
Geniş kapsam
Bu özellikler olmadan kitap taslak halinde, başka bir kitapla birleştirilmek zorunda veya yalnız kalabilir (başka kitaplar link vermeyebilir). Bu konular aşağıda biraz daha detaylandırılmıştır:

İyi bir plan
Vikikitap'taki kitapların belirli bir planı, gelişim yönü ve amacı olmalıdır. Vikikitap'ın faydalı olmayan veya bilgi vermeyen kitaplara ihtiyacı yoktur. En iyi kitaplar ana hat veya planla başlar. Kitaptaki her bir bölüm bir sonraki bölüme giriş niteliğinde olmalıdır. İçerik mantıklı bir sırayla sunulmalıdır. Sadece birbiriyle ilişkili ansiklopedi maddelerinin birleştirilmesiyle elde edilen kitaplar "makropedi" olarak bilinir ve bu tür kitapların Vikikitap'ta yeri yoktur. İyi bir plan kitabın, baştan sona bir bütünlük arz etmesini sağlar, bu sayede kitabın bir "makropedi" olması engellenir.
Sağlam bir altyapı
Kitabın sağlam bir altyapısı olmalıdır. Okuyucular kitabın sayfaları arasında rahatça dolaşabilmeli, yeni katkıcılar hangi bilginin nereye koyulacağını tam olarak bilebilmelidir. Sayfaların adlandırma düzeni birbiriyle tutarlı olmalıdır. Ayrıca kitapların kendi özel şablonları olması ve bazı ortak şablonların da kitaplarda kullanılması önerilmektedir. MediaWiki yazılımı sayesinde son derece şık şablonlar oluşturulabilmekte ve Vikikitap'ta da birçok kullanışlı hazır şablon bulunmaktadır.
Belirli bir odak noktası
Vikikitap'taki kitapların belirli bir odak noktası olmalıdır, çok fazla şeyden bahseden ve/veya odak noktası tam belli olmayan kitaplar Vikikitap'a göre değildir. Örneğin eğer konuya yüzeysel bir giriş yapmayacak, derine dalacaksınız "Fizik" isminde bir kitap oluşturmak yerine "Statik Fizik", "Dinamik" ve "Elektromanyetik Dalgalar" gibi kitaplar oluşturmanız daha hoş olacaktır. Kitabınızı gören bir okuyucu kitabın tam olarak ne içerdiğini anlamalıdır. Zikretmemiz gereken başka bir önemli nokta da Vikikitap'ın temel bilimlerde eksiksiz bir kütüphane olmasıdır, diğer bir ifadeyle Vikikitap'ta matematik, dil gibi temel bilimlerin kitapları zaten vardır. Yazacağınız yeni kitap Vikikitap'ta zaten var olan bu kitapların içeriğini tekrar etmemelidir. "İdare eder" birçok iş yerine "mükemmel" tek bir iş yapmanız Vikikitap açısından daha iyidir..
Geniş kapsam
Her kitap ele aldığı konuyu yeterince anlatmalıdır (ne az ne çok). Örneğin "X'e Giriş" ismindeki bir kitabın isminden de anlaşılacağı üzere ilgili konuya bir giriş yapması yeterlidir. Benzer şekilde "İleri X" ismindeki bir kitabın konunun sadece "ileri" olarak nitelendirilebilecek kısımlarını kapsaması yeterlidir. "X" ismindeki bir kitabın ise kendisini herhangi bir perspektife kısıtlamaması, konunun her şeyini anlatması gerekir. Kapsamla ilgili en temel kural, kitapların yalnızca kendi konusunu içermesi ve her kitabın kendi alt bölümlerini oluşturmasıdır.
Bu gereklilikler bir seçkin kitap olmanın da ön gereklilikleridir. Kitabınızın bu özellikleri kazanması, kitabın sizin katkılarınızın yanında başka kullanıcıların da katkılarıyla büyüyüp gelişmesine yardımcı olacaktır.

Umarım Vikikitap'ta yeni bir kitap oluşturma kararın buradaki belirli bir gereksinimle ilgili olur. Belki bu bir kitaplıktaki eksik bir kitaptır, belki de bir konuyla ilgili birleştirilebilecek olan birçok küçük kitap vardır. Ayrıca, bir kitap oluşturmadan önce bu kitabın Vikikitap'a uygun olduğundan emin olmalısınız:

Politikalara uygun mu?
Vikikitap bu materyali barındıracak en iyi yer mi?
Başkaları daha kitaba katkıda bulunabilecek mi?
Başka okurlar konuyu anlayabilecek mi?
Tüm bu soruların cevabı "evet" ise kitabınızı oluşturmaya başlayabilirsiniz.

Eğer kitabınız gerekli ise, kitabınıza ihtiyaç duyan birisi vardır. Bu belirsiz birisi sizin hedef kitlenizdir, ve onun için bu kitabı yazarsınız. Vikikitap'ta öğretici kitaplar bulunduğu için hedef kitle çoğunlukla öğrencilerdir. Ancak, öğrenci çok geniş bir kitleyi temsil eder, bu yüzden bunun ayrılması gerekmektedir. Öğrenciler yaşlarına göre ayrılabilir: küçük çocuklar (Vikiçocuk'un hedef kitlesi), lise öğrencileri, üniversite öğrencileri ve profesyoneller. Bazı konular ve yazma biçimleri bazı kitleler için uygun değildir. Örnek olarak, küçük çocuklara ileri seviye kodlama anlatmamak gerekir. Aynı zamanda çocuk kitaplarında karmaşık dilden kaçınılmalıdır.
"Üniversite öğrencileri" grubunun içinde farklı kitleler bulunur. İstatistik, işletme okuyanlar ve matematik okuyanlar için farklı anlatılır.
Bunu dikkate alarak, bir kitabı oluşturmanın birçok farklı yolu vardır. Bir kitabı belirli bir kitleye göre yazabilirsiniz veya tüm kitleler için farklı bakış açılarını kapsayan bir şekilde yazabilirsiniz. Örnek olarak, bir kitabı farklı başlıklar halinde yazabilirsiniz veya sayfaları ayrı ayrı verebilirsiniz.

Başlık seçmek yeni bir yazarın yapacağı ilk ve en önemli şeydir. İyi bir başlık kitabın daha hızlı bulunmasını sağlar. Uzun ve karmaşık, çokanlamlı veya belirsiz başlıklar will tam tersi etkiye sahip olacaktır. Aşağıda sana yardımcı olması için birkaç kural bulunuyor:

Konun için yaygın adı kullanın
"İleri seviye" gibi seviye belirten ifadelerden bu konuyla ilgili başka kitap olmadıkça kaçının
Bir okul kursunun adını bir kitaba vermeyin
Alt başlık kullanmayın, kullanacak iseniz linkinde bulundurmayın
Kitapları sayıyla sıralamayın

Bir başlık belirledikten sonra yeni bir kitap oluşturmak oldukça kolaydır. Sağ üst köşede, sayfa sekmelerinin en sağında bulunan arama kutusuna kitabınızın adını yazıp büyüteç simgesine tıklayın. Eğer yazdığınız isimde bir kitap varsa doğrudan o sayfaya yönlendirilirsiniz. Eğer yazdığınız adda bir kitap mevcutsa, kendinize yeni bir başlık seçebilir veya o kitaba katkıda bulunabilirsiniz.
Kitap adını oluşturan her kelime büyük harfle başla

http://www.qarilar.com/news/12952.html
Burada Jiqiu Chen Wenxin'in yazdığı "Altın Lotus" kitabından alıntı yapmış. Bu kitap 20.yy'da yazıldı. Burada Jilin Korelilerinden bahsederken aynı zamanda Liaoning (Kangtei) Korelilerinden de bahsediyor. Kangtei Korecesi(Koryoca)'nin nasıl ortaya çıktığına dair 1 kaç akademik kaynak da var. Yakın tarihte ortaya çıktığı için nasıl çıktığı hakkında bilgiler kaynaklarda mevcut.
https://library.minghui.org/media/s1217.htm
Bu kaynakta da aynı şekil Jilin ve Kangtei Korelileri'nden bahsediyor. Onların konuştukları dillerden de bahsediyorlar aynı zamanda.
Çin'deki Koreliler hakkında en detaylı araştırma yapan üniversite "Yanbian Üniversitesi" çünkü o üniversite, Yanbian Kore Özerk Anatomu'nda bulunuyor. Liaoning bölgesindeki Koreliler yani Kangtei Korelileri aynı zamanda Koryoca ya da Kangtei Korecesi hakkında da araştırma yapıyorlar.
http://www.cuaes.org/orgDetail-806.htm
Ayrıca 9 Ağustos 1981 yılında Kangtei Korelileri, Shenyang'da Çin Kore Dili Derneği'ni kurdu. Yanı sıra Jilin Korelileri ve Tabgaç Türkleri de bu derneğe desteklerini sunmakta. Dernekte Korece'nin lehçelerini Kore tarihi, kültürü v.s öğretiyorlar. "Koryoca" da bu dernekte öğretiliyor.
http://www.gov.cn/guoqing/2015-07/23/content_2901626.htm
Burada tamamen Çin'deki Koreliler'den bahsediyor. Hem halk hem de dil ve kültür hakkında bahsediyor. Kangtei ve Jilin Korecesi'nin yanı sıra Kuzey Korece'den de biraz bahsediyor.
(Kuzey Korecenin, Güney Koreceye göre daha saf Korecesi var, çünkü Kuzey'de öz Korece kelimeler çok ve İngilizce kelimeler yok.)
http://www.qijieshuzhai001.com/?p=7025
Burada da Çin'deki Koreliler hakkında bilgi veren kitaplar var.
Jilin Korelileri
Kangtei Korelilerden bahseden kitaplar.
Koryoca ve Jilin Korecesinden de bu kitaplar sayfalarında yer veriyor.

http://www.zclw.net/xueshulunwen/wenhualishi/20141207/19330.html
Bu sitede direkt PDF yerine kaynağı siteye yazmışlar. Genel olarak Şato Türklerinden bahseder. Bunların yanı sıra da Şato Türkçesinden de bahsetmiştir.
http://dh.dha.ac.cn/Conference/Detail?table=DHXCPFD_METADATA&id=1038
Bu sitede ise Şato Türkleri ve Şatoca'nın başlangıcı ve ilerlemesinden de bahseder. Yani bu insanlar ve dilin de varlığını kanıtlar niteliktedir. Dilin tamamını öğrenecek olursak da o zaman devreye Şato Türkleri'nin en bilinen isimlerden olan "Kang Zhai" devreye giriyor. Kendisi Shenzhen Üniversitesi'nde tarih bölümü okumuştur. Orada da görev yapmaktadır. Kendisi Şato Türklerinden olduğu için dil konusunda bize yardımcı olabiliyor. Ama yine de bulduğum kaynakları özellikle bu dili kanıtlayacak olan kaynakları sizlere sunmaya devam edeceğim.
Şato Türklerinin varlığını da bir nevi bu kaynaklar kanıtlar çünkü dilden bahsederlerken bazı kaynaklarda halktan daha çok bahseder ki halk için 2.kaynak da böyledir.
Sizin buraya eklediğiniz cümlelerin ve kelimelerin geçtiği kaynaklar nerede? --88.228.250.215 13.18, 31 Ekim 2019 (UTC)

Kanlıkça diğer ismiyle Tabgaç Türkçesi ki Çinliler 拓跋語, Koreliler 캉국어 ve Japonlar da とパ言語 derler. Şimdi bulduğum akademik kaynakları size sunacağım. Biz Doğu Han Türkleri olarak kendimizi tanıtmaya çalışıyoruz. Vietnam, Kore, Japonya ve Tayvan'da kısmen kendimizi tanıtabildik. Türkiye'de zamanında bu kadar zorluk çekmelerinin sebebini şimdi anladım.
https://www.academia.edu/12453685/拓跋语与契丹语词汇拾零
Tà bá zú yǔ qìdān yǔ cíhuì shílíng
(Tabgaç [Kanlıkça] ve Kitanca dil yapısı ve kelimeler)
Huaxi Yuwen Xuekan tarafından araştırılıp yazılan bir kaynaktır. Kendisi de zaten Liaoning'in Doğu bölgesinde yaşayan Tabgaç Türkleri ve oradaki Moğolları araştırmış. Ve yazılan kaynağa da bakıldığı zaman (382-534) arası kurulan Tabgaç İmparatorluğu zamanında kullanılan Tabgaç Türkçesi ile şimdiki Tabgaç Türkçesi (Kanlıkça)'nin benzerliği de dikkat çekiyor. Bu kaynakta ağırlık olarak Kanlıkça ve Kitanca (Bao'an Moğolcası)'nın benzerliği hakkında bilgi vermektedir. Ama sonuçta uydurma bir dil olmadığını kanıtlayacak niteliktedir. Ayrıca Tabgaç İmparatorluğu zamanındaki kaynaklar şimdiki Kanlıkça'ya göre fazladır.
http://103.247.176.50/article/detail.aspx?id=cnkijournal72888985504849514849484952
Bu kaynakta da aynı şekil modern Bao'anlar ve Tabgaçlar hakkında ve onların dilleri hakkında da bilgiler vermektedir. Yanı sıra Kanlıkça ve Kitanca'da da birbirine benzer sözler ve durumlar vardır. Bao'anlar bugün aynı zamanda Avar Kağanlığı ve Rouran Kağanlığı ile ilişkilidir.
Bunlar benim bildiğim kaynaklar, buldukça sizlere bunları sunacağım.
Bu dillerin sözlüğü, grameri Türkçe veya İngilizce, Almanca, Fransızca, Rusça gibi dillerde bulunamıyor mu? Şimdi buraya başka biri gelse birtakım cümleler yazsa ve bunlar Şatoca veya Kanlıkçadır dese ama yazdıkları tamamen uydurma olsa bunun kontrol edilmesi nasıl mümkün olabilecektir? --88.228.250.215 13.23, 31 Ekim 2019 (UTC)
-Bu soruna karşılık 2007 yılında Kuzey Çin Türkleri kanghansajong.cn "Kang-Han Sajong" yani Kanlık-Han Sözlüğü isminde bir site açmışlardı. Çin'deki az bilinen dilleri tanıtmaya çalışıyorlardı.
Kanlıkça, Kitanca, Yugurca, Şatoca, Koryoca, Salarca, Huyanca ve Mançuca dillerini sözlüğe eklemişlerdi. Amaç hem dillerini yaymak hem de Şatoca ya da Koryoca deyip uydurma cümle yazmaların önüne geçmek için bu siteyi kurmuşlardı. Sitede Çince, Korece, Rusça, Türkçe, İngilizce, Moğolca, Almanca, Japonca ve Vietnamca sözlük de bulunuyordu. Kendi dillerini bilindik hale getirmek için bu dilleri de sözlüklerine eklemişlerdi. Ama 4 ay önce Çinli gruplar siteyi çökerttiler. Neredeyse o dillerdeki tüm kelimeleri sözlüğe geçirmişlerdi. Eğer Kanlıkça ya da Şatoca deyip uydurma kelime yazan birisi olsa o sözlükte öyle kelime var mı yok mu bulunabiliyordu. Şimdi ise pes etmeyip yeni sözlük sitesi kurmaya çalışıyoruz. Ayrıca Çeviri sitesi de kurmaya çalışıyoruz. Nisan 2020'ye kadar Kanlıkça, Şatoca ve Koryoca'dan oluşan sözlük açıp daha sonra diğer azınlık dillerini de ekleyeceğiz. Daha iyi yayılması için de Türkçe, Çince ve İngilizce sözlüğü de yeni sitenin yanına ekleyeceğiz. Bizim de amacımız bu dilleri yaymak.
Şato Türkçesi'ne gelecek olursak eski sözlük sitesinde o dildeki çalışmayı yapanların isimleri vardı. Ama Şato Türkçesi deyince ilk akla gelen "Kang Zhai"di. Eski sitede ismi Şatoca sözlükte çokça yer alıyordu. Bu sayede 3 arkadaşımız ondan Şato Türkçesi öğrendi. O arkadaşlarımız da Şato Türkçesi'nin üzerinde duracak.

Değişkenler, genel bir programlama dili kavramıdır. Değişkenler bir veri saklamak ve sonra onu kullanmak için kullanılır. Değişkenlerin depoladığı veriler farklı türde olabilir. Bir değişken yazı verisi de depolayabilir, sayı verisi de.
Visual Basic, çoğu programlama diline göre daha fazla veri türüne sahiptir.

Değişken tanımlar iken, örnek olarak "Ayşe", "1inci", "ben?!", "ilk sayi" gibi isimler kullanılamaz. Değişkenlere isim verir iken bir kaç şeye dikkat etmeniz gerekir:

Değişkenlere isim verir iken, boşluk kullanılamaz. Gerekiyorsa kelimeler "_" ile birleşebilir. "ilk_sayi" gibi.
Visual Basic değişken isimlerinde büyük-küçük harf duyarlıdır. Yani "SAYI" ve "sayi" aynı değişken değildir.
Değişken isimlerinde Türkçe harf kullanılmamalıdır.
Değişken isimleri özel harfler (?,!,",*,% gibi) içeremez.
Değişken isimleri Visual Basic içindeki özel isimler olarak seçilemez.
Değişken isimlerinde zorunda olmadıkça büyük harf kullanmak tavsiye edilmez. Eğer iki isim yan yana gelecekse, karışıklığı önlemek için ilk ismin baş harfi küçük, ikinci ismin baş harfi büyük yazılır. Aynı "maasMiktari" gibi.

Madde'nin başında da yazıldığı gibi, değişkenler farklı türde veriler içerebilir. Bu veri türleri şunlardır:

Değişken türü ne olursa olsun, tek bir anahtar kelime ile değişkenler belirlenebilir. Bu anahtar kelime Dim kelimesidir.

 
Yukarıda da görüldüğü gibi, değişkenler farklı şekillerde tanımlanabilir. Ancak değeri belirtilmek isteniyorsa, şu komutlar yazılabilir:

Değişkenler birçok yerde kullanılabilir. Örneklerini burada görebilirsiniz:

Viyana Usulü Patates Salatası, dünya mutfağında yer edinmiş bir salatadır ve Avusturya Mutfağı'nda ünlüdür.

1 adet orta boy kuru soğan
2 adet orta boy patates
5 dal frenk soğan
Yarım demet dereotu (70-80 gram)
1+¼ yemek kaşığı bitkisel sıvı yağ

3 yemek kaşığı mayonez
2.5 yemek kaşığı hardal
1+¼ yemek kaşığı limon
Tuz
Karabiber veya toz kırmızı biber (tercihe göre)

Julyen doğranan kuru soğanımızı sıvı yağda, hafif yumuşayana kadar kavurun. Patateslerinizi küp küp doğrayıp tuz ekleyerek haşlayınız. Ardından kabuklarını soyunuz. Haşlanmış ve soyulmuş patateslere biraz baharat ekleyiniz. Salatanın sosu için ise bir kapta mayonez, hardal ve limonumuzu karıştıralım. Haşlamış olduğumuz patateslerimizi sosa ekleyip kavulmuş soğanı ve ince ince doğradığımız dereotunu ekleyip, karıştıralım. Salatamız servise hazırdır.
not: Salatayı, patates haşlanır haşlanmaz yaparsanız, malzeme ılık olacak ve sosu daha güzel kavrayacaktır. Soğan da 150 gramdan az olmamalıdır. Salata, yaz aylarında soğuk da servis edilebilir.

25 gram toz biberiye
40 gram kuru fesleğen
60 gram maydanoz

Seçili bir sebze veya sebzeleri, ince olarak doğrayıp tuz ya da bir benzeri tat verici koymadan servis tabaklarına yayınız.
not: Fesleğen ve biberiyeyi aynı tabakta kullanmamanız tavsiye edilir. Sebzelerin üçünü birden koymak ise damak tadına büsbütün aykırı olabilir.

Windows Kurulumu yapmadan önce öncelikle yama dosyasının bir sürücüye hazırlanması gereklidir. Yüklenecek Windows dosyalarını web sitesinden istediğiniz sürümü ve cihazınızın desteklediği bit türüne göre indirmeniz gerekmektedir. Daha sonrasında bunu bir sürücüye yükleyerek aşağıdaki kurulum adımlarını tamamlamanız gerekir.
Windows Kurulum Adımları:
Adım 1: Windows kurulum medyasını bilgisayarınıza yerleştirin.
Adım 2: Bilgisayar yeniden başladığında, kurulum için dili seçin ve “İleri” düğmesine tıklayın.
Adım 3: Windows lisans sözleşmesinin hüküm ve koşullarını kabul edin ve “İleri” düğmesine tıklayın.
Adım 4: Kullanmak istediğiniz kurulum türünü seçin – Temiz kurulum, Yükseltme veya Özel kurulum.
Adım 5: Oluşturmak istediğiniz sürücü bölümü tipini seçin ve "İleri"ye tıklayın.
Adım 6: Kurulumun bitmesini bekleyin. Bu işlem birkaç dakika sürebilir.
Adım 7: “Bitir”e tıklayın ve bilgisayarı yeniden başlatın.
Windows Nasıl kurulur?
Windows kurulumu nispeten basit bir işlemdir. Doğru ortama sahip olduğunuzdan emin olun, doğru kurulum türünü seçin ve işlemin bitmesini sabırla bekleyin. Bilgisayarınızdan veya dizüstü bilgisayarınızdan en iyi şekilde yararlanma söz konusu olduğunda, başarının anahtarı başarılı bir Windows kurulumudur. Windows'u makinenize yüklemek göründüğü kadar karmaşık değildir, bunu gerçekleştirmek için sadece biraz bilgi ve birkaç basit adım gerekir.
Windows'u kurmanın ilk adımı, Windows kurulum medyasını indirmektir. Bu, Windows'u çalıştırmak için gerekli yazılım ve sürücüleri içeren bir ISO veya DVD dosyasıdır. İşletim sistemine sahip olduğunuzda, Windows yükleme işlemine başlamanıza izin verecek önyüklenebilir bir USB sürücü oluşturmanız gerekecektir. USB sürücüsünü oluşturduktan sonra, onu makinenize takabilir ve başlatabilirsiniz.
Yükleme işlemine başladığınızda, size birkaç seçenek sunulur. Bu seçenekler, uygun dil ve klavye düzeninin seçilmesinin yanı sıra Windows'un yükleneceği bir bölüm oluşturmayı içerir. Bu ayarları seçip bölümü oluşturduktan sonra kurulum işlemi devam edecektir.
Yükleme işlemi başladığında, ürün anahtarınız gibi birkaç ayrıntı girmeniz istenecektir. Bu anahtar Windows'u kullanmak için gereklidir, bu nedenle doğru girildiğinden emin olmak önemlidir. Anahtarı girdikten sonra kurulum işlemi devam edecek ve gerekli bileşenleri ve sürücüleri kuracaktır.
Yükleme işlemi birkaç dakika sürebilir, ancak tamamlandığında artık makinenizde Windows'u kullanmaya başlayabilirsiniz. Bilgisayarınızdaki ayarları uygun gördüğünüz şekilde değiştirebilecek, ayrıca program yükleyip kaldırabileceksiniz. Windows yüklendiğinde, artık işletim sistemiyle birlikte gelen yazılım, oyun ve internet bağlantısının dünyasını keşfedebilirsiniz.
Belirtilen adımlarla artık Windows kurulumunuzu hızlı ve kolay bir şekilde tamamlayabilirsiniz. Tamamlandığında, artık makinenizde gelişmiş bir kullanıcı deneyiminin avantajlarından yararlanabilirsiniz.
Teknofaw Katkıları ile.

Microsoft‘un ilk stabil Windows sürümü olan Windows 1.0, satış tarafında pek başarılı olamamıştır.
İlk Windows olduğu için yeniliklerinden pek fazla bahsedemediğimiz Windows 1.0, MS-DOS üzerine geliştirilen 16 bitlik bir işletim sistemidir. Windows 1.0 ile birlikte ilk kez Notepad, Paint, Writer gibi temel Windows yazılımları ortaya çıkmıştır.

Windows 2.0, Windows 1.0 üzerine geliştirilmiş ve Windows 1.1 olarak da değerlendirilebilecek bir Windows sürümü olmuştur.
İlk kez Ofis ailesinin Word ve Excel üyeleri, Windows 2.0 ile birlikte duyurulmuş, ancak Mac OS X benzerliği nedeniyle Microsoft ve HP, Apple tarafından açılan davalar ile boğuşmuştur.

İlk kez oyunların geldiği Windows 3.0, Solitaire ve Minesweeper gibi oyunların çıktığı işletim sistemi olmuştur.
Windows işletim sistemleri arasında ilk kez büyük başarı yakalayan sürüm olan Windows 3.0, kullanıcı arayüzünde önemli iyileştirmelerle gelmiştir.

1995 yılında duyurulması nedeniyle 95 adını kullanan Windows 95, ilk 32 bit Windows sürümüdür.
Başlat menüsü ve Internet Explorer‘ın çıkış yaptığı işletim sistemi olan Windows 95 ile aynı zamanda görev çubuğu da kullanıma sunulmuştur.

Windows 98, Microsoft'un ürettiği işletim sistemi ailesi Windows'un MS-DOS üzerinde yükselen beşinci ve son ana sürümü ve Windows 9x serisinin 2. ana versiyonudur. Microsoft bu sürümle çoklu ortam (multimedia) ve internet hizmetlerini bu sürüme eklemiştir. Windows 98, 15 Mayıs 1998'de üretime hazır konuma gelip 25 Haziran 1998 tarihinde piyasaya sürülmüştür. Windows 98, önceleri Memphis ve Windows 97 kod adlarıyla biliniyordu.

Windows Millennium Edition ya da bilinen adıyla Windows ME, Microsoft tarafından üretilen işletim sistemi ailesi Windows'un MS-DOS üzerinde yükselen altıncı ve son ana sürümüdür. 14 Eylül 2000 tarihinde piyasaya sürülmüştür. 16-bit/32-bit işletim sistemidir. Microsoft Windows ailesinin NT çekirdekli olmayan son temsilcisidir. Windows 98 sürümünün eksiklerini tamamlamak, ev ortamında kullanmak için geliştirilmiştir. Internet Explorer 5.5, Windows Media Player 7 ve yeni Windows Movie Maker gibi programları içermektedir. Ayrıca Microsoft, bunun yanında grafiksel kullanıcı arayüzünü güncellemiştir. Windows Me diğer Windows sürümlerine oranla daha az bir raf ömrüne sahip olmuştur.

Windows 2000, Microsoft'un ürettiği işletim sistemi ailesi Windows'un NT çekirdeği üzerinde yükselen beşinci ana sürümüdür. NT 4 sürümünden 3.5 yıl sonra, 17 Şubat 2000 tarihinde piyasaya sürülmüştür.

Windows XP, Microsoft tarafından geliştirilen Windows NT işletim sistemi ailesinin önemli bir sürümüdür. Hem profesyonel kullanıcılar için geliştirilen Windows 2000'in, hem de genel kullanıcılar için geliştirilen Windows Me'nin doğrudan ardılıydı. 25 Ekim 2001'de başlayan perakende satışlarla 24 Ağustos 2001'de üretime sunuldu.

Windows Server 2003, 25 Nisan 2003'te piyasaya çıkan, Windows 2000 Server gibi, küçük ve merkezi yönetimli kuruluşlardan geniş çaplı kuruluşlara kadar her çapta kuruluşun gereksinimlerine yanıt vermek üzere tasarlanmış, ayrıca kuruluşların .NET Framework özelliğinden tam olarak yararlanabilmesini sağlayacak biçimde geliştirmiş sunucudur.

Windows Vista, kişisel bilgisayarlar için geliştirilen Microsoft Windows işletim sistemleri ailesinin sürüm olarak altıncı üyesidir. 22 Temmuz 2005'te gerçek adı duyurulmadan önce Longhorn kod adıyla tanınıyordu. Windows Vista, 30 Ocak 2007'de dünya çapında piyasaya sürülmüştür.

Windows Server 2008, sunucu tabanlı Microsoft Windows işletim sistemlerinin bir sürümüdür. Üretim için 4 Şubat 2008 tarihinde çıktı ve resmen 27 Şubat 2008 tarihinde yayınlandı, Windows Server 2003, halefine göre yaklaşık beş yıl önce piyasaya çıktı. 

Windows 7, Microsoft tarafından geliştirilen Windows NT işletim sisteminin önemli bir sürümüdür. 22 Temmuz 2009'da RTM olarak piyasaya sunuldu ve 22 Ekim 2009'da genel kullanıma sunuldu. Windows 7'den yaklaşık 3 yıl önce piyasaya sürülen Windows Vista'nın halefidir. Ev ve iş masaüstü bilgisayarları, dizüstü bilgisayarlar, tablet bilgisayarlar ve HTPC bilgisayarlar da dahil olmak üzere; kişisel bilgisayarlarda kullanılan bir işletim sistemidir. 

Windows Server 2008 R2, Microsoft tarafından üretilen bir sunucu işletim sistemidir. 22 Temmuz 2009 tarihinde üretime sunulmuş, 22 Ekim 2009'da başlatılmıştır. Windows Server Ekip bloguna göre, perakende geçerliliği 14 Eylül 2009 idi. Windows 7 yönlü son kullanıcıyla aynı işletim sistemi çekirdeğini kullanan Windows NT 6.1 üzerine inşa edilmiştir. Microsoft tarafından yalnızca 64 bit işletim sistemi olarak piyasaya çıkan ilk sürümdür.

Windows 8, Microsoft tarafından üretilen ve Windows NT işletim sistemleri ailesinin bir parçası olarak yayımlanan bir işletim sistemidir. Ürün 1 Ağustos 2012'de üretime ve genellikle aynı yılın 26 Ekim'inde perakende satışa sunuldu. 

Windows Server 2012, Microsoft tarafından sunulan Windows Server serisinin bir sürümüdür. 4 Eylül 2012 tarihinde tam sürümü yayınlanmıştır, deneme sürümü ise 9 Eylül 2011 tarihinde MSDN kullanıcılarına sunulmuştur.

Windows 8.1, Microsoft tarafından Windows 8'e Service Pack tipinde bir güncelleme olarak çıkarılan ve daha iyi bir başlangıç ekranı deneyimi sunan bir işletim sistemidir. Haziran 2013'te "BUILD 2013" konferansında tanıtılmıştır.

Windows Server 2012 R2, Windows Server işletim sistemleri ailesinin altıncı sürümüdür. 18 Ekim 2013 tarihinde satışa sunuldu. Bu, TechEd Kuzey Amerika'da 3 Haziran 2013 tarihinde ortaya çıktı.

Windows 10 (ilk kullanılan kod adı: Threshold), Microsoft tarafından geliştirilen, Windows NT ailesinden bir işletim sistemidir. Windows 8.1'in devamı olarak 15 Temmuz 2015'te üretime sunuldu ve genel olarak 29 Temmuz 2015'te piyasaya sürüldü. 

Windows Server 2016, Windows 10 ile eş zamanlı olarak geliştirilen, Windows NT işletim sistemleri ailesinin bir parçası olarak Microsoft tarafından geliştirilen bir sunucu işletim sistemidir.

Windows Server 2019, Windows 10 ile aynı anda geliştirilen Windows NT işletim sistemleri ailesinin bir parçası olarak Microsoft tarafından Windows Server sunucu işletim sisteminin bir sürümüdür.

Windows 11 Microsoft tarafından geliştirilen Windows NT tabanlı Microsoft Windows ailesinin çıkan son sürümüdür. 5 Ekim 2021 tarihinde piyasaya sürülmüştür.

Windows Server 2022, Microsoft'un Windows Server 2019’un güncellenmiş halindeki işletim sistemi ailesinin sürümü.

Windows Server 2025, Windows 11 arayüzüyle eş zamanlı geliştirilmiş ve bu yıl içinde satışa sunulması planlanan, yakında çıkacak uzun süreli hizmet kanalı sürümüdür.

Assembly dili en alt seviye programlama dilidir. Assembly dili ile bellek gözeneklerine ve işlemci yazmaçlarına direkt müdahale ederiz. Daha üst seviye programlama dillerinde kaynak kodu makine koduna dönüştürmek için son derece karmaşık işlemler yapılır. Halbuki Assembly dili, makine kodlarının akılda tutulması zor olduğu için türetilmiş, İngilizce sözcüklerin kısaltmasından ibaret olan bir dildir. Her makine kodunun Assembly dilinde bir karşılığı vardır. Yani bir Assemnly kodunu makine koduna dönüştürürken (günümüz tabiriyle derlerken) tek yapılan Assembly kodlarını karşılığı oldukları makine kodlarına dönüştürmektir. Yani ortada çok karmaşık bir şey yoktur.

X86 Intel'in 8086 işlemcisini merkez alan bir işlemci mimarisidir. Günümüzde kullanılan bütün Intel ve AMD işlemciler bu mimaridedir. Yani rahatlıkla işlemci pazarının %90'ının bu mimariden olduğunu söyleyebiliriz. X86 mimarisindeki işlemciler genelde aynı komut setlerini kullanır. Değişen tek şey hız, önbellek gibi performansa dayalı verilerdir. Sonuca gelecek olursak X86 Assembly demek, X86 mimarisine sahip işlemcilerle uyumlu olan Assembly dili demektir. Diğer Assembly dillerinden daha popüler bir dildir.

Aslına bakarsanız Assembly dili işletim sistemi bağımsız bir dildir. Ancak Microsoft firması, kendi işletim sistemlerinin çekirdeğine bazı önemli işleri yapmak için (ekrana yazı yazmak, kullanıcıdan veri girişi için beklemek, vb.) yazılmış hazır fonksiyonlar koymuş. Bu hazır fonksiyonlardan faydalanabilmek için bu kitap boyunca kodlarımızı Windows ya da DOS işletim sistemlerinde yazacağız.

Kuşkusuz son derece gelişmiş ve işlerimizi son derece kolaylaştıran birçok programlama dili varken Assembly gibi çok alt seviye bir programlama diliyle program geliştirmek son derece mantıksız gibi görünüyor. Ancak Assembly dili ile diğer programlama dilleriyle yapamayacağımız birçok şeyi yapabiliriz. Örneğin:

Bilgisayar sistemlerini yakından tanımak için,
Aygıt sürücüleri yazmak için,
İşletim sistemleri yazmak için,
Program ya da işletim sistemlerindeki güvenlik açıklarını görmek için,
Şifre kırma ve hacking işlemleri için,
Virüs ve antivirüs programları yazmak için.
Bunların yanına bütün programların kaynak kodlarını Assembly olarak görebileceğimizi de eklememiz gerek. Yani bir Assembly programcısı için bütün programlar açık kaynak kodludur.

Birçok yerde yanlış bir şekilde Assembly sözcüğü yerine Assembler sözcüğü kullanılmakta. Assembler, Assembly kaynak kodlarımızı makine kodlarına dönüştüren programlardır. Yani modern tabirle Assembly derleyicisidir. Windows'ta veya DOS'taki debug programı da bir assemblerdır. Biz kitapta öncelikle Assembly kodlarımızı makine koduna dönüştürmek için bu programı kullanacak, daha sonra daha gelişmiş assembler programlarına geçeceğiz. debug programı Windows işletim sistemlerinde C:\WINDOWS\System32 klasörü altındadır. Büyük ihtimalle sisteminiz bu klasöre otomatik path yaratmıştır. Yani komut isteminde hangi klasörde olursanız olun bu klasördeki dosya ve klasörlere direkt erişebilirsiniz. Eğer sisteminiz bu klasöre otomatik path yaratmamışsa şu yolla bunu kendiniz yapabilirsiniz:

Bilgisayarım'a sağ tıklayın.
Özellikler'i seçin.
Açılan pencerede "Gelişmiş" sekmesini görüntüleyin.
"Ortam Değişkenleri" butonuna tıklayın.
"Sistem değişkenleri" kısmından "Path"a çift tıklayın.
Açılan "Sistem Değişkenini Düzenle" penceresindeki "Değişken Değeri" metin kutusundaki yazının sonuna ;C:\WINDOWS\system32 yazısını ekleyin.
Bütün pencerelerden "Tamam" diyerek çıkın.

Bu bölümde makine kodunun ne demek olduğunu, makine kodunun Assembly dili ile ilişkisini, sayı sistemlerini ve birkaç komutu görüp makine koduyla ilgili bir "deney" yapacağız.

Normalde bilgisayarların tek anlayabildiği sayı sistemi ikilik sayı sistemidir. Bilgisayar bütün işlemleri ikilik sayı sistemi ile yapar. Yani mov komutunun veya A karakterinin bilgisayar için hiçbir anlamı yoktur. Karakterlerin bilgisayarda nasıl temsil edildiğini daha önce görmüştük. ASCII kodlarla temsil ediliyorlar. Yani A sayısı bilgisayarda (41)16 yani (01000001)2 sayısı ile temsil edilir. Yani bir bellek gözeneğinde (01000001)2 sayısı varsa o bellek gözeneğinde A karakteri saklanıyor demektir. Peki ya komutlar? Komutların bellekte nasıl saklandıklarını anlamak için şöyle bir deney yapalım. Debug'da Assembly moduna geçip şöyle bir program yazalım:

1524:0100 mov   ah,9
1524:0102 mov   dx,10b
1524:0105 int   21
1524:0107 mov   ah,4c
1524:0109 int   21
1524:010b db    "deneme$"

Bu program bildiğiniz üzere ekrana deneme yazıp kapanır. Bu programı yazıp çalıştığından emin olmak için bir kere çalıştıralım. Sonra debug modundayken u 100 komutunu verelim. u komutu aktif segmentteki belirtilen ofsetten itibaren bir miktar komutu assembly ve makine kodu olarak ekrana yazar. Rehberlik etmesi açısından şimdiye kadar yaptıklarımızın ekran görüntüsü şu şekilde:

Bu resimdeki ilk sütun bellek adresleri, ikinci sütun ilgili bellek adreslerindeki makine kodları, diğer iki sütun da ilgili bellek gözeneklerindeki makine kodlarının Assembly dilindeki karşılıklarıdır. Eğer sadece u komutunu verseydik aktif segmentteki aktif ofsetten itibaren ilgili kodlar yazılacaktı. Aktif ofsetin değişik olma ihtimalini düşünerek ofseti kendimiz belirttik. İstersek u 100 10b gibi bir komut vererek bellekteki hangi aralıktaki kodların gösterileceğini de belirleyebilirdik. Bu durumda bizi ilgilendirmeyen kodları görmemiş olurduk. Hatta u 1200:100 10b gibi bir komut vererek segmenti de kendimiz belirleyebiliriz. Ayrıca ekran görüntüsünde de gördüğünüz gibi db talimatı belleğe olduğu gibi değil, db komutlarına parçalanarak geçirilmiş. Ancak bizim burada asıl odaklanmamız gereken nokta makine kodları ve bu kodların Assembly karşılıkları. Öncelikle bu kodları bir daha görelim:

1524:0100 B409    MOV    AH,09
1524:0102 BA0B01  MOV    DX,010B
1524:0105 CD21    INT    21
1524:0107 B44C    MOV    AH,4C
1524:0109 CD21    INT    21
1524:010B 64      DB     64
1524:010C 65      DB     65
1524:010D 6E      DB     6E
1524:010E 65      DB     65
1524:010F 6D      DB     6D
1524:0110 65      DB     65

Bu sonuçlardan görebileceğimiz üzere mov ah'ın karşılığı B4'tür, mov dx'in karşılığı da BA'dır. Yani mov'un belirli bir karşılığı yoktur. Ayrıca ikinci satırdan da anlayacağınız üzere veriler bellek ve yazmaçlarda düşük değerlikli bayttan itibaren yerleştirilir. Yani ilk önce en sağdaki bayt, sonra onun bir solundaki bayt, ... şeklinde gider. Buna Little Endian Byte Ordering denir.

Edit modu da tıpkı Assembly gibi bellek gözeneklerine veri girmek için kullanılan bir moddur. Ama veriler bellek gözeneklerine Assembly dili kullanılarak değil, makine kodu ile girilir. Farklı bellek gözenekleri arasında ilerlemek için boşluk tuşu kullanılır. Edit modundan debug moduna çıkmak için herhangi bir bellek gözeneğindeyken enter tuşuna basarız. Edit moduna girebilmek için ofseti belirtmek zorundayız. İstersek segmenti de belirtebiliriz. Herhangi bir bellek gözeneğindeki veriyi değiştirmek istemiyorsak ilgili bellek gözeneğine hiçbir şey yazmadan boşluk tuşuna basarız. Örnek ekran görüntüsü:

Burada 100., 101., 102. ve 103. ofsetlere programı sonlandırmaya yarayan makine kodlarını yazdık ve programı çalıştırdık. Elbetteki makine kodlarının ne anlama geldiğini bilmek zorunda değilsiniz. Bu konuyu yalnızca arkaplanda işleyen düzeneği kavramanız için anlatıyorum. İşin özü tıpkı karakterler gibi komutlar da bellekte ikilik sayılar olarak saklanıyor. Bir bellek gözeneğine sığmayacak sayılar yerleştirilmek istendiğinde ise düşük değerlikli kısımdan yerleştirilmeye başlanıyor. Yani 78F4562 gibi bir sayı belleğe 100. ofsetten itibaren yerleştirildiğinde aslında ofsetlerin durumu şöyle oluyor:
100. ofset: 62
101. ofset: 45
102. ofset: 8F
103. ofset: 07

Daha önce de dediğim gibi bilgisayar yalnızca ikilik sayı sisteminden anlar. Ancak ikilik sayı sistemi bilgisayarla iletişim kurmak için uygun değildir. Eğer Debug, bellekteki verileri on altılık değil de ikilik düzende yazsaydı ekranın büyük bir kısmı gereksiz yere 1 ve 0'larla dolardı. Üstelik programcının elde ettiği bu ikilik sistemdeki verilerden bir şeyler çıkarması daha zor olurdu. Peki debug, bu verileri neden onluk değil de on altılık düzende gösteriyor. Bunun cevabı da şu: on altılık düzen, ikilik düzenin bir türevidir. İkilik düzen ile on altılık düzen arasında dönüşüm yapmak oldukça kolaydır. Ayrıca on altılık düzen daha düzenli bir sistem sağlar. Şöyle ki; on altılık düzenin rakamları 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E ve F'dir. On altılık düzende bir bayt iki satırla ifade edilir ve on altılık düzendeki iki haneli son sayı aynı zamanda bir baytta depolanabilecek en yüksek değerdir. Yani on altılık düzendeki iki haneli bir sayı bir baytın depolayabileceği her türlü sayıyı ifade edebilir. Onluk düzende ise 255'i bir bayt depolayabilmesine rağmen, 256'yı depolayamaz. İkisi de üç haneli olmasına rağmen birisini bir bayt depolayabilmesine rağmen ötekini depolayamıyor. İşte bu düzensizliği önlemek için on altılık düzen kullanılıyor.
İkilik düzen ile on altılık düzen arasında dönüşüm yapmak için şu basit yöntemleri kullanabilirsiniz.

İkilik sayı sağdan itibaren dörtlük gruplara ayrılır.
Her bir grup on altılık düzene çevrilir.
Her bir on altılık rakam birleştirilir.
ÖRNEK:
00100101 → 0010.0101 → 2.5 → 25

On altılık sayının her bir basamağı parçalanır.
Her bir on altılık düzendeki rakamın ikilik düzendeki karşılığı bulunur.
Oluşan ikilik düzendeki sayılar birleştirilir.
ÖRNEK:
25 → 2.5 → 0010.0101 → 00100101

D komutu debug modunda çalışır. U komutuna benzer. Yani bellekteki verileri ekrana yazmaya yarar. Ancak u komutundan farklı olarak ekrana Assembly komutları yazılmaz. Yalnızca makine kodları ve bu kodların ASCII karşılıkları yazılır. Tek başına kullanılılırsa aktif segment:ofset'ten itibaren bir miktar veri gösterilir. İstenirse ofset belirtilebilir. Hatta istenirse bir aralık da belirtilebilir. Başka bir segmentteki veriler de şu şekilde gösterilebilir:

-d 1234:100 105

Burada 1234. segmentteki 100. ofset ile aynı segmentteki 105. ofset aralığındaki makine kodları ve bu kodların ASCII karşılıkları ekrana yazılır.

İstersek yazdığımız com uzantılı program dosyalaraımızı debug programına aktarabiliriz. Bunun için DOS modundayken

debug programismi.com

komutunu veririz. Bu komuttan sonra debug açılır ve programismi.com dosyasını oluşturan makine kodları herhangi boş bir segmente 100. ofsetten itibaren yüklenir. Aktif segment söz konusu boş segment ve aktif ofset de 100 yapılır.

Dw talimatı Assembly modunda çalışır. Belleğe iki baytlık veri girmek için kullanılır. Örnek:

1234:0100 dw   73d2

Burada belleğe 1234:100 adresinden itibaren 73d2 sayısı giriliyor. Bu komuttan sonra 100. ofsette d2, 101. ofsette 73 saklanır. Çünkü Intel ve AMD işlemcileri Little Endian Byte Ordering kuralına sahiptir. Yani ilk önce düşük dereceleri baytlar belleğe yerleştirilir.

Şimdi bilgisayarınızda exe uzantılı bir program dosyası bulun. Boyutunun oldukça küçük ve tek başına çalışan bir program olmasına özen gösterin. Eğer bilgisayarınızda bu tipte bir program bulmakta zorlanacağınızı düşünüyorsanız buradan 9 Kb'lık, tek başına çalışan ücretsiz bir program olan Auto Shutdown'ı indirebilirsiniz. Program bilgisayarın otomatik olarak kapanmasına yarıyor. Ancak bizim için programın ne işe yaradığı önemli değil. Şimdi sırasıyla şu adımları izleyin:

İndirdiğiniz programı Not Defteri ile açın. Bunun için programın uzantısını txt olarak değiştirebilirsiniz.
Karşınıza bir sürü karmaşık yazılar çıkacaktır. Neyse ki küçük boyutlu bir programı açtığımızdan dolayı o kadar da fazla karmaşık yazı ile karşılaşmayacaksınız.
Bu karmaşık yazılar programı oluşturan makine kodlarının ASCII koda dönüştürülmüş hâlidir.
Şimdi bu karmaşık yazıdaki herhangi bir karakteri silip tekrar yazın ve dosyayı farklı kaydedin.
Farklı kaydettiğiniz dosyanın uzantısını exe yapın ve açmaya çalışın.
Yeni oluşan exe uzantılı dosyayı açamayacaksınız. Çünkü program artık bozuldu. Peki neden? Alt tarafı makine kodunda bir karakteri silip sonra aynı karakteri aynı yere tekrar yazdık.
Burada aslında Not Defteri'nin azizliğine uğradık. Bildiğiniz üzere 0-FF arasındaki her sayı karakterleri kodlamak için kullanılmaz. Bazıları (0-7F) karakterleri kodlamak için bazıları da (80-FF) komutları kodlamak için kullanılır. İşte Not Defteri, 80-FF aralığında yer alan kısmı gösteremez. Çünkü bunlar karakter kodları değil, komut kodlarıdır. Dosyayı farklı kaydettiğimizde ise son dosyaya Not Defteri'nin gösteremediği o komut kodları dâhil edilmez. İşte bu yüzden program bozulur. Bunu çözmenin yolu Notepad++ gibi bir program indirmektir. Bu program, karakter kodlarını olduğu gibi, komut kodlarını da NULL olarak gösterir. Yani son tahlilde programdan bir kayıp olmaz. Notepad++'yı buradan indirebilirsiniz.
NOT: Bu deneyi elbette ki programların makine kodlarında değişiklik yapmak için anlatmadım. Zaten de yapamazsınız. Çünkü  Notepad++ bütün makine kodlarını NULL olarak gösterir. Orada hangi makine kodunun olduğunu bilemezsiniz. Bu örneği sadece exe dosyalarının arkasında yatan düzeneği anlayabilmeniz için anlattım. Yalnızca, bir exe dosyasını açtığınızda çıkan karmaşık yazıların ilgili programı oluşturan makine kodlarının ASCII karşılıkları olduğunu bilmeniz yeterli.

Bu bölümde Assembly dilindeki en basit ve temel komutları göreceğiz. Assembly dilinin bu komutlardan ibaret olmadığını ve bu komutların da burada yazdığımız özelliklerinden daha fazla özelliğe sahip olduğunu bilmenizde fayda var.

Madde işaretli liste ögesi

mov   ah,5
mov   al,bh

Birincisinde ah yazmacına 5 yazılır. İkincisinde ise bh yazmacındaki veri al yazmacına kopyalanır. Mov komutuyla yalnızca eşit kapasitedeki yazmaçlar arasında kopyalama yapılabilir. Yani sonu x ile bitenler arasında veya sonu h veya l ile bitenler arasında kopyalama yapılabilir.

Bir yazmaçtaki değeri bir artırır. Örneğin:

mov al , 5
inc   al 

Burada al'nin önceki değerini 5 sayarsak artık al'nin değeri 6 olur.

Belirtilen yazmaçtaki değerle al yazmacındaki değeri çarpıp sonucu ax yazmacına koyar. Örnek:

mul   cl

Burada al yazmacındaki değerle cl yazmacındaki değer çarpılıp sonuç ax yazmacına konur.

Herhangi bir yazmaçtaki değerle herhangi sabit bir değer veya yazmaçtaki değeri toplayıp sonuç ilk belirtilen yazmaca koyulur. Örnekler:

add   al,1
add   al,cl

Birincisinde al ile 1 toplanıp sonuç al'ye atanır. Yani sonuçta al bir artırılmış olur. İkincisinde ise al ile cl toplanıp sonuç al'ye atanır. Yani sonuçta al'ye cl eklenmiş olur. Add komutu argüman olarak yalnızca eşit kapasitedeki yazmaçları alabilir. Örneğin aşağıdaki komut hatalıdır.

add   ax,cl

Herhangi bir yazmaçtan sabit bir değeri ya da başka bir yazmaçtaki değeri çıkarır. Örnekler:

sub   al,10
sub   ax,cx

Birincisinde al yazmacındaki değer 10 eksilir. İkincisinde de ax yazmacındaki değer cx'teki değer kadar eksilir. Sub komutu da tıpkı add gibi eşit kapasiteli yazmaçlarla işlem yapar.

Komutun argümanındaki ofset adresi ile loop komutunun bulunduğu satır arasında cx'in değeri kadar gidip gelinir. Yani bir döngü kurulmuş olur. Örnek:

14F7:100 mov   cx,5
14F7:103 inc   al
14F7:105 add   dl,al
14F7:107 loop  103
14F7:109 int   20

Burada 5 kere 103. ofset ile 107. ofset arasında gidip gelinir. Bütün yazmaçların ilk değerlerini 0 sayarsak sonuçta al'nin değeri 5, dl'nin değeri de f olur. Burada şunu gözden kaçırmamanızı öneriyorum: loop komutunun kapsama alanına giren komutlar henüz loop komutunun bulunduğu satıra gelinmeden doğal olarak bir kez çalıştırılır. Bu çalıştırılma bu bahsettiğimiz gidip gelmeye dâhildir. Öbür türlü söz konusu satırlar toplam 6 kere işletilmiş olurdu.

İki yazmaçtaki değeri ya da bir yazmaçtaki değerle sabit bir değeri kıyaslar. Tek başına bir işe yaramaz. Örnek:

14F7:100 cmp   al,bl
14F7:102 cmp   bl,5
14F7:104 cmp   5,bl
14F7:106 cmp   ax,bl

Bu komutlardan ilk ikisi çalışacak. Son ikisiyse çalışmayacak. Çünkü üçüncüsünde ilk argüman sabit bir değer. Sonuncusunda da farklı boyutlardaki yazmaçlar kıyaslanmış.

Kendisinden hemen önce gelen cmp komutuna göre programın akışını belirli bir ofsete yönlendirirler. Örnek:

14F7:100 cmp   al,bl
14F7:102 jl    10e

Burada eğer al'deki değer bl'den küçükse akış 10e ofsetine yönledirilecektir. Değilse program normal şekilde akışına devam edecektir. Tahmin edebileceğiniz gibi jl küçüktür anlamına geliyor. Mantığı bununla tamamen aynı olan farklı komutlar da vardır. Bunlar

jg → büyüktür.
jl → küçüktür.
je → eşittir.
jge → büyük eşittir.
jle → küçük eşittir.

Belirli bir ofsete atlamaya yarar. Örnek:

14F7:144 jmp   110

Burada programın akışı 110. ofsete yönlendirilir.

Şimdiye kadar tek gördüğümüz int servisi, int 21'di. Bu derste bu ve diğer birkaç önemli int servisini göreceğiz.

Belirli bir işlevi yoktur. Ah yazmacında bulunan değere göre farklı bir anlam kazanır. Buna int 10'un farklı fonksiyonları diyebiliriz. Yani int 10, kullanıldığı anda ah yazmacında hangi değer varsa int 10'un o fonksiyonunu kullandık demektir.

İmleci (kursör) konumlandırmak için kullanılır. Bu sayede yazacağımız yazıyı ekranın istediğimiz bir yerine yazabiliriz. Düzgün çalışabilmesi için yazmaçların durumu şöyle olmalıdır:

dh → satır no (0-18)
dl → sütun no (0-4f)
bh → 0 (geçerli pencereyi belirtmek için)
Örnek program:

14F4:0100 mov   ah,2
14F4:0102 mov   dh,1
14F4:0104 mov   dl,1
14F4:0106 mov   bh,0
14F4:0108 int   10
14F4:010A mov   dl,41
14F4:010C int   21
14F4:010E mov   ah,0
14F4:0110 int   16
14F4:0112 int   20

Bu programdaki sondan ikinci ve üçüncü satırlar programın bir tuşa basılıncaya kadar beklemesini sağlarlar. Bunu daha sonra göreceğiz. Bu program ekranın (2,2) noktasına A yazıp bir tuşa basılıncaya kadar bekleyecek ve bir tuşa basıldığında da kapanacaktır. Ayrıca bilgisayar saymaya 0'dan başladığı için koordinatları belirtirken insanların kullandığı sayıların bir eksiğini yazmalıyız. Örneğimizde dh ve dl yazmaçlarına 2 yerine 1 koyduk.

Ekranı renklendirmek (var olan renkleri değiştirmek) için kullanılır. Düzgün olarak çalışabilmesi için yazmaçların durumu şöyle olmalıdır:

al → 0 (aktif pencereyi belirtmek için)
ch → renklendirilmek istenen dikdörtgensel bölgenin sol üst köşesinin ordinatı (0-18)
cl → renklendirilmek istenen dikdörtgensel bölgenin sol üst köşesinin apsisi (0-4f)
dh → renklendirilmek istenen dikdörtgensel bölgenin sağ alt köşesinin ordinatı (0-18)
dl → renklendirilmek istenen dikdörtgensel bölgenin sağ alt köşesinin apsisi (0-4f)
bh → renk
Bh yazmacına renk kodu şu mantıkla koyulur:

Elimize 8 basamaklı ikilik düzende bir sayı alırız.
Bu sayının sağdan itibaren ilk üç basamağı önplan rengini belirtir. Basamaklar soldan itibaren sırasıyla kırmızı, yeşil ve maviyi temsil eder. Eğer ilgili basamak 1 olursa rengimize ilgili rengin karıştığı, eğer ilgili basamak 0'sa ilgili rengin karışmadığı anlamına gelir.
Elimizdeki sayının sağdan itibaren dördüncü basamağı ilgili önplan renginin parlak mı yoksa sönük mü olacağını belirtmek için kullanılır. Dördüncü basamak 1'se önplan rengi parlak, değilse sönüktür.
Elimizdeki sayının sağdan itibaren beşinci, altıncı ve yedinci basamağı arkaplan rengini belirtir. Bunun dışında önplan rengini belirtmek için kullanılan bitlerden farkı yoktur.
Elimizdeki sayının sağdan itibaren son, soldan itibaren ilk biti yazının yanıp sönmesini sağlar. Eğer ilgili basamak 1'se yazı yanıp söner, ilgili basamak 0'sa olduğu gibi kalır.
Son olarak elimizdeki ikilik düzendeki sayı on altılık düzene çevrilir ve bh yazmacına yazmaya hazır hâle getirilir. Örnek program:
14F4:0100 mov   al,0
14F4:0102 mov   ch,2
14F4:0104 mov   cl,9
14F4:0106 mov   dh,6
14F4:0108 mov   dl,12
14F4:010A mov   bh,9c
14F4:010C mov   ah,6
14F4:010E int   10
14F4:0110 mov   ah,0
14F4:0112 int   16
14F4:0114 int   20

Bu programdaki sondan ikinci ve üçüncü satırlar programın bir tuşa basılıncaya kadar beklemesini sağlarlar. Bunu daha sonra göreceğiz. Programımızda dikkat etmemiz gereken noktalar:

İnsanlar bir şeyi sayarken 1'den başlarlar. Ancak bilgisayar programlama dillerinde 0'dan başlanır. O yüzden dikdörtgenin koordinatlarını belirtirken örneğin 2 yazdığımızda aslında 3. karakterden bahsediyor oluyoruz.
Debug'da bütün sayılar on altılık düzende olduğu için 5. satırdaki 12 aslında 18 sayısını ifade ediyor.
Bu örnek zaten yazılı olan yazıları ihmal edecek ve o yazıların üstünü boyayarak görünmez hâle getirecektir. Şimdi isterseniz imleç konumlandırma ile ilgilenen 2. fonksiyonu da işin içine katalım ve daha gelişmiş bir örnek yapalım. Bu sayede ön plan renginin değiştiğini ve yazının yanıp söndüğünü görebileceğiz.
14F4:0100 MOV     AL,00
14F4:0102 MOV     CH,01
14F4:0104 MOV     CL,09
14F4:0106 MOV     DH,06
14F4:0108 MOV     DL,12
14F4:010A MOV     BH,9C
14F4:010C MOV     AH,06
14F4:010E INT     10
14F4:0110 MOV     AH,02
14F4:0112 MOV     DH,01
14F4:0114 MOV     DL,08
14F4:0116 MOV     BH,00
14F4:0118 INT     10
14F4:011A MOV     DX,0127
14F4:011D MOV     AH,09
14F4:011F INT     21
14F4:0121 MOV     AH,00
14F4:0123 INT     16
14F4:0125 INT     20
14F4:0127 DB      "deneme$"

Bu programdaki deneme yazısının d harfi renklendirilmiş alanın dışında kalır. Diğer kısımları ise alanın içindedir. Yazının yanıp söndüğünü görmek için ekranı tam ekran yapmanız gerekebilir. (alt+enter)

Belirli bir işlevi yoktur. Ah yazmacında bulunan değere göre farklı bir anlam kazanır. Buna int 16'nın farklı fonksiyonları diyebiliriz. Yani int 16, kullanıldığı anda ah yazmacında hangi değer varsa int 16'nın o fonksiyonunu kullandık demektir.

Program, klavyeden herhangi bir tuşa basılana kadar bekler. Basılan tuş al yazmacına koyulur. Örnek:

mov   ah,0
int   16

Bu fonksiyonu kullanıcıdan girdi almak yerine programı bir tuşa basılana kadar bekletmek için kullanın. Çünkü kullanıcının girdiği tuş ekrana yazılmaz. Kullanıcıdan veri girişi için ileride göreceğimiz int 21'in 1. fonsiyonunu kullanın.

Programı sonlandırır. Örnek:

int 20

Burada program hiçbir şey yapılmadan sonlandırılır.

Belirli bir işlevi yoktur. Ah yazmacında bulunan değere göre farklı bir anlam kazanır. Buna int 21'in farklı fonksiyonları diyebiliriz. Yani int 21, kullanıldığı anda ah yazmacında hangi değer varsa int 21'in o fonksiyonunu kullandık demektir.

Klavyeden veri girişi için beklenir. Klavyeden girilen tuş al yazmacına koyulur. Örnek:

mov   ah,1
int   21
int   20

Burada program kullanıcıdan klavyeden bir tuşa basması için bekler. Kullanıcı klavyeden bir tuşa bastığında basılan tuşun ASCII kodu al yazmacına koyulur.

Dl yazmacındaki karakteri ekrana yazar. Örnek: 

mov   ah,1
int   21
mov   dl,al
mov   ah,2
int   21
int   20

Bu program kullanıcının girdiği karakteri tekrar ekrana yazar.
NOT: Karakterler bellek gözeneklerinde ve yazmaçlarda ASCII kodlarla saklanır. Yani aslında her karakterin (harfin, rakamın, simgenin, vb.) aslında bir ASCII kodu vardır. Aslında bellekte karakterler değil bunların ASCII kodları saklanır. 1. ve 2. fonksiyonların yaptığı iş karakterle ASCII kod arasında dönüşüm yapmaktır. Yani 1. fonksiyon karakteri ASCII koda dönüştürüp bu sayıyı al yazmacına koyar. 2. fonksiyon da ASCII kodu karaktere dönüştürüp karakteri ekrana yazar. ASCII kodlar hakkında şuradan bilgi alabilirsiniz. Örneğin A karakterinin ASCII kod karşılığı 41'dir (on altılık düzende). Bellekte de A değil, 41 saklanır.

Bunu daha önce görmüştük. Ancak yine de anlatmak istiyorum. Bu fonksiyon dx yazmacında belirtilen ofset adresinden itibaren $ karakteri ile karşılaşana kadar karakterleri ekrana yazar. Örnek:

14F7:100 mov   ah,9
14F7:102 mov   dx,109
14F7:105 int   21
14F7:107 int   20
14F7:109 db    "merhaba",24

Gördüğünüz gibi db komutunu klasik şekilde yazımızı " karakterleri arasına yazabileceğimiz gibi her bir karakterin ASCII kodunu kullanarak ve bu kodları virgülle ayırarak da yazabiliyoruz. 24, $ karakterinin ASCII kodudur. Eğer 109. ofseti db "merhaba",41,24 olarak değiştirirsek bu sefer ekrana merhabaA yazılır.

Bu fonsiyon int 20'nin yaptığının aynısını yapar. Yani programı sonlandırır. Örnek:

mov   ah,4c
int   21

Assembly kodlarını yazmak ve makine koduna dönüştürmek için C:\WINDOWS\System32 klasöründeki debug programını kullanacağız. Bu programı komut isteminde debug yazıp enter'a basarak çalıştırabilirsiniz. Debug programı çalıştığında komut isteminde en solda bir çizgi görünür. Bu çizgi bize debug modunda olduğumuzu söyler. Assembly moduna geçmek için, yani Assembly dilini kullanarak bellek gözeneklerine komut ya da veri girebilmek için a komutunu kullanırız. Şimdiye kadar yaptıklarımızı destekçi olması açısından bir görelim:

Assembly modunda bellek gözeneklerine Assembly dilini kullanarak komut ve veri gireriz. Bellek gözenekleri arasında dolaşmak için enter tuşunu kullanırız. Yani bir bellek gözeneğine veri girdikten sonra enter'a basarsak sonraki bellek gözeneği veri girilmesi için aktifleştirilir. Assembly modundan çıkmak için ilgili bellek gözeneğine hiçbir şey yazmadan enter'a basarız. Soldaki : ile ayrılmış sayılar bize hangi bellek gözeneğinde olduğumuzu söylerler. İlk sayı bellek gözeneğinin segment adresi, ikinci sayı da ofset adresidir. Sizde segment adresi değişebilir ama ofset adresinin buradaki gibi 100 olması gerekir. segment:ofset yöntemi belleği adreslemek için kullanılan bir yönemdir. 64 KB'lık bellek bölümlerinin her birine bir segment denir. Bir segmentteki her bir bayta da ofset denir. X86 mimarisinde üzerinde işlem yapılabilen en küçük bellek gözeneği 1 bayttır. Şimdi Assembly modunda ilk programımızı yazalım:

Assembly dilinde asıl komutla komutun kullandığı argümanlar (örneğin mov ile ah,9) arasında en az bir boşluk bırakılması gerekir. Ancak ben daha okunaklı olması için tab kullanıyorum. Sizin de tab kullanmanızı tavsiye ediyorum. Ayrıca Assembly dilinin büyük-küçük harf duyarlılığı olmayan bir dil olduğunu bilmenizde fayda var. Kodları inceleyecek olursak

Mov herhangi bir yazmaca bir değer yazılmasını sağlar. Yazmacın şimdilik işlemcinin içindeki veri depolamaya yarayan gözenekler olduğunu bilmeniz yeterli. En çok kullanacağımız yazmaçlar al, ah, ax, bl, bh, bx, cl, ch, cx, dl, dh ve dx'tir. Asıl yazmaçlar sonu x ile bitenlerdir ve 2 bayt veri depolayabilirler. Sonu l ile bitenler ilgili x'li yazmacın düşük değerlikli baytını, sonu h ile bitenler de ilgili x'li yazmacın yüksek değerlikli baytını ifade eder.
Int önceden yazılmış bir servisi çalıştırmak için kullanılır. Windows'un içine gömülü çeşitli int servisleri bulunmaktadır. int 21 servisinin 9. fonksiyonu ekrana yazı yazdırmaya yarar. Bu fonksiyon dx yazmacındaki ofsetten itibaren $ karakterine kadar olan bütün karakterleri ekrana yazdırmaya yarar. Int 21, fonksiyonunu ah yazmacından alır. Int 20 servisi programı sonlandırır.
Db talimatı ise bellek gözeneklerine komut değil de karakter yazılmasını sağlar.
Buraya kadar bellek gözeneklerine çeşitli veri ve komutlar girdik. Ancak henüz komutları çalıştırmadık. Komutları çalıştırmak için assembly modundan çıktıktan hemen sonra g komutunu veririz.

Bu yazdığımız programı sabit diske kaydetmek içinse sırasıyla şu adımları izleriz:

Cx yazmacına programın boyutunu yazarız. Debug modundayken bir yazmaçtaki değeri değiştirmek için r yazmaç komutu kullanılır. Cx yazmacındaki değeri değiştirmek için tabii ki doğal olarak r cx komutunu vermemiz gerekir. Bu komutu verdikten sonra ilgili yazmaçtaki hâli hazırdaki değer gösterilip yeni bir değer girişi için beklenir. Yeni bir değer girmek istemiyorsak sadece entera basılır. Programın boyunu bulmak içinse ilk ofsetle son ofset arasındaki aralığı sayabilirsiniz. Örneğimizde 100. ofsete ilk komutumuzu yazmışız, son sınır ofset de 111 olmuş. O hâlde programımızın boyutu 11 bayttır. İllaki 11 bayt yazmak zorunda değilsiniz. 11 veya daha yüksek bir değer yazabilirsiniz. Ancak 11 yazarsanız sabit diskten tasarruf yapmış olursunuz.
N komutu ile dosyamıza isim veririz. Örneğin dosyamızın isminin program.com olmasını istiyorsak n program.com komutunu veririz.
Son olarak w komutunu veririz.
Debug programından çıkmak için q komutunu veririz.
Dosyamız debug programını hangi klasördeyken başlatmışsak o klasörde oluşur.

Debug programındaki bütün sayılar 16'lık sayı sistemindedir. Dolayısıyla bütün hesaplamalar 16'lık düzene göre yapılmalıdır.
Assembly modunda yazdığımız her kod bir baytlık değildir. Hatta çoğu kodlar bellekte 2-3 bayt yer kaplar. Dolayısıyla ofsetler arasında 2'şer 3'er atlamalar olağandır.
Talimatlar (örneğin db gibi) komutların aksine assembly modunda yazılır yazılmaz çalıştırılır. Halbuki komutlar henüz çalıştırılmaz. Yalnızca ilgili komut ilgili bellek gözeneğine yazılır.
Şimdilik yalnızca com uzantılı program dosyaları oluşturabiliriz.
Yalnızca a komutunu verirsek aktif segment ve aktif ofset Assembly komutlarını girmek için açılır. Debug programını ilk açtığımızda aktif segment herhangi boş bir segment yapılır. Aktif ofsetse debug programı ilk açıldığında daima 100'dür. Ancak kod yazdıkça aktif ofset zamanla değişir. Henüz aktif segmenti değiştirmeyeceğimiz ve bunlar biraz ileri konular olduğu için biz şimdilik sadece ofsetlerle ilgileneceğiz. Assembly modunu aktif ofsette değil de istediğimiz bir ofsette açmak için  debug modundayken a ofset komutunu kullanırız. Örnek:
-a 102

Burada aktif segmentteki 102. ofset Assembly kodları girişi için açılır ve biz kodları girip entera bastıkça aktif ofset değişir.

Adın ne?
What is your name? (informal)
What is thy name?
Grammatical Analysis:
ad - name
adın - thy name (ı auxilliary vowel, n second person singular possessive suffix)
ne - what
nedir - what is
İsmin ne?
What is your name? (informal)
What is thy name?
Grammatical Analysis:
isim - name
ismin - thy name (i auxilliary vowel, n second person singular possessive suffix)
ne - what
nedir - what is
Adınız nedir?
What is your name? (formal)
Grammatical Analysis:
ad - name
adın - your name (ı auxilliary vowel, nız second person plural possessive suffix)
ne - what
nedir - what is
İsminiz nedir?
What is your name? (formal)
Grammatical Analysis:
isim - name
isminiz - your name (i auxilliary vowel, niz second person plural possessive suffix)
ne - what
nedir - what is
Adınız nedir?
What is your name? (formal)
Grammatical Analysis:
ad - name
adın - your name (ı auxilliary vowel, nız second person plural possessive suffix)
ne - what
nedir - what is
Adım ...dır
My name is...
Grammatical Analysis:
ad - name
adım - my name (ı auxilliary vowel, m first person singular possessive suffix)
...dır - is... (it may not be used)
İsmim ...dır
My name is...
Grammatical Analysis:
isim - name
ismim - my name (i auxilliary vowel, m first person singular possessive suffix)
...dır - is... (it may not be used)
Examples:
Adım Hasan'dır. / Adım Hasan. My name is Hasan.
İsmim Ayşe'dir. / İsmim Ayşe. My name is Ayşe.
Adım Dilek'tir. / Adım Dilek. My name is Dilek.
İsmim Ali'dir. / İsmim Ali. My name is Ali.
Adım Tosun'dur. / Adım Tosun. My name is Tosun.
İsmim Güngör'dür. / Adım Güngör. My name is Güngör.

Yoga Kılavuzu
Bu kılavuz, yoga pratiğini entegre etmek isteyenler için hazırlanmıştır. Yoga'nın fiziksel, zihinsel ve kültürel faydalarını bilimsel temellerle birleştirir. Yoga, antik Hint felsefesinden modern wellness'a uzanan bir köprüdür. WHO'ya göre düzenli yoga, stresi %25 azaltır ve kalp sağlığını güçlendirir.

Yoga, beden-zihin-ruh dengesini hedefler. Temel prensipler:

Asana (Pozlar): Fiziksel duruşlar, esnekliği artırır.
Pranayama (Nefes Teknikleri): Solunum kontrolü, oksijen alımını optimize eder.
Dhyana (Meditasyon): Zihinsel odak, anksiyeteyi azaltır.

Bilimsel çalışmalar, yoga'nın faydalarını doğrular:

Kalp-damar sağlığı: Haftada 3 seans, kan basıncını %10 düşürür (Harvard Health).
Zihinsel iyi oluş: Mavi Bölgeler araştırmasına göre sosyal yoga grupları ömrü 7 yıl uzatır.
Bulgar kültürü entegrasyonu: Horo halk danslarıyla birleştirin, hem eğlence hem terapi.

Başlangıç seviyesinde 5 poz:

Dağ Pozu (Tadasana): Ayaklar birleşik, kollar yukarı. Fayda: Denge geliştirir. Süre: 1 dk.
Ağaç Pozu (Vrksasana): Bir ayak topuğu diğer dizde. Fayda: Konsantrasyon artırır.
Kedi-İnek Akışı (Marjaryasana-Bitilasana): Dört ayak üstünde sırtı yuvarla-gerdir. Fayda: Omurga esnekliği.
Çocuk Pozu (Balasana): Dizler üstünde öne eğil. Fayda: Stres atar.
Savasana (Ceset Pozu): Sırt üstü yat, rahatla. Fayda: Tam dinlenme.
Uygulama ipucu: Sabahları yoğurtlu kahvaltıyla başlayın, probiyotikler yoga etkisini %30 artırır (Avrupa Beslenme Dergisi).

Sofya Sağlık Vakfı (DHF-BG). "Sofya'da Sağlıklı Yaşam Rehberi". [1].
Mavi Bölgeler Projesi. "Uzun Ömür Sırları". Erişim: 2025.

Yuzarsif Felsefesi, 21. yüzyılda ortaya çıkan, bireyin toplumsal, siyasal ve bilişsel düzeyde "otomatikleştirilmiş" kitle karşısında bilinçli bir gözlemci olarak konumlandığı, sistemin çürümüş yapısına karşı varoluşsal bir başkaldırı geliştirdiği felsefî düşünce sistemidir. Bu felsefe; bireysel farkındalık, kolektif bilinç, gözlemcilik, sistem eleştirisi, entelektüel yalnızlık ve bilinç temelli direniş gibi kavramları merkezine alır. "NPC" (Non-Player Character) metaforu etrafında şekillenen yapı, insanın özgür iradesine yabancılaşmasını, bilgiye erişim çağında düşünme tembelliğiyle silinip gitmesini ve eleştirel aklın kolektif yapılar içinde nasıl bastırıldığını ele alır.
Yuzarsif felsefesi; klasik anlamda bir okul değil, felsefî direnişin dijital çağda yeniden biçimlenmiş hâlidir. Bu bağlamda hem bir etik öneri, hem bir epistemolojik pozisyon, hem de bir varoluş tanımı sunar.

Yuzarsif Felsefesi, dijital çağın bilgi bolluğu ile bilgi manipülasyonu arasındaki çelişkide doğmuştur. Sosyal medya çağında herkesin konuştuğu ama çok azının düşündüğü bir dönemde, birey; gerçeklik, hakikat ve adalet gibi kavramlara ulaşmakta zorlanmaktadır. Bu felsefenin kurucusu Yuzarsif, 2020’li yılların küresel ve yerel politik bunalımları, medya çarpıtmaları ve toplumun kutuplaşması karşısında bireyin yalnızlaşmasını ve "uyananların" yok sayılmasını temel problematik olarak ele alır.
Yuzarsif’e göre birey, sadece düşünmeyen bir sürüye değil, aynı zamanda bilinçli olanlara da sistematik bir şekilde düşmanlaştırılmış bir sosyal düzene karşı mücadele etmektedir. Bu durum, bireyin entelektüel yalnızlığını kaçınılmaz kılar.

=== NPC Türleri === Yuzarsif Felsefesi, "NPC" kavramını tek tip bir figür olarak değil, çeşitli zihinsel ve davranışsal varyasyonlarla açıklanan bir yelpaze olarak ele alır. Her biri farklı kaynaklardan beslenerek otomatikleşmiş ve sorgulama reflekslerini kaybetmiş birey tipolojileridir:
İnanç NPC’si: Geleneksel inanç kalıplarını, dini ya da ideolojik dogmaları sorgulamadan kabul eden bireylerdir. İnanç, bireyin değil, otoritenin cümlesiyle şekillenir.
Propaganda NPC’si: Siyasal liderlik kültlerine, medya manipülasyonlarına ve resmî söylemlere körü körüne bağlıdır. Sorgulamak yerine ezberler ve tekrar eder.
Konfor NPC’si: Farkındalığa ulaşsa bile hiçbir sorumluluk almak istemeyen, sessizliği huzurla karıştıran birey tipidir. "Ben karışmam" tavrı, sistemin en stabil destekçisidir.
Zombi NPC: Gerçeklikten tamamen kopmuş, sistemin çöküş sinyallerini bile algılayamayan, neredeyse refleksif düzeyde yaşayan bir bilinçsizlik halidir. En tehlikeli olanı budur çünkü farkında bile değildir.

Bu türler, NPC'liğin bir çeşit bilinçsizlik spektrumunda yer aldığını gösterir. Her birey potansiyel bir NPC'dir; Yuzarsif Felsefesi bu durumu teşhis etmek ve bu zihinsel otomasyonu kırmak için vardır.
=== NPC (Non-Player Character) === "NPC", Yuzarsif Felsefesi'nin temel simgesidir. Kavram, video oyunlarında oyuncu tarafından kontrol edilmeyen karakterleri tanımlar. Felsefede ise bu, dış etkenlerle yönlendirilen, eleştirel düşünce geliştirmemiş, sorgulamayan ve sistemin enformasyon akışına kayıtsız şartsız teslim olmuş bireyleri temsil eder. NPC’ler seçim yapmaz; onlar için seçim yapılır. Bu karakterler çoğu zaman aile, medya, gelenek, ideoloji veya dinsel dogmalar tarafından belirlenmiş bir dünyada yaşar ve bunları sorgulamak yerine tekrar eder.
=== Bilinçli Gözlemci === NPC’nin karşıtı olarak tanımlanan "bilinçli gözlemci"; sistemin çelişkilerini gören, sorgulayan ve fakat çoğu zaman bu gözlem gücü nedeniyle yalnızlaşan bireydir. Gözlemci, gerçekliği fark ettiği için artık toplumla tam uyum sağlayamaz. Bu gözlemcilik pozisyonu, bir tür tanrısal bakıştır: her şeyi görür ama müdahale edemez. Aynı zamanda trajiktir, çünkü farkındalık arttıkça eylem imkânı daralır.
=== Kolektif Farkındalık Ağı === Yuzarsif Felsefesi, bireysel uyanışı yüceltmekle birlikte bunun tek başına yeterli olmayacağını vurgular. Sistem ancak kolektif farkındalıkla çöker. Bu nedenle, bilinçli bireylerin bir araya gelerek oluşturduğu zihinsel ağ, hem bir sığınak hem de bir devrim alanıdır.
=== Sessiz Direniş === Açık muhalefetin bastırıldığı sistemlerde, sessizlik bir direnme biçimidir. Yuzarsif Felsefesi, sistemin diline katılmamayı, onun jestlerine dahil olmamayı bir stratejik eylemsizlik olarak tanımlar. "Sistem konuşurken susmak, sistemin içinde görünür olup ona ait olmamak" ilkesini benimser.

=== Ontolojik Konum === Yuzarsif Felsefesi'nde insan, doğası gereği bilinç potansiyeline sahip bir varlıktır. Ancak bu potansiyelin açığa çıkması sosyal ve kültürel yapılar tarafından engellenir. Gerçeklik, görünür olandan ibaret değildir; esas olan, görünmeyeni sezmektir. Var olmak, gözlemlemek ve sezmekle mümkündür.
=== Epistemoloji: Bilgi, Bozulmuş Koddur === Bilgi, sistem tarafından yozlaştırılmıştır. Medya, siyaset ve ideolojik yapılar bilgiye virüs bulaştırır. Yuzarsif Felsefesi, bilgiye ulaşmanın değil, bilgi ile zehirlenmiş zihni temizlemenin yollarını arar. "Bildiğini unutmak, yeniden düşünmenin ön koşuludur."
=== Etik: Direniş, Ahlakın Yeni Biçimidir === İyi ve kötü, artık sistemin onayına göre değil; bireyin içsel bilincine göre tanımlanmalıdır. Yuzarsif Felsefesi, eylemsizliği, konuşmamayı, katılmamayı ve yalnızlığı bir etik duruş olarak tanımlar. Vicdan, toplumsal beklentiden değil, hakikati sezmeye çalışan bilinçten doğmalıdır.
=== Estetik: Çöküşün Güzelliği === Bu felsefeye göre, dünyadaki çürüme, başlı başına bir estetik nesnedir. NPC'lerin çoğaldığı bir evrende, bilinçli bireyin trajedisi yüce olanın alanına girer. Trajedi, estetikle birleştiğinde bilinci büyütür.

Gerçeklik, sana gösterilen değil; senin fark ettiğindir.
Bilinç acıtır. Acı yoksa, düşünmüyorsun.
Herkes NPC olabilir. Ama sen olmak zorunda değilsin.
Anlaşılmamak, doğru düşündüğünün kanıtıdır.
Umutsuzluk, umut pornografisine karşı bir şifadır.
Dil sustuğunda, zihin konuşmaya başlar.
Senin gibi düşünen biri varsa, bu sistem sonsuza dek işlemeyecek demektir.

Yuzarsif Felsefesi yalnızca bireyin bilinciyle değil, bu bilincin karşı karşıya kaldığı sistemsel yapılarla da ilgilenir. Devlet, tarihsel olarak düzeni sağlayan bir çerçeve gibi görünse de, Yuzarsif’e göre zaman içinde mutlak bir otoriteye evrilme potansiyeli taşır. Otorite bir kez tek merkezde toplandığında, onu elinde tutanların halkı birer araç, birer kitle, birer "NPC" gibi görmesi kaçınılmazdır.
Örnek olarak Türkiye gibi ülkelerde görüldüğü üzere, iktidar gücünü pekiştiren siyasal yapıların en yaygın stratejisi halkı kutuplaştırmak, kullanmak ve kendi tahtını halkın sırtında yükseltmektir. Bu süreçte NPC’ler sadece edilgen kitleler değildir; aynı zamanda sistemin yeniden üreticileridir. Çünkü bilinçten uzaklaştırılmış birey, kendisini ezen yapıya aidiyet gösterir.
Yuzarsif Felsefesi'ne göre NPC'liğin bir diğer nedeni de, gücü elinde bulunduran ancak empati yoksunu olan elit kesimin toplumu araçsallaştırmasıdır. Bu elit yapı, halkı kullanarak kendi çıkarlarını yüceltir; hakikati çarpıtarak kitleleri manipüle eder. Böylece NPC’ler, hem mağdur hem fail hâline gelir.
Bu insanlar zaman içinde psikolojik ve ruhsal olarak yıpransalar da, farkındalık tohumlarını taşıdıkları sürece bilinçli gözlemcilik konumuna geçme potansiyeline sahiptirler. Var olmak, bazen sadece dayanmakla mümkündür.

Yuzarsif Felsefesi henüz kuramsal olarak yeni doğmuş bir düşünce sistemidir. Geniş halk kitleleri veya akademik çevreler tarafından henüz tanınmamış olsa da, dijital platformlar aracılığıyla potansiyel taşıyan bir düşünsel akım olarak şekillenmektedir. İlkeleri ve kavramları; bireylerin içsel dünyalarında yankı buldukça, daha fazla tartışılacak ve gelişecektir.

Yuzarsif, "NPC Olmayanların Manifestosu", kişisel yayın.
Alternatif Düşünce Toplulukları Arasında Yükselen Bilinç Akımları, Bağımsız Makale Serisi.
Dijital Felsefe, Kolektif Blog Yayını, 2024.   

Yuzarsif Felsefesi, 21. yüzyılda ortaya çıkan, bireyin toplumsal, siyasal ve bilişsel düzeyde "otomatikleştirilmiş" kitle karşısında bilinçli bir gözlemci olarak konumlandığı, sistemin çürümüş yapısına karşı varoluşsal bir başkaldırı geliştirdiği felsefî düşünce sistemidir. Bu felsefe; bireysel farkındalık, kolektif bilinç, gözlemcilik, sistem eleştirisi, entelektüel yalnızlık ve bilinç temelli direniş gibi kavramları merkezine alır. "NPC" (Non-Player Character) metaforu etrafında şekillenen yapı, insanın özgür iradesine yabancılaşmasını, bilgiye erişim çağında düşünme tembelliğiyle silinip gitmesini ve eleştirel aklın kolektif yapılar içinde nasıl bastırıldığını ele alır.
Yuzarsif felsefesi; klasik anlamda bir okul değil, felsefî direnişin dijital çağda yeniden biçimlenmiş hâlidir. Bu bağlamda hem bir etik öneri, hem bir epistemolojik pozisyon, hem de bir varoluş tanımı sunar.

Yuzarsif Felsefesi, dijital çağın bilgi bolluğu ile bilgi manipülasyonu arasındaki çelişkide doğmuştur. Sosyal medya çağında herkesin konuştuğu ama çok azının düşündüğü bir dönemde, birey; gerçeklik, hakikat ve adalet gibi kavramlara ulaşmakta zorlanmaktadır. Bu felsefenin kurucusu Yuzarsif, 2020’li yılların küresel ve yerel politik bunalımları, medya çarpıtmaları ve toplumun kutuplaşması karşısında bireyin yalnızlaşmasını ve "uyananların" yok sayılmasını temel problematik olarak ele alır.
Yuzarsif’e göre birey, sadece düşünmeyen bir sürüye değil, aynı zamanda bilinçli olanlara da sistematik bir şekilde düşmanlaştırılmış bir sosyal düzene karşı mücadele etmektedir. Bu durum, bireyin entelektüel yalnızlığını kaçınılmaz kılar.

=== NPC Türleri === Yuzarsif Felsefesi, "NPC" kavramını tek tip bir figür olarak değil, çeşitli zihinsel ve davranışsal varyasyonlarla açıklanan bir yelpaze olarak ele alır. Her biri farklı kaynaklardan beslenerek otomatikleşmiş ve sorgulama reflekslerini kaybetmiş birey tipolojileridir:
İnanç NPC’si: Geleneksel inanç kalıplarını, dini ya da ideolojik dogmaları sorgulamadan kabul eden bireylerdir. İnanç, bireyin değil, otoritenin cümlesiyle şekillenir.
Propaganda NPC’si: Siyasal liderlik kültlerine, medya mani

Zaza alfabesi 32 harften oluşur.

X: Zazacada, Kürtçede ve ayrıca Tatarca’da ve Azerice’de kullanılır. Boğazdan gelen gırtlaksı bir H sesidir. Normal H sesinden biraz daha sert ve hırıltılıdır. H sesi hiçbir engele takılmadan çıkarken, bu ses boğazın üst kısmında titreşir.  Arapçadaki Hı (خ) harfidir. Azericenin resmi harflerinden birisidir. İç ve Doğu Anadolu ağızlarında sıklıkla rastlanır. Örneğin: Baxmax (Bakmak) fiilinin okunuşu Baḥmaḥ şeklindedir ancak kelimenin içindeki h harfleri gırtlaktan ve hırıltılı olarak çıkartılır. Çaxmax (Çaḥmaḥ; Çakmak), Yanmax (Yanmaḥ; Yanmak)… Bu sesin Türkçedeki kullanımında çoğu zaman birbirlerine çok yakın kaynaklardan çıkan Arapçadaki Ha (ح) harfi ile olan farkı  ortadan kalkmıştır (Ⱨ, Ḩ).
W: Zazacada, Kürtçede ve ayrıca Tatarca’da ve Türkmence’de kullanılır. Açık bir V harfidir. Klasik V sesinden kesinlikle farklıdır. V harfinde dudaklar birbirine değerken, bu seste (W harfinde) tıpkı U sesinde olduğu gibi dudakların birbirine değmesi söz konusu değildir. Arapçadaki Vav (و) ve batı dillerindeki w sesi başlıca örneklerdir. Örneğin: Dawul (Davul), Hawlu (Havlu),Yawaş (Yavaş).
Ê: Zazacada, Kürtçede ve ayrıca Gagavuzca'da kullanılır. Uzatılarak okunan ince bir e sesidir. Bu harfe Kürtçe ve Zazaca kelimeler de yine yoğun olarak rastlanır. Türkçe’de sâdece birkaç kelimede mevcut olduğu için kullanımı öngörülmemiştir. Ancak yine de dilimizdeki bir iki kelimenin okunuşu ile bir fikir edinmemiz mümkündür. Örneğin: Mêmur, Poêtika, Nêyzen, Têlif...
Î: Zazacada,Türkçe’de ve Kürtçede kullanılır. Uzatılarak okunan ince bir i sesidir. Kullanımda İ harfindeki noktanın üzerine işâret koyulması çift noktalama gerektirdiğinden yalnızca düzeltme imi kullanılır, nokta düşer. Örneğin: Millî, Dînî, Çîdem, Dîdem, Îzan, Mîde...
Û: Zazacada, Kürtçede ve Türkçe’de kullanılır. Hafif uzatılarak okunan ince bir u sesidir. Doğru kullanım için kural olarak biraz uzatılması gerekir. Örneğin: Sükûnet, Mûris, Mûzip, Sûni…
Q: Zazacada, Kürtçede ve ayrıca Tatarca’da ve Azerice’de kullanılır. Anadolu Türkçesindeki gırtlağa yakın olarak çıkarılan kalın K harfini gösterir. Örneğin: Qomşu (Komşu)... Bazı Türki dillerde ise yine kalın K sesine yakın olarak gırtlaktan çıkarılan kalın bir G sesini karşılar. İç Anadolu ve Doğu Anadolu ağızlarında yaygın olarak kullanılır. Azeri Türkçesinin resmi harflerinden birisidir. Arapçadaki Kaf (ق) harfini karşılar. Örneğin: Qadın (Kadın) sözcüğünün okunuşu "Gadın" şeklindedir. Baştaki G sesi gırtlaktan ve kalın bir tonla söylenir. (Kimi lehçelerde ise ve bu sese oldukça yakın olan kalın gırtlaksı bir K sesi olarak okunur ve söylenir.)

Ķ: Gırtlaktan çıkan ve Q sesine oldukça yakın olan kalın bir K sesi olarak okunur ve söylenir. Örneğin: Ķurt, Ķoyun, Ķardaş (Kardeş). K sesleri gırtlaktan ve kalın olarak çıkarılır. Kazakça Қасқыр (Ⱪasⱪır: Kurt), Қой (Ⱪoy: Koyun) sözcüklerinde olduğu gibi. Bu sözcüklerdeki K sesleri gırtlaktan ve kalın olarak çıkarılır. Başkurtça'daki Ҡалын (Kalın) sözcüğünün çevirisi Ⱪalın olarak yapılır ve okunuşu Qalın (Kalın/Galın) biçimindedir. Baştaki K veya G sesi gırtlaktan ve kalın bir tonla söylenir. Türkçedeki İnceltme İmi ile yazılan bazı sözcüklerin okunuşunda aslında K harfinin de incelmesi söz konusudur. Örneğin: Ⱪar ve Kâr... Pek çok lehçe ve şivede Q sesine dönüşmüştür. Örneğin: Qayın (Kayın)… Yüzyıllarca Osmanlı Devleti tarafından yönetilmiş olan Tunus ve Cezayir Arapçasında Türkçedeki gırtlaktan söylenen K harfine benzeyen bir sesi karşılamak için noktasız  ٯ  harfi kullanılır.
Ḩ: Arapçadaki Ha (ح) harfidir. Boğazdan gelen gırtlaksı bir H sesidir. Normal H sesinden biraz daha kalın, boğumlu ve hırıltılıdır. H sesi hiçbir engele takılmadan çıkarken, bu ses boğazın orta kısmında titreşir.  Örneğin: Maⱨrem (Mahrem)...  Bu sese en uygun örneklerden birisi de Ⱨacı (Hacı) sözcüğüdür. Anadolu Türkçesinin halk ağzındaki ve Azericedeki kullanımında Arapçadaki Hı (خ) harfi ile olan farkı çoğu zaman ortadan kalkmıştır (X).
Zazacanın bütün Zazalar tarafından ortak kullanılan bir alfabesi henüz yoktur. Kronolojik olarak kullanılan alfabeler şunlardır:

1899'da Diyarbakır'da yayımlanmış olan Ahmedi Hasi'nin Mevlidi ile birlikte kullanılan bu alfabe dönemin Arap karakterli Kürt alfabesi ile aynıdır. Günümüzde dini içerikli kitaplar dışında bu alfabe pek kullanılmamaktadır. Bu alfabede normal Arapça alfabede olmayan şu harfler vardır:
پ : P 
چ : Ç 
ژ : J 
ڤ : V (W ve Û için normal "و" harfi kullanılır) 
گ : G

Modern Zazaca edebiyatıyla birlikte Zazaca yazınında Kürt dilbilimci Celadet Bedirhan tarafından geliştirlmiş olan latin karakterli Kürtçe alfabe kullanılmaya başlandı. 1996'dan beri Zazaca'nın standartlaştırılması üzerine çalışmalar yapan Vate Çalışma Grubu da yayınlarında Kürt alfabelerinden Bedirhan alfabesi'ni kullanmaktadır. Bu alfabe 31 harften oluşmaktadır:
A B C Ç D E Ê F G  H  İ Î J K L M N O P Q R S Ş T U Û V W X Y Z
Ê-ê E ve İ arasında, Fransızcadaki "é" sesine yakındır: été. 
I-i Türkçedeki I hrfi olup, küçük yazılınca noktalı, büyük yazılınca noktasızdır. 
Î-î Türkçedeki İ harfine denk gelir. 
Q-q Arapçadaki "kaf" (ق) sesini verir: kanun, kalem. 
U-u Türkçedeki U ve I arasında W+I sesini verir. 
Û-û Türkçedeki normal U sesi gibidir. 
W-w Azericedeki "w" sesini verir: watan 
X-x Arapçadaki kalın H (خ) sesi ile Ğ (غ) sesini verir: xeber

Bu alfabe Amerikalı dilbilimci C. M Jacobson'un katkılarından dolayı Jacobson Alfabesi olarak da bilinir. Alfabedeki 32 harf şunlardır: 
A B C Ç D E Ê F G Ğ  H  I İ J K L M N O P Q R S Ş T U Û V W X Y Z
Bedirhan alfebesine göre Ğ harfi fazla olup, I-ı ve İ-i harfleri Türkçedeki gibi yazılır ve okunur. (î harfi de kullanılır. Örneğin hîni (hîyni gibi okunur) derken Hıni aynı sesi vermez.)

Zülfü Selcan tarafından hazırlanan ve 2012 itibariyle Tunceli Üniversitesi'nde de kullanılmaya başlanan Zaza Alfabesi, 8’i sesli ve 24’ü sessiz olan 32 harften oluşur:
a, b, c, ç, (ḉ), d, e, ê, f, g, h, (ḥ), ı, i, k, (ḳ), l, m, n, o, p, (ṗ), q, r, (ṙ), s, ş, t, (ṭ), u, ü, v, w, x, ẋ, y, z, ẓ
Bunlardan bazı harfler Kuzey ve Güney lehçelerine göre farklı farklı okunur:

c = Kuzey [dz] / Güney [ʤ]
ç = Kuzey [ts] (kalın seslilerden önce: a, e, ı, o, u), [ʧ] (ince seslilerden önce: ê, i, ü), / Güney [ʧ]
ḳ [kʾ], ṗ [pʾ], ṭ tʾ = yalnızca Kuzey lehçesinde kullanılır (Güney lehçesindeki karşılıkları: k, p, t) ve bunları kh, ph, th şeklinde bileşik harflerle yazmak yanlış ve sakıncalıdır.
r, ṙ = Zaza dilinde her ikisi de ayırdedilir. r’nin uzatılan telafuzu ṙ’dir.
s, ş = Kuzey lehçesinde kalın ( a, e, ı, o, u) seslerden önce kullanılırken, ş ince (ê, i, ü) seslerden önce kullanılır. Güney lehçesinde her iki durumda da ş sesini verir.
z, ẓ = Kuzey lehçesinde z, Güney lehçesinde ẓ. Noktalı z (ẓ) harfi Türkçedeki j sesini verir
ẋ = [ɣ] = ğ

Eriller
-ος
Tekil iyelik hali -ου
Tekil, dört farklı hal ekleri: Yalın -ος, i hali -ο, iyelik hali -ου, seslenme hali -ε
Çoğul, üç farklı hal ekin: Yalın hal -οι, İyelik hali -ους, -i hali -ων
Çoğul, iyelik hal -ων
-ης -ας nadiren -ές -ούς
Tekil iyelik hal -η -α -έ -ού (Yalın haldeki ς düşer)
Tekil -i hali, -η -α -έ -ού (Yalın haldeki ς düşer)
Çoğul,
Çoğul, Yalın ve -i hali -ες (bazen -είς)
Çoğul, iyelik hali -ων
Dişiller
-η -α nadiren -ού
Tekil, iyelik hali -ης -ας -ούς (Yalın halin sonuna ς eklenir)
Tekil, -i hali -η -α -ού (ς düşer)
Çoğul, -ης -ας ile biten eriller gibi
-ος
-ος ile biten eriller gibi
Nötrler
-ο -ι
Tekil, iyelik hal -ου
Tekil, -i hali ile yalın hali aynı
Çoğul, Yalın ya da -i haline -α
Çoğul, iyelik hal -ων
-μα -μο -ς -ν -ος
Tekil, iyelik hal -(τ)ος (bazen -ους)
Tekil, -i hali ile yalın hali aynı
Çoğul
Çoğul, Yalın ya da -i haline -α (bazen -η)
Çoğul, iyelik hal -ων

αρσενικό
-ος ile biten bir çok isim erildir ve aşağıdaki şekilde çekimlenirler: 

Eril, tekil -i halinde, yalın halin sonundaki -ς düşer. Bu kural -oς ile bitmeyen eriller için de geçerlidir. 
-oς ile biten bir diğer kelime άνθρωπος – İnsanhdır. Bu kelime ilk hecede tonlansa da, aksan işareti tekil ve çoğul -i ve iyelik hallerinde ikinci hecede tonlanır: 
άνθρωπο (tekil -i hali), ama ανθρώπους (Çoğul -i hali).
-ος eki çok yaygın bir kelime sonu olsa da, -ας ve -ης ile biten eriller de vardır.

-ές, -ούς und -έας ile biten eril adlar aşağıdaki şekilde çekimlenirler

-a kadar: (έ)ως
acaba: μήπως
acele: επείγων -ουσα -ον
acele etmek: βιάζομαι
acı: πικρός -ή -ό
açık: ανοιχτός -ή -ό
ad: όνομα (το)
ada: νησί (το)
adam: άνθρωπος (ο), άντρας/άνδρας (ο)
akademi: ακαδημία (η)
aktör: ηθοποιός (ο)
aktris: ηθοποιός (η)
alfabe: αλφάβητο (το)
alışveriş: ψώνια (τα)
alışveriş yapmak: κάνω ψώνια, ψωνίζω
alkol: αλκοόλ (το)
altı: έξι
altmış: εξήντα
am: μουνί (το)
amcık: μουνάκι (το)
Amerika: Αμερική (η)
anadil: μητρική γλώσσα (η)
anahtar: κλειδί (το)
ancak: όμως
androloji: ανδρολογία (η)
anlamak: καταλαβαίνω
anne: μητέρα (η), μαμά (η)
antik: αρχαίος -α -ο
antropolog: ανθρωπολόγος (ο)
antropoloji: ανθρωπολογία (η)
araba: αυτοκίνητο (το)
arama: τηλεφώνημα (το)
aramak: ψάχνω
arkeolog: αρχαιολόγος (ο)
arkeoloji: αρχαιολογία (η)
armut: αχλάδι (το)
asansör: ασανσέρ (το), ανελκυστήρας (ο)
asla: ποτέ
at: άλογο (το)
ateş: φωτιά (η)
Avrupa: Ευρώπη (η)
Avrupa Birliği: Ευρωπαϊκή Ένωση (η)
Avrupaî: ευρωπαϊκός -ή -ό
ay: μήνας (ο) (yılın ayı), σελήνη (η) (uydu), φεγγάρι (το) (uydu)
ayak: πόδι (το)
ayı: αρκούδα (η)

baba: πατέρας (ο)
bacak: πόδι (το)
bahçe: κήπος (ο)
balık: ψάρι (το)
balıkçı: ψαράς (ο)
bardak: ποτήρι (το)
bıçak: μαχαίρι (το)
bıyık: μουστάκι (το)
bibliyografi: βιβλιογραφία (η)
bilet: εισιτήριο (το)
bilmek: ξέρω
bir: ένας, μία, ένα
bir şey: κάτι
birisi: κάποιος -α -ο
bisiklet: ποδήλατο (το)
biyoloji: βιολογία (η)
biyolojik: βιολογικός -ή -ό
bulunmak: βρίσκομαι
buzdolabı: ψυγείο (το)
bürokrasi: γραφειοκρατία (η)

cacık: τζατζίκι (το)
cami: τζαμί (το)
ceket: σακάκι (το), μπουφάν (το)
cep: τσέπη (η)
cep telefonu: κινητό τηλέφωνο (το), κινητό (το)
coğrafya: γεωγραφία (η)

çakmak: αναπτήρας (ο)
çalışma masası: γραφείο (το)
çatal: πηρούνι (το)
çay: τσάι (το)
Çin: Κίνα (η)
çözmek: λύνω, επιλύω
çünkü: γιατί, επειδή, διότι

dağ: βουνό (το)
daha: πιο
defter: τετράδιο (το)
demokrasi: δημοκρατία (η)
deniz: θάλασσα (η)
derece: βαθμός (ο)
dev: γιγάντιος -α -ο
diş: δόντι (το)
diş ağrısı: οδοντόπονος (ο)
diş fırçası: οδοντόβουρτσα (η)
diş hekimi: οδοντίατρος (ο)
diş macunu: οδοντόπαστα (η)
doğa: φύση (η)
domuz: χοίρος (ο)
domuz eti: χοιρινό (το)
dondurma: παγωτό (το)
drama: δράμα (το)
duş: ντους (το)
düşünmek: νομίζω

-e kadar: (έ)ως
edebi: λογοτεχνικός -ή -ό
edebiyat: λογοτεχνία (η)
eğlence: διασκέδαση (η)
ekmek: ψωμί (το)
el: χέρι (το)
elli: πενήντα
elma: μήλο (το)
elmas: διαμάντι (το)
epitet: επίθετο (το)
eski: παλιός -ά -ό
eşek: γάϊδαρος (ο)
et: κρέας (το)
Etiyopya: Αιθιοπία (η)
etrafında: γύρω από
ev: σπίτι (το)
evlilik: γάμος (ο)

fakülte: σχολή (η)
Fas: Μαρόκο (το)
fikir: ιδέα (η)
fizik: φυσική (η)
fizikçi: φυσικός (ο)
fiziksel: φυσικός -ή -ό

gemi: πλοίο (το), καράβι (το)
gömlek: πουκάμισο (το)
görmek: βλέπω
görünmek: φαίνομαι
görüş: άποψη (η); όραση (η)
göz: μάτι (το)
güç: δύναμη (η)
güneş: ήλιος (ο)

hasta: άρρωστος -η -ο, ασθενής (ο)
hayalet: φάντασμα (το)
hayat: ζωή (η)
hayvan: ζώο (το)
hesap makinesi: αριθμομηχανή (η)
heves: ζήλος (ο)
Hırvatistan: Κροατία (η)
hız: ταχύτητα (η)
hiçbir şey: τίποτα
hidroliz: υδρόλυση (η)
hidrolize etmek: υδρολύω
hikâye: ιστορία (η)

Irak: Ιράκ (το)
ıslak: υγρός -ή -ό

içmek: πίνω
iki: δύο
İncil: Βίβλος (η)
inek: αγελάδα (η)
insan: άνθρωπος (ο)
İran: Ιράν (το)
isim: όνομα (το)
istemek: θέλω
iyi: καλός -ή -ό

Japonya: Ιαπωνία (η)
jinekolog: γυναικολόγος (ο)
jinekoloji: γυναικολογία (η)

kadar: ως, έως
kadın: γυναίκα (η)
kadife: βελούδο (το)
Kahire: Κάιρο (το)
kahvaltı: πρωινό (το)
kahve: καφές (ο)
kahverengi: καστανός -ή -ό
kahverengi saç: καστανά μαλλιά (τα)
kakao: κακάο (το)
kalp: καρδιά (η)
kapı: πόρτα (η)
kara: μαύρος -η -ο
karın: στομάχι (το)
karın ağrısı: στομαχόπονος (ο)
karpuz: καρπούζι (το)
kart: κάρτα (η)
kaşık: κουτάλι (το)
kat: πάτωμα (το)
Katar: Κατάρ (το)
kedi: γάτα (η)
kedicik: ψιψίνα (η)
kelebek: πεταλούδα (η)
kesmek: κόβω
kırmızı: κόκκινος -η -ο
kız: κόρη (η), κορίτσι (το), κοπέλα (η)
kilise: εκκλησία (η)
kim: ποιος -α -ο
kimin: ποιανού -ής -ού, τίνος
kimya: χημεία (η)
kimyasal: χημικός -ή -ό
kimyasal tepkime: χημική αντίδραση (η)
kitap: βιβλίο (το)
koyun: πρόβατο (το)
köfte: κεφτές (ο)
köpek: σκύλος (ο)
kör: τυφλός -ή -ό
kuş: πουλί (το)

lakap: ψευδώνυμο (το)
lamba: λάμπα (η)
lokanta: εστιατόριο (το)

makas: ψαλίδι (το)
masa: τραπέζι (το)
matematik: μαθηματικά (τα)
mavi: μπλε
mektup: γράμμα (το)
merdiven: σκάλα (η)
mizojini: μισογυνία (η)

nasıl: πώς
ne: τι
ne zaman: πότε
neden: λόγος (ο), γιατί (soru)
nehir: ποτάμι (το)
nerede: πού
niçin: γιατί
niye: γιατί

o: αυτός -ή -ό
o hâlde: λοιπόν
ofis: γραφείο (το)
okul: σχολείο (το)
omuz: ώμος (ο)
osurmak: κλάνω

öksürmek: βήχω
öksürük: βήχας (ο)
ölü: νεκρός -ή -ό
ölüm: θάνατος (ο)

para: χρήματα (τα), λεφτά (τα)
parmak: δάχτυλο (το)
pasaport: διαβατήριο (το)
pedagog: παιδαγωγός (ο)
pedagoji: παιδαγωγία (η)
pediatrik: παιδιατρικός -ή -ό
pencere: παράθυρο (το)
peynir: τυρί (το)
psikoloji: ψυχολογία (η)

randevu: ραντεβού (το)
renk: χρώμα (το)
resim: εικόνα (η)
resim yapmak: ζωγραφίζω
restoran: εστιατόριο (το)
revani: ραβανί (το)
rüya: όνειρο (το)

sabah: πρωί (το)
saç: μαλλιά (τα)
sakal: γένια (τα)
sarı: κίτρινος -η -ο
sarı saç: ξανθά μαλλιά (τα)
sıcak: ζεστός -ή -ό; ζέστη (η)
sıcaklık: θερμοκρασία (η)
sıçmak: χέζω
sindirim: πέψη (η)
sinema: κινηματογράφος (ο); σινεμά (το)
sinemaya gitmek: πάω σινεμά
siyah: μαύρος -η -ο
siyah saç: μαύρα μαλλιά (τα)
soyad: επώνυμο (το)
su: νερό (το)
süt: γάλα (το)

şapka: καπέλο (το)
şarkı: τραγούδι (το)
şart: προϋπόθεση (η)
şemsiye: ομπρέλα (η)
şişe: μπουκάλι (το)

tabak: πιάτο (το)
taş: λίθος (ο), πέτρα (η)
tavan: ταβάνι (το)
tavuk: κότα (η)
tavuk eti: κοτόπουλο (το)
tehlike: κίνδυνος (ο)
telefon: τηλέφωνο (το)
televizyon: τηλεόραση (η)
tepsi: δίσκος (ο)
tutulma: έκλειψη (η)
Türk-İslam: τουρκοϊσλαμικός -ή -ό
Türk kahvesi: τουρκικός καφές (ο)

uzo: ούζο (το)
uzun: μακρύς -ιά -ύ
uzun boylu: ψηλός -ή -ό

üç: τρία, τρεις
üçgen: τρίγωνο (το)
ülke: χώρα (η)
üzüm: σταφύλι (το)

vadi: κοιλάδα (η)

yalan: ψέμα (το)
yalan söylemek: ψεύδομαι
yaşam: ζωή (η)
yaşamak: ζω
yaşlanmış: ηλικιωμένος -η -ο
yatak: κρεβάτι (το)
yazmak: γράφω
yedi: επτά, εφτά
yemek: φαγητό (το) (isim), τρώω (fiil)
yeşil: πράσινος -η -ο
yıl: έτος (το), χρόνος (ο)
yılan: φίδι (το)
yoğurt: γιαούρτι (το)
Yunan: Έλληνας (ο) (erkek), Ελληνίδα (η) (bayan), ελληνικός -ή -ό (şey)
Yunanistan: Ελλάδα (η)
yüksek: ψηλός -ή -ό

zaman: χρόνος (ο)
zooloji: ζωολογία (η)
zoolojik: ζωολογικός -ή -ό

αγάπη, η aşk, sevgi
αμαρτία, η günah
Αμερική, η Amerika
αναπτήρας, ο çakmak
αρτοπωλείο, το ekmek dükkânı, fırın

Γάτα η  kedi

διαβατήριο, το pasaport
δώρο, το hediye

εισιτήριο, το bilet
εστιατόριο, το restoran, lokanta
ευρωπαϊκός -ή -ό Avrupaî; Ευρωπαϊκή Ένωση, η Avrupa Birliği
Ευρώπη, η Avrupa
έως -a/-e kadar

ζέστη, η sıcak

ήλιος, ο güneş

θερμοκρασία, η sıcaklık

ιστορία, η hikâye

κατεβαίνω inmek
κόβω kesmek

λοιπόν o hâlde

μήπως acaba

νομίζω düşünmek

ξέρω bilmek

όμως ancak

παίρνω almak

ραβανί, το revani

τελικά sonunda

φούρνος, ο fırın

χρήματα, τα para
χρώμα, το renk
χώρα, η ülke

ψαλίδι, το makas
ψαράς, ο balıkçı
ψάρι, το balık
ψέμα, το yalan
ψιψίνα, η kedicik
ψωμί, το ekmek
ψώνια, τα alışveriş

ώμος, ο omuz
ως -a/-e kadar

Almanca Wie heißt du?
İngilizce What's your name?

Yunanca Πώς σε λένε; / Πώς λέγεσαι; / Ποιο είναι το όνομά σου;

Fransızca Comment t'appelles-tu?
İspanyolca ¿Cómo te llamas?
İtalyanca Come ti chiami?

Lehçe Jak masz na imię? / Jak się nazywasz?
Rusça Как тебя зовут? (Kak tibya zovut?)
Boşnakça Kako se zoveš?

İrlandaca Cén t-ainm atá ort?

Farsça نام تو چیست/چیه (Nam-e tu çîst/çiye)
Kürtçe/Kurmanci Navê te çi ye?
Kürtçe/Sorani ناوی تو چیه (Nawi tu çiye)
Kürtçe/Feyli ناوت چس/چیه (Nawit çes/çiye)
Zazaca Nomey tu çiye?
Peştunca ستا نوم څه دی (Sita nom tse di)
Beluçi ته نام چی اینت (Te nam çi ent)

Hintçe तुम्हारा नाम क्या है (Tumhaara naam kya hai)
Urduca تمهارا نام کیا ہے (Tumhaara naam kya he)
Bengalce তোমার নাম কি (Tumar nam ki)
Doğu Pencapça ਤੁਹਾਡਾ ਨਾਮ ਕੀ ਹੈ (Tuhaada naam ki hai)
Batı Pencapça تہاڈا نام کی ہے (Tuhaada naam ki hai)
Sindhi توهان جو نالو ڇا آهي (Tuhaan jo naalo chha aahe)
Marathi आपले नाव काय आहे (Aaple naav kay aahe)

Azerice Adın nə?
Kazakça Атың кім?
Korece 당신의 이름은 무엇입니까? (Dangşin'ıy irım ın muoşimnigga?)
Moğolca Нэр чинь юу вэ (Nér çin yuu vé?)
Kırgızca Атың ким?
Özbekçe Isming nima?
Türkmence Adyň näme?
Uygurca ئېتىڭ نېمە؟

Amharca ስምህ ምን ነው? (erkek), ስምሽ ምን ነው? (bayan)
Arapça ما اسمك /mā ismuke/
Suriye Arapçası شو اسمك (Şu ismek)
Mısır Arapçası اسمك ایه (İsmek eih)
Hicaz Arapçası ایش اسمك (Eiş ismek)
Irak arapçası شسمك (Şismek)
Maltaca X'jismek

Almanca Wie geht es dir?
İngilizce How are you?

Yunanca Πώς είσαι; / Τι κάνεις;

Fransızca Comment vas-tu ? / Comment ça va ? / Ça va ?
İspanyolca ¿Cómo estás?
İtalyanca Come stai?

Çekçe Jak se máš?
Lehçe Jak się masz?
Rusça Как поживаешь? (Kak pojivayeş')
Sırpça Kako si?
Slovakça Ako sa máš?
Slovence Kako si?

İrlandaca Cén chaoi a bhfuil tú? / Conas atá tú?

Ermenice Ինչպե՞ս ես:

Farsça چطوری (Çetori)
Kürtçe/Kurmanci Çawanî/Çitanî/Çitonî
Kürtçe/Sorani چۆنی (Çonî)
Kürtçe/Feyli چونی (Çünî)
Zazaca Çitanî/Seninî
Beluçi چطورے/چونے (Çitorey/Çoney)
Peştuncaته څنگه يې؟ (Te tsenge yé)

Hintçe तुम कैसे हो (Tum kaise ho)
Urduca تم کیسے ہو (Tum keise ho)
Bengalce কেমন আছেন আপনি? (Kemon achhen apni)
Marathi कसे आहात आपण (Kase aahaat aapan)
Doğu Pencapça ਤੁਸੀਂ ਕਿਵੇਂ ਹੋ? (Tuseen kiven ho)
Batı Pencapça تسیں کویں ہو (Tuseen kiven ho)
Sindhi توهان ڪيئن آهيو (Tuhaan kee'an aahiyo)

Azerice Necəsən?
Türkmence Nähilisin
Moğolca Та хэр байна вэ? (Ta hər bayna bə?)
Özbekçe Qalaysan
Uygurca قەلەیسەن (Qeleysen)
Kazakça Қалайсын (Qalaysın)
Korece 잘 지냈어요? (Cal cinessǒyo?)
Tatarca Нәчексен (Näçeksen)

Macarca Hogy vagy?

Amharca እንዴት ነህ? (erkek), እንዴት ነሽ? (bayan)
Arapça كيف حالك؟ (Keyfe halek)
Suriye Arapçası شلونك (Şilonek)
Mısır Arapçası ازایك (İzeyyek)

Afrikanca Dankie.
Almanca Danke.
Danca Tak.
Hollandaca Dank je. (gayriresmî) / Dank u. (resmî)
İngilizce Thank you.
İsveççe Tack.
Norveççe Takk.

Yunanca Ευχαριστώ.

Arnavutça Faleminderit.

Fransızca Merci.
İspanyolca Gracias.
İtalyanca Grazie.
Portekizce Obrigado. (söyleyen erkek) / Obrigada. (söyleyen kadın)
Rumence Mulțumesc.

Belarusça Дзякую.
Boşnakça Hvala.
Bulgarca Благодаря.
Çekçe Děkuji. / Díky.
Hırvatça Hvala.
Lehçe Dziękuję. / Dzięki.
Rusça Спасибо.
Sırpça Hvala.
Slovakça Ďakujem.
Slovence Hvala.
Ukraynaca Дякую.

Letonca Paldies.
Litvanca Ačiū.

İrlandaca Go raibh maith agat.

Farsça ممنون. (Memnûn)

Hintçe धन्यवाद।

Estonca Aitäh. / Tänan.
Fince Kiitos.
Macarca Köszönöm.

Arapça شكراً.
İbranice תודה.

Kikongo Matondo.
Lingala Matondi.

Gürcüce მადლობა. (Madloba)

Çince 谢谢。

Japonca ありがとう。 (Arigatō)

Ön-Türkçe sayfasına hoş geldiniz! Burada, MÖ 500 ile MS 100 yılları arasında konuşulduğu varsayılan yeniden yapılandırılmış dilin içeriğinin Vikisözlük ile birlikte Vikikitap'ta ele almasına yardımcı olacağız. Böyle bir dil, Türklerin Ogur kabilesi batıya, Karadeniz'in kuzeyine göç etmeden önce Moğolistan'da konuşuluyordu! Bir tür Hiung-nu dili diyebileceğimiz Ön-Türkçe dili, bugün tüm Türk dillerinin atasıdır.

Genel olarak Ön-Türkçe, Ortak Türk dillerinin ve Ön-Bulgar dilinin (Ogur dillerinin atası olarak bilinir) atasıdır. Sınıflandırma konusunda anlaşmazlıklar vardır. Söz konusu kitapta adı geçen Ön-Türkçe, Türkologlar tarafından daha çok İlk-Ön-Türk olarak adlandırılmıştır.

Giriş 

Alfabe 
Sesbilim 
Söz dağarcığı tablosu 

Birinci ders: Zamirler ve Sayılar 
İkinci ders: Temeller 
Üçüncü ders: Bulunma-Ayrılma Hali ve Çoğullar 
Dördüncü ders: Geçmiş Zaman ve Ünlü Uyumu 
Beşinci ders: Söz dağarcığı 
Altıncı ders: İyelik, Belirtme ve Yönelme halleri 
Yedinci ders: Yeni sözcükler oluşturmak için kullanılan ekler 
Sekizinci ders: Fiilimsiler 
Dokuzuncu ders: Dilek ve gereklilik kipleri ve sorular 
Onuncu ders: Söz dağarcığı 2 
On birinci ders: Eşitlik, araç hali ve emir kipi 
On ikinci ders: Zarf-fiiller ve cümle oluşumu 
Son ders: Yetenekler, gelecek ve şimdiki zaman

Üçüncü Ön-Türkçe dersine hoş geldiniz!

Ön-Türkçede aynı ekin iki farklı biçimi bulunma ve ayrılma için kullanılır: bulunma *-de ve ayrılma için *-den. Ya da sadece *-de her iki durum için de kullanılabilir.

Evde iş yok. - Ebde īĺč yōk.
Ben evden geldim. - Bẹ ebde(n) kẹlti.
Günümüz Türk dillerinde şahıs zamiri zamanın sonuna eklendiğinden şahıs zamirini kullanmak zorunlu değildir. Fakat Ön-Türkçede eylemi kimin yaptığını belirtmek için şahıs zamirini kullanmak zorunludur. Çünkü Ön dilde özneyi belirten bir ek yoktur. Fakat görülen geçmiş zamanda bu durumun ayrıcalığı olabilir. Çünkü Eski Türkçede sadece geçmiş zaman için yardımcı fiil vardır ve bu Çuvaşça ile uyuşmaktadır.

ev - *eb
ocak, çadır/otağ - *ōtag
kulübe - *koĺ
deniz - *teŋiŕ
göl - *kȫl
dağ - *tāg
tepe - *tepü
orman - *orman
bataklık - *batgak
kıyı - *kïdïg

Ön-Türkçede çoğulluk kesin olmayan bir konudur. Lir ve Şaz grubunda çoğulu belirtmek için kullanılan ekler birbirinden farklıdır. Ancak, eşleştirilmiş nesnelere özgü bir ek vardır. Çok nadir kullanılır ve bugün var olmasına rağmen kullanımları sınırlıdır.

biz - *biŕ
siz - *siŕ
ikiz - *ẹkiŕ
üçüz - *üčüŕ
boylar - *okuŕ (Ogur and Oğuz kaynaklı)

Modern Türk dillerindeki çokluk eki Ön-Ortak Türkçe için *-lar, *-ler olarak yapılandırılabilir, ancak Ön-Türkçe'deki varlığı açık değildir. Ön-Türkçe için önerilen biçimler Ön-Ortak Türkçe'den farklıdır. Róna-Tas, András (1998) Ön-Türkçenin yeniden inşası ve genetik soru adlı bölümünde bu eklerin Ön-Türkçe'de bulunduğunu ve Çuvaş çokluk eki -сем'in (-sem) sonradan değiştiğini söylemektedir.
Günümüz Türk dillerindeki -lar eki, Ortak Türkçe'den Ön-Moğolca'ya -nar olarak yerleşmiş olabilir. Ön-Türkçe ile Ön-Moğolca arasındaki zaman oldukça uzundur. Ön-Türkçe MÖ 500'e kadar uzanırken, Ön-Moğolca MS 1000'e kadar gidebilir. Bu nedenle, Ön-Moğolca'daki her sözcük Ön-Türkçe olmak zorunda değildir. Moğol dilleri Ön zamanlarını yaşarken, Türk dilleri zaten gruplara ayrılmıştı.

Ön-Türkçede varlığı tartışmalı olan bir diğer ek ise *-t'dir. Bazı dilbilimciler Moğolcadan geçtiğini iddia etseler de eski Türkçede çokça bulunur. Ön-Moğolcadaki *-/d/ ve Ön-Tunguzcadaki *-/ta/, *-/te/ ile ilişkilidir. Moğolcadan geçmediyse de Tunguzca'daki varlığı Ön-Türkçe'deki varlığının kanıtı olarak gösterilebilir.

  oğullar - *ogulut

Kalıplaşmış sözcükler dışındaki bu çoğul eki artık ölüdür. Ancak bunu kanıtlamak için daha fazla örneğe ihtiyaç var.

oğullar - *ogulan
alevler - *örten
insanlar, halk - *bodun
Kurikanlar - *kurïkan (belirsiz)
şehirler, yerler - *orun (belirsiz)

Sıradaki ders: Geçmiş Zaman ve Ünlü Uyumu

Dokuzuncu Ön-Türkçe dersine hoş geldiniz!

Dilek kipi Ön-Türkçe'de tartışmalı bir konudur, çünkü yalnızca bazı dillerde vardır.

Dilek anlamı -gA ekiyle kullanılır. Eski Uygurca ve Tuvaca dahil bazı dillerde, bu ek, arkaik işaret zamiri *I (ünlü uyumunu takip eder) ile daha da birleştirilerek -gAy oluşturulmuştur (aslen sayılar ve kişiler için çekimlenmiş, ancak daha sonra çekimsiz bir zaman haline gelmiştir). Eski Türkçede bu ek, gelecek zaman eki olarak yeniden kullanılmıştır. Dilek ekleri yalnızca Türkçe, Horasan Türkçesi ve Tuvaca gibi bazı Türk dillerinde mevcuttur.

*seb- (“sev-”) → *sebge(y) (“sevse”)
*bar- (“var-”) → *barga(y) (“varsa”)

Çuvaşçada -ӗччӗ olarak görülen bu dilek eki, düzenli ses değişimleriyle (ara sıra görülen ikizlere dikkat) yeniden oluşturulmuştur.

Gereklilik anlamı son iki derste değindiğimiz *-lig ve *-me ile sağlanmaktadır.

Bu ek nedense sadece Oğuz ve Ogur dillerinde yaşıyor.

*seb- (“sev-”) → *sebmelig (“sevmeli”)
*bar- (“var-”) → *barmalïg (“varmalı”)
Türkmen ve Çuvaş dilleri için bir isim cümlesidir. Bu nedenle, isim cümlesini olumsuz yapan ekleri alır.

*sebmelig ("sevmeli”) → *sebmelig ermeŕ (“sevmemeli”)
*barmalïg (“varmalı”) → *barmalïg ermeŕ (“varmamalı”)

Aynı anlamı bu kökle de verebilirsiniz. Lir grubu için *kẹr-lig, Şaz grubu için *kẹr-ge-k.

Bana bir kılıç ve yay gerek. - Benke kïlï̄č bi(r)le yā(y) kẹrgek.

Soru zamirlerinin bulunmadığı durumlarda, sorular *-mI soru ekiyle sağlanır. Bu ek, evet ya da hayırla yanıtlanabilen sorular sorar ve kendisinden önceki maddeyi sorar.

A: Senin küçük kız kardeşin var mı? - A: Seniŋ siŋiliŋ bār mï?
B: Var/Yok. - B: Bār/yōk.
A: Senin küçük kız kardeşin mi var? - A: Seniŋ siŋiliŋ mi bār?
B: Evet/Yok. - B: Ide/yōk.
A: Sen dokuz yaşında mısın? - A: Sẹ tokuŕ yāĺta mï?
B: Evet/Hayır. - B: Ide/yōk.
A: Sen mi dokuz yaşındasın? - A: Sẹ mi tokuŕ yāĺta?
B: Evet, benim/Hayır, ben değilim. - B: Ide, bẹ/Yōk, bẹ ermeŕ.
Olumsuz soru cümlesi olduğunda cevap İngilizce'den farklıdır.

A: Sen dokuz yaşında değil misin? - A: Sẹ tokuŕ yāĺta ermeŕ mi?
B: Evet, dokuz yaşındayım ben. - B: Yōk, tokuŕ yāĺta bẹ. (gerçekte hayır, ben dokuz yaşındayım).
Edat olduğu için bazı Türk dillerinde ayrı yazılırken bazılarında ayrı yazılmaz. İle, için, değin... gibi edatlar ses değişimine uğramamışsa çoğu Türk dilinde ayrı yazılır. Ancak 'mi' edatının ses değişimine uğraması nedeniyle diller arasında farklar vardır. (ör. Türkmence barmy?, Kazakça bar ma?)

ne - *nē(me)
kim - *kem
neden - *nē(me) üčün (Gerçekte ne için?)
ne kadar, kaç - *nēnče, *kanča

Cümledeki yanıtın beklendiği yere konulur.

A: Senin adın ne? - A: Seniŋ ātïŋ nē(me)?
B: Benim adım Tou-man. - B: Beniŋ ātïm Tou-man.
A: Ne yaptın? - A: Nē(me) ēttiŋ?
B: Oturdum, bekledim - B: Olturtum, kǖtdüm.

Cümledeki yanıtın beklendiği yere konulur.

A: Sen kimsin? - A: Sẹ kem?
B: Ben Tou-man'ım. - B: Bẹ Tou-man.
A: Bunu kim yaptı? - A: Bunï kem ētti?
B: (Bunu) ben yaptım. - B: (Bunï) bẹ ētti(m).

Cümledeki yanıtın beklendiği yere konulur.

A: Sen ne için oradasın? - A: Sẹ nē(me) üčün anda?
B: Tou-man olduğum için. - B: Tou-man bolganïm üčün anda. (*-gan Ön-Türkçede bu anlamda kullanılmamış olabilir. Eski Türkçe yazıtlarda sadece -duk vardır.)
A: Bunu ne için yaptın? - A: Bunï nē(me) üčün ēttiŋ?
B: (Bunu) eğlenmek için yaptım. - B: (Bunï) bẹ̄kenmek üčün ēttim.

Bu zamiri daha önce Zamirler ve Sayılar dersimizde belirtmiştik ve hatta bir örnek bile vermiştik. Bu yüzden bunu tekrar yapmayacağız. Bununla ilgili kalan ayrıntılar Eşitlik, araç hali ve emir kipi dersinde olacak.

Soru köklerine durum eklerini ekleyerek soru zamirlerine dönüştürebilirsiniz. (örneğin: *nēnte/*kanta, *nēnten/*kantan, *nēnke/*kanka, *nēni/*kanï, *nēniŋ/kanïŋ, *nēnče/*kanča...). Bunlara ek eklemek için, belirtme ve iyelik durumları hariç durum eklerine -n- ekleyin (*nēnte değil *nēni, durum eki zaten -n- içerir). Birçok modern Türk dilinde, -n- biçimbirimsel değişkeni artık burada kaldırılmıştır.

Sıradaki ders: Söz dağarcığı 2

Onbirinci Ön-Türkçe dersine hoş geldiniz! Bu derste üç yeni hal öğreneceğiz.

Adından da anlaşılacağı gibi, bu ek eşitliği belirtir. Bu eşitlik eki, diğer haller gibi isimlerin, sıfatların sonuna gelebilir, ancak fiillere gelemez. Genellikle geldiği sözcüğü bir sıfata ya da zarfa dönüştürür ve bu nedenle yapım eki olarak kabul edilir.

*uŕïn ("uzun") → *uŕïnča ("uzunca")
*kạtïg ("katı") → *kạtïgča ("katıca")
*sebgen ("seven") → *sebgenče ("sevence")
*sogïk ("soğuk") → *sogïkča ("soğukça")
*bār ("var") → *bārča ("hepsi") (künniŋ bārčasï, tüm gün (24 saat) anlamına gelir; bārča kün, her gün anlamına gelir (haftanın, ayın veya yılın günlerini kapsar). Ancak günümüzde bu ek alınmadan da aynı anlamda kullanılabilmektedir.)
Şaz Türkçesindeki dillerde de bu ek verilmiştir.

*türük ("Türk") → *türükče ("Türkçe") (Şaz?)
*türük ("Türk") → *türük tili ("Türk dili") (Ön-Türkçe)

Sayılar bu soru zamirleriyle sorulur, ancak cevaplarken bu ek kullanılmaz.
A: Onun ne kadarçocuğu var? - A: Anïŋ nēnče/kanča bālasï bār? / Anta nēnče/kanča bāla bār?
B: Onun iki çocuğu var. - B: Anïŋ ẹk(k)i bālasï bār./Anta ẹk(k)i bāla bār.
Türkçe'deki gibi çokluk ekine gerek yoktur, çünkü çokluk sayılarla gösterilir. (ör.; üç ev, üč eb )
Sayılar hiçbir zaman eşitlik anlamında bu eki almazlar.

Bu araç hali *-Xn ile sağlanır. Ne yazık ki, bugün basmakalıp sözcükler dışında kullanılmaz. Diğer haller gibi isimden sonra gelir. Bu bağlamda, 7. ders'te bahsettiğimiz *-Xn eklerinden farklıdır.

*il(i)k ("ilk") → *il(i)kin ("ilkin, ilk önce")
*ok ("ok") → *okun ("okun")
*yāŕ ("yaz") → *yāŕïn ("yazın")
*kïĺ ("kış") → *kïĺïn ("kışın")

İle anlamında gelen *bi(r)le sözcüğü de bu hali sağlayabilir. Ayrıca kullanım alanı sınırsızdır.

*sẹ ("sen") → *sẹ bi(r)le ("senle")
*kǖŕ ("güz") → *kǖŕ bi(r)le ("güzle")
*anam ("annem") → *anam bi(r)le ("annemle")
*kāŕ ("kaz") → *kāŕ bi(r)le ("kazla")

Lir ve Şaz gruplarında emir kipi değişir.

Aşağıdaki yapılandırma Orhun yazıtlarında kullanılan dile dayanmaktadır. Örneğin, ikinci çoğul şahıs emir kipi bazı Şaz dillerinde farklılık gösterir.
Birinci şahıs emir kipi aynı zamanda istek kipidir. Çünkü kişi kendine emir veremez ve böyle bir durumda emir kipi olmadığından istek kipi kullanılır.

Not: Türkçe istek kipi -(y)AyIm ve Ön-Şaz istek kipi *-(A)yIn aynı kökten gelen sözcükler değildir. Türkçe istek kipi *-gA ben>-(y)AyIn>-(y)AyImden gelir. Ve Türkçe'deki birinci çoğul şahıs hariç tüm istek kipleri *-gA istek kipi ekiyle sağlanır. (Ör.; varayım, varasın, vara, varalım(/varak), varasınız, vara). Fakat Türkçedeki ikinci ve üçüncü şahıs emir kipleri bu derste bahsettiğimiz Ön-Şaz emir kiplerinden gelir.

Aşağıdaki yapılandırma Çuvaşça ve Volga Bulgarcası dikkate alınarak hazırlanmıştır. Çünkü Lir kolu için kaynaklar sınırlıdır.

Sıradaki ders: Zarf-fiiller ve cümle oluşumu

Sekizinci Ön-Türkçe dersine hoş geldiniz!
Önceki derslerde *-mIĺ, *-dI ya da *-Ur gibi fiil zaman eklerini öğrendik, ancak bu derste daha fazla fiil eki öğreneceğiz.

Bunlar, fiili bir isim cümlesinde kullanabilmemiz için vardır.

Ben gitmek istiyorum - Bẹ barmaknï/barmanï kǖsedi.
Herkes sevilmek ister - Bār kiĺi sebilmekni/sebilmeni kǖser.
Kalmak gitmekten zordur - Kiālma(k), kē(y)tme(k)den kạtï.
Bir kalbe girmek kolay değil midir? - Köyŋilke kīrme(k) keŋes ermeŕ mi?
Ancak, *-mA biçimi *-mA- olumsuzlama ekiyle aynıdır ve ikisi de fiiller için olduğundan, bazen anlam ayrımı yalnızca cümleyi okuyarak ya da vurguyu (veya tonu) duyarak yapılabilir. Her ikisini de aynı anda da kullanabilirsiniz. Örneğin; sebmeme ("sevmemek"), barmama ("gitmemek").

Fiil aracılığıyla nasıl olduğunu gösterir.

beni seven köpek - bẹni sebgen it
avını kapan şahin - ābïnï kapgan kïrguy
yenen balık - yēngen bālïk

Bazen fiilimsi sıfatları, sıfat zamirine dönüşür ve tek bir şey için kalıplaşmış hale gelir. Örneğin; ‎*sïč- (“sıçmak”) + ‎-gan → ‎*sïčgan (“sıçan (birisi)”) sıçan, fare için kalıplaşmış hale gelmiştir; ‎*tabïĺ- (“koşmak”) + ‎-gan → ‎*tabïĺgan (“koşan (birisi)”) tavşan için kalıplaşmış hale gelmiştir.
Bazı modern Türk dillerinde, bu ek anlamını geçmiş zamana dönüştürmüştür (belirsiz değer, ancak bazen geçmiş zaman kipi olarak da kullanılır).

*-gAn ile eş anlamlıdır.

Kullanımdaki karışıklığı gidermek için 12.derse bakın.

Bu ek, fiile "...a, ...ken" anlamını verir.
"Eğer" anlamını verir. (edat)
Günümüz Türk dillerinde fiil zarfının anlamı yeni eklerin gölgesinde kalarak varlığını yitirmiştir. Fakat eski Şaz Türk yazıtları, Volga Bulgarca yazıtları ve Çuvaşça bu anlamın Ön-Türkçe'ye ait olduğunu kanıtlamaktadır. Bu kullanımların birkaç örneğine dayandıralım.

Modern dillerde 'eğer' anlamı kastedildiğinde başına Farsça eger kelimesi eklenebilmektedir.

Fiili olumsuzlaştırır (örneğin "Ben gelmiyorum)
Yukarıdaki bölümü gibi, fiil isimleri anlamındaki *-mA ile karıştırılmamalıdır. Ön-Türkçe sözcüklerinin son hecede vurgulandığı kuralının aksine, birçok Türk dilinde *-mA- her zaman vurgusuzken, fiil isimleri her zaman vurguludur (yani sebme, "sevme", sebme', "sevmek"). Diğer zamanlara olumsuzluk katmak için, bu eki fiilin kökü ile zaman eki arasına yerleştirin (sebmedi "sevmedi", sebmemiĺ "sevmemiş").
Ancak, şimdiki zamanı olumsuzlarken (-Ur), *-mAŕ olur ve son -r → -ŕ üzerinde düzensiz damaklaşma olur (bu daha önceki Temeller dersinde açıklanmıştır). Ancak bazı dillerde Ortak Türkçe -z (< -ŕ) : -r arasında değişiklik görülmüştür, Türkmence gelmerin "gelmem": gelmez "o gelmez" gibi. Bu değişiklik, son -r- üzerindeki damaklaşmanın vurgusuz -ĭ tarafından etkilenmesinden kaynaklanır, erken dönemlerde fiiller için üçüncü tekil şahıs bağlaç eki (aşağıdaki bölüme bakın): sebmér-ĭ → sebméŕĭ > sebméŕ.

İngilizce be fiilinin aksine, Ön-Türkçe'de birden fazla bağ vardır, ancak tek bir tamamlayıcı fiil olarak çekimlenmemiştir. Bōlma(k) "olmak" için düzenli fiildir, erme(k) ise yardımcı fiildir. Ancak, ikinci fiil kusurludur, genellikle yalnızca olumlu belirli ve belirsiz geçmiş zamanlarda (erdi, ermiĺ), koşullu (erse), olumsuz şimdiki zamanda (ermeŕ) (bu zaman Özbekçe, Uygurca, Kazakça, Kırgızca ve Salarca gibi dillerde mevcuttur) ve fiil sıfatında (ergen) bulunur. Ancak, yardımcı fiil muhtemelen Eski Türkçede, şimdiki zaman biçimi erürde olduğu gibi tamamen çekimlenmiştir.
Bu fiillere ek olarak, isim veya sıfattan sonra kişisel zamirleri kullanabiliriz. Bağlaçlar açık işaretler olmadan da bırakılabilir (teŋiŕ kȫk "deniz mavidir"), birçok dilde görülen sıfır bağlaç kuralı. Ayrıca üçüncü tekil şahısta, vurgu için turur (< turma(k) "ayakta durmak") fiil biçimi de kullanılır.

İsimleri ya da sıfatları olumsuzlaştırmak için önlerine ermeŕ eklenir; ancak daha önce de söylediğimiz gibi bu form yalnızca bazı dillerde mevcuttur.

Başka bir seçenek de degülü erme(k) ya da bōlmak biçimleriyle birlikte kullanmaktır (şimdiki zaman hariç eskiyle doldurulmamış biçimler için, her iki fiilin de olumsuz biçimleri hariç tutulmuştur, ancak daha önce Eski Türkçede eski fiil tamamen çekimlenmiştir). Lir grubu hariç tüm dallarda bulunur. Bu nedenle, bunu Ön-Türkçe'ye dahil edemeyiz, ancak Ön-Şaz-Türkçe'sine dahil edebiliriz.

Fiil bağları sayı ve kişi için çekimlerdir. Sadece belirli geçmiş ve şart kiplerinde bulunur, ancak bunu önceki derslerde geçmiş zaman durumunda açıkladığımız için bu bölümde açıklanmayacaktır.
Ancak çoğu zaman kişi ve sayı için çekimlenmez, bu yine yukarıdaki gibi fiil biçimlerinden sonra kişisel zamirlerin eklenmesiyle yapılır (kẹlür ben "gelirim ben"), ancak turur üçüncü tekil şahısta, isimler ya da sıfatların aksine izin verilmez.
Ancak, bilinen geçmiş zaman, olumsuz şimdiki zaman, koşul kipi gibi belirli zamanlar kişi ve sayılar için çekimlenir. Diğer zamanların aksine, bu zamanlar fiillerden sonra zamir gerektirmez. Son eklerin kümesi başlangıçta iyelik eklerine benziyordu, ancak üçüncü şahısta -sI sesbirimsel değişkenlik yoktu. Bu nedenle, beklenen **kẹlti ben ve kẹlse ben biçimleri yerine kẹltim ve kẹlsem bulacaksınız (ancak, kẹlsem için analitik alternatif biçimler olan kẹlse ben Eski Türkçede bulunur).

Tarihsel olarak, üçüncü şahıs biçimi **-I ile biterdi, ancak daha sonra işaretsiz hale gelmiştir (-∅ işaretsiz olmak anlamına gelir). Ancak, bu son ek -mAŕ (olumsuz şimdiki zaman, artı vurgusuz **-I) ve -gAy (gelecek veya istek kipi, gelecekteki derslerde açıklanacaktır) biçiminde korunmuştur. Ancak, ikinci ek her zaman zamir gerektirir ve yapay çekime sahip değildir (beklenen **-gAm, **-gAŋ, **-gAmXŕ, vb. yoktur), oysa ilki yukarıdaki bölümdeki Türkmence değişikliği nedeniyle buraya eklenmiştir (yani, çekimler başlangıçta **-mArXm, **-mArXŋ, ... idi, son -ŕ-nin damaksıllaşma yokluğuna dikkat edin).
Ancak Oğuz, Karluk, Kıpçak kolları da dahil olmak üzere pek çok dilde birinci çoğul şahıs eki -mXŕ yerine -k ekini kullanmıştır.

Sıradaki ders: Dilek ve gereklilik kipleri ve sorular

Dördüncü Ön-Türkçe dersine hoş geldiniz!

Ön-Türkçede geçmiş zamanın iki biçimi vardır:

Görülen ya da açık geçmiş zaman dediğimiz geçmiş zaman, bir olayla birinci derecede karşılaşıldığında kullanılır. Açık olsa bile çağdaşı olmadığınız bir tarih söz konusu olduğunda bu geçmiş zamanı kullanamazsınız. Burada kastedilen kesinlik, kişinin gördüğü şeyden emin olmasıdır. Ancak buna diğer duyu organları da dahildir. Yağmur sesini duyduysanız ve bunun yağmur olduğundan eminseniz bu geçmiş zamanı kullanabilirsiniz ancak televizyon haberlerinden yağmur yağdığını öğrendiyseniz, bundan emin olsanız bile bu geçmiş zamanı kullanamazsınız. Bir başka örnek; depremi hissetmediyseniz bu geçmiş zamanı kullanamazsınız. Bu geçmiş zaman aslında birinci dereceden tanıklık edilen geçmiş zamandır. Bu şekilde adlandırmamızın sebebi Türkçede görülen geçmiş zaman olarak da anılmasıdır.

Yağmur yağdı – Yagmur yagdï.
Oturdu – Olturtï.

Eski Türkçe ve Volga Bulgarcası gibi modern kullanımların aksine, l, r ve n ünsüzlerini güçlü ünsüz biçimi (-t-) takip eder; diğer tüm sesleri ise yumuşak ünsüz biçimi (-d-) takip eder.

uçtu - *učdï
yürüdü - *yüridi
verdi - *bērti

Bir şey tartışmasız bir gerçek haline gelmişse, tanık olunmasa bile bu ek kullanılabilir. Örneğin, Edison ampulü icat etti derken geçmiş zaman ekini kullanmak yanlış değildir. Ancak diğer geçmiş zamanı da aynı şekilde kullanmak yanlış değildir.

Öğrenilen geçmiş zaman, herhangi bir olayı ikinci ya da daha yüksek derecede gördüğümüzde kullandığımız bir geçmiş zamandır. Duymakla kastedilen, olayda birinci dereceden tanık olan kimse olmadığı için kısmen zorunlu bir terimdir, ancak birinci dereceden tanık olmadığınız bir olayı televizyonda görme duyunuzla veya radyoda duyma duyunuzla öğrendiyseniz, yine de bu geçmiş zaman ekini kullanırsınız. Öğrenilen geçmiş zaman terimi semboliktir.
Kullanım alanları da oldukça geniştir. Bu geçmiş zaman, güncel olmayan tarihi olaylarda kullanılır. Bu ek, masal, destan gibi edebi eserlerde zorunlu olarak ve kısmen de roman, hikaye gibi edebi eserlerde kullanılır. Arkadaşlarınızla dedikodu yaparken de bu geçmiş zaman ekini sıklıkla kullanırsınız.

çökmüş - *čökmiĺ
gelmiş - *kẹlmiĺ

Bu iki geçmiş zaman eki geçmiş zamanın geçmiş zamanı için birleştirilebilir. Bu ek Ön dilde *-tur- (bulunmak) ve *er- (olmak) ile *-miĺ erti olarak tanımlanır ve geçmişin geçmişi olarak işlev görür. *-ti ekiyle doğrudan birleştirilmemesinin nedeni, fiilin bir kez kip aldıktan sonra ikinci kez kip alamamasıdır.

Öncelikle, seni benim için incelemişti. - İlik seni beniŋ üčün tẹrkemiĺ erti.

Geçmiş zamanın şimdiki zamanı, tıpkı isim cümlelerinde olduğu gibi *-tur- (bulunmak) ve *er- (olmak) ile sağlanır. Çünkü bir kez zamanı alan fiil, ikinci kez zamanı alamaz.
Çağdaş Türkçede, *-miĺ ile geçmiş zaman çoğunlukla konuşma dilinde kullanılırken, edebiyat ve tarihte *-miĺ yerine *-miĺ turur kullanılır. Çünkü birinin doğumu, başarıları ve ölümü gibi geçmişe ilişkin değerler her zaman değişmeyen aynı özelliklerdir.

Mustafa Kemal Atatürk 1938'de ölmüştür. - Mustafa Kemal Atatürk 1938(bïŋ tokuŕ yǖŕ otuŕ sẹkiŕ)'de ölmiĺ turur.

Şimdiki zamanın geçmiş zamanı İngilizcedeki used to zamanı ile karşılaştırılabilir. Kullanım ayrımları da birinci dereceden ve iki veya daha fazla dereceli tanıklık ile ayırt edilir.

O her gün gelirdi. - Ol bārča kün kẹlür erti.
Annem her gün babamın mezarına giderdi. - Anam bārča kün atamnïŋ yẹbegine barur ermiĺ.

Fiil olmayanlar doğrudan geçmiş zamanları alamaz. Ön-Türkçedeki *er- (olmak) fiili geçmiş zaman ekini alır ve bununla birlikte geçmiş zamanın anlamı sağlanır.

A: Ev idi. - Eb erti.
B: Hayır, abim dedi. Kulübeydi. - Yōk, ĕčey tēdi. Koĺ ermiĺ.

Ön-Türkçe dilinde, kişisel çekimler yalnızca görülen geçmiş zaman da dahil olmak üzere belirli zamanlarda mevcuttur. Kişi ve sayılar için bir çekimdir, bu nedenle sentetik zamanlar için **bẹ erti kullanmak yerine Ön-Türkçe dilinde (bẹ) ertim ("-dim") vardır (zamirler isteğe bağlıydı!). Bu son ekleri Ders 8: Fiilimsiler'de açıklayacağız.

Oğuz, Kıpçak, Karluk kolları gibi birçok modern Türk dilinde birinci tekil şahıs çoğul eki farklıdır. Bunun yerine *-k bileşenini kullanır (*erti'k).

Ünlü uyumu Ön-Türkçede önemli bir özelliktir. Özbekçe dışındaki çoğu Türk dili bu özelliği korumuştur. Yani, son ünlüsü kalın olan sözcüklere her zaman kalın ünlü ekler gelir, asla ince ünlü ek gelmez ve bunun tersi de geçerlidir. Korece, Fince, Macarca ve Moğolcanın aksine, Ön-Türkçede nötr ünlü yoktur. Bu özellikle şu anlama gelir:

Son ünlüsü a, ạ, ï, o ve u olan sözcükler her zaman kalın ünlü çeşitli son ekler alır.
Son ünlüsü e, ẹ, i, ö ve ü olan sözcükler her zaman ince ünlü çeşitli son ekler alır.
Eğer ekin yuvarlak çeşidi varsa, son ünlüsü o ve u olan sözcükler her zaman kalın yuvarlak çeşidini alırken, ö ve ü her zaman ince yuvarlak çeşidini alır.
Birçok ekin iki çeşidi vardır, ince ya da kalın çeşitler. Ön-Türkçe ekleri genellikle düz geniş ünlülere (-A-) ya da (hem yuvarlak hem de düz) dar ünlülere (-X-) sahiptir, ancak bazen sadece yuvarlak dar ünlülere (-U-) sahip olabilir, *-ur ekinde olduğu gibi ve bazen sadece yuvarlak dar ünlülere (-I-) sahip olabilir.

Sonraki derslerde, eklerin adları için -A-, -I-, -U- ve -X- ifadelerini göreceksiniz.
Belirtme hali için daha fazla tartışma Ders altı: İyelik, Belirtme ve Yönelme halleri dersinde bulunabilir.

Sıradaki ders: Söz dağarcığı

Çeşitli Türk dilleri ortak bir ataya sahiptir. Bu dilin hayatta kalan hiçbir örneği bulunmasa da (yani, belgelenmemiş), dilbilimsel yeniden yapılandırma dilin nasıl çalıştığı ve işlediği hakkında anlayış elde edilmesini sağlar.
Yine de, Ön-Türkçe hakkında sözcüksel açıklamalar vardır, ancak dil bilgisi ve biçim bilgisi hakkında çok az şey bilinmektedir. András Roná-Tas gibi bazı dilbilimciler Ön-Türkçenin yeniden yapılandırılması ve genetik soru adlı bölümünde Ön-Türkçenin dil bilgisini tanımlamışlardır. Ancak, onun yeniden yapılandırmaları, -ŕ- (renk gibi ancak yeşildeki y ile damaklaştırılmış) yerine -z- gibi Ortak Türkçe özelliklerine sahiptir ve şunu söylemiştir:

Bu nedenle, BurakD53 ve DanielWhernchend kullanıcıları, Ön-Türkçe dilbilgisini bazı kaynaklara ve ayrıca özgün araştırmalara dayanarak yeniden yapılandırmışlardır.

Bu kitabın Vikipedi'de kaynak olarak kullanılması önerilmez çünkü iki kullanıcının özgün araştırmalarını temsil eder.

Ön-Türkçe söyleyişe hoş geldiniz. Söyleyiş hakkında daha genel açıklamalar önceki derste bulunabilir.

Ön-Türkçede */ʃ/ ve */z/ sesbirimleri yoktur, bunun yerine sesbirimler *ĺ ve *ŕden geliştirilmiştir. Özgün *ń sesbirimi modern Türk dillerinde hiçbir yerde bulunmamaktadır, ancak tarihsel nedenlerle yeniden yapılandırılmıştır (ör. *ańaŕ, kayıp bir kök olan *ań- kökünden türemiştir, bkz. *ań-gɨr- > Kazakça аңызақ). Ünlüler arası ve sözcük sonu konumlarında, /b/, /d/ ve /ɡ/ sırasıyla /β/, /ð/ ve /ɣ/ sesbirimsel değişkenleri olarak söylendi. Bu tür sesbirimsel değişkenlikler, Türkçe dağ ← *tag "dağ", deve ← *tebe "deve" ve ayak ← *adak "ayak" gibi türeyen sözcüklerden bilinebilir. Ayrıca, /k/, kalın ünlülere bitişik olduğunda /q/ olarak da söylenir.

Tüm ünlüler kısa ve uzun ünlülere ayrılmaktadır. Uzun ünlüler, ünlülerin üstündeki uzatma imleriyle gösterilir, bu yüzden uzun ünlüler doğru yazım olarak ⟨ā⟩, ⟨ạ̄⟩, ⟨ē⟩, ⟨ẹ̄⟩, ⟨ī⟩, ⟨ï̄⟩, ⟨ö⟩, ⟨ȫ⟩, ⟨ü⟩ ve ⟨ǖ⟩ içerir. Ayrıca, bazı sözcükler ünlü uzunluklarına göre ayrıştırılır, örneğin *at "at" ile *āt "ad". Kalıtsal ünlü uzunluklarını kullanan birkaç Türk dili, örneğin Türkmence, Halaçça ya da Yakutça'dır; Kırgızca ünlü uzunluklarının denkleştirici uzatma süreçleriyle oluşturulduğu unutulmamalıdır.

Ön-Türkçe sözcükleri, günümüzün hemen hemen tüm Türk dillerinde olduğu gibi, tipik nitelikleriyle son hecede vurgulanır (adak "ayak", tabïĺgan "tavşan"). Ancak, olumsuzluk eki -ma/-me (gövde ile zaman eki arasına yerleştirilir), şimdiki zamandaki düzensiz yapısı da dahil olmak üzere -maŕ, -meŕ her zaman vurgusuzdur (kẹlmedi "gelmedi", kẹlmedi değil); Türkçede, hatta Eski Türkçede bile -mez (< -meŕ) eki her zaman vurguludur, oysa Çuvaşçada bu olumsuzluk ekleri tekdüze vurgulu hale gelmiştir. Bu ekler 3: Temeller (-meŕ için) ve 8: Fiilimsiler (-me için) derslerinde açıklanacaktır.
Bir fiil cümlesinde, ana vurgu her zaman yüklemden önceki ögededir. Yüklem başlangıçtaysa, vurgu yüklemdedir. Buna bağlı olarak, ögelerin konumu elbette değişebilir. Ör; Bẹ ebke tǖn kẹltim ile Ebke tǖn bẹ kẹltim ("Gece eve geldim.") arasındaki fark, Ural-Altay dillerinde olduğu gibi, ilkinde ana vurgunun tǖn, ikincisinde ise bẹ üzerinde olmasıdır. (Altı çizili ögeler yüklemlerdir.)
İsim cümlesindeki ana vurgu her zaman yüklemdedir. Ör; Bẹ ebe (turur) ("İyiyim."). Ancak, turur fiiliyle birlikte ifade edilirse, bir fiil cümlesi olur ve turur sadece isim cümlelerinde yüklemden sonra gelebildiğinden, vurgu otomatik olarak aynı ögede olacaktır. Ör; ebe (turur) bẹ ya da ebe turur bẹ. (asla "ebe bẹ turur" olmaz. Eğer bu cümleyi kurarsanız, "ebe bẹ turur" "iyi benim") anlamına gelecektir.
Zarflar hariç tek heceli sözcüklerde özel bir vurgu yoktur.

Bu tür sesbirimler arasında d-, g-, l-, ĺ-, m-, ŋ-, r-, ve ŕ- bulunur. Ön-Türkçe'de, sözcüğün başında g harfi yoktur. Ancak bazen bazı Altay savunucularına göre Ön-Türkçe dilinde sözcüğün başında g harfi vardır, çünkü Ön-Moğolca'da sözcüğün başında g vardır. Bu yapılandırmalar yanlıştır. Sözcük başındaki g sadece bir Oğuz çeşitliğidir.
Sözcüğün başında d olup olmadığı ayrı bir tartışma konusudur. Bazen bazı sözcüklerde sözcüğün başında d kabul edilir ve *dȫrt sayısı bunlardan biridir. Ancak bu çok nadir görülen bir yapılandırmadır.

İlk hece hariç hiçbir hecede o harfi yoktur. *dạmor yapılandırması yanlış bir yapılandırmadır. Doğru yapılandırması *tạmurdur.

Sıradaki ders: Zamirler ve Sayılar

Beşinci Ön-Türkçe dersine hoş geldiniz!

Lir grubunun hala yaşayan bir dile sahip olması Ön-Türkçe için söz dağarcığını geniş tutmaktadır. Farklı yapılandırmalar olsa da birbirlerine yakındırlar. Bu bizi Hiung-nu Türkçesine çok yakın bir dile götürür.
Ancak, bilinçsizce yapılan Ortak Türkçe ve Altayca yapılandırmalarına güvenmemek gerekir. Bu şekilde bilgi kirliliğinin önüne geçebilirsiniz.

su - *sub
toprak - *toprak
ateş - *ōt
rüzgar - *yẹl
Doğu Asya bozkırlarında göçebe bir hayat süren halklar için sözcükler kısadır. Bu yaşam tarzı ve çeşitli faktörler nedeniyle insanlar bir veya iki heceli köklere sahip sözcükler oluşturmuşlardır. Uzun sözcükler yalnızca son eklerle sağlanır. Yiyecek ve hayvan adları da kısa sözcüklerden oluşur.

buğday - *bodagay
arpa - *arpa
darı - *tạrïg
yumurta - *yumurtka
tuz - *tūŕ
soğan - *sogan
tavuk - *tiakïgu
et - *et
süt - *sǖt
bal - *bạl
yağ - *yāg
kiraz - *yidge (karmaşık)
çilek - *yidgelek (karmaşık)
kuş kirazı - *yïmurt
meyve, sebze - *yẹ̄miĺč
Günümüz Türk dillerinde eski Ortak Türkçe *čiye sözcüğü ile Ön-Türkçe *yidgelek sözcüğü harmanlanmıştır. Bu nedenle kalıtımlarda karışıklık yaşanmaktadır.

at - *ăt
tay - *kulum
inek - *ingek
buzağı - *buŕagu
köpek - *it
kurt - *bȫrü
tilki - *tilkü
öküz - *öküŕ
boğa - *buka
kurt - *kūrt
kuş - *kuš
küçük kuş - *torgay
şahin, doğan - *kïrguy
kartal - *bürküt
balık - *bālïk
yayın - *yāyïn
sazan - *sāŕgan
aslan - *arsïlan
yılan - *yï̄lan
sinek - *siŋek
arı - *ārï
böcek - *koŋuŕ
böcek - *bȫg
elk geyiği - *bulan
teke - *teke
koyun - *sarïk
eşek - *eĺgek (/eĺčgek)
...
Hayvanların bu dilde çok geniş bir yelpazesi vardır. Konuşulduğu yıllar düşünüldüğünde bu hiç de garip değildir.

Sıradaki ders: İyelik, Belirtme ve Yönelme halleri

Onuncu Ön-Türkçe dersine hoş geldiniz! Bu söz dağarcığı dersinin ikincisi ve bu derste sözcük bilgimizi geliştireceğiz.

Bir metinle başlayalım.

Çeviri:

Ön-Türkçede çoğullar tartışmalı bir konu olduğundan, zamirler dışındaki çoğul durumları bu metinde tekil olarak yazılmıştır. Metinde daha önce işlenmemiş bir dil bilgisi yoktur. Metinde belirtilen gövde parçaları aşağıda verilmiştir. Basit fiiller hemen ardından gelir. Zamanla ilgili sözcükler bir sonraki derste açıklanacaktır.

Bunu daha önce konuşmuştuk. Ancak yeni sözcükler öğrenmeye başladıkça, giderek daha fazla karşılaşacağınız bir durum olduğu için tekrar bahsetmemiz gerekiyor.

Yukarıda fark etmiş olabilirsiniz. *köŕ sözcüğü ve *kör- sözcüğü benzer değil mi? Yalnızca isim olduğunda r sesi damaksaldır, fiil olduğunda ise damaksal değildir.

*köŕ (“göz”) ama *kör- (“gör-”)
*semiŕ (“semiz”) ama *semir- (“semir-”)
*kūtuŕ (“deli, kızgın”) ama *kūtur- (“delir-, kız-”)

Bazı ekleri olan sözcükler damaksal değildir. Fakat eki olmadığında damaksaldır.

*sakïŕ (“sakız”) ama *sakïrtka (“kene”) (Bir Şaz dilinde r-biçiminin varlığı, sözcüğün Ön-Türkçe diline ait olduğunu kanıtlamak için yeterlidir. Çünkü Şaz Türkçesinde oluşmuş bir biçim olsaydı, bu sakïz+tka=sakïztka olurdu. Fakat bu kelime Ön dönemde oluştuğu için o biçimde değildir.)
*boguŕ (“boğaz”) ama *bogurdak (“Adem elması”)

Eklemeli bir dilde ekler dilin yapısını oluşturur. İki tür ek vardır.

Çekim ekleri yapıyı değiştirmeyen eklerdir. Çokluk ekleri, durum ekleri, zaman ekleri gibi ekler çekim ekleridir.
Fiiller sadece bir kez zaman alabilir. Eğer ikincisine ihtiyaç duyulursa, yardımcı fiil ile sağlanır.

Yapım ekleri yapıyı değiştiren eklerdir. yedinci ders'teki tüm ekler yapım ekleridir. Fiilimsiler de yapım ekleridir (fiilimsiler dersinde bahsedilen eğer anlamı yapım eki değildir.).
Olumsuzluk ekinin yapım eki olup olmadığı tartışmalıdır.

Sıradaki ders: Eşitlik, araç hali ve emir kipi

İkinci Ön-Türkçe dersine hoş geldiniz!

Fiil cümleleri, fiilin sonuna bir zaman eki eklenerek oluşturulur. Geniş zaman eki olan *-ur, *-ür ve onun zıttı olan *-maŕ, *meŕ eklerini ele alalım.

Ben atları severim. - Bẹ atïŕïg sebür.
Annem onu sevmez. - Anam anï sebmeŕ.
Ancak bazı Türk dillerinde, örneğin Türkçede, Tatarcada, hatta Eski Türkçede bu ek, *-aŕ ya da *-eŕ gibi başka bir ek ile birleştirilerek öngörülemez bir geniş zaman biçimi seçimi ortaya çıkmıştır.

Ön-Türkçe'de isim cümlesi yoktur. Bulunmak ya da olmak fiili şimdiki zamanda *-ur, *-ür ekini alır ve isim cümleleri bu şekilde sağlanır. Cümle olumluysa, herhangi bir fiil ya da sonek almayabilir.

Tavuk bir kuştur - Takïgu kuĺ (turur/erür).
Yağ meyve değildir - Yāg yẹ̄miĺč turmaŕ/ermeŕ.

anne/ana - *ana
baba - *ata
kız - *kï̄ŕ
erkek - *ēr
oğul - *ogul
abla - *eke
ağabey/abi - *ečey
küçük kız kardeş - *siŋil
küçük erkek kardeş - *ini (net değil, Ön-Ortak-Türkçe olabilir)
gelin - *kẹlin
oğul (damat) - *küdegü
baldız - *bāldïŕ
*ini sözünün açık olmamasının nedeni Ogur grubunda bulunmamasıdır. Bazen bazı kelimeler Lir Türkçesinde bulunmasalar bile (İlk-)Ön-Türkçe için yeniden yapılandırılır. Bu yapılandırmalar Ön-Ortak-Türkçe'yi içerir, Lir olmayan eski yapılandırmalar (İlk-)Ön-Türkçe değildir.

Sıradaki ders: Bulunma-Ayrılma Hali ve Çoğullar

Yedinci Ön-Türkçe dersine hoş geldiniz!
Altay dil grubuna ait diller, eklemeli dillerdir. Yeni sözcükler her zaman köklerden doğar.

Fiilden isim oluşturan ekleri tanımlamak için öncelikle bir kök fiile ihtiyacımız vardır. Bu yöntemle oluşturulan isimler (ya da sıfat, zarf) kök fiille yakın anlam taşır.

Bazı örnekler:

*uŕa- ("uza-") → *uŕak ("uzak")
*kīči- ("gıcıklan-") → *kīčik ("gıcık")
*tīre- ("dire-") → *tīrek ("direk")
*sogï- ("soğu-") → *sogïk ("soğuk")

Bazı örnekler:

*kẹl- ("gel-") → *kẹlin ("gelin")
*yarï- ("parla-") → *yarïn ("yarın")
*oy- ("atla-") → *oyun ("oyun")
*tüt- ("tüt-") → *tütün ("tütün")

*bur- ("bur-") → *burgu ("burgu")
Daha fazlası için ölü fiillere bakın.

*yum- → *yumuĺ ("iş") (ölü bir fiilden, olasılıkla *yum- ("dön-"))
Aynı ekin farklı bir işlevi daha vardır. Ama bu Fiilden fiil yapan ekler konusunun konusudur.

*kam- ("toplan-") → *kamug ("hepsi, beraber")
*agrï- ("ağrı-") → *agrïg ("ağrı")
*köpür- ("ölü fiil") → *köpürüg ("köprü")

*bat- ("bat-") → *batgak ("batak(lık)")
Daha fazlası için ölü fiillere bakın.

Bu türdeki bazı ekler anlamı değiştirmez ve çoğu ekin köke çok yakın anlamları vardır.

Bazı örnekler:

*el ("el") → *elig ("el")
*siar(ï) ("sarı") → *siarïg ("sarı")

Türkçe'deki -li ekine karşılık gelir.
Bazı örnekler:

*kǖč ("güç") → *kǖčlüg ("güçlü")
*köpür ("köprü") → *köpürlüg ("köprülü")
*us ("akıl") → *uslug ("akıllı")
*el ("el") → *ellig ("elli")
Bu eki istediğiniz herhangi bir sözcüğe ekleyerek aynı anlamı verebilirsiniz. Ama tabii ki sayılara ekleyerek yeni bir sayı elde edemezsiniz. Bu sadece elli sayısı için geçerlidir.

Türkçe'deki -sız ekine karşılık gelir.

*kǖč ("güç") → *kǖčsüŕ ("güçsüz")
*köpürüg ("köprü") → *köpürügsüŕ ("köprüsüz")
*us ("akıl") → *ussuŕ ("akılsız")
Bu eki istediğiniz herhangi bir sözcüğe ekleyerek aynı anlamı verebilirsiniz.

Türkçe'deki -lik ekine karşılık gelir.

*kǖčlüg ("güçlü") → *kǖčlüglük ("güçlülük")
*bẹ ("ben") → *benlik ("benlik")
*kara ("kara") → *kara(n)lïk ("karanlık")
*it ("köpek") → *itlik ("köpeklik")
*yubka ("ince") → *yubkalïk ("incelik")
Bu eki istediğiniz herhangi bir sözcüğe ekleyerek aynı anlamı verebilirsiniz.

Türkçe'deki -ci ekine karşılık gelir.

*sǖt ("süt") → *sǖtči ("sütçü")
*īĺč ("iş") → *īĺčči ("işçi")
*oyun ("oyun") → *oyunčï ("oyuncu")
*sub ("su") → *subčï ("sucu")

Doğal sayılardan sıra sayıları oluşturur.
Bu ekin yapısı, sözcüğün araç eki aldıktan sonra *-čI ekini almasıyla sağlanmış olabilir.

*bīr ("bir") → *bīrinči ("birinci")
*üč ("üç") → *üčünči ("üçüncü")
*altï ("altı") → *altïnčï ("altıncı")
Bu sadece ismi bir sıfat yapar. Örneğin, "**bīrinči kẹltim (Birinci geldim)" olarak kullanılamaz. Şu şekilde kullanılmalıdır: "*bīrinči bōlsa kẹltim (Birinci olarak geldim)". Ya da aynı anlamda kullanabileceğiniz *il(i)k kelimesi vardır, ancak tek başına tam olarak aynı anlama gelmez. (örn.: *il(i)k keltim, İlk geldim).

Bu tür ekler, eylemi kimin gerçekleştirdiği, bir kişi mi yoksa birden fazla kişi mi olduğu gibi soruları, ikinci bir ek cümleye gerek kalmadan cevaplayabilir. Fiilin anlamını değiştirmezler, sadece eklerler.

Bu ek, eylemin birden fazla kişi tarafından gerçekleştirildiğini gösterir. Aynı cümle bu ek olmadan da kurulabilir, ancak bu ek fazladan sözcüklerden tasarruf sağlar. Bu anlamı, istediğiniz herhangi bir fiile bu eki ekleyerek elde edebilirsiniz.
Türkçe gibi bazı Türk dillerinde bazen bir şeyi kendi başına yapmak anlamında da kullanılır.

*kör- ("gör-") → *körüĺč- ("görüş-")
*bạk- ("bak-") → *bạkïĺč- ("bakış-")
*ur- ("vur-") → *uruĺč- ("vuruş-")
*seb- ("sev-") → *sebiĺč- ("seviş-")

Bir işin kendi kendine yapıldığını gösterir
Edilgen durumu oluşturur
Öncelikle, ana dili Türkçe olmayanlar için bunu anlamak biraz zor olabilir. Çünkü bu eklerin kullanımı son harfteki ünsüze göre değişir.
Son harfteki ünsüz t ya da n ise her zaman *-Xl ekini alır. Son harfteki ünsüz l ise her zaman *-Xn ekini alır. Ancak diğer ünsüzler Türk dillerinden Türk dillerine değişebilmekte ve bazı Türk dillerinde düzensiz olabilmektedir. Türkçede ünlü sonlarının her zaman -n eki taşıdığı, -l eki almadığı görülmüştür. Buna karşılık Kazakça bastaw sözcüğü -l ekini alarak yeni fiil bastalw olmuştur. Türkçede -l eki olmadığından başlamak, başlanmak olmuştur.
Genel olarak, *-In daha çok ilk maddedeki gibi, *-Il ise daha çok ikinci maddedeki gibi kullanılır. Bazı fiillerde, bir sonek her iki cümleye de eklenebilir. Örneğin, *kat- kelimesi t harfiyle bittiği için, *-In sonekini alamaz ve zorunlu olarak her ikisini de *-Il ile sağlar.

*seb- ("sev-") → *sebil- ("sevil-")
*seb- ("sev-") → *sebin- ("sevin-")
*ker- ("ger-") → *keril- ("geril-")
*ker- ("ger-") → *kerin- ("gerin-")
*ēn- ("in-") → *ēnil- ("inil-")
*ạt- ("at-") → *ạtïl- ("atıl-")
*ạl- ("al-") → *ạlïn- ("alın-")

Bu ek, birine bir şeyi yaptırmak ya da neden olmak anlamını sağlar.

*ol- ("ol-") → *oltur- ("oldur-")
*kẹl- ("gel-") → *kẹltür- ("geldir-")
*öl- ("öl-") → *öltür- ("öldür-")
*seb- ("sev-") → *sebtür- ("sevdir-")
Çok heceli ise *-t ekini alır.

*semir- ("semir-") → *semirt- ("semirt-")
*okï- ("oku-") → *okït- ("okut-") (Şaz grubu)
Son harfi t ya da n ise çok heceli olsa bile t harfini almaz, *-tUr biçimini alır.

*ẹlit- ("işit-") → *ẹlittür- ("işittir-")
*sebin- ("sevin-") → *sebintür- ("sevindir-")
Sözcük bu ekleri iki defa alabilir.

*kẹltür- ("geldir-") → *kẹltürt- ("geldirt-")
*öltür- ("öldür-") → *öltürt- ("öldürt-")
Kafa karıştırıcı olabileceği için birkaç örnekle açıklayalım.

O öldü. - Ol öltü.
O, onu öldürdü. - Ol anï öltürtü.
O, onu ona öldürttü. - Ol anï anka öltürtdü.

Bu ek fiillere getirilerek olumsuzluk anlamı kazandırılır.

*seb- ("sev-") → *sebme- ("sevme-")
*bar- ("var-") → *barma- ("varma-")
Olumsuzluk ekiyle ilgili daha fazla bilgi için sonraki 8: Fiilimsiler dersine bakın.

Bazı örnekler:

*tïŋ (ölü isim) → *tïŋla- ("dinle-")
*āŋ ("zeka") → *āŋla- ("anla-")
*yï̄g ("ağlayan") → *yï̄gla- ("ağla-") (Ön-Şaz)
*āb ("av") → *ābla- ("avla-") (Ön-az)

Bu, daha önce sözü edilen *-lA- ve *-n- ekleriyle sağlanır. Bu ek (bir şeye) sahip olmak anlamını verir. Bazı örnekler:

*eb ("ev") → *eblen- ("evlen-")
*āb ("av") → *āblan- ("avlan-") (Ön-Şaz)

Bu ek (bir şeyi) çevirmek anlamını verir. Sadece renklerde kullanıldığı anlaşılıyor. İşte birkaç örnek;

*kȫk (mavi/yeşil) → *kȫker- ("yeşer-")
*kara (kara) → *karar- ("karar-")
*siarïg (sarı) → *siarïgar- ("sarar-")

Bazı örnekler:

*kẹr (ölü isim) → *kẹrge- ("ihtiyaç duy-")
*em (ölü isim) → *emge- ("acı çek-")
Bazen bu fiil isim eki alıp tekrar isim olur, fakat fiillere eklenen *-gAk eki ile isimlere eklenen *-gA- eki birbirleriyle karıştırılmamalıdır. Örneğin, *bat- bir fiildir ve *-gAk ekini alarak isim olur. Fakat *kẹr bir isimdir ve *-gA- ekini alarak fiil olur ve daha sonra *-k ekini alarak tekrar isim olur. Lir grubunda aynı isim, *-lIg isimden fiil türetme ekini alır.

Ön dillerde zaman zaman ölü fiillerle karşılaşırız. Fiilden isim eki almış bir isim yaşayabilir, ancak kök fiil yeterince ihtiyaç duyulmadığında ölür. Antik yazıtlarda kullanılan herhangi bir kök artık hayatta kalmayabilir.
Dallara ayrıldıktan sonra bile yeni kökler geliştirilebilir. Örneğin, bugün sadece Oğuzlar ve Argular tarafından kullanılan çekmek geç bir oluşum olabilir. Türkçe'de havlamak köpek sesiyle ilişkilendirilebilirken, ürümek sözcüğü havlamaktan daha sık kullanılmalıydı. Çünkü ürümek Eski Türkçe ür- (üflemek) sözcüğünden gelir ve Moğolca uri- (üflemek) ile karşılaştırılır. Bu, Anadolu'da yeni bir kökün doğduğunu gösterir. İşte fiiller öylece ölmez, bazen hangi yüzyılda olursanız olun yeni kökler doğabilir.
İşte Ön-Türkçe dilinden bazı ölü fiiller:

*döle- → *dölek ("sakin, sessiz")
*topra- ("toprağa dönüşmek, kurumak") → *toprak ("toprak")
*süŋ- ("savaşmak") → *süŋgü ("süngü")
*buŕa- ("buzağı vermek") → *buŕagu ("buzağı")
*küde- → *küdegü ("damat")
*tiakï- → *tiakïgu ("tavuk")
*yum- → *yumuĺ ("iş")
*in- → *ingek ("inek")
*eĺ-(/eĺč-) → *eĺgek ("eşek")
*čï̄p- → *čï̄pgan ("çıban") (ek için bir sonraki derse (Fiilimsiler) bakın)

Sıradaki ders: Fiilimsiler

Ön-Türkçe'nin son dersine hoş geldiniz! Şimdiye kadar yanımızda olduğunuz ve Vikikitap Ön-Türkçe dersini seçtiğiniz için teşekkür ederiz.

Çuvaşça ve çoğu Türk dilinde yeterlilik anlamı bilmek fiiliyle sağlanır. Ancak Çuvaşça'da tek başına bir yapı olmasa da diğer Türk dillerinde tek başına bir yapıdır. Çuvaşça'da sistem, yapısı bakımından kesinlikle doğru bir cümle olduğundan, kendi başına bir yapı olmadığı durumunu ele alacağız.

*kẹlme ("gelme") → *kẹlme bilür ("gelebilir")
*yu(b)ma ("yıkama") → *yu(b)ma bilür ("yıkayabilir")
*sebme ("sevme") → *sebme bilür ("sevebilir")
*yạŕma ("yazma") → *yạŕma bilmeŕ ("yazabilmez")

Çuvaşça da dahil olmak üzere bazı Türk dillerinde de bulunan bir yeterlik yapısıdır.

*kẹlme ("gelme") → *kẹlme bōlur ("gelebilir")
*yu(b)ma ("yıkama") → *yu(b)ma bōlur ("yıkayabilir")
*sebme ("sevme") → *sebme bōlur ("sevebilir")
*yạŕma ("yazma") → *yạŕma bōlmaŕ ("yazabilmez")

Günümüzde Orta Asya'da kullanılmaktadır.

*kẹlme ("gelme") → *kẹl(m)e ạlar ("gelebilir")
*yu(b)ma ("yıkama") → *yu(b)(m)a ạlar ("yıkayabilir")
*sebme ("sevme") → *seb(m)e ạlar ("sevebilir")
*yạŕma ("yazma") → *yạŕ(m)a ạlmaŕ ("yazabilmez")

Eski Türkçe, Eski Uygurca, Yakutça, Çuvaşça (kesin değil), Azerice ve Türkçe'de (son iki dilde bir ek biçiminde) kullanılır. Birçok Türk dilinde bu fiil ölmüş ya da bir çekim eki olarak birleştirilmiştir. *-(y)A ya da *-(y)U yardımcı fiillerini ve *u(y)- fiilindeki olumsuz zaman eklerini alır (umaŕ, umadï, ...).

*kẹlme ("gelme") → *kẹle u(y)(u)r, *kẹlü u(y)(u)r ("gelebilir")
*yu(b)ma ("yıkama") → *yu(b)(y)a u(y)maŕ, *yu(b)(y)u u(y)maŕ ("yıkayabilmez")
*sebme ("sevme") → *sebe u(y)maŕ, *sebü u(y)maŕ ("sevebilmez")

Ön-Türkçe dilinde gelecek zaman yoktur. Günümüz Türk dillerinin çoğunda da gelecek zaman yoktur. Gelecek zaman genellikle şimdiki zaman ekiyle birlikte sağlanır.

Sadece zamanı belirtin.

*kẹlür ("gelir") → *yạrïn kẹlür ("yarın gelir")
*barur ("varır") → *bu āń(k) barur ("bu ay varır")

*barma(k) (“varmak”) → *Ol *bargu (“O varacak”)

Daha önce bahsettiğimiz bu ek ile günümüz Türk dillerinde gelecek zaman sağlanmaktadır. Ekin kullanım mantığı göz önüne alındığında, Ön-Türkçe dilinde bu ek ile gelecek zaman sağlanabilir. Ancak o dönemde bu şekilde kullanılmıyor olabilir.

*kẹlme(k) ("gelme(k)") → *kẹlme(k)či ("gelme(k)ci") → *Ol kẹlme(k)či ("O gelecek.")
*barma(k) ("varma(k)") → *barma(k)čï ("varma(k)cı")→ *Biŕ barma(k)čï ("Biz varacağız.")
*sebme(k) ("sevme(k)") → *sebme(k)či ("sevme(k)ci") → *Bẹ sebme(k)či ("Ben seveceğim.")
*olturma(k) ("oturma(k)") → *olturma(k)čï ("oturma(k)cı")→ *Sẹ olturma(k)čï ("Sen oturacaksın.")

Bu ek sadece Eski Türkçede vardır ve gerekli gelecek zaman yaratır. -dI geçmiş zamanı gibi kişisel ekleri alabilir.

*ölme(k) ("ölme(k)") → *ölsüküm ("Kaçınılmaz olarak öleceğim")

Şimdiki zaman, bulunma kipi ile sağlanabilir. Bu, Ön-Türkçe'deki *-čX ekinin mantığına benzer. Böyle bir cümle yapısı, çağdaş Türk dillerinin çoğunda kurulabilir.

*kẹlme(k) ("gelme(k)") → *kẹlme(k)de ("gelmete") → *Ol kẹlme(k)de ("O gelmekte.")
*barma(k) ("varma(k)") → *barma(k)da ("varmakta")→ *Biŕ barma(k)da ("Biz varmaktayız.")
*sebme(k) ("sevme(k)") → *sebme(k)de ("sevmekte") → *Bẹ sebme(k)de ("Ben sevmekteyim.")
*olturma(k) ("oturma(k)") → *olturma(k)da ("oturmakta")→ *Sẹ olturma(k)da ("Sen oturmaktasın.")

Bazı Şaz dillerinde yardımcı adı verilen fiillerle sağlanmıştır.

*kẹlip ("gelip", (Şaz)) → *kẹlip yorï/yüri (tam anlamıyla "gelip yürü" ancak "o geliyor." anlamında)
*bara ("-A ekiyle varmak") → *bara tur ("vara dur.") (yardımcı fiil *tur- durmak.)

Bu uzun yolculukta sizinle birlikte olmaktan çok mutluyuz. Ama ne yazık ki artık elveda deme zamanı.
Artık Ön-Türkçe hakkında her şeyi biliyorsunuz. Elbette farklı dilbilimciler tarafından yaratılmış yapılandırmalarla karşılaşacaksınız ama bunların diğer dilbilimcilerin yapılandırmalarından çok da farklı olmayacağı, yani hepsinin birbirine benzeyeceği yadsınamaz bir gerçektir. Ancak her Ön dilin bir yapılandırma olduğunu unutmayın. Bunu zihninizin bir köşesine yazarken, bu dilin Hunların yönetimi altında Doğu Asya bozkırlarında konuşulduğunu hayal edin.
Herkese elveda! Kendinize iyi bakın!

İlk Ön-Türkçe dersine hoş geldiniz!

Ben - *bẹ /be/, *ben- /bɛn-/
biz - *biŕ /birʲ/
sen - *sẹ /se/, *sen- /sɛn-/
siz - *siŕ /sirʲ/
o - *ol /ol/, *an- /än-/
onlar - *olar /olär/ (net değil)
Çuvaşça эпӗ (épĕ) sözcüğünün *ben ya da *bẹ sözcüklerinden türediği tartışma konusudur. Ancak, Çuvaşçada ek eklendiğinde п harfi м olur ve bu söz değişimi эпӗ (epĕ) sözcüğünde görülmez, bu nedenle büyük olasılıkla *bẹ sözünden türemiştir. *olar zamiri net değildir, *ol sözünden çoğul eki almıştır, Ortak Türkçe'de bunun yansımaları vardır, ancak Çuvaşçada вӗсем (vĕsem) kullanılır (bir çok Ön-Türkçe çoğul ekleri tartışmalıdır, üçüncü dersin Çoğullar bölümüne bakın).
Sözcüğün Tonyukuk yazıtında, Eski Anadolu Türkçesinde, Osmanlı Türkçesinde ve Türkçede m-n yakınlığı yaşamamış olması, bunun daha sonra gelişen bir ses gelişimi olduğunun kanıtıdır. Dolayısıyla b ile başlayan zamire n ile başlayan bir ek getirdiğimizde b harfi m'ye dönüşmez. Ayrıca ünlüyle biten zamirlere ek yaparken her zaman n ünsüzü gelir.

benim - *bẹ- > *beniŋ /beniŋ/
bizim - *biŕ- > *biŕniŋ /birʲniŋ/
senin - *sẹ- > *seniŋ /seniŋ/
sizin - *siŕ- > *siŕniŋ /sirʲniŋ/
onun - *an- > *anïŋ /änɨŋ/
onların - *olar- > *olarnïŋ /olärnɨŋ/ (net değil)
Ve diğer birçok dilin aksine, Ön-Türkçe'de dilbilgisel cinsiyet yoktur. Sadece ol vardır. Ve modern Türk dilleri gibi, cinsiyete özgü yardımcı fiiller yoktur.

Ön-Türkçe'deki sayılar ondalık tabandadır, bu yüzden ondalıklar için benzerlik genellikle daha azdır, örneğin *ẹki ("iki") ve *yẹgirmi ("yirmi") değişimi gibi, ya da anlamı belirsiz ekler eklenmesi; *altï ("altı") ve *altmïĺ ("altmış") gibi. Onlu sayılar yapmak için, onlardan sonra sayılar eklenir: *ōn bīr ("on bir"), *ōn ẹki ("on iki"), *ōn üč ("on üç"), ...

bir - *bīr /biːr/
iki - *ẹki /eki/
üç - *üč /ytʃ/
dört - *tȫrt /tøːrt/
beş - *bẹ̄ĺ /beːlʲ/
altı - *altï /ältɨ/
yedi - *yẹti /jeti/
sekiz - *sekiŕ /sɛkirʲ/
dokuz - *tokuŕ /tokurʲ/
on - *ōn /oːn/
yirmi - *yẹgirmi
otuz - *otuŕ
kırk - *kïrk
elli - *ellig
altmış - *altmïĺ
yetmiş - *yẹtmiĺ
seksen - *sẹkiŕ ōn
doksan - *tokuŕ ōn
yüz - *yǖŕ
bin - *bïŋ
Ön-Türkçe'de sorular *ka- ve *nē- ile yapılır. Bu durumda bir şeyin ne kadar olduğunu sormak için *kanča ve *nēnče sözcükleri kullanılır.
A: Ne kadar/Nice arpa var? - *Kanča/*nēnče *arpa *bār?

Sıradaki ders: Temeller

Onikinci Ön-Türkçe dersine hoş geldiniz!

Türkçe'deki gibi, temel Ön-Türkçe sözcük sırası SOV, yani özne-nesne-fiil'dir. Kesin sıra şu şekilde görünür:

Ön-Türkçede (ön) ilgeç yoktur, nesnelerden sonra gelen (son) ilgeçler bu rolü üstlenir. Ön-Türkçede bulunan bazı ilgeçlerin listesi şöyledir:

*üčün "için"
*togru "doğru"

Zarf-filler, fiilleri cümlelere bağlayan bağlaçlardır. Türk dillerinde, fiiller fiilimsilere dönüştüğünde cümlelere bağlanabilir.
İngilizcede bu çoğunlukla bağlaçlar ve ilgeçlerle yapılır. Bunu böyle çeviriyoruz. Ancak fiillerin cümlelere çevirdiğimiz şekilde bağlantılı olmadığını fark ettiniz mi? Örneğin, while going (giderken) dediğimizde aslında goingly diyoruz (tıpkı rallingly gibi). Fiillerin bağlanması isim, sıfat ya da zarf olmaları yoluyla olur. Bunlar while (-ken) gibi bir bağlaca ihtiyaç duymadan kendi başlarına bir cümleye bağlanırlar ve hatta kendi başlarına bir anlamları bile vardır. winningly, sethingly, meaningly gibi kelimeleri tek başına kelime olarak saydığımızı düşünürsek, bir Türk dilinde fiil tabanlı sonsuz zarf vardır.
Peki, böyle bir başlık neden var?

"Gece geç geldiğimden, herkes uyumakta idi." Ön-Türkçede çünkü yoktur. Peki bu cümleyi bağlayıp Ön-Türkçeye nasıl çevirebiliriz?
Fiil sıfatları ve iyelik eklerini kullanırız.
"Tǖn kēč kẹldükümten, bārča kiĺi ūdïma(k)da erti."
Cümlenin ilk kısmını inceleyelim.
Gece geç geldiğimden - Tǖn kēč kẹldükümten
Sırada bildiğiniz gibi ikinci kısım var.
Herkes uyumakta idi - bārča kiĺi ūdïma(k)da erti

"Gece geç geldiğimden, herkes uyumakta idi."
"Tǖn kēč kẹl dükümten, bārča kiĺi ūdïma(k)da erti."

Gece geç geldiğimde herkes uyumakta idi. - "Tǖn kēč kẹldükümte, bārča kiĺi ūdïma(k)da erti."
Cümlenin ilk kısmını inceleyelim.
Gece geç geldiğimde - Tǖn kēč kẹldükümte
Sırada bildiğiniz gibi ikinci kısım var.
herkes uyumakta idi - bārča kiĺi ūdïma(k)da erti

"Gece geç geldiğimde, herkes uyumakta idi."
"Tǖn kēč kẹldükümte, bārča kiĺi ūdïma(k)da erti."

Gece geç geldiğim için herkes uyumakta idi. - "Tǖn kēč kẹldüküm üčün, bārča kiĺi ūdïma(k)da erti."
Cümlenin ilk kısmını inceleyelim.
Gece geç geldiğim için - Tǖn kēč kẹldüküm üčün
Sırada bildiğiniz gibi ikinci kısım var.
Herkes uyumakta idi - bārča kiĺi ūdïma(k)da erti

"Gece geç geldiğim için, herkes uyumakta idi."
"Tǖn kēč kẹldüküm üčün, bārča kiĺi ūdïma(k)da erti."

Gelince gördüm. - "Kẹldükümče, körtüm."
Cümlenin ilk kısmını inceleyelim.
Gelince - Kẹldükümče
Sırada bildiğiniz gibi ikinci kısım var.
gördüm - körtüm

Birçok modern Türk dilinde *-dUk yerine *-gAn vardır. Ancak *-dUk Yenisey yazıtlarında, Köktürk yazıtlarında ve hem Volga hem de Tuna Bulgar yazıtlarında kullanılmıştır.. Yani *-dUk kullanımı Ön-Türkçe diline daha gerçekçidir.
Günümüzde bazı Türk dilleri şu şekilde kullanılmaktadır: zamir fiili-fiil sıfatı-ayrılma/bulunma/için/eşitlik

Sıradaki ders: Yetenekler, gelecek ve şimdiki zaman

