Pygame Çizgi Yapımı (Grid)

Uygulama üzerinde basit bir şekilde ızgara(grid) çizimi yapacağız. Bunun kullanılacak method ise pygame.draw.line() metodudur. Parametre olarak çizim yapılacak display(pygame.Surface) nesnesini, ikinci parametre olarak renk rgb kodunu, üçüncü parametre ise çizginin başlangıç noktasını ve dördüncü olarak çizginin bitiş noktasını almaktadır.

Çizime başlamadan önce renk kodunu belirtmekte yarar. Kod içerisinde renkleri rgb formatından kullanabiliyoruz. Yani (Red, Blue, Green) şeklinde. Örneğin beyaz rengi için değişken oluşturup daha sonra kullanmak istersek, aşağıdaki kod satırını yazmak yeterlidir.
white = (255, 255, 255)
Şimdi çizimi gerçekleştirmeye çalışalım. Döngü içerisinde event döngüsünden sonra çizim fonksiyonunu kullandık.
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    pygame.draw.line(display, white, (32, 0), (32,480))
(x:32, y:0) noktasından (x:32, y:480) noktasına kadar bir çizgi çekilmesi gerekiyor. 480px ekranın yüksekliğiydi. Kodu çalıştırdığımızda karşımıza sadece siyah bir ekran çıkacak, beyaz çizgi olmayacak. Bunun nedeni pygame.display.flip() fonksiyonunu kullanmamızdan kaynaklanıyor. pygame.display.flip() fonksiyonu, display yani pygame.Surface nesnesini günceller ve ekrana yansıtır. Koda ekleyelim:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    pygame.draw.line(display, white, (32, 0), (32,480))
    pygame.display.flip()
Kod çalıştırıldığında elde edilen sonuç:
Pygame Çizgi Çizimi
Başarılı şekilde çizildi. Şimdi hem yatay hem de dikey olacak şekilde 32px aralıkla çizgiler çizmeye çalışalım. Bu işlemi yapabilmek için döngü kullanmamız gerek, önce sadece x eksenine göre dikey çizgileri çizelim:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x, 720))
        
    pygame.display.flip()
Elde edilen sonuç:
Pygame Çizim Yapma
Şimdi sıra yatay çizgileri çizmeye geldi. Onun içinde ikinci bir döngü yazılır ancak bu kez y eksenine göre:
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x,480))
    for y in range(0, 480, 32):
        pygame.draw.line(display, white, (0,y), (720,y))
    pygame.display.flip()
Ekran çıktısı:
Pygame Çizim Yapma
Artık ızgara çizimi yapmış olduk. Bir sonraki derste yılan oyunu için gerekli yılanı eklemeye çalışacağız. Kodun tam hali:
import pygame, sys

pygame.init()

display = pygame.display.set_mode((720, 480))

pygame.display.set_caption('Merhaba Dünya')

white = (255, 255, 255)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    # çizim
    for x in range(0, 720, 32):
        pygame.draw.line(display, white, (x,0), (x,480))
    for y in range(0, 480, 32):
        pygame.draw.line(display, white, (0,y), (720,y))
    pygame.display.flip()
Devamını Oku »

Pygame ile Yılan Oyunu Tasarımı

Bu yazıdan itibaren yılan oyunu yapımına başlıyoruz. Bu sayede hem pygame'i uygulamalı bir şekilde öğrenmiş olacağız hem de bir oyun yapmış olacağız. Yılan oyunu genel olarak bakıldığında oldukça basit bir yapıya sahip ancak içerisinde çok önemli temel oyun konseptlerini barındırmaktadır.

