24 Mart 2015 Salı

Java Persistence API


     Daha önceki JSF yazılarımda ve çalışmalarımda java ile bir web sitesi yaparken veritabanı bağlantısı için Hibernate kütüphanesinden faydalanmıştım. Java Web ile ilk karşılaştığımda karşımda JSF , PrimeFaces ve Hibernate görmüştüm. Sonraki süreçte hep bunları öğrenmeye çalıştım. Tabi birisi bizi bu süreçte yönlendirmiyorsa işimiz çok zor olacaktır. Öğrenmek istediğimiz konu ile ilgili dökümanlara baktığımızda hep birbirinden farklı java teknolojilerinin bir arada kullanıldığını görürüz. Peki ama hangilerini bilmeliyim , hangi sıra ile öğrenmeliyim? İşte kritik soru bu ve bu sorunun cevabını bilmiyorsak süreç hem uzayacak hem de bir şeyler öğrenmek ve anlamak için debelenmeye başlayacağız demektir. Ayrıca bu karmaşa bizi javadan da soğutabilir.

     Burada bence ilk java toplulukları tarafından kabul görmüş java standartlarını öğrenmemiz faydalı olacaktır. Doğru bir yerden başlayınca diğerler teknolojilerin ne işe yaradığını görüp düzgün bir sıra ile öğrenmeye başlayacağız demektir. Ben bunu geçte olsa fark ettim ve bir java standardı olan Java Persistence API öğrenmeye karar verdim. Eğer sizlerde veritabanı işleri için Hibernate öğrenmemişseniz JPA ile başlamak uygun olacaktır.

     JPA ORM tabanlı bir teknolojidir. Her bir tablomuz için bir java sınıfı oluşturur. Bu sınıflar tablolar arasındaki ilişkileri içerecek şekilde dizayn edilmiştir. Böylece veritabanımız nesne tabanlı java koduna dönüşmüş olur. Bunlara genelde "entity" deniyor. Bağlantıyı kurup entity leri oluşturduktan sonra yapmamız gereken verilerimizi bu sınıflara aktarmaktır. JPA da bu verileri kullandığımız veritabanı formatına uygun hale getirip işlemlerimizi gerçekleştirecektir. Daha detaylı bilgi için aşağıdaki linke göz atabilirsiniz;

http://www.tutorialspoint.com/jpa/

     JPA nın da Hibernate de olduğu gibi kendine has bir SQL dili de mevcut. Bu JPQL deniyor. Kullanımı oldukça basit , yine buna da yukarıdaki linkten göz atabilirsiniz.

     Aşağıda sadece JSF , Primefaces ve JPA kullanarak uygulamalar yaptım. Bunlar birbirinin devamı olup sıra ile izleyebilirsiniz. Şimdilik 3 video çektim devamını getirmeyi ve en son halinin kodunu paylaşmayı düşünüyorum. Bunun için daha birsürü video çekmem gerekiyor. Çektiğim videoları buraya sonradan eklemeyeceğim. Eğer izlemek isterseniz youtube kanalımdan takip edebilirsiniz. Şimdilik bu kadar , sizlere kolay gelsin!











19 Mart 2015 Perşembe

Arduino Su seviye Sensörü


     Bir önceki yazımda birçok yeni parça olduğunu ve bunları tek tek test ettiğimizi yazmıştım. Bunlardan bir tanesi de ismini internette bir türlü saptayamadığım bir sensör var. Bu sensöre (kullanım amacına göre galiba)  su sensörü , su seviye sensörü , su derinlik sensörü ve yağmur sensörü gibi isimler vermişler. Ben su seviye sensörü demeyi tercih ettim.

    Sonuçta bu da bir sensör ve kullanımı oldukça basit. Üzerinde 3 bacak var , bunlardan biri vcc(+) , biri gnd(-) , sonuncusu da değer dönderen bacak ki biz bunu analog girişlerden herhangi birisine bağlayabiliriz.

    Çalışma prensibi bir çok sensörde olduğu gibi direnç değişimiyle ölçülüyor. Suyun sensöre değme miktarına göre sensörden okunan direnç değeri değişiyor. Bize de bu değerlere göre yapmak istediklerimizi ilgili kod bloğuna yazmak düşüyor. Aşağıda basit bir örnek kod var , eğer izlemek isterseniz de test ederken çektiğimiz video mevcut. Şimdilik bu kadar sizlere kolay gelsin!




void setup() {
  
  Serial.begin(9600);
  
}
void loop() {
  
  int sensorValue = analogRead(A0);
  
  Serial.println(sensorValue);

}




15 Mart 2015 Pazar

Arduino Servo Motor Kontrol



     Arkadaşlarımın Çin'den sipariş verdiği Arduino seti gelmiş. Bu setin içerisinde birçok sensör , motor ve devre elemanları mevcut. Bu ürünler gelmeden önce çok bir beklentim yoktu ancak gelince gördüm ki işimize yarayacak birçok sensör ve motor mevcut. Ayrıca buradan aynılarını almaya kalksak 2-3 katı para ödememiz gerekiyor.

     Görünürde parçalar aslının aynı ama yine de çalışmama ihtimali var. Bizde arkadaşlarla başına oturduk çoğunu test ettik. Hareket sensörü(PIR) hariç geri kalanı sorunsuz çalıştı. Bunlardan bir tanesi de servo motor oldu.



     Aşağıda Arduino içerisinde hazır bulunan Sweep uygulaması var. Kod görüldüğü gibi çok basit. Servo kütüphanesini import etmiş , 9 nolu pini servonun veri aktarılan bacağına bağlamış ve bunu kod içerisinde belirtmiş. Sonrasında iki for döngüsü ile servoyu 0-180 ve 180-0 derece arası dönmesini sağlamış.

     Bu ilk test aşaması olduğundan biz oturup kod yazmadık ama görüldüğü gibi servo motor kullanmak çokta zor değil! Aşağıda devre şeması ve örnek kod mevcut. Sonraki yazılarda su seviye sensörü ve step motoru da test ettik onları da inceleyebilirsiniz. Şimdilik bu kadar size kolay gelsin!




#include  
 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
} 
 
 
void loop() 
{ 
  for(pos = 0; pos < 180; pos += 1)  // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=1; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
}


11 Mart 2015 Çarşamba

Web Tasarım



     Herhangi bir web sitesi yaparken en zorlandığımız veya uğraşmayı sevmediğimiz kısım tasarım kısmıdır. İyi ve özgün bir tasarım için CSS , HTML ve Javascript'i iyi bilmeliyiz. Eğer dinamik bir web sitesi yapıyorsak bunlara  arka planda çalışan kodlarımızı da ekleyelim. Bunların dışında telefon , tablet gibi değişen ekran boyutları için CSS yazmamız veya mobil site tasarımı yapmamız gerekiyor. Bu da sonuç olarak tasarıma ayırmamız gereken zamanı arttırıyor. Bu gibi etkenlerden dolayı piyasada çeşitli platformlar için tasarımı hızlandıran  yazılımlar , kütüphaneler mevcut. 

     Bu yazı içerisinde tasarımı hızlandıracak , görsel olarak güzel ve en önemlisi de açık kaynak çalışmalardan ve bunları deneyebileceğimiz github.io dan bahsetmeye çalışacağım. 

1) CodePen

     Bu sitede bir web sitesinde olabilecek birçok hazır tasarımı kodlarıyla birlikte bulabiliriz. Açık kaynak olduğu için kodları direk alıp kendi çalışmalarımızda kullanabiliriz. Sitenin diğer güzel özelliği ise aynı zamanda editör olmasıdır. Site içerisindeki hazır çalışmaların Html , Css ve Javascript'ini düzenleyip anında önizlemesini görebiliriz. Ayrıca üye olup veya GitHub üyeliğimizle giriş yaparak sıfırdan kendimizde tasarımlar oluşturabiliriz. Siteyi ziyaret etmek için üstteki linke tıklayarak gerçekten güzel ve farklı tasarımların mevcut olduğunu görebilirsiniz.  


    Bu sitede bir önceki gibi hazır tasarımlar yok , ama çok fazla kütüphane desteği var. Böylece kendi yazdığımız veya internette bulduğumuz farklı kütüphaneler gerektiren kodları burada sorunsuzca çalıştırabiliriz. Diğer bir güzel özelliği de herhangi bir şekilde üye olmaya gerek duymadan yaptığımız çalışmayı kaydetmesidir. Böylece yarım kalan işimizi kaydedip yukarıda oluşturduğu linki alırsak daha sonra kaldığımız yerden devam edebiliriz.

