AIR for Android ile internet bağlantısını sorgulamak ( Adobe Air detect for internet connection )

Android için ya da diğer mobil cihazlar için uygulama geliştiriyorsak uygulamamızın temel ihtiyaçları olabilir. Bunlar internet bağlantısını kontrol etmek, GPS kontrolleri, MACID gibi bir çok şeyi elde etmek isteyebiliriz. Bu gibi durumlarda Flex SDK ve AIR SDK bize bir çok yenilik sağlıyor aslında. Native uygulama geliştirmek yerine daha hızlı daha kolay ve daha anlaşılır bir şekilde mobil uygulamalar geliştirebilirsiniz. Tek şartınız kurulan cihazda AIR Runtime kurulu olması gerekiyor (bu sadece Android cihazlar için geçerli.) Diğer taraftan IOS tabanlı uygulamalar ve oyunlarda ise hiç bir şekilde ek bir plug-in’e ihtiyaç duyulmuyor. Native kodlar gibi derlenip .ipa çıktısı verebiliyor.

Kısaca üstün körü bir şekilde AIR for Mobile’dan bahsettikten sonra asıl konumuz olan internet bağlantısını kontrol etmeye gelelim. Bunun için ilk olarak yapmamız gereken belli başlı ayarlar bulunuyor. İlk olarak Air SDK’den aircore.swc dosyamızı dahil etmemiz gerekiyor. Bunun için şu adımları izleyin.

İlk olarak projemizi açalım. File > new > AIR for Android seçin daha sonra aşağıdaki ayarlara bir göz atın.

C:\Program Files (x86)\Adobe\Adobe Flash CS5.5\AIR2.6\frameworks\libs\air klasöründe aircore.swc’nin olduğundan emin olun. Daha sonra Flash Professional’a geçip şu adımları izleyin;

File > Publish Setting > Sağ üst köşedeki ikinci anahtar simgesine tıklayın > Açılan pencerede -Library Path- sekmesine tıklayın > Artı simgesine tıklayın, Daha sonrasında -Flash player ikonuna tıklayın (küçük beyaz f işareti) Yukarıda belirttiğim dizine gidin ve oradan aircore.swc bulun ve ekleyin. Daha sonrasında aşağıdaki kodları yazın;


// uygulama için gerekli kütüphaneleri uygulamaya dahil ediyoruz.
import air.net.*;

// monitor ibaresi bize internet bağlantısının olup olmadığını sağlar.
var monitor:URLMonitor = new URLMonitor(new URLRequest('http://serhatsezer.wordpress.com'));
// bir event'e bağlayıp akışı kontrol etmemizi sağlayan fonksiyona gönderir.
monitor.addEventListener(StatusEvent.STATUS, netConnectivity);
// yaptığımız işlemleri başlatır.
monitor.start();

function netConnectivity(event:StatusEvent):void
{
// eğer internet bağlantısı sağlınıyorsa true, sağlanmıyorsa false değeri dönderir.
if(monitor.available)
{
trace("internet bağlantısı var.");
}
else
{
trace("internet bağlantısı yok.");
}
}

İhtiyaç duyabileceğiniz kaynaklar;

http://cookbooks.adobe.com/post_Detecting_the_network_connection_type_with_Flex_4_-18791.html
http://www.actionscript.org/forums/showthread.php3?t=261165
http://stackoverflow.com/questions/9671678/adobe-air-check-for-internet-connection
http://stackoverflow.com/questions/9872348/adobe-air-detect-if-connection-is-wifi-3g-or-edge


Javascript ufak bir trick

Jquery kütüphanesini kullanmadan javascript ile değişen efektsiz bir banner alanı yapabiliriz. Bunu genellikle mobil cihazların performansı açısından yapılabilir gibi gözüküyor. Plug’insiz bir şekilde banner yapılabilir. Bunun için sadece img tagının src özelliği ile yapılabilir. Ancak ben sadece ar-ge yaptığım için sadece setTimeout’lu biryapı kurdum.

