Bu bölüm en eÄŸlenceli bölümlerden birisi. Bu bölümde kendi fonksiyonlarımızı yazacağız. Yani modüler programlamaya giriÅŸ yapacağız.  Hadi baÅŸlayalım.

Fonksiyon Nedir?


C'de altprogramlara fonksiyon denir. Her fonksiyon faydalı bir takım iÅŸlemleri yerine getirmek için tasarlanır ve çaÄŸrılır. Fonksiyonların, onları çağıran fonksiyonlardan altıkları girdileri ve yine onları çağıran fonksiyonlara gönderdikleri çıktıları vardır. 

Fonksiyonlar bir programı modüllere ayırmamıza izin verir. Fonksiyon tanımlarında tanımlanan tüm değişkenler yerel değişkenlerdir (yalnızca içerisinde tanımlandıkları fonksiyon içinde erişilebilirler).


Fonksiyon Tanımlamaları 

C'de fonksiyon tanımlama işleminin genel biçimi şöyledir:

[geri dönüş deÄŸerinin türü] <Fonksiyonun İsmi> ([Parametreler]) 
{
...
}

Yukarıdaki gösterimde <...> ile gösterilen ifadeler zorunlu olarak bulunması gerekenleri; [...] bulunması zorunlu olmayan, isteğe bağlı ifadeleri göstermektedir. Örneğin:

float fonk(){
    .   
    .
    .
}


Yukarıdaki fonksiyonun geri dönüş değerinin float olduğunu ve parametre almadığını görüyoruz.

Bir fonksiyonun parametresi ve/veya geri dönüş değeri olmayabilir. Parametresiz fonksiyonlarda fonksiyon parantezleri içine ya hiçbir şey yazılmaz ya da void anahtar sözcüğü yazılır. Örneğin:

float a1(void){                    float a1(){
    .                                  .
    .                                  .
    .                                  .
}                                  }


Yukarıdaki iki tanımlama biçiminde de a1 fonksiyonunun parametresiz olduÄŸu anlatılmaktadır, dolayısıyla eÅŸdeÄŸerdir.

Fonksiyon tanımlanırken geri dönüş değerinin türü yerine hiçbir şey yazılmazsa C derleyicisi geri dönüş değerinin türünün int olduğunu varsayar. Örneğin:

y1(){
    .   
    .    
    .
}

y1 fonksiyonunun parametresi yoktur; ancak geri dönüş deÄŸeri int türündendir. 


   ! C'de  fonksiyon içinde fonksiyon tanımlanmaz.. !


float fonk1(){
    ...
    int fonk2(){
        ...            /* Hatalı tanımlama */
    }
    ...
}

Yukarıdaki tanımlamada fonk2 'nin fonk1'in içinde tanımlandığını görüyoruz; bu nedenle tanımlama işlemi geçersizdir. İki fonksiyonun aşağıdaki örnekte olduğu gibi tanımlanması gerekmektedir:

float fonk1(){
    .
    .
    .
}

int fonk2(){
    .   
    .    
    .
}



Fonksiyonların Çağrılması


Bir fonksiyon çağrıldığında programın akışı fonksiyonu çalıştırmak üzere bellekte fonksiyon kodunun bulunduğu böyleye atlar; fonksiyonun çalışma işlemi bittikten sonra da akış tekrar çağıran fonksiyonun kalınan yerinden devam eder.


Fonksiyonlar ancak tanımlanmış fonksiyonların içerisinde çağrılabilirler. Örneğin:

main(){
    int a = 100, b =200;    
    printf("a= %d b = %d\n",a,b);
}
printf("merhaba\n"); // hata ! Burada fonksiyon çağrılmaz

fonk(){
    int x = 10, y = 20;
    printf("x= %d y = %d\n",x,y);
}


Burada printf, main ve fonk isimleri fonksiyonların içinde doÄŸru biçimde çaÄŸrılmıştır. Ancak iki fonksiyonun arasında hiçbirinin içinde olmayacak biçimde çaÄŸrılmış olan: printf("merhaba\n"); geçersizdir. 

Örnekler:


1) Girilen iki sayıyı toplayan program:

#include <stdio.h>
int addNumbers(int a, int b);         // function prototype

int main()
{
    int n1,n2,sum;

    printf("Enters two numbers: ");
    scanf("%d %d",&n1,&n2);

    sum = addNumbers(n1, n2);        // function call
    printf("sum = %d",sum);

    return 0;
}

int addNumbers(int a, int b)         // function definition   
{
    int result;
    result = a+b;
    return result;                  // return statement
}


Ekran Çıktısı:

Enters two numbers: 2
3
sum = 5

2) Girilen sayının karesini al program:

