Страницы

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

среда, 13 марта 2019 г.

Ошибка 404 в ответе cURL

Здравствуйте! У меня такой вопрос. Я отправляю post данные с помощью cURL на другой сайт. Мне нужно проверить если в курле введен не существующий url сайта, то в итоге возвращается стр. 404. Как сделать проверку что возвращена именно страница 404? Поиском подстроки 404 в принятом html или есть какой-то другой способ?


Ответ

Это очень индивидуально для каждого сайта.
"Правильная" 404 страница отдаёт http_code 404, но к сожалению не все сайты правильные. Многие отдают 200 ОК на 404 ошибку.
Кроме того, каждый сайт может сделать свою кастомную 404 страничку с уникальным дизайном. Там может вообще не встретиться 404 (легко: сделано картиной)
Поэтому нужно смотреть на конкретный сайт и анализировать конкретно его особенности. Кроме того, принятый алгоритм может вдруг перестать работать после редизайна сайта.
Искать в теле только 404 чревато изредка ложными срабатываниями -- особенно если на сайте много разных цифр и таблиц -- может найтись и такая, на которой 404 встречается.
Увы, серебряной пули нет. Подбирайте под конкретный сайт свой собственный алгоритм.
PS Классический ответ 404 в http_code реализуется так:
$handle = curl_init($url); curl_setopt($handle, CURLOPT_RETURNTRANSFER, TRUE);
/* Get the HTML or whatever is linked in $url. */ $response = curl_exec($handle);
/* Check for 404 (file not found). */ $httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE); if($httpCode == 404) { /* Handle 404 here. */ }
curl_close($handle);
Пример отсюда: https://stackoverflow.com/questions/408405/easy-way-to-test-a-url-for-404-in-php Также см. в документации: http://php.net/manual/ru/function.curl-getinfo.php

Получить дату сборки программы

Как получить время и дату пересборки программы? Далее нужно выводить её в label виджета. Как понял нужно что-то в .pro файле писать, но вот что, пока не нашел. Есть идеи?


Ответ

Вот мое решение:
ui->label->setText(trUtf8("Дата сборки программы: ") + __DATE__ + trUtf8(" в ") + __TIME__);

python3. Как открыть(получить данные) офисные документы (doc,odt, etc…)

Подскажите, как в python3 открыть и получить данные из офисных файлов, таких как odt, doc, docx, rtf. Хотя бы odt.
То что odt и docx это по сути архивы в курсе, можно их по идее распаковать, и посмотреть на файл content.xml (если не ошибаюсь), но может есть более современные или удобные способы.
Все что нашел, это для создания таблиц ods.
Нашел модули uno, pyoo и везде описано как создать таблицы, а как получить данные из офисных документов не нашел.
Задача пробежаться по всем существующим в каталоге(подкаталогах) файлах, найти или проанализировать нужное и вывести результат в отдельный файл.
Сейчас подобное частично реализовано на bash'e, хочу переписать все на python3.
Подскажите или покажите как искать.


Ответ

Оформлю как ответ, чтоб в комментариях не рыскать, если tutankhamun не против, если против, то в свой ответ добавьте и я свой удалю.
И так, вопрос получилось решить с помощью модуля ezodf ( не много документации его ). При установке будьте внимательны, если у вас и 2 и 3 версии python, для третьей я ставил так python3 setup.py install
Небольшой пример кода, для наглядности
import ezodf odt = ezodf.opendoc('/home/user/python/text.odt') list=[] # Запускаем цикл for и перебираем все что нашли в файле) for i in odt.body: if i.text == None: print('no') else: list.extend(re.findall(r"[\w']+", i.text.lower()))
Поясню, использовал i.text заместо i.plaintext(), для ловли нескольких строк со значением None (видимо какие то служебные данные, не разбирался), просто plaintext() добавляет пустые элементы в список и мне на тот момент показалось,Что через text будет быстрее, но утром могу переосмыслить)
а тут list.extend(re.findall(r"[\w']+", i.text.lower())) - с существующему списку list присоединяю или даже так, этим расширяя существующий список list. Выбираю все слова регулярным выражением (каждое слово из документа в список), применяю к ним нижний регистр и все.
так это только кусок, потому может смотреться не очень, и многое что можно добавить, но по крайней мере теперь понятно как читать документы.
Спасибо tutankhamun за подсказки.

Как сделать конкретный метод любого класса другом моего класса?

Основной вопрос в заголовке, идея в ограничении доступа к методу своего класса: С::serialize(). (код сильно сокращён)
class Type1 { public: template Type& operator&(T t){t.serialize(*this);return *this;} template<>Type& operator&(int t){/*полезные действия*/return *this;} };
class Type2 { public: template Type& operator&(T t){t.serialize(*this);return *this;} template<>Type& operator&(int t){/*полезные действия*/return *this;} };
class C { int v;
template friend T& T::operator&(C); template T& serialize(T&t){t&v; return t;} public: ... };
//------------------------------------------------------------------------------ int _tmain(int argc, _TCHAR* argv[])// { Type t; C c; t & c & c & c; return 0; }
Задача - правильно написать friend. Вызывать метод С::serialize из оператора Type::operator&() Классов Type будет неопределённое количество.
template friend class T; friend Type& Type::operator&(class C); friend Type& operator&(class Type,class C); templatefriend T& class T::operator&(C); template friend T& T::operator& < T > (class C);
ни один вариант не прокатывает.


Ответ

