Implements an image recognition captcha.

"; break; case 'admin/modules#description': case 'admin/modules/textimage': case 'admin/textimage': $output = t('Implements an image recognition captcha.'); break; } return $output; } function textimage_captchachallenge(&$form) { $form['captcha_response'] = array ( '#type' => 'textfield', '#title' => t('Captcha Validation'), '#default_value' => '', '#required' => TRUE, '#validate' => array('_captcha_validate' => array()), '#description' => t('Please type in the letters/numbers that are shown in the image above.'), '#prefix' => 'Captcha Image: you will need to recognize the text in it.', ); return $form; } function textimage_captchavalidate(&$captcha_word, &$correct) { $captcha_word = drupal_strtolower($captcha_word); if (($_SESSION['captcha'] != '') && $captcha_word == $_SESSION['captcha']) { $correct = true; } else { $correct = false; form_set_error('captcha_response', t('The image verification code you entered is incorrect.')); } } /** * Implementation of hook_menu(). */ function textimage_menu($may_cache) { $items = array(); $suffix = ''; if (arg(2)!=null) $suffix='/'.arg(2); $items[] = array( 'path' => '_textimage/image'.$suffix, 'title' => t('textimage'), 'callback' => '_textimage_image', 'access' => user_access('access textimages'), 'type' => MENU_CALLBACK ); return $items; } function textimage_perm() { return array('access textimages'); } function textimage_settings() { $fonts_path = variable_get("textimage_fonts_path", ""); $images_path = variable_get("textimage_images_path", ""); //check for GD if (!function_exists(imagecreate)) drupal_set_message(t('Image library not available. Textimage needs the GD library extension to be installed. Please install GD.')); //check for TTF support elseif (!function_exists(imagettftext)) drupal_set_message(t('Your image library does not seem to have TrueType font support. Textimage will work, but will use the default inbuilt font.'),'status'); //check for valid font path elseif ($fonts_path!="" && !is_dir($fonts_path)) drupal_set_message(t('The current font path is invalid. The default font will be used.')); //check for valid image path if ($images_path!="" && !is_dir($images_path)) drupal_set_message(t('The current images path is invalid. No images will be used.')); //Fonts settings $form['fonts'] = array( '#type' => 'fieldset', '#title' => t('Fonts settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['fonts']['textimage_use_only_upper'] = array( '#type' => 'checkbox', '#title' => t('Use only Uppercase'), '#default_value' => variable_get('textimage_use_only_upper',0) ); $form['fonts']['textimage_fonts_path'] = array( '#type' => 'textfield', '#title' => t('TrueType Fonts Path'), '#default_value' => $fonts_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the Truetype (.ttf) fonts are stored. If you do not provide any fonts, the module will use the default font for text. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['fonts']['textimage_font_size'] = array( '#type' => 'textfield', '#title' => t('Font Size'), '#default_value' => variable_get('textimage_font_size',24), '#size' => 5, '#maxlength' => 2, '#description' => t('Font size of Captcha text (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_font_size")), ); $form['fonts']['textimage_char_spacing_max'] = array( '#type' => 'textfield', '#title' => t('Character Spacing'), '#default_value' => variable_get('textimage_char_spacing_max',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the kerning between letters in Captcha. Higher numbers indicate more spacing.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_spacing_max")), ); $form['fonts']['textimage_char_jiggle_amount'] = array( '#type' => 'textfield', '#title' => t('Character Jiggle'), '#default_value' => variable_get('textimage_char_jiggle_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of up and down movement in the Captcha letters. Higher numbers indicate more jiggling.'), '#validate' => array("_textimage_number_validate" => array("textimage_char_jiggle_amount")), ); $form['fonts']['textimage_char_rotate_amount'] = array( '#type' => 'textfield', '#title' => t('Character Rotation'), '#default_value' => variable_get('textimage_char_rotate_amount',5), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of rotation in the Captcha letters (in degrees, only works with non-default fonts).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_rotate_amount")), ); $form['fonts']['textimage_char_size_amount'] = array( '#type' => 'textfield', '#title' => t('Character Size Adjustment'), '#default_value' => variable_get('textimage_char_size_amount',2), '#size' => 5, '#maxlength' => 2, '#description' => t('Sets the amount of variation in size between the different letters in the Captcha (in pixels).'), '#validate' => array("_textimage_number_validate" => array("textimage_char_size_amount")), ); //Image settings $form['images'] = array( '#type' => 'fieldset', '#title' => t('Image settings'), '#collapsible' => TRUE, '#collapsed' => FALSE ); $form['images']['textimage_images_path'] = array( '#type' => 'textfield', '#title' => t('Background Images Path'), '#default_value' => $images_path, '#size' => 30, '#maxlength' => 255, '#description' => t('Location of the directory where the background images are stored. If you do not provide a directory, solid colors will be used. Relative paths will be resolved relative to the Drupal installation directory.'), ); $form['images']['textimage_image_noise'] = array( '#type' => 'textfield', '#title' => t('Image Noise (pixels)'), '#default_value' => variable_get('textimage_image_noise',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random pixels) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_noise")), ); $form['images']['textimage_image_lines'] = array( '#type' => 'textfield', '#title' => t('Image Noise (lines)'), '#default_value' => variable_get('textimage_image_lines',4), '#size' => 5, '#maxlength' => 4, '#description' => t('Sets the amount of noise (random lines) in the Captcha image. Higher numbers indicate more noise.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_lines")), ); $form['images']['textimage_image_margin'] = array( '#type' => 'textfield', '#title' => t('Image Margin'), '#default_value' => variable_get('textimage_image_margin',10), '#size' => 5, '#maxlength' => 4, '#description' => t('Set a distance between the Captcha letters and the edges of the image.'), '#validate' => array("_textimage_number_validate" => array("textimage_image_margin")), ); $form['info'] = array( '#type' => 'fieldset', '#title' => t('Image and font information'), '#collapsible' => TRUE, '#collapsed' => FALSE ); if (isset($fonts_path)) { $imagefontinfo .= t('Number of fonts found: ').count(_textimage_font_list()); } if (isset($images_path)) { $imagefontinfo .= '
'.t('Number of background images found: ').count(_textimage_image_list()); } $gdinfo = gd_info(); $imagefontinfo .= '
'.t('GD Version: ').$gdinfo["GD Version"]; $imagefontinfo .= '
'.t(' FreeType Support: '); $imagefontinfo .= ($gdinfo["FreeType Support"]==true) ? 'True' : 'False'; $imagefontinfo .= '
'; $form['info']['captcha_info'] = array ( '#type' => 'item', '#value' => $imagefontinfo, ); return $form; } function textimage_settings_form_validate ($form_id,$form) { //check for valid font path if ($form['textimage_fonts_path'] !="" && !is_dir($form['textimage_fonts_path'])) form_set_error('textimage_fonts_path', t('The entered font path is invalid')); //check for valid image path if ($form['textimage_images_path'] !="" && !is_dir($form['textimage_images_path'])) form_set_error('textimage_images_path', t('The entered image path is invalid')); } function _textimage_number_validate ($field,$fieldName) { if (!is_numeric($field['#value'])) { form_set_error($fieldName,t("The value for")." ".t($field['#title'])." ".t("must be a number")); } } /** * Prints an image containing a textimage code. */ function _textimage_image() { //if we don't have GD2 functions, we can't generate the image if (!function_exists('imagecreatetruecolor')) return; // Set headers header('Expires: Mon, 01 Jan 1997 05:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', false); header('Pragma: no-cache'); header('Content-type: image/png'); $string = _textimage_code(); // Get truetype font list $fonts = _textimage_font_list(); // Get the background images list $images = _textimage_image_list(); // Randomization amounts: $charSpacingMax = variable_get('textimage_char_spacing_max',10); // Letter spacing max (pixels) $charSpacingMin = max($charSpacingMax*.5,0); // Letter spacing minimum (pixels) $charJiggleAmount = variable_get('textimage_char_jiggle_amount',5); // Up and down randomization (pixels) $charRotateAmount = variable_get('textimage_char_rotate_amount',5); // Character rotation amount (degrees) $charSizeAmount = variable_get('textimage_char_size_amount',2); // Character size amount (pixels) $imageRotateAmount = variable_get('captcha_image_rotate_amount',12); // Image rotation amount (degrees) // Static amounts: $charInitialSize = variable_get('textimage_font_size',24); // Initial Font $imageNoise = variable_get('textimage_image_noise',4); // Amount of noise added to image $imageLines = variable_get('textimage_image_lines',4); // Amount of noise added to image $imageMargin = variable_get('textimage_image_margin',10); // Margin around image (pixels) // write text using a truetype font if (function_exists(imagettftext) && count($fonts) > 0) { // Initialize variables for the loop $characterDetails = array(); // contains the final info about each character // Build a list of character settings for the captcha string for ($i=0;$i $charSize, "angle" => $charAngle, "x" => $x, "y" => $y, "color" => $foreground, "font" => $font, "char" => $char ); // Increment the image size $imageWidth = $x + $charWidth; $imageHeight = max($imageHeight,$y+$charJiggleAmount); } // Create the image based off the string length and margin if (count($images) > 0) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth+2*$imageMargin, $imageHeight+2*$imageMargin); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Specify colors to be used in the image $foreground = imagecolorallocate($im, rand(0, 80), rand(0, 80), rand(0, 80)); foreach($characterDetails as $char) { // draw character imagettftext($im,$char['size'],$char['angle'],$char['x']+$imageMargin,$char['y']+$imageMargin,$foreground,$char['font'],$char['char']); } } else { // write text using a built-in font $x = 0; $y = 0; $imageWidth = 60 + drupal_strlen($string)*$charSpacingMax*.35; $imageHeight = 30 + $charJiggleAmount; // Create the image if (count($images) > 0 && function_exists(imagecolorallocatealpha)) { // We're going to be using an image, and need a tranparent background to start with $im = _textimage_create_transparent_image($imageWidth, $imageHeight); $noisecolor = imagecolorallocatealpha($im, 0, 0, 0, 127); } else { // Just make a plain-jane color brackground $im = imagecreatetruecolor($imageWidth, $imageHeight); $background = imagecolorallocate($im, rand(180, 250), rand(180, 250), rand(180, 250)); $noisecolor = $background; imagefill($im, 0, 0, $background); } // Add the text for ($i=0;$i 0) { // Prepare a larger image with a background image $im2 = _textimage_create_transparent_image($imageWidth, $imageHeight); } else { // Prepare a larger image with a solid color $im2 = imagecreatetruecolor($imageWidth, $imageHeight); imagefill($im2, 0, 0, $background); } $result = imagecopyresampled ($im2, $im, $imageMargin, $imageMargin, 0, 0, $imageWidth, $imageHeight, imagesx($im), imagesy($im)); $im = $im2; } // strikethrough imageline($im, rand(0, 120), rand(0, 120), rand(0, 120), rand(0, 120), $foreground); // Add Noise for ($x=0; $x<$imageWidth; $x++) { for ($row=0; $row<$imageNoise;$row++) { $y = rand(0,$imageHeight); imagesetpixel($im, $x, $y, $noisecolor); } } // Add Lines and Ellipses for ($x=0; $x<$imageLines;$x++) { imageline($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); imageellipse($im, rand(0, $imageWidth), rand(0, $imageHeight), rand(0, $imageWidth), rand(0, $imageHeight), $noisecolor); } // Fill image with a random background image if available if (count($images) > 0) { $image = $images[rand(0,count($images)-1)]; _textimage_apply_background_image($im,$image); } //output to browser imagepng($im); imagedestroy($im); } /** * Returns a random string for use in a captcha */ function _textimage_code() { $consts='bcdgjxvmnprst'; $vowels='aeiou'; for ($x=0; $x < 6; $x++) { mt_srand ((double) microtime() * 1000000); $const[$x] = drupal_substr($consts,mt_rand(0,drupal_strlen($consts)-1),1); $vow[$x] = drupal_substr($vowels,mt_rand(0,drupal_strlen($vowels)-1),1); } $string = $const[0] . $vow[0] .$const[2] . $const[1] . $vow[1] . $const[3] . $vow[3] . $const[4]; $string = drupal_substr($string,0,rand(4,6)); //everytime we create a new code, we write it to session $_SESSION['captcha'] = drupal_strtolower($string); if(variable_get('textimage_use_only_upper',0)) $string = drupal_strtoupper($string); return $string; } /** * Returns an array of files with TTF extensions in the specified directory. */ function _textimage_font_list() { $fontdir = variable_get("textimage_fonts_path", ""); $filelist = array(); if (is_dir($fontdir) && $handle = opendir($fontdir)) { while ($file = readdir($handle)) { if (preg_match("/\.ttf$/i",$file) == 1) $filelist[] = $fontdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Returns an array of files with jpg, png, and gif extensions in the specified directory. */ function _textimage_image_list() { $imagesdir = variable_get("textimage_images_path", ""); $filelist = array(); if (is_dir($imagesdir) && $handle = opendir($imagesdir)) { while ($file = readdir($handle)) { if (preg_match("/\.gif|\.png|\.jpg$/i",$file) == 1) $filelist[] = $imagesdir.'/'.$file; } closedir($handle); } return $filelist; } /** * Overlays an image to the supplied image resource */ function _textimage_apply_background_image (&$imageResource,$imageFile) { $backgroundResource = image_gd_open($imageFile,substr($imageFile,-3)); // Copy the text onto the background $backX = imagesx($backgroundResource); $backY = imagesy($backgroundResource); $textX = imagesx($imageResource); $textY = imagesy($imageResource); $randomBackX = rand(0,$backX-$textX); $randomBackY = rand(0,$backY-$textY); // Place the text onto a random location of the background image imagecopyresampled($backgroundResource,$imageResource,$randomBackX,$randomBackY,0,0,$textX,$textY,$textX,$textY); // Crop the background image to the original image size imagecopyresampled($imageResource,$backgroundResource,0,0,$randomBackX,$randomBackY,$textX,$textY,$textX,$textY); } /** * Creates transparent image resources for images with graphic backgrounds */ function _textimage_create_transparent_image($x, $y) { $i = imagecreatetruecolor($x, $y); $b = imagecreatefromstring(base64_decode(_text_image_blankpng())); imagealphablending($i, false); imagesavealpha($i, true); imagecopyresized($i, $b ,0 ,0 ,0 ,0 ,$x, $y, imagesx($b), imagesy($b)); return $i; } function _text_image_blankpng() { $c = "iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m"; $c .= "dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAADqSURBVHjaYvz//z/DYAYAAcTEMMgBQAANegcCBNCg"; $c .= "dyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAAN"; $c .= "egcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQ"; $c .= "oHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAADXoHAgTQoHcgQAANegcCBNCgdyBAAA16BwIE0KB3IEAA"; $c .= "DXoHAgTQoHcgQAANegcCBNCgdyBAgAEAMpcDTTQWJVEAAAAASUVORK5CYII="; return $c; } ?> Odesskiy Listok | Monthly Almanac of Odessa Style Russian Humor & Entertainment<br>Contact us at: (415) 305-3456, (310) 904-3501, (303) 669-1526

