High Load Web блоги http://www.hi-lo.ru/blog ru Особенности использования переменных в php http://www.hi-lo.ru/blog/php-0 <div class="field field-name-field-rubr-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Рубрика: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/development/coding" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Программирование</a></li></ul></div><div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>В php область видимости переменной распространяется за границы блока, в котором переменная была инициализирована, ограничивается она только лишь контекстом метода класса или функции в котором находится. Так, например, переменная инициализированная в цикле for будет доступна так же за его пределами далее по коду. Такое поведение не свойственно, к примеру, в языках с, c++, в которых область видимости ограничена блоком, в котором переменная была создана. Поэтому иногда программисты, особенно пришедшие в php из рядов c-программистов, даже не догадываются о подобном поведении, вплоть до того момента, пока не начинают проявляться странные баги и глюки. Особо часто баги возникают при работе со ссылочными переменными.</p> <p>Рассмотрим такой пример:</p> <div class="codeblock"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />  </span><span style="color: #FF8000">//1<br />  </span><span style="color: #0000BB">$arr </span><span style="color: #007700">= </span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #0000BB">1</span><span style="color: #007700">,</span><span style="color: #0000BB">3</span><span style="color: #007700">);<br />  foreach( </span><span style="color: #0000BB">$arr </span><span style="color: #007700">as &amp;</span><span style="color: #0000BB">$item </span><span style="color: #007700">)<br />  {<br />    </span><span style="color: #0000BB">$item</span><span style="color: #007700">++;<br />  }<br />  </span><span style="color: #0000BB">print_r</span><span style="color: #007700">( </span><span style="color: #0000BB">$arr </span><span style="color: #007700">);<br />  </span><span style="color: #FF8000">//2<br />  </span><span style="color: #0000BB">$arr2 </span><span style="color: #007700">= </span><span style="color: #0000BB">range</span><span style="color: #007700">(</span><span style="color: #0000BB">101</span><span style="color: #007700">, </span><span style="color: #0000BB">103</span><span style="color: #007700">);<br />  foreach( </span><span style="color: #0000BB">$arr2 </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">$item </span><span style="color: #007700">)<br />  {<br />    </span><span style="color: #0000BB">$arr2</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">]++;<br />  }<br />  </span><span style="color: #0000BB">print_r</span><span style="color: #007700">( </span><span style="color: #0000BB">$arr2 </span><span style="color: #007700">);<br />  </span><span style="color: #0000BB">print_r</span><span style="color: #007700">( </span><span style="color: #0000BB">$arr </span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div> <p>В первом цикле использована ссылочная переменная $item. Результат выполнения вполне ожидаем - каждое значение массива увеличится на единицу.</p> <p>В результате выполнения второго цикла мы так же видим то, что и ожидаем - каждый элемент массива $arr2 был инкрементирован. Но если теперь проверить содержимое массива $arr, который был заполнен в первой половине примера, мы увидим то, чего явно не ожидали. Последний элемент массива $arr стал равен значению последнего элемента массива $arr2 до преобразования, т.е. 103. Разберемся в причинах подобного поведения.</p> <p>После выполнения первого цикла, переменная $item остается объявленной как ссылка на последний элемент массива $arr. Следовательно, в начале каждой итерации цикла, когда zend engine присваивает переменной $item значение следующего элемента массива $arr2, на самом деле это значение присваивается последнему элементу массива $arr. Таким образом, после выполнения последней итерации, значение последнего элемента массива $arr равняется значению последнего элемента массива $arr2 до преобразования.</p> <p>Если взять на вооружение простые рекомендации, подобных ситуаций можно избежать:<br /> 1) Никогда не стоит доверять своим старым, а тем более чужим переменным, т.е. тем, которые выше по коду уже использовались в других целях. Даже если сейчас все отлично, ваш коллега со временем может модифицировать код, или даже это можете сделать вы - в результате получите нежеланный, явно не понятный на первый взгляд эффект.<br /> 2) Если все-таки понадобится использовать старую переменную, то необходимо ее перед использованием деинициализировать функцией unset().<br /> 3) Приучите себя до и после использования всегда следить за своими и тем более за чужими переменными и очищать память от более не нужных данных.</p> <p>Но если вдруг что-то все же произошло, как же быстро локализовать место возникновения ошибки? В этом нам поможет функция var_dump(). Посмотрим, например, при помощи var_dump() на содержание массива $arr после выполнения второго цикла.</p> <p>array<br /> 0 =&gt; int 2<br /> 1 =&gt; int 3<br /> 2 =&gt; &amp;int 103</p> <p>Обратите внимание на символ &amp; перед последним элементов. Он говорит о том, что значение было записано не прямым присваиванием, а через указатель с правом на модификацию значения, попросту говоря через ссылку на значение. Останется всего лишь найти место, в котором ссылка протекла в посторонний код и перед повторным использованием очистить ее.</p> <p>Рекомендация 4 - для дебага скриптов предпочтительнее использовать функцию var_dump() вместо print_r().</p> <p>Учитесь на чужих ошибках, удачи.</p> </div></div></div><div class="field field-name-field-tags-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Теги: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/tags/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel">php</a></li><li class="taxonomy-term-reference-1"><a href="/taxonomy/term/110" typeof="skos:Concept" property="rdfs:label skos:prefLabel">variable</a></li></ul></div> Wed, 08 Feb 2012 16:01:39 +0000 Fastto 206 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/php-0#comments htmlspecialchars() в php 5.4 http://www.hi-lo.ru/blog/htmlspecialchars-php-54 <div class="field field-name-field-rubr-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Рубрика: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/development" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Разработка</a></li></ul></div><div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Вокруг новшеств php 5.4 ходит множество разговоров, слухов и сплетен. Некоторые весьма популярны, а о некоторых незаслуженно забывают. Я считаю, что одними из самых заслуживающих и самых ожидаемых являются изменения, связанные с кодировками, в частности с UTF-8. </p> <p>Многие разработчики знают, но забывают, а еще больше и не догадываются использовать 3-й параметр функции htmlspecialchars(), который указывает кодировку входящих данных. Вплоть до выхода php версии 5.4 значением по умолчанию для этого параметра было 'ISO-8859-1', но, наконец-то, начиная с версии php 5.4, значением по умолчанию стало 'UTF-8'. Если вы еще не установили себе php 5.4 или не собираетесь устанавливать, то самое время заглянуть в исходники и проверить, в правильной ли кодировке вы используете сейчас в своих проектах htmlspecialchars().</p> </div></div></div><div class="field field-name-field-tags-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Теги: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/taxonomy/term/106" typeof="skos:Concept" property="rdfs:label skos:prefLabel">htmlspecialchars</a></li><li class="taxonomy-term-reference-1"><a href="/tags/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel">php</a></li><li class="taxonomy-term-reference-2"><a href="/taxonomy/term/107" typeof="skos:Concept" property="rdfs:label skos:prefLabel">php 5.4</a></li></ul></div> Mon, 30 Jan 2012 21:11:18 +0000 Fastto 199 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/htmlspecialchars-php-54#comments Селекторы jQuery. Справочник http://www.hi-lo.ru/blog/jquery-0 <div class="field field-name-field-rubr-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Рубрика: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/development/coding" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Программирование</a></li></ul></div><div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Знать все селекторы jQuery конечно нужно, но знание это приходит с практикой, а до этого момента будет полезен краткий справочник - рабочий инструмент, при помощи которого можно в любой момент получить необходимую информацию о том или ином селекторе. Статья представляет собой таблицу, в которой категоризированно предоставлены все селекторы jQuery. Ссылка на статью - <a href="http://my-jquery.com/%D1%81%D0%B5%D0%BB%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D1%8B-jquery-%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D1%87%D0%BD%D0%B8%D0%BA/">Селекторы jQuery. Справочник</a></p> </div></div></div><div class="field field-name-field-tags-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Теги: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/taxonomy/term/104" typeof="skos:Concept" property="rdfs:label skos:prefLabel">jQuery</a></li><li class="taxonomy-term-reference-1"><a href="/taxonomy/term/105" typeof="skos:Concept" property="rdfs:label skos:prefLabel">селекторы jQuery</a></li></ul></div> Sat, 21 Jan 2012 19:43:23 +0000 Fastto 196 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/jquery-0#comments jQuery селектор классов http://www.hi-lo.ru/blog/jquery <div class="field field-name-field-rubr-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Рубрика: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/development/coding" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Программирование</a></li></ul></div><div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Класс - один из наиболее используемых атрибутов html-тегов. Использование селекторов классов является эффективным и производительным решением при написании client-side скриптов на языке Java Script. Библиотека jQuey в своем арсенале селекторов содержит так же и селектор классов. Описание возможностей и примеры использования селекторов классов jQuery рассмотрены в этой статье - <a target="_blank" title="jQuery селектор классов" href="http://my-jquery.com/jquery-%D1%81%D0%B5%D0%BB%D0%B5%D0%BA%D1%82%D0%BE%D1%80-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2/">jQuery селектор классов</a>.</p> </div></div></div> Tue, 17 Jan 2012 17:15:53 +0000 Fastto 193 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/jquery#comments Redis как сервис под Windows http://www.hi-lo.ru/blog/redis-windows <div class="field field-name-field-rubr-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Рубрика: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/sysadmin/database" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Базы данных</a></li></ul></div><div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Понадобилось на рабочей станции поднять инстанс редиса под Windows 7, да чтобы он сам стартовал вместе с системой. Сам порт редиса этого не умеет - выход нашелся с помощью команды sc:</p> <p>sc create redis binPath= "cmd /K C:\apps\redis\redis-server.exe" type= share start= auto</p> <p>Поскольку порт редиса отнюдь не сервис, его процесс завершался с ошибкой, но прокладка в виде cmd все решила.</p> </div></div></div> Tue, 20 Dec 2011 18:01:37 +0000 vadim 183 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/redis-windows#comments Мои заблуждения о массивах PHP http://www.hi-lo.ru/blog/php <div class="field field-name-field-rubr-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Рубрика: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/development/coding" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Программирование</a></li></ul></div><div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Буквально на днях, в ходе обсуждения фрагмента кода, я был поражен случайно открывшимся моим заблуждением относительно обработки массива в цикле <strong>foreach. </strong>В связи с этим было решено незамедлительно обновить свои знания в данном вопросе. В процессе маленького исследования был обнаружен один полезный прием, которым на моей памяти никто из знакомых программистов никогда не пользовался, но об этом позже. Итак...</p> <p>C самого первого своего знакомства с PHP я считал, что если на вход цикла <strong>foreach </strong>поступит пустой массив, то возникнет критическая ошибка. Это знание настолько глубоко поселилось в голове, что я даже представить себе не мог какое-то другое поведение цикла. На право и на лево раздавал советы про обязательную необходимость проверять массив перед циклом на существование внутри хоть одного значения. Теперь, наконец-то, я знаю что это абсолютно не так. Цикл <strong>foreach </strong>спокойно обрабатывает пустые массивы без всяких ошибок. Ошибка может возникнуть только если на вход в цикл поступил не массив, в этом случае необходимо лишь проверить является ли входной параметр массивом. Проверка осуществляется функцией PHP&nbsp;<a href="http://www.php.net/manual/en/function.is-array.php"><strong>is_array</strong></a>.</p> <p>Вспоминаю свое знакомство с PHP, как же я смог допустить возникновение подобной ситуации? Виной всему, как оказалось, стало допущение ряда мелких ошибок.&nbsp; Надеюсь моя история окажется полезной для кого нибудь.</p> <p>В те времена я задумался о смене места работы, но за плечами у меня было только 5 лет университета со знанием всего-всего, но по чуть-чуть, и 2 года программиста С++ на металлургическом предприятии, т.е. другими словами опыта не было совсем. Решено было попробовать себя программистом PHP - поехал в одну из web-студий по объявлению, общие знания по программированию помогли пройти собеседование и мне вручили тестовое задание - админ панель, базовое управление пользователями, в общем банальный <a href="http://www.hi-lo.ru/wiki/crud"><strong>CRUD </strong></a>с менеджментом. Задание было выполнено за 3 вечера, в ходе выполнения которого и был "изучен" PHP. Для удобства разработки был написан класс "общения" с БД. Класс реализовал простые базовые операции. Первая ошибка была допущена именно в нем, в методе <strong>getRows</strong>, который возвращал массив строк. В случае отсутствия результата метод возвращал <strong>false</strong>, следовательно если в результате запроса к БД не было получено ни одной строки, помещая далее результат &nbsp;метода в цикл, &nbsp;я получал ошибку. Сложилось мнение - если при отсутсвии строк ошибка, значит перед циклом нужно проверять значение на наличие строк ф-ей <strong><a href="http://www.php.net/manual/en/function.count.php">count</a>. </strong>Чуть позже, заглянув в результаты компиляции шаблона смарти, я заметил что и там перед каждым циклом выполняется условие, только на то, что это условие выглядит как<strong> is_array( $array )</strong> я внимания тогда не обратил. Это была ошибка номер 2. В результате такого стечения обстоятельств и был сформирован железный стереотип о необходимости постоянной проверки массива перед циклом.</p> <p style="text-align: center; "><em>Не повторяйте чужих ошибок, будте всегда внимательны и при возникновении ошибки всегда вдумывайтесь в ее смысл, а не бросайтесь сломя голову исправлять, только увидев номер строки и путь к файлу!&nbsp;</em></p> <p><strong>P.S.:</strong> Как и обещал в начале топика - излагаю один маленький полезный приемчик, который по моим личным наблюдениям мало кто использует.</p> <p>Иногда возникает необходимость пройтись по всем элементам массива и снабдить какждый элемент этого массива дополнительным параметром, который к примеру отражает текущее состояние элемента зависящее от внешних условий. Обычно это делают так:</p> <p><span style="color: rgb(255, 0, 0); "><strong>&lt;?php<br></strong></span><strong><span style="color: rgb(51, 51, 153); ">$rows</span></strong> = <span style="color: rgb(0, 0, 255); "><strong>Array</strong></span>( <span style="color: rgb(0, 0, 255); "><strong>Array</strong></span>( '<span style="color: rgb(153, 153, 153); ">ID</span>' =&gt; <strong><span style="color: rgb(255, 153, 0); ">1</span></strong>, '<span style="color: rgb(153, 153, 153); ">name</span>' =&gt; '<span style="color: rgb(153, 153, 153); ">Vasya</span>' ), <span style="color: rgb(0, 0, 255); "><strong>Array</strong></span>( '<span style="color: rgb(153, 153, 153); ">ID</span>' =&gt; <span style="color: rgb(255, 153, 0); "><strong>2</strong></span>, '<span style="color: rgb(153, 153, 153); ">name</span>' =&gt; '<span style="color: rgb(153, 153, 153); ">Petya</span>' ) );<br><span style="color: rgb(51, 51, 153); "><strong>foreach</strong></span>( <strong><span style="color: rgb(51, 51, 153); ">$rows</span></strong> <span style="color: rgb(0, 0, 255); ">AS</span> <span style="color: rgb(51, 51, 153); "><strong>$key</strong></span> =&gt; <strong><span style="color: rgb(51, 51, 153); ">$row</span></strong> )<br>{<br>&nbsp;&nbsp;<strong><span style="color: rgb(51, 51, 153); ">$rows</span></strong>[<span style="color: rgb(51, 51, 153); "><strong>$key</strong></span>]['<span style="color: rgb(153, 153, 153); ">newParam</span>'] = getNewParamValue( <strong><span style="color: rgb(51, 51, 153); ">$row</span></strong>['<span style="color: rgb(153, 153, 153); ">ID</span>'] );<br>}</p> <p>Многие не знают или забывают о том факте, что в цикл можно передать переменную не только по значению но и по ссылке, т.е. в результате тот же пример можно написать так:</p> <p><span style="color: rgb(255, 0, 0); "><strong>&lt;?php</strong></span><strong><br></strong><strong><span style="color: rgb(51, 51, 153); ">$rows</span></strong>&nbsp;=&nbsp;<span style="color: rgb(0, 0, 255); "><strong>Array</strong></span>(&nbsp;<span style="color: rgb(0, 0, 255); "><strong>Array</strong></span>( '<span style="color: rgb(153, 153, 153); ">ID</span>' =&gt; <span style="color: rgb(255, 153, 0); "><strong>1</strong></span>, '<span style="color: rgb(153, 153, 153); ">name</span>' =&gt; '<span style="color: rgb(153, 153, 153); ">Vasya</span>' ),&nbsp;<span style="color: rgb(0, 0, 255); "><strong>Array</strong></span>( '<span style="color: rgb(153, 153, 153); ">ID</span>' =&gt;<span style="color: rgb(255, 153, 0); "><strong> 2</strong></span>, '<span style="color: rgb(153, 153, 153); ">name</span>' =&gt; '<span style="color: rgb(153, 153, 153); ">Petya</span>' ) );<br><span style="color: rgb(51, 51, 153); "><strong>foreach</strong></span>(&nbsp;<strong><span style="color: rgb(51, 51, 153); ">$rows</span></strong>&nbsp;<span style="color: rgb(0, 0, 255); ">AS </span>&amp;<strong><span style="color: rgb(51, 51, 153); ">$row</span></strong>&nbsp;)<br>{<br><strong><span style="color: rgb(51, 51, 153); ">&nbsp; $row</span></strong>['<span style="color: rgb(153, 153, 153); ">newParam</span>'] = getNewParamValue(&nbsp;<strong><span style="color: rgb(51, 51, 153); ">$row</span></strong>['<span style="color: rgb(153, 153, 153); ">ID</span>'] );<br>}</p> <p>Производительность при таком подходе остается на том же самом уровне, но в целом читабельность кода повышается, особенно если дело касается работы с массивами со сложной структурой.</p> </div></div></div><div class="field field-name-field-tags-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Теги: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/tags/php" typeof="skos:Concept" property="rdfs:label skos:prefLabel">php</a></li><li class="taxonomy-term-reference-1"><a href="/taxonomy/term/100" typeof="skos:Concept" property="rdfs:label skos:prefLabel">foreach</a></li><li class="taxonomy-term-reference-2"><a href="/taxonomy/term/101" typeof="skos:Concept" property="rdfs:label skos:prefLabel">array</a></li></ul></div> Sat, 22 Oct 2011 12:45:33 +0000 Fastto 168 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/php#comments Проблема с правами на редактирование поля в Drupal http://www.hi-lo.ru/blog/problema-s-pravami-na-redactirovanie-polya-body-v-drupal <div class="field field-name-field-rubr-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Рубрика: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/sysadmin" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Администрирование</a></li></ul></div><div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Была у меня одна проблема с правами на редактирование полей после администратора. То есть, если администратор создавал или редактировал поле с основным описанием, то после него все поля можно было редактировать, кроме поля body (основная часть), хотя права на редактирования были установлены. Так вот "собака зарыта" была в правах на использование Форматов ввода. То есть Администратор пользовался в основном предустановленным Filtered HTML, а у обычного пользователя не было прав на использование этого формата (были лишь права на Plain text). Так во после установки прав на пользование этими форматами ввода, все стало работать, как нужно было по техническому заданию, то есть по принципу Википедии. </p> <p>Вот так вот, может кому-то поможет моя заметка, потому что решение я искал очень долго.</p> </div></div></div> Tue, 09 Aug 2011 09:49:22 +0000 vitaliy 138 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/problema-s-pravami-na-redactirovanie-polya-body-v-drupal#comments Raphaël—векторный JavaScript движек http://www.hi-lo.ru/blog/rapha-l-javascript <div class="field field-name-field-rubr-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Рубрика: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/development/coding" typeof="skos:Concept" property="rdfs:label skos:prefLabel">Программирование</a></li></ul></div><div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Когда я первый раз познакомился с библиотекой Raphaël - удивлению не было предела. Как так случилось, что о таком мощнейшем инструменте я никогда не слышал? Не прошло и 15 минут, как первый эксперимент увенчался успехом и мною было принято окончательное решение - любая задача, связанная с векторной графикой в браузере всегда будет реализована только при помощи этого замечательного инструмента. Итак, пришло время и вам познакомится с библиотекой Raphaël.</p> <p>Raphaël - это маленькая JavaScript-библиотека (размер ее минимизированной версии всего 60 кБ), которая многократно упростит вам работу с векторной графикой в браузере. Если вы например желаете получить возможность создавать персональные графики, редактировать изображения и манипулировать ими прямо в браузере - достичь этого с легкостью можно при помощи данной библиотеки.<br /> Raphaël использует SVG и VML в основе создания графики. Поэтому каждый создаваемый графический объект имеет также свою DOM-ноду, следовательно можно каждому объекту назначить JavaScript-обработчики событий или изменить их позже. В целом целью Raphaël является предоставление адаптера, который сделает работу с векторной графикой простой и кроссбраузерной.<br /> На данный момент Raphaël поддерживает Firefox 3.0+, Safari 3.0+, Chrome 5.0+, Opera 9.5+ и Internet Explorer 6.0+</p> <p>Пришло время опробовать Raphaël.<br /> 1) Качаем библиотеку:<br /><a href="http://github.com/DmitryBaranovskiy/raphael/raw/master/raphael-min.js">http://github.com/DmitryBaranovskiy/raphael/raw/master/raphael-min.js</a><br /> 2) Подключаем библиотеку:</p> <div class="codeblock"><code>&lt;script src="raphael-min.js" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;</code></div> <p>3) Собственно код примера:</p> <div class="codeblock"><code>&lt;script type="text/javascript"&gt;<br />  var paper = Raphael(10, 50, 320, 200);<br />  var circle = paper.circle(50, 40, 10);<br />  circle.attr("fill", "#f00");<br />  circle.attr("stroke", "#fff");<br />&lt;/script&gt;</code></div> <p>4) Запускаем созданный файл в браузере - все работает!</p> <p>Этот пример достаточно прост, но как нельзя лучше отображает легкость и понимание в использовании библиотеки</p> <p>Офф. сайт - <a href="http://raphaeljs.com/">http://raphaeljs.com/</a></p> </div></div></div><div class="field field-name-field-tags-blog field-type-taxonomy-term-reference field-label-inline clearfix"><h3 class="field-label">Теги: </h3><ul class="links inline"><li class="taxonomy-term-reference-0"><a href="/taxonomy/term/85" typeof="skos:Concept" property="rdfs:label skos:prefLabel">java script</a></li><li class="taxonomy-term-reference-1"><a href="/taxonomy/term/86" typeof="skos:Concept" property="rdfs:label skos:prefLabel">vector graphic</a></li></ul></div> Mon, 01 Aug 2011 10:57:44 +0000 Fastto 134 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/rapha-l-javascript#comments "Трудности перевода" в триггерах событий CMS Drupal http://www.hi-lo.ru/blog/drupal-trigger-translation <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Понадобилось как-то настроить отправку сообщений на почту администратора сайта при добавлении или изменении материалов сайта. В Drupal для этого есть инструмент Trigger, суть работы которого - при наступлении определенного события выполнить какое-то. Так вот была такая проблема: при добавлении нового материала почта приходила, но ссылка на добавленный материал не устанавливалась, в все из-за того, что я установил в качестве события просто "СОБЫТИЕ: ДОКУМЕНТ ДОБАВЛЕН ИЛИ ОБНОВЛЁН" - а нужно было установить выполнение действия на двух других событиях "СОБЫТИЕ: ДОКУМЕНТ ДОБАВЛЕН" и "СОБЫТИЕ: ДОКУМЕНТ ОБНОВЛЁН".</p> <p>А причина в том, что, по-моему, некорректно переведен интерфейс этого модуля. Получается необходимо понимать эти надписи так:</p> <p>"СОБЫТИЕ: ДОКУМЕНТ ДОБАВЛЕН ИЛИ ОБНОВЛЁН" => действие будет обработано непосредственно ПЕРЕД обработкой данного события<br /> "СОБЫТИЕ: ДОКУМЕНТ ДОБАВЛЕН" и "СОБЫТИЕ: ДОКУМЕНТ ОБНОВЛЁН" => действие будет обработано ПОСЛЕ выполнения данного события</p> <p>Вот такое вот наблюдение!</p> </div></div></div> Wed, 13 Jul 2011 08:12:33 +0000 vitaliy 124 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/drupal-trigger-translation#comments Передача массива в качестве параметра функции на языке C http://www.hi-lo.ru/blog/array-as-parameter-in-function-in-c-language <div class="field field-name-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even" property="content:encoded"><p>Не знал ранее, что при передаче массива в качестве параметра функции на языке С, на самом деле передается ссылка на этот массив и при изменении в функции элементов этого массива - все сохраняется в этом массиве. Если провести аналогию, то это похоже на передачу статической переменной, то есть все изменения в любом месте вне зависимости от области видимости данной переменной сохраняются. Хотя по логике вещей мы привыкли, что передаются значения (копии переменных) в функцию, и все изменения, проходящие внутри функции не сохраняются. Как говорится - будьте бдительны!</p> </div></div></div> Tue, 05 Jul 2011 14:40:11 +0000 vitaliy 121 at http://www.hi-lo.ru http://www.hi-lo.ru/blog/array-as-parameter-in-function-in-c-language#comments