2007-11-15

Перебираем XML ноды

Обычно я использлую цикл while когда нужно сделать итерацию по дочерним элементам XML нода, а тут решил что цикл for для этих целей подходит гораздо лучше.

было:

var item = element.firstChild; while(item!=null){ if ((item.nodeType==1) and (item.nodeName=='tagname') { //здесь код } item = item.nextSibling; }

стало:

for(var item = element.firstChild;item!=null;item = item.nextSibling;){ if ((item.nodeType==1) and (item.nodeName=='tagname') { //здесь код } }
 

Оставить комментарий

 
  2007-11-10

Статические пременные класса vs. суперглобальных переменных

Идея глобальных переменных просто замечательная, однако многие не рекомендуют их использовать, т.к. это нарушает архитектуру программы и может привести к непредвиденным результатам, так это или не так, однако, наряду с недостатками есть у них и достоинства - к ним всегда можно обратиться из любого места в программе, особенно не заморачиваясь.

В PHP есть также т.н. суперглобальные переменные - $_POST, $_GET.

Уж не знаю почему разработчики их допустили, в ведь у суперголобальных переменных недостатки глобальных переменных становятся супернедостатками. Ну да не об этом речь.

Захотелось мне сделать свои суперглобальные переменные куда я хочу поместить значения из $_POST и $_GET, но без magic_quotes.

Зачем это нужно? Да просто мне не очень хотелось портить оригинальные значения переменных из соображений универсальности кода.

Как быть? Суперглобальные переменные нельзя создать - они накрепко зашиты в PHP и новые суперглобальные переменные сделать невозможно, но я нашел один выход из данной ситуации.

PHP5 позволяет создавать статические переменные класса, т.к. область видимости класса - весь код, то и полученная переменная ведет себя как суперглобальная. Красота.

class Site{ static $POST; static $GET; static $COOKIE; static function stripslashes($val){ $type = gettype($val); if ($type=='string'){ return stripslashes($val); } elseif($type=='array'){ $var1 = array(); foreach($val as $key=>$value){ $var1[$key] = Site::stripslashes($val[$key]); } return $var1; } else { return $val; } } static function initSite(){ if (ini_get('magic_quotes_gpc')){ Site::$GET = Site::stripslashes($_GET); Site::$POST = Site::stripslashes($_POST); Site::$COOKIE = Site::stripslashes($_COOKIE); } else { Site::$GET = $_GET; Site::$POST = $_POST; Site::$COOKIE = $_COOKIE; } } } Site::initSite();

При этом полученные переменные Site::$POST и Site::$GET ведут себя также как и аналогичные классические аналоги $_POST и $_GET.

 

Оставить комментарий

 
  2007-11-09

Microsoft forever!

Это лучшее изобретение после стержней из синей непрозрачной пластмассы для шариковых ручек с синими чернилами - Прогрессбар, который не показывает прогресс.

Mикрософт и раньше радовал подобными шедеврами, но сейчас порадовал особенно. После того как он минут пятнадцать пытался скачать обновления, я снес процесс нахер и запустил без скачивания обновлений ибо непонятно будет он скачивать обновления еще пятнадцать минут или еше пятнадцать часов.

 

Оставить комментарий

 
  2007-11-09

Бритва Оккама

Хотел было сделать новый раздел на сайте куда можно будет записывать хорошие афоризмы и просто интересные мысли, но первое что бы я туда записал было бы "entia non sunt multiplicanda praeter necessitatem" - Не множь сущностей без необходимости.

Так что идея с созданием нового раздела отпала сама собой. Значит будем улучшать раздел с блогами :)))

 

Оставить комментарий

 
  2007-11-08

Дзен-программизм

Недавно на баше наткнулся на симпатичный пост

Возможно, такой код на самом деле имеет право на существование, ведь в отличие от матeматики в программировании от перемены мест слагаемых сумма может измениться, особенно, если слагаемые имеют разный тип.

Вот если написать простейший код на JavaScript
<html> <head> <title>Дзен-программизм</title> </head> <script type="text/javascript"> intQuanty = 1; intQuanty = intQuanty + 0; alert(intQuanty); </script> </html>

Результат выполнения программы будет "1" как и следовало ожидать.

Однако стоит сделать переменную intQuanty строковой, то результат будет совсем другой

<html> <head> <title>Дзен-программизм</title> </head> <script type="text/javascript"> intQuanty = "1"; intQuanty = intQuanty + 0; alert(intQuanty); </script> </html>

Что и требовалось доказать! Конечно ноль лучше бы поставить в кавычки, однако для того чтобы запутать всех в конец можно и так оставить.

Думаю, если сделать аналогичные эксперименты на других языках результаты получатся даже интереснее.

Однажды показал такой фокус одинеснице - так она на меня смотрела как на прокаженного.

 

Оставить комментарий

 
  2007-11-06

Улучшения

Сегодня забил на работу и целый день обкатывал-улучшал сайт. Правда улучшений так и не видно, все они прошли на уровне ядра. Однако теперь на сайте можно комментировать блоги, и регистрироваться, хотя качество этих сервисов прямо скажем все еще далеко от того который я вижу идеалом. Поэтому постараютсь в ближайшее время это все довести до более менее хорошего качества.

 

Оставить комментарий

 
  2007-10-31

Усовершенстовования на сайте

Таки доделал наконец форму для писания блогов на самом сайте, теперь процесс написания блога будет не таким мучительным - раньше я просто писал в PHPMyAdmin, теперь для себя любиного сделал отдельную форму на сайте, теперь буду писать блоги гораздо чаще.
 

Оставить комментарий

 
  2007-10-17

Как заработать своей головой

Существует мнение, что работая на дядю много не заработаешь. Так почему бы на уйти в свободное плаванье и не стать свободным художником или как модно сейчас говорить - фрилансером. Что для этого нужно? Да прежде всего быть класным специалистом, иметь кучу амбиций и знать язык.

Если все это вам подходит - то для специально для вас я написал небольшую статью, которую разместил на сайте.

 

Оставить комментарий

 
  2007-10-16

Ноль или не ноль.

Сегодня обнаружил любопытное свойство события onsubmit элемента form. Оказывается чтобы предотвратить посылку формы нужно возвратить имено значение false. Если вернуть ноль то форма все равно посылается. Такое поведение свойственно FF , IE, Safari и Опере. Тоесть имеет значение что возвращается Ноль или False. Вот код примера.
<html>
<head>
<script type="text/javascript">
//<!--
function test(form){
  if (form.s.value=='1'){
     return false;
  }
  else {
     return 0;
  }
}
window.onload = function(){alert('loaded')};

//-->
</script>
</head>
<body>


<form method="post" action="" onsubmit="return test(this)">

<select name="s">
<option value="1"> Return false;</option>
<option value="0"> Return 0;</option>
</select>

<input type="submit" />
</form>

</body>
</html>
Живой пример:
 

Оставить комментарий

 
  2007-10-12

Семь бед — один embed

Сегодня встала задача сделать страничку с ютубовскими мувиками валидной в XHTML Transitional. Сама по себе задачка решена давно,  можно использовать для этих целей SWFObject, но он зараза никак wmode не позволяет менять, или я просто не умею это делать. Кроме того синтаксис его использования какой-то громоздкий и некрасивый. Решил своими силами сделать аналог посимпатичнее.
Конечно за безбаговость не ручаюсь но потестировал на IE6, IE7, в Опере, FF и Sаfari.
Самое интересное что код с тегом Object нигде не понадобился. Я то думал что он нужен для эксплорера, оказывается что шестой эксплорер тег Object кушать наотрез отказался, а вот EMBED скушал за милую душу.

Вот что получтилось:
flasher.js

function flasher(){
 this.attr = {'wmode':'transparent','type':'application/x-shockwave-flash'};
 var i;
 for(i=0;i<arguments.length;i=i+2){
     this.attr[arguments[i]] = arguments[i+1];
 }
}

flasher.prototype.write = function(element){
    var el = document.getElementById(element);
    var args = '';
    for(key in this.attr){
      args = args + ' ' + key+'='+this.attr[key];
    }   
    el.innerHTML = '<embed '+args+'></embed>';
}


как это использовать:
<div style="width:425px;margin:10px auto;" id="darren_dicke"><!--Darren Dicke--></div>
<script type="text/javascript">
// <![CDATA[         
    var fo = new flasher("src", "http://www.youtube.com/v/g3Y_mQA0E0A", "width","425", "height","350" );
    fo.write("darren_dicke");
// ]]>
</script>
к недостаткам можно отнести отсутствие автообновления плагина, займусь этим как нибудь на досуге потом.
 

Оставить комментарий