old.softroot.ru

Старая версия блога softroot.ru. Актуальные статьи перенесены в новую версию

Справочник по методам коллекции Laravel



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

Статья в разработке. Осталось дописать несколько методов и навигацию ;)



Как создать коллекцию из массива?
Очень просто:

// Допустим у нас есть такой массив
$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

// Создаём коллекцию
$collection = collect($myArray);



Методы для работы с коллекциями



all() Возвращает базовый массив коллекции
avg() Среднее значение всех элементов коллекции
chank() Разбить коллекцию на множество мелкий коллекций





Метод all
Метод all() вернёт базовый массив коллекции

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

$collection = collect($myArray);
$collection->all();

// Результат
array:3 [▼
    "one" => "first"
    "two" => "second"
    "three" => "the third"
]



Метод avg
Посчитать среднее значение всех элементов коллекции

$collection = collect([0, 10]);
dd($collection->avg());

//Результат
5

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

$myArray = [
    ['name' => 'one', 'amount' => '10'],
    ['name' => 'two', 'amount'=> '2']
];
$collection = collect($myArray);

dd($collection->avg('amount'));

//Результат
6



Метод chank
Разобьёт коллекцию на множество мелкий коллекций

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

$collection = collect($myArray);
dd($collection->chunk(2) );

// Результат
Collection {#17 ▼
  #items: array:2 [▼
    0 => Collection {#15 ▼
      #items: array:2 [▼
        "one" => "first"
        "two" => "second"
      ]
    }
    1 => Collection {#16 ▼
      #items: array:1 [▼
        "three" => "the third"
      ]
    }
  ]
}



Метод collapse
Позволяет собрать одну коллекцию из множества коллекций

$myArray = [
    [
        'one' => 'first',
        'two' => 'second',
    ],
    [
        'three' => 'the third'
    ]
];
$collection = collect($myArray);

dd( $collection->collapse() );

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    "one" => "first"
    "two" => "second"
    "three" => "the third"
  ]
}



Метод contains
Проверяет, содержит ли коллекция нужное значение. Проверка осуществляется по значениям ключей.

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

$collection = collect($myArray);

dump( $collection->contains('first') ); // true
dump( $collection->contains('one') ); // false

// Результат
true
false



Метод count
count позволяет сосчитать количество элементов коллекции

$collection = collect([1, 2, 3]);
dd( $collection->count() );

// Результат
3



Метод diff
Метод diff сравнивает коллекцию с другой коллекцией или массивом

$collection = collect([1, 2, 3, 4, 5]);
$diff = $collection->diff([2, 4, 6, 8]);
dd( $diff->all());

//Результат
array:3 [▼
  0 => 1
  2 => 3
  4 => 5
]



Метод each
Что бы перебрать каждый элемент коллекции воспользуетесь методом each

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];

$collection = collect($myArray);
$collection->each(function ($item, $key) {
    dump($item . ' -> ' . $key);
});

// Результат
"first -> one"
"second -> two"
"the third -> three"



Метод every
А что бы создать новую коллекцию содержащую только каждый N элемент начиная с первого — every

$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);

dd( $collection->every(4));

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    0 => "a"
    1 => "e"
  ]
}

Вторым аргументом можно указать смещение

$collection = collect(['a', 'b', 'c', 'd', 'e', 'f']);

dd($collection->every(4, 1));

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    0 => "b"
    1 => "f"
  ]
}



Метод except
Исключить из коллекции элементы можно с помощью метода except

$myArray = [
    'one' => 'first',
    'two' => 'second',
    'three' => 'the third'
];
$collection = collect($myArray);

dd($collection->except('two'));

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    "one" => "first"
    "three" => "the third"
  ]
}



Метод filter
Метод фильтрует коллекцию с помощью функции колбэка сохраняя лишь те элементы при обработке которых колбэк вернул true

$collection = collect([1, 2, 3, 4]);

$filtered = $collection->filter(function ($value, $key) {
    return $value > 2;
});

