Sağ Tuş Hesap Makinesi

by Oguz Koroglu 3. October 2010 14:54
Şu sağ tuş ile açılan hesap makinesi Class Library 'si bir çok uygulamada kullandığım çok değerli bir kütüphanedir. Bir datagridview içindeki bir hücrenin veya bir textbox nesnesinin içindeki matematiksel hesabın otomatik olarak sonuca dönüşmesi gerektiği durumlar için geliştidim. İlk böyle bir uygulamayı SAP2000 sonlu eleman ve statik hesap yazılımında gördüm. Textboxlar içerisindeki değerleri otomatik olarak hesaplamaktaydılar. Ben dahada ileri gidip, o textbox lara sağ tıklanınca açılan ve hesabı edit edebileceğimiz bir hesap makinesi class 'ı yazdım :). İlk olarak bir string içinde yazılmış işlemin (script'in) evaluate edilmesi gerekmektedir. .NET Framework'ten bile daha eski olan MSScriptControl COM Object nesnesi bu işi başarıyla yapmaktadır, eskiden emektar Visual Basic 6.0 içinde geliştirilen yazılımlarda pek kullanırdım. Şimdi artık bunlar pek demode oldu artık Microsoft.Vsa.Vb.CodeDOM diye bir namespace var ki bu namespace bile Visual Studio 2010 için obsolete olmuş durumdadır. Bu namespace içinde bulunan VBCodeProvider class 'ı da bu işleri yapabilirdi. Yanlız ben yine de emektar MSScriptControl COM Object nesneme sağdık kalacağım. Şimdi bu nesneyi Class Library uygulamamıza resimde görüldüğü gibi ekleyelim. Bu güzel hareketten sonra ilk resmimizde görüldüğü gibi bir arayüz tasarlayalım, bu bizim DialogWindow 'umuzdur, sağ tuşa tıklayınca bunun mouse cursor 'ının olduğu yerde açılmasını istiyoruz. Bu arayüzün içine MSScriptControl Nesnesi ile çalışan bir hesaplama metodu ekleyelim. Private Function CalculateMe(ByVal pCalculation As String) As String Try CalculateMe = pCalculation 'stringlerdeki formülleri calcule eder Dim ReturnValue As Single Dim AcParantez As New ArrayList, KapaParantez As New ArrayList Dim Uz As Long = pCalculation.Length Dim i1 As Long Dim SC As New MSScriptControl.ScriptControl SC.Language = "VBScript" For i1 = 1 To Uz If Mid(pCalculation, i1, 1) = "(" Then AcParantez.Add(i1) End If Next i1 For i1 = 1 To Uz If Mid(pCalculation, i1, 1) = STRFunc.LocalSep Then Mid(pCalculation, i1, 1) = "." End If Next i1 For i1 = Uz To 1 Step -1 If Mid(pCalculation, i1, 1) = ")" Then KapaParantez.Add(i1) End If Next i1 If AcParantez.Count <> KapaParantez.Count Then Return 0 ReturnValue = Math.Round(SC.Eval(pCalculation), 2) Return ReturnValue Catch exx As Exception End Try End Function   Bu metod input olarak aldığı string 'i bir hesap olarak algılar (vbscript) ve sonuç olarak bir yanıt döndürür. İçinde tüm visual basic operatörlerini (sin, sinh, cos, log gibi...) kullanmak pek mümkündür, bu nedenle bu metodu bilimsel hesap içinde kullanabiliriz. Hatta bu string mantıksal hesap içinde çalışmaktadır, input olarak "1=2" gönderilirse yanıt false veya 0 döndürülebilmektedir. Constructor 'umuza da, mouse cursor 'ına göre formumuzun belirmesini ayarlamak içinde aşağıdaki satırları ekleyelim. Private LocX As Single, LocY As Single Public GetItem() As CalcItemType Public ReadOnly Property ReturnValue() As String Get Return TextBox1.Text End Get End Property Public Sub New(ByVal pX As Single, ByVal pY As Single, ByVal pText As String) ' This call is required by the Windows Form Designer. InitializeComponent() ' Add any initialization after the InitializeComponent() call. LocX = pX - 20 LocY = pY - 20 Me.TextBox1.Text = pText Button19.Text = STRFunc.LocalSep End Sub   Tabi bu satırlar içinde bulunan ReturnValue Property 'si bir adet sonuçtur. Hesap tamamlandıktan parent form üzerinde sonra sağ tıkladığımız alan neresiyse, onun içeriği bu değere eşitlenebilir. Zaten sağ tuş hesap makinesininde asıl amacı budur. Bir de tabiki yuklarıda STRFunc.LocalSep diye bir property Button19.Text 'e atanmıştır. Bu sadece, o an çalışan bilgisayarın regional settings 'i içerisinde bulunan sayıların ondalık ayıracını döndüren bir metoddur. Uzun uzun "System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator" yazmamak için kısalttım :). Son olarak Load Eventinin Handler'ına olarak belirttiğim LocX ve LocY değerlerinin hesaplatalım ki sağ tuşa tıklanıldığında, tam tıkladığımız yerde bu dialog açılsın, tabi bunu istemiyorsak yazmayabiliriz de. Opsiyonel :). 'yer belirleme If LocX + Me.Width > Screen.PrimaryScreen.WorkingArea.Right Then LocX -= LocX + Me.Width - Screen.PrimaryScreen.WorkingArea.Right If LocY + Me.Height > Screen.PrimaryScreen.WorkingArea.Bottom Then LocY -= LocY + Me.Height - Screen.PrimaryScreen.WorkingArea.Bottom Me.Top = LocY : Me.Left = LocX   Bu bir FormDialog olduğuna göre OK ve Cancel Buttonlarımız var veya olmalı. sonuç olarak kullanıcı belkide bu işlemi iptal edecektir, yaptığı şeyden vazgeçecek olabilir. Ama OK basılırsa hemen Textbox1 içerisinde bulunan string hesaplansın ve değerine dönüşsün diye belirttim. Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click Try Me.TextBox1.Text = CalculateMe(Me.TextBox1.Text) Catch exx As Exception End Try Me.DialogResult = System.Windows.Forms.DialogResult.OK Me.Close() End Sub Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click Me.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.Close() End Sub   Artık gerisi size kalmış, sayı ve operatör butonlarınıda textbox1 nesnesinin Text Propertysine bağlayarak Class Librarynizi uygulamalarınıza eklenir hale getirebilirsiniz. Bu zihniyet aslında benim Windows Mobile 6 Hesap Makinesi yazımda anlattığım uygulamanın temelidir. Yanlız o uygulamada MSScriptControl reference olarak .NET Compact Framework tarafından kabul edilmediğinden dolayı, bu nesnenin yaptığı iş başa düşmüş bir matematical evaluator class 'ı yazılmıştır. Bu uygulamaya ait kaynak kodlarını Visual Studio 2008 Solution dosyası olarak VB.NET dilinde indirmek için SagTusHesapMakinesi.rar dosyasına tıklayın.

Tags:

Compression / Decompression

