app.config ve web.config şifreleme ve şifre çözümü

İyi Günler

Karşılaştığım sıkıntı,  yazdığım bir uygulamanın içinde bulunan app.config dosyasının içeriklerinin şifrelenmesi ve kullanımıdır.

Kısaca app.config ve web.config , uygulamanın yapılandırma dosyasıdır ve  Xml dosya türündedir . Asıl amacı, projenin dışarıdan değişmesi istenilen değişkenlerini rahatlıkla, tekrar derlemeden değiştirmektir.

Örnek olarak ;

Uygulamamızın kullandığı bir pdf derleyici var. Her seferinde, programın adını ve yolunu kullandığımız her yerde değiştirmekle uğraşacağımıza app.config üzerinde belirterek tekrardan kurtuluruz.


   Kod tarafında,  yolun değişmesi ya da pdf derleyicisinin markası fark etmeden istediğimiz zaman çağırabiliriz.

using System.Configuration

System.Configuration (referansta yoksa ekleyin)

Örnek 2;

Veritabanı’na bağlandığımız connection içeriğini değiştirmek istiyorsak (Veri tabanı adı, ip, port… vb);

Kod tarafında, veritabanına bağlantı yaptığımız her yerde connection ‘ı  değiştirmemiz ve tekrar derlememiz gerekir. Bunun yerine  app.config üzerinde bir kez tanımlayıp kod tarafında belirttiğimiz her yerde kullanabiliriz. Önerilen bu yöntemin faydası, gereksiz kod tekrarından ve tekrar derlemeye ihtiyaç duymadan uygulamamızın çalışmasını sağlamaktır.

app.config :

Kod tarafında erişmek için;

 

 

Asıl sorunumuz ise, App.config içerisinde istediğimiz alanları şifrelemektir (ben connectionString alanın şifrelemek istiyorum).

Şifreleme;

1-Projemizin içindeki app.config dosyanın adını web.config olarak değiştiriyoruz (Değiştirmeden önce bir yedek alınız.İşlem sonunda eski adını geri vereceğiz).

2-  Windows + R (Çalıştır) alanına cmd yazıp çalıştırıyoruz.

3- cmd ekranına   cd C:\Windows\Microsoft.NET\Framework\v2.0.50727   yazarak çalıştırıyoruz.

4- Açılan dosyanın içine,

aspnet_regiis.exe -pef  “xml şifrelemek istenen tag” “projenin web.config yolu”

aspnet_regiis.exe -pef “connectionStrings” “C:\Users\Tosun\Desktop\ConnectToAccountancy\ConnectToAccountancy”  işlemi çalıştıralım.

connectionStrings = şifrelemek istediğimiz tag (Ben veritabanı şifreliyorum);

Sonuç;

5- Adını değiştirdiğimiz app.config eski haline getiriyoruz.

app.config  yada web.config dosyasının içine bakıyoruz. Kod tarafında bir şey yapmamıza gerek kalmadan net framework çözümlüyor

Kod tarafında connectionString bu şekilde erişiyoruz. ConnectionString de “name” verdiğimiz adı unutmayın!!!

string connection=ConfigurationManager.ConnectionStrings["HeroData"].ToString();

 

Şifreyi kaldırma;

 

1- app.config adını web.config olarak değiştiriyoruz.

2- windows + R (Çalıştır) alanına cmd yaz ve çalıştır.

3-  cd C:\Windows\Microsoft.NET\Framework\v2.0.50727   çalıştır.

4- aspnet_regiis.exe -pdf “connectionStrings” “C:\Users\Tosun\Desktop\ConnectToAccountancy\ConnectToAccountancy”

5 -web.config adını app.config tekrar eski halina getirelim. Bu şekilde connectionString tekrar görmemize sağlar.

sql tekrar kayıt bulma

İyi günler

Sql ‘de  tekrar eden kayıtları(mükerrer kayıt) bulma

Örnek bir tablo oluşturalım.

1-Kullanıcı adından bir tablo oluşturup(Şekil – 1) ve içini dolduralım.(Şekil – 2)

Şekil – 1

Şekil – 2

2- Oluşturduğumuz kayıtta tekrar eden kayıtları  ve  adlarını da görmek için alttaki kodu yazalım.

SELECT kullanici.adi, COUNT(kullanici.adi) AS TekrarEdenSayi FROM kullanici

GROUP BY adi

HAVING ( COUNT(adi) > 1 );

 

Sonuç olarak yandaki şekilde dönecektir.

 

 

 

3-Karışık bir tablomuzda tekrar etmeyen kayıtları almak istediğimizde

SELECT * FROM kullanici
GROUP BY adi
HAVING ( COUNT(adi) = 1 );

