Golang ile tail uygulaması geliştirme

GNU/Linux dağıtımlarında tail komutu’na aşina olabilirsiniz. Genellikle -f flag’i ile dosyayı follow edip yeni eklenen metin’leri görmek için kullanıyoruz. Anlık log görüntülemek için oldukça kullanıyoruz.

Golang öğrenirken böyle bir programı go ile basitçe yazmayı araştırmaya başladım. Araştırmalarım sonucunda bu ufak makaleyi hazırladım.

İlk olarak hiçbir işletim sistemi api’si kullanmadan bunu nasıl yaparız ona bakalım.Çok basitçe hepimizin bazen yaptığı kötü çözümü entegre edelim. Dosyayı okuyup son satırlarını yazdırırır.Sonrasında sleep komutunu çalıştırıp tekrar okuyabiliriz.

Bu program teknik olarak çalışıyor ancak izlediğimiz dosyada değişiklik olur olmaz yanıt vermiyor. Çünkü son satıra ulaşınca bir süre uyuyor ve tekrar aynı işlemi yapıyor.Ayrıyetten her seferinde dosyayı tekrar okuyup yazıyor.

Tail programramı tabiki bunu bu şekilde yapmıyor. Linux, dosya sistemi olaylarını izlemek için inotify adında bir API sağlar.Bu API’yi kullanarak dosyadaki değişimi event olarak yakalyıp işlememiz mümkün.

API’nin kendi dökümanındaki açıklamasına bakalım:

The inotify API provides a mechanism for monitoring filesystem events. Inotify can be used to monitor individual files, or to monitor directories. When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.

Açıklamadan’da anlayacağımız gibi aslında tam olarak ihtiyacımız olan şey. Dosyada değişiklik olduğunda bunu bize event olarak bildirmesini istiyoruz.

Golang’te syslog paketini kullanarak inotify api’yi kullanabiliriz.

https://pkg.go.dev/syscall#InotifyInit1

Yukarıdaki örnekte ise linux’taki inotify event’ini dinleyerek sadece değişiklik olduğunda değişikliği ekrana yazdırıyoruz.

Bu arada dosyaya veya klasöre ait daha fazla event dinleyebilirsiniz. İhtiyacınıza göre golang kaynaklarınızı incelemenizi tavsiye ederim.

Kaynaklar:

https://golang.hotexamples.com/examples/syscall/-/InotifyInit/golang-inotifyinit-function-examples.html

https://pkg.go.dev/syscall#InotifyInit1

PostgreSQL’de sepeatör ile ayrılmış tek bir sütunu array’e çevirip arama yapma

Merhaba

Bazı legacy tablo tasarımlarında tek bir sütun içerisinde aralarına virgül(,), noktali virgül vb. gibi ayırıcılar koyup listeyi tek sütunda saklanabiliyor.

Örneğin:

idusernameroles
1metinADMIN,EDITOR
2fatihEDITOR,MANAGER

Yukarıdaki tabloda roles sütunu aslında bir text aralarına virgül koyularak liste buraya eklenmiş. Bazen bu listedeki veriler uzayıp gidebiliyor.

Böyle bir tabloda arama yapmak için PostgreSQL’deki string_to_array fonksiyonunun 2. parametresini kullanarak çözebiliriz.

Öncelikle fonksiyonun tanımına bakalım:

string_to_array ( stringtext, delimitertext [, null_stringtext ] ) → text[]

Bu fonksiyon ile ayırıcı olrak belirtilen karater ile sütunu verip array olarak tek bir column’da elde edebilirsiniz. Böylece bu sütun üzerinde PostgreSQL’in array fonksiyonlarını çalıştırabilirsiniz.

Örnek bir sorgu:

SELECT string_to_array(roles, ',') AS role_list,* FROM users

Sonuç:

role_listidusernameroles
{ADMIN,EDITOR}1metinADMIN,EDITOR
{EDITOR,MANAGER}2fatihEDITOR,MANAGER

Örneğin üzerinde arama yapmak için

WITH users_with_roles AS (
SELECT string_to_array(roles, ',') AS role_list,* FROM users) SELECT * FROM users_with_roles WHERE ADMIN = ANY(role_list)

Yukarıdaki gibi bir sorguda kullanabilirsiniz.Veyahut kendi senaryonuza göre burayı json encode edip farklı işlemler de gerçekleştirebilirsiniz.

İleri seviyede bu şekide bir view oluşturup her seferinde ana sorguyu yazmamak ta iyi bir fikir olabilir.

Kaynaklar:

https://www.postgresql.org/docs/13/functions-array.html

