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/

C pointerlara giriş

Merhaba.

Bu yazı C’de pointerları çalışırken aldığım notlardır.

Bu pointerların vikipediadaki tanımı:

Programlama dillerinde bellek adreslerini saklayan değişkenlere verilen genel isim. Bir programlama dilinde herhangi bir değişkeni tanımladığınızda hafızada ona bir yer ayrılır. İşaretçiler bu hafıza alanlarının adreslerini tutarlar

Bu konuyu anlamamda yardımcı olan şeylerin başında değişkenlerin tanımı geliyor. İşte birbaşka tanım

Değişkenler, bir bilgisayar programında değerleri saklamak için kullanılan, bilgisayar bellek konumlarına verdiğiniz adlardır.

Hepinizin zaten bildiği gibi bir bir programlama dilinde değişken tanımladığımızda değeri memory’e konulur.İsmi ilede Bu değişkenin değerini memory’den alırız.

Basitçe aşağıdaki gibi yazacağımız bir program ile memory’deki yerimizi görelim.

#include <stdio.h>

int main() {

short age = 20;
printf("Address of age variable %p \n", &age);
return 0;
}

Çıktı tabiki her çalıştırdığımızda farklı olucaktır.

Örnek çıktı:

Address of age variable 0x7ffe5886c856

Bu örnekte 0x7ffe5886c856 değeri bizim ram bellek üzerinde short tipindeki age değişkenimiz için işletim sisteminin ayırdığı alan.

Pointer

Pointer, başka bir değişkenin adresini, yani bellek konumunu(az önce ekrana yazdırdık) tutarlar.

Pointerlar değişkenler gibi tanımlanırlar.Sadece başlarında *(asteriks) işareti bulunur.

Hemen bir örnek yapalım.

short *age_p;    /* pointer to an short */
printf("Address of age_p variable %p \n", &age_p);

Daha önce üzerinde çalıştığımız programa yukarıdaki satırları ekliyorum.

Address of age variable 0x7ffe1b87255e
Address of age_p variable 0x7ffe1b872560

Gördüğünüz gibi age_b memory’de farklı bir yerde.Aralarındaki fark değişken direk veriyi tutuyor.Pointer ise asıl verinin durduğu değişkenin adresini tutuyor.

Şu ana kadar elimizde short tipinde bir değişken ve onun adresini tuması için tanımladığımız bir pointer var. Aşağıdaki blokta yapacağımız tanımlama ile artık memory’de age_p’nin içerisinde age değişkeninin adresi duruyor. Başına * işareti koayarak değerini yazarsanı veya değiştirirseniz. Aslında age değişkeninin değerini değiştireceksiniz.

age_p = &age;
printf("Value of age_p pointer %d \n", *age_p);

Valıe of age_p pointer 20

Programın son halinde ise memory aşağıdaki gibi olucaktır.

Programın son halinde ram bellek temsili.

Gördüğünüz gibi aslında pointer olarak tanımladığımız değişken asıl değeri tutan değişkenin adresini tutuyor. * işareti ilede eriştiğimizde bu alana gidip buradaki değer ile işlem yapıyor.

Basitçe neden pointler kullanıyoruz.

