Расширьте возможности анализа вводимого текста с помощью определения динамики набора символов

Используйте xev, Perl и специальные алгоритмы для определения динамики набора символов

Вычисляйте суммарное время ввода символов и время между нажатиями на клавиши для того, чтобы обеспечить дополнительную защиту при аутентификации пользователя независимо от вводимых им данных. Используйте непечатаемые символы (например, «backspace» или «break»), чтобы создать еще более сложный пароль. Узнайте, как использовать продукты с открытым исходным кодом xev и Perl для определения динамики набора символов в целях выявления более тонких особенностей взаимодействия человека с компьютером.

Любой предмет, которого вы касались руками, позволяет идентифицировать вас по свойственным только вам отпечаткам пальцев, оставленным на нем. Манера прикасаться к предметам и, в частности, печатать является уникальной для каждого человека. Определение динамики нажатия на клавиши – это относительно новый способ идентификации пользователей, основанный на статистическом анализе их манеры набора текста. Многие коммерческие продукты используют анализ динамики ввода паролей и слежение за манерой набора текста в целях усиления безопасности. С помощью примеров кода, приведенных в данной статье, вы узнаете, как использовать анализ динамики нажатия на клавиши в целях усиления безопасности ваших приложений при аутентификации пользователей и непрерывном вводе данных.

Требования к аппаратному и программному обеспечению

Программное обеспечение

Необходимо наличие ОС Linux® с установленными оболочками для системы X Window, например, Gnome или KDE. Любой дистрибутив с графической оболочкой, который выпущен после 1999 г., поставляется с уже настроенной рабочей средой, с которой сразу можно начать работать. Для эффективного перехвата и обработки событий системы X Window лучше всего воспользоваться таким приложением как xev (X event viewer). Обратитесь к разделу Ресурсы, в котором представлена ссылка на ресурс, с которого вы можете скачать данное приложение. Вам необходимо будет скачать исходный код xev даже в том случае, если в вашем дистрибутиве он уже установлен или присутствует в виде пакета. Вам также необходим будет Perl, который сейчас присутствует практически во всех дистрибутивах Linux.

Аппаратное обеспечение

Вам необходим компьютер, объем памяти и производительность процессора которого достаточны для работы с системой X Window и нормального функционирования ОС Linux. Также необходим физический доступ к компьютеру с клавиатурой, непосредственно подключенной к нему. Теоретически возможно использование тонких клиентов, VNC-соединений и виртуализированных клиентов, но различные уровни обработки данных и сетевая нагрузка могут привести к непредсказуемым задержкам, которые, как правило, негативно влияют на работу с системой.


Изменение и компиляция xev

Основной подход, который используется в данной статье для демонстрации способа определения динамики нажатия клавиш, является перехват всех событий с помощью программы xev и перенаправление их в приложение, написанное на Perl. Данное приложение предназначено для обработки процедуры создания пароля и ввода его подтверждения.

Чтобы установить xev с нуля, загрузите архив xorg-x11-6.8.1.tar.gz и распакуйте его. Перейдите в папку xc/programs/xev и введите xmkmf. Файл Imakefile используется приложением xmkmf для генерации сборочного файла проекта. Введите команду make, чтобы выполнить сборку приложения xev. Выполнение команды make должно завершиться без ошибок. В случае возникновения проблем обратитесь к документации на сайте X.org. В случае успешной сборки приложения xev вам необходимо будет внести одно небольшое изменение. Оно необходимо для того, чтобы можно было отображать более точную информацию о времени событий нажатия на клавиши. В листинге 1 показан файл xev.c, в котором в строке 164 добавлено выражение fflush(stdout);.

Листинг 1. Внесение изменения в файл xev.c
...
        printf ("    XFilterEvent returns: %s\n",
                XFilterEvent (eventp, e->window) ? "True" : "False");
    }
    fflush(stdout);
}

