Monday, February 28, 2011

Some MS stuff


Бита присланная, в ознаменование запуска Visual Studio 2010:
Решай свои проблемы эффективно.
Очень мотивирует.


Китайский диск Visual Studio 2010 — это просто праздник какой-то. Чего здесь только нет. :-))


Wednesday, February 23, 2011

Parable of the comments

Однажды в стране исходных кодов Великий решил ввести налог на исходный код, сказав:
“Каждый должен будет отдать 20 % своего исходного кода“.
А не компилируемый исходный код – равносилен смерти.
Сразу же нашелся хитрый и умный программист, который пришел к царю и заявил ему:
“Давай заключим пари! Если я прямо сейчас отдам тебе 20 % своего кода, и после этого оставшийся код скомпилируется без единой ошибки, то ты отменишь налог”.
Умный программист знал, что может с легкостью отдать ему те строки кода, которые содержат комментарии. А комментировал он свой код тщательно.
Великий, восхитившись смелостью программиста воскликнул: “Хорошо! Я принимаю твоё пари, но при одном условии: отданные мне строки кода не могут быть пустыми!”.
Отдав 20 % исходного кода с комментариями, программист выиграл пари.
Таким образом, программист проучил Великого, показав остальным, насколько полезны бывают комментарии.

Saturday, January 8, 2011

Game of Life

Игра "Жизнь" (англ. Game of Life, или просто Life) — это клеточный автомат, придуманный английским математиком Джоном Конвеем (John Horton Conway) в 1970 году.
В качестве игрового поля выступает вселенная. Каждая клетка поля может быть живой или мёртвой. Клетка имеет восемь соседей. Распределение живых клеток в начале игры называется первым поколением. Каждое следующее поколение рассчитывается на основе предыдущего по таким правилам:
- мёртвая клетка, рядом с которой ровно три живые клетки, оживает;
- если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; если же соседей меньше двух или больше трёх, то клетка умирает.
Игрок не принимает прямого участия в игре, а лишь расставляет начальную конфигурацию «живых» клеток, которые затем взаимодействуют согласно правилам уже без его участия.
В процессе игры могут получаться очень замысловатые и красивые комбинации.



В конце игры выживают устойчивые (которые остаются неизменными) и периодические (у которых состояние повторяется через некоторое число поколений) фигуры.

Friday, January 7, 2011

Quine

Квайн или куайн — это компьютерная программа, выдающая на выходе точную копию своего исходного текста.
Название происходит от имени американского логика, математика и философа Уилларда Ван Ормана Куайна (англ. Willard Van Orman Quine) (1908—2000), который занимался углубленным изучением косвенного самоупоминания.
Программа не считается куайном, если используется чтение кода программы из файла, ввод его с клавиатуры и т. д. Также программа не считается куайном, если не содержит вообще никакого кода.

Приведу свой вариант реализации куайна.

#include <stdio.h> 
void main() { puts("#include <stdio.h>"); char *qstr = "void main() { puts(\"#include <stdio.h>\"); char *qstr = \"%s\"; printf(qstr, qstr); }"; printf(qstr, qstr); }

Thursday, January 6, 2011

Цвет текста и фона в консоли

Для того чтобы в консоль вывести текст с выбранным цветом текста и фона необходимо написать следующий код:

#include <stdio.h>
#include <windows.h>

void SetColor(DWORD color)
{
  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTextAttribute(hConsole, color);
}

void main()
{
  SetColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
  printf("Red\n");
  SetColor(FOREGROUND_GREEN | FOREGROUND_INTENSITY);
  printf("Green\n");
  SetColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY);
  printf("Blue\n");

  SetColor(BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
  printf("White\n");

  SetColor(0x0F);
  printf("\n");
}

* This source code was highlighted with Source Code Highlighter.
Это даст следующий эффект:


Видно, что белый цвет получается путем смешивания красного, зеленого и синего цветов.
В коде, можно также задать цвет, передав его в числовом формате.
Командная строка по команде color\? подсказывает возможные доступные цвета:

0 = Черный  8 = Серый
1 = Синий   9 = Светло-синий
2 = Зеленый A = Светло-зеленый
3 = Голубой B = Светло-голубой
4 = Красный C = Светло-красный
5 = Лиловый D = Светло-лиловый
6 = Желтый  E = Светло-желтый
7 = Белый   F = Ярко-белый

Можно задавать цвет фона и текста в шестнадцатеричном формате, для этого используется две цифры. Первая цифра определяет цвет фона, а вторая - цвет текста.

Sunday, November 21, 2010

Trees builder

Hello world!
Suddenly I’ve decided to make the simple trees builder.
No sooner said than done.

You can see result in the image below.


Every time the algorithm generates a new tree.
After some variations variables, I found the results' similarity with the real species of trees.

