Category Archives: Programlama

Tüm programlama içeriklerim

Sayı 2’nin tam kuvveti mi? [İteratif ve Bit manipülasyonu]

Bir sayının 2’nin bir tam kuvveti olup olmadığını nasıl bulabileceğinizi, hem iteratif yolla hem de bit manipülasyon yöntemleri ile anlatmaya çalıştım.

► İkinin kuvveti https://tr.wikipedia.org/wiki/%C4%B0kinin_kuvveti

Matematikte ikinin kuvveti, n bir tam sayı iken 2^n şeklinde gösterilebilen sayıdır. Bu üslü sayıda 2 taban, n ise üstür.

Sadece tam sayılar içinde düşünülecek olursa, n ancak pozitif bir değer alabilir. Bu durumda sonuç, 1, 2 ya da 2’nin belirli kere kendisiyle çarpılmasıyla elde edilen sayı olacaktır.

İki ikili sayı sisteminin de tabanını oluşturduğundan, ikinin kuvvetlerine bilgisayar biliminde sık rastlanır. Bu sistemde ikinin bir kuvveti her zaman onluk sayı sistemindeki onun kuvvetleri gibi 100…000 ya da 0.00…001 benzeri bir şekilde yazılacaktır.

Videodaki metodun text hali şurada: https://pastecode.io/s/RhOXm02CB7

Programlamada Fibonacci Serisi Ve Sayılarını Bulma

Programlamada fibonacci serisi ve belirli sıradaki fibonacci sayısı nasıl hesaplanır? Binet formülü kullanılarak belirli fibonacci sayısı nasıl hesaplanır?

► Fibonacci dizisi nedir? https://tr.wikipedia.org/wiki/Fibonacci_dizisi

Fibonacci dizisi, her sayının kendinden önceki ile toplanması sonucu oluşan bir sayı dizisidir. Bu şekilde devam eden bu dizide sayılar birbirleriyle oranlandığında altın oran ortaya çıkar, yani bir sayı kendisinden önceki sayıya bölündüğünde altın orana gittikçe yaklaşan bir dizi elde edilir.

        /// <summary>
        /// N adet fibonacci sayısını bir dizi olarak döner.
        /// </summary>
        static int[] Fibonacci(int n)
        {
            var fibSequence = new int[n];
            var prev = 0;
            var curr = 1;

            for(var i = 1; i < n; i++)
            {
                fibSequence[i] = curr;
                curr = curr + prev;
                prev = curr - prev;  
            }

            return fibSequence;
        }

        /// <summary>
        /// N index'li fibonacci sayısını dinamik programlama kullanarak döner.
        /// </summary>
        static int FibonacciNth(int n)
        {
            if (n == 0) return 0;
            if (n == 1) return 1;

            var curr = 1;
            var prev = 0;

            var counter = n - 1;

            while(counter > 0)
            {
                curr = curr + prev;
                prev = curr - prev;
                counter--;
            }

            return curr;
        }

        /// <summary>
        /// N index'li fibonacci sayısını Binet formülünü kullanarak döner.
        /// https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression
        /// 1 ile 75 arasındaki n sayıları için geçerlidir.
        /// </summary>
        static int FibonacciNthClosedForm(int n)
        {
            var rootOfFive = Math.Sqrt(5);
            var phi = (1 + rootOfFive) / 2; // (≈ 1.61803)

            return (int)Math.Floor(Math.Pow(phi, n) / rootOfFive + 0.5);
        }

Bit Manipülasyonları – 3. Kısım

Bit manipülasyonlarını, bilgisayar aritmetiğinde elde ettiğiniz verinin bitleri üzerinde değişiklikler/kontroller yaparak, elde etmek istediğiniz sonuca genellikle daha hızlı bir şekilde erişmenizi sağlayacak işlemler bütünü olarak adlandırabiliriz.

► Bit manipulation: https://en.wikipedia.org/wiki/Bit_manipulation

