Архив автора: shilovk

du поиск по размеру папки

http://linuxcmd.ru/kak-uznat-razmer-papki-v-linux

du -s *|sort -nr|cut -f 2-|while read a;do du -hs $a;done

Просмотр размера текущей папки

Чтобы показать объем просто одного текущего каталога (со всеми вложенными файлами + подкаталогами) подойдёт команда du с ключиком -sh.

Вот пример, как определить размер директории данного сайта:

du -sh

root@Debian:/var/www/linuxcmd.ru# du -sh
25M     .
root@Debian:/var/www/linuxcmd.ru#

Посмотреть размеры всех папок

 

Если нужно посчитать вес всех директорий плюс файлы — добавляем звёздочку:

du -sh *

root@Debian:/var/www/linuxcmd.ru# du -sh *
4.0K    unix.html
8.0K    authorize.php
4.0K    cron.php
2.1M    files
4.0K    centos.html
72K     img
2.2M    includes
4.0K    index.php
4.0K    install.php
912K    misc
12M     modules
196K    profiles
4.0K    robots.txt
80K     scripts
7.0M    sites
696K    themes
8.0K    translations
20K     update.php
4.0K    web.config
4.0K    xmlrpc.php
0       ubuntu.txt
root@Debian:/var/www/linuxcmd.ru#

Отобразить размеры всех вложенных папок

Чтобы проверить информацию в том числе вообще по всем папкам, вместе со вложенными — понадобится самый короткий вариант:

du -h

Внимание: если такой случайно запустить в корне на объёмном диске с большим количеством информации — лучше сразу жмите CTRL-C, т.к. во-первых, иначе придётся сильно подождать  ;)  , во-вторых, десятки-сотни экранов информации будут бессмысленными. Потому эта простая команда должна использоваться лишь для, соответственно, простых случаев.

Отсортировать папки по объёму

du -s *| sort -nr

Покажет объём в килобайтах с сортировкой — самые большие папки/файлы сверху. Если нужно в мегабайтах:

du -sm *| sort -nr

К сожалению более удобный ключик h («human» — автовыбор кило-мега-гига) в данном случае (du -sh *| sort -nr) не подойдёт, т.к. сортировка идёт по «числам» (не учитывая, что это KB/MB/GB). Для этого придётся использовать длинную команду:

du -s *|sort -nr|cut -f 2-|while read a;do du -hs $a;done

root@Debian:/var/www/linuxcmd.ru# du -s *|sort -nr|cut -f 2-|while read a;do du -hs $a;done
12M     modules
7.0M    sites
2.2M    includes
2.1M    files
912K    misc
696K    themes
196K    profiles
80K     scripts
72K     img
20K     update.php
8.0K    translations
8.0K    authorize.php
4.0K    xmlrpc.php
4.0K    web.config
4.0K    robots.txt
4.0K    install.php
4.0K    index.php
4.0K    centos.html
4.0K    cron.php
4.0K    unix.html
0       ubuntu.txt
root@Debian:/var/www/linuxcmd.ru#

Получается «заумно», зато всё красиво!

Такую можно уже запускать даже в корне, обождав (если файлов много — серьёзно обождав) получим нечто типа:

root@Debian:/# du -s *|sort -nr|cut -f 2-|while read a;do du -hs $a;done
du: cannot access `proc/30976/task/30976/fd/4′: No such file or directory
du: cannot access `proc/30976/task/30976/fdinfo/4′: No such file or directory
du: cannot access `proc/30976/fd/4′: No such file or directory
du: cannot access `proc/30976/fdinfo/4′: No such file or directory

314M    usr
291M    var
120M    lib
76M     tmp
34M     home
18M     boot
4.6M    bin
4.4M    sbin
3.0M    etc
56K     dev
32K     root
16K     lost+found
4.0K    srv
4.0K    selinux
4.0K    opt
4.0K    mnt
4.0K    media
0       sys

du: cannot access `proc/31009/task/31009/fd/4′: No such file or directory
du: cannot access `proc/31009/task/31009/fdinfo/4′: No such file or directory
du: cannot access `proc/31009/fd/4′: No such file or directory
du: cannot access `proc/31009/fdinfo/4′: No such file or directory

0       proc
root@Debian:/#

 

Если вам помогла или просто понравилась статья - плюсаните/поделитесь, пожалуйста.

 

Комментарии

 

Linux + размер папки = du —si -s

Вообще-то, это то же самое, как и определение размера директории с помощью du -sh ;)  Ибо ключик —si = -h, лишь считающий, что 1024=1000 :)

 

Народ, а как найти размер папки (linux), у которой он больше чем, скажем, 100 мегабайт?

Придётся использовать (для linux — размер папок) ещё более хитрую конструкцию с добавлением find:

