T.co пара слов

Как все знают твиттер перешел на собственный сервис сокрашения ссылок T.co , воспользоваться которым извне - нельзя. Утверждается, что это было сделано, чтобы огородить всех от спама с коротких ссылках и фишинга. В целом, большинство, как мне кажется, продолжило выбирать bit.ly - как наиболее продвинутый и простой сервис сокращения ссылок. Однако, если присмотреться к реализации t.co, то можно увидеть существенное отличие в ответе сервера при обращении по короткому урлу. А именно, вместо страницы с редиректом, где на уровне HTTP был бы проставлен HttpStatusCode.MovedPermanently или HttpStatusCode.Moved, пользователю возвращается полноценная страница с HTML:
Copy Source | Copy HTML
  1. <noscript><META http-equiv="refresh" content="0;URL=http://redirect.link.to"></noscript><script>location.replace("http:\/\/redirect.link.to\/dnevnik")</script>
Очевидно, что это сделано, чтобы в случае обнаружения нехорошей ссылки у пользователей, которые уже переходили по ней, не сработал кэш. В другой стороны, чтобы распознать такой редирект тратится в браузере больше времени, так как приходится парсить HTML.Таким образом, основные минусы сокращателя ссылок от Твиттер - скорость и надажность, так как из-за отсутствия кэша на сервера t.co идет большая нагрузка и более вероятны технические проблемы выливающиеся в кратковременную недоступность. PS: Заметил, что многим не удается скачать популярное расширение для MSVS Web Essentials, так как требуется подписка на MSDN, в тоже время можно скачать прямой ссылке на Web Essentials 1.9 без залогинивания.

Метки:   Категории:Twitter


Пульс топика

Гугл выпускает "пусль для топиков", позволяя смотреть как распространялся тот или иной материал. Пожалуй это самое красивое отображение в виде графа с кружками.

Метки:   Категории:Google


WebRole as WorkerRole

В дополнение к предыдущему посту свежий сказ о том, как люди извращаются, помещая Task в WebRole, чтобы получить нормальный сервис работающий под Azure и заодно сэкономить ядро.

Метки:   Категории:microsoft


Agava VS Azure

По случаю того, что микрософт во всю начало проводить конференции и врать с больших экранов, что облачное Core намного лучше и дешевле простого VPS решил написать ниже небольшое сравнение реальной ситуации. Речь пойдет о 1 Extra Small Core в Azure и 1 VPS в Agava. Буду приводить преимущества.

Преимущества Agava
1) Цена 400р в месяц против 0,05у.е., плюс как говорил softline это не баксы как написано на сайте микрософта, а евро, кроме того они еще добавляют НДС. В общем примерно 1500р за простой ExtraSmallCore, то есть в 3 раза дороже.
2) Диск у агавы получается 25Гб (10Гб расширяемых, просто все установки по умолчанию идут с 15Гб видимых), против 20Гб у Азура.
3) Трафик у Агавы бесплатен, но ограничен 10МБ, а в Азуре исходящей трафик платный, а про ограничения ни слова.
4) Производительность ввода-вывода в Азуре написана, что "низкая", то есть низко-приоритетный трафик. У Агава известно, что это 2МБ в сек. доступа к диску.
5) Для азура придется переписывать весь много кода, чтобы соответствовать требованиям. Кроме того для Worker Role нет возможности просто вести много потоков, По сути 1 Worker - 1 поток, поэтому многие уже начинают придумывать извращения, типа SharedTimer и само-писаного пула потоков.
6) В WorkerRole Нельзя встроить сложные лицензионный комовские компоненты.
7) VPS может выполнять еще кучу задач, таких как файловый архив или DNS Server.

Преимущества Azure
1) простота администрирования по удалению, добавлению новых машин и .т.п.
2) в азуре не надо обновлять виндовс и перезагружать машину раз в месяц.
3) гарантирует 1 Ггц вместо 0,5Ггц у агавы.
4) Больше оперативной памяти - 1Гб вместо 0,5Гб, также часть памяти съедает сама система.

Вывод: делайте сами, очевидно, что для некоторых задач лучше азур, чтобы избавится от вопросов администрирования. мне же больше нравятся возможности балансировки нагрузки на несколько машин для крупных проектов.

