Страницы

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

вторник, 30 октября 2018 г.

Синтаксис вызова функции указателем

Меня мучает вопрос, с какой целью это сделано?
Есть такой указатель: int (*a)() = ownfucntion; /// ownfucntion - любая пользовательская функция.
Мы можем эту функцию вызвать так: a();
А можем так: (*a)();
Где логика? Обычно разименовывание используется для получения значения из указателя. А тут результат одинаков: хочешь разименовывай, хочешь не разименовывай в итоге будет вызвана функция.


Ответ

Обозначение функции всегда за исключением одного случая преобразуется в указатель на функцию.
Из стандарта C (6.3.2.1 Lvalues, arrays, and function designators)
4 A function designator is an expression that has function type. Except when it is the operand of the sizeof operator65) or the unary & operator, a function designator with type ‘‘function returning type’’ is converted to an expression that has type ‘‘pointer to function returning type’’.
Хотя в этой цитате написано про использование оператора sizeof, но на самом деле функция не может использоваться в операторе sizeof
Стандарт C (6.5.3.4 The sizeof and alignof operators)
1 The sizeof operator shall not be applied to an expression that has function type or an incomplete type, to the parenthesized name of such a type, or to an expression that designates a bit-field member
Поэтому когда используется постфиксное выражение вызова функции, то обозначение функции неявно преобразуется к указателю на функцию (6.5.2.2 Function calls)
1 The expression that denotes the called function92) shall have type pointer to function returning void or returning a complete object type other than an array type.
В связи с этим можно написать даже такое выражение, как показано в следующей демонстрационной программе
#include
void f( void ) { puts( "Oh...At last I am called!" ); }
int main(void) { ( **********f)();
return 0; }
Вывод программы на консоль:
Oh...At last I am called!
Потому что согласно стандарту C (6.5.3.2 Address and indirection operators)
4 The unary * operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.102
То есть сначала обозначение функции преобразуется неявно к указателю на функцию. Затем после применения оператора * этот указатель преобразуется к обозначению функции и сразу же снова преобразуется в указатель на функцию и т.д.
Вы можете применить столько операторов * к обозначению функцию, сколько позволит конкретный компилятор

Подытоживая, можно сказать следующее. Для объявления функций вводится их идентификатор, чтобы по нему можно было ссылаться на функции и отличать одну функцию от другой. При этом сама функция может быть еще не определена, а лишь только объявлена.
Когда этот идентификатор функции или, другими словами, обозначение функции используется в выражениях, то оно преобразуется к типу указателя на функцию.
В выражениях используются значения. Какое значение назначить обозначению функции, используемому в выражениях?
Естественно разумно в качестве значения использовать адрес функции, потому что все, для чего создаются функции, это для их выполнения. А выполнить функцию можно, лишь передав управление по тому адресу, где эта функция определена.
Поэтому в качестве значения функции и принят ее адрес, то есть функция в выражениях преобразуется к указателю на саму себя.
Единственным исключением по отношению к неявному преобразования функции к указателю на функцию является использование оператора &. Здесь нет необходимости преобразовывать функцию неявно к указателю на нее, так как применение оператора & итак является явным взятием адреса функции.

Какие стили лучше задавать по умолчанию?

При просмотре туториалов, связанных с версткой заметил, что часто перед началом работы, авторы задают какие-то стили по умолчанию, переопределяют дефолтные стили браузера. Собственно, возникло пару вопросов по этому поводу:
Зачем это делается? Стили каких элементов лучше переопределить в самом начале? Где можно об этом почитать поподробнее и найти код? Гуггл мне не очень помог, каюсь, может плохо гугглил.


Ответ

Зачем это делается?
По умолчанию, в браузерах есть встроенные определения для HTML-элементов. Например, у и

есть margin, у

    и
      есть padding и list-style, ну и так далее. В каждом браузере эти предустановленные значения могут быть разными, соответственно, normalize.css или reset.css нужны для того, чтобы стартовать с одинаковой базы. Различие их состоит в том, что normalize.css приводит все элементы к одинаковому стилю, а reset.css сбрасывает всё полностью в ноль. Лично мне больше нравится использовать reset.css, потому что, как правило, все элементы потом всё равно переопределяются и для каждого проекта формируется некое подобие UI kit. Но если вы верстаете страницу без формирования определения всех элементов, то, возможно, вам подойдет normalize.css — так вам не надо будет задавать отступы между параграфами и заголовками, переопределять списки и т. д.
      Стили каких элементов лучше переопределить в самом начале?
      Тут всё упирается в то, какую стратегию вы выбрали :) Мой необходимый набор:
      *, *:after, *:before { box-sizing: border-box; margin: 0; padding: 0; }
      Где можно об этом почитать поподробнее и найти код?
      Хорошая статья на HTML-академии и на Хабре
      Код: reset.css, normalize.css
      P.S. reset будущего будет выглядеть примерно так:
      * { all: unset; }
      head { display: none; }

Получение неправильного ответа

Почему при вводе числа 2 в e_power_enter программа выводит в MessageBox ответ 19, а не 20? (engine.power типа float)
int k; engine.power = float.Parse(e_power_enter.Text) / 100; k = (int)(engine.power * 1000); MessageBox.Show(Convert.ToString(k));


Ответ

Дело в том, что float/double в C# (а также в Java, С++ и т. д.) — двоичные дроби. Они представлены внутри как набор из целого числа (мантиссы) и степени двойки (порядка). Число 2 может быть представлено в виде двоичной дроби, а вот 0.02 — нет, т. к. оно равно 1/50 (а в знаменателе не только степени двойки). Поэтому число 0.02 не может быть точно представлено в виде float
Что же содержится в переменной engine.power? Там содержится двоичная дробь, наиболее близкая к 0.02. Проверим это таким кодом:
float enginepower = 2f / 100; Console.WriteLine(enginepower * 100 - 2);
Он выдаёт не 0, как можно было бы ожидать, а -4,470348E-08 (на моей машине).
Это значит, что значение engine.power реально немного меньше двух. При умножении на 1000 результат будет немного меньше 20, приведение к int отбрасывает дробную часть, и результат получается равным 19.

А что нужно делать? Есть несколько вариантов.
Вместо неустойчивого к мелким ошибкам отбрасывания дробной части
(int)(engine.power * 1000)
использовать гораздо более здравое округление
(int)Math.Round(engine.power * 1000) Если вам похожие проблемы встречаются часто, имеет смысл перейти на тип данных decimal, в котором числа внутри хранятся как десятичные, а не двоичные дроби. Учтите, что операции с этим типом данных медленнее, т. к. нету нативной поддержки процессорами.

Продвинутое расследование, с копанием в ассемблерном выхлопе и спецификации.
На моей машине вот такой код:
float f = 0.02f; float ff = f * 1000; int k = (int)(ff);
вычисляет в k значение 20, а вот такой:
float f = 0.02f; int k = (int)(f * 1000);
— 19. (Это в Debug-режиме; в Release-режиме обе версии текста производят один и тот же ассемблерный код и одинаковый результат — 19.) Расследую, почему так.
Произведённый JIT ассемблерный код такой:
; float f = 0.02f; mov dword ptr [ebp-40h],3CA3D70Ah ; 32bit f = 0.02f ; float ff = f * 1000; fld dword ptr [ebp-40h] ; extend f to 80bit prec and push fmul dword ptr ds:[1453D00h] ; multiply by 32bit 1000f fstp dword ptr [ebp-44h] ; pop and convert 80bit result to 32 bit -> ff ; int k = (int)(ff); fld dword ptr [ebp-44h] ; extend ff to 80bit prec and push fstp qword ptr [ebp-50h] ; pop and convert to 64bit -> double temp movsd xmm0,mmword ptr [ebp-50h] ; extend temp to 128bit and copy to xmm0 cvttsd2si eax,xmm0 ; truncate to 32bit int eax mov dword ptr [ebp-48h],eax ; store to k
и
; float f = 0.02f; mov dword ptr [ebp-40h],3CA3D70Ah ; 32bit f = 0.02f ; int k = (int)(f * 1000); fld dword ptr [ebp-40h] ; extend f to 80bit prec and push fmul dword ptr ds:[1393CF4h] ; multiply by 32bit 1000f fstp qword ptr [ebp-4Ch] ; pop and convert to 64bit -> double temp movsd xmm0,mmword ptr [ebp-4Ch] ; extend temp to 128bit and copy to xmm0 cvttsd2si eax,xmm0 ; truncate to 32bit int eax mov dword ptr [ebp-44h],eax ; store to k
Это можно условно записать так:
float32 f = 2f / 100; float80 r1 = f; r1 *= float32(1000f); float32 ff = r1; r1 = ff; // <-- тут потеря точности float64 temp = r1; float128 r2 = temp; int32 k = (int32)r2;
и
float32 f = 2f / 100; float80 r1 = f; r1 *= float32(1000f); float64 temp = r1; float128 r2 = temp; int32 k = (int32)r2;
Разница, как мы видим, в том, что для вычисления промежуточного результата значение f * 1000 обрезается до 32-битной точности, а потом загружается назад в 80-битный регистр, а оттуда через 64-битное значение загружается в XMM-регистр. Во втором варианте кода сохранение промежуточного результата отсутствует, код не обрезает значение, и до 64 бит обрезается более точное 80-битное значение, что и приводит к разнице в результате.