#include<stdio.h>  
int kareal(int);  
void main()  
{  
    int sayi, kare;
    printf("Karesi alınacak olan sayiyi girinizi: ");  
    scanf("%d",&sayi);
    kare = kareal(sayi);
    printf("%d sayisinin karesi = %d\n",sayi,kare);
    
    
}  
int kareal(int sayi)  
{  
    return sayi*sayi;  
}  


Ekran Çıktısı:

Karesi alınacak olan sayiyi girinizi: 3
3 sayisinin karesi = 9

3) Girilen sayının tek mi çift mi olduğunu bulan program

#include<stdio.h>  
int cift_tek(int);  
void main()  
{  
 int n,flag=0;  
 printf("\ngirilen sayinin tek mi cift mi ?");  
 printf("\nsayi giriniz: ");  
 scanf("%d",&n);  
 flag = cift_tek(n);  
 if(flag == 0)  
 {  
    printf("\nsayi tek");  
 }  
 else   
 {  
    printf("\nsayi cift");  
 }  
}  
int cift_tek(int n)  
{  
    if(n%2 == 0)  
    {  
        return 1;  
    }  
    else   
    {  
        return 0;  
    }  
}

Ekran Çıktısı:

girilen sayinin tek mi cift mi ?
sayi giriniz: 3
sayi tek

4) İki değerin yerini değiştiren program (swap):

#include<stdio.h>
// function prototype, also called function declaration
void swap(int a, int b);          
 
int main()
{
    int m = 22, n = 44;
    // calling swap function by value
    printf(" values before swap  m = %d \nand n = %d", m, n);
    swap(m, n);                         
}
 
void swap(int a, int b)
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
    printf(" \nvalues after swap m = %d\n and n = %d", a, b);
}

Ekran Çıktısı:

values before swap  m = 22 
and n = 44 
values after swap m = 44
 and n = 22


5) Bir dizi döndürecek fonksiyon kullanarak bazı değerlerin maksimum ve minimumunu bulan program: ( bu örnekte pointer kullanılmıştır. İlerleyen konularda pointerlara değineceğiz.)

# include <stdio.h>
# define max 10
int *maxmin(int ar[], int v);
int main()
{
  int  arr[max];
int n,i, *p;
  printf("Number of values you want to input: ");
  scanf("%d",&n);
  printf("Input %d values\n", n);
  for(i=0;i<n;i++)
    scanf("%d",&arr[i]);
  p=maxmin(arr,n);
printf("Minimum value is: %d\n",*p++);
printf("Maximum value is: %d\n",*p);
}
int *maxmin(int arra1[], int v)
{
  int i;
static int result_mm[2];
result_mm[0]=arra1[0];
result_mm[1]=arra1[0];
for (i=1;i<v;i++)
{
if(result_mm[0] > arra1[i])
    result_mm[0]=arra1[i];
if(result_mm[1]< arra1[i])
  result_mm[1]= arra1[i];
}
return result_mm;
}

Ekran Çıktısı:

Number of values you want to input: 4
Input 4 values
3
5
7
8
Minimum value is: 3
Maximum value is: 8












Kaynaklar:

A'dan Z'ye C Programlama Kılavuzu
https://www.programiz.com/c-programming/c-functions
https://www.javatpoint.com/functions-in-c
https://fresh2refresh.com/c-programming/c-function/
https://www.w3resource.com/c-programming-exercises/function/index.php
  Bu yazımızda do...while döngülerine, break ve continue ifadeleri ile ilgili bilgi vereceÄŸiz ve örneklerle bu ifadeleri pekiÅŸtireceÄŸiz. Hadi baÅŸlayalım.

do...while Tekrarlama İfadesi

do...while tekrarlama ifadesi while ifadesine benzerdir. while ifadesinde, döngü devam koÅŸulu, döngü gövdesi icra edilmeden önce döngü başında kontrol edilir. do...while ifadesi döngü devam koÅŸulunu döngü gövdesi yapıldıktan sonra kontrol eder. Yani do...while döngülerinde kontrol sonda olduÄŸu için döngü içindeki deyimler en az bir kere iÅŸlem görür. Genel biçimi aÅŸağıda verilmiÅŸtir.

do
    deyim
while(koÅŸul);
...

do döngünün başını gösteren bir anahtar sözcüktür. Döngünün iç bölgesi do anahtar sözcüğünden while anahtar sözcüğüne kadar olan bölgedir. Diğerlerinde olduğu gibi, tek bir deyim için bloklamaya gerek yoktur, fakat birden fazla deyim için bloklama yapılır. Örneğin:

do{
    deyim1
    deyim2
    ...
}while(koÅŸul);
...



do...while döngüsünün gövdesi bir kez yürütülür.
 Test Expression doÄŸruysa döngünün gövdesi yeniden yürütülür ve Test Expression bir kez daha deÄŸerlendirilir. Bu iÅŸlem Test Expression yanlış olana kadar devam eder. Test Expression yanlış ise döngü sona erer.





