30 Kasım 2015 Pazartesi

Azure Depolama Servisi(Azure Storage)

Bulut teknolojisi,verileri için ölçeklenebilirlik,süreklilik,güvenlik vs. gereken uygulamalar için depolama servisini sunabilmektedir.Azure Storage,"big data" konseptli bilimsel, finans,analiz ,media tarzı uygulamaların yüzlerce terabyte'lık verilerini işleme ve depolama imkanını sağlamakla birlikte küçük miktarda verilerin depolanmasınıda sağlamaktadır.Kullandığın kadar öde prensibiyle çalışmaktadır ve anlık olarak milyonlarca kullanıcı isteyine karşılık vermektedir. Azure Storage dunyanın heryerinden erişilebilir olmakla birlikde istekde bulunan uygulamanın tipinden ve çalıştığı platformdan bagımsız olarak hizmet vermektedir.Java,C++,.NET vs gibi proramlama dillerini desteklemektedir.Azure Storage hizmetini kulanabilmek  için bir Storage Account'a(depolama hesabı) sahip olunması gerekir.İki tür depolama bulunmaktadır.Standart Storage Account: Bu hesap türü Blob Storage,Table Storage,Queue Storage,File Storage depolama türlerini barındırır.

  • Blob Storage dosya verilerini depolar.Bir blob döküman,media dosyası vs. gibi herhangi bir metin tipi veya binary veri olabilir.Blob Storage bazen Object Storage olarakda bilinir.
  • Table Storage. yapılandırılmış veri kümelerini  depolar.Table storage hızlı geliştirme(development) ve büyük miktardaki veriye hızlı erişim sağlayan bir NoSQL anahtar özellikli depodur.
  • Queue Storage iş akışını işleme ve bulut hizmetlerinin bileşenleri  arasında güvenli mesajlaşma sağlar.
  • File Storage  standart SMB protokolünü kullanan uygulamalar için ortak paylaşımlı depolama sağlar. 
Premium Storage Account  üzerinde I\O yoğunluklu işyüklerinin çalıştırıldığı  sanal  makineler için yüksek performanslı ve düşük gecikmeli disk desteyi sağlamaktadır.Uygulamalarınızın VM disklerini bu depolama birimine taşıyarak performans ve hız artışı sağlanabilir.
Blob Storage'e daha yakından bakarak örnekle gösterelim.Örnekde bir web sayfası bizden resim dosyası alsın ve bu resim dosyasını  daha önceden oluşturduğumuz  storage hesabımıza yüklesin. Öncelikle Blob Storage;

  • Blob Storage,büyük miktarda yapılandırılmamış verilerinizi tuttabileceyiniz dünyanın heryerinden HTTP veya HTTPS protokolleri ile erişilebilir olan bir servisdir. Verilerinizi herkese açık veya özel olarak tutabilirsiniz
    Genel olarak aşağıdaki işlemler için kullanılmaktadır;
  • Resim veya dökümanların web browsera servis edilmesi.
  • Dosyaların dağıtık erişim için depolanması.
  • Video ve Audio iletimi ve diğer işlemler.
  • Blob Servisin yapısı resimdeki gibidir.
Account dan bahsetmişdik.Container farklı blob setlerini tutan bir yapıdır.Bütün bloblar containerda tutulmalıdır.Blob ise herhangi bir tipte ve boyutdadaki bir dosyadır.Yapıcağımız örnekte azure cloud üzerinde çalışan apache tomcat websitesi,azure cloudda çalışan bir storage var.Öncelikle Storage Accounta bağlanmak için bir bağlantı stringi tanımlamamız lazım.
String storageConnectionString ="DefaultEndpointsProtocol=http;" +"AccountName=hesap_adınız;" +"AccountKey=hesap_anahtarı";
Bunlara azure platformundan erişe bilirsiniz.Storage ile ilgili java üzerinden işlemler yapabilmemiz için Azure Storage SDK for Java ya ihtiyaç vardır.Jar dosyası  bu adresden indirilebilir.Bununla beraber daha birkaç .jar dosyalarını indirmemiz lazım.Bunlar ;

  • jackson-core-2.x.x.jar
  •  slf4j-api-1.x.x.jar
  • slf4j-simple-1.x.x.jar
     
    web sayfamızın ana sayfası index.jsp 
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Dosya Yukleme Formu</title>
</head>
<body>
yuklemek icin dosya secin: <br />
<form action="main.jsp" method="post"
                        enctype="multipart/form-data">
<input type="file" name="file" size="50" />
<br />
<input type="submit" value="Yukle" />
</form>
</body>
</html>


Burada dosya seçildikden sonra sunucuda bir yere kaydedilicek ve sonra Blob storage e gönderilicek.Bunun için main.jsp
<%@ page import="java.io.*,java.util.*, javax.servlet.*" %>
<%@ page import="javax.servlet.http.*" %>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.*" %>
<%@ page import="org.apache.commons.fileupload.servlet.*" %>
<%@ page import="org.apache.commons.io.output.*" %>
<%@ page import="com.microsoft.azure.storage.* "%>
<%@ page import="com.microsoft.azure.storage.blob.*" %>

