Olan Biten

Bir yıl önceki son yazımdan sonra Doitr  yazısı ile geri döndüm. O zaman biraz da neler olup bittiğinden bahsedeyim. Son iş yerimde üçüncü yılımı doldurmak üzereyim, kendi adıma rekor oldu bu ve o tarafta işler tüm yoğunluğu ile devam ediyor. Farklı bir durum yok açıkcası.

İşin eğlenceli kısmına gelirsek geçen sürede bir kaç başarısız (kime göre, neye göre :)) mobil oyun macerasından sonra Doitr ile ilgilenmeye başladım. Bu arada da mobil uygulama için platformlar denemeye devam ediyorum. Native, Intel XDK, Phonegap. Hepsi çok değerli bilgiler, dersler kattı bu anlamda çok da başarısız değil anlayacağınız oyun denemelerim.

Daha sonra yeniden sosyal bir projeye geri döndüm. Her ne kadar sosyal projelere ciddi bir sermayem olmadan girmeyi düşünmesem de, arada tekrar denemekten kendimi alamıyorum. Şu an Doitr‘dan başka, fikir-prototip aşamasında olan bir mobil uygulama daha bulunmakta ama dediğim gibi vakit almıyor. Sadece bazı temeller ve tartışmalar üzerinde şu an.

Son olarak da güvendiğim ve denemek istediğim hizmet tabanlı bir proje var. Tabi o daha büyük kararlar ve fedakarlıklar gerektiriyor. Şimdilik o yüzden demlenme aşamasında. Bir gelişme olursa tekrar yazarım zaten.

Bu arada Laravel Framework ile liseli aşıklar gibiyiz. Sürekli birlikteyiz, gözümüz başkasını görmüyor.

Şimdilik profesyonel işimden kalan neredeyse tüm zamanım Doitr’a gidiyor. Durumlar böyle, umarım tekrar yazmam bu kadar uzun sürmez 🙂

Not: Resim ne alaka diyebilirsiniz. Hem bloga ferahlık, renk gelsin istedim biraz. Hem de bu aralar doğaya, yeşilliğe hasret kaldım, ona bir atıf.

Doitr – Bir Sosyal Görev Uygulaması

Merhaba,

Evet farkındayım yıllar geçti son yazımın üstünden. Ama güzel bir sebeple buradayım tekrar 🙂 Doitr adlı uygulamamdan bahsedeceğim çok kısa. En güzel google play üzerindeki açıklama ifade eder sanırım.

Doitr bir sosyal görev uygulamasıdır. Uygulama aracılığıyla sosyal görevler tanımlayabilir ya da tamamlayabilirsiniz.
Doitr sizin hem başkalarının görevlerini tamamlayıp eğlenmenizi hem de kendinize atadığınızı görevler ile motivasyonunuzu artırmanızı sağlar.

Paylaşılan görevler eğlence amaçlı olabileceği gibi sosyal bir sorumluluk amacıyla da eklenebilir.

Bir görev anlık olarak trafiğin fotoğrafını göndermek olabileceği gibi, bağlı gözlerle arkadaşına makyaj yapmak, maskeli selfie göndermek, video ile ünlülerin taklidini yapmak, en güzel futbol karesini yakalamak gibi milyonlarca şey olabilir.

Sen görevi yaparsın, başarılı olup olmadığına diğer kullanıcılar karar verir.

Şu an beta aşamasında ve geliştirmesi devam ediyor. Iphone uygulaması da çok kısa bir süre içerisinde yayında olacak. Uygulamayı google playdan indirebilirsiniz. Yorumlarınız varsa çok faydası olacaktır.

Hadoop DataNode Hatası Ve Çözümü

Hadoop’u incelemeye başladıysanız ve benim gibi daha çok Windows/.Net ekseninde hayatınız geçmişse, tüm örneklere rağmen ilk günler oldukça yorucu ve can sıkıcı geçebiliyor. Örneklerini adım adım yapmanıza rağmen istediğiniz sonucu elde edemeyebiliyorsunuz.

Beni birkaç gündür uğraştıran bir hatanın çözümünü bulunca, başkalarının da birkaç günü heba olmasın diye paylaşmak istedim.

İlk denemelerinizi yaparken az sonra açıklayacağım sorun nedeniyle aşağıdakine benzer bir hata alabilirsiniz.