[Show / hide source code]
//------------------------------------------------------------------------------
// Build a new tree
//------------------------------------------------------------------------------
void BuildTree(Point startPoint, Point endPoint, int k)
{
    Random rnd = new Random((int)DateTime.Now.Ticks);
    Pen pen = new Pen(Color.Black, k);

    if (hasLeaves)
    {
        // set the color to rnd green and width = 5 for last branch as for a leaf
        if (k < 1) pen = new Pen(Color.FromArgb(0, rnd.Next(80, 160), 0), 5);
    }

    m_Graphics.DrawLine(pen, startPoint, endPoint);

    if (k > 0)
    {
        Point pNext = new Point();
     
        // add branch to the right
        pNext = new Point(endPoint.X + rnd.Next(0, spread), endPoint.Y - rnd.Next(0, speed));
        BuildTree(endPoint, pNext, k - 1);
     
        // add branch to the left
        pNext = new Point(endPoint.X - rnd.Next(0, spread), endPoint.Y - rnd.Next(0, speed));
        BuildTree(endPoint, pNext, k - 1);

        Application.DoEvents();
    }
}

* This source code was highlighted with Source Code Highlighter.

Monday, October 18, 2010

Steganography

The word steganography means "concealed writing" from the Greek words steganos meaning "covered", and graphein meaning "to write".

This is very ancient technology. So I’ll try to explain how it works.
It’s not a secret that every color can be represented as tuples of numbers, typically as three or four values or color components (e.g. RGB and CMYK).

It’s possible to use least significant bits of each color component for data storage. Thus it’s possible to use images for information hiding or steganography.
Let’s estimate the color component loss level for data storage.
The maximum loss level for 1 bit for color component coding will be 1b = 1 and the error will be:
1/255 * 100 % = 0,392 %
The maximum loss level for 2 bits per color component coding will be 11b = 3. So the maximum error per color component is equal:
3/255 * 100 % = 1,176 %
For 3 bits the maximum loss level will be 111b = 8 and the error will be:
8/255 * 100 % = 3,137 %
In common, human eye couldn’t distinguish so little difference in colors.

The picture below shows a principle of steganography using 2 bits per color channel coding. 
 
To hide ‘A’ char using 2 bits per color component coding required 4 color components or 2 pixels (RGB and yet another R).
Below you can see source code in C# for 2 bits per color component images coding and decoding.

[Show / hide source code]
//---------------------------------------------------------------------
// CodeStegoImage
//---------------------------------------------------------------------
private Bitmap CodeStegoImage(Image inputImage, string inputText)
{     
  string header = "DSTG"; // Steganorgaphy header
  int textLen = header.Length + inputText.Length + 4; // 4 bytes (65535 chars) for text length
  string lenStr = textLen.ToString("0000"); // make formated NNNN text length string
  string text = header + lenStr + inputText;

  byte[] bytes = new byte[text.Length * 4 + 4]; // 4 bytes for char using 2 bits coding + 4 bytes extra

  for (int i = 0; i < text.Length; i++)
  {
    bytes[i*4+0] = (byte)((System.Convert.ToChar(text[i]) & (byte)System.Convert.ToInt32("11000000", 2)) >> 6);
    bytes[i*4+1] = (byte)((System.Convert.ToChar(text[i]) & (byte)System.Convert.ToInt32("00110000", 2)) >> 4);
    bytes[i*4+2] = (byte)((System.Convert.ToChar(text[i]) & (byte)System.Convert.ToInt32("00001100", 2)) >> 2);
    bytes[i*4+3] = (byte)(System.Convert.ToChar(text[i]) & (byte)System.Convert.ToInt32("00000011", 2));
  }

  Bitmap bmIn = new Bitmap(inputImage);   // input bitmap
  Bitmap bmOut = new Bitmap(inputImage);  // output bitmap
  int counter = 0;

  for (int i = 0; i < inputImage.Height; i++)
  {
    for (int j = 0; j < inputImage.Width; j++)
    {
      Color colIn = bmIn.GetPixel(j, i);

      // clear 2 LSB
      uint ro = (uint)colIn.R & 0xFC; // 0xFC = 11111100b
      uint go = (uint)colIn.G & 0xFC;
      uint bo = (uint)colIn.B & 0xFC;

      Color colOut; // output color
      if (counter < text.Length * 4) // 4 bytes per char
      {
        colOut = Color.FromArgb((int)ro + bytes[counter + 0], (int)go + bytes[counter + 1], (int)bo + bytes[counter + 2]);
        counter += 3; // +3 bytes to next RGB pixel
      }
      else
        colOut = colIn;
      bmOut.SetPixel(j, i, colOut);
    }
  }
  return bmOut;
}

* This source code was highlighted with Source Code Highlighter.