Teknik – Bulut Bilişim Nedir?

Cloud Computing‘ in Türkçe’ ye çevrilmiş halidir ve internet tabanlı bilişim hizmetlerinin genel adıdır.

Dünya üzerinde geçirdiğimiz üç sanayi devriminden sonra (üçüncüsünü daha yaşıyoruz); yavaş yavaş geçeceğimiz dördüncü sanayi devriminin (Endüstri 4.0) temel taşlarından biridir.

Bulut Bilişim dönemi ile birlikte; artık platform bağımsız ve paylaşımın çok rahat olduğu bir dünyaya doğru gidiyoruz.

İnternet dünyasında var olan bir veriye; evdeki bilgisayarımdan, cebimdeki akıllı telefondan veya elimdeki tabletten erişebiliyor, kullanabiliyorum, düzenleyebiliyorum.

Yukarıdaki maddeler kapsamında incelediğimiz zaman; Bulut Bilişim’ in bir ürün olmadığı ortaya çıkıyor. Bulut Bilişim bir hizmettir.

Bizim temel bir kaynağımız var bu kaynak bilgisayarlar ve diğer aygıtlardan elektrik dağıtıcılarına benzer bir biçimde bilişim ağı (tipik olarak İnternet’ten) üzerinden kullanılabiliyor.

Bilgisayarımızdaki tüm uygulama, program ve verilerimizi bir sunucuda (bulutta) olduğunu ve internete bağlı olduğumuz herhangi bir cihazdan bu verilere ulaşmamızı sağlayan tüm hizmetler Bulut Bilişim kapsamında girer.

Bulut bilişime geçildiğinde; kapasiteye göre maliyet (kullandıkça öde), daha paylaşılabilir, zaman ve mekandan bağımsız çalışabilme, daha düşük maliyet, erişim kolaylığı gibi faydaları görebiliyoruz. Bunun yanında veri gizliliği, veri güvenliği, servis sağlayıcı bağımlılığı, bant genişliği, veri transferi gibi konularda dezavantajlı duruma düşebiliriz.

İlk gerçek bulut bilişim hizmeti olarak Amazon S3; 2006 yılında hizmete girdi.

Bununla birlikte asıl buluş S3 için geliştirilen fiyatlandırma modeliydi, kullandıkça öde modeli şu an bulut hizmetleri fiyatlandırılmasında defakto standart olmuştur.

Kendi İnstagram Filtremizi Kodlayalım

Bugün Instagramda kullanılan resim filtrelerine benzer 2 tane filtreyi kendimiz kodyalarak yazacağız. Başlamadan önce  okumadıysanız Bitmap sınıfı,RGB ve DPI kavramı ile ilgili yazıyı okumanızı tavsiye ederim.

Ekran tasarımımız aşağıdaki gibi olacak.

instagram filtresi

Ekran açılmadan önce ComboBox’ı dolduruyorum. Ve Grayscale filtresinin seçili olarak gelmesini sağlıyorum

private void Form1_Load(object sender, EventArgs e)
{
            cbFiltre.Items.Add("Grayscale");
            cbFiltre.Items.Add("Sepia");
            cbFiltre.SelectedIndex = 0;
}

Sonraki adımda ise kullanıcının bir resim seçmesini sağlamak için Browse butonunu kullanıyoruz.Bunun için bir  OpenFileDialog nesnesi yaratıyorum.

Bu nesnenin filter özelliğine kullanıcının seçebileceği dosya uzantılarını koyuyoruz. Bu sayede belirtiğimiz uzantılar dışında dosya seçimi yapılamıyor. Tittle özelliğine ise açılan pencerenin başlığını verebiliriz.

dosyayolu.ShowDialog();

Yukarıda method ise Browse penceresinin belirttiğimiz filtreler çerçevesinde açılmasını sağlıyor. Daha sonra seçilen dosyanın yolunu TextBox’a atıyoruz ve bir Bitmap nesnesi yaratıyoruz.

 private void btnBrowse_Click(object sender, EventArgs e)
{
            OpenFileDialog dosyayolu = new OpenFileDialog();
            dosyayolu.Filter = "Resim Dosyası |*.jpg;*.nef;*.png ";
            dosyayolu.Title = "Resim Seç";
            dosyayolu.ShowDialog();
            txtLocation.Text= dosyayolu.FileName;
            pictureBefore.ImageLocation =txtLocation.Text;
            bmpBefore = new Bitmap(txtLocation.Text);
}

Kodun biraz daha okunur olması için enum tanımladım. Enumdaki değerleri Combobox’daki elemanların indeksine göre verdim.

enum Filtreler
{
   Grayscale=0,
   Sepia=1
}

Apply butonuna basıldığında ise ,kullanıcının seçtiği filtreye göre filtreyi uygulacak fonksiyonu çağırıyorum ve fonksiyona bitmap nesnesini gönderiyorum. Dönen bitmap nesnesini ise ekranın sağında bulunan pictureBoxAfter’a atıyorum.

private void bntApply_Click(object sender, EventArgs e)
{
            if (cbFiltre.SelectedIndex == (int)Filtreler.Grayscale)
            {
              bmpAfter= ApplyGrayscale(bmpBefore);
                pictureBoxAfter.Image = bmpAfter;
            }
            else if (cbFiltre.SelectedIndex == (int)Filtreler.Sepia)
            {
                bmpAfter = ApplySepia(bmpBefore);
                pictureBoxAfter.Image = bmpAfter;
            }
}

ApplyGrayscale’a gönderilen bitmap’ın bir kopyasını oluşturarak bmpFilter nesnesini yaratıyorum. Daha sonra resimde bulunan her pixeli işlemem gerektiğinden bunun için bir for yazıyorum.

GetPixel methodu ile  i ve j’ ye göre resmin o noktasında bulunan pixeli Color nesnesine atıyorum.Grayscale filtresinin formülüne göre  pixeldeki red,green ve blue değerlerinin ortalamasını buluyorum. Daha sonra red,green ve blue değeri, bulduğum ortalama değer olacak şekilde yeni bir renk yaratıyorum.

SetPixel  methodu ile de pixelin rengini değiştiryorum.

Örneğin Red=100, Green=120, Blue=170 olan bir pixelin yeni değerini bulmak için RGB değerlerinin ortalamasını alıyorum. (100+120+170)/3=130 yapıyor.  Daha sonra Red=130 Green=130 ve Blue=130 değerleri ile yeni bir renk oluşturarak pixelin rengini değiştiriyorum.

public Bitmap ApplyGrayscale (Bitmap bmp)
{          
            Rectangle rc = new Rectangle(0, 0, bmp.Width, bmp.Height);
            Bitmap bmpFilter = bmp.Clone(rc,bmp.PixelFormat);
            for (int i = 0; i < bmpFilter.Width; i++)
            {
                for (int j = 0; j < bmpFilter.Height; j++)
                {
                    Color c = bmpFilter.GetPixel(i, j);
                    int total = c.R + c.G + c.B;
                    int average = total / 3;
                    Color NewColor = Color.FromArgb(average, average, average);
                    bmpFilter.SetPixel(i, j, NewColor);
                }
            }
            return bmpFilter;
}

