İnternetsizlik bu ara başımın en büyük belası. E sürekli de okumak bir şeyler öğrenmek isteği içerisindeyim. Hal böyle olunca bir bilgisayar mühendisi adayı olarak bu işe bir el attım :)
Ekşisözlükteki en sevdiğim başlıklardan biri olan öğrenildiğinde ufku iki katına çıkaran şeyler başlığı altındaki girileri 1 kereliğine çekip yerelde kaydedip internetsizken de okumak geldi aklıma.
Ruby diline yeni başladım ve bunu Ruby de yapmaya karar verdim. Bi amaç olmayınca sadece tutorial takip edince öğrenemediğimi iyi biliyorum.
Velhasıl kelam
kodlara buradan ulaşabilirsiniz. Yorum satırları düşmeye çalıştım. Umarım açıklayıcı olmuştur.
1 Aralık 2014 Pazartesi
16 Mart 2014 Pazar
Yolcu Yolunda
Uzun zamandır develoser olarak inandığımız ve uğraştığımız bir proje YOLCU. Yolcu: aynı zamanda aynı yöne giden insanları ortak bir araçta buluşturan çevre ve ulaşıma katkı sağlayabilecek mobil ortamda çalışacak uygulama ve web sitesi.
Şehir içi ayağından bahsedeyim ve Ankara'dan örnek vereyim hemen. Keçiören' de oturuyorsunuz ve işiniz dolayısıyla her sabah Kızılay' a gitmek zorundasınız. Sizin gibi binlercesi olduğunu siz de biliyorsunuz. Kimisi aracıyla, kimisi otobüsle yanınızdan geçip gidiyor. Bireysel giden çoğu kişinin arabasında yalnızca kendisi oluyor bu da gereksiz yere trafiği arttırıyor. Yolcu ile gideceğiniz yönü saati belirtebiliyorsunuz ve yakınınızda Yolcuyu kullanan insanlar bunu görebiliyor. Tabi siz de onları. Sonra iletişime geçiyor, bir araçta buluşup beraber gidiyorsunuz. İletişim de uygulama üzerinden gerçekleşecek ve mahremiyet korunacak tabi.
Şehirler arası kısmını ilan panolarından takip edebileceğiz. Mesela 31.08.2014 tarihinde İstanbul'a gideceğim deyip sürücü ya da otostopçu olduğunuzu da belirtebilecek ilan bırakabileceksiniz. İlanınıza cevabı da yine uygulama üzerinden alabilecek ve otobüse vereceğiniz paranın yarısını verip belki hiç vermeyip rahat bir yolculuk yapabileceksiniz :)
Objektif bakmaya çalışırsam düşünce olarak güzel ama uygulanabilirlik kısmında aksaklıklar olacaktır. Çünkü güven ciddi bir problem. Bunu aşmak için de bir kaç fikrimiz mevcut.
Google play linkini de buraya koymak kısa zamanda nasip olur inş :)
Uygulamadan bir kaç resim de paylaşayım havada kalmasın.
Şehir içi ayağından bahsedeyim ve Ankara'dan örnek vereyim hemen. Keçiören' de oturuyorsunuz ve işiniz dolayısıyla her sabah Kızılay' a gitmek zorundasınız. Sizin gibi binlercesi olduğunu siz de biliyorsunuz. Kimisi aracıyla, kimisi otobüsle yanınızdan geçip gidiyor. Bireysel giden çoğu kişinin arabasında yalnızca kendisi oluyor bu da gereksiz yere trafiği arttırıyor. Yolcu ile gideceğiniz yönü saati belirtebiliyorsunuz ve yakınınızda Yolcuyu kullanan insanlar bunu görebiliyor. Tabi siz de onları. Sonra iletişime geçiyor, bir araçta buluşup beraber gidiyorsunuz. İletişim de uygulama üzerinden gerçekleşecek ve mahremiyet korunacak tabi.
Şehirler arası kısmını ilan panolarından takip edebileceğiz. Mesela 31.08.2014 tarihinde İstanbul'a gideceğim deyip sürücü ya da otostopçu olduğunuzu da belirtebilecek ilan bırakabileceksiniz. İlanınıza cevabı da yine uygulama üzerinden alabilecek ve otobüse vereceğiniz paranın yarısını verip belki hiç vermeyip rahat bir yolculuk yapabileceksiniz :)
Objektif bakmaya çalışırsam düşünce olarak güzel ama uygulanabilirlik kısmında aksaklıklar olacaktır. Çünkü güven ciddi bir problem. Bunu aşmak için de bir kaç fikrimiz mevcut.
Google play linkini de buraya koymak kısa zamanda nasip olur inş :)
Uygulamadan bir kaç resim de paylaşayım havada kalmasın.
13 Ocak 2014 Pazartesi
Android İçin Reversi (Othello)
Eski mi eski bir zeka oyun reversi. Satranç ve dama gibi iki kişi ile oynanan bir oyun. Her hamlenizin amacı tahtadaki taşları sizin renginize çevirmek olmalı. Sizin renklerinizin arasına aldığınız tüm taşlar sizin renginize dönecek. Ne kadar çok taş o kadar puan. Oyun sonunda iki farklı renge sahip taşlar sayılacak ve fazla olan kazanacak.
Biz iki kişilik değil de telefona karşı oynanabilecek hale getirmeye çalıştık bunu. Yani biraz yapay zekalı oldu :) 2. Sınıf java projesi olarak sunmuştuk. (İlk defa recursive fonksiyon kullandığımız bir proje :))
Telefona mantıklı hamle yaptırma işi zordu ve bi o kadar eğlenceliydi. Çok zeki olduğu söylenemez ama oyunu biraz bilen birini yenebilir :) Baştan beni çok hızlı hamle yapma sıkıntısı vardı. Sonradan nasıl halledebileceğimizi bulduysak da heyecanı yitirdiğimizden olsa gerek uğraşmadık.
Buradan indirebilir oynayabilirsiniz. Tüm telefon ekranlarını desteklemediğini söylemeliyim tabi.