Aşağıdaki örneği inceleyelim:

do{
    printf("(E)vet ya da (H)ayır\n");
    ch = getch();
}while((ch = toupper(ch)) != 'E' && ch != 'H');

Bu örnekte kullanıcı E,e,h,H harflerinden birini girmeye zorlanmaktadır. Bu harflerden biri girilmediÄŸi sürece döngü devam edecektir. Bir örnek daha yapalım.

#include <stdio.h>
int main(void){
    unsigned int counter = 1;
    do{
        printf(" %u ",counter);
    }while(++counter <=10);
}

Ekran çıktısı:

1 2 3 4 5 6 7 8 9 10

break ve continue İfadeleri

break ve continue ifadeleri kontrol akışını deÄŸiÅŸtirmek için kullanılır.

break İfadesi

break anahtar sözcüğü döngüleri sonlandırarak program akışını döngünün dışındaki ilk deyime taşır. Ã–rneÄŸin:

for(;;){
    ...   
    ch = getchar();
    if(ch =='q')
        break;
}
...

Burada klavyeden girilen karakter 'q' olduğunda break anahtar sözcüğü ile döngü kırılmaktadır. for(;;) sonsuz bir döngü olduğundan çıkış da ancak break ile mümkün olabilir.

...
while(k<100){
    ...   
    if(sample()<0) break;
    ...
}
...

Bu örnekte ise sample() fonksiyonunun geri dönüş değeri sıfırdan küçük ise döngü kırılmaktadır. Aşağıdaki örnekte de 0'dan 100'e kadar olan tamsayıları ekrana yazdırılıyor.

k=0;
for(;;){
    if(k>=100) break;
    printf("%d\n",++k);
}


continue İfadesi

continue anahtar sözcüğü o anda içinde bulunan yinelemeyi keserek bir sonraki yinelemeye geçilmesine neden olur. AÅŸağıdaki örneÄŸi inceleyelim.

do{
    ch = getchar();
    if(isupper(ch))
        continue;
    ...
}while(ch!='q');

Bu örnekte girilen harf, büyük harf ise işlem yapma, büyük harf değilse işlemleri gerçekleştir. Girilen harf 'q' ise döngüden çıkar.


Örnekler

1) Girilen sayıların toplamını bulan ve 0 girildiğinde döngüden çıkan program

// Program to add numbers until the user enters zero

#include <stdio.h>
int main() {
  double number, sum = 0;

  // the body of the loop is executed at least once
  do {
    printf("Enter a number: ");
    scanf("%lf", &number);
    sum += number;
  }
  while(number != 0.0);

  printf("Sum = %.2lf",sum);

  return 0;
}

Ekran Çıktısı:

Enter a number: 1.5
Enter a number: 2.4
Enter a number: -3.4
Enter a number: 4.2
Enter a number: 0
Sum = 4.70


2)  

#include<stdio.h>  
#include<stdlib.h>  
void main ()  
{  
    char c;  
    int choice,dummy;    
    do{  
    printf("\n1. Print Hello\n2. Print Javatpoint\n3. Exit\n");  
    scanf("%d",&choice);  
    switch(choice)  
    {  
        case 1 :   
        printf("Hello\n");   
        break;  
        case 2:    
        printf("Javatpoint\n");  
        break;  
        case 3:  
        exit(0);   
        break;  
        default:   
        printf("please enter valid choice\n");      
    }  
    printf("do you want to enter more?\n");   
    scanf("%d",&dummy);  
    scanf("%c",&c);  
    }while(c=='y');  
}    


Ekran Çıktısı

1. Print Hello
2. Print Javatpoint
3. Exit
1
Hello
do you want to enter more?
y

1. Print Hello
2. Print Javatpoint
3. Exit
2
Javatpoint
do you want to enter more?
n

3) 1'den 10'a kadar sayıları yazan program

#include<stdio.h>  
int main(){    
    int i=1;      
    do{    
        printf("%d \n",i);    
        i++;    
    }while(i<=10);   
    return 0;  
   

Ekran Çıktısı

1
2
3
4
5
6
7
8
9
10


4)  Girilen sayının çarpım tablosundaki deÄŸerleri yazan program

#include<stdio.h>  
    int main(){    
    int i=1,number=0;    
    printf("Enter a number: ");    
    scanf("%d",&number);    
    do{    
        printf("%d \n",(number*i));    
        i++;    
    }while(i<=10);    
    return 0;  
}    

Ekran Çıktısı


Enter a number: 5
5
10
15
20
25
30
35
40
45
50

5) Max 10 sayı alan ve bunları toplayan program. Kullanıcı negatif sayı girdiğinde döngüden çıkan program.


// Program to calculate the sum of numbers (10 numbers max)
// If the user enters a negative number, the loop terminates

#include <stdio.h>

