17 Mayıs 2018 Perşembe

Apache Kafka

Giriş
Kafka publish subcribe modeli ile çalışır.

kafka-console-consumer.sh komutu
Consumer başlatmak için şöyle yaparız.
bin/kafka-console-consumer.sh  --bootstrap-server host1:9092,host2:9092,host3:9092 
  --topic good_topic
kafka-console-producer.sh komutu
Producer başlatmak için şöyle yaparız.
bin/kafka-console-producer.sh --broker-list host1:9092,host2:9092,host3:9092 
  --topic good_topic --property parse.key=true --property key.separator=,

16 Mayıs 2018 Çarşamba

MySQL Sütun Tipleri

Sütun Tipleri
bigint tipi
Şöyle yaparız.
bigint(20) unsigned NOT NULL
bit tipi
Şöyle yaparız.
bit(1) DEFAULT b'1'
date tipi
Şöyle yaparız. Bu sütün tipi için default değer olarak Now(), Current_Date() gibi metodlar kullanılamaz.
date DEFAULT NULL
datetime tipi
Açıklaması şöyle
The DATETIME type is used when you need values that contain both date and time information. MySQL retrieves and displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
Diğer veritablarındaki karşılığı şöyle
MySQL: DATETIME(6)
Postgres: TIMESTAMP WITHOUT TIME ZONE
Microsoft SQL: DATETIME
Şöyle yaparız
updated_on datetime NOT NULL
MySQL 5.5'te noktadan sonra kaç tane hane istediğimizi belirtemiyoruz. Şu satır hata verir. İleriki sürümlerde ise çalışır.
updated_on datetime(6) NOT NULL
Default değer için şöyle yaparız.
created datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
Açıklaması şöyle. Eğer sütuna null değer vermeye çalışırsak sunucunun saatini kullanılır.
this will ensure that every record inserted will default to the current server date and time

decimal tipi
Şöyle yaparız. Para tipi veri için çok uygundur
DECIMAL(10)
double tipi
Şöyle yaparız.
double NOT NULL DEFAULT '0'
int tipi
Şöyle yaparız.
int(11)
Kısıt koymak istersek şöyle yaparız.
int(11) NOT NULL AUTO_INCREMENT
Şöyle yaparız.
int(11) NOT NULL DEFAULT '0'
Şöyle yaparız.
int(11) DEFAULT NULL
int unsigned tipi
Şöyle yaparız.
int(10) unsigned NOT NULL DEFAULT '0',
Şöyle yaparız.
CREATE TABLE list_relation
(
  parent_id INT UNSIGNED NOT NULL,
  ...
);
mediumtext tipi
text tipine bakınız.

smallint tipi
Şöyle yaparız.
smallint(5) unsigned NOT NULL AUTO_INCREMENT
text tipi
Açıklaması şöyle. İsmi text olsa da aslında en fazla 65535 byte saklayabilir. Kaç karaktere denk geldiği kullanılan encoding ile değişebilir.
In MySQL, TEXT is 64K bytes. You might be better off with MEDIUMTEXT, which has a limit of 16MB. I say "bytes" because, for example, Chinese needs 3, sometimes 4, bytes per character, so only about 25K characters of Chinese text will fit in TEXT.
Açıklaması şöyle.
Variable-length string types are stored using a length prefix plus data. The length prefix requires from one to four bytes depending on the data type, and the value of the prefix is L (the byte length of the string). For example, storage for a MEDIUMTEXT value requires L bytes to store the value plus three bytes to store the length of the value.
VARCHAR, VARBINARY, and the BLOB and TEXT types are variable-length types. For each, the storage requirements depend on these factors:
  • The actual length of the column value
  • The column's maximum possible length
  • The character set used for the column, because some character sets contain multibyte characters
Sütunu yaratırken şöyle yaparız.
TEXT CHARACTER SET utf8mb4
time tipi
Şöyle yaparız.
time DEFAULT NULL
timestamp tipi
Açıklaması şöyle
The TIMESTAMP data type has a range of '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC. It has varying properties, depending on the MySQL version and the SQL mode the server is running in.
Veritabanının saat diliminden etkilenir. Şöyle görebiliriz.
mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+
tinyint tipi
Şöyle yaparız.
tinyint(4) DEFAULT NULL
varchar tipi
Şöyle yaparız.
varchar(50)
Kısıt koymak istersek şöyle yaparız.
varchar(250) COLLATE utf8mb4_bin NOT NULL
Diğer Notlar
auto_inrement özelliği
auto_increment sütun tipi değil ancak tamamlayıcı bir özellik olduğu için bu yazıya dahil ettim.
Sütun değerinin veritabanı tarafından yönetilmesini istediğimizi belirtir. Şöyle yaparız. Satır eklenmese, yani rollback yapılsa bile, id alanı 2'den 3'e atlar.
create table foo
(   id int auto_increment primary key,
    thing varchar(20) not null
)ENGINE=INNODB;

start transaction;
insert foo(thing) values ('frog');
commit;

start transaction;
insert foo(thing) values ('frog2');
-- Point-in-time A
rollback;

start transaction;
insert foo(thing) values ('frog3');
commit;

