Category Archives: Uncategorized

.NET MAUI Nedir? | .NET MAUI Mimarisi ve Kurulumu

.NET Multiplatform App UI (kısaca MAUI), Windows, macOS, iOS ve Android‘i hedefleyen cross platform UI uygulamaları oluşturmak için Microsoft’un yeni bir framework’ü.

.NET MAUI ile bu platformlardan herhangi birinde çalışan zengin, etkileşimli, yerel bir UI uygulaması oluşturabilirsiniz. Tek bir kod tabanı ile tüm bu platformları destekleyen ve kodun %100’ünü aralarında paylaşan bir uygulama oluşturabilirsiniz. Kısacası bir .NET dilinde bir uygulama yazıyorsunuz ve hedef platformların hiçbirinde herhangi bir değişiklik yapmadan çalışıyor. Tüm kod mantığınız bir .NET dilinde yazılabilir ve kullanıcı arayüzünüz de XAML veya seçtiğiniz .NET dilinde tanımlanabilir.

Seçtiğiniz .NET dilini (VB.Net, F# veya C#) kullanarak, .NET MAUI uygulamalarında kod yazabilirsiniz. Kullanıcı arayüzünüzü kodda da tanımlamanız mümkündür, ancak yalnızca C# ve F# desteklenir.

Bir .NET MAUI uygulamasının mimarisinin nasıl olduğunu ve bir .NET MAUI uygulamasının nasıl bir araya geldiğine bakalım;

  • En altta hedef işletim sistemimiz var (Android, iOS, macOS ve Windows). Sonraki katman, her hedef işletim sisteminde .NET MAUI uygulamamızı çalıştıracak .NET runtime’ı gösterir. Android, iOS ve macOS için bu çalışma zamanı Mono‘dur ve Windows için WinRT‘dir.
  • Bir sonraki katman, ilk abstraction katmanımız – .NET Base Class Library (BCL). BCL, .NET’in temel öğelerinin bir parçasını oluşturmayan List ve Generics gibi beklediğimiz tüm ortak dil özelliklerine erişim sağlar. Geliştirici açısından bakıldığında, .NET 5 ve .NET 6, netcoreapp ve netstandard‘ın yerini alarak hedef framework’ler haline geldi. .NET 6’da bir .NET MAUI uygulaması yazarken, tüm platformlarda BCL’ye erişiminiz olur.
  • BCL’nin üzerinde bulunan bir sonraki katman, platforma özel API’ler için soyutlamalara erişim sağlar. Android için .NET ve iOS için .NET, sırasıyla Xamarin.Android ve Xamarin.iOS‘un sonraki yinelemeleridir. Mac için .NET yeni geliştirilmiş Microsoft tarafından ancak aynı şekilde çalışır ve Windows için WinUI API’si kullanılır.
  • Son abstraction kısmı ise .NET MAUI’dir. Bu, desteklenen tüm platformlarda ortak olan UI öğeleri sağlayan birleşik bir API’dir. Bunlara layouts, buttons, text entry fields, navigation API vs. gibi örnekler verebiliriz. “Essentials” namespace’i aracılığıyla, (Xamarin‘de bu ayrı bir paketmiş bu) Bluetooth, konum hizmetleri ve cihaz depolaması gibi genel donanım özelliklerine de erişebilirsiniz.

Katmanlara aşağıdan yukarıya bakarken, bir .NET MAUI uygulaması oluşturma felsefesi yukarıdan aşağıya daha çok kabul edilir.

1- .NET MAUI kodu yazarak (örneğin, iOS veya Android kodu yerine) bir cross platform uygulaması oluşturursunuz.

2- İsterseniz, yine de uygulamanıza platforma veya işletim sistemine özel kod yazabilirsiniz, ancak bunu yapmak zorunda değilsiniz.

3- .NET MAUI, kodunuzu alır ve hedef platform için derler. .NET MAUI’nin çeşitli platformlar için uygulamanızı nasıl oluşturduğunu anlamak, bir .NET MAUI uygulaması oluşturmak için gerekli değildir, ancak bu platformları iyi anlamak faydalıdır.

.NET MAUI, Xamarin.Forms‘un bir sonraki sürümünden çok daha fazlasıdır. Xamarin, .NET’ten bağımsız olarak yüklediğiniz bir yazılım SDK’sı iken, MAUI bir workload, yani tıpkı ASP veya konsol uygulaması geliştirme gibi .NET’in bir parçasıdır.

Visual Studio içerisindeki proje template’leri:

.NET MAUI App: Bu, yeni .NET MAUI uygulamaları oluşturmak için kullanılan ana şablondur.

.NET MAUI Blazor App: Bu template, kullanıcı arabirimini tanımlamak için Blazor kullanan yeni bir .NET MAUI uygulaması oluşturmak için kullanılır.

.NET MAUI Class Library: Bu template, farklı .NET MAUI projeleri arasında kod paylaşımı için yeni bir class library oluşturur.

Tüm konuştuklarımızı özetlemek gerekirse;

1- .NET MAUI bir cross platformdur, bir kez yazılır, her yerde çalıştırılır. WORA (Write Once Run Anywhere) UI uygulama platformudur. Yalnızca bir .NET MAUI uygulaması oluşturabilirsiniz ve daha fazla değişiklik yapmadan birden çok platformda çalışacaktır.

2- .NET MAUI ile native uygulamalar yazabilirsiniz. .NET MAUI uygulamaları native uygulamalardır.

3- .NET MAUI’de web uygulamalarına göre işlevsel, performans ve güvenlik avantajları olan uygulamalar oluşturabilirsiniz.

4- .NET MAUI uygulamaları oluşturmak için tüm .NET ekosistemini kullanabilirsiniz. Bu, tüm favori NuGet paketlerinizi ve bir .NET geliştiricisi olarak tüm becerilerinizi içerir.

5- .NET MAUI uygulama kullanıcı arabirimlerini XAML, C#, F# veya Blazor’da yazabilirsiniz.

BenchmarkDotNet | Kurulumu ve Temelleri 1. Kısım

Yazdığınız bir kod parçası ne kadar verimli? Az önce yaptığınız değişiklik uygulamanızı iyileştirecek mi? Bunu nereden biliyorsunuz? Bu değişiklik ne kadar önemliydi? Bunlar kıyaslama yani benchmarking yapmadan cevaplanamayacak sorular. Bu video serisinde, kodun ne kadar verimli olduğunu belirlemek için Benchmarkdotnet‘in kodu değerlendirmek için nasıl kullanılacağına ve ardından kodun değiştirilmiş bir versiyonuna kıyasla ne kadar verimli olduğuna bakacağız.

BenchmarkDotNet, yöntemleri karşılaştırma ölçütlerine dönüştürmenize, performanslarını izlemenize ve tekrarlanabilir ölçüm deneylerini paylaşmanıza yardımcı olur. Birim testleri yazmaktan daha zor değil! BenchmarkDotNet sizi popüler kıyaslama hatalarından korur ve kıyaslama tasarımınızda veya elde ettiğiniz ölçümlerde bir sorun olduğunda sizi uyarır. Sonuçlar, denemenizle ilgili tüm önemli gerçekleri vurgulayan kullanıcı dostu bir biçimde sunulur. Proje, .NET Runtime dahil olmak üzere 6800’den fazla proje tarafından benimsenmiş ve .NET Foundation tarafından desteklenmektedir.

Tipik bir durumda ne yapmanız gerektiğini düşünelim. İlk olarak, bir pilot deney yapmalı ve en iyi yöntem çağırma sayısını belirlemelisiniz. Ardından, birkaç ısınma yinelemesi gerçekleştirmeli ve karşılaştırma ölçütünüzün sabit bir duruma ulaştığından emin olmalısınız.

Elle yazılmış birçok kıyaslama, yanlış iş kararlarına yol açan yanlış sayılar üretir. BenchmarkDotNet, sizi kıyaslama tuzaklarının çoğundan korur ve yüksek ölçüm hassasiyeti elde etmenizi sağlıyor.

Mükemmel yöntem çağırma sayısı, ısınma ve gerçek yineleme sayısı hakkında endişelenmemelisiniz: BenchmarkDotNet en iyi kıyaslama parametrelerini seçmeye çalışır ve ölçüm öngörüsü ile tüm kıyaslama çalıştırmalarının toplam süresi arasında iyi bir denge elde etmeye çalışır.

Videoda neler öğrendik?

➡️ Benchmark attribute kullanımı

➡️ MemoryDiagnoser attribute kullanımı

➡️ BenchmarkRunner.Run kullanımı

✅ Gen 0, Gen 1 ve Gen 2 nedir ve nasıl çalışır?

Küçük .NET nesneleri, küçük heap’lere tahsis edilir. Bunlardan üç tane vardır: Gen 0, Gen 1 ve Gen 2. Gen 0’a yeni nesneler yerleştirilir.

Gen 0 dolduğunda, .NET Garbage Collector çalışır, artık ihtiyaç duyulmayan nesneleri elden çıkarır ve diğer her şeyi Gen 1’e taşır. Gen 1 dolarsa, GC yeniden çalışır, aynı zamanda Gen 1’deki nesneleri Gen 2’ye taşır.

Gen 2 dolduğunda tam bir GC çalışması gerçekleşir. Bu, gereksiz Gen 2 nesnelerini temizler, Gen 1 nesnelerini Gen 2’ye taşır, ardından Gen 0 nesnelerini Gen 1’e taşır ve son olarak referans verilmeyen her şeyi temizler.

Kaynaklar:

✔️ https://benchmarkdotnet.org/

✔️ https://www.red-gate.com/products/dotnet-development/ants-memory-profiler/learning-memory-management/memory-management-fundamentals

Leetcode Çözümleri – Shuffle String

Leetcode içerisinde bulunan “Shuffle String” sorusunun açıklaması ve çözümü. Bu soruda sizi verilen bir string‘in her bir karakteri, yine bir tam sayı dizisi olarak verilen index’lerde olacak şekilde shuffle etmeniz isteniyor.

► Leetcode 1528. Shuffle String: https://leetcode.com/problems/shuffle-string/

► Problem açıklaması:

Given a string s and an integer array indices of the same length.

The string s will be shuffled such that the character at the ith position moves to indices[i] in the shuffled string.

Return the shuffled string.

Example 1:

Input: s = “codeleet”, indices = [4,5,6,7,0,2,1,3]

Output: “leetcode”

Explanation: As shown, “codeleet” becomes “leetcode” after shuffling.

Example 2:

Input: s = “abc”, indices = [0,1,2]

Output: “abc”

Explanation: After shuffling, each character remains in its position.

Example 3:

Input: s = “aiohn”, indices = [3,1,4,2,0]

Output: “nihao”

Example 4:

Input: s = “aaiougrt”, indices = [4,0,2,6,7,3,1,5]

Output: “arigatou”

Example 5:

Input: s = “art”, indices = [1,0,2]

Output: “rat”

Constraints:

s.length == indices.length == n

1 <= n <= 100

s contains only lower-case English letters.

0 <= indices[i] < n

All values of indices are unique (i.e. indices is a permutation of the integers from 0 to n – 1).

Microsoft Mülakat Sorusu – Spiral Matrix

LeetCode içerisinde bulunan “Spiral Matrix” sorusunun açıklaması ve çözümü. Bu soruda size verilen bir matrix (C# için jagged array) elemanlarını spiral bir şekilde geriye döndürmeniz isteniyor.

► LeetCode 54. Spiral Matrix: https://leetcode.com/problems/spiral-matrix/

► Problem açıklaması:

Given an m x n matrix, return all elements of the matrix in spiral order.

Example 1:

Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]

Output: [1,2,3,6,9,8,7,4,5]

Example 2:

Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]

