2 puan yazan GN⁺ 2023-09-09 | 1 yorum | WhatsApp'ta paylaş
  • Verilen not aralığına bakıldığında başlıktaki Erlang programının ne olduğu ya da neden önemli olduğu doğrulanamıyor
  • Doğrulanabilen metin çoğunlukla Shell betiği parçalarından ve kısa bir düzeltme cümlesinden oluşuyor
  • Betik, mevcut dizindeki *.png.png.meta dosyalarını dolaşıyor ve dosya adından ilk noktadan önceki kısmı çıkarıyor
  • Fiilen çalıştırılan komut git mv $i $j.png.meta; $j.png.png dosyasını $j.png olarak değiştiren komut ise yalnızca çıktılanıyor
  • Orijinal metnin 5-104 numaralı parçaları atlandığı için, başlıkla ilgili temel iddialar veya Erlang koduna dair açıklamalar doğrulanamıyor

Doğrulanabilen içerik

  • Verilen kapsamla “en sevdiğim Erlang programının” ne olduğu, neden tercih edildiği veya kod yapısı hakkında hüküm vermek zor
  • Doğrulanabilen kod parçası, #!/bin/sh ile başlayan bir dosya adı değiştirme amaçlı Shell betiği
    • *.png.png.meta dosyaları üzerinde dönüyor
    • j="${i%%.*}" ile dosya adında ilk noktadan önceki kısmı çıkarıyor
    • git mv $i $j.png.meta gerçekten çalıştırılıyor
    • git mv $j.png.png $j.png ise sadece echo ile yazdırılıyor
  • “Actually you don't need the really do this. It should have been water the plants.” cümlesi yer alıyor; bu, önceki talimatın ya da örneğin aslında gerekli olmadığı ve bunun yerine “water the plants” olması gerektiğine dair bir düzeltme gibi okunuyor
  • Son kısımda Joe Armstrong ve Jeremy Ruston birlikte anılıyor

Yargıyı sınırlayan bağlam

  • Birden fazla parça TiddlyWiki durum/kenar çubuğu meta verilerinden, JPEG/PNG gibi görünen Base64 verilerinden ve boş içerikten oluştuğu için gövdedeki olguları çıkarmak zor
  • Verilen notlarda Erlang programının davranışı, kodu, tasarım gerekçesi, örnekler, sayılar, iş akışı veya iddialar gibi temel bilgiler yer almıyor
  • Shell betiği parçası da çevresindeki açıklama olmadan kısmen verildiği için, hangi işin parçası olduğu kesinleştirilemiyor

Atlanan aralık

  • Girdide, orijinal metnin 5-104 numaralı parçalarının uzunluk/maliyet sınırı nedeniyle atlandığı açıkça belirtiliyor
  • Bu özet yalnızca verilen not aralığını yansıtır; orijinal metnin tamamındaki ayrıntıları veya sonucu kapsamaz