Явное разрешение на такие разные пути вычисления есть в спецификации языка, §4.1.6 Floating Point Types:
Floating-point operations may be performed with higher precision than the result type of the operation. For example, some hardware architectures support an “extended” or “long double” floating-point type with greater range and precision than the double type, and implicitly perform all floating-point operations using this higher precision type.
Ещё по теме: Strange behavior when casting a float to int in C# (особенно верхний ответ).

Регулярное выражение для проверки ФИО с учетом тире

Есть регулярное выражение для проверки ФИО:
var regExp = /^([А-ЯA-Z]|[А-ЯA-Z][\x27а-яa-z]{1,}|[А-ЯA-Z][\x27а-яa-z]{1,}\-([А-ЯA-Z][\x27а-яa-z]{1,}|(оглы)|(кызы)))\040[А-ЯA-Z][\x27а-яa-z]{1,}(\040[А-ЯA-Z][\x27а-яa-z]{1,})?$/
if (regExp.test("Иванов-Сергеев Иван Иванович")) console.log("true"); else console.log("false");
Данное регулярное выражение верное, но как добавить в проверку ФИО тире? Например, для такого ФИО:
Иванов-Сергеев Иван Иванович
У людей бывает тире в фамилии или в имени. Как будет правильно написать такое регулярное выражение?


Ответ

Правильно будет не писать регулярное выражение на ФИО. Не портите и не усложняйте жизнь ни себе, ни пользователям. Разве что на максимальную длину стоит сделать ограничение. Причем только как защиту от злоумышленников, которые попытаются туда подсунуть пару-тройку тысяч символов.

Как получить название текущего месяца на русском?

mSelectMonth = (TextView)view.findViewById(R.id.select_month); Calendar calendar = Calendar.getInstance(); mSelectMonth.setText(calendar.getDisplayName(Calendar.MONTH, Calendar.LONG_FORMAT, Locale.ENGLISH));
Так выводим на английском, а как сделать русский?


Ответ

Использовать русскую локаль вместо английской:
Calendar calendar = Calendar.getInstance(); String month = calendar.getDisplayName(Calendar.MONTH, Calendar.LONG_FORMAT, new Locale("ru"));
Вывод на экран:
августа

Если нужны нестандартные названия месяцев, то придётся создать массив с ними:
String[] monthNames = { "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" }; String month = monthNames[calendar.get(Calendar.MONTH)];
Август

round border css

Мой вопрос:
Возможно ли сделать средствами CSS данный блок(интересует круглый border):

Пожалуйста, обратите внимание, синий круг над серым.
Мой вариант: я сделал, но с помощью картинки:
.number { position: relative; width: 105px; height: 105px; text-align: center; display: block; margin-left: auto; margin-right: auto; margin-top: 30px; } .number.number_img:before { content: ''; position: absolute; right: -2px; top: -2px; width: 100%; height: 100%; display: block; background-image: url(https://erweb.ru/wp-content/uploads/2017/08/circles-1.png); background-repeat: no-repeat; background-position: top right; z-index: 2; } .number .number__value { position: relative; font-family: 'Montserrat', sans-serif; font-size: 55px; font-weight: 500; line-height: 0.55; display: block; padding: 35px; max-width: 100px; max-height: 100px; border-radius: 50px; color: #3e9ded; border: solid 1px #cccccc; }

1

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

2). Данный блок не подразумевает какую-либо анимацию, решение на CSS должно быть. 3). Скругление концов полуокружности не обязательная часть, интересует только корректное наложение одного круга над другим, с возможностью ставить произвольно длину синего круга.


Ответ

Решение с использованием SVG:
.number { position: relative; width: 105px; height: 105px; text-align: center; display: block; border-radius: 100%; margin-left: auto; margin-right: auto; margin-top: 30px; border: solid 1px #cccccc; } .number .number__value { position: relative; font-family: 'Montserrat', sans-serif; font-size: 55px; font-weight: 500; line-height: 0.55; display: block; padding: 35px; max-width: 100px; max-height: 100px; color: #3e9ded; } .number__fill { position: absolute; z-index: 2; left: -1px; top: -1px; right: -1px; bottom: -1px; } .number__fill svg { fill: none; stroke: #3e9ded; stroke-width: 5px; overflow: visible; transform: rotate(-90deg); stroke-linecap: round; stroke-dasharray: 330px; }

1
2
3
4

В данном случае в атрибуте stroke-dasharray 330 - длина всего круга (если точнее, то 329.3343811035156), а stroke-dashoffset - смещение обводки относительно начального положения.

Лишний байт при записи структуры в файл

Откуда берется лишний байт?
#include #include #include
#pragma pack(push, 1) typedef struct { int a; float b; } structEx; #pragma pack(pop) using namespace std; int main() { { structEx x; x.a = 2; x.b = 4.2; ofstream fout("Text1.txt"); for (int i = 0; i < 10; i++) { x.a += 3; x.b += 0.5; fout.write((char *)&x, sizeof(x)); } fout.close(); } { structEx x; x.a = 2; x.b = 4.2; ofstream fout("Text2.txt"); for (int i = 0; i < 10; i++) { x.a += 3; x.b += 0.51; fout.write((char *)&x, sizeof(x)); } fout.close(); } return 0; }
Text1.txt при x.b += 0.5;
// 0500 0000 6666 9640 0800 0000 6666 a640 // 0b00 0000 6666 b640 0e00 0000 6666 c640 // 1100 0000 6666 d640 1400 0000 6666 e640 // 1700 0000 6666 f640 1a00 0000 3333 0341 // 1d00 0000 3333 0b41 2000 0000 3333 1341
Text2.txt при x.b += 0.51;
// 0500 0000 52b8 9640 0800 0000 3e0d 0aa7 // 400b 0000 002a 5cb7 400e 0000 0016 aec7 // 4011 0000 0002 00d8 4014 0000 00ee 51e8 // 4017 0000 00da a3f8 401a 0000 00e3 7a04 // 411d 0000 00d9 a30c 4120 0000 00cf cc14 // 41


Ответ

По умолчанию потоки открываются в текстовом режиме (при котором символ
преобразуется в Windows в пару
), так что надо просто вместо
ofstream fout("Text.txt");
написать
ofstream fout("Text.txt", ios::binary);
Компьютер не понимает разницы между бинарными и текстовыми данными - для него все это один поток байтов, а что они означают - ему безразлично. Когда вы открываете файл для записи в текстовом режиме в соответствующей операционной системе, это означает команду "пиши байты как есть, но если встретишь байт 0x0A - запиши пару 0x0D 0x0A". А при чтении - наоборот - "если встретишь эту пару байт - то в память заноси только один 0x0A"

Проверка наличия COM порта

Как проверить подключён COM-порт или нет? Например, пользователь выбрал COM 3, но во время работы этот порт был отключён. Как грамотно выполнить проверку присутствует ли COM-порт и возможно ли его открыть?
На данный момент делаю вот так(пример):
SerialPort port = new SerialPort("COM 8"); string[] allport = SerialPort.GetPortNames(); bool stat = false; for (int i = 0; i < allport.Length; i++) { if (allport[i] == port.PortName) { stat = true; break; } } if (stat) port.Open(); else Console.WriteLine("{0} отключен.", port.PortName);
Но уверен, что данною операцию можно реализовать грамотней.


Ответ

Насколько я понимаю, порт может быть отключён в любой момент. Поэтому я бы делал так: работал с портом как обычно, а при приходе IOException говорил бы пользователю о проблемах при коммуникации с портом.
Проверять можно через
using System.IO.Ports;
var port = new SerialPort("COM99"); port.Open(); // бросает исключение, если порта нет
или
SerialPort.GetPortNames().Contains("COM99")
(как делаете это вы).
Но отлова исключений всё равно не избежать, т. к. порт может появиться или исчезнуть сразу после проверки.

Сравнение производительности штатных компиляторов Delphi, pascalABC.net и C++

В очередной раз очередной студент с горящими глазами объявил, что "всё, что у нас написано на Delphi - медленно и безобразно и, если мы уж не хотим перейти на C++, то почему бы не перейти на pascalABC.net, он быстрее значительно".
Студенту поручили проверить всё это. Конкретная задача (постараюсь определить в терминах скорости компиляторов, как мне указали в комментариях): сравнить производительность штатных компиляторов Delphi, PascalABC.net и MS VS (версий, которые у нас имеются. Не такие древние, хотя по академической лицензии иметь всегда последнее порой сложно). Выкладки, которые он привёл из сети, в целом не особо убедительны. Да, быстрее, но в конкретных примерах. Как они относятся к нашим задачам - не совсем ясно. Студенту поручили, в итоге, всё проверить на практике.
Вопрос, может, кто-то уже сталкивался с необходимостью сравнения скорости на больших биоинформатических проектах (или похожих: основной массив работы - строки, большое их количество, сравнение, точный и нечеткий поиск, построение деревьев, циклы, статистика) Delphi vs PascalABC.net и, возможно, C++?
Принцип подхода к снаряду понятен, объём работы - тоже. Но, мне, как куратору студента, хотелось бы понимать, насколько правильно он выполнил свою работу. Для этого неплохо было бы и сравнить его результаты с уже имеющимися, если таковые есть.


Ответ

Похоже, такие желания появляются у каждого третьего студента :) По крайней мере, у нас часто возникают схожие студенческие задачи, особенно, если приходят студенты с мехмата или ВИТ и желают заниматься только программированием. Ну, ладно, это лирика.
По делу. Сейчас у нас силами трёх студентов решается большая задача по оптимизации конвейера анализ->расшифровка->расчеты->моделирование->диагноз, в ней, в частности, большую часть занимают проблемы производительности наших пакетов, в том числе, созданных разными компиляторами. В списке компиляторов есть все три указанных вами, так что я могу в целом описать картину сравнения. Могу дать промежуточные выводы. Подробные данные могу опубликовать только с разрешения авторов (дипломная работа не окончена), если оно будет, я дополню ответ.
Сразу приведу класс задач в наших пакетах. Это работа с огромными и маленькими строками, матрицами (в меньшей степени), проблемы поиска, динамическое программирование, множества, ряды Фурье и вейвлеты, ввод-вывод. Время расчёта результата анализа одного пациента при работе в один поток может достигать 10-12 часов, так что погрешностями в долях секунды при замере времени работы можно пренебречь. В расчет принималось среднее от отношения времен работы. Для разных ситуаций количество замеров разное, но всегда больше 7.
Версии компиляторов: Delphi for Win64 31.0 (Delphi 10.1), PascalABC.net 3.2.0.1415, VS 2015 (14.00.24720)
Пакет на Delphi, написанный с использованием только стандартных методов и функций Delphi, в один поток, уступал по производительности и PascalABC.net и, тем более, C++. Разница в нашем основном пакете могла достигать, в зависимости от данных, 1.3 раза с паскалем и до 1.5х раз с C++ (есть разные результаты для разных процессоров, это самая большая разница). Так что, если не желаете заниматься профилировкой, а скорость работы критична, я бы не рекомендовал писать на Delphi. То же самое, но в многопоточном виде. Большинство наших задач успешно распараллеливаются, так что мы охотно применяем многопоточность. Разница Delphi супротив C++ в худшем случае осталась около 1.5х раз, с PascalABC.net - 1.1 раза. Скорее всего, в PascalABC.net многопоточность ещё плохо "вылизана". Многопоточная профилированная задача. В данном случае были выявлены "бутылочные горла" и проблемные места переписаны на ассемблере. Это было сделано для Delphi и C++. PascalABC.net не поддерживает встроенный ассемблер, были сделаны попытки подключения библиотек, но ожидаемого успеха пока не добились. Как итог, сравнение Delphi с C++ - отставание в 1.15 раза (на Intel), неоптимизированный пакет PascalABC.net проиграл Delphi в 1.6 раза То же самое, но с поддержкой SIMD. Вот тут уже почти паритет. Отставание Delphi от C++ на процессорах Intel - 1.06 раза (было бы интересно скомпилировать компилятором от Intel с интринсиками, но не знаю, будет ли реализовано или нет), на процессорах AMD - 1.01 раза. PascalABC не сравнивался - причина в п. 3
Была еще проведена оптимизация под конкретные ядра. Тут вообще интересные результаты (в частности, при оптимизации под ядра Zen на Ryzen 1700 в 16-типоточном приложении пакет на Delphi был повторяемо быстрее всех, что мы пока не можем внятно объяснить), но в промежуточном выводе они не представлены, без разрешения авторов я их дать не могу.

