Emre.xyz

haskell

Yılbaşından sonra yazdığım bir yazıda bazı hedefler koymuştum. 31 Mart olduğu için hem hedeflerimi güncellemek hem ne yapmışım onu değerlendirmek istedim. Önce ilk çeyrek hedeflerimi değerlendirip, ardından ikinci çeyret hedeflerimi kaydedeceğim.

Kitap değerlendirmesi

İlk çeyrek kitap okuma konusunda çok verimsiz geçti. Hem yoğun hem negatif bir dönem olmasının buna sebep olduğunu düşünüyorum. Genelde kitap okuma vakitlerimi mobil oyun oynayarak geçirdim. Kendime ceza olarak da mobil oyunları telefonumdan kaldırıyorum ve ikinci çeyrek bitişinde tekrar değerlendireceğim ve duruma göre belki kendime müsade edebilirim oyun konusunda.

Sadece Bülent Eczacıbaşı – İşim Gücüm Budur Benim kitabını bitirebildim. Bitirir bitirmez de twitterdan bir çekilişle hediye ettim.

Isaac Asimov – The Complete Robot kitabında ise %2lik bir artış sağlayabildim. Diğer kitapların ise pek yüzünü açabildiğim söylenemez. Bu sebeple listeyi olduğu gibi ikinci çeyreğe bırakıyorum.

Yazı değerlendirmesi

Hedef olarak koyduğum iki yazıyı da tamamlayıp yayınlayamadım. Ancak hedefimde olmayan Nix Integration for Stack ve Okul Hikayesi başlıklı iki yazı yayınladım. Bu çeyrekte #Nix + #Haskell konusuna daha fazla eğildiğim için ilk yazıyı yayınladım. İkinci yazı ise içinde bulunduğum negatif durumda geçmişe bakmamın faydalı olabileceğini düşünmemden ortaya çıktı. Ruhsal olarak iyi geldi böyle bir yazıyla geçmişi hatırlamak. Bu tarz kişisel hatıralarımı daha fazla kaydetmek istiyorum. Eğer becerebilirsem ikinci çeyrekte büyük büyük babamın Ermeni olayları döneminde yaşadıklarını yazmak istiyorum. Annemden ve diğer yakınlarımdan veri toplamaya başladım bile :)

Symfony ve Monadlarla ilgili iki yazıyı da tamamlayıp ikinci çeyrek ortalarına doğru bitirmek istiyorum.

Gitar değerlendirmesi

Bu konuda sadece ocak ayının ilk 10 günü düzenli pratik yapabildim, işlerin kötü gitmesi (bahaneden bol ne var) sebebiyle kendimi gitar işine veremedim ve bir köşeye kaldırdım. Hedeflerim arasından çıkartıyorum. Başka bahara kaldı gitar işi.

Sosyal medya değerlendirmesi

Günlük 20dk sosyal medya kısıtıma uyamadım. Bu sebeple ikinci çeyrek boyunca bilgisayarımdan twitter, facebook, mastodon, reddit uygulamalarına girişlerimi kısıtlamak üzere bi yol arayacağım. Biraz zor olacak ama , her sosyal medya ihtiyacı duyduğumda blog'a birşeyler karalayarak bu durumu aşmaya çalışacağım. Çünkü gerçekten üretkenliği öldüren birşey sosyal medya.

Projeler değerlendirmesi

Bilimma react frontend, webfinger php impl., activitypub php impl... Bu üç iş için de tek satır kod yazamadım. Bunun için ayırmam gereken zamanda sanırım fazlasıyla Haskell'e ve Nix'e odaklandım. İşletim sistemimi tamamen Nixos'a çevirdim. Haskell ile spotifyctl adında bir projeye başladım. Onun da henüz %40lık kısmı bitti. İkinci çeyrekte deneyokulu frontend'i hariç başka hiç bir projeye başlamayacağım.

Etkinlikler değerlendirmesi

En başarılı olabildiğim hedeflerim bunlar sanırım. GDGCloudAnkara olarak Ocak ve Mart aylarında birer etkinlik organize edebildik. 9 Nisan'da ise online bir etkiliğimiz daha olacak. *

AnkaraPHP konusunda bir ilerleme katemedik, Symfony ile ilgili yazıyı yazdıktan sonra online bir etkinlik olarak workshop'u ikinci çeyrekte gerçekleştirmeyi planlıyorum.

Covid-19 sebebiyle WebEnd konusunda gerçekleştirmeyi planladığım etkinliği uzunca bir süre askıya almaya karar verdim. Online olarak bir sürü etkinlik arasında kaybolması muhtemel olduğu için bu kadar efor harcamak konusundan emin değili.

Haskell Türkiye olarak online bir meetup yaptık, hem çok keyifli hem de Haskell'e giriş yapmak isteyenler için çok güzel bir kayıt oldu.


