Bash Script İçerisindeki Arşiv Dosyasını Açmak

Geçen gün elime bash script bir dosyası gelmişti. Yaklaşık ilk 200 satırı klasik bash script dosyasıydı, ancak geri kalanında binary bir şekilde duran bir arşiv (tar.gz gibi) dosyası olduğunu gördüm. Binary şekilde bash script dosyasının içine gömülen bu arşivin açılması gerekliydi.

Şu komutlar ile binary kısımdaki arşiv açıldı:

match=$(grep --text --line-number '^ARCHIVE:$' DOSYA_YOLU | cut -d ':' -f 1)
archive=$((match + 1))
tail -n +$archive DOSYA_YOLU | tar -xzvf - -C .

Not: DOSYA_YOLU yazan yerleri değiştirmeyi unutmayınız.

 
66 Kudos
Don't move

PHP 7 ile Gelen Return Type Declarations

Ekim 2015’te stabil olarak yayınlanması beklenen PHP 7’nin code base’ine return type declarations (geri dönüş bildirimi) merge edildi.

Fonksiyonların yorum satırlarına @return int, @return void yazarak o fonksiyonun hangi tipte veri döndürdüğü belirtilirdi. Ancak bunlar birer yorum satırı olduğu için @return array yazan bir fonksiyondan string dönebiliyordu.

Artık PHP 7 ile doğrudan bir fonksiyonun ne tip veri döndürdüğünü dilin kendisinin de anlayabileceği şekilde belirtebiliyoruz.

Hızlıca bir örnek vermek gerekirse:

function getCity(): string {
    return "Ankara";
}

Örnekte olduğu gibi fonksiyon isminden sonra dönecek olan tipi belirtiyoruz.

Peki bu fonksiyonu şöyle değiştirsek:

function getCity(): string {
    return 06;
}

String döneceğini belirttiğimiz fonksiyon integer bir değer döndürdü.

Sizce bu şekilde çalışacak mı?

İlginç gelebilir ancak çalışacaktır. Çünkü PHP 7 ile artık hayatımıza “weak mode” ve “strict mode” kavramları giriyor.

Tahmin edeceğiniz gibi weak mode bu tarz işlere izin veriyor. Strict mode ise kesinlikle belirtilen kurallara uyulmalı diyor.

Strict mode’u nasıl aktifleştireceğiz?

Kodunuzun <?php satırından hemen sonra

declare(strict_types=1);

yazmanız yeterli. Bu satırı eklemezseniz kodlarınız weak mode’da çalışacaktır.

Şimdi kodu şu şekilde düzenleyip çalıştırmayı deneyelim:

declare(strict_types=1);

function getCity(): string {
    return 06;
}

echo "Merhaba";

Uppss… E yine çalıştı? Yani ekrana Merhaba yazıldı. Ama kodun içinde yerinde bulunan fonksiyon string dönmesi gerekirken integer dönüyor hem de strict mode’dayken!

Neden böyle oldu?

Çünkü getCity() fonksiyonundan dönen değeri henüz bir yerde kullanmadık. Bir başka deyişle getCity() fonksiyonunu henüz çağırmadık.

Yani kodu şöyle düzeltirsek:

declare(strict_types=1);

function getCity(): string {
    return 06;
}

echo "Merhaba";

getCity();

Böyle bir hata alacaksınız:

Fatal error: Return value of getCity() must be of the type string, integer returned in test.php on line 6 in test.php on line 6

Bir Sınıfı Return Type Olarak Belirtmek


declare(strict_types=1);

class Car {
    public $type = "Manual";
}

class Mercedes extends Car {

    public $model = "CLA200";
    public $color = "White";
    public $type = "Automatic";

}

class Property {

    public function getCarDetails(): Car {
        return new Mercedes();
    }

}

$property = new Property();
echo $property->getCarDetails()->type;

getCarDetails() metotunda Car sınıfından bir şey döneceğini belirttik. Mercedes sınıfı da Car sınıfından extend edildiği için çalıştı. Aynı şekilde bir interface‘i de return type olarak belirtebilirsiniz.