int main() {
   int i;
   double number, sum = 0.0;

   for (i = 1; i <= 10; ++i) {
      printf("Enter n%d: ", i);
      scanf("%lf", &number);

      // if the user enters a negative number, break the loop
      if (number < 0.0) {
         break;
      }

      sum += number; // sum = sum + number;
   }

   printf("Sum = %.2lf", sum);

   return 0;
}

Ekran Çıktısı

Enter n1: 2.4
Enter n2: 4.5
Enter n3: 3.4
Enter n4: -3
Sum = 10.30


6) Max 10 sayı alan ve bunları toplayan program. Kullanıcı negatif sayı girdiÄŸinde toplamaya eklemeyen program.

// Program to calculate the sum of numbers (10 numbers max)
// If the user enters a negative number, it's not added to the result

#include <stdio.h>
int main() {
   int i;
   double number, sum = 0.0;

   for (i = 1; i <= 10; ++i) {
      printf("Enter a n%d: ", i);
      scanf("%lf", &number);

      if (number < 0.0) {
         continue;
      }

      sum += number; // sum = sum + number;
   }

   printf("Sum = %.2lf", sum);

   return 0;
}

Ekran Çıktısı

Enter n1: 1.1
Enter n2: 2.2
Enter n3: 5.5
Enter n4: 4.4
Enter n5: -3.4
Enter n6: -45.5
Enter n7: 34.5
Enter n8: -4.2
Enter n9: -1000
Enter n10: 12
Sum = 59.70





Bir sonraki derse ulaÅŸmak için: C'de Fonksiyonlar #C4
Bir önceki derse ulaÅŸmak için: C'de Program Kontrolü - switch-case #C3.2


Kaynaklar:

A'dan Z'ye C programlama
Deitel Deitel C ile programlama
https://www.programiz.com/c-programming/c-do-while-loops
javatpoint.com/do-while-loop-in-c
https://www.programiz.com/c-programming/c-break-continue-statement

 Bu yazımızda c programlamada ve diÄŸer çoÄŸu programlama dilinde kullanılan switch-case yapılarını inceleyeceÄŸiz ve örnekler yaparak pekiÅŸtireceÄŸiz. 

switch Çoklu Seçim İfadesi


İf deÄŸimi doÄŸru veya yanlış olmak üzere iki seçeneÄŸe sahiptir. Oysa switch deyimi belli bir ifadenin çeÅŸitli sayısal deÄŸerlerine karşı farklı iÅŸlemlerin yapılması için kullanılır.

switch(ifade){
    case <sabit_ifadesi1>: ..........................[break];
    case <sabit_ifadesi1>: ..........................[break];
    case <sabit_ifadesi1>: ..........................[break];
    ...
    [default: ..........;]
}

switch, case ve default birer anahtar sözcüktür. Derleyici switch parantezinin içerisindek ifadenin sayısal değerini hesaplar. Eğer bu değere eşit olan bir case ifadesi bulunursa programının akışını oraya yönlendirir. Eğer böyle bir ifade yoksa program akışı default ile belirtilen kısma geçer. Örneğin:

switch(n){
    case 1: printf("bir\n");
    case 2: printf("iki\n");
    case 3: printf("uc\n");
    case 4: printf("dort\n");
    case 5: printf("bes\n");
    default: printf("hicbiri");
}

Burada n = 1 ise programın akışı case 1: kısmına yönlendirilir. Akış buradan sırayla aşağıya inerek devam edecektir. Dolayısıyla ekranda:

bir
iki
uc
dort
bes
hicbiri

yazılarını görürsünüz. Döngülerden çıkmak için kullanılan break anahtar sözcüğü switch içerisinden çıkmak için de kullanılabilir. Bu durumda bir case ifadesi break ile sonlandırılırsa programın akışı diğer case ifadelerine geçmez.

switch(n){
    case 1: printf("bir\n");break;
    case 2: printf("iki\n");break;
    case 3: printf("uc\n");break;
    case 4: printf("dort\n");break;
    case 5: printf("bes\n");break;
    default: printf("hicbiri");break;
}

case anahtar sözcüğünün yanındaki ifadenin sabit ifade olması zorunludur. Çünkü derleyici derleme zamanında case ifadelerinin sayısal değerlerini hesaplamak zorundadır. Aşağıdaki örneği inceleyelim:


switch(x-1){
    case 8: .........break;
    case 12: ........break;
    case y-3: .......break;
    default:..............;
}

Burada son case ifadesi sabit olmadığı için switch geçersizdir. Birden fazla sayısal değer için aynı işlemlerin yapılması isteniyorsa aşağıdaki gibi bir yol izleyebilirsiniz. Bunun daha kısa yapılış yöntemi yoktur.

switch(vmode){
    case 2: 
    case 7: 
        vseg = 0xb000;break;
    case 3:  
        vseg = 0xb800;break;
    default: 
        printf("lutfen video modunu degistiriniz");
}