ApplySepia fonksiyonu ise benzer şekilde ilerliyor. Sadece filtrenin formülü farklı.Onuda buradan buldum. RGB değerleri 255’den büyük olamayacağı için önlem olarak formülün değeri 255 den büyükse 255 değerini ataması için Math.Min fonksiyonunu kullanıyorum.

 public Bitmap ApplySepia(Bitmap bmp)
{
    Rectangle rc = new Rectangle(0, 0, bmp.Width, bmp.Height);
    Bitmap bmpFilter = bmp.Clone(rc, bmp.PixelFormat);
    for (int i = 0; i < bmpFilter.Width; i++)
    {
          for (int j = 0; j < bmpFilter.Height; j++)
          {
            Color c = bmpFilter.GetPixel(i, j);
            int Red = Math.Min((int)((.393 * c.R) + (.769 * c.G) + (.189 * c.G)), 255);
            int Green = Math.Min((int)((.349 * c.R) + (.686 * c.G) + (.168 * c.G)), 255);
            int Blue = Math.Min((int)((.272 * c.R) + (.534 * c.G) + (.131 * c.G)), 255);
            Color NewColor = Color.FromArgb(Red, Green, Blue);
            bmpFilter.SetPixel(i, j, NewColor);
           }
     }
            return bmpFilter;        
}

Resim çıktıları:

Orjinal Resim
Orjinal Resim
Sepia
Sepia
grayscale
Grayscale

Sizde yukarıdaki kodlara benzer şekilde formülünü bildiğiniz bir filtreyi oluşturabilirsiniz. Ya da yeni formüller de yaratabilirsiniz.

Yukarıdaki programda filtreleri uygulama süresi 2,5 saniye gibi bir süre. Bu süre uzun bir süre. İlerleyen yazılarda görüntü işlemenin performansını nasıl arttıracağmızdan bahsedeceğim.

Kafa karıştırmaması açısında şimdilik performans konusuna girmedim. Yine ilerleyen yazılarda bu uygulamanın mobil versiyonunu da yazmayı düşünüyorum. Sonraki yazılarda görüşmek üzere.

Java – Selenium İle Web Sitelerinden Veri Çekmek

İnternet dünyasındaki bir web sitesinden istediğiniz bilgileri programatik bir şekilde çekebilirsiniz.

İnternette veri çekmek = İlgilendiğiniz herhangi bir web sayfasının kaynak kodunu indirip, html elementleri üzerinden belli bir mantık içerisinde gezip, istediğiniz bilgiyi almak anlamına geliyor.

Bu işlemleri yapmak için hemen hemen tüm yazılım geliştirme dillerinde kullanabileceğimiz kütüphaneler mevcut.

Eğer aradığınız bilgiler; sayfanın kaynak kodunda yer alıyorsa, bilgiyi almak çok basit bir işlem gerektiriyor.

Ancak; açtığınız web sayfasının içeriği o anda JavaScript ile yükleniyorsa; bir browser gibi davranıp, önce sayfayı açmanız, JavaScript kodlarını çalıştırarak içeriği oluşturmanız ve sonra bilgiyi çekmeniz gerekmektedir.

Örnek amaçlı bu işelemleri yaparken; bu yazıya konu olan bir video çektim.

Yazdığım uygulamanın kaynak kodlarını yakında paylaşıyor olurum.

Web sayfalarından veri çekmek için; Java programlama dilinde kullanabileceğiniz, popüler olan ve benim de deneyimlediğim üç kütüphane mevcut.

Üç kütüphane ilgili ilgili detay bilgi almak isteyenler için linklerini aşağıdaki gibi paylaştım.

Popüler Java Web Crawler/Scraper Kütüphaneleri

AFORGE Kütüphanesi İle Resimdeki Şekillerin Tespiti

Bu yazıda Aforge kütüphanesini kullanarak şekil tespiti yapacağız. Bu konuyu daha kolay anlayabilmek için Aforge kütüphanesi , bitmap sınıfı , graphics sınıfı ve blob bulma yazılarını okumanızı tavsiye ederim.

SimpleShapeChecker ile Şekil Tespiti

SimpleShapeChecker Aforge kütüphanesinde yer alan şekillerin tespiti için kullanılan bir sınıftır. Şekilleri bulmadan önce bloblar çıkarılır. Çıkarılan bloblar SimpleShapeChecker sınıfına gönderilir. Bu sınıfta blobları yorumlayarak  şekillerin tespitini sağlar.

Şekil tespiti yapmadan önce resmi bir ön işlemeye tabi tutacağız. Resimdeki şekillerin daha kolay tespitini sağlamak için arkaplanı siyah yapmamız gerekiyor. Bunun için öncelikle resmi grayscale‘e çevireceğim. Resmi grayscale çevirmeden önce grayscale fonksiyonun desteklediğini bildiğim Format24bppRgb  formatına çeviriyorum.

Rectangle rct = new Rectangle(0, 0, bmp.Width, bmp.Height);
bmp = bmp.Clone(rct, PixelFormat.Format24bppRgb);

Ardından grayscale filtresini uyguluyorum.

Grayscale gfilter = new Grayscale(0.2125, 0.7154, 0.0721);
bmp = gfilter.Apply(bmp);

Daha sonra BradleyLocalThresholding filtresi uygulayacağım. Bu algoritma parlaklığı, belirtilen boyuttaki pencerenin çevre piksellerin ortalama parlaklığının altındaysa, her görüntünün pikselinin siyaha ayarlanması, aksi halde beyaza ayarlanmasını sağlar.Detaylı bilgiye buradan ulaşabilirsiniz. Aşağıda bir örneği verilmiştir.

bradleylocalthresholding
Before
bradleylocalthresholding
After

 

 

 

 

 

 

BradleyLocalThresholding thfilter = new BradleyLocalThresholding();
thfilter.ApplyInPlace(bmp);

Daha sonra Invert filtresi uygulayarak resmi tersine çevirerek  beyaz olan yerleri siyah, siyah olan yerleride beyaz yapıyorum.  Böylelikle arka planı siyah renge çevirmiş oldum.

Invert ifilter = new Invert();
ifilter.ApplyInPlace(bmp);

Bütün ön işleme adımları bir fonksiyonda topluyorum.

public Bitmap PreProcess(Bitmap bmp)
{
Rectangle rct = new Rectangle(0, 0, bmp.Width, bmp.Height);
bmp = bmp.Clone(rct, PixelFormat.Format24bppRgb);
Grayscale gfilter = new Grayscale(0.2125, 0.7154, 0.0721);
Invert ifilter = new Invert();
BradleyLocalThresholding thfilter = new BradleyLocalThresholding();
bmp = gfilter.Apply(bmp);
thfilter.ApplyInPlace(bmp);
ifilter.ApplyInPlace(bmp);
return bmp;
}

