<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">
<title>St-Programming</title>
<subtitle>Последние статьи</subtitle>

<link href="http://st-programming.ru/" />
<updated>2010-08-18T08:05:00Z</updated>
<author>
  <name>St-Programming</name>
</author>
 <id>http://st-programming.ru/article.atom</id>

      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/St-programming" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="st-programming" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
      <title>
        Система тестирования. Часть 7      </title>
      <link href="http://st-programming.ru/article/show/delphi/sistema-testirovaniya/34" />
      <id>http://st-programming.ru/article/show/delphi/sistema-testirovaniya/34</id>
      <updated>2010-08-18T08:05:00Z</updated>
      <summary type="xhtml">
       <div xmlns="http://www.w3.org/1999/xhtml">
 
         <div>
  <p>
	В предыдущей части цикла статей была выполнена подготовительная часть для написания программы-теста. Сегодня мы приступим, непосредственно, к разработке самого теста.</p>
<p>
	Для начала, нужно создать новый проект в папке тест, и подключить к нему все файлы из lib.</p>
<h4>
	<span style="font-size:14px;"><strong>Интерфейс программы</strong></span></h4>
<p>
	Рассмотрим внешний вид приложения-теста. В отличие, от программы для создания теста, интерфейс будет здесь более простым. Нужны лишь две метки для отображения названия теста и вопроса, так же нужен блок вариантов ответа и три кнопки: " Назад" , " Далее"  и " Закончить" .</p>
<p>
	Исходя из вышесказанного, приложение может выглядеть так (<a href="/upload/file/mainunittest.zip">скачать dfm</a>):</p>
<p style="text-align: center">
	<a class="lightbox" href="/upload/images/7_test_1.png"><img alt="" src="/upload/images/7_test_1.png" style="height: 458px; width: 600px" /></a></p>
<p>
	Основные компоненты:...</p>
         </div>
 
       </div>
      </summary>

    </entry>
    <entry>
      <title>
        Поиск. Часть 1      </title>
      <link href="http://st-programming.ru/article/show/symfony/poisk/33" />
      <id>http://st-programming.ru/article/show/symfony/poisk/33</id>
      <updated>2010-08-13T09:00:00Z</updated>
      <summary type="xhtml">
       <div xmlns="http://www.w3.org/1999/xhtml">
 
         <div>
  <p>
	На русском языке довольно сложно найти информацию о простой реализации поиска по базе данных, используя фрейморк Symfony. В официальном гайде используется Zend Lucene  -  поисковой движок от Zend, но для многих сайтов его функционал избыточен, да и подключение к проекту Symfony не совсем очевидно.</p>
<p>
	В данной статье мы рассмотрим простую реализацию полнотекстового поиска с использование фреймворка Symfony и ORM Doctrine.</p>
<h4>
	<span style="font-size:14px;"><strong>Схема таблицы</strong></span></h4>
<p>
	Для примера, поиск будет осуществляться по некоторой таблице article. Ее схема:</p>
<p>
	<div class="code_highlight"><div class="yaml" style="font-family: monospace;font-size: 14px;font-family: monospace;"><ol><li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">StArticle:</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">  actAs:</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">    Timestampable: ~</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">  columns:</div></li>
<li style="color:#888;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">    title:</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">      type: string(255)</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">      notnull:  true</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">    text:</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">      type: string</div></li>
<li style="color:#888;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">      notnull: true</div></li>
</ol></div></div></p>
<p>
	Для возможности реализации поиска, нужно добавить поведение Searchable:</p>
<p>
	<div class="code_highlight"><div class="yaml" style="font-family: monospace;font-size: 14px;font-family: monospace;"><ol><li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">StArticle:</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">  actAs:</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">    # ...</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">    Searchable:</div></li>
<li style="color:#888;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">      fields: [title, text]</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">      analyzer: Doctrine_Search_Analyzer_Utf8</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"># ...</div></li>
</ol></div></div></p>
<p>
	В fields задаются поля, по которым осуществляется поиск. В analyzer задается так называемый " анализатор"  текста. То, что мы задали Doctrine_Search_Analyzer_Utf8, позволит избежать возможных проблем с кириллицей. К слову говоря, можно определить и собственный анализатор, достаточно наследоваться от интерфейса Doctrine_Search_Analyzer_Interface и переопределить метод analyze():</p>
