15 Aralık 2016 Perşembe

Android Studio ile Programlama kitabı + 54 saat video eğitimi

"Android Studio ile Programlama + 54 saat Android video eğitimi" kitabım Abakus yayınlarıyla Ocak ayı itibariyle yayında olacaktır.
www.abakuskitap.com

17 Eylül 2016 Cumartesi

-Java Reflection Kullanımı 2 -

Merhabalar,
Java'da Class bünyesinde bulunan yapılandırıcıları,alanları ve fonksiyonların kullanımı ile ilgili
daha önce yazdığım "Java Reflection Kullanımı" makalesi burada yer alıyor.
Bu konuya yönelik farklı sorular aldığım için "Java Reflection Kullanımı 2 " 'yi yazma gereği duydum.

Bu makalede geliştireceğimiz örnek uygulamada bir adet "Person.java"  ve "Main.java" Classı bulunuyor.
Person class içeriğinde  çeşitli set,get ve print fonksiyonları yer almaktadır.
Bu fonkisyonlar çeşitli veri türlerden parametrelere sahip.  Bu fonksiyonlara Main.java tarafından parametre gönderilecektir. Ancak fonksiyonların aldığı parametre tür ve sayıları önemlidir.
Dolayısıyla kullanım aşamasında parametre türü ve parametre sayıları önem arz etmektedir.
Ayrıca parametre gönderilecek-işletilecek fonksiyonların isimleri bilinmelidir.
Tüm bu detaylara aşağıda yer verilmiştir.

Person.java Class içeriği:

public class Person {

private String name;
private String s_name;
private int age;

public Person(){
//Constructor
System.out.println("Constructor");
}

public void setName(String _n){
this.name = _n;
}
public void setSurname(String _sn){
this.s_name = _sn;
}
public void setAge(int _a){
this.age = _a;
}

public String getName(){
return this.name;
}

public void print(){
System.out.println("Name:" + name + "\nSurname:" + s_name + "\nAge:" + age);
}

public void setAandB(String _s,int _i){
//
System.out.println("" +_s +"," + _i);
}
}

