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

jQuery установить значение атрибута type для браузера IE

В последней версии jQuery (1.4.x), при изменении атрибута type в Internet Explorer (IE) бросается (throw) исключение (запрещено его изменять).

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


try {
  jQuery("input").attr('type','text');
} catch(e) {
  alert(e.message)
}

Как решение проблемы, многие предлагают использовать jQuery('...').data('element','key','value'), но наверное проще избегать самой ситуации изменения типа поля.

Чаще всего, такая необходимость возникает, если нужно склонировать поле и потом заставить вести себя иначе (например склонировать поле пароля и установить клону тип - текст). Под другими браузерами все будет отлично, а под ИЕ получите ексепшин. Я предпочтаю, в таком случае, не клонировать поле, а создавать - уже с нужным типом и потом выставлять остальные параметры. Но можно и использовать вариант с jQuery.data()

вторник, 21 декабря 2010 г.

Rails. Установка под windows7. Решение типовой проблемы

Если при установке рельсы под windows7 вылазит такая ошибка:

ERROR: While executing gem ... (Errno::ENOENT)

No such file or directory ...

Заходим в папку с установленым Ruby (C:/Ruby например), находим в папке bin файл gem и вставляем в его начало:

ENV['HOME'] = "C:/Ruby"

или ваш уникальный путь к Ruby.

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

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

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

Как работает Array.prototype.slice.call

Для того, чтобы из аргументов JavaScript функции "отрезать" первые Х значений, используется метод slice:

Array.prototype.slice.call(arguments, X);

Например такая функция вернет "3,4":

(function(){
  var args = Array.prototype.slice.call(arguments, 2);
  alert(args); // Returns: 3,4
})(1, 2, 3, 4);


Используется вызов через Array.prototype.call(array, params)  потому, что arguments - псевдо-массив и не содержит методов прототипа массива. С помощью call мы явно вызываем нужный метод из прототипа Array с контекстом arguments.

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

среда, 17 ноября 2010 г.

Установить значения счетчика для auto increment поля таблицы mysql

Для того чтобы установить значение ключевого автоинкрементного поля таблицы (auto increment), используется запрос (значение может быть любое, если равно 1 - значит сбрасывается счетчик):

ALTER TABLE `tablename` AUTO_INCREMENT=1


суббота, 13 ноября 2010 г.

jQuery autocomplete combobox установить высоту списка и полосы прокрутки

В предыдущем посте Combobox на основе jquery autocomplete  я давал ссылки на плагин автокомплитита, который умеет отображаться как выпадающий список.

На форумах часто задают вопрос - "Как ограничить высоту выпадающего списка и добавить полосу прокрутки?"

Ответ очень простой. Достаточно добавить кусочек CSS на страницу или в файл со стилями. Высоту укажите свою:

.ui-autocomplete { height: 300px; overflow-y: scroll; overflow-x: hidden;}


среда, 10 ноября 2010 г.

Использование карты VISA Electron от УкрСоцБанка для онлайн платежей

Недавно столкнулся с проблемой - хотел оплатить лот на Amazon своей гривневой картой VISA от УкрСоцБанка. Я получил ответ, суть которого сводилась к тому, что мой банк заблокировал транзакцию по соображениям безопасности.

В банке удалось выяснить, что по-умолчанию, на картах стоит ограничение в $20 на исходящие платежи. С помощью консультанта удалось ограничение снять. Теперь переведу на карту деньги и попробую оплатить снова. 

Результаты опишу как только получу товар.



Combobox на основе jquery autocomplete

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

Детальную информацию и пример можно посмотреть здесь: http://jqueryui.com/demos/autocomplete/#combobox

jQuery.autocomplete уже умеет это делать, просто его нужно немного кастомизировать. Большим плюсом использования компонента jQuery UI являеться то, что уже есть большой набор готовых скинов(тем) и их очень легко установить у себя на сайте.

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

Запуск rake задач для production версии сайта

Когда мы запускаем таски на сайте в режиме продашина, то должны помнить - нужно обязательно указывать явным образом значение  RAILS_ENV="production". 

Например:
rake db:migrate RAILS_ENV="production"

Перезапустить crontab

Если crontab был модифицирован, то для принятия изменений необходимо его перезапустить:

sudo /etc/init.d/cron restart

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

