Nginx, кэширование статических файлов

В продолжение предыдущего поста.

Чтобы ускорить работу сайта потребовалось кэшировать статические файлы (по большей части для javascript и для CSS).

Находим секцию

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|txt|xml)$ {
...
}

и добавляем директиву expires:

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|txt|xml)$ {
...
expires 7d;
}

Проверяем в FireBug-е во вкладке NET: обновляем страницу 2 раза и смотрим код ответа.
Если “200 ОК” – значит не работает.
Если “304 Not Modified” – добились чего хотели.

Ссылки по теме:

Nginx, медленная отдача статики

В процессе работы возникла у меня неприятная ситуация: не хотел sitemap.xml нормально загружаться.
По началу думал что ошибка в самом файле. Но он даже wget-ом не хотел сливаться. wget Получал 16 килобайт, подвисал, рвал соединение, открывал новое, получал 16 килобайт, …

Решил проверить на других файлах. Архив tar.gz я скачал со свистом, а с обычным текстовым файлом была таже история что и с сайтмапом.

В результате недолгого гугления полез в настройки nginx-а, нашел строчку, которая отвечала за статические файлы:

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$

и просто добавил в конце еще txt и xml:

location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|txt|xml)$

Перегрузил nginx и всё заработало как нужно.

Ссылки по теме:

Установка софта на PocketBook IQ 701

PocketBook IQ 701

Попала в руки такая вот книжица. Как электронная книга – весьма неплохой экземпляр. Но там же Android, значит книжка должна уметь большее, значит нужно поставить, попробовать, помучить. И понеслася… :)

Continue reading

Как перенаправить на найденный пост?

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

Для этого просто добавьте следующий код в файл functions.php активной темы:

add_action('template_redirect', 'redirect_single_post');
function redirect_single_post() {
    if (is_search()) {
        global $wp_query;
        if ($wp_query->post_count == 1) {
            wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
            die;
        }
    }
}

Найдено на WpRecipes.com

Настройка цвета подсказки

Решил обновить Ubuntu до последней (12.04) версии.
Вместе с системой обновилась и среда рабочего стола (desktop environment). Unity не понравился. Да, красивый, но не удобный. Попробовал панель Cairo-Dock. Стало еще красивей, еще интересней, но все равно не то.
Можно, конечно, было привыкнуть, но лучше за день настроить под себя, чем неделю привыкать. С этой мыслью и решил попробовать Xfce.

Удобная, быстрая среда. Довольно-таки быстро подстроил под себя. Практически также как и было до обновления.

Встречаются, правда, нюансы.

При отображении подсказок в PDT Eclipse надписи были черным текстом на черном фоне, что совсем не способствовало читабельности.

Погуглив, нашел решение:
прописываем в файл ~/.gtkrc-2.0 (для одного пользователя) или в файл /etc/gtk-2.0/gtkrc (для всех пользователей системы) следующий код:

style "my-tooltips"
{
        bg[NORMAL] = "#777777" #цвет фона
	fg[NORMAL] = "#000000" #цвет шрифта
}
 
widget "*tooltip*" style "my-tooltips"

Затем изменяем тему на любую другую и обратно (чтобы изменения вошли в силу) и вуаля.

Добавляем кнопки к редактору в полноэкранном режиме

На прошлой неделе я уже писал как добавить кнопки к текстовому редактору. Однако я совсем упустил из виду что есть еще и полноэкранный режим редактирования (который появился в WordPress версии 3.2)

Исправляю свою оплошность.

add_filter('wp_fullscreen_buttons', 'foo_fullscreen_button');
function foo_fullscreen_button($buttons) {
  $buttons[] = 'separator';
 
  $buttons['foo_button'] = array(
    'title' => __('Foo Button'),
    'onclick' => "alert('Hello World');",
    'both' => true //отображать нашу кнопку и в HTML-редакторе и в Visual-редакторе
  );
  return $buttons;
}

Ссылки по теме:

Добавляем кнопки к редактору WordPress

Добавление кнопки к HTML-редактору.

Для этого необходимо использовать javascript функцию QTags.addButton, которая выглядит следующим образом:

QTags.addButton(id, display, arg1, arg2, access_key, title, priority, instance);

наиболее используемые параметры:

id – уникальный id нашей кнопки;

display – имя, которое будет отображаться;

arg1 – открвыающий тэг;

arg2 – закрывающий тэг;

access_key – горячая клавиша;

title – аттрибут title кнопки.

