Ярлыки

.htaccess (4) тестирование (8) шаблоны проектирования (3) css (5) Debian (6) docker (2) Doctrine2 (6) Git (6) html (4) java (6) javascript (13) jquery (11) LFS (3) linux (23) mac os (4) mod_rewrite (2) MSSQL (4) MySQL (18) ORM Doctrine (17) patterns (3) PDO (3) perl (7) PHP (64) PHPUnit (8) Python (15) SEO (2) Silex (1) SimpleXML (1) SQL (14) ssh (4) Ubuntu (24) Yii1 (1) Zend Framework (19) ZendFramework2 (8)

пятница, 27 августа 2010 г.

Scheme. Lisp. Заметки.


; Вычисление модуля

(define (abs x)
(cond ((< x 0) (- x))
(else x)))

(define (abs x)
(if (< x 0) ; Предикат
(- x) ; Следствие
x)) ; Альтернатива

четверг, 26 августа 2010 г.

.htaccess и кодировка html-файлов UTF-8

Если ничего не помогает, и браузер не хочет выставлять кодировку по-умолчнанию
(DOCTYPE, meta - все ок), можно попробовать выставить в .htaccess:

AddDefaultCharset UTF-8

PHP. Использование SimpleXML.



Код:

$newsXML = new SimpleXMLElement("<news></news>");
$newsXML->addAttribute('newsPagePrefix', 'value goes here');
$newsIntro = $newsXML->addChild('content');
$newsIntro->addAttribute('type', 'latest');
$newsXML->content = 'hello!';
Header('Content-type: text/xml');
echo $newsXML->asXML();


Результат:

<?xml version="1.0"?>
<news newsPagePrefix="value goes here"><content type="latest">hello!</content></news>

понедельник, 23 августа 2010 г.

Zend Framework. Создание собственного элемента формы Zend_Form

Версия ZF: 1.10.
Создание собственного элемента формы Zend_Form довольно тривиально.
Ниже пример для класса Securimage. Собственно в Zend Framework достаточно вариантов капчи на любой вкус, все это лишь для иллюстрации того, как это работает.
Где-то у нас есть объект Zend_View ... Надо указать путь к хелперам (view helpers).
Допустим они у нас в каталоге Custom (по умолчанию Zend_View смотрит Zend/View/Helper/).

$view = new Zend_View();
$view->setHelperPath('Custom/View/Helper/', 'Custom_View_Helper_');
Объект вида можно хранить, допустим в реестре, а вообще как хотим.

файл: Custom/Form/Element/Securimage.php

class Custom_Form_Element_Securimage extends Zend_Form_Element
{
public $helper = 'Securimage';
}
Собственно и все, просто указали хелпер вида для отображения, в данном случае.
Все может быть гораздо сложнее, но нам тут это не нужно.

файл: Custom/View/Helper/Securimage.php
class Custom_View_Helper_Securimage extends Zend_View_Helper_FormElement
{
public function securimage($name, $value = null, $attribs = null)
{
$html = "<img src='http://path/to/captcha' />";
$html .= "<input type='text' name='{$name}' />";
return $html;
}
}
?>
Одноименный метод хелпера возвращает html-код нашего элемента.
Это то что мы увидим в результате вызова метода render нашего элемента.

Ну и наконец нам нужен валидатор значения нашего элемента.
Подключение класса Securimage обеспечено автозагрузчиком.
Валидатор наследует класс фреймворка Zend_Validate_Abstract и должен реализовать метод
isValid с определенным списком параметров (это важно, иначе он не будет вызван методом isValid класса Zend_Form).

файл: Custom/Validate/Securimage.php
class Custom_Validate_Securimage extends Zend_Validate_Abstract
{
const INVALID = 'invalid';

protected $_messageTemplates = array(
self::INVALID => 'Неверный код'
);

public function isValid($val, $context = null)
{
$val = (string) $val;
$this->_setValue($val);
$si = new Securimage();
if(!$si->check($val)) {
$this->_error(self::INVALID);
return false;
}
return true;
}
}
Осталось совсем немного, создать форму и добавить туда наш элемент, примерно так ...
class MyForm extends Zend_Form
{
pulic function init()
{
// ....

$si = new Custom_Form_Element_Securimage('cap');
$si->addValidator(new Custom_Validate_Securimage());
$si->setRequired();
$si->setLabel('Код');
$this->addElement($si);

// ....
}
}
Пути к файлам элемента и валидатора указывать не требуется, все включается автоматически.
Если нет, то возможно потребуется явно подключить все необходимые файлы.