<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   //yuklenecek olan dosyanın serverde tutulacak dizinini belirle
   String filePath = "d:\\home\\site\\wwwroot\\bin\\apache-tomcat-8.0.28\\data\\";
   String fileName="";
   // formdan gelen içeriyin tipini dogrula
   String contentType = request.getContentType();
   if ((contentType.indexOf("multipart/form-data") >= 0)){

      DiskFileItemFactory factory = new DiskFileItemFactory();
      // bellekte depolanacak maksimum boyut
      factory.setSizeThreshold(maxMemSize);
      // yuklemek için handler oluştur
      ServletFileUpload yukle = new ServletFileUpload(factory);
      // yuklemek için maximum doya boyutunu belirle
      yukle.setSizeMax( maxFileSize );
      try{ 
         // yuklenen dosyanın parametrelerini parse et.
         List fileItems = yukle.parseRequest(request);

         // yuklenen dosyaları işle
         Iterator i = fileItems.iterator();

         
         out.println("<title>JSP Dosya Yukleme</title>");  
         while ( i.hasNext () ) {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () )  
            {
                  // dosyanın parametrelerini al
                  String fieldName = fi.getFieldName();
                  fileName = fi.getName();
                  boolean isInMemory = fi.isInMemory();
                  long sizeInBytes = fi.getSize();
                  // dosyanın ismini bul ve oluştur
                  if( fileName.lastIndexOf("\\") >= 0 ){
                    file = new File( filePath + 
                    fileName.substring( fileName.lastIndexOf("\\"))) ;
                  }else{
                    file = new File( filePath + 
                    fileName.substring(fileName.lastIndexOf("\\")+1)) ;
                  }
                  //dosyayı yaz
                  fi.write( file ) ;
                  out.println("Upload edilen dosya: " + filePath + 
                         fileName + "<br>");
            }
         }
      }catch(Exception ex) {
         System.out.println(ex);
      }
   }
   else{
      out.println("Dosya Yüklenemedi <br>"); 
   }
   
   //Bağlantı stringi oluştur
   String storageConnectionString ="DefaultEndpointsProtocol=http;" +"AccountName=hesap_adi;" +
           "AccountKey=hesap_anahtari";
   try{
      // storage hesabını elde et
      CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

      // istemci oluştur
      CloudBlobClient istemciBlob = storageAccount.createCloudBlobClient();

      // container oluştur
      CloudBlobContainer container = istemciBlob.getContainerReference("resimler");
      container.createIfNotExists();
      //storage e yuklenecek olan resim için yolu belirle
      String YuklenmisfilePath = filePath+fileName;
      // blob oluştur.
      CloudBlockBlob blob = container.getBlockBlobReference(fileName);
      File dosya = new File(YuklenmisfilePath);
      //yükle
      blob.upload(new FileInputStream(dosya), dosya.length());
      out.println("Dosyayi Storage e Yukleme Basarili <br>");

      //resim yüklendiyse,resmin containerde olup olmadıgını goster
      int i=1;//blobları numaralandırmak için
      for (ListBlobItem blobItem : container.listBlobs()) {
             //blob veya sanal dizin oldgunu kontrol et,blob ise 
             if (blobItem instanceof CloudBlob) {
                 // uygun blob u oluştur.
                  CloudBlob blob1 = (CloudBlob) blobItem;
                  //container daki butun dosyalari listele
                  out.println(i+".blob:"+blob1.getName()+"<br>");
                  i++;
              }
          }
      }
      catch (Exception e)
      {
          out.println("Dosya Storage e yüklenemedi.... <br>");
      }
%>
Burada belirtmemiz gereken iki jar dosyası daha var,bu jarlar form üzerinden upload işlemi için gerekli doslardır.Bunlar;

  • commons-io- 2.x.jar
  • commons-fileupload-1.x.x.jar

  Uygulamanın kkodlari bunlardır.Bu kodlar jar dosyalarının classpath e eklenerek yerelde veya sunucu üzerinde çalıştırılabilir.Upload işlemi yapıldıkdan sonra uygulamanın çıktısı;

 Buradan  bu web uygulamasına erişebilinir.Aşağıdaki video da Azure platformu üzerinden Storage oluşturma ve buna erişim için gereken bilgilerin nasıl elde edileceği anlatılmaktadır.







21 Kasım 2015 Cumartesi

Java Native Interface(JNI)

