“Cannot create/shadow copy ‘dll ismi’ when that file already exists” probleminin çözümü

Geçen gün uygulamalarımızın çalıştığı sunucunun olay kayıtlarını incelerken ASP.NET’in sürekli olarak bu hata ile karşılaştığını gördüm. Bunun neticesinde web siteleri kimi zaman cevap veremez duruma geliyordu. Internette biraz araştırma yaptığımda genelde geliştiricilerin Visual Studio’da çalışırken bu hatayla karşılaştıklarını gördüm. (Engin ile birlikte) Bir süre çözüm aradıktan sonra bu yazıyı bulduk. Benim gibi bu problemle karşılaşmış ve çözüm yolu arayışındaki başka bir geliştiricinin bulduğu çözümü ben de sizlerle paylaşayım dedim.

web.config dosyanızda system.web elemanına aşağıdaki kod öbeğini ekleyerek sorundan kurtulabilirsiniz.

<hostingenvironment shadowcopybinassemblies="false"></hostingenvironment>Code language: HTML, XML (xml)

shadowCopyBinAssemblies özelliği şu şekilde tanımlanmış: Bir Boolean(Evet/Hayır) değeri ile uygulamanın Bin klasöründe yer alan bileşenlerinin, gölge kopyalarının (shadow copy) uygulamanın ASP.NET geçici dosyalar klasörüne kopyalanıp kopyalanmayacağını belirtir.

Umarım işinize yarar.

BOM karakter dizisi olmadan XmlWriter ile UTF-8 kullanımı

C# ile geliştirdiğim projelerde XML üretmem gerektiğinde, bu konuda çok becerikli olduğunu düşündüğüm XmlWriter nesnesini kullanırım. Nesneyi oluştururken aşağıdaki gibi oluştururdum;

XmlWriter writer = new XmlTextWriter(stream, Encoding.UTF8);

Bilmediğim şey ise, bu şekilde nesneyi oluştururken otomatik olarak streamin başına UTF-8 tanımlayıcısı olan üç baytlık BOM karakter dizisinin ekleniyor olduğuydu. Yazmış olduğum bir servisi kullanan firmadan gelen dönüş ile, gönderdiğim XML’de BOM olduğunu ve bu yüzden XML’i düzgün işleyemediklerini öğrendim. Bunun üzerine BOM olmadan XML’i nasıl oluştururum diye araştırdım ve buradaki makaleye ulaştım.

Yapmamız gereken çok basit. Daha önce Encoding.UTF8 ile elde ettiğimiz Encoding nesnesini bu sefer yeni bir Encoding nesnesi oluşturarak hallediyoruz. Yeni Encoding nesnemizi oluştururken de encoderShouldEmitUTF8Identifier parametresini false olarak kullanıyoruz;

XmlWriter writer = new XmlTextWriter(stream, new UTF8Encoding(false));

Ben XmlWriter kullanırken bu sorunla karşılaştığımdan yazı da bu konu etrafında şekillendi. Elbette ki Encoding kullandığınız başka durumlarda da bu şekilde Encoding nesneleri oluşturabilirsiniz.

JavaScript kapsam ve kaplamları anlamak

Bu makalenin orijinali (Explaining JavaScript scope and closures) Robert Nyman tarafından kendi blogunda yazılmıştır. Türkçe çevirisi için kendisinden izin alınmış olup, aşağıda okuyacağınız birinci tekil şahıs yine Robert Nyman’ın kendisidir;

Javascript ile uygulama geliştirirken bir çok insanın zorluk çektiği bir konuyu açıklamaya çalışmak istedim.

Okumaya devam et JavaScript kapsam ve kaplamları anlamak

jTopLeft – Bir elemanın sayfa üzerindeki yerini bulma

JavaScript ile bir elemanın tarayıcının görüş alanına göre ya da ebeveyni olan diğer bir elemana göre x ve y koordinatlarını belirlemeye yönelik bir betik hazırladım ve jQuery eklentisi haline getirdim. Eklentinin kendisini ve sıkıştırılmış halini aşağıda bulabilirsiniz.