by Oguz Koroglu 26. September 2010 10:32
WINRAR :   WINRAR Russian Girls Herkesin ilk aklına gelen program bu olur heralde, WinRAR. Yıllardır her formatta sıkıştırılmış dosyayı bize açtı. Bazıları için format attıktan sonra, işletim sisteminden sonra ilk kurdukları program oldu. Sadece bir sağ tık ile kendi rar, zip vb… gibi arşivler oluşturmamızı sağladı. Dosyalarımızı yedekledik, parçalara ayırdık, şifreledik. Böylece internetten yollamak veya flashdisklerimize sığdırmak, CD’lere DVD’lere sığdırmak kolay bir hal aldı. Bunun dışında Winzip, 7Zip vb… gibi bir çok program mevcuttur. Hatta 7zip açık kaynak bir yazılımdır. Peki bu WinRAR’ ın arkasında ne var, nasıl çalışır, kendimizde bir takım dosya sıkıştırmaları algoritmaları yazabilirmiyiz acaba?  Böyle bir şeyi yazmış olmak, bize yazdığımız yazılım içinde bir takım dosyaları programatik olarak sıkıştırma yapabilmemizi sağlar. Bunları kullanıcı ara yüzleriyle birleştirebiliriz, direk winRAR benzeri bir uygulama geliştirebiliriz veya kullanıcıya hiç haber vermeden kendi kaydettiğimiz dosyaları program içinde sıkıştırabiliriz. Sunucu içinde çalışıyorsak, bir takım upload edilmiş dosyaları bu tarz algoritmalar ile sıkıştırılmış yedeklerini anlık veya ileri zamanlanmış olarak alabiliriz. İlk Gözağrım Huffman: Ben ilk olarak yazdığım bir Visual Basic 6.0 programı(ları)nın içerisinde böyle bir algoritmaya ihtiyaç duydum ozaman aşağıda kaynak kodları bulunan Huffman sıkıştıma Class ‘ımı kullanmaktaydım. Option Explicit 'Progress Values for the encoding routine Private Const PROGRESS_CALCFREQUENCY = 7 Private Const PROGRESS_CALCCRC = 5 Private Const PROGRESS_ENCODING = 88 'Progress Values for the decoding routine Private Const PROGRESS_DECODING = 89 Private Const PROGRESS_CHECKCRC = 11 'Events Event Progress(Procent As Integer) Private Type HUFFMANTREE ParentNode As Integer RightNode As Integer LeftNode As Integer Value As Integer Weight As Long End Type Private Type ByteArray Count As Byte Data() As Byte End Type Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Public Sub EncodeFile(SourceFile As String, DestFile As String) Dim ByteArray() As Byte Dim Filenr As Integer 'Make sure the source file exists If (Not FileExist(SourceFile)) Then Err.Raise vbObjectError, "clsHuffman.EncodeFile()", "Source file does not exist" End If 'Read the data from the sourcefile Filenr = FreeFile Open SourceFile For Binary As #Filenr ReDim ByteArray(0 To LOF(Filenr) - 1) Get #Filenr, , ByteArray() Close #Filenr 'Compress the data Call EncodeByte(ByteArray(), UBound(ByteArray) + 1) 'If the destination file exist we need to 'destroy it because opening it as binary 'will not clear the old data If (FileExist(DestFile)) Then Kill DestFile 'Save the destination string Open DestFile For Binary As #Filenr Put #Filenr, , ByteArray() Close #Filenr End Sub Public Sub DecodeFile(SourceFile As String, DestFile As String) Dim ByteArray() As Byte Dim Filenr As Integer 'Make sure the source file exists If (Not FileExist(SourceFile)) Then Err.Raise vbObjectError, "clsHuffman.DecodeFile()", "Source file does not exist" End If 'Read the data from the sourcefile Filenr = FreeFile Open SourceFile For Binary As #Filenr ReDim ByteArray(0 To LOF(Filenr) - 1) Get #Filenr, , ByteArray() Close #Filenr 'Uncompress the data Call DecodeByte(ByteArray(), UBound(ByteArray) + 1) 'If the destination file exist we need to 'destroy it because opening it as binary 'will not clear the old data If (FileExist(DestFile)) Then Kill DestFile 'Save the destination string Open DestFile For Binary As #Filenr Put #Filenr, , ByteArray() Close #Filenr End Sub Private Sub CreateTree(Nodes() As HUFFMANTREE, NodesCount As Long, Char As Long, Bytes As ByteArray) Dim A As Integer Dim NodeIndex As Long NodeIndex = 0 For A = 0 To (Bytes.Count - 1) If (Bytes.Data(A) = 0) Then 'Left node If (Nodes(NodeIndex).LeftNode = -1) Then Nodes(NodeIndex).LeftNode = NodesCount Nodes(NodesCount).ParentNode = NodeIndex Nodes(NodesCount).LeftNode = -1 Nodes(NodesCount).RightNode = -1 Nodes(NodesCount).Value = -1 NodesCount = NodesCount + 1 End If NodeIndex = Nodes(NodeIndex).LeftNode ElseIf (Bytes.Data(A) = 1) Then 'Right node If (Nodes(NodeIndex).RightNode = -1) Then Nodes(NodeIndex).RightNode = NodesCount Nodes(NodesCount).ParentNode = NodeIndex Nodes(NodesCount).LeftNode = -1 Nodes(NodesCount).RightNode = -1 Nodes(NodesCount).Value = -1 NodesCount = NodesCount + 1 End If NodeIndex = Nodes(NodeIndex).RightNode Else Stop End If Next Nodes(NodeIndex).Value = Char End Sub Public Sub EncodeByte(ByteArray() As Byte, ByteLen As Long) Dim i As Long Dim j As Long Dim Char As Byte Dim BitPos As Byte Dim lNode1 As Long Dim lNode2 As Long Dim lNodes As Long Dim lLength As Long Dim Count As Integer Dim lWeight1 As Long Dim lWeight2 As Long Dim Result() As Byte Dim ByteValue As Byte Dim ResultLen As Long Dim Bytes As ByteArray Dim NodesCount As Integer Dim NewProgress As Integer Dim CurrProgress As Integer Dim BitValue(0 To 7) As Byte Dim CharCount(0 To 255) As Long Dim Nodes(0 To 511) As HUFFMANTREE Dim CharValue(0 To 255) As ByteArray 'If the source string is empty or contains 'only one character we return it uncompressed 'with the prefix string "HEO" & vbCr If (ByteLen = 0) Then ReDim Preserve ByteArray(0 To ByteLen + 3) If (ByteLen > 0) Then Call CopyMem(ByteArray(4), ByteArray(0), ByteLen) End If ByteArray(0) = 72 '"H" ByteArray(1) = 69 '"E" ByteArray(2) = 48 '"0" ByteArray(3) = 13 'vbCr Exit Sub End If 'Create the temporary result array and make 'space for identifier, checksum, textlen and 'the ASCII values inside the Huffman Tree ReDim Result(0 To 522) 'Prefix the destination string with the '"HE3" & vbCr identification string Result(0) = 72 Result(1) = 69 Result(2) = 51 Result(3) = 13 ResultLen = 4 'Count the frequency of each ASCII code For i = 0 To (ByteLen - 1) CharCount(ByteArray(i)) = CharCount(ByteArray(i)) + 1 If (i Mod 1000 = 0) Then NewProgress = i / ByteLen * PROGRESS_CALCFREQUENCY If (NewProgress <> CurrProgress) Then CurrProgress = NewProgress RaiseEvent Progress(CurrProgress) End If End If Next 'Create a leaf for each character For i = 0 To 255 If (CharCount(i) > 0) Then With Nodes(NodesCount) .Weight = CharCount(i) .Value = i .LeftNode = -1 .RightNode = -1 .ParentNode = -1 End With NodesCount = NodesCount + 1 End If Next 'Create the Huffman Tree For lNodes = NodesCount To 2 Step -1 'Get the two leafs with the smallest weights lNode1 = -1: lNode2 = -1 For i = 0 To (NodesCount - 1) If (Nodes(i).ParentNode = -1) Then If (lNode1 = -1) Then lWeight1 = Nodes(i).Weight lNode1 = i ElseIf (lNode2 = -1) Then lWeight2 = Nodes(i).Weight lNode2 = i ElseIf (Nodes(i).Weight < lWeight1) Then If (Nodes(i).Weight < lWeight2) Then If (lWeight1 < lWeight2) Then lWeight2 = Nodes(i).Weight lNode2 = i Else lWeight1 = Nodes(i).Weight lNode1 = i End If Else lWeight1 = Nodes(i).Weight lNode1 = i End If ElseIf (Nodes(i).Weight < lWeight2) Then lWeight2 = Nodes(i).Weight lNode2 = i End If End If Next 'Create a new leaf With Nodes(NodesCount) .Weight = lWeight1 + lWeight2 .LeftNode = lNode1 .RightNode = lNode2 .ParentNode = -1 .Value = -1 End With 'Set the parentnodes of the two leafs Nodes(lNode1).ParentNode = NodesCount Nodes(lNode2).ParentNode = NodesCount 'Increase the node counter NodesCount = NodesCount + 1 Next 'Traverse the tree to get the bit sequence 'for each character, make temporary room in 'the data array to hold max theoretical size ReDim Bytes.Data(0 To 255) Call CreateBitSequences(Nodes(), NodesCount - 1, Bytes, CharValue) 'Calculate the length of the destination 'string after encoding For i = 0 To 255 If (CharCount(i) > 0) Then lLength = lLength + CharValue(i).Count * CharCount(i) End If Next lLength = IIf(lLength Mod 8 = 0, lLength \ 8, lLength \ 8 + 1) 'If the destination is larger than the source 'string we leave it uncompressed and prefix 'it with a 4 byte header ("HE0" & vbCr) If ((lLength = 0) Or (lLength > ByteLen)) Then ReDim Preserve ByteArray(0 To ByteLen + 3) Call CopyMem(ByteArray(4), ByteArray(0), ByteLen) ByteArray(0) = 72 ByteArray(1) = 69 ByteArray(2) = 48 ByteArray(3) = 13 Exit Sub End If 'Add a simple checksum value to the result 'header for corruption identification Char = 0 For i = 0 To (ByteLen - 1) Char = Char Xor ByteArray(i) If (i Mod 10000 = 0) Then NewProgress = i / ByteLen * PROGRESS_CALCCRC + PROGRESS_CALCFREQUENCY If (NewProgress <> CurrProgress) Then CurrProgress = NewProgress RaiseEvent Progress(CurrProgress) End If End If Next Result(ResultLen) = Char ResultLen = ResultLen + 1 'Add the length of the source string to the 'header for corruption identification Call CopyMem(Result(ResultLen), ByteLen, 4) ResultLen = ResultLen + 4 'Create a small array to hold the bit values, 'this is faster than calculating on-fly For i = 0 To 7 BitValue(i) = 2 ^ i Next 'Store the number of characters used Count = 0 For i = 0 To 255 If (CharValue(i).Count > 0) Then Count = Count + 1 End If Next Call CopyMem(Result(ResultLen), Count, 2) ResultLen = ResultLen + 2 'Store the used characters and the length 'of their respective bit sequences Count = 0 For i = 0 To 255 If (CharValue(i).Count > 0) Then Result(ResultLen) = i ResultLen = ResultLen + 1 Result(ResultLen) = CharValue(i).Count ResultLen = ResultLen + 1 Count = Count + 16 + CharValue(i).Count End If Next 'Make room for the Huffman Tree in the 'destination byte array ReDim Preserve Result(0 To ResultLen + Count \ 'Store the Huffman Tree into the result 'converting the bit sequences into bytes BitPos = 0 ByteValue = 0 For i = 0 To 255 With CharValue(i) If (.Count > 0) Then For j = 0 To (.Count - 1) If (.Data(j)) Then ByteValue = ByteValue + BitValue(BitPos) BitPos = BitPos + 1 If (BitPos = Then Result(ResultLen) = ByteValue ResultLen = ResultLen + 1 ByteValue = 0 BitPos = 0 End If Next End If End With Next If (BitPos > 0) Then Result(ResultLen) = ByteValue ResultLen = ResultLen + 1 End If 'Resize the destination string to be able to 'contain the encoded string ReDim Preserve Result(0 To ResultLen - 1 + lLength) 'Now we can encode the data by exchanging each 'ASCII byte for its appropriate bit string. Char = 0 BitPos = 0 For i = 0 To (ByteLen - 1) With CharValue(ByteArray(i)) For j = 0 To (.Count - 1) If (.Data(j) = 1) Then Char = Char + BitValue(BitPos) BitPos = BitPos + 1 If (BitPos = Then Result(ResultLen) = Char ResultLen = ResultLen + 1 BitPos = 0 Char = 0 End If Next End With If (i Mod 10000 = 0) Then NewProgress = i / ByteLen * PROGRESS_ENCODING + PROGRESS_CALCCRC + PROGRESS_CALCFREQUENCY If (NewProgress <> CurrProgress) Then CurrProgress = NewProgress RaiseEvent Progress(CurrProgress) End If End If Next 'Add the last byte If (BitPos > 0) Then Result(ResultLen) = Char ResultLen = ResultLen + 1 End If 'Return the destination in string format ReDim ByteArray(0 To ResultLen - 1) Call CopyMem(ByteArray(0), Result(0), ResultLen) 'Make sure we get a "100%" progress message If (CurrProgress <> 100) Then RaiseEvent Progress(100) End If End Sub Public Function DecodeString(Text As String) As String Dim ByteArray() As Byte 'Convert the string to a byte array ByteArray() = StrConv(Text, vbFromUnicode) 'Compress the byte array Call DecodeByte(ByteArray, Len(Text)) 'Convert the compressed byte array to a string DecodeString = StrConv(ByteArray(), vbUnicode) End Function Public Function EncodeString(Text As String) As String Dim ByteArray() As Byte 'Convert the string to a byte array ByteArray() = StrConv(Text, vbFromUnicode) 'Compress the byte array Call EncodeByte(ByteArray, Len(Text)) 'Convert the compressed byte array to a string EncodeString = StrConv(ByteArray(), vbUnicode) End Function Public Sub DecodeByte(ByteArray() As Byte, ByteLen As Long) Dim i As Long Dim j As Long Dim Pos As Long Dim Char As Byte Dim CurrPos As Long Dim Count As Integer Dim CheckSum As Byte Dim Result() As Byte Dim BitPos As Integer Dim NodeIndex As Long Dim ByteValue As Byte Dim ResultLen As Long Dim NodesCount As Long Dim lResultLen As Long Dim NewProgress As Integer Dim CurrProgress As Integer Dim BitValue(0 To 7) As Byte Dim Nodes(0 To 511) As HUFFMANTREE Dim CharValue(0 To 255) As ByteArray If (ByteArray(0) <> 72) Or (ByteArray(1) <> 69) Or (ByteArray(3) <> 13) Then 'The source did not contain the identification 'string "HE?" & vbCr where ? is undefined at 'the moment (does not matter) ElseIf (ByteArray(2) = 48) Then 'The text is uncompressed, return the substring 'Decode = Mid$(Text, 5) Call CopyMem(ByteArray(0), ByteArray(4), ByteLen - 4) ReDim Preserve ByteArray(0 To ByteLen - 5) Exit Sub ElseIf (ByteArray(2) <> 51) Then 'This is not a Huffman encoded string Err.Raise vbObjectError, "HuffmanDecode()", "The data either was not compressed with HE3 or is corrupt (identification string not found)" Exit Sub End If CurrPos = 5 'Extract the checksum CheckSum = ByteArray(CurrPos - 1) CurrPos = CurrPos + 1 'Extract the length of the original string Call CopyMem(ResultLen, ByteArray(CurrPos - 1), 4) CurrPos = CurrPos + 4 lResultLen = ResultLen 'If the compressed string is empty we can 'skip the function right here If (ResultLen = 0) Then Exit Sub 'Create the result array ReDim Result(0 To ResultLen - 1) 'Get the number of characters used Call CopyMem(Count, ByteArray(CurrPos - 1), 2) CurrPos = CurrPos + 2 'Get the used characters and their 'respective bit sequence lengths For i = 1 To Count With CharValue(ByteArray(CurrPos - 1)) CurrPos = CurrPos + 1 .Count = ByteArray(CurrPos - 1) CurrPos = CurrPos + 1 ReDim .Data(0 To .Count - 1) End With Next 'Create a small array to hold the bit values, 'this is (still) faster than calculating on-fly For i = 0 To 7 BitValue(i) = 2 ^ i Next 'Extract the Huffman Tree, converting the 'byte sequence to bit sequences ByteValue = ByteArray(CurrPos - 1) CurrPos = CurrPos + 1 BitPos = 0 For i = 0 To 255 With CharValue(i) If (.Count > 0) Then For j = 0 To (.Count - 1) If (ByteValue And BitValue(BitPos)) Then .Data(j) = 1 BitPos = BitPos + 1 If (BitPos = Then ByteValue = ByteArray(CurrPos - 1) CurrPos = CurrPos + 1 BitPos = 0 End If Next End If End With Next If (BitPos = 0) Then CurrPos = CurrPos - 1 'Create the Huffman Tree NodesCount = 1 Nodes(0).LeftNode = -1 Nodes(0).RightNode = -1 Nodes(0).ParentNode = -1 Nodes(0).Value = -1 For i = 0 To 255 Call CreateTree(Nodes(), NodesCount, i, CharValue(i)) Next 'Decode the actual data ResultLen = 0 For CurrPos = CurrPos To ByteLen ByteValue = ByteArray(CurrPos - 1) For BitPos = 0 To 7 If (ByteValue And BitValue(BitPos)) Then NodeIndex = Nodes(NodeIndex).RightNode Else NodeIndex = Nodes(NodeIndex).LeftNode End If If (Nodes(NodeIndex).Value > -1) Then Result(ResultLen) = Nodes(NodeIndex).Value ResultLen = ResultLen + 1 If (ResultLen = lResultLen) Then GoTo DecodeFinished NodeIndex = 0 End If Next If (CurrPos Mod 10000 = 0) Then NewProgress = CurrPos / ByteLen * PROGRESS_DECODING If (NewProgress <> CurrProgress) Then CurrProgress = NewProgress RaiseEvent Progress(CurrProgress) End If End If Next DecodeFinished: 'Verify data to check for corruption. Char = 0 For i = 0 To (ResultLen - 1) Char = Char Xor Result(i) If (i Mod 10000 = 0) Then NewProgress = i / ResultLen * PROGRESS_CHECKCRC + PROGRESS_DECODING If (NewProgress <> CurrProgress) Then CurrProgress = NewProgress RaiseEvent Progress(CurrProgress) End If End If Next If (Char <> CheckSum) Then Err.Raise vbObjectError, "clsHuffman.Decode()", "The data might be corrupted (checksum did not match expected value)" End If 'Return the uncompressed string ReDim ByteArray(0 To ResultLen - 1) Call CopyMem(ByteArray(0), Result(0), ResultLen) 'Make sure we get a "100%" progress message If (CurrProgress <> 100) Then RaiseEvent Progress(100) End If End Sub Private Sub CreateBitSequences(Nodes() As HUFFMANTREE, ByVal NodeIndex As Integer, Bytes As ByteArray, CharValue() As ByteArray) Dim NewBytes As ByteArray 'If this is a leaf we set the characters bit 'sequence in the CharValue array If (Nodes(NodeIndex).Value > -1) Then CharValue(Nodes(NodeIndex).Value) = Bytes Exit Sub End If 'Traverse the left child If (Nodes(NodeIndex).LeftNode > -1) Then NewBytes = Bytes NewBytes.Data(NewBytes.Count) = 0 NewBytes.Count = NewBytes.Count + 1 Call CreateBitSequences(Nodes(), Nodes(NodeIndex).LeftNode, NewBytes, CharValue) End If 'Traverse the right child If (Nodes(NodeIndex).RightNode > -1) Then NewBytes = Bytes NewBytes.Data(NewBytes.Count) = 1 NewBytes.Count = NewBytes.Count + 1 Call CreateBitSequences(Nodes(), Nodes(NodeIndex).RightNode, NewBytes, CharValue) End If End Sub Private Function FileExist(FileName As String) As Boolean On Error GoTo FileDoesNotExist Call FileLen(FileName) FileExist = True Exit Function FileDoesNotExist: FileExist = False End Function   Hala daha Visual Basic 6.0 IDE’sini kullananlar varsa bu algoritmayı kullanabilirler . Yanlız feci yavaş çalışır, baştan söylemek gerekir, o günler için iyiydi ama. Peki şimdi .NET tarafında neler yapabiliriz. .NET Framework ile Dosya Sıkıştırma ve Açma : .NET Framework 4.0 ile elimizde iki adet class var. Bunlar System.IO.Compression namespace ’i altında bulunan System.IO.Compression.GZipStream ve System.IO.Compression.DeflateStream classlarımız. GZip ile yaptığımız sıkıştırmalar bir çok sıkıştırma programı tarafında rahatlıkla algılanacaktır. MSDN de bulunan örneklerden GZipStream Console Application örneğini inceleyelim. C# : using System; using System.IO; using System.IO.Compression; namespace zip { public class Program { public static void Main() { // sıkıştırılacak dosyaların klasörü string dirpath = @"c:\users\public\reports"; DirectoryInfo di = new DirectoryInfo(dirpath); // klasördekileri sıkıştırma işlemi foreach (FileInfo fi in di.GetFiles()) { Compress(fi); } // tüm ".*gz" dosyalarını dışarı çıkar foreach (FileInfo fi in di.GetFiles("*.gz")) { Decompress(fi); } } public static void Compress(FileInfo fi) { // Kaynak dosyanın streamini alalım using (FileStream inFile = fi.OpenRead()) { // gizli ve zaten sıkıştırılmış dosyaların içeri girmesini engelleyelim if ((File.GetAttributes(fi.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fi.Extension != ".gz") { // Sıkıştırılmış dosyayı oluşturalım using (FileStream outFile = File.Create(fi.FullName + ".gz")) { using (GZipStream Compress = new GZipStream(outFile, CompressionMode.Compress)) { // kaynağı sıkıştırılmış kaynağın üzerine kopyalayalım. inFile.CopyTo(Compress); Console.WriteLine("Compressed {0} from {1} to {2} bytes.", fi.Name, fi.Length.ToString(), outFile.Length.ToString()); } } } } } public static void Decompress(FileInfo fi) { // kaynak dosyanın streamini alalım using (FileStream inFile = fi.OpenRead()) { // orjinal uzantıyı bulalım string curFile = fi.FullName; string origName = curFile.Remove(curFile.Length - fi.Extension.Length); //açılan dosyayı oluşturalım. using (FileStream outFile = File.Create(origName)) { using (GZipStream Decompress = new GZipStream(inFile, CompressionMode.Decompress)) { // açılmış streami çıktı dosyamıza kopyalayalım. Decompress.CopyTo(outFile); Console.WriteLine("Decompressed: {0}", fi.Name); } } } } } } VB: Imports System.IO Imports System.IO.Compression Module Module1 Sub Main() Dim dirpath As String = "c:\users\public\reports" Dim di As DirectoryInfo = New DirectoryInfo(dirpath) For Each fi As FileInfo In di.GetFiles() Compress(fi) Next For Each fi As FileInfo In di.GetFiles("*.gz") Decompress(fi) Next End Sub Private Sub Compress(ByVal fi As FileInfo) Using inFile As FileStream = fi.OpenRead() If (File.GetAttributes(fi.FullName) And FileAttributes.Hidden) _ <> FileAttributes.Hidden And fi.Extension <> ".gz" Then Using outFile As FileStream = File.Create(fi.FullName + ".gz") Using Compress As GZipStream = _ New GZipStream(outFile, CompressionMode.Compress) inFile.CopyTo(Compress) Console.WriteLine("Compressed {0} from {1} to {2} bytes.", _ fi.Name, fi.Length.ToString(), outFile.Length.ToString()) End Using End Using End If End Using End Sub Private Sub Decompress(ByVal fi As FileInfo) Using inFile As FileStream = fi.OpenRead() Dim curFile As String = fi.FullName Dim origName = curFile.Remove(curFile.Length - fi.Extension.Length) Using outFile As FileStream = File.Create(origName) Using Decompress As GZipStream = New GZipStream(inFile, _ CompressionMode.Decompress) Decompress.CopyTo(outFile) Console.WriteLine("Decompressed: {0}", fi.Name) End Using End Using End Using End Sub End Module   NET Framework ile görüldüğü gibi iş daha kısaldı. Ama bu kodların ne yaptığına dikkat etmeniz lazım, bu örnekte bir dosya -> bir “.gz” uzantılı sıkıştırılmış dosya tipine dönüştyürülüyor. Eğer komplike, şifrelenmiş, birden çok dosya ve klasörün birlikte toplu olarak birleştirilmesinden oluşan bir arşiv sıkıştırılmış dosya yaratmak istiyorsak, o zaman bu class’ ları ve bu örneği kullanan bir uygulama geliştirilmesi lazım. Geliştirilmişi Var : Böylede bir component uygulama geliştirilmiş, Rebex ZIP. Bu program .NET Framework içinde kendinizin geliştireceği bir sıkıştırma uygulamasına en az WinRAR kadar özellik katan class library ‘si olur. Yanlız tabiki bu component para ile satılıktır. Para ile satılmayan açık kaynak kodlu kütüphanelerden birine bakmak istersek, benim kullandığım SharpZLib (eskiden NZipLib olarak geçerdi) uygun bir yaklaşım olabilir.