Öncelikle graphics kullanarak bulduğum şekilleri çizdireceğim. Bunun için resmin bir kopyasını oluşturarak graphics sınıfının desteklediği formata çeviriyorum. Ve resmi ön işlemeye fonksiyona göndererek ön işleme adımını gerçekleştiriyorum.

Rectangle rct2 = new Rectangle(0, 0, bmp.Width, bmp.Height);
Bitmap bmp2 = bmp.Clone(rct2, PixelFormat.Format24bppRgb);
bmp = PreProcess(bmp);

Ardından resimdeki blobları buluyorum.

BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, bmp.PixelFormat);
            BlobCounter blobCounter = new BlobCounter();
            blobCounter.FilterBlobs = true;
            blobCounter.MinHeight = 4;
            blobCounter.MinWidth = 4;
            
            blobCounter.ProcessImage(bitmapData);
            Blob[] blobs = blobCounter.GetObjectsInformation();
            bmp.UnlockBits(bitmapData);

Ardından SimpleShapeChecker nesnesi yaratıyorum. Graphics sınıfı ile bulduğum şekilleri resmin üzerinde çizdireceğim.Resimleri çizdirirken şekilleri ayırmak için farklı renkler kullanacağım bu yüzden her biri için ayrı bir Pen nesnesi yaratıyorum.

SimpleShapeChecker shapeChecker = new SimpleShapeChecker();     
Graphics g = Graphics.FromImage(bmp2);       
Pen yellowPen = new Pen(Color.Yellow, 2); // bilinmeyen şekiller
Pen redPen = new Pen(Color.Red, 2);       // Dikdörgenler
Pen DarkGreenpen = new Pen(Color.DarkGreen, 2);   // Yamuk
Pen OrangePen = new Pen(Color.Orange, 2);   // 
Pen bluePen = new Pen(Color.Blue, 2);     // Kare

Resimde her bir blobu yorumlamak için for döngüsü kullanıyorum. GetBlobsEdgePoints methodu ise bize blobların kenar noktalarını verir.

 for (int i = 0, n = blobs.Length; i < n; i++)
{
             
  List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]);
  List<IntPoint> corners;
      if (shapeChecker.IsConvexPolygon(edgePoints, out corners))
       {
        PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners);
                 //işlemler
       }

}

IsConvexPolygon methodu bize eğer kenar noktaları bir çokgen ise true değerini döndürür. ve köşe noktalarını da geri alırız. (Referans türü değişkenler olduğu için).CheckPolygonSubType çokgenin köşe noktalarını alır ve bize çokgenin tipini döndürür.Daha sonra PolygonSubType’ı kullanarak şekil ayrımı yaparız.Çokgenin tipine göre de farklı renklere boyarız. Örnek program çıktısı

Şekiller

Kodların tamamı:

for (int i = 0, n = blobs.Length; i < n; i++)
{
  List<IntPoint> edgePoints = blobCounter.GetBlobsEdgePoints(blobs[i]);
  List<IntPoint> corners;
  if (shapeChecker.IsConvexPolygon(edgePoints, out corners))
  {
  PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners);
  Pen pen;
     if (subType == PolygonSubType.Unknown)
      {
        pen = yellowPen;
      }
       else if (subType == PolygonSubType.Square)
      {
        pen = bluePen;
                      
      }
      else if (subType == PolygonSubType.Rectangle)
      {
        pen = redPen;

      }
      else if (subType == PolygonSubType.Trapezoid)
      {
       pen = DarkGreenpen;
      }         
      else
      {
       pen = OrangePen;   
      }
        g.DrawPolygon(pen, ToPointsArray(corners));
   }
            
                pictureBox1.Image = bmp2;

}
private System.Drawing.Point[] ToPointsArray(List<IntPoint> points)
{
 System.Drawing.Point[] array = new System.Drawing.Point[points.Count];

 for (int i = 0, n = points.Count; i < n; i++)
 {
  array[i] = new System.Drawing.Point(points[i].X, points[i].Y);
  }
  return array;
}

 

Aforge Kütüphanesi Kullanarak Blob Bulma

Bu bölümde Aforge kütüphanesi kullanarak resimdeki blobları bulmayı göreceğiz. Görüntü işlemede blobları kullanarak şekil tespiti sağlanabilir. Bir sonraki yazımda da bu konuya ayrıca değineceğim.

Blob Nedir?
Blob bir resmin içinde bulunan görüntü parçalarıdır. Örnek olarak aşağıdaki resimdeki her bir harf bir blobdur. Resminde bloblar kırmızı ile çizilmiştir. Bloblarını incelersek i harfi iki blobldur.I ve nokta kısmı birer ayrı blobldur çünkü bunların birbirleri ile bağlanan bir noktası yoktur. Özetle bloblar birbiri ile bağlantılı noktaların bir bütünüdür.

Blob

Gene şekilden inceleneceği gibi Ö harfi için O ve noktalar ayrı birer bloblardır.
Aşağıdaki resimdeki iki şeklin arasında herhangi bir bağlantı olmadığından ikisi de ayrı birer blobdur.

blob nedir?

Bir resim içerisinde bloblar  Aforge kütüphanesindeki BlobCounter sınıfından yararlanılarak bulunabilir.
Blob bulunmadan önce bitmap resmi kilitlenir. Bu sayede blob bulunurken diğer fonkisyonlar tarafından resmin değişikliğe uğmaması sağlanır. Ardından da bitmapdata sınıfına aktarılır.

BitmapData bitmapData = bmp.LockBits(
               new Rectangle(0, 0, bmp.Width, bmp.Height),
               ImageLockMode.ReadWrite, bmp.PixelFormat);

Blobcounter nesnesi yaratılır. BlobCounter sınıfı AForge.Imaging altında yer alır.

BlobCounter blobCounter = new BlobCounter();

Bloblar bulunmadan önce büyüklük bakımından filtrelenebilir. Bu sayede küçük gürültü verileri yada istemediğimiz büyüklükteki blobların bulunması engellenir.
Filtere uygulamadan aşağıdaki kod ile filtre uygulanacağının belirtirmesi gerekir.

blobCounter.FilterBlobs = true;

Örneğin blobun genişlik bakımında minumum 4 pixel,maximum 8 pixel,yükseklik bakımından minumum 4 pixel,maximum 8 olmasını istiyorsak aşağıdaki kodu kullanabiliriz.

blobCounter.MinWidth = 4;
blobCounter.MinHeight = 4;
blobCounter.MaxWidth = 8;
blobCounter.MaxHeight = 8;

Blobları bulmak içinse ProcessImage methodunu kullanarak belirlediğimiz filtelere göre blob bulunması sağlanabilir. Bu fonkisyon belirli formattaki resimleri destekler.

blobCounter.ProcessImage(bitmapData);

Blobları bulduktan sonra blob sınıfı içerinsinde tutmak için

Blob[] blobs = blobCounter.GetObjectsInformation();

