Страницы

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

четверг, 13 декабря 2018 г.

Как браузер дает знать серверу, что он поддерживает HTTP/2?

Когда юзер заходит на сайт, браузер ведь не знает, поддерживает ли сайт http/2. Так же как и сервер не знает про возможности браузера. Как они договариваются между собой о поддержке http/2?


Ответ

Для выбора между HTTPS и HTTP/2+TLS — по ALPN (RFC).
Поскольку HTTPS и HTTP/2 оба могут работать по TLS 1.2 и выше, было создано расширение для TLS, ALPN, с помощью которого клиент и сервер могут договориться о доступных протоколах ещё на этапе TLS-"приветствия" (handshake). Протокол HTTP/2 идентифицируется в нём токеном h2, это разновидность HTTP/2, работающая поверх TLS, с шифрованием.
"Крупные браузеры" заявили, что будут поддерживать только HTTP/2 по TLS (1, 2), поэтому других способов на практике можно запросто не встретить.

Для HTTP/2 по "голому" TCP-соединению (поддержка которого так себе, см. выше) используется обычный механизм по заголовку Upgrade, тот же что и для Websocket, в котором:
клиент
должен совершить первый полный запрос, заявив о возможности обновить протокол до h2c (HTTP/2 через голый TCP) заголовком Upgrade и приложив ровно один заголовок HTTP2-Settings с base64-закодированными настройками протокола сервер, готовый это сделать:
должен ответить 101 Switching Protocols завершив этот ответ, начать отдавать ответ на исходный запрос уже по HTTP/2, не дожидаясь подтверждения от клиента сервер, не готовый это сделать:
может проигнорировать намерения клиента

php: чем плох mysql_query( )?

В одной из вакансий на позицию junior php среди прочих требований встретил такое: "вы нам подходите, если в вашем коде нет и намека на mysql_query("SELECT * ...."
Чем плох mysql_query( )? Это непрофессионально? Как надо писать "правильно"? Спасибо.


Ответ

Я не знаю, что имелось в виду конкретно на той вакансии, но могу предположить, что принципиальное значение придавалось не столько mysql или mysqli драйверу, и даже не PDO, сколько предпологалось наличие у кандидата знания и опыта работы с какими-либо ORM (а как следствие, хотя бы минимальный опыт с каким-нибудь фреймворком, либо умение подключить интересующий пакет через composer), которые представляют гораздо более высокий уровень абстракции и объектный подход для доступа к данным.
Плохой тон, опять же, не сам mysql_query, а бездумное смешивание логики работы с данными с логикой работы приложения и бизнес-логикой. Когда в контроллере встречается что-то типа:
SELECT * FROM products;
это плохой тон. С использованием ORM, у Вас будет что-то типа:
$productMapper = new ProductMapper(); $products = $productMapper->findAll();
И такой подход гораздо гибче и человекопонятнее (если правильно его использовать, конечно).
Почитайте про наиболее распространенные ORM для PHP (Doctrine, Eloquent, Yii\ActiveRecord), посмотрите как с ними принято работать, хотя бы поверхностно ознакомьтесь с паттернами объектно-реляционного отображения, такими как Table Gateway, Row Gateway, Active Record, Data Mapper, и сразите работодателей своим глубоким пониманием сути вопроса.

Транзакционная модель

В рамках многопоточного приложения работа с БД осуществляется посредством использования одной и той же учётной записи. Каждый поток имеет отдельное соединение с БД. Появилась необходимость использовать транзакции.
В официальной документации мне не удалось обнаружить (буду признателен за ссылку), где бы чётко оговаривалось, что транзакционная модель в InnoDb функционирует и на уровне соединений, а не только на уровне отдельных учётных записей. Возможно, что это априори, однако я некомпетентен в рассматриваемой области. Хотелось бы, по возможности, получить точный ответ.
Второй вопрос вытекает из первого. Если транзакционная модель InnoDb всё же реализована на уровне отдельных соединений, то существует ли также возможность создавать отдельные, но параллельно выполняемые транзакции в рамках одного и того же соединения в одном и том же потоке? Это, скажем, может понадобиться при асинхронном выполнении. К сожалению, в документации я не увидел возможности указывать транзакциям какие-либо уникальные имена или идентификаторы.
MySQL 5.7


Ответ

Транзакционная модель функционирует, как ни странно, на уровне транзакций - группы команд между begin и commit/rollback (одиночные запросы вне открытой явно транзакции автоматически оборачиваются в транзакцию, без транзакции транзакционные хранилища не работают). В рамках одного соединения может быть много транзакций. От одного пользователя может быть много одновременных и независимых соединений, и, следовательно, конкурентных транзакций тоже может быть много. В сущности, в понятии транзакции нет ни соединения, ни пользователя. Есть только id транзакции, согласно которому вычисляется видимость актуальных версий строк в MVCC и за которым закрепляются взятые блокировки.
В известных мне СУБД - mysql и postgresql - одно соединение одновременно держать две разные транзакции открытыми не может, одно соединение - только одна открытая транзакция. И не припоминаю возможности в рамках одного соединения выполнять одновременно несколько команд. Библиотека может предоставлять неблокирующий вызов, но не дождавшись конца ответа новые запросы отправлять не получится.

Зачем нужен регистр ebp

Для чего нужен регистр ebp, если есть esp?


Ответ

