Etiket arşivi: programming

Turing Bütünlüğü(Turing Completeness)

Turing Bütünlüğü(Tamlığı) bilgisayar bilimlerinde çok önemli bir notasyondur. Bir programlama dili Turing Bütünlüğünü sağladığını söylüyorsa Turing Makinası ile tasarlanabilen tüm hesaplama işlemlerini yapabilir demektir.  Zaten Turing Makinasının kendisi herhangi bir şeyin “hesaplanabilir” olup olmadığı gösterebilmek için icat edildi. Makina, çeşitli emirleri okuma, yazma,  bellekte saklama gibi ilkel işleri yapar.  Zaman içinde bir çok çalışma Turing makinasının gerçek dünya hesaplamaları için hemen hemen aynı modeller ortaya koydu. İlk yaklaşıma göre, eğer hesaplamanın Turing makinası ile yapılamayacağı kanıtlanırsa hiçbir hesaplama cihazının bu işlemi yapamayacağını varsayabiliriz. Diğer taraftan sistem basit Turing makinası emirleri ile tanımlanabiliyorsa bu işlem “Turing Bütünlüğü” içeriyor deriz ve bilgisayarlar ile bu hesaplamayı yapabiliriz.

Turing Tamlığına sahip diller:

Genel olarak tüm programlama dilleri:

Prosedürel programlama dilleri; CPascal.
Object-oriented diller; JavaSmalltalk veya C#.
Çok Paradigmalı diller; AdaC++Common LispObject PascalPythonR.
Fonksiyonel diller; Lisp ve Haskell.
Deklaratif diller;  XSLT
Mantıksal programlama dilleri;Prolog.

Turing Tamlığına sahip oyunlar:

Bonus:

Turing Tamlığına sahip kripto parabirimi:

Kaynak: wikipedia,  stackoverflow

Loading

Facebooktwitterredditpinterestlinkedinmail

Android Context Nedir ?

Merhaba,

Bugün Android’e uygulama yazarken sıkça kullandığımız bir sınıf olan Context’ten (android.content.Context)  bahsedeceğim. Activity başlatmak, broadcast atmak, view güncellemek, shared prefe erişmek için her zaman context’e ihtiyaç duyarız. Peki nedir bu context? Her context aynı mıdır? Şimdi bu soruların cevabını arayalım.

 

Nedir Bu Her Yerde Kullandığımız Context ?

Kabaca context,

Android sistemi tarafından soyut bir şekilde bize sunulan, uygulamamız hakkında global bilgiye sahip arayüzdür. Bir nevi uygulamamızın komponentlerinin kimliğidir diyebiliriz. Uygulama sistem veya yerel bazda kaynaklara erişmek istediğinde bu kimliği kullanır işletim sistemi de bu kimliğin yeterliliğine göre işlemi başlatır.

Context sayesinde işletim sisteminin bize sunduğu  uygulama özelindeki servislere erişebilir (Wifi Service, Activity Service, Location Service gibi) yine aynı şekilde uygulama seviyesinde operasyonları (activity başlatma, intent gönderme/alma gibi. ) gerçekleştirebiliriz.

Context’e birden fazla şekilde erişebiliriz. Şimdi bu erişim yollarını ve birbirinden farklarını inceleyelim.

Context Tipleri

Application Context (getApplicationContext()) – Uygulama prosesinde çalışan single instance’tır. Uygulamanız yaşadığı sürece yaşamına devam .eder. Farklı yerlerden erişim sağlasanız da aynı instance’ı elde edersiniz. Activity veya Service üzerinden getApplication() apisini çağırarak veya Context’i miras alan herhangi bir sınıftan getApplicationContext() apisini çağırarak erişebilirsiniz.

Activity/Service – ContextWrapper’dan türer ve her activity/service context kendine özgüdür. Activity yaşam döngüsüne bağlıdır. Activity’nin kendisi this contexti içerir. Bunun dışında MyActivity.this şeklinde de context’e ulaşabilirsiniz.

BroadcastReceiver – Kendisi context’e sahip değildir, broadcast için android yeni bir context oluşturmaz ancak onReceive() metodu içerisinden context sistem tarafından sağlanır. Buradaki context ReceiverRestrictedContext  instance’ıdır ve iki temel fonksiyonu kapalıdır. Bunlar:

  • Herhangi bir broadcast receiver içerisinden başka bir receiver’a kayıt (registerReceiver()) olamazsınız.
  • Bir service’e bind (bindService()) olamazsınız.

Broadcast receiver içerisinde onReceive() tetiklenmesi sonucunda gelen her context’in instance’ı birbirinden farklıdır.

ContentProvider – İçerisinde context barındırmaz. Ancak oluşturulduğunda bir context atanır. Atanan context uygulama contextidir. Eğer context provider uygulama içi veya aynı proses içerisinde çalışıyorsa sağlanan contextler aynı olur. Eğer ayrı prosesler ise temsil edilen her packet için ayrı context olur.

Herkesin Context’i Kendine

Farklı context türlerinden bahsettik.Şimdi bu context’lerin neleri yapıp yapamayacağından bahsedelim. Aşağıdaki tabloda hangi türdeki contextlerin neleri yapabileceğini görebiliriz.

getApplicationContext()’i Nerelerde Kullanmalıyız?

getApplicationContext() daha önce bahsettiğimiz gibi uygulamaya özel single instance bir context döndürür. Application komponenti, uygulamamızın global durumunu tutar.

Application context kullanmadan önce kendimize şu soruları sormalıyız?

  • Contexti uzun süre kullanan başka bir sınıfımız var mı? Eğer böyle bir sınıfımız varsa Activity context’i vermek memory leak’e sebep olabilir. Eğer işleminiz uzun süreli ve context’e ihtiyacınız varsa Application Context’i kullanmalıyız.
  • Uygulamanın görseli ile ilgili bir değişiklik yapıyor muyum?Arayüzde yaptığımız değişikliklere ait tema bilgileri Application Context’te bulunmaz. Bu da sorunlara yol açabilir. Uygulamanızın farklı activitylerinde farklı temalar kullanabilirsiniz. Özet olarak arayüz ile ilgili işlem yapıyorsak, o arayüze bağlı activity’nin contextini kullanmalıyız.

Activity Context’ini Nerelerde Kullanmalıyız ?

Activity’den oluşturulan context , activity yaşam döngüsü boyunca yaşar. Bundan dolayı activity contextini sadece o activity ile ilgili gerekli işlemlerde kullanmalıyız.

Context ile ASLA Yapmamamız Gereken Şeyler

Android her komponente uygun olacak context’i belirlemiştir. Context’i komponentler arası parametre olarak geçirmemeliyiz. Broadcast receiver ile gelen context’i activity’de, activity context’ini servis içinde kullanmamalıyız.

Memory leak oluşmaması için asla static Context değişkeni tutmamalıyız.

Eğer bunlardan birisini yaptıysak yazdığımız kodu tekrar gözden geçirmemiz faydalı olacaktır.

Eğer hangi context’i kullanmanız konusunda emin olamıyorsanız Application Context’i kullanın 🙂

 

Kaynaklar:

İyi kodlamalar,

 

Loading

Facebooktwitterredditpinterestlinkedinmail

Go Kurulumu ve PATH Ayarları (Linux)

Merhaba,

Linux üzerinde Go programlama ortamını kurmak için aşağıdaki adımları takip edelim.

1. Kurulum

  • Buradan en son go versiyonunu indirelim. (Yaklaşık 104mb)
  • İndirdiğimiz klasöre gelerek .tar dosyasını /usr/local içerisine aşağıdaki komutla açalım.
  • sudo tar -C /usr/local/ -xzf go1.9.1.linux-amd64.tar.gz

2. Ortam Değişkenlerini (PATH) Ayarlama

  • PATH ayarlarına go’nun kurulu olduğu yeri eklemek için $HOME/.profile dosyasını favori text editörünüzle açın.
  • sudo vim /home/codemania/.profile
  • export PATH=$PATH:/usr/local/go/bin  kopyalayıp yapıştırın. Böylece path değişkenine go eklenmiş olacaktır.

  • PATH değişkenine eklendiğini görmek için
  • source $HOME/.profile
  • echo $PATH komutlarını sırayla çalıştırın, eğer doğru şekilde eklediyseniz değişkenin sonuda /usr/local/go/bin/ görünecektir.

  • Sonrasında terminale go yazarak ortam değişkeninin çalıştığını gözlemleyebilirsiniz.
  • Önemli Not: Go’yu /usr/local içine açarsanız GOROOT değişkenini ayarlamanıza gerek yok. Başka yere kuracaksınız GOROOT ortam değişkenini de ayarlamayı unutmayın.