static void
do_KeyRelease (XEvent *eventp)
{   
...

Сохраните обновленный файл и повторно выполните команду make, чтобы создать новую версию приложения xev. Скопируйте xev в вашу текущую рабочую папку, чтобы его могла использовать программа, обрабатывающая ввод пароля. Для проверки работоспособности xev откройте окно xterm и введите команду xwininfo. Щелкните по открытому окну xterm и посмотрите на выведенный результат. Должна отобразиться строка вида «xwininfo: Window id: 0x32000012 nathan@kinakuta:~». Скопируйте шестнадцатеричный код Window ID вашего xterm и введите команду ./xev -id 0x32000012. Теперь все события, связанные с окном xterm, будут отображаться по мере их возникновения. Попробуйте понажимать разные клавиши или подвигайте курсором, после чего нажмите комбинацию клавиш «Ctrl+C», чтобы выйти из данного режима.


Обработка событий клавиатуры с целью расчета суммарного времени ввода данных

Многие разработчики программного обеспечения те свои пароли, которые используют довольно часто, вводят приблизительно с той же скоростью, с какой они обычно печатают. Если кто-то другой будет вводить ваш пароль, то вполне вероятно, что этот человек будет делать это значительно медленнее. В первой части кода, представленного ниже, показана программа, предназначенная для обработки вводимого пароля и его подтверждения, в которой учитывается суммарное время ввода пароля. Другие замеры необходимы для того, чтобы показать, что вы обычно вводите пароль либо с той же максимальной скоростью, с которой печатаете, либо вводите его в более ровном темпе. В листинге 2 представлен текст основного логического цикла программы xevKeyDyn.pl.

Листинг 2. Основная логическая часть программы xevKeyDyn.pl
#!/usr/bin/perl -w 
# Программа xevKeyDyn.pl служит для демонстрации возможностей приложения xev, 
# которое позволяет определять динамику набора символов при вводе паролей

use strict;
$|=1; # необходимо для своевременного отображения строк информации о 
         # непечатаемых символах


die "specify a window id to read xev events from" if( @ARGV != 1 );

my $cmd = "./xev -id $ARGV[0]";
my $maxTimeDiff = 500;  # полсекунды
my $maxKeyDiff = 100;   # одна десятая секунды
my $passwordOK = 0;

my @keysOne = ();  # первый массив предназначен для записи событий, 
# связанных с нажатиями на клавиши при вводе пароля


my @keysTwo = ();  # массив для подтверждения пароля

my @nonPrintable = (
'Control_','Alt_','Shift_','Up','Left','Right','Down','BackSpace','Print',
'_Lock','Prior','Next','Home','End','Insert','Delete','Pause','Break' );

# основной цикл программы

while( $passwordOK == 0 )
{ 
  readPassword( \@keysOne, "Enter a");
  printPassword( \@keysOne );
  
  readPassword( \@keysTwo, "Confirm the");
  printPassword( \@keysTwo );
  
  my $catch = <STDIN>;  # перехват пароля
     $catch = <STDIN>;  # перехват подтверждения пароля

  next unless( charactersMatch() );
  next unless( totalTimeOK() );
  
  $passwordOK = 1;

}#while passwordOk =0;

Основной логический блок программы вначале отключает буферизированный вывод данных, поскольку этого требует обработка непечатаемых символов, которая будет описана немного позже. После проверки того, что X Window ID определен, одни переменные принимают значения, соответствующие суммарному времени ввода пароля, а другие – соответствующие интервалам времени между нажатиями на клавиши. Время указывается в миллисекундах, что вполне достаточно для точного определения необходимых нам параметров при практически любой скорости набора текста. Переменные keysOne и keysTwo содержат введенный пароль, а в массиве nonPrintable перечислены все непечатаемые символы, которые можно использовать. Цикл программы будет непрерывно повторяться до тех пор, пока все символы пароля будут введены не только правильно, но и в течение определенного интервала времени. В листинге 3 показана подпрограмма readPassword.

Листинг 3. Подпрограмма readPassword
sub readPassword
{
  my $arrRef = $_[0];  # не сильно похоже на случайные данные
  @{$arrRef} = ();     # очищаем от случайных данных

  shift;
  print "@_ password:\n";

  open( XEV, " $cmd |" ) or die "can't open xev";
  while( my $inLine = <XEV> )
  {
    if( $inLine =~ /KeyPress event/ || $inLine =~ /KeyRelease event/ )
    { 
      my $keyType = substr($inLine, 0, index($inLine,","));

      # получение информации о времени ввода
      my $currTime = <XEV>
         $currTime = substr( $currTime, index($currTime,"time ")+5);
         $currTime = substr( $currTime, 0, index($currTime,","));

      # получение информации о названии клавиши
      my $currKey = <XEV>
         $currKey = substr( $currKey, index($currKey,"keysym ")+7);
         $currKey = substr( $currKey, 0, index($currKey,"),"));
         $currKey = substr( $currKey, index($currKey, ", ")+2);


# выводим на экран названия непечатаемых символов 
# только после отпускания соответствующих им клавиш
   
      if( $keyType =~ /KeyRelease/ )
      { 
        map { print "<$currKey>" if( $currKey =~ /$_/ ) } @nonPrintable;
      }

# если ни один символ не был введен, но была нажата клавиша «Enter», 
# то продолжаем ждать ввод символов  
# прекращаем прием символов, если хоть один символ был введен 
# и была нажата клавиша «Enter»
      next if( $currKey =~ /Return/ && @{$arrRef} == 0 );
      last if( $currKey =~ /Return/ && @{$arrRef} != 0 );

      # добавляем в массив значения "время, клавиша, тип"
      push @{$arrRef}, "$currTime $currKey $keyType";

    }#if a key press or release

  }#while xev in

  close(XEV);

}#readPassword

Как вы могли заметить, информация о событии, соответствующем нажатию на определенную клавишу или отпусканию этой клавиши, отображается программой xev в виде четырех или пяти строк. Подпрограмма readPassword ждет возникновения события, связанного с нажатием на клавиши, а затем определяет соответствующее название клавиш (например, «J» или «Ctrl+L»). Название клавиши, время нажатия на эту клавишу и тип нажатия затем добавляются в текущий массив, отведенный для пароля, для последующей обработки. Если введен хоть один символ, то при нажатии на клавишу «Enter» происходит выход из данной подпрограммы. В листинге 4 представлена подпрограмма printPassword, которая используется для отображения символов пароля и времени их ввода.

Листинг 4. Подпрограмма printPassword
sub printPassword
{
  my $arrRef = $_[0];  

  for my $keyStr ( @{$arrRef} )
  {
    my( $time, $key, $type ) = split " ", $keyStr;
    print "Key: $key at $time Type: $type\n";
  }

  print "Total time: ", getTotalTime( $arrRef );
  print "\n\n";
  
}#printPassword

С помощью кода основной программы и двух подпрограмм, представленных выше, xevKeyDyn.pl может считывать и отображать два пароля. Чтобы убедиться в том, что все символы пароля совпадают и расположены в правильном порядке, добавим подпрограмму charactersMatch, представленную в листинге 5.

Листинг 5. Подпрограмма charactersMatch
sub charactersMatch
{   
# выполняется проверка того, что клавиши нажимаются и отпускаются 
# последовательно, при этом вы не нажимаете клавишу enter раньше, 
# чем отпускаете предыдущую клавишу
  if( ($#keysOne+1) % 2 != 0 || ($#keysTwo+1) % 2 != 0 )
  { 
    print "Key event missed, please try again.\n";
    return(0);
  }
  
  if( $#keysOne != $#keysTwo )
  { 
    print "Passwords are not equal length\n";
    return(0);
  }
  
  my $count = 0;
  while( $count < $#keysOne )
  { 
    my( undef, $key1, undef ) = split " ", $keysOne[$count];
    my( undef, $key2, undef ) = split " ", $keysTwo[$count];
    last if( $key1 ne $key2 );
    $count++;
  }#while each key entry
  
  return(1) if( $count == $#keysOne );
  
  print "Password keys do not match. \n";
  return(0);

}#charactersMatch

Первая проверка необходима для того, чтобы убедиться, что события нажатия и отпускания обрабатываются для одной и той же клавиши. Если вы поэкспериментируете с программой xevKeyDyn.pl, то можете заметить, что события, вызываемые нажатием на разные клавиши, могут частично перекрываться. Особенно это касается тех моментов, когда вы нажимаете на клавиши, расположенные в разных частях клавиатуры, которые обычно нажимают пальцами левой или правой руки. Например, если вы левой рукой набираете «a s d f», а правым мизинцем нажимаете на клавишу «Enter», то вы можете нажать на клавишу «Enter» раньше, чем отпустите клавишу «f». Поэтому первая проверка необходима для того, чтобы убедиться, что для каждой клавиши, которую вы нажимаете, будут последовательно обработаны события и нажатия, и отпускания этой клавиши.

После выполнения простой проверки длины паролей выполняется проверка полного совпадения символов в паролях (т.е., например, проверяется, что пятый символ в каждом из паролей является нулем). Если длины паролей (которые рассчитываются с учетом всех нажатий и отпусканий клавиш) совпадают и при этом в них содержатся одинаковые символы, то такие пароли считаются идентичными, после чего данная подпрограмма успешно завершается. В листинге 6 представлены дополнительные подпрограммы, предназначенные для выполнения первой основной проверки динамики набора символов (проверяется суммарное время ввода пароля).

Листинг 6. Подпрограммы totalTime и getTotalTime
sub totalTimeOK
{ 
  return(1) if( abs(getTotalTime(\@keysOne) - getTotalTime(\@keysTwo)) < $maxTimeDiff);
  print "Total length 1 is: ", getTotalTime( \@keysOne ), "\n";
  print "Total length 2 is: ", getTotalTime( \@keysTwo ), "\n";
  print "Passwords are too far apart in total length \n";
  return(0);
}#totalTimeOK

sub getTotalTime
{ 
  # получение первого и последнего момента времени и вычисление разницы между ними
  my $arrRef = $_[0];
  my ($strTime, undef, undef ) = split " ", ${$arrRef}[0];  # first array item
  my ($endTime, undef, undef ) = split " ", ${$arrRef}[$#{$arrRef}]; # last array item
  return( $endTime - $strTime );
}#getTotalTime

В подпрограмме getTotalTime просто выполняется вычитание времени нажатия последней клавиши от времени нажатия на первую клавишу (время приводится в миллисекундах). Подпрограмма totalTimeOK предназначена для вынесения решения о том, будут ли приняты введенный пароль и его подтверждение в том случае, если их суммарное время расхождения меньше того значения, которое указано в переменной maxTimeDiff (500 мс).

Запустите программу с помощью команды perl xevKeyDyn.pl 0x32000012. Пробуйте вводить разные пароли и наблюдайте за тем, как изменяется их суммарное время ввода. Для опытных пользователей, использующих одинаковую скорость ввода символов, вы можете уменьшить значение переменной maxTimeDiff до 0,1 с и менее.


Использование непечатаемых символов

Скрыть из поля зрения фактическое присутствие информации – это тот простой способ, который позволяет повысить безопасность. Использование непечатаемых символов (например, «backspace» или «pause») в пароле является самым простым способом повышения его надежности. Использование приложения xev в качестве перехватчика событий позволяет осуществить переход на использование непечатаемых символов в паролях без всяких дополнительных действий. Включив данную функцию, вы даже можете сообщить своим друзьям символы своего пароля, при этом они не смогут им воспользоваться. В листинге 7 представлена подпрограмма hasNonPrintable, которая используется для проверки пароля на наличие в нем одного из возможных префиксов массива @nonPrintable.

Листинг 7. Подпрограмма hasNonPrintable
sub hasNonPrintable
{ 
  for my $keyStr ( @keysOne )
  { 
    my( undef, $key, undef ) = split " ", $keyStr;
    map { return(1) if( $key =~ /$_/ ) } @nonPrintable;
  }

  print "A non-printable character is required.\n";
  return(0);

}#hasNonPrintable

Чтобы использовать проверку, выполняемую подпрограммой hasNonPrintable, необходимо в основную программу добавить строку, представленную в листинге 8.

Листинг 8. Добавление подпрограммы hasNonPrintable в основной цикл программы
  next unless( charactersMatch() );
  next unless( totalTimeOK() );
  next unless( hasNonPrintable() ); # необходимо добавить в строку 35

Перехват непечатаемых символов и их использование – это один из способов сокрытия некоторых атрибутов пароля в открытом тексте. Даже в том случае, если злоумышленник подсмотрел пароль, наличие в нем символа «backspace» или других непечатаемых символов, которые скрывают присутствие или изменяют порядок символов в строке пароля, не позволит ему воспользоваться паролем.


Время удержания клавиши

Кроме сокрытия из поля зрения и измерения суммарного времени ввода пароля дополнительной мерой защиты является измерение моментов времени между нажатиями на клавиши. Если первую часть пароля вы набираете довольно быстро, а вторую часть медленно (например, из-за ввода цифр или смены регистра), то будет выполняться проверка совпадения результатов ввода с заданным диапазоном значений. Более того, если пользователь вводит данные с неравномерной скоростью, например, медленно вводит символы, но довольно быстро цифры (вероятно, из-за использования цифровой клавиатуры), то подпрограмма individualKeyTimingsOK выявит эти различия.

Листинг 9. Подпрограмма individualKeyTimingsOK
sub individualKeyTimingsOK 
{ 

  my $count = 0;
  while( $count < ($#keysOne-1) )
  {
    my( $time1, undef, undef) = split " ", $keysOne[$count];
    my( $time2, undef, undef) = split " ", $keysOne[$count+1];

    my $timeDiff_0 = $time2 - $time1;

    ( $time1, undef, undef) = split " ", $keysTwo[$count];
    ( $time2, undef, undef) = split " ", $keysTwo[$count+1];

    my $timeDiff_1 = $time2 - $time1;

    if( abs($timeDiff_0 - $timeDiff_1) > $maxKeyDiff )
    {
      print "Intra-key timings invalid at position [$count] for " .
            "$timeDiff_0 and $timeDiff_1, please try again.\n";
      return(0);
    }
    $count++;

  }# для каждого символа

  return(1);

}#individualKeyTimingsOK

В листинге 9 представлена подпрограмма individualKeyTimingsOK. В ней замеряются только значения времени между близлежащими моментами нажатия на клавиши. Вводимые символы только тогда будут восприниматься как часть пароля, когда пауза между нажатиями на клавиши будет меньше, чем пороговое значение, определяемое параметром maxKeyDiff (100 мс). Если вы хотите, чтобы пользователь вводил пароль точно с такой же скоростью, как он его вводил изначально, то можете снизить порог до значения меньшего, чем 0,1 с. Пользователь может придумывать такие пароли, для набора которых он может пользоваться одной рукой, используя при этом разные клавиши на клавиатуре. Результат программы xevKeyDyn.pl показывает, что суммарное время ввода таких паролей очень невелико, как и время между событиями, возникающими при нажатии клавиш (интервал времени между ними равен 20 мс). Точно ввести 20 определенных символов пароля при времени ввода одного символа, равном 0,001 с, будет сложно даже для тех пользователей, которые набирают текст очень быстро, не говоря уже о тех, которые случайно узнали пароль и пытаются его ввести.

Чтобы использовать проверку, выполняемую подпрограммой individualKeyTimingsOK, необходимо в основной цикл программы добавить строки, представленные в листинге 10.

Листинг 10. Добавление подпрограммы individualKeyTimingsOK к основному циклу программы
  next unless( charactersMatch() );
  next unless( totalTimeOK() );
  next unless( hasNonPrintable() ); 
  next unless( individualKeyTimingsOK() ); # необходимо добавить в строку 36

Добавив возможность использования непечатаемых символов и проверку времени между нажатиями на клавиши, выполняемую по мере ввода символов, запустите программу с помощью команды perl xevKeyDyn.pl 0x32000012. Попробуйте вводить разные комбинации символов (включая непечатаемые символы). Поэкспериментируйте с этими новыми возможностями ввода текста, делая паузы различной длительности между нажатиями на клавиши при вводе всего пароля целиком или отдельных его частей.


Примеры использования

Давайте рассмотрим пример, представленный в листинге 11. Были введены следующие символы: «s-e-<backspace>-c-r-3-t», при этом использовался следующий прием. Клавиша «s» была нажата и удерживалась до тех пор, пока не была нажата и отпущена клавиша, соответствующая самому последнему символу пароля. Программа xev записывает все события клавиатуры, благодаря чему можно использовать этот простой и в то же самое время мощный метод защиты без необходимости каких-либо дополнительных действий. Наложение различных событий, связанных с нажатием и отпусканием клавиш, является тем тонким аспектом взаимодействия человека с компьютером, который знаком всем, кто создавал самые простые игры или интерфейсы пользователя, обрабатывающие события в реальном времени. Более часто такая возможность не используется, при этом в поля ввода паролей просто записываются значения и обрабатываются события, связанные с нажатием на клавиши, и игнорируются события, возникающие при отпускании клавиш. Измерение времени нажатия на клавишу и ее отпускания является важным шагом по добавлению более надежных возможностей идентификации пользователя в данном приложении, разработанном специально для слежения за динамикой набора символов.

Листинг 11. Пример информации, выводимой при вводе пароля "secr3t"
nathan:$ perl xevKeyDyn.pl 0x32000012
Enter a password: 
s<BackSpace>cr3t     # обратите внимание на то,что символ 'e' был удален
Key: s at 9813585 Type: KeyPress   # обратите внимание на то,
#что клавиша 's' не отпускается сразу
Key: e at 9813832 Type: KeyPress
Key: e at 9813951 Type: KeyRelease
Key: BackSpace at 9814160 Type: KeyPress
Key: BackSpace at 9814264 Type: KeyRelease
Key: c at 9814483 Type: KeyPress
Key: c at 9814586 Type: KeyRelease
Key: r at 9814809 Type: KeyPress
Key: r at 9814880 Type: KeyRelease
Key: 3 at 9815078 Type: KeyPress
Key: 3 at 9815221 Type: KeyRelease
Key: t at 9815356 Type: KeyPress
Key: t at 9815451 Type: KeyRelease
Key: s at 9815649 Type: KeyRelease  # только теперь отпускается клавиша 's'

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


Замечания относительно использования данной возможности при удаленном доступе

Необходимо отметить ряд замечаний относительно использования процедур удаленного доступа, например страниц регистрации, написанных на Ajax, или тонких клиентов с запущенной X-сессией на сервере. В таких случаях погрешность замера времени для событий, связанных с нажатием на клавиши, может меняться в больших пределах между разными сессиями входа и даже при нажатии на клавиши. Это связано с тем, что задержки в сети и время обработки на компьютере очень сильно зависят от многих факторов. Позаботьтесь о том, чтобы внедрение данной системы замера времени нажатия на клавиши не стало барьером при аутентификации в непредвиденных ситуациях (например, при возникновении высокой сетевой нагрузки или дополнительном высоком потреблении ресурсов из-за отказавших дисков).

Учтите также, что определение динамики нажатия на клавиши будет требовать от пользователя точности при нажатии на клавиши в процессе ввода символов. Если будет применена техника, описанная в данной статье, то время отпускания клавиши и начальное время нажатия на клавиши должны точно соблюдаться. Вы можете изменить представленный в данном примере код чтобы обрабатывать только события нажатия на клавиши. Однако при этом будет потеряна информация о нажатии и удержании клавиши при одновременном удержании других клавиш.


Заключение и дополнительные примеры

Вы можете использовать описанный в данной статье способ для того, чтобы улучшить возможности аутентификации пользователя в вашем приложении, написанном на Perl, либо в любой другой программе, основанной на таких же принципах. Кроме того, динамика нажатия на клавиши является одной их тех областей, в которой при аутентификации могут использоваться биометрические параметры. Воспользовавшись некоторыми приемами, описанными в данной статье, попробуйте изменить свое приложение таким образом, чтобы можно было бы обнаруживать и отслеживать типичные опечатки, случайные нажатия на рядом расположенные клавиши или любые другие ошибки, которые часто допускают пользователи при работе с вашим приложением. Попробуйте выйти вперед в борьбе со спам-роботами с помощью замера времени нажатия и отпускания клавиши в ваших Web–приложениях, предназначенных для аутентификации пользователей.


Загрузка

ОписаниеИмяРазмер
Пример кодаos-keystrokeDynamics_0.1.zip2 КБ

Ресурсы

Научиться

  • Оригинал статьи - Expand your text entry options with keystroke dynamics (EN).
  • Получите больше информации об определении динамики набора символов на сайте Wikipedia (EN).
  • Прочитайте пошаговое руководство "Использование C++ приложений в Web-службах с помощью XML-RPC" (EN), в котором вы узнаете о том, как использовать C++ в службах.
  • Слушайте интересные интервью и дискуссии разработчиков программного обеспечения на сайте подкастов developerWorks (EN).
  • Оставайтесь всегда в курсе событий с помощью сайта Technical events and webcasts (EN).
  • Узнавайте о приближающихся конференциях, выставках, Web-трансляциях, а также других событиях в разных странах мира, представляющих интерес для разработчиков программного обеспечения с открытым кодом (EN).
  • В разделе Open source на сайте developerWorks вы найдете подробные руководства, инструментальные средства и новости проектов, которые помогут вам разрабатывать приложения с использованием продуктов с открытым исходным кодом и использовать их с другими продуктами IBM.
  • Смотрите и узнавайте больше о технологиях IBM и продуктах с открытым исходным кодом, а также о функциональных возможностях продуктов с помощью бесплатных примеров на сайте developerWorks On demand demos (EN).

Получить продукты и технологии

  • Самый простой способ получить xev - это загрузить его исходный код.
  • Загрузите Perl с сайта Perl.org.
  • Вносите инновации в ваши новые проекты с помощью пробных версий продуктов IBM, которые вы можете скачать из сети или заказать на DVD-дисках (EN).
  • Загрузите оценочные версии продуктов IBM и попробуйте в работе такие средства разработчика и межплатформенные продукты, как DB2®, Lotus®, Rational®, Tivoli® и WebSphere® (EN).

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source
ArticleID=332743
ArticleTitle=Расширьте возможности анализа вводимого текста с помощью определения динамики набора символов
publish-date=08222008