kodunu kullanabiliriz.Eğer blob görüntüsünün imageleri üzerinde çalışacaksak

Blob[] blobs= blobCounter.GetObjects(bmp, false);

kodunu kullanabiliriz.  Blobun resmini ise

Bitmap blobresmi= blobs[i].Image.ToManagedImage();

koduyla çekebiliriz.Bitmap resmi ManagedImage bir resimdir.Ancak blob resmi geri döndürürken UnmanagedImage resim geri döndürür.Bu yüzden bir dönüşüm yaparak resim ToManagedImage(); methodu kullanırak ManagedImage olan bitmap nesnesine atanması sağlanmıştır.
Örneğin “Araba” yazan bir resimde 6 tane blob vardır. Her bir harf bir blobdur. Aşağıdaki kod ile

Bitmap blobresmi= blobs[0].Image.ToManagedImage();

Araba kelimesinde büyük A harfinin bize resmini verir.

Kodları birleştircek olursak önce bitmap nesnesini kilitliyoruz daha sonra bir BlobCounter nesnesi yaratıyoruz. Ardından filtreleri belirliyoruz. Daha sonra ProcessImage methodu ile resmin bloblarını buluyoruz. Buluduğumuz tüm blobları blobs dizisine atıyoruz. Son olarakda Bitmap üzerindeki kiliti kaldırıyoruz. Bir sonraki yazıda bulduğumuz blobları kullnarak şekil tespiti yapacağız.

BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, bmp.PixelFormat);
            BlobCounter blobCounter = new BlobCounter();
            blobCounter.FilterBlobs = true;
            blobCounter.MinHeight = 4;
            blobCounter.MinWidth = 4;
            
            blobCounter.ProcessImage(bitmapData);
            Blob[] blobs = blobCounter.GetObjectsInformation();
            bmp.UnlockBits(bitmapData);

Graphics Sınıfı Kullanımı

Bir önceki bölümde değindiğimiz  Bitmap Sınıfı, RGB ve DPI Kavramı konusundan sonra bu bölümde de Bitmap sınıfı üzerinde işlem yapmamızı sağlayacak Graphics sınıfına değineceğiz.

Graphics Kullanımı

Bir resmin üzerine şekiller çizmek için graphics kullanılabilir. Grapchics kullanarak resmin üzerine şekil çizmek istersek ,tıpkı filtereler gibi resmin belirli bir formtlarda olması gerekmektedir.Graphics nesnesi

  • Format1bppIndexed
  • Format4bppIndexed
  • Format8bppIndexed

Formatlarını desteklemez.Bu formatlı resimler kullanıldığında “A Graphics object cannot be created from an image that has an indexed pixel format.” şeklinde bir hata mesajı ile karşılaşılır.

Bir Graphics nesnesi yaratırken FromImage methodunu kullanarak hangi resim üzerinde işlem gerçekleştireceğimizi belirtebiliriz.

Graphics g = Graphics.FromImage(bmp);

Çizilecek şeklin hangi renkle çizileceğini belirtmek Pen sınıfını kullanılır. İkinci parametre ise kalemin kalınlığını belirler.

Pen pensiyah=new Pen(Color.Black,2);

Dikdörtgen çizmek için DrawRectangle methodu kullanılır. İlk parametre çizilicek kalemi belirtilir. Daha sonra rectangle verilerek hangi koordinata çizelceği belirtilir.

g.DrawRectangle(pensiyah, new Rectangle(0, 0, 40, 50));

Aşağıdaki kod ile graphics kullanarak, bir resmin üzerine bir resim de çizelebilir.

g.DrawImage(bmp,new PointF(100,200));

Drawline methodu kullanarak da iki nokta arasında bir çizgi çizebiliriz.

g.DrawLine(new Point(3, 5), new Point(8, 9));

DrawPolygon methodu ile de poligonlar çizebiliriz. Fonksiyonun ikinci paramteresi bir Point dizisi almaktadır. Bu sayede kaç tane nokta olursa olsun o noktaları birleştirerek bir poligon oluşturur.

Point noktalar=new Point[4];
g.DrawPolygon(pen,noktalar);

FillRectangle  methodunu kullanarak içi dolu bir diktörgen çizebiliriz. DrawRectangle methodundan farklı olarak FillRectangle methodunda çizilen dikdörtgenin içininde boyalı olarak gelmesidir. Bunun için  SolidBrush sınıfı parametere olarak verilmelidir.Brush sınıfını oluşturken ise hangi renkte olacağını belirtiriz.

SolidBrush brush = new SolidBrush(Color.Black);
g.FillRectangle(brush,new Rectangle(5,5,30,40));

FillRectangle ve DrawRectangle farkı

SSH anahtar doğrulaması

SSH Anahtar Doğrulaması nedir?

Sadece kullanıcı adı ve parola ile güvenliği sağlamanın yetersiz olduğu bir dönemde yaşıyoruz. SSH’ın doğrulama yollarından biri açık anahtar doğrulaması da bu yetersizlikten kaynaklanan ihtiyacımıza karşılık verip açık ve gizli anahtarlar kullanarak bir güvenlik sağlamakta. Nasıl çalıştığına gelecek olursak, şu şekilde hayal edebilirsiniz. Evinizde çok kompleks bir anahtar deliği bulunduruyorsunuz ve bunu hangi anahtarların açabileceğine siz karar veriyosunuz. Karar verme aşaması şu şekilde oluyor; arkadaşınız size anahtarını getiriyor siz de onu tanıdığınız anahtarlar listesine ekliyorsunuz ve artık arkadaşınız evinize girebiliyor. Evde bulundurduğunuz anahtara gizli(private) arkadaşlarınızda bulundurduğunuz anahtarlara da açık(public) key deniliyor.