Один из типичных способов использования регистра ebp - создание стекового кадра
Если упрощенно, в начале функции состояние регистра esp сохраняется в ebp, и дальше уже адреса аргументов функции и локальных переменных отсчитываются от него. Дальше, в процессе работы функции (и вызываемых ею функций) esp может меняться как угодно, но адрес локальной переменной в этой функции как был, скажем, ebp-8 так и остается им при любых изменениях esp
При адресации локальных переменных можно обойтись и без ebp, но тогда адрес переменной будет рассчитываться как esp+N+var, где N зависит от того, какие изменения произошли с esp после выделения памяти в стеке под локальные переменные. Современные компиляторы, в общем-то, так и делают, а ebp используют для каких-то других целей (например, просто как регистр общего назначения).
Еще небольшое дополнение. В 16-битные времена при сложной адресации (базовый регистр + индексный регистр + смещение, т.е., например, [BP+SI+10h]) в качестве базового регистра можно было использовать только bp и bx (sp нельзя было использовать в качестве базового регистра, т.е. адресация вида [SP+N] невозможна), в качестве индексного - только si и di. Поэтому, если бы не было bp, то пришлось бы обходиться только одним базовым регистром (тогда логичнее было бы bx переименовать в bp (Base Pointer)). При 32-битной адресации разделение не такое строгое, в качестве базового регистра можно использовать любой 32-битный регистр, в качестве индексного - любой кроме esp

Узнать, есть ли атрибут у вызывающего метода?