find -type d | while read DIRNAME; do if ((`du -sm «$DIRNAME» | awk ‘{print $1}’`>100))  ; then echo $DIRNAME; fi;done

п.с. Небольшая неудобность будет в том, что если вложенная папка больше 100M, то будут перечислены и все папки «более высокого уровня» — ведь они тоже будут весить больше 100Мб.

п.с.п.с. Если требуются другие пределы, скажем, больше 20k, то вместо…

(`du -sm «$DIRNAME» | awk ‘{print $1}’`> 100)

…пишем…

(`du -sk «$DIRNAME» | awk ‘{print $1}’`> 20)

…и т.п. по аналогии.

 

Выводи то, что весит больше 100Мб, по возрастанию:

du -xm | sort -ni | awk ‘{if($1>100) print}’

Не сработает.

А вот один из гуру линуксов подсказал следующие вариантики:

Linux — узнать размер папки с сортировкой

find /home/hamer/download/ -type d -exec du -sm «{}» \; | awk «{if (\$1 > 100) print}»
38957   /home/hamer/download/
696     /home/hamer/download/IM
109     /home/hamer/download/IM/qutim
302     /home/hamer/download/IM/skype
143     /home/hamer/download/IM/skype/2012
107     /home/hamer/download/IM/twister
101     /home/hamer/download/IM/twister/bin

Linux — размер каталогов с сортировкой без вывода самих размеров

find /home/hamer/download/ -type d -exec du -sm «{}» \; | awk «{if (\$1 > 100) print \$2}»
/home/hamer/download/
/home/hamer/download/IM
/home/hamer/download/IM/qutim

 

du —max-depth=1 -m |sort -n

показывает все папки в каталоге в мегабайтах и сортирует по возрастанию.

 

У команды sort есть ключик -h. Следующая команда выведет в удобочитаемом виде список директорий по убыванию размера:

du -sh * | sort -hr

grep

Grep has the following options that will let you do this (and things like it). You may want to take a look at the man page for more information:

  • -A num Print num lines of trailing context after each match. See also the -B and -C options.
  • -B num Print num lines of leading context before each match. See also the -A and -C options.
  • -C[num] Print num lines of leading and trailing context surrounding each match. The default is 2 and is equivalent to -A 2 -B 2. Note: no whitespace may be given between the option and its argument.

Sublime text plugings and hot keys

http://proft.me/2013/02/2/oda-o-sublime-text/

Sublime Text удобный текстовый редактор, который занял нишу между большими IDE со всем готовым и текстовыми редакторами «собери сам» (vimemacs, etc). Для меня vim основной текстовый редактор с уже устоявщимся конфигом, набором плагинов и привычек, а вот Sublime‘ом пользуюсь для параллельных работ.

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

Начнем с установки. Я пользуюсь dev-билдом который можно установить вручную отсюдова или с помощью пакетных менеджеров.

Под Ubuntu

sudo add-apt-repository ppa:webupd8team/sublime-text-3
sudo apt-get update
sudo apt-get install sublime-text-installer

Под Arch Linux

yaourt -S sublime-text-dev

Настройки

Все настройки хранятся в JSON. Мои настройки такие (Preferences — Settings — User):

{
    "auto_complete": true,
    "color_scheme": "Packages/Color Scheme - Default/Solarized (Light).tmTheme",
    "detect_slow_plugins": false,
    "ensure_newline_at_eof_on_save": true,
    "file_exclude_patterns":
    [
        "hgignore",
        ".gitignore"
    ],
    "folder_exclude_patterns":
    [
        ".hg",
        ".git"
    ],
    "font_face": "Courier New",
    "font_size": 13.0,
    "highlight_line": true,
    "highlight_modified_tabs": true,
    "ignored_packages":
    [
    ],
    "indent_guide_options":
    [
        "draw_active",
        "draw_normal"
    ],
    "indent_to_bracket": true,
    "soda_folder_icons": true,
    "sublimelinter": false,
    "tab_size": 4,
    "theme": "Soda Light.sublime-theme",
    "translate_tabs_to_spaces": true,
    "trim_trailing_white_space_on_save": true,
    "overlay_scroll_bars": "enabled",
    "line_padding_bottom": 1,
    "line_padding_top": 1,
}

Список всех настроек можно посмотреть тут.

И сочетания клавиш (Preferences — Key Bindings — User)

[
    { "keys": ["f4"], "command": "toggle_bookmark" },
    { "keys": ["f5"], "command": "next_bookmark" },
    { "keys": ["f6"], "command": "prev_bookmark" },
    { "keys": ["f7"], "command": "open_model_view" },
    { "keys": ["f8"], "command": "open_template" },
    { "keys": ["f9"], "command": "jump_back" },
    { "keys": ["f10"], "command": "jump_forward" },
    { "keys": ["alt+shift+z"], "command": "insert_snippet", "args": {"contents": "{% ${0:$SELECTION} %}"} },
    { "keys": ["alt+shift+x"], "command": "insert_snippet", "args": {"contents": "{{ ${0:$SELECTION} }}"} },
    { "keys": ["ctrl+l"], "command": "python_goto_definition" },
    { "keys": ["ctrl+j"], "command": "join_lines" },
    { "keys": ["ctrl+d"], "command": "duplicate_line" },
    { "keys": ["ctrl+y"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Line.sublime-macro"} },
    { "keys": ["ctrl+alt+n"], "command": "advanced_new_file"},
    {
        "keys": ["ctrl+'"],
        "command": "bh_key",
        "args":
        {
            "lines" : true,
            "plugin":
            {
                "type": ["__all__"],
                "command": "bh_modules.bracketselect"
            }
        }
    }
]

Горячие клавиши

Наиболее часто используемые сочетания клавиш

  • ctrl + p - поиск файлов;
  • ctrl + r - поиск по именам функций, структур;
  • ctrl + ; - поиск по переменным;
  • ctrl + shift + p - меню с набором всех команд Sublime Text с возможностью поиска;
  • ctrl + shift + [ - свернуть (fold) текущий блок;
  • ctrl + shift + ] - развернуть (unfold) текущий блок;
  • shift + правая кнопки мыши — вертикальное выделение;
  • ctrl + левая клавиша — множественное выделение и правка;
  • ctrl + x - удалить линию;
  • ctrl + l - выделить линию;
  • ctrl + d - выделить слово;
  • ctrl + m - перемещение между скобками;
  • ctrl + shift + m - выделение текста внутри скобок;
  • alt + shift + 2 - разбить окно на две части;
  • alt + shift + 1 - вернуть вид к одному окну;
  • ctrl + [NUM] - переключиться на окно с номером NUM (1-4);
  • ctrl + shift + [NUM] - переместить файл в окно NUM (1-4);
  • alt + shift + w – обернуть выбранный текст в тег;
Sublime Text

Плагины

Посмотреть список доступных плагинов можно на wbond.net.

Для управления плагинами из под редактора понадобиться Package Control. Для этого нажимаем Ctrl + ` и в открывшуюся консоль вводим:

import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())

Нажимаем ctrl + shift + p, набираем install и получаем список плагинов из внутреннего репозитарияSublime Text. Используемые плагины:

  • AngularJS - разные расширения для работы с AngularJS
  • HTML5 - подборка нововведений в HTML 5 для Sublime Text;
  • jQuery - подборка снипетов jQuery для Sublime Text;
  • Tag - удобные дополнения для работы с XML;
  • Placeholder - шаблоны HTML и контента (lorem ipsum);
  • Emmet - обновленный Zen Coding, документациясписок командпример использования;
  • SideBarEnhancements - пачка дополнительных операций над файлами в sidebar;
  • AllAutocomplete - автодополнение слов из всех вкладок в текущем окне;
  • AdvancedNewFile - быстрое создание файлов, вызов по Super+Alt+N;
  • BracketHighlighter - монстр по работе с скобками и тегами;
  • Anaconda - годный lint-чекер и автодополнение для Python
  • Djaneiro - плагин добавляет подсветку для шаблонов Django и пачку снипетов;
  • PdbSublimeTextSupport - интеграция pdb и Sublime Text;
  • SublimeREPL - запуск интерпретатора python и других языков в окне редактора;
  • Soda - светлая и темная тема оформления Soda;
  • Tomorrow Night - тема оформления Tomorrow Night;
  • Solarized - светлая и темная тема оформления Solarized;

Настройки отдельно для проекта

Мы можем установить настройки отдельно для проекта, для этого откройте Project — Edit Project и введите настройки под проект, например

{
    "folders": [
        {
           "path": "/path/to/folder1"
        },
        {
            "path": "/path/to/folder2"
        }
    ],
    "settings": {
        "python_interpreter": "/path/to/some/virtualenv/bin/python"
    }
}

Rails preload, eager_load, includes и joins.

http://habrahabr.ru/post/191762/

http://sqlfiddle.com/#!2/659f69/1

Rails предоставляют нам 4 различных способа загрузки ассоциаций: preload, eager_load, includes и joins. Рассмотрим каждый из них:

Preload


Этот метод загружает ассоциации в отдельном запросе:

User.preload(:posts).to_a

# =>
SELECT "users".* FROM "users"
SELECT "posts".* FROM "posts"  WHERE "posts"."user_id" IN (1)


Т.к. preload всегда создает два отдельных запроса, то мы не можем использовать таблицу posts в условии выборки:

User.preload(:posts).where("posts.desc='ruby is awesome'")

# =>
SQLite3::SQLException: no such column: posts.desc:
SELECT "users".* FROM "users"  WHERE (posts.desc='ruby is awesome')


А таблицу users – можем:

User.preload(:posts).where("users.name='Neeraj'")

# =>
SELECT "users".* FROM "users"  WHERE (users.name='Neeraj')
SELECT "posts".* FROM "posts"  WHERE "posts"."user_id" IN (3)




Includes


По умолчанию includes действует точно так же, как и preload, но в случае наличия условия по ассоциированной таблице переключается на создание единственного запроса с LEFT OUTER JOIN.

User.includes(:posts).where('posts.desc = "ruby is awesome"').to_a

# =>
SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0,
       "posts"."title" AS t1_r1,
       "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"
WHERE (posts.desc = "ruby is awesome")


Если по каким-то причинам необходимо форсировать применение такого подхода, то можно использовать метод references:

User.includes(:posts).references(:posts).to_a

# =>
SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0,
       "posts"."title" AS t1_r1,
       "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"



Eager_load


Этот метод загружает ассоциации в одном запросе с использованием Left Outer Join, точно так же, как действует includes в сочетании с references.

User.eager_load(:posts).to_a

# =>
SELECT "users"."id" AS t0_r0, "users"."name" AS t0_r1, "posts"."id" AS t1_r0,
       "posts"."title" AS t1_r1, "posts"."user_id" AS t1_r2, "posts"."desc" AS t1_r3
FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"



Joins


Создает запрос с использованием INNER JOIN. 

User.joins(:posts)

# =>
SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."user_id" = "users"."id"


При этом, загружаются данные только из таблицы users. Кроме того, этот запрос может возвратить дублирующие друг друга записи:

def self.setup
  User.delete_all
  Post.delete_all

  u = User.create name: 'Neeraj'
  u.posts.create! title: 'ruby', desc: 'ruby is awesome'
  u.posts.create! title: 'rails', desc: 'rails is awesome'
  u.posts.create! title: 'JavaScript', desc: 'JavaScript is awesome'

  u = User.create name: 'Neil'
  u.posts.create! title: 'JavaScript', desc: 'Javascript is awesome'

  u = User.create name: 'Trisha'
end



Результат выполнения User.joins(:posts) в БД с такими данными:

#<User id: 9, name: "Neeraj">
#<User id: 9, name: "Neeraj">
#<User id: 9, name: "Neeraj">
#<User id: 10, name: "Neil">


Избежать повторений мы можем с использованием distinct:

User.joins(:posts).select('distinct users.*').to_a
# в комментариях подсказывают, что можно сделать проще:
User.joins(:posts).uniq


Если же мы хотим дополнительно получить какие-либо данные из таблицы posts, мы должны внести их в предложение select:

records = User.joins(:posts).select('distinct users.*, posts.title as posts_title').to_a
records.each do |user|
  puts user.name
  puts user.posts_title
end


Стоит заметить, что после выполнения метода joins вызов user.posts приведет в созданию еще одного запроса.

Методы eager нужны, чтобы избежать появления так называемых запросов N+1, и не стоит их использовать для подключения ассоциаций в where и order, для этого есть joins. Рекомендую гем bullet (https://github.com/flyerhzm/bullet), чтобы найти запросы в которых нужна eager-загрузка.

Плохо, когда появляются похожие штуки: ‘posts’.’user_id’ AS t1_r2, ‘posts’.’desc’ AS t1_r3, этим грешит includes особенно при сортировке через ассоциацию, даже если она подключена через joins (вроде в 4 исправили). И во многих случаях to_a не актуально.

Алсо, гем squeel (https://github.com/ernie/squeel) очень упрощает написание сложных запросов.

Объяснение SQL объединений JOIN: LEFT/RIGHT/INNER/OUTER

http://www.skillz.ru/dev/php/article-Obyasnenie_SQL_obedinenii_JOIN_INNER_OUTER.html

http://sqlfiddle.com/#!2/659f69/1

Разберем пример. Имеем две таблицы: пользователи и отделы.


U) users               D) departments
id name       d_id     id  name
-- ----       ----     --  ----
1  Владимир    1       1  Сейлз
2  Антон       2       2  Поддержка
3  Александр   6       3  Финансы
4  Борис       2       4  Логистика
5  Юрий        4




SELECT u.id, u.name, d.name AS d_name
FROM users u
INNER JOIN departments d ON u.d_id = d.id



Запрос вернет объединенные данные, которые пересекаются по условию, указанному в INNER JOIN ON <..>. 
В нашем случае условие <таблица_пользователей>.<идентификатор_отдела> должен совпадать с <таблица_отделов>.<идентификатор>

В результате отсутствуют:

- пользователь Александр (отдел 6 — не существует)
- отдел Финансы (нет пользователей) 


id name       d_name
-- --------   ---------
1  Владимир    Сейлз
2  Антон       Поддержка
4  Борис       Поддержка
3  Юрий        Логистика



sql inner join

рис. Inner join

Внутреннее объединение INNER JOIN (синоним JOIN, ключевое слово INNER можно опустить). 

Выбираются только совпадающие данные из объединяемых таблиц. Чтобы получить данные, которые не подходят по условию, необходимо использовать 

внешнее объединение — OUTER JOIN. 

Такое объединение вернет данные из обеих таблиц совпадающими по одному из условий.

sql left join

рис. Left join

Существует два типа внешнего объединения OUTER JOIN — LEFT OUTER JOIN и RIGHT OUTER JOIN. 

Работают они одинаково, разница заключается в том что LEFT — указывает что «внешней» таблицей будет находящаяся слева (в нашем примере это таблица users). 
Ключевое слово OUTER можно опустить. Запись LEFT JOIN идентична LEFT OUTER JOIN.


SELECT u.id, u.name, d.name AS d_name
FROM users u
LEFT OUTER JOIN departments d ON u.d_id = d.id



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


id      name          d_name
--      --------      ---------
1       Владимир      Сейлз
2       Антон         Поддержка
3       Александр     NULL
4       Борис         Поддержка
5       Юрий          Логистика



Добавив условие 

WHERE d.id IS NULL



в выборке останется только 3#Александр, так как у него не назначен департамент.

sql left outer join

рис. Left outer join с фильтрацией по полю


RIGHT OUTER JOIN вернет полный список департаментов (правая таблица) и сопоставленных пользователей.


SELECT u.id, u.name, d.name AS d_name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id




id      name        d_name
--      --------    ---------
1       Владимир    Сейлз
2       Антон       Поддержка
4       Борис       Поддержка
NULL    NULL        Финансы
5       Юрий        Логистика



Дополнительно можно отфильтровать данные, проверяя их на NULL.


SELECT d.id, d.name
FROM users u
RIGHT OUTER JOIN departments d ON u.d_id = d.id
WHERE u.id IS NULL



В нашем примере указав WHERE u.id IS null, мы выберем департаменты, в которых не числятся пользователи. (3#Финансы)


Все примеры вы можете протестировать здесь:

SQLFiddle


Self Join

Выборка из одной и той же таблицы для нескольких условий.

Рассмотрим задачку от яндекса: 

Есть таблица товаров.


CREATE TABLE `ya_goods` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO ya_goods VALUES (1'яблоки')(2'яблоки') ,(3'груши')(4,'яблоки')(5'апельсины')(6'груши');



Она содержит следующие значения.


`id`    `name`
1       Яблоки
2       Яблоки
3       Груши
4       Яблоки
5       Апельсины
6       Груши



Напишите запрос, выбирающий уникальные пары `id` товаров с одинаковыми `name`, например:

(1,2), (4,1), (2,4), (6,3)…

При решении задачи необходимо учесть, что пары (x,y) и (y,x) — одинаковы.

Решение:


SELECT g1.id id1, g2.id id2
-- CONCAT('(', LEAST(g1.id, g2.id), ',', GREATEST(g1.id, g2.id), ')') row
FROM ya_goods g1
INNER JOIN ya_goods g2 ON g1.name = g2.name
WHERE g1.id <> g2.id
GROUP BY LEAST(g1.id, g2.id), GREATEST(g1.id, g2.id)
ORDER BY g1.id;
— или без группировки (быстрее)

SELECT DISTINCT CONCAT(‘(‘, LEAST(g1.id, g2.id)‘,’, GREATEST(g1.id, g2.id)‘)’) row
FROM ya_goods g1
INNER JOIN ya_goods g2 ON g1.name = g2.name
WHERE g1.id <> g2.id



Объединяем таблицы ya_goods по одинаковому полю `name`, группируем по уникальным idентификаторам и получаем результат.

(1,2)(1,4)(2,4)(3,6)


Множественное объединение multi join

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

Пример: набор вариантов (вес, объем) товаров. 
Продукты в таблице products, Варианты — таблица product_options, Значения вариантов — таблица product2options
Необходимо: фильтровать продукты по дате, и имеющимся вариантам

CREATE TABLE  `products` (
`id` int(11),
`title` varchar(255),
`created_at` datetime
)

CREATE TABLE `product_options` (
`id` int(11),
`name` varchar(255)
)

CREATE TABLE `product2options` (
`product_id` int(11),
`option_id` int(11),
`value` int(11)
)



Тестовые данные


INSERT INTO `products` (`id``title``created_at`) VALUES
(1'Кружка''2009-01-17 20:00:00'),
(2'Ложка''2009-01-18 20:00:00'),
(3'Тарелка''2009-01-19 20:00:00');
INSERT INTO `product_options` (`id``name`) VALUES
(11‘Вес’),
(12‘Объем’);

INSERT INTO `product2options` (`product_id``option_id``value`) VALUES
(111200),
(112250),
(21135),
(21215),
(311310),
(312300),
(21145),
(21225);



Пример: выбрать товары, 
добавленные после 17/01/2009 в следующих вариантах:
- вес=310, объем=300
- вес=35, объем=15
- вес=45, объем=25
- вес=200, объем=250

Просто перечислить условия вариантов в подзапросе/джоине через OR/AND не сработает, 
необходимо осуществить объединение таблиц вариантов равное количеству этих самых вариантов (у нас — 2: объем и вес)


SELECT p.*, po1.name 'P1', p2o1.value, po2.name 'P2', p2o2.value
FROM products p

INNER JOIN product2options p2o1 ON p.id = p2o1.product_id
INNER JOIN product_options po1  ON po1.id = p2o1.option_id

INNER JOIN product2options p2o2 ON p.id = p2o2.product_id
INNER JOIN product_options po2  ON po2.id = p2o2.option_id

WHERE p.created_at > ’2009-01-17 21:00′
AND ( — тарелка#3 
p2o1.option_id = 11 AND p2o1.value = 310
AND p2o2.option_id = 12 AND p2o2.value = 300
OR  — ложка#2
p2o1.option_id = 11 AND p2o1.value = 35
AND p2o2.option_id = 12 AND p2o2.value = 15
OR  — ложка#2
p2o1.option_id = 11 AND p2o1.value = 45
AND p2o2.option_id = 12 AND p2o2.value = 25
OR  — кружка#1 не попадает по дате
p2o1.option_id = 12 AND p2o1.value = 250
AND p2o2.option_id = 11 AND p2o2.value = 200
)
;



Результ выборки:


id      title        created_at                P1        value    P2            value
2       Ложка        2009-01-18 20:00:00       Вес        35      Объем         15
3       Тарелка      2009-01-19 20:00:00       Вес        310     Объем         300
2       Ложка        2009-01-18 20:00:00       Вес        45      Объем         25
— не попадает по дате
1       Кружка               2009-01-17 20:00:00    Объем      250  Вес           200



Этот пример на SQLFiddle

За бортом статьи остались смежные объединениям (а также специфичные для определенных базданных темы):
SELF JOIN, FULL OUTER JOIN, CROSS JOIN (CROSS [OUTER] APPLY), операции над множествами UNION [ALL], INTERSECT, EXCEPT и т.д.

vim

http://proft.me/categories/vim/

Полезные советы для VIM #4 Vim

Fullscreen в GVIM Vim

Поиск по содержимому файлов не выходя из VIM Vi

Управление плагинами в VIM Vim

Снипетты в VIM V

Полезные советы для VIM #3 Vim

Полезные советы для VIM #2 Vim

Полезные советы для VIM #1 Vim

Расцветка кода в gVim Vi

Настройка шрифта в VIM Vim

Комментирование кода в VIM Vim

Управление окнами в VIM Vim

Сравнение файлов в VIM Vim

VIM: выполнение команд при поиске Vim

Сворачивание (folding) в VIM Vi

Запись макросов в VIM Vim

Vim – наше все! Vim

curl and wget

wget — консольная утилита для скачивания файлов/сайтов, умеет выкачивать файлы рекурсивно, следуя по ссылкам автоматически.

Команда Описание
wget http://example.com/file.zip скачивание файла file.zip в текущую директорию
wget -P /path/to/save http://example.com/file.zip скачивание файла file.zip в директорию /path/to/save
wget -c http://example.com/file.zip докачивание файла file.zip в случаи обрыва
wget -O arch.zip http://example.com/file.zip скачивание файла file.zip и сохранение под именем arch.zip
wget -i files.txt скачивание файлов из списка в files.txt
wget —tries=10 http://example.com/file.zip количество попыток на скачивание
wget -Q5m -i http://example.com/ квота на максимальный размер скачанных файлов, квота действует только при рекурсивном скачивании (-r)
wget —save-cookies cookies.txt —post-data ‘username=proft&password=1′ http://example.com/auth.php идентификация на сервере с сохранением кук для последующего доступа
wget —user-agent=»Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5″ http://example.com/ указание User Agent
echo ‘wget http://example.com/file.zip’ | at 12:00 скачать http://example.com/file.zip в 12:00 в текущую директорию
wget ftp://example.com/dir/*.zip скачивание всех файлов по шаблону
wget http://example.com/dir/file{1..10}.zip скачивание всех файлов по шаблону
wget -S http://example.com/ вывод заголовков HTTP серверов и ответов FTP серверов
wget —spider -i urls.txt проверка ссылок в файле на доступность
wget -b http://example.com/file.zip скачивание файла в фоне, лог пишется в wget.log, wget.log.1 и т.д.
export http_proxy=http://proxy.com:3128/;wget http://example.com/file.zip скачивание файла *file.zip* через прокси
wget -m -w 2 http://example.com/ зеркалирование сайта с сохранением абсолютных ссылок и ожиданием 2-х секунд между запросами
wget —limit-rate=200k http://example.com/file.zip ограничение скорости скачивания
wget -R bmp http://example.com/ не скачивать bmp файлы
wget -A png,jpg http://example.com/ скачивать только файлы png и jpg

Пример использования для скачивания документации Django:

wget -r -k -l 5 -p -E -nc -np https://docs.djangoproject.com/en/1.5/

  • -r - ходим по ссылкам (рекурсивное скачивание)
  • -k - преобразовываем ссылки к локальному виду
  • -p - скачивание ресурсов необходимых для отображения html-страницы (стили, картинки и т.д.)
  • -l - глубина скачивания, 0 - бесконечная вложенность ссылок
  • -nc - не перезаписывать существующие файлы
  • -np - не подниматься выше начального адреса при рекурсивной загрузке

Часто используемые wget параметры можно вынести в ~/.wgetrc.

curl — консольная утилита для передачи данных используя URL-синтаксис, поддерживаются протоколы DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet и TFTP.

Команда Описание
curl http://proft.me получаем содержания главной страницы
curl -o index.html http://proft.me получаем содержания главной страницы в файл index.html
curl -L http://example.com при получении содержимого страницы следовать по редиректам (если такие есть)
curl -u username:password http://example.com/login/ получение страницы скрытой за Basic HTTP Authentication
curl -x proxy.com:3128 http://proft.me получение страницы используя прокси
curl -I proft.me получаем http-заголовки с сайта
curl -H ‘Host: google.ru’ http://proft.me подменить домен при обращении к серверу (передача своего заголовка)
curl —request POST «http://example.com/form/» —data «field1=value1&field2=value2″ передача данных POST-запросом
curl -X POST «http://example.com/form/» —data «field1=value1&field2=value2″ передача данных POST-запросом
curl -X POST -H «Content-Type: application/json» -d ‘»title»:»Commando»,»year»:»1985″‘ http://example.com/api/movies/ передача данных POST-запросом, данные в виде JSON
curl —request PUT «http://example.com/api/movie/1/» —data «title=DjangoUnchained» передача данных PUT-запросом
curl -F uploadfiled=@file.zip -F submit=OK http://example.com/upload/ загрузка файла file.zip в форму (multipart/form-data)
curl -u username:password -O ftp://example.com/file.zip скачать файл с FTP
curl -u username:password -T file.zip ftp://example.com/ закачать файл по FTP
curl —cookie «login=proft» http://example.com/login/ установить кукис
curl —cookie-jar cookies.txt http://example.com сохранение кукисов в файл
curl —cookie cookies.txt http://example.com/login/ использование сохраненных кукисов

repo

http://howtoit.ru/linux/centos/item/15-podklyuchenie-repozitoriev-centos-6-epel-rpmforge-remi.html

Репозиторий EPEL (Extra Packages for Enterprise Linux) — поддерживается в рамках проекта Fedora и содержит некоторые пакеты, которые не вошли в стандартный набор RHEL (CentOS).

RPMforge (теперь называется RepoForge) является результатом сотрудничества создателей пакетов. Он содержит более 4000 пакетов для CentOS. При этом RepoForge не является частью Red Hat или CentOS, но предназначен для работы с этими (и некоторыми другими) дистрибутивами.

Создатели репозитория Remi пишут, что основной задачей Remi является предоставление самых последних версий пакетов для rpm-based дистрибутивов, в том числе CentOS, RHEL, Fedora и др. Особенно важным это является в том случае если вы используете не самую последнюю версию дистрибутива и выпуск новых пакетов в официальных репозиториях уже прекращен.

В первую очередь желательно проверить какие репозитории уже подключены в вашей системе:

yum repolist

Результатом будет вывод:

repo id                          repo name                                  status
base                             CentOS-6 — Base                            4 776
extras                           CentOS-6 — Extras                             17
updates                        CentOS-6 — Updates                           851

Установка репозитория EPEL в CentOS 6:

Часто рекомендуется перед подключением этого репозитория скачать выполнить импорт GPG ключа. Но, по большому счету скачивать, и отдельно устанавливать GPG ключ не требуется, т.к. он включен в пакет, размещается в каталоге /etc/pki/rpm-gpg/ и после установки и вам будет предложено его импортировать при первой установке пакета из репозитория EPEL.

Однако, если вы все же хотите импортировать GPG ключ перед подключением репозитория EPEL к CentOS, выполните команду:

rpm —import https://fedoraproject.org/static/0608B895.txt

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

# rpm -qa gpg*
gpg-pubkey-0608b895-4bd22942

Для установки репозитория EPEL выполните команду:

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

Если команда выдает ошибку, то значит уже выпущена новая версия пакета. Перейдите по ссылкеhttp://download.fedoraproject.org/pub/epel/6/i386/repoview/epel-release.html и подставьте номер новой версии в ссылку или скачайте и установите из локальной папки.

Установка репозитория RepoForge (бывш. RPMForge) в CentOS 6:

Ситуация с GPG ключом здесь точно такая же, как в EPEL.

Для установки GPG ключа перед подключением репозитория выполните:

rpm —import http://apt.sw.be/RPM-GPG-KEY.dag.txt

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

# rpm -qa gpg*
gpg-pubkey-c105b9de-4e0fd3a3

Для подключения репозитория в 32-битной системе выполните следующую команду:

rpm -Uhv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm

А для 64-битной системы эту:

rpm -Uhv http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

В том случае, если команда завершилась с ошибкой, возможно, что ссылки на пакеты устарели, тогда используйте ссылки, указанные здесь: http://repoforge.org/use/

Установка репозитория REMI в CentOS 6:

Для установки GPG ключа перед подключением репозитория выполните:

rpm —import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
gpg-pubkey-00f97f56-467e318a

Для подключения репозитория:

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

Репозиторий REMI устанавливается отключенным. Для подключения в файле /etc/yum.repos.d/remi.repo  необходимо поменять значение переменной enabled в секции [remi] c 0 на 1. На примере редактора vi:

Выполните

vi /etc/yum.repos.d/remi.repo

Нажмите Insert для перехода в режим ввода.

Поменяйте значение переменной enabled в секции [remi] с 0 на 1

Нажмите Esc для перехода в режим команд

Для сохранения и выхода введите:

:wq

На этом подключение дополнительных репозиториев в CentOS 6 можно считать завершенным.

Однако, дополнительно рекомендуется установить и настроить плагин yum: yum-priorities. Применение данного плагина обусловлено тем, что в подключенных дополнительных репозиториях могут содержаться пакеты обновляющие такие из официальных репозиториев, что часто может вызвать проблемы, к примеру несовместимость версии php и вашей CMS. Плагин  yum-priorities применяется для упорядочивания приоритетов репозиториев. Пакеты из репозиторя с более низким приоритетом не будут обновлять пакеты, установленные из репозиториев, имеющих более высокий приоритет. Также приоритеты используются и при установке новых пакетов — в том случае, если пакет находится в двух или более репозиториях, он будет установлен из того репозитория, который имеет наивысший приоритет.

Для установки плагина  yum-priorities выполните:

yum install -y yum-priorities

После установки плагина добавьте строку priority=10 в первую секцию каждого файла:

/etc/yum.repos.d/epel.repo
/etc/yum.repos.d/rpmforge.repo
/etc/yum.repos.d/remi.repo

Проверьте список подключенных репозиториев:

# yum repolist
repo id             repo name                                                     status
base                 CentOS-6 — Base                                             4 710+66
epel                 Extra Packages for Enterprise Linux 6 — i386        6 887
extras               CentOS-6 — Extras                                           10+7
rpmforge          RHEL 6 — RPMforge.net — dag                             4 512+1
updates            CentOS-6 — Updates                                         850+1

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

yum -y update

chkconfig

http://ss64.com/bash/chkconfig.html

Для добавлении сервиса в автозагрузку ОС CentOS/RHEL, сущеcтвует служба chkconfig

  • chkconfig —list <имя службы>
  • chkconfig —add <имя службы>
  • chkconfig —del <имя службы>
  • chkconfig [—level levels] <имя службы> <on|off|reset>
  • chkconfig [—level levels] <имя службы>

This implementation of chkconfig was inspired by the chkconfig command present in the IRIX operating system. Rather than maintaining configuration information outside of the /etc/rc[0-6].d hierarchy, however, this version directly manages the symlinks in /etc/rc[0-6].d. This leaves all of the configuration information regarding what services init starts in a single location.

--level levels
             The run levels an operation should pertain to.
             Given as a string of numbers from 0 to 7.
             For example, --level 35 specifies runlevels 3 and 5.

chmod для папок или файлов

# для директорий используем -type d 
cd /home/target_dir 
find . -type d -exec chmod 755 {} \;   

# для файлов -type f 
cd /home/target_dir 
find . -type f -exec chmod 644 {} \;   

# по маске имени с параметром -name
cd /home/target_dir 
find . -type f -name '*.htm*' -exec chmod 644 {} \;   

# для наглядности можно выполнить
find /home/target_dir/ -type f -name '*.php' -exec echo '-- '{} \;