Страницы

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

вторник, 8 января 2019 г.

Неправильное сравнение дат в SQLite

В бд есть столбец DATE где дата хранится в формате dd.mm.yyyy. Пытаюсь таким запросом: DELETE FROM PRODUCTS WHERE DATE <= date('now','-30 day') удалить все строки старше 30 дней, но удаляются все строки. Что не так?


Ответ

В SQLite нет "настоящего" типа данных DATE - данные типа DATE/TIME могут храниться в одном из следующих видов:
строк/text (обычно используют ISO8601: "YYYY-MM-DD HH:MM:SS.SSS") целых чисел (UNIX epoch - число секунд прошедших с 1970-01-01 00:00:00 UTC) вещественных чисел (as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar).
Соответственно, при использовании строк при сравнении будет использоваться лексикографическое сравнение. Например, "2" > "1999999", т.к. первый символ первой строки (двойка) больше единицы, первого символа во второй строке.
Это одна из причин почему в SQLite надо хранить дату/время только в одном из следующих форматов
YYYY-MM-DD YYYY-MM-DD HH:MM YYYY-MM-DD HH:MM:SS YYYY-MM-DD HH:MM:SS.SSS YYYY-MM-DDTHH:MM YYYY-MM-DDTHH:MM:SS YYYY-MM-DDTHH:MM:SS.SSS HH:MM HH:MM:SS HH:MM:SS.SSS now DDDDDDDDDD
Вывод: если вам нужен другой формат даты, то форматируйте его только для вывода, но не для хранения.

Как реализовать Анимацию выделения сектора окружности цветом от 0 до 360 градусов

Образно, процесс можно проиллюстрировать на примере стрелочных часов: одна стрелка неподвижна, другая двигается до определённого значения и пространство между ними заполняется цветом (стрелок при этом нет, это просто образная визуализация границ).


Ответ

CSS решение
Все стили перенес в css и анимация сделана с помощью правил css
.container { width:25%; height:25% } #crc { fill:none; stroke:green; stroke-width:100; stroke-dashoffset:314; stroke-dasharray:314; animation: draw 10s ease-out infinite forwards; } @keyframes draw { from { stroke-dashoffset: 314; } to { stroke-dashoffset: 0; } }


Приложение полностью адаптивно, так же как вариант решения SVG
Работает во всех современных браузерах, кроме IE, который не понимает анимацию по определению.

Несколько EditText с одинаковым ID

В LinearLayout циклом добавляется фрагмент, укомплектованный в другом .xml файле. Фрагмент содержит три EditText.
Задача: достать текст из каждого первого/второго/третьего EditText во всех фрагментах.
Помогите, пожалуйста.


Ответ

