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

Вот и она – медитация…

«Нас в набитых трамваях болтает,
нас метро поглощает вовсю…»
(Строчки из песни)

Переселение из Бруклина в Манхэттен – и обратно!

Вторник, 30-го, то ли июня, то ли июля, а может, мая… То ли 2002-го, то ли 200х-какого-то года… В нашем доме идет самый разгар переселения в Манхэттен. Мебель и аппаратура сложены вперемешку, и невозможно понять, что к чему идет и что с чем связано. Зато встречаются и такие вещи, которые попадали в поле зрения в последний раз, скажем, лет эдак пять тому назад. Вот и первая из прелестей процесса переселения!..
Прошло почти семь лет с тех пор, как я так переселялся. Надо было быть осторожным и бдительным, на предмет целости и сохранности вещей. Не зря говорят, что переезд двум пожарам равен!
Именно поэтому я уделил особое внимание своей коллекции компакт-дисков и данных, записанных на компьютере. На моей бывшей квартире, ввиду наличия свободного времени, я их сделал столько, что мало не покажется. Запаковал их для перевозки, да так, чтобы в случае пропажи потери были минимальными. Вот тут-то и понадобились навыки, полученные в результате моего пребывания в политехническом институте Бруклина. Только свои аудио компакт-диски я плотно держу в своих руках, никому не отдавая даже в момент перевозки. Уж очень я ими дорожу.
И вот мы едем. Чтобы дать отдохнуть нашей «рабочей лошади» (т. е. машине), нам с перевозкой вещей помогает один человек. Зовут его Борис, лет ему где-то под 60, в прошлом – инженер (как многие из нас). А чем еще может заниматься бывший инженер такого возраста?! Его машина – старенький Олдсмобиль – не такой, как был у нас в середине 90-ых, с которым связаны многочисленные поездки по Бруклину, иногда в Манхэттен, а изредка и за город. У Бориса такой Олдсмобиль, в который, при желании, и восемь человек влезет, однако все свободное пространство занято нашими вещами.
Едешь себе по Бруклину, а с тобой – твои вещи. И начинаешь по-философски думать о жизни, о всякой чепухе, и о том, как некоторые знакомые с детства предметы выглядят вперемешку с Бруклинскими пейзажами. А переселяемся мы в Манхэттен почему? Да потому, что в Бруклине стало скучно. И потому, что в доску надоели однообразные пейзажи до боли знакомых улиц, а также вечные мечтания о том, что транспорт на них станет функционировать лучше.
Это, безусловно, прелестно, что мы живем в «курортном районе» и что в 20 минутах от нас – самая, что ни на есть, живая природа… Но мы ведь люди, избалованные комфортом цивилизации, оттого и побаиваемся в эти дебри залезать! А в Манхэттене – и музеи, и развлечения, и вокзалы. Если надо куда-то поехать – 30 минут – и ты там. И тут же, к счастью, нам предложили квартиру. А с Бруклином мы не прощаемся, на выходные всегда будем туда приезжать.
Так вот, в данный момент Борис везет нас через мост из Манхэттена в Бруклин. Года 4 назад все эти пейзажи мне до чертиков надоедали, а сегодня, в сопровождении философских разговоров с Борисом, они смотрятся просто замечательно.
Я сижу на переднем сидении, прослушивая свои компакт-диски. Наконец-то дошел до Кая Метова. С песнями «Где-то далеко идут дожди», «Position Number One» и «Вспомни меня» в моей жизни связаны многие события. Например, 1995-й год, вступительные экзамены в Политехнический университет, вечные мысли «кому я буду нужен после учебы» и «ай, ну да ладно». Да и этот текущий исторический момент, о котором мы долго мечтали!
И вот, въезжая в родной Бруклин, я думаю: а стоит ли его бросать? А скоро ли после Манхэттенского шума и гама меня потянет в мой родной, тихий Бруклинский Sheepshead Bay?..
Стоит, не стоит, а вопрос решится сам!
И тут музыка затихает, все становится тихим, банальным, спокойным, обыденным… Передо мной моя комната… И ясно, что это был сон о переселении из Нью-Йорка в Нью-Йорк. Почему мне снятся такие фантастически-банальные сны о серых буднях? Наверное, потому, что за 15 лет до сих пор себя чувствую туристом даже в Бруклине, даже в некоторых уголках собственной квартиры!
Начну издалека. В канун 2007 года мне искренне полюбился даунтаун Манхэттена. Сначала – институт Купер Юнион, затем – район Нью-йоркского университета, а после и Гринвич-Вилледж вместе с Сохо. Никогда прежде, за все 15 лет здешней жизни, я не любил эти места. Даже напротив, когда мы с мамой там работали, слово «Манхэттен» у меня почти всегда словно «скрипело на зубах». Конечно, было грустно, когда сначала меня попросили больше не работать, а через пару дней мама решила, что довольно ездить на работу «в другой город», и нашла работу в Бруклине. Тогда я был откровенно счастлив тому, что отвязался от Манхэттена, и надолго.
Каждое утро я начинал со слов: «Бруклин мой!», радуясь любой возможности поскитаться по улицам Бруклина, а иногда даже вместо метро мог воспользоваться автобусом. Вскоре даже трасса 41-го автобуса по Флэтбуш-Авеню у меня «начала скрипеть на зубах». Хоть она и прямая, но там такое скопище машин, что и у пассажиров нервы напрягаются. Трасса 103-го автобуса уж куда разнообразнее, однако, 103-й ходит намного реже, чем 41-й, поэтому больше всего мне нравилось кататься именно на нем.
На сегодняшний день кварталы вокруг своего дома я знаю, как «облупленные». Пешком исходил все окрестности вблизи своего жилища. Однако вдруг оказалось, что отнюдь не все.
Возможно, вас насмешит то, что я вернулся в родные кварталы. И это после того, как побывал в далекой родной Одессе, в Сан-Франциско; после того, как в марте 2005-го посетил Европу. Вопреки всем радужным ожиданиям, каждый день пребывания там казался мне вечностью.
Увенчалось все тем, что я приехал обратно, в мой Бруклин, с огромным количеством фотографий, и бродил по его улицам, радуясь тому, что я снова дома. Это торжественное настроение длилось довольно долго, однако уже сегодня я зову свои родные бруклинские кварталы простой банальностью.
С Бруклином у меня связаны многие события, но что касается населения самого города – думаю, я ему абсолютно безразличен.
В Бруклин Колледж, в его библиотеку, я долгое время ходил как в родной дом, как в храм науки, читал их подписные издания, которым много лет. Так, для себя, – просто чтобы знаний набраться. Но, вопреки доводам Сократа, все же тайно ждал – когда же кто-нибудь это оценит…
Но все случилось совсем наоборот. В этой библиотеке меня отвергли в качестве посетителя. Будто собаку, выгнали прочь в студеный зимний день! А за что? За то, что разговаривал по мобильнику чуть громче положенного. И некому было за меня вступиться. Тогда я решил, что ноги моей у них не будет…
Сколько ни хожу я по улицам Бруклина – всегда нахожу какие-нибудь неизведанные уголки. Но Бруклин уж совсем не тот для меня, каким он был тогда, в 2003-м. Тогда-то я и полюбил Манхэттен. Езжу туда каждый день. Оттуда, так же, как и в Бруклин, можно добраться на метро в ближний Нью-Джерси (город Джерси Сити), в котором я чувствую себя великолепно. Правда, в Бруклине, на следующий день, вновь нахожу те места, где нога моя ранее не ступала.
Многим известен Brooklyn Heights – один из красивейших районов, находящийся рядышком с даунтауном Бруклина. Когда я впервые туда попал, исполнилось «без одного дня» 15 лет со времени моего приезда в Нью-Йорк.
Скитаясь по улицам Бруклин Хайтса, я чувствовал, что и в Бруклине есть мое счастье. Но беда в том, что 10 лет я учился в даунтауне Бруклина, и в основном этот даунтаун мне надоел сверх меры. По отношению к пафосному выражению «город твоей мечты – всего в пяти минутах ходьбы от колледжа» я был настроен весьма скептично. Потому что в «города мечты» я больше не верил.
По той же самой причине у меня до некоторого момента Манхэттен и его даунтаунские районы – «на зубах скрипели». Гринвич-Вилледж – там, где у станции метро Вест Четвертая Стрит, через которую я каждый день еду, то же самое и Сохо у станции Бродвей-Лафайет. Разве можно найти для себя «туристический объект» над этими серыми тоннелями метро, а романтику – в этих банальных, словно общественные туалеты, станциях? Ну никогда в жизни! Поэтому, когда хотел по-настоящему отдохнуть – то улетал в Европу. Или, время от времени, в Сан-Франциско или в Торонто.
А тут, в Манхэттене – мое счастье! Но в Бруклине по мне скучают самые близкие мне люди – мои родители.
Все эти поездки сопровождаются переговорами по мобильному телефону, примерно такого содержания, как «я добрался», «буду там-то и там-то через 5 минут», «я задерживаюсь», и, наконец-то – «я еду обратно!!!»
И вот поэтому думается, что не вредно было бы мне получить отдельную квартиру в Манхэттене и жить там вместе с родителями, но при этом появляться периодически в Бруклине, в родном Sheepshead Bay-e. А попадешь в час-пик в наше метро – в котлету превратишься.
В Манхэттене же уж куда больше магазинов по особым интересам, чем в Бруклине. Чего только стоит букинистический магазин «Стратнд», что в двух шагах от Юнион Сквера, который у меня, правда, до сих пор ассоциируется с работой. Однако там, рядом, – и Гринвич-Вилледж, и институт Купер Юнион, и Сохо.