Метки:   Категории:Analytics | microsoft


Медведев и Фейсбук

Вчера наш президент обмолвился, что пора бы ему и фейсбук вести. В целом ничего удивительного, коли туда можно очень просто настроить копирование твитов. Удивительно то, что со вчера на сегодня произошло переименование страницы Медведева с "http://www.facebook.com/president.dmitry.medvedev" на "http://www.facebook.com/dmitry.medvedev", то есть приставка ПРЕЗИДЕНТ была убрана. Возможные причины такого переименования.
1) Давный-давно имя dmitry.medvedev было занято, поэтому создали с приставкой "президент".
2) Если учесть, что переименоваться можно только один раз, то это был уже второй раз и скорее всего он проходил в согласовании с администрацией фейсбука. А значит аккаунт все-таки настоящий.
3) Есть неподтвержденная информация от третьих источников, что в начале октября в Москву прилетал Цукерберг.

Следствие у такого переименования одно - еще одно подтверждение, что президентство ему в 2012 году не светит.

И в заключение напомню, что посмотреть рейтинг страниц фейсбука можно на т30п. Там президент занимает почетное 6 место вреди всех страниц, зато среди персон - первое. Самый частый вопрос - спрашивают, а где просто рейтинг людей на фейсбуке, а не страниц. Отвечаю, что и Марку и все фейсбуку глубоко пофиг на "просто людей", фейсбук - прежде всего соц.сеть брендов. Поэтому если вы что-то представляете и ваша страничка для вас что-то стоит, и вы готовы вкладываться в развитие странички, то вы ОБЯЗАНЫ переключить статус страницы в "Public Figure" или "Bisness Person" и т.п. Тем самым попадаете в рейтинг с такими же знаменитостями как и вы.

Метки:   Категории:Analytics | Facebook


Studay @ Digital October

Немного Видео с недавнего мероприятия Микрософта. К слову сказать на следующий день тут же выспупал медведев, но он был не так зажигателен как эти барабанщики


И собственно сами участники мероприятия, которые в основном играли в XBox.




Метки:   Категории:microsoft


google plus search

Гугл анонсировал новый real-time search полностью скопированный с твиттера по функцилналу.

Для тех кро не верит информации, что гугл скопирует брендовые страницы с фейсбука, о чем я писал в предыдущем посте, то напомню, что информацию я почерпнул из личного разговора с AdewaleOshineye - представителем разработчиков google plus/

Метки:   Категории:Google


gdd2011

Небольшое видео мероприятия гугла ниже:

Из интересного расказали про goole plus, что скоро и там появятся страницы брендов. Также, что у них плотная интеграция с Chrome, поэтому если вы пользуетесь хромом, то вся информация о вас уже есть в Google plus хотите вы этого или нет.
На секции венчурных капиталистов "русские американцы" поделились, что основной минус ведения бизнеса в России - бюрократия, а основной плюс - можно легко людей увольнять.

Метки:   Категории:Google


bitl.y to T.CO

Сегодня Твиттер анонсировал, что скоро перейдет с Bit.ly на купленную ранее t.co, то есть 2 символа выигрыш. Смертью это Bitly не грозит, так как популярнейший сервис используется многими сайтами в том числе и под "выделенными" своими именами. Однако, видимо мне придется в т30п перейти тоже на t.co , чтобы более точно отслеживать количество кликов по топовому посту с учетом реакции микроблогов.
ЗЫ: следующим постом расскажу про google developers day 2011 и про google plus.

Метки:   Категории:Twitter


Аналитика по соц.сетям 2011

Свежий аналитический обзор за 2011 в PDF пользования соц.сетями в Америке.
Из интересного
1) Почти вся молодежь - 98% - сидит в соцсетях, то есть дальнейшего взрывного роста уже можно не ожидать?
2) Половина - сидят в фейсбуке.
3) При этом проводят в фейсбуке и твиттере заметно больше времени чем в GooglePlus. (непонятна методика подсчета, ибо в том же фейсбуке много перегрузок страниц, а в гугле и твиттере преобладают подгрузки через AJAX)
4) При этом из соц.сети 16%(в лидерах) трафика - это переход в поисковики. То есть люди имеют не все, что хотят в соц.сетях. При этом только 4% - переходы на медиа и новости, и 3% - на телевизионные каналы. Тут выводов не сделаешь.