Teknik olarak örnek vermek gerekirse, aşağıda gördüğünüz bir private key (evinizdeki anahtar).

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwDQo509zJ/MzTQr54zWj6xYJ7UjATLFoTADDZpMQq1bOnMGB
L7+qBr9z8gfU4CEP2YLsEwWPY/VMpkx8q3OfgcUEte7gPnOyXx5WB/WsJcdxug1h
Z75rYEKJZLTgunPO5YDQl9NnhwMxtQuunXjBDO+/NpyMd0IlFNBfU8rDr2wQjLYd
W6TSc+ufvESb3GLyPhvAhgbFlav4l6YT1IL12ML6EmIUZFMEhPsYJ/Mz04qmgoft
3e/Z9k03vFDQwhbD4I/45NhvTxiNNoDBuJKiKnjoSvVBfAR+uYbSbt27mV9dGQ9F
a4Y0flJRzHtBrwpOEtrtMXyHG8bTdVvARdNMhQIDAQABAoIBACnKraIuClIDdYIp
AtC+lxfEwP/RM875PD5aZCJnk9ZNl7tJ7/cb67Jv6pwTy9u4FKQs7XvtV5JaggIe
23TEPUiQOEf+2s95hK1eAULVzkqgpW/ZLPbL1rklfo5hLgQcrj4E1lZM51PaA/Lj
yWIAIanYb3FGdNxxi3KNJE0p54a6zh7IgBYsvWWbfg4M2d/eunkhLOveQilOvcJp
pVnIl9WHFX8NqohElYv3Sc7ISY87h4gPRYpQfLbV4yDCpM120TjmCM2QB+GBUNid
K1rQ7RU8DP5d6CGQ9QY47Pzozp3CIcdGHuc30gLjxOO8MJ08s4691nrtGZzbgNoJ
v1RecnkCgYEA36F4PUY5+Q6zSX48FSz+iFOPgVwH3vs+VKfmhtqzXm73Ieeq++VL
psOcbvDzizUkzThgYV/JOEWZcFkvSnhG2K+IFFta4NQOvb8u781iKOn1IE09FgFo
kYgbLJtFz6HJbniaKhAa28Qs1zXZVtn1fbzL09270mklgJOOM8gzCg8CgYEA3AYt
jCzmkDM5x7eIHUEKeafwtKLFRNXsETbdMnFi6R2SlvzZDot58yRFAtvFaQgVdcV8
ta0AvjsOpWLPysTFV8//ayxhnPf7Eqf342GAT8ALl4OmTcP1TzA8V6VtY6zWlAW+
1OkdEcDC7WSifGUC5NOAOFIkuYyPeMvWy0tBpCsCgYEAhcnsTXw+IqqQyF8lQuXw
QU78g7+zVckezzbDy9n7hXuNjlMzEBBV+ib858JvcdERe1VHE/piP7Aj4/r3N+5N
NEWPe95LuEYlq489XWnaV+/gHrsW2JtvG+H5n+4lDdsUz2qHkLKh3ui2iupEZJlo
zOiuaMo3G+Kb9RhR8tjK8DECgYBDFMscOrBM9KFAJ8+jA6p67t3vZNT6KLKhiPWl
pHZAlpiT2iEfUxzqKXu05GZqoGFSl9Ru24Enfn/3oomxy45TOIIqHczg+6YbyQRF
2fsx1V5zYlr4yK7o5s7u9evFAPQnCx1kcnI/cGK91/nGLVHVjDpCcaDqxVUUwikJ
sDciIwKBgQDKvgP7zVkf3Hc9LaYmJHhqyRmX8ohy0dzf8L4Ws+wrj1bl4muqdzxV
gJCNbcNH4RITMshnaAtxQhXqAyg6C1vQWvExGVbC9jc0YWJLFGFf227HTT9lCCBO
iMwBLFOR8dKsTYKQYnWJYr0yND6oGSi/Nwmv5GlREVjZXLWN2jC+Zg==
-----END RSA PRIVATE KEY-----

Buradaki ise bir açık anahtar

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDANCjnT3Mn8zNNCvnjNaPrFgnt
SMBMsWhMAMNmkxCrVs6cwYEvv6oGv3PyB9TgIQ/ZguwTBY9j9UymTHyrc5+BxQS1
7uA+c7JfHlYH9awlx3G6DWFnvmtgQolktOC6c87lgNCX02eHAzG1C62deMEM7782
nIx3QiUU0F9TysOvbBCMth1bpNJz65+8RJvcYvI+G8CGBsWVq/iXphPUgvXYwvoS
YhRkUwSE+xgn8zPTiqaCh+3d79n2TTe8UNDCFsPgj/jk2G9PGI02gMG4kqIqeOhK
9UF8BH65htJu3buZX10ZD0VrhjR+UlHMe0GvCk4S2u0xfIcbxtN1W8BF00yF 
volgaa@teknohaber

Açık anahtarı eğer sunucunuzdaki ~.ssh/authorized_keys dosyasına eklerseniz bu açık anahtarı bulunduran kişi sizin sunucunuza girme yetkisi kazanır.

 

Anahtar Oluşturma

Anahtar oluşturmak için şu adımları izleyebilirsiniz.

Öncelikle terminalinizde ssh-keygen -t rsa komunutunu çalıştırabilirsiniz.

ssh-anahtar-olusturmaBurada -t type anlamına geliyor ve oluşturduğunuz anahtarın tipini (rsa) sonrasında parametre olarak giriyorsunuz.

Komut çalıştıktan sonra eğer her seçeneği default olarak bırakıp devam ettiyseniz public key’iniz ~./ssh/id_rsa.pub içinde olacak.

O dosyanın içeriğini sunucunuzdaki ~.ssh/authorized_keys içine eklerseniz anahtar eşlemesini yapmış olursunuz.

Sonrasında

ssh kullanici_adi@sunucunuzun_ip_adresi ile sunucunuza bağlanabilirsiniz.

 

Gizli Anahtar ile Erişim

İstediğiniz kişilerle gizli anahtarınızı paylaşabilirsiniz. Bu kişiler sadece bu anahtarı kullanıp sunucunuza giriş yapabilirler.

Yapmaları gereken;

  • Gizli anahtarınızı (private key) dosya_adi.txt içine kaydetmek (herhangi bir dosya olabilir) (BEGIN ve END ifadeleri de yer almalı)
  • Dosyaya 400 ya da 600 izin hakkını vermek.
    • chmod 400 dosya_adi.txt
  • ssh -i dosya_adi.txt kullanici_adi@sunucunuzun_ip_adresi

    ile de bağlantınızı gerçekleştirebilirsiniz.

Bitmap Sınıfı, RGB ve DPI Kavramı

AFORGE Kütüphanesi Ve Filtreleri konulu yazımdan sonra Bitmap Sınıfı, RGB ve DPI kavramları ile ilgili detaylı bilgiler vermek istiyorum.

Yazımını bu bölümünde; görüntü işleme yaparken kullanacağımız bitmap sınıfını, RGB ve dpi kavramını inceleyeceğiz.

DPI Nedir?

Dpi : Dots per inch , Bir inç karedeki nokta sayısı demektir. 1 inç yani 25.4 mm uzunluk için nokta adedi anlamına gelir. Diğer bir ifade ile 1 mm için 15.7 noktadır.

Çözünürlük yükseldikçe görüntü kalitesi doğru orantılı olarak yükselir. Örneğin çözünürlüğü 600×600 dpi olan bir görüntü ya da bir tarayıcı tarafından taranan bir dokümanın eni ve boyu her inch için 600 nokta ile taranmış, baskılarda ise baskı yapılmış anlamına gelmektedir.

Bir örnekle açıklamak gerekirse;

400 dpi’ nın milimetrik karşılığı 1 mm de 15.7 noktadır. Örnek olarak, 500 mm boyu 300 mm eni olan bir fotoğrafı tarayıcı vasıtası ile taratalım.

Tarama yoğunluğu enine 500×15.7=7850 nokta, boyuna 300×15.7=4710 noktadır. Buna göre bu boyuttaki taramada toplam nokta sayısı 7850×4710=36,973500 noktadır.