dd($filtered);

// Результат
Collection {#16 ▼
  #items: array:2 [▼
    2 => 3
    3 => 4
  ]
}



Метод first
Работает так же как и filter, только возвращает первый элемент при обработке которого колбэк вернул true

$collection = collect([1, 2, 3, 4]);

$filtered = $collection->first(function ($key, $value) {
    return $value > 2;
});

dd($filtered);

// Результат
3
Обратите внимание, что первый аргумент функции колбэка (в отличии от колбэка filter) является ’ключ’, второй ’значение’. У фильтра наоборот.



Метод flatten
Данный метод сделает плоским многомерную коллекцию

$myArray = [
    [
        'one' => 'first',
        'two' => [
            'second', 'the third'
        ]
    ]
];
$collection = collect($myArray);

$flattened = $collection->flatten();
dd( $flattened );

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    0 => "first"
    1 => "second"
    2 => "the third"
  ]
}



Метод flip
Поменяет местами ключи и значения в коллеции

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

dd( $collection->flip());

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    "first" => "one"
    "second" => "two"
  ]
}



Метод forget
Удалить элемент из коллекции по ключу можно с помощью данного метода

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

$collection->forget('one');

dd($collection);

// Результат
Collection {#14 ▼
  #items: array:1 [▼
    "two" => "second"
  ]
}
Обратите внимание, что данный метод, в отличии от большинства, не создаёт новую коллекцию, а изменяет базовую.



Метод forPage
Создаёт новую коллекцию в которой будут присутствовать элементы заданной страницы. Метод первым аргументом принимает номер страницы, вторым количество элементов на ней.

$collection = collect([1, 2, 3, 4, 5, 6, 7, 8, 9]);

dump($collection->forPage(2, 3));
dump($collection->forPage(3, 3));

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    3 => 4
    4 => 5
    5 => 6
  ]
}
Collection {#15 ▼
  #items: array:3 [▼
    6 => 7
    7 => 8
    8 => 9
  ]
}



Метод get
Данный метод возвращает значение по ключу. Если ключа не существует, то будет возвращён null либо значение по умолчанию

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

dd($collection->get('one'));

// Результат
"first"

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

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

dd($collection->get('three', 'nothing'));

// Результат
"nothing"

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

$myArray = [
    'one' => 'first',
    'two' => 'second'
];
$collection = collect($myArray);

$get = $collection->get('three', function () {
    return 'result';
});

dd($get);

// Результат
"result"



Метод groupBy
Группирует элементы коллекции по ключу

$collection = collect([
    ['user' => 'one',   'action' => 'buy'],
    ['user' => 'one',   'action' => 'pay'],
    ['user' => 'two',   'action' => 'pay'],
    ['user' => 'three', 'action' => 'buy'],
    ['user' => 'three', 'action' => 'buy'],
]);

$grouped = $collection->groupBy('action');

dd($grouped);

// Результат
Collection {#18 ▼
  #items: array:2 [▼
    "buy" => Collection {#16 ▼
      #items: array:3 [▼
        0 => array:2 [▼
          "user" => "one"
          "action" => "buy"
        ]
        1 => array:2 [▼
          "user" => "three"
          "action" => "buy"
        ]
        2 => array:2 [▼
          "user" => "three"
          "action" => "buy"
        ]
      ]
    }
    "pay" => Collection {#17 ▼
      #items: array:2 [▼
        0 => array:2 [▼
          "user" => "one"
          "action" => "pay"
        ]
        1 => array:2 [▼
          "user" => "two"
          "action" => "pay"
        ]
      ]
    }
  ]
}



Метод has
Проверяет существование ключа

$collection = collect(['one' => 1, 'two' => 2]);

dump($collection->has('one')); // true
dump($collection->has('ololo')); // false

// Результат
true
false



