Haber - Bilgi Paylasımı

teknobilgi

Visual Studio.NET ile Smartphone Sözlük Uygulamas

.Net ile 2001 yılında tanıştım ve o günden bugüne beni en çok etkileyen iki temel özellik ASP.Net ve özellikle mobil uygulamalar oldu. Bir kaç yıl öncesine kadar bir çoğumuza hayal gibi gelirdi bir cep bilgisayarı ya da cep telefonu üzerinde uygulama geliştirmek. Çünkü bunları yapabilmek için Java ya da C++ ı iyi şekilde bilmek gerekirdi ve bir çok üniversitede de malesef hakkıyla verilmiyor bu diller. Ta ki Microsoft .Net i çıkarana dek. Önce pocket pc 2002 işletim sistemi ile tanıştık. .Net ile compact framework exe leri üretebilir ve bu exe leri pocket pc üzerinde çalıştırabilir olduk. Pocket pc üzerinde database tutabilir hatta xml web servisleri ile çok rahat ve hızlı bir şekilde database server ile haberleştirebilir olduk. Hatta şu an çalıştığım firmada 30 dan fazla pocket pc xml web servisleri ve .Net Compact Framework tabanlı olarak sahada kullanılmakta. Daha sonra Microsoft Smartphone işletim sistemi ile cep telefonu sektörüne de girmiş oldu. İlk olarak Smartphone 2002 işletim sistemi ile tanıştı cep telefonları. Bu işletim sistemi default olarak .Net Compact Framework içermiyordu ve üzerinde C++ ile uygulama geliştirme imkanı sağlıyordu. Dolayısıyla çok yaygınlaşamadı. Ancak Microsoft’un önce üzerinde compact framework default olarak bulunan Windows Mobile 2003 işletim sistemini çıkarması ile sonra da Visual Studio.Net 2005 ile birlikte Vb.Net kullanarak bile doğrudan kolayca smartphone programlayabilir olduk.

Aslında .Net te smartphone da çalışacak uygulama yazmak için ille VS.Net 2005 gerekmiyor. Nitekim ben burda anlatacağım uygulamayı VS.Net 2003 te smart device application olarak yazdım. Bu konuda dikkat edilmesi gereken en önemli nokta smartphone uygulaması yazarken smartphone un desteklediği kontroller kullanmak. Bu konuda bir sıkıntı olmadığı müddetçe benim denemelerim neticesinde bütün pocket pc uygulamaları smartphone 2003 üzerinde direkt olarak çalışıyor. Örnek olarak smartphone da buton kontrolü yok. Çünkü zaten ekranda tıklanacak bir yer yok. Bunun yerine main menu kontrolü kullanabilrsiniz. VS.Net 2005 in en önemli artısı object browser da hangi kontrolleri kullanabileceğinizi görmeniz ve emülatör kullanabilmeniz.

Şekil-1 Yeni Proje Oluşturma Ekranı

Şekil-1 de görüldüğü gibi VS.Net 2005 ile yeni poje oluşturuken direkt olarak Smartphone 2003 uygulaması seçebiliyorsunuz.

Şekil-2 Smarphone Uygulaması

Şekil-2 de görüldüğü gibi VS.Net 2005 te oluşan kullanıcı arayüzü VS.Net 2003 teki gibi sade bir form görünümünde olmayıp doğrudan emülatörün kendisi. Bu da oluşturacağınız formun daha derlemeden (derleme işlemi gerçekten çok sıkıcı) ekran üzerinde nasıl görüneceğini bilmenize olanak sağlıyor. Bunun dışında desteklenen kontrolleri kullanarak smart device application dan farklı olarak hiç bir şey yapmanıza gerek kalmıyor. Programı derliyorsunuz ve smartphone içine kopyalıyorsunuz. Tek yapmanız gereken programı smartphone üzerinden çalıştırmak.

Smartphone üzerinde İngilizce-Türkçe, Türkçe-İngilizce Sözlük Uygulaması