Есть тестовое консольное приложение.
internal class Program { [MyTest("TestDescription")] static void Main(string[] args) { TestSchmest ta = new TestSchmest(); ta.GetSomeThingMethod();
Console.ReadKey(); } }
internal class TestSchmest { public void GetSomeThingMethod([CallerMemberName] string methodName = "") { Console.WriteLine("\t - In hell we die!!!"); WhoCalledMe(); Console.WriteLine(); Console.WriteLine("Method \"GetSomeThingMethod\" was called by {0}.", methodName);
// methodName.GetAttribute ??? }
private void WhoCalledMe([CallerMemberName] string methodName = "") { Console.WriteLine("\t - For what?!"); Console.WriteLine(); Console.WriteLine("Method \"WhoCalledMe\" was called by {0}.", methodName);
// methodName.GetAttribute ??? } }
public class MyTestAttribute : Attribute { protected string Description;
public MyTestAttribute(string description) { Description = description; } }
Сначала вызывается метод GetSomeThingMethod класса TestSchmest, который в свою очередь вызывает метод WhoCalledMe. Можно ли как-то из методов класса TestSchmest узнать, указан ли атрибут у вызывающего их метода или нет.
Т.е. ta.GetSomeThingMethod() должен показать, что атрибут есть, а WhoCalledMe() что его нет.
Название класса, в котором вызываются методы (в данном случае Program) может быть неизвестно.


Ответ

С помощью класса StackTrace можно получить предыдущий кадр стека, относящийся к вызвавшему методу. Атрибут CallerMemberName при этом не требуется.
public void GetSomeThingMethod() { string methodName = ""; MyTestAttribute attribute = null;
var st = new StackTrace(); if (st.FrameCount > 1) { var prevFrame = st.GetFrame(1); // получаем кадр стека для вызвавшего метода var caller = prevFrame.GetMethod(); // получаем сам вызвавший метод methodName = caller.Name;
var attributes = caller.GetCustomAttributes(typeof(MyTestAttribute), false); if (attributes.Length > 0) attribute = (MyTestAttribute)attributes[0]; }
Console.WriteLine("\t - In hell we die!!!"); WhoCalledMe(); Console.WriteLine(); Console.WriteLine("Method \"GetSomeThingMethod\" was called by {0}.", methodName);
if (attribute != null) Console.WriteLine("Attribute is present."); }
Результат:
Method "GetSomeThingMethod" was called by Main. Attribute is present.

Какая разница между формами инкремента i++ и ++i в цикле for?

for (var i = 0; i < 5; ++i) { alert(i); // 0,1,2,3,4 }
for (var i = 0; i < 5; i++) { alert(i); // 0,1,2,3,4 }
https://jsfiddle.net/z0ugbbwj/
Не увидел разницы.


Ответ

В приведённом примере разницы нет. Подробнее про легенды, что ++i быстрее.
Ходят слухи, что для выполнения ++i значение в памяти увеличивается и затем возвращается. В то время, как для i++ сначала запоминается значение в создаваемой временной переменной, потом увеличивается значение основной и возвращается значение временной – таким образом увеличиваются «расходы» на создание временной переменной.
Перформанс тест не удаётся посмотреть из-за временного косяка на их стороне.

Объединить два массива в один, с не общими элементами без повтора

Необходимо два массива объединить в один и оставить в нем только не общие элементы. Например arr1 {1,2,3,4} + arr2{1,1,5,6}, результат arr3 {3,4,6}.
const int SIZE1 = 8; const int SIZE2 = 5; int arr1[SIZE1] = { 0 }; int arr2[SIZE2] = { 0 }; cout << "First array
"; for (int i = 0; i < SIZE1; i++){ arr1[i] = rand() % 20; cout << arr1[i] << '\t'; }
cout << "
Second array
"; for (int i = 0; i < SIZE2; i++){ arr2[i] = rand() % 20; cout << arr2[i] << '\t'; } cout << endl; const int SIZE3 = SIZE1 + SIZE2; int arr3[SIZE3] = { 0 }; cout << "Third array
"; for (int i = 0; i < SIZE3; i++){ arr3[i] = arr1[i]; if (i >= SIZE1) arr3[i] = arr2[i-SIZE1]; cout << arr3[i] << '\t'; } cout << endl; const int SIZE4 = SIZE3; int arr4[SIZE4] = { 0 }; int size4 = 0; for (int i = 0; i < SIZE4; i++){ for (int j = 0; j < SIZE4; j++){ if (arr3[i] == arr3[j]&&i!=j) break; else if (arr3[i] != arr3[j]&&j"; for (int i = 0; i < size4; i++){ cout << arr4[i] << '\t'; } cout << endl;
}


Ответ

Так вот, решение которое я реализовала:
const int SIZE1 = 5; const int SIZE2 = 7; int arr1[SIZE1] = { 0 }; int arr2[SIZE2] = { 0 }; for (int i = 0; i < SIZE1; i++) cout << (arr1[i] = rand() % 10) << "\t"; cout << endl; for (int i = 0; i < SIZE2; i++) cout << (arr2[i] = rand() % 10) << "\t"; cout << endl;

const int SIZE3 = SIZE2+SIZE1;
int arr3[SIZE3] = { 0 }; int size3 = 0; //сравниваем 1 со вторым, разницу записыв в 3 for (int i = 0; i < SIZE1; i++) { for (int j = 0; j < SIZE2; j++) { if (arr1[i] == arr2[j]) { break; } else if (arr1[i] != arr2[j]) { bool exist = false; for (int k = 0; k < size3; k++) { if (arr1[i] == arr3[k]) { exist = true; break; } } if (exist == false&&j==SIZE2-1) { arr3[size3] = arr1[i]; size3++; break; } } } }
//сравниваем 2 массив с первым, разницу записываем в 3 с места где закончилась запись сравнения 1 и 2 for (int i = 0; i < SIZE2; i++) { for (int j = 0; j < SIZE1; j++) { if (arr2[i] == arr1[j]) { break; } else if (arr2[i] != arr1[j]) { bool exist = false; for (int k = 0; k < size3; k++) { if (arr2[i] == arr3[size3-k]) { exist = true; break; } } if (exist == false && j == SIZE1 - 1) { arr3[size3] = arr2[i]; size3++; break; } } } }
cout << "Array 3
"; for (int i = 0; i < size3; i++) { cout << arr3[i] << "\t"; }
Всем участника спасибо за помощь!

В чем различия нативного OpenGL от его реализации в Qt?

В чем различия нативного OpenGL от его реализации в Qt?


Ответ

Ни в чем. Там тот же самый openGL, просто с обертками для стыковки с Qt и инициализации.

Как зайти на страницу RabbitMQ?

Установил RabbitMQ. Проверил - все работает. Сообщения отправляются и принимаются. Но вот не могу зайти на страницу сервера RabbitMQ. Ввожу в браузер http://0.0.0.0:15672/ и ничего. Браузер говорит, что такой страницы не существует. ЧТо я делаю не так ?


Ответ

По умолчанию, веб-интерфейс отключен, но его можно включить командой на *nix системах:
rabbitmq-plugins enable rabbitmq_management
На Windows включается командой из папки sbin, где установлен сервер:
rabbitmq-plugins.bat enable rabbitmq_management
После чего необходимо перезапустить RabbitMQ и войти через браузер на http://localhost:15672. По умолчанию, логин и пароль для входа в RabbitMQ Managment Plugin: guest/guest
С версии 3.3 было введено ограничение на доступ по guest/guest с хоста отличного от localhost. Но вы можете создать пользователя test c паролем test и зайти под ним с любого хоста:
rabbitmqctl add_user test test
rabbitmqctl set_user_tags test administrator rabbitmqctl set_permissions -p / test ".*" ".*" ".*"

Перегрузка операторов: как сделать срез списка?

Добрых суток. Есть класс с контейнером. Хочу сделать срез с экземпляра класса, как если бы обратился к списку. Как это можно реализовать не наследуясь от класса list, а возможно, с помощью магических методов?
class L: def __init__(self): self.__lst = []
l = L() l[:]


Ответ

Срез реализуется через метод __getitem__ (тот же метод, что и для взятия элемента по индексу). При выполнении среза в этот метод передается специальный объект класса slice. Пример реализации:
class L: def __init__(self, lst=None): if not lst: self.__lst = [] else: self.__lst = lst
def __getitem__(self, item): if isinstance(item, slice): # Создание нового объекта данного класса с элементами среза внутреннего списка return self.__class__(self.__lst[item.start:item.stop:item.step]) # или return self.__class__(self.__lst[item])) else: return L.__lst[item]
def __repr__(self): return 'L(%r)' % self.__lst
x = L(list(range(10))) print(x) # Вывод: L([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) print(x[2:5]) # Вывод: L([2, 3, 4])
Присваивание срезу и удаление среза реализуется аналогично с помощью методов __setitem__ и __delitem__
Доп. информация: Habrahabr: Всё, что Вы хотели знать о слайсах

Для чего нужны классы [закрыт]

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


Ответ

Основная идея модульного программирования состоит в том, что большая задача делится на меньшие относительно независимые подзадачи (принцип «разделяй и властвуй»). В развитии модульного программирования — объектно-ориентированном программировании — этот принцип выражается в создании множества объектов, каждый из которых решает только свою собственную задачу.
Используемый вами антипаттерн проектирования называется Божественный объект, Ваш обьект делает настолько много, что обычным объектам это не под силу. Будем считать что у вас там пречется некоторая галактика, и вообще весь остальной код это декорация над этим объектом :)
Подход «божественного объекта» противоположен принципу «разделяй и властвуй»: основная часть функциональности программы кодируется в одном объекте. Так как этот объект хранит большое количество данных и имеет много методов, его роль в программе становится «божественной» (всеобъемлющей).
В итоге мы имеем непереносимый и плохо тестируемый код, в котором, к тому же, сложно разобраться. Так же, подобный код довольно сложно поддерживать, учитывая, что вся система зависит практически только от него. Проблема в том, что вся программа настолько становиться зависима от этого класса, что внесение изменений или попытка исправления ошибки становиться через какое-то время настоящим кошмаром.
Тот минимальный выигрыш в производительности, которого может не быть совсем, не стоит того, чтобы держать весь код в одном классе и каждый раз переписывать огромную долю своего кода, чтобы подстроиться под новые бизнес-процессы.

Перечисления Java

Нужно создать перечисление неких организаций, но в задании сказано, что перечисление должно содержать название организации и цену услуг. Как я понимаю, перечисление - это набор единичных констант. Как в перечисление записать и название организации и цену услуг?
P.S. Не исключаю, что само задание не корректно.
Текст задания как есть. Сумму оплаты я заменил на цену услуг.
Должен быть минимум один интерфейс, абстрактный класс и один внутренний класс, а также перечисление для организаций из которых пришли слушетели. Перечисление должно помимо названия организации содержать полное название организации и сумму оплаты.


Ответ

Возможно имеется ввиду именно это
public enum Organizations {
/** * Организация А */ A("Name1", BigDecimal.valueOf(100)), /** * Организация B */ B("Name2", BigDecimal.valueOf(200)), /** * Организация C */ C("Name3", BigDecimal.valueOf(300)), /** * Организация D */ D("Name4", BigDecimal.valueOf(400)), /** * Организация E */ E("Name5", BigDecimal.valueOf(500));
private Organizations(String name, BigDecimal price) { this.price = price; this.name = name; }
/** * Возвращает цену услуг * * @return BigDecimal цена услуг */ public BigDecimal getPrice() { return price; }
/** * Возвращает наименование * * @return String наименование */ public String getName() { return name; }
private BigDecimal price; private String name;
}
В коде потом можно получать как название Organizations.A.getName() так и цену Organizations.A.getPrice()

Обобщенные типы в С#

public class Example { public static void Main() { Myclass ob = new Myclass(); }
class Myclass where T: new() { public T instanse = new T(); } class Testclass { } }
Вопрос: Myclass - это тип. Testclass - тоже тип. Какого же тогда типа экземпляр ob?


Ответ

MyClass — это как бы не совсем тип. Это обобощённый тип (на английском — generic).
Вы можете сконструировать экземпляр обобщённого типа только указав типы-аргументы, которые заменят формальный параметр-тип T. Экземпляр обобщённого типа самого по себе сконструировать невозможно.
Для каждого обобщённого типа существует (обычно бесконечно много) конкретизаций: конкретных типов, которые соответствуют определённым значениям типов-параметров.
Соответственно, тип ob и есть такая конкретизация: Myclass с параметром T = Testclass. Такая конкретизация в языке C# записывается как Myclass

Улучшить скорость работы программы С++

#include
using namespace std;
int sum_of_dil(int n) { int sum = 0; if (n%2==0) { for(int i=1;i<=n/2;++i) if (n%i ==0) sum += i; } else { for(int i=1;i<=n/2;i+=2) if (n%i ==0) sum += i; }
return sum; }
int main() { int a, b;
int count = 0; cin >> a >> b;
for(int i=a;i<=b;++i) { for(int j=i+1;j<=b;++j) { if (sum_of_dil(i) == j && sum_of_dil(j) == i) { cout << i << " " << j << endl; count++; } } }
if (count ==0) cout << "Absent" << endl; return 0; }
Задача отсюда -> Тык
Два различных натуральных числа называются дружественными, если первое из них равна сумме делителей второго числа, за исключением самого второго числа, а второе равно сумме делителей первого числа, за исключением самого первого числа. Нужно найти все пары дружественных чисел, оба из которых принадлежат промежутку от M до N.
Не проходит по времени.


Ответ

Просвистело за 2мс: :)
#include #include
using namespace std;
struct Frd { int a, b; } f[] = { { 220,284 }, { 1184,1210 }, { 2620,2924 }, { 5020,5564 }, { 6232,6368 }, { 10744,10856 }, { 12285,14595 }, { 17296,18416 }, { 63020,76084 }, { 66928,66992 }, { 67095,71145 }, { 69615,87633 }, { 79750,88730 }, { 100485,124155 }, { 122265,139815 }, { 122368,123152 }, { 141664,153176 }, { 142310,168730 }, { 171856,176336 }, { 176272,180848 }, { 185368,203432 }, { 196724,202444 }, { 280540,365084 }, { 308620,389924 }, { 319550,430402 }, { 356408,399592 }, { 437456,455344 }, { 469028,486178 }, { 503056,514736 }, { 522405,525915 }, { 600392,669688 }, { 609928,686072 }, { 624184,691256 }, { 635624,712216 }, { 643336,652664 }, { 667964,783556 }, { 726104,796696 }, { 802725,863835 }, { 879712,901424 }, { 898216,980984 } };
int main(int argc, const char * argv[]) { int M, N; cin >> M >> N; int count = 0; for(unsigned int i = M>>15; i < sizeof(f)/sizeof(f[0]); ++i) { Frd x = f[i]; if (x.a >= M) { if (x.b <= N) { ++count; cout << x.a << " " << x.b << endl; } else break; } } if (count == 0) cout << "Absent
"; }

Помогите укоротить функцию в javascript?

function replaceNum() {
if (count2 < 3) { count4 = 0; }else if(count2 >= 3 && count2 < 6) { count4 = 1; }else if (count2 >= 6 && count2 < 9) { count4 = 2; }else if (count2 >= 9 && count2 < 12) { count4 = 3; }else if (count2 >= 12 && count2 < 15) { count4 = 4; }else if (count2 >= 15 && count2 < 18) { count4 = 5; }else { count4 = 6; }
count2 += 1; }
Можно ли как нибудь переписать эту функцию с помощью цикла?


Ответ

Если вкратце, то согласно вашей логике цикл вам не нужен, и достаточно целочисленного деления: Math.floor округляет результат до ближайшего меньшего целого.
function replaceNum() { count4 = Math.floor(count2/3); count2 += 1; }
У этого кода есть ряд других стилистических проблем, но об этом мы вероятно поговорим в следующей серии)
Одна из этих проблем - именование переменных. Не стоит называть переменные count2, count4. Старайтесь называть их как можно более осмысленно, это поможет когда будете в этом разбираться.
Название переменной обычно состоит из одного или нескольких английских слов написанных подряд. Чтобы отделить одно слово от другого, каждое следующее обычно называется с большой буквы. Такой стиль называется camelCase (верблюжья нотация) Например
myAwesomeVariable = 15;
Собственно если изменить названия переменных в вашем коде до осмысленных, это будет например так. Разумеется это неоднозначно, Вы можете придумать свои красивые имена (в js можно кстати переменные по-русски называть но никогда-никогда-никогда их потом никому не показывайте =)); В любом случае это будет лучше чем count2, count4
function processCardIndexes() { cardStackIndex = Math.floor(cardTotalIndex/3); cardTotalIndex += 1; }

Ассемблерная команда LEA

Не знаю почему, но эта ассемблерная команда не дает мне покоя LEA
C++
int f(int t) { return t+1; }
int f(int*t) { return *t+1; }
int f(int& t) { return t+1; }
Ассемблер
f(int): # @f(int) lea eax, [rdi + 1] ret
f(int*): # @f(int*) mov eax, dword ptr [rdi] inc eax ret
f(int&): # @f(int&) mov eax, dword ptr [rdi] inc eax ret
Если команда MOV ясна как день, то команда LEA не ясна!
Я знаю что команда LEA выполняет вычисление адреса второго операнда и записывание его в первый операнд (это все что мне известно)
В том примере что по ссылке, а именно: lea eax,[rdi + 1] это явно не вычисление адреса и не запись в первый операнд, нет запись то будет но скорее всего что-то другое. Или я что-то не правильно понял? Объясните пожалуйста в соответствии с С++ кодом.
P.S Искал, но исчерпывающего ответа на мой вопрос не нашел, искал даже в книжке Калашникова, а там даже этой команды не нашел...эхх.


Ответ

lea eax, [rdi+1]
Эта команда загружает в eax адрес значения, лежащего под адресу rdi + 1. Т.е. она загружает в eax просто rdi+1
Выглядит странно, и чтобы понять зачем именно нужна lea, и чем она лучше просто аналогичного вызова mov или ручного вычисления адреса, нужно понять как команды записываются в памяти и выполняются процессором.
Например, у вас есть команда чтения значения:
mov eax, [rdi+1]; взять значение по адресу "rdi + 1"
Она компилируется в что-то вроде
[опкод mov][флаг что складываем в eax][флаг что берем по адресу rdi][+1]

Т.е. в 66 67 8B 47 01
Предположим что вам нужно получить сам адрес rdi+1 в eax
Вы можете сделать одно из двух:
Высчитать его руками:
mov eax, rdi + 1; не работает, move не умеет плюс!
и вам придется написать:
mov eax, rdi inc eax; 66 05 01 00 00 00
т.е. выполнить две инструкции. Возможно, хороший вариант, но только для простых +1. А для адресов вида [bp+si+4]?
mov eax, bp add eax, si add eax, 4; да, некрасиво!
или выполнить lea
lea eax, [rdi+1]

Сравните с mov

Байткод: 66 67 8D 47 01
Отличается только opcode, 8B -> 8D.
В процессоре есть готовый, очень эффективный механизм для базовых операций с адресами. И он уже реализован для операции mov - ведь mov умеет доставать значение по адресу!.
При использовании lea процессор делает все, что делает при mov, но пропускает последний шаг - извлечение значения по адресу. Вместо этого он складывает в eax сам адрес. Это гораздо удобнее и быстрее чем считать вещи вроде rdi + 1 отдельными командами.

Какое это отношение имеет к вашему примеру?
В вашем примере параметр лежит в rdi, а результат вы должны вернуть в eax. По-честному, компилятор должнен был написать
mov eax, rdi; 66 A1 add eax, 1; 66 05 01 00 00 00
Ну ок, для 1 можно использовать inc
mov eax, rdi; 66 A1 inc eax; 66 40
Но это все еще две команды. Процессор будет выполнять их по очереди.
Компилятор умный. Он знает, что процессор умеет складывать значения регистров с небольшими константами при обработке команды lea. И он вставляет одну команду, которая выдаст тот же результат.
lea eax, [rdi + 1]
Неважно, что никакой адрес на самом деле никуда не загружается - главное что работаеть будет точно так же, и чуть быстрее - т.к. процессор вычисляет адреса в памяти быстрее, чем складывает числа :)

