ASP.NET 4’ün IIS’e Register Edilmesi

Okuma Süresi: 1 dakika

Web sunucuya yüklemiş olduğunuz bir ASP.NET 4.0 uygulamasını çalıştırdığımızda HTTP Error 500.21 – Internal Server Error – Handler “PageHandlerFactory-Integrated” has a bad module “ManagedPipelineHandler” in its module list” şeklinde bir hata alırsanız ASP.NET, IIS’e register edilmemiştir.

HTTP Error 500.21 - Internal Server Error

Bu sorunu düzeltmek için Komut İstemi’nden (Command Prompt) aşağıdaki komutu çalıştırmanız yeterlidir.

%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i

Bu komutu çalıştırdığınız zaman ASP.NET başarıyla IIS’e register edilmiş olacaktır.

SQL Server’da Komutların Çalışmasını Belli Bir Süre Bekletme

Okuma Süresi: 1 dakika

SQL Server’da çalıştırdığımız komutları belli bir süre bekletip tekrar çalıştırabilme olanağımız vardır. Bazı programlamla dillerinde bulunan Delay veya Thread.Sleep metodlarının aynısını SQL Server üzerinde de kullanabiliriz. WAITFOR DELAY komutu bu işlemi gerçekleştirmektedir.

Kullanımı aşağıdaki şekildedir:

-- 5 dakika bekletir.

WAITFOR DELAY '00:05';

-- 5 saniye bekletir.

WAITFOR DELAY '00:00:05';

-- 5 saat bekletir.

WAITFOR DELAY '05:00:00';

Apache’de Dizin Listelemeyi Pasif Yapma

Okuma Süresi: 1 dakika

Apache’nin önceki sürümlerinde Dizin Listeleme’yi (Directory Listing) devre dışı bırakmak için httpd.conf dosyasında bazı değişiklikler yapmak gerekliydi. Ancak Ubuntu üzerinde Apache2 kullanıyorsanız bu dosyayı düzenlemenize gerek kalmamaktadır. Terminal üzerinden aşağıdaki kodu yazıp çalıştırdığınızda dizin listeleme pasif olacaktır.

sudo a2dismod autoindex

Terminal’de kodu çalıştırdığınızda sadece apache2 servisini yeniden başlattığınızda dizin listeleme pasif olacaktır.

sudo service apache2 restart

Dizin listelemeyi tekrar aktif hale getirmek için aşağıdaki kodu kullanmanız yeterlidir.

sudo a2enmod autoindex


Web Servislerinde Session Kullanımı

Okuma Süresi: 1 dakika

Bir ASP.NET uygulamasında web servisiniz içerisinden Session’a erişmek istediğiniz zaman “Object reference not set to an instance of an object” hatasını alacaksınızdır.

Örnek olarak aşağıdaki gibi bir servis metodumuz olsun.

        [WebMethod]
        public string SayHello()
        {
            if(HttpContext.Current.Session["message"] != null)
               return HttpContext.Current.Session["message"];
            return "";
        }

Uygulamamızın herhangi bir yerinde message isminde bir Session’ın oluşturulduğunu varsayalım. null kontrolü yapmamıza rağmen if bloğunun başında “Object reference not set to an instance of an object” hatasını fırlatacaktır. HttpContext null olmamasına rağmen HttpContext’in Session özelliği null olarak gelmektedir.

Sorunu çözebilmek için WebMethod niteliğimizin (attribute) EnableSession özelliğini true olarak ayarlamamız gerekmektedir.

        [WebMethod(EnableSession = true)]
        public string SayHello()
        {
            if(HttpContext.Current.Session["message"] != null)
               return HttpContext.Current.Session["message"];
            return "";
        }

Kodumuzu bu şekilde düzenleyip çalıştırdığımızda sorunsuz bir şekilde çalışacaktır.

TinyMCE ile Formatter Kullanımı

Okuma Süresi: 1 dakika

