SSH Socs-proxy для параноиков

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

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

Решение проблемы — работа через SSH Socks-proxy

Сначала запускаете такую команду:

ssh -D localhost:8080 ваше_имя@адрес_удаленного_компьютера

После этого в сетевых настройках браузера выберите использование Socks-proxy, укажите порт и работайте через защищённый канал!

Google Analytics в Kohana

Речь пойдёт не об установке счётчика GA на сайт. Тут и писать нечего. Гораздо более интересно наблюдать за статистикой из своего движка.

С одной стороны я видел такую фишку когда разбирал PyroCMS и ещё пару других CMS на CodeIgniter. С другой стороны как раз один заказчик попросил такую штуку к себе на сайт.

Читать далееGoogle Analytics в Kohana

Kohana 3.2. Валидация

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

Прежде чем буду описывать — оговорюсь. Я сторонник того, чтобы описывать всю валидацию в модели ORM. Религия у меня такая. Поэтому …

Делаем раз
============================
Описываем правила. Просто добавляем в модель два метода rules и labels.

Вот простой пример:
public function rules() { return array( ‘title’ => array( array(‘not_empty’), ), ); }
public function labels() { return array( ‘title’ => «Заголовок», ); }

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

В общем-то дело почти сделано. При сохранении объекта теперь всегда будет выполняться проверка.

Делаем два
=======================
Проверка выполняется всегда при сохранении объекта. Если нужно просто проверить без сохранения, можно использовать метод check. К сожалению ошибки валидации будут вылетать как ошибки, которые нужно будет отлавливать.

Вот пример кода из контроллера:
try{ // $page->save(); $page->check(); } catch(Exception $e) { $errors = $e->errors(‘validation’); foreach ($errors as $error){ echo «Ошибка: «. $error; } }

Никогда не любил использовать try , но куда деваться, очень уж хочу использовать именно штатную валидацию из ORM.

Какие можно делать правила
========================
Все правила — это суть методы объекта Kohana_Valid и вы сможете их найти в файле /system/classes/kohana/valid.php. Смысл большинства из них очевиден из названий для каждого, кто дружит с великим и могучим английским языком.

Некоторые правила просты и не требуют использования аргументов. Например правило not_empty и email
public function rules() { return array( ’email’ => array( array(‘not_empty’), array(’email’), ), ); }

Некоторые требуют одного или более аргументов. Например exact_length требует 2, собственно значение поля и желаемая длина (строки).
public function rules() { return array( ‘some_field’ => array( array(‘exact_length’ , array(‘:value’, 5)), ), ); }

Если не хватает стандартных, то можно написать своё правило. Только лучше оформить его в виде функции и хранить в этой же модели.
public function rules() { return array( ‘some_field’ => array( array( array($this,’check_something’) , array(‘:value’)), ), ); } public function check_something($value) { // тут может быть какая угодно сложная логика ……………….. return (bool) $blablabla; }

Однако не торопитесь сразу создавать функцию. Пробегитесь по базовому классу ORM. Он имеет довольно большие возможности. Например, для проверки уникальности поля можно использовать уже готовый метод unique. Вот пример проверки email на валидность, непустоту и уникальность:
public function rules() { return array( ’email’ => array( array(‘not_empty’), array(’email’), array(array($this, ‘unique’), array(’email’, ‘:value’)), ), }

Делаем три
============================
Если вы добавляли свои правила — не забудьте добавить какие-нибудь соответствующее описание в /application/messages/validation.php

Ссылки по теме
============================
Kohana 101 от Броткина Ивана — тут замечательно расписана валидация, каждая функция разобрана по косточкам. Заходите и читайте.

Kohana ORM. COUNT_ALL() и RESET(false)


Кто работал с пагинацией наверняка сталкивался с такой задачкой. Дана выборка со сложными фильтрами, надо узнать количество элементов всего и выдернуть, условно говоря, 10 элементов начиная с 30-го. Надо просто выполнить два похожих запроса. Например так:

$count= ORM::factory(«post») -> where(«published»,»=»,1) -> count_all(); $posts= ORM::factory(«post») -> where(«published»,»=»,1) -> limit(10)->offset(30)-> found_all();

Обратите внимание, в этом примере у нас был фильтр published=1 . Пока всё просто и понятно. Мы просто дважды выполнили запрос со схожими фильтрами.

Но иногда фильтры бывают довольно сложными и генерироваться несколькими страницами кода. В таких случаях возникает соблазн один раз накопить фильтры, чтобы дважды потом использовать. Однако есть проблема. Функция count_all() сбрасывает ORM в ноль в том числе и все фильтры.

Что же делать? Чтобы ORM не сбрасывалась, нужно один раз запустить функцию reset(false). Пример:

$posts = ORM::factory(«post») -> reset(false); /// Вот оно! $posts = $posts -> where(«published»,»=»,1); // Дальше накручиваем фильтров if(……){ $posts = $posts->where( ……….); } …………………….
$count = $posts — >count_all();
// Теперь ничего не теряется $posts = $posts -> limit(10)->offset(30)-> found_all();

Вот такая зарубочка на память.

Git. Конфликты бывают разные

Это короткий пост, по сути это пост картинка.

Недавно получил такой забавный конфликт. Файл до меня был пустым, и после меня остался пустым. Но обнаружен конфликт и всё тут.

На CRLF вроде не похоже… Я уже и спецсимволы включил. Забавная такая история. У вас такое бывает?

S2 — лёгкая CMS


Хочу предоставить вашему вниманию S2 CMS. S2 довольно лёгкая иминималистичная система. Она прекрасно подойдёт для тех кому быстро-быстро нужен блог или сайт визитка.

CMS имеет довольно дружественную админку. Краткий перечень базовых возможностей впечатляет:

  • Система позволяет организовать набор страниц. Возможна иерархическая структура.
  • Подсистема контроля комментариев.
  • Управление пользователями с довольно сложной системой доступов.
  • Файловый менеджер загруженный файлов.
  • Поддержка различных языков.
  • Подключение модулей.

K S2 есть несколько очень полезных авторскими дополнений. На официальном сайте есть возможность скачать два варианта — с дополнениями и без. Я считаю что нет даже смысла качать вариант без дополнений.

Вот список имеющихся на данный момент дополнений:

  • Blog — Блог. Без этого дополнения сайт содержит лишь статичные страницы
  • Counter — Система внутренней статистики посещений. Строит красивые графики.
  • Editor Highlighting — Подсветка HTML-кода в редакторе.
  • Russian typography — Заменяет кавычки на правильные, ну и прочая русская типографика.
  • Search — Система полнотекстового поиска. По утверждению разработчика учитывает русскую морфологию! Периодически требует переиндексации.
  • Template editor — встроенный редактор шаблонов. Позволяет редактировать файлы шаблона
  • WYSIWYG — просто незаменимая вещь TinyMCE. Без этого дополнения все тексты придётся писать в сыром HTML.

Кто-то скажет, что у WordPress плагинов больше, но не забудьте, что половина плагинов в WP откровенное сырьё без гарантии нормальной работы, а тут заботливо отлаженный код, написанный самим автором CMS.

На самом деле CMS просто впечатляющая, если спомнить, что её написал один человек.

CMS отлично подойдёт для чайников, или почти чайников. Естественно при условии, что не захочется чего-то большего

Но вот разработчикам наверное будет неуютно что-то допиливать в этом коде. Так что для своих поделок я люто и бешенно хочу сваять что-то своё. Тем более, что перед глазами такие образцы. =)

UPD: при установке мне пришлось закомментировать в .htaccess строчку связанную с MultiViews. Зачем она была нужна, не знаю. Без неё всё работает.

Как получать дополнительные данные от социальных сетей

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

Facebook
==========================
Выборка данных, выдаваемая фейсбуком по-умолчанию довольно бедная. Там, например, нет email, который нуже практически всегда. Или например дата рождения. Чтобы их получить нужно определить scope

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

$client = new oauth_client_class; $client->server = ‘Facebook’; $client->redirect_uri = ‘http://’.$_SERVER[‘HTTP_HOST’]. dirname(strtok($_SERVER[‘REQUEST_URI’],’?’)).’/this_script_url.php’;
$client->client_id = ‘xxxxxxxxx’; $application_line = __LINE__; $client->client_secret = ‘xxxxxxxxxxxxxx’;
$client->scope = ’email, user_birthday’;

Дополнительные ключи безопасности Facebook можно посмотреть тут

LinkedIn
==========================

Если вы считаете штатную выдачу Facebook малоинформативной — вы не видели штатную выдачу LinkedIn. Там вообще нет ничего, кроме имени пользователя. Для получения нужного набора информации нужно формировать целый запрос, который является частью URL. Не буду приводить весь код, приведу пример URL

‘http://api.linkedin.com/v1/people/~:(first-name,last-name,phone-numbers,email-address,main-address,picture-url,date-of-birth,positions:(title,company))’,

Подробнее о построении таких запросов для LinkedId смотреть тут: http://developer.linkedin.com/documents/field-selectors
Полное описание параметров запроса : http://developer.linkedin.com/documents/profile-fields

Самодельный аккордеон на jQuery


Недавно пришлось написать свой аккордеон. Пришлось, потому что штатный, включённый в Twitter Bootstrap, глючит в MSIE. Например на момент написания поста аккордеон глючил в IE9.

Впрочем, нет ничего сложного в написании такого аккордеона самостоятельно.

HTML
===========================

Тут делаем всё как для обычного аккордеона

Git — автоконвертация CRLF и всё такое


Недавно пришлось поразбираться с автоконвертацией Git. Там не всё так очевидно, как кажется. Вот казалось бы — просто редактируй файл и делай свои коммиты. Но нет!

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

В результате гугления выяснилось что с опцией autocrlf всё не так просто

* autocrlf true — git при каждом коммите будет преобразовывать CRLF в LF и наоборот при чтении из репозитория. Таким образом в репозитории будет православный LF а пользовательский редактор будет получит CRLF. Это сделано специально для Windows пользователей.

* autocrlf input — git при каждом коммите будет преобразовывать CRLF в LF, но при чтении из репозитория выдаст всё как есть в оригинале. Эта опция для тех, у кого редактор нормально воспринимает оба окончания строки, но хочет содержать репозиторий в едином формате. Эта опция рекомендуется для линуксоидов.

* autocrlf false — git не выполняет никаких преобразований. Как файлы создаёте — так они и будут сохранены. В общем-то подходит, если кроме вас никто не работает в этом репозитории, или если все разработчики используют софт с одинаковыми принципами сохранения конца строки.

Вот. Теперь мы с коллегой поставили себе нужные настройки. Пока конфликтов не попадалось

Есть у кого-нибудь чем-нибудь дополнить в мою картину мира?