24 Haziran 2014 Salı

Java Streamleri

BufferedInputStream
close metodu
BufferedInputStream kapanırken kendisine verilen stream'i de kapatır.

17 Haziran 2014 Salı

Sosyal Ağlarda İlişki

Facebook
İki insanın birbirlerine arkadaşlık göndermesi gerekir. Arkadaşlık isteği kabul edildikten sonra birbirlerinin duvarlarına mesaj gönderme (post) ve görme imkanını elde ederler.

Twitter ve Instagram
Daha esnek olan izleyen ve izlenen ilişkisi kullanılır. 

IEEE 754 ve Yuvarlama

Not : Konuyla ilgili olarak IEEE 754 başlıklı yazıya göz atabilirsiniz.

Yuvarlama İşlemleri
Yuvarlama (rounding) küsuratlı sayının tam sayıya çevrilmesi demek. 


Standart Yuvarlama Yöntemleri
Burada yuvarlama formüllerini gösteren güzel bir şekil var. Bir çok programlama dili bu yuvarlama yöntemini metod olarak sunuyor.


Round (Away FromZero) aşağıdaki gibi gerçekleştirilebilir. 

Standart Olmayan Yuvarlama Yöntemleri
Aşağıda programlama dilleri tarafından sunulmayan ve pek te karşımızı çıkmayan yuvarlama yöntemlerini not ettim.

Eksiyi Koruyan Ceil
Buradaki örnekte ceil'in tersine eksi sayılar daha da küçülüyor.
f(0.1) = 1
f(-0.1) = -1
f(0.0) = 0
İki şekilde kodlanabilir.
rounded = Math.ceil(Math.abs(toBeRounded)) * Math.signum(toBeRounded);
veya
rounded = Math.copySign(Math.ceil (Math.abs(toBeRounded)),toBeRounded);


Sayıyı Başka Bir Sayının Katı Olacak Şekilde Yuvarlama
Örneğin 201 gibi bir sayı 300'e yuvarlanır. 14 sayısı 100' yuvarlanır.
Algoritma aşağıdakine benzer
int round (int number,int multiple){
    int result = multiple;

    //If not already multiple of given number
    if (number % multiple != 0){
        int division = (number / multiple)+1;
        result = division * multiple;
    }
    return result;
}
Burada da benzer bir cevap var ancak genel bir algoritma sunmamış.

Bir diğer yöntem ise aşağıda. Kolay okunsun diye parantezleri renklendirdim.
#define ROUND_UP (x,multiple) ( ( (int) (x)+ (multiple -1) ) ) & ~ (multiple -1)

#define ROUNDA_DOWN (x,multiple) ( (int) (x) & ~ (multiple -1) )

C
ceil
ceil() ve ceilf aynı işlevi görürler. Kabaca şöyledirler:
return ( (v < 0.0 ) ? v : (v +1) );

floor
floor() kabaca şöyledir.
return ( (v < 0.0) ? ( v - 1.0) : v ); 

round ve roundf
Bu metodlar verilen kayan sayıyı en yakın integer'a yuvarlar. 

Yuvarlama yönünü fegetround() ve fesetround() metodları ile değiştirebiliriz.

Sayıyı belli bir küsürata yuvarlamak için round() metodu dışında, buradaki  gösterildiği gibi floorf veya ceilf metodları kullanılabilir.

C++
Yuvarlama işlemi fesetround() ile yapılır. Örnek:
Java
Math.Floor ve Math.Ceil metodları var.

Yuvarlama yaparken kaç hane istediğimizi belirtmek istersek aşağıdaki kodu kullanabiliriz.
static Double round(Double d, int precise) {
    BigDecimal bigDecimal = new BigDecimal.valueOf (d);
    bigDecimal = bigDecimal.setScale(precise, RoundingMode.HALF_UP);
    return bigDecimal.doubleValue();
}

C#
Aynı Java'daki gibi Math.Floow ve Math.Ceil metodları var.
Math.Ceiling(num) // Rounds up
Math.Floor(num) // Rounds down
Math.Round ile yuvarlamak yöntemi ve kaç hane istendiği belirtilebilir. Örnek:
Math.Round(value, 2, MidpointRounding.AwayFromZero);
SQL
round metodu ile haç haneye kadar yuvarlama istendiği belirtilebilir.


10 Haziran 2014 Salı

AR-GE

AR-GE projelerinde işin tanımsız olması gerekiyor. Tanımlı işlerin gerçekleşmesi uygulama sayılır.

AR-GE projeleri de normal iş akışını takip ederler