Передача параметра по ссылке с++

Как передать функции параметр по ссылке со значением по умолчанию?
void func(int &i)
void func2(set &s)
и при этом иметь возможность вызывать эти функции без аргументов, чтобы переменной i присваивалось значение по умолчанию, а для s вызывался конструктор, чтобы использовать множество set в теле функции.


Ответ

Если вы хотите использовать аргумент по умолчанию по ссылке, то этот аргумент должен быть не временным объектом и уже где-то быть определенным на момент вызова функции.
Передача аргумента по неконстантной ссылке предполагает, что этот исходный аргумент будет в функции изменен. Вы не можете передавать по неконстантной ссылке временные объекты.
Поэтому, исходя из условий, указанных в вашем вопросе, скорей всего у вас должны быть две перегруженные функции. Одна функция принимает аргумент по lvalue-ссылке с конкретно заданным объектом. Вторая функция оибл принимает временный объект по rvalue-сслке, оибо вместо него использует значение по умолчанию.
Например,
#include
void func( int &i ) { ++i; std::cout << "Inside func( int & ) i = " << i << std::endl; }
void func( int &&i = int() ) { ++i; std::cout << "Insde func( int && ) i = " << i << std::endl; }
int main() { int i = 0;
std::cout << "Before func( i ) i = " << i << std::endl;
func( i );
std::cout << "After func( i ) i = " << i << std::endl;
std::cout << std::endl;
i = 0;
std::cout << "Before func() i = " << i << std::endl;
func();
std::cout << "After func() i = " << i << std::endl;
return 0; }
Вывод программы на консоль:
Before func( i ) i = 0 Inside func( int & ) i = 1 After func( i ) i = 1
Before func() i = 0 Insde func( int && ) i = 1 After func() i = 0
В этой программе, когда в качестве аргумента передается lvalue, то используется первая функция
void func( int &i ) { ++i; std::cout << "Inside func( int & ) i = " << i << std::endl; }
и она меняет в своем теле исходный аргумент.
Когда же аргумент не указывается, или когда указывается rvalue, то есть некоторый временный объект, как, например,
func(); // используется аргумент по умолчанию int(), который равен 0
или
func( 10 ); // используется временный объект - целочисленный литерал - 10
то используется вторая функция
void func( int &&i = int() ) { ++i; std::cout << "Insde func( int && ) i = " << i << std::endl; }
Если же вы не собираетесь изменять исходный аргумент, то достаточно объявить одну функцию с параметром в виду константной ссылки. Например,
void func( const int &i = int() );