TinyMCE’de Formatter basit bir şekilde istediğimiz biçimleri uygulamamızı veya kaldırmamıza yarar.

Örnek olarak TinyMCE editöründe seçmiş olduğumuz alanı ins veya del etiketleri arasına alacak ve kaldır düğmesine bastığımızda ise bu biçimleri kaldıracak.

Varsayılan olarak gelen init fonksiyonumuzu aşağıdaki şekilde değiştirelim:

tinymce.init({
    selector: "textarea",
    plugins: [
        "advlist autolink lists link image charmap print preview anchor",
        "searchreplace visualblocks code fullscreen",
        "insertdatetime media table contextmenu paste"
    ],
    toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
    formats: {
         removed: { inline: 'del', 'classes': 'deleted' },
         added: { inline: 'ins', 'classes': 'inserted' }
       }
});

formats özelliğinde istediğimiz kadar yeni biçimler ekleyebiliriz. Bu örnekte removed ve added isminde biçimler ekledik. inline değeri ile hangi elementi kullanarak biçimlendireceğini, classes özelliği ile de elemente class vermiş olduk.

Editörde seçili olan alana bu biçimleri uygulayabilmek veya kaldırabilmek için apply ve remove fonksiyonları kullanılır. apply fonksiyonu seçili alana biçimi uygular, remove fonksiyonu ise seçili alanda uygulanmış bir biçim var ise bu biçimi kaldırır. Her iki fonksiyonda tek bir parametre almaktadır. Parametre olarak formats alanında tanımlamış olduğunuz ismi vermeniz yeterlidir.

Örnek ekran görüntüsü aşağıdaki gibidir.
TinyMCE FormatterYazmış olduğumuz tüm kod aşağıdaki gibidir.

<script type="text/javascript">
tinymce.init({
    selector: "textarea",
    plugins: [
        "advlist autolink lists link image charmap print preview anchor",
        "searchreplace visualblocks code fullscreen",
        "insertdatetime media table contextmenu paste"
    ],
    toolbar: "insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
    formats: {
        removed: { inline: 'del', 'classes': 'deleted' },
        added: { inline: 'ins', 'classes': 'inserted' }
    }
});
</script>

<form method="post" action="dump.php">
    <textarea name="content"></textarea>
</form>
<a href="#" class="add" onclick="tinymce.activeEditor.formatter.apply('added');return false;">ekle</a>
<a href="#" class="remove" onclick="tinymce.activeEditor.formatter.apply('removed');return false;">sil</a>

TinyMCE’nin formatter hakkında daha detaylı bilmek almak ve fonksiyon listesine gitmek için buraya tıklayabilirsiniz.

Yazdığımız kodların bulunduğu örnek sayfaya gitmek için buraya tıklayabilirsiniz.

Regular Expressions’da Türkçe Karakter Problemi

Okuma Süresi: 1 dakika

Bir projede Regular Expressions ile geçen metinleri \w pattern’ı ile almaya çalışmıştım. Ancak \w pattern’ı Türkçe karakterleri seçmemekteydi. İnternette yaptığım kısa bir araştırmada aşağıdaki pattern’ı buldum ve test ettiğimde metindeki tüm karakterleri seçebildiğini gördüm.

^\p{L}+$

Bu pattern’la rahatlıkla tüm karakterleri seçebilirsiniz.

SQL Server’da Tüm Kolonların Collation’ını Değiştirme

Okuma Süresi: 1 dakika

SQL Server üzerinde veritabanının Collation’ını değiştirdiğiniz zaman Collation kolonlarda değişmeyebilir. SQL Server Management Studio’da tablo düzenlemesinden değiştirmek istediğinizde eğer tablo üzerinde veri varsa hata mesajıyla karşılaşacaksınız. Aşağıda bulunan T-SQL sorgusu veritabanındaki tüm tabloların tüm kolonlarının Collation’larını değiştirmektedir.

