Mert Sarac

Developer, Entrepreneur, Geek

Internet of Things Nedir?


İlk kez 1999 yılında MIT Auto-ID Labs'de Kevin Ashton tarafından ortaya atılan Internet of Things (kısaca IoT) yıllardır insanlar tarafından kullanılan Internet'in fiziksel cihazlara, nesnelere erişen halidir. Türkçeye "Nesnelerin Interneti" şeklinde çevirebileceğimiz IoT tavanınızdaki ampulden mutfağınızdaki buzdolabına kadar her nesnenin Internet'e erişebildiği ve her nesnenin kendine özgü API'lar üzerinden çeşitli hizmetlerini dışarıdan erişilebilir hale getirdiği, böylece nesnelerin birbirlerini kontrol edebildiği bir dünya hayal ediyor.

Hali hazırda Facebook, Twitter, Instagram gibi siteler harici kaynaklara API ile veri erişimi sağlamakta. "Facebook ile Bağlan" bu erişimin en güzel örneklerinden biri. Peki bu API'ları tek bir platformda bir araya getirip birbirlerini kontrol edecek hale getirebilir miyiz? Evet, yapabiliriz. IFTTT şu an API sunan her şey için bu hizmeti sunmaya çabalıyor. Daha iyi bir örnek vermek gerekirse, "telefonumda bir fotoğraf çektiğimde bunu OneDrive'da X klasörüne at" şeklinde komutlar tanımlayabiliyorsunuz. Evinizdeki termometre API sağlıyor olsaydı "odadaki sıcaklık 25°C'yi geçtiğinde bana SMS gönder" gibi komutlar da tanımlayabiliyor olacaktınız. Basitçe açıklayacak olursak IoT, termometrenize bu altyapıyı getirmeyi amaçlıyor.

IoT ile hayatımızda neler değişecek?
Aslında değişim çoktan başladı. Philips Hule Light, Nest gibi teknolojiler "smart home" konseptini hayatınıza yerleştirmek için hazırda bekliyor. Önümüzdeki 10 yıl içerisinde üretilecek elektronik cihazların tamamına yakınının kendiliğinden IoT desteği sunacağını söylemek pek de güç değil. Şu an lojistik, belediyecilik ve ev güvenliği gibi konularda hızla yaygınlaştığı görülen IoT günlük rutinlerimizi baştan aşağıya değiştiriyor olacak. Bu fişte unuttuğunuz ütü için 50 km yolu geri dönmemenizi sağlayacak avantajlar getirebileceği gibi güvenlik unsurları dikkatli kurgulanmazsa salonunuzdaki ampulün hacklenmesine kadar varabilecek bir değişiklik.

Önünde ne gibi engeller var?
En ciddi konulardan birisi hali hazırda 10 milyar civarında cihazın Internet'e bağlı olması ve IPv4'ün hala yok olmaması. Tahminlere göre 2020 yılına gelindiğinde IoT ile 50 milyar cihaz Internet'e erişiyor olacak. Bu denli ciddi bir değişim için IPv6'ya geçişin hızlanması şart. Bunun dışında az önce bahsettiğimiz gibi güvenlik de bir diğer sorun. Cihazların birbirleriyle nasıl iletişime geçeceği konusu halen bir standarta bağlanmadığı için kullanılan protokollerde yapılacak hatalar ciddi riskleri beraberinde getirebilir. Internet of Things'e köstek olan son şey de maliyetler. Ciddi rekabet içeren pek çok sektöre giriş yapacak olan IoT öncelikle kolay değişebilecek yerlerden başlamak zorunda.

