Страницы

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

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

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

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


Ответ

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

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

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

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


Ответ

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

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

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


Ответ

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

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

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


Ответ

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

CompareTo и object

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


Ответ

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

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

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


Ответ

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

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

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


Ответ

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