Проверка ссылки на изображение. Битая или нет

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


Ответ

Вообще все просто, создаем изображение и пытаемся загрузить его. Если получилось - ссылка есть, если не получилось, то вероятнее ссылки нет ( либо проблемы на сервере )
const checkImgSrc = src => { const img = new Image(); img.onload = function () { console.log(`valid src: ${src}`); } img.onerror = function () { console.log(`unvalid src: ${src}`); } img.src = src; } checkImgSrc('eruiqnwg'); // возможно ссылка уже устареет, но все же checkImgSrc('https://fullhdpictures.com/wp-content/uploads/2015/03/Snow-Leopard-Full-HD-Wallpapers.jpg');

Откуда берется байт?

char digits[] = "0123456789";
printf("%d", sizeof(digits)); Печатает 11, а мне казалось, что должно быть - 10.


Ответ

Строки в C устроены особым образом. Дело в том, что строка в C — это, по сути, простой массив. А массив — это последовательность (в нашем случае) байтов. В нём нигде не хранится длина. Соответственно, чтобы была возможность вычислить длину строки, в конец строки добавляется нулевой байт. Таким образом можно узнать длину строки (так работает функция strlen) — надо пробежаться по массиву до тех пор, пока в нём не встретится нулевой байт (нулевой байт и символ «0» — это не одно и то же!). Встретили нулевой байт — значит, строка закончилась. Проверьте сами. В случае Вашего массива digits[10] == 0 На всякий случай, ещё раз обращаю Ваше внимание на то, что digits[0] == 48. 48 — это ASCII-код символа «0».

iOS или Android?

Не подскажите, что сейчас изучать перспективнее: iOS или Android? С точки зрения востребованности у работодателей.


Ответ

И так вот подробный ответ с моими рассуждениями: iOS: Основной язык - Objective-C Магазин приложений - AppStore В магазине больше платных приложений чем бесплатных, пользователи охотно покупают приложения по приемлимой цене в 1-2$ Возможность разместить в приложении рекламу с большим охватом и прибылью, работать сразу с рекламными 10-12 компаниями и показывать всех их объявления (Обновление раз в 30 секунд, показ следующего). Предоставляет такой сервис как Mobclix. В данной сфере лично эффективность рекламы не тестировал Относительно дешевая и выгодная реклама приложений (Относительно эффективности не знаю) Нет проблем совместимости, пишется под один девайс, с одним размером экрана и набором функций При размещении приложений низкий % отказа пользователей, нет проблем совместимости, многие юзеры не качают приложение что бы 10 минут с ним поиграться. Android: Основный язык - Java Магазин приложений - AndroidMarket Пользователи не особо активно покупают платные версии приложений, из за открытости платформы предпочитают бесплатные версии. Возможность разместить в приложении рекламу с огромным охватом и прибылью, работать сразу с рекламными 8-9 компаниями(Включая OpenAllocation - AbMob, AdWords) и показывать всех их объявления (Обновление раз в 30 секунд, показ следующего). Предоставляет такой как сервис Mobclix. Если рекламодатель платит за показы или установки приложения иногда получается очень прибыльным занятием. Достаточно не дешевая реклама своего приложения (0.03-0.04$ за клик по баннеру,если платить за инсталлы то 0.25-1$ за установку) Проблемы совместимости, разные размеры экранов, разные версии системы, встречал даже такое что один функционал работающий на моем девайсе не работает на некоторых других моделях При размещении приложений и скачиванием их юзерами большой процент отказов, обычно даже бывает доходит до 40-50% (Следствием того является пункт выше + многие юзеры качают приложение "поразвлекаться")

Как сделать такой же код без eval'a?