Kendime smartphone işletim sistemli bir telefon aldığımda üzerinde bir takım uygulamalar geliştirmeye karar verdim. Aklıma gelen ilk fikir bir sözlük yazmak oldu. Sonra internetten biraz araştırdıktan sonra bir arkadaşımın da yardımıyla yaklaşık 40 bin kelimelik bir sözlük database i buldum. Bu database de bütün kelimeler bir tabloda tutuluyordu. İlk olarak bu database i xml olarak kaydedip smartphone üzerinde bir dataset oluşturup xmlread() ile okuyup sonra bir dataview oluşturup bu dataview üzerinde filter özelliğini kullanarak arama yapmak istedim. Tahmin edebileceğiniz üzere tablonun hepsini xml olarak yazmak yerine bütün harfler için bir xml dosyası olarak (a.xml,b.xml...) kaydettim ve kullanıcı hangi kelimeyi girdiyse ilk harfine bakıp ona göre xmlread(ilkharf+”.xml”) olarak dataseti doldurdum. Bu şekilde 40 bin kelimelik bir dataseti ortalama 2000 kelimeye düşürmüş oldum. Fakat buna rağmen bir xml dosyasının okunup bir combobox içine doldurulmasının bile yaklaşık 45-60 saniye zaman aldığını gördüm. Zaten daha önceki tecrübelerime dayanarak mobil uygulamlardaki yavaşlığın en büyük nedenlerinden birinin xml dosyayı parse etmek olduğunu biliyorum. Örneğin bir web servisten bir string ifade döndüğünde bu ifadenin alınması ve ekrana yazdırılması işlemi 1 saniyeden az sürerken aynı string ifade tek kolonlu ve tek satırlı bir dataset içinde döndüğünde 2 saniyeden fazla sürüyor. Kayıt sayısı fazla olduğunda bu performans çok daha düşüyor.

Sonuç olarak xml ve dataset kullanmak yerine herhangi bir text dosya kullanmak daha mantıklı geldi. Çünkü bir sözlükte benim aradığım şey sonuçta bir kelimenin karşılığı yani maximum 255 karakter uzunlukta bir string. Bunun bir dataset üzerinde aramaya çalıştığımda “dataset.tables(0).rows(0).items(0).tostring” nesnesini oluşturuyorum. Bu kadar kalabalığa gerek varmı? Sonuçta aradığım alt tarafı bir string. Buradan yola çıkarak bütün harfler için bir text dosya oluşturdum ve girilen kelimenin ilk karakterine göre ilgili dosyayı okutup bir stringe atadım ve bu string üzerinde sıralı arama yaptırdım. Gerçekten çok performanslı çalışıyor. Dosya okuma yaklaşık 1 sn aranılan kelime ile başlayan kelimeleri bulma 1 sn den daha az sürüyor.

Dosya üzerinde arama yapabilmek için çok basit bir yol izledim. Database den SQL ile kelimeye göre sıralı bir sorgu çektim ve satır satır text dosyaya yazdırdım. Yeni bir satırın başlangıcı olarak “{“, bitişi olarak “}” işaretini kullandım. Türkçe kelimenin karşılığı olarak ingilizce kelimenin başlangıç noktasına “#” karakterini kullandım.

...