Java Native Interface(JNI),Java Software Development Kit(Java Yazılım Geliştirme Kit'i)'in bir parçası olan doğal programlama arayüzüdür.JNI, C\C++ gibi diğer dillerde yazılmış kod ve kod kütüphanelerini Java kodu içerisinde kullanmamıza olanak sağlar.Buna karşılık bir Java kodunuda C/C++ kodu içerisine ekleyebiliriz ve ya içerisinden çağırabiliriz diyelim.JVM'nin bütün platformlarda sorunsuz çalıştırılabilmesi,büyük ölçüde JNI sayesinde gerçekleştirilmişdir.Eğer Java ile yazılım geliştiriyorsak,Bellek Yönetimi,Performans,alt seviyeli bir donanıma erişim gibi işlemlerde C\C++ kullanmamız gerekebilir.Bu yazıda Java sınıfları içerisinden C\C++ kod çağırımı yapılmaya bakılacakdır.

  • Kullanma şekli(Windows ortamında)
                           Windows ortamında bu tarz uygulamalar geliştirebilmemiz için lazım olan birkaç araç vardır.
                              1.Java Derleyicisi(javac.exe)
                              2.Java Sanal Makinesi(JVM veya java.exe)
                              3.Native method barındıran Java Class'dan .h dosyası oluşturucu(javah.exe)
                              4. JNI'i tanımlayan kütüphane dosyaları ve header dosyaları(jni.h,jvm.lib,jvm.dll)
                              5.C/C++ Derleyicisi(örn:Mingw(gcc,g++))
                              6.IDE(gerekli değil)
           Not:Bunlardan ilk dördü sisteminizde JDK kuruluysa vardır demekdir.
Örnek1:Bir Java sınıfı içerisinden C kodu çağıralım.(ornek1.java)
public class ornek1{
    
    static{
        System.loadLibrary("lib1");//ornek1 sınıfı belleğe yüklendiyinde lib1.dll
                                  //kütüphanesini kalıcı olarak bellege getir
    }
    private native void merhaba_dunya();//c kodunu bu metotla çagır

    public static void main(String[] args) {
        new ornek1().merhaba_dunya();//c kodunu çalıştır
    }
}
Buradaki static initializer(başlatıcı) ornek1 sınıfının yüklenmesi sırasında System.loadLibrary()'yi lib1.dll native kütüphanesini yüklemek için çağıracakdır.Bu kütüphane(lib1.dll),program çalıştırılırken  Java Library Path yoluna eklenmiş olması lazım,aksi takdirde JVM UnsatisfiedLinkError hatasını vericekdir.Buradaki native anahtar kelimesi bu metotun bir C/C++ metotu oldugunu göstermekdedir,C/C++ kodlarını çagırabilmemiz için native metotlara ihtiyacımız vardır.Şimdi ise çağırılacak olan C kodunu yazalım.Bunun için ilk once yazacağımız C kodu için bir header dosyası oluşturmamız gerekli.Bunu yapmak için ilk once Java kodunu derlememiz lazım,oluşacak olan class dosyamızdan javah.exe programıyla bu header dosyamızı oluşturabiliriz.ornek1.java dosyamızı cmd'yi açarak derleyelim. 
javac ornek1.java
Aynı dizinde ornek1.class dosyası oluşturuldu,şimdi bunu kullanarak C header dosyası oluşturalım.
javah ornek1
Bu komutdan sonra ornek1.h dosyası oluşturuldu.Bu dosyanın içeriği aşağıdaki şekildedir.
ornek1.h 
/* DO NOT EDIT THIS FILE - it is machine generated */
#include jni.h
/* Header for class ornek1 */

#ifndef _Included_ornek1
#define _Included_ornek1
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     ornek1
 * Method:    merhaba_dunya
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_ornek1_merhaba_1dunya
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
Buradaki extern “C” C++ derleyicisi tarafından algılanır ve fonksiyonların C'nin isimlendirme protokolü kullanılarak derleneceğini söyler.Java_ornek1_merhaba_1dunya metot ismi ornek1  sınıfının içerisindeki merhaba_dunya() metoduna karşılık gelmektedir.Metot isimleri Java_{package_and_classname}_{function_name}(JNI arguments) şeklinde bir standartdır.JNIEnv  parametresi bütün  JNI fonksiyonlarina erişim sağlayan JNI ortam değişkenidir.jobject ise Java daki this nesnesine karşılık gelmektedir.Şimdi ise bu metodun C implementasyonunu yapalım.
ornek1.c
#include "ornek1.h"
#include  "stdio.h"

//merhaba_dunya() metodunun implementasyonu
JNIEXPORT void JNICALL Java_ornek1_merhaba_1dunya(JNIEnv *env, jobject jthis){
    printf("Merhaba Dunya\n");
    return;
  }
Bu C kodunu Java sınıfı içerisinden kullana bilmemiz için yukarıda bahsetdiyimiz gibi .dll dosyasına ihtiyacımız var.Yani ornek1.c dosyasını derleyip .dll uzantılı dosyaya  çevirmemiz lazım.
gcc -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o  lib1.dll ornek1.c
  • JAVA_HOME:JDK nın kurulu oldugu dizini göstermekde.
  • -shared paylaşımlı bir dll olması gerekdiyini göstermekde.                                              
  • gcc C compiler.
Bu komutu yazdıkdan sonra dizinimizde lib1.dll dosyası oluşturuldu.ornek1.java dosyamızı çalıştırdığımızda bu kütüphanenin java_library_path'e eklenmesi gerek,aksi takdirde öncedende belirtildiyi gibi UnsatisfiedLinkError hatası verilecekdir.Şimdi ise ornek1 sınıfını(Java Kodu) çalıştıralım.
java -Djava.library.path="C:\\Users\heydar\Desktop\calismalar" ornek1
           Aşağıdaki gibi bir çıktı alınmasi lazım.
 Evet,görüldüyü gibi ornek1.c dosyası içerisindeki printf("Merhaba Dunya\n"); kod satırı  ornek1.java dosyasi içerisinde tanımlanmış ornek1 sınıfında çalıştırılmaktadır.
          Şimdi bir C++ örnegine bakacak olursak.
ornek2.java 
public class ornek2{

    static{
        System.loadLibrary("lib2");
    }
    private native double ortalama(int n1,int n2);//iki tam sayının ortalamasını dödüren metod

    public static void main(String[] args) {
        System.out.println("Ortalama:"+new ornek2().ortalama(4,5)); 
    }
}
Yukarıdaki örnekteki gibi kodu derledikden sonra javah.exe ile oluşan header kodumuz.
ornek2.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class ornek2 */

#ifndef _Included_ornek2
#define _Included_ornek2
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     ornek2
 * Method:    ortalama
 * Signature: (II)D
 */
JNIEXPORT jdouble JNICALL Java_ornek2_ortalama
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif
         Şimdi ise C++ implementasyonunu yapalım.
ornek2.cpp
#include "ornek2.h"
#include <iostream>
using namespace std;
JNIEXPORT jdouble JNICALL Java_ornek2_ortalama(JNIEnv *env, jobject jthis, jint n1, jint n2){
    jdouble ortalama;
    cout<<"C++ daki sayilar:"<<n1<<","<<n2<<endl;
    ortalama=((jdouble)n1+n2)/2.0;
    return ortalama;
}
         lib2.dll isminde bir dll dosyası oluşturalım.
NOT:Bazen windowsda “__int64” tipi “long long” tanımlı olmayabiliyor. Bu durumda  gcc/g++ ye aşağıdaki seçenekle bu tip kullanımını soylemelisiniz.
gcc/g++ -D __int="long long"

lib2.dll
g++ -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -D__int64="long long"  -shared -o lib2.dll ornek2.cpp
          Şimdi ise ornek2.java kodumuzu çalıştırdığımızda aşağıdaki gibi çıktı alırız.

20 Kasım 2015 Cuma

16F877 MicroController ve PicBasic Pro ile LED kontrolü

Devre Şeması(ISIS):


Picbasic Kodu:
'****************************************************************
'****************************************************************
'*  Name    : LED_Kontrol.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 20.11.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'***************************************************************
TRISB=%00000000 'B0-B7 portlarini çıkış olarak ayarla
ikili VAR BYTE  '1 byte'lık bir değişken tanımla
ikili=0
PORTB=ikili     'B portlarinin çıkış degerlerini 00000000 yap
main:
     ikili=ikili+1
     PORTB=ikili
     PAUSE 100  '100 milli saniye dur
     IF ikili=127 THEN   ikili=0
goto main
Bu PicBasic kodu,0-127 arası sayıları saymakda ve bu sayıların ikili karşılıklarini portb'e gondererek,led ler uzerinde göstermekdedir.Yanan led'ler 1'e,yanmayanlar 0'a karşılık gelmektedir.


25 Ekim 2015 Pazar

Azure Cloud üzerinden Website oluşturmak ve yayınlamak.

Merhaba.Azure cloud üzerinde websitesi oluşturmak  ve yayınlamak için iki model vardır.Bi önceki  yazım'da bu modellerden bahsetmişdim.Bunlar PaaS ve IaaS dır.IaaS tabanlı website geliştirmek PaaS tabanlıdan  biraz daha  karmaşık işe benzemekte çünkü sunucu olarak çalışacak sanal makine oluşturmak,bu makinenin endpointlerini(protokol,port,roller ve diger bileşenler)  tanımlamak işi bize düşmekte,ve sitemizi yayınladıkdan sonrada sitenin bakımını yapma işi var tabi bide.PaaS tabanlı modelde ise bu iş azure portal sayesinde çok basit hale getirilmiştir.Birkaç "next" le websitesi yayınlayabiliyoruz,yani sunucu ve ayarlarıyla ilgilenmiyoruz,tabiki buda kendi beraberinde maliyeti artırıyor,çunkü bu işlemleri bizim yerimize cloud yapmaktadır.Biz sadece oluşturmak istediyimiz websitesinin ne tabanlı olacagıyla ilgili şeylerle ugraşırız,ve bunlar arasında Microsoft tabanlı olmayan(php,java,python vs) diger platformlarda vardır.Azure Cloud sitemizi oluşturdukdan ve yayınladıkdan sonra,geliştirme işini kolaylaştırak araçlarıda sağlamaktadır.Yerelde geliştirdiyimiz website'ı cloud'a yüklemek için Dropbox,Git,Github,Visual Studio Online araçları mevcuttur.
Diger bir örnek Eclipse ile geliştirdiyimiz web uygulamalarını Cloud'a yüklemek için Eclipse Azure Cloud SDK dır.Azure Website hizmetinin avantajlarına geldikdeyse,dediyim gibi yonetim ve geliştimenin kolay olmasıdır,veya orneyin websitemize aşırı derecede request ler oldugunda sitenin kapasitesini otomatik olarak artırmasıdır,yani talebe göre kapasite ayırır azure cloud,başqa durumda mesela ihtiyacımızı aşacak derecede website iş  kapasitesi alırız ve maliyet açısından zarar ederiz,veya sitenin iş kastesi yeterli olmadıgı durumda websitemiz çalışamaz hale gelir ve bu süreklilik açısından bize fayda etmez,ama azure cloud "kullandıgın kadar öde" mantıgıyla çalışmaktadır ki bu en buyuk avantajlarındandır diyebiliriz,çünkü işin  en sonunda kar var.Azure Cloud websitelerine veritabanı destegide saglamaktadır,hata 20 mb kadar ucretsiz servis saglar.
Şimdi ise apache tomcat uzerinde çalışacak bir Java tabanlı websitesi oluşturup yayınlayalım.


15 Ekim 2015 Perşembe

Bulut Teknolojisi ve Sanallaştırma üzerine

Bulut Teknolojisi internet uzerinden veri depolama,veri işleme ve veri paylaşımını sağlayan bir hizmetler bütünüdür.Bu hizmetlerin en basit örneği internetin yaygınlaşmasından  bu yana kullanılan e-posta,ve domain hizmetleridir.Tabiki bu hizmetleri istenen halde kendimize ait bir sunucu bilgisayar alarak,kendi e-posta hizmeti,internet sitemizi bu sunucu uzerinde barındıra biliriz,ama bunun sonucunda sunucu bakımı,yönetimi ve sürekliliyi sağlama işi bize düşer,ve buyuk ihtimal aldıgımız sunucunun bütün kapasitesini kullanmıyacağımızdan maliyet bakımından zarar ederiz.Bu Bulut teknolojisi için en basit tanım olsa gerek,çünkü günümüzde iş dünyasi ihtiyaçlarının  en basit olanları bunlardır.Bildiyimiz gibi büyük kurumsal şirketler,bilimsel araştırma merkezleri,devlet daireleri ve başka kurumlarda kullanılan teknolojiler devasa ölçüde veriler işlerler.Örnek olarak Avrupa Nükleer Araştırma Merkezi(CERN)'in 2012 statistiklerine göre,araşatırmalar sonucunda  yılda 22 petabyte veri saklamaya ihtiyaç duyuluyor,bu verinin depolanması ve gerektiginde  pratik bir şekilde erişilebilmesi için dış kaynaklı Bulut Teknolojisine yönelmiştir.Dünyada bir çok teknoloji devi Bulut hizmeti vermektedir,bunların arasında en önde geleni ise Microsoft'dur.

Bulut hizmetini model olarak karşımıza aşağıdaki şekilde çıkmaktadır.
               
  • SaaS(Software as a Servise)
    Yazılım olarak servis sağlayan modelidir bulutun.Uzaktaki herhangi bir sanal makine uzerinde kendi yazılımlarınızı kura,veya mevcut yazılımları kullanabileceyimiz hizmet sunmaktadır.Mevcut  yazılımlara örnek olarak Outlook üzerinden kulllanılan  Microsoft Office uygulamasıdır.
  • PaaS(Platform as a Service)
    Bu model daha çok geliştiriciler içindir.İşletim sistemi ve bunun uzerinde çalışacak servisleri istediyiniz gibi kullanabilirsiniz,örnegin php ve mysql ile bir veritabanı uygulaması geliştirdiyinizde,local de bu platformları kurmadan online olarak yazılım geliştirebilirsiniz.
  • IaaS(Infrastructure as a Service)
    Bu model en temel hizmet modelidir.Burada bulut saglayıcıları,sanal veya fiziksel makinalar olarak         sunulur.
Sanallaştırma,bilgisayar işletim sitemi,bilgisayar ağ kaynağı yada depolama biriminin fiziksel hali yerine sanal bir sürümünü oluşturur.Örneğin bilgisayarınız ile bagımsız bir  bilgisayar gibi davranan bir sanal makine oluştura bilirsiniz,ve fiizksel makineniz uzerinde birden fazla işletim sistemi,normal işletim sistemi ile aynı anda çalışabilir.Sanallaştırmanın temel avantajı maliyeti azaltmasındadır.Örneğin birden fazla sunucu kullanılan bir işletme sunucu sanallaştırması kullanarak fiziksel sunucu sayısını azaltabilir ve böylece bakım ve güvenlik maliyetlerinide azaltmış olur.Sanallaştırma mevcut donanımınızdan faydalı şekilde yararlanmanıza imkan sağlar.Yeni bir bilgisayar ve ya sunucu almak yerine sahip oldugunuz donanımın kullanımını geliştirebilirsiniz.Sanallaştırma ve Bulut teknolojisi birbiriyle ilişkilidir.Her ikiside bilişim kaynaklarından en iyi şekilde yararlanarak altyapı maliyetlerini azaltmak üzere sunulan farklı yöntemleri temsil ederler.Bulut hizmetleri gerçek donanım tarafından sunulur gibi gözukselerde her durumda sanallaştırılımış donanımlar tarafından sunulur,yani sanallaştırma bulut'un ana bileşenidir.
Buradan Azure Cloud uzerinden sanal makine oluşturmayı görebilirsiniz.

14 Mart 2014 Cuma

Android Olay Yönetimi(Event Handling)

Android Olay Yönetimi bize uygulamamızdaki bileşenlerle(button,textfield,Menü,textview vs)  herhangi bir şekilde temasa geçtiyimizde devreye girer.Örnegin bir Button'a tıkladıgımızda uygulamamızın  herhangi  birşey yapmasını istiyorsak o zaman olay yönetimini kullanmalıyız.Olay yönetiminin 4 esas özelliyi vardır.

  1. Olay Kaynağı(Event Source)
    Olayı gerçekleştiren bir uygulama bileşenidir(button,textfield,textview,listview vs).
  2. Olay Dinleyicisi(Event Listener)
    Olay gerçekleştiyinde napılacagı yönünde karar veren bir Listener Classıdır.Örnegin OnClickListener classı.Olay gerçekleştiyinde bilgilendirilir.
  3. Olay Nesnesi(Event Object)
    Olay gerçekleştirildigi zaman oluşturulur ve olay ile ilgili bilgileri tutan nesnedir.
    Örnegin olay nesnemiz event olsun,event.getId() diyerek olayın hangi bileşen uzerinde gerçekleşdiyini oyrene biliriz.
  4. Olay İşleyicileri(Event Handler)
    Olay dinleyicisi tarafından olay yakalandıgında gereken kodun çalıştırılacagı metotlardır.
    Örneğin OnClickListener dinleyicisinin onClick(View event) metodu.
İki Button ve birde TextView'u olan bir örnege bakalım.
  • activity_main.xml
    --RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/RelativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" --
    
        --Button
            android:id="@+id/button1"
            android:layout_width="208dp"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button2"
            android:layout_alignParentTop="true"
            android:layout_marginTop="28dp"
            android:text="@string/bbutton" /--
    
        --Button
            android:id="@+id/button2"
            android:layout_width="205dp"
            android:layout_height="wrap_content"
            android:layout_below="@+id/button1"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="14dp"
            android:text="@string/kbutton" /--
    
        --TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button2"
            android:layout_alignRight="@+id/button2"
            android:layout_below="@+id/button2"
            android:layout_marginTop="14dp"
            android:text="@string/textview" /--
    
    --/RelativeLayout--
  • strings.xml
    --?xml version="1.0" encoding="utf-8"?--
    --resources--
    
        --string name="app_name"--Android Event Handling--/string--
        --string name="action_settings"--Settings--/string--
        --string name="kbutton"--Küçült--/string--
        --string name="bbutton"--Büyüt--/string--
        --string name="textview"--Android Event Handler--/string--
      
    --/resources--
    
    
strings.xml dosyasında uygulamamızda kullanılan butun stringler tutulur,buradan uygulamamıza stringler ekleye bilir ve istediyimiz yerde onları uygun degişken isimleri ile kullana biliriz.
  • MainActivity.java
    public class MainActivity extends Activity{
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
                     
      //olay kaynakları tanımlanıyor    
      Button bButton=(Button)findViewById(R.id.button1);
      Button kButton=(Button)findViewById(R.id.button2);
                    
      //buttonlara tıklandıgında
      bButton.setOnClickListener(new View.OnClickListener() {
       
       @Override
       public void onClick(View v) {
        // TODO Auto-generated method stub
        //olay işleyicisi
        TextView text=(TextView)findViewById(R.id.textView1);
        text.setTextSize(25);
       }
      });
      kButton.setOnClickListener(new View.OnClickListener() {
       
       //olay işleyicisi  
       @Override
       public void onClick(View v) {
        // TODO Auto-generated method stub
        TextView text=(TextView)findViewById(R.id.textView1);
        text.setTextSize(15);
       }
      });
     }
    }
