<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Zaktus.net</title>
	<atom:link href="http://zaktus.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://zaktus.net</link>
	<description>Об информационных технологиях в жизни</description>
	<pubDate>Fri, 02 Jan 2009 16:47:57 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Алгоритм преобразует алгоритм!</title>
		<link>http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/</link>
		<comments>http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 16:18:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Разное]]></category>

		<category><![CDATA[delphi]]></category>

		<category><![CDATA[конечные автоматы]]></category>

		<category><![CDATA[Программирование]]></category>

		<guid isPermaLink="false">http://zaktus.net/?p=64</guid>
		<description><![CDATA[При программировании на delphi или Паскале иногда попадаются задачи, которые трудно "втиснуть" в стандартные конструкции языка. А решение лежит совсем рядом - в теории конечных автоматов. Мы не будем залезать в дебри, а просто покажем как это делается.]]></description>
			<content:encoded><![CDATA[<p><strong>При программировании на <em>delphi</em> или <em>Паскале</em> иногда попадаются задачи, которые трудно &#8220;втиснуть&#8221; в стандартные конструкции языка. А решение лежит совсем рядом - в теории <em>конечных автоматов</em>. Мы не будем залезать в дебри, а просто покажем как это делается.</strong></p>
<ul>
<li><a href="http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/#liric">Лирическое отступление</a></li>
<li><a href="http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/#why">Зачем это надо</a></li>
<li><a href="http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/#theory">Немного теории</a></li>
<li><a href="http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/#how">И как же это делается ?</a></li>
<li><a href="http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/#so">Осознание: некоторые следствия и последствия</a></li>
<li><a href="http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/#sorry">&#8220;Отмазка&#8221;</a></li>
</ul>
<blockquote><p>Автор заранее просит у читателя прощения за то, что в тексте статьи используются <strong>блок-схемы</strong>. Это не модно <strong>сейчас</strong>, однако есть случаи, когда все-таки стоит их использовать. Рассуждения об алгоритмах - как раз такой <em>особый</em> случай.</p></blockquote>
<p><span id="more-64"></span></p>
<p><a name="liric"><br />
<h3>Лирическое отступление</h3>
<p></a></p>
<p>Однажды, еще в школе, на уроке алгебры, я в первый раз услышал о существовании формальных преобразований. Помнится это были (a+b) <sup><small><strong>2</strong></small></sup>.</p>
<p>Это было нечто! Меня поразила сама возможность выполнять ряд простых шагов и гарантированно получать<strong>правильный</strong> результат.</p>
<p>Ну а уж потом были примеры из тригонометрии: четырехэтажные дроби с ужасным количеством синусов, косинусов и бесконечно длинными аргументами, которые путем небольшой игры ума сворачивались в робкое 1+sin(x), а то и просто в неприметную 1.</p>
<p>С тех самых пор я весьма неравнодушен к формальным преобразованиям и стараюсь найти им применение в программировании. И, вы знаете, иногда получается! <img src='http://zaktus.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Давным-давно, когда люди еще не придумали объектно-ориентированное программирование, модным направлением было программирование <strong>структурное</strong>. Шутки шутками, но в результате именно структурного подхода мы сейчас имеем pascal и <big><strong>delphi</strong></big>.</p>
<p>Почему я говорю то Паскаль, то Дельфи? Просто потому, что лингвистическая основа delphi - это object pascal, сильно выросший из детских штанишек, но все же узнаваемый. И новые объектно-ориентированные возможности и замечательные библиотеки классов в совокупности с case-средствами так и не скрыли полностью длинные уши структурного языка (и это замечательно!). Они вылезают то здесь, то там, в отдельных процедурах, в обработчиках событий&#8230; <img src='http://zaktus.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Так вот, в те давние времена возникла следующая ситуация:</p>
<p><a name="why"><br />
<h3> Зачем это надо ?</h3>
<p></a></p>
<ul>
<li>&#8220;Сочинение&#8221; алгоритмов решения различных задач - процесс творческий, а творчество очень не любит каких-либо ограничений, значит алгоритм может быть любым, сколь угодно запутанным, образующим петли и прочие нелинейности.<br />
(Особенно этим грешат процедуры, занимающиеся разного рода синтаксическим разбором.)</li>
<li>Стандартный Паскаль имеет очень ограниченное количество структурных инструкций ( if-<strong>then</strong>-<strong>else</strong>, while-do и т.д., вы это лучше меня знаете&#8230;)</li>
<li>А программу-то написать хочется! Что делать ?</li>
<li>А нельзя ли как-нибудь &#8220;втиснуть&#8221; этот наш премудрый алгоритм в куцый набор инструкций?</li>
<li>Можно! Причем используя вполне <a href="http://articles.org.ru/cfaq/index.php?qid=2505#&lt;b&gt;form&lt;/b&gt;al" onclick="javascript:pageTracker._trackPageview ('/outbound/articles.org.ru');">формальное преобразование</a>.</li>
<li>Вот этим мы сейчас и займемся.</li>
</ul>
<p><a name="theory"><br />
<h3>Но в начале - немного теории.</h3>
<p></a></p>
<table border="0" width="80%">
<tbody>
<tr>
<td colspan="5">Итак, <strong>структурное программирование</strong> учит нас, что есть 5 основных конструкций, из которых как из кубиков строится любая процедура:</td>
</tr>
<tr>
<td><img src="http://articles.org.ru/cfaq/357_1.gif" alt="" /></td>
<td><img src="http://articles.org.ru/cfaq/357_2.gif" alt="" /></td>
<td><img src="http://articles.org.ru/cfaq/357_3.gif" alt="" /></td>
<td><img src="http://articles.org.ru/cfaq/357_4.gif" alt="" /></td>
<td><img src="http://articles.org.ru/cfaq/357_5.gif" alt="" /></td>
</tr>
<tr align="center">
<td>sequence</td>
<td>if-<strong>then</strong>-<strong>else</strong></td>
<td>while-do</td>
<td>repeat-until</td>
<td>case</td>
</tr>
<tr>
<td colspan="5"><small>Историческая справка для любознательных.<br />
По этому поводу тоже было немало дебатов: сколько же структур действительно основных, а какие следует считать производными. Левые радикалы даже дошли до того, что основных структур только две: sequence и while, а все остальные можно построить из них. Самое смешное, что это действительно так. Правда, размер текста программы при этом распухает неимоверно, но это уже детали&#8230; <img src='http://zaktus.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </small></td>
</tr>
</tbody>
</table>
<p>В нашем запутанном алгоритме наверняка не все так ужасно, как кажется. Скорее всего, там можно найти несколько фрагментов, подходящих под определение чисто структурных конструкций. Вопрос лишь в том, как эти конструкции соединить между собой.</p>
<p>А вот в этом как раз может помочь наша рабочая лошадка - непотопляемая конструкция repeat-case. При умелом применении эта нехитрая пара команд может &#8220;переварить&#8221; алгоритм любой сложности и запутанности. Главное, чтобы ВЫ четко представляли что делаете.</p>
<p><a name="how"><br />
<h3>И как же это делается?</h3>
<p></a></p>
<p>Однако хватит нам ходить вокруг да около, не пора ли заняться делом?</p>
<table border="0" width="80%">
<tbody>
<tr>
<td>Предположим, у нас есть алгоритм следующего вида:<br />
<img src="http://articles.org.ru/cfaq/357_6.gif" alt="" /></td>
<td width="60%">Хитрый ли он?<br />
Да нет, конечно! Если приглядеться, он легко разбивается на 3 вложенные стандартные структуры:<br />
<img src="http://articles.org.ru/cfaq/357_7.gif" alt="" /></td>
</tr>
<tr>
<td colspan="2">Так что мы с легкой душой можем воплотить его в программе вроде такой:  </p>
<pre>
    repeat
      <strong>while </strong>c1 do b1;
        <strong>if </strong>c2 <strong>then</strong> b2
        <strong>else</strong> b3;
    until c3;
</pre>
<p>И все! Очень красиво и компактно, спасибо большое дедушке Вирту.<br />
Как было бы хорошо, если бы в жизни нам попадались только такие алгоритмы. Однако в таком случае, вам незачем было бы читать эту статью! <img src='http://zaktus.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </td>
</tr>
</tbody>
</table>
<table border="0" width="100%">
<tbody>
<tr>
<td width="200" valign="top"><strong>А что вы скажете на это:</strong><br />
<img src="http://articles.org.ru/cfaq/357_8.gif" alt="" /></td>
<td>Выглядит вроде просто, это мы мигом! Гмм.. да.. пробуем и так и эдак - в стандартный Паскаль это явно не укладывается. Можно, конечно, попытаться &#8220;расшить&#8221; процедурные блоки b1 и b3 или применить goto или exit из цикла. Но все это, согласитесь, выглядит как-то жалко и самодеятельно. Опять же надо каждый раз думать где разомкнуть цикл&#8230; И вот тут-то появляемся мы, (на белом коне !-) с нашей универсальной отмычкой по имени repeat-case.</td>
</tr>
</tbody>
</table>
<p>Теперь мы можем выполнить несколько чисто формальных шагов:</p>
<ul>
<li>Выделяем в нашем алгоритме фрагменты, которые хорошо укладываются в структурную модель (если такие есть). В нашем случае такой фрагмент только один: b2 + c2, т.е. последовательность из блока и условия.<br />
( Если вы считаете, что фрагмент можно взять несколько шире и включить в него c1+b2+c2, я с вами соглашусь, но см.<a href="http://articles.org.ru/cfaq/index.php?qid=2505#two" onclick="javascript:pageTracker._trackPageview ('/outbound/articles.org.ru');">ниже</a>)</li>
<li>Вне этих фрагментов ставим <strong>жирные точки</strong> в следующих местах:
<ul>
<li>на входе в модуль (обозначим ее <strong>1</strong>)</li>
<li>на выходе модуля (обозначим <strong>0</strong>)</li>
<li>на входах и выходах всех фрагментов, что мы нашли</li>
<li>во всех местах, где есть пересечение линий на блок-схеме</li>
</ul>
<p>Скорее всего, многие точки просто сольются - пусть, мы будем считать их за одну. Например, у нас точка <strong>1</strong> на входе модуля совпадает с точкой пересечения линий входящей и от b3.<img src="http://articles.org.ru/cfaq/357_9.gif" alt="" align="right" /></li>
<li>Пронумеруем оставшиеся точки произвольно. <a href="http://articles.org.ru/cfaq/index.php?qid=2505#so" onclick="javascript:pageTracker._trackPageview ('/outbound/articles.org.ru');">Позже</a> мы еще поговорим о том, что могут <em>на самом деле</em> означать эти номера. В нашем примере получается 4 точки от <strong>0</strong> до <strong>3</strong>.</li>
<li>Теперь мы готовы перейти к модели конечного автомата и написать-таки нашу программу.</li>
<li>Представьте, что есть некий блок, который может находиться в одном из 4 состояний. И есть набор действий, в результате которых блок переходит из одного состояния в другое.</li>
<li>Для отображения этого самого состояния, заведем в программе некоторую переменную, скажем, state. А внутри веток case будем изменять ее состояние.</li>
<li>Пишем нашу программу:
<pre>
<strong>var </strong>state:integer;
<strong>begin</strong>
  state:=1;  {для любого алгоритма}
  repeat
    case state of
...
    <strong>end;</strong>
  until state=0; {тоже для любого алгоритма}
<strong>end;</strong></pre>
</li>
<li>Теперь пропишем ветки case. Не забудьте в конце каждой ветки уточнить состояние:
<pre>

    case state of
      1: <strong>begin</strong> b1; <strong>if </strong>c1 <strong>then</strong> state:=2 <strong>else</strong> state:=3 <strong>end;</strong>
      2: <strong>begin</strong> b2; <strong>if </strong>c2 <strong>then</strong> state:=0 <strong>else</strong> state:=3 <strong>end;</strong>
      3: <strong>begin</strong> b3; state:=1 <strong>end;</strong>
    <strong>end;</strong>
</pre>
</li>
<li>Все! Программа готова. Идите и попробуйте, она работает. И с точки зрения логики Паскаля все безупречно - никаких тебе goto и прочих неприятностей.</li>
</ul>
<p><a name="so"><br />
<h3>Осознание</h3>
<p></a></p>
<p>А теперь, после того, как мы добились столь блестящего результата, давайте осознаем: что же мы сделали и что у нас получилось.</p>
<p><strong>Что сделали</strong> (или как все это назвать по-настоящему)</p>
<ul>
<li>Мы изобразили наш алгоритм как блок-схему или, другими словами, направленный граф</li>
<li>Затем провели инвариантное преобразование этого графа с выделением нескольких стационарных состояний программы - конечного автомата</li>
<li>В результате получили новый граф, который легко укладывается в структурные конструкции Паскаля (delphi)</li>
</ul>
<p><strong>Что из это следует ?</strong></p>
<p>Проводя указанные действия несколько раз для разных алгоритмов, можно заметить, что <em><strong>на самом деле</strong></em> наши произвольно расставленные точки-состояния не такие уж случайные и произвольные. Как правило, при более глубоком рассмотрении вашего конкретного алгоритма можно найти каждому из этих состояний свое название. Это название может быть гораздо более выразительным, чем просто 1-2-3, поскольку это действительно состояния вашей программы.</p>
<p>О чем я говорю? Пусть ваш алгоритм занимается, скажем, синтаксическим разбором html-файла. Тогда одно из состояний может звучать как &#8220;Обнаружен тэг body&#8221; или &#8220;Найден конец документа&#8221;.</p>
<p>Паскаль предлагает нам замечательное средство для работы с такими обозначениями в символическом виде и об этом средстве сейчас часто забывают. Программа из нашего примера может выглядеть так:</p>
<pre>

   <strong>var </strong>state:(start, eof_found, line_added, done);
   <strong>begin</strong>
     state:=start;  {для любого алгоритма}
     repeat
       case state of
   start:      <strong>begin</strong> b1; <strong>if </strong>c1 <strong>then</strong> state:=eof_found
		<strong>else</strong> state:=line_added <strong>end;</strong>
   eof_found:  <strong>begin</strong> b2; <strong>if </strong>c2 <strong>then</strong> state:=done
		<strong>else</strong> state:=line_added <strong>end;</strong>
   line_added: <strong>begin</strong> b3; state:=start <strong>end;</strong>
       <strong>end;</strong>
     until state=done; {тоже для любого алгоритма}
   <strong>end;</strong>
</pre>
<p>Замечательно, что <strong>delphi</strong> все еще поддерживает эту спецификацию и даже показывает при отладке символьное представление состояния! Это очень удобно на практике. Спасибо, <a href="http://www.inprise.ru/" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.inprise.ru');">borland</a>!></p>
<h3>Другое следствие</h3>
<p>Возможно вы, как и я, проделав подряд несколько таких преобразований и войдя во вкус, заметите, что стали мыслить при программировании чуть-чуть иначе. Иногда, особенно когда задача несколько запутана, хочется сразу выделить несколько важных состояний и строить обработчик уже вокруг них. Это правильное желание, ему стоит потакать. <img src='http://zaktus.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Кстати, сейчас тема <strong>конечных автоматов</strong> вновь стала актуальной и то и дело мелькает на страницах компьютерных журналов.</p>
<p class="subheader">Небольшое исследование: крайние случаи</p>
<p><img src="http://articles.org.ru/cfaq/357_10.gif" alt="" align="right" /></p>
<p>Как сказал один мудрый человек, <em>&#8220;Идея, доведенная до абсурда, часто превращается в свою противоположность&#8221;</em>. Давайте попробуем довести наш метод до крайней степени.</p>
<p>В нашем случае это означает добавление еще двух состояний - 4 и 5. Тогда программа примет вид:</p>
<pre>

    case state of
      1: <strong>begin</strong> b1; state:=4 <strong>end;</strong>
      2: <strong>begin</strong> b2; state:=5 <strong>end;</strong>
      3: <strong>begin</strong> b3; state:=1 <strong>end;</strong>
      4: <strong>if </strong>c1 <strong>then</strong> state:=2 <strong>else</strong> state:=3;
      5: <strong>if </strong>c2 <strong>then</strong> state:=0 <strong>else</strong> state:=3;
    <strong>end;</strong>
</pre>
<p>Хорошо это или плохо? Хорошо, в том смысле, что даже при таком издевательстве программа не перестает работать правильно. С другой стороны, посмотрите на исходный код: где прозрачность, где легкость и ясность? Суть алгоритма растворена в сплошных переходах состояний и из-за этого теряется. Нет, пожалуй этот вариант нам не подходит.</p>
<p><a name="two"></a><img src="http://articles.org.ru/cfaq/357_11.gif" alt="" align="right" /></p>
<p>А что, если пойти в другую сторону и уменьшить число выделенных состояний? В нашем примере реально только исключить состояние <strong>2</strong>.</p>
<p>(Да, я знаю, на блок-схеме двойка есть, но давайте пока ее не замечать, ok? <img src='http://zaktus.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>После &#8220;приведения подобных&#8221; программа будет иметь следующий вид:</p>
<pre>

   <strong>case</strong> state <strong>of</strong>
      1: <strong>begin</strong>
                    b1;
                    state:=3;
             <strong>if </strong>c1 <strong>then</strong> <strong>begin</strong>
               b2;
               <strong>if </strong>c2 <strong>then</strong> state:=0
             <strong>end;</strong>
         <strong>end;</strong>
      3: <strong>begin</strong>
           b3;
           state:=1
         <strong>end;</strong>
   <strong>end;</strong>
</pre>
<p>(Если непонятно, то здесь формально получаются две ветки <strong>else</strong>, ведущие обе к третьему состоянию. Если состояние вынести вверх, до условия, то программа получается короче. Впрочем, это - дело вкуса <img src='http://zaktus.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Как вам этот вариант? Мне кажется он тоже имеет право на жизнь, хотя лично мне вариант с четырьмя состояниями нравится больше. Как-то он нагляднее показывает что куда переходит и при каких условиях. А вам? <a name="sorry"></a>Предвижу возражения такого толка, что при подобном подходе программы будут иметь повышенную склонность к зацикливанию. И да и нет. Циклы вообще склонны к зацикливанию <img src='http://zaktus.net/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> особенно если написать что-нибудь вроде <strong>repeat until false;</strong>. Так на то и голова дана, чтобы карась не дремал!</p>
<p>А если серьезно, то устойчивость работы преобразованных таким образом программ прямо и недвусмысленно показывает, насколько удачно вы проработали исходную блок-схему и насколько аккуратно ее преобразовали. Поскольку на то оно и <strong>инвариантное</strong> преобразование, чтобы ничего не менять в <strong>смысле и логике программы</strong>, а затрагивать лишь ее <strong>внешнее представление</strong>.</p>
<table border="0" width="80%">
<tbody>
<tr>
<td width="105"> </td>
<td width="741">Возможно кто-нибудь захочет поручить и само это преобразование программе, это мог бы быть компонент delphi или отдельная утилита, этакий diagram automation wizard. Если такое случится, мне бы очень хотелось посмотреть на результат. </td>
</tr>
</tbody>
</table>
<p>И, наконец, мне нужно расставить <big><strong>точки над i.</strong></big></p>
<p>Я ни в коей мере не претендую на авторство в данном формальном подходе, более того, все проблемы и решения, изложенные в этой статье, известны уже довольно давно. Моя цель была просто напомнить вам об одном красивом, но, боюсь, забытом подходе к программированию на Паскале и delphi.</p>
<p><a href="mailto:daisy25@mail.ru">george columbow</a><br />
<a href="http://www.citforum.ru/" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/www.citforum.ru');">www.citforum.ru/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://zaktus.net/2009/01/02/algoritm-preobrazuet-algoritm/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Доступ к MasterPage из страницы ASPX</title>
		<link>http://zaktus.net/2008/08/25/dostup-k-masterpage-iz-stranitsyi-aspx/</link>
		<comments>http://zaktus.net/2008/08/25/dostup-k-masterpage-iz-stranitsyi-aspx/#comments</comments>
		<pubDate>Mon, 25 Aug 2008 07:10:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[asp.net]]></category>

		<category><![CDATA[c#]]></category>

		<category><![CDATA[contentplaceholder]]></category>

		<category><![CDATA[masterpage]]></category>

		<guid isPermaLink="false">http://zaktus.net/?p=17</guid>
		<description><![CDATA[Часто приходится в своей работе пользоваться MasterPages и решил я поделиться тем, как можно обращаться из ContentPlaceHolder'a к MasterPage. ]]></description>
			<content:encoded><![CDATA[<p>Часто приходится в своей работе пользоваться <strong>MasterPages</strong> и решил я поделиться тем, как можно обращаться из <strong>ContentPlaceHolder</strong>&#8216;a к <strong>MasterPage</strong>.</p>
<div class="text">
<p>Например, на <strong>MasterPage </strong>находится CheckBox, к которому мы хотим обратиться: снять пометку, или, наоборот - поставить. Вот его код в Site.master:</p>
<blockquote><p><span style="font-family: courier new,courier;">&lt;asp:CheckBox ID=&#8221;chkVideo&#8221; runat=&#8221;server&#8221; CssClass=&#8221;chkText&#8221; Text=&#8221;только с видео&#8221; EnableViewState=&#8221;False&#8221; Checked=&#8221;True&#8221; /&gt;</span></p></blockquote>
<p>В Site.master.cs нужно поместить следующий код:</p>
<blockquote><p><span style="font-family: courier new,courier;"> public bool MyChkVideo<br />
{<br />
get<br />
{<br />
return chkVideo.Checked;<br />
}<br />
set<br />
{<br />
chkVideo.Checked = value;<br />
}<br />
}</span></p></blockquote>
<p>А в <strong>aspx</strong> в страницу, сразу после</p>
<blockquote><p><span style="font-family: courier new,courier;">&lt;%@ Page Language=&#8221;C#&#8221; MasterPageFile=&#8221;~/Site.master&#8221; AutoEventWireup=&#8221;true&#8221; CodeFile=&#8221;Search.aspx.cs&#8221; Inherits=&#8221;Search&#8221; %&gt;</span></p></blockquote>
<p>строчку</p>
<blockquote><p><span style="font-family: courier new,courier;">&lt;%@ MasterType VirtualPath=&#8221;~/Site.master&#8221; %&gt;</span></p></blockquote>
<p>Теперь к элементу checkbox можно обратиться из <strong>MasterPage</strong>! В aspx.cs, через конструкции:</p>
<blockquote><p><span style="font-family: courier new,courier;">bool blnChkAuto = Master.MyChkAuto;<br />
</span><span style="font-family: courier new,courier;">или Master.MyChkAuto = false;</span></p></blockquote>
<p>Точно так же, можно обращаться к любым другим контролам на <strong>MasterPage</strong>.</div>
]]></content:encoded>
			<wfw:commentRss>http://zaktus.net/2008/08/25/dostup-k-masterpage-iz-stranitsyi-aspx/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Установка Wordpress не в корневую директорию</title>
		<link>http://zaktus.net/2008/06/17/ustanovka-wordpress-ne-v-kornevuyu-direktoriyu/</link>
		<comments>http://zaktus.net/2008/06/17/ustanovka-wordpress-ne-v-kornevuyu-direktoriyu/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 13:17:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[wordpress]]></category>

		<category><![CDATA[установка]]></category>

		<guid isPermaLink="false">http://zaktus.net/wp/?p=3</guid>
		<description><![CDATA[Итак, я установил себе на хостинг Wordpress. Установка прошла на ура в директорию ./wordpress . Возник вопрос: как сделать перенаправление, что бы блог откликался на имя http://zaktus.net, а не http://zaktus.net/wordpress ?   Об этом я и решил написать первый пост.]]></description>
			<content:encoded><![CDATA[<p>Итак, я установил себе  на хостинг Wordpress.  Установка прошла на ура в директорию  ./wordpress . Возник вопрос: как сделать перенаправление, что бы блог откликался на имя <em>http://zaktus.net</em>, а не <em>http://zaktus.net/wordpress ? </em><em><br />
</em></p>
<p>Ответ был найден быстро в виде <a href="http://codex.wordpress.org/Giving_WordPress_Its_Own_Directory" title="Giving WordPress Its Own Directory" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/codex.wordpress.org');">статьи</a>, перевод которой, снабженный скриншотами , я здесь привожу:</p>
<blockquote><p>Многие люди хотят,  чтобы вызов Wordpress , осуществлялся из корня сайта (например: <tt>http://example.com</tt>), но не хотят захламлять корневую директорию файлами Wordpress-а. Wordpress позволяет этого добиться с помощью несложных манипуляцией.</p>
<p>Для этого необходимо:</p>
<ol>
<li>Создать директорию (например ./wordpress).  <em>Если Вы только начинаете устанавливать Wordpress, то туда можно сразу скопировать все файлы, в этом случае шаг 6 пропускаем.</em></li>
<li>Открыть панель <strong>Настройки </strong>(кнопка переключения расположена справа-вверху).<br />
<a href="http://zaktus.net/wp/wp-content/fireshot-capture-4-zaktus_net-e280ba-d0bed0b1d189d0b8d0b5-d0bdd0b0d181d182d180d0bed0b9d0bad0b8-e28094-wordpress-zaktus_net_wp_wp-admin_options-general_php.png" title="Панель \" rel="lightbox[pics3]"><img class="attachment wp-att-4 alignleft" style="padding-right:70px" src="http://zaktus.net/wp/wp-content/fireshot-capture-4-zaktus_net-e280ba-d0bed0b1d189d0b8d0b5-d0bdd0b0d181d182d180d0bed0b9d0bad0b8-e28094-wordpress-zaktus_net_wp_wp-admin_options-general_php.thumbnail.png" alt="Панель \" width="200" height="71" /></a></li>
<li style="clear:both;">В поле <strong>Адрес WordPress (URL)</strong> поменять на новое значение. Например, было <em>http://example.com</em> стало <em>http://example.com/wordpress</em><a href="http://zaktus.net/wp/wp-content/fireshot-capture-7-zaktus_net-e280ba-d0bed0b1d189d0b8d0b5-d0bdd0b0d181d182d180d0bed0b9d0bad0b8-e28094-wordpress-zaktus_net_wp_wp-admin_options-general_php.png" title="Изменение адреса Wordpress" rel="lightbox[pics3]"><img class="attachment wp-att-5 alignleft" src="http://zaktus.net/wp/wp-content/fireshot-capture-7-zaktus_net-e280ba-d0bed0b1d189d0b8d0b5-d0bdd0b0d181d182d180d0bed0b9d0bad0b8-e28094-wordpress-zaktus_net_wp_wp-admin_options-general_php.thumbnail.png" alt="Изменение адреса Wordpress" width="200" height="66" /></a></li>
<li style="clear: both;">В поле <strong>Адрес блога (URL)</strong> указываем корневой адрес адрес сайта (http://examle.com).</li>
<li style="clear: both;">Сохраняем изменения нажав на кнопку <strong>&#8220;Сохранить изменения&#8221; </strong>(если после этого вы получите сообщение об ошибке, ничего страшного, это нормально для данного этапа).<strong><br />
</strong></li>
<li style="clear: both;">Переносим все файлы  Wordpress-а  в новое место (<strong>Адрес WordPress</strong>).  <em>Если  Wordpress был сразу установлен  не в корень этот шаг можно пропустить.<br />
</em></li>
<li style="clear: both;"> Скопировать фпйлы <tt>index.php</tt> и <tt>.htaccess</tt> из директории WordPress в корень сайта  (<strong>Адрес блога</strong>).</li>
<li style="clear: both;">Открыть файл <tt>index.php в текстовом редакторе.</tt></li>
<li style="clear: both;">Внести следующие изменения и сохранить файл. Поменять строчку:<br />
<code>&lt;em&gt;&lt;strong&gt;require('./wp-blog-header.php');&lt;/strong&gt;&lt;/em&gt; <!--formatted--></code><br />
на следующее:<br />
<em><code>&lt;strong&gt;require('./wordpress/wp-blog-header.php');&lt;/strong&gt; <!--formatted--></code></em></li>
<li style="clear: both;"> Залогиниться по новому адресу: <tt>http://example.com/wordpress/wp-admin/.</tt></li>
<li><tt>Теперь, надо обновить настройки</tt> <span class="current">постоянных ссылок (ЧПУ)</span><span class="current">, для чего открывает соответствующий пункт  <strong>Постоянные ссылки (ЧПУ)</strong> в меню панели <strong>Настройки</strong></span><strong></strong>. WordPress автоматически обновит файл <tt>.htaccess</tt> если у него есть парва. Если WordPress не сможет получить доступ на запись файла <tt>.htaccess</tt>, он покажет правила для реврайта, которые будет необходимо внести самостоятельно в файл <tt>.htaccess (расположенный там же, где файл indep.php.)</tt></li>
</ol>
<p>Удачи.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://zaktus.net/2008/06/17/ustanovka-wordpress-ne-v-kornevuyu-direktoriyu/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
