<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title></title>
	<atom:link href="http://programmersclub.ru/feed/" rel="self" type="application/rss+xml" />
	<link>http://programmersclub.ru</link>
	<description></description>
	<lastBuildDate>Tue, 09 Mar 2010 21:21:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Drag &amp; Drop объект в любом окне</title>
		<link>http://programmersclub.ru/dragdrop-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82/</link>
		<comments>http://programmersclub.ru/dragdrop-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 13:31:35 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Win Api]]></category>
		<category><![CDATA[Архив]]></category>
		<category><![CDATA[Исходники]]></category>
		<category><![CDATA[Code::Blocks]]></category>
		<category><![CDATA[Drag & Drop]]></category>
		<category><![CDATA[FindWindow]]></category>
		<category><![CDATA[RegisterWindowClassEx]]></category>
		<category><![CDATA[SetWindowHook]]></category>
		<category><![CDATA[WindowProc]]></category>
		<category><![CDATA[хендл]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=433</guid>
		<description><![CDATA[Тема на форуме.
Drag &#038; Drop объект в чужом окне
http://programmersforum.ru/showthread.php?t=4473
Вопрос:

Cделать так, чтобы в любом окне можно было создать Drag&#038;Drop объект, который будет являться копией объекта из моей программы
Ответ
Имея хэндл чужого окна, можно сделать с ним всё тоже, что и с собственным. Всё, что нужно &#8211; это: 1) Написать функцию (обработчик событий) вида LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM) в [...]]]></description>
			<content:encoded><![CDATA[<p>Тема на форуме.<br />
<a href="http://programmersforum.ru/showthread.php?t=4473">Drag &#038; Drop объект в чужом окне</a><br />
<a href="http://programmersforum.ru/showthread.php?t=4473">http://programmersforum.ru/showthread.php?t=4473</a></p>
<p><strong>Вопрос:</strong></p>
<blockquote><p>
Cделать так, чтобы в любом окне можно было создать Drag&#038;Drop объект, который будет являться копией объекта из моей программы</p></blockquote>
<blockquote><p>Ответ</p></blockquote>
<blockquote><p>Имея хэндл чужого окна, можно сделать с ним всё тоже, что и с собственным. Всё, что нужно &#8211; это: 1) Написать функцию (обработчик событий) вида LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM) в которой реализуйте Drag n Drop &#8211; это достаточно просто. Для этого нужно будет обработать всего два события &#8211; WM_LBUTTONDOWN и WM_LBUTTONUP. При реализации этого используйте функцию SetCapture, чтобы при выходе курсора за границы окна во время перетаскивания, перетаскиваемый объект не &#8220;падал&#8221;. В своё время я с этим намучился. 2) Зарегестрируйте свой класс (RegisterWindowClassEx) &#8211; в вашем примере, ShiSha_34, это будет чёрное окно без рамки. В качестве соответсвующего параметра (я имею ввиду поле lpfnWndProc структуры WNDCLASSEX) ф-ии RegisterWindowClassEx укажите написанный вами обработчик событий. 3) Получите хэнл окна, в котором вы хотите создать свой чёрный квадрат. Это можно сделать, например, заная имя и (или) класс чужого окна при помощи ф-ии FindWindow. Или же поставить ловушку (SetWindowHook), которая будет срабатывать при клике мышкой на выбраном окне. Метод не важен и здесь о них писали предостаточно. Получив хэндл чужого окна, создайте свой объект при помощи ф-ии CreateWindowEx, в которой в качестве класса укажите зарегестрированный вами клас (пункт 2), а в качестве хэндла родительского окна &#8211; полученный хэндл. В результате должно получиться то, что вы описали в вопросе. Для получения более подробно информации воспользуйтесь WIN32 Programmer&#8217;s Reference.</p></blockquote>
<p><a href="http://programmersforum.ru/showpost.php?p=23369&#038;postcount=3">http://programmersforum.ru/showpost.php?p=23369&#038;postcount=3</a></p>
<blockquote><p>Сообщение будет посылаться форме чужого приложения, но обрабатываться будет процедурой, указанной при регистрации класса объекта, которому это сообщение предназначено.</p></blockquote>
<p><a href="http://programmersforum.ru/showpost.php?p=23975&#038;postcount=6">http://programmersforum.ru/showpost.php?p=23975&#038;postcount=6<br />
</a></p>
<blockquote><p>Вот код первого приложения (пустая форма). Это можно не читать, важно только то, что класс окна и его имя &#8211; SIMPLE_WINDOW. Код сгенерирован автоматически средой Code::Blocks.</p></blockquote>
<p><code></p>
<p>#include <windows.h></p>
<p>/*  Declare Windows procedure  */<br />
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);</p>
<p>/*  Make the class name into a global variable  */<br />
char szClassName[ ] = "SIMPLE_WINDOW";</p>
<p>int WINAPI WinMain (HINSTANCE hThisInstance,<br />
                     HINSTANCE hPrevInstance,<br />
                     LPSTR lpszArgument,<br />
                     int nFunsterStil)<br />
{<br />
    HWND hwnd;               /* This is the handle for our window */<br />
    MSG messages;            /* Here messages to the application are saved */<br />
    WNDCLASSEX wincl;        /* Data structure for the windowclass */</p>
<p>    /* The Window structure */<br />
    wincl.hInstance = hThisInstance;<br />
    wincl.lpszClassName = szClassName;<br />
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */<br />
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */<br />
    wincl.cbSize = sizeof (WNDCLASSEX);</p>
<p>    /* Use default icon and mouse-pointer */<br />
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);<br />
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);<br />
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);<br />
    wincl.lpszMenuName = NULL;                 /* No menu */<br />
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */<br />
    wincl.cbWndExtra = 0;                      /* structure or the window instance */<br />
    /* Use Windows's default color as the background of the window */<br />
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;</p>
<p>    /* Register the window class, and if it fails quit the program */<br />
    if (!RegisterClassEx (&#038;wincl))<br />
        return 0;</p>
<p>    /* The class is registered, let's create the program*/<br />
    hwnd = CreateWindowEx (<br />
           0,                   /* Extended possibilites for variation */<br />
           szClassName,         /* Classname */<br />
           "SIMPLE_WINDOW",       /* Title Text */<br />
           WS_OVERLAPPEDWINDOW, /* default window */<br />
           CW_USEDEFAULT,       /* Windows decides the position */<br />
           CW_USEDEFAULT,       /* where the window ends up on the screen */<br />
           544,                 /* The programs width */<br />
           375,                 /* and height in pixels */<br />
           HWND_DESKTOP,        /* The window is a child-window to desktop */<br />
           NULL,                /* No menu */<br />
           hThisInstance,       /* Program Instance handler */<br />
           NULL                 /* No Window Creation data */<br />
           );</p>
<p>    /* Make the window visible on the screen */<br />
    ShowWindow (hwnd, nFunsterStil);</p>
<p>    /* Run the message loop. It will run until GetMessage() returns 0 */<br />
    while (GetMessage (&#038;messages, NULL, 0, 0))<br />
    {<br />
        /* Translate virtual-key messages into character messages */<br />
        TranslateMessage(&#038;messages);<br />
        /* Send message to WindowProcedure */<br />
        DispatchMessage(&#038;messages);<br />
    }</p>
<p>    /* The program return-value is 0 - The value that PostQuitMessage() gave */<br />
    return messages.wParam;<br />
}</p>
<p>/*  This function is called by the Windows function DispatchMessage()  */</p>
<p>LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)<br />
{<br />
    switch (message)                  /* handle the messages */<br />
    {<br />
        case WM_DESTROY:<br />
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */<br />
            break;<br />
        default:                      /* for messages that we don't deal with */<br />
            return DefWindowProc (hwnd, message, wParam, lParam);<br />
    }</p>
<p>    return 0;<br />
}<br />
</code></p>
<p><a href="http://programmersforum.ru/showpost.php?p=23992&#038;postcount=7">http://programmersforum.ru/showpost.php?p=23992&#038;postcount=7</a></p>
<blockquote><p>Вот код второго приложения, которое при запуске находит по имени первое приложение и создаёт в нём синий квадрат. Кварат ведёт себя как родной: его можно перетаскивать в окне мышкой, при сворачивании и разворачивании окна квадрат востанавливается в прежней позиции.
</p></blockquote>
<p><code><br />
#include <windows.h></p>
<p>/*  Declare Windows procedure  */<br />
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);</p>
<p>/*  Make the class name into a global variable  */<br />
char szClassName[ ] = "BLACK_SQUARE";<br />
HWND Target;</p>
<p>int WINAPI WinMain (HINSTANCE hThisInstance,<br />
                     HINSTANCE hPrevInstance,<br />
                     LPSTR lpszArgument,<br />
                     int nFunsterStil)<br />
{<br />
    HWND hwnd;<br />
    MSG messages;<br />
    WNDCLASSEX wincl;</p>
<p>    wincl.hInstance = hThisInstance;<br />
    wincl.lpszClassName = szClassName;<br />
    wincl.lpfnWndProc = WindowProcedure;<br />
    wincl.style = CS_DBLCLKS;<br />
    wincl.cbSize = sizeof (WNDCLASSEX);<br />
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);<br />
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);<br />
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);<br />
    wincl.lpszMenuName = NULL;<br />
    wincl.cbClsExtra = 0;<br />
    wincl.cbWndExtra = 0;<br />
    wincl.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1);<br />
//СОЗДАВАЕМОЕ ОКНО ДОЛЖНО ХОТЬ ЧУТЬ-ЧУТЬ ОТЛИЧАТСЯ ЦВЕТОМ ОТ РОДИТЕЛЬСКОГО:)</p>
<p>    if (!RegisterClassEx (&#038;wincl)) return 0;</p>
<p>    //ДО ЭТОГО МОМЕНТА ВЕСЬ КОД АНАЛОГИЧЕН ПРЕДЫДУЩЕМУ.<br />
    //А ТЕПЕРЬ - ВКУСНЕНЬКОЕ</p>
<p>    Target=FindWindow("SIMPLE_WINDOW","SIMPLE_WINDOW");<br />
    if (!Target)<br />
    {<br />
      MessageBox(0,"Запустите приложение SIMPLE_WINDOW","!! ERROR",MB_OK);<br />
      return 0;<br />
    }<br />
    hwnd = CreateWindowEx (<br />
           0,<br />
           szClassName,<br />
           "BLACK_SQUARE",<br />
           WS_CHILD,  //НАШЕ ОКНО БУДЕТ ДОЧЕРНИМ ДЛЯ SIMPLE_WINDOW<br />
           100,<br />
           100,<br />
           150,<br />
           150,<br />
           Target,    //РОДИТЕЛЬСКОЕ ОКНО<br />
           NULL,<br />
           hThisInstance,<br />
           NULL<br />
           );<br />
    if (!hwnd)<br />
    {<br />
      MessageBox(0,"WINDOWSMUSTDIE","!! ERROR",MB_OK);<br />
      return 0;<br />
    }<br />
    ShowWindow(hwnd,SW_SHOW);</p>
<p>    while (GetMessage (&#038;messages, NULL, 0, 0))<br />
    {<br />
        TranslateMessage(&#038;messages);<br />
        DispatchMessage(&#038;messages);<br />
    }<br />
    return messages.wParam;<br />
}</p>
<p>//А ВОТ СОБСТВЕННО DRAG n DROP</p>
<p>LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)<br />
{<br />
  static bool lb_drag_now=false;<br />
  static POINT cursor_pos;</p>
<p>    switch (message)<br />
    {<br />
        case WM_DESTROY:<br />
          PostQuitMessage (0);<br />
          break;</p>
<p>        case WM_LBUTTONDOWN:<br />
          lb_drag_now=true;<br />
          GetCursorPos(&#038;cursor_pos);<br />
//НЕ СОВЕТУЮ ВМЕСТО ЭТОГО ИСПОЛЬЗОВАТЬ lParam, Т.К. ОН СОДЕРЖИТ ОТНОСИТЕЛЬНЫЕ КООРДИНАТЫ<br />
          SetCapture(hwnd);<br />
          break;</p>
<p>        case WM_LBUTTONUP:<br />
          lb_drag_now=false;<br />
          ReleaseCapture();<br />
          break;</p>
<p>        case WM_MOUSEMOVE:<br />
          if (lb_drag_now)<br />
          {<br />
            POINT current_pos;<br />
            RECT  wnd_rect,parent_rect;</p>
<p>            GetCursorPos(&#038;current_pos);<br />
            GetWindowRect(hwnd,&#038;wnd_rect);<br />
            GetWindowRect(Target,&#038;parent_rect);</p>
<p>            wnd_rect.left+=current_pos.x-cursor_pos.x-parent_rect.left;<br />
            wnd_rect.top+=current_pos.y-cursor_pos.y-parent_rect.top;</p>
<p>            SetWindowPos(hwnd,HWND_TOP,wnd_rect.left-4,wnd_rect.top-23,0,0,SWP_NOSIZE);<br />
            cursor_pos=current_pos;<br />
          }<br />
          break;</p>
<p>        default:<br />
            return DefWindowProc (hwnd, message, wParam, lParam);<br />
    }<br />
    return 0;<br />
}<br />
</code></p>
<p><a href="http://programmersforum.ru/showpost.php?p=23992&#038;postcount=8">http://programmersforum.ru/showpost.php?p=23992&#038;postcount=8</a></p>
<p><strong>Обсуждение:</strong><br />
<a href="http://programmersforum.ru/showthread.php?t=4473">http://programmersforum.ru/showthread.php?t=4473</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/dragdrop-%d0%be%d0%b1%d1%8a%d0%b5%d0%ba%d1%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi компонент BComPort &#8211; подача сигнала на COM порт.</title>
		<link>http://programmersclub.ru/delphi-%d0%ba%d0%be%d0%bc%d0%bf%d0%be%d0%bd%d0%b5%d0%bd%d1%82-bcomport/</link>
		<comments>http://programmersclub.ru/delphi-%d0%ba%d0%be%d0%bc%d0%bf%d0%be%d0%bd%d0%b5%d0%bd%d1%82-bcomport/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 14:15:06 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Архив]]></category>
		<category><![CDATA[Исходники]]></category>
		<category><![CDATA[Com-порт]]></category>
		<category><![CDATA[Delphi компонент]]></category>
		<category><![CDATA[переферийное устройство]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=430</guid>
		<description><![CDATA[Вопрос:
http://programmersforum.ru/showthread.php?t=4463
будильник, в определённое время он должен подать сигнал на СОМ порт &#8211; этот сигнал активизирует перефирийное устройсво аля &#8220;звонок&#8221;
форма+1 кнопка &#8211; нажали сигнал пошёл
Скачать 40 кб
Ответ:
http://programmersforum.ru/showpost.php?p=23180&#038;postcount=2
в нужное время делаем

begin
BComPort1.SetDTR(true);
end;

появляется высокий уровень на ноге DTR СОМ-порта (4 вывод порта)
или

begin
BComPort1.SetRTS(true);
end;

появляется высокий уровень на ноге RTS СОМ-порта (7 нога)
]]></description>
			<content:encoded><![CDATA[<p><strong>Вопрос:</strong></p>
<p><a href="http://programmersforum.ru/showthread.php?t=4463">http://programmersforum.ru/showthread.php?t=4463</a></p>
<blockquote><p>будильник, в определённое время он должен подать сигнал на СОМ порт &#8211; этот сигнал активизирует перефирийное устройсво аля &#8220;звонок&#8221;</p></blockquote>
<blockquote><p>форма+1 кнопка &#8211; нажали сигнал пошёл</p></blockquote>
<p><a href="http://programmersforum.ru/attachment.php?attachmentid=22306&#038;d=1267970564">Скачать 40 кб</a></p>
<p><strong>Ответ:</strong></p>
<p><a href="http://programmersforum.ru/showpost.php?p=23180&#038;postcount=2">http://programmersforum.ru/showpost.php?p=23180&#038;postcount=2</a></p>
<p>в нужное время делаем</p>
<p><code><br />
begin<br />
BComPort1.SetDTR(true);<br />
end;<br />
</code></p>
<p>появляется высокий уровень на ноге DTR СОМ-порта (4 вывод порта)<br />
или</p>
<p><code><br />
begin<br />
BComPort1.SetRTS(true);<br />
end;<br />
</code></p>
<p>появляется высокий уровень на ноге RTS СОМ-порта (7 нога)</p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/delphi-%d0%ba%d0%be%d0%bc%d0%bf%d0%be%d0%bd%d0%b5%d0%bd%d1%82-bcomport/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Мониторинг файлов в папке. слежение за файлом</title>
		<link>http://programmersclub.ru/readdirectorychangesw/</link>
		<comments>http://programmersclub.ru/readdirectorychangesw/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 01:57:51 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Win Api]]></category>
		<category><![CDATA[Исходники]]></category>
		<category><![CDATA[Пост-обзор]]></category>
		<category><![CDATA[Топик-обзор]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=422</guid>
		<description><![CDATA[Отслеживает появление в папке файлов. слежение за определенным файлом в определенной папке.
type
  PFileNotifyInformation = ^TFileNotifyInformation;
  TFileNotifyInformation = record
    NextEntryOffset: DWORD;
    Action: DWORD;
    FileNameLength: DWORD;
    FileName: array [0..MAX_PATH - 1] of WideChar;
  end;
....
//programmersforum.ru
....
procedure TForm1.Test;
const
  Filter =
  FILE_NOTIFY_CHANGE_FILE_NAME or
  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://programmersforum.ru/showthread.php?t=4437">Отслеживает появление в папке файлов. слежение за определенным файлом в определенной папке.</a></p>
<p><code>type<br />
  PFileNotifyInformation = ^TFileNotifyInformation;<br />
  TFileNotifyInformation = record<br />
    NextEntryOffset: DWORD;<br />
    Action: DWORD;<br />
    FileNameLength: DWORD;<br />
    FileName: array [0..MAX_PATH - 1] of WideChar;<br />
  end;<br />
....<br />
//programmersforum.ru<br />
....<br />
procedure TForm1.Test;<br />
const<br />
  Filter =<br />
  FILE_NOTIFY_CHANGE_FILE_NAME or<br />
            FILE_NOTIFY_CHANGE_DIR_NAME or<br />
            FILE_NOTIFY_CHANGE_ATTRIBUTES or<br />
            FILE_NOTIFY_CHANGE_SIZE or<br />
            FILE_NOTIFY_CHANGE_LAST_WRITE or<br />
            FILE_NOTIFY_CHANGE_LAST_ACCESS or<br />
            FILE_NOTIFY_CHANGE_CREATION or<br />
            FILE_NOTIFY_CHANGE_SECURITY;<br />
var<br />
  Dir: THandle;<br />
  Notify: TFileNotifyInformation;<br />
  BytesReturned: DWORD;<br />
begin<br />
  Dir := CreateFile('d:\', GENERIC_READ,<br />
    FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,<br />
    nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);<br />
  if Dir <> INVALID_HANDLE_VALUE then<br />
  try<br />
    if not ReadDirectoryChangesW(Dir, @Notify, SizeOf(TFileNotifyInformation),<br />
      False, Filter, @BytesReturned, nil, nil) then<br />
      raise Exception.Create(SysErrorMessage(GetLastError))<br />
    else<br />
      case Notify.Action of<br />
        FILE_ACTION_ADDED: Memo1.Lines.Add('New file' + Notify.FileName);<br />
        FILE_ACTION_REMOVED: Memo1.Lines.Add('Delete file' + Notify.FileName);<br />
        FILE_ACTION_MODIFIED: Memo1.Lines.Add('Modify file' + Notify.FileName);<br />
        FILE_ACTION_RENAMED_OLD_NAME: Memo1.Lines.Add('Old Name file' + Notify.FileName);<br />
        FILE_ACTION_RENAMED_NEW_NAME: Memo1.Lines.Add('New Name file' + Notify.FileName);<br />
      end;<br />
  finally<br />
    CloseHandle(Dir);<br />
  end;<br />
end;</p>
<p></code></p>
<p><a href="http://programmersforum.ru/showthread.php?t=4437">http://programmersforum.ru/showthread.php?t=4437</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/readdirectorychangesw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Функция GetKeyboardState копирует состояние 256 виртуальных клавиш в заданный буфер.</title>
		<link>http://programmersclub.ru/getkeyboardstate/</link>
		<comments>http://programmersclub.ru/getkeyboardstate/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 01:45:35 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Win Api]]></category>
		<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=420</guid>
		<description><![CDATA[Один из вариантов использования &#8211; отслеживание нажатия клавиш.

function GetKeyboardState(var: KeyState: Byte); 
Копиpует состояние установки клавиши виpтуальной клавиатуpы в KeyState. Если стаpший бит байта pавен 1, клавиша нажата. Если младший бит байта pавен 1, то с момента запуска системы клавиша нажималась нечетное число pаз.

Функция GetKeyboardState копирует состояние 256 виртуальных клавиш в заданный буфер. 
Синтаксис

BOOL GetKeyboardState
(
	PBYTE lpKeyState	// [...]]]></description>
			<content:encoded><![CDATA[<p>Один из вариантов использования &#8211; отслеживание нажатия клавиш.</p>
<blockquote><p>
function GetKeyboardState(var: KeyState: Byte); </p>
<p>Копиpует состояние установки клавиши виpтуальной клавиатуpы в KeyState. Если стаpший бит байта pавен 1, клавиша нажата. Если младший бит байта pавен 1, то с момента запуска системы клавиша нажималась нечетное число pаз.
</p></blockquote>
<p>Функция GetKeyboardState копирует состояние 256 виртуальных клавиш в заданный буфер. </p>
<p>Синтаксис<br />
<code><br />
BOOL GetKeyboardState<br />
(<br />
	PBYTE lpKeyState	// адрес массива, который принимает данные состояния<br />
);<br />
</code></p>
<p>Параметры<br />
lpKeyState<br />
Указывает на 256-байтовый массив, который принимает данные состояния для каждой виртуальной клавиши. </p>
<p>Возвращаемые значения<br />
Если функция завершается успешно, величина возвращаемого значения отличная от нуля.<br />
Если функция не выполняет задачу, величина возвращаемого значения нулевая. Чтобы получить расширенные данные об ошибках, вызовите GetLastError.</p>
<p>Замечания<br />
Прикладная программа может вызвать эту функцию, чтобы извлечь данные о текущем состоянии всех виртуальных клавиш. Состояние изменяется тогда, когда поток удаляет сообщения клавиатуры из ее очереди сообщений. Состояние не изменяется тогда, когда сообщения клавиатуры посланы в очередь сообщений.<br />
Когда функция возвращает значение, каждый элемент массива, указанного параметром lpKeyState содержит данные о состоянии виртуальной клавиши. Если старший бит равен 1, клавиша нажата; иначе она не отпущена. Если младший бит равен 1, клавиша переключилась. Клавиша, такая как CAPS LOCK, переключается, если она является включенной. Клавиша выключена и не переключает, если младший бит равен 0. Когда клавиша переключается, индикатор переключения клавиши на клавиатуре (если он есть) должен быть включен, и отключен, когда клавиша не переключается.<br />
Чтобы извлекать информацию состояния для отдельной клавиши, используйте функцию GetKeyState.<br />
Прикладная программа может использовать константы кодов виртуальных клавиш VK_SHIFT, VK_CONTROL и VK_MENU как индексы в массиве, указанном lpKeyState. Это дает состояние клавиш SHIFT, CTRL или ALT без различия между левой и правой сторонами. Прикладная программа может также использовать следующие константы кода виртуальной клавиши как индексы, чтобы различить между левыми и правыми экземплярами этих клавиш:</p>
<p><code><br />
VK_LSHIFT	VK_RSHIFT<br />
VK_LCONTROL	VK_RCONTROL<br />
VK_LMENU	VK_RMENU<br />
</code></p>
<p>Эти лево- и правосторонние константы доступны прикладной программе только через функции GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState и MapVirtualKey. </p>
<p>Смотри также<br />
GetKeyState, GetAsyncKeyState, MapVirtualKey, SetKeyboardState</p>
<p>Размещение и совместимость GetKeyboardState</p>
<p><code><br />
Windows NT				Да<br />
Win95					Да<br />
Win32s					Да<br />
Импортируемая библиотека			user32.lib<br />
Заголовочный файл				winuser.h<br />
Unicode					Нет<br />
Замечания по платформе			Не имеется<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/getkeyboardstate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>В системах аутентификации само понятие пароля сводится на другой уровень абстракции</title>
		<link>http://programmersclub.ru/rouse_%d0%bf%d0%b0%d1%80%d0%be%d0%bb%d1%8c-md5/</link>
		<comments>http://programmersclub.ru/rouse_%d0%bf%d0%b0%d1%80%d0%be%d0%bb%d1%8c-md5/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 03:00:50 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Архив]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=411</guid>
		<description><![CDATA[Rouse_ 02.06.2007: Пароль &#8211; нужен только для человека, в системах аутентификации само понятие пароля сводится на другой уровень абстракции
Обзор архива темы Шифровка паролей MD5 &#8211; пароли и хеши от 01.06.2007
Пароль &#8211; нужен только для человека, в системах аутентификации само понятие пароля сводится на другой уровень абстракции, где ошибочное применение коллизионно неустойчивых алгоритмов хеширования наподобие MD [...]]]></description>
			<content:encoded><![CDATA[<p><a href=" http://programmersclub.ru/rouse_пароль-md5/"><strong>Rouse_ 02.06.2007: Пароль &#8211; нужен только для человека, в системах аутентификации само понятие пароля сводится на другой уровень абстракции</strong></a></p>
<p>Обзор архива темы <a href="http://programmersforum.ru/showthread.php?t=4245">Шифровка паролей MD5 &#8211; пароли и хеши</a> от 01.06.2007</p>
<p>Пароль &#8211; нужен только для человека, в системах аутентификации само понятие пароля сводится на другой уровень абстракции, где ошибочное применение коллизионно неустойчивых алгоритмов хеширования наподобие MD ведет к большому бадабуму&#8230;</p>
<p><a href="http://programmersforum.ru/showpost.php?p=22195&#038;postcount=5">http://programmersforum.ru/showpost.php?p=22195&#038;postcount=5</a></p>
<p>MD хэш &#8211; колизионный. Т.е. можно достаточно легко подобрать другой пароль, хэш которого совпадет с хешем оригинального пароля. Это достаточно простая математическая задача.</p>
<p>кол-во зашифрованных паролей для MD5 2^128 &#8211; это не показатель надежности.<br />
Показатель, это кол-во коллизий на этот диапазон.</p>
<p><code><br />
uses<br />
  md5, clipbrd;<br />
procedure TForm1.FormCreate(Sender: TObject);<br />
const<br />
  A1: array [0..127] of Byte =<br />
    ($d1 ,$31 ,$dd ,$02 ,$c5 ,$e6 ,$ee ,$c4 ,$69 ,$3d ,$9a ,$06 ,$98 ,$af ,$f9 ,$5c,<br />
    $2f ,$ca ,$b5 ,$87 ,$12 ,$46 ,$7e ,$ab ,$40 ,$04 ,$58 ,$3e ,$b8 ,$fb ,$7f ,$89,<br />
    $55 ,$ad ,$34 ,$06 ,$09 ,$f4 ,$b3 ,$02 ,$83 ,$e4 ,$88 ,$83 ,$25 ,$71 ,$41 ,$5a,<br />
    $08 ,$51 ,$25 ,$e8 ,$f7 ,$cd ,$c9 ,$9f ,$d9 ,$1d ,$bd ,$f2 ,$80 ,$37 ,$3c ,$5b,<br />
    $d8 ,$82 ,$3e ,$31 ,$56 ,$34 ,$8f ,$5b ,$ae ,$6d ,$ac ,$d4 ,$36 ,$c9 ,$19 ,$c6,<br />
    $dd ,$53 ,$e2 ,$b4 ,$87 ,$da ,$03 ,$fd ,$02 ,$39 ,$63 ,$06 ,$d2 ,$48 ,$cd ,$a0,<br />
    $e9 ,$9f ,$33 ,$42 ,$0f ,$57 ,$7e ,$e8 ,$ce ,$54 ,$b6 ,$70 ,$80 ,$a8 ,$0d ,$1e,<br />
    $c6 ,$98 ,$21 ,$bc ,$b6 ,$a8 ,$83 ,$93 ,$96 ,$f9 ,$65 ,$2b ,$6f ,$f7 ,$2a ,$70);<br />
  A2: array [0..127] of Byte =<br />
    ($d1 ,$31 ,$dd ,$02 ,$c5 ,$e6 ,$ee ,$c4 ,$69 ,$3d ,$9a ,$06 ,$98 ,$af ,$f9 ,$5c,<br />
    $2f ,$ca ,$b5 ,$07 ,$12 ,$46 ,$7e ,$ab ,$40 ,$04 ,$58 ,$3e ,$b8 ,$fb ,$7f ,$89,<br />
    $55 ,$ad ,$34 ,$06 ,$09 ,$f4 ,$b3 ,$02 ,$83 ,$e4 ,$88 ,$83 ,$25 ,$f1 ,$41 ,$5a,<br />
    $08 ,$51 ,$25 ,$e8 ,$f7 ,$cd ,$c9 ,$9f ,$d9 ,$1d ,$bd ,$72 ,$80 ,$37 ,$3c ,$5b,<br />
    $d8 ,$82 ,$3e ,$31 ,$56 ,$34 ,$8f ,$5b ,$ae ,$6d ,$ac ,$d4 ,$36 ,$c9 ,$19 ,$c6,<br />
    $dd ,$53 ,$e2 ,$34 ,$87 ,$da ,$03 ,$fd ,$02 ,$39 ,$63 ,$06 ,$d2 ,$48 ,$cd ,$a0,<br />
    $e9 ,$9f ,$33 ,$42 ,$0f ,$57 ,$7e ,$e8 ,$ce ,$54 ,$b6 ,$70 ,$80 ,$28 ,$0d ,$1e,<br />
    $c6 ,$98 ,$21 ,$bc ,$b6 ,$a8 ,$83 ,$93 ,$96 ,$f9 ,$65 ,$ab ,$6f ,$f7 ,$2a ,$70);<br />
var<br />
  I: Integer;<br />
  S, Hash1, Hash2: String;<br />
begin<br />
//programmersforum.ru<br />
  S := '';<br />
  for I := 0 to 127 do<br />
    if A1[i] <> A2[i] then<br />
      S := Format(<br />
        '%s'#13#10'Несовпадение входных байт, порядковый номер: %d'#13#10 +<br />
        'значения: %d <> %d', [S, I, A1[i], A2[i]]);<br />
  Hash1 := MD5ToStr(MD5Calc(@A1[0], 128));<br />
  Hash2 := MD5ToStr(MD5Calc(@A2[0], 128));<br />
  S := S + sLineBreak + 'Первый контрольный хэш:' + Hash1;<br />
  S := S + sLineBreak + 'Второй контрольный хэш:' + Hash2;<br />
  if Hash1 = Hash2 then<br />
    S := S + sLineBreak + 'Хэшы совпали'<br />
  else<br />
    S := S + sLineBreak + 'Хэшы не совпали';<br />
  ShowMessage(S);<br />
  Clipboard.AsText := S;<br />
end;<br />
</code></p>
<p>Результат работы данного кода будет следующий:</p>
<blockquote><p>
Несовпадение входных байт, порядковый номер: 19<br />
значения: 135 <> 7<br />
Несовпадение входных байт, порядковый номер: 45<br />
значения: 113 <> 241<br />
Несовпадение входных байт, порядковый номер: 59<br />
значения: 242 <> 114<br />
Несовпадение входных байт, порядковый номер: 83<br />
значения: 180 <> 52<br />
Несовпадение входных байт, порядковый номер: 109<br />
значения: 168 <> 40<br />
Несовпадение входных байт, порядковый номер: 123<br />
значения: 43 <> 171<br />
Первый контрольный хэш:79054025255FB1A26E4BC422AEF54EB 4<br />
Второй контрольный хэш:79054025255FB1A26E4BC422AEF54EB 4<br />
Хэшы совпали
</p></blockquote>
<p>на входе два различающихся блока данных (назовем их паролями) и хэши обоих совпадают. Достаточно будет узнать сам хэш первого пароля, чтобы за достаточно непродолжительное время подобрать его аналог (второй пароль)<br />
Система же при вводе любого из этих паролей пропустит пользователя, не важно что во втором случае был введен не тот пароль &#8211; главное что совпал его хэш</p>
<p><a href="http://programmersforum.ru/showthread.php?t=4245">http://programmersforum.ru/showthread.php?t=4245</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/rouse_%d0%bf%d0%b0%d1%80%d0%be%d0%bb%d1%8c-md5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Увеличение размера вложений на форуме</title>
		<link>http://programmersclub.ru/%d1%83%d0%b2%d0%b5%d0%bb%d0%b8%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b0%d0%b7%d0%bc%d0%b5%d1%80%d0%b0-%d0%b2%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9/</link>
		<comments>http://programmersclub.ru/%d1%83%d0%b2%d0%b5%d0%bb%d0%b8%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b0%d0%b7%d0%bc%d0%b5%d1%80%d0%b0-%d0%b2%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9/#comments</comments>
		<pubDate>Sun, 20 Sep 2009 12:02:46 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Модернизация]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=337</guid>
		<description><![CDATA[Теперь к форуму можно прикреплять файлы до 20 мегабайт. Если необходимо загрузить файлы большего размера, то рекомендую разбить архив на несколько частей. Не рекомендую ставить пароли на архивы, в случае не возможности проверки архивов – поврежденные и запароленные архивы будут удалены. Также нельзя загружать варез на форум, при первом же обращении внимания администратора на варез [...]]]></description>
			<content:encoded><![CDATA[<p>Теперь к форуму можно прикреплять файлы до 20 мегабайт. Если необходимо загрузить файлы большего размера, то рекомендую разбить архив на несколько частей. Не рекомендую ставить пароли на архивы, в случае не возможности проверки архивов – поврежденные и запароленные архивы будут удалены. Также нельзя загружать варез на форум, при первом же обращении внимания администратора на варез – он будет удален.</p>
<p>Высказаться на эту тему или же предложить улучшения для форума можно в ветке – “как улучшить форум.”</p>
<p><a href="http://programmersforum.ru/showthread.php?t=24">http://programmersforum.ru/showthread.php?t=24</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/%d1%83%d0%b2%d0%b5%d0%bb%d0%b8%d1%87%d0%b5%d0%bd%d0%b8%d0%b5-%d1%80%d0%b0%d0%b7%d0%bc%d0%b5%d1%80%d0%b0-%d0%b2%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Интервью с супермодератором programmersforum.ru, Аблязовым Русланом</title>
		<link>http://programmersclub.ru/%d0%90%d0%b1%d0%bb%d1%8f%d0%b7%d0%be%d0%b2_%d0%a0%d1%83%d1%81%d0%bb%d0%b0%d0%bd_17_%d0%bd%d0%be%d1%8f%d0%b1%d1%80%d1%8f_2008/</link>
		<comments>http://programmersclub.ru/%d0%90%d0%b1%d0%bb%d1%8f%d0%b7%d0%be%d0%b2_%d0%a0%d1%83%d1%81%d0%bb%d0%b0%d0%bd_17_%d0%bd%d0%be%d1%8f%d0%b1%d1%80%d1%8f_2008/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 19:38:24 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Интервью]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=329</guid>
		<description><![CDATA[Сегодня понедельник 17 ноября 2008 года, первым гостем в моём icq чате, будет супермодератор форума &#8211; programmersforum.ru, Аблязов Руслан, известный на форуме как rpy3uH.
Alar
Добрый вечер!
Руслан
Здравствуйте.

Alar
С момента создания клуба прошло не так много времени, твои уроки по ассемблеру
http://programmersclub.ru/assembler0/ опубликованы там даже раньше, чем появился форум на отдельном домене http://programmersforum.ru. Сейчас в блоге ты публикуешь новую статью [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня понедельник 17 ноября 2008 года, первым гостем в моём icq чате, будет супермодератор форума &#8211; programmersforum.ru, Аблязов Руслан, известный на форуме как rpy3uH.</p>
<p>Alar<br />
Добрый вечер!</p>
<p>Руслан<br />
Здравствуйте.<br />
<span id="more-329"></span><br />
Alar<br />
С момента создания клуба прошло не так много времени, твои уроки по ассемблеру<br />
http://programmersclub.ru/assembler0/ опубликованы там даже раньше, чем появился форум на отдельном домене http://programmersforum.ru. Сейчас в блоге ты публикуешь новую статью связанную с ассемблером, я знаю, что есть не опубликованные материалы, есть множество идей. Возможно ли, что в недалеком будущем появится твоя книга «Уроки по ассемблеру», что думаешь?</p>
<p>Руслан<br />
Вообще-то я уже пишу книгу посвящённую защищённому режиму процессора Intel, а также 64 битному режиму. Основной внимание в этой книге хочу направить на описание 64 битного режима (а научно long mode), так как сейчас нет ни одной книги на русском языке про 64 битный режим процессора Intel. Сейчас написано уже примерно 40% книги. Но всё как всегда упёрлось в отсутствие времени. Книга непременно выйдет вопрос только когда? В прочем к тому времени, когда она выйдет её актуальность может быть потеряна.</p>
<p>Alar<br />
Я думаю, программирование под 64 битную ось будет актуально в ближайшие годы. а многопроцессорность? Управление 4 ядрами? </p>
<p>Руслан<br />
В первой редакции книги это вряд ли будет. Но обязательно надо описать и эти аспекты. И по сути эта книга изначально позиционируется лично мной как руководство по написанию операционных систем. Конечно, сильно сказано, но, тем не менее, я стремлюсь именно к этому.</p>
<p>Alar<br />
Когда столкнулся с необходимость нажать на кнопку на html странице, я сначала решил попробовать на программе. Тогда-то я сочинил простенькую фразу – «найди хендл поставь хук», возможно подпись поставить подобную под названием раздела? Выходят ли обсуждения в этом разделе из этого формата, какая самая интересная тема ближайшего месяца?<br />
Сейчас смотрю этот раздел, самая обсуждаемая тема, 17 ответов http://programmersforum.ru/showthread.php?t=28087 &#8211; FindWindow(&#8217;TMainForm&#8217;,nil) а дальше куча одноименных кнопок</p>
<p>Руслан<br />
Такие вопросы возникают у юных хакеров, которые хотят написать троян, который будет всё перехватывать и за всем следить, коих очень много. И вопросы в основном задают такие люди, которым трудно прочитать описание функций. На нашем форуме просто так сложилось что в основном задают такие вопросы. Но есть и другие темы в разделе &#8220;Win API&#8221; нашего форума.<br />
Второй пост в этой теме всё объясняет и видно, что автору темы просто лень нажать на кнопку поиск.</p>
<p>Alar<br />
Большинство тем в этом разделе корректно названы, работы модератора или здесь не такие чайники как в разделе помощь студентов, паскаль. Как заставить студентов адекватно называть свои темы?<br />
Возможно, стоит тему с литературой и прикрепить? В разделе ассемблер есть такая тема, что должно помогать новичкам. Например, любую тему с описанием работы с FindWindow, установки хука, кликание по кнопке, напрашивается статья? </p>
<p>Руслан<br />
Это не работа модератора, просто здесь создают темы адекватные люди. А как бороться с темами а ля &#8220;ПАМАГИТЕ&#8221; на это у меня своё мнение: модераторам надо сразу удалять, перемещать в темы нужные разделы, назначать наказания (или предупреждения) за такие дела. Если у человека 1-2 поста но надо предупреждение, а если больше, то наказание. И ввести отдельную пункт в нарушениях.<br />
В разделе по ассемблеру тема про литературу не полноценная, там ссылки на &#8220;депозитфайлез&#8221;, а такие ссылки по определению &#8220;не хорошие&#8221;.</p>
<p>Alar<br />
В популярных разделах нужно больше модераторов? Доверить школьникам и студентам первых курсов рулить эти разделы?</p>
<p>Руслан<br />
Нужно больше АКТИВНЫХ модераторов , так сказать настоящих модераторов, и снять с модераторства тех кто не был на форуме уже больше, чем три месяца.</p>
<p>Alar<br />
О файлохранилище. В проекте VIP файлохранилище для модераторов и участников клуба, постепенно можно перенести многие файлы с бесплатных хранилищ (комментарий от 19 сентября 2009 – Это реализовано средствами vBulletin путем переноса вложений в файловую систему, что позволяет загружать файлы большим размером. Загружать вложения могут все пользователи).<br />
О снятии, я для себя определил дату снятия полномочий по не активности &#8211; около года.</p>
<p>Руслан<br />
VIP файлохранилище, хорошая идея, я полностью за! и как можно скорее</p>
<p>Alar<br />
Значит школьникам доверяем модерирование в разделе &#8220;Студентам&#8221; и &#8220;Паскаль&#8221;? </p>
<p>Руслан<br />
если человек просится, то пожалуйста!</p>
<p>Alar<br />
И еще одна тема, которую хотелось бы сегодня обсудить &#8211; всероссийская студенческая олимпиада по информатике, ты не против?</p>
<p>Руслан<br />
Я не против, но причём тут наш клуб и форум? </p>
<p>Alar<br />
я откопал топик годичной давности в андеграунде.</p>
<p>Alar<br />
ВСЕРОССИЙСКАЯ СТУДЕНЧЕСКАЯ ОЛИМПИАДА ПО ИНФОРМАТИКЕ<br />
г.Воронеж, сентябрь &#8211; ноябрь 2007 года<br />
http://stud-olymp07.nm.ru/<br />
Первый этап олимпиады происходит удалённо. Даётся три задания и даются ровно сутки.<br />
Задания первого этапа<br />
http://stud-olymp07.nm.ru/zad1etap_rezerv.htm<br />
НУ сделал я два задания из трёх: первое и третье.<br />
И что в итоге? я получил 0 баллов.<br />
Результаты<br />
http://stud-olymp07.nm.ru/spis_to2_4.htm<br />
2 строка: Аблязов Руслан &#8211; 0 баллов.<br />
Год назад мы тебе посочувствовали, а как в этом году проводилась олимпиада, как боролся с организаторскими косяками, помогали ли местные воронежские модераторы?</p>
<p>Руслан<br />
Никто не помогал. Моё мнение об этой олимпиаде: глубина идиотизма всей этой системы меня просто поражает.<br />
Не думаю что эта тема может быть как-то интересно посетителям и участникам нашего клуба. </p>
<p>Продолжение интервью через неделю.</p>
<p>Alar<br />
На прошлой неделе ты участвовал во всероссийской олимпиаде программистов в Воронеже, каковы результаты, какой уровень конкурса? </p>
<p>Руслан<br />
Результаты так себе, организация мероприятия тоже так себе.</p>
<p>Alar<br />
Что понравилось, что нет? Расшифруй пожалуйста &#8211; это &#8220;так себе&#8221;, Понравился ли город Воронеж, какие достопримечательности посещал, что порекомендуешь туристам, которые планируют посетить этот город.</p>
<p>Руслан<br />
В самой олимпиаде не понравилась количество баллов за каждую задачу, и очень простое третье задание, которое я так не сделал (думал в конце сделаю, но не успел). Задачи сильно разнятся по сложности, а баллы за них почти одинаковые.<br />
Моё мнение о городе &#8211; обычный город, областной центр. Ничего особого. Очень много машин, пробки.</p>
<p>Alar<br />
Сколько было участников, какой у тебя результат?</p>
<p>Руслан<br />
всего примерно 70 участников, я примерно во второй половине.</p>
<p>Alar<br />
Пару вопросов по разделу assembler</p>
<p>Alar<br />
Что же такое макро-ассемблер MASM?<br />
http://programmersforum.ru/showthread.php?t=30657</p>
<p>Руслан<br />
в MASM имеет очень мощный макросный движок, что очень сильно упрощает программирование, и программы написанные с использованием этих макросов сильно смахивают на какой-нибудь язык высокого уровня.<br />
ну FASM тоже можно считать макро-ассемблером, так как макросный движок него почти ни чем не уступает движку MASM.</p>
<p>Alar<br />
спасибо за разъяснение, следующий вопрос</p>
<p>Alar<br />
Как можно определить что к usb порту что-то присоединено?<br />
Как определить вставлен ли hasp-ключ? Идентификатор hasp ключа?<br />
Что такое Hasp ключ?<br />
http://programmersforum.ru/showthread.php?t=30524</p>
<p>Руслан<br />
все знают 1C: Бухгатерию Так вот, при покупке лицензионной версии этой программы вам даётся USB устройство, и 1C: Бухгатерия не запустится пока мы не вставим это USB устройство. Это USB устройство и есть HASP ключ.</p>
<p>Alar<br />
Топикстартер юный хакер, хочешь сказать?</p>
<p>Руслан<br />
возможно&#8230;</p>
<p>Alar<br />
Возможно, он просто хочет считать информацию с флешки?</p>
<p>Руслан<br />
C флешки считать информацию не стоит никакого труда, ведь это обычный диск.</p>
<p>Alar<br />
Далее менее профессиональные, так сказать, вопросы&#8230;</p>
<p>Alar<br />
Civilization 4, игра от которой нельзя оторваться, так говорится в событии, которое возникает в самой развитой стране последней эпохи. Civilization 4 вошла в игровой мир предлагая трёхмерную графику, были добавлены религии, переработано научное движение, а также юниты, до такой степени, что нападающие в третей цивилизации лучники, стали защитными юнитами, улучшена система прокачки юнитов, увеличено число зданий. Все эти навороты изначально оттолкнули меня от игры, года два я не запускал эту игрушку, так как слишком много движений нужно было делать, игра стала скучной.<br />
Что ты думаешь о цивилизации 4 Beyond The Sword и о новой цивилизации – колонизация. Почему игра вновь будоражит мозг стратегов?<br />
Еще… Мне жутко нравится возможность колонизации, а не тупого захвата городов, не хватает только развала крупных империй банкротов. И армия, как мне кажется обходится слишком дешево, содержание не зависит от формы правления, твое мнение?</p>
<p>Руслан<br />
В четвёртой цивилизации разработчики приблизили игру ближе к реальности. Игра очень хорошая. В аддоне Beyond The Sword ничего лишнего всё как надо. А насчёт развала крупных империй, документация по созданию модов общедоступна.<br />
Новая Колонизация это уже не цивилизация &#8211; это просто ремейк, старой игры на движке &#8220;цивы&#8221;.</p>
<p>Alar<br />
Хочешь сказать это не официальные разработки, а бонус от фанов? Почему-то я так не думаю. Да и продвигаются &#8220;колонизации&#8221;, как новая версия цивы.</p>
<p>Руслан<br />
Новая колонизация это не бонус фанов. Это совсем другая игра, это уже не цивилизация &#8211; Это больше торговая стратегия.</p>
<p>Руслан<br />
вернее экономическая</p>
<p>Alar<br />
Вопрос вот такого плана, почему золото дорожает, а компьютерное железо дешевеет, Почему гении научной мысли продают свои знания и продукты за желтый металл, чего с ним делать? </p>
<p>Руслан<br />
Компьютерное железо дешевеет по определению, оно дешевело всегда. А золото дорожает потому что из-за мирового финансового кризиса все начали переводить свои деньги в золото, вот оно и дорожает, сейчас золото стоит порядка 800 долларов за унцию, примерно полгода назад она стоила порядка 960 долларов и никто не паниковал.</p>
<p>Alar<br />
Спасибо за интервью, будем надеяться, что компьютерного железа хватит на всех, а золота будет мало, чтобы было куда вкладывать деньги, тем у кого их много.<br />
(комментарий от 19 сентября 2009 года &#8211;  Золото	1006.30 <img src='http://programmersclub.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
<p><a href="http://programmersforum.ru/showthread.php?t=30134">http://programmersforum.ru/showthread.php?t=30134</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/%d0%90%d0%b1%d0%bb%d1%8f%d0%b7%d0%be%d0%b2_%d0%a0%d1%83%d1%81%d0%bb%d0%b0%d0%bd_17_%d0%bd%d0%be%d1%8f%d0%b1%d1%80%d1%8f_2008/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>У всех пользователей форума есть несколько стадий</title>
		<link>http://programmersclub.ru/%d0%bd%d0%b5%d1%81%d0%ba%d0%be%d0%bb%d1%8c%d0%ba%d0%be_%d1%81%d1%82%d0%b0%d0%b4%d0%b8%d0%b9_%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%b9_%d1%84%d0%be%d1%80%d1%83/</link>
		<comments>http://programmersclub.ru/%d0%bd%d0%b5%d1%81%d0%ba%d0%be%d0%bb%d1%8c%d0%ba%d0%be_%d1%81%d1%82%d0%b0%d0%b4%d0%b8%d0%b9_%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%b9_%d1%84%d0%be%d1%80%d1%83/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 08:14:45 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Пост-обзор]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=323</guid>
		<description><![CDATA[1. Только зарегился, всем хочешь помочь, отвечаешь на вопросы, стараешься получить положительные отзывы, заработать очки репутации и набрать примерно 300-400 сообщений, в общем, хочешь выделиться из толпы, к концу стадии начинаешь общаться во флудерских разделах.
2. Начинается примерно после набора 400-450 сообщений, тебя уже знают на форуме, появляются друзья, с некоторыми переписываешься в аське, на количество [...]]]></description>
			<content:encoded><![CDATA[<p>1. Только зарегился, всем хочешь помочь, отвечаешь на вопросы, стараешься получить положительные отзывы, заработать очки репутации и набрать примерно 300-400 сообщений, в общем, хочешь выделиться из толпы, к концу стадии начинаешь общаться во флудерских разделах.<br />
2. Начинается примерно после набора 400-450 сообщений, тебя уже знают на форуме, появляются друзья, с некоторыми переписываешься в аське, на количество сообщений уже необращаешь внимаение, количество очков репутации всё ещё важный параметр. Отвечаешь только на интерисующие тебя темы и вопросы, стараешься делать более качественные ответы. Большинство сообщений уже во флудерских разделах. Стараешься активно учавствовать в жизни форума. Некоторых (единицы) назначают модератором в некоторых разделах.<br />
3а. Третья стадия постянного юзера форума. Наступает после 1000 сообщений. Общаешься в основном во флудерских разделах, в тематических разделах, отвечаешь только самые-самые интересные темы и вопросы. На репутацию и сообщения уже наплевать. Некоторые юзеры, и во флудерских разделах уже почти общаются, отписываются только в самых интересных темах.<br />
3б. Третья стадия постоянного юзера-модератора. Наступает после назначения модератором на раздел. Первая стадия &#8220;дубль два&#8221;, снова отвечаешь на вопросы в назначенном разделе, хочешь заработать ещё очков репутации, и ещё несколько сотен сообщений, хочешь сделать раздел на который назначили лучше (добавляешь ссылки на литературу, создаёшь правила). Да чуть не забыл, активно пользуешься системой наказаний, также часто делаешь отзывы другим пользователям (чтобы отвечали лучше те, которые находятся на первой или второй стадии). В общем стараешься сделать форум лучше.<br />
4. Четвёртая стадия есть только у модератора, повторяет третью стадию обычного юзверя, наступает примерно после набора 2000 сообщений. Общаешься в основном во флудерских разделах, в своём разделе следишь только &#8220;за порядком&#8221;, отвечаешь очень редко (и то, только если самому интересно или больше некому).</p>
<p>copyright (c) rpy3uH, супермодератор programmersforum.ru.</p>
<p><a href="http://programmersforum.ru/showpost.php?p=335439&#038;postcount=28">http://programmersforum.ru/showpost.php?p=335439&#038;postcount=28</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/%d0%bd%d0%b5%d1%81%d0%ba%d0%be%d0%bb%d1%8c%d0%ba%d0%be_%d1%81%d1%82%d0%b0%d0%b4%d0%b8%d0%b9_%d0%bf%d0%be%d0%bb%d1%8c%d0%b7%d0%be%d0%b2%d0%b0%d1%82%d0%b5%d0%bb%d0%b5%d0%b9_%d1%84%d0%be%d1%80%d1%83/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>История создания пирамид</title>
		<link>http://programmersclub.ru/%d0%98%d1%81%d1%82%d0%be%d1%80%d0%b8%d1%8f-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d1%80%d0%b0%d0%bc%d0%b8%d0%b4/</link>
		<comments>http://programmersclub.ru/%d0%98%d1%81%d1%82%d0%be%d1%80%d0%b8%d1%8f-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d1%80%d0%b0%d0%bc%d0%b8%d0%b4/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 07:40:37 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Топик-обзор]]></category>

		<guid isPermaLink="false">http://programmersclub.ru/?p=314</guid>
		<description><![CDATA[Есть официальная версия историков, из которой следует, что пирамиды строили фараоны Египта. Есть и другая версия, из которой следует, что пирамиды были построены за долго до первых фараонов. На вскидку, я приведу некоторые фотография с комментариями (некоторые участки я выделю):
[URL="http://radikal.ru/F/i042.radikal.ru/0905/85/01b91f260e33.jpg.html"]
[IMG]http://i042.radikal.ru/0905/85/01b91f260e33t.jpg[/IMG]
[/URL]
Каменные блоки идеально отполированы. Заметьте &#8211; это гранит, один из самых твёрдых пород камней. Каменным орудием [...]]]></description>
			<content:encoded><![CDATA[<p>Есть официальная версия историков, из которой следует, что пирамиды строили фараоны Египта. Есть и другая версия, из которой следует, что пирамиды были построены за долго до первых фараонов. На вскидку, я приведу некоторые фотография с комментариями (некоторые участки я выделю):</p>
<p>[URL="http://radikal.ru/F/i042.radikal.ru/0905/85/01b91f260e33.jpg.html"]<br />
[IMG]http://i042.radikal.ru/0905/85/01b91f260e33t.jpg[/IMG]<br />
[/URL]<br />
Каменные блоки идеально отполированы. Заметьте &#8211; это гранит, один из самых твёрдых пород камней. Каменным орудием сделать такое нереально, даже если будут работать 1000 рабов разом.</p>
<p>[URL="http://radikal.ru/F/i001.radikal.ru/0905/c2/779d4a428ea0.jpg.html"][IMG]http://i001.radikal.ru/0905/c2/779d4a428ea0t.jpg[/IMG][/URL]<br />
Идеальная стыковка блоков пола и стен. Между ними нет ни какого зазора.</p>
<p>[URL="http://radikal.ru/F/i054.radikal.ru/0905/5c/56f578943efb.jpg.html"][IMG]http://i054.radikal.ru/0905/5c/56f578943efbt.jpg[/IMG][/URL]<br />
Опять же, идеальная кладка блоков. Заметьте, <a href="http://my-web-site.ru">блоки</a> кладки весят десятки тонн. А некоторые от 100 до 1000 тонн. Блок в 1000 тонн не способен поднять ни один самый современные кран. Как же его подымали рабы?</p>
<p>Более того, есть материалы, что на камнях найдены следы инструментов: пиление (камня), сверление трубчатое (причём есть отверстия, диаметр которых в нескольких миллиметров, просверлить такое отверстие в граните современные инструменты человека не способны), полировка камня (аля, циклёвка паркета).<br />
А как же быть с идеальными формами пирамид. Свет, попадающий на Великие Пирамиды преломляется и отражается как от зеркала, его луч в ясную погоду виден с околоземной орбиты.<br />
Факт в том, что пирамиды (не считая некоторых) были построены за много тысяч лет до первых фараонов, причём уровень развития технологий того времени превосходил современные.</p>
<p>Ещё замечу, что кроме Египетских (общеизвестных) пирамид есть пирамиды в Мексике, Перу, Боснии и Герцеговине, Камбоджии, Индонезии, Китае и других регионах Земли. Технология их построения во многом схожа с Египетскими, но сохранились они хуже (из-за отличия в климате и использования других материалов, не гранита). Т.е. цивилизация была не локальной в Египте, а по всей планете, на подобие современной.</p>
<p><a href="http://programmersforum.ru/showthread.php?t=48018">http://programmersforum.ru/showthread.php?t=48018</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/%d0%98%d1%81%d1%82%d0%be%d1%80%d0%b8%d1%8f-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d0%bd%d0%b8%d1%8f-%d0%bf%d0%b8%d1%80%d0%b0%d0%bc%d0%b8%d0%b4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Архив рассылки за 2007 год</title>
		<link>http://programmersclub.ru/subscribe_1_arh/</link>
		<comments>http://programmersclub.ru/subscribe_1_arh/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 09:50:37 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Рассылка]]></category>

		<guid isPermaLink="false">http://blog-obzor.ru/?p=301</guid>
		<description><![CDATA[50 выпусков
   Навигация по выпускам     
Выпуск номер 50 
 Выпуск номер 49 
 Выпуск номер 48 
 Выпуск номер 47 
 Выпуск номер 46 
 Выпуск номер 45 
 Выпуск номер 44 
 Выпуск номер 43 
 Выпуск номер 42 
 Выпуск номер 41 
 Выпуск номер 40 
 [...]]]></description>
			<content:encoded><![CDATA[<h2>50 выпусков</h2>
<p><span lang="ru"> <span style="color: #f00000;"> <strong> Навигация по выпускам </strong> </span> </span> <a href="http://programmersclub.ru/subscribe_1_0"> </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_0">Выпуск номер 50 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_1"> Выпуск номер 49 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_2"> Выпуск номер 48 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_3"> Выпуск номер 47 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_4"> Выпуск номер 46 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_5"> Выпуск номер 45 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_6"> Выпуск номер 44 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_7"> Выпуск номер 43 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_8"> Выпуск номер 42 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_9"> Выпуск номер 41 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_10"> Выпуск номер 40 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_11"> Выпуск номер 39 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_12"> Выпуск номер 38 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_13"> Выпуск номер 37 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_14"> Выпуск номер 36 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_15"> Выпуск номер 35 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_16"> Выпуск номер 34 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_17"> Выпуск номер 33 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_18"> Выпуск номер 32 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_19"> Выпуск номер 31 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_20"> Выпуск номер 30 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_21"> Выпуск номер 28 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_22"> Выпуск номер 27 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_23"> Выпуск номер 26 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_24"> Выпуск номер 25 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_25"> Выпуск номер 24 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_26"> Выпуск номер 23 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_27"> Выпуск номер 22 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_28"> Выпуск номер 21 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_29"> Выпуск номер 20 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_30"> Выпуск номер 19 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_31"> Выпуск номер 18 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_32"> Выпуск номер 17 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_33"> Выпуск номер 16 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_34"> Выпуск номер 15 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_35"> Выпуск номер 14 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_36"> Выпуск номер 13 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_37"> Выпуск номер 12 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_38"> Выпуск номер 11 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_39"> Выпуск номер 10 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_40"> Выпуск номер 9 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_41"> Выпуск номер 8 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_42"> Выпуск номер 7 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_43"> Выпуск номер 6 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_44"> Выпуск номер 5 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_45"> Выпуск номер 4 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_46"> Выпуск номер 3 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_47"> Выпуск номер 2 </a></p>
<p><a href="http://programmersclub.ru/subscribe_1_48"> Выпуск номер 1 </a></p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/subscribe_1_arh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Множество вариантов работы с графикой на канве в canvas delphi</title>
		<link>http://programmersclub.ru/remixx-canvaspaint/</link>
		<comments>http://programmersclub.ru/remixx-canvaspaint/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 09:38:46 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Исходники]]></category>

		<guid isPermaLink="false">http://blog-obzor.ru/?p=298</guid>
		<description><![CDATA[ Рисование на канве 
  5 примеров   Визуализация ala Winamp   Описание:  Используется стандартная функция StretchBlt и каждый кадр размывается функцией Blur из модуля Unit2.pas   Сложность:  Выше среднего.   Тестировано:  Delphi 6   Примечание:  Можно использовать при создании скринсейверов и визуализаций   [...]]]></description>
			<content:encoded><![CDATA[<h2> Рисование на канве </h2>
<p> <H4> 5 примеров </H4> <H4> Визуализация ala Winamp </H4> <B> Описание: </B> Используется стандартная функция StretchBlt и каждый кадр размывается функцией Blur из модуля Unit2.pas <BR> <B> Сложность: </B> Выше среднего. <BR> <B> Тестировано: </B> Delphi 6 <BR> <B> Примечание: </B> Можно использовать при создании скринсейверов и визуализаций <BR> <br /> <IMG src="http://programmersclub.ru/images/000.jpg" border=0> </p>
<p> <A href="http://programmersclub.ru/files/remixx1blur_exe.rar"> Скачать exe файл </A> <br /> <A href="http://programmersclub.ru/files/remixx1blur.rar"> Скачать исходники </A> <H4 class=objectTitle> Цветная змейка </H4> <B> Описание: </B> Программа рисует произвольную непрерывную градиентную линию определенной толщины и с заданной кривизной. Хороший пример на генерацию цвета из системного таймера и работу с математикой. <BR> <B> Сложность: </B> не для чайников <BR> <B> Тестировано: </B> Delphi 6 </p>
<p> <A href="http://programmersclub.ru/files/remixx2lin_exe.rar"> Скачать exe файл </A> <br /> <A href="http://programmersclub.ru/files/remixx2lin.rar"> Скачать исходники </A> <H4> Крутой градиент </H4> <B> Описание: </B> Математика. Голая математика. Простейший код(95 строк) и очень красиво. Математический мультик. Компилируй и смотри )) <BR> <B> Сложность: </B> можно и чайникам )) <BR> <B> Тестировано: </B> Delphi 6 <BR> <B> Примечание: </B> Смотреть минуты 2 минимум, или до переполнения &#8230; </p>
<p> <IMG src="http://programmersclub.ru/images/remixx003.gif" border=0> </p>
<p> <A href="http://programmersclub.ru/files/remixx3grad_exe.rar"> Скачать exe файл </A> <br /> <A href="http://programmersclub.ru/files/remixx3grad.rar"> Скачать исходники </A> <H4> Группа движухщихся точек </H4> <B> Описание: </B> Визуализация. Множество точек летают по экрану за центровой точкой (mx,my) либо отдаляются от нее. <BR> <B> Сложность: </B> Почти не комментировано, поэтому сложно. <BR> <B> Тестировано: </B> Delphi 6 <BR> <B> Примечание: </B> Алгоритм приближения и отдаления точек может пригодиться игроделам </p>
<p> <A href="http://programmersclub.ru/files/remixx4tot_exe.rar"> Скачать exe файл </A> <br /> <A href="http://programmersclub.ru/files/remixx4tot.rar"> Скачать исходники </A> <H4> Разряд молнии </H4> <B> Описание: </B> Генерация случайной линии к месту курсора. Необычный подход на основе вероятностей. Используется Random. <BR> <B> Сложность: </B> Небольшой код, но опять же без комментариев. Выше среднего. <BR> <B> Тестировано: </B> Delphi 6 <BR> <B> Примечание </B> : Ничего выдающегося. Может быть полезно при создании скринсейверов В заголовке окна пишется количество прорисованных пикселей и скорость прорисовки. <BR> <BR> <A href="http://programmersclub.ru/files/remixx5moln_rar.rar"> Скачать exe файл </A> <BR> <A href="http://programmersclub.ru/files/remixx5moln.rar"> Скачать исходники </A> </p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/remixx-canvaspaint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>история появления ОС UNIX</title>
		<link>http://programmersclub.ru/unix1/</link>
		<comments>http://programmersclub.ru/unix1/#comments</comments>
		<pubDate>Sat, 29 Aug 2009 08:40:01 +0000</pubDate>
		<dc:creator>Alar</dc:creator>
				<category><![CDATA[Статьи]]></category>

		<guid isPermaLink="false">http://blog-obzor.ru/?p=296</guid>
		<description><![CDATA[Возникновение и первая редакция ОС UNIX
Принято считать, что исходным толчком к появлению ОС UNIX явилась работа Кена Томпсона по созданию компьютерной игры &#8220;Space Travel&#8221;. Он делал это в 1969 году на компьютере Honeywell 635, который до этого использовался для разработки проекта MAC. В это же время Кен Томпсон, Деннис Ритчи и другие сотрудники Bell Labs [...]]]></description>
			<content:encoded><![CDATA[<h2>Возникновение и первая редакция ОС UNIX</h2>
<p>Принято считать, что исходным толчком к появлению ОС UNIX явилась работа Кена Томпсона по созданию компьютерной игры &#8220;Space Travel&#8221;. Он делал это в 1969 году на компьютере Honeywell 635, который до этого использовался для разработки проекта MAC. В это же время Кен Томпсон, Деннис Ритчи и другие сотрудники Bell Labs предложили идею усовершенствованной файловой системы, прототип которой был реализован на компьютере General Electric 645. Однако компьютер GE-645, который был рассчитан на работу в режиме разделения времени и не обладал достаточной эффективностью, не годился для переноса Space Travel. Томпсон стал искать замену и обнаружил, что появившийся к этому времени 18-разрядный компьютер PDP-7 с 4 килословами оперативной памяти и качественным графическим дисплеем вполне для этого подходит.</p>
<p>После того, как игра была успешно перенесена на PDP-7, Томпсон решил реализовать на PDP-7 разработанную ранее файловую систему. Дополнительным основанием для этого решения было то, что компания Bell Labs испытывала потребность в удобных и дешевых средствах подготовки и ведения документации. В скором времени на PDP-7 работала файловая система, в которой поддерживались: понятие inodes, подсистема управления процессами и памятью, обеспечивающая использование системы двумя пользователями в режиме разделения времени, простой командный интерпретатор и несколько утилит. Все это еще не называлось операционной системой UNIX, но уже содержало родовые черты этой ОС.</p>
<p>Название придумал Брайан Керниган. Он предложил назвать эту двухпользовательскую систему UNICS (Uniplexed Information and Computing System). Название понравилось, поскольку, помимо прочего, оно напоминало об участии сотрудников Bell Labs в проекте Multics. В скором времени UNICS превратилось в UNIX.</p>
<p>В ноябре 1971 года был опубликован первый выпуск документации по ОС UNIX (&#8221;Первая редакция&#8221;).</p>
<p>Вторая редакция появилась в 1972 году. Наиболее существенным качеством &#8220;Второй редакции&#8221; было то, что система была переписана на языке Би (&#8221;B&#8221;). Язык и интерпретирующая система программирования были разработаны Кеном Томпсоном под влиянием существовавшего языка BCPL.</p>
<p>Появление варианта системы, написанного не на языке ассемблера, было заметным продвижением. Однако сам язык Би во многом не удовлетворял разработчиков. Подобно языку BCPL язык Би был бестиповым, в нем поддерживался только один тип данных, соответствующий машинному слову. Другие типы данных эмулировались библиотекой функций. Деннис Ритчи, который всегда увлекался языками программирования, решил устранить ограничения языка Би, добавив в язык систему типов. Так возник язык Си (&#8221;C&#8221;). В 1973 году Томпсон и Ритчи переписали систему на языке Си. К этому времени существовало около 25 установок ОС UNIX, и это была &#8220;Четвертая редакция&#8221;.</p>
<p>В июле 1974 года появилась &#8220;Пятая редакция&#8221; ОС UNIX.</p>
<p>В 1975 году компания Bell Labs выпустила &#8220;Шестую редакцию&#8221; ОС UNIX, известную как V6 или Исследовательский UNIX. Эта версия системы была первой коммерчески доступной вне Bell Labs. К этому времени большая часть системы была написана на языке Си. Небольшие размеры языка и наличие сравнительно легко переносимого компилятора придавали ОС UNIX V6 новое качество реально переносимой операционной системы. Кроме того, потенциальное наличие на разных аппаратных платформах компилятора языка Си делало возможным разработку мобильного прикладного программного обеспечения.</p>
<p>В настоящее время UNIX &#8211; настоящая Вавилонская башня. Различные варианты UNIX разрабатывают Sun Microsystems (SunOS, Solans), Hewlett-Packard (HP-UX), IBM (AIX), SCO (SCO UNIX); также существуют клоны UNIX, рассчитанные на работу на базе платформы Intel (BSD, Linux).</p>
<h2 id="pageTitle">Основные понятия</h2>
<p>На первый взгляд UNIX выглядит неоправданно сложной операционной системой. Но под кажущейся сложностью скрывается очень простая и элегантная операционная система. Отдельные детали могут быть сложными, но общие принципы &#8211; просты.</p>
<p>Одним из достоинств ОС UNIX является то, что система базируется на небольшом числе интуитивно ясных понятий. Однако, несмотря на простоту этих понятий, к ним нужно привыкнуть. Без этого невозможно понять существо UNIX.</p>
<h2></h2>
<h4>Пользователь</h4>
<p>С самого начала ОС UNIX замышлялась как интерактивная система. Другими словами, UNIX предназначен для терминальной работы. Чтобы начать работать, человек должен &#8220;войти&#8221; в систему, введя со свободного терминала свое учетное имя (account name) и, возможно, пароль (password). Человек, зарегистрированный в учетных файлах системы, и, следовательно, имеющий учетное имя, называется зарегистрированным пользователем системы. Регистрацию новых пользователей обычно выполняет администратор системы. Пользователь не может изменить свое учетное имя, но может установить и/или изменить свой пароль. Пароли хранятся в отдельном файле в закодированном виде.</p>
<p>Все пользователи ОС UNIX явно или неявно работают с файлами. Файловая система ОС UNIX имеет древовидную структуру. Промежуточными узлами дерева являются каталоги со ссылками на другие каталоги или файлы, а листья дерева соответствуют файлам или пустым каталогам. Каждому зарегистрированному пользователю соответствует некоторый каталог файловой системы, который называется &#8220;домашним&#8221; (home) каталогом пользователя. При входе в систему пользователь получает неограниченный доступ к своему домашнему каталогу и всем каталогам и файлам, содержащимся в нем. Потенциально возможен доступ и ко всем другим файлам, однако он может быть ограничен, если пользователь не имеет достаточных привилегий.</p>
<h4>Интерфейс пользователя</h4>
<p>Традиционный способ взаимодействия пользователя с системой <a href="http://htblog.org">UNIX</a> основывается на использовании командных языков (правда, в настоящее время все большее распространение получают графические интерфейсы). После входа пользователя в систему для него запускается один из командных интерпретаторов (в зависимости от параметров, сохраняемых в файле /etc/passwd). Обычно в системе поддерживается несколько командных интерпретаторов с похожими, но различающимися своими возможностями командными языками. Общее название для любого командного интерпретатора ОС UNIX &#8211; shell (оболочка), поскольку любой интерпретатор представляет внешнее окружение ядра системы.</p>
<p>Вызванный командный интерпретатор выдает приглашение на ввод пользователем командной строки. После выполнения очередной командной строки и выдачи на экран терминала или в файл соответствующих результатов, shell снова выдает приглашение на ввод командной строки, и так до тех пор, пока пользователь не завершит свой сеанс работы путем ввода команды logout или нажатием комбинации клавиш Ctrl-d.</p>
<p>Командные языки, используемые в ОС UNIX, достаточно просты, чтобы новые пользователи могли быстро начать работать, и достаточно мощны, чтобы можно было использовать их для написания сложных программ. Последняя возможность опирается на механизм командных файлов (shell scripts), которые могут содержать произвольные последовательности командных строк. При указании имени командного файла вместо очередной команды интерпретатор читает файл строка за строкой и последовательно интерпретирует команды.</p>
<h4>Привилегированный пользователь</h4>
<p>Ядро ОС UNIX идентифицирует каждого пользователя по его идентификатору (UID &#8211; User Identifier), уникальному целому значению, присваиваемому пользователю при регистрации в системе. Кроме того, каждый пользователь относится к некоторой группе пользователей, которая также идентифицируется некоторым целым значением (GID &#8211; Group IDentifier). Значения UID и GID для каждого зарегистрированного пользователя сохраняются в учетных файлах системы и приписываются процессу, в котором выполняется командный интерпретатор, запущенный при входе пользователя в систему. Эти значения наследуются каждым новым процессом, запущенным от имени данного пользователя, и используются ядром системы для контроля правомочности доступа к файлам, выполнения программ и т.д.</p>
<p>Понятно, что администратор системы, который, естественно, тоже является зарегистрированным пользователем, должен обладать большими возможностями, чем обычные пользователи. В ОС UNIX эта задача решается путем выделения одного значения UID (нулевого). Пользователь с таким UID называется суперпользователем (superuser) или root. Он имеет неограниченные права на доступ к любому файлу и на выполнение любой программы. Кроме того, такой пользователь имеет возможность полного контроля над системой. Он может остановить ее и даже разрушить.</p>
<p>Суперпользователь должен хорошо знать базовые процедуры администрирования ОС UNIX. Он отвечает за безопасность системы, ее правильное конфигурирование, добавление и исключение пользователей, регулярное копирование файлов и т.д.</p>
<p>Еще одним отличием суперпользователя от обычного пользователя ОС UNIX является то, что на суперпользователя не распространяются ограничения на используемые ресурсы. Для обычных пользователей устанавливаются такие ограничения как максимальный размер файла, максимальное число сегментов разделяемой памяти, максимально допустимое пространство на диске и т.д. Суперпользователь может изменять эти ограничения для других пользователей, но на него они не действуют.</p>
<h4>Программы</h4>
<p>ОС UNIX одновременно является операционной средой использования существующих прикладных программ и средой разработки новых приложений. Новые программы могут писаться на разных языках (Фортран, Паскаль, Модула, Ада и др.). Однако стандартным языком программирования в среде ОС UNIX является язык Си (который в последнее время все больше заменяется на C++). Это объясняется тем, что, во-первых, сама система UNIX написана на языке Си, а, во-вторых, язык Си является одним из наиболее качественно стандартизованных языков.</p>
<p>Поэтому программы, написанные на языке Си, при использовании правильного стиля программирования обладают весьма высоким уровнем мобильности, т.е. их можно достаточно просто переносить на другие аппаратные платформы, работающие как под управлением ОС UNIX, так и под управлением ряда других операционных систем (например, DEC Open VMS или MS Windows NT).</p>
<p>Выполняемая программа может быть запущена в интерактивном режиме как команда shell или выполнена в отдельном процессе, образуемом уже запущенной программой.</p>
<h4>Команды</h4>
<p>Любой командный язык семейства shell фактически состоит из трех частей: служебных конструкций, позволяющих манипулировать с текстовыми строками и строить сложные команды на основе простых команд; встроенных команд, выполняемых непосредственно интерпретатором командного языка; команд, представляемых отдельными выполняемыми файлами.</p>
<h4>Процессы</h4>
<p>Процесс в ОС UNIX &#8211; это программа, выполняемая в собственном виртуальном адресном пространстве. Когда пользователь входит в систему, автоматически создается процесс, в котором выполняется программа командного интерпретатора. Если командному интерпретатору встречается команда, соответствующая выполняемому файлу, то он создает новый процесс и запускает в нем соответствующую программу, начиная с функции main. Эта запущенная программа, в свою очередь, может создать процесс и запустить в нем другую программу (она тоже должна содержать функцию main) и т.д.</p>
<h4>Перенаправление ввода/вывода</h4>
<p>Механизм перенаправления ввода/вывода является одним из наиболее элегантных, мощных и одновременно простых механизмов ОС UNIX. Цель, которая ставилась при разработке этого механизма, состоит в следующем. Поскольку UNIX &#8211; это интерактивная система, то обычно программы вводят текстовые строки с терминала и выводят результирующие текстовые строки на экран терминала. Для того чтобы обеспечить более гибкое использование таких программ, желательно уметь обеспечить им ввод из файла или из вывода других программ и направить их вывод в файл или на ввод другим программам.</p>
<p>Реализация механизма основывается на следующих свойствах ОС UNIX. Во-первых, любой ввод/вывод трактуется как ввод из некоторого файла и вывод в некоторый файл. Клавиатура и экран терминала тоже интерпретируются как файлы (первый можно только читать, а во второй можно только писать). Во-вторых, доступ к любому файлу производится через его дескриптор (положительное целое число). Фиксируются три значения дескрипторов файлов. Файл с дескриптором 1 называется файлом стандартного ввода (stdin), файл с дескриптором 2 &#8211; файлом стандартного вывода (stdout), и файл с дескриптором 3 &#8211; файлом стандартного вывода диагностических сообщений (stderr). В-третьих, программа, запущенная в некотором процессе, &#8220;наследует&#8221; от породившего процесса все дескрипторы открытых файлов.</p>
<p>В головном процессе интерпретатора командного языка файлом стандартного ввода является клавиатура терминала пользователя, а файлами стандартного вывода и вывода диагностических сообщений &#8211; экран терминала. Однако при запуске любой команды можно сообщить интерпретатору (средствами соответствующего командного языка), какой файл или вывод какой программы должен служить файлом стандартного ввода для запускаемой программы и какой файл или ввод какой программы должен служить файлом стандартного вывода или вывода диагностических сообщений для запускаемой программы. Тогда интерпретатор перед выполнением системного вызова exec открывает указанные файлы, подменяя смысл дескрипторов 1, 2 и 3.</p>
<p>Конечно, то же самое может проделать и любая другая программа, запускающая третью программу в специально созданном процессе. Следовательно, все, что требуется для нормального функционирования механизма перенаправления ввода/вывода &#8211; это придерживаться при программировании соглашения об использовании дескрипторов stdin, stdout и stderr. Это не очень трудно, поскольку в наиболее распространенных функциях библиотеки ввода/вывода printf, scanf и error вообще не требуется указывать дескриптор файла. Функция printf неявно использует stdout, функция scanf &#8211; stdin, а функция error &#8211; stderr.</p>
<p>Операционная система UNIX, являющаяся первой в истории мобильной ОС, обеспечивающей надежную среду разработки и использования мобильных прикладных систем, одновременно представляет собой практическую основу для построения открытых программно-аппаратных систем и комплексов. Именно широкое внедрение в практику ОС UNIX позволило перейти от лозунга Открытых Систем к практической разработке этой концепции. Большой вклад в развитие направления Открытых Систем внесла деятельность по стандартизации интерфейсов ОС UNIX.</p>
<p>Тем не менее, до сих пор можно выделить несколько ветвей ОС UNIX, различающихся не только реализацией, но временами интерфейсами и семантикой (хотя, по мере развития процесса стандартизации, эти различия становятся все менее значительными).</p>
]]></content:encoded>
			<wfw:commentRss>http://programmersclub.ru/unix1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