Maliyetler nasıl düşer?
"Maker" olarak adlandırdığımız "kendi cihazını kendi yapan insan" diye açıklayabileceğimiz bir kitle var. Son 1 - 1.5 yıldır ben de bu akıma dahil olup pek çok şeyi kendim yaptım. Arduino, Intel Galileo ve Intel Edison gibi cihazlar makerların önünü açmakta ve bu akımı kuvvetlendirmekte. Günümüzde temel elektronik ve temel yazılım bilgisiyle pek çok şeyi yapabilmek mümkün. Ancak ne yazık ki ülkemizde ne temel elektronik bilgisine ne de temel yazılım bilgisine halen kolay kolay rastlayamıyoruz. Aşağıda Obama'nın anlattığı gibi akımları oluşturmakta geç kalıyoruz, kaybeden taraf oluyoruz.


Bugüne kadar neler yaptın?
Geçtiğimiz 1.5 yıl içinde Arduino ve Intel Galileo kullanarak evimdeki pek çok şeyi otomatize ettim. Bir kısmını Arduino kategorisinde sizlerle de paylaştım. Bu kategori biraz havada kaldı ama artık yapacağım projeleri baştan sona paylaşıyor olacağım. Basit bir blink uygulamasıyla başlayarak şu ana kadar aşağıdaki projeleri tamamladım:

  1. Oyuncak Araba Kontrolü: Yıllardır bir köşede bekleyen uzaktan kumandalı oyuncak arabamın tüm devrelerini söktüm. Motor bağlantılarını Arduino'ya aktardım ve Arduino'ya Wi-Fi ile bağlantı imkanı sağladım. Windows Phone'dan Wi-Fi bağlantısıyla oldukça geniş bir menzilde arabaya bağlanabiliyorum. Telefondaki accelerometer'ı kullanarak ileri-geri / sağ-sol kontrollerini yönetebiliyorum.
  2. Dijital Fotoğraf Çerçevesi: Bozulan bilgisayarımdan söktüğüm LCD ekranı Raspberry Pi'ye bağlayıp Dijital Fotoğraf Çerçevesine dönüştürdüm. Tüm projenin bana olan maliyeti 105 ₺ olan bu çerçeve, piyasada 60 ₺ ile 300 ₺ arasında satılan tüm çerçevelerden daha fazla özellik sağlıyor. (1366x768 çözünürlük, 11" ekran, Internet bağlantısı ile Facebook ve Instagram'dan fotoğraf gösterebilme, Azure'da host ettiğim yönetim paneli ile fotoğrafları bilgisayardan seçebilme, USB ve MicroSD'den fotoğraf ve video oynatabilme ve YouTube videolarını oynatabilme gibi özellikler sağlıyor.)
  3. Beni Algılayan Oda Parfümü: Evde uzun yıllardır kullandığım Air Wick oda parfümüne yaptığım 8 ₺'lik bir sensör ilavesi ile artık ben odada yokken parfüm sıkılmıyor.
  4. Otomatik Perde Kontrolü: Odamda kullandığım stor perdeye eklediğim küçük bir elektrik motoru, Arduino ve ışık sensörüyle dışarıdan gelen ışık seviyesi arttığında perdenin kapanmasını, azaldığında açılmasını sağlayabiliyorum. Aynı zamanda ışıktan bağımsız şekilde telefonumdan da kontrol edebiliyorum. Bu projenin bana olan toplam maliyeti 70 ₺.
  5. Uzaktan Işık Kontrolü: Evimin salonunda uyguladığım bu sistemde Intel Galileo ve röle adı verilen, dijital olarak kontrol edilebilir anahtar mantığında çalışan bir devre kartı kullandım. Ethernet ile Internet'e açtığım Galileo üzerinden röle'nin hangi anahtarı açıp kapatacağına Azure üzerinden karar verebiliyorum. Salondaki dört avizenin anahtarını da bu rölelere bağladığım için ışıkları evde olsam da olmasam da dilediğim gibi kontrol edebiliyorum. Aynı Intel Galileo'yu boşta kalan portları sayesinde aşağıdaki projemde de kullandığım için maliyetini ikiye bölersek toplamda 100 ₺'ye mal ettim.
Daha sayabileceğim irili ufaklı pek çok proje mevcut fakat en çok işime yarayanlar bunlar. Blogumu takip etmeye devam ederseniz yakında bu kategori altında bu tür projeleri nasıl yaptığımı, yaparken ne gibi zorluklarla karşılaştığımı sizlere aktarmaya çalışacağım.

Google Chrome Uzantısı Nasıl Yapılır?

Google Chrome'un 2009 yılında duyurduğu, 2009 sonunda da kullanıma sunduğu extensionlar (farklı yerlerde eklenti, uzantı, plugin olarak da geçebilir) tarayıcılara yeni özellikler kazandıran kod parçacıklarıdır.

Google Chrome'da uzantı yazmak için HTML ve JavaScript dillerini bilmek gerekir. İşe başlamadan önce beğendiğiniz uzantıları incelemenizi tavsiye ederim. Tarayıcınıza yüklediğiniz tüm uzantıların kodlarına açık şekilde erişmeniz mümkün. Bunun için yüklediğiniz uzantının id'sini bilmeniz gerek. Bir uzantının id'sine adres satırına chrome://extensions/ yazıp uzantının adının altında yer alan "kimlik" bölümünden ulaşabilirsiniz. 
Elde ettiğiniz bu id'yi C:\Users\kullaniciadi\AppData\Local\Google\Chrome\User Data\Default\Extensions\ klasöründe de göreceksiniz. Uzantının tüm kodlarını bu klasör altında bulabilirsiniz.

Uzantı Yazmak İçin Nelere İhtiyaç Var?

Her Google Chrome uzantısının bir manifest dosyasına ihtiyacı vardır. Bu manifest dosyasında uzantının adı, arkaplanda çalışacak scriptler, uzantı ikonlarının adresi, eğer varsa uzantı popup'ının adresi, erişim izinleri, uzantının dili, açıklaması, minimum gerek duyulan Chrome versiyonu, ayar sayfasının adresi ve uzantı versiyonu gibi bilgiler depolanır. Manifest dosyası hakkında daha fazla bilgiye Manifest File Format sayfasından erişebilirsiniz.

Manifest'i bildikten sonra bir sonraki aşama gereksinimleri bilmekten geçiyor. Yapmak istediğiniz uzantının arkaplan işlevlerinin olması gerekip gerekmediğine, ayar sayfasında neler olacağından tutun da popup'ta neler olacağına kadar her birini kafanızda canlandırdıktan sonra bunları HTML ve JavaScript ile oluşturabilirsiniz. Burada Chrome'un pek çok işlevi için JavaScript API'lar mevcut.

Örneğin bir ayar kaydetmek ve daha sonrasında o ayarı geri getirmek için aşağıdaki gibi bir kod kullanabilirsiniz.

localStorage["ShowWelcomeMessage"] = true;

if(localStorage["ShowWelcomeMessage"]
{
alert("Welcome " + localStorage["DisplayName"]);
}

Bu gibi API erişimlerine örnekleriyle birlikte Sample Extensions sayfasından erişebilirsiniz.

WordPress'ten BlogEngine.NET'e Geçiş

Yine blogda yenilikler yapayım derken başıma iş açtım. 2012 yılında blogu açtığımda WordPress ile başlamış, performans sorunları yüzünden 2013 yılında MVC ile kendi yazdığım farklı bir altyapıya taşımış, bakımına vakit ayıramayınca da 2014 yılında tekrar WordPress'e dönmüştüm. Geleneksel blog taşıma zamanım gelmiş olacak ki yine performans ve güvenlik sorunları yüzünden bugün WordPress'i bırakıp BlogEngine.NET'e geçtim.

BlogEngine.NET tamamı açık kaynak, http://dotnetblogengine.net/ adresinden dağıtılan, ASP.NET 4.0 yapısı üzerine kurulu hazır bir blog altyapısı. Birden fazla blogu tek bir panelde yönetebiliyor olması, aynı anda birden fazla dile destek verebiliyor olması ve tabii ki ASP.NET üzerine kurulu olması tercih etmemdeki ana sebep oldu.

BlogEngine.NET'in kodlarını incelediğinizde ASP.NET ile haşır neşir olanların kolaylıkla anlayıp üzerinde düzenlemeler yapabileceği bir yapı ile karşılaşacaksınız. Ufak tefek eksiklikleri olsa dahi bana göre WordPress'ten çok daha akıcı ve kolay. Ben bu taşıma işlemi sonrasında SQL Server'da duran veritabanımı kullanmak yerine yazılarımı XML olarak saklamayı tercih ettim. Yarın bir gün BlogEngine'den vazgeçersem başıma iş açıp açmayacağını o zaman göreceğiz :)

WordPress'ten BlogEngine.NET'e Geçiş
Önceden Radore'de barındırdığım kiralık sunucumda duran Wordpress'i taşırken BlogEngine'i Azure üzerinde host etmeyi tercih ettim. Bu sayede kurulum birkaç tıklamayla kendiliğinden halloldu. Azure'u BizSpark subscription kredilerimle kullandığım için sınırları zorlamamak adına trafik yükünü azaltması için de daha önceki yazılarımda bahsettiğim CloudFlare'i kullanarak CDN ve cache sağladım. Bu hem hız artışı sağladı hem de Azure kredilerimin çoğu bana kaldı :)

Kullanıcımı ve ayarlarımı elle taşıdıktan sonra tema üzerindeki değişikliklerimi gerçekleştirdim. Türkçe resource dosyasında eksik kalan bazı keyleri tamamlayıp tamamen Türkçe olmasını sağladım. Fazla kategorim olmadığından bunları da daha güvenli olduğunu düşünerek elle taşımayı seçtim. Yazıları taşımak için de WordPress'in export aracını denedim, fakat işe yaramadı. 

Biraz araştırmadan sonra WordPress'in export bölümünü değiştiren bir yamayla karşılaştım. Buradan indirebileceğiniz export.php dosyasını wp-admin klasörünüze attıktan sonra export işlemini yaptığınızda çıkan dosyayı BlogEngine.NET panelinden direkt import edebiliyorsunuz. Ben kategorileri elle taşımayı seçtiğim için tam bir eşleşme sağlanmadı, bunu sonrasında elle düzeltmek zorunda kaldım fakat kendi eklediğim kategorilerin guidlerini değiştirmek fazla vakit almadı. 

WordPress'te en büyük baş belam olan spam yorumlardan artık kurtulmak istedim. BlogEngine'de ne denli spam gelirdi bilemiyorum ama bunu göze almayı dahi istemedim. Eski sitemdeki tüm WordPress yorumlarını bu amaçla feda ettim. Bunun yerine Facebook Comments widget kullanmak istedim. Bunun için themes\Standard klasörü altındaki CommentView.ascx dosyasını kendime göre modifiye ettim. CommentView.ascx dosyasının modifiye halini buradan indirebilirsiniz. WordPress yorumlarını gözden çıkarsam da en azından önceki blogdaki Facebook yorumlarının kalması için buraya bir koşul ekleyip 3 Nisan 2015'ten önce girilen yorumlar için blog.mertsarac.com adresinin korunmasını sağladım. Zaten bu yazı ve bundan önceki yazıların kaynak kodlarını kıyaslarsanız aradaki farkı görebilirsiniz.

301 Redirection
Taşıma işleminin en yorucu kısmı burası oldu diyebilirim. 301 Redirection'ı kısaca açıklamak gerekirse, WordPress ve BlogEngine farklı url yapılandırmaları kullandığı için aynı slug kullanılsa dahi url değişmiş olacağından eski yazılarınız HTTP 404 - Not Found uyarısı vermeye başlıyor. Bu da Google arama sonuçlarındaki sıranızı alt üst ediyor. Bu sayfaların 404 vermek yerine 301 HTTP koduyla içeriğin yeni adresine redirect yapıyor olması GoogleBot ve diğer arama motoru botlarının sayfanın farklı bir adrese taşındığı bilgisine erişmesini sağlıyor. Bu da arama sonuçlarınızın korunmasını sağlıyor.

Ben bu işlemi yapabilmek için IIS'in URL Rewriter altyapısını kullanmayı seçtim. Önceden http://blog.mertsarac.com/tr-tr/arduino-ile-c-sharp-haberlesmesi/ formatında olan urllerimi http://www.mertsarac.com/blog/arduino-ile-c-sharp-haberlesmesi formatına çevirmek için yeni bir ASP.NET projesi oluşturup Web.config dosyasındaki system.webServer parametresinin altına aşağıdaki rewrite rule'ları yazdım.

<rewrite>
      <rules>
        <rule name="PostRewrite" stopProcessing="true">
          <match url="^([^/]+)/([^/]+)/?$" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/Default.aspx?lang={R:1}&amp;aspxerrorpath={R:2}" />
        </rule>
        <rule name="ArchiveRewrite" stopProcessing="true">
          <match url="^([^/]+)/([^/]+)/([^/]+)/?$" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/Default.aspx?lang={R:1}&amp;year={R:2}&amp;month={R:3}" />
        </rule>
        <rule name="PageRewrite" stopProcessing="true">
          <match url="^([^/]+)/([^/]+)/([^/]+)/?$" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="/Default.aspx?lang={R:1}&amp;param={R:2}&amp;page={R:3}" />
        </rule>
      </rules>
    </rewrite>

Burada gördüğünüz gibi 3 farklı rule var ve bu rule'lar Default.aspx dosyasına geliyor. Ben de Default.aspx dosyasında gelen url'e göre sınıflara ayırıp 301 ya da 404 koduyla redirection işlemini sağlıyorum. Bu kodu da aşağıda görebilirsiniz.

string newLocation = String.Empty;
                int StatusCode = 0;

                string aspxerrorpath = Request.QueryString["aspxerrorpath"];
                string year = Request.QueryString["year"];
                string month = Request.QueryString["month"];
                string page = Request.QueryString["page"];

                if (String.IsNullOrEmpty(aspxerrorpath))
                {
                    newLocation = "http://www.mertsarac.com/blog/";
                    StatusCode = 404;
                }
                else if (!String.IsNullOrEmpty(year) && !String.IsNullOrEmpty(month))
                {
                    newLocation = String.Format("http://www.mertsarac.com/blog/{0}/{1}/default", year, month);
                    StatusCode = 301;
                }
                else if (!String.IsNullOrEmpty(page))
                {
                    newLocation = String.Format("http://www.mertsarac.com/blog/?page={0}", page);
                    StatusCode = 301;
                }
                else
                {
                    if (aspxerrorpath == "/Default.aspx")
                    {
                        newLocation = String.Format("http://www.mertsarac.com/blog/");
                        StatusCode = 404;
                    }
                    else
                    {
                        newLocation = String.Format("http://www.mertsarac.com/blog/post/{0}", aspxerrorpath);
                        StatusCode = 301;
                    }
                }

                Response.Redirect(newLocation, false);
                Response.StatusCode = StatusCode;
                Response.End();

Tüm bunları yaptıktan sonra yapmanız gereken bir diğer şey de robots.txt dosyasındaki alan adını sitenize göre değiştirerek sitemap dosyasının adresini vermek. Aynı zamanda bu sitemap dosyasını Google Webmasters'a da belirtirseniz taşıma işlemini çok daha sorunsuz atlatabilirsiniz.

Benim için bu geçişin tamamını sağlamanın 3 saat kadar sürdüğünü belirtmekte fayda var.

BlogEngine konusunda henüz çok fazla yorum yapabilecek durumda değilim. Ancak birkaç ay içinde pek çok artı ve eksisini gördükten sonra bunu da farklı bir yazıda anlatmayı planlıyorum.

Faydalı olması dileğiyle.