Hacking Apache HTTP Server at Yahoo!, by Michael J. Radwin, ApacheCon 2005.
Раздел: Programming
JavaScript Developer Center
Yahoo! открыла JavaScript Developer Center. Описаны API и интерфейсы на JavaScript для Yahoo! Maps, Yahoo! Music Engine, Yahoo! Widgets и Yahoo! Search.
Список тулзов и библиотек
Литература
«Recommended Reading for IR Research Students» -- аннотированый список наиболее важных работ в области информационного поиска.
Mersenne Twister
Mersenne Twister -- очень быстрый генератор псевдослучайных чисел с периодом 219937-1. Верианты реализации для языков: C, C++, Pascal, Lisp, Fortran, Java, Basic, Assembler, Octave, Eiffel, Python, erlang, Perl, Ada.
OOmnik
Открытый лингвистический интерпретатор русского языка, OOmnik -- проект по созданию лингвистического интерпретатора русского языка под свободной лицензией GPL. Выполняется сотрудниками Лаборатории информационных лингвистических технологий ИЛИ РАН.
Проект начат в июле 2005 года и расчитан на десять лет. Но уже в данный момент опубликованы некоторые предварительные материалы, в частности в разделе "Технологии": набросок синтаксического формализма для глубокого разбора предложения, черновик модуля токенизации для разделения символьного потока на лексемы с учетом разных типов данных и начальная версия списка корней русского языка (содержит около 17 тысяч корней).
Исправлен трап aspell
Уф, почти два дня ушло, но всё-таки пофиксен трап 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++" 🙂
Apache2 документация
Эксклюзивный доступ к файлам
#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;
}