Emre.xyz

nix

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

Composer is an installer and a package management tool. So please stop writing build scripts for Composer, building anything inside your package folder.

Last few days, I try to deploy a Symfony project with Nixops to Google Cloud. I found the composer2nix package after some research.

Composer2nix is a nix-expression builder. It parses composer.lock file and generates nix expressions for every composer packages independently. After that, you can use generated files in your deployment file like that:

  pkgs = import <nixpkgs>{};
  my_app = import /var/www/app/source{
    inherit pkgs;
  };

Nix builds your application and system when you run nixops deploy.

But NixOps generates a hash folder and installs your package inside this stateless and read-only folder. After that, it makes relations all required packages and your project.

composer2nix generated expression works the same way, e.g., your composer.lock file if had theofidry/alice-data-fixtures package. composer2nix generates expression like that:

"theofidry/alice-data-fixtures" = {
      targetDir = "";
      src = composerEnv.buildZipPackage {
        name = "theofidry-alice-data-fixtures-79913820cf6965cd6ea204cc5882079486f8262e";
        src = fetchurl {
          url = https://api.github.com/repos/theofidry/AliceDataFixtures/zipball/79913820cf6965cd6ea204cc5882079486f8262e;
          sha256 = "108862vlq2j10x69h5i4f4vqh63rfizvkc5kl57ymssk79ajifz2";
        };
      };
    };

Nix uses this expression for fetching wanted package and version in the given URL, and it fetches only once if version not changed in the composer.lock file.

So, as you have seen, there is no need for composer install. After the package installation process, we need the dumping autoload.php file. Nix makes that and runs composer install for checking everything is ok.

This roughly explains how composer2nix works and how to build your PHP project with nix.

But I faced a problem when I run nixops deploy command. Seems a package wants to modify a file in vendor/ocramius/package-versions/src/PackageVersions/Versions.php.

I said below; nix independently install packages in separate read-only folders. Ok. What can I do? I created an issue on the GitHub. Ocramius gently responded it and said it works if I disable running composer scripts with --no-scripts parameter. Ok, problem solved for now. But I have many scripts like assets:install or cache:clear

Now, I must manually clear caches all of the backends.

Someone should be saying, “Why did you use this package and not another package?” Sorry guys, it is not about me, Sylius depends on these packages.

I decided to write this blog. Forget the Nix. It is not only about nix deployment.

I want to ask some questions to PHP package developers.

Why you are building something after package install inside the package folder. Composer not for that.

It is not only about composer scripts. Why do you modify files inside your package folder? Why vendor/<package> is not stateless?

Please don't do that. Don't touch your package folder after install.

ps: if you curios about our conversation with @ocramius about this situation, you can read from github issue

#composer #nix #php #symfony #sylius #en #nixops #composer2nix

Nixos is a Linux distro working in nix ecosystem.

NixOS is a GNU/Linux distribution that aims to improve the state of the art in system configuration management.

You need to create an instance with the configuration at the below:

  • doesn't matter which server.
  • doesn't matter which location.
  • in the server type option, select iso library and find Nixos 18.x nixos.18.x)
  • doesn't matter server size but at least we need 1GiB ram.
  • doesn't matter all of the other options.

After you deploy the server, you wait until complete server initialization.

Go to the products page and click your server name. You should see view console icon right top of the server management page. Click it and connect the terminal.

Possibly you would face some keyboard layout problems after connecting the terminal from browser. Don't get stuck that problem. We need only copy/paste initial configuration.

Vultr machines have the legacy boot option. Firstly we need to create disk partitions.

We need to know the device name for creating a partition. You can find run fdisk -l command. My device name is /dev/vda

Create an MBR partition table.

parted /dev/vda -- mklabel msdos

Add root partition

parted /dev/vda -- mkpart primary 1MiB -8GiB

And, add a swap partition

parted /dev/sda -- mkpart primary linux-swap -8GiB 100%

After that, you need to make formatting configuration.

For initializing ext4 format for the root partition.

mkfs.ext4 -L nixos /dev/vda1

For creating swap partition run mkswap.

mkswap -L swap /dev/vda2

Before installation, you need to make some little configurations. Mounting nix disk and activation swap area.

Mount nixos iso to /mnt folder.

mount /dev/disk/by-label/nixos /mnt

Activate swap area.

swapon /dev/vda2

And now we can generate the initial config.

nixos-generate-config --root /mnt

This command generates all initial disk and device configuration for you.

After creating the initial configuration completed, you need to change a few configurations. At first, you need to set boot.loader.grub.device option.

Open /mnt/etc/nixos/configuration.nix file with your favorite editor vim or nano.

Find that option and set as boot.loader.grub.device = "/dev/vda"; and enable the grub with this option boot.loader.grub.enable = true;

At the last, you need to enable OpenSSH service for connecting to your server with ssh after installation. And you need to add firewall access to 22 port.

For that, you can add that options your configuration file.

services.openssh.enable = true;
services.openssh.permitRootLogin = "yes";
networking.firewall.allowedTCPPorts=[ 22 ];

Ok. Now you can save and exit the file, and install your Nixos.

nixos-install

It asks to you for root password after you run command.

If everything went well, you should remove installation media from machine and reboot. Go to your Vultr server manage page and remove iso from settings->custom iso section. The server automatically rebooted after that.

Congrats. You can now connect your Nixos server over ssh.

#nix #nixos #vultr #howto #en