Main.java Class içeriği:
public class Main {


public static void main(String[] args){
try{
//Class ismi:
/*
* farklı paket altında bulunan class'lar paket ismi ile belirtilmelidir.
* Örn 1: "java.util.Date"
* Örn 2: "java.io.InputStreamReader"
*/
   String className = "Person";
   //String olarak alınan Class ismi "Class"'a convert ediliyor:
       Class<?> cClass = Class.forName(className);
     
       ///Class bünyesinde kullanılabilecek fonskiyonlar:
      //Class'a ait yapılandırıcıları elde etmek için:
        //public Constructor<?>[] getConstructors()

     //Class'a ait paketi elde etmek için:
        //public Package getPackage()

     //Declare edilmiş Class'ları elde etmek için:
       //public Class<?>[] getDeclaredClasses()
     
       //Constructor çağrılıyor:
       Object param = cClass.newInstance();  
         
       String methodName = "";

       //setName isminde tek String parametreye sahip fonksiyona parametre gönderiliyor:
       methodName = "setName";
       //gönderilecek parametre türleri belirleniyor.
       Method setNameMethod = param.getClass().getMethod(methodName, String.class);
       //fonksiyona parametre gönderiliyor-işletiliyor:
       setNameMethod.invoke(param, "Kerim");
     
       //
      //setSurname isminde tek String parametreye sahip fonksiyona parametre gönderiliyor:
       methodName = "setSurname";
       Method setSurNameMethod = param.getClass().getMethod(methodName, String.class);
       setSurNameMethod.invoke(param, "FIRAT");
       //
     //setAge isminde tek int parametreye sahip fonksiyona parametre gönderiliyor:
       methodName = "setAge";
       Method setAgeNameMethod = param.getClass().getMethod(methodName, int.class);
       setAgeNameMethod.invoke(param, 30);
   
       //
       //print isminde herhangi bir parametreye sahip olmayan fonksiyon çağrılıyor:
       methodName = "print";
       Method printMethod = param.getClass().getMethod(methodName);
       printMethod.invoke(param); 
   
       //
       //setAandB isminde iki ayrı türden parametreye sahip fonksiyona parametre gönderiliyor:
       methodName = "setAandB";
       /*
        * gönderilecek parametre türleri belirleniyor.
        * NOT: parametre türleri parametre sırasına göre belirlenmelidir.
        */
       Class<?>[] paramTypes = {String.class, int.class};
       //fonksiyon ismi ve parametre tür bilgisi tanımlanıyor:
       Method setAandBMethod = param.getClass().getMethod(methodName, paramTypes);
       //fonksiyona parametre gönderiliyor-işletiliyor:
       setAandBMethod.invoke(param,"A",44);
     
       //Class bünyesinde bulunan tüm fonksiyonları elde listelemek:
       Method[] methods = Person.class.getMethods();
       for(Method method : methods){
           System.out.println("method = " + method.getName()); 
           System.out.println("parametre sayısı = " +method.getParameterCount());
       }
     
       //Method class bünyesinde kullanılabilecek fonksiyonlar:
       //fonksiyona ait parametreleri elde etmek için:
          //public Parameter[] getParameters()
     
       //fonksiyona ait Exception türünü elde etmek için:
          //public Class<?>[] getExceptionTypes()
       
       //fonksiyona ait parametre türlerini elde etmek için:
          // public Class<?>[] getParameterTypes()
       
       //fonksiyona ait dönüş türünü elde etmek için:
          //public Class<?> getReturnType()
     
}catch(Exception e){
e.printStackTrace();
}
}
Çıktı:
   Constructor
   Name:Kerim
   Surname:FIRAT
  Age:30
  A,44

İyi Çalışmalar.

16 Eylül 2016 Cuma

-/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games hatası ve çözümü-

Merhabalar,
Sistemde yüklü olan uygulamaların kısa yolları ve/veya Uçbirim penceresinde işletmek istediğiniz 
komutlar çalışmıyorsa,yani tepkisiz kalıyorsa(böyle bir komut yok) aşağıdaki yöntem çözüm olacaktır.

ilk olarak "etc/environment" dosya içeriğini kontrol ediniz.
Dosya içeriği aşağıdaki gibi olmalıdır.
Dosya içeriği:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Yukarıdaki satırı aşağıdaki şekilde değiştirerek Uçbirim(Konsol) penceresine yapıştırıp ENTER yapınız.
Bu işlemden sonra Uçbirim komutları işlenebilir olacaktır.
İyi çalışmalar.

11 Eylül 2016 Pazar

-git ascii codec decode sorunu ve çözümü-

Merhaba,
Bu kısa makalemde "git" ile kaynak kod çekerken python ile ilgili yaşanan "ascii" codec sorunu ve çözümüne açıklık getirmeye çalışacağım.
Detaylara aşağıda yer verilmiştir.

Problem:
"git" ile android kaynak kodları indirirken python "ascii" codec problemi yaşadım.

Burada problemin kaynağı repo ile ilgilidir. Dolayısıyla "git" kullanılarak yapılan işlemlerde bu problemin yaşanması muhtemeldir.
Ancak sisteminizde yüklü python sürümünde "sitecustomize.py" içerisinde "ascii" yerine "utf8" yer alıyorsa bu problem ortaya çıkmayacaktır.
Aşağıda yaşadığım problem yer almaktadır. 

git komutu çıktısı:
...
...
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 17: ordinal not in range(128)


Çözümü:
$ cat /etc/python2.7/sitecustomize.py

Sisteminizde yüklü olan python sürüm-sürümlerine ait "sitecustomize.py" dosya içeriklerini aşağıdaki şekilde düzenleyiniz.  Sadece default olarak kullanılan python sürümüne ait dosyayı düzenlemek yeterlidir.
NOT: sisteminizde python yüklü dizin yolu farklılık gösterebilir. 
Benim sisteminde python "usr/lib" dizini altında bulunuyor. Ancak "sitecustomize.py"  dosyasına ait kısayol "etc/pythonx.x" dizininde yer almaktadır. Her iki yerden de değiştirilebilir.

aşağıdaki kodları ekleyin:
# encoding=utf8  
import sys  
reload(sys)  
sys.setdefaultencoding('utf8')

konsol penceresinden eklentiyi kontrol edelim:
$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys      //ekle-ENTER
>>> reload(sys)     //ekle-ENTER
<module 'sys' (built-in)>
>>> sys.getdefaultencoding() //ekle-ENTER
'utf8'  //<çıktıyı gözlemleyiniz. 
>>> 

Yukarıdaki eklentiyi yapmadan evvel 'utf8' yerine 'ascii' anahtar kelimesi yer almaktaydı.
İyi çalışmalar.

29 Ağustos 2016 Pazartesi

-Turkey Java User Group- DUYURU

DUYURU: Turkey JUG (Java User Group) Başkan Yardımcılığı görevini çok kıymetli bilişim insanı Sayın Kerim Fırat hocamız yine çok kıymetli bilişimcimiz Sayın Uğur Ata hocamızdan devralmıştır. Bayrağı devralan ve teslim eden birbirinden değerli bu güzel insanları tebrik ediyorum.
Turkey JUG’a şimdiye kadar ki yaptığı katkılarından dolayı usta yazılımcımız Sayın Uğur Ata hocamıza şahsım ve bilişim camiamız adına bir kez daha çok teşekkür ediyorum ve kendisine üstün başarılar diliyorum.
Saygılarımla
Turkey Java User Group Lideri
Mimar Aslan

27 Ağustos 2016 Cumartesi

-Bilişim Sohbetleri bu haftaki kayıt-

Merhabalar,
Bilişim sohbetlerinde bu hafta  Mimar Aslan hocayı konuk ettik.
İzlemek için youtube link .
İyi seyirler.

30 Temmuz 2016 Cumartesi

-Bilişim Sohbeti-

12 Ağustos 2016 Cuma Türkiye saati ile 21:00'da Bilişim Sohbetleri canlı yayınında konuğumuz Türkiye Java User Group Lideri, Devoxx4KidsTR Eş-Kurcusu, Java Yazılım Uzmanı, Teknik Yazar, Bilgisayar Mühendisi, Sayın Mimar Aslan hocamız ile Teknoloji Çağı üzerine konuşacağız. Sakın kaçırmayın. 
Canlı yayın adresi: https://www.youtube.com/watch?v=f6zWZY0T6B0
Hazırlayıp sunanlar: Kerim Fırat & Çağdaş Öğüt

20 Haziran 2016 Pazartesi

-C++ Template Kavramı,Kullanımı-

Merhaba,
Eksik gördüğüm ve/veya bana yöneltilen sorulara bağlı kalarak makale hazırlamaya çalışıyorum.
Bu makalede işleyeceğimiz konu da bunlardan biridir.

Cpp'nin en önemli özelliklerinden biri  de Template kavramıdır.
Template kelime anlamı taslak-şablon dur. Cpp'da Template kavram "Java Generics" ile aynıdır.
Class ve fonksiyon tasarlarken,farklı nesneler ve/veya farklı veri türlerinden oluşan birden fazla 
Class ve fonksiyon tasarlamak yerine Template yapısı kullanılır.
Böylece tek bir kalıp üzerinden farklı nesne ve veri türü/tipi işletmek mümkün hale gelir.
Cpp'da kullanılan şablonlar ikiye ayrılır.
1.Fonksiyon şablonları(Function Templates)
2.Class Şablonları(Class Template)
Tanımlama şekilleri aşağıdaki gibidir.
Fonksiyon için:
template<typename Tip>
CCpp'de tip tanımlamaya aşinaysanız bu kalıb size yabancı gelmeyecektir.
Sonuç olarak burada bir tip tanımlaması var. Dolayısıyla dinamik değişen bir tip tanımlaması yapmış oluyoruz.

Class için:
template<class CTip>

Aşağıda tanımlı ve mutlak değerleri belli olan fonksiyonları inceleyelim:

#include <iostream>
using namespace std;
void func_int(int _iv)
{
cout << "func_int:" << _iv << "\n";
}
void func_double(double _dv)
{
cout << "func_double:" << _dv << "\n";
}
void func_bool(bool _bv)
{
cout << "func_bool:" << _bv << "\n";
}
int main()
{
func_int(44);
func_double(44.4);
func_bool(true);
return 0;
}

Yukarıda farklı veri türlerinden parametre alan birkaç fonksiyon geliştirilmiştir.
Dolayısıyla veri türü arttıkça fonksiyon sayıları da artacaktır.Bu da bir bakıma uygulama boyutunu ve
okunabilirliği ve hata denetlemeyi zorlaştıracaktır.
Buna karşın aşağıda verilen örneği inceleyelim:

template<typename T>/*template uygulanacak fonksiyon ve/veya class,template ile arsında boş satır bulunamaz.*/
void func_template(T _t)
{
cout << "func_template:" << _t << "\n";
}
//geri değer döndüren template fonksiyon:
template<typename T>
T func_return(T _t)
{
return _t;
}

int main()
{
func_template(44);
func_template(44.4);
func_template(true);
func_template('A');
func_template("merhaba");
//
cout << "func_return:" << func_return("kerim firat\n");
cout << "func_return:" << func_return(1225555);

return 0;
}
Yukarıda verilen örnekte beş farklı veri tip için ortak kullanılan bir template oluşturulmuştur.
Dolayısıyla hangi veri tipi giderse gitsin,anında dinamik olarak template konum alacaktır.
Aşağıda template dizi örneğine yer verilmiştir.
template<typename T>
void func_template(T tarray[])
{
  for(int i=0;i<5;i++)
  {
 cout <<tarray[i] << "\n";
  }
  cout << "\n";

}

int main()
{
    int int_array[] = {10,30,20,50,90};
    char chr_array[] = {'A','a','B','b','C','c'};
    func_template(int_array);
    func_template(chr_array);
return 0;
}


Template yapısını Class ile kullanmak pek farklı değildir. 
Aşağıda verilen ilk örnekte standart bir Class yapısı verilmiştir.İkinci örnekte ise 
template kullanılmıştır.
1.Örnek:
Bu örnek uygulamada tasarlanmış Item Class'ı sadece int türden veri kabul ediyor.
Şayet daha fazla veri tipleriyle çalışmak istersek,bu durumda ilgili veri tipleri için fonksiyon geliştirmek
gerekir.
class Item
{
private:
int value;

public:
Item():value(0)
{
}
void setItem(int _value)
{
value = _value;
}
int getItem() const
{
return value;
}
};
  
int main()
{
   Item item;
   item.setItem(44);
   int value  = item.getItem();
   cout << value;

return 0;
}

2.Örnek:

#include <iostream>
#include <string>
using namespace std;
template<class T>
class Item
{
private:
T value;

public:
Item():value(T())
{
}
void setItem(T _value)
{
value = _value;
}
T getItem() const
{
return value;
}
};
  
int main()
{
   //nesne tanımlarken veri tipi/türü belirleniyor:
   Item<int> item; //int
   item.setItem(44);
   cout << item.getItem() << "\n";
   //
   Item<string> item2; //string
   item2.setItem("Merhaba");
   cout << item2.getItem() << "\n";

return 0;
}

İyi Çalışmalar.


12 Haziran 2016 Pazar

-Java SE(Standart Edition) Eğitim Seti-

Java SE eğitim setime(85 saat) dijibil.com üzerinden şuan itibariyle 600 kişi erişmiş ve istifade etmiştir.
Daha nice mühendis ve adayların istifade etmesi dileğiyle...
Link:
 http://www.dijibil.com/course/java-se-programlama

3 Haziran 2016 Cuma

-C++ Vektör(vector) Kullanımı-


Merhabalar,

C++'da dinamik dizi kullanımı için "vector" sınıfı tercih edilebilir.
Bu sınıf her türden veri ya da nesne tutabilir. Ayrıca dinamik yapısı itibariyle
eleman eklendikçe otomatik olarak dizi boyutu büyür. Dolayısıyla C stili eski tip 
diziler yerine vector kullanmak iyi bir seçim olacaktır.
vector sınıfı içerisinde yer alan bazı fonksiyonlara aşağıda yer verilmişir.

-push_back() 
Veriyi dizinin sonuna ekler.

-pop_back()
Vektörün sahip olduğu son elemanı çıkarır.

-back()
vektörün son elemanını döndürür.

-swap()
Tüm vektör içeriğini başka bir vektöre aktarır.

-insert()
Vektör içine belirtilen bir konuma eleman ekler veya çıkarır.

-erase()
Vektör içinde belirtilen bir konumda bulunan elemanı çıkarır.

-size()
Vektör boyutunu döndürür.

-begin()
Vektör başlangıcını gösterir.

-end()
Vektör sonunu gösterir.

-clear()
Vektör içeriğini siler.


Vector sınıfını kullanabilmek için "using namespace std;" tanımlanmalıdır.
int türden bir vector dizi kullanımına aşağıda yer verilmiştir.

#include<bits/stdc++.h>
using namespace std;

int main() 
{
   vector<int> vect_array(10);//default olarak 10 eleman kapasiteli.
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
      std::cout << " " << vect_array[i];
    } 
    return 0;
}
Çıktı:
 0 0 0 0 0 0 0 0 0 0