В цикле бежите по View которые внутри LinearLayout, достаёте фрагмент, а у него обращаетесь к editText
LinearLayout linearLayout = initLayout(); int count = linearLayout.getChildCount(); Fragment f = null; String reduce = ""; for(int i=0; i

Как правильно сделать такой эффект в пагинации?

Как сделать такую анимацию пагинации перемещения точек элементов между числами 01, 02 , 03 , 04 ?
.paination { display:flex; }



Ответ

Как было сказано в комментариях, подобный эффект можно сделать на HTML+CSS. (эффект работает при hover'e). Пример на Codepen с использованием цикла для генерации transform-delay in SCSS Update: Исправлена анимация.
var btn = document.getElementById("toggle"); var px = document.getElementsByClassName("px"); btn.onclick = function() { Array.from(px).forEach(function(el) { el.classList.add("offset"); }); } * { margin: 0; padding: 0; } #toggle { background: crimson; border: none; outline: none; border-radius: 0.2rem; color: white; padding: 0.70rem 0.75rem; margin: 0.5rem 1rem; cursor: pointer; box-shadow: 2px 2px 2px gray; transition: 0.2s; text-transform: uppercase; } #toggle:active { box-shadow: none; } .line { margin: 1rem; } .offset { transform: translateX(50px); } .px { width: 1px; height: 1px; background-color: #000; } .px:nth-child(1) { transition: ease-in-out 0.4s; } .px:nth-child(2) { transition: ease-in-out 0.6s; } .px:nth-child(3) { transition: ease-in-out 0.5s; } .px:nth-child(4) { transition: ease-in-out 0.6s; } .px:nth-child(5) { transition: ease-in-out 0.58s; } .px:nth-child(6) { transition: ease-in-out 0.56s; } .px:nth-child(7) { transition: ease-in-out 0.58s; } .px:nth-child(8) { transition: ease-in-out 0.6s; } .px:nth-child(9) { transition: ease-in-out 0.5s; } .px:nth-child(10) { transition: ease-in-out 0.45s; } .px:nth-child(11) { transition: ease-in-out 0.6s; } .px:nth-child(12) { transition: ease-in-out 0.6s; } .px:nth-child(13) { transition: ease-in-out 0.43s; } .px:nth-child(14) { transition: ease-in-out 0.44s; } .px:nth-child(15) { transition: ease-in-out 0.59s; } .px:nth-child(16) { transition: ease-in-out 0.54s; } .px:nth-child(17) { transition: ease-in-out 0.56s; } .px:nth-child(18) { transition: ease-in-out 0.52s; } .px:nth-child(19) { transition: ease-in-out 0.5s; } .px:nth-child(20) { transition: ease-in-out 0.56s; } .px:nth-child(21) { transition: ease-in-out 0.6s; } .px:nth-child(22) { transition: ease-in-out 0.4s; } .px:nth-child(23) { transition: ease-in-out 0.52s; } .px:nth-child(24) { transition: ease-in-out 0.48s; } .px:nth-child(25) { transition: ease-in-out 0.46s; } .px:nth-child(26) { transition: ease-in-out 0.45s; } .px:nth-child(27) { transition: ease-in-out 0.52s; } .px:nth-child(28) { transition: ease-in-out 0.54s; } .px:nth-child(29) { transition: ease-in-out 0.55s; } .px:nth-child(30) { transition: ease-in-out 0.55s; } .px:nth-child(31) { transition: ease-in-out 0.5s; } .px:nth-child(32) { transition: ease-in-out 0.51s; } .px:nth-child(33) { transition: ease-in-out 0.6s; } .px:nth-child(34) { transition: ease-in-out 0.5s; } .px:nth-child(35) { transition: ease-in-out 0.6s; } .px:nth-child(36) { transition: ease-in-out 0.51s; } .px:nth-child(37) { transition: ease-in-out 0.52s; } .px:nth-child(38) { transition: ease-in-out 0.46s; } .px:nth-child(39) { transition: ease-in-out 0.45s; } .px:nth-child(40) { transition: ease-in-out 0.6s; }


Android, как сохранять данные без базы данных?

Только начала учить Android, пишу в Android Studio. Есть на уме идея для одной программы, но для этого мне надо научиться сохранять данные. Слышала, что использовать SqlLite нужно только при больших объемах памяти. Мне же, грубо говоря, нужно сохранять только имя пользователя и ещё какую-то общую информацию и выводить это в List. Как мне это сделать? Как правильно сохранять эти данные? В какой-то массив или отдельный файл?


Ответ

Для сохранения данных вы можете использовать SharedPreferences
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
Чтобы начать запись в файл настроек, вы должны вызвать метод edit() объекта SharedPreferences, который возвращает объект SharedPreferences.Editor.
SharedPreferences.Editor editor = sharedPreferences.edit();
Объект SharedPreferences.Editor имеет несколько интуитивных методов, которые можно использовать для хранения новых пар ключ-значение в файле настроек. Например, вы можете использовать метод putString(), чтобы поместить пару ключ-значение со значением типа String
editor.putString("name", "Danil"); editor.putInt("age", 20);
Чтобы сохранить записи вы должны вызвать метод commit()
editor.commit();
Чтение из объекта SharedPreferences гораздо проще. Всё, что вам нужно сделать, так это вызвать соответствующий метод get*()
String name = sharedPreferences.getString("name", "unknown"); int age = sharedPreferences.getInt("age", 0);

Запретить создавать новый Toast, если он уже отображается на экране

Вопрос совсем простой. Как контролировать кол-во выводов Toast.makeText?
Вчера тестировал свое приложение на группе студентов. Один из них воспроизвел странный для меня баг. Он нажал на кнопку много-много раз с его слов, после чего Toast.maketText в прямом смысле зациклился в стал выводить сообщение, даже после закрытия приложения. Как думаете, он просто забил очередь? И как можно обработать подобный случай?
Спасибо=)


Ответ

Можно сделать заплатку:
toastLenght = 2000 (для Toast.LENGTH_SHORT) или 3500 (для Toast.LENGTH_LONG);
if(!isToast) { Toast.makeText(...); isToast = true; new Handler().postDelayed(new Runnable() { @Override public void run() { isToast = false; } }, toastLenght); }

Почему ++$x работает быстрее, чем $x++?

Итак, давайте выполним 2 скрипта, и убедимся, что ++$x работает быстрее...
Скрипт-1:
#!/usr/bin/perl
my $x = 0;
foreach (1..5_000_000) { $x++; }

perl -d:NYTProf test.pl

nytprofhtml --open

Результат:

Скрипт-2:
#!/usr/bin/perl
my $x = 0;
foreach (1..5_000_000) { ++$x; }

perl -d:NYTProf test.pl

nytprofhtml --open

Результат:

Вопрос: Почему ++$x работает быстрее, чем $x++?


Ответ

++$x работает грубо говоря в два шага:
делаем $x + 1 передаем значение.
$x++ (присваиваемый) работает сложнее, его обычно нельзя реализовать без промежуточной копии:
сохраняем значение $x в $temp делаем $x + 1 передаем значение $temp
P.S.: Не присваиваемый $x++, в умных компиляторах/интерпретаторах, может не отличается от ++$x
P.P.S.: При сильных оптимизациях еще все зависит от прилегающих операций, и при использовании простых типов разница скорее всего вообще пропадет.

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

Есть класс FooBase у которого есть метод FunBase(). От этого класса через виртуальное наследование наследуются два класса FooA и FooB. В FooB метод FunBase() удаляется т. к. его там по логике программы быть не может. От этих двух классов наследуется класс FooEnd в котором метод FunBase() должен быть. Как изменить код так что бы у объекта FooEnd стал возможен вызов метода FunBase() без использования агрегации.
using std::cout; using std::endl;
class FooBase { public: void FunBase() { cout << "FunBase" << endl; } };
class FooA: virtual public FooBase { public: void FunA() { cout << "FunA" << endl; } };
class FooB: virtual public FooBase { public: void FunB() { cout << "FunB" << endl; } void FunBase() = delete;
};
class FooEnd: public FooA, public FooB { public: void FunEnd() { cout << "FunEnd" << endl; } };
int main() { FooEnd bat; bat.FunBase(); return 0; }
Под агрегациея я понимаю запись вида:
class FooEnd: public FooA, public FooB { public: void FunEnd() { cout << "FunEnd" << endl; } void FunBase() { FooBase::FunBase(); }; };


Ответ

Можно сделать так:
class FooB: virtual public FooBase { public: void FunB() { cout << "FunB" << endl; } protected: using FooBase::FunBase; };
class FooEnd: public FooA, public FooB { public: void FunEnd() { cout << "FunEnd" << endl; } using FooBase::FunBase; };
P.S. я считаю, что если появилось такое желание, то что-то не так в дизайне классов, поэтому рекомендую всё же подумать, как сделать это по-человечски.

Как обрезать background на css


Здравствуйте! Подскажите, как обрезать фон, как показано на изображении? сделал background цветом. Низ обрезал с помощью clip-pathа верх никак не выходит. Кто знает - помогите, пожалуйста!


Ответ

1 вариант:
*{ margin:0; padding:0; } .content{ width:100%; height:350px; margin:50px auto; background-color:yellow; position: relative; transform: skewY(3deg); } .content:before{ content:''; display: block; background:yellow; width:100%; height:350px; position: absolute; transform: skewY(-6deg); top:60px; }


2 вариант:
* { margin: 0; padding: 0; } .content { width: 100%; height: 350px; margin: 50px auto; background-color: yellow; position: relative; -webkit-clip-path: polygon(0 0, 100% 13%, 100% 84%, 0% 100%); clip-path: polygon(0 0, 100% 13%, 100% 84%, 0% 100%); }

По clip-path есть онлайн мейкер. Но тут зависит от поддержки браузеров, нужно это свойство вам или нет.

Можно ли увеличить лимит конструктора JAVA?

Код очень объемный, из-за чего столкнулся с лимитом: The code of constructor Window(String) is exceeding the 65535 bytes limit. Можно ли как-то увеличить этот лимит, если нет, то что делать в таком случае?


Ответ

Нет, этот лимит увеличить нельзя. Это ограничение виртуальной машины, закреплённое в спецификации
Размеры методов надо сокращать. Особенно конструкторов. И для этого всегда есть возможность. Вот что по этому поводу пишет авторитетный Роберт Мартин в своём знаменитом труде "Чистый код":
Первое правило: функции должны быть компактными. Второе правило: функции должны быть еще компактнее. Я не могу научно обосновать свое утверждение. Не ждите от меня ссылок на исследования, доказывающие, что очень маленькие функции лучше больших. Я могу всего лишь сказать, что я почти четыре десятилетия писал функции всевозможных размеров. Мне доводилось создавать кошмарных монстров в 3000 строк. Я написал бесчисленное множество функций длиной от 100 до 300 строк. И я писал функции от 20 до 30 строк. Мой практический опыт научил меня (ценой многих проб и ошибок), что функции должны быть очень маленькими. В 80-е годы считалось, что функция должна занимать не более одного экрана. Конечно, тогда экраны VT100 состояли из 24 строк и 80 столбцов, а редакторы использовали 4 строки для административных целей. В наши дни с мелким шрифтом на хорошем большом мониторе можно разместить 150 символов в строке и 100 и более строк на экране. Однако строки не должны состоять из 150 символов, а функции — из 100 строк. Желательно, чтобы длина функции не превышала 20 строк

Как выделить память для массива функций

class name { public: name(int); double(*act)(double);
double f1(double); double f2(double); double f3(double); };
name::name(int i) { this->act = new (double[i](double)); }
error: creating array of functions
Вот так ругается компилятор. Как можно реализовать такой динамический массив?


Ответ

Если говорить про обычные функции:
int foo1(float) { return 1; }
int foo2(float) { return 2; }
int foo3(float) { return 3; }
int main() { // в типе должна быть описана сигнатура необходимой функции using fun_type = int(*)(float); // int - возвращаемый тип // float - аргумент, (*) - означает что мы хотим создать указатель на функцию
// создали массив указателей на функции // поместили адреса фукций foo1, foo2, foo3 fun_type funs[] = { &foo1, &foo2, &foo3 };
// вызываем функцию (в данном случае foo1) int result = funs[0](10.0f);
return 0; }
Однако в вашем случае необходимы не просто указатели на функцию, а указатели на методы класса. Это другие сущности и, настолько они особенны, что даже не поддаются void*. Но такая проблема также решается:
class widget { public: // имеется несколько методов с одинаковой сигнатурой void foo1(int);
void foo2(int);
void foo3(int);
// внимание на модификатор const // объяснения ниже void foo4_c(int) const; };
int main() {
// объявление массива указателей на метод класса widget // как и в случае с обычным указателем, этот указатель // просто локальная переменная // эти указатели не относятся к какому-нибудь конкретному объекту // они относятся к классу widget в целом void(widget::*fun_ptr[3])(int);
// устанавливаем несколько конкретных значений // можно было при объявлении инициализировать списком {} fun_ptr[0] = &widget::foo1; fun_ptr[1] = &widget::foo2; fun_ptr[2] = &widget::foo3;
// по поводу const в объявлении метода: // const является часть сигнатуры метода! // поэтому следующий код не скомпилируется // по причине разных типов указателей // fun_ptr[2] = &widget::foo4_c; // error!
// для const-методов необходимо указать спецификатор const void(widget::*const_fun_ptr)(int) const;
const_fun_ptr = &widget::foo4_c; // ok!
// создается конкретный объект класса widget obj;
// и указатель на динамически распределенный объект widget *ptr_to_obj = new widget();
// собственно использование указателей // obj.* - обращение к члену указателю // т.к. fun_ptr массив мы указываем еще индекс // по которому находится нужный метод // необходимо взять в скобки (obj.*fun_ptr[0])(10);
// для указателей на объекты используется // чуть-чуть другой синтаксис (ptr_to_obj->*fun_ptr[0])(10);
delete ptr_to_obj; return 0; }
Создать динамический массив указателей на обычную функцию не слишком сложно.
using fptr = void(*)(int); fptr* fptrs = new fptr[10]; delete[] fptrs;
Чуть сложнее дело обстоит с указателями на методы. У меня получилось достичь необходимого результата следующим образом:
#include
class widget { public: void foo1(int) { std::cout << "foo1
"; }
void foo2(int) { std::cout << "foo2
"; }
void foo3(int) { std::cout << "foo3
"; } };
int main() { void(widget::*fptr)(int);
using fptr_type = decltype(fptr);
fptr_type* fptrs = new fptr_type[3];
fptrs[0] = &widget::foo1; fptrs[1] = &widget::foo2; fptrs[2] = &widget::foo3;
widget a;
(a.*fptrs[0])(10); (a.*fptrs[1])(10); (a.*fptrs[2])(10);
delete[] fptrs;
std::cin.get(); return 0; }

Поиск подстроки в строке с начала

Есть список городов.
При вводе данных в строку в списке должны остаться города, которые начинаются с вводимого значения. То есть если я пишу "аб" то у меня должен остаться только абакан, но не набережные челны
Балаково Абакан Архангельск Набережные челны
Попробовал вот так, но ищет currentdata по всей строке
str.toLowerCase().indexOf(currentdata.toLowerCase());
вот моя функция:
$('#test').keyup(function() { currenVal = $(this).val().toLowerCase(); $('ul.content>li').each(function(i, el) { if ($(el).text().toLowerCase().indexOf(currenVal) > -1) { $(el).removeClass('hidden'); } else { $(el).addClass('hidden'); } }) }) li.hidden { display: none; }

  • Абакан
  • Ангарск
  • Армавир
  • Архангельск
  • Астрахань
  • Балаково
  • Балашиха


Ответ

$('#test').keyup(function() { currenVal = $(this).val().toLowerCase(); $('ul.content>li').each(function(i, el) { if ($(el).text().toLowerCase().indexOf(currenVal) == 0) { $(el).removeClass('hidden'); } else { $(el).addClass('hidden'); } }) }) li.hidden { display: none; }

  • Абакан
  • Ангарск
  • Армавир
  • Архангельск
  • Астрахань
  • Балаково
  • Балашиха
  • Набережные чалны

indexOf возвращает индекс первого вхождения, если вам надо, чтобы поиск осуществлялся в начале строки, то над делать проверку на то равен ли indexOf нулю
let array = [ 'Балаково', 'Абакан', 'Архангельск', 'Набережные челны' ] let filter = 'аб'; //Поиск вхождения только в начале console.log(array.filter(x => x.toLowerCase().indexOf(filter.toLowerCase()) == 0)); //Поиск по любому вхождению console.log(array.filter(x => x.toLowerCase().indexOf(filter.toLowerCase()) >= 0));

Убрать второй или третий знак '!' в строке с помощью регулярного выражения. PHP

Всем привет! Есть строка$string = aaa!bbbb!ccccc!ddddd!eeeeee!ffffff!gggg!...и до бесконечности Мне нужно составить регулярное выражение, меняющее произвольный восклицательный знак на X. Повторений восклицательных знаков через n-e количество символов может быть хоть миллион, поэтому такие варианты:
preg_replace('/^[^!]+/i', 'X', $string); //меняем первый по счету preg_replace('/^([^!]+)(!)([^!])/i', 'X', $string); //меняем второй по счету preg_replace('/^([^!]+)(!)([^!])(!)([^!])/i', 'X', $string); //меняем третий по счету...
...не подходят Подскажите, как сделать такой паттерн(регулярное выражение на выборку), чтобы сменой одной цифры выбирать какой ! менять. Грубо говоря: поставил где-то 1, поменялся первый, поставил 2, поменялся второй и т.д. Спасибо!


Ответ

$text = "aaa!bbbb!ccccc!ddddd!eeeeee!ffffff!gggg!";
$number = 2; $replace = preg_replace ('/!/e',"\$number--==1?'X':'\\0'", $text);
echo $replace;
И с callback для желающих -.-
$text = "aaa!bbbb!ccccc!ddddd!eeeeee!ffffff!gggg!"; $number = 3; $replace = preg_replace_callback('/!/', function ($match) use (&$number) {return $number--==1?'X':$match[0];}, $text); echo $replace;
Результат:
aaa!bbbb!cccccXddddd!eeeeee!ffffff!gggg!

Независимое текущее время в Java (Android)

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


Ответ

Так как вы говорите, что контроля над часами клиента у вас нет, то подключайтесь раз в сутки/неделю/месяц и проверяйте на сервере, обновляли вы этого клиента в этом году или еще нет. Ну и добавьте кнопку в интерфейсе "проверить наличие обновлений" для ручной проверки.

Каст абстрактного класса к конкретной реализации

Есть метод, возвращающий экземпляр абстрактного класса и перегруженные методы, которые принимают всех существующих наследников.
AbstractClass getSuccessor() { return ...; }
void work(SonOfAbstract child);
void work(DaughterOfAbstract child);
void work(GrandchildOfAbstract child);
Метод getSuccessor() гарантировано возвращает наследника AbstractClass и метод work умеет работать со всеми наследниками.
Но вот вызов work(getSuccessor()); ожидаемо не проходит , так как метод work(AbstractClass child) не определен. Для родителя и сферического наследника в вакууме работы нет.
Как можно передать наследника в метод, а JRE пускай само разбирается, какой метод вызывать?


Ответ

Можно метод work освободить от параметров если добавить его как абстрактный метод в AbstractClass. И затем имплементировать его для конкретного класса наследника. Это даёт возможность использовать абстрактный класс или интерфейс для хранения конкретной имплементации классов наследников и не привязывается к конкретному типу. Далее в зависимости от того какой конкретный тип будет использоваться вместо интерфейса в рантайме определится с помощью полиморфизма.
Этот метод не только освободит от привязки к типам, а также избавит от ненужных кастов. Проверка на тип с помощью instanceof а также вдобавок if else if как известно приводят к замедлению работы программы.

Заменить буквы в слове JS

Не могу понять почему не работает replace, задача с freecodecamp(дана фраза, в словах которой, буквы из первой половины алфавита нужно заменить на буквы второй половины алфавита соответственно т.е А=N, B=O и т.д), все решения связанные с этой задачей были через charCodeAt(),можно ли вообще решить эту задачу через replace?
function rot13(str) { const alfabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; const half1 = alfabet.split(''); // ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"] const half2 = half1.splice(0,13); // ["N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] const myStr = str.split(' '); for(let myShifrWords of myStr){ for(let i=0; i

Ответ

function rot13(str) { var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; var map = Object.create(null); for (var q = 0; q < alphabet.length; ++q) { map[alphabet[q]] = alphabet[(q + 13) % alphabet.length]; } return str.replace(/./g, m => map[m] || m); } console.log(rot13("SERR CVMMN!"));

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

Собственно, как отправить сообщение на почту из командной строки линукса?


Ответ

Можно установить утилиту sendmail. sudo apt-get install sendmail И вызвать команду. sendemail -f from@yandex.ru -m "message" -t to@gmail.com -s smtp.yandex.ru:587 -xu from@yandex.ru -xp password -a /attached_file.txt

Быстрая сортировка на C++

Приведите пример алгоритма быстрой сортировки на C++.


Ответ

#include
template inline void swap( T & arg1, T & arg2) { T temp = arg1; arg1 = arg2; arg2 = temp; }; template inline int get_median_index( std::vector & vArray, int lower, int upper) { if ((upper-lower) < 2) return lower;
int middle = (upper+lower)/2;
if (vArray[lower] <= vArray[middle]) { if (vArray[middle] <= vArray[upper]) { return middle; } else if (vArray[upper] <= vArray[lower]) { return lower; } else { return upper; } } else { if (vArray[lower] <= vArray[upper]) { return lower; } else if(vArray[upper] <= vArray[middle]) { return middle; } else { return upper; } } return lower; }; template inline int partition( std::vector & vArray, int start, int end, int median_index) { int head = start, tail = end-1; swap( vArray[median_index], vArray[end]); while (true) { while (vArray[head] < vArray[end]) { ++head; } while (vArray[tail] > vArray[end] && tail > start) { --tail; } if ( head >= tail) { break; } swap( vArray[head++], vArray[tail--]); } swap( vArray[head], vArray[end]); return head; }; template inline void quick_sort_helper( std::vector & vArray, int head, int tail) { int median_index, diff = tail-head;
if (diff < 1) { return; } if (diff == 1) { if (vArray[head] > vArray[tail]) { swap( vArray[head], vArray[tail]); } }
median_index = get_median_index(vArray, head, tail); median_index = partition( vArray, head, tail, median_index);
quick_sort_helper( vArray, head, median_index-1); quick_sort_helper( vArray, median_index+1, tail); }; template void quick_sort( std::vector & vArray) { int head = 0, tail = vArray.size()-1; quick_sort_helper( vArray, head, tail); };

Порядок выполнения операторов sql запроса

Пожалуйста, дайте порядок выполнения операторов sql запроса или дайте ссылку, где прочитать об этом: что за чем выполняется. Например (с потолка):
SELECT t1.id AS id, t1.name AS name, count(*) AS cnt FROM tbl_name1 t1 INNER JOIN tbl_name2 t2 ON t1.id = t2.id WHERE t1.id > 10 GROUP BY t1.name HAVING cnt > 10 ORDER BY t1.id
Сначала GROUP BY, потом? Последним ORDER BY... Нигде не могу найти нормальной информации об этом :((


Ответ

Порядок выполнения предложений в операторе select

Как программно задействовать второе ядро?

У меня есть прога (написанная на Delphi 7) которая "колбасит" структурированный текстовый файл. Внимание вопрос: как программно задействовать в моей обработке второе ядро процессора? Т.к. очень хочется сократить время обработки как минимум в двое! P.S.: так же приму либы советы по настройке компилятора, ссылки на статьи и прочее по оптимизации быстродействия кода реализованного в Delphi 7.


Ответ

Создание потока: Delphi - File - New - Other - Delphi Files - Thread Object тут был старый ответ UPD Описание работы с потоками в Delphi ТУТ

Сложности с пониманием темы “Множества” в Turbo Pascal.

Здравствуйте! Снова обращаюсь к знатокам :) Вопрос от новичка, который только-только начал изучать Turbo Pascal и постепенно добрался до темы «Множества». Тема в общем смысле кажется понятной, но, в то же время кажется, что… ничего совсем не понятно. Если честно, в голове уже каша от изученного материала… Но очень хочется понять эту тему, прежде, чем идти в изучении дальше. Ниже я привожу вопросы, на которые прошу Вас ответить. Вопросов много. Я понимаю, что ответы на них могут быть утомительными… Но если уж не на все, то хоть на некоторые из них, ответьте, пожалуйста. Правильно ли я понимаю, что: 1. В памяти отводится по 1 биту под каждый элемент, находящийся во множестве. 2. Перечислимый тип данных сам по себе является множеством. 3. Не совсем понятно объявление множеств в программе. а) type SetByte = set of byte; var sb : SetByte; Правильно ли я понимаю в данном случае, что: а1) Множество задается в разделе type, потому что по сути, создается необходимый пользовательский тип? а2) В разделе var нужно объявить специальную переменную, которая будет являться «представителем» того пользовательского типа, который был создан в разделе type. Т.е. переменной созданного множества. а3) В программе можно будет выполнять все обычные операции, предусмотренные ЯП, над переменной, которая является «представителем» множества. a4) В данном случае sb ялвяется одним из элементов множества SetByte. И таких элементов (переменных) можно создать столько, сколько может вместить в себя множество. б) type SetChisla = set of 10..20; var Index : SetChisla=[12,15,17]; б1) Понятно, что задается множество в диапазоне от 10 до 20. Но почему здесь не указывается какого типа это множество? Или итак понятно, что это целочисленный тип? б2) Если уже определено, что множество задано в диапазоне от 10 до 20, что значат цифры в квадратных скобках? Здесь прописывается то, что в заданном множестве будут присутствовать именно эти три элемента: 12, 15 и 17? Т.е. происходит обычная операция присваивания? б3) Почему в качестве идентификатора переменной множественного типа участвует ключевое слово index? Может быть это опечатка автора учебного пособия? в) type Symbol = set of char; var Letter, Digits, Sign : Symbol; в1) Почему можно создавать несколько переменных, являющихся представителями одного и того же множества? Как они взаимодействуют друг с другом? г) type Month = (January, February, March, April, May, June, July, August, September, October, November, December); Season : set of Month; var Winter, Spring, Summer, Autumn, Vacation, WarmSeason : Season; г1) Здесь создано множество Season на основе перечислимого типа? г2) Какими тогда будут элементы этого множества? January, February… December ? Или Winter…WarmSeason? Или множество будет содержать и отдельно заданные элементы и элементы, входящие в перечислимый тип Month? г3) Почему в строчке Season : set of Month; стоит двоеточие, а не знак равно? Или это просто опечатка в пособии? д) var Operation : set of (Plus, Minus, Mult, Divid); д1) Почему в данном случае происходит объявление множества в разделе переменных? И почему опять через : , а не через знак = ? д2) После set of должен быть прописан тип данных, которому принадлежат элементы множества. Тогда в этом случае мне не понятно, какому типу принадлежат элементы заданного множества? е) var Param : set of 0..9=[0, 2, 4, 6, 8]; е1) Здесь задано множество целого типа? е2) Во множество записали элементы 0, 2, 4, 6, 8 ? 4. В пособии написано, что множества часто используются как константы. Тогда, определив множество в разделе const, нужно ли его прописывать в разделе type? Прошу, пожалуйста, объясните доступным, понятным языком :)