3)Page Scroll 

     Bazı sitelerde menubardan seçtiğimiz sekmeye göre sayfa aşağı veya yana doğru güzel bir efekt ile tam sayfa kayıyor. Birde buna renk değişimi eklenmişse son derce güzel oluyor. Kafamızda tam canlanmamışsa aşağıdaki linke bakabilirsiniz.


     Bu ve buna benzer birçok hazır çalışma mevcut. Bu çalışmalar yine açık kaynak ve github üzerinde kaynak kodları mevcut. Bizim yapmamız gereken ise bu javascript ve css kodlarını indirip projemize dahil etmek. Eğer yukarıdaki hoşunuza gitmemişse aşağıdan alternatiflerine de göz atabilirsiniz;




  
     Yukarıdaki gibi hazır kodları kullanıp gerçekte nasıl olduğunu görmek isterseniz aşağıdaki GitHub io kısmına da göz atabilirsiniz.

GitHub io

     Bilmeyenler için  GitHub açık kaynak kodların bulunduğu yazılımcıların kullandığı bir sosyal ağ olarak tanımlayabiliriz. Eğer hesabınız yoksa oluşturup açık kaynak ile tanışmanızı tavsiye ederim. Github io ise burada hesabı olan kişilerin çalışmalarını tanıtabileceği github üzerinde çalışan web sayfasıdır. Bu web sayfası example.github.io şeklinde olup isteyen herkes oluşturabilir. 

     Bu yazıda github io dan bahsetmemin asıl sebebi yukarıda da belirttiğim gibi yaptığımız tasarımları yayınlayıp bilgisayar , tablet ve telefon üzerinde veya farklı tarayıcılar üzerinde nasıl çalıştığını gözlemlemektir. Burada kodlarımızın herkes tarafından görülebileceğini unutmamalıyız. 

     Github hesabımız varsa çalışmalarımızı tanıtan github io sayfası oluşturmak 1 dakikamızı alacaktır. Bunun nasıl yapıldığını aşağıdaki videoyu izleyerek görebiliriz.



     Ben github sayfamı oluşturdum. Yukarıdaki 3. madde de geçen fullpage.js kullanarak kendi çalışmalarımı gösteren bir sayfa tasarlamış oldum. (son derece hızlı bir şekilde!) Aşağıdaki linkten de benim sayfama erişebilirsiniz! Şimdilik bu kadar sizlere kolay gelsin!





     

7 Mart 2015 Cumartesi

Arduino Ethernet Shield SD Kart Uygulama


   
     Elimizde Arduino'ya bir şekilde bağlayabileceğimiz hafıza kart yuvası varsa  bunun çalışıp çalışmadığını kolay bir şekilde anlayabiliriz. Bunun için tek yapmamız gereken Arduino IDE içerisindeki hazır örneklerden SD sekmesinde bulunan uygulamaları açıp çalıştırmak. Aşağıda bu örnekler içerisinde bulunan ReadWrite uygulamasını görebilirsiniz. Bu uygulama ile nasıl belge oluşturup içerisine veri yazabileceğimizi ve bu belgeyi Arduino üzerinden nasıl tekrar okuyabileceğimizi görebiliriz.



     Ben bu uygulamayı elimdeki Ethernet Shield'in üzerindeki SD kart yuvasını kullanarak gerçekleştirdim.  Uygulama sorunsuz çalışıyor.(Bazı hazır uygulamalar eski tarihte yazıldığı için çalışmayabiliyor) Eğer hafıza kartını çalışmalarımızda sürekli kullanacaksak aşağıdakileri göz önünde bulundurmamız faydalı olabilir;


  • Ethernet Shield'e SD kart  taktıp içerisine bir şeyler yazdırmak istiyorsak SD kart yuvasını kullanabilmemiz için 4 numaralı pini diğer işlerimizde kullanmamamız gerekiyor. Eğer SD kart yuvasıyla işimiz yok , herhangi bir dosya yazdırmayacağız diyorsak bu pini normal işlerimizde kullanabiliriz. Kod içerisinde 4 numaraları pini OUTPUT olarak tanımladığımızda SD kart yuvası kullanılamaz olur.
  • Bildiğimiz gibi SD kartlar son derece hassastır. Sürekli takıp çıkartmak hafıza kartını bozabilir. Bundan dolayı sabit durması iyi olacaktır. Aynı şekilde kullanmadığımız veya az kullandığımız ve  mümkün olduğunca düşük hafızalı olmasının faydalı olacağını düşünüyorum. Sonuçta hafıza kart içerisine düz yazı yazdıracağımız için işi fazla abartmazsak çok hafıza tüketmeyecektir.