Mantık bir Object oluşturmak (SERHATS) adında ardından bu objenin içinde kodları başlatan init metodu getirilir. Init metodunda array’lere push metodunu kullanarak elemanlarımızı index kullanarak ekleyebiliriz. Daha sonrasında dışardan st = Interval değeri (timer) sonrasında nCurrent = integer değer arrayları seçeceğimiz değişken olarak düşünülebilir. wrapText = string (htmldeki id’mizi seçecek olan alan) bu da değişen değeri #wrapText div’nin içine yazacaktır. nextBtn ve prevBtn ileri ve geri butonlarımız bunlar da html DOM yapısı içerisinde link sisteminde verildi ve id değerleride bu şekilde verildi.


var SERHATS = {} || new Object();
var projects = new Array();
var nCurrent = -1;
var wrapText;
var st = null;
var prevBtn;
var nextBtn;

SERHATS = {

init : function()
{
bannerInterval();
projects[0] = "Proje adı 1";
projects[1] = "Proje adı 2";
projects[2] = "Proje adı 3";
projects[3] = "Proje adı 4";
projects[4] = "Proje adı 5";
projects[5] = "Proje adı 6";

nextBtn = document.getElementById('btnNext');
prevBtn = document.getElementById('btnPrev');

nextBtn.addEventListener("click",function(){
nCurrent ++;
nCurrent = nCurrent % projects.length;
wrapText = document.getElementById('wrapper').innerHTML = projects[nCurrent];
console.log('next button clicked.')
});

prevBtn.addEventListener("click",function(){
if(nCurrent>0) nCurrent --;
wrapText = document.getElementById('wrapper').innerHTML = projects[nCurrent];
console.log('prev button clicked.');
});

nextBtn.addEventListener("mouseover",function(){
console.log('Bir sonraki banner adı ==== ' + projects[nCurrent + 1]);
});

prevBtn.addEventListener("mouseover",function(){
console.log('Bir önceki banner adı ==== ' + projects[nCurrent - 1]);
});
}
};

function bannerInterval()
{
st = setInterval(function(){
nCurrent ++;
wrapText = document.getElementById('wrapper').innerHTML = projects[nCurrent];

if(nCurrent === 5)
{
clearInterval(st);
st = null;
}

},3000);
}

Ayrıca verileri array şeklinde de ekleyebiliriz.

document.body.innerHTML = ['Deneme1','Deneme2','Deneme3'].join('-');

Javascript setTimeout ve setInterval Hakkında Kaynaklar

http://www.w3schools.com/js/js_timing.asp
http://www.pageresource.com/jscript/jtimeout.htm
http://www.west-wind.com/weblog/posts/2006/Mar/28/JavaScript-windowSetTimeout-to-a-JavaScript-Class-method-or-function-with-parameters


SQL ile Update

University adında bir veritabanım var ve bu veritabanının içinde CampusInfo adında bir tablomuz yer alıyor. Bu tablonun içinde CampusName ve CampusId alanları(rows)lar var. Daha sonrasında bu tapolaların içindeki verileri güncelleyebilmemiz için UPDATE etmemiz gerek. Yanlız bu noktada dikkat edilmesi gereken bir nokta var o da hangi veriyi güncelleyeceğimizdir. Bunun için ise yardımımıza CampusId yetişiyor…

SQL İfadesi

UPDATE CampusInfo SET CampusName=YeniVerimiziGiriyoruz WHERE CampusId=HangiIDverisiGuncellenecek

İlk satırda yani SET CampusName kısmında veritabanından sadece hangi alandan veri güncelleyeceğimizi seçiyoruz. WHERE CampusId kısmında ise Hangi ID nosuna sahip veriyi güncelleyeceğimizi belirliyoruz.


Random Değerler Üretmek (Shuffle Array)

Actionscript projelerimizde gerek dinamik , gerekse statik yani kod ile oluşturduğumuz dizilerde ya da dışarıdan gelen dataları random çekme gibi bir ihtiyaç duyabiliriz. Bunun için yapmamız gereken random değerleri üretmek olacaktır. Bunun için Math.random() sınıfı kullanarız. Fakat datalarımızı rastgele çekebilmek için belli bir yapıyı kullanmamız gerekir. Datalarımızı bir fonksiyona çekeriz ve bu fonskiyonda belli bir algoritmada işlemlerimizi gerçekleştiririz.