Thinking Sphinx документация

Самая подробная документация по Thinking Sphinx находиться на сайте Thinking Sphinx
Для быстрого старта, неплохо бы посмотреть видео-урок на railscasts: Thinking Sphinx (Railscasts)
Немного русской доки можно почерпнуть на форуме: http://rubyclub.com.ua/

Самая простая и быстрая установка php5+apache2+mysql

Хочу поделиться очень простым способом настройки связкии php5+apache2+mysql на linux.

Все гениальное просто:

sudo apt-get install phpmyadmin

Теперь только нажимать "Yes" когда попросят :) и ввести пароль и логин пользователя mysql. Данный трюк возможен из-за того, что установщик пакетов автоматически устанавливает необходимые программы, которые нужны для работы phpmyadmin (либо же любой программы которую надо установить)

Книга по рельсе 3. Ruby on Rails Tutorial. Learn Rails by Example

Недавно случайно нашел неплохую онлайн-книгу с примерами по Rails 3. PDF и ScreenCasts платные, но с сайта можно читать сколько угодно. Впечатлениями от прочтения поделюсь позже.

Знакомтесь - Ruby on Rails Tutorial: Learn Rails by Example by Michael Hartl.

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

Rails. Загрузить данные в таблицы из YAML файлов

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

Создадим простой rake-task, который поможет нам наполнить таблицы данными из yaml файлов.

"Path to Yaml directory" - путь к директории с Yaml файлам
table1,table2,table3 - название таблиц в БД.

Реализация таска:

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

Как в JavaScript изменить якорь в URL и перейти по нему одновременно

Если с помощью JavaScript обновлять только якорь URL, то редиректа страинцы не произойдет. Это часто используется в разных механизмах передачи данных между iframe-мами, которые могут менять якоря друг-другу. Но может стоять и противоположная задача - при изменении якоря, обязательно делать редирект. 

В таком случае нам поможет код:


path = "www.some-domain.com/index.html#value";
window.location.href = path;
window.location.reload(true);


У такого подхода есть один недочет: если вы так обновляете страницу у которой старый URL отличаеться от нового не только якорем, то произойдет редирект страницы саму на себя - всему виной строка 3, которая должна запускаться только если URL отличаются якорями.

Если вы хотите написать универсальный метод, то тогда придется немного усложнить код:

function redirectPage(url){
  newUrlParts = url.split("#");
  currentUrlParts = window.location.href.split("#");
  window.location.href = url;
  if(newUrlParts[0]==currentUrlParts[0])
    window.location.reload(true);
}


Такой метод будет работать универсально.

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

Yii. Добавить новый getter в модель

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

Пусть поле адрес до первой запятой содержит название города. Как лучше всего решить задачу?

Ответ прост, добавить новую property в модель и переопределить для нее getter. К счастью, с Yii это сделать достаточно просто.

Откроем файл с классом модели и добавим такой код:


/**
* @property string $city
*/
protected $city;

/**
* get City property
*/
public function getCity(){
  $address = $this->getAttribute('address');
  $list = explode(",",$address);
  if(count($list)==0)
    return "";
  return trim($list[0]);
}



Теперь можно достать такое поле так:

$criteria = ...
$result = ModelName::model()->->findAll($criteria);
foreach ($result as $item){
  $city = $item->getCity();
  $name = $item->getAttribute('name');
}


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

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

Yii. Использование Google Map API для поиска координат точки по ее адресу.

Простой пример метода модели фреймворка Yii, для пооиска координат точки на карте по ее адресу. Используется Google Map API для поиска и CURL для обработки его результатов.

Одно маленькое замечание: частой проблемой при использовании поискового API - нессответствие кодировок. Рекомендую адрес который передается в метод searchPoint передавать посредством POST, так как в этом случае не будет бится кодировка (через GET бывают такие проблемы).

public function searchPoint($address=''){
 $key = Yii::app()->params['gmap'];
 $address = urldecode($address);

 $url = "http://maps.google.com/maps/geo?q={$address}&output=json&key={$key}";

 $ch = curl_init();

 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_HEADER,0);
 curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

 $data = curl_exec($ch);
 curl_close($ch);

 $data = CJSON::decode($data);

 $coord = $data['Placemark'][0]['Point']['coordinates'];
 return array('lng'=>$coord[0],'lat'=>$coord[1]);
}

