Перейти к содержимому

9

Yahoo! открыла JavaScript Developer Center. Описаны API и интерфейсы на JavaScript для Yahoo! Maps, Yahoo! Music Engine, Yahoo! Widgets и Yahoo! Search.

Список поисковых машин и библиотек инфоромационного поиска.

2

«Recommended Reading for IR Research Students» -- аннотированый список наиболее важных работ в области информационного поиска.

2

Mersenne Twister -- очень быстрый генератор псевдослучайных чисел с периодом 219937-1. Верианты реализации для языков: C, C++, Pascal, Lisp, Fortran, Java, Basic, Assembler, Octave, Eiffel, Python, erlang, Perl, Ada.

8

Открытый лингвистический интерпретатор русского языка, OOmnik -- проект по созданию лингвистического интерпретатора русского языка под свободной лицензией GPL. Выполняется сотрудниками Лаборатории информационных лингвистических технологий ИЛИ РАН.

Проект начат в июле 2005 года и расчитан на десять лет. Но уже в данный момент опубликованы некоторые предварительные материалы, в частности в разделе "Технологии": набросок синтаксического формализма для глубокого разбора предложения, черновик модуля токенизации для разделения символьного потока на лексемы с учетом разных типов данных и начальная версия списка корней русского языка (содержит около 17 тысяч корней).

8

Уф, почти два дня ушло, но всё-таки пофиксен трап aspell на некоторых русских словах. Ниже дан патч к common/convert.cpp.

*** convert.cpp.orig    Sun Jun 26 15:21:03 2005
--- convert.cpp Sun Aug 28 15:09:49 2005
***************
*** 521,527 ****
            out.append(*in);
        } else {
          const Chr * stop = reinterpret_cast<const Chr *>(in0 +size);
!         for (;in != stop; ++in)
            out.append(*in);
        }
      }
--- 521,527 ----
            out.append(*in);
        } else {
          const Chr * stop = reinterpret_cast<const Chr *>(in0 +size);
!         for (;in < stop; ++in)
            out.append(*in);
        }
      }

Ошибка прям классическая из цикла "Как не надо программировать на C/C++" 🙂

5


#include 

struct flock* file_lock(int type, int whence) {
    static struct flock ret ;
    ret.l_type = type ;
    ret.l_start = 0 ;
    ret.l_whence = whence ;
    ret.l_len = 0 ;
    ret.l_pid = getpid() ;
    return &ret ;
}

read_lock(FILE *f) {   /* a shared lock on an entire file */

    fcntl(fileno(f), F_SETLKW, file_lock(F_RDLCK, SEEK_SET));
}

write_lock(FILE *f) {  /* an exclusive lock on an entire file */

    fcntl(fileno(f), F_SETLKW, file_lock(F_WRLCK, SEEK_SET));
}

append_lock(FILE *f) { /* a lock on the _end_ of a file -- other
                       processes may access existing records */

    fcntl(fileno(f), F_SETLKW, file_lock(F_WRLCK, SEEK_END));
}

un_lock(FILE *f) { /* ulock an entire file */
  fcntl(fileno(f), F_SETLKW, file_lock(F_UNLCK, SEEK_SET));
}


int daemonize(void){
  char *ptty0;
  char *ptty1;
  char *ptty2;
  int fd;

  if (((ptty0 = ttyname(0)) == NULL) || ((ptty1 = ttyname(1)) == NULL) ||
      ((ptty2 = ttyname(2)) == NULL))
    return -1;

  if (fork() != 0)
    exit(1);
  close(0);
  close(1);
  close(2);
  setsid();

  if ((fd = open("/dev/null", O_RDONLY)) == -1)    return -1;

  if (dup2(fd, 0) == -1)    return -1;

  if ((fd = open(ptty1, O_WRONLY)) == -1)    return -1;

  if (dup2(fd, 1) == -1)    return -1;

  if (close(fd) == -1)    return -1;

  if ((fd = open(ptty2, O_WRONLY)) == -1)    return -1;

  if (dup2(fd, 2) == -1)    return -1;

  if (close(fd) == -1)    return -1;

  return 0;
}