21 Ağustos 2013 Çarşamba

Transaction (Process ID ...) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.



Bir varmııış bir yokmuuş.. Sürekli veri çeken, veri yazan, listeleyen bir ajax wcf servis varmış.. Gel verii git verii, yorulmuş bir gün vee "Transaction (Process ID ...) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction." hatasına düşer olmuuş.. :P

Sonra süper kahraman Mono çıkagelmiş vee servisini bu zulden kurtarmak için başlamış çalışmalara.. Çalışınca da kazanmış haliylee :) Burda da masal bitmiiiş..

Tüm postu masallaştırabilme kabiliyetimden şüphem yok ama işte yine o malum üşengeçlik :P

Hikaye anlaşılmış olmalı, sorunumuz transactionların hızlı hızlı çalışırken çakışması.. :) Elbette derinlemesine manasını bilmiyorum ama tahminimce ve internetten okuduklarımla böyle olduğunu tahmin ettim. Böyle de zekalı bir insanım :P

Neyse naçizane bulduğum çözüme geçeyim.. Çözüme kullandığım transactionlara bir ayar nakşederek ulaştığımmı zannediyorum. O ayarı yaptığımdan beri o hatayı almadım ama umarım mahcup olmam :P

Çözümü şurada buldum;
http://forums.asp.net/post/4141266.aspx

Orada ReadCommitted yazmış IsolationLevel a, ama ben onu ReadUncommitted olarak kullandım.

Çünkü, Aralarında bi fark vardı;

ReadUncommitted de, data transaction boyunca okunup düzenlenebiliyor.  (Volatile data can be read and modified during the transaction.)
ReadCommitted de ise data transaction boyunca okunamıyor, ancak düzenlenebiliyor. (Volatile data cannot be read during the transaction, but can be modified.)
ingilizcelerini yazayım da havam olsun..

O farklan çok gözel oldu..
(ya ben bu adamın sözlerini kullanıp duruyorum kaynak belirtmeden ama ilerde başıma dert olur mu bilemedim? :P )


TransactionOptions transOptions = new TransactionOptions();
transOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, transOptions))
{
 ...
}

Gökten 3 chat penceresi düşmüüüş, biri osmanın, biri benim, biri de ayşenin başına :)
Ama sanırım tek başına birşey düşen bu 3 şahıs değil.. Asıl malum şahsın başına da osman, ayşe ve ben elmalarla beraber düşmüşüz :P ( O kendini biliyor sayın cinlerim herşeyi de merak etmeyin :) )

19 Ağustos 2013 Pazartesi

Jquery Dizileri Karşılaştırma (2 dizinin farklı elemanlarını bulma)


--Basın Açıklaması--

Geçtiğimiz günlerde tarafıma, yazılarımı özgürce yazmama engel olmak için bir komplo kurulduğu malumunuzdur. Ancak bu komploya yenilmeyip canım istedikçe canımın istediğini yazacağım "cinioyuna" duyurulur.

imza= :P

( Sadece espri YK ;) )
--

Vay arkadaş.. 2 haftayı aşıyor bir işi bitiremedik :) Sadece chatleşecektik. kulağa ne basit geliyor, ki aslında öyle de..

Ama bunu yapmayı deneyenler iki junior insanı olunca ve soru sormamıza hemen gözlerini kısan bir yazılım müdürü olunca haliyle uzun sürüyor, basit yerlerde takılınıyor, bazen mantıksız mantıklar yürütülüyor :) o da haklı, sonuçta sorduğumuz sorular çok basit geliyor olmalı. Neyse, sorularımızı bağrımıza basıp elimizden geldiğince birşeyler yapmaya çalışıyoruz işte, böyle böyle düşe kalka öğreneceğiz :)