Ответ

set — это тип. Можно создавать много переменных такого типа. 3а1 Не множество задается в разделе typе, а тип "множество чисел типа byte". 3a3 Переменные не являются представителями множества, а сами являются множествами, то есть содержат в себе элементы заданного типа. 3б2 type SetChisla = set of 10..20; означает, что в переменную типа SetChisla можно "положить" только числа от 10 до 20. var Index : SetChisla=[12,15,17]; множество Index типа SetChisla, в которое сразу положили числа 12, 15 и 17 3б3 index — это не ключевое слово 3д Тоже самое, Operation — это переменная типа "множество элементов перечислимого типа (Plus, Minus, Mult, Divid)". 3е Тоже самое, Param — переменная типа "множество целых чисел от нуля до девяти", и ей сразу задается значение [0, 2, 4, 6, 8] 4 Пример: type SetDigit = set of 0..9; (* тип - множество цифр *) (* две константы этого типа - нечетные и четные цифры *) const odd_digits : SetDigit = [1, 3, 5, 7, 9]; even_digits : SetDigit = [0, 2, 4, 6, 8]; odd_digits2 : set of 0..9 = [1, 3, 5, 7, 9]; {тоже самое, что и odd_digits} PS Все разделы (const, var, type) можно чередовать: const minn = 10; maxn = 1000; type vector = array[1..max] of integer; var n, m : integer;
const inf = 2147483647;
var a : vector;

