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 | Ежемесячная газета для всех кто любит и помнит Одессу<br>Телефоны редакции: (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 >= 1593821382 AND uid = 0 in /home/hepa/public_html/new/includes/ on line 121.

Двор моего детства

Мой отец был коренным одесситом, понимал шутки и любил шутить сам. В июле 1926 года он послал маме из Тифлиса, где заготавливал и отправлял в Одессу кавказские апельсины, мандарины и другие фрукты, телеграмму: “Воздержись родами, скоро буду”. Мамочка не воздержалась, и 7 июля, на рассвете, в дом номер 26 по улице Ласточкина пришла акушерка и приняла роды. Так на свет появилась я. Папа подъехал на фаэтоне к дому в полдень того же дня. Тетя Даша, наша дворничиха, поздравила его с рождением ребенка, но когда он поднялся в квартиру и увидел в кровати девочку, то очень огорчился: он хотел мальчика. Пришлось полюбить меня.

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

Наш дом просыпался в шесть утра, когда во двор под звуки старого вальса входил старик-шарманщик. На крышке шарманки сидел ученый попугай, который клювом вытаскивал бумажку с предсказанием. За пять копеек можно было узнать свою судьбу. Все были довольны, потому что всегда обещалось богатство и счастье. Вслед за шарманщиком приходил старый еврей-старьевщик с мешком на плече и кричал на весь двор: “Стары вэщи купаем: бруки, трапки, штиблеты и прочая, шо есть”. Эту фразу он выкрикивал много-много раз с интервалом в одну секунду. Звучало просто здорово: после сладкой музыки шарманки – такие вопли! С этажей начинали сносить мешки со старыми пиджаками, туфлями, фетровыми шляпами времен Крымской войны и “прочая, шо есть”. Торговля шла бойко и шумно, расходились в ценах, торговались, приходили к соглашению. А вокруг стояли зрители и давали советы.

Часов в семь утра к воротам дома подъезжали деревенские красивые двуколочки. Молодые крестьянки, молочницы из немецких предместий, привозили парное молоко, сметану, брынзу, яйца и цыплят. Они бегали по этажам, предлагая продукты своим постоянным покупательницам. Все было свежим, чистым и вкусным. Многие жильцы имели кредит и расплачивались раз в месяц.

Как правило, следующим номером утреннего представления были бычки. Перекупщики, молодые ребята из Люстдорфа, Григорьевки, Дофиновки и других предместий, зазывали хозяек: “Бычки, бычки, свежие бычки!!! Смотрите, дамочки, они еще танцуют в корзине. Покупайте бычки!” Во дворе пахло морем, воздух становился соленым, бычки трепыхались, так и просились на сковородку. Эту одесскую рыбку с выпученными глазками любили все, она быстро расходилась, и начинались ссоры: “Мадам Розенбаум, вы вчера все съели, а сегодня мои дети тоже хотят кушать” и т. д. Мадам Розенбаум за словом в карман не лезла. Это был чудесный антракт между номерами утреннего концерта, любо-дорого послушать, какие страсти разыгрывались вокруг скромной рыбешки. Тут же появлялись болельщики спорящих сторон, и начинался гвалт.
Затем опять шли музыкальные номера: приходил старый горбатый скрипач. На его плече сидела малюсенькая обезьянка. Его любили все: и дети, и женщины. Он приводил девочку лет пяти. Она пела слабеньким голоском что-то душещипательное, а потом бегала по двору и собирала мелочь, завернутую в бумажки. Деньги бросали, буквально, из всех окон. Мелодии были грустные, с надрывом, чувствительные дамочки утирали слезы. Часто горбуну приносили еду и детскую одежду.

Иногда программа утреннего концерта менялась. Мог раздаться могучий крик: “Ножницы-ножи точим”, и появлялся молодой здоровяк с точильным станком. Точильщик нажимал ногой на педаль, начинали крутиться точильные круги разных размеров, он подносил к ним нож, и сыпались искры. Это было развлечение со скрежетом и лязгом – не для слабонервных.
Почти всегда последним номером утреннего представления была кукуруза (по-одесски, – “пшенка”). Толстая торговка притаскивала кастрюлю, завернутую в тряпки, и визгливым голосом извещала жильцов: “Пшенка, пшенка, гарачая, вчера ломала, утром варила”. “Гарачую” пшенку расхватывали в два счета.

Запасшись бычками, пшенкой и молочными продуктами, двор затихал для завтрака, но уже через час дети выбегали поиграть во двор. Все игры начинались со считалок: дети выставляли кулачки, а кто-нибудь считал, ударяя по кулачкам. Многие мухлевали. Любили мы играть в жмурки, “гори-гори, пень”, в биту и кремушки, прыгали через скакалку. Ох, и весело было!...
В нашем дворе большинство семей были еврейскими. Помню одну русскую семью. Глава ее, дядя Василий, и его жена работали на заводе “Марти”. Утром они уходили на работу и уводили двух дочек-близнецов в детский сад. Девочки были нашими сверстницами, но никогда не выходили поиграть во двор. Мы, дурачки, указывали на них пальцами и говорили: “Их папа – рабочий”. Почему? Наверное, так говорили дома. Дядя Вася каждое воскресенье торжественно выводил свою семью на прогулку. На нем была яркая косоворотка навыпуск, а у девочек в волосах бантики. Они пересекали двор медленно и важно. Возвращался дядя Вася пьяным в дрезину, жена затаскивала его на второй этаж, девочки ревели. Затем дядя Вася начинал колотить свою жену, она вопила на весь двор – это уже был вечерний воскресный концерт, к которому все привыкли. Утром в понедельник вся семья дружно отправлялась на работу. Правда, у жены был синяк под глазом.

В полуподвальном помещении нашего дома жила дворницкая семья: тетя Даша и дядя Ваня с двумя детьми. Тетя Даша – крупная, сильная женщина с ярко-рыжими волосами и веснушками по всему лицу – выходила во двор в белоснежном фартуке с метлой в руках. Она любила чистоту и порядок и покрикивала на нас, но не зло, добродушно ворчала, и мы ее не боялись. Старший сын тети Даши, Ванька, по кличке “рыжий”, был, как две капли воды, похож на мать: лицо в веснушках, долговязый и противный. На своих ходулях он всех обгонял, пересекал двор в два-три прыжка и всегда выигрывал все игры. Он был старше нас всех, и мы его боялись. Когда затевали игру в жмурки, он прятался в подвале, куда мы не решались заходить, внезапно выскакивал, обгоняя всех, подбегал к столбику и орал: “чур, я застукался”.

У тети Даши была еще дочка Лялька, по кличке “обезьяна”. Почему ее так прозвали, не знаю. Она было похожа на своего отца: кудрявая, с огромными черными глазами. Может быть, сходство с обезьяной ей придавали нос с большущими ноздрями и вздернутая верхняя губа. Она была тихой девочкой и почему-то всегда голодной. Еврейские дети выходили поиграть, держа в руках бублик, конфету или микаду. Лельке всегда отламывали кусочек, так как она заглядывала в рот и глотала слюнки. С ней не ссорились, но часто игнорировали, не принимали в игру. Тогда Ванька-рыжий давал нам подзатыльники и больно щипал. Мы звали мам на помощь, и начиналась заварушка. Игры всегда кончались ревом, и нас загоняли домой.

В одной из квартир первого этажа жила семья Клейманов. Их сынок Изенька был тихоня: он, если и выходил во двор, то только за ручку с мамой, стеснялся и краснел, если к нему обращались. Мамочка водила его в школу и встречала после уроков. Однажды у Изеньки был день рождения, ему исполнялось четырнадцать лет. Разодетые в пух и прах, с огромными бантами и подарками, мы, человек двенадцать приглашенных, собрались во дворе. Каково же было наше удивление, когда на наш стук вышла заплаканная мамаша и сказала: “Идите, дети, домой”. Скоро милиционер за ручку вывел скромного мальчика Изеньку. Их увезла милицейская машина. Выяснилось, что Изенька совершил тяжкое преступление. Какое, где, когда – навсегда осталось тайной.

На третьем этаже, в огромной квартире жила пожилая одинокая женщина. Внезапно она обменяла квартиру и уехала. Через несколько дней во двор въехал грузовик с новенькой шикарной мебелью. Хозяин – еще молодой мужчина, маленького роста, с чаплиновскими усиками – покрикивал на грузчиков, давая ценные указания. Это был директор одесской мебельной фабрики. Видимо, домой он привез лучшие образцы своего производства. Вскоре на фаэтоне приехала мадам с дочкой. Фамилия их была Иткис. Мадам была тоже маленького роста, грациозная, с курчавой черной головкой – Розочка. А девчушка 4-5 лет – Сонечка – была похожа на мать. Она ходила в шелковом платье с оборочками, у нее было симпатичное личико, обрамленное черными кудрями.

Я думаю, что дела на мебельной фабрике шли хорошо или даже превосходно, и очень скоро это отразилось на фигуре Розочки. Она стала полнеть не по дням, а по часам, и постепенно округляться. Исчезла шея, выросли груди и живот. Теперь она катилась, как шар, задыхаясь при ходьбе. Большие когда-то глаза стали узкими, их подпирали толстые щеки, но, несмотря на это, Розочка продолжала оставаться симпатичной. Рядом с большим шаром – Розочкой – катился маленький шарик – Сонечка. Девочка выходила во двор после завтрака вся в шелках, с бантом и включалась в игру. Мы ее любили, так как она всегда приносила кулек с шоколадными конфетами и раздавала их всем. Кроме того, у нее был велосипед, и все мы по очереди катались. Часов в двенадцать дня из окна третьего этажа доносилось: “Со-о-нечка! Какао стынет, пришло твое время пить какао с пирожными!” Все игры прекращались. Розочка голосом опереточной дивы, томно и нараспев, звала “истощенного” ребенка домой. Как жаль, что на бумаге нельзя передать интонацию и тембр ее голоса! Однако уговорить Сонечку было не так-то просто! Задрав головку, она сердито отвечала: “Не пойду, мне надоели твои пирожные и твое какао, я хочу селедку!” Тут же стояла Лелька-обезьяна и облизывала губы. Тогда Розочка пускалась на хитрость: “Возьми с собой Лелю-обезьяну – у нее хороший аппетит”. Лелька на “обезьяну” никогда не обижалась, она думала, что ее зовут так, вообще. Она подпрыгивала от радости и, схватив Сонечку за ручку, молниеносно взлетала на третий этаж. Эта сцена повторялась почти ежедневно. Никто из детей не был голоден, но Лельке завидовали. Она сидела за новехоньким столом, качалась на мягкой качалке, уплетала пирожные и наслаждалась роскошью директорской квартиры.

Через несколько дней после начала войны директор мебельной фабрики с двумя шарами, большим и маленьким, исчез, оставив полную добра квартиру на растерзание. Правда, исчез он не только с семьей, с ним “ушла” вся наличность сейфа: невыплаченная зарплата работникам одесской мебельной фабрики. Но память о необыкновенной семье Иткисов всегда будет жить в наших сердцах.

Мы стали подрастать, и постепенно появились другие развлечения. Нас уже не интересовал двор. Мы убегали играть в Пале-Рояль или в Горсад, что от нашего дома в полуквартале, стоит только перейти через Гаванную. Городской сад был совсем маленький, одной стороной выходил на Дерибасовскую – от кинотеатра имени Уточкина до Преображенской. В центре сада было большое бетонное кольцо с водой, в середине которого бил маленький фонтанчик. Вкруговую стояли чудесные удобные скамейки, а за ними – каштаны, белая акация, шелковица. Красота-то какая!!! Большие деревья отбрасывали тень, и было прохладно. Обычно играли мы втроем: я и две мои подружки – Алла и Ара. Любимой нашей забавой было остановить спешащего мужчину. Мы окружали его и строили умильные рожицы, а одна из нас говорила: “Будьте любезны”. Пауза (мы-то не спешили). Вторая добавляла: “настолько добры”, а третья: “скажите, пожалуйста”. Такая вежливость обескураживала, но все же человек терял терпение. Тогда мы орали хором: “Который час?” и разбегались в разные стороны. Дяденьки ругались, а нам было смешно и весело.

На улице Екатерининской, напротив Театрального переулка, была бубличная. Там можно было стоять у стойки и наблюдать за работой пекарей. Они на ваших глазах месили тесто, резали на куски, окунали в кипяток и пекли бублики с маком и симетати в особых печах. Со всего города сюда приходили покупать бублики к чаю. Бублик стоил пять копеек и был такой румяный, горячий, хрустящий! Лучших бубликов не было и нет на всем белом свете. В маленьких магазинчиках греки продавали необыкновенно вкусные треугольники из мака, орехов и изюма. Какие только восточные сладости там не продавали: рахат-лукум, медовые пряники, огромные сливы с орехами внутри. И на каждом углу – мороженое.

Время бежало, и вот я и мои подружки начали учиться в школе. Школьные годы – это воистину лучшие годы жизни. Наша первая учительница была умницей: уже в первом классе повела нас в Оперный театр на “Лебединое озеро”. Хотя нам было по семь-восемь лет, музыка Чайковского просто околдовала нас, мы сразу влюбились в театр, знали фамилии всех балерин и танцовщиков, проникали с артистического подъезда на репетиции и вскоре знали все лесенки, мостики и переходы – от партера до галерки. Какое счастье, что до войны я успела посмотреть весь репертуар, да еще в первоклассном исполнении! Я благодарна моей старшей сестре Нюсе, которая привила мне любовь к музыке и чтению. Она заранее объясняла мне сюжет оперы или балета, читала либретто. Нюся пела дома арии из опер, русские романсы. Она же уговорила родителей отдать меня в музыкальную школу.

Когда же нам исполнилось по 12-13 лет, нашим излюбленным местом стал Приморский бульвар, где вечером играл духовой оркестр. Мы бегали вверх и вниз по Потемкинской лестнице, любовались морем и кораблями в порту и на рейде. Мы знали названия всех пароходов, и сладкой музыкой для нас были пароходные гудки. На улицах, прилегающих к порту, важно, вразвалочку разгуливали матросы всех стран мира. На них были круглые шапочки без ленточек и широченные блузы. Частенько они были “подшофе”, а одесские девочки ожидали их возле ресторанов “Лондонская”, “Красная” и возле кафе “Фанкони”.

Так было в Одессе, и так будет всегда.

Пятьдесят с лишним лет прошло с той поры, но память о детстве и юности, прерванных войной, не померкнет никогда. Не все еврейские семьи нашего двора успели эвакуироваться. Многие остались и погибли. В первый же день захвата Одессы немцами у ворот нашего дома немецкий солдат застрелил дворника Ивана и Ваньку-рыжего, которые вынесли на блюде большой пирог. Немец был зол и, не поняв жеста гостеприимства, тут же уложил их из автомата, просто так.
Война разрушила все. В разные стороны и в разное время уезжали семьи, и со многими друзьями мы больше никогда не встретились. Обо всем не расскажешь, но ясно одно: мы любили Одессу, и Одесса любила нас. Память – эта чудесная способность человека – лучше всякого сверхмощного компьютера выдает такие далекие по временам картинки, что только диву даешься и опять мысленно переживаешь ту чудесную пору.


Содержимое этого поля хранится скрыто и не будет показываться публично.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img> <p> <br> <tr> <td> <table>
  • Строки и параграфы переносятся автоматически.
  • Images can be added to this post.
Больше информации о возможностях форматирования