DECLARE @collate nvarchar(100);
DECLARE @table nvarchar(255);
DECLARE @column_name nvarchar(255);
DECLARE @column_id int;
DECLARE @data_type nvarchar(255);
DECLARE @max_length int;
DECLARE @row_id int;
DECLARE @sql nvarchar(max);
DECLARE @sql_column nvarchar(max);

SET @collate = 'Turkish_CI_AI';

DECLARE local_table_cursor CURSOR FOR

SELECT [name]
FROM sysobjects
WHERE OBJECTPROPERTY(id, N'IsUserTable') = 1

OPEN local_table_cursor
FETCH NEXT FROM local_table_cursor
INTO @table

WHILE @@FETCH_STATUS = 0
BEGIN

DECLARE local_change_cursor CURSOR FOR

SELECT ROW_NUMBER() OVER (ORDER BY c.column_id) AS row_id
, c.name column_name
, t.Name data_type
, c.max_length
, c.column_id
FROM sys.columns c
JOIN sys.types t ON c.system_type_id = t.system_type_id
LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE c.object_id = OBJECT_ID(@table)
ORDER BY c.column_id

OPEN local_change_cursor
FETCH NEXT FROM local_change_cursor
INTO @row_id, @column_name, @data_type, @max_length, @column_id

WHILE @@FETCH_STATUS = 0
BEGIN

IF (@max_length = -1) SET @max_length = 4000;

IF (@data_type LIKE '%char%')
BEGIN TRY
SET @sql = 'ALTER TABLE ' + @table + ' ALTER COLUMN ' + @column_name + ' ' + @data_type + '(' + CAST(@max_length AS nvarchar(100)) + ') COLLATE ' + @collate
PRINT @sql
EXEC sp_executesql @sql
END TRY
BEGIN CATCH
PRINT 'ERROR: Some index or contraint rely on the column' + @column_name + '. No conversion possible.'
PRINT @sql
END CATCH

FETCH NEXT FROM local_change_cursor
INTO @row_id, @column_name, @data_type, @max_length, @column_id

END

CLOSE local_change_cursor
DEALLOCATE local_change_cursor

FETCH NEXT FROM local_table_cursor
INTO @table

END

CLOSE local_table_cursor
DEALLOCATE local_table_cursor

GO

@collate değişkenine kullanmak istediğiniz Collation değeriyle değiştirmeniz yeterlidir.

SQL Server’ın desteklediği Collation’ları listelemek için aşağıdaki T-SQL sorgusunu çalıştırmanız yeterlidir.

SELECT name, COLLATIONPROPERTY(name, 'CodePage') as Code_Page, description
FROM sys.fn_HelpCollations()

TinyMCE Character Encoding

Okuma Süresi: 1 dakika

TinyMCE editöründe varsayılan olarak girilen metinler &nbsp; gibi encode edilerek kaydedilir. Bu ayarı değiştirmek için init fonksiyonunda entity_encoding değerini değiştirmeniz gerekmektedir.

tinymce.init({
        ...
        entity_encoding : "raw"
});

entity_encoding özelliği 3 adet değer almaktadır. Bunlar named, numeric ve raw‘dır.

named değeriyle girilen karakterler otomatik olarak &nbsp; gibi HTML olarak encode edilmektedir.

numeric değeriyle girilen karakterler otomatik olarak &#160; gibi encode edilmektedir.

raw değeriyle ise girilen karakterler olduğu biçimde kaydedilmektedir.

 

Bu konu hakkında daha detaylı bilgi almak için aşağıdaki sayfayı ziyaret edebilirsiniz:

http://www.tinymce.com/wiki.php/Configuration:entity_encoding

TinyMCE’de Custom Button Ekleme

Okuma Süresi: 1 dakika

TinyMCE editöründe bazen varsayılan gelen eklentiler yeterli gelmeyebilir. Bu örneğimizde TinyMCE editörüne tablo hücrelerine kenarlık veren bir menü ekleyeceğiz.