Yine o basit takılınmış yerlerden birindeydik. Jquery de iki diziyi karşılaştırıp farklı elemanlar için yeni chat penceresi oluşturacaktık. Aaa ben bunu biryerden hatırlıyordum. önceki postumu açtım hemenn, intersecti ve excepti deneyelim dedik. Ama Jquery yle uzaktan bakışıp selamlaşıyor olsak da çok bir samimiyetim yoktu.. Araştırdık bu kodları, Jquery de kullanımlarını bulduk, ama o gün basiretimiz mi bağlanmış derler, çözümü bulmamıza rağmen sonuca ulaşamadık. Tıkanınca tıkanılıyor :) Ertesi iş günü ilk işimiz bunu halletmek oldu; basitçe çözdük ve biz nasıl geçen gün bunu çözemedik diye hayıflanmak da ikinci işimiz oldu haliyle :D Daha çok işimiz var tabi ama bu kısmı yazmış olayım..


  • Kodumuz şöyle;


var array1 = [1, 2, 3, 4, 5, 6];
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var difference = [];

jQuery.grep(array2, function(el) {

    if (jQuery.inArray(el, array1) == -1) difference.push(el);


});


alert(" the difference is " + foo);


  • Site şöyle;


http://stackoverflow.com/questions/10927722/jquery-compare-2-arrays-return-difference



  • Kullanımımız şöyle;


var windowArray = [];
for (var i = 0; i < windowsLength; i++) {

     var window = windows[i];
     var windowId = $(window).attr("id");

     windowArray.push(windowId);
}

var dataArray = [];
for (var i = 0; i < dataItems; i++) {

    dataArray.push(d[i].MessageGroupId);
}

var difference = [];
jQuery.grep(dataArray, function (el) {

var control = jQuery.inArray(el, windowArray);

 if (control === -1) difference.push(el);
 });

 for (var i = 0; i < difference.length   ; i++) {
      for (var i = 0; i < d.length   ; i++) {
          if (d[i].MessageGroupId === difference[i]) {

              OnlineChat.ChatWindow(d[i].MessageGroupId, windowUserId,"Konuşma", d[i].GroupUserIds);
                                    }
                                }

                            }


  • Can sıkıntım ise şöyle böyle değil.. 

5 Ağustos 2013 Pazartesi

ASP.NET Hazır Metodla Dizileri Karşılaştırmak


Bozuntu.. Hayal kırıklığı... Direniş... Neler yaşamadım ki o gün.. :(

Halbuki tek yapmak istediğim iki dizinin elemanlarını karşılaştırmaktı. Ve bunu yapmak için .Net'te hazır metodun mutlaka olacağını savunmaktı.. For döngülerine girmek kodlarımın yakışıklılığını bozacaktı. Buna nasıl izin verirdim? Nasıl?? (Nedense for döngülerine önceden beri gıcığım var. Elektirik uyuşmazlığı sanırım.)

İlk denediğim metot SequenceEqual  metoduydu ve ilk intibası iyiydi.. Şansına olmalı; doğru(yani istediğim gibi) çalıştı ilk başta, ama sonra veri tabanından çekip diziye attığım GUID lerin ve metoduma parametre olarak gelen dizinin GUID lerinin sırası aynı değilse SequenceEqual ın doğru(istediğim gibi :p) çalışmadığını farkettim. Yani SequenceEqual sadece sırası aynı olan dizilerde benim "istediğim gibi" çalışıyordu. (adından da belli aslında ya..)

Bu durumda ben de dizileri sıralayıp öyle SequenceEqual metodunu kullanırım diye sıralama çalışmalarına başlamıştım ki...

İlk darbe yazılım müdürümden geldi...

-Bitti mi?
-(sağa sola kafa sallayış.)
-Ne zaman biter? 
-Eee ööö.. (Ekranımda hata penceresi.)
-Bu ne, nerede takıldın?
-Yok yaa o birşey değil,, saçma birşey denedim de onun hatası.
-Bana da söyle de seninle dalga geçeyim canım sıkıldıkça. (zalımca bir sırıtış)

Ve ben kızara bozara OrderByDescending metoduyla bir türlü aynı sırada sıralanmayan GUID lerimi bir de stringe çevirip sıralamayı denediğimi açıkladım.

-Nihahaha...
-....
-.... Yoo hiç de saçma bişey denememişsin aslında ver bakayım... 
- :S
- .... Yok olmadı. Neden sıralamazsa zaten bu OrderByDescending .. Zaten sıralamak zorunda mısın ki SequenceEqual la yapma For ların içinde Contains le yap bakalım hadi. Kolay gelsin.
- :/// 

Benim Mono damarım tutmuştu bir kere, hiç öyle yapar mıydım? :P Tabii ki hayır.
Biraz daha araştırdım ve şu iki hoş metodu buldum. Bulmakla kalmadım kullandım bilee, ne haber. ;)