Tags: , , ,

Visual Studio LightSwitch Beta

by Oguz Koroglu 26. August 2010 19:56
  İşte Microsofttan yazılım geliştiriciler için en az WPF ve Silverlight kadar büyük bir devrim yaratacak bir yazılım geliştirme paketi daha LightSwitch. Cloud, web ve masaüstü yazılımları içinde veritabanı bağlantı arayüzleri geliştirmek çok daha hızlı ve arayüzlerin itterasyon mantığı ve görselliği hat saffada. Bir kaç tuşa basarak, yaratıcılığınız ile profesyonel bir iş yazılımını kısa zamanda geliştirebilmek mümkün. Hızlı Bir Şekilde Profesyonel Kalitede İş Uygulamaları Geliştirme: LightSwitch ile çok özel uygulamalar inşa edebilirsiniz. Uygulamanıza tanıdık bir görünüm vermek için önceden yapılandırılmış ekran kullanabilirsiniz. LightSwitch, rutin uygulama görevlerini yerine getirmek için önceden yazılmış kodu kullanabilmeniz için adım adım rehberlik sağlıyor. Eğer özel kod yazmak gerekirse Visual Basic.NET veya C # kullanabilirsiniz. Masaüstü yazılımı olarak kurulabilir paketler yaratabilir veya tarayıcı ya da bulut (post-Beta) ile hantal Kurulum süreçleri olmadan daha kolayca uygulamanızı dağıtabilirsiniz. Mevcut Sistem ve Verilere Kolayca Erişim: LightSwitch ile yazdığınız yazılımlar kolayca MS-Excel platfromuna veri aktarabilecek şekilde olacaktır, LightSwicth bünyesinde böylesine değerli bir destek vermektedir. Tabiki bunu yaparken aynı zaman da MS-SQL server, Microsoft SQL Azure, SharePoint, Microsoft Office Access (post-Beta), veri tabanlarına bağlantılar kurabilirsiniz, bu veri tabanlarından raporlamalar alıp excel aktarması yapmanız bu platformda çok rahattır. Bügün İçin Geliştirin Yarına Hazırlıklı Olun: Bugün siz yazılımınızı LightSwict platformunda geliştirdiğinizde, ilerde bu masaüstü işletim sistemleri devri kapandığında, Microsoft Azure Cloud Computing devri başladığında, tüm işletim sistemi internet üzerinde bir sunucuda çalışmaya başladığında bile sizin kodlarınız buna hazırlıklı olacaktır. Bağlantılar: http://www.microsoft.com/visualstudio/en-us/lightswitch(LightSwitch Official Site)