CURL. Проверить существование URL

Если необходимо проверить существование файла в файловой системе, то достаточно выполнить код:

if(file_exists($filename)){....}

Если необходимо проверить существования URL то удобнее всего воспользоваться CURL. Отличительной особенностью такого подхода является то, что мы сами выставляем максимальный таймаут подключения к удаленному ресурсу. Тоесть нет необходимости ждать ответа от сервера, что нет такого урл - конект оборвется строго по таймауту.

function checkURLExists($url=""){
  if(empty($url))
    return false;
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_TIMEOUT, 5);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $response = curl_exec($ch);
  $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  curl_close($ch);
  if($http_code>=200 && $http_code<300)
    return true;
  return false;
}

четверг, 9 сентября 2010 г.

Настроить высоту iFrame по его контенту с помощью JQuery.Use JQuery to adjust the iframe height by content

Если на страницу добавляеться iFrame, то мы часто уже знаем его необходимую ширину, в тоже самое время, высота iFrame должна зависеть от его контента.

Напишем короткую функцию на jQuery, которая сможет подгонять ширину iFrame по его содержимому.

Пусть у нас на странице есть iFrame с id="iframe", тогда код ресайза следующий:

$(document).ready(function(){
  $("#iframe").load(setHeight);
});
function setHeight(){
  var iFrame = $(this, parent.document.body);
  iFrame.height($(document.body).height() + 30);
}

Отключить автозаполнение текстовых полей Firefox

Для того чтобы отключить в Firefox автозаполнение форм (текcтовых полей), которое мешает работе плагнам автозаполнения (autocomplete, autosuggest) нужно добавить к полю атрибут autocomplete="off"

Для того, чтобы проходила валидация W3C и не ругалась - с помощью jQuery добавим атрибут к полю:

$(document).ready(function(){
  $("input").attr('autocomplete','off');
}

среда, 8 сентября 2010 г.

Rails. Remove item from the session

Rails позволяет работать с сессиями, как с обычными хешами, потму операции добавления и удаления из сесии будут выглядеть так:

Для добавления нового элемента в сессию:

session[:item] = data

Для удаления из сессии элемента по имени:

session[:item] = nil

вторник, 31 августа 2010 г.

Ruby. Raspell example

require 'raspell'
require 'kconv'
require 'jcode'
$KCODE = 'u'
speller = Aspell.new("en_EN")
speller.suggestion_mode = Aspell::NORMAL
speller.set_option("encoding", "utf-8")
word = "tezt"
p word # => "tezt"
p speller.check(word) # => true
p speller.suggest(word) # => ["test", "text"]

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

Postgres. Создание новой БД, если ее кодировка не совместима с кодировкой базы-шаблона

Если вы начинающий пользователь в Postgres, то при создании новой БД (например в кодировке UTF8), часто вылазит ошибка:

ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (WIN1251)
HINT: Use the same encoding as in the template database, or use template0 as template.

Которая означает, что кодировка базы - несовпадает с кодировкой шаблона (например UTF8 и WIN1251).

Для решения проблемы (для UTF8), используйте SQL:

CREATE DATABASE db_name WITH template=template0 encoding=6

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

JavaScript ошибка в IE при использовании переменной с именем item

Сегодня обнаружил прикольный баг IE - непонятно почему выпадал эксепшин на странице (строго под IE).

В ходе дебага выяснилось, что причиной недовольства господина IE была переменная с именем item. Хотя она и не состоит в списке зарезервированных имен javascript.

Предельно внимательно относитесь к именам переменных в javascript. Проверяйте скрипты на кросс-броузерность.

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

Thinking Spinx. Разрешить использовать спец. символы в строке поиска

Если в ключевике понадобится использовать спец. символы (например найти товары по тегу Б\У) то поиск будет работать неправильно.
В случае когда ключевое поле содержит такие символы - их надо прописать как разрешенные в конфиг-файле /config/sphinx.yml (добавить для каждого блока и потом перезапустить сам sphinx):

development:
  ...
  charset_table: "0..9, A..Z->a..z,a..z, _, -, /, @, !, $, %, ^, &, (, ), +, `, ~, #"

production:
  ...
  charset_table: "0..9, A..Z->a..z,a..z, _, -, /, @, !, $, %, ^, &, (, ), +, `, ~, #"

Для того чтобы экранировать символы в строке поиска используйте класс который устанавливается вместе с плагином:

Riddle.escape(str)

Который экранирует те символы которые не поддерживаются

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

Rails. Проблема установки Curb gem под Ubuntu

Если возникает ошибка при установки гема curb:

gem install curb

Необходимо установить следующий пакет и попробовать заново:

sudo apt-get install libcurl4-openssl-dev

вторник, 10 августа 2010 г.

JavaScript replace

Пример демонстрирует как заменить подстроку в строке:

str="apple,lemon,cherry,apple,etc"
str = str.replace(/apple/, "test")

в результате получим строку: "test,lemon,cherry,apple,etc"
Заменило только первое вхождение. Для глобальной замены по всей строке, используется ключик глобал для регулярного выражения - "g":

str="apple,lemon,cherry,apple,etc"
str = str.replace(/apple/g, "test")

Получим:"test,lemon,cherry,test,etc"

Если необходимо чтобы регулярное выражение было нечувствительное к регистру символов:

str="Apple,lemon,cherry,apple,etc"
str = str.replace(/apple/gi, "test")

Получим:"test,lemon,cherry,test,etc"

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

Linux. Узнать конфигурацию компьютера

Процессоры:
# cat /proc/cpuinfo

Объём оперативной памяти:
# free

Список PCI устройств и мостов:
# lspci

Список USB устройств
# lsusb


Вывести размер, а так же свободное и занятое место на всех смонтированных файловых системах. 

# df -h


Размер папок в текущей директории (выберите через cd нужную директорию которую надо просканировать)
#du --si --max-depth=1


Размер папок и файлов в текуще директории
#ls -lh


*(ключик -h означает humanise - вывести инфо в "читабельном" виде)

вторник, 3 августа 2010 г.

Bash. Построчное чтение файла и разбивка строк с использованием делимитера

В посте постараюсь описать алгоритм построчного чтения текстового файла и разбиение его строк на части.

Допустим мы имеем текстовый файл такой структуры:

...
username1;password1
username2;password2
username3;password3
...

Пример просто для наглядности, пароли хранить так не безопасно.

#!/bin/bash

while read line ; do
  IFS=";"
  set -- $line
  username=$1
  password=$2
  echo -e "$username->$password\n"
done < filename.csv


Рассмотрим детальнее:
- цикл читает файл построчно, сохраняя текущую строку в переменной line
- IFS=";" выставляем делимитер разбивки (в нашем случае ";")
- set -- $line - разбиваем строку, после чего каждая ее часть будет доступна как $1, $2, ...

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

Новости для абонентов McLaut Черкассы

Поздравляю всех абонентов сети McLaut (Черкассы) с новыми тарифами:
10 Мбит/с - 65 грн
20 Мбит/с - 105 грн
30 Мбит/с - 205 грн

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

понедельник, 19 июля 2010 г.

Как поправить ошибку ob_clean error. Failed to delete buffer. No buffer to delete

Для устраниния ошибки:

ob_clean() [ref.outcontrol]: failed to delete buffer. No buffer to delete.

Установите в php.ini: output_buffering = 4096

Ошибка возникает из-за того, что по умолчанию это значение установлено как:
output_buffering = Off

четверг, 15 июля 2010 г.

MySQL. Востановить БД из дампа. Создать дамп БД.

Создание дампа БД:

mysqldump -h [hostname] -u [username] -p[password] [database_name] > [dumpfile]

Востановить БД из дампа:

mysql -h [hostname] -u [username] -p[password] [database_name] < [dumpfile]


Все команды записываються в одну строчку.

hostname - имя хоста, если локальная БД то localhost
username - имя пользователя БД у которого есть права доступа к текущей БД
password - пароль пользователя
database_name - имя БД
dumpfile - путь к дамп-файлу с указанием имени файла (раширение sql).
Пример: ~/dump.sql - сохраняем дамп в папке текущего пользователя (Unix,Linux) в файле dump.sql

Детальнее можно прочитать тут

четверг, 17 июня 2010 г.

MySQL. Название месяцев на русском.

Для того чтобы после выполнения запроса с форматированием даты, название месяцев было написано на русском, необходимо изменить локаль MySQL. Это можно сделать 2 способами.

Первый способ. Перед выполеним главного запроса, изменить локаль с помощью дополнительного запроса:

SET @@lc_time_names='ru_RU';


SELECT DATE_FORMAT( showdt, '%d %m %Y' ) AS created_at FROM `table`


Второй способ.  В файл /etc/mysql/my.cnf дописать:
set-variable = lc_time_names=ru_RU


Регулярные выражения в MySQL. REGEXP in MySQL

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

Примеры использования REGEXP:
SELECT * FROM `table` WHERE `name` REGEXP 'Ser.+'
Пример с использованием LIKE:

SELECT * FROM `table` WHERE `name` LIKE 'Ser%'
В обоих случаях будут выбраны записи, у которых в поле `name` находяться значения которые начинаются на "Ser"

Теперь приведу более сложный пример:

SELECT * FROM `table` WHERE `name` REGEXP  '^(A|B|C)'
Выбираем все имена, которые начинаються на A,B или C


Таким образом, в условии WHERE, можно прописывать регулярные выражения любой сложности. Необходимо помнить, что для регулярных выражений внутри MySQL справедливо правило: "Если найдено соответствие записи в таблице регулярному выражению, то такая запись попадет в результирующую выборку"

Правила построения запросов являются стандартными, а это значит что тренироваться можно на сайте Rubular. Где также, всегда можно посмотреть и на сами правила построения.

вторник, 15 июня 2010 г.

Настройка автодополнения методов и функций в Zend Studio

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

Для решения проблемы, нажмите в диспетчере проектов Zend Studio (PHP Explorer) правой кнопкой мышки, на корне вашего проекта, далее выберите пункт Configure->Add PHP support...



После чего, все будет работать отлично.

понедельник, 7 июня 2010 г.

Пример работы с Bash+Expect. Автоматизация роботы

Каждый разработчик в определенные моменты жизни сталкивается с задачами, ктороые требуют постоянно проделывать одну и туже работу каждый день. Если такая задача включает в себя авторизацию и работу на разнообразных удаленных машинах, или передачу файлов на другие сервера, то она явно подлежит автоматизации. Если одна и та же процедура повторяется несколько раз, то ее надо автоматизировать. Если вы при этом работаете в windows, то вам очень поможет Cygwin.

Специально для таких целей используется bash (командная оболчка Unix). Для автоматизации ввода пароля.логина используется другая оболчка - expect.

Приведу пример простого скрипта, кторый с вашей машины логинится на другую, авторизируется там и проводит обновление из SVN какого-то проекта (задача выбрана просто для примера, также для примера она буде запущена из под Cygwin)

Устанавливаем Cygwin, заходим в домашнуюю папку пользователся (например "c:\cygwin\home\Администратор\"). В ней создаем файл:
File: update.sh 

С таким содержимым:


#!/bin/bash
#!/bin/expect
expect -c 'spawn ssh -p 22 user@host;
expect assword ;
send "password\n" ;
send "cd /var/www/project_path\r";
send "sudo svn up\r";
expect assword ;
send "password\n" ;
expect "ssh>"'
echo "Update finished!"


#!/bin/bash - директива которая указывает местоположения непосредственно bash обработчика
#!/bin/expect - указывает местоположение обработчика expect

expect -c '...' - выполняет запуск консольных команд с перехватом ввода - вывода с помощью expect
spawn ssh -p 22 user@host; - конектимся к удаленному хосту с указаным именем пользователя
expect assword; - команда которая перехватывает ввод пароля и ждет когда мы его пошлем из нашего скрипта
send "password\n"; - посылаем запросившему серверу пароль пользователя в удаленной системе
send "cd /var/www/project_path\r"; - переходим в папку с проектом
send "sudo svn up\r"; - выполняем обноление из SVN с правами админа (предпологаем что наш юзер имеет права для віполнения команды sudo)
expect assword ; - перехватываем ввод пароля
send "password\n"; - отправляем пароль пользователя
expect "ssh>" - запрашиваем консоль
echo "Update finished!" - информируем об успешном обновлении

Обработка ошибок, варианты ввода вы уже можете дописать сами. Главная цель - пример реального использования bash+expect

Настройка svn+ssh для TortoiseSVN

Для того чтобы иметь возможность работать с SVN через ssh с использованием ppk (Putty Private Key) необходимо установить пакет Putty (putty, pageant обязательно). Запустите pageant, добавить ему ppk ключ (кликнув правой кнопкой на ярлыке в панели задач). Теперь вы можете работать с ключем.

Установите TortoiseSVN. В его настройках найдите вкладку Network, где внизу находится поле SSH client. Нажимаем кнопку Browse, теперь надо найти файл TortoisePlink.exe, в стандартной установке путь будет следующий: "c:\Program Files\TortoiseSVN\bin\TortoisePlink.exe". Таким образом мы указываем программу которая будет обрабатывать ssh запросы к svn хранилищу.



Теперь можно работать с хранилищем по ssh, аналогично как и для доступа через http.

Rails. Configure route to default controller

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

File: config/routes.rb
map.root :controller => "default_controller_name"

четверг, 3 июня 2010 г.

Ручная установка Ruby on Rails дебагера для NetBeans IDE 6.8

Для того чтобы установить дебагер с консоли, выполните команду:

sudo gem install ruby-debug-ide --no-rdoc --no-ri --version 0.4.9

--version 0.4.9 версия отладчика для NetBeans IDE 6.8

--no-rdoc --no-ri отключаем установку документации по дебагеру(отладчику) ( ri: Ruby Index или консольная документация, RDoc: Ruby Documentation)

четверг, 27 мая 2010 г.

Рекурсивное удаление папки в консоли Windows

Для автоматизации понадобилось написать bat файл который работает с svn, после чего необходимо рекрсивно удалить папку с файлами. В unix все очень просто, а вот тут пришлось поискать:

rd folderpath /s /q

rd - синоним rmdir - удаление папки
/s - включает рекрсивное удаление файлов и папок
/q - отключает запрос подтверждения операции удаления

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

Типичные ошибки php session_start

 Иногда в PHP появляются ошибки связанные с session_start

1) Cannot modify header information - headers already sent by...
2)  No such file or directory in open(/....)

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

