Страницы

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

понедельник, 10 февраля 2020 г.

Как с помощью CSS нарисовать бекграунд из 4-х плавно переходящих цветов?

#css



Пример такого изображения. Фон плавно переходит от желтого к голубом, как реализовать
такой же переход?
    


Ответы

Ответ 1



body { background: linear-gradient(to right, #F00, #0F0, #00F, #000); }

Ответ 2



Как то так вроде * { margin: 0; padding: 0; }

Вызов ArrayList из другого метода

#java #android


Добрый вечер!

Подскажите пожалуйста, как обратиться из метода Onclick(...) к ArrayList, который
был создан в методе OnCreate(...)? 

Пока сделал так:

OnCreate(...):

ArrayList Arrayl = new ArrayList<>();
for (int a = 1; a < 8; a++) {
    Arrayl.add(a);
}
Collections.shuffle(Arrayl);// перемешиваем


в Onclick(...):

int actvopros= Arrayl.get(0); //и такое обращение не работает

    


Ответы

Ответ 1



Скорее всего Ваша проблема заключается в том, что коллекцию Arrayl Вы объявляете как локальную переменную метода OnCreate(...), которая вне этого метода видна не будет. Для того, чтобы получить доступ к этой переменной из других методов (этого же класса), коллекцию Arrayl нужно объявить как поле класса: public class MainActivity extends AppCompatActivity { private ArrayList Arrayl; @Override protected void onCreate(Bundle savedInstanceState) { Arrayl = new ArrayList<>(); for (int a = 1; a < 8; a++) { Arrayl.add(a); } Collections.shuffle(Arrayl); } }

Ответ 2



Объявляй вне методов, инициализируй в OnCreate и используй где хочешь. class A { private ArrayList Arrayl; ... OnCreate { ... Array1 = new ArrayList<>() .... } void B { Array1 будет видно. } } Вот так.

Как узнать какой клавишей мыши была нажата кнопка?

#c_sharp #wpf #button


Как в событии Button_Click определять, какая кнопка мыши была нажата?
    


Ответы

Ответ 1



Чтобы определить какая кнопка мыши была нажата, вы можете использовать свойство SystemParameters.SwapButtons private void Button_Click(object sender, RoutedEventArgs e) { if (SystemParameters.SwapButtons) { // Была нажата правая кнопка } else { // Была нажата левая кнопка } } Но учтите, это событие вызывается только при нажатии основной кнопки. Об этом сказано по ссылке на английский SO в одном из ответов. Из вопроса не совсем ясно, такой ли ответ вы хотели получить. Если вам нужно в одном методе обрабатывать разные клики по одной кнопке, то предлагаю использовать другой подход, который больше подходит для WPF. А именно - команды. В качестве примера предположим, что у вас есть некоторое число, которые вы хотите уменьшать на единицу при нажатии правой кнопки и увеличивать на единицу при нажатии левой кнопки. Пишите простую VM: public class MainViewModel : INotifyPropertyChanged { private int count; public int Count { get { return count; } set { count = value; OnPropertyChanged("Count"); } } private ICommand clickCommand; public ICommand ClickCommand { get { return clickCommand; } set { clickCommand = value; } } public void buttonClick(object param) { int value = Convert.ToInt32(param); if (value == 0) Count++; else if (value == 1) Count--; } public MainViewModel() { clickCommand = new RelayCommand(buttonClick); } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string name) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } } Наш метод принимает параметр, который показывает какая кнопка была нажата. Если 0- левая, если 1 - правая. Эти значения были выбраны произвольно, вы можете передавать в объект то, что посчитаете нужным. Теперь XAML: Для того, что определить какое действие нужно обработать используется Gesture: Чтобы узнать возможные варианты нужно обратится к перечислению MouseAction Код для RelayCommand не привожу, чтобы не загромождать ответ. Но вы без труда сможете найти подходящую реализацию. Например, тут Если код показался слишком большим - не пугайтесь ;) В дальнейшем вы будете пользоваться специальными библиотеками (например, FSharpViewModule для F# - проектов) или даже фреймверками (Prism) для крупных проектов которые упростят разработку.

Ответ 2



Отвечает за это событие MouseEventArgs

Ответ 3



Cначала приводите event к MouseEventArgs: MouseEventArgs me = (MouseEventArgs) e; Потом смотрите на: me.Button Либо посмотреть тут - для WPF ссылка

Ответ 4



Я относительно новичок и могу не знать всех тонкостей, но по-моему для определения кнопки проще использовать событие MouseDown: private void button_MouseDown( object sender, MouseEventArgs e ) { if(e.Button==MouseButtons.Right) { //Нажата правая кнопка } else if(e.Button==MouseButtons.Left) { //Нажата левая кнопка } else { //Нажата средняя кнопка } }

Switch-on-strings Java7 - архив переписки JSR 334

#java #строки #switch


Здравствуйте. Может ли мне кто-нибудь объяснить небольшой момент в переписки, касательно
критики и предложений данного нововведедения switch-on-strings в 7 пакете Жабы, в 334
coin project 334 JSR ?

процитирую: 

Now that we plan to have closures, do we still need strings-in-switch?
Won't a string-to-function map be about as fast (though maybe less
convenient)? I don't know what the use cases are for
strings-in-switch, but the feature already felt a bit low-benefit to
me, and seems even more so now with closures.


ссылка на источник

Что такое понятие closures, и почему в случае его реализации, задается вопрос, существует
ли необходимость в данной опции-свичире ?
Какая между ними связь, объясните для непонимающего.
И так же на счет вопроса не будет ли string-to-function map не менее быстрым.

Может кто небольшое введение сделать для понимания данного коммента ?
Буду благодарен. 
    


Ответы

Ответ 1



Могу ошибаться, но мне кажется, здесь речь идет о замыканиях, т.е. лямбдах. Пример, где switch может быть заменен лямбда-функцией. public static String caseOnString(String str) { switch (str) { case "hello": return "world"; case "bye": return "country"; default: return ""; } } public static String mapOnString(String str) { Function map = s -> { if (s.equals("hello")) return "world"; if (s.equals("bye")) return "country"; return ""; }; return map.apply(str); }

Ответ 2



Думаю, имели в виду следующее: если у нас есть переменная String str, то вместо switch (str) { case "one": System.out.println(1); break; case "two": System.out.println(2); break; default: System.out.println("?"); } предлагали писать что-то вроде такого (closures - это замыкания, а в случае java - лямбды, хоть они и не полноценные замыкания): Map switchMap = new HashMap<>(); switchMap.put("one", () -> System.out.println(1)); switchMap.put("two", () -> System.out.println(2)); switchMap.getOrDefault(str, () -> System.out.println("?")).run();

Обмен данными между формами Java FX

#java #javafx


Есть 2 формы, у форм разные классы-контроллеры, 1 форма по нажатию на кнопку загружает
другую. Как отправить 2 форме информацию из 1 формы.

Для смены форм использую - есть статический Stage, на котором меняю Scene :

 public static Stage primaryStage;

@Override
public  void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("/sample/sample.fxml"));
    primaryStage.setScene(new Scene(root));
    runStage(primaryStage);
}

public static void runStage(Stage stage) throws IOException {
    primaryStage = stage;
    primaryStage.show();
}

public static void main(String[] args) {
    launch(args);
}


Смена формы по нажатию на кнопку:

   public void EditBook() throws IOException {
    Parent root = FXMLLoader.load(getClass().getResource("/sample/EditBook.fxml"));
    Main.primaryStage.setScene(new Scene(root));
    Main.primaryStage.show();
}


Хотелось бы узнать как правильно менять формы и увидеть на примере взаимодействие
между формами
    


Ответы

Ответ 1



Взаимодействие между формами можно сделать через вызов методов у контроллера. Чтобы получить контроллера, надо писать так FXMLLoader loader = new FXMLLoader("/sample/EditBook.fxml"); Parent root = loader.load(); Main.primaryStage.setScene(new Scene(root)); ControllerClass controllerEditBook = loader.getController(); //получаем контроллер для второй формы controllerEditBook.someMethod(someParameters); // передаем необходимые параметры Main.primaryStage.show();

Enum и как его выводить в массив?

#java


Ну есть Enum в которой 3 переменные Moдerator Inkvizitor и God. Как мне вывести их
значения в массив? И обладает ли enum какими-то привилегиями в отличии от class-а или
недостатками, потому что оба имеют поля и можно писать в них методы.
    


Ответы

Ответ 1



Можно воспользоваться методом YourEnum.values() для получения массива всех возможных вариантов перечисления. Перечисление удобнее класса тогда, когда вы планируете не расширяемое количество экземпляров объекта. Например перечисление хранящее пол человека Sex.Male и Sex.Female. Также перечисления могут иметь методы, например: enum Sex { MALE, FEMALE; public String prefix() { return this == MALE ? "mr." : "mrs."; } } или enum Sex { MALE { public String prefix() { return "mr."; } }, FEMALE { public String prefix() { return "mrs."; } }; public abstract String prefix(); }

Картинка с типом input=“file”

#javascript #html #jquery #css


Доброго времени суток, есть задача.

Есть картинка(аватарка) при нажатии на неё, нужно вызывать input="file" что бы подгружать
картинку и менять аватарку, не хочется велосипедить с JS и jQuery может есть другое
решение?
    


Ответы

Ответ 1



Если Вам только стилизовать input type=file, то вот, например: #ava { display: none; } label { cursor: pointer; }

Но саму загрузку на сервер без php или nodejs реализовать нельзя.

Ответ 2



По идее, надо загружать на сервер. Но для остального можно использовать что-то такое: document.querySelector("input").addEventListener("change", function () { if (this.files[0]) { var fr = new FileReader(); fr.addEventListener("load", function () { document.querySelector("label").style.backgroundImage = "url(" + fr.result + ")"; }, false); fr.readAsDataURL(this.files[0]); } }); label { display: inline-block; width: 4em; height: 4em; background: silver; background-size: contain; background-repeat: no-repeat; background-position: center; } input { display: none; } PS: Этот ответ больше подходит к другому вопросу, но поскольку ответ старый и на него есть ссылки извне, удалять его отсюда я не буду.

В чем ошибка при перегрузке оператора+?

#cpp #классы #перегрузка_операторов


Перегружаю бинарный + в своем классе:

MyClass operator+(const MyClass &a, const MyClass &b) {
    ...
    return a.value + b.value;
}


Получаю ошибку бинарный оператор + имеет слишком много параметров. В чем проблема?
Везде указывается именно такая сигнатура перегрузки этого оператора.
    


Ответы

Ответ 1



Каждая не статическая функция-член класса имеет неявный параметр, который получает значение this, то есть указатель на сам объект класса. Вам надо либо этот оператор определить в классе как дружественную функцию (если требуется обращение к закрытым или защищенным членам класса), например friend MyClass operator+(const MyClass &a, const MyClass &b) { ... return a.value + b.value; } Или объявить ее как обычную функцию вне класса, если не требуется обращение к закрытым или защищенным членам класса. Либо сделать оператор функцией-членом класса, но с одним явным параметром MyClass operator+( const MyClass &b) const { ... return this->value + b.value; }

Ответ 2



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

SQL. Подзапросы. В чем ошибка (вывод всех продавцов, которые продали больше чем продавец N)?

#sql #база_данных #oracle #запрос #запрос_в_запросе


Есть  таблица SALES c полями:


ID_SALE - ID продажи
name_good - название товара
date_sale - дата продажи
FIO_saler -ФИО продавца
price- цена товара


Нужно вывести всех продавцов, которые продали больше чем продавец “Иванов Иван” (записи
с таким продавцом должны быть) за май 2015.

Вопрос: почему возникает ошибка, как её исправить, чтобы выводилась нужная информация?

 select FIO_saler,price
  from sales
 where sum(price)> all
    (SELECT price
     from sales
     where FIO_saler='Иванов Иван Иванович' 
    );
    /

    


Ответы

Ответ 1



SELECT FIO_saler, SUM(price) AS summa FROM sales WHERE date_sale > '2015-12-23' AND date_sale < '2015-12-31' GROUP BY FIO_saler HAVING SUM(price) > (SELECT SUM(price) FROM sales WHERE FIO_saler='Иванов Иван Иванович'); Проверка

Ответ 2



SELECT FIO_saler, price FROM SALES WHERE FIO_saler IN (SELECT FIO_saler FROM SALES GROUP BY FIO_saler HAVING SUM(PRICE) > (SELECT SUM(price) FROM SALES WHERE FIO_saler = 'Иванов Иван Иванович') ) AND date_sale BETWEEN _Начало_ AND _Конец_ Вам остается только наложить условие на период продажи вместо _Начало_ и _Конец_ в соответствии с типом данных поля.

Вызов .ToString()

#c_sharp


string s = null;
Console.WriteLine(Convert.ToString(s));//1
Console.WriteLine(s);//2
Console.WriteLine(s.ToString());//3



Почему в первом случае не выдает NULL reference?   
Почему во-втором случае не выдает NULL reference? Если я, не ошибаюсь, то в методе
Console.WriteLine() ко всем переменным вызывается метод .ToString() не явно.  
Почему когда явно указываю .ToString() выдает NULL reference?
Можно ссылки по данным вопросам или ключевые слова для поиска нужной информации.  


Вот il-код программы:

IL_0000:  nop
IL_0001:  ldnull
IL_0002:  stloc.0
IL_0003:  ldloc.0
IL_0004:  call       string [mscorlib]System.Convert::ToString(string)
IL_0009:  call       void [mscorlib]System.Console::WriteLine(string)
IL_000e:  nop
IL_000f:  ldloc.0
IL_0010:  call       void [mscorlib]System.Console::WriteLine(string)
IL_0015:  nop
IL_0016:  ldloc.0
IL_0017:  callvirt   instance string [mscorlib]System.Object::ToString()
IL_001c:  call       void [mscorlib]System.Console::WriteLine(string)
IL_0021:  nop
IL_0022:  ret

    


Ответы

Ответ 1



По поводу вывода null через Console.WriteLine(), MSDN говорит: If value is null, only the line terminator is written to the standard output stream. То есть Console.WriteLine(null) выводит один лишь перевод строки. Это объясняет пример (2). В этом случае Console.WriteLine согласно документации не имеет права тупо вызывать ToString (тем более что мы вызвали перегрузку со строкой, там конвертация точно не нужна). Для того, чтобы соответствовать документации, функция обязана проверять свой аргумент на null. Это можно увидеть прямо в исходниках текущей версии .NET: if (value==null) { WriteLine(); } else { ... Далее, согласно документации на Convert.ToString(string s), значение не меняется: value is returned unchanged. Поэтому Convert.ToString(s) возвращает null, а уж вывод null работает без проблем, как и в примере (2). Это объясняет пример (1). Ну и наконец пример (3), вызов s.ToString() есть вызов метода по null-ссылке, который закономерно ведёт к NullReferenceException.

Легкий паралакс

#jquery #css #html5 #css3


Добрый день, подскажите, вероятно у кого-нибудь есть на примете паралакс, только
что бы он несильно ресурсоемкий был, лайт скажем так, может кроссбарузерная реализация
на css.
И может есть на примете похожий плагин для реализации эффекта как на первом экране,
движение мыши приводит в действие 5 блоков с информацией.
    


Ответы

Ответ 1



По parallax эффекту: $(document).ready(function() { var wHeight = $(window).height(); function parallax() { var pHeight = $(this).outerHeight(); var pMiddle = pHeight / 2; var wMiddle = wHeight / 2; var fromTop = $(this).offset().top; var scrolled = $(window).scrollTop(); var speed = $(this).attr('data-parallax-speed'); var rangeA = (fromTop - wHeight); var rangeB = (fromTop + pHeight); var rangeC = (fromTop - wHeight); var rangeD = (pMiddle + fromTop) - (wMiddle + (wMiddle / 2)); if (rangeA < 0) { rangeA = 0; rangeB = wHeight } var percent = (scrolled - rangeA) / (rangeB - rangeA); percent = percent * 100; percent = percent * speed; percent = percent.toFixed(2); var animFromBottom = (scrolled - rangeC) / (rangeD - rangeC); animFromBottom = animFromBottom.toFixed(2); if (animFromBottom >= 1) { animFromBottom = 1; } $(this).css('background-position', 'center ' + percent + '%'); $(this).find('.parallax-content').css('opacity', animFromBottom); $(this).find('.parallax-content').css('transform', 'scale(' + animFromBottom + ')'); } $('.parallax').each(parallax); $(window).scroll(function(e) { $('.parallax').each(parallax); }); }); body { margin: 0; padding: 0; height: 800px; } .main-slide { width: 100%; height: 100vh; margin-bottom: 400px; }
Тут можно посмотреть. Что касается движения блоков, то я обычно использую jParallax для таких решений. http://stephen.band/jparallax/

Ответ 2



Вот решение для второго parallax-эффекта: var $layerParallax = $('.layer-parallax'); if ( ! Modernizr.touch ) { if ( $layerParallax.length > 0 ) { $layerParallax.parallax(); } } .layer-parallax { display:flex; margin: 0 auto; width: 800px; margin-top: 20vh; } .layer { background: red; color: white; float: left; width: 10%; height: 100px; border: 1px solid black; transform-style: preserve-3d; backface-visibility: hidden; } .layer:nth-child(1) { left: 0; z-index: 1; } .layer:nth-child(2) { left: 10% !important; z-index: 2; } .layer:nth-child(3) { left: 20% !important; z-index: 3; } .layer:nth-child(4) { left: 30% !important; z-index: 4; } .layer:nth-child(5) { left: 40% !important; z-index: 3; } .layer:nth-child(6) { left: 50% !important; z-index: 2; } .layer:nth-child(7) { left: 60% !important; z-index: 1; }
1
2
3
4
5
6
7
Думаю, принцип будет понятен, а остальное уже самостоятельно доработаете.

Как использовать git, чтобы хранить проекты на разных хранилищах?

#git


Как использовать git, чтобы хранить две проекты на github и bitbucket? Не хочется
ставить еще один клиент git.
Использую GUI-клиент GitHub, а также консольное окно github.
    


Ответы

Ответ 1



Чтобы хранить один и тот же репозиторий на разных серверах вам не нужен другой клиент Git. Достаточно добавить их у себя в remotes: git remotes add github https://github.com.... git remotes add bitbucket https://bitbucket.org.... И когда будете делать push/pull, дубрируйте для каждого remote: git push github master; git push bitbucket master; И почитать это в первую очередь.

Количество сколько байтов в поле mysql таблицы

#mysql #sql #char


  CREATE TABLE `NewTable` (
  `usname`  varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
  )
  ENGINE=InnoDB
  DEFAULT CHARACTER SET=utf8 COLLATE=utf8_bin
  ROW_FORMAT=COMPACT
  ;


Если в поле будут введены не utf-8 символы, то максимум 32 символа можно хранить
в этом поле.

А если в поле будут utf-8 символы, то и utf-8 можно 32 шт сохранять в этом поле.

Сколько байт будет занимать поле если в нем только utf-8 символы?

И сколько байт, если на utf-8 символы будут хранится  в нем?

Режим traditional как-то влияет на это?



Изменил заголовок: добавил слово "сколько" - для автопоиска, если кто-то будет задавать
схожий вопрос.
    


Ответы

Ответ 1



Циферка в скобках varchar указывает именно число символов используемой кодировки. Длина в байтах напрямую зависит от используемой для поля кодировки CHARACTER SET. Для utf8 mysql использует максимум 3-байтовое представление. Поэтому varchar(32) будет занимать до 3 * 32 = 96 байт сами данные, плюс 1 или 2 байта на хранение длины данных в байтах. 96 меньше 255, поэтому требуется 1 байт. Итого такой varchar будет занимать от 1 до 97 байт на диске. Интересный момент, что в индексе и всяких сортировках/группировках в памяти это поле всегда развёрнуто до максимальной байтовой длины. Внимательный читатель может удивиться ещё одному моменту - ведь utf может занимать до 4 байт. А mysql под utf8 умеет хранить только 3 байта. Да, utf8 в остальном мире и utf8 в mysql - разные вещи. При попытке записать 4-байтный utf8 (именно в 4 байте размещены модные нынче смайлики, т.е. это совсем не экзотика мёртвых языков, а реально встречаемые данные) mysql вернёт ошибку и ничего не запишет. Для полноценного utf8 в mysql 5.5 добавлена кодировка utf8mb4. А utf8mb4 использует уже до 4 байт на символ. Что немного изменяет результат байтовой длины: 32 символа будут занимать до 32*4 = 128 байт, плюс один на хранение длины строки.

Ответ 2



Количество занимаемых байтов в данном случае будет на 1 больше байтового представления хранимой строки. Грубо, если в строке 2 символа однобайтовых и 2 двухбайтовых, то нужно 7 байтов. Подробнее см. на http://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html И да, если используются корейские/китайские/японские символы, то может быть и 3 байта на символ. Об этом см. http://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html

Кастомный Switch с подписями

#jquery #css #button #animate #switch


Есть Switch с подписями, при клике на сам switch он должен переключаться, так же
переключение может происходить при клике на значение.





.switch input {
  display: none;
}
.switch {
  width: 45px;
  height: 15px;
  position: relative;
  display: inline-block;
}
.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: #00cc8c;
  transition: .3s;
}
.slider:before {
  content: "";
  height: 26px;
  width: 26px;
  position: absolute;
  left: 0;
  bottom: -5px;
  background-color: #008f62;
  transition: .3s;
}
input:checked + .slider {
  background-color: #f8ee7c;
}
input:focus + .slider {
  box-shadow: 0 0 1px #f8ee7c;
}
input:checked + .slider:before {
  transform: translateX(26px);
}
.slider.br {
  border-radius: 34px;
}
.slider.br:before {
  border-radius: 50%;
}





Возможно подключение jQuery. Сама изюминка вопроса в добавлении активных надписей
"Вкл/Выкл"

https://fiddle.jshell.net/w4t05476/
    


Ответы

Ответ 1



CSS: .selector-on { color: gray; cursor: pointer; } .selector-off { color: gray; cursor: pointer; } .switch input{ display:none; } .active-selector { color: #00cc8c; } .switch{ width: 45px; height: 15px; position: relative; display: inline-block; } .slider{ position: absolute; cursor: pointer; top: 0; right: 0; bottom: 0; left: 0; background-color: #00cc8c; transition: .3s; } .slider:before{ content: ""; height: 26px; width: 26px; position: absolute; left: 0; bottom: -5px; background-color: #008f62; transition: .3s; } input:checked + .slider{ background-color: #f8ee7c; } input:focus + .slider{ box-shadow: 0 0 1px #f8ee7c; } input:checked + .slider:before{ transform: translateX(26px); } .slider.br{ border-radius: 34px; } .slider.br:before{ border-radius: 50%; } HTML: On Off jQuery: function enableDisable(flag) { $('.my-checkbox').prop('checked', flag); $('.selector-on').toggleClass('active-selector', function() { return $(this).hasClass('active-selector') ? true : false; }); $('.selector-off').toggleClass('active-selector', function() { return $(this).hasClass('active-selector') ? true : false; }); } $('.selector-on').on('click', function(event) { return $(this).hasClass('active-selector') ? false : enableDisable(false); }); $('.selector-off').on('click', function(event) { return $(this).hasClass('active-selector') ? false : enableDisable(true); }); $('.my-checkbox').on('click', function() { if($(this).prop('checked')) { $('.selector-off').trigger('click'); } else { $('.selector-on').trigger('click'); } }); Пример

Ответ 2



$('input[type=checkbox]').before('On').after('Off'); $('input[type=checkbox]').onchange(function(){ $('#label_before').toggleClass('label_active'); $('#label_after').toggleClass('label_active'); }) Это если имеет смысл добавлять элементы через jQ. Я бы предпочел сразу все в html вставлять/через пхп генерить, не знаю, как там завязано у Вас все, но так не красиво, да и работает в идеале с одним свитчем. Код не тестировался, работоспособность не гарантируется. Гарантируется только смысл.

Ответ 3



.b-switch { margin: 15px 35px; font-family: 'segoe ui', sans-serif; font-size: 12px; } .b-switch input[type="checkbox"] { display: none; } .b-switch input[type="checkbox"] + label { width: 55px; height: 15px; position: relative; display: inline-block; background-color: #00cc8c; border-radius: 35px; transition: .3s; } .b-switch input[type="checkbox"] + label:before{ content: ""; position: absolute; left: -35px; top: 0; width: calc(100% + 70px); height: 100%; cursor: pointer; } .b-switch input[type="checkbox"] + label:after { content: ""; position: absolute; left: 0; bottom: -5px; height: 26px; width: 26px; background-color: #008f62; border-radius: 50%; cursor: pointer; transition: .3s; } .b-switch input[type="checkbox"] + label > span, .b-switch input[type="checkbox"] + label + span{ position: absolute; text-transform: uppercase; padding: 0 5px; color: #008F62; font-weight: 600; cursor: pointer; } .b-switch input[type="checkbox"] + label > span{ right: 100%; } .b-switch input[type="checkbox"]:checked + label{ background-color: #f8ee7c; } .b-switch input[type="checkbox"]:checked + label:after { left: calc(100% - 26px); } .b-switch input[type="checkbox"]:checked + label > span, .b-switch input[type="checkbox"] + label + span{ opacity: .5; pointer-events: none; } .b-switch input[type="checkbox"]:checked + label + span{ opacity: 1; }
Выкл
Выкл
Выкл


В переменной типа long не помещается выражение 300*300

#c #arduino #преобразование


В языке ардуино, если писать 

long A = 90000;
Serial.println(A);


то все правильно работает, но если писать

long A = 300*300;
Serial.println(A);


то выводит 24464. И даже если писать 

Serial.println(300*300);


то результат тот же. В чем может быть проблема?
    


Ответы

Ответ 1



Похоже, что выражение long A = 300*300; ^^^^^^^^ вычисляется, как имеющее тип int, и объект типа int не может вместить в себя результирующее значение. Запишите следующим образом long A = ( long )300*300; или long A = 300l*300l; Что касается данной инициализации long A = 90000; то для целочисленного литерала компилятор определяет тот целочисленный тип, который может вместить в себя данное значение. Согласно стандарту C (6.4.4.1 Integer constants) 5 The type of an integer constant is the first of the corresponding list in which its value can be represented И далее в таблице указывается, что когда литерал не имеет суффикса, то последовательно подбирается тип литерала в порядке int, long int, long long int.

Не могу сделать push в чужой репозиторий: “already up-to-date”

#git #git_push


Меня добавили в репозиторий (дали права на коммит, пуш).

Сделал клон этого репозитория, создал ветку, закоммитил изменения.

Пытаюсь сделать git push, чтобы на удалённом появилась моя новая ветка со всеми изменениями.

Ввожу мэйл, пароль, в ответ приходит "already up-to-date". Данных на удаленном нет...

Что я делаю не так?
    


Ответы

Ответ 1



already up-to-date Это означает что: На том сервере, куда вы пушите, уже есть такая ветка И эта ветка находится в таком же состоянии (т.е. точно на тот же коммит смотрит). Варианты: Вы пушите не туда (а в какой-то другой репозиторий). Проверяется командой git remote -v Вы пушите не то что нужно (а например свою ветку master). Предположим, нужные коммиты у вас в ветке mybranch: git checkout mybranch # проверим, что коммиты на месте git log git push -u origin mybranch Можно обойтись без checkout и сразу выбрать, что и куда пушить: git push -u origin mybranch:mybranch Вы сделали коммиты не в ту ветку. создал ветку, закоммитил изменения. Довольно частая ситуация: разработчик создал ветку, но не переключился на неё. Проверяется просто: # проверим, что коммиты на месте git log mybranch Если оказалось, что коммиты, например, в master, а должны быть в mybranch: git checkout mybranch git reset --hard master # теперь пробуем пушить git push -u origin mybranch # а теперь вернём свой master на тот же коммит, который на удалённом сервере git checkout master git reset --hard origin/master # заодно можно его обновить git pull

Как запустить функцию в потоке (DLLMain)?

#cpp #многопоточность #dll #cpp11


Приветствую. Есть некая функция, которая получает хеш-сумму файла (exe) и записывает
ее в файл. Она запущена в потоке, но приложение откуда она запускается - крашит. Хотелось
бы узнать как правильно запустить функцию в потоке, чтобы приложение не крашилось.

void initialize()
{
    string buffer;
    thread t(calclulateHash, ref(buffer));
    t.detach();
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            initialize();
            break;
        }
    }
    return true;
}

    


Ответы

Ответ 1



Таким образом как вы делаете, делать нельзя. В DllMain нельзя запускать потоки (или проводить синхронизацию). Вынесите запуск потока в отдельную функцию и вызывайте её не из DllMain, а из другого места. Одной из возможных причин проблемы является синхронизация всех вызовов DllMain: каждый её вызов ждёт окончания других. Если вы запускаете поток, это приводит к попытке рекурсивного вызова с флагом DLL_THREAD_ATTACH (не PROCESS), что немедленно приводит к проблемам. DllMain — это специальная; очень ограниченная функция, принципы, распространяемые на обычные функции, тут не работают. Ну и интересна сигнатура функции calculateHash, конечно.

Ответ 2



Грубо говоря, локальная переменная string buffer; передается в поток по ссылке (благодаря std::ref): thread t(calclulateHash, ref(buffer)); каковой поток отсоединяется и выполняется и, как я понимаю, потом пытается писать в buffer t.detach(); которого уже нет, потому что функция, в которой он объявлен, давно закончилась... Зачем вам вообще считать нечто, что вы никак не используете?

Как понять начертание текста внутри docx файла используя c#?

#c_sharp


Как понять начертание текста на c#?
Мне нужно определить как написан текст:


Курсивом
Жирным
Подчеркнутым
Надчёркнутым
Перечеркнутым


Как собственно распознать начертание на c#, если текст берется из файла word?

StreamReader readLorem = new StreamReader(@"lorem.docx");

StreamWriter writeEncrypt = new StreamWriter(@"encrypt.docx");

StreamWriter writeDecrypt = new StreamWriter(@"decrypt.docx");

public Bacon()
{
    InitializeComponent();
}

private void Bacon_Load(object sender, EventArgs e)
{
    string lorem = readLorem.ReadToEnd();
}


Такой код не сохраняет начертание.   
    


Ответы

Ответ 1



Как ранее отмечали, можно воспользоваться библиотекой OpenXML от Microsoft, которую можно скачать тут. Итак после установки в Ваш проект нужно подключить следующие сборки: DocumentFormat.OpenXml WindowsBase Для работы с текстом нужно подключить пространства имён: using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; Я создал для демонстрации небольшое консольное приложение для примера, ниже расположена функция, которая разбирает форматирование текста, который содержится в файле по пути path. Эта функция отображает текст из документа и параметры форматирования каждого участка текста: static void ReadDocx(string path) { try { using (var doc = WordprocessingDocument.Open(path, false)) { foreach (var p in doc.MainDocumentPart.Document.Body.Elements()) { foreach (var r in p.Elements()) { Console.WriteLine(r.InnerText); Console.WriteLine("Является:"); if (r.RunProperties.Bold != null) Console.WriteLine("Жирный"); if (r.RunProperties.Italic != null) Console.WriteLine("Курсив"); if (r.RunProperties.Underline != null) Console.WriteLine("Подчёркнутый"); if (r.RunProperties.Strike != null) Console.WriteLine("Перечеркнутый"); if (r.RunProperties.VerticalTextAlignment != null) { if (r.RunProperties.VerticalTextAlignment.Val == VerticalPositionValues.Subscript) Console.WriteLine("Подстрочный"); if (r.RunProperties.VerticalTextAlignment.Val == VerticalPositionValues.Superscript) Console.WriteLine("Надстрочный"); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }

Javascript. Как поменять background-image?

#javascript


Всем привет! Хочу на чистом js поменять background у блока. Есть такой код:

.block{
     background-image: url(img/img1.jpg);
 }


var btn = document.getElementById('btn');
btn.addEventListener('click', function(){changeBgImg();});

var block = document.getElementById('block');

function changeBgImg(){
    block.style.backgroundImage = 'img/img2.jpg'
}


Но почему-то такой код не работает, background не меняется. Подскажите, в чем может
быть проблема?
    


Ответы

Ответ 1



Пишите также, как и в css, т.е. вместе с url: var block = document.getElementById('block'); function changeBgImg(){ block.style.backgroundImage = "url('https://cs7062.vk.me/c540107/v540107359/2729/fYQlS_23QdA.jpg')"; } changeBgImg(); #block { width: 200px; height: 200px; }
222


Табы на чистом CSS

#html #css #вёрстка


Для реализации табов использую :target, но при загрузке страницы нужно чтобы первый
блок был видим. Блоки будут выводится динамически. Реально это сделать без JS?



.target:not(:target){
   display: none;
}
      
.target:target{           
   display: block;
}


Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tempus, felis at varius eleifend, neque orci porta magna, consequat aliquam ligula velit quis erat. Aenean porttitor pellentesque risus, eu tincidunt ipsum blandit in.

Sed lobortis placerat elit tincidunt tempor. Nam dignissim euismod quam nec tempor. Sed tortor lorem, ultricies a auctor nec, auctor ut neque. Aenean varius, urna eget adipiscing feugiat, nunc ligula molestie massa, id accumsan turpis metus ac ante. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

Pellentesque quis tortor vitae elit cursus vulputate et vel dui. Nunc commodo pretium arcu in ultricies. Nunc vel velit enim, et tincidunt leo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

Quisque eget tempor sapien. Cras convallis tempor orci pulvinar scelerisque. Nullam et erat eu nibh sollicitudin congue sit amet id diam. Sed in lectus ut augue euismod porta. Quisque non lacus odio. Nunc ornare adipiscing egestas.


Ответы

Ответ 1



Можно воспользоваться классом, для указания элемента открытого по умолчанию, и sibling селектором, позволяющем выбирать соседний элемент на уровне. В данном подходе есть ограничение: элемент открытый по умолчанию должен быть последним в разметке. Пример, на основе ответа на английский вопрос: .target:not(:target), :target ~ .target.default-target { display: none; } .target:target, .target.default-target { display: block; }

Sed lobortis placerat elit tincidunt tempor. Nam dignissim euismod quam nec tempor. Sed tortor lorem, ultricies a auctor nec, auctor ut neque. Aenean varius, urna eget adipiscing feugiat, nunc ligula molestie massa, id accumsan turpis metus ac ante. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

Pellentesque quis tortor vitae elit cursus vulputate et vel dui. Nunc commodo pretium arcu in ultricies. Nunc vel velit enim, et tincidunt leo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

Quisque eget tempor sapien. Cras convallis tempor orci pulvinar scelerisque. Nullam et erat eu nibh sollicitudin congue sit amet id diam. Sed in lectus ut augue euismod porta. Quisque non lacus odio. Nunc ornare adipiscing egestas.

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tempus, felis at varius eleifend, neque orci porta magna, consequat aliquam ligula velit quis erat. Aenean porttitor pellentesque risus, eu tincidunt ipsum blandit in.



Ответ 2



Зачастую используют input для подобной реализации. Вот готовый пример: input, .content { display: none; } #one:checked ~ .one, #two:checked ~ .two, #three:checked ~ .three {display: block;} label { cursor: pointer; } label:hover, input:checked + label {background: #eee;} h3, p { text-align: justify; }

What is Lorem Ipsum?

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

Where does it come from?

Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32.

The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham.

Why do we use it?

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).



Задание с собеседования - объяснить почему не работает код [закрыт]

#c_sharp


        
             
                
                    
                        
                            Закрыт. Этот вопрос не по теме. Ответы на него в данный
момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он соответствовал тематике «Stack Overflow на русском».
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Знакомому на собеседовании дали задание, объяснить почему не работает код, в общем,
собеседование он так и не прошел, а над тестовым заданием мы решили вместе посидеть,
своими силами ни к какому толковому результату не пришли, может вы сможете подсказать
что тут не так. Код компилируется, но ниразу не выполняется.

class MiddleTask
{
    delegate bool Comparer(int a, int b);
    delegate void Executer(string message);
    static int MaxValue(int a, int b, Comparer comp)
    {
        return comp(a, b) ? a : b;
    }
    static void TExecute(int cicle, Executer method)
    {
        var inc = 0;
        while (inc <--cicle)
        {    
            method("Execute method-comparer");
        }
    }        

    static void Main(string[] args)
    {
        Trace.WriteLine("Entry point...");
        TExecute(3, (dy) =>
        {
            var targetRangeModel = new
            {
                range = 0,
                comparerPrefix = "Compare result:"
            };

            var index = 0;
            var target = 20;

            while (index-- > targetRangeModel.range && target-- > index)
            {
                Trace.WriteLine(targetRangeModel.comparerPrefix + ">>>" +
                    MaxValue(22, 15,
                    (x, y) =>
                        {
                            return (x > y) ? true : false;
                        }
                    )
                );
            }
        });

    


Ответы

Ответ 1



У вас ни разу не выполняется цикл while (index-- > targetRangeModel.range && target-- > index) Т.к. условие index-- > targetRangeModel.range всегда будет ложно

Почему не возникает ошибка при s[0:len(s)]?

#python #language_lawyer


s = "Worldoftanks"


Почему print(s[0:len(s)]) будет работать?

len(s) вернет 12. Тогда получается s[0:12], а это ошибка: обращение к несуществующему
индексу.
    


Ответы

Ответ 1



Для начала стоит отметить, что все верно. Из документации ( раздел Sequences): a[i:j] вернет все элементы с индексом k таким, что i <= k < j. Обратите внимание на то, что j строго больше. Послединий индекс "Worldoftanks" - 11 (нумерация с нуля) и срез [0:len(obj)] вернет все элементы с индексами 0 1 2 ... 10 11 равенство 11 < 12 выполнено. Однако, есть другой момент: Срезы представляют собой отдельные объекты, которые возвращает функция slice. В определении сказано, что при взятии среза нормальным способом ([start:stop:step]) объекты этого типа используются неявно. Когда необходимо будет вернуть результат среза, будут вычислены допустимые границы (границы будут проверены за вас, да), чтобы не произошло выхода за пределы. За это отвечает метод indices (getIndices в CPython). Можно немного переписать взятие индекса вот так: slic = slice(0, 20) print("Тип объекта из функции slice:", type(slic)) my_string = "Hello world" print("Корректные индексы:", slic.indices(len(my_string))) print("Результат среза", my_string[slic]) >>> Тип объекта из функции slice: >>> Корректные индексы: (0, 11, 1) >>> Результат среза Hello world Как видно, никаких ошибок, ибо indices вернул корректные границы.

Ответ 2



s[0:12] - это ж с нулевой по 11ю; первый индекс - это откужа начинается то, что нам надо, второй - откуда начинается то, что нам НЕ надо; както так в доках поедлагается запоминать, чтобы не путаться ))) UPD: вообще, синтаксис слайсов (они же - "срезы") НЕ вызывает ошибок при выходе за пределы массива/строки, в отличие от обращения к единичному элементу. ну т.е. s[100] вызовет ошибку, а s[100:101] - уже не вызовет, как и s[100:], ну и все такое. В доках об этом явно сказано: docs.python.org/2/tutorial/introduction.html , ищем строчку "However, out of range slice indexes are handled gracefully when used for slicing"

Ответ 3



Почему print(s[0:len(s)]) будет работать? Правая граница среза так же как и для range(len(s)) в Питоне не включается†: >>> [*range(4)] [0, 1, 2, 3] Видно что правая граница 4 исключена. Аналогично, print(s[0:len(s)]) печатает все символы с допустимыми индексами от 0 до len(s) - 1 включительно, то есть в диапазоне 0 <= i < len(s). E.W. Dijkstra объясняет (в 1982) почему правую границу не следует включать. Фактически для строк (str тип) и других стандартных последовательностей в Питоне можно использовать в срезах значения вне допустимых индексов, к примеру: 'a'[-42:1000] не выбрасывает ошибку, так как s[i:j] формально: (4) The slice of s from i to j is defined as the sequence of items with index k such that i <= k < j. If i or j is greater than len(s), use len(s). If i is omitted or None, use 0. If j is omitted or None, use len(s). If i is greater than or equal to j, the slice is empty. (3) If i or j is negative, the index is relative to the end of sequence s: len(s) + i or len(s) + j is substituted. But note that -0 is still 0. Если индексы отрицательны, то к ним прибавляется len(s) и затем s[i:j] равнозначно‡: s[max(0, min(i, len(s))) : max(0, min(j, len(s)))] то есть i,j принудительно к диапазону [0, len(s)] (оба конца включительно) приводятся. Неуказанные границы или None заменяются на 0 и len(s) соответственно: s[0:len(s)] == s[:] == s. Если в итоге i >= j, то пустой срез создаётся. Иллюстрация из вводного руководства: +---+---+---+---+---+---+ | P | y | t | h | o | n | +---+---+---+---+---+---+ 0 1 2 3 4 5 6 -6 -5 -4 -3 -2 -1 "Python"[3:5] == "ho"—визуально достаточно выбрать буквы ('h' и 'o'), которые между указанными индексами (3 и 5) находятся. s[i:j] действует как type(s).__getitem__(s, slice(i, j)). Пример реализации: class FakeSeq: ... def calc_item(self, i): ... def __getitem__(self, item): if isinstance(item, slice): indices = item.indices(len(self)) return FakeSeq([self.calc_item(i) for i in range(*indices)]) else: return self.calc_item(i) slice.indices() метод используется, чтобы помочь реализовать необходимое поведение для среза. К примеру, "a"[-42:1000]: >>> slice(-42, 1000).indices(len("a")) (0, 1, 1) # start, stop, step >>> list(range(*_)) [0] # indices >>> 'a'[-42:1000] == 'a'[0] True Фактически в CPython для строк вызывается похожая функция PySlice_GetIndicesEx(). В общем случае, типы передаваемые в slice() неограничены и их интерпретация зависит от конкретного типа: class Slicable(object): def __getitem__(self, given): if isinstance(given, slice): # do your handling for a slice object: print(given.start, given.stop, given.step) else: # Do your handling for a plain index print(given) s = Slicable() s[1] s[1:2] s[1:2:3] s[1:2:3,4] s[()::1j,] s[()::1j,None] Результат 1 1 2 None 1 2 3 (slice(1, 2, 3), 4) (slice((), None, 1j),) (slice((), None, 1j), None) Реальный пример: кортежи, ... и 1j индексы используются в numpy. †Что значит * (звёздочка) и ** двойная звёздочка в Питоне? ‡Часть об обнулении отрицательных индексов я не нашёл где явно задокументирована (кроме упомянутой цитаты из вводного руководства (неформально): "out of range slice indexes are handled gracefully when used for slicing") и из новостей для Питон 2.3 (древняя версия): "[slice.]indices() handles omitted and out-of-bounds indices in a manner consistent with regular slices (and this innocuous phrase hides a welter of confusing details!"выделение моё Выделенная часть переводится как: «эта безобидная фраза скрывает кучу сбивающих с толку деталей»

Как происходит расширение примитивных типов

#java #типы_данных


Предположим, у нас есть такой код:   

long a = 0x1_0000_0000L + 0xCAFE_BABE;
System.out.println(a == 0x1_CAFE_BABEL);


Почему будет выведен false? По идее, число 0xCAFE_BABE должно быть автоматически
расширено до типа long, и уже после этого должно произойти сложение.
    


Ответы

Ответ 1



а оно и происходит. Просто 0xCAFE_BABE - отрицательное (!) поэтому оно и приводится к отрицательному long - у. Т.е. (long)(0xCAFE_BABE) (именно в такой записи) - это FFFF_FFFF_CAFE_BABE что немного не то, на что вы рассчитывали. Поэтому числа больше 7FFF_FFFF в подобных ситуациях нужно писать только с суффиксом L.

День недели по дате

#php


Есть массив с датами такого типа 2016-12-15,2016-12-12...
Как определить день недели по дате

$days = array(
    'Воскресенье', 'Понедельник', 'Вторник', 'Среда',
    'Четверг', 'Пятница', 'Суббота'
);
foreach( $date_time as $key => $val ) {
   echo($days[(date('w'))] . $val);
}

    


Ответы

Ответ 1



функция date(), которую вы используете имеет два параметра. Первый - строка форматирования, и тут вы правильно используете формат w, возвращающий номер дня недели, где 0 соответствует воскресенье. Вторым параметром является метка времени, по умолчанию этот параметр равен текущему дате и времени. Поэтому вам следует перевести ваши строки дат в UNIX TIMESTAMP с помощью соответствующей функции strtodate(). Вот в общем то и все. $dates = ['2016-12-15', '2016-12-25', '2017-01-26']; $days = [ 'Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота' ]; foreach($dates as $d){ print_r([ 'date' => $d, 'dayOfWeek' => $days[ date("w", strtotime($d) )] ]); }

Параллельное обновление таблицы

#sql #sql_server


Допустим, есть процедура, которая содержит в себе запрос вида:

UPDATE TOP (1) table
SET SessionId=@SessionId
Where SessionId is null


Если эту процедуру будут запускать параллельно несколько пользователей, то не будет
ли коллизий в том, что одном и тот же юзер проапдейтит одну и туже запись или MS SQL
сервер позаботится, что бы такой ситуации не возникло?

Если такое имеет место быть, то как этого избежать?
    


Ответы

Ответ 1



Такая конструкция потокобезопасна. или MS SQL сервер позаботится, чтобы такой ситуации не возникло? Если кратко, то - да. Если одна сессия (имеется ввиду SQL-сессия) выбрала запись в таблице для обновления, то параллельная сессия не сможет (из-за установленной первой сессией U-блокировки) выбрать и обновить ту же самую запись (если я правильно понял - это то, что интересует). Пример с пояснениями - ниже. Пусть есть таблица: CREATE TABLE LockTest ( Id int identity not NULL primary key, SessionId uniqueidentifier NULL ); Добавим в неё немного данных: INSERT INTO LockTest (SessionId) VALUES (NULL), (NULL), (NULL), (NULL), (NULL); Пару раз выполним запрос: DECLARE @sessionId uniqueidentifier = newid(); UPDATE TOP (1) LockTest SET SessionId = @sessionId WHERE SessionId IS NULL; Выполним запрос на обновление в третий раз, запустив, предварительно профилировщик, и посмотрим какие происходят блокировки: (для полноты понимания происходящего желательно, конечно, иметь представление о режимах, гранулярности и совместимости блокировок). Происходит примерно следующее. SqlServer сканирует кластерный индекс в поисках записи, у которой SessionId является NULL. При этом для каждой записи поочередно: ставится U-блокировка на запись (чтение с возможным изменением данных) происходит проверка условия SessionId IS NULL если запись не удовлетворяет условию, то блокировка снимается и происходит переход к следующей записи (на снимке экрана - это Acquired-Released пары U-блокировок записей со значениями хэшей ключа (8194443284a0) и (61a06abd401c)) если запись удовлетворяет условию (запись со значением хэша ключа (98ec012aa510)), то блокировка повышается до монопольной (X-блокировки), запись обновляется, после чего блокировки снимаются Параллельная сессия не сможет обновить ту же самую запись, т.к. для этого ей придётся точно также установить U-блокировку на ту же самую запись. Однако две U-блокировки несовместимы, поэтому параллельной сессии придётся ждать, пока мы обновим запись и/или снимем блокировку. Тогда же, когда блокировка нами будет уже снята, SessionId у записи станет не NULL. Вследствие чего параллельной сессии придётся искать следующую "свободную" запись. Картина происходящего может несколько меняться в зависимости от наличия или отсутствия индекса на столбце SessionId. От того, будет ли проиcходить lock-escalation (для TOP (1), наверное, не должно). Однако характер происходящего, - установка U-блокировки на кандидата и её освобождение, если запись не подошла, либо преобразование в X-блокировку, если запись выбрана, с последующим освобождением, - скорее всего будет сохраняться.

Как обратиться к div внутри div

#html #css #html5


Здравствуйте.

Есть блок и внутри него ещё два блока. Хочу чтобы первый внутренний блок занимал
левую часть экрана (50% экрана), а второй блок правую (50% экрана). Пробовал сделать
сам, но так и не получилось. Не могу достучаться до div'ов внутри #father.

Пример:



#son {
  height: 400px;
  width: 300px margin-left: auto;
}
#daughter {
  height: 400px;
  width: 300px margin-right: auto;
}
....
....
Заранее спасибо.


Ответы

Ответ 1



#son{ display: inline-block; height: 400px; width: 300px; background-color: #3498DB; margin: 0px; padding: 0px; } #daughter{ display: inline-block; height: 400px; width: 300px; background-color: #E74C3C; margin: 0px; padding: 0px; }


Ответ 2



#father { height: 100px; width: 200px; border: 2px solid blue; } #son { height: 100%; width: 50%; margin-left: auto; background: green; float: left; } #daughter { height: 100%; width: 50%; margin-right: auto; background: red; float: right; }


Ответ 3



Например, с использованием flex, т.к. float уже морально устарели :) p.s. Добавил border для демонстрации #father { display: flex; flex-direction: row; } #son, #daughter{ height: 400px; flex-grow: 1; border: 1px solid red; } #daughter{ border: 1px solid blue; }
....
....


Смена картинки по клику с помощью метода attr()

#javascript


Всем доброго дня. 

Есть такой скрипт:
Необходимо сделать смену картинок по клику. Нашла в сети пример и написала код по
нему. У меня он не работает и в консоли выводит ошибку. Скажите пожалуйста как можно
исправить код? Для более лучшего понимания поясню - .slide-225 - мой класс картинки,
и src - пути изображений которые я пытаюсь заменить. Буду рада любому замечанию и совету:) 

$(".slide-225").bind("click", function() {
  var src = ($(this).attr('src="/wp-content/uploads/2017/01/Mirdif-2-960x640.jpg"')
=== "Mirdif-2-960x640.jpg") ? "Mirdif-full-960x640.jpg" : "Mirdif-2-960x640.jpg";
  $(this).attr('src="/wp-content/uploads/2017/01/Mirdif-2-960x640.jpg"', src);
}); 

    


Ответы

Ответ 1



Вы не правильно получаете и записываете атрибут. Для получения используется запись такого типа: $(element).attr(attribute); Для назначения используется запись такого типа: $(element).attr(attribute, value); В любом случае, название атрибута и его значение указывается в кавычках, если конечно, вы не указываете название атрибута или его значение переменной или каким-то вычислениями в JS Исправленная версия: $(".slide-225").bind("click", function() { var src = $(this).attr('src') ? "Mirdif-full-960x640.jpg" : "Mirdif-2-960x640.jpg"; $(this).attr('src', src); });

Пересечение отрезка и эллипса

#java #графика #геометрия


Дан отрезок из двух точек А и В (у каждой точки есть координаты).

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

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

Помогите, пожалуйста, а то ничего в голову не приходит. Если возможно, то нужен код
в java, если нет - дайте решение, а код напишу сам.
    


Ответы

Ответ 1



UPD (исходя из комментария @AnT): Возможно такое расположение точек и эллипса, при котором обе точки будут лежать вне эллипса, но пересечение будет (одно, в случае, когда прямая, проходящая через заданные точки будет касательной к эллипсу и два в остальных случаях). Этот случай в данном решении не рассмотрен. В общем случае придется-таки решать систему уравнений. Вариант, с помощью которого не нужно решать уравнения (без использования численных методов): Пусть задан эллипс: (x-x0)^2/a^2 + (y-y0)^2/b^2 = 1 , где: (x0;y0) – координаты центра эллипса; a и b – длины большой и малой полуосей соответственно. и отрезок AB, где A(x1;y1) и B(x2;y2). Для того, чтобы отрезок AB пересекал заданный эллипс, необходимо и достаточно, чтобы была верна одна из систем неравенств: (x1-x0)^2/a^2 + (y1-y0)^2/b^2 < 1 (x2-x0)^2/a^2 + (y2-y0)^2/b^2 > 1 (случай, когда точка A лежит внутри эллипса, а B – вне его); (x1-x0)^2/a^2 + (y1-y0)^2/b^2 > 1 (x2-x0)^2/a^2 + (y2-y0)^2/b^2 < 1 (случай, когда точка A лежит вне эллипса, а B – внутри его). Если интересует случай с принадлежностью точек дуге эллипса, то в вышеприведенных системах неравенства будут нестрогие.

Ответ 2



Из геометрии- две линии пересекаются, если для системы уравнений, описывающей эти линии, существует решение создаем систему уравнений из 2х прямая = (x-xa)/(xb-xa)=(y-ya)/(yb-ya) уравнение эллипса необходимо выбирать максимально вам подходящее, после чего в обоих уравнениях выражаете y и решаете систему для канонического уравнения эллипса (оси эллипса совпадают с осями координат) (x^2/a^2+y^2/b^2=1) прямая y=((x-xa)*(yb-ya))/(xb-xa)+ya эллипс y=+-sqrt((1/b^2)-(x^2/a^2*b^2)) далее подставляем все известные данные и получаем или не получаем точку, если получили - есть пересечение, не получили = нет

Ответ 3



Любой эллипс является ни чем иным, как "растянутой" (или, если хотите, "сплюснутой") окружностью. Достаточно построить преобразование координат, которое превратит исходный эллипс в произвольную окружность ненулевого радиуса, и задача сведется к определению факта пересечения отрезка с окружностью. (Понятно, что такое преобразование координат переведет отрезок в отрезок.) Из приведенного условия можно неявно заключить, что речь идет не о произвольном эллипсе, а об эллипсе, оси которого параллельны осям координат. (Кстати, почему этого не сказано явно в условии?). В такой ситуации требуемое преобразование строится элементарно - это просто домножение одной из координат на коэффициент a/b - соотношение длин осей эллипса. Тем самым мы сводим задачу к задаче о пересечении отрезка и окружности. Задача пресечения отрезка с окружностью решается просто. Достаточно вычислить координаты концов хорды, "отсекаемой" прямой, содержащей наш отрезок (если таковая хорда существует). Положение концов отрезка относительно концов хорды сразу же скажет нам, пересекает ли наш отрезок данную окружность (и, если надо, даст нам координаты точек пересечения). Обратное преобразование координат даст нам координаты точек пересечения с исходным эллипсом (если они нас интересуют).

Маска ввода телефона из нескольких input

#javascript #jquery


Как организовать такую маску ввода?



Не могу найти готовое решение...
    


Ответы

Ответ 1



let parts = Array.from(document.querySelectorAll('[data-type="number"]')).sort((a, b) => +a.dataset.order > +b.dataset.order), data = [ /^\+\d$/, /^\d{3}$/, [/^\d{3}\-\d\d\-\d\d$/, v => /^(\d{3})\-$/.test(v) ? RegExp.$1 : v.replace(/-/g, '').replace(/((?:^\d\d\d(?!-)|\d\d(?!$)))/g, "$1-")] ]; parts.forEach(e => e.addEventListener('input', check)); function check(){ let id = +this.dataset.order; let regexp = Array.isArray(data[id]) ? data[id][0] : data[id], formatter = Array.isArray(data[id]) && data[id][1] ? data[id][1] : null; if(this.value.trim() === '') if(parts[id - 1]) parts[--id].focus(); if(formatter !== null){ this.value = formatter(this.value); } if(regexp.test(this.value)){ if(parts[id + 1]) parts[++id].focus(); } } input[placeholder]{text-align: center;} input::-webkit-input-placeholder{opacity: 1; transition: opacity 0.3s ease;} input:focus::-webkit-input-placeholder{opacity: 0; transition: opacity 0.3s ease;} input:focus{outline: none;}

Ответ 2



Попробуйте так: var code = document.getElementById('code'); var country = document.getElementById('country'); var number = document.getElementById('number'); countryHandler = function() { var text = document.getElementById('country').value; if(text.length > 1 && text[0] =='+'){ code.focus(); } }; codeHandler = function() { var text = document.getElementById('code').value; if(text.length > 2){ number.focus(); } }; numberHandler = function() { var text = document.getElementById('number').value; if(text.length > 6){ //code.focus(); number.blur(); } }; country.oninput = countryHandler; country.onpropertychange = country.oninput; code.oninput = codeHandler; code.onpropertychange = code.oninput; number.oninput = numberHandler; number.onpropertychange = number.oninput;
Тут конечно не учтены все условия, но думаю там понятно что нужно делать дальше.

Ответ 3



Рекомендую легковесное решение на чистом javascript - https://github.com/BankFacil/vanilla-masker Подключение скрипта: Использование в Вашем случае: ... Общая демка из исходников: http://bankfacil.github.io/vanilla-masker/demo.html И код общей демки из исходников: https://github.com/BankFacil/vanilla-masker/blob/master/public/index.html

Ответ 4



JQuery Mask plugin - в конце body добавьте

Какое отличие между std::move и приведением к (T&&)?

#cpp #cpp11


Скажите, в чем разница если написать T&& вместо std::move?
Вот код:

template
void swap(T &a, T& b)
{
    T t{ std::move(a) };
    a = (T &&)(b);
    b = std::move(t);
}


В данном случае так же будет вызван перемещающий оператор = (во всяком случае эффект
тот же что и от std::move). Скажите, в чем отличие от варианта строкой ниже с std::move?
    


Ответы

Ответ 1



Согласно Стандарту языка шаблонная функция std::move(T&& t) возвращает: static_­cast&&>(t) Т.е. пока шаблонная функция имеет T& в сигнатуре - разницы Вы не увидите. Но если функция будет принимать T&& аргумент, то результат уже будет иной: #include #include template void fr(T& a) { std::cout << "& " << std::is_same_v << "\n"; } template void frr(T&& a) { std::cout << "&& " << std::is_same_v << "\n"; } int main() { int i = 42; fr(i); frr(i); } Вывод: & 1 && 0 Происходит это потому, что для frr тип T выводится как int&, и запись вида T&& превращается в int&&&, что в свою очередь снова даёт int&, а не int&&. Мой код использует конструкции из c++17, поэтому если нужно, чтобы он собирался в c++11 надо заменить std::is_same_v на std::is_same::value.

Ошибка Json при обращении к vk: JSONDecodeError: Expecting value: line 1 column 1 (char 0)

#python #json #vkontakte_api


Код:

import requests
result = requests.get('https://vk.com/dev/users.get',params={'user_ids':1})
print(result.json())


Вывод:

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)


В чем проблема?
    


Ответы

Ответ 1



Вы выполняете запрос не в API, а на страницу документации. Запрос в API выглядит примерно так: https://api.vk.com/method/users.get?user_id=210700286&v=5.52 Ответ: { "response": [ { "id": 210700286, "first_name": "Lindsey", "last_name": "Stirling" } ] }

ArrayList не клонируется

#java #arraylist


Здравствуйте, 

Пытаюсь клонировать ArrayList со всеми переменными. В итоге изменяю значения градусов
в новом листе. И автоматически изменяются данные в старом листе. Хотя использую пример,
в котором данные старого листа должны остаться неизменными.

ArrayList celsius = new ArrayList();
ArrayList fareng = (ArrayList) celsius.clone();

for(HeatSensor h: fareng) { 
    double far = h.getCelsius();
    far = 9*far/5 + 32;

    h.setCelsius(far);

    System.out.println(h.toString());
}


Чтобы было понятнее, вот что выводится на экран:

================celsius============================  
Heat : 70.0, 1/02/2017  
Heat : 30.0, 1/02/2017  
Heat : 35.0, 3/02/2017  

================fahrenheit==========================  
Heat : 158.0, 1/02/2017  
Heat : 86.0, 1/02/2017  
Heat : 95.0, 3/02/2017  

================celsius============================    
Heat : 158.0, 1/02/2017   
Heat : 86.0, 1/02/2017    
Heat : 95.0, 3/02/2017    


Так же имеется другой вопрос относительно этой же программы.
найти максимальное значение в ArrayList
    


Ответы

Ответ 1



Метод clone определен в ArrayList как копирование ссылок элементов. public Object clone() { try { ArrayList v = (ArrayList) super.clone(); v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(e); } } Таким образом, элементы равны с точностью до ссылки celsius.get(i) == fareng.get(i) для любого i, и при изменении элемента в одном списке вы измените его же в другом списке. Для решения вашего вопроса нужно воспользоваться глубоким копированием, то есть сделать дополнительно и копии самих элементов. for (HeatSensor h : celsius) { fareng.add(h.clone()); } P.S. в разработке не рекомендуется использовать метод clone. Он считается плохим дизайном в приложении. Вам стоит воспользоваться копированием через конструктор. List fareng = new ArrayList<>(celsius.size()); for (HeatSensor h : celsius) { fareng.add(new HeatSensor(h)); } И сам конструктор: public HeatSensor(HeatSensor another) { this.celsius = another.celsius; // и так далее по аналогии }

Ответ 2



Реализуйте метод clone() в классе HeatSensor и клонируйте списки следующим образом: ArrayList celsius = new ArrayList<>(); ArrayList fareng = new ArrayList<>(); for (HeatSensor h : celsius) fareng.add(h.clone()); Ваш вариант не работает, т.к. клонируются списки, но объекты остаются одни и те же.

Разница get; set;

#c_sharp #c_sharp_faq


Не совсем понял разницу между  

public object Variable1 {get; set; } 


и  

public object Variable1
{
    get { return this.Variable1; }  
    set {this.Variable1 = value; }   
}


В обоих случаях это свойство. Отличается ли не обработанные геттер и сеттер от обработанных
таким образом?
    


Ответы

Ответ 1



В том виде, который привели вы, разница в том, что первый пример кода корректный, а второй - нет :) У вас во втором случае чтение свойства возвращает это же свойство, что приводит к возврату этого же свойства - и так до бесконечности. Как заметили в комментариях, это бесконечная рекурсия. Вероятно, вы имели в виду вот это: private object field1; public object Variable1 { get { return field1; } set { field1 = value; } } Вот в этом случае разницы нет, public object Variable1 {get; set; } - это автоматически реализуемое свойство, по смыслу - абсолютно тоже самое.

Приведение к одной высоте блоков с разным количеством текста

#javascript #jquery #css #css3 #вёрстка


Доброго времени суток. Есть вот это:



#wrapper {
  border: 1px solid black;
  margin: auto;
  width: 70%;
  text-align: center;
}

.block {
  margin: 10px;
  text-align: center;
  width: 140px;
  display: inline-block;
  border: 1px solid black;
}

.block img {
  width: 140px;
}

Какой-то очень очень очень очень очень очень очень очень длинный текст

Какой-то очень очень очень очень очень

акой-то очень очень очень очень очень очень оч

ой-то очень очень очен

акой-то очень очень очень очень очень очень очакой-то очень очень очень очень очень очень оч

очень очень очен очень очень очен

В каждом блоке есть картинка и текст под ней. Однако в каждом блоке текст может быть разной длины (в разумных пределах, разумеется). Тем не менее получается, что картинки пляшут (смотри пример выше). Ах да, стоит ещё отметить, что количество таких блоков в ряд зависит от ширины экрана. Было бы замечательно, если бы высота блоков автоматически регулировалась и имела везде одну высоту. Ввиду недостаточного опыта я представляю себе только два варианта: сделать все блоки какой-то одной максимальной ширины (но этот вариант мне не сильно нравится, т.к. может статься так, что все блоки будут иметь мало текста) или применить js, который перебирает все h4, находит максимальную высоту h4 и применяет её ко всем h4 (смотри ниже) max = null; jQuery(".block h4").each(function(i) { v = $(this).height(); if (max < v) { max = v; } }); jQuery(".block h4").css('height', max + 'px'); Может есть какой-то другой вариант о котором не подозреваю?


Ответы

Ответ 1



#wrapper{ display: flex; flex-flow: row wrap; justify-content: space-around; } .block{ width: 200px; flex-flow: row wrap; border: 1px solid #888; } .block img { width: 140px; height: 140px; }

Какой-то очень очень очень очень очень очень очень очень длинный текст

Какой-то очень очень очень очень очень

акой-то очень очень очень очень очень очень оч

ой-то очень очень очен

акой-то очень очень очень очень очень очень очакой-то очень очень очень очень очень очень оч

очень очень очен очень очень очен



Удалить конкретное activity из стека

#android #activity #stack


Как удалить конкретное activity из стека? вот пример, есть  activty A,B,C, пользователь
переходит A->B->C, и в activty C в определенных условиях, 


надо вернуться назад(activty B) (делаю finish)
надо вернуться назад(сразу в activty A минуя activty B, при этом не пересоздавая
activty A, как это сделать?)


//делаю так, он пересоздает activty  A

Intent intent = new Intent(this, A);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

    


Ответы

Ответ 1



Городить код с запуском активити через onActivityResult() - нерационально. Следует назначить активити А android:launchMode="singleTask". И запустив startActivity(new Intent(this, A) активити А вытащится из стека не пересоздаваясь, попутно закрыв верхние активити.

Ответ 2



Ответ на вопросы: Что бы вернуться с активити С на В, ты все делаешь правильно, просто вызываешь finish() у активити С. Что бы вернуться с С на А нужно немного добавить логики. Когда запускаешь активити С, делай это через: startActivtyForResult(new Intent(this, C.class), 1234) При завершении С, перед вызовом finish(), в обратный интент кинь флаг нужно ли завершиться активити В или нет: Intent answerIntent = new Intent(); Bundle bundle = new Bundle(); bundle.putBoolean("need_finish", true); answerIntent.putExtras(bundle); setResult(RESULT_OK, answerIntent); Активити В обрабатывает метод onActivityResult. Если флаг true, то тоже вызываешь finish() у В : onActivityResult(int requestCode, int resultCode, Intent data){ if (requestCode == 1234 && data != null) { if (data.getBoolean("need_finish", true)) { finish(); } } }

Преобразование содержимого select в background

#javascript #jquery


Итак. Имеем вот такой скрипт превращения выпадающего списка в маркированный.



jQuery.fn.selecttolist = function(options) {
    return this.each(function() {
        var select = $(this);
        select.hide();
        var buttonsHtml = $('
'); var selectIndex = 0; var addOptGroup = function(optGroup) { if (optGroup.attr('label')) { buttonsHtml.append('' + optGroup.attr('label') + ''); } var ulHtml = $('
    '); optGroup.children('option').each(function() { var liHtml = $('
  • '); if ($(this).attr('disabled') || select.attr('disabled')) { liHtml.addClass('disabled'); liHtml.append('' + $(this).html() + ''); } else { liHtml.append('' + $(this).html() + ''); } if ((!options || !options.noDefault) && select.attr("selectedIndex") == selectIndex) { liHtml.children('a, span').addClass('picked'); } ulHtml.append(liHtml); selectIndex++; }); buttonsHtml.append(ulHtml); } var optGroups = select.children('optgroup'); if (optGroups.length == 0) { addOptGroup(select); } else { optGroups.each(function() { addOptGroup($(this)); }); } select.after(buttonsHtml); buttonsHtml.find('a').click(function(e) { e.preventDefault(); buttonsHtml.find('a, span').removeClass('picked'); $(this).addClass('picked'); $(select.find('option')[$(this).attr('data-select-index')]).attr('selected', 'selected'); select.trigger('change'); }); }); }; $('select').selecttolist(); $('li:first-child').children().addClass('picked'); body, ul { margin: 0; padding: 0; } ul { display: flex; flex-wrap: wrap; list-style: none; } a { display: block; color: #333; text-decoration: none; padding: 10px; } div { padding: 30px; } a:hover, .picked { background: #eee; } Вопрос такой. Возможно ли приделать к данному решению проверку содержимого опций селектора и заполнения фона блоков найденым значением. Пробую 2 варианта. 1-й. Когда проверяется содержимое опции по первому символу и количеству символов. Например, в таком виде опции: , если первый символ #, а всего символов 7, то вставляем этот хеш в background ссылки созданного выпадающего списка. 2-й. Создать файл с заданными значениями вот такого вида: jQuery.fn.selecttolist.init({ colors: { 'Черный': '#000000', 'Красный': '#FF0000', 'Белый': '#FFFFFF', 'Серый': '#CCCCCC', 'Полоска': 'url(/images/poloska.png) no-repeat center center', 'Кружок': 'url(/images/krug.png) no-repeat center center' }, hideColorsTitle: true }); И при совпадении содержимого опции с заданными значениями из списка, подставлять это значение в background ссылки созданного маркированного списка. Что хотелось бы получить: Буду благодарен за любую помощь ибо сам уже замучился с данной задачей.


Ответы

Ответ 1



jQuery.fn.selecttolist = function(options) { return this.each(function() { var select = $(this); select.hide(); var buttonsHtml = $('
'); var selectIndex = 0; var addOptGroup = function(optGroup) { if (optGroup.attr('label')) { buttonsHtml.append('' + optGroup.attr('label') + ''); } var ulHtml = $('
    '); optGroup.children('option').each(function() { var liHtml = $('
  • '); if ($(this).attr('disabled') || select.attr('disabled')) { liHtml.addClass('disabled'); liHtml.append('' + $(this).html() + ''); } else { var content = $(this).html(); var style = ""; if (/#[0-9a-fA-F]{6}/.test(content)) { // is css-color style = "background: " + content; } else if (content in options.colors) { // is predefined background style = "background: " + options.colors[content]; } liHtml.append('' + $(this).html() + ''); } if ((!options || !options.noDefault) && select.attr("selectedIndex") == selectIndex) { liHtml.children('a, span').addClass('picked'); } ulHtml.append(liHtml); selectIndex++; }); buttonsHtml.append(ulHtml); } var optGroups = select.children('optgroup'); if (optGroups.length == 0) { addOptGroup(select); } else { optGroups.each(function() { addOptGroup($(this)); }); } select.after(buttonsHtml); buttonsHtml.find('a').click(function(e) { e.preventDefault(); buttonsHtml.find('a, span').removeClass('picked'); $(this).addClass('picked'); $(select.find('option')[$(this).attr('data-select-index')]).attr('selected', 'selected'); select.trigger('change'); }); }); }; $('select').selecttolist({ colors: { 'Черный': '#000000', 'Красный': '#FF0000', 'Белый': '#FFFFFF', 'Серый': '#CCCCCC', 'Полоска': 'url(/images/poloska.png) no-repeat center center', 'Кружок': 'url(/images/krug.png) no-repeat center center' }, hideColorsTitle: true }); $('li:first-child').children().addClass('picked'); body, ul { margin: 0; padding: 0; } ul { display: flex; flex-wrap: wrap; list-style: none; } a { display: block; color: #333; text-decoration: none; padding: 10px; } div { padding: 30px; } a:hover, .picked { background: #eee; }

    Ответ 2



    Проверять значение option на наличие HEX. /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(str) https://jsfiddle.net/t98x3urp/ И в случае нахождения цвета менять background: var val = $(this).html(), style = ''; if (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(val)) { style = ' style="background: ' + val + ';"' } if ($(this).attr('disabled') || select.attr('disabled')) { liHtml.addClass('disabled'); liHtml.append('' + $(this).html() + ''); } else { liHtml.append('' + $(this).html() + ''); } Полный код - https://jsfiddle.net/bjqxqraq/ Таким же образом можно проверять background-image. И показывать значение или только стили: liHtml.append('' + (style !== '' ? $(this).html() : '') + '');

Перегрузка оператора [дубликат]

#cpp


        
             
                
                    
                        
                            На этот вопрос уже дан ответ здесь:
                            
                        
                    
                
                        
                            Перегрузка оператора “+”
                                
                                    (1 ответ)
                                
                        
                                Закрыт 2 года назад.
            
                    
Не могу разобраться с перегрузкой оператора+. Хочу осуществить возможность к объекту
класса (fraction) добавлять число:

fraction fr(1,5);
int x = num;

fraction result;
result = x + fr;

    


Ответы

Ответ 1



Текущий инстанс: fraction& operator+=(int value) { this->... += value; return *this; } Новый инстанс: fraction operator+(int value) const { return fraction(...); } friend fraction operator+(int value, fraction const& f) { return fraction( value + f./*someoneDataMember*/); /* return ( f + value );*/ }

Ответ 2



Примерно так: class fraction{ int value_; public: fraction(int v): value_{v} { } const fraction& operator += (int lhs){ value_ += lhs; return *this; } fraction operator + (int lhs) const{ fraction tmp(value_); tmp += lhs; return tmp; } } Можно немного проще: ... fraction operator + (int lhs) const{ return fraction (value_ + lhs); } ... Это если реализация простая, в общем случае предпочтительно реализовывать + через += для устранения лишнего дублирования кода.

Правильно ли объявлять много переменных в одном классе?

#java #ооп


Допустим работа осуществляется в доп.потоке, при сворачивании приложения и разворачивании
приложения, поток убивается и создается новый. (т.к. поток не сразу останавливается,
как я понял, рекомендуется создавать новый поток). Если переменные объявлены в потоке,
при создании нового экземпляра потока, они потеряются. Если вывести объявление переменных
в Main класс он нагромождается. Мне интересно влияет ли на производительность объявление
большого числа переменных в одном классе. Это раз. Для визуальной красоты, для хранения
переменных может быть создан отдельный класс, правильно ли так поступать? Хочется знать,
учитывая все тонкости, какой подход используют хорошие программисты. Может тот вариант,
который я описал нормальный и ничего другого не надо придумывать. 
    


Ответы

Ответ 1



Мой ответ будет очень неоднозначный и субъективный. Если в класс много переменных то это уже не правильный класс. А неправильный он скорее всего из-за неправильно архитектуры. Хранить всё в Main плохо. Большое количество переменных в классе влияет на производительность если часто работать с объектами этого класса. То есть создавать, удалять, клонировать и чем больше переменных тем сложнее это делать. То что ты называешь хранения переменных может быть создан отдельный класс это называется паттерн(тебе уже дали ссылку на них) Value Object. Рефакторь архитектуру, в правильной у тебя не должно возникать подобных проблем. @Turalllb MVC это не паттерн, а концепция и отношение к этому вопросу она не имеет. Вы не правильно используете потоки. Поток в программе не должен выполнять какие то другие функции программы, а должен асинхронно выполнять функции основной программы.

Ответ 2



Steve McConnell в своей книге Code Complete 1993-го года рекомендовал использовать около 7 методов на класс. При этом количество строк в каждом методе должно быть таким, чтобы они помещались на экране без использования прокрутки. Источник: https://stackoverflow.com/a/312650/872294 В последствии эти и другие рекомендации были включены в "линтеры" (linters) - программы, проверяющие качество кода. Линтеры часто используются в составе интегрированных средств разработки (IDE), которые просто не дают программисту писать слишком плохой код. Поэтому сейчас более актуален совет от Linus Torvalds: чтобы отличить плохого программиста от хорошего, спросите у него, что он считает более важным: стиль кода или структуры данных Источник: https://softwareengineering.stackexchange.com/questions/163185/torvalds-quote-about-good-programmer