Jack Dorsey’nin Twitter’dan ayrılışı

Jack Dorsey 29 Kasım 2021’de attığı bit tweet ile Twitter’daki CEO görevinden ayrıldığını açıkladı.

Bildiğiniz gibi Jack 2006 yılında Twitter’ı kurduktan sonra ayrılmıştı ve 2015’te tekrar CEO olarak geri dönmüştü. 2015 yılında Twitter Inc.’e CEO olarak geri döndüğünde, yönettiği diğer şirket olan Square Inc.’deki bazı çalışanlar, Twitter’ın patronlarının “favori” şirketi olduğuna çabucak inanmaya başlamış. Square Inc. kısaca finansal hizmetler ve dijital ödeme hizmeti sunan bir şirket.

Bu çok normal bence çünkü Twitter halka açıktı, ünlülerle doluydu, basketbolcular, futbolcular, politikacılar, sanatçılar vs. sürekli bir şekilde haberlerdeydi şirket. Satış noktası sistemi ve nispeten bilinmeyen Cash App hizmeti ile Square, bunlardan hiçbiri değildi.

Altı yıl sonra, 29 Kasım 2021’de Jack Dorsey Twitter’ı yönettiği CEO rolünden istifa ettiğinde bu fikir ortadan kalkmış oldu. Square, 1 Aralık çarşamba günü şirket adını Block Inc. olarak değiştirdiğinde, sadece bir “ödeme” mantığının ötesine geçtiğinin ve blockchain teknolojisine odaklandıklarını duyurmuş oldular.

Araştırmalarıma göre bu herkesin beklediği bir şey değilmiş bu arada. Şimdi, Dorsey’in ikinci çocuğu olarak adlandırılan Square, yeni adıyla Block, aniden tüm dikkatini çekiyor. Ve Square (Block!) aniden, büyüme için çok daha fazla alana sahip bir şirket olduğunu öne süren yeni bir kimliğe bürünüyor.

Biz, mantıklı insanlar olarak daha yakından bakıyor olsaydık – Square’in nihai kazanan olacağına dair işaretleri görürdük. Bunlardan en belirgin olanı, Jack’in bir Bitcoin delisi olmasıdır. Bazı haftalar square, bitcoin, kripto para birimleri ve blockchain teknolojisi konularında twitler atıyor ve kamu tarafında da büyük bir ilgiye sahip. Ayrıca, Twitter’ın piyasa değerinin neredeyse üç katı olan 90 milyar dolarlık bir dev haline geldi Square.

Jack bir süredir bir “şirketler şirketi” kurmakla ilgileniyor. Walt Disney Coorperation gibi mesela. Tema parkları, filmler ve ticari ürünler gibi bir dizi iş alanını tek bir kapsayıcı marka altında birleştiren “Disney” modeline hayran.

Square, yeni adıyla Block, ona finans dünyasında bu fırsatı veriyor. Şirketin bir küçük işletme satıcı ürünü (Square Seller), bir tüketici ödeme uygulaması (Cash App), bir müzik aktarım hizmeti (Tidal) ve birden fazla bitcoin ve blockchain girişimi var. Hatta bir bankacılık tüzüğü bile varmış.

Sonuç olarak, Square, Jack’e kriptoyu keşfetme ve finans dünyasını yeniden yaratma konusundaki emellerini gerçekleştirmesi için bir fırsat verebilir. Sonuçta bu, 280 karakterin sunabileceğinden daha büyük bir imparatorluk anlamına gelebilir.

Kaynak:

https://www.google.com/search?q=twitter+market+cap

https://www.zerohedge.com/technology/jack-dorsey-step-down-twitter-ceo-cnbc-reports

https://en.wikipedia.org/wiki/Jack_Dorsey

https://en.wikipedia.org/wiki/Block,_Inc.

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).

2038 yılı problemi

2038 yılında bilgisayar sistemlerini etkileyebilecek bu problemi açıklamaya çalıştım bu videoda.