.NET Compact Framework için Matrix Module

by Oguz Koroglu 21. August 2010 20:03
.NET Framework 3.5 Compact için kolaylıkla kullanabileceğiniz bir VB.NET modülü, biraz eski ve Visual Basic 6.0 zamanlarında embedded Visal Basic ile yazıldı daha sonra aşağıdaki gibi bir .NET sürümüne çevrildi. Güzel özelliği hiç bir .NET Compact Framework ile çalışması mümkün olmayan .NET reference dll import etmez, bunun dışında güzel bir özelliği yoktur. İşinize yaraması dileğiyle. Module mMatris 'Matrisler önce sutun sonta sat?r yaz?lmal? '1. sat?r 2. sutun demek M21 eleman?d?r '64 bit Floating point için çal??maktad?r 'encok 2^128*2^128 büyüklükteki matrisler için çal??abilecek Private Function SatirAdet(ByRef MyMatris As Object) As Integer On Error Resume Next SatirAdet = UBound(MyMatris, 2) End Function Private Function SutunAdet(ByRef MyMatris As Object) As Integer On Error Resume Next SutunAdet = UBound(MyMatris, 1) End Function Public Sub MatrisEsitle(ByRef InputMatris(,) As Double, ByRef OutputMatris(,) As Double) Dim Don1, Su, Sa, Don2 As Integer Su = SutunAdet(InputMatris) : Sa = SatirAdet(InputMatris) ReDim OutputMatris(Su, Sa) For Don1 = 0 To Su For Don2 = 0 To Sa OutputMatris(Don1, Don2) = InputMatris(Don1, Don2) Next Don2 Next Don1 End Sub Public Sub ArrayEsitle(ByRef pInput() As Double, ByRef pOutput() As Double) Dim i As Integer ReDim pOutput(UBound(pInput)) For i = 0 To UBound(pInput) pOutput(i) = pInput(i) Next i End Sub Public Sub TransPose(ByRef InputMatris(,) As Double, ByRef OutputMatris(,) As Double) Dim MySutunAdet, MySatirAdet As Integer Dim Don4, Don2, Don1, Don3, Don5 As Integer MySutunAdet = SutunAdet(InputMatris) MySatirAdet = SatirAdet(InputMatris) ReDim OutputMatris(MySatirAdet, MySutunAdet) For Don1 = 0 To MySutunAdet For Don2 = 0 To MySatirAdet OutputMatris(Don2, Don1) = InputMatris(Don1, Don2) Next Don2 Next Don1 End Sub Public Sub UpperTriangular(ByRef InputMatris(,) As Double, ByRef OutputMatris(,) As Double) Dim MySutunAdet, MySatirAdet As Integer Dim Don4, Don2, Don1, Don3, Don5 As Integer Dim Pivot() As Double Dim AraMatris(,) As Double Dim EksiPivot As Double Dim Sonsuz, EksiSonsuz As Double : Sonsuz = 10 ^ 300 : EksiSonsuz = -10 ^ 300 MySutunAdet = SutunAdet(InputMatris) MySatirAdet = SatirAdet(InputMatris) ReDim OutputMatris(MySutunAdet, MySatirAdet) ReDim AraMatris(MySutunAdet, MySatirAdet) ReDim Pivot(MySatirAdet - 1) MatrisEsitle(InputMatris, OutputMatris) MatrisEsitle(OutputMatris, AraMatris) For Don2 = 0 To MySutunAdet For Don1 = 0 To MySatirAdet - 1 Pivot(Don1) = (OutputMatris(Don2, Don1 + 1) - 10 ^ -100) / (OutputMatris(Don2, Don1) - 10 ^ -100) Next Don1 'ilk pivot gurubu hesaplandi 'matrisi degistir For Don3 = 0 To MySutunAdet For Don4 = 1 To MySatirAdet If Don4 > Don2 Then EksiPivot = (OutputMatris(Don3, Don4 - 1) - 10 ^ -200) * (Pivot(Don4 - 1)) 'EksiPivot = (EksiPivot) AraMatris(Don3, Don4) = OutputMatris(Don3, Don4) - EksiPivot End If Next Don4 Next Don3 MatrisEsitle(AraMatris, OutputMatris) Next Don2 'Loop End Sub Private Function SonsuzLock(ByRef Number As Object) As Double Dim Sonsuz, EksiSonsuz As Double Sonsuz = 10 ^ 200 EksiSonsuz = -10 ^ 200 If Number >= Sonsuz Then SonsuzLock = Sonsuz ElseIf Number <= EksiSonsuz Then SonsuzLock = EksiSonsuz Else SonsuzLock = Number End If End Function Private Sub FixZeros(ByRef Matris1(,) As Double) Dim Sa, Su As Integer Dim Temp1 As Object Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer For i = 0 To Su For j = 0 To Sa If Matris1(i, j) = 0 Then Matris1(i, j) = 10 ^ -9 Next j Next i End Sub Private Sub BuyukleriZero(ByRef Matris1(,) As Double, ByRef UpLim As Double) Dim Sa, Su As Integer Dim Temp1 As Object Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer For i = 0 To Su For j = 0 To Sa If Matris1(i, j) >= UpLim Then Call SutunZero(Matris1, i) Call SatirZero(Matris1, j) End If Next j Next i End Sub Public Sub DeleteSutun(ByRef Matris1(,) As Double, ByRef SutunNo As Integer) Dim Sa, Su As Integer Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer Dim Temp1(,) As Double ReDim Temp1(Su - 1, Sa) For i = 0 To Su - 1 For j = 0 To Sa If i >= SutunNo Then Temp1(i, j) = Matris1(i + 1, j) Else Temp1(i, j) = Matris1(i, j) End If Next j Next i Call MatrisEsitle(Temp1, Matris1) End Sub Public Sub DeleteSatir(ByRef Matris1(,) As Double, ByRef SatirNo As Integer) Dim Sa, Su As Integer Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer Dim Temp1(,) As Double ReDim Temp1(Su, Sa - 1) For i = 0 To Su For j = 0 To Sa - 1 If j >= SatirNo Then Temp1(i, j) = Matris1(i, j + 1) Else Temp1(i, j) = Matris1(i, j) End If Next j Next i Call MatrisEsitle(Temp1, Matris1) End Sub Public Sub SutunZero(ByRef Matris1(,) As Double, ByRef SutunNo As Integer) Dim Sa, Su As Integer Dim Temp1 As Object Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer For i = 0 To Sa Matris1(SutunNo, i) = 0 Next i End Sub Public Sub SatirZero(ByRef Matris1(,) As Double, ByRef SatirNo As Integer) Dim Sa, Su As Integer Dim Temp1 As Object Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer For i = 0 To Su Matris1(i, SatirNo) = 0 Next i End Sub Private Sub SatirHarmanla(ByRef Matris1(,) As Double) Dim Sa, Su As Integer Dim Temp1(,) As Double Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer Dim Satirlar() As Integer ReDim Satirlar(Sa) ReDim Temp1(Su, Sa) Dim rand As Integer For i = 0 To Sa rand = Int(Rnd(1) * Sa) + 1 For j = i To 0 Step -1 If Satirlar(j) = rand Then rand = System.Math.Round(Rnd(1) * Sa, 0) j = i End If Next j Satirlar(i) = rand Next i For i = 0 To Sa For j = 0 To Su Temp1(j, Satirlar(i)) = Matris1(j, i) Next j Next i For i = 0 To Sa For j = 0 To Su Matris1(j, i) = Temp1(j, i) Next j Next i End Sub Private Function SimetrikMi(ByRef Matris1(,) As Double) As Boolean Dim Sa, Su As Integer Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer SimetrikMi = True For i = 0 To Sa - 1 For j = 0 To Su - 1 If i > j Then If Matris1(j, i) <> Matris1(i, j) Then SimetrikMi = False Exit Function End If End If Next j Next i End Function Private Function UpperMi(ByRef Matris1(,) As Double) As Boolean Dim Sa, Su As Integer Sa = SatirAdet(Matris1) : Su = SutunAdet(Matris1) Dim i, j As Integer UpperMi = True For i = 0 To Sa - 1 For j = 0 To Su - 1 If i > j Then If System.Math.Round(Matris1(j, i), 3) <> 0 Then UpperMi = False Exit Function End If End If Next j Next i End Function Public Sub LowerTriangular(ByRef InputMatris As Object, ByRef OutputMatris As Object) End Sub Public Sub MatrisCarpSayi(ByRef Matris1(,) As Double, ByVal Sayi As Double, ByRef OutputMatris(,) As Double) Dim Sa, Su As Integer Sa = SatirAdet(Matris1) Su = SutunAdet(Matris1) ReDim OutputMatris(Su, Sa) Dim i, j As Integer For i = 0 To Su For j = 0 To Sa OutputMatris(i, j) = Matris1(i, j) * Sayi Next j Next i End Sub Public Sub MatrisCarp(ByRef Matris1(,) As Double, ByRef Matris2(,) As Double, ByRef OutputMatris(,) As Double) Dim Sa(1) As Integer Dim Su(1) As Integer Dim Don5, Don3, Don1, Don2, Don4, Don6 As Integer Sa(0) = SatirAdet(Matris1) : Sa(1) = SatirAdet(Matris2) Su(0) = SutunAdet(Matris1) : Su(1) = SutunAdet(Matris2) If Not Su(0) = Sa(1) Then Exit Sub ' e?it de?ilse ç?k git ReDim OutputMatris(Su(1), Sa(0)) For Don1 = 0 To Su(1) 'sutunlar döner For Don2 = 0 To Sa(0) 'sat?r döner For Don3 = 0 To Sa(1) OutputMatris(Don1, Don2) = OutputMatris(Don1, Don2) + Matris1(Don3, Don2) * Matris2(Don1, Don3) Next Don3 Next Don2 Next Don1 End Sub Public Sub MatrisCarp2(ByRef Matris1(,) As Double, ByRef Matris2(,) As Double, ByRef OutputMatris(,) As Double) Dim Temp2(,), Temp1(,), Temp3(,) As Double Call TransPose(Matris1, Temp1) Call TransPose(Matris2, Temp2) Call MatrisCarp(Temp1, Temp2, Temp3) Call TransPose(Temp3, OutputMatris) End Sub Public Sub MatrisTopla(ByRef Matris1(,) As Double, ByRef Matris2(,) As Double, ByRef OutputMatris(,) As Double) Dim i, j As Integer Dim Su, Sa As Integer Su = SutunAdet(Matris1) : Sa = SatirAdet(Matris1) ReDim OutputMatris(Su, Sa) For i = 0 To Su For j = 0 To Sa OutputMatris(i, j) = Matris1(i, j) + Matris2(i, j) Next j Next i End Sub Public Sub MatrisRound(ByRef MyMatris(,) As Double, ByVal Digit As Short) Dim Sa, Su As Integer Dim Don1, Don2 As Integer Sa = SatirAdet(MyMatris) Su = SutunAdet(MyMatris) For Don1 = 0 To Sa For Don2 = 0 To Su MyMatris(Don2, Don1) = System.Math.Round(MyMatris(Don2, Don1), Digit) Next Don2 Next Don1 End Sub Public Sub MatrisJoinBySatir(ByRef Matris1(,) As Double, ByRef Matris2(,) As Double, ByRef OutputMatris(,) As Double) 'Satirlari ayn? olan matrisleri yap??t?r?r Dim Sa(1) As Integer Dim Su(1) As Integer Dim Don5, Don3, Don1, Don2, Don4, Don6 As Integer Don1 = 1 Sa(0) = SatirAdet(Matris1) Sa(1) = SatirAdet(Matris2) Su(0) = SutunAdet(Matris1) Su(1) = SutunAdet(Matris2) If Sa(0) <> Sa(1) Then Exit Sub 'satirlari ayn? de?ilse ç?k git ReDim OutputMatris(Su(0) + Su(1) + 1, Sa(0)) For Don1 = 0 To Su(0) + Su(1) + 1 'sutunlar döner For Don2 = 0 To Sa(0) 'satirlar doner If Don1 <= Su(0) Then OutputMatris(Don1, Don2) = Matris1(Don1, Don2) Else OutputMatris(Don1, Don2) = Matris2(Don1 - Su(0) - 1, Don2) End If Next Don2 Next Don1 End Sub Public Sub MatrisJoinBySatir2(ByRef Matris1(,) As Double, ByRef Matris2(,) As Double, ByRef OutputMatris(,) As Double) Call MatrisJoinBySutun(Matris1, Matris2, OutputMatris) End Sub Public Sub MatrisJoinBySutun(ByRef Matris1(,) As Double, ByRef Matris2(,) As Double, ByRef OutputMatris(,) As Double) 'sutunlar? ayn? say?da olan matrisleri yap??t?r?r Dim Sa(1) As Integer Dim Su(1) As Integer Dim Don5, Don3, Don1, Don2, Don4, Don6 As Integer Sa(0) = SatirAdet(Matris1) : Sa(1) = SatirAdet(Matris2) Su(0) = SutunAdet(Matris1) : Su(1) = SutunAdet(Matris2) If Su(0) <> Su(1) Then Exit Sub 'sutunlar? ayn? de?ilse ç?k git ReDim OutputMatris(Su(0), Sa(0) + Sa(1) + 1) For Don1 = 0 To Su(0) 'sutunlar döner For Don2 = 0 To Sa(0) + Sa(1) + 1 'satirlar doner If Don2 <= Sa(0) Then OutputMatris(Don1, Don2) = Matris1(Don1, Don2) Else OutputMatris(Don1, Don2) = Matris2(Don1, Don2 - Sa(0) - 1) End If Next Don2 Next Don1 End Sub Public Sub MatrisJoinBySutun2(ByRef Matris1(,) As Double, ByRef Matris2(,) As Double, ByRef OutputMatris(,) As Double) Call MatrisJoinBySatir(Matris1, Matris2, OutputMatris) End Sub Public Sub SolveMatris(ByRef LMatris(,) As Double, ByRef RMatris(,) As Double, ByRef SolutionVector(,) As Double) Dim SuL, SaL As Integer Dim SuR, SaR As Integer Dim Out_Su, Out_Sa As Integer Dim InputMatris(,) As Double Dim AraMatris(,) As Double Dim OutputMatris(,) As Double SaL = SatirAdet(LMatris) SuL = SutunAdet(LMatris) SaR = SatirAdet(RMatris) SuR = SutunAdet(RMatris) 'error durumlar?nda cikis yapacaz If Not SuR = 0 Then Exit Sub If SaR <> SaL Then Exit Sub ReDim SolutionVector(SuR, SaR) Call MatrisJoinBySatir(LMatris, RMatris, InputMatris) Call UpperTriangular(InputMatris, AraMatris) Call SolveUpper(AraMatris, SolutionVector) End Sub Public Sub SolveMatris2(ByRef LMatris(,) As Double, ByRef RMatris(,) As Double, ByRef SolutionVector(,) As Double) Dim Temp3, Temp1, Temp2, Temp4 As Object Call TransPose(LMatris, Temp1) Call TransPose(RMatris, Temp2) Call TersMatris2_noGaus(Temp1, Temp4) Call MatrisCarp(Temp4, Temp2, Temp3) Call TransPose(Temp3, SolutionVector) End Sub Public Sub TersMatris2_noGaus(ByRef Matris(,) As Double, ByRef Tersi(,) As Double) Dim Matris1(,) As Double Call TransPose(Matris, Matris1) Dim S As Double 'UPGRADE_WARNING: Couldn't resolve default property of object MatrixDet(). Click for more: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"' S = MatrixDet(Matris1) If S = 0 Then Exit Sub Dim Y, le, V, LB, UB, X, ce, w As Integer Dim IA(,), Sm(,) As Double LB = LBound(Matris1) UB = UBound(Matris1) ReDim IA(UB - LB, UB - LB) ReDim Sm(UB - 1 - LB, UB - 1 - LB) For V = LB To UB For w = LB To UB le = 0 For X = LB To UB - 1 ce = 0 For Y = LB To UB - 1 If V = X Then le = 1 If Y = w Then ce = 1 Sm(X, Y) = Matris1(X + le, Y + ce) Next Y Next X IA(w, V) = (-1) ^ (w + V) * MatrixDet(Sm) / S Next w Next V MatrisEsitle(IA, Tersi) End Sub Public Sub SolveUpper(ByRef X(,) As Double, ByRef SV(,) As Double) 'solve matris için gerekli bir iç fonksiyon Dim i, iBound, j As Integer Dim UT, AT As Double iBound = 0 iBound = SatirAdet(SV) For i = iBound To 0 Step -1 If i = iBound Then If X(i, i) = 0 Then X(i, i) = X(i, i) + 10 ^ -9 SV(0, i) = X(i + 1, i) / (X(i, i)) Else UT = 0 For j = i To iBound - 1 UT = UT - SV(0, j + 1) * X(j + 1, i) 'bu sat?rda bir hata var Next j UT = UT + X(iBound + 1, i) AT = X(i, i) - 10 ^ -9 SV(0, i) = UT / AT End If Next i End Sub Public Sub TersMatris(ByRef InputMatris(,) As Double, ByRef OutputMatris(,) As Double) Dim Sa, Su As Integer Dim R(,) As Double Dim SV(,) As Double Dim d4, d2, d1, d3, d5 As Integer Sa = SatirAdet(InputMatris) : Su = SutunAdet(InputMatris) ReDim OutputMatris(Su, Sa) For d1 = 0 To Sa ReDim R(0, Sa) ReDim SV(0, Sa) R(0, d1) = 1 Call SolveMatris(InputMatris, R, SV) For d2 = 0 To Sa OutputMatris(d1, d2) = SV(0, d2) Next d2 Next d1 End Sub Public Function MatrixDet(ByVal a(,) As Double) As Double Dim A_ As Object Dim LB, UB As Integer Dim FGOS As Short Dim k, i, j, M As Integer Dim L, T, Q As Double LB = LBound(a) : UB = UBound(a) Call MatrisEsitle(a, A_) : Call TransPose(A_, a) MatrixDet = 1 For i = LB To UB - 1 If a(i, i) = 0 Then FGOS = 0 For L = i + 1 To UB If a(L, i) <> 0 Then For M = LB To UB Q = a(L, M) a(L, M) = a(i, M) a(i, M) = Q Next M MatrixDet = -MatrixDet FGOS = -1 Exit For 'L' End If Next L If FGOS <> -1 Then MatrixDet = 0 End If If MatrixDet = 0 Then Exit Function For j = i + 1 To UB T = a(i, j) / a(i, i) For k = LB To UB a(k, j) = a(k, j) - a(k, i) * T Next k Next j Next i For i = LB To UB MatrixDet = MatrixDet * a(i, i) Next i End Function Public Sub IdentityMatris(ByRef Matris1(,) As Double) Dim Sa, Su As Integer Sa = SatirAdet(Matris1) Su = SutunAdet(Matris1) Dim i, j As Integer For i = 0 To Su For j = 0 To Sa If i = j Then Matris1(i, j) = 1 Next j Next i End Sub Public Sub EigenValue(ByVal Alt As Integer, ByRef InputMatris(,) As Double, ByRef EigenVectors(,) As Double, ByRef EigenValues(,) As Double) Randomize() Dim Sa, Su As Integer Dim c_old, c_new As Double Dim i As Integer Dim T, k_Sa As Short Dim AXnew(,) As Double Dim a(,) As Double Dim Xnew(,) As Double Dim HataPayi As Double Sa = SatirAdet(InputMatris) : Su = SutunAdet(InputMatris) ReDim EigenValues(Su, 0) ReDim EigenVectors(Su, Sa) ReDim Xnew(0, Sa) For i = 0 To Sa Xnew(0, i) = 1 Next i Call MatrisEsitle(InputMatris, a) i = 0 'en buyuk oz deger bulunur, oz vector bulunur k_Sa = Sa Do Call MatrisCarp(a, Xnew, AXnew) c_old = HataPayi : HataPayi = AXnew(0, 0) : c_new = HataPayi If System.Math.Abs((c_new - c_old) / c_new) < 10 ^ -8 Then Exit Do '%1 den kucuk hata payi durumunda cik git For T = 0 To Sa 'matris hata payina bolunur Xnew(0, T) = AXnew(0, T) / HataPayi Next T Loop 'ilk vector ve deger bulundu EigenValues(k_Sa, 0) = HataPayi For T = 0 To Sa EigenVectors(k_Sa, T) = Xnew(0, T) / Xnew(0, Sa) Next T 'en buyuk oz vektor ve deger yazildi Dim OzDe As Double Dim OzVe(,) As Double k_Sa = Sa - 1 For OzDe = EigenValues(Sa, 0) To Alt Step -0.01 If OzDegermi(a, OzDe) = True And System.Math.Round(EigenValues(k_Sa + 1, 0), 1) <> System.Math.Round(OzDe, 1) Then EigenValues(k_Sa, 0) = OzDe Call OzDeVec(a, OzDe, OzVe) For T = 0 To Sa EigenVectors(k_Sa, T) = OzVe(0, T) Next T k_Sa = k_Sa - 1 If k_Sa < 0 Then Exit For End If Next OzDe End Sub Private Sub OzDeVec(ByRef a(,) As Double, ByRef Deger As Double, ByRef Vector(,) As Double) Dim Sa, Su, i As Integer Dim ZeroVector(,) As Double Dim Piv As Double Su = SutunAdet(a) : Sa = SatirAdet(a) ReDim ZeroVector(0, Sa) For i = 0 To Sa ZeroVector(0, i) = 0.0001 Next i Dim A_() As Double Dim IdM(,) As Double Dim L_IdM(,) As Double Dim A_L_IdM(,) As Double Dim A_Det As Double ReDim IdM(Su, Sa) Call IdentityMatris(IdM) Call MatrisCarpSayi(IdM, -1 * Deger, L_IdM) Call MatrisTopla(a, L_IdM, A_L_IdM) Call SolveMatris(A_L_IdM, ZeroVector, Vector) Piv = Vector(0, Sa) For i = 0 To Sa Vector(0, i) = Vector(0, i) / Piv Next i End Sub Private Function OzDegermi(ByRef a(,) As Double, ByRef Deger As Double) As Boolean Dim Su, Sa As Integer Su = SutunAdet(a) : Sa = SatirAdet(a) Dim A_() As Double Dim IdM(,) As Double Dim L_IdM(,) As Double Dim A_L_IdM(,) As Double Dim A_Det As Double ReDim IdM(Su, Sa) Call IdentityMatris(IdM) Call MatrisCarpSayi(IdM, -1 * Deger, L_IdM) Call MatrisTopla(a, L_IdM, A_L_IdM) A_Det = System.Math.Round(MatrixDet(A_L_IdM), 4) If A_Det = 0 Then OzDegermi = True Else OzDegermi = False End Function Public Function ShowMatris(ByRef MyMatris(,) As Double) As String Dim Sa(0) As Integer Dim Su(0) As Integer Dim Don5, Don3, Don1, Don2, Don4, Don6 As Integer Sa(0) = SatirAdet(MyMatris) Su(0) = SutunAdet(MyMatris) Dim Cikti As String For Don1 = 0 To Sa(0) 'satir doner For Don2 = 0 To Su(0) 'sutun döner Cikti = Cikti & " " & MyMatris(Don2, Don1) Next Don2 Cikti = Cikti & Chr(13) & Chr(10) Next Don1 ShowMatris = Cikti End Function Public Function ShowMatris2(ByRef MyMatris1(,) As Double) As String Dim Sa(0) As Integer Dim Su(0) As Integer Dim Don5, Don3, Don1, Don2, Don4, Don6 As Integer Dim MyMatris(,) As Double Call TransPose(MyMatris1, MyMatris) Sa(0) = SatirAdet(MyMatris) Su(0) = SutunAdet(MyMatris) Dim Cikti As String For Don1 = 0 To Sa(0) 'satir doner For Don2 = 0 To Su(0) 'sutun döner Cikti = Cikti & " " & MyMatris(Don2, Don1) Next Don2 Cikti = Cikti & Chr(13) & Chr(10) Next Don1 ShowMatris2 = Cikti End Function End Module  