Как удалить элемент из master ветки репозитория?

Добрый день уважаемые, подскажите, пожалуйста, какие команды нужно выполнить чтобы удалить файл из главной ветки. Допустим, я случайно в git добавил файл style/mywork.scss . Что мне необходимо выполнить в окне gitBash чтобы удалить его, без последующего отображения на github'e ? И ещё вопрос по данной же теме. В .gitignore я добавил запись для файла .style/.scss Но он всё равно добавился в git, в чём ошибка ?


Ответ

Чтобы удалить файл из репозитория необходимо сделать следующее:
Во первых, убедиться что Вы на ветке master
git branch
Она будет выделена зелёным и звёздочкой. Если Вы не на нужной ветке, то переключиться на неё:
git checkout master Затем необходимо удалить файл. Для этого есть два варианта, можно воспользоваться любым:
можно удалить Git-командой:
git rm <путь_к_удалённому_файлу> либо просто удалить файл с диска (можете просто через проводник) и добавить изменение в индекс следующей командой:
git add <путь_к_удалённому_файлу>
После выполнения одного из двух вариантов файл будет удалён, а изменения в индексе. Фиксируем изменения:
git commit -m "удалил файл <название_файла>"
Сообщение можно другое, это как пример. Далее необходимо отправить Ваши изменения на удалённую ветку (на github). Это можно сделать так:
git push
либо так:
git push origin master
.gitignore
Файл .gitignore необходимо добавлять в репозиторий в самом начале. Если вдруг Вы закомитили какие-то файлы, а потом добавили их в .gitignore, то файлы, которые уже под присмотром Git-а не будут удалены, но новые файлы, подподающие под правила из .gitignore, добавляться не будут.