<p>
	<div class="code_highlight"><div class="php" style="font-family: monospace;font-size: 14px;font-family: monospace;"><ol><li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #000000; font-weight: bold;">class</span> MyAnalyzer implements Doctrine_Search_Analyzer_Interface</div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #009900;">{</span></div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> analyze<span style="color: #009900;">(</span><span style="color: #000088;">$text</span><span style="color: #009900;">)</span></div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">    <span style="color: #009900;">{</span></div></li>
<li style="color:#888;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">        <span style="color: #000088;">$text</span> <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">(</span><span style="color: #000088;">$text</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span></div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$text</span><span style="color: #339933;">;</span></div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;">    <span style="color: #009900;">}</span></div></li>
<li style="color:#222;"><div style="font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;"><span style="color: #009900;">}</span></div></li>
</ol></div></div></p>
<p>
	Теперь схема таблицы полностью готова и подходит для поиска. После генерации и выполнения SQL кода (doctrine:build  - all) в базе появится таблица Article и так же создастся таблица article_index - так называемый полнотекстовый индекс  -  словарь, в котором перечислены слова и указано, в каких местах они встречаются.</p>
<h4>
	<span style="font-size:14px;"><strong>Поиск в Doctrine</strong></span></h4>
<p>
	Поиск будет реализован при помощи метода search, определенного в классе Doctrine_Search...</p>
         </div>
 
       </div>
      </summary>

    </entry>
    <entry>
      <title>
        Система тестирования. Часть 6      </title>
      <link href="http://st-programming.ru/article/show/delphi/sistema-testirovaniya/32" />
      <id>http://st-programming.ru/article/show/delphi/sistema-testirovaniya/32</id>
      <updated>2010-08-06T08:09:00Z</updated>
      <summary type="xhtml">
       <div xmlns="http://www.w3.org/1999/xhtml">
 
         <div>
  <p>
	Ранее, в цикле статей, посвященных написанию системы тестирования, была разработана программа составления теста. Сейчас мы начнем создание самого теста. Для начала определим основные требования к программе:</p>
<ul>
	<li>
		Вопросы из файла достаются в случайном порядке</li>
	<li>
		Тестируемый может перескакивать через вопросы и возвращаться назад</li>
	<li>
		Правильных ответов может быть несколько</li>
	<li>
		Варианты ответа к вопросу также выстраиваются случайно</li>
	<li>
		Имя файла можно передать как параметр командной строки, и программа должна его открыть</li>
	<li>
		Возможность начать тестирование сначала без перезапуска программы</li>
</ul>
<h4>
	<span style="font-size:14px;">Алгоритм проверки</span></h4>
<p>
	После того, как с требованиями разобрались можно перейти к одной из самых важных частей любого теста  -  проверки. Поскольку у вопроса может быть несколько вариантов ответа, то алгоритм проверки будет несколько нетривиальным.</p>
<p>
	Смысл его в том, что получается, как бы, что неправильный ответ " бьет"  правильный. То есть, если, к примеру, тестируемый выбрал, один верный вариант ответа и один неверный, то вопрос не засчитывается. Если же, он выбрал лишь один верный ответ, к примеру, из двух, то вопрос засчитывается наполовину.</p>
<p>
	Для того, что бы лучше понять, давайте рассмотрим пример. Пусть есть вопрос с шестью вариантами ответа, и три варианта правильные. Рассмотрим первый вариант: тестируемый отметил все правильные ответы  -  в таком случае за вопрос он получит 100%. Другой вариант: отметил только два варианта ответа из трех. Тогда получается, что вопрос верен лишь на 66%. Если же выбрать, к примеру, два правильных ответа и один неправильный, то 33%.</p>
<p>
	Подобный алгоритм с процентами является все же более справедливым, нежели просто " верно"  или " неверно" .</p>
<h4>
	<span style="font-size:14px;">Расширенная работа с данными</span></h4>
<p>
	Прежде чем приступить к непосредственно разработке программы-теста, нужно сначала расширить классы, созданные нами во второй части цикла статей (ссылка). То есть  классы, описывающие данные из xml файла.</p>
<p>
	Самым очевидным способом расширения уже существующего класса, является наследование. Его и будем использовать.</p>
<p>
	Добавим в папку lib еще один unit  -  StDataTest. Начнем с класса варианта ответа: TStAnswer. Единственное, что нам нужно добавить этому классу  -  это поле Selected, определяющее, выбран ли вариант ответа или нет...</p>
         </div>
 
       </div>
      </summary>

    </entry>
</feed>