Yukarıdaki örnekte vmode deÄŸiÅŸkenin 2 ve 7 deÄŸerleri için aynı iÅŸlemler yapılmaktadır. 
default anahtar sözcüğünün sonda olması ve case sabitlerinin artan sırada olması zorunluluk değildir. Yani yukarıdaki örnek şöylede düzenlenebilirdi.

switch(vmode){
    default: 
        printf("lutfen video modunu degistiriniz");
     case 3:  
        vseg = 0xb800;break;
    case 7: 
    case 2: 
        vseg = 0xb000;break;
}
   
    
switch deyiminin son case ifadesi için break gerekmediÄŸine dikkat ediniz. DiÄŸer kontrol deÄŸimlerinde olduÄŸu gibi  switch deyimi yalnızca bir deyim içeriyorsa bloklama yapmaya gerek yoktur.

Aşağıdaki örneği inceleyelim:

int yilingunu(int gun, int ay){

    int ygun= gun;
    
    switch(ay-1){   
        case 11: ygun += 30;
        case 10: ygun += 31;
        case 9: ygun += 30;
        case 8: ygun += 31;
        case 7: ygun += 31;
        case 6: ygun += 30;
        case 5: ygun += 31;
        case 4: ygun += 30;
        case 3: ygun += 31;
        case 2: ygun += 28;
        case 1: ygun += 31;
    }
    return ygun;
}
void main(){
    printf("%d\n, yilingunu(31,12));
}

yilingunu fonksiyonu ay ve gün ile belirlenen yıl içerisindeki bir tarihin yılın kaçıncı günü olduÄŸunu bulunuyor. (Åžubat ayının 28 çektiÄŸi varsayılıyor). switch içerisinde kümülatif toplam yapabilmek için break kullanılmadığına dikkat ediniz.


Örnekler

1) Hesap makinesi yapımı:

#include <stdio.h>

int main() {

  char op;
  double first, second;
  printf("Enter an operator (+, -, *, /): ");
  scanf("%c", &op);
  printf("Enter two operands: ");
  scanf("%lf %lf", &first, &second);

  switch (op) {
    case '+':
      printf("%.1lf + %.1lf = %.1lf", first, second, first + second);
      break;
    case '-':
      printf("%.1lf - %.1lf = %.1lf", first, second, first - second);
      break;
    case '*':
      printf("%.1lf * %.1lf = %.1lf", first, second, first * second);
      break;
    case '/':
      printf("%.1lf / %.1lf = %.1lf", first, second, first / second);
      break;
    // operator doesn't match any case constant
    default:
      printf("Error! operator is not correct");
  }

  return 0;
}

Ekran Çıktısı:

Enter an operator (+, -, *, /):
Enter two operands: 1.5
4.5
1.5 * 4.5 = 6.8


2) İç içe switch-case örneği:


#include <stdio.h>

int main() {
int a = 5;
int b = 10;
switch (a) {  //Outer switch

 case 25/5:
             switch (b) {  // Inner switch. 
               case 100/10:
                     printf("I am inside two switches!!\n");
                     break;
               default:
                     printf("me too!\n");
             }
             break;
 default:
             printf("I am default\n");
}
}

Ekran Çıktısı:

 I am inside two switches!! 


3)  Basit bir ATM yapalım. Bu ATM de sadece para çekme, para yatırma ve bakiye sorgula iÅŸlemleri olsun. Her bir durum için farklı komutlar yazarak bu yapıyı kuracağız.


#include <stdio.h>
 
main()
{
    int bakiye = 1000;
    int islem,tutar;
    
    printf("Bakiyeniz: %d",bakiye);
    printf("\n\n**** ISLEMLER ****\n");
    printf("1. Para Cekme\n");
    printf("2. Para Yatirma\n");
    printf("3. Para Bakiye Sorgulama\n");
    printf("4. Kart Iade\n");
    
    printf("Isleminizi seciniz : ");
    scanf("%d",&islem);
    
    switch(islem){
        case 1:
                   printf("Bakiyeniz : %d\n",bakiye);
                   printf("Cekmek istediginiz tutari giriniz : ");
                   scanf("%d",&tutar);
                   if(tutar>1000){
                   printf("Yetersiz bakiye tekrar giriniz !!");
                   scanf("%d",&tutar);
            }
                     bakiye -= tutar;
                     printf("Yeni Bakiyeniz : %d",bakiye);
                     break;
        case 2:
                     printf("Bakiyeniz : %d\n",bakiye);
                     printf("Yatirmak istediginiz tutari giriniz : ");
                     scanf("%d",&tutar);
                     bakiye += tutar;
                     printf("Yeni Bakiyeniz : %d",bakiye);
                     break;
        case 3:
                     printf("Bakiyeniz : %d\n",bakiye);
                     break; 
        case 4:
                 printf("Kartinizi almayi unutmayin!");
                     break;                 
    }
 
}

