Страницы

Поиск по вопросам

суббота, 20 октября 2018 г.

У сервера гаснет физическая консоль, как это отключить?

Я администрирую Linux-серверы (разных дистрибутивов - Ubuntu server, CentOS, Fedora) - физические и виртуальные машины. У большиснтва из них есть неприятная особенность - если в "физическую консоль" (которая не ssh, а в аппаратрном мониторе с аппаратной клавиатурой, реальной или удалённой через iKVM) длительное время ничего не "писать" с клавиатуры, она "гаснет".
В реальности это выглядит так: подходишь к серверу с физическим монитором, цепляешь его - монитор показывает чёрный экран. Цепляешь клавиатуру, нажимаешь any key - монитор оживает и становится видна "физическая консоль" (если речь идёт о машине без иксов - она видна всегда, начиная с загрузки ОС, если иксы есть - то её можно достичь через Ctrl+Alt+F1). Или подключаешься к виртуальной машине по VNC - и то же самое, пока не тронешь клавиатуру - картинки нет.
Речь не идёт о "скринсейвере", это засыпание консоли происходит именно в текстовом режиме.
Как отучить Linux-хосты от такого поведения?


Ответ

Описанное поведение исходит напрямую от ядра Linux, видимо это привет из далёкого прошлого, когда к таким хостам подключались текстовые терминалы с люминофорными устройствами визуализации, которые нужно было беречь от выгорания.
Проверить, через какое время физичекский терминал "погаснет" при отсутсвии пользовательского ввода в него, можно посмотрев на содержимое файла /sys/module/kernel/parameters/consoleblank:
$ cat /sys/module/kernel/parameters/consoleblank 600
Этот файл доступен только на чтение, изменить настройку, перезаписав его, нельзя. Значение в нём - это секунды, то есть в приведённом примере консоль "гаснет" через 10 минут простоя.
Чтобы отключить это поведение глобально и навсегда, следует добавить строку consoleblank=0 к параметрам ядра в конфиге grub и перезагрузить ОС (не забыть про update-grub после редактирования). Например, так:
$ cat /etc/default/grub | grep -v '#'
GRUB_DEFAULT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true GRUB_TIMEOUT=7 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="" GRUB_CMDLINE_LINUX="consoleblank=0"
После перезагрузки видим, что параметры ядром считались и приняты:
$ cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-4.6.0-040600-generic root=UUID=544c13df-3ff3-47ba-94cc-407e414c6906 ro consoleblank=0
И настройка "засыпания" консоли изменилась:
$ cat /sys/module/kernel/parameters/consoleblank 0
Изменить этот параметр на лету, без перезагрузки, можно с помощью команды setterm, например так: setterm -blank 0 или даже так: setterm -blank 0 -powerdown 0 -powersave off, однако тут есть целых два "НО":
это работает только, если команду setterm вводить в "физическую" консоль (Ctrl+Alt+F1), а при вводе через ssh не работает в Интернете пишут, что поведение setterm меняется от ядра к ядру и от дистрибутива к дистрибутиву, т.е. считать это способ вполне универсальным нельзя

Непонятный код с variadic templates

