Wednesday 10 August 2011

Хеш код для папки (MD5).

Сьогодні я хочу написати дещо про задачу з якою стикнувся на роботі. Суть її в тому що мені треба промоніторити чи змінились файли в конкретній папці і при наявності будь яких змін вивести повідомлення і тд. Відслідковувати необхідно сам факт зміни даних в каталозі отож логічно було зроблено припущення що по папці нам необхідно генерувати якийсь хешкод і порівнювати його при заупуску програми.
Для діставання хешу файлу досить скоро було знайдено рішення, але нічого схожого бля папки не було…

try
{
    FileStream file = new FileStream(fileName, FileMode.Open);
    MD5 md5 = new MD5CryptoServiceProvider();
    byte[] retVal = md5.ComputeHash(file);
    file.Close();
 
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < retVal.Length; i++)
    {
        sb.Append(retVal[i].ToString("x2"));
    }
    return sb.ToString();
}
catch (FileNotFoundException e)
{
    Log.Debug(e.Message);
}

Отож якщо в нас в папці 100 файлів ми отримуємо 100 хешів і їхнє зберігання та порівняння не є приємлимим рішенням. Після недовгих роздумів було знайдено просте як дошка рішення яким і хочу з вами поділитись, суть його заключається в тому що ми можемо взяти хеш або для стріма або для масиву байт, в даному випадку ми беремо всі хеші для файлів і обєднуємо їх, після чого цю стрічку перетворюємо в масив байтів і генеруємо для неї свій хеш. Ось як виглядає код:
public string GetMD5ForFolder(IEnumerable<FileInfo> listOfFiles)
       {
           string result = string.Empty;
           try
           {
               foreach (FileInfo file in listOfFiles)
               {
                   result = result + GetMD5HashFromFile(file.FullName);
               }
 
               MD5 md5 = new MD5CryptoServiceProvider();
               byte[] computeHash = md5.ComputeHash(Encoding.Default.GetBytes(result));
 
               StringBuilder sBuilder = new StringBuilder();
               for (int i = 0; i < computeHash.Length; i++)
               {
                   sBuilder.Append(computeHash[i].ToString("x2"));
               }
               return sBuilder.ToString();
           }
           catch (ArgumentNullException ex)
           {
               Log.Error(ex.Message);
               throw new ServiceAgentsException(ex.Message);
           }           
       }
Я не тестував це рішення на великих каталогах, але для каталогу з кількістью файлів до 100 я думаю що воно працюватиме без проблем. Як завжди буду радий почути будь які коменти що до коду і побачити кращі варіанти реалізації цієї задачі.

Tuesday 9 August 2011

Що необхідно знати для того щоб стати Intermediate Software Developer.

Доброго дня всім.

Сьогодні я б хотів поговирити про карєрне зростання і підхід до нього в моїй компанії. Отож компанія досить велика і можливості зростання теж досить хороші, для цього навіть налагоджена відповідна система і якщо ви хочете перейти на наступну позицію по карєрній мапі то ви можете ознайомитись з усіма необхідними вимогами, підготуватись і назначити дату для провірки вашої відповіднсті даній позиції. В моєму випадку наступною для мене позицією є Intermid Software Devoloper. Окрім загальних знань по технологіям з якими я працюю також необхідно як мінімум одна презентація, знання англійської на рівні Intermediate low і як мінімум 2 роки досвіду.

Що до знань яких вимагає дана позиція я напишу трохи пізінше а на даний час давайте розглянемо інші деталі. З досвідом все зрозуміло і чесно кажучи досить серйозно, дуже рідко можна піднятись по карєрній мапі немаючи відповідного досвіду, тому тут вище голови стрибнути практично неможливо, щодо англійської то тут дещо краща ситуація і на скільки я знаю якщо рівень трішки не дотягує то можна просто пообіцяти його підтягнути і попрацювати над ним вже на позиції інтерміда. Презентація це в певному сенсі найпростіша частина, для переходу на інтерміда потрібна як мінімум презентація для власної команди. Я вирішив ознайомити команду з ASP MVC 3. На скільки я знаю майже ніхто з тімки окрім мене реального досвіду в даній технології немає тому з однієї сторони зможу подати корисний матеріал а з іншого ймовірність що завалять компетентними питаннями невелика ) .