Bundan önce daha iyi anlaşılması adına bahsetmek istediğim y2K, yani 2000 yılı bug‘ı.

Bildiğiniz gibi bilgisayar sistemleri 1950’li yıllarda geliştirilmeye başlandı ve günümüze kadar devam etti. Bu süreçte birçok program yılları yalnızca son iki basamakla temsil ederek 2000 yılını 1900’den ayırt edilemez hale geldi. Bu da 1 ocak 2000’de bir çok sistemde problemler yaşanacağına dair kehanet oluşmasına neden oldu.

Peki ne oldu 1 Ocak 2000 günü?

Aslında çok büyük bir olay yaşanmadı, Avustralya’da otobüslerde bilet kontrolü yapılan makinalar bozuldu, Japonya’da bir kaç mobil markasında hatalar yaşandı, Amerikada bazı slot makinaleri çalışamaz hale geldi. Yani ölümcül bir olay yaşanmadı bilişim sistemlerinde. Korkulduğu gibi olmadı yani.

2038 yılı problemi ise, birçok dijital sistemde zamanı 1 Ocak 1970 UTC gece yarısından (Unix time) bu yana geçen saniye sayısı olarak temsil etmek ve onu işaretli bir 32-bit tamsayı olarak saklamakla ilgilidir. Bu tür uygulamalar, 19 Ocak 2038’de UTC 03:14:07’den sonraki süreleri kodlayamaz. Y2K sorununa benzer şekilde, Yıl 2038 sorunu, zamanı temsil etmek için seçilen yetersiz sayıda bit (rakam) nedeniyle oluşur.

Nedenleri;

  • 1 Ocak 1970’den bu yana, işaretli bir 32-bit tamsayı kullanılarak depolanabilen en son zaman, 19 Ocak 2038 Salı günü 03:14:07’dir (2^31 − 1 = 1 Ocak 1970’ten sonra 2.147.483.647 saniye).
  • Bu tarihten sonraki süreyi artırmaya çalışan programlar, değerin dahili olarak negatif bir sayı olarak saklanmasına neden olur ve bu sistemler, 13 Aralık 1901 Cuma günü 20:45:52’de (1 Ocak 1970’den 2,147,483,648 saniye önce) meydana geldiği şeklinde yorumlayacaktır. ). Bu, sayacın kullanılabilir ikili rakamların veya bitlerin bittiği ve bunun yerine işaret bitini çevirdiği tamsayı taşmasından kaynaklanır.

Hangi sistemler savunmasız?

Öncelikle embeded olarak çalışan ve özellikle tarihleri hesaplama veya loglama için kullanan sistemler. Özellikle uçuş sistemlerinde ve otomobillerde yoğun olarak kullanılıyor bu tarz sistemler. Bu sistemlerdeki ABS gibi kilitlenme önleyici fren sistemleri, ESC ve ESP gibi elektronik stabilite kontrolü yapan kısımlar ve GPS alıcıları kullanıyor olabilir. Ancak bu, tüm bu sistemlerin Y2038 sorunundan etkileneceği anlamına gelmez, çünkü bu tür birçok sistem tarihlere erişim gerektirmez. Bunu yapanlar için, mutlak saatler/tarihler değil de, yalnızca saatler/tarihler arasındaki farkı izleyen sistemler hesaplamanın doğası gereği büyük bir sorun yaşamayacaktır.

Ayrıca mysql’in 2021 ağustos sürümünden önceki versiyonlarında, UNIX_TIMESTAMP fonksiyonu 19 Ocak 2038 Salı günü 03:14:07’den sonra 0 döndürüyormuş.

Problemi veri yapıları hangileri?

Günümüzde kullanılan birçok veri yapısı, gömülü 32 bitlik zaman temsiline sahip. Ama tam bir liste vermek neredeyse imkansız.

