1 Aralık 2014 Pazartesi

Ruby HTML parse örneği

İ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.

https://github.com/Cutta/EksiSozlukInRuby

Bu da ekran görüntüsü 

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.



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.





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.

SıraAnahtar Değeri
0
1
2
3
4
527
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ıraAnahtar Değeri
0
1
2
3
4
527
6
718
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ıraAnahtar Değeri
0
1
2
3
4
527
6
718
8
929
10


Devam edelim.
hash(28)=6 mod11
6 numaralı adres boş olduğundan sorunsuzca yerleştiririz.

SıraAnahtar Değeri
0
1
2
3
4
527
628
718
8
929
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ıraAnahtar Değeri
0
139
2
3
4
527
628
718
8
929
10

Sırada 13 var.
hash(13)=2 mod11
2 numaralı alan boş, sorunsuzca yerleştiririz.


SıraAnahtar Değeri
0
139
213
3
4
527
628
718
8
929
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ıraAnahtar Değeri
0
139
213
3
4
527
628
718
816
929
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ıraAnahtar Değeri
0
139
213
3
442
527
628
718
816
929
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ıraAnahtar Değeri
0
139
213
3
442
527
628
718
816
929
1017

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;
         }






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) 
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
0
1
2
3
4
5
6
7
8
9
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
Bu kod sisteminde her decimal sayı karakteri için, dört bitli binary karakteri kullanılır.
Decimal
              BCD
      25(Erzurum:)
32
679
2571


0010
0101


0011
0010

0110
0111
1001
0010
0101
0111
0001
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
141
2179
10001101
100010000011

0001
0100
0001
0010
0001
0111
1001
Herhangi bir aritmetik işlem varsa önce çözüm bulunur sonra BCD kodlamasına geçilirmiş bu da bi bilgi :)