TinyMCE editörünün init kodu aşağıdaki şekildedir:

tinymce.init({
        selector: selector,
        plugins: [
            "advlist autolink lists link image charmap print preview anchor",
            "searchreplace visualblocks code fullscreen",
            "insertdatetime media table paste textcolor tinyfilemanager.net wordcount"
        ],
        toolbar: "insertfile undo redo | styleselect | hucrekenarligi | fontselect | fontsizeselect | forecolor backcolor | bold italic | pastetext | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",
        language: "tr_TR",
        fontsize_formats: "8pt 9pt 10pt 11pt 12pt 26pt 36pt",
        forced_root_block: false,
        content_css: cssPath,
        setup: function (ed) {
            //Hücre kenarlığı menüsü
            ed.addButton('hucrekenarligi', {
                type: 'menubutton',
                text: 'Hücre Kenarlığı',
                icon: false,
                menu: [
                    {
                        text: 'Sol', onclick: function () {
                            AddClass("borderLeft");
                        }
                    },
                    {
                        text: 'Sağ', onclick: function () {
                            AddClass("borderRight");
                        }
                    },
                    {
                        text: 'Üst', onclick: function () {
                            AddClass("borderTop");
                        }
                    },
                    {
                        text: 'Alt', onclick: function () {
                            AddClass("borderBottom");
                        }
                    },
                    {
                        text: 'Tümü', onclick: function () {
                            RemoveClasses();
                            AddClass("borderAll");
                        }
                    },
                    {
                        text: 'Temizle', onclick: function () {
                            RemoveClasses();
                        }
                    }
                ]
            });

            function AddClass(className)
            {
                var element = ed.dom.getParent(ed.selection.getNode(), 'td');

                if (!ed.dom.hasClass(element, className))
                    ed.dom.addClass(element, className);
                else
                    ed.dom.removeClass(element, className);
            }

            function RemoveClasses() {
                var element = ed.dom.getParent(ed.selection.getNode(), 'td');

                ed.dom.removeClass(element, "borderLeft");
                ed.dom.removeClass(element, "borderRight");
                ed.dom.removeClass(element, "borderTop");
                ed.dom.removeClass(element, "borderBottom");
                ed.dom.removeClass(element, "borderAll");
            }
        }
    });

Custom button ekleme işlemlerine setup fonksiyonunun içinde başlanmaktadır. addButton fonksiyonu TinyMCE editörü üzerine bir buton eklemektedir. addButton fonksiyonun aldığı ilk parametre menümüz için vereceğimiz benzersiz bir isim olmalıdır. Bu vereceğimiz ismi toolbar özelliğinde kullanacağız.

type değeri olarak menubutton verdiğimizden dolayı ekranda menü şeklinde gözükecektir. Sayfayı çalıştırdığımızda editörümüz aşağıdaki şekilde gözükecektir.

TinyMCE Custom Button

C# ile AutoCAD 2015 eklentileri geliştirme

Okuma Süresi: 2 dakika

AutoCAD 2015 için eklenti geliştirebilmek için ilk önce OrbjectARX kütüphanesini bilgisayarımıza yüklememiz gerekmektedir. ObjectARX indirme sayfasına girdiğimizde formu doldurup ObjectARX for AutoCAD 2015 (32-bit and 64-bit) seçeneğini seçerek kütüphaneyi bilgisayarımıza indirelim ve kurulumunu gerçekleştirelim.

Daha sonra Visual Studio için proje şablonunun kurulma işlemi var. AutoCAD 2015 .NET Wizards eklentisini http://images.autodesk.com/adsk/files/AutoCAD_2015-2016_DotNet_Wizards.zip adresinden indirip bilgisayarınıza kurabilirsiniz.

Kurulum işlemi bittikten sonra Visual Studio’yu çalıştıralım ve File -> New Project (CTRL + Shift + N) komutuna tıklayalım.

Visual Studio AutoCAD Project Template

 

