<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>.wpal &#187; перевод</title>
	<atom:link href="http://blog.web2.com.ua/tag/perevod/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.web2.com.ua</link>
	<description>web, programming and linux</description>
	<lastBuildDate>Fri, 20 May 2011 13:29:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Что нового в PHP 5.3?</title>
		<link>http://blog.web2.com.ua/2009/07/22/chto-novogo-v-php-5-3/</link>
		<comments>http://blog.web2.com.ua/2009/07/22/chto-novogo-v-php-5-3/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 13:22:28 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[программирование]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/?p=847</guid>
		<description><![CDATA[Так как вышел PHP 5.3, то многие не знают, что же их ждёт в будущем. А приплыло многое. Вот по этому и перевёл статью с sitepoint.com. Кому не нравится перевод или нашли ошибку, то добро пожаловать на вики, где каждый может внести поправку в перевод. Что нового в PHP 5.3? By Ben Balbo PHP шестой [...]]]></description>
			<content:encoded><![CDATA[<p><em>Так как вышел PHP 5.3, то многие не знают, что же их ждёт в будущем. А приплыло многое. Вот по этому и перевёл <a href="http://www.sitepoint.com/print/whats-new-php-5-3/">статью</a> с sitepoint.com.</em></p>
<p><em>Кому не нравится перевод или нашли ошибку, то добро пожаловать на <a href="http://wpal.wikispaces.com/Whats+new+PHP+5.3+--+%D0%A7%D1%82%D0%BE+%D0%BD%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE+%D0%B2+PHP+5.3%3F" target="_blank">вики</a>, где каждый может внести поправку в перевод.</em><span id="more-847"></span></p>
<h1>Что нового в PHP 5.3?</h1>
<h4>By <a href="http://www.sitepoint.com/articlelist/496">Ben Balbo</a></h4>
<p><strong>PHP шестой версии уже не за горами, но для нетерпеливых разработчиков, есть хорошая новость — много возможностей, которые планировались в PHP 6, были портированы в PHP 5.3, финальный релиз которого планируется в первой половине этого года (прим. переводчика: не так то оно случилось, только вот недавно вышел <img src='http://blog.web2.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ).</strong></p>
<p>Эта новость, возможно, также будет хорошо воспринята теми, кто хотел бы воспользоваться новыми возможностями, но хостинг-провайдеры некоторое время не будут обновлять PHP до версии 6 — хостинг-провайдеры обычно оттягивают серьезные обновления версий программ пока выполняется их тестирование ( читать как: пока стабильность сначала не будет проверена где-нибудь в другом месте). Множество хостеров, возможно, отсрочат обновление своих услуг до версии 6.1. А маленькие обновления с 5.2.x до 5.3, возможно, будут маленьким препятствием для большинства хостинг компаний.</p>
<p>Эта статья показывает новые возможности , приводит примеры их возможного использования и предусматривает демонстрационный код чтобы вы поняли и работали с минимум суеты. Здесь не описывается как установить PHP 5.3 — последний возможный <a href="http://snaps.php.net/">релиз</a> [2] для разработчиков . Если вам хочется попробовать код с этой статьи, вы должны установить PHP 5.3, когда <a href="http://www.sitepoint.com/examples/php5/PHPdemos.zip">скачаете архив исходных кодов</a> [3]. <a href="http://phpmelb.org/index.php?option=com_content&amp;view=article&amp;id=69&amp;Itemid=1">Статью о установке PHP 5.3</a> [4] вы можете найти на сайте Melbourne PHP Users Group.</p>
<h2>Пространства имён</h2>
<p>Перед тем, как PHP стал объектно-ориентированным, многие разработчики приложений используют многословные имена функций для того, чтобы избежать повторений имён. Например, в WordPress используются имена функций wp_update_post и wp_create_user. Префикс wp_ означает, что функция относится к WordPress и снижает шанс столкновений имён с существующими функциями.</p>
<p>В объектно-ориентированном мире столкновение имён попадается редко. Рассмотрим следующий пример кода, который базируется в фиктивном движке для блогинга:</p>
<pre><code>&lt;?php
class User {
  public function set( $attribute, $value ) {
    ...
  }
  public function save() {
    ...
  }
}

$user = new User();
$user-&gt;set('fullname', 'Ben Balbo');
$user-&gt;save();</code></pre>
<p>В примере, метод save() не совпадает ни с одним другим методом , так как находится в классе User. Всё же есть потенциальная проблема: класс User может быть уже определён в какой-то другой части системы, если, например, приложение запускается вместе с системой управления контентом ( content management system — CMS ).</p>
<p>Решением этой проблемы — использовать новый оператор namespaces. Исходя с вышеописанного кода, обратимся к следующему примеру:</p>
<pre><code>&lt;?php
namespace MyCompany::Blog;

class User {

       public function set( $attribute, $value ) {
               $this-&gt;$attribute = $value;
       }

       public function save() {
               echo '&lt;p&gt;Blog user ' . $this-&gt;fullname . ' saved&lt;/p&gt;';
       }

}

&lt;?php
$user = new MyCompany::Blog::User();
$user-&gt;set('fullname', 'Ben Balbo');
$user-&gt;save();</code></pre>
<p>На первый взгляд, преимущество предложенного пространства для наших функций могуть быть не очевидны — прежде всего мы просто изменили MyCompany_Blog_User на MyCompany::Blog::User. Тем не мение, мы можем сейчас создать класс User для CMS [5], используя другое пространство имён:</p>
<pre><code>&lt;?php
namespace MyCompany::CMS;

class User {

       public function set( $attribute, $value ) {
               $this-&gt;$attribute = $value;
       }

       public function save() {
               echo '&lt;p&gt;CMS user ' . $this-&gt;fullname . ' saved&lt;/p&gt;';
       }

}</code></pre>
<p>Теперь мы можем использовать классы MyCompany::Blog::User и MyCompany::CMS::User.</p>
<h2>Ключевое слово <em>use</em></h2>
<p>Адресация классов, используя полные имена, по прежнему длинная, и если вы используете много классов с пространства имён MyCompany::Blog, вы не хотели бы набирать этот путь к классу каждый раз. Тогда ключевое слово use вам в руки. Ваше приложение, скорое всего, будет использовать различные классы в любой момент времени. Предположим, пользователь создаёт новую запись:</p>
<pre><code>&lt;?php
use MyCompany::Blog;
$user = new Blog::User();
$post = new Blog::Post();
$post-&gt;setUser( $user );
$post-&gt;setTitle( $title );
$post-&gt;setBody( $body );
$post-&gt;save();</code></pre>
<p>Слово use не ограничивается определением пространства имён в текущем действии. Вы также можете использовать его для импортирования одного класса в ваш файл, как ниже:</p>
<pre><code>&lt;?php
use MyCompany::Blog::User;
$user = new User();</code></pre>
<h2>Алиасы пространства имён</h2>
<p>Ранее, я говорил, что одним из преимуществ namespacing, является возможность определения более чем на одного класса с таким же именем в разных пространствах имен. Несомненно, будут случаи, когда эти два класса используют один и тот же скрипт. Мы могли бы импортировать пространства имён, однако, у нас есть возможность импортировать просто эти классы. Чтобы сделать это, мы можем использовать псевдонимы для пространства имён, например, так:</p>
<pre><code>&lt;?php
use MyCompany::Blog::User as BlogUser;
use MyCompany::CMS::User as CMSUser;

$bloguser = new BlogUser();
$bloguser-&gt;set('fullname', 'John Doe');
$bloguser-&gt;save();

$cmsuser = new CMSUser();
$cmsuser-&gt;set('fullname', 'John Doe');
$cmsuser-&gt;save();</code></pre>
<h2>Констанкты классов</h2>
<p>Константы теперь возможно определить на уровне классов! Имейте ввиду, что константы классов доступны, когда вы импортируете пространства имён, но вы не можете импортировать константу в себя. Вот пример того, как вы могли бы использовать их:</p>
<pre><code>&lt;?php
namespace MyCompany;

class Blog {
       const VERSION = '1.0.0';
}

&lt;?php
echo '&lt;p&gt;Blog bersion ' . MyCompany::Blog::VERSION . '&lt;/p&gt;';

use MyCompany::Blog;
echo '&lt;p&gt;Blog version ' . Blog::VERSION . '&lt;/p&gt;';

use MyCompany::Blog::VERSION as Foo;
echo '&lt;p&gt;Blog version ' . Foo . '&lt;/p&gt;';</code></pre>
<p>Вывод:</p>
<pre><code>Blog bersion 1.0.0
Blog version 1.0.0
Blog version Foo</code></pre>
<h2>Функции в пространстве имён</h2>
<p>Использование статических методов класса протестует против использования функций в объектно-ориентированном мире, в котором мы живём. Тем не менее, коль вам нужно добавить функцию в ваш пакет, это тоже по силам пространству имён ( namespacing )!</p>
<p>Вот пример</p>
<pre><code>&lt;?php
namespace bundle;
function foo() { echo '&lt;p&gt;This is the bundled foo&lt;/p&gt;'; }
foo(); // Это выведет 'This is the bundled foo'

&lt;?php
function foo() { echo '&lt;p&gt;This is the global foo&lt;/p&gt;'; }
require( 'lib/bundle.class.php');
bundle::foo(); // Это выведет 'This is the bundled foo'
foo(); // Вывод: 'This is the global foo'</code></pre>
<h2>Глобальное пространство имён</h2>
<p>Глобальное пространство имён — это важное возмещение, когда вы в ладах с функциями. В предыдущем примере, Вы заметите, что нет прямого пути вызова глобальной функции foo с основного кода (function from within the bundle code).</p>
<p>Метод для решения вызовов функций — это использовать текущее пространство имён (The default method of resolving calls to functions is to use the current namespace). Если функцию нельзя найти, то она будет искать найдена, то будут рассматриваться внутренние функции по имени. Автоматически будут искаться функции в других пространствах имён.</p>
<p>Для вызова глобальной функции foo с внутреннего связующего пространства имён, нам следует указать глобальное пространство имён напрямую. Делается это с помощью двоеточия:</p>
<pre><code>&lt;?php
namespace bundle;
function foo() { echo '&lt;p&gt;This is the bundled foo&lt;/p&gt;'; }
foo(); // This prints 'This is the bundled foo'
::foo(); // This prints 'This is the global foo'</code></pre>
<h2>Автозагрузка классов в пространстве</h2>
<p>Если вы описали магическую функцию <em>_autoload</em> для подключения файлов с описанием классов при запросе, тогда вы, возможно, используете каталог, с которого подключаются все ваши файлы с классами. До использования пространств имён, этого было бы достаточно, так как каждый класс имеет уникальное имя. Теперь, можно иметь много классов с одним именем.</p>
<p>К счастью, функция <em>_autoload</em> будет получать полную ссылку на класс в пространстве имён. Значит, вы могли бы получать такой вызов:</p>
<pre><code>__autoload( 'MyCompany::Blog::User' );</code></pre>
<p>Теперь вы можете с помощью оператора замены, преобразить двоеточие в другие символы. Наиболее ожидаемой заменой может быть символ разделения директорий:</p>
<pre><code>function __autoload( $classname ) {
       $classname = strtolower( $classname );
       $classname = str_replace( '::', DIRECTORY_SEPARATOR, $classname );
       require_once( dirname( __FILE__ ) . '/' . $classname . '.class.php' );
}</code></pre>
<p>Результатом будет подключение файла./classes/mycompany/blog/user.class.php.</p>
<h2>Позднее статическое связывание</h2>
<p>Позднее статическое связывание предоставляет возможность родительскому классу использовать статический метод, который был переопределён дочерним классом. Вы могли бы подумать, что это было поведение по-умолчанию, но подумайте над нижеупомянутом примере:</p>
<pre><code>&lt;?php

class ParentClass {

       static public function say( $str ) {
               self::do_print( $str );
       }

       static public function do_print( $str ) {
               echo "&lt;p&gt;Parent says $str&lt;/p&gt;";
       }

}

class ChildClass extends ParentClass {

       static public function do_print( $str ) {
               echo "&lt;p&gt;Child says $str&lt;/p&gt;";
       }

}

ChildClass::say( 'Hello' );</code></pre>
<p>Вы возможно ожидаете, что скрипт вернёт &#8220;Child says Hello&#8221;. Хотя я понимаю, почему вы могли бы так подумать, но вы будете разочарованы, когда уведите &#8220;Parent says Hello&#8221;.</p>
<p>Причина этого в том, что ссылки <em>self::</em> и <em>_CLASS_</em> принимают решение в классе, в котором эта конструкция используется. В PHP 5.3 теперь есть конструкция <em>static::</em>, которая решает какой класс вызван во время выполнения программы:</p>
<pre>        <code>static public function say( $str ) {
               static::do_print( $str );
       }</code></pre>
<p>С добавлением <em>static::</em>, сценарий вернёт строку &#8220;Child says Hello&#8221;.</p>
<h2>_callstatic</h2>
<p>До сих пор PHP поддерживает несколько чудесных методов в классе, известные вам как <em>_set</em>, <em>_get</em> и <em>_call</em>. В PHP 5.3 появился метод <em>_callstatic</em>, который работает так же как и метод <em>_call</em>, но занимается статическим контентом. В других словах, метод действует в непризнанных статических вызовах напрямую в классе.</p>
<p>Пример ниже показывает эту идею:</p>
<pre><code>&lt;?php

class Factory {

       static function GetDatabaseHandle() {
               echo '&lt;p&gt;Returns a database handle&lt;/p&gt;';
       }

       static function __callstatic( $methodname, $args ) {
               echo '&lt;p&gt;Unknown static method &lt;strong&gt;' . $methodname . '&lt;/strong&gt;' .
                       ' called with parameters:&lt;/p&gt;';
               echo '&lt;pre&gt;' . print_r( $args, true ) . '&lt;/pre&gt;';
       }
}

Factory::GetDatabaseHandle();
Factory::CreateUser();
Factory::CreateBlogPost( 'Author', 'Post Title', 'Post Body' );</code></pre>
<h2>Переменные статические вызовы</h2>
<p>Когда статический член или метод не статический? Тогда это динамическая ссылка конечно!</p>
<p>Ещё раз, это возможность, которая приносит объектную функциональность в ваши классы. К дополнению к переменным и вызовов переменных методов, у вас есть переменные статические вызовы. Возмём класс Factory с предыдущего раздела. Вы можете получить такой же результат с помощью этого кода:</p>
<pre><code>$classname = 'Factory';
$methodname = 'CreateUser';
$classname::$methodname();

$methodname = 'CreateBlogPost';
$author = 'Author';
$posttitle = 'Post Title';
$postbody = 'Post Body';

$classname::$methodname( $author, $posttitle, $postbody );</code></pre>
<p>Вы можете создать динамические пространства имён примерно так:</p>
<pre><code>&lt;?php
require_once( 'lib/autoload.php' );

$class = 'MyCompany::Blog::User';
$user = new $class();
$user-&gt;set('fullname', 'Ben Balbo');
$user-&gt;save();</code></pre>
<p>Эти маленькие штрихи могут сделать ваш код более читаемым и даст вам полную гибкость в объектно-ориентированном смысле.</p>
<h2>Родной драйвер MySQL</h2>
<p>До версии 5.3, любые соединения с MySQL обычно происходили в связке с libmysql &#8211; клиентской библиотекой MySQL.</p>
<p>Родной драйвер для PHP 5.3 был разработан с нуля для PHP и Zend Engine, который будет иметь несколько преимуществ. Наиболее очевидным есть то, что драйвер специфичен для PHP и по-этому оптимизирован под Zend Engine. Он предоставляет клиент с маленьким footprint и быстрым временем выполнения.</p>
<p>Во-вторых, родной драйвер даёт возможность использовать планировщик памяти Zend Engine и будет подчинятся настройкам параметров ограничения памяти PHP.</p>
<p>Родной драйвер будет лицензирован под лицензией PHP дабы избежать проблем с лицензированием.</p>
<h2>Дополнительные функции OpenSSH</h2>
<p>Если вам когда нибудь приходилось выполнять какие-то OpenSSL инструкции в ваших сценариях (например генерацию ключи Diffie Hellman или шифровать содержимое), вы либо должны выполнить эту операцию от имени пользователя или передать запрос в системный вызов.</p>
<p>Патч для функциональности OpenSSL в PHP 5.3 предоставляет дополнительные функции, которые нужны для выполнения этих операций через библиотеку OpenSSL, которые не только делает вашу жизнь проще и ваши приложения быстрее, но и позволяет многократно использовать проверенный код.</p>
<p>Это будет хорошая новость для тех, кто, что в настоящее время работает с OpenID.</p>
<h2>Улучшения поддержки параметров командной строки</h2>
<p>Надеюсь, Вы уже поняли тот факт, что PHP не просто язык сценариев для Web. Версия PHP для запуска с командной строки, выполняется за средой веб-сервера и полезен для автоматизации процессов системы и приложений.</p>
<p>Например, функция PHP getopt() has been around for a while (!!!), но была ограничена на некоторых системах: в большинстве случаев, она не работала в Windows.</p>
<p>Начиная с PHP 5.3 функция getopt() не зависит от системы. Ура!</p>
<h2>XSLT профайлинг</h2>
<p>XSLT &#8211; это сложный зверь, и большинство пользователей этого шаблонного механизма знакомы с опциями профайлинга xsltproc. Начиная с 5.3 вы можете заниматься профайлингом ваших сценарием без этого инструмента. Этот фрагмент из примера[4], который сопровождает эту статью, дает представление о том, каким образом мы могли бы использовать это:</p>
<pre><code>$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc-&gt;load('./lib/collection.xsl');
$xsl-&gt;importStyleSheet($doc);

$doc-&gt;load('./lib/collection.xml');
$xsl-&gt;setProfiling("/tmp/xslt-profiling.txt");
echo $xsl-&gt;transformToXML($doc);

echo '&lt;h2&gt;Profile report&lt;/h2&gt;';
echo '&lt;pre&gt;' . file_get_contents( '/tmp/xslt-profiling.txt' ) . '&lt;/pre&gt;';</code></pre>
<p>Результат профайлинга мог бы выглядеть где-то так:</p>
<pre><code>number    match    name   mode     Calls   Tot  100us  Avg
0         collection                    1       4       4
1         cd                            2       1       0

          Total                         3       5</code></pre>
<h2>Новые уровни ошибок</h2>
<p>PHP, конечно, имеет несколько каламбуров. Например, почему E_ALL не содержит все уровни ошибок?</p>
<p>Ну сейчас уже делает! Да, E_STRICT теперь часть E_ALL.</p>
<p>Кроме того, пока E_STRICT используется для информирования функциональности, которая может быть не рекомендуемой в ближайшем будущем, как, например, определения абстрактного статического метода, то в PHP 5.3 эти 2 ошибки делятся на E_DEPRECATED на E_STRICT соответственно, что больше подходит по смыслу.</p>
<h2>Другие мелкие улучшения</h2>
<p>Вот горсточка улучшений, которые появились в PHP 5.3, которые малы даже для параграфа, или были не стабильны во время написания этой статьи:</p>
<ul>
<li>Sqlite3 поддерживается расширением 	ext/sqlite</li>
<li>В DirectoryIterator SPL реализован ArrayAccess</li>
<li>2 новых функции: 	<em>array_replace</em> и <em>array_replace_recursive.</em> Пока 	эти функции не определены под PHP 5.3, но 	в коде на C, который их реализует, с виду 	их функциональность похожа на 	<em>array_merge()</em>. Одно исключение составляет 	функция <em>array_replace()</em>, которая будет 	обновлять значения в первом массиве, 	когда значения ключей в обоих массивах 	одинаковые. Значения ключей, которые 	есть в втором массиве, но нет в первом, 	будут игнорироваться.</li>
</ul>
<h2>Резюме</h2>
<p>PHP 5.3 содержит много функциональности, которые намечались только в PHP 6, дабы стать маленьким обновлением для большого релиза, который каждый PHP разработчик должен знать. Мы затронули большинство возможностей в этой статье, привели несколько примеров кода, который показывает как вы можете использовать эти возможности.</p>
<p>Не забудьте <a href="http://www.sitepoint.com/examples/php5/PHPdemos.zip">скачать код, супуствующий этой заметке</a> [12], и быть в курсе событий</p>
<p>[1] <a href="http://snaps.php.net/">http://snaps.php.net/</a><br />
[2] <a href="http://www.sitepoint.com/examples/php5/PHPdemos.zip">http://www.sitepoint.com/examples/php5/PHPdemos.zip</a><br />
[3] <a href="http://phpmelb.org/index.php?option=com_content&amp;view=article&amp;id=69&amp;Itemid=1">http://phpmelb.org/index.php?option=com_content&amp;view=article&amp;id=69&amp;Itemid=1</a><br />
[4] <a href="http://www.sitepoint.com/examples/php5/PHPdemos.zip">http://www.sitepoint.com/examples/php5/PHPdemos.zip</a><br />
[5] <a href="http://www.sitepoint.com/examples/php5/PHPdemos.zip">http://www.sitepoint.com/examples/php5/PHPdemos.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2009/07/22/chto-novogo-v-php-5-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Скорость и использование памяти yum и ZYpp</title>
		<link>http://blog.web2.com.ua/2008/06/14/skorost-i-ispolzovanie-pamyati-yum-i-zypp/</link>
		<comments>http://blog.web2.com.ua/2008/06/14/skorost-i-ispolzovanie-pamyati-yum-i-zypp/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 15:11:31 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[openSuse]]></category>
		<category><![CDATA[Sneak Peeks]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[memory usage]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[yum]]></category>
		<category><![CDATA[zypp]]></category>
		<category><![CDATA[zypper]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/?p=637</guid>
		<description><![CDATA[Вот на носу выход openSUSE 11.0. В этой версии был сильно оптимизирован zypper &#8211; средство управления пакетами openSUSE. Эта программа всегда вызивала нарекания пользователей и, даже я, который уже наверно года 4-5 с openSUSE, не пользуюсь им почти никогда. Основная проблема &#8211; скорость. Когда начинаешь что-то им делать &#8211; это ужас. То он кеш грузит, [...]]]></description>
			<content:encoded><![CDATA[<p>Вот на носу выход openSUSE 11.0. В этой версии был сильно оптимизирован zypper &#8211; средство управления пакетами openSUSE. Эта программа всегда вызивала нарекания пользователей и, даже я, который уже наверно года 4-5 с openSUSE, не пользуюсь им почти никогда. Основная проблема &#8211; скорость. Когда начинаешь что-то им делать &#8211; это ужас. То он кеш грузит, то он решил от фонаря обновить  репозитории, когда ставишь пакет с необновляемой репы. Очень сложно с ним мирится и боротся.</p>
<p>Но когда я попробывал 11, то сразу бросилась в глаза скорость работы. Теперь всё происходило мгновенно! Вот и видео подтверждение:</p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/XB3o4Skka5Q&amp;hl=ru" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/XB3o4Skka5Q&amp;hl=ru"></embed></object></p>
<p>И это чистейшая правда. Вот и <a href="http://duncan.mac-vicar.com/blog/archives/309" target="_blank">тест провели</a>, а я попробую перевести.<span id="more-637"></span></p>
<hr />Michael Zucchi <a href="http://blogs.gnome.org/zucchi/2008/05/10/linux-is-bloated/" target="_blank">жалуется</a> на использование памяти yum и винит в этом python.</p>
<blockquote><p>Yum таки не вкусняшка. Включивши питон, я так и не сумел запустить yum. Ух ты 120 MB на виртуальной машине, чтобы установить несколько пакетов. Неплохо, учитывая 128 MB на основной машине. Гавняно.</p>
<p>Хм, я должен попробовать xubuntu &#8211; или это будет таким же дрянным и вздутым и загубленым питоном poo?</p></blockquote>
<p>Поскольку все наши усилия были направлены на то, чтобы сделать ZYpp быстрее, путём обьединения и интеграции  Michael Schroeder’s вместе Michael Matz, который смног сделал в solv файлах и  для хранения данных,то  мне никогда не  хотелось сделать “быстрое сравнение” о  использовании памяти или скорости. Так давайте уже взглянем.</p>
<p>Вот мои репозитарии:</p>
<pre><code>Software configuration management (openSUSE_10.3)
10.3 - Main Repository (NON-OSS)
10.3 - Packman
openSUSE-10.3-Updates
Virtualization:VirtualBox
home:dgollub
KDE:KDE3
Mozilla based projects (openSUSE_10.3)
ZYPP SVN Builds (openSUSE_10.3)
ZYPP SVN Builds (openSUSE_10.3)
home:prusnak
10.3 - VideoLan
openSUSE.org tools (openSUSE_10.3)
SUSE Feature Tracking Tool (openSUSE_10.3)
psmt's Home Project (openSUSE_10.3)
openSUSE:10.3
Duncan Mac-Vicar SUSE rpms (openSUSE_10.3)
Latest YaST svn snapshots (openSUSE_10.3)
building/openSUSE_10.3</code></pre>
<p>Во всех этих репозитариях приблизительно 41 тис. пакетов.</p>
<p>Что я сделал, так это создал символическую ссылку для каталопа пакетов yum, чтобы они использовали одни репозитарии.</p>
<pre><code># rm -rf /etc/yum.repos.d/
# ln -s /etc/zypp/repos.d /etc/yum.repos.d</code></pre>
<p><span style="text-decoration: line-through;">*NOTE:* I tested with yum 3.2.4. I know 3.2.14 is available, but that is what I had installed when doing the test. After doing this tests I upgraded to 3.2.14 but it did not accept my .repo file because the character “:” in repo names. However the changelog of yum since 3.2.4 shows: If using latest yum would invalidate this numbers (not as in 1 second, but as in an order of magnitude), let me know and I will repeat them when I make them work with my repo files.</span> (не переводил, зачеркнули же. Говорится о версиях, и чего не на новых&#8230; )</p>
<p><strong>Update 14.05.2008 : Я добавил yum 3.2.14. Тем не менее его производительность даже хуже, но не использование памяти.</strong></p>
<p><strong>Update 15.05.2008 : добавлены цифры дял smart 0.52</strong></p>
<p>libzypp  &#8211; тот который лежит в factory уже несколько дней: 4.21.1.</p>
<p>yum и ZYpp ведут себя по-разному, yum скачивает и парсит файлы filelists.xml и other.xml, а мы их игнорируем. Так что, я пропустил часть загрузки мета данных и засёк время построения кэша.</p>
<pre><code># yum clean dbcache
...
19 sqlite files removed</code>

# time yum makecache
...
Metadata Cache Created

real    9m41.036s
user    2m34.766s
sys     0m11.545s</pre>
<p>Почти 10 минут. В это время включен разбор двух больших файлов, которые мы прогнорировали.  Я запустил его ещё раз, нажавши Ctrl+C, когда yum закончил обрабатывать первичные данные, как это делает zypp.</p>
<pre># time yum makecache
...
Exiting on user cancel

real    4m6.730s
user    0m34.058s
sys     0m3.080s</pre>
<p>И очередь ZYpp:</p>
<pre># time zypper ref -B
...
All repositories have been refreshed.

real    0m18.472s
user    0m16.029s
sys     0m2.024s</pre>
<p>Таким образом Yum требует технически в 13 раз больше времени чем ZYpp (если рассматривать одинакувую работу), но пользователь ждёт в 30 раз больше.</p>
<p>Теперь установка пакетов. Это означает время от вопроса &#8220;Продолжить (да/нет)&#8221; до приглашения оболочки.</p>
<pre># time yum install fate
...
Is this ok [y/N]: n
Exiting on user Command
Complete!

real    0m19.143s
user    0m14.057s
sys     0m1.920s</pre>
<p>А ZYpp</p>
<pre># time zypper in fate
...
Continue? [YES/no]: n

real    0m9.796s
user    0m8.509s
sys     0m0.624s</pre>
<p>На этом этапе ZYpp всего в два раза быстрее Yum. Всего <img src='http://blog.web2.com.ua/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Что же нас ждёть, когда захочется обновить пакеты?</p>
<pre># time yum upgrade
...
real    0m45.152s
user    0m36.894s
sys     0m7.476s</pre>
<p>(Замечание: yum даже не нашёл ничего для обновления).</p>
<pre># time zypper update
...
Continue? [YES/no]: n

real    0m8.988s
user    0m7.820s
sys     0m0.596s</pre>
<p>yum нужно в 4 раза больше времени чем ZYpp, чтобы определить работу для обновления.</p>
<p><strong>Update 14.05.2008 :  сравнивал  update с upgrade, я исправил это в диаграме. Тем не менее, у меня небыло данных для update в старом yum.</strong></p>
<ul class="picture">
<li><a href="http://blog.web2.com.ua/wp-content/uploads/pub.png"><img class="alignnone size-medium wp-image-638" title="summary" src="http://blog.web2.com.ua/wp-content/uploads/pub-400x146.png" alt="" width="400" height="146" /></a></li>
<li>Резюме.</li>
</ul>
<p>Теперь, сколько памяти каждому с них требуется? Для этого я просто проверил установку одного пакета используя valgrind massif, профайлера кучи (heap profiler).</p>
<ul class="picture">
<li><a href="http://blog.web2.com.ua/wp-content/uploads/yum-in-massif.png"><img class="alignnone size-medium wp-image-639" title="yum-in-massif" src="http://blog.web2.com.ua/wp-content/uploads/yum-in-massif-400x265.png" alt="" width="400" height="265" /></a></li>
<li>Использование памяти Yum</li>
<li><a href="http://blog.web2.com.ua/wp-content/uploads/zypper-in-massif.png"><img class="alignnone size-medium wp-image-640" title="zypper-in-massif" src="http://blog.web2.com.ua/wp-content/uploads/zypper-in-massif-400x265.png" alt="" width="400" height="265" /></a></li>
<li>Использование памяти ZYpp</li>
<li><a href="http://blog.web2.com.ua/wp-content/uploads/yum-3214-massif.png"><img class="alignnone size-medium wp-image-641" title="yum-3214-massif" src="http://blog.web2.com.ua/wp-content/uploads/yum-3214-massif-400x264.png" alt="" width="400" height="264" /></a></li>
<li><strong>Update 14.05.2008 : диаграмма использования памяти yum 3.2.14</strong></li>
<li><a href="http://blog.web2.com.ua/wp-content/uploads/smart-in-massif.png"><img class="alignnone size-medium wp-image-642" title="smart-in-massif" src="http://blog.web2.com.ua/wp-content/uploads/smart-in-massif-400x266.png" alt="" width="400" height="266" /></a></li>
<li><strong>Update 15.05.2008 : </strong><strong>диаграмма использования памяти</strong><strong> smart 0.52</strong></li>
</ul>
<p>Ви можете сделать вывод, что ZYpp потребляет чуть больше 20M, в то время как yum использует больше 180M памяти, тоесть в 9 раз больше. <strong>Обновлено 14.05.2008 : yum 3.2.14  использует  приблизительно 160 в худший момент времени.</strong></p>
<ul class="picture">
<li><a href="http://blog.web2.com.ua/wp-content/uploads/pub_install.png"><img class="alignnone size-medium wp-image-643" title="pub_install" src="http://blog.web2.com.ua/wp-content/uploads/pub_install-400x284.png" alt="" width="400" height="284" /></a></li>
</ul>
<p>Мне было бы интерестно поссмотреть и на использование процессора, но это уже позже. Что вы думаете об этом?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2008/06/14/skorost-i-ispolzovanie-pamyati-yum-i-zypp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Функция отмены последнего действия (Undo) &#8211; это просто(Вторая часть): Срочные события</title>
		<link>http://blog.web2.com.ua/2007/11/09/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prostovtoraya-chast-srochnyie-sobyitiya/</link>
		<comments>http://blog.web2.com.ua/2007/11/09/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prostovtoraya-chast-srochnyie-sobyitiya/#comments</comments>
		<pubDate>Fri, 09 Nov 2007 13:12:12 +0000</pubDate>
		<dc:creator>wert2all</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[Undo]]></category>

		<guid isPermaLink="false">http://blog.web2.com.ua/2007/11/09/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prostovtoraya-chast-srochnyie-sobyitiya/</guid>
		<description><![CDATA[Это вторая часть серии &#8220;Функция отмены &#8211; это просто&#8221;. Если вы их пропустили, то прочитайте первую часть [ перевод ]. В предыдущий раз рассматривали метод очереди событий, как полностью клиентскую реализацию лёгкой многоуровневой функции отмены. Я упоминал о паре обмолвок: это не работает в многопользовательской среде и не работает в время-зависимых событиях, как отправка email. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.web2.com.ua/wp-content/uploads/undo.jpg" alt="undo.jpg" class="short" />Это вторая часть серии &#8220;Функция отмены &#8211; это просто&#8221;. Если вы их пропустили, то прочитайте <a href="http://humanized.com/weblog/2007/09/14/undo-made-easy-with-ajax-part-1/" title="part 1" class="new" target="_blank">первую часть</a> [ <a href="http://blog.web2.com.ua/2007/09/24/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-1/" title="перевод">перевод</a> ].</p>
<p>В предыдущий раз рассматривали метод очереди событий, как полностью клиентскую реализацию лёгкой многоуровневой функции отмены. Я упоминал о паре обмолвок: это не работает в многопользовательской среде и не работает в время-зависимых событиях, как отправка email. Я пропустил существенную оговорку, на которой обратил внимание один с моих читателей, Alexander Botero-Lowry: два таба, в которых открыта одна и та же страница, не синхронизируются. Я написал, как это решить с помощью <a href="http://www.humanized.com/weblog/2007/09/21/undo-made-easy-with-ajax-part-15" class="new" target="_blank">cookies</a> [ <a href="http://blog.web2.com.ua/2007/09/27/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prosto-chast-15/" title="перевод" id="v2o-">перевод</a> ].<span id="more-448"></span></p>
<p>На этот раз, давайте взглянем на решение Отмены для срочных действий.  В методе очереди событий, мы могли бы подождать, пока событие &#8220;onunload&#8221;  синхронизирует действия пользователя на стороне клиента с серверной стороной. Для срочных действий, таких как отправка email, у нас нет такой роскоши. Хуже всего, что email &#8211; это не push-технология. Отправивши раз email по диким трубам Internet, оно уже не может быть не отправленным.<a href="#s">*</a> Для несчастных, которые нажали “отправить” и лишь потом осознали, что переслали томное любовное письмо своему боссу, остаётся надеяться на перебои с электроэнергией и спам-фильтры. Учитывая, как часто спам проходит последние мои фильтры, перспективы не столь хороши.</p>
<p>Электронные письма нужно отправлять вскоре после того, как пользователь нажал на &#8220;Отправить&#8221; и операцию отправки нельзя отменить. Что мы можем сделать?</p>
<p>Для решения данной проблемы мы должны обратится к интерфейсу на основе времени. Как правило, интерфейсы на основе времени  не в состоянии быть действительно годным к употреблению, потому что расчёт времени, в действительности, неправильный. Для некоторых людей оно слишком быстро, для других &#8211; медленно. Даже ваше собственное восприятие изменений времени основанно на вашей умственной нагрузке. Когда вы о о чём-то сильно думаете, вы не замечаете течение времени:  что было слишком медленно прежде, теперь будет слишком быстрым. Старая поговорка: &#8220;Время летит, когда вы веселитесь&#8221; действительна для пользовательского интерфейса. Хорошим примером недостатка интерфейса на основе времени можно увидеть в наборе текста в мобильных телефонах, но эта тема подождёт до следующей заметки.</p>
<p>Когда посылается письмо, как правило в период “<a href="http://www.askoxford.com/concise_oed/ohnosecond?view=uk" class="new" target="_blank">‘о, НЕТ! секунду</a>“— доли секунды после нажатия &#8220;отправить&#8221; — вы понимаете, что отправили письмо на неправильный адрес. Желание не посылать электронную почту, которую послали час назад, происходит, но с намного меньшей частотой. Таким образом, решение на основе времени, когда пользователь может не послать письмо, имеет смысл только на коротком промежутке времени: back-end может просто отложить посылку письма на 30-60 секунд и, если пользователь захочет отменить отправку на протяжении нормального периода времени,  back-end уберёт с очереди email и письмо не отправится.</p>
<p>Теперь, я не особенно счастлив с поддержкой интерфейса на основе времени, но я зажат ограничениями. С одной стороны, отправка электронной почты в реальном мире, действие, которое невозможно отменить. С другой стороны, письма надо отправлять живчиком. Функция отмены для срочных событий не является канонической проблемой и единственное решение, которое я вижу &#8211; это компромисс (если кто-то знает другое решение, я весь во внимании!). В целом, многие ситуации, в которой мы, как проектировщики, попадали с непроходимыми препятствиями. Лучшее, что мы можем сделать  &#8211; разрабатывать системы, которые заботятся о наиболее вероятно использованных случаях, и позволяет пользователям изящно вернуться из наиболее распространенных ошибок. Undo на основе времени не решит всех  недостатков отмены отправки письма ( это не будет помогать с ночными электронными письмами, Вы обнаружите, что послали следующим утром), но он будет ловить большинство ошибочно отправленных писем (ошибки типа “‘о, нет!’ секунду!”  и вариант “Я-нажал-на-кнопку-случайно”). И это поймает намного больше ошибочных писем, чем банальное оповещение. Оказалось, что Paul Buchheit, создатель Gmail, <a href="http://paulbuchheit.blogspot.com/2007/06/quick-all-actions-should-have-undo.html" class="new" target="_blank">тоже так думает</a>. Как жаль, что это не было реализовано— это низковисячие фрукты, которые могли бы дать Gmail больший перевес в его превосходстве.</p>
<p>Не так то и много там этого метода. Для реализации его в стиле Ajax, вам просто понадобится mutex и таймер. Когда время истекает (или при переходе со страницы), письмо будет отправлено. Более продвинутый способ предполагает установление флага на сервере наряду с серверным обратным отсчётом. В сложной частью всего этого дело заключается в том, чтобы указать время, оставшееся таким образом, чтобы не запугать пользователей. Например, обратный отсчёт времени вызывает внутреннее чувство паники:<br />
<iframe style="border: medium none ; overflow: hidden; width: 500px; height: 500px;" src="http://humanized.com/weblog/images/resources/undo/email_count_down.html" ></iframe><br />
Не хорошее чувство, неправда-ли? Взамен, медленное затухание работает лучше:<br />
<iframe style="border: medium none ; overflow: hidden; width: 500px; height: 500px;" src="http://humanized.com/weblog/images/resources/undo/email_fade_out.html" ></iframe><br />
Обратный отсчет, который не начинает считать в обратном порядке до последних 10 секунд, мог бы также работать. Это прекрасная задача &#8211; разработать механизмы красивого отображения лимита времени для отмены. Поделитесь своими мыслями в разделе комментариев. Бонусы за предложения любого вида!</p>
<p id="result_box" dir="ltr">В следующий раз я буду говорить о некоторых искусных, более надежных методах введения Отмены с помощью Ajax.</p>
<p id="footnote" style="border-top: 1px dotted #888888; color: #888888; font-size: 80%">*<a title="s" name="s"></a><br />
Есть определенные решения &#8211; хотя и не очень &#8211; для этой проблемы. Для примера, письмо может состоять только с одного вложенного рисунка в виде текста. Если картинка хранится на вашем сервере, тогда для отмены отправки email, вы просто удаляете или меняете рисунок. Это эффективно не отправит контент письма (если уже не отправило). Так что кто-то будет знать только то, что вы отправили сообщение (с темой), но не содержание.</p>
<p><strong>Перевод: </strong><a href="http://humanized.com/weblog/2007/10/22/undo_with_ajax_2/" class="new" target="_blank">Undo Made Easy with Ajax (Part 2): Time-Sensitive Actions</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.web2.com.ua/2007/11/09/funktsiya-otmenyi-poslednego-deystviya-undo-eto-prostovtoraya-chast-srochnyie-sobyitiya/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

