Страницы

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

четверг, 6 июня 2019 г.

Правильное масштабирование фона

Не могу найти правильное решение моей задачи. нужно относительно размера масштабировать картинку фона(т.е. что бы хотя бы раз она была в полном размере). для картинок размер которых больше экрана можно использовать background-size: 100% auto; но если картинка меньше экрана, то она просто растягивается. а мне этого не нужно. как это можно сделать средствами css?


Ответ

Попробую объяснить на пальцах. (тут можно потрогать руками рабочий пример)
Если написать вот так:
.demo { background-image: url(cat.png); background-position: 50% 50%; background-repeat: no-repeat; }
Мы передадим такие пожелания браузеру:
Вставь на фон блока с классом "demo" картинку с котиком Размести ее, по возможности, в центре этого блока Не надо использовать свойство "замостить", если фоновая картинка меньше этого блока
Немного уточним пожелания:
.first { background-size: 100px 100px; }
Хочу, чтобы фоновое изображение было 100 на 100 пикселей; масштабировать не надо; пропорции сохранять не надо

Попробуем иначе:
.second { background-size: contain; }
Хочу, чтобы фоновое изображение заняло максимальную область блока, при которой сохранит свои пропорции и будет видно целиком

И последний вариант:
.third { background-size: cover; }
Хочу, чтобы фоновое изображение закрыло блок целиком, оно не обязательно должно быть видно целиком, главное, чтобы сохранились пропорции
Поскольку мы в самом начале указывали расположение фонового изображения в центре блока, в первую очередь будет видна центральная часть изображения. Это можно изменить с помощью свойства background-position
Что в итоге получится (первый, второй и третий примеры один под одним):

Как по другому выполнить запрос в Oracle?

Есть две таблицы - А и В. create table a ( KEY1 number );
create table b ( KEY2 number, KEY3 number ); Нужно проверить, что для каждой записи таблицы А нет записей в таблице B по условию A.KEY1 = B.KEY2. Если же записи есть, то для каждой такой записи таблицы В проверить что нет записей в таблице А по условию В.KEY3 = A.KEY1. Реализовал так: SELECT * FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.KEY1 = B.KEY2 AND B.KEY3 NOT IN (SELECT KEY1 FROM A)) Есть другие варианты выполнить этот же запрос?


Ответ

select * from A where key1 not in(select key2 from B) union all ( select * from A where key1 in(select key2 from B) intersect select * from a where key1 not in(select key3 from b) )

Темизация таксономии Drupal 6

Как переопределить стандартный шаблон вывода таксономии в Drupal 6 (везде натыкаюсь только на howto для 7 версии).


Ответ

также добавлю , что шаблон node-taxonomy.tpl.php по умолчанию не определен - его надо определить в файле template.php вашей темы function ИМЯТЕМЫ_preprocess_node(&$vars) { if(arg(0) == 'taxonomy'){ $suggestions = array('node-taxonomy'); $vars['template_files'] = array_merge($vars['template_files'], $suggestions); } }

Извлечение случайного значения из массива в Visual Basic 2010

Начал изучать Visual Basic и столкнулся с проблемой. Нужно сделать символьный массив и получить случайное значение из этого массива в переменную. Я только начал изучать Visual Basic, но на php это бы выглядело как: $mass = array("lalka", "fsdfsd546", "heyt");//массив с названием $mass $per = array_rand($mass, 1);//Извлекаю из этого массива одно значение в переменную echo ($per);//Вывожу сообщение Прошу написать как этот код будет выглядеть в Visual Basic.


Ответ

Поймите: Visual Basic и VB.NET - практически одно и тоже (синтаксис очень схож), отличие в том, что VB.NET[Visual Basic .NET] работает на платформе .NET Framework. Вы просите код на "Visual Basic 2010". Ппрактически, это он и есть, этот код будет работать и в "Visual Basic 2008", "Visual Basic 2005", и даже в "VS Express 2013 for Desktop"(который содержит Visual Basic). Почитайте спецификацию и определение Visual Basic 6/VB.NET/.NET Framework. Повторюсь, лучше учите C# (тоже на платформе .NET Framework)! Сама функция: Public Function RandomWord() ' Случайное число Dim rnd As New Random() ' Ваш массив: Dim massive() As String = {"lalka", "fsdfsd546", "heyt"} ' Случайное число, ограниченное количеством строк массива Dim random As Integer = rnd.Next(massive.Length) ' Вернуть результат: Return massive(random) End Function Затем используйте функцию, функция возвращает string: Dim randomword As String = RandomWord() И делайте вывод при помощи MessageBox.Show(randomword), Console.WriteLine(randomword) или другими

В терминале не выводится строка перед длительной операцией

Работаю в Ubuntu 14.04 x86, Sublime Text 2 + терминал
Странность высветилась во время вывода строки перед длительной операцией. Я использовал выделение большого кол-ва памяти:
MyType* type; long int MyNumber = 3000000;
cout << "Initialization... "; MyType* type = new MyType[MyNumber]; cout << "Done! << endl;
По всей логике вывод терминала должен быть следующим:
Initialization...*пауза* Done!
Но по какой-то причине пауза проходит вначале, а две строки выводятся одновременно.
*пауза* Initialization... Done!
После добавления к выводу первой строки команды endl первая надпись срабатывает так, как нужно.
Initialization... *пауза* Done!
Что за особенность работы терминала такая?


Ответ

Это не особенность терминала, а свойство всех буферизированных потоков вывода. Пока не будет вызван метод flush(), или в поток не попадёт
- данные из буфера не будут переданы на устройство.

Остановить сервис через некоторое время после его старта

Как остановить сервис через некоторое время после его старта. Допустим, служба проработала минуту, теперь надо её убить.


Ответ

Попробуйте так: то, что вы напишите в "run" исполнится через количество миллисекунд, заданных числом в конце метода. final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { // Сделать что-то чрез 60с = 60 000мс //Тут останавливать сервис context.stopService(new Intent(context, Service.class)); } }, 60000); Соответственно поместите этот кусок кода в метод, коий запускается при старте сервиса.

Конструкторы и операторы копирования

Могу ли я записать конструктор копирования через оператор присваивания? Например вот так: A::A(const A * a) { *this = a; }
A &A::operator=(const A * a) { delete str; str = new char[strlen(a->str)+1]; strcpy(str, a->str); return *this;
} Еще хочется уточнить, правильно ли если я делаю A * a в примере выше, потому примеры с разных сайтов A & a. C этого всплывает вопрос, что должен возвращать оператор присваивание: A &A::operator=(const A * a) или A * A::operator=(const A * a) Вообщем правильный ли мой код выше? Объект класса создается так A * a = new A();


Ответ

Конструктор копирования можно написать через оператор присваивания, не вопрос. Только то, что вы пишете — это не конструктор копирования и не оператор присваивания. Для них аргументом является экземпляр класса, а не указатель на него. Код неправильный ещё и по другой причине: вы не учитываете случай копирования объекта в себя Сигнатура конструктора копирования обязана быть A(A& a) или A(const A& a) (есть ещё немного экзотических возможностей, вот документация), всё остальное, в частности, то, что у вас — не конструктор копирования. Сигнатура оператора копирующего присваивания (а начиная с C++11 возможен и перемещающий) обязана быть A& operator= (A a) или A& operator= (const A& a) (документация), всё остальное — не оператор копирующего присваивания. В частности, у вас просто конструктор из стороннего типа, и оператор присваивания значения стороннего типа. Указатель на A для A — сторонний тип.