• Не сортируются колонки, с чем это связано?

    @forspamonly2
    пройдите один раз свой код отладчиком, и всё поймёте. я бегло насчитал 8 ошибок в реализации.

    про ошибки в проектировании даже не упоминаю (это всё надо делать совсем по-другому), но чтобы от этого упражнения была какая-то польза, хотя бы добейтесь чтобы оно как есть заработало.
  • Как в typescript правильно описать интерфейс?

    @forspamonly2
    забыл что для выборки по типам есть библиотечный тип Extract. с ним всё в одну строчку:

    type StringsFromX = (typeof x)[Extract<keyof typeof x, number>];
  • Как изменить функцию scrollTop?

    @forspamonly2
    а это вообще не имеет смысла. если надо повторять картинку, для этого есть повторяющийся фон у блока
  • Готовые операционные системы для мобильных?

    @forspamonly2
    вторая ссылка в этом ответе - правильная. конкретнее, вот этот подраздел: https://developer.android.com/work/dpc/dedicated-d...
  • Почему C# не позволяет делать Downcast от родителя к потомку?

    @forspamonly2
    ну нету там id, где ж он его возьмёт? а для Person id надо...
  • Почему проистодит re-render левого списка (react-redux)?

    @forspamonly2
    отработал метод render - это и есть "перерисовался". так что если метод вызвался, значит оно решило что пропсы разные.

    почему они могут быть разными - другой вопрос. например, если колбэк передаётся как стрелочная функция, он каждый раз будет новым. у вас кажется так клик ловился, но сейчас проект недоступен, точно не скажу.
  • Почему проистодит re-render левого списка (react-redux)?

    @forspamonly2
    не надо вам ничего запрещать. ваш компонент и так не перерисовывается, это только обёртка редукса.

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

    каждое изменение стора всегда вызывает срабатывание обёрток всех приконнекченных к нему редуксовских компонентов.

    а уже ваши компоненты перерисовываются тогда, когда что-то в собранных обёртокой пропсах поменялось. потому что они pure.

    не хотите чтобы лишние обёртки срабатывали - не цепляйте лишнего к редуксу. отдельные карточки в вашем случае (да и в том примере тоже) совсем не обязательно к редуксу цеплять, им достаточно данные пробросить снаружи.
  • Почему проистодит re-render левого списка (react-redux)?

    @forspamonly2
    просто в том примере редукс прошлой версии. поставьте на пробу себе старый - у вас тоже перестанет моргать всё, кроме правого списка.

    только не забудьте потом вернуть обратно, оно же не просто так моргает.

    сравнительно недавно, в 16 реакте переделали работу контекстов. новый 6 реакт-редукс, в свою очередь, переделали для использования этих контекстов. старый редукс работал без них: сравнивал посчитанные пропсы внутри себя и вызывал forceUpdate обёрнутых компонентов напрямую. как работает новый - я описал выше.

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

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

    @forspamonly2
    ну значит слово "рано" в вашем случае совсем не подходит.

    обновляющиеся (evergreen) браузеры это уже все умеют (за исключением некоторых вещей в таблицах), а необновляющиеся и не будут. если без ие никак, на том caniuse во вкладке resources есть полифилл.

    актуальное решение для актуальных браузеров и типовой костыль для неактуальных.
  • Почему удаляется последний элемент из массива в state?

    @forspamonly2
    вы-то его выведете, а юзер, небось, туда набирать что-то станет сдуру. так что обрабатывать введённое вам рано или поздно придётся. почитайте про Controlled Components как это там принято делать.

    ну и вам будет проще (не эффективнее, а именно проще) всего иметь модель данных всех этих инпутов в родительском компоненте. а при рендере отрисовывать по списку вложенные компоненты, передавая туда данные из модели, методы для удаления/обновления и тот самый индекс.
  • Как правильно сделать меню так чтобы она при прокрутке прилипала к верхней части экрана?

    @forspamonly2
    Сергей delphinpro, а чего смутило-то? автор вопроса своё меню, наверное, не таблицей верстает.
  • Как преобразовать массив к другому виду?

    @forspamonly2
    самое время почитать что такое рекурсия
  • Почему в С можно изменить константный символьный массив?

    @forspamonly2
    поспрашивал знакомых, поразмышлял на тему, пришёл к выводу, что это раздирание строчек на непросредственные операнды - скорее всего попытка злоупотребления конвейером декодера инструкций в качестве халявной префетчилки.
  • Как распознать дедлок?

    @forspamonly2
    ещё для получения стектрейса всех жабьих потоков можно послать процессу SIGQUIT
    а если консоль приложения доступна, можно нажать контрол-брейк.
  • Как лучше организовать код и вообще улучшить код?

    @forspamonly2
    если честно, лучше не стало. для простой задачи код тоже должен быть простым.

    в качестве благотворительности, я вам провёл почти полноценный код ревью. замечания и варианты "как надо" поместил по тексту вашего исходника в многострочных комментариях /* ... */ свои варианты не проверял - тестировать это мне не на чем. и самое главное, перечислены изменения в плане реализации, а не в плане подхода - кроме всего этого, вам надо менять подход и модель данных выделять.

    /* эти три let вполне могут быть const */
    let resa = document.querySelector('.todo_ul');
    let addLi = document.querySelector('.todo_add');
    let inputLi = document.querySelector('.todo_input');
    
    // Событие на кнопку "Добавить"
    addLi.addEventListener('click',function(e){
    	//Отключает перезагрузку страниц
    	e.preventDefault();  /* перезагрузки изначально не должно быть, вы наверное неподходящий тип кнопки выбрали? */
    	let ul = document.querySelector('.todo_ul'); /* ссылка на этот элемент уже получена выше под именем resa */
    	//В список при нажатии на кнопку "Добавить" добавляется новый элемент списка со значением из инпута
    	ul.appendChild(addNewLi(inputLi.value)) /* разумнее само заталкивание иметь внутри соответствующего метода, а не тут */
    	//Очищаем инпут
    	inputLi.value = '';
    });
    /*
    в результате, ваш обработчик может выглядеть так:
    
    addLi.addEventListener('click',function(e){
    	addNewLi(inputLi.value));
    	inputLi.value = '';
    });
    
    */
    
    //Функция для создания элемента списка
    /* это всё я уже советовал заменить на шаблон с кусочком html */
    function addNewLi(value){
    	if(value === ''){
    		return false
    	}; /* в таких местах точка с запятой не нужна */
    
    	let li = createElem('li',{class:'todo_li'}) /* а в таких наоборот нужна.  много мест. все помечать не буду */
    	let divInLi = createElem('div',{class:'todo_check'})
    
    	let changeButton = createElem('input',{type:'button',value:'Изменить',class:'todo_li_change li_button'});
    	let deleteButton = createElem('input',{type:'button',value:'Удалить',class:'todo_li_delete li_button'});
    	let saveButton = createElem('input',{type:'button',value:'Сохранить',class:'save_change_item li_button'});
    	/* класс li_button почти наверняка лишний, вы спокойно можете в css привязаться к родительскому классу, особенно если тэг на button поменяете */
    	let saveInput = createElem('input',{type:'text',class:'change_item'});
    
    	let p = createElem('p',{class:'li_text'});
    
    	p.innerHTML = value;  /* это у вас натуральная XSS уязвимость.  что будет если пользователь введёт <script>вредоносный код</script> ?*/
    	li = appendChilds(li,p,divInLi,changeButton,deleteButton,saveButton,saveInput)
    
    	//Выполняить функцию, а качестве аргумента - нвоый созданый элемент списка
    	//doEvent(li);
    
    	return li
    };
    function createElem(tag,props){
    	let div = document.createElement(tag);
    	for( let key in props){
    		/* в таких местах должна быть проверка if(props.hasOwnProperty(key)), а то могут непонятно от кого унаследованные поля вылезти  */
    		/* или for(const key of Object.keys(props)) */
    		div.setAttribute(key, props[key])
    	}
    	return div
    };
    function appendChilds(obj,...arg){  /* правильно children */
    	for(let i = 0; i < arg.length; i++){ /* тут был бы уместен какой-нить arg.forEach(x => obj.appendChild(x)) */
    		obj.appendChild(arg[i]);
    	}
    	return obj
    };
    
    /*
    всё добавление тудушки может выглядеть так:
    
    function addNewLi(value){
    	if(!value) return;
    
    	const li = document.createElement('li');
    	li.outerText = `
    		<li class="todo_li">
    			<p class="li_text"></p>
    			<div class="todo_check"></div>
    			<button class="todo_li_change">Изменить</button>
    			<button class="todo_li_delete">Удалить</button>
    			<button class="save_change_item">Сохранить</button>
    			<input type="text" class="change_item">
    		</li>`;
    	li.querySelector('.li_text').textContent = value;
    
    	resa.appendChild(li);
    }
     */
    
    resa.addEventListener('click', function(e){ /* когда кода много, обработчики надо разобрать на отдельные именованные по смыслу методы.  но этот код почти весь лишний  */
    
    	console.log(e.target.className)
    	if(e.target.tagName === 'P'){
    		let check = e.target.parentNode.querySelector('.todo_check');
    		check.classList.toggle('check'); /* дублирующиеся по смыслу классы у чекбокса и родителя, достаточно родительского, а в цсс использовать селектор .todo_li.checked .todo_check */
    		e.target.parentNode.classList.toggle('checked');
    	}else if(e.target.tagName === 'LI'){ /* простановка галки повторяется аж три раза, явно зря */
    		let check = e.target.querySelector('.todo_check');
    		check.classList.toggle('check');
    		e.target.classList.toggle('checked');
    	}else if(e.target.classList.contains("todo_li_change")){
    		let qSelector = e.target.parentNode;
    		let save = qSelector.querySelector('.save_change_item');
    		let saveInput = qSelector.querySelector('.change_item');
    		let deleteButton = qSelector.querySelector('.todo_li_delete');
    		let litext = qSelector.querySelector('.li_text');
    		saveInput.value = litext.innerHTML;
    		save.style.visibility = 'visible'; /* все переключения видимости должны быть сделаны в css. тут надо только добавлять и снимать тудушке класс .edited, а в цсс при наличии класса показываются инпут и кнопка сохранить, а при отсутсвии - кнопки редкатирования/удаления и параграф с текстом тудушки */
    		saveInput.style.visibility = 'visible';
    		e.target.className += ' disp_none';
    		deleteButton.className += ' disp_none';
    	}else if(e.target.classList.contains('save_change_item')){
    		let saveInput = e.target.parentNode.querySelector('.change_item');
    		let litext = e.target.parentNode.querySelector('.li_text');
    		let save = e.target.parentNode.querySelector('.save_change_item');
    		let deleteButton = e.target.parentNode.querySelector('.todo_li_delete');
    		let chandeButton = e.target.parentNode.querySelector('.todo_li_change');
    
    		litext.innerText = saveInput.value;
    		save.style.visibility = 'hidden';
    		saveInput.style.visibility = 'hidden';
    		deleteButton.classList.remove('disp_none')
    		chandeButton.classList.remove('disp_none')
    	}else if(e.target.classList.contains('todo_li_delete')){
    		e.target.parentNode.remove()
    	}else if(e.target.classList.contains('todo_check')){
    		e.target.classList.toggle('check');
    		e.target.parentNode.classList.toggle('checked')
    	}
    })
    
    /*
    итого, делегированная обработка событий получается примерно такая:
    
    resa.addEventListener('click', function(e){
    	const el = e.target;
    	const li = el.closest(".todo_li");
    
    	if(!li) return;
    
    	if(el.matches(".todo_li_change")) {
    		li.querySelector('.change_item').value = li.querySelector('.li_text').textContent;
    		li.classList.add('edited');
    	}
    	else if(el.matches(".save_change_item")) {
    		li.querySelector('.li_text').textContent = li.querySelector('.change_item').value;
    		li.classList.remove('edited');
    	}
    	else if(el.matches(".todo_li_delete")) {
    		li.remove();
    	}
    	else {
    		li.classList.toggle('checked');
    	}
    });
    */
  • Почему в С можно изменить константный символьный массив?

    @forspamonly2
    детский вопрос внезапно стал интересным.

    а зачем оно так делает? чего ради заталкивать строчку в стек?

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

    причём, делает это даже если ридонли секция уже есть. ладно бы лишнюю секцию пытался сэкономить.

    если это попытка улучшать локальность данных для кэша, то проще было бы сразу в кодовой секции константу оставить, места в ней это бы меньше заняло чем всё это перекладывание...
  • Какие бывают БД с хуками?

    @forspamonly2
    Сергей Прищенко, ну, в принципе, для постгресса существуют pl/php и pl/v8. триггеры писать на них должно быть можно. насколько реально этим на самом деле пользоваться - другой вопрос.
  • Как понять эту формулу плотности цены?

    @forspamonly2
    какой экономический смысл в десятикратном соотношении десятидневного спреда и однодневных - загадка. по логике вещей, чтобы это как-то использовать, хотя бы надо поделить на n, то бишь на 10 в данном случае.

    да и описанию ваша формула не соответствует. впрочем, я не экономист ни разу.