Uygulamayı çalıştıralım.Eger Büyüt buttonuna tıkladıgımızda mevcut textview'un boyutu buyuyecek,Küçült buttonuna tıkladıgımızda ise mevcut textview'un boyutu kuçulecekdir.



MainActivity.java sınıfındaki kodlardan gorduyumuz gibi her Button için ayrı bir dinleyici ve işleyici kullandık.
İstersek her iki Button için ortak bir dinleyici ve işleyici  de kullana biliriz.Bunu için OnClickListener interface'ni implement etmemiz lazım.
  • MainActivity.java
    public class MainActivity extends Activity implements OnClickListener{
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
          
      Button bButton=(Button)findViewById(R.id.button1);
      Button kButton=(Button)findViewById(R.id.button2);
      
      bButton.setOnClickListener(this);
      kButton.setOnClickListener(this);
     }
    
     @Override
     public void onClick(View event){
      // TODO Auto-generated method stub
      TextView text=(TextView)findViewById(R.id.textView1);
      
      if(event.getId()==R.id.button1){
       text.setTextSize(25);
      }
      if(event.getId()==R.id.button2){
       text.setTextSize(15);
      } 
     }
    }
Böylece her iki Button için ortak bir Listener kullana biliriz.



3 Mart 2014 Pazartesi