MariaDB RocksDB storage engine

Merhaba

Bu yazıdaki konu MariaDB’deki MyRocks storage engine üzerine olucaktır.

Öncelikle RocksDB facebook tarafından LevelDB üzerine geliştirilmiştir. Kendisini open-source bir key- value storage olarak tanımlar.

https://rocksdb.org/

MyRocks ise, RocksDB veritabanını MariaDB’ye ekleyen bir storage engine’dir. RocksDB, ssd depolama için optimize edilmiş harika bir sıkıştırma oranına sahip bir LSM veritabanıdır.

MyRocks, tipik olarak web ölçeği tipi uygulamalar için daha yüksek performans sağlar. Daha fazla sıkıştırma ve i/o verimliliği gerektiren iş yükleriniz olduğunda ideal bir storage engine çözümü olabilir.

MariaDB dökümanlarında paylaşılan verilere göre:

– Daha Fazla Alan Verimliliği 2 kat daha fazla sıkıştırma MyRocks, sıkıştırılmış InnoDB’ye kıyasla 2 kat daha iyi sıkıştırmaya, sıkıştırılmamış InnoDB’ye kıyasla 3-4 kat daha iyi sıkıştırmaya sahiptir, yani daha az alan kullanırsınız.

– InnoDB’ye kıyasla 10 kat daha az yazma güçlendirme özelliğine sahiptir, bu da size daha iyi ssd depolama dayanıklılığı sağlar ve genel verimi artırır.

Ayrıca kaynaklara koyduğum ilk makalede yukarıdaki sonuçları facebook’un da deneyip aldığını söylemem gerekiyor.

Kurulum:

MyRocks MariaDB varsayılan kurulumunda gelmiyor. Normal kurulumu yaptıktan sonra kurduğunuz linux dağıtımına göre paketini kurmanız gerekmektedir.

Ubuntu için:

apt install mariadb-plugin-rocksdb

şeklinde paketini kurabilirsiniz.Sonrasında mariadb server’ı restart ettiğinizde en basit kurulum tamamlanmış olucaktır.

(Not: yukarıdaki kurulum en basit haliyle MyRocks storage engine denemenize yeticektir. Ancak production için daha detaylı kurulum ve konfigürasyon yapmalısınız.Ben yazıda bunu göz ardı ediyorum.)

Sonrasında MariaDB konsolunda show engine komutunu çalıştırırsak rocksdb’i göreceğiz.Artık denemek için hazırız.

Ben en basit test için aynı yapıda 2 tabloyu innodb ve rocksdb olarak oluşturup testlerimi tamamladım.

Yaptığımz testlerde hem kapladığı alan olarak hemde insert olarak iyi bir sonuç aldığımı belirtmek isterim.

Resimde gördüğünüz tablolarda birebir aynı veriler bulunmakta.Aynı script ile insert edildiler.

Veriler küçük olmasına rağmen boyut farkı göze çarpıyor. Ayrıca aynı script ile insert edilmelerine rağmen rockdb insert yapan script çok daha erken dönüş sağladı.

Bitirirken:

MyRocks, InnoDB’nin alternatif veya gelişmiş bir sürümü değildir, LSM veri yapısı, yazma yoğun veritabanı işlemleri için mükemmeldir, okumalar yavaş olacaktır ve tam tablo taramaları çok pahalıdır. bu nedenle InnoDB ve RocksDB birlikte harika bir kombinasyon oluşturur!

Kaynaklar:

https://mariadb.com/resources/blog/facebook-myrocks-at-mariadb/

https://github.com/facebook/mysql-5.6/wiki/MyRocks-advantages-over-InnoDB

https://severalnines.com/database-blog/using-myrocks-storage-engine-mariadb-server

https://www.percona.com/blog/2018/04/30/a-look-at-myrocks-performance/

Delphide Değişken İşlemleri

Delphide değişken tanımlama ile başlayalım.Delphide değişkenler var bölümünde tanımlanır.(Javascripttede var anahtar sözcüğü ile tanımlanmakta).Programımızın ana dizinindeki var bölümünde Form1 zaten tanımlı olarak gelir biz sonuç adında integer ve adsoyad adında String bir değişken oluşturduk.

var
  Form1: TForm1;
  sonuc : integer;
  adsoyad : string;

Şimdi tanımladığımız sonuc değişkenini kullanarak 2 sayıyı toplayan bir program yapıcaz.Form alanında 3 adet Textbox ve 1 adet buton oluşturuyoruz.Form alanında butona tıkladıktan sonra buton kısmıza işlem kodlarımızı yazıyoruz.