JUnit тесты для DataService

Как можно это все проверить? Мои мысли: Внести фейковые данные в базу данных. Добавить данные через тест. Задать значения для проверки. Сравнить данные для проверки с данными из БД? Как это примерно реализовать? Просто с дата сервисами не работал особо вот и возникло затруднение. public class NewsDataService { private News news; private List newss; private DatabaseConnector db; private ResultSet result;
public NewsDataService() throws ClassNotFoundException, SQLException { db = new DatabaseConnector(); newss = new ArrayList();
}
public News getNews(int id) throws SQLException { result = db.query("SELECT * FROM news WHERE idnews = " + id); result = db.query("SELECT * FROM news WHERE idstudent = " + id); result = db.query("SELECT * FROM news WHERE idgroup = " + id); while (result.next()) { news.setDate(result.getString("date")); news.setTitle(result.getString("title")); news.setContent(result.getString("content")); } return news;
}
public News findByTitleNews(String title) throws SQLException { result = db.query("SELECT * FROM news WHERE title ='" + title + "'"); while (result.next()) { news.setTitle(result.getString("title")); news.setId(result.getInt("idnews")); news.setId(result.getInt("idgroup")); news.setId(result.getInt("idstudent")); news.setDate(result.getString("date")); news.setContent(result.getString("content")); } return news;
}
public List findAllNews() throws SQLException { result = db.query("SELECT * FROM news"); while (result.next()) { news.setTitle(result.getString("title")); news.setId(result.getInt("idnews")); news.setId(result.getInt("idgroup")); news.setId(result.getInt("idgroup")); news.setDate(result.getString("date")); news.setContent(result.getString("content"));
}
return newss;
}
public void save(News news) throws SQLException { String sql = "INSERT INTO news('title', 'content', 'date') " + "VALUES ('" + news.getTitle() + "', '" + news.getContent() + "', '" + news.getDate() + "',?);";
PreparedStatement pstmt = db.getConnect().prepareStatement(sql); pstmt.execute(); pstmt.close(); System.out.println(sql); System.out.println("News successful inserted"); } }