Android Uygulamasına Arkafon Müziği Ve Arkaplan Resmi Ekleme






Merhaba arkadaşlar.Bu yazımda Android uygulamamıza nasıl arka fon müziği ve resim  ekliyebiliriz onu yazıcam.
Önce resimden başlayalım.Arka plana eklemek istediyimiz resmi kopyalayın ve projenizdeki res(resource) klasorü içindeki drawable-hdpi klasörune yapıştırın.



Görduyumuz uzere res klasörunde drawable türünden 5 farklı dosya var.(eyer Android sürümünüz 4.4.2 ise.eski  sürümlerde 5 olmaya bilir).

  • drawable-hdpi
  • drawable-ldpi
  • drawable-mdpi
  • drawable-xhdpi
  • drawable-xxhdpi
Dikkat etdiyseniz kopyaladıgımız resmi drawable-hdpi klasörüne diyilde diğer 4 klasörden herhangi birinede yapıştıra bilirdik,bunu yapmamamın sebebi uygulamayı çalıştıracagım emulatör(sanal makine)'ün boyutunun 
hdpi'ye göre ayarlamamdır.Daha dogru şekilde soylesek kullanacagım layout'un buyukluyu örneğin 150x150 boyutundaysa hdpi'yi,200x200 ise xhdpi'yi,100x100 ise mdpi'yi,75x75 ise ldpi'yi seçmem lazım.(kaynak)
Klasöre ekleme işleminden sonra bu resim dosyasını xml dosyasına eklemekde gerekiyor.Bunun için
activity_main.xml dosyasını açıp aşagıdaki kodu bu dosyaya ekliyoruz.

   android:background="@drawable/android"