procedure TForm1.HesaplaClick(Sender: TObject);
begin
sonuc:=strtoint(edit1.text)+strtoint(edit2.text);
edit3.text:=inttostr(sonuc);
end;

sonuç değişkenine edit1 ve edit2 den gelen sayıların toplamını attık.Ve daha sonra edit3’e işlemin sonucunu yazdırdık. editten aldığımız değerler String olarak gelir.Eğer integer’a çevirmezsek sayıları toplamaz yan yana yazdırır.Bir örnekte String değerler için yapalım

adsoyad:= edit4.text+edit5.text;
edit6.text:=adsoyad;

2 textbox’tan aldığımız string değerleri aynı mantıkla yan yana yazdırdık.İnteger değere dönüştürmemize gerek kalmadı

Visual Basic Final Soruları

Visual Basic Final Soruları

1–  Form üzerine nesne yerleştirmek için kullanılan pencere aşağıdakilerden hangisidir?
a) Form                     b) Solution Explorer             c) Properties
d) Toolbox               e) Table

2- ForeColor özelliği ile nesnenin hangi özelliği değiştirilir?
a) Görünürlük            b) Arkaplan rengi
c) Yazı rengi            d) Yazı tipi        e) Yazı boyutu

3- c = a.ToString(); kod satırının açıklaması hangi seçenekte doğru verilmiştir?
a)   a değişkeninin değerini string türüne dönüştürerek c değişkenine aktarır
b)   c değişkeninin değerini string türüne dönüştürerek a değişkenine aktarır
c)   a değişkeninin değerini integer türüne dönüştürerek c değişkenine aktarır
d)   c değişkeninin değerini integer türüne dönüştürerek a değişkenine aktarır
e) Hiçbiri

4- c=a+b; kod satırının işlevi hangi satırda doğru verilmiştir?
a)   a ve b değişkenlerine ait değerlerin toplam sonucunu c değişkenine aktarır
b)   c değişkeninin değerini a ve b değişkenlerine aktarır
c)   a değişkeninin değerini c değişkenine aktarır ve b değişkeninin değeriyle toplar
d)   a ve b değişkenlerine ait değerlerin toplam sonucunu Label nesnesinde gösterir
e) Hiçbiri

5-  c += 5; komut satırının anlamı nedir?
a) c değişkenine 5 atar.
b) c değişkenine 10 atar.
c) c değişkeninin değerini 5 artırır
d) c değişkeninin değerini 5 azaltır
e) Hata verir

6- Visual Studio 2010 ortamında Visual C# programında hazırlanan programı çalıştırmak için klavyeden hangi tuşa basılır?
a) F2      b) F5      c) F7      d) F10        e)F1

7- Aşağıdakilerden hangisi C#’ta bir değişken tipi değildir?
a) byte            b) short           c) float
d) double         e) console

8- String tipindeki rakam=”321” degişkeni, İnt tipindeki sayi1 değişkenine aşağıdaki seçeneklerden hangisiyle atama yapılır?
a) int sayi1=321;
b) string sayi1=rakam;
c) sayi1=Convert.Toint32(rakam);
d) rakam=Convert.Toint32(“sayi1”);
e) 321= Convert.Toint32();

9- Label1.Text=Listbox1.Items[2].ToString(); komutunun amacı hangisidir?
a) Listbox1’deki elemanları Label1’de gösterir
b) Listbox1’deki elemanları 2 ile çarpar
c) Listbox1’deki elemanlardan 2. Adresdeki elemanı Label1’de gösterir
d) Listbox1’deki elemanların toplamını Label1’de gösterir
e) Hiçbiri

10- Mod alma işlemi için kullanılan operatör aşağıdakilerden hangisidir?

a) +           b) #          c) %           d) *              e) /

11- Aşağıdaki komut satırları çalıştırıldığında ekranda hangi mesaj görüntülenir?

int notu=50;
if (notu>44) messagebox.show(“geçer”);
else if (notu>54) messagebox.show(“orta”);

a) ekrana orta yazar          b) ekrana geçer yazar
c) ekrana 50 yazar            d) hata verir
e) ekrana 54 yazar

12- Aşağıdaki kod bloğunun çıktısı nedir?

int sayi = 126;
MessageBox.Show((sayi%10).ToString());

a) 6                 b) 12.6            c) 126
d) 1260           e) Sayi%10

13-  Program içerisinde bir satırlık açıklama için satır başına konulması gereken karakterler aşağıdakilerden hangisidir?

a) ;               b) //              c) ‘              d) “       e) *