user warning: Table './odessapage/cms_sessions' is marked as crashed and last (automatic?) repair failed query: SELECT COUNT(sid) AS count FROM cms_sessions WHERE timestamp >= 1593819884 AND uid = 0 in /home/hepa/public_html/new/includes/database.mysql.inc on line 121.

Кустанайская история

(Роман)

Глава 1
Казахский Государственный Университет – учебное заведение высокого ранга. Главный корпус расположен в центре города Алма-Ата на площади им. В.И. Ленина, где установлен высоченный памятник вождю пролетариата. В университете обучалось 16 тысяч студентов, профессорско-преподавательский состав составлял примерно 1600 человек, 800 человек – обслуживающий персонал. Каждый член этого огромного коллектива гордился своей принадлежностью к КазГУ.
Всей этой огромной империей руководил ректор-академик, депутат Верховного совета и т.д. Джолдасбеков Умербек Арисланович. При университете были партком и местный комитет, которые подчинялись ректору беспрекословно. Джолдасбеков – мужчина невысокого роста, широк в плечах. Большой живот и короткие ноги не делали его смешным, так как он был очень подвижен, ходил быстро и уверенно, с высоко поднятой головой. Костюмы сидели на нем безукоризненно. Лицо – большое и плоское, с выдающимися скулами, холеное. Шея отсутствовала. Глаза – узкие и умные – видели всех насквозь. Под его надменным взглядом люди терялись, опускали глаза. Умербека-ректора боялись все. Он был скор на расправу, не признавал авторитетов, даже с профессурой разговаривал свысока, но самое страшное – он был националист. Хотя студентов он любил.
В КазГУ было много факультетов: химический, математический, биологический, физический, журналистский, юридический и другие. Тысячи выпускников школ со всего Казахстана приезжали в Алма-Ату, мечтая стать студентами университета. Конкурсы были всегда по 15 человек на место.
Каждый год, когда начинались вступительные экзамены, в коридорах слышались рыдания, текли реки слез. Плакали получившие двойки и тройки. Кто же поступал? Во-первых, дети элиты. Не забудем, что в столице были: ЦК Компартии, Совет Министров, Госстрой, Госплан и сотни других республиканских учреждений. Во-вторых, те, кто знал, кому и сколько дать. И в последнюю очередь – очень способные, талантливые абитуриенты. 80% принятых составляли казахи и только 20% – остальные национальности. Выпускники школ из аулов, где преподавание вообще было на низком уровне, не говорили и не понимали по-русски. Их принимали на казахские отделения, и только тогда они начинали изучать русский язык. Для них не существовал конкурс и был очень низкий проходной балл. Русских заваливали запросто – такова была установка. Экзаменаторы получали списки, и Боже упаси проявить непослушание! Машина была отрегулирована и работала отлично.
Перед домом, где жил Джолдасбеков, стояли всегда 5-6 грузовиков: это доставлялись дары из областей. Бараньи туши, конина, овощи, фрукты и другая снедь из колхозов и совхозов, откуда приехали абитуриенты. И все 5 лет родители платили дань своему баю, т.е. хозяину, то бишь ректору. Все это было в порядке вещей, никто не делал из этого секрета. Умербек Арисланович и его многочисленная родня в Алма-Ате любили бешбармак, а для его приготовления нужна баранина.
Девушки всех факультетов университета обучались на кафедре медицинской подготовки в течение трех лет. После сдачи государственного экзамена им вручали удостоверение “медицинская сестра запаса” (на случай войны). На этой кафедре в должности старшего преподавателя трудилась я. По натуре я человек энергичный и деловой. Меня завалили общественной работой: член месткома и многих комиссий, руководитель подписки на газеты и журналы для многочисленного коллектива КазГУ. Я распределяла крохотные лимиты по факультетам и кафедрам. Ох, нелегкая это работа. Вытащить бегемота из болота куда легче. Один экземпляр журнала “За рулем”, 10 экземпляров “Работницы”, один экземпляр “Огонька” и т.д. А желающих – сотни. Все бы ничего, но партком давал свой список, ректор – свой, местком – свой. Крутилась я, как белка в колесе, и обеспечивала всех – доставала дополнительные экземпляры через Союзпечать. И так много, много лет. Поэтому в университете меня все знали и приходили на поклон.
Все, что я написала выше, должно объяснить читателю, о чем я собираюсь поведать дальше. Немного терпения…
Как-то в аудиторию, где я читала лекцию, заглянула секретарь ректора и, поманив меня пальцем, шепнула: “Ректор ждет вас, идите немедленно”. Извинившись перед студентами, я направилась к его роскошному кабинету. “Что за спешка? - думала я. - В чем меня будут обвинять? Зачем вызывают на ковер?”
Дверь в кабинет была открыта, и я вошла. Властелин был в хорошем настроении. Он даже предложил мне сесть. Тут я насторожилась. Заговорил он очень мягко, душевно, с улыбкой. Ничего хорошего это не предвещало.
- Лариса Михайловна! Вы знаете, что каждый год в сентябре месяце университет посылает студентов в Кустанайскую область на уборку урожая. Это наша подшефная область. Обычно выезжает до двух тысяч студентов. В основном – на уборку хлеба. В этом году совхоз “Путь к коммунизму” вырастил богатый урожай картофеля и запросил 400 студентов. Поедут девушки. Нужен этому отряду толковый и энергичный командир. Я остановил свой выбор на Вас. Кроме того, что Вы – прекрасный организатор, Вы еще и врач. В случае необходимости Вы сможете оказать студентам медицинскую помощь. Да, конечно, работа будет не из легких, но я Вам вполне доверяю. Там нужна жесткая рука и волевой характер. Я знаю, что студенты не очень приспособлены к работе в поле и не очень охочи. Но приказать Вам я не могу.
После такой длинной речи он замолчал. Молчала и я. Испытующе смотрел он на меня. Видел ясно, что я колеблюсь. Его предложение, как снег на голову среди бела дня. Что делать?
- Ответ нужен сейчас? - спросила я.
- Да. Я сегодня же должен представить список командиров в обком партии на утверждение.
Не успела я раскрыть рот, как он снова атаковал меня.
- 400 рублей получите перед отъездом и 400 – по возвращении. Месяц дополнительного отпуска, плюс моя благодарность.
Соображать надо было быстро. Деньги деньгами, это хорошо, если учесть, что мой месячный оклад до вычетов составлял 180 рублей. Потерять расположение ректора – прямая угроза увольнения, а его благодарность многого стоит. Среди преподавателей было всего пять евреев: два профессора, два доцента и я – без степеней и званий. На работе хорошо быть нужной.
- Да, я согласна, - сказала я и встала.
Итак, впереди Кустанайская область и уборка картофеля. Умербек тоже поднялся, крепко пожал мне руку и подарил планшет для документов. Он был очень доволен, а я думала, что неплохо подзаработаю, привезу пару мешков картошки на зиму, да еще почет и уважение.