Пример:

<script type="text/javascript">// <![CDATA[
QTags.addButton('fb_button', 'button_name', '[button]', '[/button]', 'b', 'button_name');
// ]]></script>

Также вместо открывающего/закрывающего тэга можно использовать ф-цию, которая будет выполняться при нажатии на кнопку:

<script type="text/javascript">// <![CDATA[
QTags.addButton('fb_button', 'button_name', fb_callback);
 
function fb_callback() {
alert('Hello World!');
}
// ]]></script>

Добавление кнопки к visual-редактору.

add_action('init', 'foo_addbuttons');
function foo_addbuttons() {
  if (!current_user_can('edit_posts') &amp;&amp; !current_user_can('edit_pages')) return;
 
  if (get_user_option('rich_editing')=='true') {
    add_filter('mce_buttons', 'foo_mce_register_button');
    add_filter("mce_external_plugins", "foo_add_tinymce_plugin");
  }
}
 
//регистрируем кнопку
function foo_mce_register_button($buttons) {
  array_push($buttons, '|', 'foo_button');
  return $buttons;
}
 
//добавляем плагин к TinyMCE
function foo_add_tinymce_plugin($plugin_array) {
  $plugin_array['foo_button'] = get_stylesheet_directory_uri() . '/js/foo_mce_plugin.js';
  return $plugin_array;
}

Теперь в папке js темы (для плагина, думаю не составит труда изменить путь) создаем файл со скриптом плагина для TinyMCE (foo_mce_plugin.js):

(function() {
  tinymce.create('tinymce.plugins.foo', {
    init: function(ed, url) {
      ed.addButton('foo_button', {
        title: 'Foo Button',
        image: url + '/foo_btn.gif',
        onclick: function() {
          ed.windowManager.alert('Hello world!');
        }
      });
    },
    createControl: function(n, cm) {
      return null;
    },
    getInfo: function() {
      return {
        longname : 'FooBar Button',
        author : 'John Doe',
        authorurl : 'http://JohnDoe.tld/',
        infourl : 'http://FooBar.JohnDoe.tld/',
        version : '1.0'
      };
    }
  });
  tinymce.PluginManager.add('foo_button', tinymce.plugins.foo);
})();

Ссылки по теме:

Краткое руководство по Git

Клонируем репозиторий:

$git clone gituser@server.name:repo.git

или, если хотим клонировать в папку со своим названием (а не repo):

$git clone gituser@server.name:repo.git folder_name

Переходим в папку с копией репозитория и создаем новую ветку:

$git checkout -b dev

где dev – название ветки

Работаем с проектом, тестируем. Индексируем и коммитим:

$git add .
$git commit -m 'Commit comment'
Коммиты желательно чтобы были небольшими.

Посмотреть историю коммитов:

$git log

Вывод конечно может занять не один экран. Чтобы увеличить читабельность можно создать алиас для логов, добавив следующее в файл .gitconfig в вашем $HOME каталоге:

[alias]

hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short

Подробнее про создание алиасов

Теперь можно смотреть историю в компактном виде:

$git hist

Продолжаем работать с проектом, тестируем, индексируем и коммитим.

Как только закончили с поставленной микрозадачей, то можно пометить меткой (тэгом). Например, для того, чтобы обозначить версию проекта:

$git tag ver.1.3

Чтобы удалить метку пишем

$git tag -d ver.1.3

Как только захотели поделиться с остальными своими наработками выполняем следующие шаги:
1. Вытягиваем последнюю версию проекта (на случай обновления проекта другими разработчиками)

$git pull

2. Объединяем свои наработки с основной веткой

$git checkout master
$git merge dev

(dev – название нашей ветки)

Если ветка больше не нужна – удаляем:

$git branch -d dev

3. Заливаем свои обновления

$git push

Чтобы залить вместе со своими тэгами:

$git push --tags

Иногда возможны конфликты. Могут возникнуть как на стадии добавления коммита, так и на стадии слияния (объединения) веток. Их придется разруливать самим и руками. Почитать про это можно тут или тут

Несколько рекомендаций:
1. Коммиты желательно делать небольшими. Чтобы было проще вернуться на шаг-несколько назад.
2. Отдельная мысль == отдельная ветка. Если необходимо срочно исправить ошибку не связанную с текущей работой, то лучше создать новую ветку.
3. Комменты к коммитам необходимо писать осмысленные.

Ссылки по теме:

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