Метки:   Категории:Analytics | Facebook


Azure news

Облачные вычисления микрософта продолжают идти в ногу со временем
Уже доступен AzureToolkit for Windows 8
Для стартапов сделана программа бесплатного Азура на год с экономией аж до 3500у.е., но не спешим радоваться, так как это как всегда не для России, а во вторых требуется оформление BizSpark и лицензионного MSVS+MSDN , что и есть дуриловом на примерно такие же деньги


Метки:   Категории:microsoft | news


bb AdSense

Выяснилась причина, по которой гугл втихаря крутил у меня в блоге рекламу 3 месяца, а показы незасчитывал. А вину этому стал пост http://t30p.livejournal.com/14701.html. В правилах гугла написано, что блокируются сайты, которые содержат либо 1) непристойные или провокационные изображения 2) материалы, содержащие грубую или ненормативную лексику, в том числе эротические рассказы 3) сексуальные советы или рекомендации 4) эротические игрушки и продукция и т.д. А именно этим наполнена блогосфера, особенно по пятницам. В общем 100 у.е. в год не стоят того, чтобы посетители видели объявления. Все, отключаю AdSense в блогах, а жаль, ведь планировал окупить платный аккаунт за год.

UPDATE: После публикации этой записи и отключения рекламы в AdSense, СУП тут же перевел мой блог t30p@lj в режим read-only за публикацию полгода назад поста про навального. Собственно текст разбирательства с конфликтной комиссией. И копия самого поста про навального.

Метки:   Категории:Blogs | Google


BE Themes contest

Разработчики BlogEngine заинтересованы в улучшении дизайна для BE и проводят конкурс на лучшую тему оформления для БЕ. В призах Xbox 360, да WP7. Если у кого есть желание поучавствовать, то пишите мне, подкину идей и просто денег на создание тем оформления блогов. А пока с верстальщиками шаблонов одни проблемы. Как только слышат ASP.Net, то сразу пропадают.

Метки:   


Amazon Browser

Амазон изобрел Opera Turbo и продвигает под брендом Silk. Перво-предшественником всего этого является простой RDP(удаленный десктоп) на VPS(виртуальный выделенный сервер) с мобильного телефона. И уже на сервере открывается браузер с сайтом. Так как амазон крупнейший поставщик виртуальных EC2 (считай тоже VPS), то он решил найти им применение через мобильный интернет.

Метки:   Категории:news


asp.net 4.5

