2007-12-15

(Казнить [нельзя) помиловать]

Только что пришлось покапаться в исходниках vBulletin - ребята курят очень неслабую траву, весьма забористую...

После очередной модификации сайта при регистрации пользователя стало перебрасывать на совершенно экзистенциальный url вида :/forum/admincp.php - т.е. кудато пропал http из пути.

После часа ковыряний нашел следующее:

define('REQ_PROTOCOL', (isset($_SERVER['HTTPS']) AND (($_SERVER['HTTPS'] == 'on' OR $_SERVER['HTTPS'] == '1')) ? 'https' : 'http'));

Индийские программисты очень умные, очень наблюдательные, очень усидчевые... задницы, но всеже пару скобок проглядели... В результате REQ_PROTOCOL принимает значение false вместо положенного http.

 

Коментариев: 2

 
  2007-12-14

Фракталы

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

Студент нынче какойто хилый пошел, пришлось самому разбираться, вот она наша прелессссть.

Исходники можно скачать здесь

 

Коментариев: 1

 
  2007-12-06

Созерцательное программирование

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

Вот например новый термин - "Созерцательное программирование". Русский поиск в гугле не дает много результатов на это словосочетание, - оно является моей версией перевода термина Contemplative Programming.

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

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

 

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

 
  2007-11-27

PHP4: это не баг, это системная функция

Сегодня потратил несколько часов не поиск банальнейшего бага. Дело в том что в PHP ссылку нельзя сделать статической, так как я перешел уже на PHP5 то об этом я не всегда помню.

Не работает:

class SomeClass { function singleton(){ static $instance = null; if ($instance==null){ $instance =& new SomeClass(); } } }

Работает:

class SomeClass { function singleton(){ static $instance = null; if ($instance==null){ $instance = new SomeClass(); } } }

В пятом PHP будет работать только первый вариант, второй правда хотя и со скрипом, то тоже будет (будет ругаться чтобы к функции поставили модификатор static и не использовали никаких амперсандов у оператора new)

 

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

 
  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-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-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>
к недостаткам можно отнести отсутствие автообновления плагина, займусь этим как нибудь на досуге потом.
 

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