— Aklımıza gelen ilk madde bellek tasarrufu.Anlaşılır olması açısından bu örneği short gibi küçük bir veri tipi ile yaptık. Peki ya daha büyük veri tipleri ile çalışsaydık.Bunları fonksiyonlara parametre olarak geçtiğimiz zaman compiler bu veriyi memory üzerinde kopyalayacaktır. Buda büyük objelerde bellekteki verimi düşürecektir. Bunu yerine eğer referansını geçerseniz fonksiyonun içerisindeki işlem doğrudan memory’deki yerinde yapılacaktır.Memory’deki tekrarları engellememizi sağlar. Ayrıca bknz( https://metinagaoglu.com/call-by-value-call-by-reference )

İterasyon sırasında hızı artırabilirler: örneğin bir arrayi gezmek isterseniz, indis değerini yinelemek için sadece bir for döngüsü yazarsınız, ancak gerçekte bellek adresini artırmış olursunuz. Dolayısıyla, performansa duyarlı bir kodlama yapıyorsanız, önce indisi artırmak ve ardından bellek adresini güncellemek yerine, pointer ile doğrudan bir sonraki bellek konumuna gidip performans iyileştirmesine erişebilirsiniz.

Yapılan değişiklikler her yerde aynıdır: bağımsız thread’ler ile çalışan bir programınız olduğunu varsayalım.Her biri için aynı verilerin kopyasını oluşturmak yerine, onlara orijinal verilerin adresini sağlarsınız ve böylece değerde herhangi bir değişiklik yapılırsa, her thread en son güncellemeleri alır.

Şimdilik bu kadar.Pointerlar ile ilgili aritmetiği vb. gibi konulardada özet yazılar yazmayı planlıyorum.

Kaynaklar

https://www.tutorialspoint.com/cprogramming/c_pointers.htm

https://www.quora.com/Why-we-use-POINTERS-in-programming-whats-the-practical-use

Call by value & call by reference

Selamlar

Bu konu hakkında yazılmış birçok makale var.Bende kendim daha iyi anlamak için kendi bloguma karalama tarzında bir yazı yazacağım.

Yazdığımız programlama dillerinde hepimiz fonksiyonlar/metodlar tanımlıyoruz. Bunlara parametre geçiyoruz bazen dönüş değeri olarak , bazen ise verdiğimiz parametreler üzerinde değişiklik yapıp sonucunu alıyoruz.

Programlama dillerinde, fonksiyonlar iki şekilde çağrılabilir: Call by Value ve Call by Reference.

Genelde fonksiyon method tanımlamalarınıza extra bildirmediğiniz sürece “reference by value” yaklamşımı kullanılır. Bizde ilk önce bunu bir örnek ile göreceğiz.

Call by value

Buraya kadar tamam. Normal şartlarda bu nasıl gerçekleşiyor basit bir örnek yapalım.İlk örneğimizde 2 değişkeni birbiriyle değiştiren klasik bir swap fonksiyonu yazcağız.Örneğimizi inceleyelim.

#include <stdio.h>


void swap(int a,int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}

int main() {

    int a = 50 , b = 20;
    printf("a: %d \t b: %d \n",a,b);

    /* calling a function to swap the values */
    swap(a, b);

    printf("a: %d \t b: %d \n",a,b);

    return 0;
}

Yukarıdaki kodu incelersek standart bir swap fonksiyonumuz var. Ancak bunu çağırsak bile çıktı değişmiyor. a ve b değişkenlerimiz değerlerini koruyorlar.

metinagaoglu@linux-mint:~/Desktop/C/refs$ ./ref
a: 50 b: 20
a: 50 b: 20

Reference by value’da bir değişkenin değerini bufonksiyonun parametresine kopyalar. Bu nedenle, ana işlevin parametresinde yapılan değişiklikler bağımsız değişkeni etkilemez.Saddece fonkssiyonun içerisinde geçerliğidir.Aynı değerden memory’de 2 tane vardır. Parametre olarak geçilenler direk değerleri kopyalanmıştır.

Yaptığınız değişiklikler kopyalanan değerler üzerinde yapılır.Foksiyon dışındakiler etkilenmez.Fonksiyo çalıştıkran sonra kopya silinir ve memory’de sizin geçtikleriniz aynen duruyordur. Bu yüzden çıktılarımız aynı.

Call by Reference

Call by reference ta ise fonksiyona parametre olarak referencelarını geçiyoruz.Yani memory’de nerde olduklarını. Fonksiyonun içerisinde ise bu değerler ile memory’deki yerini bildiğimiz değişkendeki değerlerle gene istediğimiz işlemi yapabiliyoruz. Diğer yaklaşımdan farklı değerler kopyalanmadığı için yaptıklarınız her değişiklik değeri değiştiriyor.

Az önce yaptığımız swap fonksiyonunu şimdide call by reference ile yazalım.

#include <stdio.h>

void swap(int *a,int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}

int main() {

int a = 50 , b = 20;
printf("a: %d \t b: %d \n",a,b);

/* calling a function to swap the values */
swap(&a, &b);

printf("a: %d \t b: %d \n",a,b);


return 0;
}

Bu seferki durumda ise gördüğünüz gibi main içerisinde swap fonksiyonmuza & işareti ile referansını geçtik. İçeride ise parametre olarak geçilen değerin referansı ile memorydeki adresine ulaştık ve o değerler üzerinde işlem yaptık.

metinagaoglu@linux-mint:~/Desktop/C/refs$ ./ref
a: 50 b: 20
a: 20 b: 50

Tabiki biz bu yazıda gene kolayına kaçtık ve 2 integer değişkeni kullandık.Ancak örnekleri bununla sınırl tutmayın.Elimizde bir array veya linkedlist vs türünde büyük bir değer varsa ve bunu üzerinde işlem yapıcaksak şeklindede düşünebilirsiniz.

Ne olduğunu kabaca anladığımıza göre biraz avantaj ve dezavantajlarından bahsedelim.

Call by value avantajları

  1. Parametre olarak geçilen ana değişkenler değişmez.
  2. Takibatı ve debug yapması daha kolaydır.Ana değişkendeki değerleri değiştirmediği için fonksiyon içinde daha rahat geçici işlem vs yapılabilir.

Dezavantajları

  1. Hafıza açısından verimli değildir.Aynı değişken için oluşturulmuş iki adet kopya vardır..

Call by reference avantajları

  1. Fonksiyon argümanın değerini değiştirebilir.
  2. Bellek alanından tasarruf etmenize yardımcı olur. Tek bir değeri tutmak için yinelenen veriler oluşturmaz.
  3. Bu yöntemde işlem yapılan parametrenin bir kopyası yoktur. Bu nedenle çok hızlı işlenir.

Dezavantajları

  1. Referans alan bir fonksiyonunu parametresinin boş olmadığından emin olması gerekir.
  2. Çok iş parçacıklı programlarla çalışırken tehlikelidir.
  3. Takibatı ve debug’ı bi nebze daha zordur.

Göz atmanızı tavsiye ettiğim kaynaklar:

https://stackoverflow.com/questions/40185665/performance-cost-of-passing-by-value-vs-by-reference-or-by-pointer

https://www.geeksforgeeks.org/difference-between-call-by-value-and-call-by-reference/

https://www.guru99.com/call-by-value-vs-call-by-reference.html

C programlama dilinde string fonksiyonları

Herkese merhaba , önceki yazımda c ile char veri tipini görmüştük.Bu yazıda ise string manipülasyonu yapan birkaç fonksiyondan bahsedeceğiz.

strcat()

İlk fonksiyonumuz strcat(contcatenates).Strcat iki char tipindeki değişkeni birleştirmeye yarar.2 tane parametre alır.Hedef ve kaynak.

char *strcat(char *destination, const char *source)

Strcat () fonksiyonu, hedef string’i ve kaynak stringini birleştirir ve sonuç hedef değişkeninde saklanır.

Hemen örnekle görelim.

#include <stdio.h>
#include "string.h"

int main() {
    char str1[50] = "My name is", str2[] = "metin";

    strcat(str1,str2);

    puts(str1);
    puts(str2);
    return 0;
}

Sonuç

My name ismetin
metin

Dikkat etmemiz gereken nokta arkadaşlar birleştirilen string 1. parametrede kalmaktadır.

2. nokta ise strcat() , destionation string yan 1. parametrenin boyutu source stringini saklayacak kadar büyük olmalıdır. Değilse, segmentasyon hatası hatası alırsınız.

C strcmp()

Diğer göreceğiniz fonksiyon string compare, parametre olarak verilen 2 string karşılaştırır.Eğer birbirleri ile aynı ise 0 döndürür.

int strcmp (const char* str1, const char* str2);

Strcmp () işlevi iki char değişken alır ve geriye integer döndürür.

İki stringin ilk karakteri eşitse, iki stringin de sonraki karakteri karşılaştırılır. Bu işem iki string değerin karakterleri birbirleri ile farklı olana veya boş bir ‘\ 0’ karakterine ulaşılana kadar devam eder.

Hemen örneğimizi yapalım.

#include <stdio.h>
#include "string.h"

int main() {
char var1[] = "eth0";
char var2[] = "eth0";
char var3[] = "wan";

//comparing var1 and var2
if( strcmp(var1,var2) == 0 ) {
printf("These variables are same \n");
}

//comparing var1 and var3
if( strcmp(var1,var3) != 0 ) {
printf("These variables are not same \n");
}

}

Sonuç

These variables are same
These variables are not same

C strcpy()

String copy fonksiyonu olan strcpy() fonksiyonuna göz atalım.Fonksiyon strcat gibi önce char tipnide destionation sonrada source parametresi alıyor.

char* strcpy(char* destination, const char* source);

Strcpy () foksiyonu, source parametresi ile gelen string’i (boş karakter dahil) destination değişkenine kopyalar.

#include <stdio.h>
#include "string.h"

int main() {

char str1[20] = "PHP";
char str2[15];

strcpy(str2,str1);
puts(str2);
return 0;
}

Çıktı

PHP

Gördüğümüz gibi başta boş olan str2 değişkeni copy komutundan sonra ekrana kopyalandığı değeri veriyor.

C strlen()

Son göreceğimiz fonksiyon ise string length fonksiyonu.bu fonksiyon parametre olarak verilen string değerin uzunluğunu unsigned size_t olarak geri döner.

#include <stdio.h>
#include "string.h"

int main() {

char var1[20]="C programming";
char var2[20]={'P','r','o','g','r','a','m','\0'};

int len = strlen(var1);

// using the %zu format specifier to print size_t
printf("Length of string var1 = %zu \n",strlen(var1));
printf("Length of string var2 = %zu \n",strlen(var2));

return 0;
}

Çıktı

Length of string var1 = 13
Length of string var2 = 13

Strlen () fonksiyonunun uzunluğu hesaplarken \0 null karakterini saymadığını unutmayın.Bu kısmını kullanıcdan soyutlar.

Not: bu yazıda ele aldığımız fonksiyonlar <string.h> içerisinde tanımlıdır.Kullandığımız kodlarda bunu include ettiğimize dikakt edin.

Teşekkürler…

C programlama dilinde stringler

Selam , bu yazıda C programlama dilindeki char veri türünden bahsedeğiz.Aslında yapısı itibariyle üst seviyedeki programlama dillerinden farklıdır.Özellikle farklı dilden geçenlerin zorlandığı bir konu olduğunu düşünüyorum.Lafı çok uzatmadan başlıklara inelim.

Aslında C programlama dilindeki stringler sıfır karakter \0 ile sonlandırılmış bir karakter dizisidir. Örneğin:

char c[] = "c string";

Derleyici, çift tırnak işaretleri içine alınmış bir dizi karakterle karşılaştığında, varsayılan olarak sonuna bir null karakteri \ 0 ekler.

Bir string nasıl tanımlanır?

C’de string değişkenelri aşağıdaki şekilde tanımlayabilirsiniz.

    char c[] = "abcd";

    char c[50] = "abcd";

    char c[] = {'a', 'b', 'c', 'd', '\0'};

    char c[5] = {'a', 'b', 'c', 'd', '\0'};

Stringlere sonradan değer atama

Diziler ve diziler C’dek tanımlandıktan sonra atama operatörünü desteklemezler. Örneğin

char name[100];
name = "Metin";  // Error! array type is not assignable.
string_example1.c:16:17: warning: initializer-string for array of chars is too lon

Kullanıcıdan string okuma

Kullanıcıdan string okumak için scanf () fonksiyonunu kullanabilirsiniz.

Scanf() fonskyinonuda dikakt etmeniz gereken boşlukla (boşluk, satırsonu, sekme vb.) karşılaşana kadar karakter dizisini okur.

Örnek 1: scanf() ile string okuma

#include <stdio.h>
int main()
{
    char name[20];
    printf("Enter name: ");
    scanf("%s", name);
    printf("Your name is %s.", name);
    return 0;
}

Output

Enter name: Metin Ağaoğlu
Your name is Metin.

Metin Ağaoğlu yukarıdaki programa girilmiş olsa da, name değişkeninde sadece “Metin” saklandı. Metin’den sonra boşluk ile karşılaştığı için okumayı durdurdu..

Bir string satırı nasıl okunur?

Bir string satırını okumak için fgets() fonksiyonunu kullanabilirsiniz. Sonrasında görüntülemek için puts () fonksiyonunu çağırabilirsiniz.

Örnek 2: fgets() ve puts()

#include <stdio.h>
int main()
{
    char name[30];
    printf("Enter name: ");
    fgets(name, sizeof(name), stdin);
    printf("Name: ");
    puts(name);
    return 0;
}

Burada, kullanıcıdan bir dizge okumak için fgets () işlevini kullandık.

fgets (isim, sizeof (isim), stdlin); // dizeyi oku

Sizeof (isim) değeri 30 olur. Dolayısıyla, girdi olarak isim dizgisinin boyutu olan en fazla 30 karakter alabiliriz.

Dizeyi yazdırmak için puts (name); kullandık.

String değişkenlerini fonksiyonlara parametre olarak geçme

C’de stringler, dizilere benzer şekilde bir fonksiyona parametre olarak aktarılabilir. Hemen bir örnek yapıp bunu görüntüleyelim.

Stringi fonksiyona parametre geçirme

#include <stdio.h>
void displayString(char str[]);

int main()
{
    char str[50];
    printf("Enter string: ");
    fgets(str, sizeof(str), stdin);             
    displayString(str);     // Passing string to a function.    
    return 0;
}
void displayString(char str[])
{
    printf("String Output: ");
    puts(str);
}

Sonraki yazıda ise C’deki string leri fonksiyonlar ile nasıl müdahele edip üzerinde işlem yaparız bunu ele alacağız.

Teşekkürler…

Kaynak: https://www.programiz.com/c-programming/c-strings

Golang hash fonksiyonlari

Merhaba arkadaşlar

Golang ile temel ve yaygın kullanılan hash algoritlamarını nasıl kullanabileceğimizle ilgili bir örnek paylaşmak istedim.

package main


import (
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
"fmt"
)

func main() {

string := "Golang hash"

hmd5 := md5.Sum([]byte(string))
hsha1 := sha1.Sum([]byte(string))
hsha256 := sha256.Sum256([]byte(string))

fmt.Printf(" MD5: %x\n", hmd5)
fmt.Printf(" SHA1: %x\n", hsha1)
fmt.Printf("SHA256: %x\n", hsha256)
}

MariaDB Storage Engines

Evet arkadaşlar bugünkü yazıda MariaDB’nin aslında MySQL’den en önemli farklarından birisi olan storage enginler konusuna bakacağız.

İlk olarak bu yazıda sadece InnoDB Aria ve MyISAM ‘e bakacağız.

MariaDB konsoluna giriş yaptıktan sonra

SHOW ENGINES;

komutu ile desteklenen engine’leri görebilirsiniz.

INNODB

MySQL dökümantasyonundan aldığımız tanım:

InnoDB, yüksek güvenilirliği ve yüksek performansı dengeleyen genel amaçlı bir depolama motorudur. MySQL 5.6 sürümünde, InnoDB varsayılan MySQL depolama motorudur.

InnoDB’nin en büyük öne çıkan özelliği row-level lock yani tabloda sadece işlem yapılan satırı kilitler ve bunun yanında transaction , foreign key gibi özellikleri destekler.

Başlıca diğer özellikleri

  • Kullanıcı verilerini korumak için kesinleştirme, geri alma ve çökme kurtarma özellikleri içeren işlemlerle birlikte ACID modelini takip eder.
  • Satır düzeyinde kilitleme , çok kullanıcılı eşzamanlılığı ve performansı artırır.
  • InnoDB tabloları, birincil anahtarlara dayalı sorguları optimize etmek için diskteki verilerinizi düzenler. Her InnoDB tablosunun, birincil anahtar aramaları için I/O’yu en aza indirgemek üzere verileri düzenleyen clustered index adı verilen birincil anahtar dizini vardır.

InnoDB ile ilgili daha fazla bilgi için buraya tıklayarak mysql dökümantasyonlarını okumanızı tavsiye ediyorum.

Ayrıca zaman bulursam InnoDB ile ilgili daha detaylı yazı yazmayı planlıyorum.Yazarsam buradan url’sini veririm.

MariaDB’de InnoDB ve Percona-XtraDB

Percona-XtraDB, Supports transactions, row-level locking, foreign keys and encryption for tables

MySQL’de olduğu gibi MariaDB içinde default seçili gelen depolama moturu InnoDB’dir. Konsolunda gördüğümüz tanımdada belirtildiği şekilde transaction , satır bazlı kilit , vb gibi işlemleri desteklemektedir.Aslında forkladığın MySQL’deki InnoDB’nin dahada gelişmiş hali diyebiliriz.

MariaDB ilk versionlarında MySQL’den fork edildiği için aslında InnoDB motoru büyük oranda benzerlik ve uyumluluk gösteriyordu.Fakart MariaDB versionu ilerledikçe InnoDB’de geliştirmeler ve iyileştirmeler devam etti.

MariaDB 10.1 ve öncesinde, varsayılan InnoDB motoru Percona XtraDB’ye dayanmaktadır. XtraDB, InnoDB‘nin performansı artırılmış bir forkudur. Ancak bu versiondada geriye yönelik uyumluluk nedeniyle, sistem özelikleri hala orijinal innodb öneklerini korumaktadır.

MariaDB 10.2 ve sonraki sürümlerde, XtraDB’den vazgeçilip InnoDB motoru MySQL 5.7‘deki InnoDB‘yi temel alır. Peki bir üst sürümde neden XtraDB’den vazgeçildiği ile ilgili kendi dökümantasyonlarındaki yazıyı okumanızı tavsiye ederim.

MariaDB 10.3.7 ve sonrasında ise InnoDB motoru, MySQL’deki InnoDB’den önemli ölçüde sapmıştır. Bu nedenle, bu sürümlerde, InnoDB sürümü artık bir MySQL sürümüyle ilişkilendirilmez.

MyISAM

MyISAM , InnoDB ile değiştirilene kadar MySQL’in varsayılan depolama motoruydu. Mükemmel performansa sahip hafif, işlemsel olmayan bir motordur, sistemler arasında kopyalanması kolaydır ve küçük bir veri alanına sahiptir.

MariaDB, Aria isimli MyISAM’in iyileştirilmiş hali olarak düşünebileceğiniz bir depolama motoruna sahiptir.Çoğu senaryoda daha iyi performansa ve daha güvenli olma hedefine sahip yeni uygulamalar için MariaDB tarafından önerilmektedir..

Aria(MariaDB)

Aria depolama motoru varsayılan olarak MariaDB 5.1’den derlenmiştir. MariaDB 10.4’ten itibaren MariaDB’nin kendisinin kullandığı tüm sistem tabloları Aria depolama moturunu kullanmaktadır.

Ayrıca, diskteki dahili tablolar MyISAM tablo biçimi yerine Aria tablo biçimindedir.GROUP BY ve DISTINCT sorgularında, sorgulanan tablo farklı bir motor kullanıyor olsa bile, bu tür sorgular Aria’nın performansından yararlanabilir.

Aria depolama motoru MariaDB’de varsayılan olarak derlenmiştir. Aria, ek kurulum veya kurulum gerektirmeden MariaDB Server‘a (Enterprise ve Community) dahildir.

Aşağıdaki senaryolarda depolama motoru olarak Aria kullanmayı düşünebilirsiniz:

  • Uygulamanızda çok fazla FULL Text search varsa.
  • Uygulamanızda GROUP BY gibi aggregate sorguları fazlaysa
  • Uygulamanızda veya tablonuzda ACID uyumluluğuna veya foreign key ile ilişkilere ihtiyacın yoksa.
  • Uygulamanız şu anda MyISAM kullanıyorsa ve daha iyi hız, yedekleme ve otomatik çökme kurtarma için daha gelişmiş bir motor gerektiriyorsa.

bu senaryolarda MyISAM yerinde aria moturunu kullanabilirsiniz

Bu ilk yazıda MariaDB’deki temel depolama motorları olan InnoDB ve Aria’dan bahsetmek istedim.İlerleyen yazılarda kendi içerisinde bulunan veya sonradan yüklenebilen depolama motorlarınıda inceleyeceğiz.

Şimdilik bu kadar , teşekkürler.