I have a concept or an idea
I draft the concept/idea on paper. 
I do a prototype.
I realize a semi-working version I can use. 
I end up with a working product which is used by me and eventually a few other people.
I ship a stable product to a limited number of people.
The product is a commercial success and achieved to become popular.


6 Haziran 2014 Cuma

Sıralama - Ordering

QuickSort
Quicksort recursive (özyineli) veya sıralı olarak yazılabilir. Burada algoritma dans ile gösteriyor. Açıklaması şöyle
The quicksort algorithm is based on the partitioning procedure. Partitioning procedure works like this: You pick an element from the array to be the pivot. Your array will be divided into two subarrays around the pivot item. Elements larger than the pivot will end up in the right subarray and the ones that are smaller will end up in the left subarray.
...
If you keep applying this partitioning procedure recursively to the left and right subarrays until you reach subarrays of size 1, you will obtain a sorted array. 
Recursive Yöntem
Bu algoritmayı recursive şeklinde aratınca karşımıza bu sayfa çıkıyor. Sayfadaki algoritmada partition metodunda gereğinde fazla swap() yapılıyor. Daha iyi çalışan bir kod ise burada.


23 Mayıs 2014 Cuma

Inner Class

Inner Class
Inner class veya nested class veya local class iç içe bulunan sınıfları belirtir. Hemen her nesneye dayalı programlama dilinde bu özellikle bulunur

Programlama Dillerinde Kullanımı
C++
Inner Class yazısına taşıdım.

Java
Inner Class yazısına taşıdım.

19 Mayıs 2014 Pazartesi

Overloading

Giriş
Method overloading C hariç, C++, Java, C# gibi ana dillerin hepsinde var. Kurallar birbirlerine benziyor. Aşağıda konu hakkında aldığım notlar var. Overloading desteklemeyen C gibi dillerde de printf benzeri variadic functions ile işi çözmeye çalışmışlar.

Compile Time (Static) Polymorphism
Polymorphism iki çeşit olabilir. Dynamic ve Static. Static polymorphism derleme zamanında overload edilen metodlar ile gerçekleştirilir.

Return Type Overloading İçin Kullanılmaz
Overloading aynı isimli metodların farklı parametreler almasıdır. Metodun döndürdüğü tip overload edilmesinde etkili değildir.

Overloading
Overloading kullanırken dikkat edilmesi gereken kural, derleyici her zaman "most specific argument" kuralını uygular. Bu kural Java ve C# için de geçerlidir.

Buradaki C# örneğinde null verilen parametre object yerine double [] alan metodun çağırılmasına sebep oluyor. Açıklaması ise yukarıdaki ile aynı. Hiyerarşide "most specific argument" ı bulmak için T1  yani double [] ile object arasında dönüşüm olmalı ancak object 'ten double [] 'ye dönüşüm olmamalı.


Overloading ve Kalıtım
Kalıtım ve overloading bence yanyana gelmemesi gereken iki şey. Mümkünse kullanmamak en iyisi. Kalıtan sınıfın herhangi bir metodu çağrılabilecek durumda ise, yukarıda "most specific argument" kuralı gerçersiz olabiliyor, ve ilk bulunan metod çağrılabiliyor. Örnek:

Overloading ve Hiding Arasındaki Fark
Hiding için kalıtım gerekir.
C++
Metod parametresi değişirse alt sınıfın metodu hide edilir. Örnek'te B sınıfı A sınıfının f metodunun saklanmasına sebep olur.

A {
public:
  void f(int i) {cout << i;}
};

class B: public A {
public:
  void f(string s) {cout << s;}
};

void main() {
  A a;
  B b;

  a.f(1);
  b.f("zazaza");
  b.f(1); //Compilation fail
}
C++'ta using ifadesi ise hide edilen metod tekrar kullanıma açılabilir. Yukarıdaki örnek'te A'nın metodunun unhide edilmesi şöyle yapılır.

class B: public A
{
public:

    using A::f;
    //^^^^^^^^^

    void f(string s)
    {
        cout << s;
    }
};

C#
Eğer sadece return type değişirse bir metod diğerini saklar.  C# örneğinde hiding gösteriliyor.

public class S
{
    public S()
    {
    }

    public int myFunc(int a, int b)
    {
        return a + b;
    }
}

public class M:S
{
    public M()
    {
    }

    public string myFunc(int a, int b)
    {
        return (a + b).ToString();
    }
} 

public class Test
{
    public static void Main(string[] args)   
    {
         M mm = new M();
         mm.myFunc(1,2);   // Why I am not able to access S class myFunc
    }
}