Dosya sistemleri (birçok dosya sistemi, süreleri temsil etmek için yalnızca 32 bit kullanır), binary dosya biçimleri (32 bit zaman alanlarını kullanan), veritabanları (32-bit zaman alanları olan), UNIX_TIMESTAMP() benzeri komutlara sahip SQL gibi veritabanı sorgu dilleri vs..

Kısaca 32-bit zaman gösterimleri içeren veri yapılarını kullanan herhangi bir sistem risk arz edecektir.

Peki çözümü nedir?

2038 Yılı sorunu için evrensel bir çözüm yoktur. Örneğin Freebsd ve OpenBsd gibi işletim sistemleri bazı değişiklikler yapmışlar ama bazı değişiklikleri de “backward compatibility” nedeniyle yapamamışlar.

Neden umursayalım ki daha 17 sene var?

Bazen gelecekte bazı şeyler olur ve bunun ne zaman olacağını bilmek isteriz. Bazen, 17 yıllık bir ipotek gibi, 17 yıldan fazla bir süre sonra planlanması gerekir. Bu sorun zaman geçtikçe daha da kötüleşecek, çünkü yazılım geliştirici olmanın en sinir bozucu yanlarından biri, her zaman upgrade yapmayan birilerinin olmasıdır. Ve her zaman, asla upgrade yapmayan bir çok insan olacak, emin olun.

64 bit işlemcileri kullanmaya başladığımızda sorun ortadan kalkacak, değil mi?

64 bit işlemci kullanmanız, 2038 yılı bug’ı konusunda temiz olduğunuz anlamına gelmez. Örneğin, yeni Apple bilgisayarınızda 64 bit işlemci var ama işletim sistemi hala 32 bit tam sayılar ve 32 bit time_t ile çalışıyor.

Tamsayı boyutunu değiştirdiğinizde, tüm yazılımınızı yeniden derlemeniz gerekir. O zaman Mac uygulamalarının 32 bit ve 64 bit sürümleri göndermesi gerekir. Ancak bu durum hem geliştirici, hem de kullanıcı için acı verici ve sorunlu bir süreç.

Ve sırf yeni bir 64 bit işlemci kullanıyor olmanız, herkesin kullanacağı anlamına da gelmez. 32 bit işlemciler sadece PC’lerde ve eski donanımlarda değil, arabanızda, telefonunuzda, saatinizde, TV’nizde, DVD oynatıcınızda da ucuz ve bol bol duruyor olacak.

Rob Pike’tan programlamanın 5 kuralı

Texas üniversitesinin sitesinde bulunan, Adnan Aziz’in yazdığı “”Rob Pike: Programlamanın 5 kuralı” makalesini inceledim.

Rob Pike kimdir peki? Kendisi programlama dünyasında çok saygı duyulan bir abimiz. 2002 – 2021 yılları arasında Google’da çalışmış bu abimiz en fazla Go programlama dilinin yaratıcılarından biri olarak bilinir. Ek olarak Unix takımında yer alıp, Bell laboratuvar‘ında çalışmış. Ayrıca Ken Thompson ile UTF-8’i geliştirmiş.

İşte o 5 kural;

1. Yazdığınız bir programın zamanı nerede harcayacağını bilemezsiniz. Darboğazlar şaşırtıcı yerlerde meydana gelir, bu nedenle darboğazın nerede olduğunu kanıtlayana kadar ikinci bir tahminde bulunmaya ve bir hız kesme işlemi yapmaya çalışmayın.

2. Ölçüm. Ölçene kadar hız için ayarlama yapmayın ve o zaman bile kodun bir kısmı geri kalanını boğmadıkça yapmayın. (Erken optimizasyon, tüm kötülüklerin köküdür.)

3. Havalı algoritmalar, n küçük olduğunda yavaştır ve n genellikle küçüktür. Havalı algoritmaların büyük sabitleri vardır. n’nin sıklıkla büyük olacağını bilene kadar, süslenmeyin. (n büyüse bile, önce Kural 2’yi kullanın.)