Не уверен, что сделать именно так вообще возможно. Если бы такое было возможно, то компилятору бы пришлось прочёсывать все классы в поисках метода. Но утверждать, что так нельзя не буду — нет доказательств.
Т.к. задача не совсем ясна, то я могу предложить следующее решение:
class C { int v = 10;
template friend T& operator&(T&, const C&); template T& serialize(T&t) const { t&v; return t; } };
template T& operator&(T& t, const C& c) { c.serialize(t); return t; }
class Type1 { public: Type1& operator&(int t) {/*полезные действия*/return *this; } };
class Type2 { public: Type2& operator&(int t) {/*полезные действия*/return *this; } };
Как Вы можете видеть, я вынес операторы из Ваших Type# классов в один общий, и сделал эту функцию другом C. Сложно сказать, насколько это поможет Вам, т.к. повторюсь — Ваша задача не совсем ясна.

Не работает onclick на блоке div

function create() { var num = 15; for (var i = 0; i < num; i++) { var div = document.createElement('div'); div.className = "ava"; div.onclick = function(i) { return function() { alert(i); } }(i); div.innerHTML = '' + i + ''; div.setAttribute("id", i); calb.insertBefore(div, calb.childen); test(i); } } .ava { opacity: 0; cursor: pointer; text-align: center; float: left; width: 65px; margin: 10px; padding: 15px; border: 1px solid #d6e9c6; border-radius: 4px; color: #3c765f; background-color: #C7F7B7; transition: 0.3s; } .ava:hover { transform: scale(1.1); text-align: center; }


Имеется следующие коды:
CSS:
.ava { opacity:0; cursor: pointer; text-align: center; float: left; font-size: 18px; width: 65px; margin: 10px; padding: 15px; border: 1px solid #d6e9c6; border-radius: 4px; color: #3c765f; background-color: #C7F7B7; transition: 0.3s; } .ava:hover { transform: scale(1.1); text-align: center; }
JavaScript:
function create() { var num = 15; for(var i = 0; i < num; i++) { var div = document.createElement('div'); div.className = "ava"; div.onclick = function(i) { return function() { alert(i); }}(i); div.innerHTML = '' + i + ''; div.setAttribute("id", i); calb.insertBefore(div, calb.childen); test(i); } }
JQuery:
function test (num) { $('#'+num).animate({opacity:'1'},5000); }
В итоге мы имеем: - курсор не пойнтер, - онклик не онкликается, - анимации при наведении нету.
Проблема появилась после пришивания JQuery. help...
ps: Как вообще должен выглядеть, точнее быть написан, подобный код, выполняющий функции которые этот должен бы выполнять? Спасибо!


Ответ

С использованием jQuery 2.1.1 и без нарушения спецификации HTML в части формирования id DOM-элементов (https://stackoverflow.com/questions/70579/what-are-valid-values-for-the-id-attribute-in-html).
function create() { var num = 15; for (var i = 0; i < num; i++) { var div = document.createElement('div'); div.className = "ava"; div.onclick = function(i) { return function() { alert(i); } }(i); div.innerHTML = '' + i + ''; div.setAttribute("id", "div" + i); calb.insertBefore(div, calb.childen); test(i); } } function test(num) { //console.log($('#div' + num).length); $('#div' + num).animate({ opacity: '1' }, 5000); } create(); .ava { opacity: 0; cursor: pointer; text-align: center; float: left; width: 65px; margin: 10px; padding: 15px; border: 1px solid #d6e9c6; border-radius: 4px; color: #3c765f; background-color: #C7F7B7; transition: 0.3s; } .ava:hover { transform: scale(1.1); text-align: center; }


Как можно поместить url адреса из строки в массив?

Имеется примерно такой текст:
1.http://example.com(example) (пробела перед http нет намеренно) 2. https://vk.com (vk) 3. И так далее
Я хочу средствами php получить массив, который содержит только url адреса, без стороннего текста. Подскажите, какими методами это будет удобнее и правильнее всего сделать, хочу понять сам принцип.


Ответ

Для того, чтобы вытащить все URL адреса из текста, нужно использовать регулярные выражения. Для новичка это будет не совсем легко, ну а что делать? :)
$string = "1.http://example.com(example) (пробела перед http нет намеренно) 2. https://vk.com (vk) 3. И так далее";
$regExp = "/(?:http)?[s]?\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(?:\/\S*)?/";
preg_match_all($regExp, $string, $values);
var_dump($values);
Результат:
array(1) { [0]=> array(2) { [0]=> string(18) "http://example.com" [1]=> string(14) "https://vk.com" } }
Может регулярное выражение на каких-то случаях может давать неверный результат, но во многих случаях работает, более продвинутые регулярные выражения с РФ доменами и т.д. можно найти в интернете под требуемую задачу :)

Циклические зависимости при определении класса

При инициализации класса могут возникать deadlock'и.
Например, есть следующий код
class A { static final B b = new B(); }
class B extends A { }
Это потенциально проблемное место. Есть ли какие то решения для такого кода, позволяющие избежать данную ситуацию?
UDP:
Напишу подробнее.
Есть реализация неизменяемого списка.
abstract class List{ private static final List EMPTY = new Empty<>();
private remove(int index){ if(index<0) throw new IllegalArgumentException("index must be more zero"); return innerRemove(index); } protected abstract List innerRemove(int index);
public static List create(){ return EMPTY; } }
class Empty extends List{ protected List innerRemove(int index){return this} }


Ответ

Можно перенести поле EMPTY в класс Empty с соответствующей сменой видимости (как это и сделано в Guava).
Тогда класс Empty будет инициализирован либо при вызове List.create() (класс List в этот момент уже загружен), либо сам по себе (что может вызвать загрузку List, но т.к. List больше не требует Empty, дедлок исключен)