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.