Vektör içeriğine tanımlama esnasında eleman ekleme:
int main() 
{
   vector<int> vect_array(10,5); //10 elemanlı dizi boyutu ve her eleman için 5 değeri.
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
      std::cout << " " << vect_array[i];
    } 
    return 0;
}
Çıktı:
 5 5 5 5 5 5 5 5 5 5


Vektör içeriğine eleman ekle,çıkar ve swap kullanımı:
int main() 
{
   vector<int> vect_array(10,5);  
   
   //belirtilen bir konuma eleman ekle:
   vector<int>::iterator it = vect_array.begin() + 2;//başlangıçtan itibaren iki ileri.
   vect_array.insert(it,66);//ekle.
   
   //dizi sonuna eleman ekle:
   vect_array.push_back(21);
   vect_array.push_back(22);
   vect_array.push_back(23);
   
    //ekrana yazdır:
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
     cout << " " << vect_array[i];
    } 
    cout << "\n";
    //dizi içerisinden eleman çıkar:
    it = vect_array.begin() + 2;
    vect_array.erase(it);
  
   //ekrana yazdır:
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
     cout << " " << vect_array[i];
    } 
       cout << "\n";
    //swap kullanımı:
    vector<int> vect_array2(13,0);
    vect_array.swap(vect_array2);
        //ekrana yazdır:
   for(unsigned i= 0; i<vect_array.size(); i++)
    {
     cout << " " << vect_array2[i];
    } 
        
    return 0;
}
Çıktı:
 5 5 66 5 5 5 5 5 5 5 5 21 22 23
 5 5 5 5 5 5 5 5 5 5 21 22 23
 5 5 5 5 5 5 5 5 5 5 21 22 23