4. Havalı algoritmalar, basit olanlardan daha karmaşıktır ve uygulanması çok daha zordur. Basit veri yapılarının yanı sıra basit algoritmalar kullanın. (Kararsızsanız, brute force kullanın)

5. Veri domine eder. Doğru veri yapılarını seçtiyseniz ve işleri iyi organize ettiyseniz, algoritmalar neredeyse her zaman belli olacaktır. Algoritmalar değil veri yapıları programlamanın merkezindedir.

Kaynaklar:

KISS prensipleri: https://en.wikipedia.org/wiki/KISS_principle

The Mythical Man-Month: https://en.wikipedia.org/wiki/The_Mythical_Man-Month

Youtube’un dislike sayısını gizlemesi

Youtube 10 Kasım 2021’de yayınladığı bir blog yazısıyla videolardaki dislike sayılarını gizlediğini açıkladı.

Bunun temel nedeni olarak ta küçük içerik üreticilerini “dislike mobs” adı verilen bir çok fazla dislike yağmurundan korumak demişler. Yaptıkları araştırmalarda özellikle küçük içerik üreticilerinin buna maruz kaldıkları ortaya çıkmış vs. vs.

Öncelikle bu “dislike mobs” sorunu yeni bir sorun değil. Youtube’un kurulduğundan beri var olan bir sorun. Fakat bence Youtube Rewind 2018 ile daha görülebilir hale geldi, özellikle kendileri de buna maruz kaldıklarında.

Youtube Rewind kısaca, youtube’un her sene aralık ayının başlarında oluşturduğu, o senenin en çok izlenen veya en çok öne çıkan içeriklerin oluşturdukları bir kolaj videosu olarak düşünebilirsiniz. Fakat 2018 rewind videosu çok kötüydü, çoğunlukla gözümüze sjw sokmuşlardı, berbattı ve yayınlandıktan sadece 7 gün sonra Justin Bieber’ın “Baby” şarkısını geçerek youtube en fazla dislike alan videosu oldu. Şu anda 19 milyon’u geçmiş durumda dislike sayısı.

İşte bu olaylar yaşanırken de Youtube staff’ları farkediyorlar ki çok fazla fazla dislike almak inanılmaz kötü hissettiriyor. Bu nedenle dislike sayısını gizlemeyi ve/veya dislike butonunu tamamen kaldırmayı düşündüler o yıllarda. Ve 10 kasım itibariyle de uygulamaya başladılar.

Peki bizler için ne değişecek?

– İçerik üreticileri yine Youtube Studio içerisinden dislike sayılarını görebiliyor olacaklar her bir video için.

– İzleyiciler dislike sayısını göremeyecekler, fakat bir videoyu dislike yapabilecekler.

– Geliştiriciler için ise 13 Aralık 2021’den itibaren dislike bilgilerini API üzerinden alamıyor olacaklar.

Benim fikirlerim şunlar;

Beğenmeme düğmesi bana videonun iyi olup olmadığını söyleyebilir kesinlik ifade etmese de. Ama şimdi, beğenmeme sayısını bile göremezsem videonun iyi olup olmadığını bilebilirim? Ya o video benim haberim olmadan beni manipüle etmeye çalışan bir video ise? Beğenmeyenleri göstermek önemlidir. Kullanıcıya, diğer izleyicilerin video hakkında nasıl düşündüklerini gösterir, böylece zamanlarını boşa harcamadan önce videonun nasıl olduğu hakkında bir fikre sahip olurlar. Youtube, bana sadece kurumsal markaları korumak için beğenmeme butonunu kelimenin tam anlamıyla devre dışı bıraktı gibi geliyor.

Bu arada, bazı sosyal medya sitelerinin dislike almadığı doğrudur. Ancak orada tükettiğiniz içerik genellikle çok daha hızlıdır. Instagram’da birinin fotoğrafına bakar ve beğenmezseniz, bir sonrakine kaydırmanız yeterlidir. Orada dislike butonunun olması pek mantıklı değil.