Autodesk sekmesinin altında bulunan AutoCAD 2015 CSharp plugin‘i seçelim ve projemizi oluşturalım. OK tuşuna bastığımızda aşağıdaki gibi bir ekran gelecektir.

AutoCAD .NET Wizard Configurator

Specify the location of the folder inside the ObjectARX SDK that contains AcMgd.dll yazan bölüme ObjectARX’i kurduğumuz klasörün altında bulunan inc klasörünü gösteriyoruz. Benim bilgisayarımda C:\ObjectARX 2015\inc klasörü altında bulunmaktadır.

Specify the AutoCAD executable location yazan bölüme ise AutoCAD’i kurduğumuz klasörü yazıyoruz. Benim bilgisayarımda C:\Program Files\Autodesk\AutoCAD 2015 klasörü altında bulunmaktadır.

Bu değerleri girdikten sonra OK tuşuna basalım ve otomatik olarak projemizin ayarlarının yapılmasını bekleyelim. Projemiz oluşturulduğunda aşağıdaki gibi bir solution’ımız olacaktır.

AutoCAD 2015 Solution Tree

myPlugin sınıfının altında Initialize ve Terminate isminde iki adet metodumuz bulunmaktadır.

Initialize metodu eklentimiz AutoCAD tarafından ilk yüklendiği zaman çalışacak olan metoddur.
Terminate metodu ise AutoCAD tarafından eklentiğimiz sonlandırıldığı zaman çalışacak olan metoddur. Eklentinin yüklenmesinde veya sonlandırılmasında çalışmasını istediğiniz kodları bu alanlara yazabilirsiniz.

myCommands sınıfında ise AutoCAD’in Command kısmında yazarak çalışmasını istediğimiz komutların çalışmasını sağlayan metodların olduğu yerdir.

Şimdi AutoCAD’in mesaj alanına Hello World yazan örnek kod yazalım. Örnek kodumuz aşağıdaki gibidir.

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;

[assembly: CommandClass(typeof(AutoCAD_CSharp_plug_in1.MyCommands))]

namespace AutoCAD_CSharp_plug_in1
{
    public class MyCommands
    {
        [CommandMethod("HelloWorld")]
        public void HelloWorld()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed;
            if (doc != null)
            {
                ed = doc.Editor;
                ed.WriteMessage("Hello World AutoCAD :)");

            }
        }
    }
}

CommandName attribute’üne parametre olarak geçtiğimiz string ifade AutoCAD tarafında komutumuzun ismidir. Daha sonra Document tipinde, doc isminde bir değişken tanımlayarak AutoCAD tarafında aktif olan çizimin nesne örneğini alıyoruz ve WriteMessage metoduyla AutoCAD’in mesaj alanına mesajımızı yazdırıyoruz.

Şimdi Visual Studio üzerinde yazılımımızı çalıştıralım. Eğer kodlarımızda herhangi bir hata yoksa otomatik olarak AutoCAD’de açılacaktır. AutoCAD açıldıktan sonra Command paneline NETLOAD komutunu yazıp Enter tuşuna basalım.

AutoCAD Command Panel

NETLOAD komutu .NET Framework ile geliştirilmiş AutoCAD eklentilerini AutoCAD tarafına yüklenmesini sağlamaktadır. Ekran dosya seçme ekranı gelecektir. Gelen ekranda projemizin derlenmiş DLL dosyasını seçelim.

Choose .NET Assembly

Eğer Security Concern ekranı gelirse Load düğmesine basarak eklentinin yüklenmesini sağlayalım.

Yükleme sırasında herhangi bir problem oluşmadıysa Command Panel alanına HelloWorld yazalım.

Command Panel Hello World

Enter tuşuna bastığımızda mesaj penceresine Hello World AutoCAD 🙂 yazacaktır.

Command Panel Hello World Result

Ayrıca AutoCAD’in .NET Framework API’si ile ilgili daha fazla bilgi almak isterseniz bu sayfadan yararlanabilirsiniz.