Bit manipulation is the act of algorithmically manipulating bits or other pieces of data shorter than a word. Computer programming tasks that require bit manipulation include low-level device control, error detection and correction algorithms, data compression, encryption algorithms, and optimization. For most other tasks, modern programming languages allow the programmer to work directly with abstractions instead of bits that represent those abstractions. Source code that does bit manipulation makes use of the bitwise operations: AND, OR, XOR, NOT, and possibly other operations analogous to the boolean operators; there are also bit shifts and operations to count ones and zeros, find high and low one or zero, set, reset and test bits, extract and insert fields, mask and zero fields, gather and scatter bits to and from specified bit positions or fields. Integer arithmetic operators can also effect bit-operations in conjunction with the other operators.

► Bir manipülasyonları nerelerde kullanılır?

Eğer “bit manipülasyonu”nun faydalarını elde edemeyeceğiniz bir proje ise, muhtemelen bunları kullanmamalısınız. Tıpki bir çok enterprise uygulama gibi. İyi tarafları hızlı olmaları, kötü(?) tarafları anlaşılabilirliğin düşük olması, kod okunabilirliğini azaltmaları ve maintain edilebilmelerinin zorluğu diyebilirim. Bunun dışında, en küçük bir “performans” kaybı bile sizin için değerli ise, o zaman bunları kullanmayı düşünebilirsiniz. Örnek olarak, C ile driver geliştirirken, en derin seviyede bir matematiksel işlemler yapıyorsanız bunları kullanabilirsiniz. Genel olarak right shift ve left shift operatörleri, çarpma ve bölme işlemlerine göre genellikle hızlı çalışırlar. Tabi günümüz derleyicileri, bunları olabildiğince optimize ediyorlar hali hazırda.

        /// <summary>
        /// Sayını kaç adet bitten oluştuğunu bulur.
        /// </summary>
        static int BitCount(int n)
        {
            var bitCount = 0;

            while((1 << bitCount) <= n)
            {
                bitCount++;
            }

            return bitCount;

            // Örn: n = 5, yani 101, bizim 1 sayısını 3 defa ötelersek 1000
            // değerine, yani 5'ten büyük bir değer görüyoruz.
        }

        /// <summary>
        /// Belirli bir pozisyondaki bit değerini getirir.
        /// </summary>
        static int GetBit(int n, int position)
        {
            return (n >> position) & 1;

            // Ör: 11010 ve position = 3 olsun.
            // Sağa shift ettiğimizde elimizde 11 değeri kalır.
            // Bunu da 1 ile bitwise AND'lediğimizde, 
            // son bit eğer 1 ise 1, değilse 0 döndürür.
        }

        /// <summary>
        /// Sayı çift mi?
        /// </summary>
        static bool IsEven(int n)
        {
            return (n & 1) == 0;
        }

        /// <summary>
        /// Sayı pozitif mi?
        /// </summary>
        static bool IsPositive(int n)
        {
            if(n == 0)
            {
                return false;
            }

            return ((n >> 31) & 1) == 0;

            // 31 adet shift ile most significant bit'i buluruz.
            // Bu bit 0 ise pozitif, değilse negatiftir.
        }

Asal Çarpanları Bulma Algoritması

Bir sayıyı oluşturan asal çarpanların nasıl en efektif şekilde bulunabileceğini anlattım bu videoda. Önemli olan iki nokta var; birincisi kontrol edeceğimiz sayıları verilen sayının kareköküne kadar (karekökü dahil) iterasyon ile kontrol etmek ve elimizdeki sayıyı bölebildiğimiz kadar o sayıya bölmek, ikincisi de eğer bu iterasyon sonrası sayımız 1’e eşit olmadıysa (videoda anlattığım 99 örneği gibi) son kalanı da listeye eklemek.

► Asal çarpan nedir? https://tr.wikipedia.org/wiki/Asal_%C3%A7arpan

Asal çarpan, bir sayının asal olan çarpanlarına denir. Örnek olarak 72 sayısının asal çarpanları 2 ve 3’ken (2^3 * 3^2), 4, 6, 8, 9, 12, 18, 24, 36, 72 asal çarpan değildir. Aritmetiğin temel teoremine göre bütün bileşik sayılar, asal çarpanların çarpımı olarak yazılabilmektedir.

        /// <summary>
        /// Sayının tüm asal çarpanlarını bulma
        /// </summary>
        static IList<int> PrimeFactors(int n)
        {
            var factors = new List<int>();

            for(var i = 2; i <= Math.Sqrt(n); i++)
            {
                while(n % i == 0)
                {
                    n /= i;
                    factors.Add(i);
                }
            }

            if (n != 1)
                factors.Add(n);

            return factors;
        }