İlk çeyrek için çok güzel olmasa da, çok kötü de olmayan bir çaba gösterdim. Covid-19 vakası sebebiyle ve öncesinde yaşadığım kişisel problemlerin birleşmesiyle baya yorucu geçti ilk çeyrek. Ancak olabildiğince motive kalmaya ve üretmeye devam etmekten başka yapılacak birşey yok. Haskell konusunda ilerlemek beni çok motive etti. Diğer yandan Nix konusunda da ilerleme katediyor olmak tuz-biber oldu. Hem Javascript hem PHP'ye bakışım çok değişti. Fonksiyonel ve deklatif dünya OOP ve imperatif dünyadan çok çok çok daha doğru gözüküyor. Bu yönde olağanca kuvvetimle ilerlemeye devam edeceğim.

Aşağıdaki listeyi de 2020 İkinci Çeyrek Hedef Listesi olarak kayıt ediyorum. Bu defa hedef tamamlama oranımı daha yükselteceğim.

Kitap Hedefi

  • Isaac Asimov – The Complete Robot (%5)
  • Philip Kotler – Pazarlama 4.0 (%11)
  • Hitchcock & Truffaut (%53)
  • Brian Cox & Jeff Forshaw – Neden E=mc2? (%13)

Yazı Hedefi

  • Ermeni Kardeşlerim – Gölgedeki çocuklar
  • Fully Featured Symfony Blog in Minutes (%80)
  • Monads in Haskell

Proje hedefleri

  • Bilimma frontend
  • Spotifyctl
  • Webfinger impl.
  • ActivityPub impl.

#tr #kişisel

You might want to build your Haskell application with #Nix even if you did start with #Stack.

#Stack has support for building with #Nix. You need to add nix.enable: true to your stack.yaml file.

nix:
  enable: true
  packages: [glpk, pcre]

You can build your app with Nix now. Also, you can specify a custom shell file for defining environment variables or anything else. You need to remove the packages parameter and to add the shell-file parameter to stack.yaml file.

nix:
  enable: true
  shell-file: shell.nix 

After that, you can write your shell.nix file.

{ghc}:
with (import <nixpkgs> {});
 
haskell.lib.buildStackProject {
    inherit ghc;
    name = "ScottyEnv";
    buildInputs = [pkgs.figlet zlib.dev zlib.out glpk pcre];
    shellHook = ''
    export PORT=3003;
    figlet "LISTENING ON PORT "$PORT;
    '';
}

And then, just run stack build or stack run or stack ghci commands.

#nix #haskell #stack #en

Son bir kaç aydır Haskell öğrenmeye çalışıyorum. Neden böyle bir maceraya giriştiğimle ilgili bir yazı yazmak istiyorum ilerde.

Şimdilik öğrendiğimi düşündüğüm konuları hem not etmek, hem de türkçe kaynak oluşturmuş olabilmek adına, olabildiğince bloguma eklemeye çalışacağım.

Functor, Haskell'de bir TypeClass olarak tanımlanmıştır. Yaptığı iş, kapsayıcıya/kapsama (context) müdahale etmeden, içerdeki veride işlem yapabilmeye olanak sağlamaktır.

Basitçe toplama işlemi için (+3) 2 dediğimizde, 2 ile 3 ile toplayan fonksiyonu işleme sokarak 5 sonucuna ulaşmış oluyoruz. + iki argüman bekleyen bir fonksiyon olduğu için birinci fonksiyonu vererek 3 ile toplayan fonksiyona çevirme işlemine currying deniyor. Başka bir yazıda detaylıca gireceğim.

Ancak contexte müdahale etmeden işlem yapmak istediğimiz zamanlar olacaktır. Örneğin; Haskell'de Maybe adında bir type mevcut. Just ile kapsanmış bir değer yahut Nothing değerine sahip olabilir. Eğer elimizde Maybe Int türünde bir Just 2 değeri varsa bunu (+3) fonksiyonumuza nasıl verebiliriz? + fonksiyonu iki argüman bekliyor, ikisi de Num olmalı. Ancak birisi doğruyken diğeri bir kapsayıcı içerisinde.

Üstelik biz işlem sonucunda elimizdeki Just 2 değerinin türünün değişmesini istemiyoruz.

Çok şanslıyız çünkü Maybe türü bir Functor.

Peki bir Functorı nasıl işleme sokabiliriz? Elimizdeki Functorlar ile işlem yapmamız için çok güzel bir fonksiyon var ve adı fmap.

Bir Functor ile işlem yapmak istediğimizde, fmap fonksiyonunu kullanabiliriz. Örneğin; fmap (+3) (Just 2) dediğimizde bize sonuç olarak Just 5 verecek ve kapsayıcımız bozulmamış olacak.

Maybe türü için Functor tanımlaması ise şöyle yapılmış durumda:

instance Functor Maybe where
    fmap func (Just val) = Just (func val)
    fmap func Nothing = Nothing

Gördüğünüz gibi net bir şekilde Functor typeclassından tanımlanmış instancelar ile Functorların fmap fonksiyonu ile nasıl çalışabileceği belirlenmiş durumda. Tüm Functorlar için instancelar bu şekilde tanımlanmıştır. Maybe için eğer beklenen değer Nothing gelirse verilen fonksiyon uygulanmadan Nothing dönmektedir.

Ayrıca Haskell'de listeler de birer Functor instanceına sahiptir. Bunu da diğer yazıda paylaşacağım.

#haskell #tr #functor #functionalprogramming #fonksiyonelprogramlama