14.10.2024

NestJS: Scheduled Tasks

 

Projelerimizde belli zamanlarda çalışması gereken görevler olabiliyor. Bu günün belli bir vaktinde ya da daha sık periyotlarla çalışması gereken görevleri ayarlamak için NestJS @nestjs/schedule paketini sunuyor. 

Basit bir örnek yapmak için öncelikle boş bir NestJS projesi oluşturalım. Bunun için daha önceki bu yazıma göz atabilirsiniz.

Projemizi oluşturduktan sonra aşağıdaki komutla ilgili paketi projemize ekleyelim.

npm install --save @nestjs/schedule


Daha sonra app.service.ts içine bir sonraki adımda zamanlanmış görev (scheduled task) olarak çalıştıracağımız basit bir metod yazalım. Bu metod her çalıştığında terminale zamanı yazacak. 

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }

  logCurrentTime() {
    console.log(new Date().toLocaleString());
  }
}

Şimdi hazırlıklarımızı tamamladığımıza göre bu metodu her saniye çalıştıracak kısmı ekleyebiliriz. Öncelikle ScheduleModule'u AppModule'e import ederek zamanlanmış görevleri aktive edelim.

7.10.2024

The Oversimplificator!

Başlıkta bahsi geçen Oversimplificator ben oluyorum. Bir kaç yıl önce maalesef kaybettiğimiz çok değerli arkadaşım Berkin Bozdoğan'ın uzun seneler önce benim için tasarladığı iki MTG (Magic The Gathering) kartının görselini aşağıya bırakıyorum. 


MTG bilenler ve beni tanıyanlar kümelerinin kesişimindeki az sayıda insan espriyi (eleştiriyi) anlamıştır muhtemelen. Berkin kendine has üslubuyla bana hediye ettiği bu kart tasarımlarında hem benim önemli bir yetenek olarak gördüğüm hem de aşırıya kaçılması halinde olumsuzluklara neden olabilecek basitleştirme (simplification 1 2) kavramından bahsediyor. 

Günlük hayat açısından basitleştirme ya da aşırı basitleştirme hakkında yazmayacağım. Bunlar insanın içinde bulunduğu durum, içinde yaşadığı toplum, kültür ve benim adını dahi bilmediğim pek çok şarta bağlı sanırım. Dolayısıyla beni aşar. Ama size yazılım geliştirme açısından basitleştirme ve aşırı basitleştirme hakkında bir iki cümle yazabilirim. Lütfen buyurun:

30.09.2024

5 Dakika Verin!

Dan Abramov'un muhteşem eğitimi "Just Javascript" içerisinde "Javascript Universe" diye bir bölüm var. Bu bölüm "In the beginning was the Value" cümlesi ile başlıyor ve oldukça etkileyici bir şekilde Javascript kodu yazarken kullandığınız değerler ve tipleri hakkındaki bakış açınızı yeniden gözden geçirmenizi sağlıyor. Tolkien severlerin Silmarillion'daki "There was Eru, the One." cümlesini derhal hatırladığına eminim.

Neyse konuyu dağıtmadan devam edeyim. Dan Abramov bu farklı bakış açısını sunarken bir beş dakika verin ne yaptığımı biliyorum diyerek Jason Fried'ın "Give it five minutes" yazısına link veriyor.  Çok da iyi yapıyor çünkü yazıyı okuduğunuzda benim de zaman zaman yaptığım ve yazılım sektöründe çok moda olan bir davranışı güzelce açıkladığını göreceksiniz.

Özetle bir fikri reddetmeden önce iyice düşünecek zamanı kendinize tanımanız gerektiğinden bahsediyor. Tabi herkes için ya da her konu için bu düşünme süresi 5 dakika olmayabilir ama durup düşünmeden reddettiğimiz fikirler sadece fırsatların kaçmasına değil o fikrin dile getirilmesi ile oluşacak beyin fırtınasının oluşmasına da engel oluyor.