Уже много хорошего было сказано про следующую версию asp.net , которая выйдет вместе с windows server 8.
Для тех кто пропустил. Вот видео про минимизацию и заметное ускорение открытия страниц. И вот еще общая концепция улучшений. Можно видеть, что большой упор сделан на асинхронные операции. В частности по получению ответов из WebResponse. Сейчас же приходится использовать много второстепенного кода для реализации асинхронного сичтывания. Ниже приведу фрагмент, который используется для асинхронной обработки ответов получаемых из ЖЖ. После нескольких ДДОС атак они стали параноидальными и включили в ответах chuncked, чтобы контролировать загруженность канала, поэтому синхронное считывание очень часто проваливается. Выход из этой проблемы реализуется следующим классом, который надеюсь станет неактуальным в 4.5:
Copy Source | Copy HTML
  1. #region Ассинхронное чтение из документации
  2.     public class RequestState
  3.     {
  4.         // This class stores the State of the request.
  5.         const int BUFFER_SIZE = 1024 * 256;
  6.         public StringBuilder requestData;
  7.         public byte[] BufferRead;
  8.         public HttpWebRequest request;
  9.         public HttpWebResponse response;
  10.         public Stream streamResponse;
  11.         public Encoding encoding;
  12.         public FileStream FileToWrite;
  13.         public RequestState()
  14.         {
  15.             BufferRead = new byte[BUFFER_SIZE];
  16.             requestData = new StringBuilder("");
  17.             request = null;
  18.             streamResponse = null;
  19.             encoding = Encoding.UTF8;
  20.             FileToWrite = null;
  21.         }
  22.     }
  23.  
  24.     class HttpWebRequest_BeginGetResponse
  25.     {
  26.         public ManualResetEvent allDone;
  27.         const int BUFFER_SIZE = 1024 * 256;
  28.         const int DefaultTimeout = 2 * 60 * 1000; // 2 minutes timeout
  29.  
  30.         // Abort the request if the timer fires.
  31.         private static void TimeoutCallback(object state, bool timedOut)
  32.         {
  33.             if (timedOut)
  34.             {
  35.                 HttpWebRequest request = state as HttpWebRequest;
  36.                 if (request != null)
  37.                 {
  38.                     request.Abort();
  39.                 }
  40.             }
  41.         }
  42.  
  43.         public RequestState ReadAsyncWebResp(HttpWebRequest myHttpWebRequest, string filepath)
  44.         {
  45.             // Create an instance of the RequestState and assign the previous myHttpWebRequest
  46.             // object to its request field.  
  47.             RequestState myRequestState = new RequestState();
  48.             allDone = new ManualResetEvent(false);
  49.             myRequestState.request = myHttpWebRequest;
  50.             //Open a file to write if needed
  51.             if (!String.IsNullOrEmpty(filepath))
  52.             {
  53.                 myRequestState.FileToWrite = File.Open(filepath, FileMode.OpenOrCreate);
  54.             }
  55.  
  56.             // Start the asynchronous request.
  57.             IAsyncResult result =
  58.               myHttpWebRequest.BeginGetResponse(RespCallback, myRequestState);
  59.  
  60.             // this line implements the timeout, if there is a timeout, the callback fires and the request becomes aborted
  61.             ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, TimeoutCallback, myHttpWebRequest, DefaultTimeout, true);
  62.  
  63.             // The response came in the allowed time. The work processing will happen in the 
  64.             // callback function.
  65.             allDone.WaitOne();
  66.  
  67.             // Release the HttpWebResponse resource.
  68.             myRequestState.response.Close();
  69.             if (myRequestState.FileToWrite != null)
  70.             {
  71.                 myRequestState.FileToWrite.Close();
  72.             }
  73.             allDone.Close();
  74.             return myRequestState;
  75.         }
  76.  
  77.         private void RespCallback(IAsyncResult asynchronousResult)
  78.         {
  79.             try
  80.             {
  81.                 // State of request is asynchronous.
  82.                 RequestState myRequestState = (RequestState)asynchronousResult.AsyncState;
  83.                 HttpWebRequest myHttpWebRequest = myRequestState.request;
  84.                 myRequestState.response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(asynchronousResult);
  85.  
  86.                 // Read the response into a Stream object.
  87.                 Stream responseStream = myRequestState.response.GetResponseStream();
  88.                 myRequestState.streamResponse = responseStream;
  89.  
  90.                 // Begin the Reading of the contents of the HTML page and print it to the console.
  91.                 IAsyncResult asynchronousInputRead = responseStream.BeginRead(myRequestState.BufferRead,  0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
  92.                 return;
  93.             }
  94.             catch (WebException e)
  95.             {
  96.             }
  97.             allDone.Set();
  98.         }
  99.         private void ReadCallBack(IAsyncResult asyncResult)
  100.         {
  101.             try
  102.             {
  103.  
  104.                 RequestState myRequestState = (RequestState)asyncResult.AsyncState;
  105.                 Stream responseStream = myRequestState.streamResponse;
  106.                 int read = responseStream.EndRead(asyncResult);
  107.                 // Read the HTML page and then print it to the console.
  108.                 if (read >  0)
  109.                 {
  110.                     if (myRequestState.FileToWrite != null)
  111.                     {
  112.                         myRequestState.FileToWrite.Write(myRequestState.BufferRead,  0, read);
  113.                     }
  114.                     myRequestState.requestData.Append(myRequestState.encoding.GetString(myRequestState.BufferRead,  0, read));
  115.                     IAsyncResult asynchronousResult = responseStream.BeginRead(myRequestState.BufferRead,  0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
  116.                     return;
  117.                 }
  118.                 else
  119.                 {
  120.                     responseStream.Close();
  121.                 }
  122.  
  123.             }
  124.             catch (WebException e)
  125.             {
  126.             }
  127.             catch (IOException eio)
  128.             {
  129.             }
  130.             //пофиг на ошибки. что скачалось, то скачалось
  131.             allDone.Set();
  132.         }
  133.     }
  134.     #endregion

Метки:   Категории:Code


WinAzure and PnP2011

На последней конференции микрософта PnP2011 пожалуй самым интересным было EntLib и WASABi для динамического масштабирования и вообще все что может потребоваться для логирования. Пока не пользовался, но выглядит внушительно.
В тему Windows Azure - выяснилось что есть важный параметр upgradeDomainCount в CSDEF, позволяющий поочередно обновлять инстансы, не пользуясь VIP опцией.
Другой важный параметр - <LocalStorage cleanOnRoleRecycle="true" sizeInMB="15000" /> - позволяющий выделить произольную папку для записи данных. Открытием стало, что пользоваться в asp.net, портированной в Azure папкой App_Data более нельзя, так как любая Role в Windows Azure имеет ограничение на 100Мб и это ограничение никак не поменять. Получить же путь к созданной папке, можно следующим образом:
Copy Source | Copy HTML
  1. if (RoleEnvironment.IsAvailable)
  2. {
  3.     return RoleEnvironment.GetLocalResource("MyStorage").RootPath;
  4. }

Метки:   Категории:microsoft


Like LJ?

По многочисленным просьбам убираю из блога ЖЖ (topbloger) в начале поста кнопки лайка (lj-like). Во-первых, ЖЖ не смогла за 2 месяца починить RSS выдачу, чтобы дурацкое слово Tweet не появлялося. Во-вторых, размещение рекламных блоков AdSense в блоге провалилось и мне рельно безразницы в денежном отношении расшаривают ТОПы или нет и растет посещаемость или нет. Проблема рекламных блоков AdSense в том, как я упомянал ранее, что после включения их в интерфейсе ЖЖ они успешно прокрутились 3 месяца, однако, ничего не было отражено в аккаунте AdSense по показам. Включение-выключение не помогло. Техподдержка Ж ответила, что ничем помочь не может. Ждем ответа гугла.

Но самая главная причина - это то, что эти дурацкие кнопки лайков действительно тормозят загрузку страницы. Ниже пример для кнопки гугла, которая добавляет 3 секунды. Прежде всего из-за того, что лезет к себе по httpS , но несмотря на все оптимизации обещанные гуглом, защищенное соединение нельзя закэшировать и оно заметно медленнее простого HTTP.

Для фейсбука проблема в том, что когда кнопок много на страницу, то все обращения идут по одному IP адресу , а браузер как мы знаем имеет ограничение на число парраллельных обращений к одному адресу. Что тоже дает потерю на 3 секунды, если у нас 10 кнопок рекомендовать на главной странице.


Метки:   Категории:topbot | Google | Facebook | t30p


f8 conference

Прошла конференция f8, где мы узнали, что профили переделали, добавили кучу новых кнопок для приложений и что теперь вся активность в приложениях будет появляться в ленте активностей ваших друзей. Концентрируются на 4х типах приложений - музыка, видео, новости, игры.
Некоторые моменты, которые стоит отметить:
1) Фейсбук еще плотнее влезает в данные, которые есть у других интернет бизнесов. Когда это была кнопка like - это казалось нормальным, а теперь бизнесы будут выгружать все ленту событий по пользователю.
2) CTO facebook'a сказал, что для приложений будет также считаться GraphRank по отношению к каждому пользователю. Этот ранк нужен , чтобы определять как часто информация этого приложения будет появляться в списке активностей твоих друзей. Иными словами, теперь надо будет ботами не только френдить друзей чела, но и использовать такие же приложения, что и разводимый аккаунт.
3) В списке партнеров фейсбука, показанных Марком была показана афиша.ру - видимо самый социальный сайт по фильмам в СНГ.

Метки:   Категории:Facebook | news


Видео про Yac2011

Парочка видео из Яндекса. Позже напишу про PnP.


Робот на YAC2011 from Flashr on Vimeo.


Метки:   


Про YAC2011

Вторая конференция яндекса несколько продвинулась по сравнению с прошлым годом. Достаточно удобная регистрация и печать беджиков при помощи QRCode , можно было подносить просто телефон с изображением кода. Далее на конференцию пришла рекламная составляющая , в холле рекламировался HTC, что вызывало больший ажиотаж, нежели многие секции. Также в холе ездил робот, что очень соответствовало технической конференции. Розеток хватало, даже был проводной интернет.

Единственное, что интересное, так это ЯндексБлоги. Удалось узнать, что последнее время они решают технические вопросы связанные с выросшей нагрузкой, поэтому и не выкладывают новых фишек. И видимо до нового года ничего не будет. Сейчас яндекс индексирует около 7 млн. постов в блогах в сутки, из них около 80% - это микроблоги на mail.ru, а еще 70% оставшегося - спам.

Метки:   Категории:Blogs | Yandex


Кто я?

Программист. Я слежу за блогосферой и знаю, как будет развиваться интернет. Когда у меня есть время я даже прилагаю для этого усилия. Подробнее

Последние комментарии