“preventDefault()” или “return false”?

Не раз замечал, что в различных кодах используют то preventDefault(), то return false. И это касается, как маленьких, так и больших проектов.
По старинке, я привык использовать во всём return false, но недавно задумался: может preventDefault() лучше чем return? Почему его так часто используют?
Так всё же что лучше использовать: preventDefault() или return false?
var type = null; for(var i = 0; i <= 1; i++){ document.querySelectorAll('[name="type"]')[i].onclick = function() { type = this.value; }; }; document.querySelector('a').onclick = function(e) { if(type == 'pd'){ e.preventDefault(); alert('Прервано функцией preventDefault()!'); }else if(type == 'rf'){ alert('Прервано функцией return false!'); return false; }; }; body {font-family: arial;}

- preventDefault; - return false;

Ссылка


Ответ

return false из обработчика события jQuery так же, как вызов обоих e.preventDefault и e.stopPropagation у переданного jQuery.Event события.
e.preventDefault() остановит обработку события по умолчанию, e.stopPropagation() остановит всплытие события по DOM return false остановит их оба. e.stopImmediatePropagation предотвращает всплытие всех подобных событий (полезно, когда на элементе есть несколько обработчиков одного события)
В обычных (не-jQuery) обработчиках событий return false не запрещает всплывание(bubbling) события.
Также return false; в ванильном js не запрещает обработку события по умолчанию из addEventListener обработчиков. Он работает только из el.onclick хендлеров.
Source: John Resig
Any benefit to using event.preventDefault() over "return false" to cancel out an href click?

Вольный перевод ответа с enSO
Вывод:
В jquery - полезнее return false В vanillaJS - лучше его не использовать, он работает только с onclick-like обработчиками.

В IE8 и ниже необходимо заменить stopPropagation на cancelBubble, а preventDefault на return false;

Демонстрация
Третья ссылка совершает переход несмотря на return false
document.getElementById('a1').addEventListener('click', function(e){ console.log('preventDefault - clicked'); e.preventDefault(); }); document.getElementById('a2').onclick = function(){ console.log('return false from onclick'); return false; }; document.getElementById('a3').addEventListener('click', function(){ console.log('return false - clicked'); return false; }) preventDefault
return false from onclick
return false

this при объявлении конструктора Java

Есть два варианта объявления конструктора:
public class MyClass() { int a, b, c; MyClass (int a, int b, int c) { this.a=a; this.b=b; this.c=c; } }
или
public class MyClass() { int a, b, c; MyClass (int x, int y, int z) { a=x; b=y; c=z; } }
Мне, как новичку, вариант с this кажется более наглядным, но какая форма записи предпочтительнее и более профессиональна? И есть ли какие-либо подводные камни при использовании this таким способом?


Ответ

Первая форма встречается почти везде. Вторая форма записи встречается редко.
Смысл в том, что необходимо именовать переменные осмысленно, то есть, если у нас должно быть поле класса, хранящее количество студентов, то это поле логично назвать numberOfStudents. Естественно, создавая конструктор и передавая в него аргументы, логично, что параметр тоже следует назвать numberOfStudents, чтобы Вы или Ваши коллеги, используя этот класс, понимали ЧТО они передают в конструктор.
В редких случаях все же используются разные имена, но это всегда аргументировано. Например, когда внутри класса некоторое поле используется с определенной целью, но если назвать точно так же параметр в конструкторе, то другим разработчикам не будет понятно, какую величину передавать.
"Подводных камней" при инициализации, что одним, что другим способом, нет.

Как сделать селектор с привязкой к файлу PHP?

