references
на столбец другой таблицы. В таком случае, на последнее должно стоять ограничение уникальности - иначе как понять на какую строку ссылаться. const promises = [
Promise.reject('rejected1'),
Promise.reject('rejected2'),
Promise.resolve('resolved'),
];
1) err => {throw err;}
2) err => {throw err;}
3) onFullfiled
4) onRejected,
5) onRejected
6) v => v,
С какого количества записей индексация имеет смысл?
Сделал выборку по определенному имени, вышло 75-90 мсек.
SELECT name FROM users WHERE name='Mike';
Добавил индекс CREATE INDEX name_idx ON users (name);
Выборка так и осталась в пределах 75-85 мсек.
1) Подскажите какую лучше поставить операционную систему? Если Linux, то в сторону каких дистрибутивов смотреть. Хотелось бы удалённо подключаться к этому ПК для мониторинга или обновления файлов с github.
2) Актуален ли для подобного Docker или слишком много ресурсов будет отнимать?
3) Правильно ли запускать различные сайты просто на разных портах роутера?
5) Раз выполняется проброс порта, то как это обезопасить?
package main
import "fmt"
type MyError struct {
Message string
}
func (e MyError) Error() string {
return e.Message
}
func (e MyError) Smth() {
}
type SomeInterface interface {
Smth()
}
func main() {
var err SomeInterface
err = MyError{"Something went wrong"}
// Проверяем, реализует ли err интерфейс error
if _, ok := err.(error); ok {
fmt.Println("err реализует интерфейс error")
} else {
fmt.Println("err НЕ реализует интерфейс error")
}
}
Ведь когда мы создаем переменную, то в нее копируется значение другой переменной и мы работаем с копией
Начав работать с языком Go начал придавать значение экономии памяти - не создавать лишних переменных.
this.content.querySelectorAll('.cell').forEach((cell) => {
let timer = null; // дескриптор отложенного обработчика одного клика
cell.addEventListener('click', (e) => {
if(timer)
clearTimeout(timer); // при каждом клике сбрасываем отложенный обработчик обработки одного клика
if(e.detail == 1) // на первом клике устанавливаем отложенный обработчик
timer = setTimeout(handleClickCell, 250); // Выполнение функции по одинарному клику после ожидания второго клика 250мс
if(e.detail == 2) // на втором - выполнение обработчика двойного клика
{
// благодаря счетчику detail в ивенте можем посчитать длину очереди непрерывных кликов, и в нужный момент выполнить функцию на втором клике
console.log('111');
}
} );
});
(NULL, '$val1', '$val2')
$api->dependency
class Node
{
protected function func1() {
}
}
class NodeA extends Node
{
public function FUNC2() {}
}
class NodeB extends Node
{
// Функция инициализации
public function __construct()
{
(new Api())->dependency(
function (?NodeA $a) {
$a->FUNC2(); // Метод успешно вызывется так как он public
$a->func1(); // Call to protected method Node::func1() from global scope
}
);
}
}
class Api {
function dependency(callable $dependency) {
if ($dependency instanceof Closure) {
$dependency = Closure::bind($dependency, null, null);
$dependency(new NodeA());
}
}
}
class Node
{
private array $whiteList = [
NodeA::class
];
protected function func1() {
$scope = debug_backtrace(2, limit: 2)[1]['class'];
if (!in_array($scope, $this->whiteList)) {
throw new Exception('Нельзя вызвать метод для данного класса '. $scope);
}
}
}
class NodeA extends Node
{
public function FUNC2() {}
}
class NodeB extends Node
{
// Функция инициализации
public function __construct()
{
(function (?NodeA $a) {
$a->FUNC2(); // Метод успешно вызывется так как он public
$a->func1(); // Нельзя вызвать метод для данного класса NodeB
})(new NodeA());
}
}
в 2013 на английском и только в 2016 году на русском, а это почти 10 лет назад,Глобальных измений за 10 лет было не так много, упражнения в этой книге в целом довольно интересные (если затык с ними то можно на гите поискать решения), поэтому в целом книга достаточно актуальная.