суббота, 21 августа 2010 г.

понедельник, 16 августа 2010 г.

Zend Framework. Собственный Zend_Filter.

Создание собственного фильтра для Zend_Form, реализуем интерфейс Zend_Filter_Interface:

class MyFilter implements Zend_Filter_Interface
{
public function filter($value)
{
return $valueFiltered;
}
}

// Использование
$filterChain = new Zend_Filter();
$filterChain->addFilter(new MyFilter());

суббота, 14 августа 2010 г.

Perl. Обработка исключений.

Вот такой простой способ обработки исключений в Perl

eval { # try
... тут наш код ...
};
if( $@ ) { # catch
... тут обработка исключений $@ ...
}

пятница, 13 августа 2010 г.

PHP. Загрузка изображения.

Два простых способа загрузить изображение

$remote_img = 'http://www.somwhere.com/images/image.jpg';
$img = imagecreatefromjpeg($remote_img);
$path = 'images/';
imagejpeg($img, $path);

// CURL
function save_image($img,$fullpath)
{
$ch = curl_init ($img);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
$rawdata=curl_exec($ch);
curl_close ($ch);
if(file_exists($fullpath)){
unlink($fullpath);
}
$fp = fopen($fullpath,'x');
fwrite($fp, $rawdata);
fclose($fp);
}

четверг, 12 августа 2010 г.

Perl с поддержкой threads. XAMPP. Ubuntu.

Perl в пакете XAMPP для Linux к сожалению собран без поддержки threads.
Можно пользоваться perl из системы. Для работы с MySQL через DBI при подключении указываем сокет MySQL из XAMPP.


my $dbh = DBI->connect("DBI:mysql:database=$db_name;mysql_socket=/opt/lampp/var/mysql/mysql.sock",
$db_user, $db_pwd);

среда, 11 августа 2010 г.

Ubuntu. Apache. mod_rewrite.

Подключаем модуль mod_rewrite apache:
leon@leon-desktop:/opt/lampp/htdocs/allmuz/application/scripts$ sudo a2enmod rewrite

Редактируем конфигурацию хостов:
leon@leon-desktop:/opt/lampp/htdocs/allmuz/application/scripts$ sudo nano /etc/apache2/sites-available/default

А именно, изменяем параметр AllowOverride None на AllowOverride All

Перезапускаем apache:
leon@leon-desktop:/opt/lampp/htdocs/allmuz/application/scripts$ sudo /etc/init.d/apache2 restart

Perl. Потоки.



#!/usr/bin/perl -w
use strict;
use warnings;
use threads;
use threads::shared;


my $var: shared;
$var = 0;
my @threads;
for(1..10) {
new threads(\&myThread, $_);
}

$_->join for threads->list;

sub myThread
{
my $thrn = shift;
printf "thread %d started at %s\n", $thrn, scalar localtime time;
while($var < 100) {
#printf "thread #%d: var=%d\n", $thrn, $var;
$var++;
sleep 1;
}
printf "thread %d stopped at %s\n", $thrn, scalar localtime time;
}


leon@leon-desktop:/opt/lampp/htdocs/allmuz/application/scripts$ ./autocomments.pl
thread 1 started at Wed Aug 11 11:52:20 2010
thread 2 started at Wed Aug 11 11:52:20 2010
thread 3 started at Wed Aug 11 11:52:20 2010
thread 4 started at Wed Aug 11 11:52:20 2010
thread 5 started at Wed Aug 11 11:52:20 2010
thread 6 started at Wed Aug 11 11:52:20 2010
thread 7 started at Wed Aug 11 11:52:20 2010
thread 8 started at Wed Aug 11 11:52:20 2010
thread 9 started at Wed Aug 11 11:52:20 2010
thread 10 started at Wed Aug 11 11:52:20 2010
thread 1 stopped at Wed Aug 11 11:52:30 2010
thread 2 stopped at Wed Aug 11 11:52:30 2010
thread 3 stopped at Wed Aug 11 11:52:30 2010
thread 4 stopped at Wed Aug 11 11:52:30 2010
thread 5 stopped at Wed Aug 11 11:52:30 2010
thread 6 stopped at Wed Aug 11 11:52:30 2010
thread 7 stopped at Wed Aug 11 11:52:30 2010
thread 8 stopped at Wed Aug 11 11:52:30 2010
thread 9 stopped at Wed Aug 11 11:52:30 2010
thread 10 stopped at Wed Aug 11 11:52:30 2010


Можно видеть, что все выполнилось за 10 секунд.