İlk olarak fonksiyona argüman olarak bir array tanımlarız ve bu arrayin içindekileri kontrol edebilmek için tersden bir for döngüsüne sokarız. Tersden kastım dizinin boyutu kadar azalmasını sağlamak. 10..9..8.. gibi… Ayrıca random sayıları elde edebilmek içinse bir adetde randım sayı üretici yapmamız gerekiyor. Bunun içinde basit bir işlem yapıcaz argüman olarak sayı vericez ve bunu Math.random ile çoğaltacak bu kadar basit. Kısaca koda geçelim o daha iyi anlatacaktır ve daha iyi anlayacaksınızdır.


function getRandom(num:int):int
{
return Math.floor((Math.random() * num));
}

function shuffleArray(array:Array):Array
{
for(var i:int = array.length; i > 1; i--)
{
var j:int = getRandom(i);
var tempArray:String = array[j];
array[j] = array[i-1];
array[i-1] = tempArray;
}
return array;
}

Şimdi kısaca koddan bahsedecek olursak; j değişkeni getRandom() metoduna gönderiyor ve ordan bize rastgele bir sayı üretiliyor. Daha sonra biz bu sayıları kullanarak arrayden rastgele elemanlar alıyoruz. Örneğin 5. indeksdeki bir değeri alıyoruz. Daha sonrasında ise bunu tempArray adındaki bi değişkene atıyoruz. Bunu aşağıdaki son elemana atıyoruz. Bu sayede sürekli karışık verileri elde etmiş oluyoruz. Kullanımı ise aşağıdaki gibi olmalıdır.


var array:Array = new Array("xx","yy","bb","cc","qq","ee","bn","jjk","üü","oo","ee","11","222");

var a:Array = shuffleArray(array);
trace(a);


C# StringBuilder

Yapılan programlarda bellek ve bellek yönetimi önemli bir yer tutar. Bu ve bunun gibi durumlarda performans ararız ve bunun için bir şeyler yapma ihtiyacını buluruz programımızda. Bunun için c# StringBuilder adında güzel bir sınıf oluşturmuş ve string ile çalışmamızı kolaylaştırmış. Stringlerimizi tekrardan isteyip + (artı) operatörüyle bağlamak yerine StringBuilder sınıfının Append özelliği ile stringlerimizi ekleyebiliyoruz.

Örneğin Sepet.cs adında bir Struct sınıfımız olsun bu sınıf içerisinde sırasıyla sepetNo, fiyat, adet şeklinde üç adet int değeri taşıyan değişkenlerimiz olsun. Daha sonra Program.cs tarafında bu sınıfdan çağrışım yapabiliriz.

Sepet.cs

internal struct StringMemory
{
internal string adi;
internal string soyadi;
internal byte yasi;

}

Program.cs Stringlerimizi birleştireceğimiz classımız.