Resim dosyamızın ismi "android.jpg" dir,ama gorduyumuz gibi dosya uzantısını dikkate almıyoruz.
Ekledikden  sonra kodlarımız bu şekilde gözükücek.

  • activity_main.xml
--AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="@drawable/android"
    tools:context=".MainActivity"-- 
--AbsoluteLayout--

(arkadaşlar  yukarıdaki kod blogunda < ve > işaretleri yenine -- kullandım,kod blogunda ,< ve > html gibi yorumlandıgından kod blogu gosterilmiyordu)
Uygulamamızı çalıştıralım.Gördüyümüz gibi arka plana resim eklenmiştir


Şimdie ise arkafon  müziği ekleyelim.Yeniden ekleyeceğimiz müzik dosyasını kopyalayıp res klasöründeki drawable-hdpi klasörüne yapıştıralım.


Şimdi ise MainActivity.java(uygulama çalışırken çalıştırılacak kodların bulundugu sınıf) sınıfını açalım.
MainActivity.java
package com.example.ilkuygulamam;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }

}
Arkafonda müzügin çalmasını istiyorsak,önce sınıfımızda  bir MediaPlayer oluşturmamız lazım.
Oluşturma kodu aşagıdaki gibidir.
MediaPlayer music=MediaPlayer.create(MainActivity.this, R.drawable.mymusic);             