В Бруклине

Вот именно во второй вторник апреля я туда и выбрался. Магазин – просто город книг. Это не «Барнс&Ноблс», где все самое свежее и дорогое. Это – магазин уцененных книг, где яблоку негде упасть. Некоторые сотрудники на лестницу-стремянку становятся, для того, чтобы достать ту или иную книгу.
Провел я в этом шопе часа три, купил четыре книги, мог и больше, но просто было «лень тащить». А дальше – я загулял по Манхэттену, да так, что и боль в ногах прошла.
И вот уж я в Сохо, и вот присел, думая, что дальше пойду… Но часы сказали, что надвигается час пик, поэтому я решил, что в метро – и домой.
Простоял всю дорогу, однако в своем любимом метровагоне, – в том, что линии Б. Их, думаю, скоро начнут списывать. Поэтому рад любой возможности ими пользоваться.
А от метро к моему дому надо минут 15 ехать в переполненном 36-ом автобусе, глядя из окна на «до тошноты надоевшие места», по которым он едет. Обидно, что после всего хорошего полагается такой «десерт». А тут еще и пассажиры спорят. Видно, кто-то кого-то толкнул или наступил на ногу, и разговор уже вовсю перешел на «политический» лад!
Цитирую: «Ты – иммигрантка, а я – коренная, здесь родилась, в Бруклине! Понаехали тут, понимаешь!..»
Тут и я решил, шутки ради, вставить свои «5 копеек». Но вышло так, что вставил свое вступление в «высоковольтную розетку канализационной трубы». Стоило мне только сказать, что я тоже вырос в Бруклине, и хоть и родился не здесь, но очень люблю Бруклин, как в ответ послышалась грязная нецензурная брань:
– Знай свое долбанное («приличный» вариант) место!..
Словно нечистоты из лопающейся канализационной трубы, вырвались эти слова из помойного рта этой бруклинской грубиянки, которая использовала исторический факт своей принадлежности к Бруклину в качестве оправдания своего хамства.
Но я ведь тоже – не пальцем деланный… И я ей, конечно же, в отместку за эти слова всю дорогу основательно действовал на нервы. Благо, что, пожив даже хоть немного в Бруклине, этому сможет научиться каждый.
Это очень печальный факт, но именно поэтому и Бруклин, и Нью-Йорк считаются хоть и великими городами, но уж никак не образцами Америки. Обидно не столько от хамства, сколько оттого, что, в какие бы прекрасные американские уголки вы ни отправились, – все равно: в час пик и на электричке, по дороге домой, непременно столкнешься с «позором Америки».
После этого я в течение месяца, как мог, избегал и автобусов, и метро.
Ходил в основном пешком и вокруг дома, а иногда – совершал прогулки на авто в компании родителей. Еще, время от времени, ездил на загородные экскурсии.
Выпало мне жить в таком районе, где любая дальняя поездка и начинается, и заканчивается 36-ым автобусом. Это самый быстрый вариант. Можно еще скоростным, 44-ым, к другому метро проехать. Но этот 44-ый становится недоступен простым людям в то время, когда им пользуются школьники. Просто палец вставить некуда. Далее – в тот же Манхэттен, на метро. Но это уж куда менее удобный вариант.
А разок-другой заходишь в то же метро, в тот же самый любимый метровагон R40, знакомый с первых дней в Америке, и напротив тебя сидит элегантная белокурая дама. «А не ее ли я видел на сцене Карнеги-Холла пару лет назад?» – возникает вопрос. Но приходится сдерживать чувства. Здесь не принято заговаривать с незнакомыми людьми… И вдруг разговор сам собой прорывается, и оказывается, что – да, действительно, это она. И представляете, уважаемый читатель, – вокалистка с мировым именем, живущая в Нью-Йорке, не брезгует пользоваться нашим метро! А как же иначе она доберется…
Вернемся к началу рассказа и ко сну, в котором я и моя семья переселяемся.
Представил я, что переселимся на самом деле. И что это даст? Наверное, то, что некоторое время будем восторгаться культурно-духовно-развлекательными заведениями Манхэттена, о которых можно говорить часами. Там и музеи, и джаз-клубы, и необычные магазины, и многое другое. А надоест – так в 20 минутах вокзал. А оттуда – хоть в Вашингтон, хоть во Флориду поездом, хоть всю ночь в сидячем вагоне – если выдержим.
Допустим, насладимся всем этим. А дальше – куда? Снова – в родной и до боли знакомый Бруклин? В ставшую такой родной за почти 7 лет квартиру? Быть может, к тому времени «придворные» автобусы будут лучшего качества…
Вот под такие мысли в уме невольно звучит музыка, которая всегда у нас в машине играла в 1995-ом году. И сейчас мы ее слушаем, когда по русскому радио – совсем ерунда.
Музыка, под которую мы и по Бруклину, и по Манхэттену. Релаксационная, медитационная. В любой дорожной ситуации она тонизирует и успокаивает. Ко мне в дом она пришла на кассетах. Когда я увидел надпись «Музыка для релаксации», я поставил ее и, слушая все то, что считалось банальностью, пережил прекрасные чувства любви к родному городу, его улицам, почувствовал цену всего этого… И понял, что медитация медитацией, а надо ценить все, что имеешь.
Медитация – это и есть переселение, правда, мысленное. Медитация – это перемещение души из одного «измерения» в «иное». Иногда эти миры далеки, как Америка от Европы; как дом от работы; а иногда – и как Бруклин от Манхэттена. Поэтому оценить тихую и спокойную обстановку родных улиц Бруклина мне пришлось через мысленное переселение в Манхэттен… Потому что многое познается лишь в сравнении.
Например, в 2001-ом году я окончил Политехнический Университет, после чего безумно грустил о том, что «школы больше нет»… Потом были курсы. Курсы окончились – и снова в другой колледж, теперь уже за собственные деньги. И т. д., и т. п. А ровно через 5 лет после окончания Политеха, где я получил степень бакалавра, – наконец-то до меня дошло, что радоваться надо, а не искать, куда себя деть.
В который раз я понимаю, что надо быть счастливым всем тем, кто может существовать без работы!
Это я решил 19-го декабря 2006-го года. Правда, все же на профессиональные курсы я хочу ходить. В марте меня посетила бредовая мысль переучиться на финансиста. То- есть опять выбивать кучу бумаг о нужных курсах, опять ходить по офисам, и т. д. А дальше – что? Прийти домой и снова оценить домашний уют. И радоваться тому, что ты – компьютерщик.
Поэтому самое правильное – такие медитации себе устраивать мысленно. И всегда оставаться тем, кто ты есть. При этом раскладе любое переселение Туда и Обратно доставит только удовольствие.

