26 Temmuz 2013 Cuma

Samsung Galaxy S3 "Ağda Kayıtlı Değil" Hatası ve çözümü


Benim annem, güzel anneme(aynı zamanda teknolojiktir de) uzun zamandır almak istediğim akıllı telefonu, sonunda Almanya'da yaşayan teyzemden almak nasip oldu. Uygun fiyatlıydı, sıfır ayarındaydı ve Samsung un çok başarılı modellerinden olan S3'tü. Annemin de onayını alarak bembeyaz bir S3ümüz olmuştu sonunda.. 

Kayıt kuyut işlemleri çok zorlayınca eskiden telefon tamircisi olan ve bu işlerden anlayan, çevresi olan abim telefona IMEI attırdı. Annem telefonu kullanmaya başladı, ama daha ikinci günden telefon donmalara, ekranı simsiyah kesilmelere, bi triplere bi hallere girmeye başladı. Ben de sen misin annemin hemen neşesini kaçıran, gel bakayıım sana bir ROM atalım da aklın başına gelsin diyerek ve kendi telefonumda sürekli olarak yaşadığım başarılı ROM yükleme tecrübelerimin verdiği artistlikle güzel bir ROM indirdim. Recovery modu açtım, güzel güzel yüklediim.. telefon açıldı, çok güzel akıcı çalışıyordu artık çünkü yükleyen "ben"dim.. Övüne övüne anneme teslim ettim ve ertesi gün işe gittiim :) 

Ertesi Gün ... 
Telefonum çalmaya başladı. Ekranda Bizim Ev yazıyor. İlginç.. Sonuçta ev numarasını sadece internet için kullananlardanız. Geri aradım "hayırdır" ses tonuyla ve acı haberi öğrendim. Yıkılmıştım adeta. ROM um yüzümü kara çıkarmıştı,, çekiyor gibi görünüp "Ağda kayıtlı değil" hatası veriyordu. Abime söyledim, bana söyleseydinler, neden kafana göre iş yapıyorsunlar, IMEI silinmiştirler, şimdi yeniden şuraya gidilmesi gerekecekler, geçmiş olsunlar... Abimin bu azarları beni hırslandırmış olacak ki google ın başına oturdum, araştırdım. Çözüme ulaştım. (burdaki tonlamada yine aşırı hava sezilmekte..)

Bulduğum çözüm Arıza Patch diye bir programın telefona kurulup çalıştırılmasından ibaret.. Aşağıdaki linki takip ettim;
http://www.androidciyiz.net/galaxy-s3-4-1-2-guncellemesinden-sonra-sebeke-problemi-cozumu.html

Dikkat edilmesi gereken birkaç nokta;
 *#06# yapınca IMEI nin 00000 veya bataryayı çıkarınca altta yazan IMEI ile aynı olmaması lazım,
 Arıza Patch i çalıştırırken sim kartın telefona takılmış olması lazım. (Ben ilk denediğimde sim kart takılı değildi o yüzden patch uygula butonu gelmemişti. ümitsizliğe düşmüştüm ondan yazma ihtiyacı hissettim)..
 Bu arada ben Android 4.2.1 ROM yüklemiştim, linkte 4.1.2 yazıyor ama bende de çalıştı. 

Yüklediğim ROM da gayet başarılı bir ROM, onun da linkini vermeden geçemeyeceğim..  

http://android-revolution-hd.blogspot.in/p/android-revolution-hd-mirror-site-var.html
Bu linkteki şu ROM;
Jelly Bean (Android 4.2.1)
Download Android Revolution HD 32.0


Diğer en iyi S3 ROM larına da bu adresten erişilebilir;
http://droidviews.com/2013/best-custom-roms-for-samsung-galaxy-s3-gt-i9300-2013-edition/

Abi azarsız, suçlu hissedilmeyen ve havalı günler dilerim  8-)

LINQ - unable to create a constant value of type ‘system.object’. only primitive types



Günlerden yine bir 'iş günü' , aylardan ise Ramazan'dı.. Ve ben yine servislerle, sorgularla gönül eylemekte idim :)... 
LINQPad de sorgumu yazdım,, güzel güzel verilerim geliyordu, servisime aktarabilirim bunu artık diye classıma yapıştırdııım,, o da nesi,, LINQPad de tık demeden çalışan sorgu, "unable to create a constant value of type ‘system.object’. only primitive types" hatası verdii. Zaaten birşey de bir seferde olsun diye ağzımın içinde söylenee söylenee, yarım günümü bu hatayı araştırarak harcadım. Forumlarda "Contains" metodunu "Any" ye çevirerek çözmüşler genelde ancak contains leri tamamen kaldırsam bile aynı hatayı almaya devam ettim.. Evet, sinir olmuştum ve bunun için suçlanamazdım. Açlığın verdiği moralsizliğin de etkisiyle o gün uğraşmayı bıraktım, ertesi gün bir stajer geldi. İyi ki de gelmiş, hatayı hemen araştırıp hemen çözüm buldu.. bir önceki günkü yarım günüme mi yanayıım, çözümün bu kadar basit olmasına mı yanayım bilmiyorum :) 
Meğer hata Equals dan kaynaklanıyormuş.. .Equals yerine == koyunca hatadan eser kalmamıştı. Bu hataya ve bu çözüme teessüflerimi sunarken daha fazla geyik yapmadan kodlarımı yapıştırayım :)