Ancak, YouTube’da videodan ne bekleyeceğinizi bilmek için birkaç saniye, hatta dakikalarca izlemeniz gerekebilir. Beğenme/beğenmeme oranı, o videonun sizin zamanınıza değip değmeyeceğine hızlı bir şekilde karar vermek için geçerli bir araçtı bence.

Peki alternatif olarak ne yapılabilirdi?

Youtube’ta çok fazla sahte hesap var bu hepimizin bildiği bir durum. Bir şekilde onaylı olacak şekilde hesaplar oluşturulabilmeli. Cep telefonu onaylı mesela. Böylece ben bu kişiyi banladığımda 10 tane hesap alıp gelemez. Ek olarak clickbait videolar. İnsanlar bunlara dislike vermeliler ki, diğer insanlar bu videoları izlemeye tenezzül etmesin, vakitlerini harcamasınlar.

Küçük içerik üreticilerini korumak içinmiş, yersen..

Kaynaklar:

– An update to dislikes on YouTube: https://blog.youtube/news-and-events/update-to-youtube/

– Update to YouTube Dislike Counts: https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts

– List of most-disliked YouTube videos: https://en.wikipedia.org/wiki/List_of_most-disliked_YouTube_videos

– YouTube Rewind 2018: Everyone Controls Rewind: https://en.wikipedia.org/wiki/YouTube_Rewind_2018:_Everyone_Controls_Rewind#Dislikes

– Youtube tweet’i: https://twitter.com/YouTube/status/1073280323608285185

Facebook Mülakat Sorusu – Lowest Common Ancestor of a Binary Search Tree

Leetcode içerisinde bulunan “Lowest Common Ancestor of a Binary Search Tree” sorusunun açıklaması ve çözümü. Bu soruda size verilen bir binary search tree içerisinde, verilen iki tane TreeNode’un en aşağıdaki ortak parent’ını bulmanız isteniyor. Bence deneme olarak bunun iterative halini de siz yazabilirsiniz.

► LeetCode 235. Lowest Common Ancestor of a Binary Search Tree: https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/

► Problem açıklaması:

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

According to the definition of LCA on Wikipedia:

“The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

Example 1:

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8

Output: 6

Explanation: The LCA of nodes 2 and 8 is 6.

Example 2:

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4

Output: 2

Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

Example 3:

Input: root = [2,1], p = 2, q = 1

Output: 2

Constraints:

The number of nodes in the tree is in the range [2, 105].

-109 <= The number of nodes in the tree is in the range [2, 10^5].

-10^9 <= Node.val <= 10^9

All Node.val are unique.

p != q

p and q will exist in the BST.

Microsoft Mülakat Sorusu – Odd Even Linked List

Leetcode içerisinde bulunan “Odd Even Linked List” sorusunun açıklaması ve çözümü. Bu soruda size verilen bir linked list içerisinde, ilk node tek olacak şekilde önce tek index’teki node’ları, ardından çift index’teki node’lar gelecek şekilde düzenlemeniz isteniyor.

► LeetCode 328. Odd Even Linked List: https://leetcode.com/problems/odd-even-linked-list/

► Problem açıklaması:

Given the head of a singly linked list, group all the nodes with odd indices together followed by the nodes with even indices, and return the reordered list.

The first node is considered odd, and the second node is even, and so on.

Note that the relative order inside both the even and odd groups should remain as it was in the input.

You must solve the problem in O(1) extra space complexity and O(n) time complexity.

Example 1:

Input: head = [1,2,3,4,5]

Output: [1,3,5,2,4]

Example 2:

Input: head = [2,1,3,5,6,4,7]

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

Constraints:

n == number of nodes in the linked list

0 <= n <= 10^4

-10^6 <= Node.val <= 10^6

Visual Studio – Parametre ve Değişken İpuçları

Visual Studio 2019 versiyonundan beri var olan “Inline Parameter Name Hints” ve “Inline Type Hints” özelliklerinden bahsedelim.

Inline Parameter Name Hints özelliği seçildiğinde, literal’ler ve object initialization durumlarından parametrelerin yanında o parametre ile ilgili ipuçlarını bulabilirsiniz.

Inline Type Hints özelliği seçildiğinde, normal tiplerin ve lambda parametre tiplerinin yanında ilgili ipuçlarını bulabilirsiniz.

Ben pek “type hints” kullanım taraftarı değilim. Kodu okurken daha yorucu hale getiriyor bence. Tabi bunlar tamamen kişisel düşüncem. Siz gidip Visual Studio içerisinde Tools Options Text Editor C#Advanced kısmındaki seçeneklerin hepsine göz gezdirip hangisinin sizin için daha iyi olduğuna karar verebilirsiniz.

Kaynak: https://docs.microsoft.com/en-us/visualstudio/ide/reference/options-text-editor-csharp-advanced?view=vs-2019#inline-hints

.NET 6 Yenilikleri – LINQ *OrDefault metodlarında default değerler

.NET 6 ile gelen yeniliklerden biri de LINQ içerisindeki *OrDefault metodlarında default değer atanma özelliği.

.NET 5 ve öncesinde IEnumerable içerisinde bulunan First, Last ve Single metodları aldıkları predicate’e göre herhangi bir eleman bulunamazsa InvalidOperationException fırlatıyorlardı.

Yani;

var list = new List int  { 1, 2, 3};

var first = list.First(i => i > 3); // InvalidOperationException
var last = list.Last(i => i > 3); // InvalidOperationException
var single = list.Single(i => i > 3); // InvalidOperationException

.NET 6 ile birlikte bu metodlara ek olarak FirstOrDefault, LastOrDefault ve SingleOrDefault metodlarına default değer atama özelliği geldi. Bunlar aldıkları predicate’e göre eğer bir eleman bulunamazsa defaultValue ile verdiğiniz değeri geri döndürüyorlar.

first = list.FirstOrDefault(i => i > 3, -1);
last = list.LastOrDefault(i => i > 3, -2);
single = list.SingleOrDefault(i => i > 3, -3);

Console.WriteLine($"{first} {last} {single}");
// -1 -2 -3

Kaynak: Announcing .NET 6 — The Fastest .NET Yet

https://devblogs.microsoft.com/dotnet/announcing-net-6/#system-linq-firstordefault-lastordefault-singleordefault-overloads-taking-default-parameters

.NET 6 Yenilikleri – Chunk ile collection’ları eşit parçalara ayırma

.NET 6 ile birlikte hayatımıza giren yeniliklerden biri de IEnumerable.Chunk metodu.

.NET 5 ve öncesinde, collection’ları eşit sayıda elemanlar olacak şekilde parçalara ayırmak için 2 yöntem vardı.

Birincisi aşağıdaki gibi bir custom (veya extension) metod yazmak;

static List List T Split T (IList T source, int size)
{
    return source.Select((x, i) = new { Index = i, Value = x })
        .GroupBy(x => x.Index / size)
        .Select(x => x.Select(v = v.Value).ToList())
        .ToList();
}

İkincisi de MoreLINQ içerisinde bulunan Batch metodunu kullanmaktı.

var buckets = numbers.Batch(10);

.NET 6 ile gelen IEnumerable.Chunk metodu ile bu işlemi artık custom bir metoda veya bir nuget paketine ihtiyaç duymadan halledebiliyoruz.

IEnumerable int numbers = Enumerable.Range(1, 34);
IEnumerable int[] buckets = numbers.Chunk(10);

foreach (int[] bucket in buckets)
{
    Console.WriteLine($"{bucket.First()} {bucket.Last()}");
}

Sonuç:

1 10
11 20
21 30
31 34

Kaynak: https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.chunk