Здравствуйте, как сделать селектор. Чтобы сначала был выбор стран, к стране были прикреплены определенные города. Далее при выборе города открывалось содержимое файла php привязанное к данному городу. Нужен полный цикл. Я могу не правильно объяснить, но вот для наглядности вопроса сделал видео, что я имею ввиду в вопросе https://www.youtube.com/watch?v=fSxKDltA9-E может оно поможет раскрыть вопрос. Спасибо заранее за вашу помощь, с уважением.
Нужно типо такого http://codepen.io/ajaxray/pen/oBPbQe Но после последнего действия чтобы высвечивалось содержимое файла привязанного к городу.


Ответ

Подгружайте данные через AJAX. Если Вы имеете ввиду что-то, подобное поиску городов в VK, но там реализовано через AJAX запрос в БД.
Если же хотите брать из файла, то вешаете обработчик на изменение селектора страны. При его срабатывании делаете запрос в AJAX к PHP-файлу со списками городов (там выбираете нужную страну и отправляете список городов этой страны в ответе). В клиенте при получении ответа от сервера вставляете этот список в селектор с городами.
По брать из файла не самая лучшая идея, т.к. при хорошей детализации городов будет много. Вносите все геоданные в базу.
Шаг 1
Например, делаем AJAX-запрос через JQuery, где call.php - скрипт, который будет выдавать нам список городов, а data - это то, что мы передаем в PHP-скрипт (в данном случае требуется передать id страны, берем из селектора country_id). Пишем соответствующую функцию:
function getCities() { var data = { country_id: document.getElementById('country_id').value }; $.post('/call.php', { data: data }, function(result) { ... }); }
Шаг 2
В PHP-файле выбираем нужный нам массив со списком городов (на основе данных data):
$country_id = isset($_POST['data']['country_id']) ? $_POST['data']['country_id'] : NULL; ... if ($country_id == 1) $result = array(array('city_id'=>'1', 'city_name'=>'Москва'), array('city_id'=>'2', 'city_name'=>'Санкт-Петербург')); else if ($country_id == 2) $result = array(array('city_id'=>'1', 'city_name'=>'Нью-Йорк'), array('city_id'=>'2', 'city_name'=>'Сан-Франциско')); ... echo json_encode($result, true); exit();
Шаг 3
Далее возвращаемся в наш клиент и после получения ответа от сервера парсим полученный JSON-массив, собираем html-код селектора и обновляем DOM.
$.post('/call.php', { data: data }, function(result) { result = JSON.parse(result); ... var html = ''; result.forEach(function(data, index) { html += ''; }); document.getElementById('city_id').innerHTML = html; });
Где document.getElementById('city_id') - наш селектор со списком городов, city_id - передаваемый в массиве айдишник города, а city_name - соответственно название города.
Шаг 4
В самом HTML уже должен быть код селекторов стран и городов. Селектор country_id статичный, селектор city_id собирается динамически в зависимости от выбора страны. Не забываем повесить на селектор country_id обработчик, который будет вызывать нашу JS-функцию с AJAX-запросом. А на селектор с выбором города (city_id) вешаем обработчик, который будет вызывать функцию открытия нужного файла.