Bir bitmap resminin dpi değeri aşağıdaki kod örneği ile bulabilirsiniz.

float dikeydpi=bmp.VerticalResolution;
float yataydpi = bmp.HorizontalResolution;

 

Dpi kavramı
DPI’ları faklı aynı boyuttaki iki resiminden, dpi’i yüksek olan daha fazla nokta ile gösterilir.
DPI'ı yüksek olan resim daha kalitelidir.
DPI’ı yüksek olan resim daha kalitelidir.

RGB Nedir?

İngilizcedeki ‘Red’ ‘Green’ ‘Blue’, yani ‘Kırmızı’ ‘Yeşil’ ‘Mavi’ kelimelerinin baş harflerinden ismini alan bir renk uzayı olup en sık kullanılanlardandır.

Işığı temel alarak, doğadaki tüm renklerin kodları bu üç temel renge referansla belirtilir. Her renk %100 oranında karıştırıldığında beyaz ve %0 oranında karıştırıldığında ise siyah elde edilir.

Bu uzayda, ana renkler olan kırmızı, mavi ve yeşil belirtilmediği için, bu ana renklerin tanımı değiştikçe, tüm renkler değişir.

Bir bitmap nesnesinde ilgili pixeli RGB değerlerini bulunabilir.

Color c = bmp.GetPixel(100, 20);
byte r=c.R;//red değeri
byte g=c.G;//green değeri
byte b=c.B;//blue değeri

Bitmap Sınıfı Nedir?

C# dilinde bitmap sınıfı ,resimler üzerinde işlem yapmamızı sağlayan ve içerisinde işimizi kolaylaştıracak birçok methodu olan bir sınıftır. Bir bitmap nesnesi aşağıdaki kod parçacığı ile tanımlanabilir. 

String dosyakonumu;
Bitmap bmp = new Bitmap(dosyakonumu); 

Belirtilen dosya konumundan resmi alarak üzerinde işlem yapmamızı sağlayacaktır.

Bitmap nesnesinin 12 tane kurucu methodu vardır.

Herhangi bir resim üzerinde işlem yapmayıp kendi resmimizi oluşturmak istiyorsak;

Bitmap  bmp = new Bitmap(2480,3500);

Şeklinde resmin width ve height değerini vererek oluşturabiliriz. Dilersek aşağıdaki kodu kullanarak oluşturduğumuz resmin pixel formatını da belirleyebiliriz.

Bitmap bmp = new Bitmap(2480,3500,PixelFormat.Format24bppRgb);

Resmi oluşturduktan sonra dpi değerini belirlemek istersek aşağıdaki kodu kullanabiliriz.

bmp.SetResolution(300,300);

Oluşturduğumuz resmin arka planını ise FillRectangle kullanarak istediğimiz renge boyayabiliriz.

 using (Graphics grp = Graphics.FromImage(bmp))
{
  grp.FillRectangle( Brushes.White, 0, 0, bmp.Width, bmp.Height);
}

Bir bitmap nesnesini transparan yapmak istiyorsak ;

bmp.MakeTransparent();

methodunu kullanabiliriz. Bir Resmin herhangi bir pixelde rengini değiştirmek istiyorsak setpixel methodunu kullanabiliriz.Örnek olarak;

Color mavi = Color.Blue;
bmp.SetPixel(100,200,mavi);

yaparsak yukarıda x=100 ve y=200 pixelin rengini mavi renge çevirmiş olur.

Eğer oluşturduğumuz resmi kaydetmek istersek save methodunu kullanırız. Resim kaydedileceği dosya yolunu girdikten sonra nokta kullanarak resmin hangi formatta kaydedileceğini belirleriz.

bmp.Save("resim.jpg");

Oluşturduğumuz her resim bellekte bir yer kaplamaktadır. Tek resim üzerinde çalışıyorsak resmin bellekte olup olmaması çok önemli olmayabilir ancak 10000 resmin üzerinde çalışıyorsak kullandığımız resmin işi bittiği anda bellekten silmeliyiz.

Eğer bellekte yer kaplamaya devam ederse ve sistem belleğinin boyutunu aşarsa OutOfMemoryException hatası alırız.

Bu hatadan kaçınmak için işimiz bittiği anda

bmp.Dispose();

kodunu kullanarak resmi bellekten silmeliyiz.

Bir bitmap resmini kırpmak için bitmap nesnesi içinde bulunan Clone fonksiyonu kullanılır. Bu fonksiyon iki parametre alır. İlk olarak bir Rectangle  nesnesi ve 2.parametre olarak da PixelFormat alır.

Bir resmin belirli bir bölümü kırpmak istiyorsak rectangle değerlerini resmi kırpacağımız bölüme göre ayarlamalıyız. Resmi kırparken 2. Parametre ile resmin pixel formatını da değiştirebiliriz

Örnekte resmi ortadan ikiye bölen ve pixel formatını 24 olarak yapan kod bloğu verilmiştir.

Rectangle rct2 = new Rectangle(0, 0, bmp.Width, bmp.Height/2);
bmp = bmp.Clone(rct2, PixelFormat.Format24bppRgb); 

Resmi kırpmadan sadece pixel formatını değiştirmek için de aşağıdaki kod kullanılır.

Rectangle rct2 = new Rectangle(0, 0, bmp.Width, bmp.Height);
bmp = bmp.Clone(rct2, PixelFormat.Format24bppRgb);

Bu bölümde Bitmap sınıfının en çok kullanılan özellikleri üzerinde durulmuştur. Tabi ki işimizi kolaylaştıracak bir çok methodu vardır. İhtiyaça göre araştırılıp kullanılabilir.

Bir sonraki yazıda görüşmek dileğiyle…

AFORGE Kütüphanesi Ve Filtreleri

Aforge kütüphanesi C# dilinde görüntü işleme amacıyla kullanılan bir kütüphanedir.

Kütüphane içinde şekil kontrolünü sağlayan sınıflar, resimlere çeşitli filtrelerin uygulanmasını sağlayan sınıflar ve buna benzer birçok görüntü işleme için kullanılan çeşitli sınıflar bulunmaktadır.

Aforge kütüphanesi aforgenet.com’dan indirilip aşağıdaki resimde görüldüğü üzere bir c# projesine eklenebilir.

ekleme1ekleme2

Aforge kütüphanesinde resimlere uygulanacak bazı filtreler vardır.

Bu filtreler AForge.Imaging.Filters Namespace‘ si altında toplanmıştır. Filtreleri uygulamak için referans olarak Aforge kütüphanesi eklendikten sonra  using AForge.Imaging.Filters; satırı ile ilgili bölüme eklenmelidir.

Ekleme işlemi tamamlandıktan sonra resimlere filtreler uygulanabilir. Bazı filtreler aşağıda gösterilmiştir.

Resim grayscale çeviren filtredir.

Grayscale filter = Grayscale.CommonAlgorithms.BT709;
bmp = filter.Apply(bmp);

ekleme3
Before
ekleme4
After

 

 

 

 

 