Bir konuda en deneyimli olmak ya da ortamdaki en zeki kişi olmak her zaman haklı olacağınız anlamına gelmiyor. Kaldı ki haklı da olsanız size sunulan fikri iyice irdelemeniz karşınızdaki kişiler için de iş ilişkinizin gelişimi açısından da faydalı sonuçlar ortaya çıkaracaktır.

Tepkisel davranışlar sergileyen benim gibi insanlar için oldukça zor bir konu. :) Yine de denemeye devam edebiliriz değil mi?

Esen kalın.

9.09.2024

Javascript Nedir?

Bu soruyla oldukça başa dönmüş gibi görünsek de bu Javascript'in gelmişini geçmişini... ehem, yani Javascript dilinin nasıl gelişip bugünkü haline geldiğini şöyle bir özetlesem iyi olur diye düşündüm. Hatırlamadığım kısımları araştırmak ve bu sırada bilmediğim detaylara denk gelmek de hoş oldu. Ayrıca üşenmez de devamını getirirsem bu yazı bir Javascript serisinin de ilk yazısı niteliğini taşıyor.  

Bir tanımla başlayalım ve geçmişi ile devam edelim. Bir de "Hello World!" yazamadan bırakmayalım. Hatta ileriye yatırım yapıp bir iki programın bilgisayarınızda kurulu olduğundan da emin olalım. İyi okumalar.

Javascript ya da çoğu yerde kullanılan kısaltmasıyla JS çalıştırıldığı sırada yorumlanan bir programlama dilidir. Javascript birinci sınıf fonksiyonlara sahip yani fonksiyonları bir değer olarak değişkenlere atanabilen bir dildir. Çoğunlukla web sayfalarında interaktivite sağlamak için kullanımıyla bilinse de Javascript tarayıcılar dışında yer alan derleyici ve yorumlayıcılar tarafından da çalıştırılabilir. Javascript ile bir API geliştirebilir, Mobil uygulama yazabilir ya da masa üstü uygulaması geliştirebilirsiniz.

14.08.2024

NestJS: Dinamik Modüller

NestJS uygulamalarına kendi modüllerimi yazarken pek çok durumda statik modüllerden faydalanıyorum. Daha önceki yazımda modüllerden bahsederken de sadece statik modül kullanımından bahsetmiştim. NestJS dokümanlarının pek çok yerinde de yine statik kullanım örneği ile karşılaşmanız mümkün. Dinamik modüller ile ilgili detaylı bilgiye ise doküman içindeki bu sayfadan ulaşabilirsiniz. 

Daha önceki yazımda da bahsettiğim statik modüllerin, import ve export edilerek ilişkilendirilmesine "Static Module Binding" (Statik Modül Bağlaması) deniyor. Statik bir modül import edildiğinde, olduğu gibi kullanılabiliyor olmakla birlikte, import edilen modülün yapılandırmasına etki etmek mümkün olmuyor. Ancak genel amaçlı bir modül geliştirdiğinizde ve bu modülün farklı yerlerde import edildiğinde farklı davranışlar sergilemesi gerekebiliyor. Nest'in Configuration modülünü ele alalım. Ortam değişkenlerini saklamak için kullandığımız .env dosyası tüm projelerimizde aynı yerdeyse statik bir Configuration modülü yeterli olacaktır. Ancak dosya farklı projelerde farklı yollarda yer alıyorsa bu dosya yolunu Configuration modülünü import ederken parametre olarak geçme ihtiyacı doğar. İşte dinamik modüller burada devreye giriyor.

Aşağıda ConfigModule modülünün, AppModule'e nasıl import edildiğini görebilirsiniz:

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from './config/config.module';