Çalışmamakta direnen sorgum;

from p in harmonyEntities.VDB_ASSETS
                             where p.PRM1.Equals(1) &&
                                   (from q in harmonyEntities.VDB_ASSETS
                                    where q.GUID_PARENT.Equals(new Guid("D5610D87-C220-477F-BA14-009EAB24EBE4")) &&
                                    q.PRM1.Equals(1) && q.PRM0.Contains("\\")
                                    select q.PRM0.Substring(9, 50)).Contains(p.PRM0)
                             select p


Çalışıp ruhuma neş'e sunan sorgum;

from p in harmonyEntities.VDB_ASSETS
                             where p.PRM1 == 1 &&
                                   (from q in harmonyEntities.VDB_ASSETS
                                    where q.GUID_PARENT == (new Guid("D5610D87-C220-477F-BA14-009EAB24EBE4")) &&
                                    q.PRM1 == 1 && q.PRM0.Contains("\\")
                                    select q.PRM0.Substring(9, 50)).Contains(p.PRM0)
                             select p


Vee Emeği geçen, isminin gizli tutulmasını rica eden, iki gündür kuşlar tarafından "lazımlık" olarak kullanılan stajere teşekkürlerini sunaaan,, bendeniz Monooo :) (buraya bir foto yakışırdı ama gülen surat benmişim şakacıktan.)


16 Temmuz 2013 Salı

SQL String Split - Bir stringi bir karaktere göre parçalamak


Pek çok sitede bulunabilecek bir kullanım olduğunun farkındayım ama yazmazsam hemmen unuturum.. :)

Üzerinde çalıştığım sistemde kullanıcılar domain kullanıcı ve form kullanıcısı olarak iki farklı şekilde sisteme kaydediliyor. Her domain kullanıcısının bir form kullanıcısı var ancak her form kullanıcısının bir domain kullanıcısı yok. Bana lazım olan ise domain kullanıcısı olan form kullanıcıları.. bu iki kullanımın da tek ortak yönü isimleri.. Domain kullanıcısı Firma\Monolâra şeklindeyken form kullanıcısı Monolâra şeklinde.. bu durumda isimlerden kontrol etmekten başka çarem yok gibi görünüyor :) 

İşte de şöyle yaptım;