Ответ

Протестировать текущий вариант класса NewsDataService - не самая тривиальная задача для решения, попробую объяснить почему.
В процессе написания данного класса вы решили заинкапсулировать всю логику работы с БД внутри кода, дойдя до крайне низкого уровня - ручного составления SQL запросов. И теперь ваш класс служит крайне узкоспециализированной цели, поскольку он умеет только лишь создаваться и отвечать на запросы вида "дай мне сущность с id" и "сохрани такую-то сущность"
Чтобы улучшить этот аспект кода (coupling), я бы порекомендовал бы вам почитать про Inversion of Control, Dependency Injection и про ORM.
Я могу предложить 3 различных подхода к тестированию текущего варианта реализации NewsDataService, которые вполне как можно скомбинировать в тех или иных пропорциях
Воспользуйтесь sandbox-based подходом - возьмите легковесную базу данных, заполните ее реальными значениями и напишите юнит-тесты без моков вообще. Вообще говоря, если бы вы писали такие тесты перед написанием кода (следуя методологии TDD), то вам бы сразу открылись многие минусы и неудобства использования написанного класса. Специально для таких целей можно использовать DbUnit, позволяющий упростить создание сендбоксовой базы данных и написание Setup / Teardown методов. Следуя принципам IoC, инициализируйте ваш DatabaseConnector в другом месте, а в NewsDataService прокидывайте его через конструктор. Это, во-первых, снимает с NewsDataService ответственность за инициализацию подключения, а во-вторых упрощает тестирование. Вот здесь уже сам по себе DatabaseConnector можно подменить mock-объектом, который будет эмулировать часть функциональности, например, на любой запрос SELECT будет возвращать предопределенную пачку новостей. Подход не самый лучший, потому что mock-объект должен быть предельно простым (иначе потребуются тесты на тесты), а этот факт сильно сковывает руки при тестировании. То есть, грубо говоря, вы не можете и не должны парсить запрос в вашем mock'e, поэтому максимум, что вы можете делать с его помощью - это разделять запросы SELECT / UPDATE, возвращая на них какую-нибудь заранее заданную чушь, ну и, например, проверять, что databaseConnector.query вообще был вызван. Общее правило достаточно простое - если код mock'a вызывает вопросы о том, правильно ли он работает для всех случаев, то это - плохой mock Иногда, естественно, бывают ситуации, что без сложного mock'a не обойтись, но в таком случае нужно писать тесты на этот самый mock, что обычно бывает нежелательным. Выделить генерацию SQL запросов в отдельный класс типа SqlQueryProvider. В таком случае ваш текущий код начнет меняться примерно в следующую сторону: ... databaseConnector.query(sqlQueryProvider.getQueryToRetrieveById(...)); Такой подход уже позволяет отдельно покрыть тестами генерацию запросов, и, зная, что запросы к генерируются корректно, серьзно сэкономить на реальном тестировании NewsDataService. Опять же, для тестирования NewsDataService в таком случае может пригодиться mock на SqlQueryProvider
Несколько референсов по теме:
Unit Testing Database Code Testing With DbUnit How do I unit test jdbc code in java?
Всегда, кстати, хотелось посмотреть, как авторы советов типа "возьмите XYZMock, да заmock'айте эту обертку над БД и протестите, делов то" делают это на практике и сделали бы это, достанься им legacy код типа NewsDataService.