Tags:

Property Kullanımı İçin Basit Bir Örnek – Class Dikdörtgen

by Oguz Koroglu 25. July 2010 17:58
Object Oriented programla olayında C#’da kısa bir örnekle public ve private değişkenler için class ve property kullanımını deneyelim. Bir Dikdörtgen ele alalım, dikdörtgenin bizden istenen özellikleri kenarları olacaktır, demek ki; kenarlar bir inputtur dikdörtgenin çevresi ve alanı ise bir outputtur. Object Oriented yazabilmek için bir kez Dikdörtgenimiz ya class yada struct olmak mecburiyetindedir. Struct bir veri veya değişken yapısı olarak kullanıldığı için Dikdörtgen bana class olarak deklare edilmesi daha doğru gelmektedir. Daha ilerde de bu dikdörtgenden meydana gelen nesneleri kopyalanabilir kılmak için dikdötgen class’ına ICloneable, bellekten temizlenebilir kılmak içinse IDisposable implement etmek lazımdır. Burada IDisposable etmeye aslında gerek yoktur, yanlız dispose olayını ve Garbage Collector nesnesini kullanmayı öğrenmek için bu seferlik gerek olmasada bu dikdörtgen classını Dispose edilebilir hale getirdim. Getirmeseydim, bu class, içinde herhangi bir handler bağlantyısı olamadığından, kullanılmadığı anda (kullanıldığı fonksiyon veya void kapandığı anda {}) .NET Framework tarafından zaten bellekten atılacaktı. C# public class Dikdortgen :ICloneable, IDisposable { private double _a; private double _b; /// /// A Kenarı /// public double a { get { return _a; } set { _a = value; } } /// /// B Kenarı /// public double b { get { return _b; } set { _b = value; } } public Dikdortgen() { } /// /// Dikdortgen Constructor /// /// A keanrı /// B Kenarı public Dikdortgen(double la, double lb) { a = la; b = lb; } } Visual Basic Public Class Dikdortgen Implements ICloneable Implements IDisposable Private _a As Double Private _b As Double '/ '/ A Kenarı '/ Public Property a() As Double Get Return _a End Get Set (ByVal Value As Double) _a = value End Set End Property '/ '/ B Kenarı '/ Public Property b() As Double Get Return _b End Get Set (ByVal Value As Double) _b = value End Set End Property Public Sub New() End Sub '/ '/ Dikdortgen Constructor '/ '/ A keanrı '/ B Kenarı Public Sub New(ByVal la As Double, ByVal lb As Double) a = la b = lb End Sub End Class Bu Kod ile böylece kenarları a ve b olan bir dikdörtgen sınıfı oluşturmuş olduk. a ve b kenarlarımız public property olarak _a ve _b private double değişkenlerine bağlıdırlar. Kenarlarımız dikdörtgen sınıfının hem input olarak girilebilen (set) hemde output olarak okunabilen (get) property ‘leridir. Şimdi sıra bu dikdörtgenin çevresini ve alanını belirleyecek olan sadece output olarak okunabilen (get) propertylerini yazmaya geldi, çünkü kenarları belirli olan bir dikdörtgenin çevresi veya alanı hiçbir zaman bir input olamaz, çevresi veya alanı bilinen bir dikdörtgenin kenarları belirlenemez, bu nedenle de daha önce overload ettiğimiz constructor çalıştırılamaz. Dikdörtgen yapısının mantığı gereği çevre ve alan saltokunur çıktı (readony property) olmalıdır. /// /// Çevresi /// public double cevre { get { return 2 * (a + b); } } /// /// Alanı /// public double alan { get { return a * b; } } Visual Basic '/ '/ Çevresi '/ Public ReadOnly Property cevre() As Double Get Return 2 * (a + b) End Get End Property '/ '/ Alanı '/ Public ReadOnly Property alan() As Double Get Return a * b End Get End Property Bu kod ile de dikdörtgende çevre property’si salt okunur bir property dir ve Çevre = 2 X (a property ‘si + b property ‘si) dir. Alan = a property ‘si X b property ‘si) dir. demiş olduk. En başta yazdığımız IClonable ve IDisposable objelerimizide aşağıdaki gibi kullanarak dikdörtgen sınıfımızı bir object oriented yapı olarak tamamlayabilmekteyiz. C# /// /// Sadık olmayan kopyası /// /// public object Clone() { return new Dikdortgen(a, b); } public void Dispose() { throw new NotImplementedException(); a=0; //double destruct edilemez ama sıfırlanır. b=0; GC.SuppressFinalize(this); GC.Collect(); } Visual Basic '/ '/ Sadık olmayan kopyası '/ '/ Public Function Clone() As Object Return New Dikdortgen(a, b) End Function Public Sub Dispose() Throw New NotImplementedException() a=0 'double destruct edilemez ama sıfırlanır. b=0 GC.SuppressFinalize(Me) GC.Collect() End Sub Clone fonksiyonumuzun kendisi dikdörtgen class’ından yaratılmış objenin özelliklerini (a ve b kenarlarını) aynen taşıyan ama memoryde ayrı bir yer kaplayan (hem heap hem stack olarak) ilk objeden bağımsız yepyeni bir dikdörtgen objesi olarak döner. Eğer clone fonksiyonumuzu kullanmazsan B = A şeklinde B dikdörtgen objesini A dikdörtgen objesine eşitlemeye kalksaydık, ozaman class ların yapısı gereği B, A’nın bir işaretçisi (pointer) olacaktı. A’ da yapılan bir değişiklik direk olarak B ‘ye de yansıyacaktı. B, A’nın bir nevi sadık kopyası olacaktı. Dispose fonksiyonumuzda da GC (garbage collector) kullanarak dikdörtgen class’ına ait bir objenin nasıl destruct edildikten sonra memory üzerindeki kalıntılarının temizlendiğini görebiliyoruz. NOT: Yazı içinde de daha önce belirttiğim gibi GC (garbage collector) kullanımına class ‘ımızı hiç zorlamamıza gerek yoktu, bu işlemleri zaten .NET Compiler bizim için gerçekleştirecekti, ama öğrenmek amacı ile bu metodlarıda burayada ekledim.