Null Bir Şeyler Return Edebiliyor Muyuz?

function getCity(): string {
    return null;
}

getCity();

Bu kodu çalıştırdığınızda şöyle bir hata alacaksınız:

Fatal error: Return value of getCity() must be of the type string, null returned in test.php on line 6 in test.php on line 6

Dikkat ederseniz bu kod strict mode’da dahi değil.

Yapıcı ve Yıkıcı Metotlarda Return Type

__construct, __destruct ve __clone metotlarında return type belirtilemiyor.

Void Return Type Nerelerde?

Void return type henüz yok. Gelişimini şuradan takip edebilirsiniz: https://wiki.php.net/rfc/void_return_type

Not: Yazının başında da belirttiğim gibi PHP 7’nin Ekim 2015’te stabil olması bekleniyor. O zamana kadar return type işlerinde yeni şeyler olabilir (void type gelmesi gibi). Eğer yeni bir şey olursa eklemeye çalışacağım.

 
200 Kudos
Don't move

Node.js ile Inotify Event’lerini İşlemek

Geçen gün bir feature (özellik) isteği gelmişti. Bir servis sunucuya bağlanıp bir dosya oluşturacak ve içini dolduracak. Kullanıcıya ise bulunduğu web sayfasında sayfayı yenilemeden bu dosyanın oluştuğundan haberdar edilecek ve tabii sonra bu dosyayı kullanıcı görüntüleyecek.

Direkt 5 saniyede bir AJAX yapıp ilgili dosya oluşmuşsa bir div’e dosyanın oluştuğuna dair mesaj basabilirdim aslında. Ancak olayı biraz daha efektif hâle getirmek istedim. Çünkü AJAX istekleri beraberinde bir dizi overhead getirecekti.

Örneğin; İlgili sayfada 10 kişi olsa, 5 saniyede bir file system‘da yeni dosya var mı diye kontrol yapılması gerekecekti. 10 kişi ayrı ayrı 5 saniyede bir backend’e istek atacaktı. Bu da istediğim bir durum değildi.

Bir diğer problem ise dosyaya yapılan yazma işleminin bittiğinden emin olunması gerek.
Örneğin; AJAX isteği attım. İstekte dosyanın varlığını kontrol ettim. Sonra baktım dosya var mı? Var. Ön tarafa haber saldım “dosya oluştuuuu” diye.
Ama o sırada third-party servis dosyaya veri yazma işlemini bitirmedi. Kullanıcı da “e dosya oluştu madem açayım” derse, sçtık. Çünkü eksik veri görüntüleyecek hatta belki de hata alacak. Sonra ayıkla pirincin taşını.

Bu iş için esas olan “dosyaya yazma işlemim bitti” mesajının gerekliliği. E third-party servis sadece dosya oluşturuyor Gidip bu third-party servisin ekstra bir yerlere mesaj yazmasını da sağlayamam (dosyaya yazdım bitti gibisinden). Hadi yazdırdım diyelim, bir de gidip orayı kontrol etmem gerekecek.

vs. vs. Daha buraya yazmadığım tonla senaryo var bu iş için.

Kısaca bana “dosyayı oluşturdum“, “dosyaya yazdım“, “dosyayı sildim” vs. gibi eventler gerekliydi. Bu bilgileri ise Linux‘ta direkt çekirdekte bulunan Inotify eventleri çok güzel sağlıyor. Yani bilgi sağlam yerden geliyor.

Node.js‘te Inotify eventlerini handle edebilen güzel bir kütüphane var (detaylar, kullanım örneği linkte): node-inotify

node-inotify kütüphanesini ise socket.io ile birleştirip kullanırsanız tadından yenmez (Ben socket.io kullanmıştım, ama siz başka bir kütüphane elbette tercih edebilirsiniz). Çünkü bu şekilde ön tarafa bir socket açıp dosya değişikliklerini bu socket üzerinden yollayabilirsiniz.

Scala ve Java’da ise bu işleri Non-blocking I/O (java.nio) paketiyle yapabilirsiniz.

 
65 Kudos
Don't move