“There are 0 datanode(s) running and no node(s) are excluded in this operation.”

Aslında hataya bakınca datanode’ların başlatılamadığını düşünüp, tekrar tekrar restart edebilirsiniz. Ama bu çözüm olmayacaktır. Hadoop datanode loglarına baktığımızda asıl sorunu daha net görebiliriz.

Incompatible clusterIDs

Gördüğümüz gibi datanode’lar ile namenode’umuzun clusterID’leri birbirini tutmuyor. Bunun sebebi ise namenode’u sonradan tekrar formatlamanız. Namenode tekrar formatlandığında ClusterId’si değişiyor ancak DataNode’ların değişmiyor. Bu sebeple de DataNode’lar başlatılamıyor.

Çözümü is gayet basit. home/hadoop/dfs/data (sizin bilgisayarınızda home/hadoop kısmı farklı olabilir.) klasörünü silmek ve daemons’ları restart etmek.

Umarım bu paylaşım birkaç kişinin zamanının heba olmasına engel olur. Benim de insanlığa böyle bir faydam olmuş olur 🙂

PHP Long Polling Örneği

Web ve mobil uygulamaların son zamanlardaki olmazsa olmazlarından birisi de bize olayları bildirimler ile iletmesi. Uygulamalar gelen mesajları, beğenileri vs. sayfanın bir yerinde bizim başka bir sayfaya gitmemize gerek kalmadan bize iletiyorlar. Ben de üzerinde çalıştığım bir uygulama+web sayfasında bildirimleri gösterme ihtiyacı hissettim. İlk etapta bunu web socketler ile yapmaya karar verdim. İlk denemem de gayet güzel bir şekilde çalıştı ama bir de mobil uygulama üzerinde denemeye karar verdiğimde hayal kırıklığına uğradım çünkü android WebView’de web socketler desteklenmiyordu. Bu nedenle daha az verimli, daha sorunlu ama yapması gereken işi platform ayırt etmeden yapan eski yöntem long polling ile yapmaya karar verdim. Belki ihtiyacı olanlar olabilir düşüncesiyle burada bir küçük örneğini paylaşmaya karar verdim, temel mantığı göstermekte faydalı olacaktır.  Öncelikle değişiklik olup olmadığını takip eden php dosyamızı yazalım.

polling.php

<?php
$gonderenId=$_POST["gonderenId"];
$pollMu=$_POST["poll"];
if (file_exists($gonderenId.'.txt') == false)
{
    file_put_contents($gonderenId.'.txt', time());
}

if (isset($pollMu))
{
    set_time_limit(150); // Zaman limitini beliliyoruz

    date_default_timezone_set('Europe/Istanbul');
    $time = time();
    $poll = true;
    while ($poll)
    {
        clearstatcache();
        $mtime = filemtime($gonderenId.'.txt');
        if ($mtime > $time) // Eğer dosyanın eklenme/güncellenme zamanı alınan zamandan büyük mü 
        {
            $poll = false;
            //burada veritabanından ilgili değerler çekilecek.
        }
        sleep(1); // Kaynakları tüketmemek için bir süre bekliyoruz
    }

    $arr = array ('mesaj'=>1,'begeni'=>2,'hediye'=>3); // Bunlar veritabanından alınan sonuçlar olacak
    echo json_encode($arr);
    exit;
}
?>

Bu dosyada öncelikle değişiklikleri takip edilecek kullanıcının idsini alıp, eğer bu idli bir dosya yoksa bir text dosyası oluşturuyoruz.  Daha sonra bir while loop’u içerisinde oluşturulan dosyanın tarihi, while’dan önce alınan tarihten büyük mü diye bakıyoruz. Eğer büyükse dosya güncellenmiştir, dosya güncellemesini ilgili kişiye yapılan işlemlerden önce yapıyoruz. Bir sonraki ekleyeceğimiz dosyada yapılan iş. Eğer bu koşulu sağlıyorsa, while döngüsünden çıkmak için değişkenimize false atıyoruz ve sonrasında veritabanından ilgili sorguları çekiyoruz. Ve bunlarsı json olarak dönüyoruz.

islem.php

<?php

$aliciId=$_POST["aliciId"];
$time = time();
file_put_contents($aliciId.'.txt', $time); // İlgili kullanıcının dosyasına o anı yazıyoruz ki server.php değişikliği yakalayabilsin.
//Burada veritabanında yapacağımız asıl işleri yapıyoruz.