Öncelikle bir projeyi gerçekleştirmeden önce onu genel hatlarıyla oluşturmak önemlidir. Bunun içinse kağıt ve kalem yeterli. Yılan oyunu bildiğiniz gibi yön tuşları ile yönlendirilen bir tane yılan içeriyor. Yön değişikliğine bağlı olarakta yılan o yöne kıvrılıyor ve ona göre şekil alıyor. Bunu direkt olarak koda dökebilmek ilk başta kafa karıştırıcı olabilir. Bu yüzden kağıt üzerinde bu durumu canlandırdık. Ayrıca yılan bir besin yediğinde yılanın kuyruğuna ekleme yapılacak.
Yukarıdaki çizimi incelersek eğer x ve y dizilerinin yer aldığı görülecektir. Bu dizilerde yılanın görüntüsünü oluşturan her bir kare parçasının konumu saklanmaktadır. Ayrıca bir şeklin konumunu sol üst köşe temsil eder. En azından pygame'de durum böyle. Ayrıca pygame'de koordinat sistemi tam olarak yukarıdaki kareli çizimlerde olduğu gibi düşünülebilir.

Oyuncu, yılanın yönünü sağa doğru değiştirdiğinde o görüntüye ait x noktasının değeri 1 arttırıldı. Eğer sola doğru olsaydı o parçaya ait x noktasının değeri 1 azaltılmış olacaktı. Aynı durum aşağı ve yukarı için geçerli, tabi y noktasına göre. Ondan sonraki tüm parçaların sahip olduğu konum koordinatlara ise bir önceki parçanın sahip olduğu koordinatlar atanır. Resmi detaylıca incelerseniz bu durum rahatlıkla görebilirsiniz.

Şimdilik bu oyunun genel çalışma mantığını çözdük sayılır. Sıra bu durumu koda dökmekte ama daha öncesinde pygame'de uygun bir ortam oluşturulmalı. Bunu da sonraki yazıda gerçekleştireceğiz.
Devamını Oku »

pygame.Surface Hakkında

Pygame Program Yapısı yazısında pygame.display.set_mode() fonksiyonunun pygame.Surface nesnesi döndürdüğünden bahsetmiştik. pygame.Surface nesnesini dikdörtgen bir 2D Image olarak düşünebiliriz. Ayrıca pygame.Surface'e bağlı olan çeşitli default metotlarımız mevcuttur. Bunla alakalı ayrıntılı bilgiye şu sayfadan ulaşabilirsiniz.

pygame.Surface üstüne çizilen her şey ekrana yansıtılır. Zaten bu sebeple kendi oluşturduğumuz display adlı bir değişkene atadık. Bu değişken adı programcının isteğine bağlı değişebilir.

Aynı şekilde pygame'de bir image modülü mevcuttur. Bu modül sayesinde local dizin üzerinde resim kaydedebilir ve yükleyebilirsiniz. Image'ler yani görüntü dosyaları pygame.Surface nesnelerine yüklenmektedir. Bu sayede sonrasında görüntü üzerinden değişiklikler de yapabiliriz.

pygame.Surface nesnelerini dikdörtgen olarak düşünmemiz gerek. Sırf bu sebepten bu nesnelere özel olarak Rect sınıf mevcuttur. Bu sınıf sayesinde oyun içi bir çok dinamik sağlanmış olacak. Örneğin, collision gibi.
Devamını Oku »

Pygame Program Yapısı

Pygame'e giriş yazısında genel olarak pygame nedir, nasıl kurulur gibi sorulara cevaplar verildi ve örnek bir program çalıştırıldı. Bu yazıda ise önceki yazıda yazdığımız kod yapısını inceleyeceğiz.