Mysql (uzak ve yerel ağ) bağlantı sorunu

İyi günler

Mysql’e yerel ağdan ve uzaktan bağlanma sorununu  gidermek için yapılması gerekenler:

1- Mysql’e kurulu olduğu makine sabit ip verilmeli.

2-Mysql’in kurulu olduğu makinada port açıkmı kontrol edilmeli.Bunun için;

Başlat —> çalıştır —> cmd —> netstat –  a  yaparak pcdeki portlar dinlenilir.

connection_1Bende ,3306 portu açık “0.0.0.0:3306” bu şekilde olursa haberleşme gerçekleşiyor demektir.

 

3-  Sql sorgu sayfasında aşağıdaki komutları çalıştıralım. 
(Güvenlik için root dışında başka bir kullanıcı tanımlamak gerekli)

a) GRANT ALL PRIVILEGES ON *.* TO 'kullanıcıadı'@'%' IDENTIFIED BY 'şifre'; 
('%' yazan dış ve ya yerel ip yazılabilir. )

b) FLUSH PRIVILEGES;

4- Bağlantı düzgün çalışabilmesi için root ‘a verilen şifre dışında başka bir şifre verilmeli.

c# Wpf’de Hata Ayıklama


İyi günler

Karşılaştığım sıkıntı Wpf  projemde  hata raporlarını görememek ve istediğim alana kaydedememek.

Çözüm için yapılması gerekenler:

1- Wpf Projemizin App.xaml dosyası açılır.

Hata ayıklamak için DispatcherUnhandledException= “UnhandledException”  Application ‘ın  içine eklenir (Resim 1).

wpfde

                                                 Resim -1

2- Wpf Projemizin App.config dosyasına alttaki satırları ekleyerek  değişkenlerimizi kod dışından da rahat değiştirmemizi sağlıyoruz. (Resim 2)

wpfde3

            
                                                                                  Resim - 2
<appSettings>
<add key="error_file" value="errors.txt" />
<add key="stack_file" value="stack.txt" />
</appSettings>

3- Ardından  App.xaml.cs  açılır ve içerisine alttaki kod eklenir.

using System.Windows.Threading;
using System.IO;
using System.Configuration;// ekli değilse

“ConfigurationManager.AppSettings” çalışmaması  durumunda projenin içindeki References –> Sağ Tuş –> Add reference(Reference ekleme) –> Sağ üstte bulunan arama alanına system.configuration yazılır ve ortaya çıkan sonuç tıklanılarak  OK basılır

wpfde4
Resim – 3

                                                         

private void UnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
var time = DateTime.Now;
var path=ConfigurationManager.AppSettings["error_file"]; // kaydedilmek istenilen yer (Bende projenin içine içinde olacak şekilde ayarlı)
File.AppendAllText(path, "\r\n" + string.Format("{0},{1},{2}", time, e.Exception.InnerException.Message, e.Exception.Message) + "\r\n"); //(Kaydedilecek yer  , istenilecek hatalar)
File.AppendAllText(ConfigurationManager.AppSettings["stack_file"], time + ":\n" + e.Exception.StackTrace + "\n");
e.Handled = false;
}

4-Error.txt dosyasını  açalım (Resim 4).

wpfde5

                    Resim – 4

c# wpf textbox içerikleri

İyi günler

Karşılaştığım sıkıntı , WPF Projemde oluşturduğum Textbox ‘ ın istediğim kısıtlamaların ayarlanması.

Bir örnekle açıklayalım.

1- TESTPROJE diye yeni bir proje oluşturalım.

wpf_1i

 

2- Oluşturduğumuz projenin içine TextBox öğesi ekleyelim.

wpf_2

 

3-Oluşturduğumuz Texbox ‘ın  PreviewTextInput(Metin girişini dinlememizi sağlar. PreviewTextInput; konuşma, el yazısı ve diğer giriş aygıtlarını da  dinleyebilir .) event sınıfı ile ilişkilendirelim.

wpf_3

 

4- Textbox ‘ın sadece numara yazmasını istiyorsak oluşturduğumuz ctlOrnekTxt_PreviewTextInput event(Olay) ‘in içine yazıyoruz

Namespace:   System.Text.RegularExpressions
Assembly:  System (in System.dll)

using System.Text.RegularExpressions;

a .  Rakam

private void ctlOrnekTxt_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
Regex regex = new Regex(“[^0-9]+”); // Girilebilecek rakam aralığı
e.Handled = regex.IsMatch(e.Text); // Girilen karakterin okunması ve eşleşip ekrana basılmasını sağlar.

/// Doğru yazımı

e.Handled = new Regex(@”[^0-9]+”).IsMatch(e.Text);
}