Öklid Algoritması ile En Büyük Ortak Bölen Nasıl Bulunur?

Öklid Algoritması ile en büyük ortak bölenin (ebob) nasıl bulunabileceğini hem iteratif, hem de rekürsif yolla anlatmaya çalıştım bu videoda.

► Öklid Algoritması: https://tr.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm

İki A ve B tam sayısının Ortak Bölenlerinin En Büyüğünün (OBEB), A ve B’yi bölen en büyük tam sayı olduğunu hatırlayalım.

Öklid Algoritması, iki tam sayının OBEB’ini hızlıca bulmak için kullanılan bir yöntemdir.

OBEB(A,B)’nin bulunması için Öklid Algoritması şu şekildedir:

► Eğer A=0 ise, OBEB(0,B)=B olacağı için OBEB(A,B)=B olur ve bu noktada durabiliriz.

► Eğer B=0 ise, OBEB(A,0)=A olacağı için OBEB(A,B)=A olur ve bu noktada durabiliriz.

► A sayısını bölüm ve kalan formunda yazın (A=B⋅Q+R)

►OBEB(A,B)=OBEB(B,R) olduğu için, OBEB(B,R)’yi Öklid Algoritmasını kullanarak bulun

► Ortak bölen nedir? https://tr.wikipedia.org/wiki/Ortak_b%C3%B6len

Matematikte, sıfır olmayan iki veya daha fazla pozitif tam sayının en büyük ortak böleni, tam sayıların hepsini de bölen en büyük pozitif tam sayıdır. Örneğin; 8 ve 12’nin ebob’u 4’tür.

En büyük ortak bölen aynı zaman da en büyük ortak faktör (ebof), en yüksek ortak faktör (eyof) ile de isimlendirilir.

        /// <summary>
        /// En büyük ortak böleni bulmak
        /// </summary>
        static int GreatestCommonDivisor(int a, int b)
        {
            while(a != 0 || b != 0)
            {
                if(a > b)
                {
                    a %= b;
                }
                else
                {
                    b %= a;
                }
            }

            return a | b;
        }

        /// <summary>
        /// En büyük ortak bölüne rekürsif yolla bulmak
        /// </summary>
        static int GcdRecursive(int a, int b)
        {
            if(b == 0)
            {
                return a;
            }
            else
            {
                return GcdRecursive(b, a % b);
            }
        }

Hamming Distance Algoritması Nedir?

Bu video ile, anlatmaya çalışacağım algoritmalara giriş yapıyoruz. Hamming distance algoritması, size verilen iki adet string’in, aynı pozisyondaki karakterlerinden farklı olanların sayısını bulma işlemidir.

Örneğin; “karolin” and “kathrin” string’lerine bakalım. Aynı indislerde olan karakterlere baktığımızda, 2, 3 ve 4. indislerdeki karakterlerin birbiri ile aynı olmadığını görüyoruz. Bu nedenle bu iki string’in hamming distance’ı 3 olmuş oluyor.

kaROLin — “rol”

kaTHRin — “thr”

► Hamming Distance Nedir? https://tr.wikipedia.org/wiki/Hamming_uzakl%C4%B1%C4%9F%C4%B1

Hamming uzaklığı aynı uzunluktaki iki dizenin farklı elemanlarının sayısıdır. Hamming uzaklığı adı Richard Hamming’in adından gelir.

► Hamming distance: https://en.wikipedia.org/wiki/Hamming_distance

In information theory, the Hamming distance between two strings of equal length is the number of positions at which the corresponding symbols are different. In other words, it measures the minimum number of substitutions required to change one string into the other, or the minimum number of errors that could have transformed one string into the other. In a more general context, the Hamming distance is one of several string metrics for measuring the edit distance between two sequences. It is named after the American mathematician Richard Hamming.

        /// <summary>
        /// Verilen iki string arasındaki hamming distance'ı hesaplar.
        /// </summary>
        static int HammingDistance(string s1, string s2)
        {
            if(s1.Length != s2.Length)
            {
                throw new Exception("Strings must be of the same length");
            }

            var diffCount = 0;

            for(var i = 0; i < s1.Length; i++)
            {
                if(s1[i] != s2[i])
                    diffCount++;
            }

            return diffCount;
        }

