Linux Üzerinde Android USB Debugging

Yorum Yapılmamış

28/01/2012 at 16:59Kategori:Android

Android SDK ile geliştirme yaparken çoğu zaman bir android virtual machine kullanmak yerine performansı ve gerçek bir test ortamını yakalamak için cihaz üzerinde debugging yaparız. Bunun için windows kullanırken cihaz üreticisinin yazılımlarını kurmak gerekli driver ihtiyacını karşılar. Linux ile zaten çoğu cihaz sürücüsü güncel linux çekirdeğinde varolduğu için küçük bir işlem sonrası debugging işlemi yapmak daha kolaydır.

İlk olarak

sudo nano /etc/udev/rules.d/51-android.rules

komutu ile 51-android-rules dosyasını oluşturuyoruz. İçeriğine cihazımızın üretici koduna uygun olarak istediğimiz cihaz kodlarını alt alta ekliyoruz. idVendor degerlerini http://developer.android.com/guide/developing/device.html#VendorIds adresinden bulabilirsiniz. İstediğiniz kadar vendor id için bu degerleri değiştirerek ekleyebileceğiniz gibi ben sadece samsung için ikinci satırı ekledim.

SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev"

SUBSYSTEM=="usb", ATTR{idVendor}=="04E8", MODE="0666", GROUP="plugdev"

Dosyaya bu degerleri yapıştırdıktan sonra Ctrl X , Y ,Enter tuşlarına basarak dosyaya kaydedip çıkış yapıyoruz. (nano editöründe ip ucu olması açısından verilmiştir.)

Daha sonra

sudo udevadm control --reload-rules

komutu ile yaptığımız değişikliklerin geçerli olmasını sağlıyoruz. İşlemler bu kadar. Artık eclipse üzerinden usb debugging için cihazınızı kullanabilirsiniz.

Terminalde adb komutu ile işlem yapabilmek için

Android geliştirme yaparken karşılaşılabilecek diğer bir konu da path ayarları. adb executable fileının konsolun path degiskeninde tanımlı olması gerekiyor ki adb komutu ile cihazımız üzerinde işlemler yapabilelim. Bunun için .profile dosyasına PATH degeri ile ilgili eklemeler yapmamız gerekiyor. Eğer adb komutunun tüm kullanıcılar için erişilebilir olmasını istiyorsak /etc/profile dosyasına, sadece kendi kullanıcımızın konsolundan erişim istiyorsak /home/[user-name]/.profile dosyasına

PATH=$PATH:/home/onur/Development/android-sdks/platform-tools
export PATH

şeklinde yukarıdaki dizinleri kendi android-sdk kurulumunuzdaki platform-tools klasörünü gösterecek şekilde düzenleyerek eklememiz yeterli olacaktır.

Merhaba 2012

Yorum Yapılmamış

08/01/2012 at 22:28Kategori:Blog

Yeni yıl için yazı yazmak gibi bir geleneğim yoktur ama blogumda 2012 ye ait hiç yazı göremeyince hiç değilse bitane bulunsun diyerekten bu yazıyı yazmaya başladım. Çoğu zaman yazacak bir sürü konu aklıma gelse de bazen kim okuyacak diyerek bazen de üşenerek buraya yazmaktan vazgeçtim. Aklıma gelen son konu başlıklarını kısaca sıralayacak olursam, "Intel VT-x sanallaştırma", "Neden *nix sistemler daha iyidir" ve "Açık kaynağın gücü" şeklindeydi. Bu yazıyı yazdıktan sonra kendimde tekrar bir blog yazısı yazma isteği duyarsam bu konulardan birisinde yazmayı düşünüyorum.

Bu kısa yazımın sonunda başlığa uygun iyi dileklerimi ileterek yeni yılda başarı mutluluk ve güzelliklerle dolu bir sene geçirmenizi dilerim.

 

Yonip Kernel 3g Freeze Issue and My Solution

Yorum Yapılmamış

08/10/2011 at 23:18Kategori:Android

I am using latest Yonip  2.32 kernel (#53) with CynogenMod 8.4 (Froyo 2.2) and I have a problem on 3g usage. When I use more  continious 3g data, my phone randomly freezes and then reboots. I wrote discussion thread about this issue but I cant find any help. About solution, I believed that, by 3g configuration, this problem can be fixed.  I used 3g/edge speed improvement  script and I have configured some parameters to limit hspda speed. By default my phone have 3.6 mbps hspda speed and if I change this limit to 1.8 mbps it prevents freezing. By the way I prepared a update script and can be apply by manually editing /system/build.prop file. After editing this file, don't forget to back up build.prop file as build.prop.bak. You can find the parameters and update script file below.

o.ril.hsxpa=1
ro.ril.gprsclass=10
ro.ril.hep=1
ro.ril.hsdpa.category=4
ro.ril.enable.a53=1
ro.ril.hsupa.category=5
ro.ril.enable.dtm=1

3g_freeze_fix.zip

Android Dalvik Cache Alanını Başka Bölüme Taşımak

2 Yorum

29/08/2011 at 14:48Kategori:Android

Android yüklü cihazları root edip sonrasında kurcalamak ve yeni özellikleri, iyileştirmeleri uygulayıp takip etmek bazen çok eğlenceli olabiliyor. Kullandığım cihazların dahili hafızalarının ne kadar olduğu, sistemin nasıl çalıştığı ya da daha iyi nasıl çalışabileceği hep kurcaladığım ve uğraşmaktan zevk aldığım konulardan olmuştur. Yabancı ülkelerde de bu şekilde uğraşan ve daha profesyonel olarak kernel development ya da rom oluşturma gibi işleri yapanlar var. CynogenMod bunlardan birisi ve aralarında en profesyonel ve kaliteli olanlardan sayılabilir. Cynogen romlar ile cihazınızı 2.1/2.2 ve 2.3 android romlara yükseltebiliyorsunuz ve çoğu zaman orjinal romlardan daha çok kaliteli ve stabil bir cihaza sahip oluyorsunuz. Cynogenmod açık kaynak olarak ilerlediği için cynogenmod sitesinde desteklenmeyen telefonlar için  de çalışmalar yapılıyor ve telefon modeline özel romlar ve yeni kollar çıkıyor. Bu kadar cynogenmod tanıtımı yaptıktan sonra asıl yazının başlığında bahsedilen konuya geçebilirim.

Android işletim sistemi çalışırken birden çok disk bölmesi ( partition) ile çalışıyor. Bunlar
/system  : sistem uygulamalarının, araçlarının ve diğer configurasyon dosyalarının bulunduğu alan.
/data  : Sonradan kurulan uygulamaların ve uygulamalara ait verilerin ayrıca sistem başlangıcında üretilen dalvik-cache dosyalarının bulunduğu alan
/cache : Bazı uygulamalar tarafından geçici olarak kullanılan alan (android market vs. )

Bu 3 ana bölümden başka sistemde birkaç bölme daha bulunuyor fakat bu kısımlarda recovery dosyaları ve boot işlemi için gerekli dosyalar bulunuyor. Android sistemlerde çalışma anında sd-kart ve depolama aygıtları menusunden dahili hafıza olarak görüntülenen yer sadece /data kısmı oluyor. Örnek olarak benim cihazımda dahili 512 mb bellek bulunmasına rağmen data kısmı için ayrılan bellek sadece 145 Mb. Dalvik cache için yaklaşık 60 mb alanın da data kısmında kullanıldığını düşünürsek kullanım için sadece 90 mb gibi bir alan kalıyor. Bu sorunu aşmak için dalvik cache kısmını /cache dizinine taşıyıp sonrasında sembolik link etmek /data kısmında daha çok kullanılabilir alan sağlıyor. Aşağıda scripti ve recovery ile uygulanabilecek zip dosyasını ekliyorum. Ek olarak cihazınızın dizin yapısı aşağıdakinden farklıysa sistemi inceleyip buna göre tekrar kodları düzenlemeniz gerekebilir. Script Samsung Spica i5700 için uygulanmıştır.

dalvik-cache.zip

#!/system/bin/sh
#
# Move dalvik-cache to /cache
#
# Remove Debugger Mem Dumps

if [ ! -d /cache/dalvik-cache ]
then
	busybox rm -rf /cache/dalvik-cache /data/dalvik-cache
	mkdir /cache/dalvik-cache /data/dalvik-cache
fi

busybox chown 1000:1000 /cache/dalvik-cache
busybox chmod 0771 /cache/dalvik-cache

# bind mount dalvik-cache so we can still boot without the sdcard
busybox mount -o bind /cache/dalvik-cache /data/dalvik-cache
busybox chown 1000:1000 /data/dalvik-cache
busybox chmod 0771 /data/dalvik-cache

# remove debugger memory dumps
busybox rm -rf /data/tombstones/*

 

Oracle Decode Function

Yorum Yapılmamış

07/06/2011 at 12:33Kategori:Java | Oracle

Bir tabloda bir türe ilişkin verilerin integer olarak kodlandığı durum en sık kullanılan tekniklerden birisidir. Aynı şekilde verilerin de genelde yazılıma veriler veritabanından alındıktan sonra anlaşılır hale getirilmesi söz konusu olur. Bunu veritabanında halletmenin yolu oracle veritabanları için decode fonksiyonundan geçiyor. Çıktı olarak üretici kodu yerine şirket adını veren select sorgusu şu şekilde olacaktır:

SELECT supplier_name,
decode(supplier_id, 10000, 'IBM',
10001, 'Microsoft',
10002, 'Hewlett Packard',
'Gateway') result
FROM suppliers;

 

SHA1 Şifreleme ve The .Net Way…

Yorum Yapılmamış

12/02/2011 at 16:58Kategori:.Net

SHA1 algoritmasını kullanarak bazı kullanıcı verilerinin şifrelenmesi ve bunların veritabanında kısmen de olsa dönüştürülemez olarak tutulması konusunda yapılacak işlem kullanıcıdan ilk şifre bilgisinin istendiği anda veritabanına SHA1 şifrelenmiş olarak kaydettirmek ve daha sonra kullanıcı giriş yapmak istediğinde girilen şifrenin SHA1 hash değerini alarak veritabanındaki önceden şifrelenmiş değer ile karşılaştırmaktır. Böylece bir güvenlik açığından dolayı sisteminizde depolanan şifreler hiçbir zaman okunamazlar ve böylece belki de her yerde aynı şifreyi kullanan kullanıcımızın güvenliği tehlikeye atılmamış olur. Bunu yapmanın bir yolu byte olarak veriyi parçalayıp şifrelemektir ya da .net ile gelen Form Authentication sırasında kullanılması için yazılmış tek satırlık kodu çalıştırabilirsiniz.

FormsAuthentication.HashPasswordForStoringInConfigFile("şifrelenecek veri burada...", "sha1");
// Bu metod string döndürür ve değeri istediğimiz gibi kullanabiliriz.

ASP.Net MVC3 Validation İşlemleri

Yorum Yapılmamış

09/02/2011 at 16:43Kategori:.Net | MVC

Web uygulamalarında en çok ihtiyaç duyulan şeylerden birisi Validation İşlemleridir.Form verilerini  kullanıcı tarafında(Client side)  javascript ile kontrol ettirmeniz, en azından boş bırakılmaması gereken alanları (requied fields) giriş almaya zorlamak ya da bazı alanları belirli aralıklar dışında değer girişinden korumak ( range validation) gerekebilir. Bu işlemler form tabanlı klasik geliştirme ortamlarında view kısmında çözülür. Ama MVC yapılarında php ve java frameworkler de dahil genel olarak model kısmında yapılan annotationlar ile bu işi çözmeye çalışırlar. Sebebi ise model kısmındaki tanımlamaların  view kısmında yapılacak tanımlamalara göre daha basit olması ve  verilerin sağlıklı girilmesinden yine Model kısmını geliştirenlerin yani kısaca data tier kısmında çalışanların sorumlu olmasıdır. ASP.Net MVC ile de bu işlemlerin yapılması oldukça kolaydır. Model kısmında tanımlamalarını yaptığımız veritabanı modellerimizde alanların üst kısımlarına yaptığımız annotationlar ile bu işlemleri kolayca gerçekleştirebiliriz.


[Required(ErrorMessage="Bir fiyat girmelisiniz...")]
[Range(0.01, 100.00,ErrorMessage="Fiyat 0.01 ile 100.00 TL arasında olabilir")]
 public decimal Fiyat { get; set; }

Yukarıdaki örnekte olduğu gibi System.ComponentModel.DataAnnotations alanındaki attributelarla bu işlemleri tanımlamak oldukça kolay ve etkili. Bu alanlarda tanımlanabilecek annotationlar ve açıklamaları şöyle:

  • Required: Girilmesi zorunlu alan oluşturur.
  • DisplayName:  Form alanlarında kullanmak üzere text tanımlamaya yarar.
  • StringLength: Alanda girilebilecek en fazla karakter sayısını belirler.
  • Range: Alan için girilebilecek en küçük ve en büyük sayısal değerleri tanımlar.
  • Bind:  Parametrelere ya da form değerlerini modele yüklerken dahil edilecek ya da çıkarılacak alanları belirler.
  • ScaffoldColumn: Editör Formlarından alan saklama işlemini gerçekleştirmeye yarar.
using System.Web.Mvc;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace MvcOrnekUygulama38.Models
{
    [Bind(Exclude = "KullaniciId")]
    public class Arac
    {
        [ScaffoldColumn(false)]
        public int KullaniciId { get; set; }
        [DisplayName("Arac")]
        public int AracId { get; set; }
        [DisplayName("Marka")]
        public int MarkaId { get; set; }
        [Required(ErrorMessage="Bir araç takma adı seçilmeli...")]
        public string TakmaAd { get; set; }
        [Required(ErrorMessage="Fiyat girmelisiniz...")]
        [Range(0.01, 100.00,ErrorMessage="Fiyat 0.01 ile 100.00 arasında olmalı...")]
        public decimal Fiyat { get; set; }
        [DisplayName("Arac Resim Url")]
        [StringLength(1024)]
        public string AracResimUrl { get; set; }
    }
}

Bu şekilde model sınıfını güncellediğimizde view kısmında javascript ile form validation işlemleri yapılmakta ve girişlerin daha sağlıklı olması sağlanmakta.

İlerleyen zamanlarda MVC üzerine daha düzenli yazılar yazmaya çalışacağım.

“Entity Framework Invalid Object Name dbo…” Hatası

Yorum Yapılmamış

08/02/2011 at 16:53Kategori:.Net | MVC

ASP.Net MVC 3 ile çalışırken Entity Framework 4 kullanımı POCO ile oluşturduğumuz ve Entity Model ile veritabanına işaretlediğimiz nesnelerin isimlendirilmesinde tekillik - çoğulluk karmaşası yaşanabilmekte. Örnek olarak çoğul isimlendirdiğiniz DbSetlerinin veritabanı ile konuşması sırasında tekrar EF tarafından çoğula dönüştürülmesi  "Entity Framework Invalid Object Name dbo.tabloadi" şeklinde hata almamıza yol açabiliyor. Böyle bir senaryoda yapmamız gereken Entity Model sınıfı içerisinde OnModelCreating olayını override ederek name convention özelliğini devre dışı bırakmamız gerekiyor.  Entity Model sınıfı içerisine yazdığım

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
kodu ile bu hatayı önledim.
Mutlu günler dilerim...

Bir başarı hikayesi: Android

1 Yorum

07/02/2011 at 00:48Kategori:Android

Android son zamanlarda adını oldukça fazla duyurmayı başaran ve çok popüler  akıllı telefonlar için Google tarafından üretilmiş bir açık kaynak kodlu işletim sistemi. Bu kadar meşhur olmasının birçok sebebi olabilir ama bunlardan en çok göze çarpanlar; kaliteli bir sistem altyapısına sahip olması (linux kerneli kullanıyor), yaygın yazılım geliştirme platformlarından birisi olan java temelleri kullanılarak oluşturulan bir SDK'ya sahip olması, Google gibi büyük bir şirket tarafından desteklenmesi ve reklamının yapılması, telefon üreticileriyle iyi anlaşabilmesi, sistem gereksinimleri bakımından fazla seçici olmaması ve neredeyse her cihaz üzerinde çalışabilmesi, açık kaynak topluluklarıyla iyi anlaşabilmesi ve insanlardan destek alması, ücretsiz olması vs. sayılabilir. Ayrıca en önemlisi de insanların eleştirel değil de heyecanla yaklaşması da Android'in şanslı olduğunun göstergesi olabilir.

Peki şu anda Android hangi konumda diyecek olursak, Android akıllı telefon pazarında en büyük payı alarak Microsoft, Apple, Symbian ve RIM(Blackberry) 'i solladı. Bunu da son bir yıl içerisindeki çok yüksek orandaki satışla yakaladı. Peki ya sonrası? Bundan sonra ne olacağı yine şirketlerin politikalarına göre şekillenecek ama artık Android bir platform ve uzun yıllar piyasada Android olarak kalacaktır. Ama benim bu başarı hikayesinden çıkardığım birkaç önemli not da var. İlk olarak yıllardır piyasada yazılım alanında tekel oluşturuluyor diye bağıran akademisyenler, gönüllüler ya da piyasadaki yazılımcı, mühendis çalışanlar acaba bu olaya ne diyecekler? Bazen gerçekten kaliteli bir ürün çıkmamasından dolayı piyasada tekel oluşumuna yol açmıyor muyuz? Kaliteli ürün derken yıllarca arıza vermeyen ya da yeniden başlatmaya ihtiyaç duymayan yazılım/ işletim sistemi çözümlerinden bahsetmiyorum. Yazılımınız çok sağlam temeller üzerinde kurulu olabilir ama dökümantasyon,kullanım / kurulum kolaylığı, son kullanıcıya yakınlık, fiyat, destek ve diğer parametreler yönünden piyasaya ne kadar uygun? Ya da  Google Chrome benzer bir örnek oluşturacaktır. Kullandığım tarayıcılar içerisindeki bence şu ana kadar en stabil ve sağlıklı çalışan tarayıcı hakkında sırf Google ürünü olduğu için bu kadar yayıldı sözleri benim üzerimde ne kadar etki oluşturabilir dersiniz? Pİyasadaki sorun gerçekten yazılım olarak kaliteli ürünlere ihtiyaç duyulması ve devam eden kalitesizliğin sonucunda hala çürük şeylerin el üstünde tutulmasıdır. Bunu da "bir an önce oturup hiçbir yerde olmayan bir ERP projesi yazalım" modundan çıkıp, "yurt dışında insanlar nasıl proje geliştiriyorlar incelemeliyiz önce" moduna girerek yakalayabiliriz sanırım. Kendini girişimci hissedenlere duyurulur...

MVC Frameworkler Üzerine…

Yorum Yapılmamış

06/02/2011 at 16:58Kategori:.Net | Java | SVN | Test Driven Development

Senelerdir MVC framework ile ilgili çok farklı dillerin MVC uygulamalarını incelemekteyim. Ama hala kullanmayı alışkanlık haline getirebildiğim bir framework ya da platform seçemedim. Web tabanlı uygulamalarda PHPnin form olayından sonra kim ne derse desin  gördüğüm en mantıklı sistem olan ASP.Net Web-Forms ise kendine has bir sistemle işleri yürütüyor. ViewState ve postback gibi mekanizmaları iyi anladığınızda ve yerine göre bu özellikleri iyi yönettiğinizde çoğu uygulamayı hızlı ve sağlam bir şekilde üretebiliyorsunuz. Benim de ilk gördüğüm ve kullanmaya alıştığım sistem Web Forms olduğundan dolayı MVC mantığına alışmam kolay olmadı.

Servlet ve JSP yapılarından sonra ASP.Net Web Formsun karşısına çıkarılmış gibi düşünülen JSF ise yine kullanmaya bir türlü alışamadığım bir teknoloji oldu. Çünkü yapısı yine MVC idi.  Bu arada Java için Play Framework ve PHP CodeIgniter, CakePhp gibi MVC frameworkleri de inceleme ve üzerinden birkaç gün de olsa yoğunlaşıp denemeler yapma fırsatım oldu. Tüm bu deneyimlerimi bir noktada birleştirip kendime bir MVC yol haritası çıkardım diyebilirim.

  1. MVC metodolojisini uygulamak istediğin platformda MVC kullanmadan da yapmak istediklerini yapabilecek bilgi ve beceriye sahip olmalısın. Yani PHP , Asp.Net ya da Java/JSP bilgisi çok gerekli ve yararlı olacaktır.
  2. MVC frameworkleri her zaman her projede kullanamayacağın için yine bu platforma ait diğer klasik yöntemleri de bilmelisin. Neredeyse 1. madde ile aynı anlama geliyor.
  3. MVC frameworkler URL  formatlama, veri erişimi , organizasyon, kod okunabilirliği ve güncellenebilirlik gibi konularda çok fazla kolaylık getirdiği için bir an önce projelerde uygulayacak şekilde öğrenilmeli...

Evet MVC frameworkler hakkında  söyleyeceklerim bunlar. Yine de olayı abartmamalı ve her projede Persistence, DAO, Model, Controller, View kullanmalıyım, Unit Test yapmalı ve SVN, Git gibi araçlarla source control olayına girmeliyim gibi bir derdim yok çünkü her zaman KISS (Keep It Simple and Stupid) prensibinin ne kadar doğru olduğunu projelerde görüyorum.

Bol katmanlı projelerde yer almanızı dilerim...