İlk olarak kullanılacak modüller import edilir. Bu modüller pygame ve sys. Bu sayede pygame içinde yer alan fonksiyonlara ve özel değişkenlere ulaşabileceğiz.
import pygame, sys
pygame.init() fonksiyonunu çağırmak zorunludur. Aksi takdirde pygame'e bağlı fonksiyonlar çalışmaz.
pygame.init()
Daha sonrasında display adında bir değişken tanımlandı. pygame.display.set_mode() fonksiyonu pygame.Surface nesnesi döndürür. Parametre olarak bir tuple verildi. Bu tuple içinde yer alan iki integer değer sırasıyla width(genişlik) ve height(yükselik) değerleridir. Kısacası pencerenin boyutu ayarlandı. Genişilik 720 pixel ve yükseklik 480 pixel.
display = pygame.display.set_mode((720, 480))
Pencere başlığı bu şekild pygame.display.set_caption() ile eklenir.
pygame.display.set_caption('Merhaba Dünya')
Sıra geldi bir oyun için olmazsa olmaz olan oyun döngüsü. Oyun döngüsü kullanıcı çıkış yapmadığı sürece ya da döngünün çalışmasını sağlayan boolean değişken false olmadığı sürece çalışmaya devam eden kod bloğudur. Oyun tamamen bu döngü içerisinde çalışacak. Animasyonlar, kullanıcının aktardığı event'ler gibi birçok şey bu döngü içinde yer alacak. Kullanıcının event'ini yakalamak için ise pygame.event.get() fonksiyonu kullanılır. Herhangi bir event durumunda eğer koşul ifadelerinde bu event'in bir karşılığı varsa o blokta yer alan fonksiyon çalıştırılır. Örneğin aşağıdaki kodda pencerenin x kırmızı tuşuna başarsak, pygame.QUIT constant yakalanacak ve sırasıyla pygame.quit() ve sys.exit() fonksiyonları çalışacak ve oyun kapanacağı için döngü sonlanacak.
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
Elbette programda kullanılacak çok fazla gerekli fonksiyon olacak ancak bunları ileriki yazılarda daha ayrıntılı göreceğiz, ayrıca burada anlatılan yapıları daha ayrıntılı bir şekilde nasıl çalıştığına dair incelemeler yapacağız.
Devamını Oku »

Pygame'e Giriş

Pygame, Python'un 2d oyun geliştirme framework'üdür. Pygame hakkında daha önceden bu blogda birkaç yazı yayınlamıştı ancak yeniden başlama ihtiyacı duydum. Pygame ile oyunlar geliştirebilirsiniz. Bu oyunlar sizin ne kadar çok öğrendiğinize ve pratik yaptığınıza bağlı olarak o kadar iyi bir ürün çıkarmanız demektir. Açıkçası benim Pygame ile ilgili çok bir tecrübem yok ancak bu yazılarla beraber "öğretirken öğren" prensibine sadık kalacağım.😶 Öncelikle Pygame ile uygulama geliştirirken Python kullanılacağı için belli bir seviye Python bilmek gerekiyor.

Python'un Bilgisayarda kurulu olması gerekmektedir. Python Website adresine gidip bilgisayarınıza uygun olan sürümü indirebilirsiniz. Kurulumunu yaptıktan sonra ise Pygame kurulumunu yapmalıyız. Pygame'i kurmak için bilgisayarın terminali açılır, ben cmd kullanıyorum Windows için:
python3 -m pip install -U pygame --user
Komut girildikten sonra yükleme olacaktır. Eğer yüklemede sorun yaşarsanız ayrıntılı bilgiyi buradan alabilirsiniz Pygame Getting Started

Pygame framework'ü kendi içinde ses, çizim grafikleri, mouse event gibi çeşitli modüller barındırmaktadır. 

Şimdi test amaçlı bir basit uygulama yazalım ve daha sonrasında çalıştırmayı deneyelim. Öncelikle Python IDLE çalıştırılır. Sonrasında üst barda yer alan File -> New File ile yeni bir dosya açılır, aşağıdaki gibi kodlar yazılır:
import pygame, sys

pygame.init()

display = pygame.display.set_mode((720, 480))

pygame.display.set_caption('Merhaba Dünya')

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
Kodu yazdıktan sonra çalıştırmaya hazırız, F5'e basılır ve açılan pencereye Evet denir. Sonrasında dosyanın kaydedilmesini isteyecektir, istediğiniz konuma dosyayı **.py uzantılı olacak şekilde kaydedin. Kaydetme işleminden sonra program çalışacaktır aşağıdaki gibi:
Pygame'e Giriş
Penceremiz başarılı bir şekilde açıldı. Bir sonraki yazıda ise temel anlamda Pygame programının kod yapısını inceleyeceğiz ve her bir kod satırının görevlerinden bahsedeceğiz.
Devamını Oku »

C++ Matrisleri Toplama ve Çıkarma

Matrislerde toplama ve çıkarma işlemi C++ ile aşağıdaki gibi koda dönüştürülmüştür. Her iki matrisin tüm elemanları kullanıcı tarafından girilmekte olup daha sonrasında bu elemanlar karşılıklı olarak toplanıp, sonuç matrisine yazdırılmaktadır ve ekran çıktısı elde edilmektedir.
#include <iostream>