SELECT DBO.CF_ASSET_NAME(GUID_ASSET_Y) AS Y,
FROM VDB_ASSET_RELATIONS
WHERE PRM1=1 AND GUID_ASSET_X IN (SELECT GUID_ASSET_Y
                                  FROM VDB_ASSET_RELATIONS
                                  WHERE GUID_ASSET_X='880E69C9-8292-4B62-B718-4229B624EBCE'
                                   AND GUID_ASSET_Y IN ('AF8FD4D3-9EA1-4F3E-8271-1CF47C48CF23','9ABBC878-F195-431E-8093-7F449F2BA83C')
                                        AND PRM1=1
                                  )
       AND PRM2='Kullanici.Yonetimi.Kullanici'
       AND DBO.CF_ASSET_NAME(GUID_ASSET_Y) IN
       (
             SELECT LTRIM(PARSENAME(REPLACE(PRM0, '\', '.'), 1)) AS ISIMLER
             FROM VDB_ASSETS
             WHERE GUID_PARENT='D5610D87-C220-477F-BA14-009EAB24EBE4'
           AND PRM1 = 1
           AND PRM0 LIKE '%\%'
       )   
----------------------------ya da----------------------
SELECT DBO.CF_ASSET_NAME(GUID_ASSET_Y) AS Y,
FROM VDB_ASSET_RELATIONS
WHERE PRM1=1 AND GUID_ASSET_X IN (SELECT GUID_ASSET_Y
                                  FROM VDB_ASSET_RELATIONS
                                  WHERE GUID_ASSET_X='880E69C9-8292-4B62-B718-4229B624EBCE'
                                   AND GUID_ASSET_Y IN ('AF8FD4D3-9EA1-4F3E-8271-1CF47C48CF23','9ABBC878-F195-431E-8093-7F449F2BA83C')
                                        AND PRM1=1
                                  )
       AND PRM2='Kullanici.Yonetimi.Kullanici'
       AND DBO.CF_ASSET_NAME(GUID_ASSET_Y) IN
       (
             SELECT SUBSTRING(PRM0,CHARINDEX('\',PRM0)+1,len(PRM0)) AS ISIMLER
             FROM VDB_ASSETS
             WHERE GUID_PARENT='D5610D87-C220-477F-BA14-009EAB24EBE4'
           AND PRM1 = 1
           AND PRM0 LIKE '%\%'
       )     

Aslında tablo yapılarımıza göre gitmem gereken yol yukarıdakiydi ama sorgusu 1 dk 13 sn'lik bir sonuç dönünce başka bir yoldan gittim mecburen.. :)


SELECT PRM0
FROM VDB_ASSETS
WHERE
PRM1 = 1
AND PRM0 IN(SELECT LTRIM(RTRIM(PARSENAME(REPLACE(PRM0, '\', '.'), 1))) AS ISIMLER
            FROM VDB_ASSETS
            WHERE GUID_PARENT='D5610D87-C220-477F-BA14-009EAB24EBE4'
                  AND PRM1 = 1
                  AND PRM0 LIKE '%\%'
            )
ORDER BY PRM0

------------------ya da--------------------
SELECT PRM0
FROM VDB_ASSETS
WHERE
PRM1 = 1
AND PRM0 IN(SELECT SUBSTRING(PRM0,CHARINDEX('\',PRM0)+1,len(PRM0))  AS ISIMLER
FROM VDB_ASSETS
WHERE GUID_PARENT='D5610D87-C220-477F-BA14-009EAB24EBE4'
AND PRM1 = 1
AND PRM0 LIKE '%\%'
            )
ORDER BY PRM0


Bu sorgumda bir sorun yok şimdilik.. Olur da şirket çok büyürse küçük bir ihtimal sorun çıkar onun da yakın gelecekte olacağını zannetmiyorum :)

Başlığımda bahsettiğim olayı sağlayan kodlar;

SUBSTRING(PRM0,CHARINDEX('\',PRM0)+1,len(PRM0))
(PARSENAME(REPLACE(PRM0, '\', '.'), 1))
\ karakterinden sonrasını yani Firma\Monolâra nın Monolâra kısmını alır.. 

Yok ben Monolâra yı değil Firma kısmını almak istiyorum diyorsanız kodlarda ufak değişiklikler yeterli olacak;

SUBSTRING(PRM0,0,CHARINDEX('\',PRM0))
(PARSENAME(REPLACE(PRM0, '\', '.'), 2))
\ karakterinden öncesini alır, yani Firma yı..

Farklı olarak, LTRIM, RTRIM baştaki ve sondaki boşlukları atmaya yarıyormuş, artistlik olsun diye kullandım onları da. :P

Şimdi bunları LINQ da nasıl yapıcam ona bakmam lazım.. Müsâdenizle efendiler .. ;)

5 Temmuz 2013 Cuma

DevExpress Label Vertical Text Orientation/Rotation/Direction


Tek yapmak istediğimiz label ın text ini dikey yapmaktı.. Sadece bununla 1 saat uğraşılır mı? :) Biz uğraştık. :P 

Microsoft ürünlerini kullanmaya alışmışlıktan olsa gerek properties deki "Angle" seçeneği hiiç dikkatimizi çekmedi.. Angle ı 90 verince çözüme ulaştık.. Angle ın türkçesi de açıymış.. biz tabi direction, rotation fln aradık ..

Birdaha da unutmam bunu muhtemelen ya, yine de notlarımda bulunsun, arada rezilliklerime bakıp gülesim geldiğinde lazım olur belki.. :)

Vesselam...

4 Temmuz 2013 Perşembe

Ajax-Enabled WCF Service'a json ve jquery ile kompleks veri gönderimi...



Gayet açıklayıcı bir başlık oldu :) 

Amacımız client taraftan kompleks bir veri tipini alıp servis aracılığıyla veritabanına kaydetmekti.. her zamanki gibi yeni bir proje oluşturdum, property classımı ve metodlarımı yazdım.. herşey güzel gidiyordu ki laaps diye

Operation 'SaveTextbox' in contract 'FormSavingService' has a query variable named 'text' of type 'About_Form.Dat', but type 'About_Form.Dat' is not convertible by 'QueryStringConverter'. ÿVariables for UriTemplate query values must have types that can be converted by 'QueryStringConverter'.

hatasını aldım. birşey de sorunsuz gitse şaşardım zaten. Neyse yarım gün bu hatayı nasıl çözerim diye uğraştım, millet forumlarda özel metodlar yazmış queryStringConverter için.. Hiç uğraşasım gelmedi..
Ne mi yaptım? Sıfırdan yeni proje oluşturup kodları içine kopyaladım ve hatadan eser yoktu.. :D Ya sabır.. 

Neyse sonuç olarak artık "dat" tipinde değişken alan metodlarıma veri göndermeyi deneyebilirdim. Ve jqueryci arkadaşın yardımıyla denedim. Evet belki bir çılgınlıktı, ama bunu yaptım! :)p

Bir de Transaction ımı complete demeyi unutmasaydım 3 saat neden başarılı diyor da kaydetmiyooor diye kafayı yiycek duruma gelmezdim. :S Bu da bana ders olsun. 

işte de kodlarım..

property classım'ın bir kısmı..

using System;
using System.Runtime.Serialization;

namespace FormSaving2
{
    public class SavingProperties
    {
        [DataContract]
        public class Dat
        {
            [DataMember]
            public string Text { get; set; }
            [DataMember]
            public Guid AssetId { get; set; }
            [DataMember]
            public Guid MasterTypeId { get; set; }
            [DataMember]
            public Guid SecurityId { get; set; }
            [DataMember]
            public Guid UserId { get; set; }
            [DataMember]
            public Guid PageId { get; set; }
            [DataMember]
            public Guid TypeId { get; set; }
        }
  }


Metodlarımdan bir adet örnek;

using Harmony.TL.DAL;
using System;
using System.IO;
using System.Transactions;
using System.Web;

namespace FormSaving2
{
    public class SavingFunction
    {
        private readonly HarmonyEntities _HarmonyEntities;

        public SavingFunction()
        {
            _HarmonyEntities = DatabaseEntities.GetEntities;

        }

        public void SaveTextbox(FormSaving2.SavingProperties.Dat text)
        {
            this.SaveWithText(text);
        }

 private void SaveWithText(FormSaving2.SavingProperties.Dat text)
        {

            _HarmonyEntities.AddToVDB_ASSET_INFORMATIONS(new VDB_ASSET_INFORMATIONS
            {
                GUID = Guid.NewGuid(),
                GUID_ASSET = text.AssetId,
                GUID_TYPE = text.TypeId,
                GUID_PARENT = text.MasterTypeId,
                GUID_USER = text.UserId,
                PRM0 = text.Text,
                PRM1 = 1,
                TIMESTAMP = DateTime.Now,
                GUID_SECURITY = text.SecurityId
            });

            using (TransactionScope ts = new TransactionScope())
            {
                _HarmonyEntities.SaveChanges();

                ts.Complete();
            }

        }
  }



Servisimden metodumu çağırışım;


using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

namespace FormSaving2.Service
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class FormSavingService
    {

        FormSaving2.SavingFunction fs = new SavingFunction();

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public void SaveTextbox(FormSaving2.SavingProperties.Dat text)
        {
            fs.SaveTextbox(text);
        }
 }



Client taraftan servise veri gönderişim.. (test değerleri verdim)..

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Test.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>
    <form id="form1" runat="server">
   <script>

       function Get_Click() {
           var data = [];
           var dat = {
               AssetId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               MasterTypeId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               PageId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               SecurityId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               Text: $("#txtName").val(),
               TypeId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               UserId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5"
           }
           data.push(dat);                 

           $.ajax({
               type: "GET",              
               url: "http://localhost:3301/FormSavingService.svc/SaveTextbox?text=" +       JSON.stringify(dat), 
               dataType: "json",
               varProcessData: true,
               contentType: "application/json; charset=utf-8",
               success: function (data) {
                   $("body").append("Basarılı");
               },
               error: function (xhr, ajaxOptions, thrownError) {
                   alert(xhr.status);
                   alert(thrownError);
               }
           });

       }

   </script>       
          
        <input type="text" id="txtName"  name="Gonder" />
        <input type="button"  name="Gonder" value="Gonder" onclick="Get_Click()"/>
       
    </form>
</body>
</html>



işte de böyle oldu, iyi oldu çok da güzel iyi oldu taam mı? 

Tabi bunları yapıp da servisinize Global.asax eklemeyi unutursanız not allowed hatası alabiliriteniz var.. üşenmeyeyim onu da ekleyeyim..

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                // this one tells about the supported methods to client.
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
                              "GET, POST, OPTIONS");

                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers",
                               "Content-Type, Accept");

                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");

                HttpContext.Current.Response.End();
            }
        }

Emeği geçen arkadaş(lar)a teşekkür ederim. :)
Sağlıcakla kalın, esen kalın sayın cinlerim..