Java’da List, ArrayList, Set vb Collections framework yapıları ve bunların metodları (add, remove, sort vb) sağladığı kolaylıklar sebebiyle bolca kullanır. Örneğin bir ArrayList içinde String ya da Integer tipinde nesneler varsa ve bunları sıralamamız gerekiyorsa Collections.sort(liste_ismi); şeklinde bir kullanımla listeyi sıralı hale getirebiliriz. Buna küçük bir örnek verelim. Aşağıdaki kod parçası bir ArrayList oluşturup içine 5 tane String tipinde eleman ekliyor, elemanları sıra ile konsola yazdırıyor, sıralıyor ve son olarak sıralı listeyi konsola yazdırıyor.
import java.util.ArrayList;
import java.util.Collections;
public class ObjectSort {
/**
* @author Oguz
*/
public static void main(String[] args) {
ArrayList mList = new ArrayList();
mList.add("Black Sabbath");
mList.add("Judas Priest");
mList.add("Jimi Hendrix");
mList.add("Dire Straits");
mList.add("Pink Floyd");
// Sıralanmamış listeyi yazdırıyoruz:
System.out.println("Sıralanmamış dizi:");
listeyiGoster(mList);
// listeyi sıralıyoruz
Collections.sort(mList);
// Sıralanmış diziyi gösteriyoruz
System.out.println("Sıralanmış dizi:");
listeyiGoster(mList);
}
private static void listeyiGoster(ArrayList mList) {
for (int i = 0; i < mList.size(); i++) {
System.out.println(i + " -> " + mList.get(i));
}
}
}
Kodun çıktısı aşağıdakine benzer olur:
Sıralanmamış dizi:
0 -> Black Sabbath
1 -> Judas Priest
2 -> Jimi Hendrix
3 -> Dire Straits
4 -> Pink Floyd
Sıralanmış dizi:
0 -> Black Sabbath
1 -> Dire Straits
2 -> Jimi Hendrix
3 -> Judas Priest
4 -> Pink Floyd
Elemanlarının tipi Integer, String, Double vs olan listeleri sıralamak basit, peki kendi nesnelerimizi nasıl sıralarız? Mesela String tipinde ad, soyad ve int tipinde doğum yılı alanları olan ‘Ogrenci’ tipinde elemanları olan bir liste. Deneyelim..
Önce Ogrenci classımızı yazalım:
public class Ogrenci {
private String ad;
private String soyAd;
private int dogumYili;
public Ogrenci(String ad, String soyAd, int dogumYili) {
super();
this.ad = ad;
this.soyAd = soyAd;
this.dogumYili = dogumYili;
}
public String getAd() {
return ad;
}
public void setAd(String ad) {
this.ad = ad;
}
public String getSoyAd() {
return soyAd;
}
public void setSoyAd(String soyAd) {
this.soyAd = soyAd;
}
public int getDogumYili() {
return dogumYili;
}
public void setDogumYili(int dogumYili) {
this.dogumYili = dogumYili;
}
@Override
public String toString() {
return this.getAd() + " " + this.getSoyAd() + " :: "
+ this.getDogumYili();
}
}
Şimdi main classın içinde elemanlarının tipi Ogrenci olan bir liste oluşturup elemanlar ekleyelim ve konsola yazdıralım.
public static void main(String[] args) {
ArrayList mList = new ArrayList();
mList.add(new Ogrenci("F. Oğuz", "ÖZKEROĞLU", 1988));
mList.add(new Ogrenci("Ad", "SOYAD", 1985));
mList.add(new Ogrenci("İsim", "SOYİSİM", 2000));
mList.add(new Ogrenci("Deneme", "YANILMA", 2011));
// Sıralanmamış listeyi yazdırıyoruz:
listeyiGoster(mList);
}
private static void listeyiGoster(ArrayList<Ogrenci> mList) {
for (int i = 0; i < mList.size(); i++) {
System.out.println(i + " -> " + mList.get(i));
}
}
Kodun çıktısı aşağıdakine benzer olur:
0 -> F. Oğuz ÖZKEROĞLU :: 1988
1 -> Ad SOYAD :: 1985
2 -> İsim SOYİSİM :: 2000
3 -> Deneme YANILMA :: 2011
Şimdi listeyi sıralamaya çalışalım
Collections.sort(mList);
Bu satırda IDE aşağıdaki uyarıyı veriyor:
‘Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (ArrayList). The inferred type Ogrenci is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>’
Biz metoda listeyi sırala diye verdik ama neye göre sıralaması gerektiğini söylemedik. Ad, soyad ve doğum yılına göre sıralanabilir bir liste. Peki böyle durumlarda ne yapacağız? Sıralanacak türü diğer türdaşları ile karşılaştırılabilir bir forma sokacağız. Bunu yapabilmek için ben şöyle bir yöntem kullandım: Collections sınıfının sort metodunun liste ve Comparator türünden nesneleri parametre olarak alan versiyonunu kullandım. Metodu çağırırken Comparator classımı da oluşturdum. Sonunda aşağıdaki gibi bir kod parçası ortaya çıktı:
public class ObjectSort {
/**
* @author Oguz
*/
public static void main(String[] args) {
ArrayList mList = new ArrayList();
mList.add(new Ogrenci("F. Oğuz", "ÖZKEROĞLU", 1988));
mList.add(new Ogrenci("Ad", "SOYAD", 1985));
mList.add(new Ogrenci("İsim", "SOYİSİM", 2000));
mList.add(new Ogrenci("Deneme", "YANILMA", 2011));
// Sıralanmamış listeyi yazdırıyoruz:
System.out.println("Sıralanmamış liste:");
listeyiGoster(mList);
// Listeyi sıralıyoruz
Collections.sort(mList, new Comparator() {
@Override
public int compare(Ogrenci o1, Ogrenci o2) {
String oName1 = o1.getAd();
String oName2 = o2.getAd();
return oName1.compareTo(oName2);
}
});
// Sıralanmamış listeyi yazdırıyoruz:
System.out.println("Sıralanmış liste:");
listeyiGoster(mList);
}
private static void listeyiGoster(ArrayList<Ogrenci> mList) {
for (int i = 0; i < mList.size(); i++) {
System.out.println(i + " -> " + mList.get(i));
}
}
}
‘compare’ metoduna Ogrenci türünde aldığı iki nesnenin adlarını alıp birer String’e atmasını ve karşılaştırmayı bu Stringler arasında yapmasını söyledik. Sonuçta da aşağıdaki gibi bir konsol çıktısı oluştu:
Sıralanmamış liste:
0 -> F. Oğuz ÖZKEROĞLU :: 1988
1 -> Ad SOYAD :: 1985
2 -> İsim SOYİSİM :: 2000
3 -> Deneme YANILMA :: 2011
Sıralanmış liste:
0 -> Ad SOYAD :: 1985
1 -> Deneme YANILMA :: 2011
2 -> F. Oğuz ÖZKEROĞLU :: 1988
3 -> İsim SOYİSİM :: 2000
Metoda aldığı öğrencileri adlarına göre sılaramasını söylediğimiz için konsol çıktısında sıralanmış liste ada göre sıralanmış bir liste oldu. Eğer listenin doğum yılına göre sıralanmasını istiyorsak metodumuzu aşağıdaki gibi değiştirmemiz gerekirdi.
Collections.sort(mList, new Comparator() {
@Override
public int compare(Ogrenci o1, Ogrenci o2) {
Integer oYear1 = o1.getDogumYili();
Integer oYear2 = o2.getDogumYili();
return oYear1.compareTo(oYear2);
}
});
Çıktı da aşağıdaki gibi olur:
Sıralanmamış liste:
0 -> F. Oğuz ÖZKEROĞLU :: 1988
1 -> Ad SOYAD :: 1985
2 -> İsim SOYİSİM :: 2000
3 -> Deneme YANILMA :: 2011
Sıralanmış liste:
0 -> Ad SOYAD :: 1985
1 -> F. Oğuz ÖZKEROĞLU :: 1988
2 -> İsim SOYİSİM :: 2000
3 -> Deneme YANILMA :: 2011
Liste artık dogumYili alanının değerlerine göre sıralı.
Yukarıda yalan – yanlış bilgiler yer alıyor olabilir, okuyanlar böyle bir şeyin farkına varırlarsa lütfen uyarmaktan çekinmesinler.
Android’in veri saklama yöntemleri ile alakalı daha önce Android :: Shared Preferences yazısını yazmıştım. O listedeki external storage cihazın harici hafızasına, yani şimdilik sd karta tekabül ediyor.
Üzerinde çalıştığım projelerin birinde mp3 dosyalarını saklamam gerekiyordu. Sayısı birden fazla ve her birinin ortalama boyutu 10 mb civarında mp3 dosyalarını dahili hafızaya ya da uygulama paketi içinde bir yerlere yazsam kısa süre sonra cihaz kullanılmaz hale gelebilir. Bu durumda çözüm olarak dosyaları sd kart üzerine yazmaya karar verdim (Umarım doğru bir karar vermişimdir :)
Başta direkt sd kart üzerine yazıp uygulamayı çalıştırdım ama kısa süre sonra kart çöplüğe döndü. Her şeyi ana dizin içine atıyordum. İşte tam burda kart üzerinde bir klasör oluşturma ve dosyaları oraya yazma / oradan okuma zorunda kaldım. Bu yazıda da bu olayı nasıl yaptığımı anlatmaya çalışacağım.
Bunun için Java’nın “File” class’ından bir obje yaratıp, parametre olarak yol + klasör ismi verdim ve sonrasında file.mkdir() metodu ile klasörü oluşturdum. Kod aşağıdaki gibi:
File mFile = new File("/sdcard/altKlasor");
mFile.mkdir();
Tabi bu kodun çalışması için yine her zamanki gibi AndroidManifest.xml dosyasına harici hafızaya yazma iznini eklememiz gerekiyor.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Bu sayede direkt sd kart altında klasörü oluşturduk. Aşağıda Eclipse’teki File Explorer’ın kod çalışmadan önceki ve sonraki hali var.
Önce:

Sonra:

Kodu çalıştırdık işimizi gördük ama burda ufak bir sıkıntı var. Sd kartın yolunu elle girdik. İlerde yolun değişebilmesi ya da sd kart yerine başka bir harici hafıza kullanılabilmesi durumlarına karşılık daha iyi bir yöntem kullanmak gerekti. Bunun için de harici hafızanın direkt yolunu alan aşağıdaki kodu buldum.
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
Bu şekilde biraz daha bağımsızlık ve esneklik kazanmış olduk. Dosyayı oluşturan kodun tamamı aşağıdaki gibi şekillendi.
String strNewFolder = "/altKlasor"; String extStorageDirectory = Environment.getExternalStorageDirectory().toString(); File mFile = new File(extStorageDirectory + strNewFolder); mFile.mkdir();
Belki birinin daha işine yarar..
WebView içinde bir web sayfasını göstermek için aşağıdaki kod kullanılıyor.
WebView wv;
wv = (WebView) findViewById(R.id.webview);
wv.loadUrl("http://www.google.com");
Tabi bunu kullanabilmek için uygulamamıza internete erişim iznini vermemiz gerekiyor. Bunun için de AndroidManifest.xml dosyası içinde uygun yere aşağıdaki satırı ekliyoruz.
<uses-permission android:name="android.permission.INTERNET" />
Çalıştırdığımızda aşağıdaki gibi bir görüntü elde ediyoruz.