vector ile "fill" fonksiyonu kullanımı.
int main() 
{
   vector<int> vect_array(10,0);
   //dizi başından itibaren 4 adet 8 değerinde eleman ekle:  
   fill_n(vect_array.begin(),4,8);
   for(unsigned i=0; i<vect_array.size();i++)
   {
cout << " " << vect_array[i];
   }
    cout << "\n";
    
    //dizinin ilk 3 elemanından sonra 2 adet 7 değeri eleman ekle:
    fill_n(vect_array.begin() + 3,2,7);
    for(unsigned i=0; i<vect_array.size();i++)
    {
 cout << " " << vect_array[i];
    }
        
    return 0;
}

Çıktı:
 8 8 8 8 0 0 0 0 0 0
 8 8 8 7 7 0 0 0 0 0

İyi çalışmalar.

20 Mayıs 2016 Cuma

-C++ Tür Dönüştürme(Casting)-

Merhabalar,
Bu yazıda C++'da tür dönüştürme işleçlerini inceleyeceğiz. Fakat tür dönüştürmenin ne olduğu ile ilgili
temel bilgi verilmeyecektir.

C++'da beş adet tür dönüştürme işleçi vardır.Bunlar:
- Standart C'den kalan yöntem.
- static_cast
- const_cast
- dynamic_cast
- reinterpret_cast

