Сам собі RSS-рідер, HTML, XML, DHTML, Інтернет-технології, статті

Одного разу, в середині 5-го курсу, попросила мене одногрупниця допомогти їй з лабами по C #, так як його вона тільки вивчала. Дізнавшись завдання – “написати RSS рідер” і, оцінивши ситуацію (кінець семестру), я вирішив їй допомогти, так як RSS-рідер потрібен був самому.


Трохи теорії


RSS – це формат передачі веб-контенту. Назва технології – акронім “Really Simple Syndication”, тобто, “по-справжньому проста передача інформації”.
RSS – це діалект XML. Всі файли RSS зобов’язані відповідати специфікації XML1.0, Опублікованій на веб-сайті консорціуму WWW (W3C).
На вищому рівні документ RSS являє собою елемент з обов’язковим атрибутом version, що вказує версію RSS (до речі, я свій додаток робив спираючись на RSS 2.0). Дочірній елемент – Один елемент , який включає інформацію про канал (метадані) і його вміст.
Приклад файла RSS 2.0 виглядає так:


<?xml version=”1.0″?>
<rss version=”2.0″>
    <channel>
       <title>Liftoff News</title>
       <link>http://liftoff.msfc.nasa.gov/</link>
       <description>Liftoff to Space Exploration.</description>
         <item>
          <title>Star City</title>
          <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>
          <description>
             How do Americans get ready to work with Russians aboard the
             International Space Station? They take a crash course in culture, language
             and protocol at Russia`s Star City.
          </description>
          <pubDate>Tue, 03 Jun 2003 09:39:21 GMT</pubDate>
         </item>
         <item>
          <title>Space Exploration</title>
          <link>http://liftoff.msfc.nasa.gov/</link>
          <description>
             Sky watchers in Europe, Asia, and parts of Alaska and Canada
             will experience a partial eclipse of the Sun on Saturday, May 31st.
          </description>
          <pubDate>Fri, 30 May 2003 11:06:42 GMT</pubDate>
         </item>
    </channel>
</rss>

Досить простий файл. Що ж він нам надає? По-перше, канал (Channel, він же Feed) і різну інформацію про нього – заголовок, посилання на офіційний сайт, опис каналу і т.д.). По-друге, список статей / новин / записів (item) називайте як хочете, а так само властивості цих записів: заголовок, посилання, опис, дата публікації. Насправді властивостей, як каналу, так і записи може бути набагато більше. Всі вони наведені в специфікації rss 2.0. Її переклад, зроблений Олексієм Бешенова, Можна знайти тут. Останню версію специфікації можна знайти тут.
Для роботи з інформацією наданої rss нам знадобиться 3 класу: клас для зберігання каналу, назвемо його RssFeed; клас для зберігання списку записів – RssItems; клас для зберігання запису – RssItem.


Створення форми


Відкриваємо Microsoft Visual Studio 2005 (лінуксойди відкривають MonoDevelop) і створюємо новий додаток. Назвемо його RssReader. Інтерфейс бедет найпростіший.

Перший і основний контрол, який потрібно розмістити на формі – це TableLayoutPanel, розтягнутий на всю форму (Dock = Fill). Це дуже зручний контрол, він являє собою таблицю, в кожному осередку якої можна розмістити будь-якої елемент інтерфейсу (елемент може займати кілька стовпців і / або рядків таблиці одночасно). Розміри стовпців можуть бути фіксованими або зазначатися у відсотках від розміру таблиці. Це дуже зручно при зміні розмірів таблиці.
Призначення інших елементів, думаю, зрозуміло: TextBox – введення адреси каналу; Button – кнопка для поновлення фіда; в ListView – виводиться список записів; в WebBrowser – виводиться зміст запису.
Тепер почнемо розробку самого ридера. Почнемо ми її з низів, а саме з класу RssItem, потім створимо клас RssItems, останнім буде написаний RssFeed.


RssItem


Цей клас надає нам інформацію про запис. Згідно специфікації rss 2.0 “всі елементи є необов’язковими, однак, по крайней мере, або <description> повинен існувати “. <br />Додамо до проекту новий клас, назвемо його RssItem. В результаті отримуємо наступне:</P><br /> <BLOCKQUOTE>using System;<br />using System.Collections.Generic;<br />using System.Text;<br /> <P>namespace RssReader <br />{<br />   class RssItem<br />   {<br />   }<br />}</P></BLOCKQUOTE><br /> <P>Наш клас буде зберігати мінімальну інформацію про запис: title (заголовок), link (посилання на повний текст) і description (короткий огляд повідомлення). Додамо до класу 3 публічних поля, для зберігання цієї інформації:</P><br /> <BLOCKQUOTE>class RssItem<br /> {<br />public String title; / / заголовок запису<br />public String link; / / посилання на повний текст<br />public String description ;/ / опис записи<br /> }</BLOCKQUOTE><br /> <P>Тепер додамо конструктор, який буде заповнювати ці властивості. На вхід конструктору повинна передаватися конкретна запис з rss. Так як rss це всього лише діалект XML, то передаємо ми на вхід конструктору гілка <item>. Так. Далі конструктор циклічно перебирає кожен тег знаходиться всередині отриманої записи і, зустрічаючи потрібний тег, записувати з нього інформацію у відповідне властивість класу. Реалізовано це може бути так:</P><br /> <BLOCKQUOTE>/// <br />/ / / Конструктор для заповнення записи <br />/// <br />/ / / Xml-тег для читання <br />public RssItem(XmlNode ItemTag) <br />{ <br />/ / Переглядаємо всі теги записи <br />  foreach (XmlNode xmlTag in ItemTag.ChildNodes) <br />  { <br />/ / Перевіряємо ім’я тега, якщо відповідає одному з укаазних, <br />/ / То у відповідне властивість об’єкта записується вміст тега <br />    switch (xmlTag.Name) <br />    {  <br />     case “title”: <br />        { <br />          this.Title = xmlTag.InnerText; <br />          break;<br />        }  <br />     case “description”: <br />        {  <br />          this.Description = xmlTag.InnerText; <br />          break; <br />        } <br />      case “link”: <br />        { <br />          this.Link = xmlTag.InnerText; <br />          break; <br />        } <br />    } <br />  } <br />}</BLOCKQUOTE><br /> <P>Так, до речі, так як ми працюємо з XmlNode, потрібно включити відповідну збірку в using секцію:</P><br /> <BLOCKQUOTE>using System.Xml;</BLOCKQUOTE><br /> <H2>RssItems</H2><br /> <P>Цей клас у нас є список всіх записів фіда. Його будемо реалізовувати посредствам генериків, а саме мого улюбленого генерик класу List. А подобається мені цей генерик тим, що надає дуже зручні методи роботи з масивами даних.<br />Додамо до проекту новий клас, і назвемо його RssItems. Отримуємо наступне:</P><br /> <BLOCKQUOTE>using System; <br />using System.Collections.Generic; <br />using System.Text; <br />namespace RssReader <br />{ <br />  class RssItems <br />  { <br />  } <br />}</BLOCKQUOTE><br /> <P>Далі успадковуємо RssItems від List, замість T вказавши той тип, об’єкти якого будуть зберігатися в списку. Заодно перевизначивши метод Contains, для визначення існування запису в списку по її заголовку.</P><br /> <BLOCKQUOTE>/// <br />/ / / Перевірка існування вказаного елемента в списку <br />/// <br />/ / / Об’єкт для порівняння <br />/ / / True, якщо об’єкт в списку є, інакше false <br />new public bool Contains(RssItem Item) <br />{ <br />  foreach (RssItem itemForCheck in this) <br />  { <br />/ / Порівнюємо заголовки записів <br />    if (Item.Title == itemForCheck.Title) <br />    { <br />/ / Знайшли збіг. повертаємо істину <br />      return true; <br />    } <br />  } <br />/ / Збігів не знайдено. повертаємо лож <br />  return false; <br />}</BLOCKQUOTE><br /> <P>Так само було б не погано мати можливість поулчіть цікавить нас запис зі списку використовуючи її заголовок. Для цього напишемо ще один метод, подібний методу Contains:</P><br /> <BLOCKQUOTE>/// <br />/ / / Отримати запис зі списку, за її заголовку <br />/// <br />/ / / Тема записи <br />/ / / Якщо запіь існує, то вона возвнащается, інакше повертається null <br />public RssItem GetItem(String Title) <br />{   foreach (RssItem itemForCheck in this) <br />  { <br />/ / Порівнюємо заголовок записів із запитом <br />    if (Item.Title == Title) <br />    { <br />/ / Знайшли збіг. повертаємо знайдену запис <br />      return itemForCheck; <br />    } <br />  } <br />/ / Збігів не знайдено. <br />  return null; <br />}</BLOCKQUOTE><br /> <H2>RssFeed</H2><br /> <P>Ось і дісталися до основного класу нашого рідера. Цей клас буде зберігати інформацію про канал. Згідно специфікації rss 2.0 до обов’язкових елементів каналу відносяться: <title> – назва каналу, по якому люди будуть посилатися на сервіс; – URL веб-сайту, пов’язаного з каналом; <description> – фраза або пропозиція для опису каналу. <br />Знову додаємо новий клас до проекту і називаємо його RssFeed.</P><br /> <BLOCKQUOTE>using System; <br />using System.Collections.Generic; <br />using System.Text;<br /> <P>namespace RssReader <br />{ <br />    class RssFeed <br />    { <br />    }<br />}</P></BLOCKQUOTE><br /> <P>Так як всі вищеперелічені свойсвта каналу обов’язкові, то нам необхідно додати їх і в наш клас. Так само ми додаємо властивість типу RssItems, для зберігання списку записів каналу:</P><br /> <BLOCKQUOTE>class RssFeed <br />{ <br />public String Title; / / заголовок каналу <br />public String Description; / / опис Канаан <br />public String Link; / / посилання на пов’язаний з каналом веб-сайт <br />public RssItems Items; / / список записів каналу <br />}</BLOCKQUOTE><br /> <P>Все що залишилося зробити тепер, це написати конструктор класу, який буде отримувати, як параметр, посилання на rss канал, і, якщо rss там дійсно існує, заповнювати властивості створюваного об’єкта даними з rss (сподіваюся за кодом питань не виникне, я постарався його детально прокоментувати):</P><br /> <BLOCKQUOTE>/// <br />/ / / Конструктор для заповнення даних каналу <br />/// <br />/ / / Адреса каналу <br />public RssFeed(String Url) <br />{ <br />/ / Ініціалізували список записів <br />  Items = new RssItems(); <br />/ / Створюємо рідер для читання Rss з вказаного адреси <br />  XmlTextReader xmlTextReader = New XmlTextReader(Url); <br />/ / Створюємо новий xml документ, для запису в нього оплученого RSS <br />  XmlDocument xmlDoc = New XmlDocument(); <br />  try <br />  { <br />/ / Завантажуємо RSS в документ за допомогою рідера <br />    xmlDoc.Load(xmlTextReader); <br />/ / Закриваємо рідер за непотрібністю <br />    xmlTextReader.Close(); <br />/ / Так як вся інформація про RSS-ФІДЕ записана між тегів,<br />/ / Вантажимо отримуємо цю гілку. <br />    XmlNode channelXmlNode = xmlDoc.GetElementsByTagName(“channel”)[0]; <br />/ / Якщо гілка існує, то починаємо заоплнять властивості об’єкта<br />/ / Даними з гілки <br />    if (channelXmlNode != null) <br />    { <br />/ / Перебираємо всіх нащадків тега <br />      foreach (XmlNode channelNode in channelXmlNode.ChildNodes) <br />      { <br />/ / Якщо ім’я тега-нащадка з цікавлять нас, то записуємо його дані <br />/ / В певний совйства об’єкта <br />        switch (channelNode.Name) <br />        { <br />          case “title”: <br />            { <br />              Title = channelNode.InnerText; <br />              break; <br />            } <br />          case “description”: <br />            { <br />              Description = channelNode.InnerText; <br />              break; <br />            } <br />          case “link”: <br />            { <br />              Link = channelNode.InnerText; <br />              break; <br />            } <br />case “item”: / / якщо ім’я перевіряється тега одно item, то <br />            { <br />/ / Створюємо з цього тега новий об’єкт типу запис <br />              RssItem channelItem = new RssItem (channelNode); <br />/ / І додаємо його до списку записів каналу <br />              Items.Add(channelItem); <br />              break; <br />            } <br />        } <br />      } <br />    } <br />else / / якщо в отриманому файлі тега не знайдено, то викидаємо виключення <br />    { <br />throw New Exception (“Помилка в XML. Опис каналу не знайдено!”); <br />    } <br />  } <br />/ / Якщо url каналу вказівку не вірно то викидаємо виключення про недоступність джерела<br />  catch (System.Net.WebException ex) <br />  { <br />    if (ex.Status == System.Net.WebExceptionStatus.NameResolutionFailure) <br />throw new Exception (“Неможливо з’єднатися з вказаними джерелом.<br /> ” + Url); <br />    else throw ex; <br />  } <br />/ / Якщо в якості адреси RSS був вказаний локальний шляху, який ще й не існує, <br />/ / То викидаємо відповідне виключення <br />  catch (System.IO.FileNotFoundException) <br />  { <br />throw New Exception (“Файл” + Url + “не знайдено!”); <br />  } <br />/ / Ну і на останок, ловимо всі інші винятки, і передаємо їх далі, як є <br />  catch (Exception ex) <br />  { <br />    throw ex; <br />  } <br />  finally <br />  { <br />/ / Закриваємо рідер <br />    xmlTextReader.Close(); <br />  } <br />}</BLOCKQUOTE><br /> <H2>Фінальна стадія</H2><br /> <P>Тепер, все що залишилося зробити, це написати код обробників подій натискання кнопки “оновити” і вибору елемента в ListView, а так само додати глобальну змінну CurrentFeed, в якій буде зберігатися завантажений канал:</P><br /> <BLOCKQUOTE>/ / Глобальна мінлива зберігає дані каналу <br />RssFeed CurrentFeed;<br /> <P>/ / Обробка натискання на кнопку “Оновити” <br />private void btRefresh_Click(object sender, EventArgs e) <br />{ <br />/ / Перевіряємо заданий чи адресу <br />  if (!String.IsNullOrEmpty(tbUrl.Text)) <br />  { <br />/ / Очищаємо ListView перед додаванням нових даних <br />    lvNews.Clear(); <br />/ / Ініціалізували канал <br />    CurrentFeed = new RssFeed(tbUrl.Text); <br />    foreach (RssItem feedItem in CurrentFeed.Items) <br />    { <br />/ / Створюємо елемент для виведення в ListView <br />      ListViewItem listViewItem = new ListViewItem(feedItem.Title); <br />/ / Задаємо його ім’я <br />      listViewItem.Name = feedItem.Title; <br />/ / Заносимо його в ListView <br />      lvNews.Items.Add(listViewItem); <br />    } <br />  } <br />}<br /> <br />/ / Обробка зміни вибору елемента в ListView <br />private void lvNews_SelectedIndexChanged(object sender, EventArgs e) <br />{ <br />/ / Отримуємо пов’язані з вибраних ListViewItem новина <br />if (lvNews.SelectedItems.Count> 0 && / / перевіряємо що чтото дійсно вибрано <br />CurrentFeed! = Null && / / перевіряємо, що канал инициализирован <br />CurrentFeed.Items.Count> 0 / / перевіряємо існування записів в каналі <br />      ) <br />  { <br />/ / Виводимо повний текст обраної записи <br />    wbDescription.DocumentText = CurrentFeed.Items.GetItem(lvNews.SelectedItems[0].Text).Description;<br />  }<br />}</P></BLOCKQUOTE><br /> <H2>Висновок</H2><br /> <P>В результаті ми отримали простий RSS-рідер, який може читати фіди стандарту 2.0. У наступній статті я постараюся розповісти, як можна зробити наші класи більш універсальними, а так само як можна організувати зберігання історії відвіданих стрічок. <br /> <P>PS: конструктивна критика, а також пропозиції та побажання вітаються.</P></p> <p> </P></p> <p> <div class="ad-top2"> <!-- Top article #956715 --> <script>(function(e){var t="DIV_DA_"+e+"_"+parseInt(Math.random()*1e3); document.write('<div id="'+t+'" class="directadvert-block directadvert-block-'+e+'"></div>'); if("undefined"===typeof loaded_blocks_directadvert){loaded_blocks_directadvert=[]; function n(){var e=loaded_blocks_directadvert.shift(); var t=e.adp_id; var r=e.div; var i=document.createElement("script"); i.type="text/javascript"; i.async=true; i.charset="windows-1251"; i.src="//code.directadvert.ru/data/"+t+".js?async=1&div="+r+"&t="+Math.random(); var s=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]; s.appendChild(i); var o=setInterval(function(){if(document.getElementById(r).innerHTML&&loaded_blocks_directadvert.length){n(); clearInterval(o)}},50)} setTimeout(n)}loaded_blocks_directadvert.push({adp_id:e,div:t})})(956715)</script> </div> <div style="float:right"> <div class="yashare-auto-init" data-yashareL10n="ua" data-yashareType="icon" data-yashareQuickServices="yaru,vkontakte,facebook,twitter,odnoklassniki,moimir,lj,moikrug,gplus"></div> </div> <h4>Схожі статті:</h4><ul><li><a href="http://easy-code.com.ua/2010/12/chas-vikonannya-skripta-na-php/" title="Час виконання скрипта на PHP.">Час виконання скрипта на PHP.</a> (0)</li><li><a href="http://easy-code.com.ua/2010/12/vipadayut-menyu-za-dopomogoyu-css/" title="Випадають меню за допомогою CSS">Випадають меню за допомогою CSS</a> (0)</li><li><a href="http://easy-code.com.ua/2011/01/rizna-vidobrazhennya-html-dokumentiv-v-brauzeri-zalezhit-vid-ogoloshenogo-doctype/" title="Різна відображення HTML документів в браузері залежить від оголошеного Doctype">Різна відображення HTML документів в браузері залежить від оголошеного Doctype</a> (0)</li><li><a href="http://easy-code.com.ua/2010/10/cookies-v-php/" title="Cookies в PHP.">Cookies в PHP.</a> (0)</li><li><a href="http://easy-code.com.ua/2011/04/shho-take-drajver/" title="Що таке драйвер?">Що таке драйвер?</a> (0)</li><li><a href="http://easy-code.com.ua/2011/02/harvest-klyuch-do-upravlinnya-proektami-chastina-2/" title="Harvest: ключ до управління проектами. Частина 2">Harvest: ключ до управління проектами. Частина 2</a> (0)</li><li><a href="http://easy-code.com.ua/2011/04/chastina-3-kriptografiya/" title="Частина 3 - Криптографія">Частина 3 - Криптографія</a> (0)</li></ul> <!--for paginate posts--> <hr/> <p><strong><em> Сподобалася стаття? Ви можете <a href="#comments"> залишити відгук </a> або <a href = "http://easy-code.com.ua/feed/" > підписатися на RSS </a>, щоб автоматично отримувати інформацію про нові статтях. </em></strong></p> <!--Post Meta--> <div class="post-meta"> <strong>Метки: </strong><a href="http://easy-code.com.ua/tag/public/" rel="tag">PUBLIC</a>, <a href="http://easy-code.com.ua/tag/rssitems/" rel="tag">RssItems</a>, <a href="http://easy-code.com.ua/tag/string/" rel="tag">string</a>, <a href="http://easy-code.com.ua/tag/system/" rel="tag">System</a>, <a href="http://easy-code.com.ua/tag/zapisiv/" rel="tag">записів</a>, <a href="http://easy-code.com.ua/tag/kanalu/" rel="tag">каналу</a>, <a href="http://easy-code.com.ua/tag/spisku/" rel="tag">списку</a><br /> <strong>Рубрики:</strong> <a href="http://easy-code.com.ua/category/dhtml/" rel="category tag">DHTML</a>, <a href="http://easy-code.com.ua/category/html/" rel="category tag">HTML</a>, <a href="http://easy-code.com.ua/category/xml/" rel="category tag">XML</a> </div> <!--include comments template--> <div id="comments-wrap"> <p>Коментарів поки що немає.</p> <!-- <p><a href="http://easy-code.com.ua/2012/08/sam-sobi-rss-rider-html-xml-dhtml-internet-texnologi%d1%97-statti/feed/">RSS-стрічка коментарів.</a> <a href="http://easy-code.com.ua/2012/08/sam-sobi-rss-rider-html-xml-dhtml-internet-texnologi%d1%97-statti/trackback/" rel="trackback">Адреса для трекбек</a> </p> --> <h3 class="postcomment">Ваш отзыв</h3> <p>Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <code><a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> </code></p> <form action="http://easy-code.com.ua/wp-comments-post.php" method="post" id="commentform"> <p> <input type="text" name="author" id="author" class="textarea" value="" size="28" tabindex="1" /> <label for="author">Им'я</label> * </p> <p> <input type="text" name="email" id="email" value="" size="28" tabindex="2" /> <label for="email">E-mail</label> * </p> <p> <input type="text" name="url" id="url" value="" size="28" tabindex="3" /> <label for="url">Сайт</label> </p> <p> <label for="comment">Повідомлення</label> <br /> <textarea name="comment" id="comment" cols="60" rows="10" tabindex="4"></textarea> </p> <p> <input name="submit" id="submit" type="submit" tabindex="5" value="відправити" /> <input type="hidden" name="comment_post_ID" value="16561" /> <input type="hidden" name="redirect_to" value="/2012/08/sam-sobi-rss-rider-html-xml-dhtml-internet-texnologi%D1%97-statti/" /> </p> <p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="a4fa0f0c54" /></p><p style="display: none;"><input type="hidden" id="ak_js" name="ak_js" value="193"/></p></form> </div> <!--do not delete--> <!--single.php end--> </div> <!--include sidebar--> <!--sidebar.php--> <div id="sidebar"> <div class="sidebar-rss"> <h3>Подписка через RSS</h3> <p><a href="http://easy-code.com.ua/feed/"><img src="http://easy-code.com.ua/wp-content/themes/elegantblue/images/rss.jpg" alt="Подписка на RSS" ></img></a>Якщо вам сподобалася інформація на нашому сайті, ви можете підписатися на оновлення через RSS.</p> </div> <BR> <div class="something"> <a href='http://easy-code.com.ua/tag/download/' class='tag-link-563 tag-link-position-1' title='648 topics' style='font-size: 12.328358208955pt;'>Download</a> <a href='http://easy-code.com.ua/tag/microsoft/' class='tag-link-66 tag-link-position-2' title='772 topics' style='font-size: 13.522388059701pt;'>Microsoft</a> <a href='http://easy-code.com.ua/tag/oracle/' class='tag-link-18322 tag-link-position-3' title='357 topics' style='font-size: 8.4477611940299pt;'>Oracle</a> <a href='http://easy-code.com.ua/tag/windows/' class='tag-link-18319 tag-link-position-4' title='1,383 topics' style='font-size: 17.253731343284pt;'>Windows</a> <a href='http://easy-code.com.ua/tag/internet/' class='tag-link-132 tag-link-position-5' title='366 topics' style='font-size: 8.5970149253731pt;'>Інтернет</a> <a href='http://easy-code.com.ua/tag/merezhi/' class='tag-link-143 tag-link-position-6' title='438 topics' style='font-size: 9.7910447761194pt;'>Мережі</a> <a href='http://easy-code.com.ua/tag/modeli/' class='tag-link-530 tag-link-position-7' title='360 topics' style='font-size: 8.5970149253731pt;'>моделі</a> <a href='http://easy-code.com.ua/tag/mozhete/' class='tag-link-3 tag-link-position-8' title='569 topics' style='font-size: 11.582089552239pt;'>можете</a> <a href='http://easy-code.com.ua/tag/mozhut/' class='tag-link-311 tag-link-position-9' title='384 topics' style='font-size: 9.044776119403pt;'>можуть</a> <a href='http://easy-code.com.ua/tag/dopomogoyu/' class='tag-link-273 tag-link-position-10' title='731 topics' style='font-size: 13.074626865672pt;'>допомогою</a> <a href='http://easy-code.com.ua/tag/dozvolyaye/' class='tag-link-542 tag-link-position-11' title='664 topics' style='font-size: 12.477611940299pt;'>дозволяє</a> <a href='http://easy-code.com.ua/tag/kompani%d1%97/' class='tag-link-554 tag-link-position-12' title='546 topics' style='font-size: 11.283582089552pt;'>компанії</a> <a href='http://easy-code.com.ua/tag/koristuvachiv/' class='tag-link-137 tag-link-position-13' title='337 topics' style='font-size: 8.1492537313433pt;'>користувачів</a> <a href='http://easy-code.com.ua/tag/potribno/' class='tag-link-18 tag-link-position-14' title='566 topics' style='font-size: 11.432835820896pt;'>потрібно</a> <a href='http://easy-code.com.ua/tag/programi/' class='tag-link-387 tag-link-position-15' title='1,547 topics' style='font-size: 18pt;'>програми</a> <a href='http://easy-code.com.ua/tag/prosto/' class='tag-link-99 tag-link-position-16' title='328 topics' style='font-size: 8pt;'>просто</a> <a href='http://easy-code.com.ua/tag/vikoristannya/' class='tag-link-690 tag-link-position-17' title='368 topics' style='font-size: 8.7462686567164pt;'>використання</a> <a href='http://easy-code.com.ua/tag/vikoristovuvati/' class='tag-link-890 tag-link-position-18' title='427 topics' style='font-size: 9.6417910447761pt;'>використовувати</a> <a href='http://easy-code.com.ua/tag/znachennya/' class='tag-link-198 tag-link-position-19' title='1,003 topics' style='font-size: 15.164179104478pt;'>значення</a> <a href='http://easy-code.com.ua/tag/roboti/' class='tag-link-123 tag-link-position-20' title='1,104 topics' style='font-size: 15.761194029851pt;'>роботи</a> <a href='http://easy-code.com.ua/tag/rozrobki/' class='tag-link-1235 tag-link-position-21' title='328 topics' style='font-size: 8pt;'>розробки</a> <a href='http://easy-code.com.ua/tag/sistemi/' class='tag-link-476 tag-link-position-22' title='1,131 topics' style='font-size: 15.910447761194pt;'>системи</a> <a href='http://easy-code.com.ua/tag/upravlinnya/' class='tag-link-556 tag-link-position-23' title='760 topics' style='font-size: 13.373134328358pt;'>управління</a> <a href='http://easy-code.com.ua/tag/server/' class='tag-link-197 tag-link-position-24' title='650 topics' style='font-size: 12.328358208955pt;'>сервер</a> <a href='http://easy-code.com.ua/tag/stvorennya/' class='tag-link-439 tag-link-position-25' title='460 topics' style='font-size: 10.089552238806pt;'>створення</a> <a href='http://easy-code.com.ua/tag/tablici/' class='tag-link-496 tag-link-position-26' title='469 topics' style='font-size: 10.238805970149pt;'>таблиці</a> <a href='http://easy-code.com.ua/tag/tilki/' class='tag-link-6 tag-link-position-27' title='1,295 topics' style='font-size: 16.805970149254pt;'>тільки</a> <a href='http://easy-code.com.ua/tag/fajliv/' class='tag-link-293 tag-link-position-28' title='410 topics' style='font-size: 9.3432835820896pt;'>файлів</a> <a href='http://easy-code.com.ua/tag/funkci%d1%97/' class='tag-link-218 tag-link-position-29' title='439 topics' style='font-size: 9.7910447761194pt;'>функції</a> <a href='http://easy-code.com.ua/tag/informaci%d1%97/' class='tag-link-24 tag-link-position-30' title='368 topics' style='font-size: 8.7462686567164pt;'>інформації</a></div> <!--l_sidebar.php--> <div id="l_sidebar"> <ul> <br> <!--favorite posts--> <li> <h2>Нове на сайті</h2> <ul> <li><a href='http://easy-code.com.ua/2015/11/keruyuchi-klavishi-i-menyu-informix/'>Керуючі клавіші і меню INFORMIХ</a></li> <li><a href='http://easy-code.com.ua/2015/10/vipushheno-reliz-fastreport-fmx/'>Випущено реліз FastReport FMX</a></li> <li><a href='http://easy-code.com.ua/2015/10/oracle/'>Oracle</a></li> <li><a href='http://easy-code.com.ua/2015/09/func-hgi-35i-vertolit-z-keruvannyam-vid-iphone/'>Func HGI-35i: вертоліт з керуванням від iPhone</a></li> <li><a href='http://easy-code.com.ua/2015/08/faq-po-grafiku-i-animaciyu-dlya-web/'>FAQ по графіку і анімацію для Web</a></li> <li><a href='http://easy-code.com.ua/2015/07/funkciya-viznachennya-kilkosti-robochix-dniv/'>Функція визначення кількості робочих днів</a></li> <li><a href='http://easy-code.com.ua/2015/07/inshi-mozhlivosti-obyednannya-fajliv/'>Інші можливості об’єднання файлів</a></li> <li><a href='http://easy-code.com.ua/2015/07/oglyad-navushnikiv-z-aktivnim-shumozaglushennyam-asus-nc1/'>Огляд навушників з активним шумозаглушенням ASUS NC1</a></li> <li><a href='http://easy-code.com.ua/2015/06/net-service-oriented-architecture-soa/'>.NET: Service Oriented Architecture (SOA)</a></li> <li><a href='http://easy-code.com.ua/2015/06/oglyad-behold-betab-7004/'>Огляд Behold BeTAB 7004</a></li> </ul> </li> <li> <h2>Реклама</h2> <ul> <div class="adcontentcen1"> <!-- Sidebar 160x600 #956693 --> <script>(function(e){var t="DIV_DA_"+e+"_"+parseInt(Math.random()*1e3); document.write('<div id="'+t+'" class="directadvert-block directadvert-block-'+e+'"></div>'); if("undefined"===typeof loaded_blocks_directadvert){loaded_blocks_directadvert=[]; function n(){var e=loaded_blocks_directadvert.shift(); var t=e.adp_id; var r=e.div; var i=document.createElement("script"); i.type="text/javascript"; i.async=true; i.charset="windows-1251"; i.src="//code.directadvert.ru/data/"+t+".js?async=1&div="+r+"&t="+Math.random(); var s=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]; s.appendChild(i); var o=setInterval(function(){if(document.getElementById(r).innerHTML&&loaded_blocks_directadvert.length){n(); clearInterval(o)}},50)} setTimeout(n)}loaded_blocks_directadvert.push({adp_id:e,div:t})})(956693)</script> </div> </ul> </li> </ul> </div> <!--l_sidebar.php end--> <!--r_sidebar.php--> <div id="r_sidebar"> <ul> <br> <li> <h2>Популярне</h2> <ul> <!-- 2017-08-21 19:00:04 --> <li><a href="http://easy-code.com.ua/2011/04/avtomatizaciya-biznes-procesiv-svitle-majbutnye-vitchiznyanix-kompanij/">Автоматизація бізнес-процесів – світле майбутнє вітчизняних компаній (13)</a></li> <li><a href="http://easy-code.com.ua/2012/09/yak-vidaliti-numeraciyu-storinok-ms-office-programni-kerivnictva-statti/">Як видалити нумерацію сторінок, MS Office, Програмні керівництва, статті (7)</a></li> <li><a href="http://easy-code.com.ua/2011/01/riznovidi-printeriv-zvichajni-ta-nezvichajni-printeri/">Різновиди принтерів. Звичайні та незвичайні принтери (5)</a></li> <li><a href="http://easy-code.com.ua/2011/02/ustanovka-movnix-paketiv-windows-7-vruchnu/">Установка мовних пакетів Windows 7 вручну (8)</a></li> <li><a href="http://easy-code.com.ua/2010/11/velika-kognitivna-revolyuciya/">Велика когнітивна революція (11)</a></li> <li><a href="http://easy-code.com.ua/2012/08/nalashtuvannya-ekrannix-zastavok-v-windows-7-za-dopomogoyu-reyestru-windows-operacijni-sistemi-statti/">Налаштування екранних заставок в Windows 7 за допомогою реєстру, Windows, Операційні системи, статті (14)</a></li> <li><a href="http://easy-code.com.ua/2012/08/suputnikovij-internet-ta-telebachennya-na-noutbuci-za-dopomogoyu-prof-dvb-s-1100-usb-gadzheti-oglyadi/">Супутниковий інтернет та телебачення на ноутбуці за допомогою Prof DVB-S 1100 USB, Гаджети, огляди (12)</a></li> <li><a href="http://easy-code.com.ua/2014/07/kalkulyator-teplotexnichnij-rozraxunok/">Калькулятор «Теплотехнічний розрахунок» (19)</a></li> <li><a href="http://easy-code.com.ua/2014/11/pereklad-pdf-dokumentiv-za-dopomogoyu-google-translate/">Переклад PDF-документів за допомогою Google Translate (11)</a></li> <li><a href="http://easy-code.com.ua/2012/06/formatuvannya-abzaciv-u-word-2010-ms-office-programni-kerivnictva-statti/">Форматування абзаців у Word 2010, MS Office, Програмні керівництва, статті (29)</a></li> <li><a href="http://easy-code.com.ua/2012/08/gibernaciya-son-i-gibridnij-splyachij-rezhim-v-windows-7-pitannya-i-vidpovidi-windows-operacijni-sistemi-statti/">Гібернація, сон і гібридний сплячий режим в Windows 7 – питання і відповіді, Windows, Операційні системи, статті (10)</a></li> <li><a href="http://easy-code.com.ua/2011/10/suputnikovij-internet-bez-tarilki-efirne-cifrove-movlennya-za-standartom-dvb-t-gadzheti-oglyadi/">Супутниковий інтернет без тарілки – ефірне цифрове мовлення за стандартом DVB-T, Гаджети, огляди (9)</a></li> <!-- 2017-08-21 19:00:04 --></ul> </li> </ul> </div> <!--r_sidebar.php end--> </div> <!--sidebar.php end--><!--include footer--> </div> <div id="footer"> <p> При використанні матеріалів даного сайту пряме і явне посилання на сайт <a href="http://www.easy-code.com.ua/"> www.easy-code.com.ua </a> є обов'язковим. </p> <!--footer.php--> <div id="footer-wrap"> <noindex> <!--LiveInternet counter--><script type="text/javascript"><!-- document.write("<a href='http://www.liveinternet.ru/click' "+ "target=_blank><img src='//counter.yadro.ru/hit?t19.6;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+ ";"+Math.random()+ "' alt='' title='LiveInternet: показано число просмотров за 24"+ " часа, посетителей за 24 часа и за сегодня' "+ "border='0' width='88' height='31'><\/a>") //--></script><!--/LiveInternet--> <!-- Yandex.Metrika counter --> <div style="display:none;"><script type="text/javascript"> (function(w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter10604395 = new Ya.Metrika({id:10604395, enableAll: true}); } catch(e) { } }); })(window, "yandex_metrika_callbacks"); </script></div> <script src="//mc.yandex.ru/metrika/watch.js" type="text/javascript" defer="defer"></script> <noscript><div><img src="//mc.yandex.ru/watch/10604395" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <!-- /Yandex.Metrika counter --> <script type="text/javascript" src="//yandex.st/share/share.js" charset="utf-8"></script> <script type="text/javascript" src="https://apis.google.com/js/plusone.js"> {lang: 'ru'} </script> </noindex> <BR><strong>ЕasyСode</strong> <!--necessary--> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/akismet/_inc/form.js?ver=3.3'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/wp-embed.min.js?ver=4.7.5'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/jquery/jquery.js?ver=1.12.4'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-includes/js/jquery/jquery-migrate.min.js?ver=1.4.1'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/fancybox/jquery.fancybox-1.3.8.min.js?ver=1.5.8.2'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/js/jquery.easing.min.js?ver=1.3.2'></script> <script type='text/javascript' src='http://easy-code.com.ua/wp-content/plugins/easy-fancybox/js/jquery.mousewheel.min.js?ver=3.1.12'></script> <script type="text/javascript"> jQuery(document).on('ready post-load', function(){ jQuery('.nofancybox,a.pin-it-button,a[href*="pinterest.com/pin/create/button"]').addClass('nolightbox'); }); jQuery(document).on('ready post-load',easy_fancybox_handler); jQuery(document).on('ready',easy_fancybox_auto);</script> </div> </div> <div class="soc-buttons"> <div class="yashare-auto-init" data-yashareL10n="ru" data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,gplus" data-yashareTheme="counter"></div> </div> <script>!window.jQuery && document.write('<script src="http://yastatic.net/jquery/2.1.3/jquery.min.js"><\/script>');</script> <script src="http://easy-code.com.ua/wp-content/themes/elegantblue/js/jquery.hc-sticky.min.js"></script> <script> jQuery(document).ready(function($){ $('.soc-buttons').hcSticky({ top: 25, bottomEnd: 90, wrapperClassName: 'sidebar-sticky2', noContainer: false }); }); </script> <script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script> </body> </html>