Windows Mobile 6 Hesap Makinesi

by Oguz Koroglu 13. July 2010 19:39
Turkcell Mobil Uygulamalar Yarışıyor Yarışması için bir hesap makinesi yazdık, ama sonucunu öğrenemedik . Bende programı açık kaynak olarak hem kaydak kodu (Visual Studio 2008 için C# ve Vb.Net) ve hemde uygulama kurulum dosyası olarak buraya yüklüyorum Windows Mobile yüklü cep telefonu olanlar yükleyip kullanabilirler. Çoğu mobil cihazlar’da bir bilimsel hesap makinesi yok, ayrıca ben öğrenciykende matris hesaplarını yapan, denklem takımı çözebilen bir hesap makinesi bulamamıştım. Bu nedenle ozamanlardan beri geliştirdiğim bir hesap makinem vardı zaten. Bunu PocketPC2003 için embedded C++ ile yazmıştım. Bu hesap makinesi konsol satırlar ile çalışabiliyor ve matris hesaplarını yapabiliyor, kaçıncı dereceden olursa olsun polinomları çözebiliyor, Öz-Vektör, Öz-Değer Problemlerini çözebilmekteydi. Aynı zamanda en son yaptığım eklemelerden biride matris-deplasman yöntemi sayesinde bir statik sistemdeki iç kuvvetleride bulmaktaydı. Matris Yöntemler dersi sırasında yazdığım bir programdı, sınavındaki soruyu çözmekte kullandım. Zaten bu tarz yazdığım hesap makinesi programlama işleride Yüksek Lisanstan kopya çekiyor izlenimi vererek atılmamada sebep olmuştur. Ben bu sürümde yüksek inşaat mühendisliği hesapları işene çok giren Özvektör ve Matris-Deplasman ile iç kuvvet bulma motorlarını çıkarıp sadece klasik matris hesapları ve bilimsel hesap makinesi olarak çalışacak şekilde hesap makinemi Visual Studio 2008 de C# ve VB.NET ile tekrar yazdım. Yazdım ama sanırım çok fazla popüler olarak nitelendirilmediğinden herhangi bir ödül falan alamadı . Kimsede arayıp yada mail atıp bir eline sağlık bile demedi. Açık kaynaktır, isteyen indirsin kullansın, isteyen kodları kullansın kendi projelerinde. PROGRAMDAN GÖRÜNÜMLER: Windows Mobile Hesap Makinesi 001 Windows Mobile Hesap Makinesi 004 PROGRAMI İNDİR: Uygulama dosyası için tıklayın. Kaynak kodlar için tıklayın. PROGRAMIN VİDEO TANITIMI : Powerpoint sunumu indirmek için tıklayın.

String ve Byte Şifreleme (String and Byte Encryption)

by Oguz Koroglu 6. June 2010 17:45
Kriptoloji ve veri şifreleme her zaman hayran olduğum konulardan biri olmuştur. Bu nedenle Kod Adı Swordfish isimli filmde hayran olduğum filmler arasındadır. Ama bu yazımda ben veri şifreleme ile ilgili herşeyi anlatmak yerine sadece veri şifrelemenin ana hatlarını ve Visual Studio içerisinde kod ile istediğimiz string, char() veya byte() veri tiplerini basit kodlar ile şifreleyip, geri çözmeyi anlatacağım.    Öncelikle iyi bir şifre algoritması yazıyor olmak için şunlar lazımdır;    Gizliliğin derecesi, şifrelemenin ve şifre çözmenin yapısına etki etmelidir. Anahtar setleri ve çalışma algoritması karmaşıklıktan uzak olmalıdır. Uygulaması mümkün olduğu kadar basit olmalıdır. Şifrelenmiş ürünün (text, veri) boyutu, şifrelenmemiş üründen büyük olmamalıdır. Şifreleme sistemi temel matematiğe dayanmalıdır. Yöntemimizi belirleyelim: Öncelikle algorimamız karmaşık olmasın, bilindik veya bilinebilir-tahmin edilebilir olsun. Şifremizin çözülmesini engelleyen şey anahtar kelime olsun, algoritma değil. O nedenle şifreleme yöntemini basit bir toplama işlemnie dayandıracağım.  Anahtar sözcüğümüz (kriptomuz) diyelimki ”AB” olsun. Şifrelememiz gereken text de “Adam köpeği ısırdı” olsun. Adam köpeği ısırdı kelimesinin altına arka arkaya ”AB” anahtar sözcüğünü yazalım, karetkerleri ASCII kodlarına göre tam sayılar olarak toplayalım, daha sonrada ortaya çıkan yeni tam sayıyı yine bir karektere (char veri tipine) dönüştürelim.    Adam köpeği ısırdı.+ ABABABABABABABABABA---------------------= ‚¦¢¯a7²¦2ªbŠµ>´¥?o Ortaya böyle bir şifrelenmiş metin çıkacaktır, aynı yöntemi bu sefer çıkarma işlemi olarak uygularsak, tekrar ilk metnimizi elde edebniliriz. ‚¦¢¯a7²¦2ªbŠµ>´¥?o- ABABABABABABABABABA---------------------=Adam köpeği ısırdı. Bu Yönteme uygun olan fonksiyonumuzu VB.NET dilinde yazalım. Şifreleme Kodumuz:   Public Function EncryptString(ByVal pString As String, ByVal pKeyWord As String) As String   If pString Is Nothing Then Return Nothing   If pString = "" Then Return "" Try   Dim retValInt() As Integer, retValArr As New ArrayList   Dim retVal As String   Dim MyCharArr = pString.ToCharArray   Dim sira As Integer, EncInt As Integer   For Each c As Char In MyCharArr   EncInt = Asc(c) + Asc(pKeyWord(sira))   retValArr.Add(EncInt)   sira += 1 : If sira > pKeyWord.Length - 1 Then sira = 0 Next c   retValInt = retValArr.ToArray(New Integer().GetType)   For i = 0 To retValInt.Length - 1   retValInt(i) = retValInt(i) Mod 256   MyCharArr(i) = Chr(retValInt(i))   Next i   retVal = MyCharArr   Return retVal Catch ex As Exception Debug.Print("Encryption Failure")   Debug.Print("String : " & pString)   Debug.Print("KeyWord : " & pKeyWord) Debug.Print("Exception : " & ex.ToString) End Try End Function Şifreleme fonsiyonumuz aynı yöntemimizde anlattığım gibi pString ve pKeyWord değişkenleri ile çağrılan bir fonsiyondur, pString metnini pKeyWord metni ile şifreler ve kendisi şifrelenmiş metin olarak döner. En baştan bulunanIf pString Is Nothing Then Return NothingIf pString = "" Then Return ""satırları fonksiyon çağırıldığında eğer girdi metni boş ise hiç bir işlem yapılmadan fonsiyonun boş dönmesini sağlar. Şifre Çözme Kodumuz: Public Function DecryptString(ByVal pString As String, ByVal pKeyWord As String) As String   If pString Is Nothing Then Return Nothing   If pString = "" Then Return "" Try   Dim retValInt() As Integer, retValArr As New ArrayList   Dim retVal As String   Dim MyCharArr = pString.ToCharArray   Dim sira As Integer, EncInt As Integer   For Each c As Char In MyCharArr   EncInt = Asc(c) - Asc(pKeyWord(sira))   retValArr.Add(EncInt)   sira += 1 : If sira > pKeyWord.Length - 1 Then sira = 0 Next c   retValInt = retValArr.ToArray(New Integer().GetType)   For i = 0 To retValInt.Length - 1   retValInt(i) = retValInt(i) Mod 256   If retValInt(i) < 0 Then retValInt(i) += 256   MyCharArr(i) = Chr(retValInt(i))   Next i   retVal = MyCharArr   Return retVal Catch ex As Exception   Debug.Print("Decyption Failure")   Debug.Print("Keyword : " & pKeyWord) Debug.Print("Exception : " & ex.ToString) Return "" End Try End Function Görüldüğü üzere şifreleme ve şifre çözme kodu arasındaki tek fark şifreleme sırasında gelen karekterin tam sayı ASCII kodu anahtar sözcüğün ASCII kodu ile toplanırken EncInt = Asc(c) + Asc(pKeyWord(sira)). Şifre çözme sırasında çıkarma işlemine dönüşüyor. EncInt = Asc(c) - Asc(pKeyWord(sira)) Başka Veri Tipi, Dosya veya Data Şifreleme: Bu kodlarımızın byte versiyonlarını yazarsak, bir veride bulunan bütün bytelarımızı anahtar sözcüğümüzün byteları ile şifreliyip daha sonra eski haline getirebiliriz. Public Function EncryptBytes(ByVal pByteArr As Byte(), ByVal pKeyword As String) As Byte() Dim MyKeyArr As Byte() Dim retVal As Byte() Dim sira As Integer ReDim retVal(pByteArr.Length - 1) ReDim MyKeyArr(pKeyword.Length - 1) For i As Integer = 0 To pKeyword.Length - 1 MyKeyArr(i) = CByte(Asc(pKeyword(i))) Next i For i As Integer = 0 To pByteArr.Length - 1 retVal(i) = CByte((CInt(pByteArr(i)) + CInt(MyKeyArr(sira))) Mod 256) sira += 1 : If sira > pKeyword.Length - 1 Then sira = 0 Next i Return retVal End Function Public Function DecryptBytes(ByVal pByteArr As Byte(), ByVal pKeyword As String) As Byte() Dim MyKeyArr As Byte() Dim retVal As Byte() Dim sira As Integer ReDim retVal(pByteArr.Length - 1) ReDim MyKeyArr(pKeyword.Length - 1) For i As Integer = 0 To pKeyword.Length - 1 MyKeyArr(i) = CByte(Asc(pKeyword(i))) Next i For i As Integer = 0 To pByteArr.Length - 1 Dim decVal As Integer = (CInt(pByteArr(i)) - CInt(MyKeyArr(sira))) Mod 256 retVal(i) = CByte(If(decval < 0, _ decval + 256, _ decval)) If retVal(i) < 0 Then retVal(i) += 256 sira += 1 : If sira > pKeyword.Length - 1 Then sira = 0 Next i Return retVal End Function Daha Profesyonel Bu anlatıklarım ve bu kodlar basitçe kriptolojinin temelini anlamak ve temel kodlar ile visual studio da şifreleme nasıl yapılır hakkındaydı. Büyük dataları bu yöntemle şifrelemek ve profesyonel anlamda bu şifreleme metodunu kullanmak pek de doğru olmaz. Visual Studio da bu iş içinde managed class’lar bulunmaktadır. System.Security.Cryptography Namespace ’i altında veri şifremeyle ilgi bir çok method bulunmaktadır. RijndaelManaged Class ’ı bu yaptığımız Stream şifreleme işini yapmak için geliştirilmiş bir kütüphanedir. Bu class library’yi aşağıdaki örnekteki gibi kulanmamız mümkündür. Imports System Imports System.IO Imports System.Security.Cryptography Module RijndaelMemoryExample Sub Main() Try Dim original As String = "Here is some data to encrypt!" ' Create a new instance of the RijndaelManaged ' class. This generates a new key and initialization ' vector (IV). Dim myRijndael As New RijndaelManaged() ' Encrypt the string to an array of bytes. Dim encrypted As Byte() = encryptStringToBytes_AES(original, myRijndael.Key, myRijndael.IV) ' Decrypt the bytes to a string. Dim roundtrip As String = decryptStringFromBytes_AES(encrypted, myRijndael.Key, myRijndael.IV) 'Display the original data and the decrypted data. Console.WriteLine("Original: {0}", original) Console.WriteLine("Round Trip: {0}", roundtrip) Catch e As Exception Console.WriteLine("Error: {0}", e.Message) End Try End Sub Function encryptStringToBytes_AES(ByVal plainText As String, ByVal Key() As Byte, ByVal IV() As Byte) As Byte() ' Check arguments. If plainText Is Nothing OrElse plainText.Length <= 0 Then Throw New ArgumentNullException("plainText") End If If Key Is Nothing OrElse Key.Length <= 0 Then Throw New ArgumentNullException("Key") End If If IV Is Nothing OrElse IV.Length <= 0 Then Throw New ArgumentNullException("IV") End If ' Declare the RijndaelManaged object ' used to encrypt the data. Dim aesAlg As RijndaelManaged = Nothing ' Declare the stream used to encrypt to an in memory ' array of bytes. Dim msEncrypt As MemoryStream = Nothing Try ' Create a RijndaelManaged object ' with the specified key and IV. aesAlg = New RijndaelManaged() aesAlg.Key = Key aesAlg.IV = IV ' Create a decrytor to perform the stream transform. Dim encryptor As ICryptoTransform = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV) ' Create the streams used for encryption. msEncrypt = New MemoryStream() Using csEncrypt As New CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write) Using swEncrypt As New StreamWriter(csEncrypt) 'Write all data to the stream. swEncrypt.Write(plainText) End Using End Using Finally ' Clear the RijndaelManaged object. If Not (aesAlg Is Nothing) Then aesAlg.Clear() End If End Try ' Return the encrypted bytes from the memory stream. Return msEncrypt.ToArray() End Function Function decryptStringFromBytes_AES(ByVal cipherText() As Byte, ByVal Key() As Byte, ByVal IV() As Byte) As String ' Check arguments. If cipherText Is Nothing OrElse cipherText.Length <= 0 Then Throw New ArgumentNullException("cipherText") End If If Key Is Nothing OrElse Key.Length <= 0 Then Throw New ArgumentNullException("Key") End If If IV Is Nothing OrElse IV.Length <= 0 Then Throw New ArgumentNullException("IV") End If ' Declare the RijndaelManaged object ' used to decrypt the data. Dim aesAlg As RijndaelManaged = Nothing ' Declare the string used to hold ' the decrypted text. Dim plaintext As String = Nothing Try ' Create a RijndaelManaged object ' with the specified key and IV. aesAlg = New RijndaelManaged() aesAlg.Key = Key aesAlg.IV = IV ' Create a decrytor to perform the stream transform. Dim decryptor As ICryptoTransform = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV) ' Create the streams used for decryption. Using msDecrypt As New MemoryStream(cipherText) Using csDecrypt As New CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read) Using srDecrypt As New StreamReader(csDecrypt) ' Read the decrypted bytes from the decrypting stream ' and place them in a string. plaintext = srDecrypt.ReadToEnd() End Using End Using End Using Finally ' Clear the RijndaelManaged object. If Not (aesAlg Is Nothing) Then aesAlg.Clear() End If End Try Return plaintext End Function End Module  