?>

Kodumuzun bu kısmı ise kişileri mesaj attığımızda, beğeni gönderdiğimizde vs çalışacak olan veritabanı kodlarının bulunduğu kısım. Burada veritabanı işlemlerinden hemen önce alıcının idsi ile bulunan dosyaya tarih bilgisini atıyoruz ki dosyanın tarihi güncellensin ve az önce yazdığımız while döngüsündeki koşulu sağlasın.

Son olarak da client sayfamızı yazalım.

client.html

<html>
	<head>
		<title>
			Deneme
		</title>
		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1254">
	<script src="jquery-2.0.3.min.js"></script>
	<script>
		$(document).ready(function() {

			startPolling();

		$("#gonder").click(function(){
			$.ajax({
				type: "POST",
				url: 'islem.php',
				data: {
					aliciId: '123456789' // Diğer kullanıcının bilgisi
				},
				success: function(data) {
					alert("gönderildi.");
				}
			});				
		});	

		});

		function startPolling()
		{
			$.ajax({
				type: "POST",
				url: 'polling.php',
				data: {
					poll: 'evet',
					gonderenId: '123456789' // Login olan kullanıcının bilgisi
				},
				success: function(data) {
					displayNotifications(data);
					startPolling();
				}
			});		
		}

		function displayNotifications(data)
		{
			var obj;
			try {
				obj = jQuery.parseJSON(data);
				if(obj.mesaj > 0)
					$("#mesaj").html("Mesaj="+obj.mesaj);
				if(obj.hediye > 0)
					$("#hediye").html("Hediye="+obj.hediye);
				if(obj.begeni > 0)
					$("#begeni").html("Begeni="+obj.begeni);
			} 
			catch(err)
			{
				return true;
			}

		}
	</script>
	</head>
	<body>
	<div id="mesaj"></div>
	<div id="hediye"></div>
	<div id="begeni"></div>
	<br />
	<input type ="button" id="gonder" value="Etkileşim Gönder" />
	</body>
</html>

Burada öncelikle sayfamız ilk yüklediğinde ajax ile startPolling fonksiyonumuzu çağırıyoruz. gonderenId değişkeni login olan kullanıcıyı, aliciId de mesaj attığımız vs. kullanıcıyı gösterecek. Burada aynı olma sebebi test edebilme amaçlı. Eğer long polling başarı ile tamamlanırsa, yani bir bildirim gelmişse bildirim divlerimizi güncelliyoruz. Sonrasında tekrar startPolling fonksiyonumuzu çağırıyoruz ki dinlemeye devam edebilelim. İşte hepsi bu kadar. İlgili dosyaları lokalinizde oluşturup, kendiniz de deneyebilirsiniz. Jquery dosyasını da aynı dizine koymayı unutmayın.

Bugünlük bu kadar, Çevik Kalın 🙂

Intel XDK ve intelxdk.org

Son zamanlarda mobile biraz daha fazla ağırlık vermeye başladım. Native uygulamalara tam geçiş yapmadan önce HTML5 ile uğraşıyorum. Intel XDK ile de bu sırada tanıştım, çok yeni çok taze bir kit. İlk kullanımlarımdan sonra oldukça beğendim. Ben de bu platform ile ilgili Türkçe kaynak olması adına www.intelxdk.org adresi üzerinde paylaşımlar yapmaya karar verdim.  Intel XDK gibi bu site de çok taze zamanla video ve makaleler ile zenginleştireceğim tabii ki. İlk olarak Intel XDK New nedir ile başlamak isterseniz buradan okuyabilirsiniz.

Action, Func ve Predicate Delegeleri

Delegeler metodları işaret eden ve işaret ettikleri metodlarla aynı imzaya sahip olan yani aynı tipte parametrelere ve dönüş değerlerine sahip olan yapılardır.  Delegeleri event tabanlı programlamada, asenkron programlamada, thread programlamada vb bir çok yerde kullanırız. Makalenin asıl amacı genel olarak delege yapısı olmadığı için detaylarına girmeyeceğim.

Pekala yazımızın konusu olan Action, Func ve Predicate neyi temsil eder? Başlıktan da anlaşılacağı üzere bunlar da .Net framework içerisinde bulunan, bizler için önceden hazırlanmış olan delegelerdir. Çok fazla kelimelerle uğraşmadan kod üzerinde görelim.