b. Ondalıklı(Decimal) Sayı  (“.” , “,”) kullanıma göre ayarlanmıştır

private void ctlOrnekTxt_PreviewTextInput(object sender, TextCompositionEventArgs e)

{

Regex regex = new Regex(@”(\+|-)?[0-9][0-9]*(\,[0-9]*)?(\.[0-9]*)?”);
e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));

}

c. Sadece harf

private void ctlOrnekTxt_PreviewTextInput(object sender, TextCompositionEventArgs e)

{

e.Handled = new Regex(@”^[0-9\\s]+”).IsMatch(e.Text);

}

d.Sadece harf ve istenilen karaktere izin verilmesi. (alternetif çözüm olarak)

 private void ctlOrnekTxt_PreviewTextInput(object sender, KeyEventArgs e)
 {
 e.Handled = new Regex(@"^[0-9,!\\s]+").IsMatch(e.Text);
 }

  Alternatif çözüm
 private void ctlOrnekTxt_PreviewTextInput(object sender, KeyEventArgs e)
 { 
 e.Handled = !isCharKey(e.Key) && !isPermisionKey(e.Key);
 }

 private bool isCharKey(Key inKey)
 {
 if (inKey < Key.A || inKey > Key.Oem8 )
 {
 
 if (inKey < Key.NumPad0 || inKey > Key.NumPad9)
 {
 return false;
 }
 }
 return true;
 }
 private bool isPermisionKey(Key inKey)
 {
 return inKey == Key.Delete || inKey == Key.Back 
     || inKey == Key.Tab || inKey ==Key.Space;
 }


wpf_4

Mysql ve TRUNCATE 1071 Hatası

Truncate , istenilen tablonun içini  her hangi bir koşul belirtmeden tüm veriyi temizlemeye yarar.

TRUNCATE [TABLE] tbl_name şeklinde yazılır .

   DELETE,Truncate komutu ile karıştırılır. Aralarındaki fark ise ;

   Delete komutu, belirtilen hücre,  satır, sütün veya tablonun içindeki verileri silmeye yarar (Delete komutu bir koşula  da bağlanabilir) ve  silinen tablodaki Primary key  ve auto increment (Otomatik Artan Numara) alanı en son kaldığı değerden devam  eder.

   Truncate komutu , tabloya ait veriyi serbest bırakır, böylece tüm satırları tek seferde siler ve transaction log serbest bırakma işlemini tutar. Bu yüzden veri ne kadar büyük olursa olsun çok hızlı çalışır.(Truncate komutu koşula bağlanmaz)  ve silinen tablodaki Primary key ve Auto increment değerleri sıfırlanır.

 

Örnek olarak

Araçlarımızın renklerini tutan bir veri tabanı  kurgulayalım.

1- Veri tabanımızın adı : aracrenkleridatabase_name

 

 

 

2- Renkler(Şekil 1) ve araba(Şekil 2) gösteren  iki adet tablo oluşturalım.

renkler

Şekil 1

araba

 Şekil 2

3- Bu iki tablo arasındaki ilişkiyi (Foreign Keyforeign) sağlayalım.

iliski

4- İlişkiyi kurduğumuza göre birkaç tane veri girelim

renkVeri     arabaVeri

 

5- Silmek istediğimiz tabloyu belirledikten sonra komutumuzu sorgu satırına yazalım.

Truncate aracmodel.araba;

Yaptığınızda sorunsuz silecektir . İlişkinin olduğu tabloda ise kısıtlamalardan dolayı hata verecektir.

Truncate aracmodel.renk;

Error Code: 1701. Cannot truncate a table referenced in a foreign key constraint (`aracmodel`.`araba`, CONSTRAINT `araba_ibfk_1` FOREIGN KEY (`renk_id`) REFERENCES `aracmodel`.`renk` (`id`))

Çözüm  1 ;

1 – İlişkileri keselim.

2- Truncate çalıştıralım.

3- İlişkisi olan diğer tablodaki verileri Delete ile silelim.

4- İlişkileri tekrar kuralım.

Çözüm 2;

SET FOREIGN_KEY_CHECKS = 0; 
Truncate aracmodel.renk;
TRUNCATE [TABLE] tbl_name;
TRUNCATE [TABLE] tbl_name2;
TRUNCATE [TABLE] tbl_name3;
...
..
..  
SET FOREIGN_KEY_CHECKS = 1;

Şimdi ikisi arasındaki farka gelince çözüm 2 ,çözüm 1 ‘e göre daha risklidir ;veriye zarar verme riski taşır.Silme işlemi sırasında veri tabanı işlem yapmıyorsa çözüm 2 ‘yi daha hızlı ve komutun Global olmaması daha kullanışlı hale getirir.