Tür dönüştürme işlemlerine standart C yöntemiyle başlayacağız. Ancak C++ derleyicileri ayrıca otomatik olarak tür dönüştürme işlemleri gerçekleştirir. Dolayısıyla derleyiciye göre C++'de tür dönüştürme işleçleri,yukarıda yer verilen sayıdan farklılık gösterebilir. Derleyicinin sahip olduğu işleçlere değinilmeyecektir.

Standart C'den kalan yöntemin kullanımına aşağıda yer verilmiştir:

int sayi = 10.0;
double d = (double) sayi;

Standart yöntem gayet sade bir yapıya sahiptir. Ancak bu yöntemin kullanılması önerilmez.
Çünkü C++ derleyicisi bu kullanımda programcıya hiçbir şekilde katkı sağlamaz.
Dolayısıyla hatalı kullanım ve/veya uyarı durumlarda derleyici sessiz kalacaktır.

C++'da tür dönüştürme işlemi daha detaylı bir yapıya sahiptir. Yani birçok amaca uygun tür dönüştürme yöntemleri mevcuttur.

-static_cast:
Bu yöntem,isminden de anlaşıldığı gibi dinamik sözkonusu olmayan durumlarda kullanılır. Yani çalışma zamanı esnasında,dönüştürme işlemine tabi tutulan tür'den emin olmayı gerektirir.
Dolayısıyla derleme zamanında bilinen tür dönüşümlerde bu yapı kullanılabilir.
static_cast kullanımını gösteren bir uygulamaya aşağıda yer verilmiştir.
Örnek:
#include <iostream>
#include <typeinfo>

using namespace std;

class Model
{
public:
Model()
{
//
}
~Model()
{//...
}

};

class BMW : public Model
{
public:
void modelIsmi()
{
cout << "BMW" << endl;
}

};

class Mercedes : public Model
{
public:
  void modelIsmi()
{
cout << "Mercedes" << endl;
}
};

int main()
{
  Model *model1 = new Model();
  Model *model2 = new Model();
  
  BMW *model3 = static_cast<BMW*>(model1);
  model3->modelIsmi();
  
  Mercedes *model4 = static_cast<Mercedes*>(model2);
  model4->modelIsmi();

 return 0;
}



-const_cast:
const olarak tanımlanmış bir değişken,const olarak tanımlanmamış bir başka değişkene atanamaz.
Dolayısıyla aşağıda verilen örnekte hata meydana gelecektir.
Örnek:
const char* text = "Kerim FIRAT";
char *veri2 = text;

Ancak "const" tanımlı bir türü manipüle etmek için "const_cast" tür dönüştürme yapısı kullanılabilir.
Yani bu yapı "const" olarak tanımlanmış türler üzerinden kullanılır.
Aşağıda bu örneğe yer verilmiştir.
Örnek:

const char *text = "Kerim FIRAT";
char *text2 = const_cast<char*>(text);
cout << text2 << endl;



-dynamic_cast:
Bu dönüştürme yöntemi referans ve göstericiler(pointer) de kullanılır.
Dönüştürme işlemi başarısız olması durumunda geri dönüş değeri "NULL" olur.
Ayrıca üst sınıfta enaz bir adet "virtual" fonksiyon bulundurmak zorunludur.
Örnek:
using namespace std;

class Model
{
public:
Model()
{
//
}
virtual void modelIsmi()
{
}

~Model()
{//...
}
 };