Как найти объект в объекте?

Здравствуйте. Допустим, у нас есть некий объект. Его структуру и то, что внутри, мы не знаем, но знаем, что там должен быть, например, объект innerObject, который может находится где угодно внутри. Вот пример объекта: var someObj1 = { io1: {sIo1:{ssIo01:'что-то'}} oi2: { sIo1:{ innerObject: {/*внутренности объекта*/} } } } И структура этого объекта и то, где будет находиться наш innerObject, нам не известно. Известно еще то, что innerObject находится НЕ в массиве. Как найти в некотором объекте, объект innerObject? PS Без использования каких-либо библиотек.


Ответ

function checkInObject( obj, name ) { var res = null; for( var i in obj ) { if(obj.hasOwnProperty(i)) { if(i === name) { res = obj[i]; break; } if(obj[i] && obj[i].constructor === Object) { var check = checkInObject( obj[i], name ); if( check ) { res = check; break; } } } } return res; }
var someObj1 = { io1: {sIo1:{ssIo01:'что-то'}}, oi2: { sIo1:{ innerObject: { test : "done" } } } }
console.log(checkInObject( someObj1, 'innerObject' ).test); // -> done

JSON. Пределы возможного

Доброго времени суток, ув. сообщество. Перейду сразу к делу: Какой максимальный объём JSON данных можно забрать с сервера? Неограниченно Какой максимальный объём JSON данных можно забрать с сервера без вреда для него и клента? Ограниченно железом Какой максимальный объём JSON данных можно хранить на клиенте? Какой максимальный объём JSON данных можно хранить на клиенте без вреда для системы? 2 Гб ± ... Как можно оптимизировать загрузку большого объёма данных(кроме Lazy loading)? Параллельная загрузка Как можно оптимизировать хранение большого объёма данных на клиенте(кэширование, может Local Storage)? Заранее благодарю всех откликнувшихься. UPD: JSON Compression algorithms - что можете сказать об этом? Чепуха © @karmadro4 @rnd_d, данные я собираюсь рендерить, не все сразу конечно, но чтобы не тратить время ещё и на загрузку этих данных, они мне нужны ввиде Backbone.Collection на клиенте @AlexWindHope, на сколько мне известно, кол-во параллельных запросов на один домен ограничено, в Opere например, по умолчанию стоит 16, но можно увеличить до 128, как обстоят дела в других браузерах не знаю.


Ответ

Знаю что кто-то писал java софтину, где обрабатывали > 2гб json'a( что привело к необходимости фикса JSON парсера 4 java ). Так что юзать можно по полной. С учетом того, что в большинстве браузеров парсинг JSON реализован на нативном уровне - скорость тоже на уровне. Вообще если вы пишите приложение, где удобно было бы использовать json формат данных - стоит посмотреть в сторону noSQL документно-ориентированных бд (mongoDB, couchDB). По поводу хранения большего количества данных - Local storage + запрос вида - не поменялись ли данные(если поменялись, естественно, тянем новые), при желании можно придумать что-то посложнее и поинтереснее, но не думаю что в этом есть смысл, а если и будет - то это уже отдельный вопрос.

Изменить цвет части текста в TextView

Нужно сделать первые буквы красными, можно через ресурсы, можно в коде! Как это сделать?


Ответ

С помощью span TextView textView = (TextView)findViewById(R.id.textView);
final SpannableStringBuilder text = new SpannableStringBuilder("Text"); final ForegroundColorSpan style = new ForegroundColorSpan(Color.rgb(255, 0, 0)); text.setSpan(style, 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); textView.setText(text);

Как обратится к приватной переменной из другого класса в Java