Не отображать

Topbot at FeedsBurner

Мои Твиты

Twitter июня 25, 17:55
@AnMax38 @history_RF Коломне от силы 270 лет, как и другим российским городам.

Twitter июня 22, 12:28
Суперлайки в Перископе http://dlvr.it/PPDsML

Twitter июня 21, 21:13
Что такое любовь? Песнь льда и пламени http://dlvr.it/PP4nxv https://twitter.com/f1ashr/status/877635527108722689/photo/1

Twitter июня 21, 09:57
Найдено применение для дополненной реальности http://dlvr.it/PNxLxw https://twitter.com/f1ashr/status/877465389294247936/photo/1

Twitter июня 21, 01:59
Periscope VIP что это? http://dlvr.it/PNsDcb https://twitter.com/f1ashr/status/877345106982035457/photo/1

Twitter июня 20, 22:13
Итоги 2016 года в Живом Журнале http://dlvr.it/PNqHw1 https://twitter.com/f1ashr/status/877288232597168128/photo/1

Twitter июня 20, 20:36
Гравитация. Сила тяжести. (Теория общего знания, часть 17) http://dlvr.it/PNpKGs https://twitter.com/f1ashr/status/877263840982913025/photo/1

Twitter июня 20, 20:36
Идеальное решение для Курильских островов http://dlvr.it/PNpKHy

Twitter июня 20, 20:36
Изменения в API Facebook / Youtube / Instagram http://dlvr.it/PNpKD4 https://twitter.com/f1ashr/status/877263832963399680/photo/1

Twitter июня 20, 20:36
Неинформативное бесполезное содержание от Google http://dlvr.it/PNpK5L https://twitter.com/f1ashr/status/877263822372847616/photo/1

Twitter июня 19, 18:29
Правила обрезания плодовых деревьев http://dlvr.it/PNVtKx https://twitter.com/f1ashr/status/876869473524789248/photo/1

Twitter июня 19, 11:51
Мобильное приложение t30p убрано из AppStore http://dlvr.it/PNQKMg

Twitter июня 9, 09:56
CDN for HTTPS на Azure http://dlvr.it/PKyPl4

Twitter июня 8, 09:12
Поиск причины популярности спиннеров http://dlvr.it/PKgm7x https://twitter.com/f1ashr/status/872743030532354048/photo/1

Twitter июня 7, 09:36
Beep-Beep Im a Sheep (go crazy now) http://dlvr.it/PKPk5M https://twitter.com/f1ashr/status/872386692468101120/photo/1

Twitter июня 7, 07:37
Где россияне праздновали новый 2017 год http://dlvr.it/PKNbfk https://twitter.com/f1ashr/status/872356936511098885/photo/1

Twitter июня 7, 04:59
7 лет аккаунту в твиттере http://dlvr.it/PKMDFt

Twitter июня 7, 01:49
Теневой бизнес ГИБДД http://dlvr.it/PKKlKx https://twitter.com/f1ashr/status/872269148281159680/photo/1

Twitter июня 6, 18:19
Трансляции Одноклассников (http://Ok.ru/live) добавлены в t30p http://dlvr.it/PKFBJH https://twitter.com/f1ashr/status/872156036446027776/photo/1

Twitter июня 6, 17:15
О смене дизайна Вконтакте http://dlvr.it/PKDQb5

Мой твиттер

Копирайт

Все мысли, высказанные в блоге, являются моим мнением и за это мнение меня никто не забанит! Кроме того, никто не имеет право копировать материалы блога без использования ctrl+C/V!

© Copyright 2008