Bu sitedeki yazıların tamamı F. Oğuz ÖZKEROĞLU isimli şahıs tarafından uydurulmuş bilgilerden oluşmaktadır.

Android veri depolama için birkaç farkı yöntem sunuyor. Bunları kendi sitesinde şöyle sıralamış:

  • Shared Preferences: Store private primitive data in key-value pairs.
  • Internal Storage: Store private data on the device memory.
  • External Storage: Store public data on the shared external storage.
  • SQLite Databases: Store structured data in a private database.
  • Network Connection: Store data on the web with your own network server.

Database kadar olmasa da shared preferences ufak tefek veri depolayıp/erişmek için kullanılası bir şey. Öyle büyük verilerle uğraşmadıkça database yerine tercih edilebilir.

Hash table yapısındaki gibi key-value prensibi ile çalışıyor farklı olarak yalnızca primitive tipler için kullanılabiliyor. Saklayabildiği tipler şunlar:

  • boolean
  • float
  • int
  • long
  • string

Çalıştığım projede böyle bir şey kullanma ihtiyacı duymuştum. Biraz araştırdıktan sonra işimi gördüm ama buraya da yazayım ki belki başkalarının da işine yarar bir gün.

Örnek bir uygulama üzerinde nasıl olacağını görelim. Öncelikle uygulamanın paylaşılan tercihlerine (bu şekilde çevirsem problem olmaz umarım) erişmek ve eğer daha önceden yoksa bir xml dosyası oluşturmamız gerekir. Verilerin yazıldığı dosya bir xml dosyası. Bunun için aşağıdaki kodu kullanabiliriz:

	SharedPreferences mSharedPrefs = getSharedPreferences("xmlFile",
				MODE_PRIVATE);

İlk parametre oluşacak dosyanın ismini, ikincisi de hangi modda olacağını belirtiyor. MODE_PRIVATE ile bu dosyanın sadece bizim uygulamamız tarafından erişilebileceğini belirttik. Bundan sonraki adım da dosyayı editlemek için erişmemiz gerekir. Aşağıdaki satır ile de bunu sağlıyoruz.

	SharedPreferences.Editor mPrefsEditor = mSharedPrefs.edit();

Artık dosyaya ulaştık. Buraya yukarda da belirttiğim gibi boolean, float, int, long ve/veya string veriler yazıp/okuyabiliriz. Yazmak için put, almak için de get metodları [putString(), getBoolean()...] zaten geliyor.

Örnek uygulamamızda, uygulamanın kaç defa çalıştığını ekranda göstermek istediğimizi düşünelim. Bunun için bir sayaç oluşturalım ve bu değeri paylaşılan tercihlerden okuyalım. Daha sonra da bir textView ile ekranda gösterelim.

	int mCounter = mSharedPrefs.getInt("counter", 0);

mCounter değişkenimize xmlFile içindeki “counter” isimli anahtarın değerini atıyoruz. getInt()[ve diğer getXXX] metodlarının aldığı ikinci parametre de default değer. Yani xml dosyası ortada yoksa ya da herhangi bir şekilde ordaki değeri alamazsak, default değerimiz geri dönüyor. Ayrıca dosyadan değer okumak için bir önceki satırdaki gibi editör oluşturmaya gerek yoktu. Editörü dosyaya yazmak için kullanacağız. Satırlar yer değişse ya da ikinci satır aradan çıksa da uygulama şimdilik çalışır.

Uygulamanın daha önce kaç defa çalıştırıldığını görmek için de aşağıdaki kodu yazıyoruz. Daha önceden main.xml içinde tanımladığımız textView nesnesinin text özelliğini, sayacımızın değeri ile güncelliyoruz.

	TextView tv = (TextView) findViewById(R.id.tvSampleTv);
	tv.setText("Uygulama daha önce " +String.valueOf(mCounter) + " defa çalıştırıldı.");

Uygulamamızı şimdi çalıştırırsak aşağıdakine benzer bir görüntü elde etmiş olmamız lazım.

Benim bu örnekte kullandığım main.xml de aşağıdaki gibi.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical">
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		android:id="@+id/tvSampleTv"
		android:textStyle="bold"
		android:textColor="#FFFFFF"
		android:layout_gravity="center"></TextView>
</LinearLayout>