Bit Manipülasyonları – 2. Kısım

Bit manipülasyonlarını, bilgisayar aritmetiğinde elde ettiğiniz verinin bitleri üzerinde değişiklikler/kontroller yaparak, elde etmek istediğiniz sonuca genellikle daha hızlı bir şekilde erişmenizi sağlayacak işlemler bütünü olarak adlandırabiliriz.

1. Kısım: https://youtu.be/OgphAV9JIKc

► Bit manipulation: https://en.wikipedia.org/wiki/Bit_manipulation

Bit manipulation is the act of algorithmically manipulating bits or other pieces of data shorter than a word. Computer programming tasks that require bit manipulation include low-level device control, error detection and correction algorithms, data compression, encryption algorithms, and optimization. For most other tasks, modern programming languages allow the programmer to work directly with abstractions instead of bits that represent those abstractions. Source code that does bit manipulation makes use of the bitwise operations: AND, OR, XOR, NOT, and possibly other operations analogous to the boolean operators; there are also bit shifts and operations to count ones and zeros, find high and low one or zero, set, reset and test bits, extract and insert fields, mask and zero fields, gather and scatter bits to and from specified bit positions or fields. Integer arithmetic operators can also effect bit-operations in conjunction with the other operators.

Videoda olan metodların text hallerini şuradan alabilirsiniz: https://pastecode.io/s/jHQ2FokF1n

► Bir manipülasyonları nerelerde kullanılır?

Eğer “bit manipülasyonu”nun faydalarını elde edemeyeceğiniz bir proje ise, muhtemelen bunları kullanmamalısınız. Tıpki bir çok enterprise uygulama gibi. İyi tarafları hızlı olmaları, kötü(?) tarafları anlaşılabilirliğin düşük olması, kod okunabilirliğini azaltmaları ve maintain edilebilmelerinin zorluğu diyebilirim.

Bunun dışında, en küçük bir “performans” kaybı bile sizin için değerli ise, o zaman bunları kullanmayı düşünebilirsiniz. Örnek olarak, C ile driver geliştirirken, en derin seviyede bir matematiksel işlemler yapıyorsanız bunları kullanabilirsiniz. Genel olarak right shift ve left shift operatörleri, çarpma ve bölme işlemlerine göre genellikle hızlı çalışırlar. Tabi günümüz derleyicileri, bunları olabildiğince optimize ediyorlar hali hazırda.

Bit Manipülasyonları – 1. Kısım

Bit manipülasyonlarını, bilgisayar aritmetiğinde elde ettiğiniz verinin bitleri üzerinde değişiklikler/kontroller yaparak, elde etmek istediğiniz sonuca genellikle daha hızlı bir şekilde erişmenizi sağlayacak işlemler bütünü olarak adlandırabiliriz.

Ben de programlarınızı yazarken kullanabileceğiniz bazı temel bit manipülasyonlarını bir kaç kısımdan oluşacak şekilde anlatmaya çalışacağım bu seride.

► Bit manipulation: https://en.wikipedia.org/wiki/Bit_manipulation

Bit manipulation is the act of algorithmically manipulating bits or other pieces of data shorter than a word. Computer programming tasks that require bit manipulation include low-level device control, error detection and correction algorithms, data compression, encryption algorithms, and optimization. For most other tasks, modern programming languages allow the programmer to work directly with abstractions instead of bits that represent those abstractions. Source code that does bit manipulation makes use of the bitwise operations: AND, OR, XOR, NOT, and possibly other operations analogous to the boolean operators; there are also bit shifts and operations to count ones and zeros, find high and low one or zero, set, reset and test bits, extract and insert fields, mask and zero fields, gather and scatter bits to and from specified bit positions or fields. Integer arithmetic operators can also effect bit-operations in conjunction with the other operators.

Videoda olan metodların text hallerini şuradan alabilirsiniz: https://pastecode.io/s/4W6HjKdEba

► Bir manipülasyonları nerelerde kullanılır?

Eğer “bit manipülasyonu”nun faydalarını elde edemeyeceğiniz bir proje ise, muhtemelen bunları kullanmamalısınız. Tıpki bir çok enterprise uygulama gibi. İyi tarafları hızlı olmaları, kötü(?) tarafları anlaşılabilirliğin düşük olması, kod okunabilirliğini azaltmaları ve maintain edilebilmelerinin zorluğu diyebilirim.