Послесловие

В котором тоже, одна за другой, – медитации.
Этот рассказ окончания не имеет, так как каждый день что-то происходит, как значимое, так и не очень. Но давайте остановимся на сегодняшнем моменте (вернее, на его временном завершении, через девять месяцев после его написания).
За это время я много где побывал – и в Бруклине, и в Манхэттене, и в других местах. До сих пор некоторые уголки Бруклина, в которых и ноги моей не ступало ранее, не перестают меня удивлять. Например, есть такие места, где «шахматную доску улиц Бруклина» пересекает какой-либо «вызов из прошлого» – какая-нибудь Кривая дорога, построенная еще первыми голландскими поселенцами. Она, хоть и прервана десять раз, но все равно передает ощущение того, что это был кратчайший путь, скажем, от центра к побережью.
Красивейший Проспект-парк, уголок живой и девственной природы в центре Бруклина, стал мне знаком где-то после пятнадцати лет моего пребывания в Америке. Когда я там побывал, то понял, что Бруклин мне еще изучать и изучать – как внешний его вид, так и историю. И опять же в душе происходит мысленное переселение, скажем, из Монреаля, полюбившегося месяц назад, обратно, в Бруклин.
Да что там Монреаль! Даже погулявши по Манхэттену, мысленно рвешься на переселение, а понимая, насколько там все одно на другом – снова хочешь обратно, в свой такой домашний Бруклин. Медитация все это.
В декабре уже позапрошлого года я «торжественно клялся», что колледжа в моей жизни больше не будет. А вот и не так. В ноябре прошлого года, когда графомания меня уже полностью закрутила, подумалось: «Не доучился я в колледже…» Если бы я был послушнее, и не уходил бы год назад, то вот уже доводил бы себя до состояния второго диплома. Честное слово, эти мысли меня от головной боли избавили. Я таки пошел в колледж, и весь этот семестр, стиснув зубы, туда мотаюсь. Колледж, конечно, как всегда – в своем репертуаре: грузит мозги ерундой, на одну полезную мысль – вагон чепухи… По большому счету, только засоряет память бесполезной информацией.
То, что я почти каждый день езжу в метро, меня радует. Я всегда люблю посмотреть в окно, фотографируя или снимая на видео, чтобы потом друзьям показать. Но иногда и менять маршруты приходится, т. к. восприятие уже не выдерживает однообразия.
А в данный момент я, как в далеком детстве, рад даже возможности поболеть, чтобы оценить, насколько дома приятнее, чем в колледже, и какая это радость – медитация, то есть мысленное переселение из себя в себя.
В Bryant Park-е музыка играет. Я вспомнил, как 3-го января сего года, после длительного отсутствия в Манхэттене, решил туда податься. Посетил сначала агентство по трудоустройству (безрезультатно), а затем, безо всякой надежды, пошел на прогулку. И когда зашел в Bryant Park, то снова почувствовал себя туристом в собственном городе.
Гулял я по парку и, невзирая на собачий холод, фоткал все, что подмечал вокруг. А затем пошел на хваленое Шоу Модельной Железной дороги, которое проходило на вокзале Гранд Централ.
Банальностью мне все это казалось когда-то. Потому что тогда я пытался двигаться по маршруту дом-работа-дом, не замечая прелестей вокруг. Я и сейчас так двигаюсь, только вместо работы – колледж. А потом, еще через неделю-другую – интервью, и снова те же прекрасные чувства к Манхэттену. Как это божественно, что этот город мой! Вот и она, медитация.
Помнится мне вечер 17-го марта, когда я утром ездил в Манхэттен на интервью, а вечером – в колледж. Утром активно прогулялся по Манхэттену, открыл для себя кучу новых мест, и все равно – по касательной, так как силы все были потрачены на то, чтобы «вынуть себя из постели», для того, чтобы не опоздать на интервью. Тогда у меня было 3 интервью подряд, и все – в Манхэттене, и все – рано утром. И, приезжая домой после каждого, я понимал, что дома лучше (опять же – медитация).
Когда я вечером ехал домой на метро из того самого колледжа, то, глядя на станционные платформы, погруженные в сумерки бруклинского вечера, вспоминал, как летом 1991-го года мы приехали в Питер, на Витебский. Причем наш поезд, по техническим причинам, задержался на 5 часов. Когда меня вновь и вновь посещала мысль «хочу домой», то я всегда вспоминал, как уже за 5 минут до Витебского Вокзала (площадь Броневая, или Боровая) наш поезд очередной раз остановился, и мама сказала: «Ну, мы встречные поезда уже привыкли ждать сегодня, так что и эту электричку подождем».
Вот так вот, читатели, я иногда с нетерпением ожидаю возвращения домой после колледжа, чтобы лишний раз понять, что везде хорошо, а дома лучше.
А восточная половина Бруклина, та, что на Восток от Флэтбуш-Авеню, до сих пор неизвестна мне. Попадаю я туда крайне редко. Вот, например, 27-го января мы с мамой пошли в Форт Грин парк, на лекцию о трамваях Бруклина.
И вот, по пути, когда я проходил мимо школы Бруклин Тек и увидел на ее крыше огромную антенну, я вспомнил 1995-ый год, когда я там последний раз был. А также свои мечты работать не жалким клерком, а компьютерным инженером, радистом, и т. д. Тут же захотелось пойти к ним в клуб радиолюбителей (на любительскую радиостанцию), но не могу, так как время не позволяет.
А в колледже, поэкспериментировав с электронными схемами, я понял, что их наладка и настройка – это та еще нагрузка для мозга. Поэтому этим лучше только играться, а с целью заработка – заниматься чем-то незамысловатым.
Знания, которые я приобрел в колледже, что в одном, что в другом, – это культура. Это то, что «партии нужно». Иными словами – для собственного самоутверждения. Вот заканчиваешь колледж, получаешь диплом, и если удается устроиться на какую-то незамысловатую работу типа укладчика-комплектовщика в магазине компакт дисков, то просто на 7-ом небе от счастья. Вот и она, медитация. Надоела работа – идешь к врачу и оформляешь нетрудоспособность. И сидишь дома, как король. Вот и она, медитация. Становится скучно сидеть без дела? Тогда начинаешь бумажное моделирование транспорта, игры с график-дизайном, звукотехникой. Показываешь себя всему миру, чувствуешь себя сам перед собой великим пианистом, радистом или телеведущим, ожидая, когда гости придут. Они приходят – вот и она, медитация.
Так вот, друзья, почаще мечтайте и мысленно переселяйтесь, не покидая свои города и дома. И вы поймете, что это радость жизни. Говорю, исходя из собственного опыта, с самыми наилучшими пожеланиями.


Отправить новый комментарий

Содержимое этого поля хранится скрыто и не будет показываться публично.
  • Допустимые 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.
Больше информации о возможностях форматирования