Bu kodu classımıza ekliyoruz ve MediaPlayer'i çalıştırmak içinde ayrıca 
music.start();
kodunu eklememiz gerekiyor.
  • MainActivity.java
package com.example.ilkuygulamam;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.media.MediaPlayer;
public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  MediaPlayer music=MediaPlayer.create(MainActivity.this, R.drawable.mymusic);
  music.start();
  
 }

}
Şimdi uygulamamızı çalıştıralım,uygulamamız çalıştıgında goruntu aşagıdaki gibidir,ama arka fonda muzik çalmakdadır ;).


2 Mart 2014 Pazar

Android Uygulaması Oluşturma Ve Çalıştırma

Merhaba arkadaşlar,bu yazımda Android uygulaması oluşturma ve çalıştırılmasını anlatıcam,ayrıca
oluşturulan uygulamanın bileşenlerindende bahsedeceğim.
Uygulama oluşturmak için File->New->Project yolunu takip edelim.



Android Application Project'i seçip Next diyelim.


2 kere next dedikden sonra boyle bir sonuçla karşılaşmamız gerekiyor.
Buradaki Activity Name oluşturulacak Activity'nin ismi,Layout Name ise bu Activity için oluşturulacak Arayuz penceresi için oluşturulacak olan xml dosyasının ismini temsil ediyor.Finish    dedikten    sonra uygulamamız otomatik oluşturulucak.  

.

  • MainActivity.java


MainActivity.java sinifı,uygulamamız çalıştırıldıgında,çalıştırılıcak olan kodları barındıran sınıfdır.

  • onCreate() Metodu
OnCreate() metodu hem yeni bir aktivite oluşturulurken hem de aktivitenin yeniden oluşturulması esnasında çağrılan bir metotdur.Bu metotta Bundle nesnesinin okunması gerekir. Eğer bundle nesnesi null  ise sistem yeni bir aktivite oluşturur ,bundle null deyilse  activitiyeyi yeniden oluşturur ve önceki bilgileri bu aktiviteye  aktarır.
  • setContentView() Metodu