Biz iki kişilik değil de telefona karşı oynanabilecek hale getirmeye çalıştık bunu. Yani biraz yapay zekalı oldu :) 2. Sınıf java projesi olarak sunmuştuk. (İlk defa recursive fonksiyon kullandığımız bir proje :))
Telefona mantıklı hamle yaptırma işi zordu ve bi o kadar eğlenceliydi. Çok zeki olduğu söylenemez ama oyunu biraz bilen birini yenebilir :) Baştan beni çok hızlı hamle yapma sıkıntısı vardı. Sonradan nasıl halledebileceğimizi bulduysak da heyecanı yitirdiğimizden olsa gerek uğraşmadık.
Buradan indirebilir oynayabilirsiniz. Tüm telefon ekranlarını desteklemediğini söylemeliyim tabi.


31 Aralık 2013 Salı
Çocuklar İçin Hayvan Sesleri
Hayvan resimlerine basınca o hayvana ait sesi çocuklara duyurmak, hem resmini hem sesini aynı anda ulaştırabileceği için mantıklı ufak bir proje gibi geldi başta. Ama sonra ne yaptık ettik oyun yapalım bunu dedik :) Yine imdadıma yetişen andEngine oldu. Yürüyen kahramanımızı belirli aralıklarla sürpriz kutular bekliyor olacak. Bu kutulardan gelen soruları bildiğinde ilerleyebilecek ve bazı sorulardan ip ucu toplayacak. Bölüm sonunda bu ip uçları doğrultusunda cevap verebileceği bir soru sorulacak. Bilirse puan, yıldız tebrik elimden ne gelirse yaparım :) Çocuk oynayacak bunu :)
Yine yarım tabi bitirmek nasip olmuyor bu aralar.
Bi kaç ekran görüntüsü vereyim. Sonra apksını koymak da nasip olur inş. :)
19 Nisan 2013 Cuma
Linear Quotient
Bugün bağlantı olmadan çakışmaları çözme algoritmaları (collision resolution algorithms without links) üstünde duralım hadi. Uğraştıracak bir lab'ımız var bilmeden olmaz dedim, öğrendim sonra blogum vardı lan oraya da yazıyım dedim. :)
Klasik örneğimiz 27-18-29-28-39-13-16-42-17 sayıları.Her tarafta bunlar var diye şikayet etmiyoruz bu sayılar biraz özel çünkü. Kendimiz belirlesek sayılar bazı durumları test etmeyi atlarız o yüzden bu sayılar iyi neyse çok uzattım :)
Linear Quotient de ilk seferde sayılarımızın modunu alıyoruz yerleştirmeye çalısıyoruz. Peki yerleştireceğimiz yer doluysa?
İşte o zaman ikinci fonksiyonumuz devreye giriyor. O da şu işi görüyor: kayıt doluysa az uzağına bi yere yerleştiriyor kaydımızı. Bu uzaklık rastgele değil tabi.Fonksiyonlar geliyoorr.
hash1=key modP
hash2=Quotient(key/P) modP
Burada P gireceğimiz kayıt sayısından büyük ilk asal sayı.Asal sayı olması çakışmayı azaltması açısından çok mantıklı.
Hadi sayıları link olmadan tablomuza yerleştirelim.
ÇÖZÜM:
hash(27)=5 mod11
Tablomuz boş, sorunsuz yerleştiriyoruz.
İkinci kayıt için hash(18)=7 mod11
7 numaralı alan boş olduğundan, 18'i de sorunsuzca yerleştiririz.
hash(29)=7 mod11
Biz masum masum ilerlerken ahan da collision oldu. Ne yapcaz şimdi? Linear Quotient'te şöyle yapıyoruz: Sonradan geleni istediğimiz yere yazamayacaksak nereye yazacağımızı ikinci fonksiyona danışıyoruz.O da şöyledir: 29/11=2. Yani 29'u, mod 11'e göre yaptığımızdan dolayı, 11'e böldük. Bölen 2 çıktı. Bu bizim arttırım miktarımız.Yani home adress'ini 7 bulduk e dolu o zaman 7+2=9 a bak boşsa yaz.Baktık boş hemen yazalıım :)
Devam edelim.
hash(28)=6 mod11
6 numaralı adres boş olduğundan sorunsuzca yerleştiririz.
Sırada 39 var.
hash(39)=6 mod 11
Yine collision oluştu. 6 numaralı adrese az önce 28'i yerleştirmiştik. O zaman ikinci fonksiyonumuza danışalım ne diyor?
39/11=3. 6 numaralı home adress e yerleştiremedik. Artım miktarı 3 çıktığından, 3 birim sonrasına gideriz: 6+3=9 numaralı adres. Ancak 9 numaralı adreste de 29 değeri var."Aha o zaman ne yapcaz? Bize denmedi, kimse dolu olur demedi?" :) O zaman bir 3 birim daha gitmeliyiz. Ta ki boş alan bulana dek gideriz. (Ancak sonsuza kadar gidilmez değil mi? Baktık ki 6 numaralı adrese geldik tekrar, bu işlemi sonlandırmalıyız,patladı.). 9 numaralı adresten, 3 birim daha gidersek, 1 numaralı adrese gideriz. Orası boş, o halde 39'u yerleştirebiliriz.
Sırada 13 var.
hash(13)=2 mod11
2 numaralı alan boş, sorunsuzca yerleştiririz.
Sırada 16 var.
hash(16)=5 mod11
5 numaralı alan dolu.
16/11=1.
Yani 1 birim öteleyerek uygun/boş adresi bulacağız. 5 numaralı adres dolu idi. 1 birim sonrası:6 numara e burası da dolu. 1 birim daha ötelersek:7 numaralı yuhh bura da dolu. 1 birim daha ötelersek:8 numaralı alan boş heh:). 16 değerini 8 numaralı alana yerleştirebiliriz.
Sırada 42 var.
hash(42)=9 mod11
9 dolu!
42/11=3 Arttırım miktarı.
9 numaralı alandan 3 birim öteye gittik:1 numaralı göz de dolu. Yine 3 birim öeteye gittik:4 numaralı göz boş. O halde 42'yi buraya yerleştiririz.
Son olarak 17.
hash(17)=6 mod11
6 numaralı adres dolu olduğundan, hemen ikinci hash fonksiyonumuza danışıyoruz.
17/11=1 arttırım miktarını verdi.
6 numaralı göz doluydu. 1 birim gittik:7 numaralı alan da dolu. Yine 1 birim ötelersek, 8 numaralı alan da dolu. Hadi birkez daha öteleyelim:9 numaralı alan da dolu. Pes etmek yookk.. 10 numaralı göz boş. O halde hemen 17'yi hemen yerleştiriyoruz.
Average probe yaklaşık 1.9 çıkmakta imiş.Bundan önceki lab da EISCH ile uğraşmıştık.EISCH de average probe 1.3 - 1.4 civarlaradında ama onun da problemi link verdiği için fazladan hafıza işte.Zaten bir şey bi yerden iyiyse bir yerden kötü hep. Karamsar oldu o cümle ama öyle hep bi kulp buluyolar yesin hafızayı kurban olsun nedir :D He bu arada bi anlatımında tablo yapısı hoşuma gittiği için tablolar alıntıdır.
hash(27)=5 mod11
Tablomuz boş, sorunsuz yerleştiriyoruz.
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | 27 |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 |
İkinci kayıt için hash(18)=7 mod11
7 numaralı alan boş olduğundan, 18'i de sorunsuzca yerleştiririz.
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | 27 |
| 6 | |
| 7 | 18 |
| 8 | |
| 9 | |
| 10 |
hash(29)=7 mod11
Biz masum masum ilerlerken ahan da collision oldu. Ne yapcaz şimdi? Linear Quotient'te şöyle yapıyoruz: Sonradan geleni istediğimiz yere yazamayacaksak nereye yazacağımızı ikinci fonksiyona danışıyoruz.O da şöyledir: 29/11=2. Yani 29'u, mod 11'e göre yaptığımızdan dolayı, 11'e böldük. Bölen 2 çıktı. Bu bizim arttırım miktarımız.Yani home adress'ini 7 bulduk e dolu o zaman 7+2=9 a bak boşsa yaz.Baktık boş hemen yazalıım :)
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | 27 |
| 6 | |
| 7 | 18 |
| 8 | |
| 9 | 29 |
| 10 |
Devam edelim.
hash(28)=6 mod11
6 numaralı adres boş olduğundan sorunsuzca yerleştiririz.
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | 27 |
| 6 | 28 |
| 7 | 18 |
| 8 | |
| 9 | 29 |
| 10 |
Sırada 39 var.
hash(39)=6 mod 11
Yine collision oluştu. 6 numaralı adrese az önce 28'i yerleştirmiştik. O zaman ikinci fonksiyonumuza danışalım ne diyor?
39/11=3. 6 numaralı home adress e yerleştiremedik. Artım miktarı 3 çıktığından, 3 birim sonrasına gideriz: 6+3=9 numaralı adres. Ancak 9 numaralı adreste de 29 değeri var."Aha o zaman ne yapcaz? Bize denmedi, kimse dolu olur demedi?" :) O zaman bir 3 birim daha gitmeliyiz. Ta ki boş alan bulana dek gideriz. (Ancak sonsuza kadar gidilmez değil mi? Baktık ki 6 numaralı adrese geldik tekrar, bu işlemi sonlandırmalıyız,patladı.). 9 numaralı adresten, 3 birim daha gidersek, 1 numaralı adrese gideriz. Orası boş, o halde 39'u yerleştirebiliriz.
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | 39 |
| 2 | |
| 3 | |
| 4 | |
| 5 | 27 |
| 6 | 28 |
| 7 | 18 |
| 8 | |
| 9 | 29 |
| 10 |
Sırada 13 var.
hash(13)=2 mod11
2 numaralı alan boş, sorunsuzca yerleştiririz.
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | 39 |
| 2 | 13 |
| 3 | |
| 4 | |
| 5 | 27 |
| 6 | 28 |
| 7 | 18 |
| 8 | |
| 9 | 29 |
| 10 |
Sırada 16 var.
hash(16)=5 mod11
5 numaralı alan dolu.
16/11=1.
Yani 1 birim öteleyerek uygun/boş adresi bulacağız. 5 numaralı adres dolu idi. 1 birim sonrası:6 numara e burası da dolu. 1 birim daha ötelersek:7 numaralı yuhh bura da dolu. 1 birim daha ötelersek:8 numaralı alan boş heh:). 16 değerini 8 numaralı alana yerleştirebiliriz.
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | 39 |
| 2 | 13 |
| 3 | |
| 4 | |
| 5 | 27 |
| 6 | 28 |
| 7 | 18 |
| 8 | 16 |
| 9 | 29 |
| 10 |
Sırada 42 var.
hash(42)=9 mod11
9 dolu!
42/11=3 Arttırım miktarı.
9 numaralı alandan 3 birim öteye gittik:1 numaralı göz de dolu. Yine 3 birim öeteye gittik:4 numaralı göz boş. O halde 42'yi buraya yerleştiririz.
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | 39 |
| 2 | 13 |
| 3 | |
| 4 | 42 |
| 5 | 27 |
| 6 | 28 |
| 7 | 18 |
| 8 | 16 |
| 9 | 29 |
| 10 |
Son olarak 17.
hash(17)=6 mod11
6 numaralı adres dolu olduğundan, hemen ikinci hash fonksiyonumuza danışıyoruz.
17/11=1 arttırım miktarını verdi.
6 numaralı göz doluydu. 1 birim gittik:7 numaralı alan da dolu. Yine 1 birim ötelersek, 8 numaralı alan da dolu. Hadi birkez daha öteleyelim:9 numaralı alan da dolu. Pes etmek yookk.. 10 numaralı göz boş. O halde hemen 17'yi hemen yerleştiriyoruz.
| Sıra | Anahtar Değeri |
| 0 | |
| 1 | 39 |
| 2 | 13 |
| 3 | |
| 4 | 42 |
| 5 | 27 |
| 6 | 28 |
| 7 | 18 |
| 8 | 16 |
| 9 | 29 |
| 10 | 17 |
Average probe yaklaşık 1.9 çıkmakta imiş.Bundan önceki lab da EISCH ile uğraşmıştık.EISCH de average probe 1.3 - 1.4 civarlaradında ama onun da problemi link verdiği için fazladan hafıza işte.Zaten bir şey bi yerden iyiyse bir yerden kötü hep. Karamsar oldu o cümle ama öyle hep bi kulp buluyolar yesin hafızayı kurban olsun nedir :D He bu arada bi anlatımında tablo yapısı hoşuma gittiği için tablolar alıntıdır.
19 Ekim 2012 Cuma
Bağlı Listeler (Linked List)
C de linked list (bağlı liste )kullanarak küçükten büyüğe sıralı liste kullanıma ufakcana bi örnek :)Üstteki resmi linked list deyince gözümüz kapalı çizeriz de nedir ne yapıyoruz la burda deseler az bi zorlanırız heralde:)İlk sınıflar için bu lafım tabi. Bi kere neden ihtiyaç duyulmuş bunu bilmek gerek.Kafadan dinamik bellek kullanıyo ki bu da memory management diye üstüne düştüğümüz probleme bir çözüm.Bir şeyler eklemek ve silmek de normal arrayde yaptığımız işlemlerden çok daha kolay.Yani zamandan da kazanıyoruz.Şu bizim bayram ödevinin ilk sorusuna da temel olsun, uzatmayım kodları vereyim :) Buradan indirin kolay gelsin.İndirmek istemeyen de buyursun:
#include < stdio.h >
#include <stdlib.h >
#include < conio.h >
struct node
{
int value;
struct node *next;
};
typedef struct node node;
void initialization();//listeye ilk deðer verme islemleri
void add(int,node**);//eleman eklemek icin fonk
int main () {
initialization();
getch();
return 0;
}
void initialization(){
node *current ,*head;
head=NULL;
int added=1;
printf("Listenizin elemanlarini girin\nbitirmek icin 0 basin :\n");
while(added!=0){
scanf("%d",&added); //her seferinde elemanlar alýnýyor
add(added,&head);//her seferinde eklenmek üzere fonksiyona gönderiliyor
printf("\n");
}
printf("Bagli listenizin elemanlari sirasiyla :\n");
current=head;
while (current) { //NULL görene kadar devam
printf("%d\n",current->value);
current=current->next;
}
}
void add(int a,node** head){ //sýralý eklemek yapmak icin
node *previous=NULL,*added,*current;
added=(node*)malloc(sizeof(node));//ihtiyac oldukca belek ayýrýyor
added->value=a;//gelen deðeri value kýsmýna atýyor
added->next=NULL;// göstericisini sýfýrlýyor
current=*head;
while (current!=NULL && (added->value)>current->value){ //sýralý ekleme yapmak icin
previous=current;
current=current->next;
}
if(previous==NULL)
*head=added;
else{
previous->next=added;
}
added->next=current;
}
#include < stdio.h >
#include <stdlib.h >
#include < conio.h >
struct node
{
int value;
struct node *next;
};
typedef struct node node;
void initialization();//listeye ilk deðer verme islemleri
void add(int,node**);//eleman eklemek icin fonk
int main () {
initialization();
getch();
return 0;
}
void initialization(){
node *current ,*head;
head=NULL;
int added=1;
printf("Listenizin elemanlarini girin\nbitirmek icin 0 basin :\n");
while(added!=0){
scanf("%d",&added); //her seferinde elemanlar alýnýyor
add(added,&head);//her seferinde eklenmek üzere fonksiyona gönderiliyor
printf("\n");
}
printf("Bagli listenizin elemanlari sirasiyla :\n");
current=head;
while (current) { //NULL görene kadar devam
printf("%d\n",current->value);
current=current->next;
}
}
void add(int a,node** head){ //sýralý eklemek yapmak icin
node *previous=NULL,*added,*current;
added=(node*)malloc(sizeof(node));//ihtiyac oldukca belek ayýrýyor
added->value=a;//gelen deðeri value kýsmýna atýyor
added->next=NULL;// göstericisini sýfýrlýyor
current=*head;
while (current!=NULL && (added->value)>current->value){ //sýralý ekleme yapmak icin
previous=current;
current=current->next;
}
if(previous==NULL)
*head=added;
else{
previous->next=added;
}
added->next=current;
}
6 Ekim 2012 Cumartesi
BCD (Binary Coded Decimal) muhabbeti nedir?
Genel olarak kodlama, görülebilen, okunabilen, yazı ve sayı işaretlerin değiştirilmesidir. Bu değiştirme şekli, metodlarla yapılır. Bu metodlara kodlama denir.
Bir çok kodlama sistemi vardır. Sayısal kodlamanın yanında normlandırılmış (mors alfabesinde olduğu gibi) kodlamada vardır. Bu sistemde harfler, rakamlar ve cümle parçaları başka başka kodlandırılır.
Decimal İçin Binary Kodlaması - (BCD) Bir çok kodlama sistemi vardır. Sayısal kodlamanın yanında normlandırılmış (mors alfabesinde olduğu gibi) kodlamada vardır. Bu sistemde harfler, rakamlar ve cümle parçaları başka başka kodlandırılır.
En basit kod sistemi "Binary Code Decimal" kısaca ifade edildiği gibi "BCD" kodudur. Bu kod 'da 0 - 9 decimal sayılarının ifadesi için, binary sayı sistemi kullanılır. BCD sayıları 0 ve 1 ile ifade edilirler.
Decimal Sayıları
|
Binary Sayıları için Binary Kodu
| ||||||||||||||||||||
|
|
Bu kod sisteminde her decimal sayı karakteri için, dört bitli binary karakteri kullanılır.
Decimal
|
BCD
| ||||||||||||||||||||
|
|
Burada görüldüğü gibi, her decimal sayısı, dört bitli bir binary kod 'u ile ifade edilmiştir.
Binary için 10 decimal sayısı 1010 dır. BCD kodu ile, 10 sayısı 0001 0000 olarak yazılır. yani her basamak kendi içinde binary 'e çevrilir.
Decimal
|
Binary
|
BCD
| ||||||||||||
|
|
|
Herhangi bir aritmetik işlem varsa önce çözüm bulunur sonra BCD kodlamasına geçilirmiş bu da bi bilgi :)
Kaydol:
Kayıtlar (Atom)