Есть код, который, используя variadic templates, печатает любое количество входных аргументов в поток:
template void print(Args&& ...args) { char compile_time_buffer[sizeof...(Args)] = { ((std::cout << args <<" "), 0)... }; std::cout<< "
"; }
Совершенно не могу понять, чем инициализируется массив compile_time_buffer. Что скрывается за синтаксисом ((std::cout << args <<" "), 0)? И почему массив char, а в поток корректно выводятся объекты любого типа?


Ответ

В этом выражении
((std::cout << args <<" "), 0)...
используется оператор запятая. Значением выражения является второй операнд после запятой, то есть 0. В результате символьный массив инициализируется нулями. При этом имеется побочный эффект вычисления первого операнда оператора запятая в виде вывода в поток переданных в функцию аргументов.
Чтобы было более наглядно, то просто замените 0, например, на символ 'A'. Ниже показана демонстрационная программа.
#include
template void print( Args && ...args ) { char compile_time_buffer[sizeof...(Args)] = { ( (std::cout << args <<" "), 'A' )... };
std::cout.write( compile_time_buffer, sizeof...(Args) ); }
int main() { print( 1, 2, 3 );
return 0; }
Ее вывод на консоль следующий
1 2 3 AAA
Можно сделать эту программу более интересной. Например,
#include
template void print( Args && ...args ) { char c = 'A'; char compile_time_buffer[sizeof...(Args) + 1] = { ( std::cout << args <<" ", c++ )... };
std::cout << compile_time_buffer << std::endl; }
int main() { print( 1, 2, 3 );
return 0; }
Ее вывод на консоль следующий
1 2 3 ABC
Вот еще один простой пример использования оператора запятая при инициализации переменной
int x = ( std::cout << "Инициализация x. x = ", 10 ); std::cout << x << std::endl;
На консоль будет выведено
Инициализация x. x = 10

Число с фиксированной точностью

Надо вывести число a типа float на экран c точностью не менее n знаков после запятой. Python 3, без использования библиотек.


Ответ

n = 5 a = 1.2345678912345 template = '{:.' + str(n) + 'f}' print(template.format(a))

Нужен ли сейчас underscrore?

Какие возможности underscore вы используете? Например, в нём есть функция each. Зачем она нужна, если теперь есть forEach, map в обычном js? Я так понимаю эта библиотека была актуальна когда не было ES5?


Ответ

Нет не нужен, можно родными средствами языка делать. Интерес к библиотекм постепенно снижается. Вот динамика запросов из гугла:

Сравните сами:
Массивы
_.concat
// Underscore/Lodash var array = [1] var other = _.concat(array, 2, [3], [ [4] ])
console.log(other) // результат: [1, 2, 3, [4]]
// Native var array = [1] var other = array.concat(2, [3], [ [4] ])
console.log(other) // результат: [1, 2, 3, [4]]
_.fill
// Underscore/Lodash var array = [1, 2, 3]
_.fill(array, 'a')
console.log(array) // результат: ['a', 'a', 'a']
_.fill(Array(3), 2) // результат: [2, 2, 2]
_.fill([4, 6, 8, 10], '*', 1, 3) // результат: [4, '*', '*', 10]
// Native var array = [1, 2, 3]
array.fill('a')
console.log(array) // результат: ['a', 'a', 'a']
Array(3).fill(2) // результат: [2, 2, 2]
[4, 6, 8, 10].fill('*', 1, 3) // результат: [4, '*', '*', 10]
_.find
// Underscore/Lodash var users = [{ 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false }, { 'user': 'pebbles', 'age': 1, 'active': true }]
_.find(users, function(o) { return o.age < 40; }) // результат: object for 'barney'
// Native var users = [{ 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false }, { 'user': 'pebbles', 'age': 1, 'active': true }]
users.find(function(o) { return o.age < 40; }) // результат: object for 'barney'
_.findIndex
// Underscore/Lodash var users = [{ 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false }, { 'user': 'pebbles', 'age': 1, 'active': true }]
var index = _.findIndex(users, function(o) { return o.age >= 40; }) console.log(index) // результат: 1
// Native var users = [{ 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false }, { 'user': 'pebbles', 'age': 1, 'active': true }]
var index = users.findIndex(function(o) { return o.age >= 40; }) console.log(index) // результат: 1
_.indexOf
// Underscore/Lodash var array = [2, 9, 9] var result = _.indexOf(array, 2) console.log(result) // результат: 0
// Native var array = [2, 9, 9] var result = array.indexOf(2) console.log(result) // результат: 0
_.join
// Lodash var result = _.join(['one', 'two', 'three'], '--') console.log(result) // результат: 'one--two--three'
// Native var result = ['one', 'two', 'three'].join('--') console.log(result) // результат: 'one--two--three'
_.lastIndexOf
// Underscore/Lodash var array = [2, 9, 9, 4, 3, 6] var result = _.lastIndexOf(array, 9) console.log(result) // результат: 2
// Native var array = [2, 9, 9, 4, 3, 6] var result = array.lastIndexOf(9) console.log(result) // результат: 2
_.reverse
// Lodash var array = [1, 2, 3] console.log(_.reverse(array)) // результат: [3, 2, 1]
// Native var array = [1, 2, 3] console.log(array.reverse()) // результат: [3, 2, 1]
Коллекции
_.each
// Underscore/Lodash _.each([1, 2, 3], function(value, index) { console.log(value) }) // результат: 1 2 3
// Native [1, 2, 3].forEach(function(value, index) { console.log(value) }) // результат: 1 2 3
_.every
// Underscore/Lodash function isLargerThanTen(element, index, array) { return element >= 10 } var array = [10, 20, 30] var result = _.every(array, isLargerThanTen) console.log(result) // результат: true
// Native function isLargerThanTen(element, index, array) { return element >= 10 }
var array = [10, 20, 30] var result = array.every(isLargerThanTen) console.log(result) // результат: true
_.filter
// Underscore/Lodash function isBigEnough(value) { return value >= 10 } var array = [12, 5, 8, 130, 44] var filtered = _.filter(array, isBigEnough) console.log(filtered) // результат: [12, 130, 44]
// Native function isBigEnough(value) { return value >= 10 } var array = [12, 5, 8, 130, 44] var filtered = array.filter(isBigEnough) console.log(filtered) // результат: [12, 130, 44]
_.includes
var array = [1, 2, 3] // Underscore/Lodash - also called with _.contains _.includes(array, 1) // результат: true
// Native var array = [1, 2, 3] array.includes(1) // результат: true
// Native (only works with flat array values, no complex objects) var array = [1, 2, 3] array.indexOf(1) > -1 // результат: true
_.map
// Underscore/Lodash var array1 = [1, 2, 3] var array2 = _.map(array1, function(value, index) { return value * 2 }) console.log(array2) // результат: [2, 4, 6]
// Native var array1 = [1, 2, 3] var array2 = array1.map(function(value, index) { return value * 2 }) console.log(array2) // результат: [2, 4, 6]
_.pluck
// Underscore/Lodash var array1 = [{ name: "Alice" }, { name: "Bob" }, { name: "Jeremy" }] var names = _.pluck(array1, "name") console.log(names) // результат: ["Alice", "Bob", "Jeremy"]
// Native var array1 = [{ name: "Alice" }, { name: "Bob" }, { name: "Jeremy" }] var names = array1.map(function(x) { return x.name }) console.log(names) // результат: ["Alice", "Bob", "Jeremy"]
_.reduce
// Underscore/Lodash var array = [0, 1, 2, 3, 4] var result = _.reduce(array, function(previousValue, currentValue, currentIndex, array) { return previousValue + currentValue }) console.log(result) // результат: 10
// Native var array = [0, 1, 2, 3, 4] var result = array.reduce(function(previousValue, currentValue, currentIndex, array) { return previousValue + currentValue }) console.log(result) // результат: 10
_.reduceRight
// Underscore/Lodash var array = [0, 1, 2, 3, 4] var result = _.reduceRight(array, function(previousValue, currentValue, currentIndex, array) { return previousValue - currentValue }) console.log(result) // результат: -2
// Native var array = [0, 1, 2, 3, 4] var result = array.reduceRight(function(previousValue, currentValue, currentIndex, array) { return previousValue - currentValue }) console.log(result) // результат: -2
_.size
// Underscore/Lodash var result = _.size({ one: 1, two: 2, three: 3 }) console.log(result) // результат: 3
// Native var result2 = Object.keys({ one: 1, two: 2, three: 3 }).length console.log(result2) // результат: 3
_.some
// Underscore/Lodash function isLargerThanTen(element, index, array) { return element >= 10 } var array = [10, 9, 8] var result = _.some(array, isLargerThanTen) console.log(result) // результат: true
// Native function isLargerThanTen(element, index, array) { return element >= 10 }
var array = [10, 9, 8] var result = array.some(isLargerThanTen) console.log(result) // результат: true
Функции
_.after
var notes = ['profile', 'settings'] // Underscore/Lodash var renderNotes = _.after(notes.length, render) notes.forEach(function(note) { console.log(note) renderNotes() })
// Native notes.forEach(function(note, index) { console.log(note) if (notes.length === (index + 1)) { render() } })
Язык
_.isNaN
// Underscore/Lodash console.log(_.isNaN(NaN)) // результат: true
// Native console.log(isNaN(NaN)) // результат: true
// ES6 console.log(Number.isNaN(NaN)) // результат: true
Объект
_.assign
// Underscore: _.extendOwn // Lodash function Foo() { this.c = 3; }
function Bar() { this.e = 5; } Foo.prototype.d = 4; Bar.prototype.f = 6; var result = _.assign(new Foo, new Bar); console.log(result); // результат: { 'c': 3, 'e': 5 }
// Native function Foo() { this.c = 3; }
function Bar() { this.e = 5; } Foo.prototype.d = 4; Bar.prototype.f = 6; var result = Object.assign(new Foo, new Bar); console.log(result); // результат: { 'c': 3, 'e': 5 }
_.keys
// Underscore/Lodash var result = _.keys({ one: 1, two: 2, three: 3 }) console.log(result) // результат: ["one", "two", "three"]
// Native var result2 = Object.keys({ one: 1, two: 2, three: 3 }) console.log(result2) // результат: ["one", "two", "three"]
Строка
_.repeat
// Lodash var result = _.repeat('abc', 2) // результат: 'abcabc'
// Native var result = 'abc'.repeat(2) console.log(result) // результат: 'abcabc'
_.toLower
// Lodash var result = _.toLower('FOOBAR') console.log(result) // результат: 'foobar'
// Native var result = 'FOOBAR'.toLowerCase() console.log(result) // результат: 'foobar'
_.toUpper
// Lodash var result = _.toUpper('foobar') console.log(result) // результат: 'FOOBAR'
// Native var result = 'foobar'.toUpperCase() console.log(result) // результат: 'FOOBAR'
_.trim
// Lodash var result = _.trim(' abc ') console.log(result) // результат: 'abc'
// Native var result = ' abc '.trim() console.log(result) // результат: 'abc'
Ссылки
Оригинал Mozilla Developer Network Underscore.js Lodash.js You - Dont - Need - jQuery

Garbage Collector в неуправляемом коде

Если я создам массив байт, например, и передам указатель на него в неуправляемый код, что с этим массивом будет делать Garbage Collector?


Ответ

В C# это зависит от того, как вы передаёте массив в неуправляемый код.
Обычно сборщик мусора имеет право в любой момент переместить любой управляемый объект в памяти. Чтобы этого не произошло, вы должны прикрепить объект, чтобы сборщик мусора не пытался его переместить. Для этого существует несколько методов, например, ключевое слово fixed
unsafe void F() { int[] data = { 1, 2, 3 }; fixed (int* p = &data[0]) { // тут у вас есть указатель, можно передавать его в нативный код } }
Понятно, данные будут закреплены лишь в области действия fixed, поэтому если вы запомните указатель в переменной и воспользуетесь им по окончанию блока fixed, ваша память может быть перемещена или собрана сборщиком мусора, и вы на пути к undefined behaviour, как в старые недобрые времена. Ответственность за корректность поведения unsafe-кода лежит на вас и только на вас.
Для ручной работы с адресами вам могут понадобиться IntPtr (для представления указателя в безопасном коде), GCHandle (для низкоуровневого обращения с объектами с точки зрения сборщика мусора) и особенно Marshal для ручного преобразования между нативными и управляемыми объектами.

Другой метод передавать нативной функции массив — вызов через P/Invoke. В этом случае то же самое делает за вас маршаллер. Вам придётся выписать правильную сигнатуру P/Invoke, наподобие такой:
void F( [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] long[] ar, int size);
(сигнатуры можно составить самому, вдумчиво почитав документацию, или подсмотреть сигнатуры для популярных функций WinAPI на http://pinvoke.net). Маршаллинг не может проверить правильность сигнатуры, поэтому если вы ошибётесь, последствия, думаю, понятны.

Пакет Блога для Laravel 5.3

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


Ответ

Так как другие пакеты не давали нужного функционала из коробки был выбран canvas.toddaustin.io после нескольких часов танцов с бубном все завелось но пакет сорит своими файлами и перезаписывает своиже конфиги что дико мешает. Но что-то с этим придумаем)

Как максимальную ширину изображения ограничить реальной шириной изображения?

На странице вставлена картинка:
photo
img { display: block; width: 100%; max-width: 500px; }
Максимальная ширина картинки - 500px. Если у нас ширина родителя меньше 500px, то картинка занимает 100% ширины родителя.
Но может быть так, что реальная ширина картинки меньше, чем 500px.
Как ограничить максимальную ширину картинки, если она больше 500px, и не растягивать картинку до 500px, если картинка меньшей ширины?


Ответ

Надо ограничивать наоборот: сколько надо, но не больше 100%:
img { display: block; width: auto; height: auto; max-width: 100%; } photo photo