рейтинг
5 голос
сила
12.51

Что новенького →  Русский мануал убрали

Со страницы оф сайта http://www.php.net/download-docs.php убрали русский мануал по php. Кому-то мешал или поддерживать не смогли?

У нас остался http://doc.php5.com.ua/, правда не к php 5.3, но основной набор функций можно почитать на русском.
3

Что новенького →  CKEditor 3.0

FCKEditor, который выпускался на протяжении 6 лет с 2003 года переименовали в CKEditor нового поколения.

Демо можно посмотреть по ссылке http://ckeditor.com/demo

А здесь можно скачать http://ckeditor.com/download
3

MySQL →  Как я фиксил баг в MySql

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

Сотрудник сегодня скинул интересные запросы:

mysql> select * from db1.users t1 inner join db2.users t2 on t1.login=t2.username;

Empty set (1.61 sec)

mysql> select * from db1.users t1 where t1.login='igor';

1 row in set (0.11 sec)

mysql> select * from db2.users t2 where t2.username='igor';

1 row in set (0.03 sec)

Таблица t2 была создана до него, t1 создавал он сам.
В общем, он бил себя в грудь и орал, что нашел баг в мускуле. Я не верю ни в такие баги, ни в мистику (меня этому научили уже давно). Если вы видите такой «баг», то для начала найдите все баги у себя.

Не поверил я ему. Полез в эти базы, появился просто спортивный интерес:) Запускаю запросы, действительно отработали так, как он мне их сбросил. Я умышленно изменил таблицы и не показал результаты работы запросов, так вот, меня насторожило, что первый запрос выдал в результате поле login 'IGOR', а второй запрос — поле username 'igor'.

А он в качестве аргумента, что баг найден сделал так:
mysql> select if('IGOR'='igor',1,0);

+-----------------------+
| if('IGOR'='igor',1,0) |
+-----------------------+
| 1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select if('IGOR'!='igor',1,0);

+------------------------+
| if('IGOR'!='igor',1,0) |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.00 sec)

Сука, думаю, вот тебе и баг у мускула. Полез дальше в структуру таблиц, а там я вижу.

t1.login — сравнение стоит utf8_bin
t2.username — сравнение стоит utf8_general_ci

utf8_bin — хранит буковки 'G' и 'g' по-разному.
Поменял utf8_bin на utf8_general_ci и пофиксил баг у mysql:)
3

А мне интересно →  Любите Google?

А вы уже с Gmail?


А вы уже с Google Chrome?


Что вы знаете о Google X prize?


Пользуетесь Google Планета Земля?


А Google Картами?


Я еще пользую пикасу и гугл документы.

А чем еще пользуетесь?

Ютуб?
2

JavaScript программирование →  Оптимизация загрузки JavaScript файлов на веб-странице (асинхронная загрузка скриптов)

Привет, умники:)
Сегодня мы будем заниматься дрочерством, а именно — оптимизировать загрузку HTML страницы. В наше время информационных технологий без JavaScript в веб-разработке никуда. И чем дальше, тем больше нагружаются страницы этим самым яваскриптом. Как известно, объявление js файлов лежит у нас в
<head>
. И, пока не подтянутся эти js файлы, загрузка страницы блокируется, если их много, то это может быть не очень приятным моментом. Что делать?

Создаем функцию загрузки js файла. А-ля include:
function include(url, callback){

    var script = document.createElement("script")
    script.type = "text/javascript";

    if (script.readyState){  //IE
        script.onreadystatechange = function(){
            if (script.readyState == "loaded" ||
                    script.readyState == "complete"){
                script.onreadystatechange = null;
                callback();
            }
        };
    } else {  //Others
        script.onload = function(){
            callback();
        };
    }

    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
}

И ложим ее в файлик include.js.
Далее после тега
</body>
прописываем наш скрипт include.js и загрузку необходимого нам js файлов.