Например есть код: class B { private int i = 22; }
class A { // тут код который выводит переменную i } Условие: класс B нельзя менять. класс А можно менять (т.е наследовать класс B и т.д)


Ответ

Через Reflection B b = new B(); Class clazz = B.class; Field iField = clazz.getDeclaredField("i"); iField.setAccessible(true); int fieldValue = iField.getInt(b); System.out.println("i = " + fieldValue);

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

Всем добрый день! Рассматриваю возможности реализации нового сервера, и пока остановилась на модели с созданием пула потоков. Однако поступила информация, что при такой работе сервера на многоядерной системе, определенные потоки будут закреплены за ядрами сразу и перераспределения их не будет, пока они не будут уничтожены, то есть возможна ситуация, когда часть пула потоков, которая на данный момент никаких активных действий не производит, будет висеть на одном ядре, и оно фактически будет простаивать, в то время, как второе ядро будет загружено несколькими активными потоками. Если кто-то в курсе, подскажите плиз, действительно ли это так, и есть ли какой-то способ управлять распределением потоков по ядрам, чтобы загружать их более-менее равномерно? Может кто-то может полезной ссылочкой поделиться применительно к unix - я ничего толкового пока не нашла по этому вопросу.


Ответ

Ручное распределение потоков по ядрам нужно только в очень исключительных случаях. Система будет перераспределять потоки между ядрами, как ей кажется правильно. И может перебросить рабочий тред с одно ядра на другое но в 99% это не нужно. Давайте представим некую виртуальную систему с 16 ядрами и 100 потоками. и 10 из них активно работает, занимая при это 10 ядер. Остальные 90 сидят тихонько на оставшихся 6. Вопрос, есть ли смысл перебрасывать активный поток на другое ядро? Ответ - нет. Только хуже сделаем (накладные расходы на переключение). Поэтому система будет пытаться сохранить поток на своем ядре. Вариант, когда ядер 2 и 100 потоков (из них 10 активных). В этом случае загружены будут точно два ядра. Причем выиграш от того, что есть 10 активных потоков будет отрицательный. Именно по этой причине, когда создают пул потоков, которые нагружены одинаково, не делают их больше кол-ва ядер+1. Потому что при дальнейшем увеличении кол-ва потоков будет только падение производительности (накладные расходы на переключение. Процессор только тем будет и заниматься, что переключать контексты потоков). В случае одного ядра, не рекомендуется создавать более 16 потоков на процесс (это конечно устаревшая информация, данная Борландом в году так 1995-1997 и в век двухядерных процессоров у каждой домохозяйки в ноуте и в планшете она малоактуальна). Но есть вариант, когда много потоков может улучшить задачу - это когда потоки занимаются малоактивной работой. Но преимущество только одно - упрощается логика кода. Но это сильно зависит от задачи. А теперь подсуммируем. Если у вас сервер с 2 ядрами, то на данный момент это не сервер, а домашний компьютер. Будете делать пул потоков - сделайте возможность регулировать кол-во потоков в пуле и проведите замеры. Очень часто, выставив правильное кол-во потоков, можно сильно ускорить задачу. А в некоторых случаях может выяснится, что оптимально будет работать только при одном потоке. Не доверяйте русскоязычному переводу англоязычной документации. В спорных случаях обращайтесь к английскому оригиналу. У меня был случай, когда из за неточностей в одно слово в переводе мана по select смысл очень сильно менялся

Как преобразовать Byte[] в Int32?

Есть Byte[] buffer большого размера, в который читается значение типа Int32 (из tcp). Как из этого Byte[] (или его фрагмента) получить Int32? Можно брать 4 элемента массива и складывать, предварительно сдвинув биты, или есть какое-то встроенное средство C# для этого? Может глупый вопрос, но все-таки...


Ответ

Для конвертации базовых типов в массивы байт и обратно есть класс BitConverter using System;
public class Example { public static void Main() { // Create an Integer from a 4-byte array. Byte[] bytes1 = { 0xEC, 0x00, 0x00, 0x00 }; Console.WriteLine("{0}--> 0x{1:X4} ({1:N0})", FormatBytes(bytes1), BitConverter.ToInt32(bytes1, 0)); // Create an Integer from the upper four bytes of a byte array. Byte[] bytes2 = BitConverter.GetBytes(Int64.MaxValue / 2); Console.WriteLine("{0}--> 0x{1:X4} ({1:N0})", FormatBytes(bytes2), BitConverter.ToInt32(bytes2, 4));
// Round-trip an integer value. int original = (int) Math.Pow(16, 3); Byte[] bytes3 = BitConverter.GetBytes(original); int restored = BitConverter.ToInt32(bytes3, 0); Console.WriteLine("0x{0:X4} ({0:N0}) --> {1} --> 0x{2:X4} ({2:N0})", original, FormatBytes(bytes3), restored); }
private static string FormatBytes(Byte[] bytes) { string value = ""; foreach (var byt in bytes) value += String.Format("{0:X2} ", byt);
return value; } } // The example displays the following output: // EC 00 00 00 --> 0x00EC (236) // FF FF FF FF FF FF FF 3F --> 0x3FFFFFFF (1,073,741,823) // 0x1000 (4,096) --> 00 10 00 00 --> 0x1000 (4,096) UPD. И не забывайте про порядок байтов. В случае с TCP/IP, вероятно, придется изменить порядок байтов на обратный. Узнать какой порядок используется в текущей системе можно через свойство того же класса BitConverter.IsLittleEndian

Как добавить путь в переменную окружения %PATH% на Windows?

Как добавить что-то в путь (PATH или system PATH)? Что такое %PATH% и %что-то%?
Вот примеры:
Add the following string to the PATH, C:\Program Files (x86)\CMake 2.8\bin Do you have make in your %PATH% environment variable? On my system, I need to add %MINGW_DIR%\bin to %PATH% Add C:/mingw/bin to the system PATH
Я так понимаю, что надо зайти в Свойства системы → Дополнительно → Переменные среды...
А потом, если говориться про PATH, то добавить в «Переменные среды пользователя такого-то», а если system PATH, то «Системные переменные».
Потом нужно нажать «Создать». Что вписывать в «Имя переменной»? В значение переменной надо записать те строки, которые даны в указании, так?
Qt\_\_directory — это, наверно, путь до папки с Qt. Между двумя % тоже путь до папки? %PATH% и %MINGW_DIR% — это одно и тоже, если PATH понимают как путь к MinGW?


Ответ

Да, верно, нужно зайти в Свойства системы → Дополнительно → Переменные среды. Там уже будут переменные PATH. Одна для текущего пользователя, вторая — общесистемная. Просто кликаете на них и добавляете нужный путь через точку с запятой.

Как вариант, можно написать командный скрипт, в котором будет изменяться переменная окружения. При этом она может менять глобально для всей системы, текущей сессии, так и внутри конкретно той командной оболочки, в которой этот командный скрипт запущен. Смотрите детали в статье «Update Windows Path Environment Variable»[архив]

Проверка валидности url. PHP

Я нарыл такое: $a = 'http://site.ru'; if (preg_match('/^(http:\/\/|https:\/\/)?[0-9a-zA-Zа-яА-ЯёЁ]{1,3}+[.][0-9a-zA-Zа-яА-ЯёЁ]+[.][0-9a-zA-Zа-яА-ЯёЁ]{2,6}+$/', $a)) echo "yes"; else echo "no"; Но эта штука все время выдает "no". Мне кажется это из за кириллицы. Ее убирать нельзя. сайт.рф ведь... Помогите пожалуйста, как исправить. Я работаю в кодировке UTF-8 Вот нарыл по-лучше, но не могу кириллицу добавить.. Помогите плиз function is_url($in){ $w = "a-z0-9"; $url_pattern = "#( (?:f|ht)tps?://(?:www.)? (?:[$w\\-.]+/?\\.[a-z]{2,4})/? (?:[$w\\-./\\#]+)? (?:\\?[$w\\-&=;\\#]+)? )#xi";
$a = preg_match($url_pattern,$in); return $a; }


Ответ

Для проверки url советую :
filter_var($url, FILTER_VALIDATE_URL)
В плане проверки русскоязычных доменов могу рекомендовать смотреть в сторону конвертации в IDN, т.е. к виду xn--af1bc.net тогда проблем с русским точно не будет. В стандартном наборе таких функций нет, только декодирование. Если есть возможность поставить соответствующий модуль PECL, то на мой взгляд это идеальное решение.

Инкремент, декремент

добрый день, вопрос такой, почему нельзя сделать так: i++++; Но можно так: ++++i;


Ответ

разница в том, что возвращают постфиксная и префиксная формы инкремента. Префиксная возвращает ссылку на инкрементированную переменную i, а префиксная возвращает не ссылку, а значение некоторой временной переменной, в которой было сохранено предыдущее (до инкремента) значение переменной i. Выглядит это примерно так (для int) : int& operator ++(int& a);​ // префиксная форма ​int operator ++(int& a, int);​ // постфиксная форма В первом случае значение, возвращаемое оператором инкремента является lvalue, во втором - не является

Проблемы с пониманием шаблонов

Здравствуйте. Начал изучать шаблоны. Пока всё было просто и понятно, пока не дошёл до явной специализациии и явного создания экземпляра. Например, есть такой шаблон template void Swap(T&, T&); Для этого шаблона можно создать явную специализацию для какого-то определённого типа, например template<> void Swap(MyStruct&, MyStruct&); Это объявление даст команду компилятору создать экземпляр функции Swap для типа MyStruct и в коде MyStruct a, b; Swap(a, b); Будет вызван именно этот экземпляр функции. Теперь про явное создание экземпляра. Пусть у нас сеть этот же шаблон. Тогда в этом коде double a, b; Swap(a, b); Либо в этом double a, b; template void Swap(double&, double&); Swap(a, b); Компилятору тоже будет указано создать экземпляр функции для типа double. А значит, если это одно и тоже, то можно использовать что-то одно? Или, если я чего-то не понимаю, объясните мне пожалуйста, в чём разница между явной специализацией и явным созданием экземпляра?


Ответ

Смотрите. Явная специализация — это метод сказать компилятору: когда будешь компилировать Swap для T = MyStruct, пользуйся не обычным определением, а специальным. Специальное поведение нужно, например, если для конкретного типа аргумента вы можете что-то сделать оптимальнее. Например, vector использует особую стратегию хранения, отличную от общего случая, чтобы упаковать значения в bitfield. Теперь о явном создании экземпляра. Начнём с того, что оно, говоря в общем, не нужно. Давайте разберём, что происходит, когда вы определяете template. Компилятор не может скомпилировать шаблон сам по себе. Например, если вы в шаблоне вызываете метод класса-параметра шаблона, компилятор не знает, какие у него аргументы на самом деле и каков возвращаемый тип. Поэтому компилятор может лишь скомпилировать отдельные специализации шаблонного класса. Но в отличие от обычного класса, который существует в единственном раз и навсегда заданном варианте, специализаций шаблонного класса (или функции) существует потенциально бесконечно много: у вас может быть vector, vector, vector, vector и т. д. Вследствие этого компилятор, видя объявление методов шаблонного класса, вовсе не генерирует никакого кода! (Не генерировать же ему и вправду все возможные специализации!) Возникает закономерный вопрос: а когда же генерируется код, и для каких специализаций? Ответ на это таков: в тот момент, когда компилятор видит обращение к шаблонному классу (например, видит vector), он приостанавливает компиляцию и тихонько в уголке компилирует нужную специализацию шаблона. Это значит, кстати, что код для vector будет находиться в каждом объектном файле, использующем vector. Нужна специальная магия компоновщика, чтобы выкинуть дублирующийся код и не получить сообщение об ошибке "multiply defined symbol". Вернёмся к нашей теме: а для чего всё-таки тогда нужно явное создание экземпляра? А вот для чего. Допустим, ваша библиотека предоставляет пользователям шаблонный класс. Если вы нигде в своей библиотеке не пользуетесь этим классом, а лишь определяете его, компилятор, понятно, не сгенерирует вообще никакого кода! Вы, однако, можете сделать явное создание для некоторых специализаций экземпляра в своём коде (то самое явное создание). Таким образом вы заставите компилятор таки сгенерировать код для него — точнее, для выбранных вами специализаций. Для чего это нужно? Этим вы по идее увеличите скорость компиляции для ваших клиентов. Если компилятор увидит, что есть явная специализация, он сможет по идее не отвлекаться на кодогенерацию специализации шаблона каждый раз, видит такую специализацию у клиента. Кроме того, если вы положите имплементацию шаблона не в .h, как принято, а в .cpp, и проведёте там явную специализацию, ваши клиенты смогут пользоваться шаблоном только с типами, для которых вы эту самую специализацию сделали. (Не уверен, однако, что это — хорошее применение.) Кстати, вы можете вызывать вашу функцию Swap и без явного указания шаблонного типа: double a = 2, b = 4; Swap(a, b); Компилятор умный, он догадается сам.

CompareTo и object

Здравствуйте. У меня появился такой вопрос: зачем в C# метод CompareTo интерфейса IComparable принимает параметр типа object? Не проще ли принимать параметр того же типа IComparable? Заранее спасибо


Ответ

В .NET на самом деле есть оба интерфейса: IComparable и IComparable. Первый сохраняется как наследие со времён .NET 1.x, в котором не было обобщённых типов (генериков). Для старого IComparable каким может быть тип аргумента функции CompareTo? Это должен быть один тип на все возможные случаи использования, для сравнения любого типа с собой, так что единственное, что может в принципе подойти, это object Для нового IComparable мы можем объявить возможность сравнения с любым типом Т, которым захотим. Разумеется, никто не помешает написать class A : IComparable { ... — но правильное использование интерфейса, конечно, для сравнения с объектами того же самого типа: class A : IComparable<А> { ... К сожалению, система типов .NET на текущий момент недостаточно сильна, чтобы выразить ограничение «тип, сравнимый с самим собой», а не просто «тип, сравнимый с данным типом». Если вам интересны языки с более развитой системой типов, гляньте в сторону функциональных языков.

Данные за текущий месяц, текущую неделю, предыдущий месяц

Как в mysql вывести данные за текущий месяц данные за текущую неделю данные за предыдущий месяц


Ответ

Нашел информацию: Данные за текущий месяц ... WHERE MONTH(`date`) = MONTH(NOW()) AND YEAR(`date`) = YEAR(NOW()) Данные за текущую неделю ... WHERE YEAR(`date`) = YEAR(NOW()) AND WEEK(`date`, 1) = WEEK(NOW(), 1) Данные за предыдущий месяц ... WHERE MONTH(`date`) = MONTH(DATE_ADD(NOW(), INTERVAL -1 MONTH)) AND YEAR(`date`) = YEAR(NOW())

Проблема при декомпиляции .NET

После декомпиляции .NET в классах вылез непонятный , что это? Компилятор ругается на скобки.


Ответ

Если это .NET, то это не значит, что это C#. В стеке языков .NET есть такие, которые позволяют создавать переменные вне всяких классов (VB.NET), или же создавать функции/процедуры вне классов (VB.NET, IronPython), или же полностью функциональные (F#). Такие переменные/функции/процедуры будут находиться в Module. C#, насколько мне известно, не ипользует Module в силу своей ОО. Исключение составляет тот случай, когда код обфусцируют - обфускатор может активно использовать эту часть программы, чтобы запутать код еще больше.