Що до таблиці з вимогами то вона розділена на три рівні знаннь: початковий, середній та експерт. Для джуніор девелоперів список вимог набагато менший і я додам його в наступному пості, про вимоги для сеньора поки що говорити дуже рано тому зосереджусь на вимогах для інтерміда:

Design – OOD(Обєктно Орієнтований Дизайн)

CL1 (Beginner)

Abstraction

Encapsulation

Inheritance vs. Aggregation

Modularity

Polymorphism

Types vs. Classes

Abstraction Qualities (cohesion, coupling, etc)

CL2 (Competent)

GoF Design Patterns

Architectural Patterns: Layered Architecture

Architectural Patterns: MVC

Architectural Patterns: SOA and EDA

Architectural Patterns: IoC

.Net

CL1 (Beginner)

System types (value, reference, boxing, generic, type forwarding)

Declare classes, interfaces, class members, static and member

Common Exceptions an exception handling

Type conversion

Equality comparison

System collections

Generic collections.

Events and delegates.

Strings and StringBuilder

Configuration files (System.Configuration namespace)

Serializers, serialize/deserialize objects to binary format

Serialization, serialize/deserialize objects to XML format

Files and Folders (System.IO namespace)

Streams (Stream, FileStream, etc.)

TextReader, TextWriter

XML manipulations

CL2 (Competent)

Specialized collections (CollectionsUtils BitVector32, HybridDictionary etc.)

Implement special .NET interfaces (IConvertible, IDisposable, IComparable etc.)

Managing Application domains

Custom serialization

Custom attributes

Garbage collection

Expose COM components to the .NET Framework and .NET Framework components to COM.

SQL

CL1 (Beginner)

DDL for tables, relationships, primary keys, foreign keys

Data Types (character string, binary string, exact numbers, approximate numbers, date and time, boolean, null)

Data manipulation (insert, update, delete)

Retrieving data (simple select statement)

Using of standard SQL functions

Multi-table queries (inner joins, outer joins)

CL2 (Competent)

Creating and modifying database objects (indexes, views)

Using complex criteria (ORDER BY, GROUP BY, HAVING, IN, ... )

SQL operators

Sessions, transactions, locks

Implementing of custom SQL functions

SQL procedural language, stored procedures, triggers

Retrieving data; Combining the results of multiple queries (union, excep, subqueries)

Handling errors in SQL statements

Cursors

Verification - Automated Testing - .Net

CL1 (Beginner)

Unit testing fundamentals and elementary tests

CL2 (Competent)

Organizing and building unit tests (Nunit, VS 2008, mbUnit)

Managing test suites

Working with test data

Running unit tests

Reporting unit results

Mocks/Stubs (Nmock, POCMock, etc.)

Code Coverage Tools (NCover)

Design – Modeling

CL1 (Beginner)

UML: Basic Diagram Types

UML: Use Case Diagram (Essentials)

UML: Class Diagram (Essentials)

Entity Relationship Diagrams

Data Flow Diagrams

Refactoring

CL1 (Beginner)

Refactoring Concept (what/when/why)

Moving Features Between Objects (basic)

Move Method

Move Field

Organizing Data (basic)

Encapsulate Field

Encapsulate Collection

Composing Methods (basic)

Extract Method

Inline Method

Inline Temp

Replace Temp with Query

Split Temporary Variable

Simplifying Conditional Expressions (basic)

Decompose Conditional Expression

Consolidate Conditional Expression

Consolidate Duplicate Conditional Fragments

Remove Control Flag

Replace Conditional with Polymorphism

Concurrency - .Net

CL1 (Beginner)

Understand CLR threading

Using ASync methods

lock keyword or System.Threading.Monitor

Mutual exclusion and condition synchronization problems

Deadlock problem

В даний список я виніс основні як на мене вимоги, але токож до нього входять вимоги по якості коду, англійскій мові, роботі з SVN репозиторієм і кінцевою інтеграцією. Список як бачите досить великий і я по можливості буду додавати цікавий матеріал з яким зустрінусь по мірі підготовки. На даний час я маю реальний досвід у розробці і відповідно в деяких темах мені лише треба навести порядок. В основному підготовка йде за принципом памятаю непамятаю і незнаю. Відповідно відмічаю кожен пункт, після чого переходжу до навчання. Щодня по можливості перечитую ту чи іншу тему роблю невеличкі записи і обговорюю прочитане з іншими девелоперами…

Успіхів у підготовці!