<script type="text/javascript" src="http://your.com/include.js"></script>
<script type="text/javascript">
include("http://your.com/main.js", function(){
    //initialization code
});
</script>


Прикол в том, что все сводится к этим двум файлам include.js и main.js и мы имеем два http запроса. Скорее всего у вас на странице больше двух js файлов, тогда необходимо провести предварительную подготовку при помощи Sprockets, mod_concat или combo handler, сведя все файлы к main.js

Зачем добавлять именно после тега
</body>
. Будет гарантия что мы получим все необходимые нам DOM элементы и не нужно использовать window.onload.

И еще, для фанатов JQuery. Он тоже так умеет http://docs.jquery.com/Ajax/jQuery.getScript.
2

Что новенького →  Есть две хорошие новости. Zend Framework 1.9 и Zend Studio 7.0

Собственно, сабж.

Zend Framework 1.9
Zend_Queue (поддержка очередей сообщений), расширение Zend_Rest, мощный компонент для работы RSS/Atom фидами, поддержка PHP 5.3.

Zend Studio 7.0 — самый офигенный IDE для php
2

PHP программирование →  Парсим линки на PHP

Такое всегда должно быть под рукой:
$url = "http://artlebedev.kiev.ua/";
$input = @file_get_contents($url) or die('Could not access file: ' . $url);
$regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>";
if(preg_match_all("/$regexp/siU", $input, $matches)) {
   foreach($matches as $match) {
      # $match[2] = link address
      # $match[3] = link text
   }
}


have fun:)
1

Фреймворки →  Кеширование в Codeigniter при помощи Zend Cache

Codeigniter на столько мощный фреймворк, что приходится пользоваться недофреймфорком Zend Framework, слышал аргумент против Зенд Фреймворка: «это тупо набор классов», скажу, что это нихера не набор классов, а классы в ZF хороши. Поэтому будем пользовать Zend Cache для еширования в Codeigniter.

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

Использование компонента Zend Cache в CodeIgniter неудобно, поэтому решил написать свою библиотеку, которя будет использовать этот механизм кэширования и будет проста в применении с CodeIgniter. Теперь немного опишу своё творение, и расскажу как его применить.

Пример применения библиотеки


Для начала нужно сконфигурировать библиотеку, для этого нужно создать файл cache.php в /aplication/config/ примерно так:

//Путь до библиотеки Zend
$config['path_to_zend']  = '';

//Название фронтэнда
$config['frontend'] = 'Core';
//Название бэкэнда
$config['backend']  = 'File';

//Опции фронтэнда
$config['frontendOption']  = array(
       'lifetime'                  => null,
       'automatic_cleaning_factor' => 0,
       'automatic_serialization'    => true
);

//Опции бэкэнда
$config['backendOption']  = array(
    'cache_dir'              => APPPATH.'cache/',
    'read_control_type'      => 'strlen',
    'file_locking'           => false,
    'hashed_directory_level' => 0,
    'file_name_prefix'         => 'cache'
);


Здесь все ключи массива должны называться как и в документации Zend Cache. Все значения в примере данного конфига демонстрационные, вы сами должны подобрать необходимые для себя параметры.
Теперь библиотека настроена и можно перейти к её применению.
Для загрузки используем уже знакомый нами метод:

$this->load->library('Cache');

Пример 1:


if ( ! $end = $this->cache->load('name_ceche') ) {

    $blog = $this->db->get("blog");
    $category = $this->db->get("category");

    $end['content'] = $blog->result();
    $end['category'] = $category->result();

    $this->cache->save($end, 'name_ceche', array('page1', 'blog'));
}


В первом примере, мы кэшируем целый массив, это возможно если в настройках фронтенда параметр 'automatic_serialization' учтановлен в true.
В таком случае мы можем сохранить в кэш данные примо из базы данных или сразу из нескольких баз данных, либо перед их кэшированием можно как то их обработать что бы не тратить ресурсы сервера потом. Таким образом мы избавляемся от запросов к базе данных (в данном случае двух) и вместо этого подгружаем файл, что выполняется быстрее.