class BMW : public Model
{
public:
virtual void modelIsmi()
{
cout << "BMW" << endl;
}

};

class Mercedes : public Model
{
public:
  virtual void modelIsmi()
{
cout << "Mercedes" << endl;
}
};

int main()
{

  Model *model1 = new Model();
  Model *model2 = new Mercedes();

  Model *model3;
  
  model3 = dynamic_cast<BMW*>(model1);
  if(model3 !=NULL)
  {
model3->modelIsmi();
  }else{
cout << "model3 BMW'ye dönüştürme hatalı.!" << endl;
  }

  model3 = dynamic_cast<Mercedes*>(model2);
  if(model3 !=NULL)
  {
 model3->modelIsmi();
  }else{
 cout << "model3 Mercedes'ye dönüştürme hatalı.!" << endl;
  }
   
 return 0;
}

Çıktı:
model3 BMW'ye dönüştürme hatalı.!
Mercedes


-reinterpret_cast:
Tür dönüştürme yapılarında en esnek çalışan yapı budur.
Bu yapıyla,her türden gösterici(pointer)'i her türlü gösterici türüne çevirebiliriz.
Bukadar esnek olmasındaki sebep ise aslında bit taşıyor olmasından kaynaklanıyor.
Yani dönüştürülecek nesnenin bit yapısını diğer nesneye kopyalar. 
Ancak kullanırken dikkatli olmalısınız. Esnek olması tüm türleri hatasız dönüştürecek diye bir anlam oluşturmaz.
Kullanım örneğine aşağıda yer verilmiştir.

int main()
{
int sayi = 44;
unsigned int *unsint = reinterpret_cast<unsigned int*>(&sayi);
cout << *unsint << endl;

    Model *model1 = new Model();
    Model *model2 = new Mercedes();
    
     BMW *model3;
     model3 = reinterpret_cast<BMW*>(model1);
     model3->modelIsmi();
     
     Mercedes *model4;
     model4 = reinterpret_cast<Mercedes*>(model2);
     model4->modelIsmi();
  return 0;
}

İyi çalışmalar..

15 Mayıs 2016 Pazar

-Java Properties Kullanımı-


Merhabalar,
Java uygulamaları geliştirirken,uygulama ile ilgili birtakım ayarlar belirleyip bu ayarları uygulamamızda varsayılan(default) ayarlar olarak kullanmamız gerekebilir.
Böyle bir durumda Java'nın "properties" özelliğini kullanabiliriz. Bu özellik bir dosya üzerinden çalışır.
Belirlediğimiz bilgileri "config.properties" isimli(isim belirleme geliştiricinin insiyatifindedir) bir dosyaya kaydedebilir,gerektiği durumda bu dosya içeriğini okuyarak bilgileri kullanabiliriz.
Aslında standart dosya işlemine benzerlik gösterir. Fakat Java'da bu işlemler için belirli yardımcı Class'lar mevcuttur.
Ancak başlıca kullanacağımız Class "Properties" dir.

Properties Class'ı "java.util" paketi altında bulunur. Bu Class "Hashtable<Object,Object>" Class'dan extends edilmiştir. 
Dolayısıyla "Hashtable"'nin belli özelliklere göre düzenlenmiş halidir. Ayrıca dosya işlemleri ile ilgili birtakım işlemler için iç Class barındırır.
Örneğin config içeriği okumayla ilgili esnek yapılar,convert(hex,..) ve Xml desteği vb. gibi..
Ancak bu makalede sadece standart kullanımı işlenmiştir.
Properties Class ile ilgili daha geniş bilgi için makale sonunda verilen linki inceleyebilirsiniz.

Properties kullanımını gösteren Java uygulamasına aşağıda yer verilmiştir. Verilen uygulamada iki adet Class kullanılmıştır.
Main.java Classı uygulamanın Main kısmını içerir. Config dosyasına aktarmak istediğimiz veriler burada belirlenmiştir.
İkinci Class ise MyPropertiesClass.java dır. Bu Class içersinde Properties işlemleri yer almaktadır.
Kod satırlarında gerek görülen yerlere yorum yazılmıştır.