Bu kurulum sonucunda GOROOT ve GOPATH değişkenleri aşağıdaki gibi setlemiş olacak. Bu değişkenleri terminale go env yazarak görüntüleyebilirsiniz.

  • GOROOT = /usr/local/go
  • GOPATH = $HOME/$USER/go

Örneğin benim bilgisayarım için ortam değişkenleri:

Son olarak çalışma ortamımızı ayarlayalım.

  • mkdir $HOME/go  komutunu çalıştıralım.
  • Böylece home dizinimizde go klasörü oluşturacağız.

3. Test

Kurulumu tamamladık. Şimdi “hello, world” diyelim.

  • Çalışma ortamımızın olduğu dizine gelelim. Biz o dizini $HOME/go olarak ayarlamıştık.
  • O dizinin altında aşağıdaki komutları uygulayarak src/ ve hello/ dizinini oluşturalım.
  • cd $HOME/go
  • mkdir src
  • cd src
  • mkdir hello
  • cd hello

  • Favori text editörünüzü kullanarak aşağıdaki örnek kodu hello.go olarak kaydedelim.
package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

  • go build yazarak hello.go programımızı derleyelim. Sonucunda hello adında çalıştırılabilir dosya çıkacaktır.

  • Son olarak hello programımızı çalıştıralım.
  • ./hello

Sonuç yukarıdaki gibi olacaktır. İyi kodlamalar.

Kaynakhttps://golang.org/doc/install

Loading

Facebooktwitterredditpinterestlinkedinmail

Go Kurulumu ve PATH Ayarları (Windows)

Selam,

Windows üzerinde Go programlama ortamını kurmak için aşağıdaki adımları takip edelim.

1. Kurulum

  • Buradan en son GO versiyonunu indirelim. (Yaklaşık 92mb).
  • Yükleme adımlarını takip ederek kurulumu tamamlayalım.
  • Kurulum sırasında farklı bir yer seçmezseniz Go ortamı C:\Go olarak kurulacaktır. Farklı bir dizine kurmak isterseniz o yerin adresini girin örneğin ben T:\Go olarak değiştirdim.

2. Ortam Değişkenlerini Ayarlama

  • Go kurulumu başarılıyla tamamlandıktan sonra test için Windows PowerShell’i açalım.
  • go yazıp enter’a basalım. Kurulum düzgün bir şekilde yapıldıysa sonuç ekrandaki gibi olacaktır.

Go kurulurken “GOROOT” isimli ortam değişkenini kurduğunuz dizine atayacaktır. Buna ek olarak çalışma dizinini ayarlamamız gerekiyor.

Ortam değişkenleri -> Sistem Değişkenlerine “GOPATH” değişkenini ekleyelim.

Çalışmak istediğiniz dizinde go workspace klasörü oluşturun. Örneğin ben “GoWorkspace” adını verdim.Siz de istediğiniz adı verebilirsiniz.

3. Test

GOROOT ve GOPATH değişkenlerini ayarladıktan sonra şimdi go ortamını örnek bir uygulamayla test edelim.

Daha önce oluşturduğumuz workspace için /src/hello/ adında yeni dizin açalım ve aşağıdaki kodu bu hello.go olarak kaydedelim

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

 

Programımızı kaydedip çıkalım ve dosyayı oluşturduğumuz klasörde powershell’i açalım.

“go build” yazalım. Böylece programımız derlenecek ve hello.exe oluşacaktır. Daha sonra hello.exe‘yi çalıştırarak aşağıdaki sonucu görelim.

 

Artık go ortamımız hazır. İyi kodlamalar 🙂

Kaynak:  https://golang.org/doc/install

Loading

Facebooktwitterredditpinterestlinkedinmail