select * from foo;
+----+-------+
| id | thing |
+----+-------+
|  1 | frog  |
|  3 | frog3 |
+----+-------+
identity
auto_increment yerine identity de kullanılabilir. Aralarıda ne fark var bilmiyorum. Şöyle yaparız.
CREATE TABLE foo (
  id int NOT NULL IDENTITY(1,1),
  ...
);



11 Mayıs 2018 Cuma

OpenMP parallel

#parallel ile for
Açıklaması şöyle. N tane thread başlatılır.
#pragma omp parallel spawns a group of threads, while #pragma omp for divides loop iterations between the spawned threads.
Şöyle yaparız.
#pragma omp parallel
{
  #pragma omp for
  for (int i=0;i<NX;i++)
  {
    ...
  }
  #pragma omp for 
  for (int i=1;i<NX-1;i++)
  {
    ...
  }
}
#parallel ile threadprivate
Şöyle yaparız
static int dataVersion;

data_t& GetData()
{
    static data_t *d = NULL;
    #pragma omp threadprivate(d); // !!!

    if (d && d->myDataVersion != dataVersion) {
        delete d;
        d = nullptr;
    }
    if (!d) { 
        d = new data_t();
        d->myDataVersion = dataVersion;
    }

    return *d;
}
#parallel ile section
Şöyle yaparız.Her thread bir section kodunu çalıştırır.
#pragma omp parallel sections
{
  #pragma omp section
  { 
    printf ("id = %d, \n", omp_get_thread_num());/* Executes in thread 1 */
  }

  #pragma omp section
  { 
    printf ("id = %d, \n", omp_get_thread_num());/* Executes in thread 2 */
  }
}
Çıktı olarak şunu alırız
id = 0,
id = 1,
Çalışma şekli şöyledir. N tane thread başlatılır. Sadece iki tanesi çalışır, diğerleri bekler. Thread 1 kısa sürede biter. Thread 2 biraz daha uzun çalışır. Tüm thread'ler sections sonundaki bariyerdel (* işareti) buluşurlar.
                 [    sections     ]
Thread 0: -------< section 1 >---->*------
Thread 1: -------< section 2      >*------
Thread 2: ------------------------>*------
...                                *
Thread N-1: ---------------------->*------
#parallel ile single
Örnek
Şöyle yaparız. Single producer her nesneyi kuyruğa koyar. task'lar ise kuyruktan okurlar.
#pragma omp parallel
{
  #pragma omp single
  {
    for (auto x : stl_container)
    {
      #pragma omp task
      {
        // Do something with x, e.g.
        compute(x);
      }
    }
  }
}
Çalışma şekli şöyledir.
               +--+-->[ task queue ]--+
               |  |                   |
               |  |       +-----------+
               |  |       |
Thread 0: --< single >-|  v  |-----
Thread 1: -------->|< foo() >|-----
Thread 2: -------->|< bar() >|-----
Örnek
Şöyle yaparız.
#pragma omp parallel num_threads(2)
{
  #pragma omp single
  QuickSort(arr, 0, arr.length, cuttoff);
}
#parallel ile thread sayısı
Şöyle yaparız.
#pragma omp parallel num_threads (10)
{
  ...
}
Şöyle yaparız.
#pragma omp parallel num_threads(3)
#pragma omp for
{
  ...
}
#parallel ile reduction
Söz dizimi şöyle.
reduction(operation:var)  
Açıklaması şöyle.
Note that reduction variables are private and their intermediate values (i.e. the value they hold before the reduction at the end of the parallel region) are only partial and not very useful.
Örnek
Şöyle yaparız.
#include <iostream>
#include <omp.h>

struct dbl_int {
    double val;
    int idx;
};

const dbl_int& max( const dbl_int& a, const dbl_int& b) {
  return a.val > b.val ? a : b;
}

#pragma omp declare reduction( maxVal: dbl_int: omp_out=max( omp_out, omp_in ) )

int main() {
  dbl_int di = { -100., -1 };
  #pragma omp parallel num_threads( 10 ) reduction( maxVal: di )
  {
    di.val = omp_get_thread_num() % 7;
    di.idx = omp_get_thread_num();
  }
    
  return 0;
}
Örnek
Şöyle yaparız.
//g++ -O3 -Wall foo.cpp -fopenmp
#pragma omp parallel for reduction(+:sum)
for(int i = 0 ; i < 2000000000; i++)
 sum += i%11;
#parallel İçinde critical + barrier
Şöyle yaparız.
#pragma omp parallel
{
   ...

  #pragma omp critical(iteration) //Scope için mutex koy
  {
    iteration++; //Bir değişkeni artır
  }
  ...

  #pragma omp critical(reduction) //If için mutex koy
  if (...)
  {
    ...
  }

  #pragma omp barrier //Tüm thread'lerin bitmesini bekle
   ...
}
#pragma İçinde dynamic
Şöyle yaparız. Paralel kodun 4 thread tarafından çalıştırılmasını sağlar.
#pragma omp parallel
{
   #pragma omp for schedule(dynamic,4)
   for (i = 0; i < N; i++)
   {
     ...
   }
   ...
}
İptal Etme
OpenMP 2'de iptal etmek yapıları yok. OpenMP 4 ile geldi. Şöyle yaparız.