Main.java:
import java.io.IOException;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
/*
* Config dosyasına kaydetmek istediğimiz verileri "key,value"
* şeklinde TreeMap içersine eklenmiştir.
*/
TreeMap<String, String> treeMap = new TreeMap<String, String>();
treeMap.put("username", "kerim");
treeMap.put("password", "1234");
treeMap.put("screenSize", "1280x720");
treeMap.put("sound", "music.mp4");
 
  
try {
//TreeMap ile belirlenen içerikler Properties için MyPropertiesClass'a gönderiliyor:
MyPropertiesClass.wirteProperties(treeMap);

//Config dosyası içeriği "key,value" şeklinde alınıyor ve ekrana yazdırılıyor:
TreeMap<String, String> treeMapRead = MyPropertiesClass.readProperties();
for(String key: treeMapRead.keySet()){
System.out.println(key+ "=" + treeMapRead.get(key));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

MyPropertiesClass.java:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Properties;
import java.util.TreeMap;

public class MyPropertiesClass {

//Ayarları kaydedeceğimiz config dosyası ismi belirtiliyor. İsim belirleme geliştirici insiyatifindedir.
private static String PROPERTIES_FILE = "config.properties";
    /*kaydedilecek ayarların key değerleri tutuluyor.
     * NOT:bu yöntem geçici olarak çalışır. uygulama kapatıldığında içeriğini kaybeder.
     * Dolayısıyla uygulama için belirlediğiniz config key değerleri kalıcı olarak tutulmalıdır.
     */
private static ArrayList<String> propertiesKey = new ArrayList<String>();
public MyPropertiesClass(){
///
}

//Main.java tarafından TreeMap olarak gelen "key,value" değerleri config dosyasına yazacak fonksiyonumuz:
public static void  wirteProperties(TreeMap<String, String> _treeMap) throws IOException{
//Properties nesnesi oluşturuluyor:
Properties properties = new Properties();
//Config dosyasına yazma işlemi için File nesnesi oluşturuluyor:
OutputStream outStream = new FileOutputStream(PROPERTIES_FILE);
//döngü vasıtasıyla TreeMap içeriği okunuyor:
for(String key : _treeMap.keySet()){
//config key'leri okuma işleminde kullanmak için tutuyorum.
propertiesKey.add(key);
//Config için belirlenen her "key,value" tek tek setProperty fonksiyonuna gönderiliyor:
properties.setProperty(key, _treeMap.get(key));
}
/*tüm config ayarları aktarıldıktan sonra yazma işlemi için "store" fonksiyonu çağrılıyor:
* store fonksiyonu ikinci parametre olarak comments değerini alır.Yani config dosyası ile ilgili bir girdi belirlenebilir.
* istenmediği durumda null değeri verebilirsiniz.
*/
properties.store(outStream, "ayarlar");
   //config dosyası kapatma işlemi:
if(outStream !=null){
outStream.close();
}

}

//Config dosya içeriğini okumak için çağırdığımız fonksiyon:
public static TreeMap<String,String> readProperties() throws IOException{
//Properties nesnesi oluşturuluyor:
Properties properties = new Properties();
//Config dosyasını okumak için File nesnesi oluşturuluyor:
InputStream inputStream = new FileInputStream(PROPERTIES_FILE);

//Config içeriği properties nesnesine yükleniyor:
properties.load(inputStream);

//Main.java tarafına göndermek için TreeMap oluşturuyoruz:
TreeMap<String, String> treeMap = new TreeMap<String, String>();
//Daha önce sakladığım config key'leri ile döngü oluşturuyoruz:
int size = propertiesKey.size();
    for(int i=0;i<=size - 1;i++ ){
    //getProperty fonksiyonu ile key değeri verilen config ayarları okunuyor:
treeMap.put(propertiesKey.get(i), properties.getProperty(propertiesKey.get(i)));
}

return treeMap;
}
}

Oluşturulan "config.properties" dosyası java projenize ait dizinde yer alır.
Config Dosya içeriği:

#ayarlar
#Sun May 15 19:09:02 GMT-12:00 2016
sound=music.mp4
username=kerim
screenSize=1280x720
password=1234

Program çıktısı:
password=1234
screenSize=1280x720
sound=music.mp4
username=kerim

Detaylı bilgi için:
https://docs.oracle.com/javase/tutorial/essential/environment/properties.html
https://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

İyi çalışmalar.

7 Mayıs 2016 Cumartesi

-Java Reflection Kullanımı -

Merhabalar,
Android Framework API geliştirirken,cihazın SIM kartları ile ilgili birtakım bilgileri kullanmam gerekiyordu.
Bu bilgilerin bulunduğu Java sınıfları(class) farklı dizinde ve paket içersinde bulunuyordu. 
İlgili class'lara Reflection(yansıtma) ile erişmeyi ve gerekli fonksiyon ve parametreleri kullandım.

Reflection; Java sınıflarına(class) erişim ve içeriğini kullanabilmek için geliştirilmiş bir kütüphanedir.
Reflection kütüphanesi 'java.lang.reflect' paketi altında bulunur. Bu paket altında bulunan Interface,Class ve Exception kalıplarıyla
Class'lar üzerinde esnek işlemler uygulamak mümkündür. Ancak bu makalede tüm 'java.lang.reflect' paket içeriğini değil,sadece 'Method' Class içersinde birkaç özellik kullanacağız.
İlk olarak 'Reflection' kavramını anlayabilmemiz için aşağıdaki basit örnek uygulama geliştirilmiştir.
Uygulama için 'MyClass' isminde bir Class oluşturuldu ve semboilk fonksiyonlar eklendi.
Örnek:

-MyClass.java:
package com.java.reflection;
public class MyClass {

private String name;
private int age;
private int ID;
public MyClass(){
///..
}

public void setName(String _name){
        name = _name;
}
public String getName(){
return name;
}

public void setAge(int _age){
age = _age;
}
public int getAge(){
return age;
}

public String toString(){
return name +" " + age; 
}
}

-Main.java:
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) {
/*
* MyClass.java Classı içersinde bulunan fonksiyonları-methodları listeleyeceğiz.
* Fonksiyonları elde edebilmek için 'reflect' paketi altında bulunan 'Method' Class'ı kullanılıyor.
*/
Method[] methods = MyClass.class.getMethods();//fonksiyon dizisi.
for(Method method: methods){//fonksiyon elde etme.
String name = method.getName();//fonksiyon ismine erişim.
System.out.println(name);
}

}
}
Çıktı:
toString
getName
setName
setAge
getAge
wait
wait
wait
equals
hashCode
getClass
notify
notifyAll