Метод implode
Объединяет элементы коллекции. Передаваемые в метод аргументы зависят от типа коллекции.
Если коллекция объект или массив, то первый аргумент должен указывать на ключ, второй — строка с помощью которой будет произведена склейка.

$collection = collect([
    ['user' => 'one',   'action' => 'buy'],
    ['user' => 'one',   'action' => 'pay'],
    ['user' => 'two',   'action' => 'pay'],
    ['user' => 'three', 'action' => 'buy'],
    ['user' => 'three', 'action' => 'buy'],
]);

dd($collection->implode('action', ', '));

// Результат
"buy, pay, pay, buy, buy"

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

dd(collect([1, 2, 3, 4, 5])->implode('-'));

// Результат
"1-2-3-4-5"



Метод intersect
Метод удаляет любые пересекающиеся значения, которые не присутствуют в данном массиве или коллекции:

$collection = collect(['one', 'two', 'three']);

dd($collection->intersect(['one', 'three', 'hmm']));

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    0 => "one"
    2 => "three"
  ]
}



Метод isEmpty
Пуста ли коллекция.

dump(collect([])->isEmpty()); // true
dump(collect([1, 2, 3, 4, 5])->isEmpty()); // false

// Результат
true
false



Метод keyBy
Устанавливает в качестве ключа элемента коллекции выбранное значение ключа
(не знаю как лучше описать, смотрите пример =) )

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'desk'],
    ['product_id' => 'prod-200', 'name' => 'chair'],
]);

dd ($collection->keyBy('product_id'));

// Результат
Collection {#16 ▼
  #items: array:2 [▼
    "prod-100" => array:2 [▼
      "product_id" => "prod-100"
      "name" => "desk"
    ]
    "prod-200" => array:2 [▼
      "product_id" => "prod-200"
      "name" => "chair"
    ]
  ]
}



Метод keys
Метод возвращает все ключи коллекции

$collection = collect([
    'first' => ['product_id' => 'prod-100', 'name' => 'Desk'],
    'second' => ['product_id' => 'prod-200', 'name' => 'Chair'],
]);

dd($collection->keys());

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    0 => "first"
    1 => "second"
  ]
}



Метод last
Возвращает последний элемент коллекции при обработке которого колбек вернул истину (true)
(Данный метод обратный методу first)

$collection = collect([1, 2, 3, 4]);

$last = $collection->last(function ($key, $value) {
    return $value > 2;
});

dd($last);

// Результат
4



Метод map
Метод map передаёт в функцию колбека каждый элемент и создаёт новую коллекцию обработанную этим колбеком.

$collection = collect([1, 2, 3, 4, 5]);

$map = $collection->map(function ($item, $key) {
    return $item * 2;
});

dd($map);

// Результат
Collection {#16 ▼
  #items: array:5 [▼
    0 => 2
    1 => 4
    2 => 6
    3 => 8
    4 => 10
  ]
}



Метод max
Возвращает максимальное значение в коллекции

dump(collect([['foo' => 10], ['foo' => 20]])->max('foo')); // 20
dump(collect([1, 2, 3, 4, 5])->max()); // 5

// Результат
20
5



Метод merge
Производит слияние массива с коллекцией, перезаписывая при этом одноимённые ключи. Цифровые ключи добавляются в конец коллекции.

$collection = collect(['product_id' => 1, 'name' => 'Desk']);

dd($collection->merge(['price' => 100, 'discount' => false]));

// Результат
Collection {#15 ▼
  #items: array:4 [▼
    "product_id" => 1
    "name" => "Desk"
    "price" => 100
    "discount" => false
  ]
}



Метод min
Возвращает минимальное значение в коллекции

dump(collect([['foo' => 10], ['foo' => 20]])->min('foo')); // 10
dump(collect([1, 2, 3, 4, 5])->min()); // 1

// Результат
10
1



Метод only
Метод возвращает только указанные элементы.
(Работает только с «простыми» коллекциями)

$collection = collect(['name' => 'one', 'amount' => 10, 'price'  => 5]);