1 yorum

 
GN⁺ 2023-09-09
Hacker News yorumları
  • Sunucu kapanışı F, kendi mesajına ek olarak {become, F} mesajını da alabiliyorsa, sunucuyu sürekli yeni davranışlara dönüştürmek mümkün
    Tamamen başka bir konu ama Erlang konferansında Joe ile konuştuğum zamanı hatırlıyorum. Her zaman teknoloji konusunda heyecanlıydı ve herkesle konuşmaya istekliydi. Windows’un her yıl daha kötü ve daha az kullanışlı hâle gelmesine üzülüyordu; bir gün dosyaları görmek için kilidin açılması adına bir süre reklam izlemek gerekeceğini söylemişti, neredeyse haklı çıkıyor. Windows 11’de zaten reklamlar var ve kaldırmak için özellikle ayarları aramak gerekiyor; Windows 13 civarında gerçekten böyle olacak gibi

    • Evde Linux, işte Windows kullanıyorum; reklamlardan daha çok şaşırtan şey, Windows’ta eskiden Linux’ta gördüğüm tuhaf sorunların çok daha sık ortaya çıkması
      Bir kulaklığın sesinin diğerinden çok daha yüksek olması, Microsoft uygulamalarının garip şekilde çökmesi, Windows dokümantasyon sayfasının hiçbir tarayıcıda açılmayıp arşiv sitelerini kullanmayı gerektirmesi, eskiden düzgün algılanan harici monitörün birden algılanmaması ya da ekranın titremesi gibi. Office, varsayılan olarak yerel yerine buluta kaydetmeye yönlendiriyor; ben ise dosyaların önce yerelde olmasını, bulutun yedekleme görevi görmesini tercih ederim. WSL epey derme çatma ama yine de Windows’u kullanılabilir kılan neredeyse tek sebep
      Joe’nun harika biri olduğunu hep duyardım ve buna ikna oldum. Kodlamayı kendi kendime öğrenmeye başladığımda onun Erlang kitabını okumuştum; oyunbazlığı, alçakgönüllülüğü ve hayal gücü bende büyük etki bıraktı. Erlang’ı neredeyse hiç kullanmadım ama yazıları kod hakkındaki düşünme biçimimi değiştirdi; matematik, yazılım mühendisliği ve bilgisayar bilimi kültürünün oyunbazlığı ve alçakgönüllülüğü daha çok benimsemesini isterim
    • İlk paragraftaki şey aslında aktör modelinin bir özelliği. BEAM’de de mümkün olduğunu daha önce bilmiyordum
    • Windows 11’deki müdahaleci reklamlar yeni değil. Zaten Windows 10’da da var
  • BEAM’in JVM veya Node gibi diğer sanal makinelerden neden farklı olduğunu açıklayan 35 dakikalık kısa genel bakış videosu: https://www.youtube.com/watch?v=pO4_Wlq8JeI

    • Benzer bir sunum olan The Soul of Erlang and Elixir’i izledim; gerçekten çok iyiydi ve her izlediğimde yeniden heyecanlanıyorum
  • Joe’yu özlüyorum. Bilişimi daha iyi hâle getirmeye yönelik bulaşıcı tutkusu, gençliğimdeki beni ve bugünkü teknolojiye yaklaşımımı derinden etkiledi

  • universal_server() -> receive {become, F} -> F() end.
    Açıkçası bu universal_server’ın gücünü tam olarak anlayamıyorum. Biri açıklayabilirse iyi olur

    • Go’ya aşinaysanız, birinin anonim bir fonksiyon gönderip çalıştırmasını bekleyen bir goroutine’e benzer
      Erlang’da problemi çözmek için çok sayıda süreç başlatılır ve çoğu süreç mesaj bekler. Önemli fark, Erlang süreçlerinin uzak makinelerde de sorunsuz çalışabilmesidir. Bu süreç, içinde become adlı atom ve bir fonksiyon bulunan tuple mesajını alır; başka bir süreç bu mesajı ne zaman gönderirse o fonksiyona “dönüşür”
      Yani bekleme döngüsünün mantığını istediğiniz protokol mantığıyla değiştirebilirsiniz. Örnekte bu döngüyü birden çok makinede çalıştırıp gossip protokolü uygulayan bir fonksiyon göndermişti; ama aynı şekilde BitTorrent istemcisi olmasını sağlayan bir mesaj da gönderebilirsiniz. Joe hem bir dahiydi hem de çok nazik bir insandı; Erlang şimdiye kadar gördüğüm en güzel teknik yaratımlardan biri. Eşzamanlılığa tamamen yeni gözlerle bakmamı sağladı
    • Biraz daha açarsak, receive anahtar sözcüğü gelen mesajlar için bir switch deyimi gibi görünür ama aslında pattern matching yapar
      Örneğin {From, N} alıp sonucu From ! factorial(N) ile geri döndüren bir faktöriyel sunucusu yapabilirsiniz. !, sonucu geri dönüş sürecine gönderen operatördür
      Test kodu universal_server’ı başlatır, Pid ! {become, fun factorial_server/0} ile onu faktöriyel sunucusuna dönüştürür, ardından {self(), 50} gönderip 50’nin faktöriyelini geri alır. Erlang’ın büyük avantajları dağıtık paralellik ve hot code update’tir; burada bu, universal_server’ın alma döngüsünü factorial_server’ın alma döngüsüyle üzerine yazmak şeklinde görünür. Yine de gerçek hot code update’in tam olarak böyle çalışmadığını düşünüyorum
    • Normalde sunucunun ne için kullanılacağını önceden bilip kodu buna göre yazmanız gerekir
      Ama Erlang’da dağıtık bir Erlang sunucu ağı kurabilir ve sunucuları istemcinin istediği işi yapabilen genel amaçlı hesaplama kaynağı olarak bırakabilirsiniz. Kod istemciden gelir; tüm makinelere ikili dosya kurması için sistem yöneticisinden ricada bulunmaya gerek kalmadan fonksiyonu iletirsiniz ve uzak makine onu çağırır
    • Esas nokta, istediğiniz herhangi bir tür sunucuya dönüşebilmesi
      Sunucuyu çalıştıracak gerçek fonksiyon istemci tarafından gönderilir ve Erlang süreci bu fonksiyona dayanarak o sunucu hâline gelir. Erlang’ın hot reloading yeteneği de düşünülünce bu basit yapı daha da güçlenir. Erlang süreci işi bekleyen bir hesaplama kaynağıdır; o işin de eksiksiz bir sunucu çalıştırmak olduğunu düşünürseniz epey havalı
    • Erlang’ın yapısı sıra dışıdır; hem sanal makine hem dil, küçük süreçlerin aynı anda çalıştığı ve her sürecin gelen mesajları yorumlamak için sonsuz döngüde beklediği fikri üzerine kuruludur
      Bu yüzden süreç, gönderdiğiniz koda göre her şey olabilir. Bir mikrodalga fırını kontrol edip sonra kuantum hesaplama yapması, ertesi gün de futbol maçının kazananını tahmin etmesi gerekiyorsa, her iş için gereken kodu gönderirsiniz ve aynen çalıştırır
  • BEAM’in neden özel olduğunu, Erlang/Elixir gibi sistemlerdeki eşzamanlılığın Go veya Java’daki eşzamanlılıktan neden farklı olduğunu açıklamaya çok zaman harcıyorum
    Bundan sonra Joe’nun en sevdiği Erlang programına ve bu HN başlığına link vermem yeterli olacak gibi

  • Bu blog yazısı yakın tarihli harika bir sunumda da ele alındı: https://youtu.be/pQ0CvjAJXz4

    • Yüksek erişilebilirlik, hata toleransı ve dağıtık Erlang sistem mimarisinin her aşamasını çok iyi ele alıp açıklayan bir sunum
    • Her hastanın bir Erlang süreciyle temsil edildiği sistem bu mu, merak ediyorum
  • Erlang hakkında yalnızca üst düzey bir anlayışım var, doğrudan programlamış değilim; bu kodun neden gerekli olduğunu merak ediyorum
    universal_server() -> receive {become, F} -> F() end.
    Uzak makinede doğrudan F()yi başlatmak yeterli olmaz mı diye düşünüyorum. Uzak sanal makinede F kodunun zaten bulunması gerektiği için, bu örnek F kodunun serileştirilip iletildiği anlamına da gelebilir. Ortak boilerplate’i ele alıyorsa faydasını anlarım; ama şu anda become F mesajını bekleyip ardından F()yi çalıştırıyormuş gibi görünüyor

    • Bu kod havalı, ancak çok idiomatik ya da gerçek üretim kodunda sık görülecek bir yöntem olmayabilir. Yine de Joe keşfetmeyi ve denemeyi severdi
      Burada F bir closure olduğu için yalnızca kodu değil, yakaladığı değişkenleri ve oluşturulduğu andaki ortamı da içerebilir. F() çağrıldığında bu kod çalışır ve F oluşturulduğunda etrafındaki ortama erişebilir
      Erlang’da closure’ları ağ üzerinden başka Erlang düğümlerine gönderebilirsiniz. Ancak closure’ın başvurduğu modül kodunun tüm düğümlerde bulunması gerekir. Üretim kodunda muhtemelen söylediğiniz gibi F modülünü doğrudan çağırır ve argümanları açıkça geçirirsiniz; bu daha çok olasılığı gösteren havalı bir demo gibi
    • Erlang’ın fonksiyonel tasarımı sayesinde F(), önceki herhangi bir bağlam kadar iyi bir üst düzey bağlam olabilir; bu da güzel
      Mevcut istekler eski mantıkla doğal biçimde işlenirken yeni isteklerin yeni mantıkla başlaması sağlanabilir ve sonunda eski mantık garbage collection’a tabi tutulabilir
    • Uzak sanal makinede F kodunun zaten bulunması gerektiği doğru, ama kodu uzak sanal makineye göndermek de mümkün
      Örneğin Elixir’de Code.compile_string ile modül adını ve BEAM bytecode ikilisini alabilirsiniz. Bu bytecode’u başka bir sanal makineye gönderip :rpc.call('node@remote_host', :code, :load_binary, [the_module_name, "filename_doesnt_really_matter", binary_code]) ile uzak sanal makineye yükledikten sonra spawn('node@remote_host', my_module, my_function, [args]) ile başlatabilirsiniz
    • Alıntılanan program uzak makinede çalıştırılmak üzere tasarlanmış ve uzak makine, yeni çalıştırması gereken programı deserialize ediyor
      Burada F, serileştirilip süreçler arası mesaj olarak gönderilen yeni programı temsil eden bir değişkendir; bu durumda ağ üzerinden de iletilir
  • Joe’nun Erlang ile temel bir sunucu yazmayı anlattığı bir ders de var: https://gioorgi.com/2015/erlang-lesson1/
    Kendim not alıp biraz daha açıklamıştım; Erlang/Elixir gibi asenkron dillerin diğer dillere kıyasla sahip olduğu gücü gösteriyor. Ne yazık ki bugünlerde pek kullanılmıyor

  • Son zamanlarda Julia’ya sardım; dağıtık modelinde Erlang’ın fikirlerinden epey ödünç almış gibi görünüyor
    Birden çok düğüm üzerinde sihirli biçimde çalışan bu tür anlık sunucuları Julia’da da oldukça kolay yeniden oluşturmak mümkün. Emin değilim ama Julia’nın Distributed modülünün Erlang’dan az da olsa esinlenmemiş olması pek olası görünmüyor
    Erlang’ı gerçekten seviyorum ve daha fazla kullanma fırsatım olmasını isterdim; ama kavramlarının başka platformlara sızdığını görmek de güzel

    • Julia topluluğunda Erlang’ın hata raporlama felsefesinden çıkan let it crash gibi dersleri savunurken aynı tarafta olacağımızı düşünüyorum