setContentView() metodu, çalıştıracagımız Activity için kendimizin oluşturdugu veya oluşturulan xml dosyasının bu activity'ye eklenmesini saglar,ve her bir Activity sinifının en az bir xml dosyası olması gerekir.


  • activity_main.xml


Bu activity_main.xml dosyamızın Graphical Layout kısmıdır.Buradan Uygulamamızın Arayüzünü surukle-bırak yoluyla oluştura biliriz,activity_main.xml'e tıkladıgımızda bu arayuzun arka plan kodlarını gorebiliriz.


Kod gorunumu bu şekildedir.

Buradan arayuzumuzun bileşenlerinin ozelliklerini deyişe,ve arayuzumuze yeni bileşenler ekleye biliriz.


  • AndroidManifest.xml


AndroidManifest.xml dosyası uygulamamızın tüm kurallarının bulundugu dosyadır,uygulamamız çalıştırılmadan once,uygulamammızın  butun Activityleri bu dosyada  tanımlanmalıdırlar,
Bir Android uygulamasının bileşenlerinin bir kısmından bahsetdik,diger kısımlarındanda ilerde uygulamalar gelişdirirken bahsedeceğim.
Şimdi gelelim uygulamamızın çalıştırılmasına.
Uygulamamızın kodlarının derlenmesi işini Android SDK Tools görur,çalıştırmak içinse ya gerçek bir Android işletim sistemli makineye(örn:Android işletim sistemli bir telefon),yada kendimizin oluşturacagı Sanal Makine'ye  ihtiyacımmız vardır.

  • Sanal Android Makinesi nasıl oluşturulur?
Bunu yapmak için Android Virtual Device Manager'i kullanıyoruz.




Android Virtual Device Manager'i açdıktan sonra New diyoruz ve makinemizi oluşturuyoruz.
Oluşturdugumuz bu sanal makinelerin çalışması uzun surdugunden,alçak ozellikli makine oluşturmanız tavsiyedir.Sanal Makineyide oluşturdukdan sonra artık uygulamamızı çalıştıra biliriz,bunun için Run dememiz yeterli.Umarım  bu yazım herkese yardımcı olur,İy Çalışmalar.



28 Şubat 2014 Cuma

Eclipse'e Android Kurulumu

Öncelikle neden Eclipse?.Eclipse açık kaynak kodlu tümleşik bir yazılım geliştirme ortamıdır(IDE'dir).Ana odak noktası Java ve Java ile ilgili teknolojiler olsada plug-ins based yapısı sayesinde Python,C/C++,Ruby,PHP,JavaScript ve başka diller ile yazılım geliştirme içinde kullanılmaktadır.
Android yazılımı geliştirmek için Eclipse'i seçmemin en önemli  sebebi ise Internetde Android ile ilgili egitim derslerinin nerdeyse hepsinin Eclipse uzerinden anlatılmasıdır,yani yardımcı kaynak ne kadar fazla ise oyrenmek o kadar hızlı ve verimli olur mantıgı uzerinden yurumek lazım bence.
Eclipse'in Java için standart sürümünü  buradan indirebilirsiniz,indirdikden sonra kuruluma gerek yoktur,Eclipse'i direk çalıştıra bilirsiniz.
1.Yüklediyiniz Standart surumde veya Eclipse'in diger mevcut surumlerinde Android geliştirme ortamı bulunmaz,bu ortamı kendimizin oluşturması gerekiyor,bunun için gerekenlerden ilki ve en onemlisi Android SDK(Software Development Kit)'dir.bu addresten SDK'yı indirin.
2.Eclipse'i açın ve Help->Install New Software->Add yolunu takip edin.

Açılan küçük pencerede 'Name' kısmına 'Android','Location' kısmına ise https://dl-ssl.google.com/android/eclipse/ bu addresi kopyalayın.Ok'e tıklayıp bekleyin.

Karşınıza boyle bir pencerenin çıkması lazım,sadece Developer Tools'u seçin(NDK Plugins Android'i C/C++ ile geliştirmek  içindir),Next diyin ve bekleyin.Yükleme bitdikden sonra Eclipse'i yeniden başlatın,yeniden başlatdıgınızda karşınıza boyle bir pencere çıkacakdır.
Eclipse burada indirdiyiniz SDK nın dizinini istiyor,dizini gosterin ve Next diyin.SDK nında yuklenmesi bitdikden sonra Android SDK Manager'i açın.

 Android SDK Manager'den gereken paketlerin kurulması gerekiyor.

Resimde gorduyunuz gibi Tools'u ve Android'in istediyiniz herhangi bir surumunu seçe bilirsiniz,seçdikden sonra Install diyin ve bekleyin,kurulum işlemi uzun surebilir.
Kurulum bitdikden sonra artık Eclipse'niz Android Uygulamaları geliştirmek için hazırdır.
İy Çalışmalar!!!