Bu filtre ise resmi tersine çevirir. Örneğin resimdeki siyah renkleri beyaz yaparken beyaz renkleri de siyah yapar.

Invert filter = new Invert();
filter.ApplyInPlace(bmp);
ekleme3
Before
ekleme5
After

 

 

 

 

 

Filtreler uygulanırken dikkat edilmesi gereken nokta filtre uygulanacak olan resmin pixel formatıdır.

Filtreler her resim formatını desteklemez. Sadece belirli formatları destekler. Resimlere filtre uygulamadan önce ilgili filtrenin hangi resim formatlarını desteklediği bulunmalıdır.

Örneğin Aforge kütüphanesinde invert filtresi için; aşağıdaki resimde belirtildiği üzere 8,16,24 ve 48 pixel formatlarını desteklemektedir.

ekleme6

Filtre uygulayacağımız resmin formatını bulmak için de aşağıdaki kod örneğindeki gibi kontrol sağlanabilir.

Bitmap bmp = new Bitmap("resim.bmp");
if (bmp.PixelFormat==PixelFormat.Format24bppRgb)
{
   //işlemler
}

PixelFormat System.Drawing.Imaging altında bulunmaktadır. Eğer desteklenmeyen bir formattaki resme filtre uygulamaya çalışırsak çalışma zamanlı bir hata alınır.

Bütün Detayları İle Birlikte HADOOP

HDTeknoHaber.com Ekibi olarak Hadoop ile ilgili bu yazı serisini hazırladık.
Hadoop nedir? Hadoop hangi alanlarda kullanılır? Hadoop kullanımına örnek? Hadoop’ u hangi firmalar kullanıyor?
Tüm bu sorularınızına cevap bulacağınız yazı serisini okuyabilirsiniz. Yorumlarınızı – sorularınızı yorum kısmında belirtmenizi rica ederiz.


HADOOP


MapReduce ve HDFS mimarilerini kullanarak bir işi birden fazla makinaya dağıtarak en kısa sürede tamamlamayı hedefleyen Java ile geliştirilmiş açık kaynak kodlu bir kütüphanedir. En önemli özelliklerinden biri herhangi bir sunucu da çalışabilmesidir. Aynı zamanda herhangi bir sunucu da problem olduğunda işi başka bir sunucuya yönlendirerek sorunsuz tamamlanmasını sağlar.
Kısaca açıklamak gerekirse; sıradan sunuculardan oluşan bir Cluster üzerinde Big Data işlemek için HDFS dağıtık dosya sistemini ve MapReduce özelliklerini bir araya getiren yazılımdır. Üzerinde tutarlı, ölçeklenebilir ve dağıtık çalışan projeler geliştirmeye imkan sağlayacak bir mimaridir. Hadoop un güçlü mimarisinin temelinde işlenen dosyaların her zaman ilgili Node dan okunması sayesinde trafik yaratmaması ve birden fazla işi aynı anda işleyerek doğrusal ölçeklendirme yapması yatar. Hadoop Cluster ındaki Node sayısı arttıkça performansı da paralelinde artar, doğrusal bir ilişki vardır.
Aşağıda MapReduce ve HDFS den başlıklar altında ayrıntılı şekilde bahsedilecek.


MAPREDUCE


Dağıtık mimari üzerinde çok büyük verilerin kolay bir şekilde analiz edilebilmesini sağlayan sistemlerden biridir. 2004 yılında Google tarafından duyurulan bu sistem, 1960?lı yıllarda geliştirilen fonksiyonel programlamadaki MAP ve REDUCE fonksiyonlarını kullanarak verileri işler.
Map aşamasında analiz edilen veri içerisinden almak istediğimiz veriler çekilir, Reduce aşamasında ise bu çektiğimiz veri üzerinde istediğimiz analiz gerçekleşir.
Daha iyi anlayabilmek için aşina olduğumuz RDBMS ile karşılaştırmamız gerekirse, Map aşaması SELECT cümlesi ile ilgili alanları seçmemize ve WHERE ile gerekli sınırlamaları yapmaya, Reduce aşaması ise COUNT, SUM, HAVING gibi veriler üzerinde hesaplama yapmamıza benzetilebilir.
Map aşamasında Master Node verileri alıp daha ufak parçalara ayırarak Worker lara dağıtır. Worker lar bu işleri tamamladıkça sonucunu Master Node lara döner.
Reduce aşamasında ise tamamlanan işler işin mantığına göre birleştirilerek sonuç elde edilir.
Map aşamasındaki işlemler birbirinden bağımsız olarak gerçekleşebildiği için paralel olarak çalışabilir. Bu sayede büyük miktardaki veri Cluster içerisindeki Node lar tarafından hızlı bir şekilde okunabilir. Cluster da yer alan Node sayısı arttıkça işlemlerde hızlanır. Reduce aşamasında ise aynı Key e sahip veriler paralel olarak işlenebilir.
Kısaca, çok büyük verileri işleyebilmek için yüksek donanıma sahip sunucular kullanmaya alternatif olarak, sıradan sunucularla (Commodity Hardware) oluşturulan bir Cluster üzerinde MapReduce yardımıyla aynı işlem hatta daha etkin biçimde işleyebilir. Google ?ın diğer arama motorlarına fark atmasını sağlayan etkenlerden biride MapReduce algoritmasıdır. Sosyal medyanın vazgeçilmez olduğu bu dönemlerde Facebook, Twitter, Linkedin gibi şirketlerde topladıkları Big Data yı işlemek için bu sistemi kullanmaktadırlar.
Son iki yılda web üzerinde üretilen verilerin geçen on yıldan çok daha fazla olduğunu düşünürsek ilerleyen zamanlarda MapReduce sisteminin daha çok değerleneceğini kestirebiliriz. Bilindik veritabanı sistemleriyle Petabyte seviyesindeki verilerin işlenebilmesi milyon dolarlık donanım ve yazılımla mümkün iken MapReduce sistemi buna ucuz yollu ciddi alternatif oluşturuyor.
Hadoop MapReduce ; JobTracker ve TaskTracker süreçlerinden oluşur. JobTracker yazılan MapReduce programının küme üzerinde dağıtılarak çalıştırılmasından sorumludur. Ayrıca dağıtılan iş parçacıklarının çalışması sırasında oluşabilecek herhangi bir problemde o iş parçacığının sonlandırılması ya da yeniden başlatılması da JobTracker ın sorumluluğundadır.
TaskTracker, DataNode ların bulunduğu sunucularda çalışır ve JobTracker dan tamamlanmak üzere iş parçacığı talep eder. JobTracker, NameNode un yardımıyla DataNode un lokal diskindeki veriye göre en uygun Map işini TaskTracker?a verir. Bu şekilde verilen iş parçacıkları tamamlanır ve sonuç çıktısı yine HDFS üzerinde bir dosya olarak yazılarak program sonlanır.
Aşağıda MapReduce ve HDFS başlıklar altında incelenmiştir.