Ekran Çıktısı:














Kaynaklar:
A'dan Z'ye C Kılavuzu - Kaan Aslan
https://www.scaler.com/topics/switch-case-in-c/
https://www.programiz.com/c-programming/examples/calculator-switch-case
https://www.kodbloklari.com/c-dilinde-switch-case-yapisi/

 Anonymous'un Rus hükümetine karşı siber savaşının bir parçası olarak.


Küresel bilgisayar korsanları topluluğu Anonymous, bir tweet'te Ukrayna'dan savaş görüntüleri yayınlamak için Rus TV ve yayın hizmetlerini hacklediğini iddia etti.


Rusya, Ukrayna'yı işgalini 'özel bir askeri operasyon' olarak nitelendirdi ve ülkedeki yabancı medya kuruluşlarına ve sosyal medyaya erişimi kısıtladı. The Independent'ın haberine göre, kendisini 'hacktivist' olarak tanımlayan kolektif, Rusların çoğunluğunun işgale karşı olduğunu ve küresel topluluğa bağlı kalması gerektiğini belirtiyor.


Rusya'ya karşı siber savaş

Rus saldırılarının ardından grup, Ukrayna'ya desteğini gösterdi ve artık Rus hükümetine karşı bir siber savaşta olduğunu ilan etti.


Hemen ertesi gün, Rus hükümetinin resmi web sitesi kapatıldı ve kolektif, web sitesini kapatma sorumluluğunu üstlendi. Bundan önce, diğer hacker grupları da Belarus sınırı boyunca Rus birliklerinin birikmesini yavaşlatmak için siber savaş kullanıyordu.

Grup, Rusya'da halka açık 400'den fazla gösterinin kontrolünü ele geçirdiğini iddia ediyor ve Rus halkına ulaşmak için kamera yayınlarına Ukrayna işgali hakkında metinler yerleştiriyor.

Yeni yalan haber yasası

Ukrayna savunması karşısında savaş uzadıkça ve yoğunlaşırken, Rus parlamentosu yetkililerin devam eden operasyonların anlatısını kontrol etmesine izin veren bir 'sahte haber' yasasını onayladı. Yetkililere göre Rus kuvvetleri hakkında yanlış bilgi yaymaktan suçlu bulunanlar, 1,5 milyon ruble (14.035 ABD Doları) para cezası veya 15 yıla kadar hapis cezası ile karşı karşıya.

Yasa, BBC, Bloomberg ve CNN gibi haber servislerinin Rusya'daki faaliyetlerini askıya almayı düşünmesini sağlarken, diğerleri ya raporlarında yan satır kullanımını sınırlandırıyor.
Tüm bunların arasında, Anonymous'un Rus medya kuruluşlarını başarıyla hacklediğini ve Ukrayna'dan görüntüleri görüntülediğini iddia ettiği operasyon, IŞİD ve hatta ABD'deki Merkezi İstihbarat Teşkilatı (CIA) gibi isimleri de içeren kesinlikle şimdiye kadarki en büyük operasyondur.

Saldırının Rus halkına da bir mesajı vardı ve halkı Ukrayna'ya yönelik saldırıya karşı çıkmaya çağırdı. Şimdiye kadar sadece bir Ukraynalı haber servisi hack'i onayladı.


Kaynak
https://interestingengineering.com/anonymous-hacked-russian-tvs









 "OlaÄŸanüstü zamanlar olaÄŸanüstü önlemler gerektirir" diyor.


Tesla CEO'su Elon Musk, güneş enerjisi de dahil olmak üzere çevre dostu girişimleriyle ve fosil yakıtlardan kaynaklanan karbon emisyonlarıyla başa çıkmak için bir karbon vergisi uygulama önerisiyle tanınıyor.

Bu yüzden Cuma gecesi Musk, ABD'nın petrol ve gaz üretimini artırması gerektiğini tweetlediğinde şok oldu.

Bunu neden söyledi ve bunun Rusya'nın Ukrayna'yı işgaliyle ne ilgisi var?

Artan petrol ve gaz üretimi


Musk, "Bunu söylemekten nefret ediyorum ama derhal petrol ve gaz üretimini artırmamız gerekiyor" diye yazdı. "Olağanüstü zamanlar olağanüstü önlemler gerektirir."


"Açıkçası, bu Tesla'yı olumsuz etkileyecek, ancak sürdürülebilir enerji çözümleri, Rusya'nın petrol ve gaz ihracatını telafi etmek için anında tepki veremez" diye başka bir tweet'te devam etti.

Musk, olağanüstü zamanlarda, Ukrayna/Rus savaşından kaynaklanan petrol ve gaz fiyatlarındaki artışa atıfta bulunuyor. Muhtemelen petrol ve gaz ihracatının ciddi ihtiyaçları nedeniyle Rusya'ya karşı yaptırımların uygulanmasındaki tereddüte de atıfta bulunuyor.