Мини мануал на тему установки и использования Git под Windows.

1. Скачиваем Git отсюда. Я скачал последнюю на данный момент версию (1.8.0). Вот прямая ссылка: http://msysgit.googlecode.com/files/Git-1.8.0-preview20121022.exe

2. Устанавливаем. В процессе установки установщик (сорри за тафталогию) спросит тип запуска Git:

  • Git bash only: git ставится и вызывается командой контекстного меню “Git bash here”/”Git gui here”
  • Run from the Windows command prompt: Устанавливает Git и прописывает путь к консольной версии в PATH. Команду ‘Git Bash here’ всё равно можно использовать.
  • Run Git and tools from Windows Command Prompt: то же что предыдущий вариант, но дополнительно прописывает в Windows путь к различным Unix-утилитам типа find и sort. Git предупреждает нас что при этом вместо windows-приложений с соответствующими именами будут вызываться unix-аналоги

Я выбрал первый пункт. Можно выбрать второй. Третий не рекомендую.

3. Запускаем консоль Git

4. В консоли Git генерируем ssh ключ:

$ssh-keygen -t rsa

Под виндой, по неведомым мне причинам, работал только ключ с именем по умолчанию. Так что соглашаемся с тем что предлагает софтина и дважды вводим пароль к ключу. Ключи будут лежать в папке вида C:\Users\username\.ssh\ и называться id_rsa и id_rsa.pub соответственно. Публичный ключ (id_rsa.pub) нужно передать своему администратору, чтобы он добавил его в Gitolite и дал вам необходимые права.

5. Теперь можно запускать Git Bash, переходить в нужную папку и работать с Git также как и в Linux. Правда при каждом запросе к серверу будет просить пароль от ключа.

Можно попробовать сделать чтобы не просил, но у меня не было возможности протестировать. Так что оставляем это как “домашнее задание”.

Ссылки по теме:

Поднимаем Git на сервере

Будем считать что ОС у нас Debian/Ubuntu; cервер server.name; пользователь на сервере уже создан. Имя его gituser. Домашняя директория – /home/gituser.

Для начала создадим ssh ключ (на клиентской машине). Он понадобится нам в дальнейшем.

$ssh-keygen -t rsa

Попросят ввести путь и имя, куда и с каким названием сгенерируется пара ключей (приватный и публичный). Можно оставить по умолчанию, я же введу другое имя (отметил жирным):

Enter file in which to save the key (/userhome/.ssh/id_dsa):

/userhome/.ssh/developer1

Потом попросят дважды ввести passphrase (пароль). После создания ключей закинем публичный на наш сервер:

$scp ~/.ssh/developer1.pub gituser@server.name:~/.ssh/developer1.pub

Заходим на сервер под нашим пользователем (gituser).

Устанавливаем Git:

$sudo apt-get install git-core

Устанавливаем Gitolite:

$git clone git://github.com/sitaramc/gitolite
 
$gitolite/install -ln

Добавляем публичный ключ в Gitolite (если еще нет публичного ключа, то прочитайте выше как его создать):

$gitolite/src/gitolite setup -pk ~/.ssh/developer1.pub

Репозитории Gitolite хранит в поддиректории repositories домашней папки юзера gituser. Все настройки и ключи хранятся в отдельном репозитории gitolite-admin.git.

Создадим его локальную копию на клиентской машине:

$git clone gituser@server.name:gitolite-admin.git

Чтобы добавить нового пользователя просто записываем его публичный ключ в папку keydir. Имя ключа до окончания .pub будет являться именем пользователя в системе Gitolite. Или добавляем на сервере:

$gitolite/src/gitolite setup -pk ~/.ssh/developer2.pub

 

Для добавления репозитория и/или измениния права редактируем файл conf/gitolite.conf. Затем применяем и отправляем все изменения:

$git add .
 
$git commit -m 'Added new repository and new users'
 
$git push origin master

Можно сгруппировать пользователей или репозитории для удобства:

@repo_group1 = repo_1 repo_2

@repo_group2 = repo_3

@repo_group2 = repo_4

 

@dev_group1 = developer1 developer2

@dev_group1 = developer3 developer4

@dev_group2 = developer5

@all_dev = @dev_group1 @dev_group2 developer6

 

repo @repo_group2

RW+ = @all_dev

repo @repo_group1 repo_5

RW+ = @dev_group1 developer7

Подробнее о конфигурационном файле Gitolite можно прочитать на официальной странице.

Ссылки по теме: