2 puan yazan GN⁺ 2024-02-12 | 1 yorum | WhatsApp'ta paylaş
  • Aho, AWK ile uygulanmış bir Git’tir; Git’in iç yapısını ve GNU AWK’nin yeni özelliklerini keşfetmek için hazırlanmış oyuncak bir projedir
  • Amaç gerçek kullanım değil, eğlence ve eğitimdir; Git’in yerine kullanılacak bir araç olarak tasarlanmamıştır
  • Çalıştırmak için gawk 5.0 veya üzeri gerekir, zlib sıkıştırması için şu anda pigz kullanılır ve geri kalanı için GNU coreutils sağlanan bir ortam varsayılır
  • Çoğu Linux üzerinde çalışabilir, ancak BSD/Mac ortamlarına pek uygun değildir
  • Uygulanan özellikler init, add/rm, status, commit, salt okunur config, cat-file olup; ağ özellikleri olan clone ve push eklenmeyecektir

Aho’nun amacı ve kapsamı

  • Aho, “AWK ile uygulanmış Git” hedefiyle geliştirilen bir projedir
  • Modern AWK’nin tek satırlık betiklerden daha fazlasını yapabildiğini göstermek için hazırlanmış oyuncak bir projedir
  • Git’in iç yapısını ve GNU AWK’nin yeni özelliklerini keşfetmeye odaklanır
  • Pratik kullanımdan çok eğlence ve eğitim amaçlı bir projedir

Çalışma ortamı

  • Gerekli çalışma ortamı şunlardır
    • gawk 5.0 veya üzeri
    • zlib sıkıştırması için pigz
    • GNU coreutils
  • Çoğu Linux’ta çalışabilir, ancak BSD veya Mac ortamları için uygun değildir

Temel kullanım akışı

  • Ortamı source ./modpath ile hazırladıktan sonra aho init çalıştırılırsa .aho dizininde boş bir Git deposu başlatılır
  • aho add -v ., dosyaları eklerken .gitignore, LICENSE, README.md, aho, aho.awk, include/*.awk gibi öğeleri çıktılar
  • Yeni bir dosya oluşturduktan sonra aho add -v . yeniden çalıştırılırsa ilgili dosya da eklenir
  • .aho/ altında Git’e benzer bir yapı oluşturulur
    • branches
    • config
    • description
    • HEAD
    • index
    • objects
    • refs/heads
    • refs/tags
  • GIT_DIR=.aho git ls-files --stage ile Git aracının .aho deposunun indeks girdilerini okuduğunu gösteren bir örnek sunulur

Uygulanan özellikler ve kalan işler

  • Tamamlanan özellikler
    • init
    • add/rm
    • status
    • commit
    • salt okunur config
    • cat-file
  • Henüz tamamlanmayan özellikler
    • reset
    • branch
    • switch
    • ls-files

Ağ özellikleri hariç tutuluyor

  • Ağ özelliklerini ekleme planı yoktur
  • GNU AWK ile ağ özellikleri uygulanabilir olsa da, Aho’ya clone veya push eklenmesi planlanmamaktadır
  • AWK ya da Git bilginizi geliştirmeye yardımcı olacak katkılar memnuniyetle karşılanır

1 yorum

 
GN⁺ 2024-02-12
Hacker News yorumları
  • Awk harika. Unix türevlerinde neredeyse her yerde bulunan tam teşekküllü bir programlama dili, ama pratikte çoğunlukla pipe edilmiş standart çıktından metin parçaları çekmek için kullanılan tek satırlık komutlar gibi görünüyor
    Oysa Awk genel amaçlı bir betik dili olarak da kullanılabilir ve bu kullanımda birçok açıdan Bash’ten daha iyidir. Doğada Awk betiklerini neden daha sık görmediğimizi merak ediyorum. Belki Perl’in shell, Awk ve sed’in iyi yanlarını tek dilde birleştirmeye çalışması ve sonrasında insanların Perl’e kötü gözle bakıp uzaklaşması yüzündendir
    [1] NetBSD kaynak kodundan rastgele bir alıntı: https://github.com/NetBSD/src/blob/trunk/sys/dev/eisa/devlis...

    • Doğru. Perl, Awk’nin yerini aldı ama birçok durumda bu ters tepti. Çünkü başka programcıların kolayca okuyabileceği ve orta-büyük programlara kadar ölçeklenebilecek Perl kodunu basit ve yaygınca anlaşılan bir biçimde yazmanın bir yolu yoktu
      Kimsenin bunu iyi yapamadığını söylemiyorum; ama sektör genelindeki başarı oranı düşüktü, bu da Perl’ün epey kötü bir itibar edinmesine yol açtı
      Awk’nin yeniden yükselişini görmek isterim. Awk’yi büyük ölçekte genişletmek daha zor olduğu için, küçük bir Awk ile başlayan bir projenin sonraki kişiye binlerce satırlık bir Awk kod tabanı olarak devredilme riski daha düşük. Bunun yerine nispeten erken bir aşamada daha ölçeklenebilir ve bakımı daha kolay bir dilde yeniden yazılır
    • İnsanların ne düşündüğü umurumda değil; Perl’ü sevdiğimi fark ettim. Yakın zamanda yaptığım şey programlanabilir bir bölüm düzenleyicisi. sfdisk ile bölümleri boşaltmaya benziyor ama basit silmeden daha fazlasını yapmak istiyordum ve MBR ile GPT bölüm tablolarını birleştirip hibrit bir yapı oluşturmak istiyordum
      Eğlenceliydi ve Perl’ü tekrar kullanacağım. Awk’nin de bu kadar harika olduğunu gördüğüme göre bir gün onu da kullanabilirim
      [1] https://github.com/csdvrx/hdisk/
    • Awk inanılmaz derecede kullanışlı. Bu hafta, “Her saat başını hemen izleyen birkaç dakika içinde en çok sorgu atan kullanıcı kimdi?” sorusunu yanıtlamak için çok sayıda GB’lık Postgres logunu ayrıştıran bir betik yazdım
      Birkaç fonksiyon, toplamda 20 küsur satır kod ve sort ile uniq’e giden birkaç pipe yetti; ayrıca oldukça hızlıydı. Özellikle başına LC_ALL=C ekleyince daha da hızlı
      [0]: Bu işi gereksiz kılacak kadar gözlemlenebilirlik neden düzgün kurulmamıştı diye sorarsanız haksız sayılmazsınız, ama bazen eldeki gerçeklikle yaşamak gerekir
      [1]: gawk’nin liste oluştururken benzersiz sıralama yapabildiğini biliyorum. Olay müdahalesinin sonlarına doğru yorgundum ve | sort | uniq -c | sort -rn akılda tutması çok daha kolaydı
      [1].a: sort’ta -u argümanı olduğunu da biliyorum. Sayım sağlamıyor ve benzersizleştirme de uniq uygulamasına göre epey daha yavaş
    • Perl’ün kötü olduğu yargısı, Awk rönesansının büyük itici gücü. Perl’ü en baştan öğrenmemiş geliştiriciler shell ile Python arasındaki boşluğu dolduracak bir şey istiyor; benim gibi Perl’ü istemeye istemeye bırakmış geliştiriciler de var
      HN zevkine sahip insanlar Perl’ü “havalı değil” gördüğü için Perl ve Perl ile yazılmış tüm kodlara artık bir son kullanma tarihi ilişmiş durumda. Ama Awk POSIX standardı olduğu için bu insanlar onu ortadan kaldıramaz
    • AWK’yi seviyorum. String merkezli tip sistemi, Javascript programcılarını bile kızartacak cinsten. 0, "" ve gerçekten hiçbir şey olmaması; hepsi aynı false değeridir
      Sayılar, Lua’daki gibi sayıyı temsil eden stringlerden farklı değildir. Ama garip biçimde bu beni rahatsız etmiyor. Sayıları sayı, stringleri string olarak mutlaka korumanız gerekiyorsa değerin başına # veya $ gibi bir işaret koyup sonra substr() ile sökebilirsiniz
  • The AWK Programming Language, Second Edition Eylül 2023’te çıktı
    https://awk.dev
    İlk baskı 1988’de yayımlandı ve burada görülebilir: https://archive.org/details/pdfy-MgN0H1joIoDVoIC7
    Tartışma: https://news.ycombinator.com/item?id=13451454

    • Bu 35 yıllık aralık, editör “Peki 2. baskı ne durumda?” diye sorduğunda anlatmak için iyi bir hikâye
    • Brian Kernighan da işin içinde. K&R C’deki “K” ve daha pek çok Unix efsanesinin kahramanı
  • Şu tür koda bakınca, function read_objfile(obj, objpath, bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) içinde büyük boşluktan sonraki parametreler yerel değişkenlerdir. Değer geçirilebilir ama bunun için tasarlanmamışlardır
    GNU Awk’ye gerçek leksik değişkenler bağlayan bir let ifadesi ekleyen bir yama yazdım; böylece function read_objfile(obj, objpath) { @let (bytes, end_of_header, header, end_of_type, type, size, bytes_after_header) { } } gibi yazılabiliyordu
    Ne yazık ki proje tarafından reddedildi ve adını değiştirdiğim bir GNU Awk fork’u yapmam önerildi; ben de öyle yaptım
    https://www.kylheku.com/cgit/egawk/about/

    • O taraftaki kararın da makul olduğunu düşünüyorum. gawk zaten awk’den çok fazla farklılaşıyor. Daha da ayrışan bir sözdizimi eklenecekse en iyisi onu fork edip başka bir ad vermek
  • Linux komut satırının en iyi geliştirme ortamı olduğunu neden söylediğimi sorarlarsa, sık sık işaret ettiğim araçlardan biri Awk. Temel düzeyde Awk bilmek bile az şeyle çok iş yapmayı sağlıyor; IDE ise tersine hantal gelmeye başlıyor
    Awk öğrenmek istiyorsanız ve ders tarzı öğrenme size uyuyorsa, birkaç yıl önce Linux Fest Northwest için hazırladığım sunumu YouTube'a kaydetmiştim: https://youtu.be/E5aQxIdjT0M

    • Aynı zamanda Unicode desteği çok geç, muhtemelen ancak iki yıl kadar önce eklendi. Diğer shell araçlarında olduğu gibi içeriği pipe ile Awk'a aktarırken de edge case'ler var
      CTRL+D benzeri diziler girişi kesebilir; bilmediğim onlarca başka edge case de vardır ve en kötü anda sizi ısıracaktır
      Awk etkileyici bir araç, ama onu kaideye çıkarınca zayıf yanları görünmez oluyor. Ciddi işleri, o işe uygun daha uzmanlaşmış ve modern araçlara taşımak daha iyi olabilir
    • Awk, IDE'nin yerini nasıl alıyor? Awk'ı seviyorum ve öğrenmeye zaman ayırınca güçlü olduğunu da biliyorum, ama IDE olmasaydı üretkenliğim ciddi ölçüde düşerdi
      IDE'nin yaptığı işlerin çoğu metin düzenleme değil, kodu anlamaya ve değiştirmeye yardımcı olmak. Yanlış olduğunu söylemeye çalışmıyorum; bu sözün hangi bakış açısından söylendiğini merak ediyorum
  • Başta bu adın Japonca argoda “aptal” anlamına gelen aho'dan (アホ) geldiğini sanmıştım, sonra Alfred Aho'nun awk içindeki a olduğunu hatırladım. Belki de ikisi birden?

    • Bence ikisi birden. “Git” de zaten “budala kişi” anlamında argo olduğu için nükteli bir isim
    • En son Reservation Dogs'ta duymuştum: https://en.wiktionary.org/wiki/aho#Navajo
    • Bence ikisi de. Gerçekten zekice bir kelime oyunu
  • Harika bir proje ve iyi bir fikir. Temelleri anlamak, başka projelere ve sorunlara farklı bir açıdan bakmayı sağlıyor
    Eskiden Awk ile web tabanlı bir wiki yapmıştım. Nedeni, belleği çok az olan bir Linksys router kullanıyor olmamdı
    Hem wiki'nin nasıl çalıştığını hem de Awk ile neler yapılabileceğini öğrenmek için iyiydi. Dayanacak kütüphane olmayınca temelleri kendiniz uygulamak zorunda kalıyorsunuz; bu sayede gerçekten anlıyorsunuz

  • “Buraya ağ işlevi ekleme planım yok. Elbette mümkün, ama clone ya da push yok” denmiş; oysa aynı bilgisayarda başka bir dizindeki depolardan da git clone yapabilir ve push edebilirsiniz

    • Doğru. Ama branch'ler varsa yerel clone oluşturma ihtiyacı bir ölçüde azalıyor. Pratikte yerel git deposunu kopyalamak için rsync kullanıyorum. Asıl mesele neyin en iyisi olduğu
    • Çok barizmiş, ama git'i 10 yıldır kullanmama rağmen bir kez olsun denemek aklıma gelmemişti
  • Birkaç GNU aracı ve programıyla, hatta belki daha fazlasına pek gerek kalmadan, performans ve işlev açısından özel araçları aşan her şeye muktedir bir veritabanı ve işleme aracı yapılabileceği fikri aklımdan çıkmıyor. Böyle hisseden bir tek ben miyim?

  • İlgili olabilir
    sed-chess: https://news.ycombinator.com/item?id=37896854
    awk-raycaster: https://github.com/TheMozg/awk-raycaster

  • Bu, geliştirme sırasında mevcut olmayan cppawk'ı kullansaydı #include kullanabilirdi. Dosyaya göre göreli yollarla düzgün çalışıyor ve AWKPATH gerektirmiyor
    Ön işlenmiş programı tek bir dosya olarak “build” etmek de mümkün; böylece sonrasında cppawk'a gerek kalmıyor
    https://www.kylheku.com/cgit/cppawk/about/