@Module({
  imports: [ConfigModule.register({ folder: './config' })],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

7.08.2024

DNS Nedir?


DNS (Domain Name System) internetin telefon defteri olarak düşünülebilir. Günümüzde telefon numaralarını cep telefonlarımız dışında bir yerde saklamak ya da ezberlemek (!) durumunda değiliz. Geçmişte durum böyle değildi. Küçük defterlerimize telefon numaralarını yazar ve hata çok kullandığımız telefon numaralarını ezberimizde tutardık. O zamanlardan ezberlediğim bazı numaralar hala aklımdadır.

 

Elbette bir kişiye ulaşmak için bir çok sayıyı aklında tutmak ve her ihtiyaç duyulduğunda bu numaraları doğru sırada bir cihaza girmek çok pratik değil. Aynı şey internet için de geçerli. Daha önce bu yazıda bahsettiğim gibi, internete bağlı cihazlar bir IP adresine sahiptir. 212.154.234.45 gibi bir sayı dizisinden ya da IPv6 kullanan cihazlar için 2400:cb00:2048:1::c629:d7a2 gibi bir alfanümerik diziden oluşan bu IP adreslerini, ziyaret etmek istediğimiz her web sitesi ya da sunucu için ezberlemek zorunda olsak hiç pratik olmazdı. Bir bilgisayar başında olduğumuz için ilk çözüm arayışı da bu sayı dizisini daha sonra anlayacağımız bir isimle birlikte bilgisayarımızda saklamak olurdu. Örneğin aşağıdaki gibi bir tablo hazırlayabilirdik.

 

30.07.2024

Javascript, Beylik Mülakat Soruları 3

Merhaba,

Bu konuyla ilgili üçüncü yazıyı yazdığıma göre artık bir seriden bahsedebiliriz :)

Serinin ilk iki yazısına aşağıdaki linklerden ulaşabilirsiniz:

Yeni sorumuz ise şöyle:

Bir fibonacci serisinde verilen sıradaki sayıyı dönen fonksiyonu yazınız.

Fibonacci serisi ya da sekansı, ilk iki elemanı hariç bir sayı dizisinde her elemanın kendisinden önceki iki elemanın toplamından oluştuğu seriyi ifade eder. Serinin ilk iki elemanı 0 ve 1 'dir.

İlk akla gelen çözüm bir for döngüsü kullanmak olabilir:

function fib(n) {
  const fibonacci = [0, 1];

  for (let i = 2; i <= n; i++) {
    fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
  }

  return fibonacci[n];
}

Bu çözümde fibonacci serisinin ilk iki elemanını 0 ve 1 olarak yazıp; istenen elemana kadar serinin tüm elemanlarını teker teker oluşturuyoruz. Bu nedenle de for döngüsü serinin 3. elemanına denk gelecek şekilde 2'den başlayıp n'de yani istenen elemanda bitiyor. Döngünün içinde her bir elemanı kendisinden önceki iki elemanı toplayarak bulup seriye ekliyoruz. döngüden çıktıktan sonra da istenen sıradaki elemanı dönerek (return) fonksiyonu tamamlıyoruz.

22.07.2024

HTTP(S)

Tarayıcınızı kullanırken her adres satırının başında, farkında olmasanız da o web sitesi ile aranızdaki iletişimin hangi protokol ile yapılacağını http:// ya da https:// ibaresi ile belirtiyorsunuz.

 

Yeri gelmiş de tarayıcımızın adres satırına yazdıklarımızdan bahsederken… URL nedir? Ondan da bahsedelim. URL kısaltmasının açılımı Uniform Resource Locator şeklinde. URL'ye basitçe adres diyebiliriz. Her geçerli URL bir kaynağı işaret eder ve benzersiz biçimde tanımlar. Örneğin, web sitemiz içinde kullandığımız bir CSS dosyasının ya da bir resmin tüm internet içinde bir kopyası daha bulunmayan (tekil, benzersiz) bir adresi vardır.

 

URL ve link (hyperlink), birbirinin yerine kullanılan terimler olsa da teknik olarak tam anlamıyla birbirlerini karşılamazlar. Bir web sayfasında herhangi bir dosyayı/kaynağı yüklemek için kullandığımız link içinde bir URL barındırır. Bu URL olmadan link anlamsızdır. Örneğin, aşağıdaki a HTML etiketi (tag) href özelliği (attribute) ile bir URL'e işaret eder ve kullanıcı bu linke tıkladığında tarayıcı tarafından, href ile belirtilen URL'ye yönlendirilir.

 

<a href="https://blog.alperguclu.com/">Blog</a>

 

Bir URL'nin önceden belirli şekil şartlarını sağlaması gerekir. Aşağıda opsiyonel kısımlar dahil tam bir URL'in parçalarını görebilirsiniz. (Kaynak: https://developer.mozilla.org/)


15.07.2024

NestJS: Modüller

 

Bir NestJS modülü @Module() dekoratörü (decorator) ile işaretlenmiş bir sınıftır. Bu dekoratör ile Nest, uygulama yapısını organize etmek için kullanacağı metadata'ya erişim sağlamış olur. 

Her NestJS uygulaması 'root module' ile başlar. Bu başlangıç noktasından hareketle diğer modüller arasındaki ilişkiler belirlenir. Uygulamamızın bileşenlerini organize etmek için modülleri kullanmak oldukça kullanışlı ancak çok küçük uygulamalar için sadece root modül de kullanılabilir. @Module() dekoratörünün parametre olarak aldığı objenin alanlarını (property) inceleyelim:


providers: Nest'in dependency injector'ı tarafından bu arraydeki sınıflardan birer obje ilklendirilerek modül içinde erişime açılır.

controllers: Modül içinde yer alan controller'lar bu array içinde yer almalıdır.

imports: Import edilecek olamn modüller bu array içinde yer alır.

exports: Diğer modüller tarafından kullanılacak provider'lar bu liste içinde export edilmelidir.

A modülü içinde, B modülü içinde yer alan bir provider'ın kullanılabilmesi için: 

  • B modülü A modülünün import array'inde yer almalı
  • İlgili provider B modülünün hem providers hem de exports array'inde yer almalı

10.07.2024

İnternet Nedir?

Hepimiz “internet”in ne olduğunu, nasıl çalıştığını biliyoruz, değil mi? Ben yine de bilgilerimizi tazelemek için kısaca bahsedeceğim.

Bir network (ağ) olmadan internetten bahsetmek de mümkün değil. Birbirine bağlı bir grup bilgisayar ya da cihaz bir network oluşturur. Aslında iki ucu aktif olan (iki ucunda birbirine veri ileten birer cihaz bulunan) bir kabloya bile network demek mümkün. Örneğin, evinizde aynı Wİ-Fİ'a bağlı cihazlar bir network oluşturuyor. İş yerinizde aynı switch'e bağlı cihazlar da aynı şekilde. Çok basitçe ifade etmek gerekirse interneti birbirine bağlı networklerden oluşan daha büyük bir network olarak tarif etmek mümkün.

 

İnternet altmışların sonunda ABD'nin savunma bakanlığı tarafından oluşturuldu. Nükleer saldırı esnasında çalışmaya devam edebilecek merkezi olmayan bir iletişim ağı oluşturma hedefi ile yola çıktılar. Zaman geçtikçe internet bütün dünyaya yayılıp şu anki halini aldı ve hayatımızın vazgeçilmez bir parçası haline geldi.

 

DataReportal'ın 2023 başında, 16-64 yaş arası internet kullanıcıları arasında yaptığı bir araştırmaya göre kullanıcıların % 57,8'i interneti asıl kullanım amaçlarının "aradıkları bilgiye ulaşmak" olduğunu belirtiyor. Aynı kullanıcıların % 53,7'si aile ve arkadaşları ile iletişimi koparmamak için, % 49,7'si ise film, televizyon şovları ve video izlemek amacıyla internet kullandığını belirtmiş. Görüldüğü gibi internet, iletişimden eğlenceye hayatımızın her alanında yer alıyor.

14.06.2024

Javascript, Beylik Mülakat Soruları 2

Merhaba, 

Bir başka mülakat sorusu ile karşınızdayım. Açıkçası sıkça sorulup sorulmadığından emin değilim ama her problemi çözmeye çalışmanın yazılım geliştiriciye mutlaka bir şeyler kattığını düşünüyorum. Üstelik eğlenceli bile bulabilirsiniz kim bilir! :) 

Bu konu ile ilgili yazdığım önceki yazıya buradan ulaşabilirsiniz.

Sorumuz şöyle:

Parametre olarak pozitif bir sayı (N) kabul eden bir fonksiyon yazın. Bu fonksiyon console.log ile '#' karakterlerini kullanarak N seviyeden oluşan bir piramit şekli oluşturmalı. Piramit şeklinin hem sağ hem sol tarafında boşluklar olmasına dikkat edin. Örnek: N=3 için; 

Aslında çok karmaşık bir problem değil. Öncelikle yandaki örnek görsele baktığımızda 3 seviyeli bir piramit için boşluklar dahil 3x5'lik bir dörtgen ile uğraştığımızı görebiliriz. Oluşacak piramidin en üst seviyesinde her zaman bir '#' karakteri olacak ve tam ortada yer alacak. N seviyelik piramidin içinde her satır (seviye) için sırasıyla hangi karakterin gelmesi gerektiğine karar verip satırı tek seferde yazdıracağız. İki farklı çözüm yazacağım. Biri döngülerle ikincisi ise recursive bir fonksiyonla olacak.

İlk çözüm şöyle  olabilir:

9.06.2024

NestJS: Hello World!

NestJS, server side Node.js uygulamaları geliştirmek için TypeScript ile Kamil Mysliwiec tarafından geliştirilmiş bir framework'tür. NestJS projeleri oluşturduğunuzda varsayılan olarak Express ile çalışır şekilde gelir ancak isterseniz Fastify kullanacak şekilde de ayarlayabilirsiniz.

NestJS geliştiriciler tarafından kolayca bakımı yapılabilen ve test edilebilen, ölçeklenebilir bir uygulama mimarisi sunar.

Kurulum için NodeJS'in kurulu olduğu bir ortamda Nest CLI (Nest Command Line Interface) ile boş bir proje oluşturarak başlayabiliriz. Bunun için öncelikle Nest CLI'ı kuralım.

npm i -g @nestjs/cli

Daha sonra aşağıdaki komutu kullanarak yeni projemizi oluşturalım:

nest new hello-world

Yeni Nest projesi oluşturulurken hangi paket yöneticisini kullanacağınızı seçin ve enter'a basın. Projeniz hazır olduğunda konsolda aşağıdaki gibi bir görüntü ile karşılaşacaksınız:


27.05.2024

Javascript, Beylik Mülakat Soruları 1

 İş görüşmesi sırasında çok sık sorulan bazı küçük problemler var. Bir kere çözünce bu muymuş dedirten basitlikte olan bu sorular, özellikle stres de yapılmışsa başa dert olabilir. İnternette aradığınızda ya da bir online eğitim aldığınızda bu sorularla mutlaka karşılaşırsınız. Düşünürseniz çözümünü bulmanız işten bile olmayan bu sorulardan bazılarına aşağıda değinmek istiyorum. Hem pratik yapmış oluruz hem de belli mi olur karşınıza çıkarsa o saniyede çözüverirsiniz. :)