Шаг 5
В функции openFile() прописываем пути к файлам, которые будут открываться в зависимости от выбора города.
function openFile() { // vars var country_id = document.getElementById('country_id').value; var city_id = document.getElementById('city_id').value; // locations if (country_id == 1 && city_id == 1) window.location = 'https://aviareysi.ru/moscow.php'; else if (country_id == 1 && city_id == 2) window.location = 'https://aviareysi.ru/peterburg.php'; }
Если городов достаточно много, то можно засунуть это в AJAX, но в самом простом варианте можно брать напрямую из JS-файла.

Стереть содержимое всех текстовых файлов в папке

не могу стереть содержимое всех текстовых файлов в папке. испробовал разные способы, не получается Пытался использовать cp /dev/null * писало ошибку


Ответ

что бы "стереть содержимое файлов", можно просто обрезать их размер до нуля. Для этого есть команда truncate --size 0 <имяфайла>. Найти все файлы к каталоге (рекурсивно) можно такой командой find . -type f (где точка - текущий каталог).
Соединяем. Вначале запускаем
find . -type f
и смотрим на список файлов, что он соответствует требуемому. Если все ок, запускаем такое
find . -type f -exec truncate --size 0 {} \;

Оператор присваивания

Почему в операторе присваивания мы возвращаем *this, а не просто this?
Matrix & Matrix::operator =(const Matrix& m2) { if (this != &m2) { (Matrix(m2)).swap(*this); } return *this; }
Matrix Matrix::operator +(const Matrix &m2) { if (m2.columns != this->columns || m2.rows != this->rows) { std::cout << "Error" << std::endl; exit(1); }
Matrix temp(this->rows, this->columns); for (int i = 0; i < this->rows; i++) { for (int j = 0; j < this->columns; j++) { temp[i][j] = m2.matrix[i][j] + this->matrix[i][j]; } } return temp; }


Ответ

Возвращать из оператора присваивания вы можете что угодно (или вообще ничего). Главное, чтобы в операторе присваивания, как и в любой другой функции, тип значения, указанного в return, совпадал с (или был приводим к) типу возврата, указанного в объявлении функции.
Вы же сами написали, что ваш оператор присваивания имеет тип возврата Matrix &. Это значит, что в return вам придется указывать lvalue типа Matrix. *this таким lvalue является, а this - не является.
Тем не менее никто вам не запрещает написать оператор присваивания, который будет возвращать, например, Matrix *. В таком операторе присваивания вы можете возвращать this
Matrix *Matrix::operator =(const Matrix& m2) { ... return this; }
Это будет весьма странным типом возврата для оператора присваивания, но ничего нелегального тут нет.
Другими словами, что вы сами указали в типе возврата функции - то и возвращайте. Так что вопрос о том, почему в вашем случае возвращать надо именно *this - это вопрос именно к вам. Вы сами так захотели.

Параметры функции по умолчанию

В стандарте ES-2015 появилась возможность задавать параметры функции по умолчанию, выглядит это так:
function name(name = 'noname') { console.log(name); } name()
Однако такого же эффекта можно было добиться с помощью хака:
function name(name) { var name = name || 'noname' console.log(name); } name()
При этом Babel транслирует такую функцию вот так:
function name() { var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'noname'; console.log(name); } name();
Какой вариант правильнее: как предлагает Babel или с использованием логического ||?


Ответ

Правильнее как бабель, разумеется. Потому что например:
> "" || "default" -> "default"
и если вы захотите в свою функцию передать пустую строку, то поведение её будет слегка неожиданным.

Фон или картинку на картинку CSS

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

alt


Ответ

Здесь для наглядности сделал градиент. Если вы не знали то в css можно перечислять свойства так свойство: значение , значение2 т.е. через запятые. первое значение самое высокое, затем второе оно выше третьего и.т.д.
.darker { width:300px; height:300px; background:linear-gradient(to right, transparent 50%, rgba(0,0,0,0.5) 0), url(http://gdefon.org/_ph/8/1/478317672.jpg) }


Как исключить из sql запроса несколько записей?

Пишу поиск:
$result=mysql_query("SELECT `id`,`status`,`live`,`game`,`category`,`title`,`time_published`, `url` FROM `news` WHERE `status`='1' AND `id`<>'70' AND `title` LIKE '%$query%' order by `time_published` desc");
Как из выдачи исключить не только запись с id=70, но и ещё несколько записей?
То есть в строку
AND `id`<>'70'
нужно передать несколько значений, но как это сделать, чтобы каждый раз не писать AND...?


Ответ

Попробуйте так:
$result=mysql_query("SELECT `id`,`status`,`live`,`game`,`category`,`title`,`time_published`, `url` FROM `news` WHERE `status`='1' AND `id` NOT IN (70, 60, 50, 30, 1) AND `title` LIKE '%$query%' order by `time_published` desc");

Перевод char или String в двоичный код (Java)

Ребят, вопрос, в принципе, не такой и сложный, однако, я гуглил, но не нашел толкового ответа. Как в Java перевести символ (char или даже лучше String) в двоичный код? То есть дана строка Str = "abс";, нужно перевести её в тот же стринг, но уже двоичным кодом: 1100001 1100010 11010001 10000001


Ответ

Для этого есть готовый метод:
String a = Integer.toBinaryString('a'); System.out.println(a);
Выведет на экран:
1100001
Соответственно, если необходимо перевести целую строку в двоичный код, а не отдельный символ, можно написать для этого свой метод, например:
public String stringToBinary(String s) {
StringBuilder answer = new StringBuilder();
for (int i = 0; i < s.length(); i++) { char c = s.charAt(i);
answer.append(Integer.toBinaryString(c)).append(' '); }
return answer.toString(); }
Более красивое решение на Java 8:
public String stringToBinary(String s) { return s .chars() .collect(StringBuilder::new, (sb, c) -> sb.append(Integer.toBinaryString(c)).append(' '), StringBuilder::append) .toString(); }

Оператор для нескольких объектов

Есть ли в c++ возможность, позволяющая применять оператор для нескольких объектов? Короче, что-то типа этого:
int i = 5; if (i == { 1, 2, 3, 5 } ) // if (i == 1 || i == 2 ...) { cout << "Hello world!" << endl; }


Ответ

В комментарий не помещаюсь...
Чтоб одним оператором и именно ==
template class Has { private: vector data; public: explicit Has(initializer_list lst):data(lst){} bool operator ==(const T& value) const { return find(data.cbegin(),data.cend(),value) == data.cend(); } };
template Has in(initializer_list lst) { return Has(lst); }
int main() { int i = 5; if (in({1,2,3,4,7,8}) == i) // Без in - if (Has({1,2,3,4,7,8}) == i) { cout << "Found
"; } }
Это путь чуть длиннее, но зато не нужно писать явно тип - ну, in
Если через функцию - то можно воспользоваться функцией с переменным числом аргументов.
Но стоит ли эта овчинка выделки?

Повторное использование кода и проблема множественного наследования в C#

Существует следующая структура приложения:

Реализация метода Id из интерфейса IGetId одинаковая везде. Но, исходя из этой структуры его нужно будет каждый раз переписывать в каждом классе, имплементирующего интерфейсы, порожденные от IGetId.
Если бы не было BaseModel это в принципе не было бы проблемой, т.к. можно было бы вынести реализацию этого метода в какой нибудь абстрактный класс AGetId и от него наследоваться, но множественное наследование не поддерживается, а композиция в данном случае нарушает целостность.
В PHP существует очень удобный инструмент - Trait. Он отлично решает данную проблему, но, к сожалению, в C# такого функционала нету.
В C# есть нечто похожее - extension methods, хоть это и совершенно разные вещи. Я пробовал сделать что-то с использованием методов расширения, но получилось на мой взгляд "не очень":
IGetId
public interface IGetId { int Id { get; } }
Extension methods
public static class CoreExtensions { public static int Id(this IGetId obj) { return obj.Id; } }
В любом случае, это не дало ожидаемого результата, мне по прежнем нужно реализовывать Id в каждом классе.
Существуют ли какие-то средства для решения данной проблемы?


Ответ

Я бы предложил такую иерархию наследования:
// библиотечные интерфейсы interface IGetId { int Id { get; } } interface IPerson : IGetId { string Name { get; } } interface IAddres : IGetId { string City { get; } }
// универсальный базовый класс class BaseModel { /* ... */ }
// вспомогательный класс abstract class BaseModelWithId : BaseModel, IGetId { int id; public int Id => id; }
// реальные классы class Person : BaseModelWithId, IPerson { public string Name { get; set; } }
Необходимость реализовывать IGetId в Person отпала.

Хотя в общем случае вы правы, trait'ов не хватает. Есть хорошие шансы, что они появятся в будущем C# 8.