Я делаю "генетический калькулятор", он должен "скрещивать" каждую букву каждого элемента gens[[],[]] с другой другого элемента.
Есть такой код, который создаёт код, который затем исполняется:
for (var u in gens) { var estr = ""; for (var i = 0; i < gens[u].length; i++) { var na = gens[u][i].charAt(0).toUpperCase(); estr += 'for(var ' + na + '=0;' + na + '<=1;' + na + '++){
'; }
estr += 'var res=cross(['; for (var i = 0; i < gens[u].length; i++) { var na = gens[u][i].charAt(0).toUpperCase(); estr += 'gens[' + u + '][' + i + '].charAt(' + na + '),'; }
estr = estr.substring(0, estr.length - 1); estr += ']);
if(!test(gomets[' + u + '],res,true)){gomets[' + u + '].push(res);}
'; for (var i = 0; i < gens[u].length; i++) { estr += '}
'; }
alert(estr); //eval(estr); }
Суть в том, что он при gens=[['AA','Bb'],['aa','BB']]; создаёт сначала код:
for (var A = 0; A <= 1; A++) { for (var B = 0; B <= 1; B++) { var res = cross([gens[0][0].charAt(A), gens[0][1].charAt(B)]); if (!test(gomets[0], res, true)) { gomets[0].push(res); } } }
А потом
for (var A = 0; A <= 1; A++) { for (var B = 0; B <= 1; B++) { var res = cross([gens[1][0].charAt(A), gens[1][1].charAt(B)]); if (!test(gomets[1], res, true)) { gomets[1].push(res); } } }
Суть в том, чтобы код создавал столько вложенных циклов, сколько элементов в gens[u], например, gens[0].
Каждый цикл должен считать от 0 до 1 (так длина строки "AA" ,"bb" и тд 2 символа) и записывать результат в переменную, имя которой соответствует gens[u].[номер элемента/цикла].charAt(0); в теле самого вложенного цикла исполняется функция, ей в параметры должен попадать масив с элементами gens[u][0].charAt(имя счётчика цикла), тк индекс колеблется от 0 до 1, то цикл берёт каждую букву. Я думал над алгоритмом, ничего лучше придумать не смог, т.к количество элементов в gens[u] колеблется и все буквы всех элементов надо по очереди передавать функции, а для этого нужно столько циклов, сколько элементов в gens[u]
Собственно вопрос: можно ли это организовать без eval'a?
ps Если что не понятно в вопросе, спрашивайте, я объясню.
UPD: для gens=[['AA','Bb','Cc'],['aa','BB','Cc']]; генерируется код:
for (var A = 0; A <= 1; A++) { for (var B = 0; B <= 1; B++) { for (var C = 0; C <= 1; C++) { var res = cross([gens[0][0].charAt(A), gens[0][1].charAt(B), gens[0][2].charAt(C)]); if (!test(gomets[0], res, true)) { gomets[0].push(res); } } } }


Ответ

Без рекурсии и излишних вложенных циклов. Тут получается для каждого массива двоичная система. Соответственно комбинаций разных генов может быть 2^(длина массива). Надо перебрать все различные комбинации... var gens = [['AA', 'Bb', 'Cc'], ['aa', 'BB', 'Cc']];
for (u in gens) { var gen = gens[u]; for (var i = 0; i < 1 << gen.length; i++) {// 2^длина массива комбинаций var args = []; for (var j = 0; j < gen.length; j++) {// создаем массив разных сочетаний var gi = (i & (1 << j)) >> j;// получаем индекс буквы // по номеру комбинации // и по номеру индекса элемента массива // (сорри в генетике не силен, // что как называется не в курсе) args.push(gen[j].charAt(gi));// заполняем массив параметров для cross } var res = cross(args); if (!test(gomets[u], res, true)) { gomets[u].push(res); } } } JsFiddle тест для составления списка аргументов.

Точность при вычислении

Решаю олимпиадные задачи различного рода, когда работал в Паскале никогда и не задумывался над работой оператора"=" или ">=" в работе с вещественными числами, я думал, что с точностью сравнений и проблем не может быть. Но вот я перешел на C++ и один учитель мне сказал, что "==" или ">=" нельзя использовать при работе с вещественными числами в Си, нужно писать fabs(a - b) > eps. И вот вопрос: Правда ли это? Как правильно подобрать eps? И почему же могли некоторые задачи не проходить все тесты с такой фишкой, а когда писал просто "==" они проходили. Вот конкретный пример. Задача, которая прошла после того, как я изменил LessEqual на "<=". Дано действительное число a и натуральное n. Вычислите корень n-й степени из числа a. Программа должна вывести единственное число: ответ на задачу с точностью не менее 6 знаков после запятой #include #include #include
using namespace std; const double eps = 1e-8; const double eps2 = 1e-12;
bool Equal(double a, double b) { return fabs(a - b) < eps2; }
bool lessEqual(double a, double b) { return ((a < b) || Equal(a, b)); }
double a; int n;
void solve() { double l = 0, r = a + 1, mid = 0; while (r - l > eps) { mid = (l + r) / 2; if (lessEqual(pow(mid, n), a)) l = mid; else r = mid; } printf("%.7lf", l); }
int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
scanf("%lf
", &a); scanf("%d", &n); solve();
return 0; }


Ответ

Действительно ничего хорошего из сравнения типа == при операциях с вещественными числами не выйдет. Можно попробовать простой код: double sum = 0; for ( int i = 0; i++; i < 1000000000 ) { sum += 0.000000001 } Гарантировать, что в итоге sum будет равным 1 в данном случаи невозможно. Может быть равен, а может и нет. Дело в машинной точности округления мат. операций. И ваш преподаватель все правильно говорит. Сравнение вида fabs ( 1.0 - sum ) < 0.0000000000000001; Даст верный результат всегда. ps Число 0.0000000000000001 взял просто так, но поверьте, такая ошибка вычислений очень мала, но все же точного результата ( sum == 1.0 ) вы не получите

Классы против структур

Стоит ли в своих кодах C++ использовать структуры? Я так понимаю структуры это пережитки языка С. С одной стороны структуры в написании и использования проще классов но они подрывают принципы ООП.


Ответ

В Си++ основная разница между структурой и классом - это модификатор доступа, который используется по умолчанию для их членов. Для классов, по умолчанию используется модификатор private, а для структур - public. Конечно, принципы инкапсуляции структуры таким образом подрывают, но классы, в свою очередь тормозят стадию проектирования, которая затрагивает структурную эволюцию проекта. Т.е., к примеру: выделить класс из структуры проще, чем из класса, т.к. для класса придется пересматривать логику взаимодействия свойств, которые ранее были на одном уровне доступа. Этот процеесс выливается в дописывание/переписывание методов, обеспечивающих инкапсуляцию. Все было бы хорошо, если бы на какой-то очередной стадии проектирования Вы вдруг не осознаете, что порой ходите кругами, делая пустую работу, прикрывая тылы инкапсуляции. С одной стороны, можно конечно занять позицию рецензора Си++ и следовать "букве закона ООП", т.е. смириться с этой неизбежной бюрократией. Но с другой стороны - это ведь Ваш проект, и Вы вправе строить его по своим законам, давая волю свободному проектированию какого-то сложного класса на структурах, а его финальные версии закрепить на классах по всем правилам ООП

Объясните наглядно разницу раннего и позднего связывания методов.

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


Ответ

Раннее связывание - это когда метод, который будет вызван, известен во время компиляции, например, вызов статического метода.
Кстати, то что вы называете поздним связываением, есть скорее dynamic dispatch.
Позднее связывание - это когда вызов метода может быть осуществлен только во время выполнения и у компилятора нет информации, чтобы проверить корректность такого вызова. В java это можно сделать при помощи рефлексии.

2D графика в linux [закрыт]

посоветуйте 2D библиотеку вывода графики для linux. хотелось бы что нибудь наподобие как библиотека под ДОС - graphics.h


Ответ

Попробуй Cairo, с его помощью много чего написано. Сам писал на нем небольшой редактор графов.

Динамическое построение Linq запроса

public class BaseEntity { public int Id {get;set;} public DateTime Created {get;set;} public bool IsDeleted {get;set;} }
Думаю данные свойства есть почти в каждой сущности, и довольно часто Возникает необходимость получить список за период, т.е. что то типа такого:
var start = new DateTime(2015, 11, 01); var stop = new DateTime(2015, 11, 30); var results = context.Entity.Where(x=>x.Created>=start&&x.Created<=stop).ToList()
но довольно часто таких сущностей несколько и плодить по сути однообразный код крайне не хочется, другой пример получить строки где какое то значение равно заданному, т.е. что то типа этого:
var arg = true; var results = context.Entity.Where(x=>x.IsDeleted==arg).ToList();
и это встречается тоже довольно часто ну и т.д.
т.е. хочется что то типа этого:
var start = new DateTime(2015, 11, 01); var stop = new DateTime(2015, 11, 30); var results = context.Entity.Beetwen("Created",start,stop).ToList();
public static class BaseEntityExtensions { //где field это имя поля по которому надо фильтровать записи public static IQueryable Beetwen(this IQueryable src, string field, DateTime start, DateTime stop) { //Здесь надеюсь пока неизвестная мне *магия* } }
Помогите реализовать метод Beetwen


Ответ

Where метод для IQueryable принимает Expression поэтому его можно собрать самостоятельно
public static IQueryable Beetwen(this IQueryable src, string field, DateTime start, DateTime stop) where T: BaseEntity { var p = Expression.Parameter(typeof(T)); // Param_0 var prop = Expression.PropertyOrField(p, field); //Param_0.field var startExpr = Expression.Constant(start); var stopExpr = Expression.Constant(stop);
var firstCondition = Expression.GreaterThanOrEqual(prop, startExpr); // Param_0.field >= start var secondCondition = Expression.LessThanOrEqual(prop, stopExpr); // Param_0.field <= stop
var fullExpression = Expression.AndAlso(firstCondition, secondCondition); // Param_0.field >= start && Param_0.field <= stop
var func = Expression.Lambda>(fullExpression,p); // Param_0 => Param_0.field >= start && Param_0.field <= stop
return src.Where(func); }
Методы которые использовались:
Expression.Parameter Expression.PropertyOrField Expression.Constant Expression.GreaterThanOrEqual Expression.LessThanOrEqual Expression.AndAlso Expression.Lambda
Альтернативным подходом может быть использование библиотеки DynamicLinq (есть в NuGet) в ней можно передавать в функции не Expression, а строку
src.Where(string.Format("{0} >= @0 && {0} <= @1", field), start, stop);
По мотивам ответа @Vlad, только используя уже переданное выражение
public static IQueryable Beetwen(this IQueryable src, Expression> propertyExpression, DateTime from, DateTime to) { var fromCondition = Expression.GreaterThanOrEqual(propertyExpression.Body, Expression.Constant(from)); var toCondition = Expression.LessThanOrEqual(propertyExpression.Body, Expression.Constant(to));
return src.Where(Expression.Lambda>(Expression.And(fromCondition, toCondition), propertyExpression.Parameters.First())); }
в использовании: var res = query.Beetwen(_ => _.Date, from, to);
И еще вариант, но не такой интересный как предыдущие
public static IQueryable Beetwen(this IQueryable src, Expression> propertyExpression, DateTime from, DateTime to) { Expression> func = d => d >= from && d <= to;
return src.Where(Expression.Lambda>(Expression.Invoke(func, propertyExpression.Body), propertyExpression.Parameters.First())); }
в использовании: var res = query.Beetwen(_ => _.Date, from, to);

немного обобщенный вариант
public static IQueryable Beetwen(this IQueryable src, Expression> propertyExpression, U from, U to) { var fromCondition = Expression.GreaterThanOrEqual(propertyExpression.Body, Expression.Constant(from)); var toCondition = Expression.LessThanOrEqual(propertyExpression.Body, Expression.Constant(to));
return src.Where(Expression.Lambda>(Expression.And(fromCondition, toCondition), propertyExpression.Parameters.First())); }
в использовании: var res = query.Beetwen(_ => _.Date, from, to);

Поиск удачного решения по обработке ошибок

В разрабатываемом приложении часть классов спроектированы таким образом, что статус выполнения функции либо возвращается, либо сохраняется в соответствующем поле. Эти классы связаны с обработкой файлов, xml-документов и т.п. После выполнения каждой операции приходится проверять статус выполнения, например:
if (xmlParser.hasError()) { log(...); return <ошибка выполнения>; // завершаем выполнение текущей функции, поскольку продолжать не имеет смысла. }
Таких проверок в теле функции может набежать довольно много. Собственно вопрос: есть ли возможность уменьшить код, направленный на проверку статуса выполнения, и сосредоточиться на непосредственно логике самой функции. Возможно, лучше будет использовать тогда исключения? Либо текущее решение вполне жизнеспособно?


Ответ

Используйте исключения, они специально придуманы для этой цели.
Либо, при возникновении ошибки переводите xmlParser в состояние, когда он ничего не делает, и приверяйте ошибку один раз после всех операций с ним, как это сделано в стандартных потоках ввода-вывода:
void f(std::istream& s, int& a, int& b) { s >> a >> b; bool eof = !s; ...
Текущий подход к проверке ошибок плох тем, что он никак не поощряет и не контролирует то, что все ошибки будут проверены. Очень легко не написать этот if (xmlParser.hasError()), или например по ошибке написать if (!xmlParser.hasError())
Если использовать возврат ошибок, то лучше возвращать ошибку из самой функции, которая выполняет действие приводящее к ошибке:
void parse(error_code& ec) { if (xmlParser.parse(ec)) return; }
либо можно использовать монады (в т.ч. optional), что является более современным подходом, но к сожалению пока мало библиотек реализующих типы Result, std::expected и т.п.
Result result = xmlParser.parse(); if (!result) return result.error();

Конструктор массива классов

Есть класс корабль, по-умолчанию он инициализируется параметром, который содержит в себя информацию о количестве палуб. Я пытаюсь инициализировать массив, вызвав конструктор, вот так:
Ship ship[SHIP_COUNT](DECK_X4);
Этот код естественно не проходит. И нельзя создать у него метод SetDeck, потому что это будет перечить логике создания кораблей (иначе размер можно будет менять постоянно).
Как можно создать массив класса, вызвав при этом для каждого элемента массива конструктор?


Ответ

Если вы уж пишете на C++, я бы посоветовал отказаться от сишных массивов, и пользоваться нормальными контейнерами.
Для std::vector
std::vector ship; ship.reserve(SHIP_COUNT); for (int i = 0; i < SHIP_COUNT; i++) ship.emplace_back(DECK_X4);

Уточнение: как подсказывает @alexolut, в проектах RAD Studio есть возможность переключаться между старым и новым компиляторами (опция classic compiler в свойствах проекта). Стандарт C++11 поддерживается лишь новым компилятором, поэтому если в проекте используется старый, нужно воспользоваться
push_back(Ship(DECK_X4));
вместо emplace_back

Как выполнить bash скрипт по имени в терминале?

Можно ли сделать так, чтобы не пришлось указывать путь к скрипту, а просто написать его название в терминале и он вызывался?
Пример
Сейчас надо делать так:
sh home/user/test.sh
Хочу вызывать так:
test


Ответ

довольно удобным решением может быть создание каталога с именем, например, bin, внутри своего домашнего каталога:
$ mkdir ~/bin
чтобы можно было запускать исполняемые файлы из этого каталога по имени, достаточно добавить путь к нему в переменную окружения $PATH
export PATH=~/bin:$PATH
эту команду, чтобы не выполнять её в каждом экземпляре оболочки вручную, можно дописать в конец вашего персонального инициализационного файла оболочки, который носит название .shellrc, где shell — имя используемой вами оболочки (его можно узнать, например, командой echo $SHELL). для bash это будет:
~/.bashrc
для zsh
~/.zshrc
и т.п.
стоит заметить, что довольно часто производить последнюю манипуляцию нет необходимости: при наличии каталога ~/bin инициализационные скрипты оболочки автоматически добавят его в переменную окружения $PATH (см., например, содержимое файла ~/.profile). проверить просто: создайте каталог, запустите новый процесс оболочки и проверьте содержимое переменной (echo $PATH).

нужный вам файл надо скопировать в этот каталог под желаемым именем (имя test, кстати, не совсем удачное, так как совпадает с именем встроенной команды оболочки):
$ cp ~/test.sh ~/bin/test
и присвоить бит исполнимости:
$ chmod +x ~/bin/test
в случае, если это скрипт, требующий обработки каким-нибудь интерпретатором (в вашем случае интерпретатором /bin/sh), то первой строкой скрипта должен быть так называемый shebang, содержащий полный путь к программе-интерпретатору:
#!/bin/sh

git: как “нейтрализовать” коммит?

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


Ответ

затем развернуться из следующего перед ним коммита
Подробная информация в вопросе Как вернуться (откатиться) к более раннему коммиту?. Кратко - когда всё почините, сможете просто перейти в нужный коммит или даже новую ветку создать в нём.
выкинуть изменения этого коммита из проекта,
Про это будет весь ответ дальше.
Самый важный вопрос:
Успели ли вы запушить эту ветку на удалённый репозиторий? Возможно ли, что другой разработчик уже получил с удаленного репозитория коммит B или один из последующих и продолжает работать над ним. Если ответ - да, то в общем случае желательно revert, но не rebase, cherry-pick и прочее, что переписывает историю Git, так как это создает большие проблемы с интеграцией.
Поскольку вам нужно развернуться из C, не содержащего изменений из B, то почти наверняка историю переписывать придётся. В таком случае предупредите коллег заранее. Им придётся аналогичным образом ребейзить свои изменения, например с коммита D на D'
Обозначим начальную ситуацию на следующей схеме:
A - B - C - D ↑ branchname (HEAD)
A, B, C, D — коммиты в ветке branchname. B - "плохой коммит", его нам нужно удалить. Коммит C нужно задеплоить. (HEAD) — местоположение указателя HEAD. ↑ обозначает коммит, на который указывает определенная ветка или указатель.
Вариант 1 - через rebase -i
Плюс - меньше мусора в истории. И можно гордиться, что освоил rebase. Плюс - позволяет развернуться из С, не содержащего изменений из B. Минус - переписывает историю, опасно при командной работе.
Команды:
git checkout branchname git rebase -i A git checkout -b deployme C'
В качестве A мы указываем коммит сразу перед тем, который будем исключать. При этом A останется на месте. Откроется редактор, в нём будут коммиты в обратном порядке. Меняем pick на drop, обозначая что мы хотим выкинуть этот коммит.
drop 323d4e6 comment for B pick 31da2b9 comment for C pick 24d420c comment for D
# Rebase c8893f9..24d420c onto c8893f9 (3 command(s)) # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # d, drop = remove commit
Результат
A - C' - D' ↑ branchname (HEAD) ↑ deployme (HEAD)
У новых коммитов теперь другой предок, поэтому это - другие, новые коммиты (хотя содержимое то же за вычетом B). Новая ветка deployme смотрит на коммит C'
Вариант 2 - через revert
Плюс - не переписывает историю и безопасен при командной работе. Проще чем rebase. Минус - ошибочный коммит останется в истории. Плохо, если там информация, которую нельзя показывать или код, который стыдно публиковать. :) Минус - коммит C по-прежнему будет содержать изменения от B
Команды:
git checkout branchname git revert B
Результат:
A - B - C - D - xB ↑ branchname (HEAD)
Новый коммит xB содержит изменения, которые отменяют изменения коммита B. Однако у нас есть проблема: коммит C по-прежнему содержит изменения от B
Немного подробнее о revert
Документация тут, пятый пункт
В дополнение:
Если в процессе ошибётесь или протеряете не тот коммит: Как отменить откат изменений (восстановить потерянный коммит)? Заодно, при желании, можно что-нибудь сделать и с другими коммитами: Как разделить/склеить старый комит?

Операция симетричная разность для двух списков

Есть операция дизъюнкции, т.е. объединения. Я хочу из двух списков взять только уникальные значения, но несовсем понятно как это сделать. Посмотрел Except, Intersect - это не то.
Вот для наглядности
List lst1 = new List(){"1","2","3"}; List lst2 = new List(){"1","2","4"};
//var lstRez = {"3","4"}; Вот что должно получиться в итоге, т.е. символ 4 здесь уникален в обоих списках
Вот как выглядит операция объединения графически


Ответ

Симметрическая разность множеств - это объединение разностей двух множеств, соответственно можно сделать так:
List lst1 = new List(){"1","2","3"}; List lst2 = new List(){"1","2","4"}; List result = lst1.Except(lst2).Union(lst2.Except(lst1)).ToList();
А также у интерфейса ISet есть метод:
void SymmetricExceptWith(IEnumerable other)

Определить какая дата из массива находится ближе всего к введенной дате

Есть массив дат, каждой дате поставлено в соответствие определенное значение параметра. Пользователь вводит дату и надо определить значение параметра, дата которого находится ближе всего к введенной дате. Единственное что приходит в голову это использовать массив кортежей List>, в котором хранить параметр и разницу между датами (датой параметра и введенной датой) и затем отсортировать и взять первое значение. Возможно есть более красивый способ? Спасибо.


Ответ

Как верно заметили, сортировка не нужна. Быстрее будет пробежаться по всем элементам, на ходу вычисляя самый близкий. Ну и не забудьте про приведение дат к UTC, например, если они у вас из разных поясов.
var data = new Dictionary() { { DateTime.Now.AddDays(-2), -2 }, { DateTime.Now.AddDays(-1), -1 }, { DateTime.Now.AddDays(3), 3 }, };
var specifiedDate = DateTime.Now;
var distances = data .Select(p => new { Distance = Math.Abs((specifiedDate - p.Key).Ticks), p.Value });
var distance = long.MaxValue; int closestParameter; foreach (var pair in distances) { if (pair.Distance < distance) { distance = pair.Distance; closestParameter = pair.Value; } }

Почему для static-метода нельзя опустить имя класса?

Доброго времени суток.
Имеется пример метода, сортирующего список, в рамках которого используются статические методы sort() и reverseOrder(). Они записаны со ссылкой на класс Collections
Collections.sort(copy, Collections.reverseOrder());
Если метод sort() встречается во многих классах и без уточняющей ссылки на Collections не обойтись, то метод reverseOrder() представлен лишь в одном экземпляре. Почему, в таком случае, запись:
Collections.sort(copy, reverseOrder());
будет неверна?
Благодарю.


Ответ

Данная проблема решается статическим импортированием:
import static java.util.Collections.reverseOrder;
В противном случае, необходимо при компиляции обойти все классы в classpath и проверить наличие там данной функции.

Как выбрать строку с максимальным id

Как выбрать строку с максимальным id где в колонке page будет poll
Пробовал вот так SELECT MAX(id) FROM wall
Всё хорошо, но мне нужно что бы выбрало строку где в параметре page будет poll


Ответ

Вы захотели дать ответ на свой вопрос, он видимо решает вашу конкретную проблему. Но его минусуют, а другой ответ - плюсуют. В чём дело?
Программист -- это чёткость ума и точность формулировок.
Если бы вы сформулировали задачу как "найти идентификатор строки с максимальным..." -- то ваш ответ блестяще бы подошёл под условия задачи. Да, бывает, что некоторые начинающие не знают о существовании конструкции where и спрашивают про неё. Вот такой ответ был бы достаточным и полным:
SELECT MAX(id) FROM wall WHERE page='poll'
Но.. вы написали "Как выбрать строку с максимальным" и даже вынесли это в заголовок. И такое (на ваш взгляд) незначительное изменение кардинально меняет суть вопроса (для отвечающих).
От своей конструкции вы не перейдёте к тому, чтобы выбрать всю строку или часть полей строки. А вот ответ @Naumov в этом плане красив, точен и делает именно то, что спрашивают:
SELECT * FROM `wall` WHERE `page` = "poll" ORDER BY `id` DESC LIMIT 1
Я вообще почему взялся дописывать ответ, хотя уже есть два ответа сразу на два вопроса? Дело вот в чём.
Если у вас есть два сервера, на одном крутится sql-сервер, а на другом - клиент (и даже в случае если это один и тот же сервер), то наша задача - беречь ОЗУ буферов в памяти, через которые сервер отдаёт клиенту данные (передать два поля таблицы по сети или двадцать два - есть разница), беречь трафик по сети (передавать одну строку или миллион строк) и количество подключений (это время, тормоза).
Для чего вам нужен этот ID? Пользователю сайта не нужны ID, ему нужны другие поля таблицы. Самым неразумным будет получить на клиенте этот max(id) с сервера и тут же полезть следующим запросом выбирать все поля SELECT * FROM table WHERE id = полученый id.
Даже такой громоздкий запрос будет лучше с точки зрения того, что бережёт соединения и уменьшает общее время работы:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM wall WHERE page='poll')
Но это менее оптимальный запрос, чем ответ, который вам уже дал Наумов, можете посмотреть план выполнения запроса через explain.
Поэтому я рекомендую принять именно его версию, а не вашу. Альтернативно можно было бы переписать формулировку вопроса и принять его. Но я не уверен, что вам охота будет столько заморачиваться - а главное, я думаю, что для будущих посетителей оставить именно такую версию вопроса, потому что именно по таким запросам и будут гуглить впоследствии.
Итого, небольшая сводка:
Желательно чётко понимать, что вам нужно: либо только id либо вся строка.
Надеюсь, информация из моего ответа поможет сделать более осознанный выбор.

Cоздать круглую стрелку с использованием только HTML и CSS?

Я пытаюсь создать круглую стрелку направления с CSS и HTML. Ниже приведены мои попытки.
Attempt 1
В этом коде я повернул div и стрелку, но они находятся в разных позициях.
#curves div { width: 100px; height: 100px; border: 5px solid #999; } #curves.width div { border-color: transparent transparent transparent #999; } #curve1 { -moz-border-radius: 50px 0 0 50px; border-radius: 50px 0 0 50px; } .arrow-right { width: 0; height: 0; border-top: 10px solid transparent; border-bottom: 10px solid transparent; border-left: 27px solid #ccc; float: right; margin-top: -7px; margin-right: -26px; }


Attempt 2
В этом примере стрелка, которую я создал,- прямая.
.container { width: 60%; height: 9px; background: #ccc; margin: 100px auto; -moz-border-radius: 50px 0 0 50px; border-radius: 50px 0 0 50px; } .arrow-right { width: 0; height: 0; border-top: 10px solid transparent; border-bottom: 10px solid transparent; border-left: 27px solid #ccc; float: right; margin-top: -7px; margin-right: -26px; }

Update Я хочу получить, что-то вроде этого.

Перевод вопроса: How can I create a round arrow with only HTML and CSS? @MKD


Ответ

Может быть это не красивое решение но рабочее
* { margin: 0; } div { width: 100px; height: 100px; border-width: 10px; border-color: transparent transparent #000 #000; border-style: solid; border-radius: 100px; position: relative; margin: 20px; } div:after { content: ""; border: 20px solid transparent; border-bottom: 20px solid #000; position: absolute; transform: rotate(45deg); top: -20px; right: 58px; } div:hover { transform: rotate(3600deg); transition: all 12s linear; }


Не работают манипуляторы вывода потока ostream

Не работает такой простейший вывод:
#include #include int main() { int x(84568); std::cout << std::setiosflags( std::ios_base::hex | std::ios_base::showbase | std::ios_base::uppercase) << x << std::endl; std::cout << x << std::endl;
return 0; }
Вывод таков:
84568
84568
С чем это может быть связано? Спасибо.


Ответ

"Не работает" в данном случае именно std::ios_base::hex.
Функция setiosflags выставляет флаги по логике побитового ИЛИ. std::ios_base::hex - это не просто один флаг, который можно просто взять и выставить. Форматам dec, hex и oct по понятным причинам соответствует целое битовое поле, состоящее из нескольких битов. Выставлять значение этого поля по логике ИЛИ (как это делает setiosflags) будет неправильно. Единичные биты для hex, разумеется, выставятся, но уже уже присутствовавшие в этом поле единичные биты, скажем, для dec при этом не сбросятся. В результате произойдет "перемешивание" битов dec и битов hex с непредсказуемым результатом. В вашем случае формат просто остался dec
Для того, чтобы перейти в формат hex через setiosflags надо сначала обнулить быты, ответственные за выбор системы счисления, а уж затем можно будет применять побитовое ИЛИ для выставления нового значения флагов через setiosflags. Например
std::cout << std::resetiosflags(std::ios_base::basefield) << std::setiosflags(std::ios_base::hex) << x << std::endl;
Когда вы пользуетесь манипулятором std::hex он все делает за вас сам - чистит старые флаги и выставляет новые. А если вы хотите пользоваться setiosflags - то чистка флагов становится вашей ответственностью.

Python Взаимодействие с cmd.exe

Добрый день. С питоном знаком не так давно. Уже не первый день бьюсь с такой задачей: Необходимо вызвать командную стоку windows, отправить команду (например ipconfig) Затем полученный результат сохранить в notepad. Пробовал через pywinauto/ subprocess, к сожалению дальше вывода cmd экран продвинуться не смог. Подскажите, как можно реализовать, или в каком направлении искать :-) Заранее спасибо.


Ответ

Чтобы получить результат команды как строку, не обязательно cmd.exe вызывать, можно напрямую запустить дочерний процесс:
import subprocess
output = subprocess.check_output('ipconfig')
Чтобы "сохранить в notepad", просто в файл пишите результат:
from pathlib import Path
Path('~/output.txt').expanduser().write_bytes(output)
Вместо приведённого пути (сохраняет файл output.txt в домашнюю директорию пользователя), можно специфичную для программы директорию использовать (текущую рабочую директорию или путь относительно скрипта или что appdirs модуль возвращает).
Можно за один шаг: вызывать команду и сохранить её результат в файл сразу:
with Path('~/output.txt').expanduser().open('wb', 0) as file: subprocess.run('ipconfig', stdout=file, check=True)
См. Python - Запуск cmd.exe с аргументом, и последующим сохранением ответа в .txt файл
Чтобы сохранить вывод, используя другую кодировку (к примеру, если вы кракозябры видите), необходимо декодировать вывод программы в Unicode, а затем сохранить в кодировке, которую понимает ваше окружение:
import ctypes import os
encoding = os.device_encoding(1) or ctypes.windll.kernel32.GetOEMCP() text = subprocess.check_output('ipconfig', encoding=encoding)
Byte при печати вывода внешней команды
После этого в желаемой кодировке можно сохранить. К примеру, по умолчанию используется locale.getpreferredencoding(False) кодировка:
Path('~/output.txt').expanduser().write_text(text)
вы можете в write_text() другую кодировку передать (к примеру, encoding='utf-8').

Как лучше сделать подсветку курсора?

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


Ответ

Мы не ищем лёгких путей!
var curBg = document.querySelectorAll('.cur-bg'), mouseBg = document.getElementById('mouse-bg'); for (var i = 0; i < curBg.length; i++) { curBg[i].addEventListener('mousemove', foo, false); curBg[i].addEventListener('mouseleave', boo, false); } function foo(event) { mouseBg.style.display = 'block'; mouseBg.style.left = (event.clientX - 7) + 'px' mouseBg.style.top = (event.clientY - 7) + 'px' } function boo() { mouseBg.style.display = 'none'; } #mouse-bg { width: 15px; height: 15px; border-radius: 8px; background: linear-gradient(270deg, #41bd9d, #d72222); background-size: 400% 400%; display: none; position: absolute; pointer-events: none; -webkit-animation: AnimationName 1s ease infinite; -o-animation: AnimationName 1s ease infinite; animation: AnimationName 1s ease infinite; } @-webkit-keyframes AnimationName { 0% { background-position: 0% 50% } 50% { background-position: 100% 50% } 100% { background-position: 0% 50% } } @-o-keyframes AnimationName { 0% { background-position: 0% 50% } 50% { background-position: 100% 50% } 100% { background-position: 0% 50% } } @keyframes AnimationName { 0% { background-position: 0% 50% } 50% { background-position: 100% 50% } button


C# асинхронность

Работает ли данный код асинхронно? По идее, должен, но у меня почему-то основной поток блокируется.
static void Main(string[] args) { DoSomething(); Console.WriteLine("Now u can type something"); Console.ReadLine(); }
public static async void DoSomething() { using (FilmContext context = new FilmContext()) { var c = await (from b in context.Films select b).ToListAsync();
foreach (var a in c) { Console.WriteLine(a.Descripton); } } }


Ответ

Смотрите.
Вы хотите, чтобы вывод в функции Main происходил после окончания DoSomething? Значит, вам нужно (асинхронно) дождаться окончания работы этой функции. Для этого нужны следующие изменения:
Функция должна возвращать не void (async void вообще нужен лишь в специфических случаях, т. к. его невозможно дождаться через await), а Task Вы должны в Main дождаться окончания DoSomething, используя await DoSomething(); Чтобы в функции Main можно было использовать await, проще всего сделать её тоже асинхронной. В свежих версиях C# (начиная с C# 7.1) это легко делается при помощи объявления static async Task Main(string[] args)
Итого:
static async Task Main(string[] args) { await DoSomething(); Console.WriteLine("Now u can type something"); Console.ReadLine(); }
public static async Task DoSomething() { using (FilmContext context = new FilmContext()) { var c = await (from b in context.Films select b).ToListAsync();
foreach (var a in c) { Console.WriteLine(a.Descripton); } } }

Если вам нужно, чтобы выполнение проходило параллельно, возникает вопрос, насколько дорого конструирование FilmContext:. Если этот код выполняется быстро, то ваш начальный код был верен, но лучше бы переписать его в таком виде:
static async Task Main(string[] args) { var t = DoSomething(); Console.WriteLine("Now u can type something"); Console.ReadLine(); if (!t.IsCompleted) Console.WriteLine("Waiting until task finishes..."); await t; }
public static async Task DoSomething() { using (FilmContext context = new FilmContext()) { var c = await (from b in context.Films select b).ToListAsync();
foreach (var a in c) { Console.WriteLine(a.Descripton); } } }
Если же new FilmContext выполняется медленно, то проще всего выгрузить весь DoSomething() на пул потоков:
static async Task Main(string[] args) { var t = Task.Run(DoSomething); Console.WriteLine("Now u can type something"); Console.ReadLine(); if (!t.IsCompleted) Console.WriteLine("Waiting until task finishes..."); await t; }

Как задать всем блокам высоту, как у самого низкого из них?

Есть контейнер, а в нем 3 блока с разной высотой. Высота блока зависит от контента.
Как задать всем блокам высоту, как у самого низкого из них?
jsfiddle
.wrapper{ width:600px; height:200px; background:lightgrey; } .item{ width:200px; float:left; } .item:nth-child(1){ background:red; } .item:nth-child(2){ background:green; } .item:nth-child(3){ background:blue; }

content content content content content content content content content content content content content content content content content content content content content content content content
content content contentcontent content contentcontent content content
content content contentcontent content contentcontent content contentcontent content contentcontent content content


Ответ

$(document).ready(function() { var allDivs = $('.item'); var dvSmallest = allDivs[0]; $(allDivs).each(function() { if ($(this).height() < $(dvSmallest).height()) dvSmallest = $(this); }); $('.item').height(dvSmallest.height()); }); .wrapper{ width:620px; height:200px; background:lightgrey; } .item{ width:200px; float:left; overflow:auto; } .item:nth-child(1){ background:red; } .item:nth-child(2){ background:green; } .item:nth-child(3){ background:blue; }

content content content content content content content content content content content content content content content content content content content content content content content content
content content contentcontent content contentcontent content content
content content contentcontent content contentcontent content contentcontent content contentcontent content c324ontent

Как-то так

Для чего необходимо внедрение зависимости (dependency injection)?

Вот пример кода из всеми любимого тутора Nerddinner public class DinnersController : Controller {
IDinnerRepository dinnerRepository;
// // Dependency Injection enabled constructors
public DinnersController() : this(new DinnerRepository()) { }
public DinnersController(IDinnerRepository repository) { dinnerRepository = repository; }
... Какая разница, если я буду создавать объект репозитория в методах контроллера? public ActionResult Edit(int id) {
DinnerReposotiry dinnerRepository = new DinnerRepository(); Dinner dinner = dinnerRepository.GetDinner(id);
if (!dinner.IsHostedBy(User.Identity.Name)) return View("InvalidOwner");
return View(dinner); }


Ответ

Использование DependencyInjection даёт три преимущества. Возможность подменить некий сервис, не являющийся технологически нейтральным. Возможность автоматически тестировать различные модули программы независимо. В Вашем примере Dependency Injection позволяет написать автоматический тест, проверяющий, что DinnersController правильно вызывает методы DinnerRepository. Возможность повторно использовать код DinnersController с другими реализациями IDinnerRepository.

C++ динамическое выделение памяти

Здравствуйте, у меня вопрос почему память после оператора delete память так и остается задействована или я что то не так понимаю: #include
using namespace std;
int main(){
int *p=new int[10];
for(int i=0;i<10;i++){
p[i]=i;
} delete [] p;//удаление массива
cout< }


Ответ

Про то, как надо удалять массивы, Вам уже написали. Напишу про то, почему сохраняется доступ к старым данным. Даже если правильно удалять динамически выделенную память, то не всегда из кучи выгружаются подключенные страницы памяти, особенно если они в середине кучи. Просто они в помечаются как свободные и при повторном запросе на выделение памяти могут быть использованы, если хватает объема. Это ускоряет процесс динамического выделения памяти, которые является довольно ресурсоемким.

Скрытие кода *.exe-файла

Как можно скрыть код exe-файла (написаного, например, на Delphi) от расшифровки под дизассемблером и, впоследствии, от реверса.
Строки, например, можно просто XOR-ить или смещать каждый символ на k позиций по таблице ASCII (первое лучше, ИМХО). А вот как скрыть имена функций или даже целые блоки кода? Ведь многие разработчики (особенно вирусописатели) любят это делать, тем самым скрывая свои «творения» от исследования посторонними лицами. Таким же образом скрывается от антивирусов всем известный SpyEye. А как этого добиться мне?


Ответ

(Некоторое время не занимался реверсингом, поэтому информация может быть outdated) Если говорить о серьезной обфускации, то имеет смысл рассматривать только языки, которые компилируются в машинный код (C++, например). Языки с промежуточным слоем байт-кода обычно легко поддаются реверсингу и, судя по всему, пока нет более-менее адекватных способов запротектить написанные на них приложения. Адекватные протекторы совершают некоторую последовательность действий для защиты готового приложения от реверсинга: Вставляют в готовый бинарник готовые антиотладочные фрагменты кода (например, дешифрующий его в рантайме), путают секции, совершают хитрые джампы, в общем, совершают атомарные изменения (не меняющие поведение программы!) над исполняемым кодом, которые затрудняют отладку человеку. Человек - это reverse engineer, который открывает ваше приложение в IDA, зрительно выцепляет знакомые паттерны из дизассемблерного листинга, трейсит приложение, подменяя содержимое стека и патча это самое приложение в его рантайме. И основная цель этих защитных действий протектора - заставить реверсера сказать "Тьфу, пошло оно в ж*пу, задолбало", поскольку последовательность действий протектора всегда можно совершить в обратную сторону, был бы опыт и знания. Более серьезная защита, иногда останавливающая даже крутых и опытных реверсеров - это виртуализация кода приложения для того, чтобы исполнять его на собственной виртуальной машине (обычно сочетается со стандартным антиотладочными приемами, описанными выше). При этом виртуальная машина внедряется в бинарник вместе с некоторым IL-кодом, который может выглядеть абсолютно произвольно. Параметры создаваемой машины также можно варьировать в некоторых пределах - при желании можно и виртуалку с троичной логикой написать. Бонус такого подхода в том, что для полноценного реверсинга такого приложения необходимо каким-либо образом воспроизвести эту самую виртуальную машину. В такой ситуации (если виртуалка оказывается достаточно хитрой), большая часть стандартных тулзов и приемов реверсера перестает работать "из коробки". Что, опять же, приближает этого самого потенциального реверсера к состоянию "Спасибо, с меня хватит". С точностью до деталей таким образом протектит Themida. В соответствии с написанным выше - если есть желание запротектить свою программу более-менее достойно, то напишите свою виртуалку и сгенерируйте для нее IL-код из имеющихся объектных файлов вашего приложения. Это действие поможет отсеять большую часть реверсеров, которым недавно рассказали и показали, что такое IDA и как применять patch Quick test - для того, чтобы понять, сможете ли вы создать более-менее адекватную защиту с виртуализацией, попробуйте сломать CrackMe от ESET. Если поймете, причем здесь SSE и общую механику проверки, то можно браться за дело. Всегда есть набор готовых public и private пакеров, которыми можно воспользоваться. Themida, ASProtect, FSG. Понятно также, что всегда найдется набор людей, которые эти или иные протекторы в состоянии снять.

Возможно ли программно на Си организовать цифро-аналоговый преобразователь

Можно ли используя восьмиразрядный микроконтроллер AVR, без встроенного ЦАП организовать его программно на Си? Суть в том, что хочется получить пилообразный сигнал!


Ответ

Да это возможно. Что же для этого нужно! Первое - это применить не сложное схемотехническое решение. Схемку накидал быстро, поэтому строго не судите. Это так называемый R2R ЦАП, который позволяет превратить 8 обычных портов ввода-вывода в оди полноценный 8 битный цифро-аналоговый преобразователь. Вот схема:
Далее пишем программу которая будет генерировать Ваш пилообразный сигнал!
#include #include
void main(void) {
DDRA=(0< DDRB=(1< PORTB=(0< DDRC=(0< PORTC=(0< DDRD=(0< PORTD=(0< // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=(0< TCCR1A=(0< ASSR=0< // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0< MCUCR=(0< UCSRB=(0< ACSR=(1< // ADC initialization // ADC disabled ADCSRA=(0< SPCR=(0< TWCR=(0< while (1) { //Ниже код генерации такого пилообразного сигнала int i; for(i = 0; i <255; i++) { PORTB = i; } for(i = 255; i > 0; i--) { PORTB = i; } } } Хочу добавить , что используя R2R цап собирал wav плеер, то есть возможности очень широки. Ниже вид сигнала который я получил этой программкой.
9393
Я даже видел как генерируют эротические сигналы, правда не знаю функцию которая за это отвечает, но можно разбить на несколько for по нарастанию и убыванию.
alt text http://avrdevices.ru/wp-content/uploads/2010/08/tits.jpg

Как писать комментарии к параметрам метода?

В каком виде следует писать комментарии к параметрам метода, чтобы при вызове метода в его подсказке были эти комментарии?


Ответ

Есть такая штука - xml-комментарии. Они отличаются от обычных тем, что предваряются тремя слэшами, а не двумя. Например: ///

/// Описание метода /// /// Описание параметра /// Ogbcfybt возвращаемого значения public int SomeMethod(string arg)

Как реализовать такой эффект параллакса?

На сайте Apple (блок "Самый мощный iMac в истории") есть эффект параллакса. При прокрутке до определенной точки картинка начинает прокручиваться медленнее текста, и в конце медленная прокрутка сменяется стандартной. Как можно реализовать такой же эффект?
UPD:
Есть скрипт, который при прокрутке до определенной высоты замедляет прокрутку блока. Сначала у нас блок с абсолютным позиционированием, при прокрутке определенного количества пикселей блок получает фиксированное позиционирование и начинает прокручиваться медленнее основного контента.
// Наш элемент, который будет замедляться var $element = $('.first'), /* * Последняя позиция скролла, нужна * для вычисления */ lastScrollTop = 0, /* * Отступ сверху для нашего блока * с фиксированным и абсолютным * позиционированием */ defaultElementAbsoluteTop = 150, defaultElementFixedTop = 90, // Коэффициэнт замедления n = 4;
// Отслеживаем скролл страницы $(window).scroll(function (event) {
// Вычисляем текущее положение var scrollTop = $(window).scrollTop(), /* * Вычисляем положение нашего блока * от верхней части сайта/родителя. * Т.к. этот элемент до этого был абсолютным, * то у него отступ сверху всегда одинаков, * А когда подходит момент, когда нужно его фиксировать * отступ расчитывается от последнего, который был * 150 пикселей. Это неправильно. Я ввел проверку, * Если отступ стандартный абсолютный равен * текущему, то, при фиксировании блока * ставим ему оступ фиксированного блока * и отсюда начинаются правильные расчеты */ elementTop = $element.position().top == defaultElementAbsoluteTop ? defaultElementFixedTop : $element.position().top;
if(scrollTop < 60) { /* * Проскролили меньше, чем на 60 пикселей * То оставляем абсолютное позиционирование */ $element.removeClass('fixed'); // И ставим элементу абсолютный отступ сверху $element.css({ top: defaultElementAbsoluteTop }); } else { // Фиксируем элемент $element.addClass('fixed'); // TODO: удалить! //return;
/* * Если прошлое положение меньше, * чем текущее, значит двигаемся <вниз> */ if (scrollTop > lastScrollTop){ // Вычисляем разницу перемещения var diff = scrollTop - lastScrollTop; // Даем отступ сверху в n раз меньше, чем скролл $element.css({ top: elementTop - diff/n + 'px' }); // В противном случае, двигаемся <вверх> } else { // Вычисляем разницу перемещения var diff = lastScrollTop - scrollTop; /* * Вычисляем результирующее положение нашего элемента, * с учетом замедления n */ resultElementTop = elementTop + diff/n; /* * Если конечный результат вышел больше, * чем отступ сверху по умолчанию, * то даем стандартный отступ. * Иначе даем результирующий отступ */ resultElementTop = resultElementTop > defaultElementFixedTop ? defaultElementFixedTop : resultElementTop; // Позиционируем элемент $element.css({ top: resultElementTop + 'px' }); } } // Запоминаем последнюю позицию скролла lastScrollTop = scrollTop; });
Нужно, чтобы блок сначала был с position: absolute, при прокрутке до определенного участка блок получает position:fixed и прокручиваетс медленнее. При прокрутке страницы ещё ниже, блок опять становится абсолютно спизиционированным. При рокрутке обратно вверх блок получает фиксированное позиционирование и прокручивается вниз с того момента, на котором остановился при прокрутке вверх.


Ответ

Поковырялся, вот что получилось.
firstPosScroll = []; // позиция курсора, с которой объект видим windowH = $(window).height(); // высота окна getPosScroll(); // заполнение вышеуказанных позиций $(window).resize(function() { // при изменении размера окна пересчитываем позиции getPosScroll(); }) $(window).scroll(function() { //обработчик скролла posScroll = $(this).scrollTop(); // текущая позиция курсора posMiddle = windowH / 2; // середина окна $('.prlx').each(function(i, v) { // для каждого объекта offsetObj = $(this).offset().top; // положение объекта относительно верха документа posObj = offsetObj - posScroll; // текущая позиция объекта koef = 1 - ($(this).find('.logo').height() / $(this).find('.desc').height()); // коэффициент замедления обратно пропорционален разнице высот картинки и описания if (posObj < posMiddle && posObj + $(this).height() > posMiddle) { //условие видимости объекта $(this).find('.logo').css({ 'top': (posScroll - firstPosScroll[i] - posMiddle) * koef + 'px' }); // задаем высоту } }); }); function getPosScroll() { $('.prlx').each(function(i, v) { firstPosScroll[i] = $(this).offset().top - windowH < 0 ? 0 : $(this).offset().top - windowH; }); } section {position: relative;} section.left-logo>div.logo {left: 0;} section.left-logo>div.desc {float: right;width: 50%;} section.right-logo>div.logo {right: 0;} div.logo {position: absolute;width: 50%;} section.right-logo>div.desc {float: left;width: 50%;} header {height: 800px;background: #e6e6e6;} img {max-width: 100%;} div.p {margin: 20px 0;} div.clear {clear: both;width: 100%;}