Bunun dışında, en küçük bir “performans” kaybı bile sizin için değerli ise, o zaman bunları kullanmayı düşünebilirsiniz. Örnek olarak, C ile driver geliştirirken, en derin seviyede bir matematiksel işlemler yapıyorsanız bunları kullanabilirsiniz. Genel olarak right shift ve left shift operatörleri, çarpma ve bölme işlemlerine göre genellikle hızlı çalışırlar. Tabi günümüz derleyicileri, bunları olabildiğince optimize ediyorlar hali hazırda.

Yazılım Görüşmelerine Hazırlanabileceğiniz GitHub Sayfaları

Microsoft, Facebook, Google, Amazon, Netflix ve Adobe gibi, birçok yazılımcının hayalini kurduğu şirketlerdeki iş görüşmelerine nasıl hazırlanabilirsiniz? Github‘ta bu iş görüşmelerine hazırlanabileceğiniz sayfaları derlemeye çalıştım bu videoda.

Github sayfaları:

► Tech Interview Handbook: https://yangshun.github.io/tech-interview-handbook/

Benim favori sayfam olabilir burası. İçerisinde özgeçmiş nasıl oluşturulur, ön yazı nasıl oluşturulur, iş görüşmesi formatları, kendini tanıtma, görüşme sonrası “müzakere” kısmı ve temel algoritmalar ile ilgili kısımlar var. Teknik kısımdan ziyade, görüşme öncesi ve görüşme sırasında verdiği bilgiler gayet kullanışlı. Kesinlikle okumanızı tavsiye ederim.

► Coding Interview University: https://github.com/jwasham/coding-interview-university

Burası John Washam adlı bir programcının, Google’da iş görüşmesine hazırlanma süreci amacıyla oluşturulmuş (ki kendisi şu anda Amazon’da çalışıyor), daha sonra inanılmaz büyük bir kaynak haline dönüşmüş. İçerisinde her şey var, veri yapıları, algoritmalar, dinamik programlama, nesneye yönelik programlama, tasarım desenleri, vb. birçok farklı yapı ile ilgili bilgilendirmeler var. Bunlara ek olarak, iş görüşmesi öncesi hazırlıklar, günlük çalışma planı oluşturma, kitap ve dış kaynak tavsiyeleri gibi bölümler de mevcut. Gerçekten Github içerisinde, bu konu ile ilgili en büyük kaynak olabilir.

► The System Design Primer: https://github.com/donnemartin/system-design-primer

Belirli veri yapıları ve algoritmalar yerine, daha büyük, ölçeklenebilir sistemler nasıl tasarlanır? şeklinde bilgiler öğrenebileceğiniz bir sayfa. Sayfanın Türkçe kısmı da hali hazırda geliştiriliyor gördüğüm kadarıyla. Özellikle “Sistem Tasarımı” görüşmelerine hazırlanabilirsiniz bu sayfayı çalışarak. Örneğin; Twitter ve Instagram gibi sistemleri nasıl tasarlayabilirisiniz? Bu tarz sorular aslında en çok sorulardan biri. Bunlar için özellikle Grokking the System Design Interview kısmına da göz atabilirsin, bu da çok değerleri bir kaynaktır.

► Interview: https://github.com/Olshansk/interview

Bu sayfada genellikle dış linklere bağlantılar şeklinde bir listeleme mevcut. Algoritmalar, kod pratikleri yapabileceğiniz siteler, guide tarzı sayfalara olan linkler, kurslar, ücretsiz iş görüşmesi deneyimi yaşayabileceğiniz siteler vb. bir çok kaynak mevcut.

► How to Secure Anything: https://github.com/veeral-patel/how-to-secure-anything

Sadece bilgisayar güvenliği ile ilgili değil, “güvenlik” kavramına çok daha derin bir bakış açısı kazanmanızı sağlıyor. İçerisinde, güvenlik mühendisliğini nedir, en iyi pratikler, security policies, güvenlik modelleri, açık bulma, authentication ve authorization kavramları gibi bir çok konu ile ilgili bilgi mevcut.

► How Web Works: https://github.com/vasanthk/how-web-works