NOT: Java'da her Class aslında 'Object' class'ı taban alır. Yani gizli bir 'extends' işlemi uygulanır.
Bu durumda oluşturmuş olduğumuz 'MyClass' aslında 'Myclass extends Object' şeklinde konum alır.
Dolayısıyla yukarıdaki çıktıda Object class içeriğine ait fonksiyonlar da listelenmiştir.
Ancak aşağıda verilen örnekte sadece 'MyClass' içeriğine ait fonksiyonlar listelenecektir(kullanım farkını inceleyiniz).

Reflection işleminde belirtilen Class içeriğine ait fonksiyonları aşağıdaki gibi de elde edebiliriz.
Örnek:
public class Main {
public static void main(String[] args) {
try {
//erişilecek Class ismi paket ismi dahil açık şekilde belirtiliyor.
Class cls = Class.forName("com.java.reflection.MyClass");
//getDeclaredMethod fonksiyonu ile tüm fonksiyonlar Method[] dizi türünden döndürülüyor.
Method[] methods = cls.getDeclaredMethods();
for(Method method:methods){
System.out.println(method.getName());
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
Çıktı:
toString
getName
setName
setAge
getAge


Reflection kavramını biraz daha ileri götürelim ve MyClass içersinde bulunan fonksiyonlara parametre gönderip işletelim.
Aşağıda verilen örneği ve çıktıyı inceleyiniz.
Main.java:
public class Main {
public static void main(String[] args) {
try {
//erişilecek Class ismi paket ismi dahil açık şekilde belirtiliyor.
Class cls = Class.forName("com.java.reflection.MyClass");
//MyClass için instance oluştur.
Object obj =cls.newInstance();
/*setName fonksiyonu elde etmek için getMethod 1.parametre fonksiyon ismi,
* 2.parametre ise setName fonksiyonuna ait parametre türü belirleniyor.
* setName fonksiyonumuz 'String' türünde bir parametre aldığı için 'String.class'
* referansı belirleniyor.
* Bu durumda int parametre alan setAge fonkisyonunu için 'Integer.TYPE' belirlenmelidir.

*/
Method method1 = cls.getMethod("setName", String.class);
//fonksiyonumuzun ismi:
       System.out.println(method1.getName());
       //fonksiyonumuzun geri döndürdüğü değer tipi:
       System.out.println( method1.getReturnType());
       //invoke ile setName fonkisyonuna parametre gönderiyoruz:
       method1.invoke(obj, "KERİM FIRAT");
       
       /*setName fonksiyonunu çağırmak için nesneler oluşturuluyor.
        * cls.getMethod 2. parametrenin 'null' olduğuna dikkat edin.
        * Şayet bir fonksiyon parametre almıyorsa buraya null değer geçilir.
        * Aynı durum invoke çağrıldığında da uygulanmalıdır.
        */
       Method method2 = cls.getMethod("getName", null);
       //fonskiyon değeri elde etmek için invoke çağrılıyor:
       Object return_value1 = method2.invoke(obj, null);
       System.out.println("Adı-Soyadı:"+return_value1.toString());
       
       Method method3 = cls.getMethod("setAge", Integer.TYPE);
       method3.invoke(obj, 34);
       Method method4 = cls.getMethod("getAge", null);
       Object return_value2 = method4.invoke(obj, null);
       System.out.println("Yaş:"+return_value2);
           
}catch (Exception e) {
e.printStackTrace();
}
}
}
Çıktı:
setName
void
Adı-Soyadı:KERİM FIRAT
Yaş:34

Not:
Reflect paketi inceleme:https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/package-summary.html
Method Class inceleme: https://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html
İyi çalışmalar.