Action delegesinin imzasına baktığınızda aşağıdaki gibi bir kod göreceksiniz.

public delegate void Action<in T>(T obj);

Burada Action delegemizin T tipinde yani herhangi bir tipte parametre alan sonrasında da void dönüş yapan metodları işaret edebildiğini görüyoruz.

Örneğin normal delegeler ile aşağıdaki şekilde yazdığımız bir kodu

        delegate void NormalDelege(long sayi);

        private void button1_Click(object sender, EventArgs e)
        {
            NormalDelege karesiniAlDelegem;
            karesiniAlDelegem = karesiniAl;
            karesiniAlDelegem(3);
        }

        private void karesiniAl(long sayi)
        {
            MessageBox.Show(Math.Pow(sayi,2).ToString());
        }

Action delegesi ile aşağıdaki gibi yazabiliriz.

        private void button1_Click(object sender, EventArgs e)
        {
            Action<long> actionIleKaresiniAl;
            actionIleKaresiniAl = karesiniAl;
            actionIleKaresiniAl(3);
        }

        private void karesiniAl(long sayi)
        {
            MessageBox.Show(Math.Pow(sayi,2).ToString());
        }

Action delegesi olduğunun farkına varmasak da kodlarımız içinde lambda ile birlikte bu delegeyi oldukça fazla kullanmaktayız. Örneğin aşağıdaki kodda (kodun anlamsız olduğunun farkındayım amaç net şekilde gösterebilmek 🙂 )

sayilar.ForEach(x => MessageBox.Show(Math.Pow(x, 2).ToString()));

ForEach methodunun tanımına gittiğimizde Action tipinde bir parametre aldığını görebiliriz.

public void ForEach(Action<T> action);

Yani aslında biz ForEach içerisine long tipinde bir değer alan ve içerisinde bu değerin karesini alıp MessageBox ile gösteren bir fonksyion yazdık.

Func delegesi Action’a benzer bir yapıdadır ama Actiondan farklı olarak bir dönüş değeri vardır. Func delegesinin tanımlarına baktığımızda iki farklı kullanım görebiliriz. Hiç parametre almadan bir değer dönebilir.

public delegate TResult Func<out TResult>()

Ya da bir parametre alıp bir değer dönebilir.

public delegate TResult Func<in T, out TResult>(
	T arg
)

Aşağıdaki kod örneğinde butonun click eventinde öncelikle Func delegesi parametre almayıp string dönen bir metodu işaret ederken, sonrasında delegemiz string bir değişken alıp, string bir değişken dönen bir metodu işaret etmektedir.

        private void button1_Click(object sender, EventArgs e)
        {
            Func<string> stringDonenFunc;
            stringDonenFunc = merhabaDe;
            MessageBox.Show(stringDonenFunc());

            Func<long, string> longAlipStringDonenFunc;
            longAlipStringDonenFunc = karesiniAl;
            MessageBox.Show(longAlipStringDonenFunc(3));
        }

        private string merhabaDe()
        {
            return "Merhaba";
        }

        private string karesiniAl(long sayi)
        {
            return Math.Pow(sayi, 2).ToString();
        }

Func delegesini de farkında olmasak da linq sorgularımızda kullanmaktayız.  Listeler üzerinde çalıştırdığımız Select , Where vb komutlarında tanımlarına baktığımızda Func tipinde parametre aldıklarını görürüz.

Predicate delegesi ise tam olarak Func<T, bool> parametresinin yaptığı işi yapar. Yani herhangi bir tipteki değişkeni alır ve geriye boolean bir değer döner.  Kullanımı da benzer şekildedir.

        private void button1_Click(object sender, EventArgs e)
        {
            Predicate<long> predicateDelegesi;
            predicateDelegesi = ikiHaneliMi;
            if(predicateDelegesi(55))
                MessageBox.Show("Evet");
            else
                MessageBox.Show("Hayır");
        }
        private bool ikiHaneliMi(long sayi)
        {
            return sayi < 100 && sayi > 9;
        }

Kısa bir şekilde Action, Func ve Predicate delegelerini ve kullanımlarını anlatmaya çalıştım. Eğer herhangi bir sorunuz, eleştiriniz, öneriniz varsa yorum yazarsanız sevinirim.