Sayfamız görüntülendiğine göre artık uygulamamız bir defa daha çalışmış oldu. Demek ki artık sayacı artırmamız gerekecek. Bunun için de aşağıdaki satırları yazalım.

	mPrefsEditor.putInt("counter", ++mCounter);
	mPrefsEditor.commit();

Nasıl database bağlantısı yapıp işlerimizi hallettikten sonra bağlantıyı kapatıyorsak, dosya açıp yazdıktan sonra dosyayı kapatıyorsak bunda da benzer bir durum (ama aynı değil tabi ki, sadece unutulmaması gereken bir şey olduğu için bu benzetmeleri yaptım. İntegral sınavlarındaki +c kadar önemli vallahi :)) olaraktan yaptıklarızı işlememiz lazım. commit() bunun için kullanıldı.

Uygulamayı bu haliyle çalıştırdığımızda yine ilk ekran görüntüsü gelecek. Yeni halini ilk defa çalıştırmış oluyoruz çünkü. Tekrar çalıştırdığımızda aşağıdaki,

üç defa daha çalıştırdıktan sonra da aşağıdaki görüntüye benzer şeyler görünmesi lazım.

Uygulamanın class kodu da aşağıdaki gibi şekillendi.

package com.oguz.example;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;

public class SharedPrefsExample extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		SharedPreferences mSharedPrefs = getSharedPreferences("xmlFile",
				MODE_PRIVATE);
		SharedPreferences.Editor mPrefsEditor = mSharedPrefs.edit();

		int mCounter = mSharedPrefs.getInt("counter", 0);

		TextView tv = (TextView) findViewById(R.id.tvSampleTv);
		tv.setText("Uygulama daha önce " + String.valueOf(mCounter)
				+ " defa çalıştırıldı.");

		mPrefsEditor.putInt("counter", ++mCounter);
		mPrefsEditor.commit();
	}
}

Şimdi bu uygulamayı yaptık da ne oldu? Evet pek bi ekşın yok ortada çünkü örnek seçimini pek sağlıklı yapmadım. Seçtiğim örnek anlatmak istediğim olaya pek uygun değil ama o kısmı da burda anlatsam herhalde eksiği tamamlarım. Uygulamada tek activity olduğu için pek bir yararını göremedik ama uygulamamızın içindeki tüm classlardan bu özelliklere erişip / değişiklik yapabileceğimizi bilmemiz belki getirdiği kolaylığı farketmemizi sağlayabilir. Üstelik ram gibi program boyunca kalıp tekrar başlatıldığında da kaybolmuyor. Uygulama cihazda bulunduğu sürece değerler korunuyor. Belki bu açıklama örnek seçimimdeki açığı biraz kapatmıştır :)

Oluşan xml dosyamızı da /data/data/paket.adi/shared_prefs altında bulabilir. En başta belittiğimiz moda göre erişim hakları düzenleniyor.

Nisan 3, 2011

android, eleştiri, linux

2 yorum

Bu seneki Özgür Yazılım ve Linux Günleri’ne katılma fırsatım oldu. Etkinliklerle alakalı yazmak istediğim birkaç şey vardı o yüzden bu yazıyı yazıp internet çöplüğünü biraz daha kirletiyorum.

Özgür Yazılım ve Linux Günleri

Seminerlerin zamanında başlayıp bitmeleri iyi bir şeydi. Her zaman bekletilmeye alıştığım için bu hoşuma gitti. Açılış konuşmasından sonra İngilizce bir sunum dinledik. Girişte dağıtılan kulaklıklar sayesinde yapılan simultane çeviriden de faydalanabildik. Buraya kadar her şey yolunda görünüyordu.

11:45′te 5 farklı salonda 5 farklı sunum vardı. Sadece isimlerine baktığım için “QT Çatısı ile SVG Vektörel Grafikleri İşleme” cazip geldi, onu seçtim. Salona girdiğimde beni LKD’nin kocaman reklam afişleri karşıladı. Normalde böyle şeylerden rahatsız olunmaz ama bu afişleri sunumun yansıtıldığı duvar ile projeksiyon cihazı arasına astıkları için bayağı rahatsız oldum tabi. İki afiş arasındaki mesafe, duvardaki yansının genişliğinden daha az olduğu için hangi açıdan bakarsam bakayım ekranın tamamını görme şansı bulamadım. Zaten katılımcıların hepsi biraz daha görebilmek için ortalara konumlanmışlardı, ben de mecburen biraz kenarda kaldım. QT merak ettiğim, çalışmak istediğim bir şey olduğu için gülü seven dikenine katlanır misali razı oldum artık bu halde dinlemeye ama sunum bir türlü başlamak bilmedi. Sunumu yapacak olan arkadaş duvara yansıttığı sununun projeksiyon cihazında bozulan renklerini düzeltmeyi bir türlü beceremedi. Sanki ms office kullanarak hazırlandı da open office ile açıldığı için renkler düzgün görüntülenemedi gibi.. Gül-diken olayına saygımdan sineye çekip beklemeye devam ettim ama içerik de kimseyi tatmin etmedi. O kadar bekledikten sonra tüm sunum boyunca anlatılan 3 şey vardı:

  • QT nedir?
  • Vektörel grafik nedir?
  • SVG dosya formatı nedir?

Öyle derinlemesine bir anlatım da olmadı tabi. Google’a bu halde yazılsa bile çıkabilecek en basit tanımlar alınıp sunuma konulmuş, anlatımda da üzerine hiçbir şey katılmamıştı. Zaten 45 dakika olan sunumun ilk yarım saati bu şekilde geçtikten sonra kalan kısımlar sadece anlatıcı arkadaşın katılımcılardan defalarca özür dilemesiyle geçti. Çünkü bilgisayar mühensdisliği son sınıf öğrencisi arkadaş sunumu hazırlamayı son geceye bırakmış ve yetiştiremediği için yarım yamalak kalmış. Böyle büyük bir organizasyon içinde böyle amatörlükler görmek üzücü gerçekten.

Öğle arasından sonra girdiğim “Yavaş Uygulama Geliştirme” sunumunda da esprili bir dille XP, RUP, Scrum, RAD falan anlatılır diye bekliyordum ama aslında tam da ismine uygun bir sunummuş. Anlatılmasını beklediğim şeylerden kısaca bahsedildi ama nedense hep kötülendi. Ya benim okuduğum kitapların yazarları, aldığım derslerde konuşan hocalar ve katıldığım seminerlerdeki konuşmacılar yanlış biliyorlardı ya da bu sunumu yapan vatandaşın bilgisi biraz! eksikti. Ben oyumu ikinci seçenekten yana kullanıyorum. Adam kötülediği şeylerin ne olduğunu bile tam bilmiyordu ya da anlatamadı ya da ben hala büyük bir yanlış anlamanın baş kahramanıyım. Ayrıca sunumu yapan vatandaşın sorulan sorulara da alakasız cevaplar vermesi benim ne kadar büyük bir yanlış anlama içinde olduğumu destekliyor :)

Daha sonra Sencha ve PhoneGap hakkında sunumlara katıldım. Java’ya bir zamanlar büyük artılar kazandıran birçok platformda aynı kodun çalışabiliyor olması mobil dünyada da gerçekten ihtiyaç duyulan bir şey. Bunun çözümü için genelde web tabanlı uygulamalar düşünülmüş. Android için geliştirdiğimiz bir uygulamanın iOS, Blackberry, Symbian, Windows Phone ve Palm OS’ta da çalışması gerçekten hoş olur. Küçük performans ve özellik kullanımı kayıpları ile şimdilik bunlar başarılabiliyor gibi.

Günün son sunumunda Intel’den gelen bir abla Meego hakkında bir sunum yaptı ve örnek birkaç uygulama gösterdi. Android, iOS, RIM ve WP gibi rakipleri varken nasıl ilerlemeyi düşünüyorlar şahsen büyük merak içerisindeyim. Gerçi Nokia MS ile anlaşıp satışa getirmeseydi şanları daha fazla olabilirdi. Neyse teknik ayrıntıya fazla girmeden bu sunum ile ilgili birkaç şey yazayım. Konuşmacı Türkçe bilmediği için sunum İngilizce yapılacaktı buraya kadar sıkıntı yok çünkü yine simultane çeviri yapılacağı duyurulmuştu. Ancak çeviriyi yapacak vatandaş o saate kadar beklememiş (bize söylenen buydu) olduğu için bir çevirmen yoktu ortada. Sunum İngilizce yapıldı, İngilizce’yi çok iyi anlamayanlar da ya boş boş baktı ya da salondan ayrıldı. Bu da organizasyondaki eksilerden biriydi. Ayrıca sunumu yapan ablanın Windows kullanıyor olması da bi hoş oldu :)

İkinci gün Turkcell’den gelen arkadaşın yapacağı Android uygulama dükkanları ile ilgili sunum için salona toplandığımızda o sunumdan sonra yapılacak olan sponsor sunumu ile karşılaştık. Turkcell’den gelecek vatandaş geç kaldığı için sunumların yerini değiştirmişler. Hayatım boyunca dinlediğim en sıkıcı sunumu yaptıkları için ve askerlik anısı anlatır gibi iş anılarını anlattığı için YeniHayat temsilcilerini tebrik ediyorum. Tabi biz o sunumu dinlerken gelen Turkcell temsilsici de sunuma geç başlayınca, belki de en faydalı olabilecek sunumlardan biri olmasına rağmen zaman sıkıntısı sebiyle hızlı hızlı geçti, verimsiz oldu.

En sonunda şenliğe katılmamdaki en önemli sebeplerden biri olan Android atölye uygulamaları saati geldi. Giriş düzeyi uygulama geliştirme etkinliğine katılmak için atölyeye girdik. Üzerinde Debian çalışan, Eclipse ve Android SDK kurulu bilgisayarların olduğu bir laboratuvardı burası. Dışardan iyi görünüyorlardı ama biraz dandik bilgisayarları var :) 5 dakika geçmeden ya Eclipse ya da web browser ya da ikisi birden çöküyor. Üstelik sadece o iki program çalışıyorken. Belki ben dandik olana denk gelmişimdir düşüncesiyle yandakine sordum aynı problemler orda da var. Yine içeriğe dönecek olursak sunum hakkatten de giriş düzeyinde oldu. Virtual device oluşturma, hello world, debug vs. nasıl olacağı uygulamalı bir şekilde gösterildi ve bitti. Bu sunum sırasında dandik de olsa önümde duran bilgisayardan faydalanırım ümitlerim de çabuk söndü. “Buraların ağası benim” modunda bir kedi gelip klavyenin üzerine yattı ve sunum bitene kadar orda kaldı. Üstelik hangi tuşa bastıysa web browserın help sayfasını n tane açmaya çalışan bilgisayar iyice pert oldu. Bir sunum daha pek bir şey öğrenemeden bitmiş oldu.

Katıldığum son sunum da “Android ile Oyun Programlamaya Giriş” sunumuydu. Bunda da ya konuşmacılar anlatacaklarını çok iyi anlatamadılar ya da konu çok sıkıcı ve/veya üst düzey olduğu için daha sürenin yarısına gelmeden başlangıçta tıklım tıklım dolu olan salonun yarısı boşaldı. Bir öncekine göre nispeten daha faydalı bir sunum oldu.

Kısacası ya ben çok büyük beklentilerle gittiğim için ya da başka sebeplerden dolayı etkinliği yetersiz buldum. İnşallah bundan sonraki senelerde daha iyi olur.

Evet yine eleştiri dolu bir yazının daha sonuna geldim. Üşenmeyip de sonuna kadar okuyanlar olursa eminim ararından birçoğu topa tutacaklardır beni ama onlara da söyleyeceğim kısaca şu: “Hakkatten öyleydi lan boşuna kendinizi kandırmayın.”

Şu yukardakilerin tamamı kişisel fikrimdir, kimseyi bağlamaz.

Mart 28, 2011

android, eleştiri

3 yorum

Bir süredir zaten yasaklı olan http://developer.android.com sayfasına giriş artık ip bloğu engellenerek tamamen yasaklandı. Yasakçılar da uyandı artık ufak ufak teknolojiyi öğrenmeye başladılar. Eskiden dns değiştirip, hosts dosyasını editleyip girerdik ama işler iyice çığırından çıktı. Artık bu yöntemler de yetmiyor. Densizin biri telif hakkına sahip olmadığı bir şeyi yayınladığı için ya da başka densizin biri sevmediği birine hakaret ettiği için vs. dandik sebeplerden dolayı bütün interneti yasaklayan zihniyet size sesleniyorum: Allah belanızı versin. Bakın artık küfür etmiyorum sadece beddua ediyorum. Ha bu yazıyı okuyorsanız lütfen bu sayfayı da yasaklayın çok da bi yerimde.. Hatta bu sayfanın yayınlandığı ip bloğunda bulunan tüm siteleri de yasaklayın. Yasaklamazsanız adam değilsiniz ulen.