Şimdii, madem böyle havalanmayı başardın yine,, başlangıçta neden o kadar duygu sömürüsüylen girdin be çocuk diyebilinir.. Ama içimde kopan fırtınaları bir ben bir de Allah bilir. :( :P


  • Bulduğum metotlar;


 string[] sonuc = dizi1.Except(dizi2).ToArray();
//dizi2'de bulunup dizi1'de bulunmayan elemanları sonuç dizisine aktarır. 

string[] sonuc = dizi1.Intersect(dizi2).ToArray();
//dizi1 ve dizi2'de ortak olarak bulunan elemanları sonuç dizisine aktarır.


  • Bulduğum blog;

http://selcukpeksen.blogspot.com/2013/04/c-iki-array-karslastrlmas.html


  • Benim kullanımım;

public static Guid GetGroupId(Guid[] toPersonIdList, Guid userId)
{
   HarmonyEntities harmonyEntities = DatabaseEntities.GetEntities;

   List<Guid> allPeople = new List<Guid>();
   allPeople.Add(userId);
   foreach (var item in toPersonIdList)
   {
    allPeople.Add(item);
   }

   if (allPeople.Count == 2)
   {
   //Her grup için kişiler kontrol edilir.
   Guid[] allPeopleId = allPeople.ToArray();

   var groups = (from p in harmonyEntities.VDB_ASSET_RELATIONS
                 where allPeopleId.Contains(p.GUID_ASSET_Y) &&
                 p.GUID_RELATION_TYPE == Structs.SMSParams.EMessageGroupRT &&
                 p.PRM1 == 1
                 select p.GUID_ASSET_X).Distinct().ToArray();

   foreach (var grup in groups)
   {
    //prm1 i -1 e çekilmiş kayıt varsa 2 kişinin grubu o grup değildir..
    var peopleList = (from p in harmonyEntities.VDB_ASSET_RELATIONS
                      where p.GUID_ASSET_X == grup &&
                      p.GUID_RELATION_TYPE == Structs.SMSParams.EMessageGroupRT
                      select p).OrderByDescending(p => p.GUID_ASSET_Y).Select(p => p.GUID_ASSET_Y).Distinct().ToArray();

    //Eğer dizilerde farklı eleman yoksa o grup numarasını döndür.
    if (peopleList.Except(allPeopleId).ToArray().Count() == 0)
    {
    return grup;
    }
    else
    {
    continue;
    }
    }

    }
  //Eğer mevcut grup bulunamadıysa yeni grup insert edilir.
  return CreateNewGroup(userId, allPeople.ToArray());
}
  • SequenceEquals ın örnek kullanımı;


int[] a = new[] { 3, 5, 6, 8, 9, 3 };

int[] b = new[] { 3, 5, 6, 8, 9, 3 };


bool esitMi = a.SequenceEqual(b);


  • Postun Sonu;


Hayırlı işler, bol kazançlar, Sevgiler, Saygılar..

Bir de iyi bayramlar.
Büyüklerimin ellerinden öpüp içimden keşke hâlâ bana harçlık veren olsa diye geçirip, küçüklerimin yanaklarını sıkıp saçlarını karıştırıp, yaşıt hemcinslerimle sarılıp, karşı cinse başımı hafifçe eğip yan yan sırıtıp, yabancılara da biraz mesafeli bir tavırla bayramınız mübareeek olsunn deyiip,, bu postu noktalıyorum. :))