Buraya kadar bir sıkıntı yok zaten bilinen şeyler. Peki kendi hazırladığımız bir html sayfasını nasıl gösteririz?
Bunun için html içeriğimizi oluşturup bir stringe atıyoruz ve WebView içinde o stringi gösteriyoruz.
String strHtml = "<html><head></head>" + "<body text=\"#444444\" bgcolor=\"#CCCCCC\">" + "<br /><br /><center><h2>" + "Static html content in Android" + "</h2></center></body></html>"; wv.loadData(strHtml, "text/html", "UTF-8");

Artık internet erişimine gerek kalmadığı için Manifest dosyamızdan o izni kaldırabiliriz. Bu string içinde CSS de kullanılabilir. Bunlar yeterli değil, JavaScript de olsun diyorsanız aşağıdaki satırı WebView tanımlamasında sonra eklemeniz gerekir.
wv.getSettings().setJavaScriptEnabled(true);

Örnek uygulamada kullandığım java dosyası:
package com.oguz.example;
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.WebView;
public class WebViewTest extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
setContentView(R.layout.webwiew_test);
WebView wv = (WebView) findViewById(R.id.webkitWebView1);
String strHtml = "<html><head></head>"
+ "<body text=\"#444444\" bgcolor=\"#CCCCCC\">"
+ "<br /><br /><center><h2>"
+ "Static html content in Android</h2>"
+ "<script type=\"text/javascript\">"
+ "document.write(Date());</script>"
+ "</center></body></html>";
wv.getSettings().setJavaScriptEnabled(true);
wv.loadData(strHtml, "text/html", "UTF-8");
}
}
XML dosyası ise:
<?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.webkit.WebView android:id="@+id/webkitWebView1" android:layout_width="fill_parent" android:layout_height="fill_parent"> </android.webkit.WebView> </LinearLayout>
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.

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.

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.
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.
Hani şu public ceket askılarına ceketinizi/montunuzu asarsınız da sizden sonra sağına soluna da asanlar olur ya, o sonradan gelenler eğer sigara içen kişilerse ceketiniz/montunuz siz onu tekrar alıp giyene kadar leş gibi sigara kokar ya, heh işte o ceketleri oraya asanların ta *mına koyayım.