{abartili#exaggerated.}

{abartilmak#to be exaggerated.}

{abartma#exaggeration, overstatement.}

{abartmaci#1. habitually exaggerating. 2. exaggerator.}

{abartmacilik#the habit of exaggerating.}

{abartmak#/i/ to exaggerate.}

{abartmali#exaggerated.}

.....

Bu kadar girişten sonra artık programı yazma zamanıdır herhalde.

Bunun için eğer VS.Net 2005 kullanıyorsanız yeni bir smartphone application oluşturun. Eğer VS.Net 2003 kullanıyorsanız yeni bir smartdevice application oluşturun. Formunuzun üzerine bir text box onun altına bir treeview, onun da altına bir label kontrolü yerleştirin. Eğer formunuzda otomatik olarak menuitem kontrolü oluşmamışsa bir menuitem kontrolü ekleyin ve aşağıdaki gibi menüleri oluşturun. Burada treeview kullanmamızdaki amaç, örneğin elma yazdığınızda elma ile başlayan tüm kelimelerin bir listbox üzerinde göstermek istiyorum fakat smartphone listbox ı desteklemiyor. Ona en yakın kontrol ben treview i seçtim ama siz combobox da kullanabilirsiniz.

 

Şekil-3 VS.Net 2005 Smartphone Application     Şekil-4 VS.Net 2003 SmartDevice Application

Tasarımı bu şekilde gerçekleştirdikten sonra sıra şimdi kod yazmakta.

Namespace ler

Imports System.Drawing

Imports System.IO

Imports System

Programda kullanılacak global değişkenler

    Dim ilkHarf As String = "a" 'okunacak dosya adı için kelimenin ilk harfi

    Dim str As String = "" 'Okunan dosyanın içeriğinin atandığı string değişken

    Dim words(2000) As String 'Treeview e doldurulacak kelime ‘karşılıklarının tutulduğu dizi 2000 değeri rastgele verilmiştir. Dinamik ‘olarak da uzunluğu değişen dizi tanımlanabilirdi.

    Dim dil As String = "TR-EN" 'Hangi dilde çeviri yapılacağını belirleyen değişken

    Dim klasor As String = "mounted volume" 'sozluk dosyalarının bulunduğu klasor

Menüler>Başka Kelime

 Private Sub MenuItem1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem1.Click

        TextBox1.Text = ""

        TextBox1.Focus()

        TreeView1.Visible = False

        Label1.Visible = False

        Update()

    End Sub

Menüler>Çıkış

  Private Sub MenuItem4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

        Close()

    End Sub

Menüler>Dil Değiştir

Private Sub MenuItem5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem5.Click

        If dil = "EN-TR" Then

            dil = "TR-EN"

            Text = "TR-İNG SÖZLÜK"

        Else

            dil = "EN-TR"

            Text = "ENG-TR GLOSSARY"

        End If

        TreeView1.Visible = False

        Label1.Visible = False

        TextBox1.Text = ""

        TextBox1.Focus()

        Update()

    End Sub

Kelimenin aranması (Textbox1 e aranılacak kelimenin yazılması ve enter tuşuna basılması olayı. Smartphone larda enter tuşu joistick in ortsındaki mavi tuş.)

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown

        If e.KeyCode = Keys.Enter Then

            bul()

        End If

        If e.KeyCode = Keys.Down Then

            TreeView1.Focus()

        End If

    End Sub

Kelimeyi bulma ve treeview’a doldurma işlemi

Sub bul()

        Dim len As Integer

        Dim i As Integer

        Dim lindex As Integer = 0 'Last index aranılan kelimenin str içindeki son bulunan pozisyon değeri

        Dim findex As Integer = 0 'First index aranılan kelimenin str içindeki ilk bulunan pozisyon değeri

        Dim findexNew As Integer = 0

        Dim aranan As String = TextBox1.Text

        Dim kayit As String = "" 'bulunan kayıt     

        Dim strtmp As String = str 'aradığımız kelime ile başlayan kelimelerin bulunduğu bölüm dosya içeriğinin filtrelenmiş hali.

        Dim tr As String

        Dim en As String

        Dim diyez As Integer '# karakterinin index numarası

        'Her seferinde dosya okumamak için eğer bir sonraki girilen kelimenin ilk harfi bir önceki girilen kelimeninilk harfi ile aynı ise dosya okumuyor yoksa dosya okuyor. Dosya okuma işleminde dosyanın içeriği global değişken olan str’ye atanıyor.

        If TextBox1.Text.Substring(0, 1) <> ilkHarf Then

            ilkHarf = TextBox1.Text.Substring(0, 1)

            dosyaOku(ilkHarf)

        End If

        'Treeview in içeriği ve aranılan kelimelerin karşılıklarının tutulduğu words dizisi temizleniyor.

        TreeView1.Nodes.Clear()

        For i = 0 To words.Length - 1

            words(i) = ""

        Next

        TreeView1.Visible = True

        TreeView1.Focus()

        Update()

        strtmp = str

        lindex = 0

        findex = -2

        TreeView1.Nodes.Clear()

        While findex <> -1 'aranılan kelime bulunamamıssa -1 değeri dönüyor.

            findex = strtmp.IndexOf("{" + aranan)

            len = strtmp.Length

            If findex = -1 Then

                Return

            End If

            'Aranılan karakter il kez bulunduktan sonra strTmp’ye str nin bu index noktasından sonuna kadar olan kısım olmak üzere değer atanıyor ve bundan sonraki arama işlemi strTmp üzerinde yapılıyor.

            strtmp = strtmp.Substring(findex, strtmp.Length - findex - 1)

            findex = strtmp.IndexOf("{" + aranan)

            If findex = -1 Then

                Return

            End If

            len = strtmp.Length

            'Satırın sonu bulunuyor.

            lindex = strtmp.IndexOf("}")

            If lindex <> -1 And findex <> -1 Then

                'Türkçe kelime ve ingilizce karşılığının olduğu bölüm bulunuyor ve kayit değişkenine atanıyor.

                kayit = strtmp.Substring(findex, lindex)

                'Türkçe ve ingilizce kelimeyi ayıran # karakterinin yeri bulunuyor ve buna göre Türkçe ve İngilizce kelime birbirinden ayrılıyor.

                diyez = strtmp.IndexOf("#")

                If diyez <> -1 Then

                    'Eğer # işareti bulunmuşsa Türkçe değişken tr ye ingilizce değişken en ye atanıyor.

                    words(TreeView1.Nodes.Count) = ""

                    tr = kayit.Substring(1, diyez - 1)

                    en = kayit.Substring(diyez, lindex - diyez)

                    words(TreeView1.Nodes.Count) = Replace(en, "#", "")

                End If

                TreeView1.Nodes.Add(tr)

                'Türkçe kelimeler treeview a ekleniyor. İngilizce karşılıkları da words dizisine atanıyor. Böylece treeview üzerinde yukarı aşağı dolaşırken bu dizinin index numarasına göre karşılığı label üzerinde yazdırabileceğiz.

                strtmp = strtmp.Substring(lindex, strtmp.Length - lindex -

            End If

        End While

    End Sub

Dosya Okuma İşlemi

Dosya okurken aslında dosyamızda kelimeler satır satır tutulduğu için readline ile okuyup Türkçe kelimeleri ve ingilizce karşılıklarını birer dizide tutayım rahat rahat çalışayım diye düşünmüştüm ama burada iki sorun çıktı karşıma birincisi readline() çok yavaş ikincisi diziler üzerinde for döngüleri çok yavaş. Dolasyısıyla text dosyalarımız satır satır tutuyor bilgiyi ama bunun bize sağladığı bir avantaj yok şu anda.

Sub dosyaOku(ByVal ilkharf As String)

        Dim dosya As String

        Text = "yukleniyor...."

        Dim i As Integer = 0

        If dil = "EN-TR" Then

            dosya = klasor + "sozluken2tr" + ilkharf + ".txt"

            Text = "ENG-TR GLOSSARY"

        End If

        If dil = "TR-EN" Then

            dosya = klasor + "sozluktr2en" + ilkharf + ".txt"

            Text = "TR-İNG SÖZLÜK"

        End If

        Dim sr As StreamReader = New StreamReader(dosya)

        str = sr.ReadToEnd

        TextBox1.Focus()

    End Sub

TreeView ın After Select Olayı

TreeView üzerinde oklarla dolaşırken focuslandığımız kelimenin karşılığını label’a yazdırıyoruz.

Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect

        Label1.Visible = TreeView1.Visible()

        If TreeView1.Visible = True Then

            Label1.Text = words(TreeView1.Nodes(e.Node.Index).Index)

            Update()

            Dim kelime As String

            Try

                kelime = TreeView1.SelectedNode.Text

            Catch ex As Exception

                MessageBox.Show(ex.Message)

            End Try

        End If

    End Sub

Ve son olarak sıra programımızı smartphone üzerine deploy etmeye geldi. Ben bütün datalar ve program dosyaları için telefonuma takılı olan sd kartımı kullandım Çünkü yaklaşık 10 mb alana ihtiyacınız var. Bunun için programda sabit olarak tanımladığım klasör değişkenine “mounted volume” değişkenini atadım. Böylece ekteki sözlük klasörünü olduğu gibi sd karta kopyalamak ve programın exesini de telefonun herhangi bir yerine kopyalamak yeterli. Sonuçlar aşağıda.

Bugün 3 ziyaretçi (8 klik) kişi burdaydı!

Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol