Страницы

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

пятница, 29 марта 2019 г.

Какая разница между экземпляром и объектом класса?

Столкнулся с казалось бы простым вопросом, но понял, что дать ответ на него не смог бы.
Какая разница между экземпляром и объектом класса? Java начал недавно изучать да еще и сам. В общем, определенное время думал, что это одно и тоже. Можно с примером, пожалуйста.


Ответ

Это одно и то же!
Термины «экземпляр класса» и «объект» взаимозаменяемы.
(https://ru.wikipedia.org)

Как сохранить прогресс в консольной игре на Java?

Все знают, что при изучении программирования нужно, что-то писать. Писать калькуляторы и банкоматы надоело :) Хочу в рамках обучения Java, написать и по мере изучения дописывать консольную игру, но если ее сделать не коротенькую, хотелось бы иметь возможность как и в любой игре сохранится и когда-то продолжить играть. Подскажите как это сделать или хотя бы куда смотреть ?


Ответ

Каким образом хранить прогресс игры?
Если тебе нужно сохранять процесс - то это безусловно запись и чтение из файла. В Джаве это довольно просто, поэтому с освоением проблем не будет.
Также ты можешь сериализировать объект, то есть записать сущность объектов. Крутая штука, но новичку не стоит заморачиваться.
Ну а вообще, для более простого извлечения данных можно связать игру с БД или в хранить данные в xml-файле. Это очень элегантные способы извлечения и записи данных, но опять же для новичков сложновато.
Что именно хранить?
Ты можешь сохранять значения полей (к примеру, координаты расположения игрока, уровень, на котором остановился игрок, место сохранения и т.д)

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

Защита игры от взлома

Никогда не разрабатывал игры, интересует такой вопрос, допустим есть клиент игры в котором есть персонаж "лучник" который стреляет со скоростью 1 выстрел в 1 секунду, если с помощью программы(например hlapex) поймать пакет который отвечает за выстрел, и отсылать его каждые 0.1 то лучник получается будет делать 10 выстрелов в 1 секунду? То есть на сервере нужно проверять когда был последний выстрел и если следующий выстрел слишком быстро произошел, то блокировать этот выстрел? Или я что-то не понимаю и выстрелы не отправляются? Вообщем может кто-то объяснить?


Ответ

Все верно. Учитывай время между запросами. Блокируй если "выстрелы" приходят при меньшем таймауте чем разрешено.

Определение расширения файла в python

Как в python сделать максимально правильно проверку на расширения файла ? Скажем, ко мне попадает имя файла и я хочу сделать проверку на то, является ли его расширения .py или нет.


Ответ

Используйте os.path.splitext
>>> import os >>> filename, file_extension = os.path.splitext('/path/to/somefile.ext') >>> filename '/path/to/somefile' >>> file_extension '.ext'

Принцип работы интерфейсных переменных в Java

Только начал изучать Java, поэтому вопрос скорее всего глупый. Пример кода из Хорстманна:
public class TimerTest { public static void main(String[] args) { ActionListener listener = new TimePrinter();
// construct a timer that calls the listener // once every 10 seconds Timer t = new Timer(10000, listener); t.start();
JOptionPane.showMessageDialog(null, "Quit program?"); System.exit(0); } }
class TimePrinter implements ActionListener { public void actionPerformed(ActionEvent event) { Date now = new Date(); System.out.println("At the tone, the time is " + now); Toolkit.getDefaultToolkit().beep(); } }
Почему в данной строчке используется интерфейсная переменная? Почему не объектная? Что за процесс происходит?
ActionListener listener = new TimePrinter();


Ответ

Если в будущем вы захотите использовать не TimePrinter, а другую реализацию ActionListener? Конечно, можно делать как вам вздумается. А сделано для того, чтобы можно было на лету менять конечную реализацию (к примеру, вместо TimePrinter использовать MsecTimePrinter, т.е. другую реализацию интерфейса ActionListener).
Поэтому и принято оперировать интерфейсами. Чтобы не связывать свой код жестко конкретными реализациями, т.к. в интерфейс можно присвоить любой класс, который реализует данный интерфейс. Это ПРАВИЛЬНЫЙ подход к написанию кода
А процесс происходит довольно простой: вы объявляете интерфейсную переменную типа ActionListener и связываете её с объектом TimePrinter. В последующем вы используете только методы интерфейса ActionListener, что освобождает вас от знания конкретной реализации самого класса TimePrinter

Как проверить на null в jQuery?

AJAX возвращает объект json. В некоторых случаях json может быть null. Как лучше всего проверить объект на null? Правильно ли использовать такую проверку if(json)?


Ответ

Каноническое решение на jQuery:
if (jQuery.type( proveryamaya_peremennaya ) === "null") { console.log('eto null'); } else { console.log('eto ne null (sic!)'); }

Параметры коллекций java

Встречаю различные варианты декларирования коллекций:
List list = new ArrayList(); //1
List list = new ArrayList(); // 2
List list = new ArrayList(); //3
И совершенно нет ясности, какие объекты в какую коллекцию можно положить. Экспериментально выяснил, что в коллекцию 2 - можно добавить объекты (Object). А в коллекцию 3 - только с типом Integer.
Вопрос 1: как понять по декларированию, какие объекты может содержать коллекция?
Вопрос 2: для каких прикладных задач можно использовать первый, второй и третий вариант декларирования коллекций?


Ответ

Параметр типа коллекции содержится в левой части, что написано в правой части значения не имеет
Таким образом, записи (1, 3) полностью идентичны:
List list = new ArrayList(); //1
List list = new ArrayList(); //3
Вы можете вписывать в правую часть параметр или не вписывать, как вам удобно. Компиляция (по ссылке выше) показала, что на время выполнения запись никак не влияет. Тогда как в выражении 2:
List list = new ArrayList(); //2
Тип не указан в левой части, значит тип - любой объект Object

Случайное число в golang

Как получить случайное число? Вот функция, но она выводить всегда цифру "81"
package main
import ("fmt"; "math/rand")
func main() { fmt.Println(rand.Intn(100)) }


Ответ

Генератор случайных чисел обычно нужно рандомизировать перед использованием, иначе, он, действительно, будет выдавать одну и ту же последовательность.
В golang это можно сделать вот так:
rand.Seed(time.Now().UnixNano())
https://golang.org/pkg/math/rand/#Seed
P.S. Оставлю тут ещё ссылку на англоязычную версию SO, с вопросом, как правильно инициализировать рандомайзер: golang random number generator how to seed properly

Свойства c# - как работают

class A { private int a; private int b; private int c;
public int W{get;set;} }
Вопрос: к какому из этих трех полей будет иметь доступ это свойство?


Ответ

Ни к какому из указанных, компилятор создаст неявное поле для свойства W
Если вам нужно что бы свойство обращалось к конкретному полю, это нужно указать явно.
class A { private int a;
public int W { get { return a; } set { a = value; } } }

Foreach и новый объект

Вот к примеру такой код, он загружает картинки из файлов и считает максимальную ширину и суммарную высоту:
List bitmapsList = new List(); foreach (string fn in fileNames) { Bitmap bmp = new Bitmap(fn); // Интересует вот эта строка bitmapsList.Add(bmp); if (bmp.Width > maxWidth) maxWidth = bmp.Width; totalHeight += bmp.Height; }
Вопрос: как будет правильней, создавать объект Bitmap bmp в цикле, или объявить его перед циклом? Что происходит с ним после прохода одной интерации цикла?


Ответ

Упрощенно можно считать что переменные, объявленные внутри блока ограниченного { } существуют до тех пор, пока выполняется код этого блока. Как только управление передается за пределы блока, все локальные переменные блока удаляются.
С объектами иначе. Объект существует до тех пор, пока к нему можно получить доступ по ссылке. Когда ни одной живой ссылки не осталось, объект может быть удален сборщиком мусора.
В реальности механизм в обоих случаях сложнее, но для начального понимания этого достаточно.
В вашем коде, переменные объявленные внутри цикла будут пересоздаваться на каждой итерации. Ссылку на Bitmap вы кладете в List объявленный за пределами цикла, поэтому с ним ни чего не произойдет.
Создание объекта, происходит в момент вызова конструктора new Bitmap(fn), и оно разумеется должно быть внутри цикла.
Что касается вопроса "как лучше?" - чем код понятнее, тем лучше, компилятор и Jit-компилятор в процессе работы все равно оптимизируют и изменят его так, как посчитают нужным и эффективным. Хотя надо отметить, что для языков на основе стековой машины, C# в их числе, присутствует рекомендация - объявлять переменную максимально близко к месту ее использования, т.е. если переменная используется только внутри итерации цикла и ее значение не участвует в последующих итерациях - объявляем ее внутри цикла, в противном случае вне цикла.
Ну и потратьте день другой, на целенаправленное изучение/повторение основ языка, принципов работы с памятью и сборки мусора в .NET, это реально нужно, если конечно вы планируете развиваться дальше в этом направлении. Вот тут есть отличный список литературы.

Instant run нужно ли?

Всё чаще Android Studio предлагает сделать update Instant Run 2.2.2. Пролистав о возможностях, выделил для себя что это способствует быстрому запуску приложения, без предварительной установки apk.
Но на самом деле это так хорошо как описывают?
И если да, как его установить так, чтоб он не всплывал мне каждый раз окном.


Ответ

Instant Run – это технология, позволяющая сократить время сборки проекта (при этом время первой сборки увеличивается).
Но есть одно очень большое НО: при использовании этой технологии, в некоторых случаях Вы можете получить некорректное поведением Ваших программ.
В официальной документации Google сам пишет что-то вроде: «... для корректного функционирования название_чего-то технология Instant Run должна быть отключена».
Если Вы знаете все те ситуации, где использование Instant Run может привести к некорректным результатам, то в принципе, использовать ее можно, но что-то мне подсказывает, что использование этой технологии может повлиять на поведение Вашей программы даже в каком-то случае, который незадокументирован, поэтому я все таки посоветовал бы не использовать ее (по крайней мере пока).
Подробнее про Instant Run можно почитать в этой статье, либо в официальной документации.
UPD. Как отключить Instant Run:
File – Settings – Build, Execution, Deployment – Instant Run – убрать галочку Enable Instant Run...

Длина большого файла через функцию filelength

Никак не могу понять почему, если хочу узнать длину файла ~3GB в байтах вот так:
FILE * f; errno_t err = fopen_s(&f, "a.iso", "rb"); if (f == NULL) { return 0; } unsigned long int size = filelength(fileno(f)); cout << size << endl;
то мне выдаёт максимально возможное число для типа unsigned long int 4 294 967 295. С маленькими файлами всё нормально (правда я там int использую). Функция filelength объявлена в .
Подскажите, пожалуйста, что тут неправильно.


Ответ

Ну, если файл большой :), то для этого есть, например, _filelengthi64 (подробнее тут).

Interface с реализацией

Я во всех учебниках видел, читал, тестировал interface с методами без реализации. Но вот копаюсь в дереве и тут есть методы с реализацией default. Это как понять? То есть можно реализовать интерфейс с реализацией??? Спасибо.


Ответ

Можно определить интерфейс с реализацией. Эта возможность появилась в Java 8, в более ранних версиях она была недоступна. Вот пример реализации такого интерфейса:
interface Test { default int test(int i) { return i; } }
Если в классе, реализующем этот интерфейс, метод не переопределяется, то будет использована дефолтная реализация из интерфейса.
Фактически, начиная с Java 8, интерфейс приобрёл некоторые черты обычного класса и стало возможным реализовать некий аналог множественного наследования.

Поворот матрицы (двумерного массива) на 90 градусов в Python с помощью zip

Как сделать поворот матрицы в одну строчку без numpy и циклов?
Например если исходная матрица
[[1, 2], [3, 4]]
то результирующая должна быть:
[[3, 1], [4, 2]]


Ответ

Вполне себе рабочий вариант, если скорость не критична.
Но если есть требования по скорости обработки, то лучше все-таки воспользоваться NumPy.
Сравнение производительности для массива 100x100:
In [72]: a = np.random.randint(0, 99, (100, 100))
In [73]: m = a.tolist()
In [74]: a.shape Out[74]: (100, 100)
In [75]: %timeit tuple(zip(*m[::-1])) 10000 loops, best of 3: 71 µs per loop
In [76]: %timeit np.rot90(a, 3) The slowest run took 9.64 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 2.63 µs per loop
Сравнение производительности для массива 1000x1000:
In [77]: a = np.random.randint(0, 99, (1000, 1000))
In [78]: m = a.tolist()
In [79]: a.shape Out[79]: (1000, 1000)
In [80]: %timeit tuple(zip(*m[::-1])) 10 loops, best of 3: 32.6 ms per loop
In [81]: %timeit np.rot90(a, 3) The slowest run took 7.54 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 2.59 µs per loop
Сравнение производительности для массива 10000x10000:
In [82]: a = np.random.randint(0, 99, (10000, 10000))
In [83]: m = a.tolist()
In [84]: a.shape Out[84]: (10000, 10000)
In [85]: %timeit tuple(zip(*m[::-1])) 1 loop, best of 3: 4.43 s per loop
In [86]: %timeit np.rot90(a, 3) The slowest run took 11.29 times longer than the fastest. This could mean that an intermediate result is being cached. 100000 loops, best of 3: 2.59 µs per loop

Не добавляются уникальные элементы в массив

Пишу свой велосипед по удалению одинаковых элементов массива. Как бы при выводе в консоль дубли не попадаются т.е выводится всё как нужно (1, 11, 2, 4, 5, 3). Но при этом в результирующий массив res ничего не попадает. Помогите исправить
var res = []; var a = [1, 1, 11, 2, 4, 2, 5, 3, 1]; var N = a.length; for (i = 0; i < N; i++) { f = 1; for (j = 0; j < N; j++) if (a[i] == a[j] && i != j) { f = 0; break; } if (f == 1){ console.log(a[i]); //в консоле(1,11,2,4,5,3) res.push(a[i]) // в итоговом массиве 1,1,11,2,4,2,5,3,1 -----что не верно } } }


Ответ

Честно говоря не хочу смотреть ваш велосипед. Да он и в консоль выводит дубли. Не знаю как вы проверяли.
Но, кмк, проще сделать так:
var arr = [1, 1, 11, 2, 4, 2, 5, 3, 1]; var set = new Set(arr); arr = Array.from(set); console.log(arr);
Объекты Set позволяют сохранять уникальные значения любого типа, как примитивы, так и другие типы объектов. (вроде браузеры поддерживают)
Array.from() создаёт новый экземпляр Array из массивоподобного или итерируемого объекта.

Функция со switch с переменным количеством case

Допустим, у меня есть несколько таких блоков:
// Ввод символа do switch (_getch()) { // Делать одно case '1': dosmth1(); break; // Делать второе case '2': dosmth2(); break; // Делать третье case '3': dosmth3(); break; // Выйти case '0': dosmth0(); return 0; } while (true);
Но, ввиду частого создания оных, возникает вопрос:
Как организовать такую функцию menu(), которая создавала бы n-ное количество case, соответствующих n-ному количеству параметров (указателей на функции)?

Вызов такой функции по принципу stdarg
menu(4, dosmth1, dosmth2, dosmth3, dosmth0);


Ответ

Если сигнатуры вызываемых функций одинаковы, то самый простой способ - использовать контейнер типа std::map, std::unordered_map. Ключом будет выступать char или int, а в качестве типа значения использоваться указатель на функцию. Например:
std::map action;
Когда контейнер заполнен использование может быть сокращено до вида:
action[_getch()]();
Понятно, что в общем случае могут потребоваться дополнительные проверки на существование элемента, т.к. по умолчанию оператор [] приводит к созданию элемента, если его не было.

XmlDocument и два корневых элемента

На входе есть строка, в которой находятся xml данные, по сути два корневых элемента которые записаны один после другого. При попытке загрузить эту строку в XmlDocument.LoadXml выдается ошибка -
Существует несколько корневых элементов
Изменить входную строку я не могу, и для работы мне нужен второй корневой элемент. Единственный выход который вижу - обрезать строку, но возможно есть более красивое решение?


Ответ

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

Как перекрасить адресную строку браузера


Господа, подскажите, как можно перекрасить адресную строку браузера? Сколько не рылся в коде, ничего подходящего не нашел.


Ответ

здесь есть описание для разработчиков: https://developers.google.com/web/updates/2014/11/Support-for-theme-color-in-Chrome-39-for-Android
пример кода:

Как убрать активный класс с элемента при клике, если он уже имеет этот класс?

Не получается найти ошибку, почему класс не убирается при клике на элемент который уже имеет этот класс html:

panel 1

1 Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch..

panel 2

2 Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch.


js:
function ready() { var panels = document.getElementsByClassName("panel"); var i; for (i = 0; panels.length > i; i++) { panels[i].onclick = function() { for (i = 0; panels.length > i; i++) { panels[i].classList.remove("active"); } if (this.classList.contains("active")) { this.classList.remove("active") } else { this.classList.add("active") } }; } }
document.addEventListener("DOMContentLoaded", ready);


Ответ

Можно обойтись и без циклов внутри обработчика.
Функция getElementsByClassName возвращает живую коллекцию. Таким образом получив один раз коллекцию для класса active
var actives = document.getElementsByClassName('active');
В ней всегда будут актуальные данные. И так как подразумевается только один активный элемент он будет доступен по индексу 0.
Теперь в обработчике достаточно проверить, что был предыдущий активный элемент и убрать с него класс active
var currentActive = actives[0]; if (currentActive) currentActive.classList.remove("active");
И если щелкнули не по активному элементу - нужно добавить этому элементу класс active
if (currentActive !== this) this.classList.add("active");
Пример в сборе:
var panels = document.getElementsByClassName("panel"); var actives = document.getElementsByClassName('active'); for (i = 0; panels.length > i; i++) { panels[i].onclick = function() { var currentActive = actives[0]; if (currentActive) currentActive.classList.remove("active"); if (currentActive !== this) this.classList.add("active"); }; } .active { border: solid 2px green; }

panel 1

1 Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch..

panel 2

2 Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch.


Локальные переменные для условных операторов

Требуется задать переменную, ограниченную областью видимости условного оператора if или switch. Как это можно сделать?


Ответ

В c++17 появилась возможность задавать объявление переменной прямо в условном операторе if или switch. Например:
if (int i = 42; cond) { ... }

switch (SomeType t; var) { ... }
Ключевой момент здесь в том, что ветвление выполняется по cond или var, а не по i или t
До c++17 для этих целей приходилось вводить новый блок через { } и выглядело это не очень красиво:
{ int i = 42; if (cond) { ... } }
Новый синтаксис имитирует именно такой подход.

сосчитать время указанное в атрибуте html

Есть такая структура html:
const timeNodes = Array.from(document.querySelectorAll('[data-time]')); Videos

  • Video 1
  • Video 2
  • Video 3
  • Video 4

помогите посчитать или подскажите как узнать продолжительность всех видео. Их длительность указана в аттрибуте data-time=""


Ответ

Пара функций, первая считает число секунд, вторая форматирует секунды.
// Суммируем результаты обработки отдельных строк с помощью reduce const secs = list => list.reduce((sum, str) => { // разбиваем строку по двоеточиям, относимся к результату, как к числу в 60-ричной системе let parts = str.split(':'); // Складываем 60-ричные разряды let q = 1; while (parts.length) { sum += q * parts.pop(); q *= 60; } return sum; }, 0); // Обратная операция, перевод числа секунд в 60-ричный вид. const fmt = secs => { let parts = []; // позиции while (secs > 0) { parts.unshift(secs % 60); // вдвигаем позицию слева secs = secs/60 |0; // целочисленное деление } return parts.map(d => d<10?'0'+d:''+d) // Добавляем ведущие нули .join(':'); } let list = ['1:00:00', '12:55', '00:07']; let sum = secs(list); let time = fmt(sum); console.info(sum, time)

Jquery: как переделать скрипт?

Есть скрипт, который вызывается при клике по блоку и любым его дочерним элементам:
$('.entry__item').click(function() { if(this.classList.contains('js--entry-selected')) { this.classList.remove('js--entry-selected'); } else { this.classList.add('js--entry-selected'); } }); .entry__item{width:158px;padding:20px 13px 21px;margin-bottom:5px;margin-left:5px;display:inline-block;text-align:center;background:0 0;border:2px solid #a8a8a8} .entry__name{margin-bottom:5px;font-size:17px;font-weight:700;word-wrap:break-word} .entry__country{position:relative;display:block;margin-bottom:30px;font-size:14px;font-weight:300} .entry__country::after{content:"";position:absolute;bottom:-13px;left:50%;width:96px;height:1px;margin-left:-48px;display:block;background:#a8a8a8} .entry__btn, .entry__btn:focus{display:inline-block;padding:11px 20px;margin-bottom:12px;font-size:12px;font-weight:700;text-align:center;text-transform:uppercase;background:#a8a8a8;color:#fff;border-bottom:4px solid #757575;border-radius:3px; text-decoration: none;} .entry__btn:hover{background:#cc0001;border-color:#B40001; text-decoration: none; color: #fff;} .entry__btn:active{background:#B40001;border-color:#B40001; text-decoration: none; color: #fff;} .entry__info{font-size:16px;font-weight:300;color:#000;border-bottom:1px solid #000;} .js--entry-selected{background:#cc0001;color:#fff!important;border-color:#fff} .js--entry-selected .entry__country::after{background:#fff} .js--entry-selected .entry__info{color:#fff;border-color:#fff}

НАЗВАНИЕ КОМПАНИИ Страна

А нужно, чтобы он срабатывал только по клику на button
Казалось бы, всё просто - вешаю клик не на .entry__item, а на .entry__btn и вместо this пишу $('.entry__item'). Но почему-то так не работает. Подскажите, как переписать правильно?


Ответ

A зачем вы мешаете jquery и javascript? Чтото одно уже б использовали.
$('.entry__btn').click(function() { let parent = $(this).closest('.entry__item'); parent.toggleClass('js--entry-selected'); }); .entry__item { width: 158px; padding: 20px 13px 21px; margin-bottom: 5px; margin-left: 5px; display: inline-block; text-align: center; background: 0 0; border: 2px solid #a8a8a8 } .entry__name { margin-bottom: 5px; font-size: 17px; font-weight: 700; word-wrap: break-word } .entry__country { position: relative; display: block; margin-bottom: 30px; font-size: 14px; font-weight: 300 } .entry__country::after { content: ""; position: absolute; bottom: -13px; left: 50%; width: 96px; height: 1px; margin-left: -48px; display: block; background: #a8a8a8 } .entry__btn, .entry__btn:focus { display: inline-block; padding: 11px 20px; margin-bottom: 12px; font-size: 12px; font-weight: 700; text-align: center; text-transform: uppercase; background: #a8a8a8; color: #fff; border-bottom: 4px solid #757575; border-radius: 3px; text-decoration: none; } .entry__btn:hover { background: #cc0001; border-color: #B40001; text-decoration: none; color: #fff; } .entry__btn:active { background: #B40001; border-color: #B40001; text-decoration: none; color: #fff; } .entry__info { font-size: 16px; font-weight: 300; color: #000; border-bottom: 1px solid #000; } .js--entry-selected { background: #cc0001; color: #fff!important; border-color: #fff } .js--entry-selected .entry__country::after { background: #fff } .js--entry-selected .entry__info { color: #fff; border-color: #fff }

НАЗВАНИЕ КОМПАНИИ Страна

onclick и innerHTML

Подскажите, пожалуйста, почему событие onclick в коде ниже не выполняется. Если убрать последнюю строку с innerHTML, всё работает:
var div = document.createElement('div'); div.innerHTML = "Default message"; div.onclick = function(){this.innerHTML = 'Onclick message'} document.body.appendChild(div); document.body.innerHTML += 'Next line';


Ответ

Любое изменение свойства innerHTML приводит к полной замене всех элементов.
Таким образом, после выполнения
document.body.innerHTML += 'Next line';
элемент div, которому был добавлен обработчик, был удален, и вместо него теперь новый div, которому обработчик не добавляли.
Для решения можно или собрать всю строку сразу, и лишь затем навесить обработчики
var div = `

Default message
`; document.body.innerHTML += div; document.body.innerHTML += 'Next line'; document.getElementById('div').onclick = function() { this.innerHTML = 'Onclick message' }
или не использовать innerHTML, а создавать элементы напрямую:
var div = document.createElement('div'); div.innerHTML = "Default message"; div.onclick = function() { this.innerHTML = 'Onclick message' } document.body.appendChild(div); var textNode = document.createTextNode('Next line'); document.body.appendChild(textNode);
Альтернативным способом добавления разметки, как подсказывают в комментариях, может стать использование метода insertAdjacentHTML
var div = document.createElement('div'); div.innerHTML = "Default message"; div.onclick = function() { this.innerHTML = 'Onclick message' } document.body.appendChild(div); div.insertAdjacentHTML('afterEnd', 'Next line');

Что значит данная запись в CSS?

Что значит данная запись в CSS?
div[class^=col]
И насколько это кроссбраузерно?


Ответ

Это означает div с классом, начинающимся с указанного текста col. .col1, .column, .col-12 попадают под селектор.
Это довольно старая инструкция, у нее отличная кроссбраузерность

UI потоки в java

Что такое UI потоки в Java? В чем их отличие от обычных потоков Thread?


Ответ

UI поток - обычный поток, но в нем и только в нем следует обновлять состояние вашего GUI или его элементов. Как правило представляет собой поток извлекающий из очереди задачи для обновления или перерисовки интерфейса. Если вам надо обновить ваш GUI не из UI потока, то как в Swing так и в JavaFX есть методы, которые добавляют задачи по добавлению GUI в эту очередь. Сделано так для того, что бы не занимать синхронизацией обращений к элементам интерфейса и не допустить параллельного выполнения операций над ним.

Объявление глобальной переменной внутри функции

Возможно ли объявить глобальную переменную в функции? Если да, то как?


Ответ

Объявить глобальную переменную в функции, то есть переменную с внешним или внутренним связыванием, можно. А, вот, определить такую переменную нельзя, так как глобальная переменная - это переменная определенная вне функции.
Например,
#include
int x;
void f( int i ) { extern int x; x = i; }
int main(void) { printf( "x = %d
", x ); f( 10 ); printf( "x = %d
", x );
return 0; }
Вывод программы на консоль
x = 0 x = 10
В этой программе в функции f объявляется глобальная переменная x
extern int x;

Двойная итерация в одном цикле

Как сделать так, чтобы одновременно в одном цикле шли две итерации (например i и j)?


Ответ

Так сойдет? :)
for(int i = 5, j = 10; i < 20 && j >= 0; i++, j--) { }

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

Сравниваю так:
String s = "-123"; Boolean y = false; if ("-".equals(s.charAt(0))){ y = true; }
Результат: y=false
Почему?


Ответ

Потому что Вы сравниваете разные типы.
Метод charAt(...) возвращает значение типа char, которое автоупаковывается в объектный Character и Вы этот объект сравниваете со объектом типа String, в результате несовпадения типов Вы и получаете такой результат.
Посмотрите исходный код метода String.equals(...)
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
Первое условие ложно, второе – тоже ложно, в результате метод возвращает false
Добиться желаемого поведения, можно, например, так:
if ("-".equals(String.valueOf(s.charAt(0)))){ y = true; }
UPD
Мне нужно узнать, есть ли в строке определенный символ?
String s = "123"; char c = '2'; boolean contains = s.contains(String.valueOf(c));
или так:
String s = "123"; String c = "2"; boolean contains = s.contains(c);

Синтаксис вызова findViewById()

В книгах по основам Java было написано, что для вызова метода нужно указать сначала ссылку на объект, а потом после точки сам метод. Если же метод статический то указывается класс, а потом после точки метод. А в книге по Android читаю TextView brands = (TextView) findViewById(R.id.brands);. Почему не указывается ни класс ни объект? Это из-за того, что объявление метода находится в том же классе что и вызов? Или же это просто упрощение, а AndroidStudio в дальнейшем при сборке сама добавляет всё что нужно?


Ответ

метод findViewById() - метод класса Activity (и ее наследников), поэтому при вызове данного метода в классе активити указывать экземпляр класса нет необходимости, это ее собственный метод. Если вы непременно хотите поставить точку и обатиться к объекту, то можете вызывать этот метод у текущего экземпляра класса:
Button btn = this.findViewById(R.id.button);
Если найти элемент на разметке нужно не в пределах активити, а в фрагменте, диалоге (эти классы не содержат собственного метода findViewById()) или другом ViewGroup, то для поиска необходимо использовать тот экземпляр ViewGroup, в котором предположительно находится данный элемент, например в фрагменте:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment1, container, false); Button btn = rootView.findViewById(R.id.button); return rootView; }
в этих случаях используется метод findViewById() класса View, а не Activity и указывать экземпляр класса, в котором осуществлять поиск обязательно, так как поиск осуществляется за пределами экземпляра класса View

Какой Linux дистрибутив лучше выбрать для “smart” техники? [закрыт]

Здравствуйте, скажите пожалуйста, какой лучше дистрибутив выбрать для портативной техники, в которой всё работает в фоне без GUI, с чистой заточкой под требуемые операции, без всякого ненужного барохла, которое будет грузить систему при загрузке и в процессе работы.
Кто уже запутался, на каких linux'ах работает Smart бытовуха : холодильники, роботы-пылесосы, роутеры, кофеварки, чайники и т.д.?

По любому кто-то должен спросить, "а что у вас будет работать и на каком мини-компьютере", отвечаю :
Будет работать java программа, которая будет использовать wifi модуль, соответственно будет активно работать с интернетом (tcp server/client) и локальной сетью (ну локальная сеть нужна, только для web интерфейса, чтобы удалённо можно запускать и выключать), желательно ещё хотелось чтобы можно сделать вывод звука. И самое главное, мини-компьютером будет служить Raspberry Pi 3 Model B


Ответ

На разных бытовых приборах работает своя ОС. Даже не так: на приборах редко работают ОС. Обычно, простые контроллеры. Какой на каждом устройстве — нужно смотреть отдельно. Там же Вам напишут как взаимодействовать с сетью (если можно) через этот контроллер.
На Raspberry Pi лучше всего ставить Raspbian, так как эта система "родная", соответственно Вы получите минимум проблем совместимости. Linux система сама по себе умеет очень много (работа с сетью, любой Web интерфейс и и.д.), да и имеет полную JDK.

Как с помощью jquery обрезать строку после определенного количества символов и добавить троеточие?

Есть следующая конструкция:


Необходимо у всех элементов на странице с классом "abc" после 50 символа обрезать строку и поставить троеточие.
Подскажите пожалуйста, как это реализовать с помощью скрипта?


Ответ

Используйте .substring() или .substr()
UPDATE:
$(".abc").text(function(i, text) { if (text.length >= 50) { text = text.substring(0, 50); var lastIndex = text.lastIndexOf(" "); // позиция последнего пробела text = text.substring(0, lastIndex) + '...'; // обрезаем до последнего слова } $(this).text(text); });

Текст неопределённой длинны, например: Она была хороша во всём. А без всего - просто божественна.
Lorem Ipsum - это текст, часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной рыбой для текстов на латинице с начала XVI века.
Тут меньше чем 50 сиволов

О функции .text()

Диапазонное регулярное выражение

Что то голову сломал. Нужно вырезать все числа в диапазонах от 45...250 и 450...2500 из строки. Помогите с регулярным выражением. В строке помимо цифр еще может быть и текст.


Ответ

Ничего лишнего:
$string = '45 Нужно вырезать все числа от 45...250 и 450...2500 из строки, и оставить числа вида 2100100 45'; //Нужно вырезать все числа от ... и ... из строки, и оставить числа вида 2100100
echo preg_replace_callback('~(?<=\D|\b)\d{2,4}(?=\D|\b)~', function ($a) { $a = $a[0]; return ($a >= 45 && $a <= 250) || ($a >= 450 && $a <= 2500) ? false : $a; }, $string);

Почему я не могу изменить стили элемента по их классу?

Подскажите, пожалуйста, почему по id могу изменять свойства элемента, а по классу - нет?
function show(){ document.getElementById('idsquare').style.display = "none"; document.getElementsByClassName('square').style.display = "none"; } .square, #idsquare{ width: 100px; height:100px; } .square{ background-color: #FF6699 } #idsquare { background-color: #FF0099 } Нажми меня!



Ответ

Это потому, что ID может быть только один у элемента и в единственном экземпляре на всей странице , а классов одинаковым множество, или надо прописать индекс класса, как я сделал или прокручивать все классы в цикле
function show(){ document.getElementById('idsquare').style.display = "none"; document.getElementsByClassName('square')[0].style.display = "none"; } .square, #idsquare{ width: 100px; height:100px; } .square{ background-color: #FF6699 } #idsquare { background-color: #FF0099 } Нажми меня!


Есть ли разница между объявлением переменной в цикле и за пределами цикла?

Есть ли разница, в объявлении переменной за пределами цикла:
int val = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { val++; } }
И в цикле:
for (int i = 0; i < 10; i++) { int val = 0; for (int j = 0; j < 10; j++) { val++; } }
Значение переменной val на выходе будет разным - это понятно. Но вопрос в том, влияет ли это на производительность. Обрабатывает ли это компилятор.
Я прогонял тесты с большим количеством итераций, по времени разницы не было. Но по логике вроде как должна была быть. Компилятор оптимизировал код?


Ответ

Компилятор имеет полное право, код
for (int i = 0; i < 10; i++) { int val = 0; for (int j = 0; j < 10; j++) { val++; } }
превратить в
int val; for (int i = 0; i < 10; i++) { val = 0; for (int j = 0; j < 10; j++) { val++; } }
и насколько я знаю он так и делает, в результате получается одно лишнее присвоение, что мало сказывается на производительности.
P.S. Вообще можно декомпилировать сгенеренный код и посмотреть, благо в какой-нибудь Идеа это делается легко и просто.

Обрезать строку JS

Здравствуйте. Есть Список. Если в пункте списка больше определенного количества символов – то эти символы должны обрезаться и вставляться три точки в конце. Сейчас, если хоть в одном пункте, символов больше чем нужно то строка обрезается во всех пунктах и копируется во все пункты. А так, не должно быть. Подскажите как сделать чтоб строка обрезалась только в том пункте, где количество символов превышает допустимое Свойство СSS text-overflow:ellipsis не подходит так как не работает если строки две.
function cutStr() { var size = 15, cutStr = $('li a'), strText = cutStr.text(); if (strText.length > size) { cutStr.text(strText.slice(0, size) + ' ...'); } } cutStr();



Ответ

function cutStr() { var size = 15, cutStr = $('li a'); cutStr.each(function() { // перебираем все элементы var strText = $(this).text(); if (strText.length > size) { $(this).text(strText.slice(0, size) + ' ...'); // подставляем полученный текст только в текущий элемент } }); } cutStr();


SQL запрос с NULL в WHERE

Всем привет. Есть таблица categories, в ней есть родительские категории, т.е. те, в которых parent_id = NULL. Почему следующий запрос возвращает 0 строк?
SELECT * FROM categories WHERE parent_id = NULL


Ответ

NULL - это "специальное" значение, которое по смыслу схоже с "неопределённое значение".
NULL != NULL
т.к. одно "неопределенное значение" не обязательно равно другому "неопределенному значению", поэтому в стандарте SQL существуют конструкции IS NULL, IS NOT NULL, COALESCE(...) и подобные им.
Надо использовать IS NULL / IS NOT NULL
SELECT * FROM categories WHERE parent_id IS NULL
UPDATE: "доходчивое" определение значения NULL от @Akina
Я обычно предлагаю использовать другой эквивалент: фиг знает. Тогда объяснение хотя бы становится логичным: "Равно ли первое фиг знает второму фиг знает?" или "Равно ли значение Х значению фиг знает?" (тут вместо Х подставляется число, строка, дата или переменная). Правильный ответ очевиден: а фиг знает.

Остановка работы потока по нажатию кнопки

Я создал приложение для перепрошивки устройства по интерфейсу UART
Хочу добавить необязательное, но желаемое взаимодействие с программой: Остановка работы потока по нажатию на кнопку "Остановить выполнение". Программа работает следующим образом:
private void Execute_Commands_Button_Click(object sender, EventArgs e) // Нажатие на кнопку "Выполнить команды" { // Очистить данные Clear_Data(); // Если нет ошибок в полях if (Check_All_Fields()) { // Если есть соединение с портом if (Check_Port()) { // Если параметры работы с портом установлены успешно if (Set_Port_Settings()) { // Обновить данные Hex- файла Refresh_Hex_File_Data(); // Если устройство не синхронизировано if (!Is_Synchronised) { // Поток для синхронизации Thread Sync_Thread; // Поток для синхронизации Sync_Thread = new Thread(delegate() { // Выключить элементы управления Set_Enable(false); // Попытаться синхронизировать Try_To_Synchronise_Device(Convert.ToInt32( This_Common.Read_From_Registry(This_Common.Key_Sync_Attempts))); // Включить элементы управления Set_Enable(true); }); // Записываем поток как текущий Active_Thread = Sync_Thread; // Запуск потока Sync_Thread.Start(); // Ожидание завершения работы потока Sync_Thread.Join(); } // Если устройство синхронизировано if (Is_Synchronised) { // Обновить список команд Refresh_Commands(); // Попытаться послать команды на порт Try_To_Send_Commands(); } // Если устройство не синхронизировано else { // Вывести ошибку This_Common.Show_Error_Message("Не удалось синхронизироваться с устройством!"); } // Закрыть порт Selected_Port.Close(); } } } }
В функции void Set_Enable(bool) Все элементы управления становятся неактивными и включается только кнопка "Остановить выполнение". при нажатии на эту кнопку активный поток закрывается: Active_Thread.Abort()
Проблема заключается в следующем: после ожидания выполнения группы методов в отдельном потоке я теряю возможность обрабатывать нажатия на кнопку "Остановить выполнение". Как это можно исправить?
Вариант с Task не сработал. Код следующий:
// Обработчик запроса отмены задачи CancellationTokenSource Source = new CancellationTokenSource(); // Переменная отключения выполнения задачи CancellationToken Cancel_Token; // Задача "Синхронизировать" Task Sync_Task; // Задать задачу Sync_Task = new Task(delegate() { // Попытаться синхронизироваться Try_To_Synchronise_Device(Convert.ToInt32(This_Common.Read_From_Registry(This_Common.Key_Sync_Attempts))); }, Cancel_Token); // Запуск задачи Sync_Task.Start(); // Ожидаем выполнение задачи Source.Wait();
При клике на кнопку "Остановить выполнение": Source.Cancel();


Ответ

Я тоже наклепал пример попроще.

public partial class Form1 : Form { public Form1() { InitializeComponent(); }
//источник токена отмены CancellationTokenSource _tokenSource;
//Запуск private async void _buttonStart_Click(object sender, EventArgs e) { //через него будем оповещать о ходе выполнения задачи Progress progess = new Progress(text => this._labelOutput.Text = text);
//готовим токен отмены _tokenSource = new CancellationTokenSource(); CancellationToken cancelToken = _tokenSource.Token;
//запускаем долгую задачу try { this._labelOutput.Text = "Начинаем..."; //обратите внимание на передачу токена отмены, и экземпл. прогресса this._labelOutput.Text = await Task.Run(() => DoSomething(cancelToken, progess), cancelToken); } catch (OperationCanceledException) { this._labelOutput.Text = "Задача отменена."; } catch (Exception ex) { this._labelOutput.Text = $"В задаче произошла ошибка: {ex.Message}"; } }
//Отмена private void _buttonCancel_Click(object sender, EventArgs e) { _tokenSource.Cancel(); }
//Эта самая долгая задача, обратите внимание на тип параметра progess он IProgress private string DoSomething(CancellationToken cancelToken, IProgress progess) { for (int i = 0; i < 6; i++) { //сообщаем о прогрессе progess.Report($"Этап: {i}");
//задержка между этапами 1 сек. cancelToken.WaitHandle.WaitOne(TimeSpan.FromSeconds(1));
//здесь будет выброшено исключение в случае нажатия на кнопку отмены cancelToken.ThrowIfCancellationRequested(); }
return "Готово!"; } }

Handler handler = new Handler() Ошибка: Handler is abstract; cannot be instantiated. Почему Android Studio импортирует не тот класс при автоимпорте?

Воздействуя Alt+Enter на слово Handler Андроид-Студио вставило автоматом строку:
import java.util.logging.Handler;


Ответ

Оказывается вместо строки:
import java.util.logging.Handler;
нужно вставлять:
import android.os.Handler;
Т.е. среда разработки импортирует не тот Handler. )
Поэтому и не работает, например: handler.postDelayed( ... ) и т.д.
По Alt+Enter вставился импорт: import java.util.logging.Handler автоматом, без предоставления выбора!

Создание ascii-art при помощи рекурсии

Необходимо написать рекурсивную функцию, которая выводит на экран ASCII-art трапецию следующего вида, в зависимости от числа n. Пример приведен для n = 4
Теперь суть вопроса: по какой логике должна работать подобная рекурсивная функция? У меня была мысль печатать определенно кол-во пробелов и звездочек, и передавать измененный аргумент дальше по рекурсии, но что должно являться условием выхода из рекурсии, и какое кол-во пробелов ставить я не знаю.
* * * * * * * * * * * * * * * * * * * *


Ответ

def draw(n, indent=0): if n == 0: return draw(n-1, indent+1) print("{}{}".format(' ' * 2 * indent, ' '.join('*' * 2 * n)))

c# Как обнаружить вторжение в память своей программы

Существуют различные программы по захвату текста с форм (например в ЯП Autoit, есть функция ControlGetText, которая считываем с контролера текст), есть программы, которые вообще позволяют влезать в память процесса, такие как Cheat Engine (например).
Собственно вопрос. Есть ли способ обнаружения "вторжения" в память своей программы? Как это можно реализовать? В какую сторону копать?


Ответ

Нашел интересный ответ
Ничего не мешает злоумышленнику заморозить ваш процесс, сделать все необходимые действия и убить процесс => процесс не узнает ничего о том, что кто-то его читал. Можно так сделать дамп памяти и опять же процесс не будет знать, что кто-то читал его память.
Существуют дебаггеры, которые позволяют перелопатить ваш процесс по косточкам.
Как вы указали в своем вопросе, то самые банальный пример- это взлом компьютерных игр. Если бы разработчики имели универсальное решение, то все бы читеры давно вымерли, а они все плодятся и плодятся => нельзя защитить память своего приложение. Разработчики вынуждены использовать анти-читы и ловить подозрительные активности игроков.
Закрытость платформы, где юзер имеет ограниченные возможности, может обеспечить защиту от взлома процесса. Например, игровые консоли.
Еще один выход- это хранить важную информацию на сервере, куда злоумышленник имеет меньшую вероятность попасть и время от времени выполнять верификацию клиента. Так, обычно, делается в ММОРПГ.
Подводя итог: Вы больше всего зависите от среды в которой работает ваше приложение. Если она имеет API для обнаружения, то используйте его, в противном случае у вас нету никаких возможностей, так как памятью рулит ОС, а не вы.
Например, у Windows есть DEP, который мониторит память и предотвращает запуск вредоносного кода из стороннего процесса.

Какой смысл инструкции base.OnFormClosing() в одноименном методе?

В коде события, в одном из примеров, увидел следующее:
protected override void OnFormClosing(FormClosingEventArgs e) { //Написан код, который сохраняет пользовательские данные //
base.OnFormClosing(e); //Интересна именно эта строчка }
Какой смысл несет последняя строка? Для чего она нужна и когда используется?


Ответ

Смотрите, в чём смысл виртуальных методов вообще? Он в том, что вы полностью подменяете метод родительского класса на свой. И теперь ответственность за то, чтобы сделать всё правильно, лежит на вас.
Но чаще всего это слишком большая ответственность: вы не знаете/не помните всех вещей, которые должен сделать метод. Или просто не хотите дублировать код родительского метода.
В этом случае вы просто вызываете родительский метод через base, он делает всё, что требуется от данного кода, а вы добавляете свой код до, после или вокруг вызова base-метода. Таким образом вы можете гарантировать, что вы ничего не забыли сделать при подмене метода.

Падающие символы

Требуется написать программу которая будет выводит цепочку падающих символов. Первый снизу символ должен быть белый, второй зеленый, остальные темно-зеленые. Проблема в том, что цепочку падающих символов вывел, а как смещать цепочку символов вниз так и не понял. Если я правильно понял то, надо установить курсор в начало строки и потом уже как-то смещать её вниз.
using System; namespace Task1 { class Program { static void Main(string[] args) { Random rand = new Random(); int lenghtStr = rand.Next(1, 11); char[] column = new char[lenghtStr]; for (int i = 0; i < lenghtStr; i++) { column[i] = (char)rand.Next('A', 'Z'); } for (int i = 0; i < lenghtStr; i++) { if (i == (lenghtStr - 1)) { Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(column[i]); } else if (i == (lenghtStr - 2)) { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine(column[i]); } else { Console.ForegroundColor = ConsoleColor.DarkGreen; Console.WriteLine(column[i]); } } Console.SetCursorPosition(0, 0); Console.ReadKey(); } } }


Ответ


Создадим такой класс Символа
class Sign { //генератор будем использовать в этом классе и снаружи public static Random RandomGen = new Random();
///

/// Получение случайного знака /// /// private char GetSign() { int t = RandomGen.Next(10); if (t <= 2) return (char)('0' + RandomGen.Next(10)); else if (t <= 4) return (char)('a' + RandomGen.Next(27)); else if (t <= 6) return (char)('A' + RandomGen.Next(27)); else return (char)(RandomGen.Next(32, 255)); }
/// /// Отображение случайного символа белого цвета /// /// позиция слева /// позиция от верха public void ShowWhiteSign(int left, int top) { Console.ForegroundColor = ConsoleColor.White; Console.SetCursorPosition(left, top); Console.Write(GetSign()); }
/// /// Отображение случайного символа зеленого цвета /// /// позиция слева /// позиция от верха public void ShowGreenSign(int left, int top) { Console.ForegroundColor = ConsoleColor.Green; Console.SetCursorPosition(left, top); Console.Write(GetSign());
Console.ForegroundColor = ConsoleColor.White; }
/// /// Отображение случайного символа темного зеленого цвета /// /// позиция слева /// позиция от верха public void ShowDarkGreenSign(int left, int top) { Console.ForegroundColor = ConsoleColor.DarkGreen; Console.SetCursorPosition(left, top); Console.Write(GetSign());
Console.ForegroundColor = ConsoleColor.White; }
/// /// Отображение пробела в нужном месте /// /// позиция слева /// позиция от верха public void ShowSpaceSign(int left, int top) { Console.SetCursorPosition(left, top); Console.Write(' '); } }
Класс Отображателя такой
class SignsShower { private int _heightWindow; private int _widthWindow; private int[] _widthPosSimple; private int[] _widthPosAddition;
private readonly Sign _sign = new Sign();
//ctor public SignsShower() : this((Console.WindowWidth - 1), Console.WindowHeight) { } /// /// Отображатель символов /// /// ширина консольного окна минус 1 /// высота консольного окна public SignsShower(int windowWidth, int windowHeight) { Initialization(windowWidth, windowHeight); }
private void Initialization(int windowWidth, int windowHeight) { //получаем высоту окна _heightWindow = windowHeight;
int h1 = _heightWindow / 2; //половина высоты int h2 = _heightWindow / 4; //четверть высоты
//ширина окна _widthWindow = windowWidth;
//два массива размером в ширину окна _widthPosSimple = new int[_widthWindow]; _widthPosAddition = new int[_widthWindow];
//заполнение массивов случайными числами for (int i = 0; i < _widthWindow; i++) { _widthPosSimple[i] = Sign.RandomGen.Next(_heightWindow);
int k = (i % 11 != 10) ? 2 : 1; int min = h2 * k; int max = h1 * k; _widthPosAddition[i] = Sign.RandomGen.Next(min, max); } }
/// /// Отображение символов в случайных позициях с необх.цветом /// public void SignShow() { for (int i = 0; i < _widthWindow; i++) { if (_widthPosSimple[i] < 10) { //отображение темного символа _sign.ShowDarkGreenSign(i, _widthPosSimple[i]); } else if (_widthPosSimple[i] < 25) { //отображение зеленого символа _sign.ShowGreenSign(i, _widthPosSimple[i]); } else { //отображаем белый символ _sign.ShowWhiteSign(i, _widthPosSimple[i]); }
//сдвигаем координату по высоте для отображения в след. цикле вызова SignShow() _widthPosSimple[i] = CheckNextHeightPosition(_widthPosSimple[i] + 1, _heightWindow);
//пробельный символ int next = _widthPosSimple[i] - _widthPosAddition[i]; int nextPos = CheckNextHeightPosition(next, _heightWindow); _sign.ShowSpaceSign(i, nextPos); } }
/// /// Проверка значения след.позиции /// /// значение след.положения по высоте /// общая допустимая высота /// private int CheckNextHeightPosition(int next, int height) { next = next % height;
if (next < 0) { return next + height; } else { return next; }
} }
Теперь включим в работу эти классы так
static void Main(string[] args) { //отображатель SignsShower signsShower = new SignsShower();
//готовим консоль Console.Clear(); Console.CursorVisible = false;
//в бесконечном цикле с вычисляемой задержкой отображаем int ms = 0; while (true) { //засекаем время DateTime timeMark = DateTime.Now; //отображаем символы signsShower.SignShow();
//задержка ms = 10 - (int)((TimeSpan)(DateTime.Now - timeMark)).TotalMilliseconds; if (ms > 0) System.Threading.Thread.Sleep(ms); }
}
Не знаю, правильно ли я вас понял, но по крайней мере у вас теперь есть от чего плясать.

Почему не работает встроенный JavaScript? [закрыт]

Почему не работает этот код:


Ответ

img

Изменение css стиля элемента при наведении на другой элемент с помощью JS

Здравствуйте! Никак не получается решить проблему, знания JS очень скудные. Нужно заставить квадраты двигаться при наведении на текст над ним. Как заставить этот скрипт работать для всех элементов с одинаковым классом? Я пробовал через querySelectorAll, но максимум чего удалось добиться - это одновременное движение всех квадратов вниз, без обратного движения. Нужно, чтобы каждый работал по отдельности. CSS не подойдёт, в оригинале блоки расположены далеко друг от друга. Помогите пожалуйста, я уже всю голову себе сломал :(
var dms = document.querySelector('.dm-short-news'); var dmi = document.querySelector('.dm-intro-news'); dms.onmouseover = function(e) { dmi.style.transform = 'translateY(50px)'; }; dms.onmouseout = function(e) { dmi.style.transform = ''; }; .dm-intro-news { width: 200px; height: 200px; background: #333333; transition: 0.5s; } .wr {display: inline-block}

Текст
Текст
Текст


Ответ

Получилось решить проблему собственными силами.
NodeList.prototype.forEach = Array.prototype.forEach; var dmns = document.querySelectorAll('.wr'); dmns.forEach(function(dmn) { dmn.querySelector('.dm-short-news').addEventListener('mouseenter', function() { dmn.querySelector('.dm-intro-news').style['transform'] = 'translateY(50px)'; }) dmn.querySelector('.dm-short-news').addEventListener('mouseout', function() { dmn.querySelector('.dm-intro-news').style['transform'] = 'translateY(0px)'; }) }); .dm-intro-news { width: 200px; height: 200px; background: #333333; transition: 0.5s; } .wr { display: inline-block }

Текст
Текст
Текст

Как перехватить исключение

Почему данный код не ловит исключение?
#include
class A { private:
public: A() { std::cout << "A::A()" << std::endl; } ~A() { throw 1; std::cout << "A::~A(int)" << std::endl; } };
int main() { A* p = nullptr;
try { p = new A(); delete p; } catch(...) { std::cout << "catch(...)" << std::endl; }
return 0; }


Ответ

Выбрасывать исключение из деструктора не рекомендуется и на это есть ряд причин.
это может привести к утечкам памяти, невозможно обеспечить какие-либо гарантии безопасности, исключение из деструктора может вылететь во время раскрутки стека, что приведет к разным последствия в зависимости от объекта.
Посмотрим на Ваш код.
delete p;
Как известно, сначала delete-expression вызывает деструктор и затем освобождает память. Если деструктор выбрасывает исключение, то до освобождения памяти дело уже не дойдет и это приведет к утечке.
При реализации, например, контейнеров, невозможно обеспечить какие-либо гарантии относительно безопасности исключений. Например:
vector.push_back();//Вектор был не пуст
Допустим, произошло выделение памяти. Значит старые элементы копируются в новую область памяти. Если копирование прошло успешно, а при уничтожении старых объектов вылетело исключение, то мы получим часть неуничтоженных объектов и утечку памяти. Если же при копировании вылетело исключение и вектор попытается уничтожить уже сконструированные объекты, а при их уничтожении вылетит исключение, то получим ту же утечку, плюс дальше "полетит" уже другое исключение.
Если исключение вылетает из деструктора автоматического объекта во время раскрутки стека, то, в соответствии со стандартом, это приводит к вызову std::terminate
15.2 Constructors and destructors The process of calling destructors for automatic objects constructed on the path from a try block to a throw-expression is called “stack unwinding.” [Note: If a destructor called during stack unwinding exits with an exception, terminate is called (15.5.1). So destructors should generally catch exceptions and not let them propagate out of the destructor. —end note]
Это цитата из C++03, но в последующих стандартах поведение не поменялось.
Начиная с C++11 все деструкторы по-умолчанию имеют спецификацию исключений noexcept. При нарушении этой спецификации вызывается std::terminate:
Whenever an exception is thrown and the search for a handler (15.3) encounters the outermost block of a function with an exception-specification that does not allow the exception, then, — if the exception-specification is a dynamic-exception-specification, the function std::unexpected() is called (15.5.2), — otherwise, the function std::terminate() is called (15.5.1).
То есть, начиная с C++11 любое исключение, покинувшее деструктор, приводит к вызову std::terminate и аварийному завершению программы, тем самым, как минимум, обеспечивая единое поведение и возможность предоставления каких-либо гарантий. Деструктору возможно указать другую спецификацию исключений:
~A() noexcept(false) { /*...*/ }
Но при этом, если вылетит исключение, мы получим все проблемы указанные выше.
Итого: исключение, покинувшее деструктор создает много проблем, и не дает никакой пользы, поэтому общая рекомендация - никогда не позволять исключениям покидать деструктор.

Объясните логику работы выражения

Объясните пожалуйста, как работает это выражение !(a & (a - 1)) В плюсах совершенно не понимаю, в Java ! нельзя применять к int
private int isPow2(int a) { return !(a & (a - 1)); }


Ответ

Возьмем два числа A и B. Выражение A & B будет равно 0 только тогда, когда числа А и B не содержать единичных бит на одних и тех же позициях.
Если (a & (a - 1) = 0, то a и a-1 не содержат общих единичных бит.
Давайте возьмем число а и попробуем вычесть одну единицу.
Когда мы отнимаем единицу, смотрим на младший бит. если он равен 1 то мы просто заменяем его на 0. Но если там стоит 0, то мы должны заимствовать из старшего бита. Мы заменяем каждый бит с 0 на 1 до тех пор, пока не найдем бит, равный 1. Затем вы инвертируем найденную единицу в ноль.
То есть чтобы получить ноль при выполнении операции &, нам нужно, чтобы младшие нули в a соответствовали единицам в a - 1, а последний(и единственный) единичный бит в a(если существует) стал бы нулем в a - 1 - только таким образом во всех позициях будут отсутствовать единичные биты.
Это условие выполняется только, если
число является степенью двойки, например
1000 & 0111 = 0 10000 & 01111 = 0 число равно 0
0000 & 1111 = 0
Поэтому (a & (a - 1)) = 0, если а - степень двойки или ноль

Что значит for(int x : vector)

Недавно изучаю c++ по книге Страуструпа , и дошел до векторов, здесь в пример приведён код для прохода по всем элементам вектора
vector v = { 5,7,9,4,6,8 }; for (int x : v) cout << x << endl;
но мне не понятно что делает вот это условие:for(int x : v)


Ответ

Range-based for-loop появился в языке начиная с С++11.
По определению, в данном конкретном случае (для v типа std::vector) запись
for (int x : v) // тело цикла
эквивалентна
auto b = v.begin(); auto e = v.end(); for (; b != e; ++b) { int x = *b; // тело цикла }

В общем случае цикл вида
for ( decl-x : v ) // тело цикла
(где decl-x - это объявление), интерпретируется как
{ auto b = /* начало v */; auto e = /* конец v */; for (; b != e; ++b) { decl-x = *b; // тело цикла } }
А "начало v" и "конец v" определяются в зависимости от типа v
Для массива v это просто v и v + size Для объекта класс-типа v с хотя бы одним из членов с членами begin и end (оба должны присутствовать) это v.begin() и v.end() Для всего остального это begin(v) и end(v), где begin и end ищутся только в ассоциированных с v пространствах имен

Некоторыми следствиями такой спецификации являются:
Конец итерируемого диапазона запоминается до начала цикла, т.е. попытки расширения/сужения/переаллокации диапазона в процессе работы цикла не повлияют на запомненное значение и, в общем случае, ни к чему хорошему не приведут. Невозможно преопределить поведение для встроенных массивов путем перегрузки функций begin и end - эти функции будут просто проигнорированы. По аналогичной причине невозможно "снаружи" преопределить поведение для классов, у которых уже есть свои внутренние begin и end Для типов, с которыми используются внешние begin и end, эти begin и end должны быть объявлены непосредственно в ассоциированных пространствах имен. Объявленные в охватывающих пространствах имен begin и end найдены не будут
namespace N { struct S {}; }
int *begin(N::S &s) { return 0; } int *end(N::S &s) { return 0; }
int main() { N::S s; for (int x : s) // Ошибка - нет `begin` и `end` {} }

Подскажите как сделать такой cursor эффект при клике со звуком

Недавно на просторах интернета нашел один замечательный сайт в дизайн и работу фронт-эндера которого я влюбился.
Мне очень понравился там эффект курсора после полной загрузки страницы.
При клике на любом месте страницы создается звук и wave эффект
Как можно реализовать такое, подскажите пожалуйста? И возможно ли как-то взять данный звук клика с этого сайта. Я облазил их консоль и вкладку sources но не нашел ничего.
function playSound () { document.getElementById('play').play(); }


Ответ

Вот wave эффект можно сдлеать так.
А звук находится в файле sounds.mp3.
$(document.body).on('click', function(e) { var wave = document.createElement('div'); wave.style.top = (e.pageY - 25) + "px"; wave.style.left = (e.pageX - 25) + "px"; wave.className = 'wave'; setTimeout(function() { wave.classList.add("active"); }, 0); wave.addEventListener("transitionend", function() { wave.remove(); }); document.body.appendChild(wave); }); $(document.body).on('mouseout', function(e) { cursor.style.display = 'none'; }); $(document.body).on('mousemove', function(e) { cursor.style.display = 'block'; cursor.style.top = (e.pageY - 10) + "px"; cursor.style.left = (e.pageX - 10) + "px"; }); body { background-color: pink; width: 100vw; height: 100vh; } * { cursor: none; } .wave { background-color: white; opacity: 0.8; border-radius: 50%; width: 50px; height: 50px; transition: all 1s ease; position: absolute; pointer-events: none; } .wave.active { transform: scale(3); opacity: 0; } #cursor { background-color: gray; opacity: 0.8; border-radius: 50%; width: 20px; height: 20px; position: absolute; pointer-events: none; display: none; }


А вообще сайт красивый, но тормозит ужасно.

В чем отличие троеточия от квадратных скобок?

В чем разница между
private void onProgressUpdate(String... item);
и
private void onProgressUpdate(String[] item);


Ответ

Главное отличие в сигнатуре методов. В первом случае сигнатура метода определяет один или более параметров типа String, во втором передается только один параметр типа String[]. Определение vararg также допускает использование массива в качестве аргумента.
В первом случае может быть использовано
onProgressUpdate("item1","item2","item3");
или
onProgressUpdate(new String[]{"item1","item2","item3"});
а во втором случае только последний вариант.

Более подробно об vararg можно почитать здесь

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

Елементарный способ: произвести заполнение массива при инициализации. Но массив статический и уже занимает место в образе. Нужно каким-то образом указать компилятору заполнить область массива конкретным значением. Код static int arr[5]={1} заполняется как {1, 0, 0, 0, 0}, а нужно {1, 1, 1, 1, 1}
__attribute__((fillupper(1))) игнорируется gcc.
Массив неконстантный. Массив с 5 элементами - пример. Нужно заполнить массив в 4096 элементов. Использование возможностей STL сильно ограничены, включая производные. Они все имеют элементарное решение, указанное в первом предложении.
Доработка ответа:
template struct IArray { type val = v; IArray& operator=(type n){ val=n; return *this; } IArray& operator|=(type n){ val|=n; return *this; } };
И необходимо дописать/изменить операторы для нужных Вам преобразований.


Ответ

#include
template struct Int { int val = v; };
int main() { Int<10> arr[1024]; std::cout << arr[10].val << std::endl; }
https://godbolt.org/z/6-BEPi

шаблоны с переменными аргументами

Задача:
Принять в функцию неопределенное количество элементов с разными типами. Засунуть все принятое в stringstream
Вопрос:
Как раскрыть список аргументов и засунуть в stringstream?
Может, нужно использовать другие инструменты для этой задачи? Подскажите пожалуйста какие(просьба, вариант с ostream не предлагать)?
template void tfunc(const Arguments & ... args) { std::stringstream ss; //ss<

Ответ

Это легко делается при помощи fold expression:
template void tfunc(Arguments const & ... args) { std::stringstream ss; (ss << ... << args); }
online compiler

Как получить название функции, которая совершила вызов данной функции?

Пишу лабораторную работу, нужно логирование, и для того чтобы не запутываться, хотелось бы иметь в логах что-то вроде: Error: init_link - not enough memory Сейчас ничего, кроме передачи в логгер строки-названия функции, в голову не приходит. Есть ли более изящный метод? Update: Вот что я имею в виду: int foo(int bar) { int foobar = -1; check_something(foobar/bar); return foobar/bar; } Теперь в check_something должен вызваться логгер, в котором сказано о том, что check_something был вызван из foo


Ответ

Вопрос очень интересный, попробую предложить решение, хотя не уверен, то ли это, что видится автору вопроса. На мой взгляд, хороший логгер должен выводить весь путь вызовов к точке вывода сообщения, наподобие вывода команды where в интерактивном отладчике gdb . В принципе, такую информацию можно извлечь, совместно рассматривая стек выполнения (там адреса возврата) и таблицу символов загрузочного модуля (там есть адреса точек входа в функции и их имена (конечно, если модуль не стрипнут). Для лабораторки это, конечно, крутовато. Можно, наверное, предложить 'ручной' вариант. При входе в функцию, имя которой должно появиться в списке логгера, вызовем My_set_fname(fname), а для печати My_logger(message); fname ДОЛЖНА быть локальной переменной (располагаться в стеке программы). My_set_fname(fname) будет вести свой стек (например, связанный список в куче или достаточно большой статический массив (собственно большой - это если My_set_fname() будут вызываться из рекурсии)). В этот стек надо помещать адрес параметра (fname). Здесь надо иметь в виду, что стек исполнения программы растет от больших адресов к меньшим, поэтому при очередном вызове My_set_fname() будем корректировать (путем удаления) верхнюю часть своего стека, так чтобы в нем содержались только адреса больше, чем адрес нашего аргумента. Эти соображения определяют требование к размещению аргумента. Константы и куча не подходят. Ну, логика My_logger(), по-моему, уже очевидна (или скажем так: формат вывода - дело вкуса).

MAC адрес в PHP для определения уникальных пользователей

Здравствуйте! Возможно ли в php определить mac адрес пользователя, который зашел на мой сайт? Если да, то скиньте, пожалуйста, код. Это все делается для отслеживания уникальных пользователей... если использовать ip, то ничего не получится, ведь он не постоянный... возможно ли другим способом определять уникальных посетителей? Заранее спасибо!


Ответ

Способы идентификации в интернете - тут неплохой текст на эту тему.