Пример 2:


if ( ! $end = $this->cache->load('name_ceche') ) {

    $blog = $this->db->get("blog");

    $data['content'] = $blog->result();

    $end = $this->load->view('myfile', $data, true);
   
    $this->cache->save($end, 'name_ceche', array('page1', 'blog'));
}


Во втором примере мы видим что кэшируется уже не массив с данными а целая часть страницы. Такой метод позволяет кэшировать данные которые не требуют частого обновления (например список категорий на странице, облако тэгов и т.д.) либо генерация этих данных очень ресурсоёмка и имеет смысл сохранить их на небольшой промежуток времени. И в данном случае опцию 'automatic_serialization' не обязательно устанавливать в true.

Пример 3:


$this->cache->remove('name_ceche');
$this->cache->clean('page1');
$this->cache->clean('blog');


В примере №3 показаны способы удаления кэша который мы создали ранее, в примерах 1 и 2. Но заметьте сделать что это можно сделать разными способами.
С помощью первого метода можно удалить кэш по его уникальному имени, с помощью второго и третьего метода мы сделаем тоже самое но используя ни его имя, а тэги которые были присвоены кэшу. Это позволяет удобно управлять кэшем, например можно удалить кэш категорий только с определённой страницы, задав при сохранении определённые тэги.

Подробную информацию о том для чего определённые настройки и описание бэкендов и фронтэндов не приводил т.к. эта информация есть на русском языке в документации к Zend Cache.

Скачать:
CI-ZendCache.zip
1

JavaScript программирование →  Мягкий (smooth) cкролл (прокрутка, scroll) окна (блока) при помощи JQuery


function enable_smooth_scroll() {
    function filterPath(string) {
        return string
                .replace(/^\//,'')
                .replace(/(index|default).[a-zA-Z]{3,4}$/,'')
                .replace(/\/$/,'');
    }

    var locationPath = filterPath(location.pathname);
   
    var scrollElement = 'html, body';
    $('html, body').each(function () {
        var initScrollTop = $(this).attr('scrollTop');
        $(this).attr('scrollTop', initScrollTop + 1);
        if ($(this).attr('scrollTop') == initScrollTop + 1) {
            scrollElement = this.nodeName.toLowerCase();
            $(this).attr('scrollTop', initScrollTop);
            return false;
        }    
    });
   
    $('a[href*=#]').each(function() {
        var thisPath = filterPath(this.pathname) || locationPath;
        if  (   locationPath == thisPath
                && (location.hostname == this.hostname || !this.hostname)
                && this.hash.replace(/#/, '')
            ) {
                if ($(this.hash).length) {
                    $(this).click(function(event) {
                        var targetOffset = $(this.hash).offset().top;
                        var target = this.hash;
                        event.preventDefault();
                        $(scrollElement).animate(
                            {scrollTop: targetOffset},
                            500,
                            function() {
                                location.hash = target;
                        });
                    });
                }
        }
    });
}
 


Что делать с функцией


В html прописываем:

<script>
$(document).ready(function() {
    enable_smooth_scroll();
});
</script>
<a href="#fuck">ХУЙ</a>
<div id="fuck"></div> <!-- Размещаем блок в качестве якоря туда, куда нужно крутить. Это не обязательно должен быть div -->
 


UPD: http://demo.php5.com.ua/smooth-scroll/ добавил демо

--
На правах рекламы: Уроки по фотошоп
--
1

Говнокод →  От индусов

[1:42:08 PM] Sergio: сцуко писец, у индусов реально мозги в обратную сторону работают, нашел класс, написаный одним индусом, так у него в примере такая хрень:

for($i=$tot;$i>0;$i--)

обычные люди написали бы

for($i=1;$i<=$tot;$i++)

))
-2
←  сюда    туда  →
1 2 3 4 5 6 7 8 9