Category Archives: Programlama

Tüm programlama içeriklerim

“Nicelık vs nitelık” üzerine

Jeff Atwood 2008 yılında Quantity Always Trumps Quality yazmış, ben yeni gördüm, bu da bizim ayıbımız olsun.

Yazıda alıntı yaptığı kısmı şu şekilde özetleyebilirim;

Bir seramik öğretmeni okulun ilk gününde sınıfı iki gruba ayırdığını duyurur. Sınıfın sol tarafındakilerin tümü, yalnızca ürettikleri işin miktarına göre derecelendirileceğini, sağdakilerin ise yalnızca kalitesine göre derecelendirileceğini söyler. Yaptığı prosedür basit; günün sonunda, tartıyı getirerek sol taraftaki gruptan 50 kiloluk “A” kalitede ve 40 kiloluk “B” vb. devam eden kalitede ürün çıkartılması beklenirken, sağ taraftaki gruptan sadece 1 kiloluk “kaliteli” ürün ürün çıkartılması beklenmiş.

Değerlendirme zamanı gelir ve ilginç bir sonuç ortaya çıkar; en yüksek kalitede eserlerin tümü, miktar açısından derecelendirilen grup (sol taraftaki) tarafından üretilir. Görünüşe göre, “nicelik” grubu yığınlar halinde iş yapmakla ve hatalarından ders alırken, “nitelik” grubu “mükemmellik” hakkında teoriler üretmekle meşguldü.

Yani, yaptığınız ve üzerinde uzun süre düşündüğünüz tasarım ve teorilere istinaden, bu harcanan zamanın bir şeyleri “geliştirmek,” üzerine daha iyi harcanabileceğidir. Buradaki temel düşünce, erken şekilde başarısızlık için harcadığınız zaman, “doğru şekilde yapmaya çalıştığınız” her şeyi öğrenmek için harcadığınız zamandır. Bu, “yanlış” şeyi geliştirmek için zaman harcayarak elde edemeyeceğiniz bir fayda. Bu orijinal ya da yeni bir fikir değil tabi ki. İşin güzel tarafı, Jeff Atwood burada çömlek yapmaktan yazılım geliştirmeye, veya blog yazısı yazmak için gerekli disiplinler için nasıl geçerli olduğunu açıklamış.

Bu tavsiyeyi değerli kılan, bize hata yapmaktan “korkmamayı” öğretmesi. Sadece bu değil, hatalarımızı “kabul etmeyi” de öğrenebiliriz çünkü sonuçta bu şekilde gerçekten “öğreniriz”. Eğer bir şey durgunlaşmışsa, – bu bir yazılım geliştirmesi de olabilir, kişisel bir ilişki de- bu durgunluktan çıkmak için rastgele bir şey yapmanın hiç bir şey yapmamaktan daha iyi olabileceğini düşünüyorum. Bunu yaparsanız, sonuçları analiz edebilir ve neyi “düzeltmemiz” gerektiğini anlayabiliriz.

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.