Kullanımı:

var top = $('#elm').top();

var left = $('#elm').left();

var pos = $('#elm').pos();
top = pos.top;
left = pos.left;
/*
 * jTopLeft
 * https://www.karalamalar.net/
 *
 * Copyright (c) 2009 İzzet Emre Erkan
 * Licensed under Creative Commons Attribution-Share Alike 3.0 Unported License
 * http://creativecommons.org/licenses/by-sa/3.0/
 *
 * Date: 2009-10-12 17:56:24 +0300 (Mon, 12 Oct 2009)
 * Revision: 3
 */
(function($){  
  $.fn.extend({
    top: function(obj) {
      var o = findPos(this.get(0));
      return obj ? o - findPos(obj) : o;
    },
    left: function(obj) {
      var o = findPos(this.get(0),true);
      return obj ? o - findPos(obj,true) : o;
    },
    pos: function(obj) {
      var pos = {},o;
      
      o = findPos(this.get(0));
      pos.top = obj ? o - findPos(obj) : o;
      
      o = findPos(this.get(0),true);
      pos.left = obj ? o - findPos(obj,true) : o;
      
      return pos;
    }
  });
  function findPos(o,l){
    var x = 0;
    if (o.offsetParent) {
      x = l ? o.offsetLeft : o.offsetTop;
      while (o = o.offsetParent)
        x += l ? o.offsetLeft : o.offsetTop;
    }
    return x;
  }
})(jQuery);

Paketin küçültülmüş halini (802 byte) buradan edinebilirsiniz.

strExtensions – JavaScript için string uzantıları

JavaScript kullanırken eksikliğini hissettiğim bir kaç string metot var. padLeft, padRight, trimLeft, trimRight ve trim metotları varsayılan string metotları arasında yer almıyor. Zaman içinde çeşitli projelerde bu metotlara ihtiyaç duydukça yazıp yazıp bir kenara koymuştum. Şimdi bu metotları toplayıp ufak bir paket oluşturdum ve sizlerle de paylaşayım dedim. valiDate v2.0‘ı da bu pakete dahil ettim. Metotları aşağıda bulabilirsiniz;

/*
 * strExtensions - String extensions
 * https://www.karalamalar.net/
 *
 * Copyright (c) 2009 İzzet Emre Erkan
 * Licensed under Creative Commons Attribution-Share Alike 3.0 Unported License
 * http://creativecommons.org/licenses/by-sa/3.0/
 *
 * Date: 2009-10-08 17:43:34 +0300 (Thu, 08 Oct 2009)
 * Revision: 2
 */
String.prototype.trimLeft =
  function(c) {
    c = c || ' ';
    return this.replace(new RegExp('^'+c+'+'),"");
  };
String.prototype.trimRight =
  function(c) {
    c = c || ' ';
    return this.replace(new RegExp(''+c+'+$'),"");
  };
String.prototype.trim =
  function(c) {
    return this.trimLeft(c).trimRight(c);
  };
String.prototype.padLeft =
  function(l, c) {
    c = c || ' ';
    var s = this.toString();
    while (s.length < l) s = c + s;
    return s;
  }
String.prototype.padRight =
  function(l, c) {
    c = c || ' ';
    var s = this.toString();
    while (s.length < l) s = s + c;
    return s;
  }
String.prototype.valiDate =
  function() {
    if(/^(0[1-9]|[12][0-9]PO|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)[0-9]{2}$/.test(this)) {
      var v = this.replace(/[- /]/g,'.').split('.');
      var d=parseInt(v[0],10), m=parseInt(v[1],10), y=parseInt(v[2],10);
      var o = new Date(y, m - 1, d);
      return o.getDate() == d && o.getMonth() + 1 == m && o.getFullYear() == y;
    }
    else
      return false;
  }

Paketin küçültülmüş halini (1130 byte) buradan edinebilirsiniz.