четверг, 23 декабря 2010 г.

CSS: Наследование

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

Vim: Небольшой справочник

Я давно использую Vim в качестве основного редактора. И хотя над большими проектами работаю в eclipse, для внесения незначительных правок проще использовать Vim, чем ждать загрузки eclipse. Но Vim не совсем "простой текстовый редактор" у него три режима работы и множество команд. Изучение команд и возможностей Vim занимает время, но потраченное на изучение время быстро окупается.

Основные команды Vim очень простые, но сочетание простых команд может быть довольно мощным инструментом.

среда, 22 декабря 2010 г.

CSS: Свойство position

Свойство position распространяется на все элементы и может иметь одно из пяти возможных значений:
  • static
  • relative
  • absolute
  • fixed
  • inherit

понедельник, 20 декабря 2010 г.

CSS: Значение свойства: inherit

Хотя некоторые характеристики в CSS наследуются автоматически, могут быть ситуации когда необходимо увеличить вес наследуемого свойства. Указание значения inherit для любого свойства CSS, применённого к элементу передаст вычисленное значение свойства элемента-родителя данному элементу. Указав в авторском стиле, что свойство наследует своё значение от предка, вы можете увеличить его вес.

суббота, 18 декабря 2010 г.

DX Auth: Примеры. Пример с правами доступа

В последнем фрагменте перевода, руководства пользователя библиотеки DX Auth фреймворка CodeIgniter, мы рассмотрим пример установки прав доступа используя модель application/models/dx_auth/permissions.php.

пятница, 17 декабря 2010 г.

DX Auth: Примеры. Пример использования reCAPTCHA

Десятая часть перевода документации библиотеки авторизации DX Auth для фреймворка CodeIgniter.

Рассмотрим расширенный пример контроллера Auth, демонстрирующий возможность использования reCAPTCHA с библиотекой DX Auth. Убедитесь, что вы указали общий и личный ключ в файле конфигурации, иначе пример не будет работать.

.NET.RU, .ORG.RU, и .PP.RU на сопровождение в RU-CENTER

Пришло письмо "счастья" от RIPN:

среда, 15 декабря 2010 г.

DX Auth: Примеры. Расширенный пример

Девятая часть перевода документации библиотеки авторизации DX Auth для фреймворка CodeIgniter.
Это более расширенный пример использования библиотеки DX Auth, для реализации контроллера Auth.
Все пояснения вы можете увидеть в комментариях кода контроллера.

DX Auth: Примеры. Простой пример

Перед тестированием пример убедитесь, что вы установили DX Auth в соответствии с инструкцией.

Библиотека DX Auth довольно проста в использовании, например создадим контроллер Auth, с классом Auth.

воскресенье, 12 декабря 2010 г.

DX Auth: Руководство пользователя. Модели.

Шестая часть перевода документации библиотеки авторизации DX Auth для фреймворка CodeIgniter.

Библиотека DX Auth поставляется с несколькими моделями, которые расположены в каталоге 'models/dx_auth/'

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

Итак, вот список моделей расположенных в каталоге 'models/dx_auth/':

  • users.php содержит набор функций для работы с таблицей 'DX_users_table'
  • user_profile.php содержит набор функций для работы с таблицей 'DX_user_profile_table'
  • user_temp.php содержит набор функций для работы с таблицей 'DX_user_temp_table'
  • user_autologin.php содержит набор функций для работы с таблицей 'DX_user_autologin'
  • roles.php содержит набор функций для работы с таблицей 'DX_roles_table'
  • permissions.php содержит набор функций для работы с таблицей 'DX_permissions_table'
  • login_attempts.php содержит набор функций для работы с таблицей 'DX_login_attempts_table'

DX Auth: Руководство пользователя. Конфигурация

Пятая часть перевода документации библиотеки авторизации DX Auth для фреймворка CodeIgniter.

Это файл конфигурации библиотеки DX Auth. Все параметры прокомментированы в коде.

DX Auth: Руководство пользователя. События

Четвёртая часть перевода документации библиотеки авторизации DX Auth для фреймворка CodeIgniter.

События, функции которые вызываются при определённых условиях. В данном случае срабатывание происходит, когда их вызывают определённые функции библиотеки DX Auth. Для обработки этих событий вам нужно открыть 'libraries/DX_Auth_Event.php' и разместить ваш код в нужных функциях - обработчиках событий.

понедельник, 6 декабря 2010 г.

DX Auth: Руководство пользователя. Справочник по функциям класса

Третья часть перевода документации библиотеки авторизации DX Auth для фреймворка CodeIgniter.


Далее приведён список функций которые вы можете использовать в работе с библиотекой DX Auth.

  • Основные функции
  • reCAPTCHA функции
  • Устаревшие функции

воскресенье, 5 декабря 2010 г.

DX Auth: Руководство пользователя. Начало

Вторая часть перевода документации библиотеки авторизации DX Auth для фреймворка CodeIgniter.