Öncelikle şunu da söyleyelim ki internet trolleri üşüşmesin (Okuyan da yok aslında. 2 senedir yazı yazmamışım :D) Burada vereceğim çözümler ne tek çözüm ne de en iyi çözümdür. Sadece bir çözümdür. 

Soru: Verilen metni ters çeviren bir fonksiyon yazınız ya da verilen string'in karakterlerini tersten sıralayınız.

Tek satırlık basit bir çözüm var. Önce kodu verelim sonra aşağıda açıklayalım.

return str.split('').reverse().join('');

Verilen string, str değişkeninde olsun.:

  • String'in split metoduna boş bir string'i (boşluk karakteri içeren bir string'i değil.) parametre geçerek her bir karakterin ayrı bir eleman olduğu bir array oluşturuyoruz. 
  • Oluşturduğumuz array üzerinde reverse metodunu kullanarak array'in elmanlarının sırasını tersine çeviriyoruz.
  • Array'in join metoduna yine boş bir string'i parametre olarak geçerek array elemanlarını birleştirip yeni bir string oluşturuyoruz.
Methodları chain etmek okumanızı zorlaştırıyorsa çözümü aşağıdaki şekilde de düşünebilirsiniz.

const arr = str.split('');
const reversedArray = arr.reverse();
const reversedString = reversedArray.join('');
return reversedString;