Социальная сеть книголюбов

August 23rd, 2010

znaio.com

Александр Степанов (STL). Лекции в Яндексе

June 16th, 2010

А здесь сборник его статей и книга

Must read для каждого серьезного программера

Advanced Format

January 29th, 2010

Western Digital начала выпуск дисков с 4K секторами. Большой Шаг вперед после 512-byte наследия DOS.
Сейчас доступны модели WD10EARS, WD15EARS, WD20EARS 64MB Cache.
Почитать тожно здесь

Future ORG technology

January 14th, 2010

Осенила мысль:

Если основные компонентные технологии Microsoft назывались:

  • COM
  • .NET
    • то логично предположить, что следующей станет .ORG.
      Конечно есть еще варианты .EDU и .MIL (но последняя только в случае ядерной войны ;)

Как пилят в ВТБ

December 15th, 2009

Как пилят в ВТБ

Появился VS 2010 Beta 2

October 28th, 2009

В отличие от 1-й Beta, этой уже вполне можно пользоваться.
Главное из добавлений:

  • поддержка C++0x: nullptr/nullptr_t, lambda-functions
  • MSBuild 4.0 – теперь IDE не привязана к конкретным инструментам и поностью настраиваема под любые компиляторы с помощью XML

Еще о темных делах Газпрома

October 18th, 2009

Продолжение войны Навального с Газпромом
Как Газпром турбину покупал

Как отмазывают тех, кто пилит Газпром

August 7th, 2009

Про расследование темной деятельности менеджеров Газпрома господином Навальным:
Как отмазывают тех, кто пилит Газпром

Strongly typed enums in C++0x и их эмуляция в Visual C++

August 2nd, 2009

Новый стандарт С++ включает удобную фичу Strongly Typed Enums, также называемую Scoped Enums:

enum class En {
    A = 2
};
En var = En::A;  // вместо En var = A;

Для поддержки этого в текущем компиляторе VC++ можно использовать такие макросы:

#define DEF_ENUM(name) struct enum_##name { enum E
#define END_ENUM(name) ; }; typedef enum_##name::E name; 

DEF_ENUM(En) {
    A = 2
} END_ENUM(En)

En var = En::A;  // вместо En var = A;

RC4 C# implementation

April 8th, 2009

Реализация криптоалгоритма RC4 для .NET:

using System;
using System.Security.Cryptography;

using Utils;

namespace Crypto {

internal class RC4Cryptor : ICryptoTransform {
	internal byte[] S;

	public bool CanReuseTransform { get { throw new NotImplementedException(); } }
	public bool CanTransformMultipleBlocks { get { throw new NotImplementedException(); } }
	public int InputBlockSize { get { throw new NotImplementedException(); } }
	public int OutputBlockSize { get { throw new NotImplementedException(); } }
	public int TransformBlock(byte[] inputBuffer, int inputOffset, int inputCount, byte[] outputBuffer, int outputOffset) {
		throw new NotImplementedException();
	}

	public void Dispose() {
	}

	public byte[] TransformFinalBlock(byte[] inputBuffer, int inputOffset, int inputCount) {
		byte[] r = new byte[inputCount];
		for (int i = 0, j = 0; i < inputCount; ) {
			j += S[++i % 256];
			Ut.Swap(ref S[i % 256], ref S[j % 256]);
			int t = S[i % 256] + S[j % 256];
			r[i-1] = inputBuffer[inputOffset + i - 1] ^ S[t % 256];
		}
		return r;
	}
}

public class RC4 : SymmetricAlgorithm {

	byte[] S = new byte[256];
	byte[] K = new byte[256];

	public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV) {
		throw new NotImplementedException();
	}

	public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV) {
		throw new NotImplementedException();
	}

	public override void GenerateIV() {
		throw new NotImplementedException();
	}

	public override void GenerateKey() {
		var rnd = new Random();
		var key = new byte[16];
		rnd.NextBytes(key);
		Key = key;
	}

	public override ICryptoTransform CreateEncryptor() {
		return new RC4Cryptor() { S = (byte[])S.Clone() };
	}

	public override ICryptoTransform CreateDecryptor() {
		return new RC4Cryptor() { S = (byte[])S.Clone() };
	}

	public override byte[] Key {
		set {
			base.Key = value;

			for (int i = 0; i < S.Length; ++i) {
				S[i] = (byte)i;
				K[i] = Key[i % Key.Length];
			}

			for (int i=0, j=0; i < S.Length; ++i)
				Ut.Swap(ref S[i], ref S[j = (j + S[i] + K[i]) % 256]);
		}
	}
}

}