Çevik Kalın 🙂

 

Neden İnternetimiz Çöp Ve Bir İşe Yaramaz

Evet, sabah sabah beni sinirlendiren bir olaydan sonra kısa bir liste yapma ihtiyacı hissettim. Ekleriniz varsa yorum kısmında belirtebilirsiniz, yazıyı güncellerim. Aşağıdaki vb. sebeplerden dolayı internetteki Türkçe içerik hiçbir zaman bir işe yaramayacak ve çoğu zaman işi internet ile ilgili olanlara da bir kazanç sağlamayacak.

  • Sitelere girip oradaki bilgiden faydalanırız ama altına bir yorum eklemeye üşeniriz.
  • Aynı şekilde bize faydalı olan bir sitede gözümüze sokmadan kenarda duran reklam ilgimizi çekse bile site para kazanmasın diye google’da aratıp oradan gideriz.
  • Yorum yazdığımız nadir sitelerden olan Youtube’u birbirimize küfür etmek için kullanırız. Videoların altında Türkçe yazdığımız tek şey küfürdür.
  • Mobil uygulama yorumlarına sırf yorumumuz gözüksün diye düşük puan verip, diğer insanların sağlıklı bir değerlendirme yapmasını engelleriz.
  • Forumlara girip soru sorarız, altındaki cevaplara rağmen sorun çözülmezse ve başka çözüm bulursak o çözümü yazmayız, sorun çözüldü der geçeriz ki başkalarına sorun çıkaralım.
  • Bizim için Twitter’ın tek amacı Beliebers, Directioners ve taraftarlar arasındaki mücadelenin kazananını belirlemektir.
  • Sağdan soldan içerik çalıp, daha sonra içeriğe Emeğe Saygı Yazısını ekleriz.

 

socket_create() hatası (PHP Socket)

Php ile bir uygulama geliştiriyorsunuz ve socketleri kullanmaya karar verdiniz. Bütün her şey hazır Command prompttan server uygulamanızı çalıştırıyorsunuz… derken çalıştıramıyorsunuz. Karşınızda bir hata

Fatal error: Call to undefined function socket_create()

Nasıl yani diyorsunuz. Halbuki php.ini dosyasında php_sockets’i enable etmiştiniz. Emin olamıyorsunuz tekrar kontrol ediyorsunuz ama evet işte orada enabled durumda. Durun, sizde herhangi bir sıkıntı yok. Sıkıntının tek sebebi  Command Prompt’un Apache server’dan farklı bir php.ini dosyasına bakması. Apache server Apache/bin/ altındaki php.ini dosyasına bakarken, Command Prompt php\ altındaki php.ini dosyasına bakar. Bu dosya içinde php_sockets extension’ına izin verirseniz hatasız bir şekilde istediğiniz işlemi yapabileceksiniz.

NUnit System.ArgumentException (w/ Entity Framework)

 

Entity Framework ile veritabanı işlemlerinizi yaptığınız projelerinizi NUnit ile test etmeye kalktığınızda aşağıdaki gibi bir hata alacaksınız.

System.ArgumentException: The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid.

Bu hatadan kurtulmak için bağlantı bilgilerinizin yer aldığı App.config dosyasını NUnit projeniz ile aynı yere kopyalayıp ismini NUnitProjenizinIsmi.config şekilde değiştirmeniz yeterli.

 

Android: Bilgisayardan Emülatöre Kopyala Yapıştır

Android için uygulama geliştirirken bazı durumlarda bilgisayarınızdaki bir metni emülatördeki bir alana kopyalamak isteyebilirsiniz. Bu durumda aşağıdaki gibi çözüm işinizi görecektir. Bu çözüm ile bilgisayarınızdan emülatöre sms göndererek bilgisayarınızdaki metni emülatöre aktarabilirsiniz.

Öncelikle command promptta aşağıdaki komutu giriyorsunuz.

telnet localhost 5554

Burada 5554 emülatörün çalıştığı portu gösteriyor. Sizde farklı bir sayı olabilir.

Sonrasında da

sms send +22222 gönderilecek mesaj

komutu ile sms gönderebilirsiniz. Bu komutu çalıştırmanız sonrasında emülatörünüze bir mesaj geldiğini görebilirsiniz. 22222 yazan yere istediğiniz herhangi bir rakamı yazabilirsiniz.