/*
 This example shows how to read and write data to and from an SD card file  
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
*/
 
#include 

File myFile;

void setup()
{
  Serial.begin(9600);
  
  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);
  
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
 // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
  
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
     Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
   // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
 // nothing happens after setup
}

     Kodlar son derece açık , bu kod hem yazma hem de okuma işlemi yapabiliyor. Aşağıda da aynı uygulamayı yaparken video çekmiştim isterseniz izleyebilirsiniz. Şimdilik bu kadar , sizlere kolay gelsin!



2 Mart 2015 Pazartesi

C# Siteden Html Okuma


     Kovan Takip adlı çalışmamda bütün illerin hava durum bilgisini alıp program içerisinde göstermiştim. Bunu yaparken de Meteoroloji Genel Müdürlüğünün sitesinden Html i okuyup içerisinden derece ve resmi çekmiştim. Burada hava durum bilgisi veren web servis kaynaklarını kullansam daha mantıklı olabilirdi ancak o dönem web servis olayından heberim yoktu.



     Uygulama yukarıdaki gördüğünüz gibi çalışıyor. Basit bir uygulama , Request-Response mantığı ile Html verileri okuyup işimize yarayan kısımları ayrıştırıyoruz.



    Bu uygulamayı yaklaşık 1.5 yıl önce yapmıştım. Şimdi denedim hala çalışıyor. Meteoroloji web sayfasını yenilemediği sürece de çalışmaya devam edecektir. Bu uygulamanın kodunu aşağıdan inceleyebilirsiniz , çalışan uygulamayı da en alttaki linkten indirebilirsiniz.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private static string BilgiCek(string url)
        {
            StringBuilder sb = new StringBuilder();
            byte[] buf = new byte[8192];
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream resStream = response.GetResponseStream();
            string tempString = null;
            int count = 0;
            do
            {
                count = resStream.Read(buf, 0, buf.Length);
                if (count != 0)
                {
                    tempString = Encoding.UTF8.GetString(buf, 0, count);
                    sb.Append(tempString);
                }
            }
            while (count > 0);
            return sb.ToString();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            
        }
        private static string ToClearText(string tarih)
        {
            return Regex.Replace(tarih, @"<(.|\n)*?>", string.Empty);
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string url = "http://www.mgm.gov.tr/tahmin/il-ve-ilceler.aspx?m="+comboBox1.Text;
            string html = BilgiCek(url);
            label2.Text = "";
            string link ;
            //string havadurumu = @"";
            // string havadurumu = @""; 
            string havadurumu = @"", pos1);
            string derece = html.Substring(pos1, pos2 - pos1);
            //string sondurum = @"";
            int pos3 = html.IndexOf(durum);
            int pos4 = html.IndexOf("
", pos3);
            string ddeg = html.Substring(pos3, pos4 - pos3);
            ddeg = ToClearText(ddeg);
            string[] pars2 = ddeg.Split("".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            string[] pars = derece.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
            label1.Text = comboBox1.Text;
            string dene = pars[0];
            int i = 0;
            char[] d = null;
            while(dene[i] != '#')
            {
                label2.Text += dene[i];
                i++;
            }
            label3.Text = "° C";
        }
        Bitmap Resim(string Url)
        {
            WebRequest rs = WebRequest.Create(Url);
            return (Bitmap)Bitmap.FromStream(rs.GetResponse().GetResponseStream());
        }
    }
}