Разработка: заметки, переводы, статьи, решения

Django на production. uWSGI + nginx. Подробное руководство

Перед вами руководство по настройке production окружения для Django. Здесь будут описаны необходимые шаги по настройке Django, uWSGI и nginx. Руководство охватывает все три компонента — полный стек серверного ПО для веб-приложений.

Подразумевается, что вы используете Unix-подобную операционную систему и менеджер пакетов, эквивалентный aptitude. Найти эквивалент aptitude почти для любой операционной системы, в том числе и для Mac OS X, для вас не составит никакого труда.

Руководство написно для версий Django 1.4 или выше. Если вы используете более раннюю версию, то вам придется самостоятельно найти wsgi модуль для нее. Также вы заметите, что файловая структура проекта будет немного отличаться от представленной здесь.

Общая идея

Веб-сервер может по запросу отдавать пользователям файлы из своей файловой системы, однако он не может напрямую работать с Djangо приложениями. Веб-серверу нужен интерфейс, который будет запускать Django приложение, передавать ему запрос от пользователя и возвращать ответ.

Для выполнения этих задач был разработан Web Server Gateway Interface — WSGI — стандарт взаимодействия Python программ и веб-сервра.

uWSGI — одна из реализаций WSGI. В этом руководстве мы установим и настроим uWSGI для создания Unix сокета и взаимодействия с веб-сервером по протоколу WSGI.

Ubuntu. Окно застряло за панелью

Вчера я столкнулся с тем, что заголовок окна спрятался за панель, и из-за этого я не мог переместить окно в другое место.
Достать окно из-под панели, как оказалось, очень просто. Перемещать окна можно не только зажав мышку на заголовке. Можно еще, удерживая клавишу Alt, зажать мышку в любой точке окна и перетащить его в нужное место.

Prettify. Самый крутой модуль для подсветки синтаксиса

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

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

<pre class="prettyprint">
code here
</pre>

Автоматическое подключение

<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>

Можно передавать опции в виде CGI параметров. Например:

<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?lang=css&skin=sunburst"></script>
CGI параметр По умолчанию Описание
autoload=(true | false) true Запускать по событию window load
lang=... none Язык. (список поддерживаемых). Можно передавать несколько значений (?lang=css&lang=js).
skin=... none Скин. Галерея скинов
callback=js_ident функция window.exports["js_ident"] будет вызвана после окончания работы модуля. Можно передавать несколько значений.

Подкючение вручную

<link href="prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="prettify.js"></script>
<body onload="prettyPrint()">

Скачать prettify.css и prettify.js можно отсюда


Angularjs. Организация модели данных

Оригинал статьи: http://www.webdeveasy.com/angularjs-data-model/
По мере того как растет приложение, представление данных в виде набора JSON объектов становится все менее удобным. В этой статье я расскажу про способ организации работы с данными в своих приложениях.

Описание модели

Начнем с простого примера. Создадим страницу с информацией о книге. Контроллер:

Laravel artisan commands. Вывод шпаргалки по команде

Про создание команд: http://laravel.com/docs/commands#introduction

При выводе в консоль информации о синтаксических ошибках, хорошо выводить правильную структуру команды, например, вот так:

Вы забыли ввести имя пользователя
users:create [-u|--username="..."] [-p|--password="..."]

Это реализовывается методом getSynopsis

$this->error('Вы забыли ввести имя пользователя');
$this->info($this->getSynopsis()); 

PHP. Ключевое слово use в замыканиях

Есть замыкание, вызов которого мы не контроллируем. Пример:

$users = User::with(array('posts' => function($query)
{
    $query->where('title', 'like', '%first%');

}))->get();

Что делать, если нужно передавать в замыкание какое-нибудь значение. Например, для третьего аргумента метода where? Первое, что пришло в голову:

$like = '%first%';
$users = User::with(array('posts' => function($query)
{
    $query->where('title', 'like', $like);
}))->get();

Это не сработает, потому что переменная $like не видна там, где будет вызвано замыкание.

Передать переменную в замыкание можно, используя ключегове слово use:

$like = '%first%';
$users = User::with(array('posts' => function($query) use ($like)
{
    $query->where('title', 'like', $like);

}))->get();

Чутье подсказывает, что лучше избегать этого метода. Почему? Пока не понял.


Laravel 4. получение связанных объектов, которые уже загружены из базы

Очень полезная штука, которая отсутствует в документации

if(isset($user->relations['posts']){
    //если посты уже быль загружены то, запроса к базе не будет
    $posts = $user->relations['posts']
}else{
    //иначе запрос будет
    $posts = $user->posts
}

Обратите внимание, в $user->relations['posts'] лежат только те посты, которые были загружены заранее. Например, если перед вышепреведенным кодом выполнить:

$users = User::with(array('posts' => function($query)
{
    $query->where('title', 'like', '%first%');

}))->get();

То в $user->relations['posts'] будут лежать только те посты пользователя, в заголовке которых есть слово first.