2) Если вы увидели ошибку связанную с тем, что невозможно найти какие-то файлы (метод open), тогда знайте - у вас неправильно настроен путь для хранения сессий на диске. Нужно прописать папку, у которой для веб-сервера есть доступ. Открываем php.ini и правим константу session.save_path

Denwer. Настройка нестандартных виртуальных хостов.

Очень часто я встречаю на всяких форумах вопросы по поводу настройки нестандартных виртуальных хостов для Denwer.

Также, часто я читаю как "профи" по этому поводу злятся и пишут о том, что надо ставить связку Apache+PHP+MySQL руками, вместо того чтобы просто помочь людям разобраться и хи вопросом. Я считаю что как именно ставить связку - руками или с помощью Денвера - дело разработчика.

В Денвере проблема нестандартных хостов решаеться очень даже просто:

1) находим \usr\local\apache\conf\httpd.conf
2) находим там строку: Include conf/vhosts.conf
3) Выше этой строки можете описывать свои нестандартные хосты, при этом не напрягаясь о тех хостах, которые система генерит автоматом

Еще более красивое решение, это свои нестандартные настройки положить в файл, например myvhosts.conf. Потом подключить его перед файлом хостов которые генериться автоматически.

Таким образом, все будет выглядеть так:

Include conf/myvhosts.conf 
Include conf/vhosts.conf

среда, 28 апреля 2010 г.

Пример использования REPLACE в MySQL

Предлагаю вашему вниманию пример использования метода REPLACE в MySQL.

Допустим, есть задача: в определенной таблице заменить в некотором поле символ "&" на "-":
Сложный способ:


  UPDATE `table_name` t1, `table_name` t2
  SET t1.`field_name`= REPLACE(t2.`field_name`, '&', '-')
  WHERE t1.id = t2.id


Так как вся работа происходит в одной таблице, то необходимо использовать механизм алиасов для работы с одной таблицей как с двумя. Важным критерием является условие t1.id = t2.id, так как мы должны изменять одно и то же поле.

Или более простой вариант, который работает когда t1.id = t2.id и лишние проверки можно отбросить:

  UPDATE `table_name`
  SET `field_name`= REPLACE(`field_name`, '&', '-');

Сам механизм замены предельно прост:
  REPLACE(имя поля или просто текст, что меняем, на что меняем)

Простое и удобное решение. Надеюсь кому-то пригодится.