dd( $collection->only(['amount', 'price']) );

// Результат
Collection {#15 ▼
  #items: array:2 [▼
    "amount" => 10
    "price" => 5
  ]
}



Метод pluck
Возвращает все значения ключей коллекции по указанному ключу

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
    ['product_id' => 'prod-300', 'name' => 'Chair'],
]);

dd($collection->pluck('name'));

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    0 => "Desk"
    1 => "Chair"
    2 => "Chair"
  ]
}

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

$collection = collect([
    ['product_id' => 'prod-100', 'name' => 'Desk'],
    ['product_id' => 'prod-200', 'name' => 'Chair'],
    ['product_id' => 'prod-300', 'name' => 'Chair'],
]);

dd($collection->pluck('name', 'product_id'));

// Результат
Collection {#15 ▼
  #items: array:3 [▼
    "prod-100" => "Desk"
    "prod-200" => "Chair"
    "prod-300" => "Chair"
  ]
}



Метод pop
Метод удаляет и возвращает (проще говоря вытаскивает) последний элемент коллекции. Данный метод изменяет оригинальную коллекцию.

$collection = collect([1, 2, 3, 4, 5]);

dump($collection->pop()); // возвращает 5 и удаляет этот элемент из коллекции

dump($collection->all());

// Результат
5

array:4 [▼
  0 => 1
  1 => 2
  2 => 3
  3 => 4
]



Метод prepend
Добавляет элемент в начало коллекции. Данный метод изменяет оригинальную коллекцию.

$collection = collect([1, 2, 3, 4, 5]);

$collection->prepend(5); 

dump($collection->all());

// Результат
array:6 [▼
  0 => 5
  1 => 1
  2 => 2
  3 => 3
  4 => 4
  5 => 5
]

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

$collection = collect([1, 2, 3, 4, 5]);

$collection->prepend(5, 'five'); 

dump($collection->all());

// Результат
array:6 [▼
  "five" => 5
  0 => 1
  1 => 2
  2 => 3
  3 => 4
  4 => 5
]



Метод pull
Метод извлекает из коллекции произвольный элемент по ключу. Данный метод изменяет оригинальную коллекцию.

$collection = collect(['product_id' => 'prod-100', 'name' => 'Desk']);

dump($collection->pull('name')); // "Desk"

dump($collection->all());

// Результат
 "Desk"

array:1 [▼
  "product_id" => "prod-100"
]



Метод push
Добавляет элемент в конец коллекции. Данный метод изменяет оригинальную коллекцию.

$collection = collect([1, 2, 3, 4]);

dump($collection->push(5));

dd($collection->all());

Результат

Collection {#14 ▼
  #items: array:5 [▼
    0 => 1
    1 => 2
    2 => 3
    3 => 4
    4 => 5
  ]
}

array:5 [▼
  0 => 1
  1 => 2
  2 => 3
  3 => 4
  4 => 5
]



Метод put
Устанавливает заданный ключ и значение в коллекции. Данный метод изменяет оригинальную коллекцию.

$collection = collect(['product_id' => 1, 'name' => 'Desk']);

dd($collection->put('price', 100));

// Результат
Collection {#14 ▼
  #items: array:3 [▼
    "product_id" => 1
    "name" => "Desk"
    "price" => 100
  ]
}



Метод random
Возвращает случайный элемент из коллекции

$collection = collect([1, 2, 3, 4, 5]);

dd($collection->random());

// Результат (Конечно же будет разный)
5



Метод reduce



Метод reject



Метод reverse



Метод search



Метод shift



Метод shuffle



Метод slice



Метод sort



Метод sortBy сортирует коллекцию по указанному ключу

$collection = collect([
    ['name' => 'Desk', 'price' => 200],
    ['name' => 'Chair', 'price' => 100],
    ['name' => 'Bookcase', 'price' => 150],
]);

$sorted = $collection->sortBy('price');

$sorted->values()->all();