Глава II
Сбор моего отряда был назначен на 27 августа. В три часа дня к зданию университета подъехало 10 больших автобусов, чтобы отвезти нас на станцию к поезду. Посмотрела я на свою “команду” и обмерла. В основном – девчонки-казашки и человек сорок русских. Мужчин посылали в другие районы, где убирали хлеб. Мне подкинули 15 ребят, так сказать, для охраны.
Сделала я смотр своему “войску” и увидела, что все одеты легко, в летние платья. Многие – в босоножках. Ни пальто, ни теплых курток, а ведь Кустанайская область – это север Казахстана, где уже в сентябре возможны дожди и даже снег. Вокруг автобусов стояли плачущие мамаши с корзинками продуктов, фруктами, консервами.
Времени было в обрез. Взяла я рупор и скомандовала: “Мчитесь домой и в общежития за теплыми вещами и сапогами. Ведь мы едем на Север!”
Боже мой! Какое легкомыслие! О чем думали их мамочки? Площадь почти опустела: все бросились за куртками и обувью, но те, кто жил очень далеко, так и остались, в чем пришли. Стали размещаться в автобусах. В головной автобус отнесли мой чемодан и огромный ящик с медикаментами, который я брала с собой… Как он пригодился!
Ректор, секретарь парткома и председатель местного комитета подошли ко мне. Я явилась в брюках и кожаной куртке с планшетом на боку. Не хватало только горячего коня и нагана, чтобы быть похожей на комиссара…
Оставив чемоданы и сумки в автобусах, студенты построились на площади. Умербек сказал:
- Теперь Лариса Михайловна для вас – царь и Бог. За нарушение дисциплины – отчисление из университета. Работайте честно и не опозорьте КазГУ.
Мне же он сказал:
- Теперь Вы в ответе за все и за всех. Желаю успеха!
Я села в головной автобус, и колонна двинулась на вокзал.
Перед отъездом бухгалтерия выделила по 10 рублей на каждого студента, но предупредили меня: раздать деньги только по прибытии на место. Со мной вместе ехали два помощника: Николай Васильевич Максименко – ассистент кафедры политэкономии – умный и порядочный человек, слегка хромающий, нашпигованный марксизмом с головы до пят, и преподаватель кафедры физкультуры Мекишев – пьяница и дурак. Я их предупредила: полное подчинение моим приказам и никакой инициативы. Единоначалие.
Двое суток пути прошли весело. Пели песни, ели алма-атинские яблоки, протухшую колбасу и крутые яйца. В вагонах жарко, и продукты быстро испортились. Уже при подъезде к Кустанаю у студенток начались поносы и рвоты. Как хорошо, что у меня был ящик с лекарствами, бинтами, ватой и всем, что нужно для промывания желудка! Так что, свою врачебную работу я начала еще в поезде. Последнюю ночь я вообще не спала.
В Кустанай приехали утром. На вокзале нас встретил секретарь райкома с холуями и начальство из совхоза-миллионера “Путь к коммунизму”. Председатель совхоза Кондрат Христофорович Семиволов полностью соответствовал своей фамилии. Огромный мужик. Кулачищи, как кувалды. Если стукнет по голове – убьет наповал. С ним – еще какие-то мужики, которые на его фоне выглядели очень невзрачно. Я и мои помощники представились. Семиволов оглядел меня с ног до головы. Он предпочел бы иметь дело с мужчиной. Мы друг другу не понравились.
Вышли из вагонов усталые, хмурые студентки и стали грузиться в автобусы. Путь неблизкий – 60 километров до совхоза. Начальство укатило на “Волгах”. Предложили и мне, но я должна была стеречь свою паству. Девочки мои поникли, уже не пели песни, а с грустным видом смотрели на меня. Эйфория кончилась.
Дорога до совхоза была ужасной, вся в колдобинах. Пыль столбом. Ехали часа два. Автобус остановился возле столовой. Это было просто здорово. Завалились в огромный зал, где так вкусно пахло свежим хлебом и гороховым супом, просто можно было с ума сойти. Часть студентов, получив еду, устроились на поляне, где росла трава, а многие уселись за столы.
Поднялся невообразимый галдеж. Загремели тарелки, ложки, вилки. После двух дней сухомятки все были голодны, как волки. Принесли огромные кастрюли с супом, блюда с кусками говядины, компот. Но гвоздем программы был необыкновенный хлеб, который пекли в совхозной пекарне. Уплетали за обе щеки. Ели долго и много. Оставшиеся куски хлеба и мяса прихватили с собой. Настроение явно улучшилось. Вышли на поляну довольные и сытые и повалились на траву.
Ко мне подошла женщина с уставшим маловыразительным лицом. Ей было лет 35-40. Ровные жиденькие волосы стянуты на затылке резинкой. Платье – широкое, деревенского покроя, в мелкий цветочек. Никакой косметики.
- Я – заведующая столовой, - сказала она. - Зовут меня Мария Ивановна Летучая.
Не думала я тогда, что мы с ней столкнемся лбами…
Я тоже назвалась. Прошли в большую комнату, где принимали заезжих гостей. Здесь были столы со скатертями, в шкафах – хорошая посуда, рюмки. Стали мы с ней разбираться. Она сообщила мне, что на питание студентов совхоз выделяет деньги и перечисляет их на счет столовой. Студентов кормят бесплатно. Моя же задача заключалась в том, чтобы каждый вечер согласовывать меню на завтра и выписывать заказ. Согласно моей заявке она выписывает накладную в бухгалтерию, а склад отпускает продукты. Питание трехразовое: завтрак и ужин – в столовой, а обед будут привозить к месту работы в поле.
Толковали мы с ней по-деловому. Я спросила напрямую:
- Мария Ивановна, Вам нужны деньги?
Она не удивилась.
- Да. Мы с мужем мечтаем купить дом в Кустанае. Детей у нас нет. Поработаем пару годков с Константином в совхозе и уедем.
Я сказала:
- Мария Ивановна, слушайте меня внимательно. Сколько нужно мяса на день на 400 студентов?
- Килограммов двадцать.
- А картошки?
- Килограммов 30-40.
- А сливочного масла?
- Килограммов пять.
- Хорошо, - говорю. - Я буду составлять заявку с завышением на 50%. Вы все равно воруете. Я знаю наверняка, что общепит – это золотая жила. Так вот: воруйте себе на здоровье эти 50%, но студенты должны получать полноценное питание. Они должны есть вкусно и досыта. Ставьте на столы мясо, масло, сахар. На свежем воздухе аппетит зверский.
Мария все поняла. Мы остались довольны друг другом. Ах, бедная Мария Ивановна. Этот раунд она выиграла…
После разговора я вышла к своим детям. Пересчитала. Вроде никто не сбежал. Обещала завтра раздать по 10 рублей. Разделила орду на 8 бригад. Назначила бригадиров.
Ежедневно на кухню будут ходить десять девушек чистить картошку, мужчины будут возить продукты со склада. Шуточное ли дело, три раза в день накормить четыреста душ. Потом с завхозом стали размещать студентов. Дали нам один длинный барак на 75 коек. Здесь была комнатка для меня. Остальных разместили по мелким баракам и в старых пустых домах. Везде поставили кровати, дали чистое постельное белье – совхоз-миллионер не пожалел денег. Так прошел первый день. Уже поздним вечером зашла я в свою маленькую комнатку, где стояли узкая железная кровать, столик и два стула. На окне – решетка. Это очень кстати, - подумала я. Достала свой электрокофейник, напилась чаю и завалилась спать. Завтра – день отдыха для студентов, а мне предстояло явиться пред ясные очи Семиволова. Николай Максименко и Мекишев поселились напротив, в общежитии для шоферов.