Bu sayfada web kavramının nasıl çalıştığını çok iyi şekilde öğrenebilirsiniz. Bilgisayar kullanan herkesin günlük hayatta yaptığı, ama arka tarafta nasıl çalıştığını bilmedikleri kısımlardan bahsediyor. Örneğin Google’da bir g harfine bastığınızda veya klavyede bir url girdikten sonra enter tuşuna basınca ne oluyor gibi bilgilere ulaşabilirsiniz. Ek olarak http protokolü, dns, tls, dom tree gibi kavramlardan da bahsediyor.

► JavaScript Algorithms and Data Structures: https://github.com/trekhleb/javascript-algorithms

Bu sayfadaki örnekler Javascript dili ile geliştirilmiş. Tüm algoritmalar ve veri yapıları bu şekilde. Güzel yanı olarak Türkçe kısmı da var. Ayrıca algoritmalar ve veri yapıları da, kolay ve zor olarak işaretlenmiş. En sevdiğim kısım ise, çok sade bir anlatımı olduğu için, buradaki algoritma ve veri yapıları sizin kullandığınız programlama dili üzerinde kolayca uygulayabilmeniz.

Eğer sizlerin de bildiğiniz, bu tarz Github sayfaları varsa yorumlar kısmına bırakabilirsiniz.

Git içerisinde “Stage” Nedir?

Git versiyon kontrol sisteminde “stage” kavramı anlaşılması zor bir kavram olabiliyor bazen, bu videoda bildiğim kadarıyla bu kavramı anlatmaya çalıştım.

Git kesinlikle kendine özgü kelime haznesine sahip olan bir yapı. Bu nedenle birçok kavram tam olarak anlaşılamayabiliyor. “commit” bunlara örnek olarak verilebilir mesela.

Git temelde 3 iş akışına sahip;

1️⃣ Kendi local’inizdeki (bilgisayar, klasör vs.) çalışma dosyaları değiştirirsiniz.

2️⃣ Bir sonraki commit’inizde olmasını istediğiniz dosyaları stage’e atarsınız.

3️⃣ Stage alanınızdaki dosyaları, “commit” yaparak uzaktaki sunucunuza (git directory) gönderebilirsiniz.

✨ Wikipedia’dan güzel bir örnek;

✨ Bir dosyayı stage’lemek, aslında o dosyayı bir sonraki “commit”‘e hazırlamak demektir. Aynı dosyada olsa bile, sadece stage’lediğiniz değişiklikler bir sonraki commint’inizde uzaktaki git sunucusuna gönderilecektir. Örneğin; saat 6 oldu ve işten ayrılmak üzeresiniz ve A ve B adında 2 adet geliştirmeniz var. A geliştirmenizi tamamladınız fakat B geliştirmesi henüz tamamlanamadı. Commit yapıp eve gitmek istiyorsunuz, bu nedenle A geliştirmesine ait kısımları stage’leyip commit edebilirsiniz. B değişiklikleri hala sizin çalışma klasörünüzde olduğu gibi kalacağından, yarın sabah gelip bu geliştirmeye devam edebiliriniz.

Bir başka örnek olarak, aynı dosya üzerinde bile, buna “file.txt” diyelim, yaptığınız ve bir sonraki commit’te olmasını istediğiniz değişiklikleri stage’ledikten sonra, bu dosya üzerinde tekrar çalışmaya devam edebilirsiniz. Bu dosya üzerinde stage’ledikten sonra yaptığınız değişiklikler, bir sonraki commit’inizde bulunmazlar.

Aslında Git içerisinde bu yapı orijinalde “index” veya “cache” olarak anılır, yani bir sonraki commit’te gönderilecek olan dosyaların cache’lenmesi veya index’lemesi gibi düşünebiliriz. Burası çalışılan dizin ile, bir sonraki commit’lenecek düzenleme arasındaki bağlantıyı tutar.

Bence “stage” mantığı, versiyon kontrolüne tam olarak nasıl yaklaşmak istediğimizi daha iyi kontrol etmemize imkan veriyor.

Faydalı linkler:

✨ Git official page: https://git-scm.com/

✨ Git wikipedia: https://en.wikipedia.org/wiki/Git

✨ Git repository on Github: https://github.com/git/git