/*
    [
        ['name' => 'Chair', 'price' => 100],
        ['name' => 'Bookcase', 'price' => 150],
        ['name' => 'Desk', 'price' => 200],
    ]
*/

Сортируемая коллекция сохраняет оригинальные ключи массива.
Вы можете использовать Callback для указания как сортировать

$collection = collect([
    ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
    ['name' => 'Chair', 'colors' => ['Black']],
    ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
]);

$sorted = $collection->sortBy(function ($product, $key) {
    return count($product['colors']);
});

$sorted->values()->all();

/*
    [
        ['name' => 'Chair', 'colors' => ['Black']],
        ['name' => 'Desk', 'colors' => ['Black', 'Mahogany']],
        ['name' => 'Bookcase', 'colors' => ['Red', 'Beige', 'Brown']],
    ]
*/



Метод sortByDesc



Метод splice



Метод sum



Метод take



Метод toArray



Метод toJson



Метод transform



Метод unique



Метод values



Метод where



Метод whereLoose



Метод whereIn



Метод whereInLoose



Метод zip

Запрет контекстного меню на блоке

Запретить контекстное меню на на любом элементе легко, достаточно добавить соответствующее событие и обработать его.

Для этого мы воспользуемся методом addEventListener.
Он принимает 2 обязательных аргумента. Первый:

type - Это тип события

Кстати, список всех событий можно найти к примеру тут

И второй обязательный аргумент:

listener - это объект, который получает уведомление о произошедшем событии указанного типа.

Это может быть обычная JavaScript функция, замыкание.

Видимо какая то ошибка у jsfiddle.net, может меню мешает, но если подводить курсор сверху, то срабатывает событие mouseout. Если сбоку, то всё нормально


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

Пример:

jsfiddle

2015   events   JavaScript

hode.js, systemd, forever

Допустим нам понадобился простой http сервер, который стартует при загрузке системы, висит на порту 1234. http://localhost:1234

Я буду использовать coffeescript.

Для начала создадим нужные нам директории и файлы

mkdir ~/testapp && cd ~/testapp && touch testapp.coffee && touch testapp.service

Установим coffee, forever

sudo npm i -g coffee forever

Далее напишем небольшой скрипт http сервера. Открываем testapp.coffee и добавляем

http = require("http")

http.createServer((request, response) ->
    response.writeHead 200,
        "Content-Type": "text/plain"
    response.end "Hello testapp \;) \n"
    return
).listen 1234

«Компилируем» наш кофе скрипт

coffee -c testapp.coffee

Можно попробовать запустить

node testapp.js

И посмотреть результат работы скрипта http://localhost:1234

Завершаем скрипт (Ctrl+C). Попробуем запустить наш «Сервер» в виде сервиса

forever start testapp.js

Если удачно, опять можем убедиться что скрипт работает http://localhost:1234

Останавливаем

forever stop testapp.js

И переходим к последней части. Скрипту systemd. Открываем testapp.service и пишем

[Unit]
Description=TestApp Server
After=network.target

[Service]
Type=forking
ExecStart=/bin/forever start --pidFile /home/*dirname*/testapp/testapp.pid --uid testapp -a /home/*dirname*/testapp/testapp.js
ExecStop=/bin/forever stop testapp
ExecReload=/bin/forever reload testapp
PIDFile=/home/*dirname*/testapp/testapp.pid

[Install]
WantedBy=multi-user.target

Замените *dirname* на имя вашей домашней директории, или полностью замените пути, если скрипт располагается в другой папке.

Копируем файл testapp.service

sudo cp testapp.service /usr/lib/systemd/system/

Включаем

sudo systemctl enable testapp.service

Запускаем

sudo systemctl start testapp.service

Готово. http://localhost:1234/

2015   forever   node.js   systemd

Цветовые настройки терминала

Цветовые настройки для konsole и urxvt, можно прикрутить и к гномовскому терминалу, да к чему угодго.

Не забудьте сделать резервные копии заменяемых файлов. Либо можно не заменять, а просто скопировать содержимое, особенно если у вас что-то специфическое в .Xdefaults и .bashrc

Кстати, в настройки bash добавлены некоторые команды (взято на просторах интернета)

  1. mkcd создаёт папку и сразу в неё переходит (mkcd myfolder)
  2. b переходит на указанное количество директорий вверх. К примеру, вы были в директории /home/myname/other/goodfolder пишите b 3 и вас перекидывает в папку /home
  3. cd это конечно стандартная команда, но тут добавлен вывод списка файлов при переходе в директорию
  4. extract мой лучший помошник. Извлекает файлы простой командой из разных типов архивов (extract archive.tar.gz)
    .tar.bz2, .tar.gz, .bz2, .rar, .gz, .tar, .tbz2, .tgz, .zip, .Z, .7z

После того как извлекли из архива и закинули в нужные папки (разархивируется всё в домашнюю директорию), перезапустите konsole и выберите в настройках профиля «Тёплая консоль»

2015   kde   konsole   linux

Archlinux, KDE, Dvorak и клавиатура DNS

Dvorak, KDE, Archlinux

Пишу эту статью на раскладке Дворака. Пока это даётся с большим трудом, но уже немного начинаю привыкать.
В иксах нет Русской раскладки Дворака, или может быть просто я её не нашёл, но это уже не важно, так как я подготовил файлы которые её добавляют.
Скачать файлы можно, с github https://github.com/LightAir/DvorakRus

Хоть я и подготовил бэкапы, но всё же рекомендую это сделать и Вам.

Теперь нужно скопировать (заменить) файлы base.xml, base.lst, evdev.xml, evdev.lst в папку /usr/share/X11/xkb/rules/ a файл ru в папку /usr/share/X11/xkb/symbols/

Далее идём в настройки -> устройства ввода -> раскладки -> добавить и добавляем Английскую и Русскую раскладки дворака.

Для удобства, я назвал их usd и rud

Теперь изменим дествие на правом Alt

Готово.

Клавиатура DNS

Я откопал пыльную клавиатуру, которую потрепала жизнь, хотя ей пользовались раза 3, не больше. Что поделать, Китай.

Приступаем к трепанации. Отвёртка...

В 90х каждый шерпотрепный Китайский магнитофон был с такой пайкой.

Снимаем плёнку.

Снимаем часть клавиш

Собираем вот по этой картинке

Вауля

Собираем обратно

Тут я убрал ножом риски

И сделал выемки на U и H

За дело берётся шкурка

Благо Русский алфавит нанесён обычной печатью. Спасибо Китаю за это))

Осталось только почистить её

Заключение

Остались некоторые проблемы с горячими клавишами, но в скором времени я их решу

Тренироваться можно тут http://klava.org

2015   archlinux   dvorak   kde   linux

Bezier curves or control points in action =)

Вот так мило, с coffeescript в руках и либой snap.svg проходит воскресный вечер.
Задача: на кривую Безье, которая создаётся динамически, добавить контрольные точки для изменения этой кривой, как в svg редакторах.

Здесь можно скачать/посмотреть некоторый промежуточный результат работы https://github.com/LightAir/Snap.svg.curves

h5ai — a modern HTTP web server index

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

http://dl.softroot.ru/

Плюсы на лицо. Красивое отображение директорий, предпросмотр (поддерживает много форматов, в т.ч. и видео), подсветка синтаксиса, QR-код при наведении курсора на файл.

Офф. сайт h5ai

Демо каталог

2014   h5ai   linux   Новости

Яндекс.Диск в Linux. Пункт в меню KDE\Dolphin. Состояние в conky

Введение

Недавно начал пользоваться консольным клиентом Яндекс.Диск в Linux.
Для удобства использования пришлось добавить в контекстное меню Dolphin
пункт публикации файла/папки, а в conky информацию о текущем состоянии Яндекс.Диска.

Сделать и то и другое довольно просто.

Добавим пункт в меню Dolphin.
Для этого создадим файл *.desktop (мой файл называется YDisk.desktop) со следующим содержанием:

[Desktop Entry]
Type=Service
ServiceTypes=all/allfiles
MimeType=all/all;
Actions=ToYandex;
X-KDE-Priority=TopLevel
X-KDE-Icon=/usr/share/pixmaps/YD_logo.png
X-KDE-ServiceTypes=KonqPopupMenu/Plugin

[Desktop Action ToYandex]
Name=Опубликовать
Icon=/usr/share/pixmaps/YD_logo.png
Exec=/usr/bin/YD_public %F

Теперь поместим его в каталог /usr/share/kde4/services

sudo cp YDisk.desktop /usr/share/kde4/services

Как видно из содержания файла, в качестве иконки я использую png картинку размещённую в папке /usr/share/pixmaps/
а при нажатии на пункт выполняется команда /usr/bin/YD_public %F, где %F это имя файла.

На случай если кому-то понадобится

У нас появился пункт в меню.

Создадим файл для обработки этого события.
Для этого напишем файл YD_public следующего содержаниея.


#!/usr/bin/env sh

Выполняем команду yandex-disk publish объединяя поток error с stdout
в переменной var будет содержаться Ссылка на опубликованный файл либо Ошибка

var=`yandex-disk publish $1 2>&1`

Запускаем оповещение о том, что файл опубликован

notify-send -i /usr/share/pixmaps/YD_logo.png «Яндекс.Диск» «$var»

С помощью dbus копируем ссылку на файл в клипбоард

qdbus org.kde.klipper /klipper org.kde.klipper.klipper.setClipboardContents $var

Копируем наш файл в /usr/bin и делаем файл исполняемым.

cp YD_public /usr/bin
chmod +rx /usr/bin/YD_public

Результат работы notify-send

Ссылка в клипбоард тоже успешно скопирована

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

Теперь разберёмся с conky (Я специально выделил белым всё что связано с Yandex.Disk)
Тут у нас типичный conky с типичным .conkyrc

Если выполнить в консоли yandex-disk status, то утилита в ответ выдаст что-то вроде

[rain@rainhost kde]$ yandex-disk status
Статус ядра синхронизации: ожидание команды
Путь к папке Яндекс.Диска: ’/mnt/raid/YDisk’
Всего: 211.97 GB
Занято: 4.08 GB
Свободно: 207.89 GB
Максимальный размер файла: 10 GB
Размер корзины: 0 B

Хоть и не совсем годится для отображения в conky, но ничто не мешает его «парсить».

Посмотрите на файл конфигурации

yandex.disk — ${exec yandex-disk status | grep -i Всего | sed -e ’s/^.\{8\}//’}

${exec yandex-disk status | grep -i Занято | sed -e ’s/^.\{9\}//’}${alignr}${execbar YD_free}

Status:${alignr}${exec yandex-disk status | grep -i «Статус ядра»| sed -e ’s/^.\{27\}//’}

Other informations:

${exec yandex-disk status | grep -i «Статус синхронизации»| sed -e ’s/^.\{22\}//’}

Немного разберём его.
В первой строке мы запускаем yandex-disk status, с помощью grep отбираем строчку в которой есть совпадение со словом «Всего» grep -i Всего и удаляем 8 первых символов sed -e ’s/^.\{8\}//’. Таким образом мы получили общий объём Яндекс.Диска и вывели в conky. Аналогичным способом получили информацию о том сколько занято (строка 2), а также информацию о статусе (строки 3 и 5).
Во второй строке я также вывожу bar с информацией о том на сколько заполнен диск в процентах, для этого написал небольшой скрипт YD_free который возвращает число от 0 до 100 в зависимости от заполненности диска, а execbar отображает его принимая в качестве аргумента результат работы YD_free:


#!/usr/bin/env sh

var=`yandex-disk status | grep -i Всего | sed -e ’s/^.\{8\}’ | sed ’s/.\{6\}$’ 2>&1`
vos=`yandex-disk status | grep -i Занято | sed -e ’s/^.\{9\}’ | sed ’s/.\{6\}$’ 2>&1`

echo $[$vos*100/$var]

Тут в первую переменную пишем сколько у нас места Всего, во вторую сколько Занято, в третей строке выводим процент.

P.S. Хотелось бы что бы команда Яндекс добавила больше опций на вывод (к примеру пишешь команду yandex-disk status disk free — результат свободное место на диске цифрами), а читатель «получил запал» для старта новых идей.

2014   kde   linux   yandex

Пишем музыку в Linux. Софт

Вступление

Месяца два назад я полностью перешёл на OpenSource в плане написания музыки. Ещё год назад, меня никакими силами нельзя было заставить писать музыку в Linux и перейти с таких удобных продуктов как Adobe Audition, Logic Studio, FL Studio, многочисленных синтезаторов и плагинов обработки, но времена меняются, и ситуация с музыкальным софтом под linux изменяется к лучшему.

JACK Audio Connection Kit

Центр всего звука в Linux — JACK.

Если программа не поддерживает JACK, не тратьте время на её изучение. В нём можно коммутировать почти все. К примеру, есть DAW в которую мы пишем электрогитару и нам нужно компрессировать звук отдельным standalone компрессором — нет проблем если компрессор поддерживает этот звуковой сервер.
Сразу оговорюсь, что для коммутации я использую приложение от KXStudio Catia, а в качестве обработки — замечательный набор LADSPA плагинов Calf. Катя предоставляет наглядный интерфейс для коммутации приложений использующих JACK.

Почему следует использовать JACK?

Два главных пункта это:

  • Обширные возможности коммутации
  • Минимальные задержки (Ещё больше уменьшить задержки позволяет RT ядро.)

Я настоятельно рекомендую использовать JACK2, т. к. с появлением этой версии я забыл о его постоянных вылетах. Не могу вспомнить, когда последний раз он вылетал или мне приходилось бы перезапускать сервер. В «первой» версии это было после каждого «неловкого движения», что изрядно портило творческий процесс.

DAW Ardour

Уже сейчас с полной уверенность можно сказать, что Ardour полноценная DAW (digital audio workstation), т. к. теперь он поддерживает работу с midi, правда пока это не совсем удобно, но от версии к версии заметны значительные улучшения.

На данный момент, Ardour в бинарном виде не поддерживает windows vst, для его поддержки нужно собрать daw из исходников с соответствующей опцией. Не рекомендую такой способ, если уж очень хочется какого-нибудь windows vst плагина, то для этих целей существует Festige.

FeSTige

FeSTige — QT обёртка программы FST, которая предназначена для запуска windows vst плагинов с соединением их через JACK.
К сожалению многие vst работают не должным образом. Знаю точно, что сэмплер kontakt работает на ура, именно из-за этой программы я долгое время не решался переходить. Основной плюс использования FST в том, что если плагин «упадёт», то не потянет за собой DAW с не сохранённым проектом.

LinuxSampler

LinuxSampler пока единственный, достойный внимания, сэмплер. Поддерживает форматы GIG, SF2 и SFZ. В сети присутствует достаточно большое количество банок таких форматов, как платных так и бесплатных.
Хочу выделить лишь одну библиотеку пианино — Salamander Grand Piano V3, мне очень понравился её звук, звучит натурально, чисто и кстати она бесплатна.


На скриншоте jSampler Fantasia, графическая «Обёртка» на Java для LinuxSamler.

Calf

Ardour имеет поддержку LADSPA, поэтому Calf в нём работают без проблем, но есть для этих плагинов стек, в который можно загружать все эффекты и синтезаторы, сохранять их конфигурацию, ну и естественно работать с ними.

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

Заключение

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

2014   linux   music