int main(){

    toplama_cikarma("topla");
    
    return 0;
}

void toplama_cikarma(std::string islem){
    int m, n;
    std::cout << "m: ";
    std::cin >> m;
    std::cout << "n: ";
    std::cin >> n;
    float a_matris[m][n];
    float b_matris[m][n];
    float sonuc_matris[m][n];

    
    for(int i=0; i < m; i++){
        for(int j=0; j < n; j++){
            std::cout << "A matrisi[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> a_matris[i][j];
        }
    }

    std::cout << std::endl;
    
    for(int i=0; i < m; i++){
        for(int j=0; j < n; j++){
            std::cout << "B matris[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> b_matris[i][j];
        }
    }
    if(islem == "topla"){
        for(int i=0; i < m; i++){
            for(int j=0; j < n; j++){
                sonuc_matris[i][j] = a_matris[i][j] + b_matris[i][j];
                std::cout << sonuc_matris[i][j] << " ";
            }
            std::cout << std::endl;
        }
    }else if(islem == "cikar"){
        for(int i=0; i < m; i++){
            for(int j=0; j < n; j++){
                sonuc_matris[i][j] = a_matris[i][j] - b_matris[i][j];
                std::cout << sonuc_matris[i][j] << " ";
            }
            std::cout << std::endl;
        }        
    }
}

Devamını Oku »

C++ Matris Çarpımı

İki matrisin çarpımını yapan program kodu aşağıda verilmiştir. Program şu şekilde çalışmaktadır: eğer kullanıcı ilk girdiği matrisin sütun sayısı ile ikinci girdiği matrisin satır sayısını eşit girmemişse program kullanıcıdan tekrar matrisi boyutlarını belirlemesini isteyecektir. Böyle olmasının nedeni iki matrisi çarpabilmek için bu şarta uyması gerekmektedir.

Matrislerin boyutlarındaki uygunluk sağlandıktan sonra  kullanıcı tarafından her iki matrisin de değerleri ayrı ayrı girilir. Bu iki matris çarpılır ve olması gereken sonuç ekrana döndürülür:
#include <iostream>

void carpma();

int main(){
    carpma();
    
    return 0;
}
void carpma(){
    bool uyari = false;
    int m1, n1, m2, n2;
    do{ 
        if(uyari) std::cout << "A'nin sutun sayisi B'nin satir sayisina esit olmali" << std::endl;
        std::cout << "A matrisi(mxn): ";
        std::cout << "m : ";
        std::cin >> m1;
        std::cout << "n : ";
        std::cin >> n1;
        std::cout << "B matrisi(mxn): ";
        std::cout << "m : ";
        std::cin >> m2;
        std::cout << "n : ";
        std::cin >> n2;
        uyari = true;
    }while (n1 != m2);
    

    float a_matris[m1][n1];
    float b_matris[m2][n2];
    float sonuc_matris[m1][n2];

    
    for(int i=0; i < m1; i++){
        for(int j=0; j < n1; j++){
            std::cout << "A matrisi[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> a_matris[i][j];
        }
    }

    std::cout << std::endl;
    
    for(int i=0; i < m2; i++){
        for(int j=0; j < n2; j++){
            std::cout << "B matris[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> b_matris[i][j];
        }
    }

    // çarpım işlemi	
    for (int i = 0; i < m1; i++){
        for (int j = 0; j < n1; j++){
            sonuc_matris[i][j] = 0;
            for (int s = 0; s < n1; s++){
                sonuc_matris[i][j] += a_matris[i][s] * b_matris[s][j];
            }
        }
    }

    for (int i = 0; i < m1; i++){
        for (int j = 0; j < n2; j++){
            std::cout << sonuc_matris[i][j] << " ";
        }
        std::cout << std::endl;
    }
    
}
Devamını Oku »

C++ Bir Matrisin Determinantını Hesaplama

Bir matrisin determinantını hesaplayan programın kodu aşağıdaki gibidir. Program öncelikle hesaplanacak olan matrisin boyutunu istemektedir. (örnek: matris 5x5 ise boyut 5'tir) Sonrasında ise kullanıcıdan matrise ait tüm elemanların değerlerinin girilmesi istenmektedir. Devamında determinant_hesapla() fonksiyonuna argüman olarak girilen matris gönderilmektedir ve determinant hesaplanmaktadır, elde edilen sonuç geri döndürülmektedir:
#include <iostream>

void determinant();
float determinant_hesapla(float (*T1)[50], int);

int main(){
    determinant();
    
    return 0;
}

void determinant(){
    int m;
    std::cout << "m (mxm): ";
    std::cin >> m;
    float matris[50][50];

    float determinant;
    
    for(int i=0; i < m; i++){
        for(int j=0; j < m; j++){
            std::cout << "matris[" << i+1 << "][" << j+1 << "] = ";
            std::cin >> matris[i][j];
        }
    }
    std::cout << "Matrisin Determinantı: ";

    determinant = determinant_hesapla(matris, m);
    std::cout << determinant << std::endl;
}

float determinant_hesapla(float matris[50][50], int boyut){
    if(boyut == 1){
        return matris[0][0];
    }

    float yeni_matris[50][50];

    float determinant = 0; // 0'da başlatıldı
    int m, n, sutun;
    float isaret = 1;

    for (int sutun = 0; sutun < boyut; sutun++)
    { 
        m = 0;
        n = 0;
        for(int i = 0; i < boyut; i++){
            for (int j = 0; j < boyut; j++)
            {
                yeni_matris[i][j] = 0;
                if(i!=0 && j!=sutun){

                    yeni_matris[m][n] = matris[i][j];
                    if(n < (boyut-2)){ // satır sonunda değilse sütunu arttır
                        n++;
                    } 
                    else{
                        m++; // 1. sütuna dön ve satır satır ilerle
                        n = 0;
                    }
                }
            }  
        }
        determinant = determinant + isaret * (matris[0][sutun] * determinant_hesapla(yeni_matris, boyut-1));
        isaret = isaret * (-1);
    }
    return determinant;
}
Devamını Oku »

Node.js package.json

package.json, Node.js ile oluşturduğunuz proje hakkında birçok metadata sağlar. Ayrıntılı olarak daha açıklayıcı olmak için örnek bir projede package.json oluşturalım:
npm init -y
Bu işlemin sonucunda package.json dosyası proje dizininde yer alacaktır. package.json dosyasının içeriğini incelediğimizde aşağıdaki bilgiler yer almaktadır:
{
  "name": "forNodejs",
  "version": "1.0.0",
  "description": "",
  "main": "getgl.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}
Proje hakkında bilgiler yer almakta, scripts, kısmında ise projeyi çalıştırma, test etme gibi şeyler yer almaktadır. dependencies ise oldukça önemli bir yer olmakla birlikte projede yüklü modüller hakkında bilgi vermektedir. Örneğin yukarıdaki json dosyasında dependencies'te yer alan modül express framework'tur, sürümü ise yanında belirtilmiştir.

Bazı durumlarda projede kullanılan bir modül kullanıcı ürününde gereksiz yük oluşturmaması için devDependencies kısmına yüklenir:
npm install nodemon --save-dev
Bunun sonucunda aşağıdaki gibi devDependencies kısmına modülün eklendiği görülecektir:
{
  "name": "forNodejs",
  "version": "1.0.0",
  "description": "",
  "main": "getgl.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {
    "nodemon": "^2.0.4"
  }
}
Eğer bir modülün son sürüm yerine belli bir sürümünü yüklemek istersek, sürümü @ ifadesinden sonra belirtmeliyiz:
npm install react@16.11
Bu komutu girersek react modülünün 16.11 sürümünü yüklemiş oluruz, son sürüm yerine. Modülü silmek istersek:
npm uninstall react
Komutu silmek için yeterli olacaktır.
Devamını Oku »

Node.js JSON Veri Döndürme

Node.js'te döndürülen veri sadece HTML değildir, JSON veri de döndürebiliriz. 
const http = require('http');

const server = http.createServer((req, res) => {
    if(req.url=="/feed"){
        res.writeHead(200, {'Content-Type':'application/json'});
        res.write(JSON.stringify({url:'kodaylak.com', postLenght: 100}));
        res.end();
    }
}).listen(8000);
localhost:8000/feed adresine gidersek aşağıdaki sonucu elde ederiz:

Devamını Oku »

Node.js Modül Oluşturma

Node.js kullanırken kendi yazdığımız modülleri oluşturmak gerekecek. Bunun için kısa bir örnek yapalım. 

matrix.js adında bir dosya oluşturdum. İçerisinde matris hesaplamaları yapacak bir modül olacak, örneğin iki matrisin toplanması gibi. 
const matrix = {
    summation: function(matrix_1, matrix_2){
        let result = [];
        for (let i = 0; i < matrix_1.length; i++) {
            for (let j = 0; j < matrix_1[i].length; j++) {
                result[i][j] = matrix_1[i][j] + matrix_2[i][j];
            }    
        }
        return result;
    }
};
main.js dosyasında matrix'i modül olarak kullanmak için aşağıdaki gibi ekliyorum:
const matrix = require('./matrix.js');

var mat1 = [
    [12, 3, 5],
    [2, 34, 1],
    [4, 41, 28]
];

var mat2 = [
    [56, 3, 6],
    [11, 5, 4],
    [3, 66, 7]
];
Kodda iki tane matris tanımlandı ve bunlar summation fonksiyonu ile toplanacak. Ancak summation metotunu kullanamıyoruz. Bunun nedeni matrix'i sisteme modül olarak tanıtmamamızdan kaynaklıdır. matrix.js dosyasına girilir ve module.exports = matrix satırı eklenmelidir.
const matrix = {
    summation: function(matrix_1, matrix_2){
        let result = [];
        for (let i = 0; i < matrix_1.length; i++) {
            result[i] = [];
            for (let j = 0; j < matrix_1[i].length; j++) {
                result[i][j] = matrix_1[i][j] + matrix_2[i][j];
            }    
        }
        return result;
    }
};

module.exports = matrix
main.js içerisinde aşağıdaki kodu çalıştırılır:
console.log(matrix.summation(mat1, mat2));
Elde edilen sonuç:

Devamını Oku »

Node.js Dosya Sistemi ve İşlemleri

Node.js Modüller yazısında fs modülünden kısaca bahsetmiştik. fs modülü kısaca file I/O işlemleri için kullanılır. Bilgisayarın dosya sistemiyle çalışmaya olanak sağlar. fs açılımı ise file system'dır.

fs modülü ile yapılabilecek genel işlemler şu şekildedir:
  • Dosya okuma
  • Dosya yazma
  • Dosya oluşturma
  • Dosya güncelleme
  • Dosya silme
  • Dosya adlandırma

Dosya okuma 

Dosya okumak için fs.readFile() metotu kullanılır. Bu işlem asenkron bir şekilde gerçekleşir. Öncelikle metot yapısını inceleyelim:
fs.readFile(dosya [,ayarlar], callback)
Parametreler:
  • dosya -> dosya yolu ya da dosya ismi
  • ayarlar -> encoding türü ve bayrak eklemek için kullanılan parametre. Varsayılan olarak encoding türü null ve flag değeri r'dir.
  • callback -> err ve data adında iki parametre barındıran bir fonksiyondur.
Örnek kodu inceleyelim:
const fs = require('fs');

fs.readFile('deneme.txt', 'utf8', (err, data) => {
    if(err) throw err;

    console.log(data);
});
Proje dizininde yer alan deneme adında bir dosyayı okutup, konsola yazdırdık. Aynı işlemin sonucunu tarayıcı üzerinden görmek istersek şu şekilde bir kod yazabiliriz:
const http = require('http');
const fs = require('fs');

const server = http.createServer((req, res) => {
    fs.readFile('deneme.txt', 'utf8', (err, data) => {
        if(err) throw err;
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write(data);
        return res.end();
    });
}).listen(5000); 
Senkron şekilde dosya okumak için fs.readFileSync() metotu kullanılabilir.

Dosya oluşturma

Dosya oluşturmak için çeşitli metotlar vardır. Bunlar fs.appendFile(), fs.open() ve fs.writeFile() metotlarıdır.
const fs = require('fs');

fs.appendFile('yeni_dosya_1.txt', 'İcerik', (err) => {
    if(err) throw err;
    console.log('Dosya olusturuldu!');
});

fs.open('yeni_dosya_2.txt', 'w', (err, file) =>{
    if(err) throw err;
    console.log('Dosya olusturuldu!');
});

fs.writeFile('yeni_dosya_3.txt', 'İcerik', (err) => {
    if(err) throw err;
    console.log('Dosya olusturuldu!');
});
Elbette bu metotların her biri aynı işi yapmıyor. fs.appendFile() eğer dosya yoksa dosyayı oluşturur ya da varolan dosyadaki içeriğin devamına yeni içeriği ekler. fs.open() metotunda ise w flag kullanılır. Bu flag bu dosyanın yazma için kullanılacağı anlamına gelmektedir. fs.writeFile() fonksiyonu ise eğer o dosya varsa eski içerik silinir ve yeni içerik eklenir.

fs.writeFile() ve fs.appendFile() metotu ile aynı zamanda dosyayı güncelleyebildiğimizi görmüş oluruz. 

Dosyayı yeniden adlandırmak içinse fs.rename() metotu kullanılır.
fs.rename('yeni_dosya_2.txt', 'eski_dosya_2.txt', (err) => {
    if(err) throw err;
    console.log("Dosya ismi degisti");
});
Dosya silmek için ise fs.unlink() metotu kullanılır.
fs.unlink('eski_dosya_2.txt', (err) => {
    if(err) throw err;
    console.log('Dosya silindi');
});
Kaynaklar: 
Devamını Oku »

Node.js HTTP Request İşleme

Node.js sayesinde HTTP requestler asenkron olarak işlenebilir. HTTP request, için bir sunucuya bir istekte bulunması durumu diyebiliriz. Bu istek sonucu ise sunucudan response yani cevap elde edilir. Daha öncesinde Node.js İlk Uygulama yazısında yaptığımız uygulama üzerinden devam edelim:
const http = require('http');

const server = http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/html'});
}).listen(8000);
Server oluşturmak için createServer() fonksiyonu kullanıldı. Bu fonksiyon parametre olarak req(request) ve res(response) parametrelerini içermektedir. req istenilen cevabın sorusu olan nesneyi temsil eder. Örneğin, sayfanın görüntülenmesi için gerekli url bilgisi. res, request'e bağlı olarak gerekli cevabı gönderen nesnedir.

Yukarıdaki kodda Request işlemek adına bazı eklemeler yapıyoruz:
const http = require('http');

const server = http.createServer((req, res) => {
    if(req.url == '/'){
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write('<html><body><h1>Ana Sayfa</h1></body></html>');
        res.end();
    }
    else if(req.url == "/blog"){
        res.writeHead(200, {'Content-Type': 'text/html'});
        res.write('<html><body><h1>Blog</h1></body></html>');
        res.end();
    }
}).listen(8000);
Yukarıdaki kodda URL sorgulama yaptık. Alınan URL requestine göre gerekli içeriği yazdırdık. Sonrasında end() metotu ile response gönderildi.
Server çalıştırılır, node main.js. Sonrasında konsol üstünde kontrol etmek için curl kullanabiliriz -> curl -i http://localhost:8000. Alınan cevap aşağıdaki gibidir:
C:\Users\gurb>curl -i http://localhost:8000
HTTP/1.1 200 OK
Content-Type: text/html
Date: Wed, 13 May 2020 07:59:33 GMT
Connection: keep-alive
Transfer-Encoding: chunked

<html><body><h1>Ana Sayfa</h1></body></html>
localhost:8000/blog url test edelim:
C:\Users\gurb>curl -i http://localhost:8000/blog
HTTP/1.1 200 OK
Content-Type: text/html
Date: Wed, 13 May 2020 08:02:14 GMT
Connection: keep-alive
Transfer-Encoding: chunked

<html><body><h1>Blog</h1></body></html>
Ayrıca curl kullanmak yerine web tarayıcı üzerinden de kontrol edilebilir.
Devamını Oku »