Output: [1,2,3,4,8,12,11,10,9,5,6,7]

Constraints:

m == matrix.length

n == matrix[i].length 1 <= m, n <= 10

-100 <= matrix[i][j] <= 100

Hackerrank “30 Days of Code” Çözümleri – Day 12: Inheritance

Hackerrank’in 30 Days of Code içerisinde bulunan “Day 12: Inheritance” sorusunun açıklaması ve çözümü. Bu soruda inheritance kavramına göz atıyoruz.

► Hackerrank 30 Days of Code Çözümleri – Day 12: Inheritance: https://www.hackerrank.com/challenges/30-inheritance/problem

► Problem açıklaması:

Objective

Today, we’re delving into Inheritance. Check out the attached tutorial for learning materials and an instructional video.

Task

You are given two classes, Person and Student, where Person is the base class and Student is the derived class. Completed code for Person and a declaration for Student are provided for you in the editor. Observe that Student inherits all the properties of Person.

Complete the Student class by writing the following:

A Student class constructor, which has parameters:

A string, firstName.

A string, lastName.

An integer, idNumber.

An integer array (or vector) of test scores, scores.

A char calculate() method that calculates a Student object’s average and returns the grade character representative of their calculated average:

Input Format

The locked stub code in the editor reads the input and calls the Student class constructor with the necessary arguments. It also calls the calculate method which takes no arguments.

The first line contains firstName, lastName, and idNumber, separated by a space. The second line contains the number of test scores. The third line of space-separated integers describes scores.

Output Format

Output is handled by the locked stub code. Your output will be correct if your Student class constructor and calculate() method are properly implemented.

Sample Input

Heraldo Memelli 8135627

2

100 80

Sample Output

Name: Memelli, Heraldo

ID: 8135627

Grade: O