Bazıları ABD petrol üreticilerinin üretimlerini artırmasını önerdi, ancak şu anda işçi ve gerekli ekipman sıkıntısıyla mücadele ediyorlar. Bu nedenle, bu boşluğu karşılamaları olası değildir.

GeçmiÅŸte Musk, güçlü bir petrol ve gaz karşıtı duruÅŸ sergiledi ve hatta “fosil yakıt endüstrisinin amansız ve muazzam propagandasına” karşı bir “devrim” çaÄŸrısı yaptı.

Daha temiz ve daha yeşil bir gelecek için elektrikli araçlar ve güneş panelleri üretme konusundaki sıkı çalışmasından sonra şimdi bu duruşu tersine çevirdiğini görmek, durumun ne kadar korkunç hale geldiğini gösteriyor.

Ukrayna'yı desteklemek

Musk ayrıca, Ukrayna Başbakan Yardımcısı Mykhailo Fedorov'un kendisinden bunu yapmasını istediği bir tweetin ardından, Ukrayna'nın "Güçlü Ukrayna'yı Tut" tweet'i atmasına ve hatta ülkedeki Starlink uydu hizmetini etkinleştirmesine güçlü destek gösterdi. ABD petrol ve gaz üreticilerinin üretimlerini artırmasını talep eden duruşu, ulusu savunmanın başka bir yolu olabilir.

Kaynak
https://interestingengineering.com/elon-musk-increase-oil-and-gas-output
 Aynı anda birden fazla thread'in çalıştığı sistemlerde, thread'lerin birbirleriyle haberleÅŸmesi, senkron bir ÅŸekilde çalışması gerekebilir. Bu yazımızda C programlama dilinde thread'lerin mutex'ler ile nasıl senkronizasyonu yapılacağını inceleyeceÄŸiz.


Thread Senkronizasyonu Nedir

Thread senkronizasyonu, iki veya daha fazla eşzamanlı işlemin veya thread'in kritik bölümü olarak bilinen program segmentini aynı anda yürütmemesini sağlayan bir mekanizma olarak tanımlanır. Senkranizaasyon teknikleri kullanılarak süreçlerin kritik bölüme erişimi kontrol edilir. Bir thread'in kritik bölümü yürütülmeye başladığı anda, diğer thread ilk thread'in işi bitene kadar bekler. Uygun senkronizasyon teknikleri uygulanmaz ise, değişkenlerin değerlerinin tahmin edilemeyen ve proseslerin veya thread'lerin context switch ( bağlam anahtarı) zamanlamasına bağlı olarak değişebileceği bir yarış durumuna neden olabilir.


Mutex ile Senkronizasyon

Mutex ile paylaşılan bir kaynağı kilitler, sonrada serbest bırakırız. Kilitlenen kod bölgesi serbest bırakılana kadar baÅŸka hiçbir thread eriÅŸemez. 

pthread_mutex_t mutex; ile mutex adında bir nesne oluÅŸturulur. 

pthread_mutex_init(&mutex,0); ile  mutex oluÅŸturulur. BaÅŸarılı bir ÅŸekilde mutex oluÅŸturulursa 0 döndürür, baÅŸarılı bir ÅŸekilde mutex oluÅŸturulmaz ile -1 döndürür.

pthread_mutex_destroy(&mutex); ile tanımlayan mutex nesnesini siler. Mutex'ler paylaşılan kaynakları korumak için kullanılırlar. BaÅŸarılıysa 0, deÄŸilse -1 döner.

pthread_mutex_lock(&mutex); ile tanımlanan mutex nesnesini kilitler(lock). Mutex zaten baÅŸka bir thread tarafından kilitlenmiÅŸ ise, thread mutex'in kullanılabilir olmasını bekler. Bir mutex'i kilitleyen thread, mevcut sahibi olur ve aynı thread onu açana kadar sahibi olarak kalır. BaÅŸarılıysa 0, deÄŸilse -1 döner.

pthread_mutex_unlock(&mutex); ile mutex nesnesi serbest bırakılır. BaÅŸarılıysa 0, deÄŸilse -1 döner.

pthread_self(); ise bulunduÄŸu thread'in ID numarasını elde etmemizi saÄŸlar.


Şimdi bir örnek yapalım:




ÖrneÄŸimizde aynı yere ulaÅŸmaya çalışan 5 tane thread vardır. Bu 5 thread aynı hafıza bölgesine eriÅŸmeye çalışmaktadır. Aralarında bir yarış durumu olmaması için senkronizasyon yaptık. Önce pthread_mutex_t mutex; ile bir mutex nesnesi oluÅŸturduk. Daha sonra main() içerisinde pthread_mutex_init() ile mutex'imizi oluÅŸturduk. pthread_mutex_destroy() ile oluÅŸturduÄŸumuz mutex'i siliyoruz. Yani main() içerisinde mutex oluÅŸturuyoruz ve siliyoruz. void *thread() içinde pthread_mutex_lock() ile kilitlemek istediÄŸimiz kod bloÄŸunun üzerine yazdık. Buradan sonrası pthread_mutex_unlock() yazılana kadar kilitli olan blok olacaktır. pthread_mutex_unlock() ile kilitlenen kod bloÄŸunu serbest bırakılır.



Ekran Çıktısı:






Kaynaklar:

https://www.geeksforgeeks.org/mutex-lock-for-linux-thread-synchronization/
https://www.bogotobogo.com/cplusplus/multithreading_pthread.php
Qualcomm, çip sıkıntısının sona erdiğini söylüyor.




Qualcomm CEO'su çip sıkıntısının COVID olmasa bile olacağını söyledi

 Qualcomm baÅŸkanı ve CEO'su Cristian Amon, Covid-19 salgını hiç vurmamış olsa bile küresel çip sıkıntısının yaÅŸanacağına inanıyor.

 Barselona'daki Mobil Dünya Kongresi'ndeki bir açılış konuÅŸmasında Amon, Amon, endüstrinin tüketici elektroniÄŸi, otomotiv parçaları ve "içlerinde yarı iletkenler olduÄŸunu fark etmeyeceÄŸiniz diÄŸer birçok ÅŸey" için keskin bir ÅŸekilde artan talebin neden olduÄŸu bir arz sıkışıklığına doÄŸru yöneldiÄŸini açıkladı.

 MWC'de CEO, Avrupa ve ABD'de çip sıkıntısının hafifletilmesine yardımcı olacak yeni giriÅŸimleri memnuniyetle karşıladı. Geçen ay Avrupa Komisyonu tarafından açıklanan 11 milyar Euro'luk bir program olan Avrupa Cips Yasası'nın yanı sıra ABD'deki Chips for America giriÅŸimine atıfta bulundu.

 Amon, birlikte çalışarak ABD ve Avrupa'nın tüm çip üretiminin yarısının dünyanın bu iki bölgesinden gelmesi hedefine ulaÅŸabileceÄŸine inanıyor. Ayrıca Qualcomm'un ÅŸu anda yarı iletken sıkıntısından etkilendiÄŸini ve ÅŸirketin "arzdan daha fazla talep" gördüğünü belirtti. Ancak, yılın ikinci yarısında durumun iyileÅŸmesini bekliyor. Aralık ayında CEO, kıtlığın bu yıl sona ermesini beklediÄŸini söyledi.

Gelecekteki yarı iletken kıtlığından kaçınmak


 Amon, bu son sorunların bugün günlük hayatımızda bilgi iÅŸlemin büyük önemini gösterdiÄŸini söyledi. Bu son meseleler, "yarı iletkenlerin her ülkedeki ve her endüstrideki ekonomilerin geleceÄŸi için ne kadar önemli ve gerekli hale geldiÄŸinin bir kanıtı" olduÄŸunu açıkladı. Çip sıkıntısı "esnek, coÄŸrafi olarak çeÅŸitlendirilmiÅŸ bir tedarik zinciri oluÅŸturma ihtiyacının odağına yeni bir farkındalık duygusu getirdi".

 Amon ayrıca, endüstriler arasında talep artmaya devam ederken, dünyanın gelecekte büyük yarı iletken arz kıtlığından kaçınması için "yarı iletken üreticileri için çok daha büyük kapasiteye yatırım yapma ihtiyacı" olduÄŸu konusunda da uyardı.

 Bir Rolan Berger raporuna göre, yarı iletken talebinin patlamaya devam ettiÄŸi bir sektör, otomotiv endüstrisidir ve yılda yaklaşık yüzde 17 artmaktadır. Açılış konuÅŸmasında Qualcomm CEO'su ÅŸirketin otomotiv endüstrisine giriÅŸinden bahsetti ve "önde gelen tüm otomobil üreticileriyle çalıştıklarını" ve "arabanın tekerlekler üzerinde baÄŸlı bir bilgisayar haline geldiÄŸini" söyledi. Ayrıca, kendi kendini süren otomobiller için "dijital ÅŸasisi" için, küresel baÄŸlantı desteÄŸi ve entegre analitik de dahil olmak üzere, ÅŸirketin bir hizmet olarak baÄŸlantı Snapdragon teknolojisinde iyileÅŸtirmeler yaptığını duyurdu. Bu ilerlemeler, şüphesiz, zaten büyük olan talebe ek olarak, daha fazla yarı iletken çıktı gerektirecektir.

Kaynak
https://interestingengineering.com/qualcomm-chip-shortage-covid