StringBuilder sb = new StringBuilder();
sb.Append("Adı
");
sb.Append(sm.adi);
sb.Append("Soyadı
");
sb.Append(sm.soyadi);
sb.Append("Soyadı
");
sb.Append(sm.yasi);

Console.WriteLine(sb);

Console.ReadKey();

Bunu neden kullandık ?

Verdiğimiz String değerler bilgisayarın steak bölgesinde tutuluyor. Şimdi bu değerlerden performans sağlayabilmek için kodumuzu minumuma indirmemiz gerekiyor. Bunun için StringBuilder bu işimizi görüyor.


C# ile Region kullanımı

Örnek vermek gerekirse bir alışveriş sitesini ele alalım. Bu alışveriş sitesinde sırayla;  Sepet işlemleri,  sepet doldurma, sepet boşaltma, sepete ürün ekleme gibi bir çok işlemi yapan bir Basket adında bir class dosyamız olsun ve sepet ile ilgili tüm değişiklikleri bu class içerisinden halledelim. Fakat kodlarımızı ne kadar fonksiyonel yaparsak yapalım yani her işlemin bir fonksiyonu olsa da çoğu zaman başka işlerlemlerde yapabiliriz. Bu gibi durumlarda kodlarımızı üstüne comment yazarız bu bir nebze olsada işimizi çözer fakat kodlarımızın sağ kısmında kapattığımızda herhangi bir açıklama yapmaz bize.

Bu gibi durumlarda kodlarımızı kapamamıza rağmen hangi kapalı olan kodun ne iş yaptığını bilmeyiz bu gibi durumlarda karmaşıklık olur ve altından kalkılmayacak şeyler çıkar ortaya bu gibi durumlarda bunu engelleyebilmek için #region kullanırız.  Region açmak için diyezle birlikte #region ibaresini kullanırız. Bitmesini ise #endregion şeklinde sağlarız.

Kodların başlangıç yerine #region bitiş yerine ise #endregion ibarelerini kullanırız. Eğer #endregion ifadesini kullanmazsak #region başlangıç noktasından süslü parantezin en sonuncusuna kadar alır. Bir şekilde rezerve ediyoruz bu şekilde.

Örnek kullanımı hakkında ;

 


ArrayList Kullanımı

c# ile Array kullanımında objelere değer sayısı atamamız gerekir. Bu gibi durumlarda int,string,double,byte,long vs. gibi yapıları kullanırız ve yapıların boyutlarını belirtirken köşeli parantezler içerisine [10] gibi değerler gireriz. Aşağıda array kullanımını ve arrayList kullanımının farkını anlatmak adına bir adet array ve arraylist oluşturuyorum.

string[] isimler = new string[3]{"Serhat","Sezer","Developer"};

bu şekilde çıktı alabilmek için yapmamız gereken tek şey. isimler[0] gibi ulaşabiliyoruz. Fakat alışveriş sepeti gibi uygulamalarda kullanıcının ne kadar ürün ekleyebileceğini bilmediğimiz için dinamik bir array oluşturamıyoruz. Bunun için ArrayListleri kullanabiliyoruz.

namespace ArrayList_Kullanimi
 {
 class Program
 {
 static void Main(string[] args)
 {
 OrnekArrayList();
 }
static void OrnekArrayList()
 {
 // kolleksiyon sınıfı oluşturulur.
ArrayList koleksiyonlar = new ArrayList();
// Kolleksiyona Object türünde değerler eklenir.
koleksiyonlar.Add("Serhat Sezer");
 koleksiyonlar.Add(20);
 koleksiyonlar.Add(new DateTime(17,2,2));
// Koleksiyon elemanlarına, dönüşüm(cast) yaparak erişilir. Çünki koleksiyon içerisinde Object türüne çevirerek oluşturlur ve kullanılır.
string adi = (string)koleksiyonlar[0];
 Console.WriteLine("Koleksiyondaki 1. Elemana erişildi\n " + adi);
// Koleksiyondaki elemanların tümüne erişilir : herhangi bir döngü türü ile olabilir.
Console.WriteLine("Kolleksiyondaki bütün elemanlara erişebilirsiniz...");
foreach(object item in koleksiyonlar)
 {
 Console.WriteLine(item);
 }
Console.ReadLine();
 }
 }
 }

ArrayList yapısı bize birden fazla veritipini eklememize olanak sağlıyor. Yani bir ArrayList objesinin içerisine string,double,long,int,uint,short gibi bir çok özellik ekleyebiliyoruz. Bunu yaparken ArrayList’in Add() metodunu kullanıyoruz. Fakat bu eklediğimiz nesneleri kullanabilmek için (türüne göre – int ,string , double- vs) tür dönüşümü yapmamız gerekiyor.

Yukarıdaki örnekte görüldüğü gibi 1. indekse sahip olan eleman 20 sayısını barındırıyor, Biz bunu kullanabilmek için 20 sayısını stringe çevirip işlememiz gerekiyor bunun için yapmamız gereken yol;

string yasi = (string)kolleksiyonlar[1];

Yukarıda yaptığımız kodda ise aldığımız number bir değeri string veri tipine çevirebiliyoruz.


Hexadecimal renk kodlarını as3′e uyarlamak

Yapılan projelerde bazı durumlarda, alt tarafta gizli bir işlem yapmak isteyebiliriz. Bu gibi durumlarda tasarıma uygun bir yerine, uygun bir şekilde saklanması, kamufile olması şart. Bunun için de renk kodlarını, varsa yazı stillerinin aynı olması gerekiyor. Böyle bir uygulama yapma ihtiyacı duydum ve dosylaarın Xml’den gelmesi gerekiyordu. Fakat renk kodlarını actionscripte uyarlamak “müşteri” tarafında biraz zordu o yüzden renk kodunu photoshopta alıp xmle girmesi gerekiyordu fakat photoshoptaki renk kodunu actionscript kabul etmiyordu sistem olarak bu durumda aşağıdaki slice metodunu kullanarak bu işlemi gerçekleştirdim.

var color:String = "#FFCC00";

if(color.charAt(0) == "#")
{
     color = "0x" + color.slice(1);

     var ct:ColorTransform = new ColorTransform();
     ct.color = uint(color);
     bg_mc.transform.colorTransform = ct;
}

Burda yaptığımız mantık ise slice metodu string karakterler içerisinde dilimleme işlemini gerçekleştiriyor. Yukarıdaki renk kodunun ilk değeri # (diyez) içeriyorsa aşağıdaki işlemleri gerçekleştir diyoruz. Daha sonra ise diyez işaretini atla ve daha sonraki dilimi getir ve ekle diyoruz. Daha sonra dinamik renk kodları ile movieclip rengimizi değiştiriyoruz. Bunu yaparkende ColorTransform sınıfını kullanıyoruz. String olarak çıktı alacağı için bu değeri biz uint değere aktarıp daha sonra movieclibe atıyoruz bu aldığımız değeri.


Javascript ile Attributelere Ulaşmak

Dinamik ya da dökümanızda eklediğimiz html elemanlarının attributelerine ulaşmak isteyebiliriz bazen bu gibi durumlarda; attirubte değerini alıp değiştirebiliriz.

Html sayfamızda img etiketiyle bir resim gömdüğümüzü varsayarak devam ediyorum sadece javascript kodları yazıyorum

var imgAttr = document.getElementById('resimID').attributes.getNamedItem('class').value;

Burada kodları kısaca açıklamak gerekirse; İlk olarak resmimizin ID vererek ulaşıyoruz. Daha sonrasında ise ID ile ulaştığımız resimlerin attributteslerine ulaşabilmek için “attributes” değerini kullanıyoruz. Daha sonra ulaştığımız attributeslerin değerlerinin ne olduğunu öğrenebilmek için getNamedItem ile ulaşıyoruz. daha sonra value ya da name şeklinde alabiliyoruz.


As3 getChildByName Sorunsalı

Actionscript ile uygulama geliştirirken bir çok hatayla karşılaşabilirsiniz. Bunların bazıları dikkat dağınıklığı olsada bazılarıda flashtan kaynaklanabiliyor ve kendimiz bu sıkıntıya çözüm üretmek zorunda kalabiliyoruz. Çözüm için internette de araştırdığımda benimle aynı sıkıntıyı yaşayan bir kaç kişiyi daha gördüm.

Linkage ile oluşturduğum bir objeye statik olarak bir değişken atamak istediğimde içine getChildByName ile ulaştığımda hata ile karşılaşıyordum “undefined property”  bunu çözebilmek için yapmam gereken yok ise basit bir yolmuş  şöyle ki ;

var box:Box = new Box();
box.name = "box";
box.walk = true;
addChild(box);

var w:Boolean = MovieClip(getChildByName("box") as Box).walk
trace(w);

İlk olarak Box adında Linkagedan yani Libraryimden bir obje çekip sahneye ekliyorum. Daha sonra eklediğim objeme statik olarak içine bi değişken saklıyorum ve bu değişkenle oynuyorum. Bunu kullanmaya çalıştığımda yukarıda bahsettiğim hatayla karşılaşıyordum. Mantık ise şu;

Bir değişken oluşturdum. Boolean değerini sakladı sebebi ise dönen değerin yukarıda belirttiğim gibi boolean bir değer olmasıydı. box.walk = true; eğer string bir değer olsaydı string değer verirdim. Daha sonra ise linkage ile eklediğim objeme ait olduğunu bildiriyorum. as Box bu şekilde demiş oluyorum ki ; Movieclibin içinde Box ile ilgili bir değişkenim var ve bu şekilde o değişkeni çekebilir ve üzerinde oynamalar yapabilirim.


Takip Et

Get every new post delivered to your Inbox.