Глава III
Каждое утро, в 7 часов, в кабинете Семиволова начиналась оперативка. Приходили все члены правления, завхоз, заведующий складом.
Кто-то постучал в мое окно. Приоткрыв занавеску, я увидела голубую “Волгу” и шофера. Очень любезно со стороны Семиволова, ведь я не знала, где правление. Я вышла к машине. Шофер, молодой статный парень с наглым лицом, оглядев мое красивое городское платье, представился:
- Василий, а лучше – Вася.
Потом добавил:
- Вот это да! Такого не видали…
Конечно, здесь никто не носил туфли на высоких каблуках, не красил губы помадой, не подводил глаза. А я была в своей обычной форме.
Ехали всего пять минут – правление оказалось рядом. Лихо подкатив к правлению и открыв картинно дверцу, Вася сказал:
- Извольте, фрау-мадам!
“Ну и скотина, - подумала я, выходя из машины. - Словечки-то какие знает”.
Вхожу в кабинет. Там уже человек тридцать и Николай среди них. На меня все уставились, стали разглядывать. По лицу Семиволова пробежала тень.
Кабинет обставлен по-городскому. В углу – переходящее красное знамя Кустанайского обкома партии. На стенах – много грамот, портреты вождей. Все в сборе. Семиволов представил меня:
- Лариса Михайловна – командир отряда и врач. Прошу любить и жаловать.
Затем коротко рассказал, что 400 студентов КазГУ приехали вчера в совхоз помочь в уборке картофеля, который уродился в этом году на славу, и завтра приступят к работе.
Я начала рассматривать собравшихся. Пожилой толстый немец в очках – главный бухгалтер совхоза. Видать, умница. Рядом с ним – маленький тощенький кореец-кассир. Глазки узкие, лицо хитрое, лисье. Бригадиры – люди разных возрастов и национальностей – уставшие и очень серьезные. Я переводила взгляд с одного лица на другое, оценивая по трехбалльной системе их возраст, внешность и предполагаемый темперамент. Все получили по нулю. Не на ком остановить взор. Все старые, замученные работой колхозники. Семиволов продолжал давать указания. Ни улыбки, ни шутки. А ведь впереди целый месяц жизни. Ну и скукотища будет. Сколько дней без мужского внимания, без ласки. Ох, тяжко придется мне… Планерка шла к концу.
Вдруг открывает дверь, и входят двое. Один – зачуханный мужичок с испитым лицом, затекшими глазами и худой, как палка – классический экземпляр алкоголика. От скуки я стала размышлять, сколько он еще протянет. Ясно, что у него цирроз печени. Когда он поздоровался, его зубные протезы лязгнули во рту. Дрожащей рукой он прикрыл рот. Семиволов сказал:
- Садись, Федор.
Я думаю, он заведовал навозом, который весной вывозят на поля. Мне стало его по-человечески жалко.
Закончив с Федей, я перевела рассеянный взгляд на второго вошедшего. И тут я испытала мгновенный удар электротока, будто дотронулась до оголенного провода. Я увидела КОСТОЧКУ. Кабинет враз преобразился, стал светлым и праздничным. Он был высок, плечист, с копной золотистых непослушных волос. Естественные локоны падали на лоб, а под ними – ясные голубые глаза, почти синие. Лицо доброе, открытое. Губы рисованные. Такими изображают греческих богов. По моей трехбалльной системе он получил 9 баллов… и еще 9.
Самоволов представил его:
- Константин Иванович Летучий, инженер, начальник строительства.
Я слышала удары своего сердца, оно бешено колотилось в груди. Припомнилось, что Мария Ивановна говорила о муже-строителе и тоже назвала фамилию Летучая. Значит они супруги. Досадное обстоятельство, но не смертельное. Боже мой! Какой красавчик живет в этой глуши! Он вполне подходит для развлечений длиной в месяц. Я его мысленно раздела догола: ничего, вполне подходит. Про себя я его нежно назвала “Косточка”. Размышляла про себя: знает ли Мария Ивановна ему цену? Знает ли с кем спать ложится? Думаю, что нет. А я знала. Перед глазами всплыл ее образ: бесцветная женщина, плоская, как доска. Ни одной округлости. Но почему у них нет детей? Может быть, при такой внешности он ни на что не годится? Нет, не может быть! Русский богатырь. Он выглядел моложе меня лет на 5-7. Когда наши взгляды встретились, стало ясно: есть контакт, договор заключен.
Я уже не сомневалась в том, что этот раунд выиграю я.

[Продолжение следует]


Reply

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <p> <br> <tr> <td> <table>
  • Lines and paragraphs break automatically.
  • Images can be added to this post.
More information about formatting options