Neden Visual Studio .NET

by Oguz Koroglu 16. July 2009 11:42
Katıldığım toplantılarda ve seminerlerde hangi IDE yi kullanıyorsunuz sorusuna çoğu kişinin halen daha Visual Basic 6 veya Visual C++ 6.0 gibi yanıtlar vermesi dikkatimi çekti. Bir çok yazılıma gönül vermiş ve bu konuda profesyonel çalışan arkadaşların halen daha bu sürümleri kullanıyormuş. Ben Visual Studio .NET ile 2004 yılında tanıştım o yıldan beridirde .NET framework takipçisiyim. İlk başta bende eski sistemin daha kolay olduğunu bu yeni IDE’yi öğrenmenin işkence olacağını düşünüyordum. Daha sonra o dönemlerde bir projeye başladım, bir standalone maliyet çıkarma – birim maliyet yazılımıydı. O an bir karar verdim, bu yazılımı C# ve VB.NET ile yazacaktık. Bu bir güncelleme değildi, tamamen sıfırdan yazılacak bir yazılımdı. Daha önceki kütüphanelerimizi bu projede çok fazla kullanmayacaktık, kullanacak olsak bile bu sefer kararlıydım ve bütün VB6 kodlarımızı bir şekilde Visual Studio içindeki araçla ve el yordamıyla VB.NET kodlarına dönüştürecektim. İki ayımız vardı ve bir cesaret ile başladık. Başlarda çok zorlandık, daha ilk yazılım yazmaya başladığım günlerdeki gibi sürekli döküman okuyorduk, her yazdığımızı silip baştan yazıyorduk. Yanlız bu aşamalar sırasında öyle değerli bilgiler edindik ki, daha önce VB6 ile nekadar uzun zamanda ve nekadar fazla kod yazarak hallettiğimiz işleri artık Visual Studio içinde bulunan hazır kütüphaneler sayesinde çok daha kısa zamanda ve kısayoldan hallettik. Başta Visual Studio .NET i öğrenmek için kaybettiğimiz zamanı programın yazım aşamasında fazlasıyla kazandık ve bu program beklenenden 20 gün önce bitti. Sunuçtada ve hazır dataset bağlantıları sayesinde yazdığımız yazılım okadar ileriye dönük bir hal aldıki, şimdi istenirse ler yaptığımız her kütüphaneyi hemen online bir sürüme geçebiliriz, internet servisi yapıp silverlight içinden çağırabilir yada başka bir yazılımın içinden, hatta windows mobile altında çalışan mobil bir yazılımın içinden çağırabiliriz. Bütün bunların yanında yazılımımızın parçalarını n-tier katmanlı bir mimaride, farklı dillerde yazdık. Visual studio .NET’in Common Language Referance (CLR) olayı sayesinde bütün bu farklı dillerdeki kütüphaneleri tek bir yazılım altında derleyebildik. Birde bütün bunlara ek Visual Studio .NET ile yazdığınız yazılımların yeni işletim sistemlerine uyumluluk sorunları neredeyse sıfıra iniyor. Hepsinin ötesinde aynı “do-loop” veya “for”, .NET ile derlendiğinde Visual Basic ile yapılan derlemeden daha hızlı çalışıyordu. Kod aynı kod ama derleyici optimizasyonu çok farklı ve çok daha başarılı. Bu yazıda anlatamadığım daha bir çok özelliği olan Visual Studio .NET’den artık vazgeçmem mümkün değil. Şu anda 2008 Team System kullanıyoruz, .NET Framework 4.0 ve Visual Studio 2010 u dört gözle bekliyorum. http://www.microsoft.com/visualstudio/en-us/default.mspx

Tags: , , , , , , , , , ,

Powered by BlogEngine.NET 2.0.0.36
Theme by Mads Kristensen | Modified by Mooglegiant | Some Development Modifications by Oðuz Köroðlu

codeplex projects

VMBase WinRT
vmbase.codeplex.com/

Real Square
realsquare.codeplex.com/

Silver Designer
silverdesigner.codeplex.com/ 

WPF Multitouch CMS
wpfmultitouchcms.codeplex.com/

MongoDB Backup and Restore Manager
mongobackup.codeplex.com/

Bounce Ball
bounceball.codeplex.com/

Cloud Wallet
cloudwallet.codeplex.com/

Windows Mobile 6 Calculator
wm6calculator.codeplex.com/

AI4CAD-3D
ai4cad3d.codeplex.com/

LAM-Local Area Messaging
lam.codeplex.com/

Right Click Calculator
rightclickcalculator.codeplex.com/

WPF Hex Editor
wpfhexeditor.codeplex.com/

Get Paint.NET!

Month List