После выполнения установки DX Auth с примерами входящими в комплект и настройкой файла application/config/config.php вы можете увидеть простой пример работы приложения с подключенной библиотекой.

Что вы можете сделать:

  • {Ваш CI url}/auth/login/ - вход на сайт
  • {Ваш CI url}/auth/logout/ - выход с сайта
  • {Ваш CI url}/auth/register/ - регистрация нового пользователя
  • {Ваш CI url}/auth/register_recaptcha/ - регистрация нового пользователя с использованием reCAPTCHA
  • {Ваш CI url}/auth/forgot_password/ - восстановление забытого пароля
  • {Ваш CI url}/auth/change_password/ - смена пароля
  • {Ваш CI url}/auth/cancel_account/ - удаление аккаунта вошедшего пользователя

Для доступа в панель управления вам нужно зайти под пользователем 'admin' или другим пользователем у роли которого есть доступ к администрированию.

  • {Ваш CI url}/backend/users/ - для управления пользователями
  • {Ваш CI url}/backend/unactivated_users/ - для управления не активированными пользователями
  • {Ваш CI url}/backend/roles/ - для управления ролями
  • {Ваш CI url}/backend/uri_permissions/ - для управления URI разрешениями
  • {Ваш CI url}/backend/custom_permissions/ - для управления пользовательскими разрешениями

Обычно {Ваш CI url} состоит из комбинации 'base_url' и 'index_page' вашего конфигурационного файла.

CodeIgniter: библиотека DX Auth

DX Auth библиотека авторизации для фреймворка CodeIgniter. Даёт возможность легко подключать к вашему проекту гибкую систему авторизации, настраиваемую от простой до полной системы аутентификации.

DX Auth позволяет использовать интернационализацию настраиваемую через языковые файлы.

Библиотека DX Auth основана на библиотеке CL Auth 0.2.5 разработанной Джейсоном Эшдауном (Jason Ashdown).

суббота, 4 декабря 2010 г.

Vim: Табуляция и пробелы

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

Vim предлагает довольно гибкий контроль над отступами и табуляцией.

среда, 1 декабря 2010 г.

CSS: Убираем отступы у списка ссылок

При создании блока со списком ссылок обычно рекомендуется использовать свойство display с атрибутами block или inline-block, что позволит увеличить размер активного поля ссылки. Большие активные поля ссылок улучшают юзабилити элементов, по крупным элементам проще попасть мышью.

вторник, 30 ноября 2010 г.

Ion Auth: Справочник по функциям класса

Вторая часть перевода документации по системе авторизации Ion Auth для CodeIgniter. как следует из названия, в этой части описываются методы библиотеки ion_auth

Первая часть: CodeIgniter: библиотека Ion Auth

Методы доступные в моделе вызываются через контроллер с помощью "магических" методов PHP5 . В своих приложениях вы не должны использовать вызовы, типа ion_auth_model->method()

Репозитарий github с Ion Auth

понедельник, 29 ноября 2010 г.

CodeIgniter: библиотека Ion Auth

Ion Auth - это простая и легковесная библиотека авторизации для CodeIgniter, разработанная Беном Эдмундсом.

Огромное преимущество этой системы в том, что она работоспособна практически из "коробки" и требует минимум настроек для своей полноценной работы. Но это не означает, что её нельзя кастомизировать под свои нужды.

Библиотека Ion Auth, является дальнейшим развитием системы Redux Auth для работы с пользователями

пятница, 26 ноября 2010 г.

Vim: отображение скрытых символов

Эта статья является вольным переводом http://vimcasts.org/episodes/show-invisibles/, сделанным для себя. В дальнейшем планирую перевести остальные скринкасты.

Спецсимволы