JOB TRACKER


  •   MapReduce işlerini takip eder.
  •   NameNode gibi tektir.
  •   İşlemciler MapReduce işlerini JobTracker a gönderir.
  •   İşleri diğer düğümlere dağıtır.
  •   İş parçacıklarının durumunu takip eder.
  •   Bir iş parçacığında sorun olursa onu sonlandırıp yeni bir tanesini çalıştırır.
  •   Gerekli durumlarda aynı işi yapan birden fazla iş parçacığı çalıştırabilir.

TASK TRACER


  •   MapReduce işlemlerini çalıştırır.
  • DataNode ile aynı düğümde bulunur.
  •   JobTracker tarafından gönderilen iş parçacıklarından sorumludur.
  •   Map ve Reduce işlemlerini yapıp sonucu Job Tracker a iletir.

HADOOP DISTRIBUTED FILE SYSTEM (HDFS)


Bilindik dosya sistemlerdeki en büyük sorun veriye erişim hızıdır.
Geçtiğimiz yıllarda veriyi sakladığımız disklerin boyutlarının artmasına rağmen; transfer hızlarında aynı oranda artışlar olmadı. Terabyte boyutundaki diskler standart haline gelirken transfer hızları da 100MB/s seviyesinde kaldı. Bu da TB boyutundaki bir diskten veri okumamızın saatler sürebileceğini gösterir.
Buna çözüm olarak aynı anda birden fazla diskten okumanın işe yarayacağı düşünülebilir. 10 diskimizin olduğunu düşünürsek ve verilerimizi bu 10 diske paylaştırırsak; her disk toplam verimizin %10 unu tutmuş olur. Bütün diskleri aynı anda okursak da toplam geçecek zamanın 1/10 u kadar sürede işimizi tamamlarız. HDFS de bu mantıkla çalışarak birden fazla büyük boyutlu dosya üzerinde okuma imkanı sağlar.
HDFS; dağıtık yani birden fazla bilgisayar üzerinde çalışan bir dosya sistemidir ve amacı uygulama verilerinin kaydedilmesidir.
Birden fazla sunucu üzerindeki dosya sistemlerini birbirine bağlayarak büyük boyutlara sahip tek bir sanal dosya oluşturur. Yapısı gereği performans ve yüksek erişilebilirlik konusunda gelişmiş özelliklere sahiptir.
HDFS NameNode ve DataNode‘lardan oluşmaktadır ve Node ların her zaman %100 çalışamayacağını kabul ederek ve kesinti anında veri güvenliğini sağlayabilmek için verileri birden fazla Node üzerine kopyalar.
NameNode master işlem olarak veri gruplarının sunucular üzerindeki dağılımından, kaydedilmesinden, silinmesinden, sorun meydana geldiğinde yeniden oluşturulmasından ve her türlü dosya erişiminden sorumludur.
HDFS üzerindeki tüm dosyalar hakkındaki bilgiler NameNode tarafından saklanır ve yönetilir. Her kümede yalnızca bir adet NameNode olabilir.


NAME NODE


  •   Master düğümdür
  •   Her türlü dosya işleminden sorumludur.
  •   Veri değil sadece metadata saklar
  •   Her zaman ayakta olmak zorundadır
  •   Name node çalışmazsa ise tüm küme çalışmaz hale gelir.
  •   Hızlı erişim açısından verileri hafızada tutar.
  •   Çökmeye karşı diske bilgileri senkronize eder.

DataNode un görevi verileri saklamaktır.
Her DataNode kendi yerel diskindeki veriden sorumludur. Ayrıca diğer DataNode lardaki verilerin yedeklerini de saklar. DataNode lar küme içerisinde birden fazla olabilir.


DATA NODE


  •   Verilerin bulunduğu düğümdür.
  •   Blok halinde dosyaları saklar.
  •   Yedekli olduğu için kapanması halinde veri kaybı yaşanmaz.
  •   Veriler bu düğümlerde olduğu için analiz işlemleri de bu düğümlerde çalışır.
  •   Küme içerisinde birden fazla olmalıdır.
  •   4000+ düğüme kadar büyüyebilir.
  •   Sayıları arttıkça performansı da lineer olarak artar.

Hadoop un çalışmasını bir örnekle açıklayacak olursak:


Elimizde bir dosya olsun. Dosyanın her satırında bir araba markası ismi, ve o markadan kaç adet olduğu yazılı olsun . Amacımız her araba için toplam sayıyı bulmak.

  • Opel : 5
  • Fiat: 3
  • Porsche : 9
  • Opel : 10
  • Fiat: 9
  • Opel : 15
  • Volkswagen: 13
  • Porsche: 1
  • Mercedes : 16
  • Volkswagen: 8

Burada key değerleri model isimleri olacak. Diyelim ki Hadoop kümemizde 2 Node var, ve üstteki dosyayı Hadoop?a verdik.
Hadoop bu dosyayı iki eşit parçaya bölecektir (Key değerlerine hiç bakmadan) HDFS sistemi sayesinde iki farklı diske yazacaktır. Diyelim ki bölünme tam ortadan yapıldı:

  • Opel : 5
  • Fiat: 3
  • Porsche : 9
  • Opel : 10
  • Fiat: 9
  • Opel : 15
  • Volkswagen: 13
  • Porsche: 1
  • Mercedes : 16
  • Volkswagen: 8

Her node, kendi içinde Map yaparken, benzer key değerlerini aynı toplama yazacak.
1. Bölüm

  • Opel : 15
  • Fiat : 12
  • Porsche : 9

2. Bölüm

  • 2. Bölüm
  • Opel : 15
  • Volkswagen : 21
  • Porsche : 1
  • Mercedes: 16

Bundan sonra Reduce kısmında her bölümdeki key ler bir de kendi aralarında toplanıyorlar. Böylece sonuç:

  • Opel: 30
  • Volkswagen: 21
  • Porsche:10
  • Fiat: 12
  • Mercedes: 16

Hadoop giderek bir endüstri standardı olmaya başlıyor.
Mesela Facebook Hadoop kullanarak kullanıcı davranışlarının analizini yapıyor (50 milyon kişi ve ilişkileri) ve sosyal reklamların etkisini ölçüyor.
Geçtiğimiz aylarda New York Times bilgi işlem ekibi Hadoop kullanarak 150 yıllık arşivindeki 11 milyon makaleyi dijitalleştirdi ve aranabilir hale getirdi.
Normalde aylar sürebilecek bilgi işleme bir kaç günde bitirildi. Amazon ile Hadoop kullanarak EC2 (dağııtmlı işlemci) ve S3 (dağıtımlı depolama) servislerinden faydalanabilirsiniz.


Hadoop Kullanan Firmalara örnekler:


  •   EBay
  •   ARA.COM.TR
  •   Facebook
  •   Last.fm
  •   Also used for large scale audio feature analysis over millions of tracks
    Yahoo!
Not: Bu yazı serisi hazırlanırken devveri.com’ dan faydalanılmıştır.