В Vim`е можно включить отображение скрытых символов, таких как символы табуляции и перевода строки, при помощи команды :set list. Скрыть спецсимволы можно с помощь команды :set nolist или :set list!.

четверг, 25 ноября 2010 г.

Решение проблемы с подвисаниями Opera


На машине использовался HandyCache для кэширования и блокирования ненужного контента.

В настройках браузера не была включена опция использования HTTP 1.1. для proxy-сервера. После включения этой опции подвисания при загрузки страниц прекратились.

пятница, 10 сентября 2010 г.

Отправка RAW_POST_DATA средствами php

Столкнулся с сабжем. Вот, что получилось средствами php:

<?php
$host = 'localhost';
$path = '/test.php';
$port= 80;
$data = 'Some data';

$fp = fsockopen("$host",$port, $errno, $errstr);
if (!$fp) {
 echo "$errstr ($errno) <br/>\n";
}
else {
 $out = "POST $path HTTP/1.0\r\n"
  ."Host: $host\r\n"
  ."Content-Type: text/html\r\n"
  ."Content-Length: ".strlen($data)."\r\n"
  ."Connection: close\r\n"
  ."\r\n"
  .$data;

 fwrite($fp, $out);
 echo "<pre>";
 while (!feof($fp)) {
  echo fgets($fp, 128);
 }
 fclose($fp);
}
?>

P.S. После питона стал пропускать ";"

пятница, 30 июля 2010 г.

Python: Генератор ipfilter.dat для uTorrent

Начал изучать Python, а т.к. на практике дело движется веселее и имеется потребность в генерации свежих фильтров для uTorrent'а, начал писать генератор ipfilter.dat из имеющегося списка подсетей.

Есть несколько специфических особенностей генератора:

1. Адреса и маски подсетей хранятся в двоичном формате. Это было сделано для удобства отладки.

2. Т.к. данные в двоичном виде в питоне, на самом деле, хранятся в виде строки, то с этим возникают некоторые проблемы. Для произведения математических операций приходится преобразовывать в int. Например для получения следующего ip адреса приходится городить такую конструкцию bin2ip(bin(int(File[i][1],2) + 1)). С шестнадцатиричным ещё не разбирался, если он храниться не ввиде строки, то переведу на него. Тем более нет большой разницы в преобразовании ip адреса из bin'а или hex'a, бъём строку на 4 подстроки, которые преобразуем в числа.

3. Первоначально в регэкспе на парсинг диапазона вида: xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy, между адресом и маской стоял пробел, который в последствии заменил на \s+, ибо попалась запись в которой разделителем была табуляция.

Сырцы, как обычно на googlecode

P.S. Если есть конструктивные замечания и предложения по коду, буду рад услышать и обсудить.

воскресенье, 20 июня 2010 г.

Test post from the googlecl

I'm posting from commanf line

GoogleCL - консольная утилита для сервисов Google

Google анонсировала консольную утилиту для работы со своими сервисам.

Подерживаются Blogger, Calendar, Contacts, Docs, Picasa и Youtube.

Примеры команд

Blogger

  • google blogger post --tags "GoogleCL, awesome" --title "Test Post" "I'm posting from the command line"
  • google blogger post blogpost.txt
  • google blogger list title,url-site # List posts
  • google blogger delete --title "Test Post"
  • google delete --title "Silly post number [0-9]*" # Delete posts matching regex
  • google tag --title "Dev post" --tags "Python, software" # label an existing post

Calendar

  • google calendar add "Dinner party with George today at 6pm" # add event to calendar
  • google calendar today # List events for today only.
  • google calendar list --date 2010-06-01,2010-06-30 # List events.
  • google calendar delete --title "Dinner party with George" # Delete an event.

Contacts

  • google contacts add "J. Random Hacker, jrandom@example.com"
  • google contacts list name,email --title "J. Random Hacker"
  • google contacts delete --title "J. Random Hacker"

Docs

  • google docs delete --title "Evidence"
  • google docs list title,url-direct --delimiter ": " # list docs
  • google docs upload the_bobs.csv ~/work/docs_to_share/*

gdata-python-client >= 1.3.0 ONLY

  • google docs edit --title "Shopping list" --editor vim
  • google docs get --title "Homework [0-9]*"

Picasa

  • google picasa create --title "Vermont Test" --tags Vermont vermont.jpg
  • google picasa get --title "Vermont Test" /path/to/download/folder
  • google picasa list title,url-direct --query "A tag"
  • google picasa post --title "Vermont Test" ~/old_photos/*.jpg # Add to an album
  • google picasa tag --title "Vermont Test" --tags "places"
  • google picasa delete --title "Vermont Test" # delete entire album

Youtube

  • google youtube post --category Education --devtags GoogleCL killer_robots.avi
  • google youtube delete --title "killer_robots.avi"
  • google youtube list # list my videos
  • google youtube tag -n ".*robot.*" --tags robot

P.S.: Установка GoogleCL под WinXP [eng]

P.P.S.: У меня заработало, но есть проблемы с отображением unicode в виндозной консоле.

Авторизация в сервисах Google происходит через браузер установленный по умолчанию, но можно в конфиге указать любой другой, через который будет происходить авторизация

Свой конфигурационный файл я обнаружил: c:\Documents and Settings\%user_name%\.googlecl\config

среда, 19 мая 2010 г.

Яндекс: Методы управления поведением робота

Мета-теги

Мета-теги позволяют вебмастерам указывать метаданные о странице сайта. Ряд мета-тегов также используется роботами поисковых систем. Робот Яндекса учитывает содержание следующих тегов:

  • <meta name="Keywords" content="..."/> — может учитываться при определении соответствия страницы поисковым запросам,
  • <meta name="Description content="..."/> — содержание данного тега может использоваться в сниппетах (описаниях сайтов на странице результатов поиска),
  • <meta http-equiv="Content-Type" content="type; charset=..."/> — робот может учитывать этот тег при определении типа документа и его кодировки,
  • <meta http-equiv="refresh" content="N;url=_адрес цели перенаправления_"/> — перенаправление (редирект) пользователя на страницу с адресом url, после N секунд нахождения на данной странице. При небольших значениях N считается временным перенаправлением, аналогичным серверным редиректам с HTTP-кодом 302/303/307.

Также робот Яндекса учитывает указания в тегах:

  • <meta name="robots" content="all"/> — разрешено индексировать текст и ссылки на странице, аналогично <meta name="robots" content="index, follow"/>
  • <meta name="robots" content="noindex"/> — не индексировать текст страницы,
  • <meta name="robots" content="nofollow"/> — не переходить по ссылкам на странице и не индексировать их,
  • <meta name="robots" content="none"/> — запрещено индексировать и текст, и ссылки на странице, аналогично <meta name="robots" content="noindex, nofollow"/>
  • <meta name="robots" content="noarchive"/> — не показывать ссылку на сохраненную копию на странице результатов поиска.

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

Если мета-теги не указаны, по умолчанию они имеют положительное значение (index, follow, archive). В случаях конфликтов между тегами робот делает выбор в пользу значения по умолчанию.

Пример:

<meta name="robots" content="all"/>
<meta name="robots" content="noindex, follow"/>

Робот выберет значение all, текст и ссылки будут проиндексированы.

Тег со значением all не распространяется на noarchive.

Пример:

<meta name="robots" content="all"/>
<meta name="robots" content="noarchive"/>

Текст и ссылки будут проиндексированы, но ссылки на сохраненную копию в результатах поиска не будет.

Тег <noindex>

Для запрета индексирования служебных участков текста вы можете использовать тег <noindex>. Тег работает аналогично мета-тегу noindex, но распространяется только на контент, заключенный внутри тега в формате:

<noindex>текст, индексирование которого нужно запретить</noindex>

Тег noindex не чувствителен к вложенности (может находиться в любом месте html-кода страницы). При необходимости сделать код сайта валидным возможно использование тега в следующем формате:

<!--noindex-->текст, индексирование которого нужно запретить<!--/noindex-->

Атрибут rel="nofollow" тега <a>

Атрибут rel="nofollow" используется в теге <a> в формате:

<a href="url" rel="nofollow">текст ссылки</a> 

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

Источник: Яндекс для вебмастеров Помощь вебмастеру

среда, 12 мая 2010 г.

Яндекс: Список новых User-Agent Яндекс ботов

Mozilla/5.0 (compatible; YandexBot/3.0) — основной индексирующий робот.

Mozilla/5.0 (compatible; YandexBot/3.0; MirrorDetector) — робот, определяющий зеркала сайтов.

Mozilla/5.0 (compatible; YandexImages/3.0) — индексатор Яндекс.Картинок.

Mozilla/5.0 (compatible; YandexVideo/3.0) — индексатор Яндекс.Видео.

Mozilla/5.0 (compatible; YandexMedia/3.0) — робот, индексирующий мультимедийные данные.

Mozilla/5.0 (compatible; YandexBlogs/0.99; robot) — робот поиска по блогам, индексирующий комментарии постов.

Mozilla/5.0 (compatible; YandexAddurl/2.0) — робот, обращающийся к странице при добавлении ее через форму «Добавить URL».

Mozilla/5.0 (compatible; YandexFavicons/1.0) — робот, индексирующий пиктограммы сайтов (favicons).

Mozilla/5.0 (compatible; YandexDirect/3.0) — робот, индексирующий страницы сайтов, участвующих в Рекламной сети Яндекса.

Mozilla/5.0 (compatible; YandexDirect/2.0; Dyatel) — «простукивалка» Яндекс.Директа.

Mozilla/5.0 (compatible; YandexMetrika/2.0) — робот Яндекс.Метрики.

Mozilla/5.0 (compatible; YandexCatalog/3.0; Dyatel) — «простукивалка» Яндекс.Каталога.

Mozilla/5.0 (compatible; YandexNews/3.0) — индексатор Яндекс.Новостей.

http://webmaster.ya.ru/replies.xml?item_no=7783&ncrnd=1979

пятница, 30 апреля 2010 г.

CodeIgniter: Хэлпер show_errors

Сделал хэлпер с show_403(), по аналогии с show_404().

Код выложил в googlecode.

error_403.php для /application/errors/ прилагается :)

CodeIgniter 2.0: load_class

Изменился формат вызова load_class.
Был:

/**
* Class registry
*
* This function acts as a singleton. If the requested class does not
* exist it is instantiated and set to a static variable. If it has
* previously been instantiated the variable is returned.
*
* @access public
* @param string the class name being requested
* @param bool optional flag that lets classes get loaded but not instantiated
* @return object
*/
function &load_class($class, $instantiate = TRUE)

Стал:

/**
* Class registry
*
* This function acts as a singleton. If the requested class does not
* exist it is instantiated and set to a static variable. If it has
* previously been instantiated the variable is returned.
*
* @access public
* @param string the class name being requested
* @param string the directory where the class should be found
* @param string the class name prefix
* @return object
*/
function &load_class($class, $directory = 'libraries', $prefix = 'CI_')


Benchmark, Config, Controller, Exceptions, Hooks, Input, Lang, Loader, Model, Output, Router, Unicode, URI - теперь в 'core'.

P.S. Сегодня долго с Exceptions бился...

понедельник, 22 марта 2010 г.

Opera 10.51

Вышла Opera 10.51, исправили баг с логином на blogspot.com :)
Здесь утверждают, что Opera стала ещё быстрее...
Кроме бага с blogspot'ом оказывается были проблемы с авторизацией на facebook.com. Способ решений этой проблемы:
  • Click on the O menu - Settings - Preferences.
  • Click the Advanced Tab.
  • Select Cookies - Manage Cookies.
  • Search for any "Facebook" cookie(s) and delete them.
  • Load www.facebook.com and log in.
  • Success! You should now be logged in as normal.

пятница, 19 марта 2010 г.

CodeIgniter 2.0. В ожидании релиза.

Близится релиз второй версии CodeIgniter'а.

Changelog:

General changes
  • PHP 4 support is deprecated. Features new to 2.0.0 may not support PHP 4, and all legacy features will no longer support PHP 4 as of 2.1.0.
  • Scaffolding, having been deprecated for a number of versions, has been removed.
  • Plugins have been removed, in favor of Helpers. The CAPTCHA plugin has been converted to a Helper and documented. The JavaScript calendar plugin was removed due to the ready availability of great JavaScript calendars, particularly with jQuery.
  • Added new special Library type: Drivers.
  • Added routing overrides to the main index.php file, enabling the normal routing to be overridden on a per "index" file basis.
  • Added the ability to set config values (or override config values) directly from data set in the main index.php file. This allows a single application to be used with multiple front controllers, each having its own config values.
  • Added $config['directory_trigger'] to the config file so that a controller sub-directory can be specified when running _GET strings instead of URI segments.
  • Added ability to set "Package" paths - specific paths where the Loader and Config classes should try to look first for a requested file. This allows distribution of sub-applications with their own libraries, models, config files, etc. in a single "package" directory. See the Loader class documentation for more details.
  • In-development code is now hosted at BitBucket.

Libraries
  • Added Security library, which now contains the xss_clean function, filename_security function and other security related functions.
  • Added CSRF (Cross-site Reference Forgery) protection to the Security library.
  • Added $parse_exec_vars property to Output library.
  • Added ability to enable / disable individual sections of the Profiler
  • Added a wildcard option $config['allowed_types'] = '*' to the File Uploading Class.
  • Added an 'object' config variable to the XML-RPC Server library so that one can specify the object to look for requested methods, instead of assuming it is in the $CI superobject.
  • Added "is_object" into the list of unit tests capable of being run.
  • Table library will generate an empty cell with a blank string, or NULL value.
  • Added ability to set tag attributes for individual cells in the Table library
  • Added a parse_string() method to the Parser Class.
  • Added HTTP headers and Config information to the Profiler output.
  • Added Chrome and Flock to the list of detectable browsers by browser() in the User Agent Class.
  • The Unit Test Class now has an optional "notes" field available to it, and allows for discrete display of test result items using $this->unit->set_test_items().

Database
  • Added swap_pre value to database configuration.
  • Added autoinit value to database configuration.
  • Added stricton value to database configuration.
  • Added database_exists() to the Database Utilities Class.
  • Semantic change to db->version() function to allow a list of exceptions for databases with functions to return version string instead of specially formed SQL queries. Currently this list only includes Oracle and SQLite.
  • Fixed a bug where driver specific table identifier protection could lead to malformed queries in the field_data() functions.
  • Fixed a bug where an undefined class variable was referenced in database drivers.

Helpers
  • Added convert_accented_characters() function to text helper.
  • Added accept-charset to the list of inserted attributes of form_open() in the Form Helper.
  • Deprecated the dohash() function in favour of do_hash() for naming consistency.
  • Non-backwards compatible change made to get_dir_file_info() in the File Helper. No longer recurses by default so as to encourage responsible use (this function can cause server performance issues when used without caution).
  • Modified the second parameter of directory_map() in the Directory Helper to accept an integer to specify recursion depth.
  • Modified delete_files() in the File Helper to return FALSE on failure.
  • Added an optional second parameter to byte_format() in the Number Helper to allow for decimal precision.
  • Added alpha, and sha1 string types to random_string() in the String Helper.

Other Changes
  • Updated loader to automatically apply the sub-class prefix as an option when loading classes. Class names can be prefixed with the standard "CI_" or the same prefix as the subclass prefix, or no prefix at all.
  • Increased randomness with is_really_writable() to avoid file collisions when hundreds or thousands of requests occur at once.
  • Switched some DIR_WRITE_MODE constant uses to FILE_WRITE_MODE where files and not directories are being operated on.
  • get_mime_by_extension() is now case insensitive.
  • Added "default" to the list Reserved Names.
  • Added 'application/x-msdownload' for .exe files and ''application/x-gzip-compressed' for .tgz files to config/mimes.php.
  • Documented append_output() in the Output Class.
  • Documented a second argument in the decode() function for the Encryption Class.
  • Documentd db->close().

Bug fixes for 2.0.0

  • Fixed a bug where a failed query would not have a saved query execution time causing errors in the Profiler
  • Fixed a bug that was writing log entries when multiple identical helpers and plugins were loaded.
  • Fixed assorted user guide typos or examples (#10693, #8951, #7825, #8660, #7883, #6771, #10656).
  • Fixed a language key in the profiler: "profiler_no_memory_usage" to "profiler_no_memory".
  • Fixed an error in the Zip library that didn't allow downloading on PHP 4 servers.
  • Fixed a bug in the Form Validation library where fields passed as rule parameters were not being translated (#9132)
  • Modified inflector helper to properly pluralize words that end in 'ch' or 'sh'
  • Fixed a bug in xss_clean() that was not allowing hyphens in query strings of submitted URLs.
  • Fixed bugs in get_dir_file_info() and get_file_info() in the File Helper with recursion, and file paths on Windows.
  • Fixed a bug where Active Record override parameter would not let you disable Active Record if it was enabled in your database config file.
  • Fixed a bug in reduce_double_slashes() in the String Helper to properly remove duplicate leading slashes (#7585)
  • Fixed a bug in values_parsing() of the XML-RPC library which prevented NULL variables typed as 'string' from being handled properly.
  • Fixed a bug were form_open_multipart() didn't accept string attribute arguments (#10930).
  • Fixed a bug (#10470) where get_mime_by_extension() was case sensitive.
  • Fixed a bug where some error messages for the SQLite and Oracle drivers would not display.

вторник, 9 марта 2010 г.

PHP: short_open_tag

神奈川沖浪裏

short_open_tag – разрешает использование коротких тэгов (<? … ?>) для оформления PHP кода

Из документации...

short_open_tag boolean

Определяет, разрешается ли короткая форма записи (<? ?>) тегов PHP. Если вы хотите использовать PHP в комбинации с XML, вы можете отключить эту опцию, чтобы беспрепятственно использовать <?xml ?>. В противном случае, вы можете отобразить это при помощи PHP, например: <?php echo '<?xml version="1.0"'; ?>. Если же эта опция отключена, вы должны использовать длинную форму открывающего тега PHP (<?php ?>).

Замечание: Эта директива также влияет на сокращение <?=, которое идентично записи <? echo. Для использования этого сокращения, директива short_open_tag должна быть включена.

Почему не стоит использовать short_open_tag:

Основные причины:

  • на некоторых серверах не включена директива short_open_tag, и ваши скрипты не будут работать;
  • конфликт с открывающим тэгом XML <?xml...
  • PHP coding standards strongly recommend to use full php open tags

С первой проблемой столкнулся вчера лично. Потрачено несколько часов на выискивание того места в котором проблема.

Под xampp cms не работала, а под denwer'ом всё было нормально. Пришлось ковырять под denwer'ом, но так как мне он не очень нравиться постоянно отвлекали мысли о том где-же всё-таки косяк.

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

Не удобно, когда над проектом работают несколько человек и нет единого стандарта кодирования. Весьма забавно смотрятся разные методы одного объекта написанные в разных стилях, вот только работать не прикольно, ибо когда один метод setSomeProperty, а другой get_some_prorepty начинается путаница.


Изучаем PHP и MySQL | Мишель Е. Дэвис и Джон А. Филлипс | Learning PHP and MySQLИзучаем PHP и MySQL | Мишель Е. Дэвис и Джон А. Филлипс | Learning PHP and MySQL
PHP. Рецепты программирования | Д. Скляр, А. Трахтенберг | PHP CookbookPHP. Рецепты программирования | Д. Скляр, А. Трахтенберг | PHP Cookbook
PHP и jQuery для профессионалов | Джейсон Ленгсторф | Pro PHP and jQuery | Expert's VoicePHP и jQuery для профессионалов | Джейсон Ленгсторф | Pro PHP and jQuery | Expert's Voice

воскресенье, 7 марта 2010 г.

Kohana:The Swift PHP Framework

К сожалению Zend Framework временно пришлось забросить. Начинаю усиленно ковырять Kohana.

Облегчает ковыряние тот факт, что Kohana выросла из форка CodeIgniter'а.

Из википедии (http://ru.wikipedia.org/wiki/Kohana):
Проект Kohana был создан как ветвь PHP фрэймворка CodeIgniter под именем Blue Flame. Главной причиной форка был переход к более открытой для общественности модели разработки, потому, что многие пользователи были недовольны скоростью разработки и исправления ошибок в CodeIgniter. В Июле 2007, Blue Flame был переименован в Kohana для того, чтобы избежать проблем с авторскими правами в будущем.

Opera 10.50 борьба с неприятностями

Проблема с "подвисаниями" при загрузке решилась удалением с последующий ручной чисткой и переустановкой.

С крашами оперы на блогспоте оказалось по хуже. Выяснил, что они проявляются если залогиниться на блогспот. :(

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

четверг, 4 марта 2010 г.

Opera 10.50 неприятные неожиданности

Opera 10.50 Экспресс-панель
Радость от нового релиза омрачила парочка неприятных вещей.
1. Подвисания закачивания или заморозка страниц.
С интервалом в 15-20 минут у Оперы пропадает всяческая сетевая активность. Страницы не закачиваются не обновляются, по ссылка не переходит. Но, сам браузер не зависает, открытые окна, если они не пустые, нормально скроллируются.

Первоначально подумал на проблемы с инетом (которых давненько не было), но когда тоже самое стало происходить и с локальными сайтами, физически размещёнными у меня на компе. С другими браузерами такого не происходит. Файрволл вроде бы не причём.

2. Ещё более весёлое. На моём блоге (http://dev-mark.blogspot.com) опера крашится :(
Как вариант, возможно из-за js скриптов хайлайтера кода.

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

P.S. Возможно это последствия скоротечных 2-х RC, так же скоротечно переходящих в релиз :(
Придётся откатиться на 10.10, ибо Опера, у меня, установлена браузером по умолчанию и замены ей пока не нашел (:

понедельник, 22 февраля 2010 г.

Zend Framework: Quick Start

Ковыряю ZendFramework Quick Start Application. Много интересного, довольно мощная штука, но иногда кажется, что сильно мощная. Как по велопарку на джипе кататься...
Пока немного коробит от таких вещей:

<p><a href="<?php echo $this->url(
array(
'controller' => 'guestbook',
'action' => 'sign'
),
'default',
true) ?>">Sign Our Guestbook</a></p>

Guestbook Entries: <br />
<dl>
<?php foreach ($this->entries as $entry): ?>
<dt style="color:navy"><?php echo $this->escape($entry->email) ?></dt>
<dd style="color:gray"><?php echo $this->escape($entry->comment) ?></dd>
<hr/>
<?php endforeach ?>
</dl>

Привык я работать с template engine и не переношу смесь php и html кода...

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

Например, в минимальной конфигурации таки библиотеки, как: Barcode, Currency, Locale (и его 9 метров локалей), TimeSync. Без них вес уменьшается в 2 раза...

воскресенье, 21 февраля 2010 г.

Zend Framework

Потихоньку начал осваивать Zend Framework.
Нашёл "легкий путь" слил скринкасты с Zend Cast... и обломался, первые скринкасте уже устарели. Придётся по старинке, через документацию.
Но, польза от скринкастов есть, иногда попадаются полезные фичи, типа:
define('APPLICATION_PATH',dirname(__FILE__) . '../application/');

пятница, 19 февраля 2010 г.

Разместил проект на googlecode.com

Use this command to anonymously check out the latest project source code:
# Non-members may check out a read-only working copy anonymously over HTTP.
svn checkout http://dev-mark.googlecode.com/svn/trunk/ dev-mark-read-only

Русификация calendar_lang.php в CodeIgniter

Оказалось в русском языке существует несколько вариантов сокращений. Взял, "советский", из википедии, знакомый с детства :)


<?php
$lang['cal_su'] = "Вс";
$lang['cal_mo'] = "Пн";
$lang['cal_tu'] = "Вт";
$lang['cal_we'] = "Ср";
$lang['cal_th'] = "Чт";
$lang['cal_fr'] = "Пт";
$lang['cal_sa'] = "Сб";
$lang['cal_sun'] = "Вск";
$lang['cal_mon'] = "Пнд";
$lang['cal_tue'] = "Втр";
$lang['cal_wed'] = "Срд";
$lang['cal_thu'] = "Чтв";
$lang['cal_fri'] = "Птн";
$lang['cal_sat'] = "Сбт";
$lang['cal_sunday'] = "Воскресенье";
$lang['cal_monday'] = "Понедельник";
$lang['cal_tuesday'] = "Вторник";
$lang['cal_wednesday'] = "Среда";
$lang['cal_thursday'] = "Четверг";
$lang['cal_friday'] = "Пятница";
$lang['cal_saturday'] = "Суббота";
$lang['cal_jan'] = "Янв";
$lang['cal_feb'] = "Фев";
$lang['cal_mar'] = "Мар";
$lang['cal_apr'] = "Апр";
$lang['cal_may'] = "Май";
$lang['cal_jun'] = "Июн";
$lang['cal_jul'] = "Июл";
$lang['cal_aug'] = "Авг";
$lang['cal_sep'] = "Сен";
$lang['cal_oct'] = "Окт";
$lang['cal_nov'] = "Ноя";
$lang['cal_dec'] = "Дек";
$lang['cal_january'] = "Январь";
$lang['cal_february'] = "Февраль";
$lang['cal_march'] = "Март";
$lang['cal_april'] = "Апрель";
$lang['cal_mayl'] = "Май";
$lang['cal_june'] = "Июнь";
$lang['cal_july'] = "Июль";
$lang['cal_august'] = "Август";
$lang['cal_september'] = "Сентябрь";
$lang['cal_october'] = "Октябрь";
$lang['cal_november'] = "Ноябрь";
$lang['cal_december'] = "Декабрь";


/* End of file calendar_lang.php */
/* Location: ./system/language/russian/calendar_lang.php */

среда, 17 февраля 2010 г.

MY_Loader.php расширения загрузчика для подключения "глобальных моделей"


<?php
/**
* MY_Loader Class
*
* Loads global_models
*
* @package CodeIgniter
* @subpackage Libraries
* @author snake.nf
* @category Loader
*/
class MY_Loader extends CI_Loader
{
function MY_Loader()
{
parent::CI_Loader();
}

/**
* Global Model Loader
*
* This function lets users load and instantiate global models.
*
* @access public
* @param string the name of the class
* @param string name for the model
* @param bool database connection
* @return void
*/
function global_model($model, $name = '', $db_conn = FALSE)
{
if (is_array($model))
{
foreach($model as $babe)
{
$this->model($babe);
}
return;
}

if ($model == '')
{
return;
}

// Is the model in a sub-folder? If so, parse out the filename and path.
if (strpos($model, '/') === FALSE)
{
$path = '';
}
else
{
$x = explode('/', $model);
$model = end($x);
unset($x[count($x)-1]);
$path = implode('/', $x).'/';
}

if ($name == '')
{
$name = $model;
}

if (in_array($name, $this->_ci_models, TRUE))
{
return;
}

$CI =& get_instance();
if (isset($CI->$name))
{
show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
}

$model = strtolower($model);

if ( ! file_exists(APPPATH.'../global_models/'.$path.$model.EXT))
{
show_error('Unable to locate the model you have specified: '.$model);
}

if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
{
if ($db_conn === TRUE)
$db_conn = '';

$CI->load->database($db_conn, FALSE, TRUE);
}

if ( ! class_exists('Model'))
{
load_class('Model', FALSE);
}

require_once(APPPATH.'../global_models/'.$path.$model.EXT);

$model = ucfirst($model);

$CI->$name = new $model();
$CI->$name->_assign_libraries();

$this->_ci_models[] = $name;
}

}
?>

CodeIgniter: Multiple Applications и общие модели в приложениях

CodeIgniter Недавно столкнулся с тем, что в приложениях backend и frontend используются общие модели. Пытался найти в CodeIgniter механизм подключения общих моделей для нескольких приложений. В течении дня были просмотрены несколько русско- и англоязычных сообществ и их форумов, множество блогов и т.д.
Все кто используют frontend и backend на CodeIgniter умалчивают о том, как они работают с моделями.
К вечеру уже начал подниматься вопрос о переходе с CodeIgniter на другой фреймворк, в частности на Zend Framework. После беглого осмотра возможностей Zend Framework'a не нашёл нативной возможности подключения внешних моделей. :(

Сегодня решил по глубже посмотреть ядро CodeIgniter, на предмет добавления хака для работы с общими моделями.
Решение вопроса былой найдено в классе ядра CI_Loader.
Собственно вопрос решался изменением двух строк 162 и 180 в которых используются пути к моделям.
Строка 162:
if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
Cтрока 180:
require_once(APPPATH.'models/'.$path.$model.EXT)
Первой мыслью было просто заменить пути и не париться, но тогда лишился бы возможности использовать локальные модели для каждого приложения.
Просмотрев документацию по созданию классов ядра, нашёл более простое и нативное решение. Расширение класса ядра CI_Loader.
class MY_Loader extends CI_Loader {

function My_Loader()
{
parent::CI_Loader();
}

function global_model($model, $name = '', $db_conn = FALSE)
{
....
}

}

global_model полностью копирует model за исключением двух строк в которых изменяем пути.
Остаётся положить MY_Loader в libraries обоих приложений и теперь имеем возможность использовать глобальные и локальные модели.

На мой взгляд такой вариант наиболее оптимальным, т.к. это не вност изменения в ядро системы, легко переноситься в другие приложения, не требует лишних телодвижений при обновлении CodeIgniter'а.

Естественно нельзя использовать локальные и глобальные модели с одинаковыми именами. В контроллерах, за исключеним замены $this->load->model('Model_name'), на $this->load->global_model('Model_name') для глобальных моделей, ничего менять не придётся, т.к. мы только расширим Loader.

На практике пока не опробовано, но займусь этим в ближайшее время.