Здравствуйте! У меня такой вопрос. Я отправляю 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 открыть и получить данные из офисных файлов, таких как 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. Сложно сказать, насколько это поможет Вам, т.к. повторюсь — Ваша задача не совсем ясна.
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;
}
Имеется примерно такой текст: 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 в класс Empty с соответствующей сменой видимости (как это и сделано в Guava). Тогда класс Empty будет инициализирован либо при вызове List.create() (класс List в этот момент уже загружен), либо сам по себе (что может вызвать загрузку List, но т.к. List больше не требует Empty, дедлок исключен)
Как и многие использую before для вертикального выравнивания. И вот если елемент по ширине не влазит, он выходит за род. блок. Что нужно делать в этом случае? Указывать ширину меньше чем у родителя? или использовать минусовой margin для псевдоелемента? Пример
.parent {
width: 200px;
height: 200px;
background: grey;
text-align: center;
overflow: hidden;
}
.child {
background: red;
height: 40px;
overflow: hidden;
display: inline-block;
vertical-align: middle;
}
.parent:before {
content: "";
display: inline-block;
min-height: inherit;
height: 100%;
vertical-align: middle;
margin-left: -5px; //если раскоментировать появиться нужный блок
}
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente laborum, veniam alias, dolore obcaecati at illo quis consectetur quod quisquam necessitatibus? Voluptatem distinctio odio, quia rerum iusto dolore quod rem!
Ответ
Думаю, топикстартер уже разобрался с данной проблемой, но, возможно, это решение пригодится кому-то еще. Чтобы вертикально центрировать блок, используя псевдоэлемент :before, не обязательно задавать ему отрицательный margin, достаточно задать блоку-родителю font-size:0px - это избавит нас от "лишнего" пространства между inline-элементами:
.parent {
width: 200px;
height: 200px;
background: grey;
text-align: center;
overflow: hidden;
font-size: 0px;
}
.child {
width: 100%;
background: red;
height: 40px;
overflow: hidden;
display: inline-block;
vertical-align: middle;
font-size: 14px;
line-height: 20px;
}
.parent:before {
content: "";
display: inline-block;
height: 100%;
vertical-align: middle;
}
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sapiente laborum, veniam alias, dolore obcaecati at illo quis consectetur quod quisquam necessitatibus? Voluptatem distinctio odio, quia rerum iusto dolore quod rem!
Есть фоновая картинка заданная как backround-image в css - весит 27кб.
Есть "паттерн" который можно задать так же через css и "размножить" по блоку background-repeat. Весит 113 байт. Какой из вариантов будет быстрее грузиться чисто теоретически? В одном случае нужно просто загрузить изображение большего объема, во втором изображение меньше, но браузеру его нужно "Размножить" на блок.
Ответ
Произвести профайлинг рендеринга довольно трудно. Но это и не нужно. Вполне может оказаться, что разницы нет или она незначительна. А если под словом "грузиться" вы подразумеваете загрузку изображения с сервера, то тут точно разница будет минимальная. Вы можете легко убедится в этом сами посмотрев timlene в инструментах разработчика брузера Google Chrome. Метод заполнения повторениями используют все реже потому, что его часто можно заменить чистым CSS3 без использования изображений вообще, например используя repeating-linear-gradient как упомянул в коментариях @Artem Gorlachev
Здравствуйте, у меня возник вопрос по поводу поведения элементов на странице, с чередованием свойства display:block;и display:inline-block;. Я создал 3 дива и в каждый поместил еще по 3 div, нужно сделать так, что бы было возможно распологать как угодно внутренние div, но что бы внешние div не меняли свою позицию. Собственно я думал, что в этом никаких проблем не будет, но почему-то при разных комбинациях этого самого display: внешние div блоки начали вмещаться по вертикали, почему это происходит, ведь если я правильно понимаю, display:inline-block должен везти себя просто как строка и не зависеть от того, что в нем находится, аналогично с просто display:block. Что я упускаю? Как же все таки ведут себя блоки, стилизованные таким образом?
.container {
width: 200px;
height: 200px;
display: inline-block;
}
.content {
width: 20%;
height: 20%;
display: inline-block;
}
body,
div {
margin: 0px;
padding: 0px;
}
Ответ
Чтобы исправить, задайте vertical-align для контейнеров, например, top
.container {
width: 200px;
height: 200px;
display: inline-block;
vertical-align: top;
}
.content {
width: 20%;
height: 20%;
display: inline-block;
}
body,
div {
margin: 0px;
padding: 0px;
}
Здравствуйте. Имеется следующая ветка: * c9ec96c Some Changes in EG proj
* 928b5ea Merge branch 'testHDFS'
|\
| * 1504e3f Redact Task
| * a9dffca Add xmlResult
| * 82cd8fb EGp with MetaCode
| * db93620 Add EG progect to test
* | 536029f Redact Task
* | 44cc081 Add xmlResult
* | 370584a EGp with MetaCode
* | 96c5388 Add EG progect to test
|/
* 765ca4c v5HDFS
* 5da3f2a v4HDFS
* cedc686 v3HDFS
* 28d0e1a v2HDFS
* a6f9d63 v1HDFS
* e5f373a v3
* 708e3b6 v2
* c89f76a First commit
Ответвление от 765ca4c появилось после попытки переписать e-mail автора коммитов. Затем последовало слияние двух одинаковых коммитов (возможно вовремя не слил все изменения с github). Необходимо удалить дублирующую ветку. Были следующие попытки исправить ситуацию:
git rebase --onto c9ec96c 536029f как посоветовали здесь. Результат:
First, rewinding head to replay your work on top of it...
Fast-forwarded HEAD to c9ec96c.
git reset --hard 1504e3f дабы удалить коммит вовсе (принимая во внимание, что это может привести к плачевным последствиям)
UPD:
Попробовал метод от @alexander barakin, вот что получилось:
git checkout c9ec96с
git rebase -i 765ca4c pick 96c5388 Add EG progect to test
pick 370584a EGp with MetaCode
pick 44cc081 Add xmlResult
pick 536029f Redact Task
pick db93620 Add EG progect to test
pick 82cd8fb EGp with MetaCode
pick a9dffca Add xmlResult
pick 1504e3f Redact Task
pick c9ec96c Some Changes in EG proj
Затем: pick 96c5388 Add EG progect to test
pick 370584a EGp with MetaCode
pick 44cc081 Add xmlResult
pick 536029f Redact Task
pick c9ec96c Some Changes in EG proj
:x
Successfully rebased and updated detached HEAD.
git log --oneline --graph * f647a1b Some Changes in EG proj
* 536029f Redact Task
* 44cc081 Add xmlResult
* 370584a EGp with MetaCode
* 96c5388 Add EG progect to test
* 765ca4c v5HDFS
* 5da3f2a v4HDFS
* cedc686 v3HDFS
* 28d0e1a v2HDFS
* a6f9d63 v1HDFS
* e5f373a v3
* 708e3b6 v2
* c89f76a First commit
git checkout master Warning: you are leaving 1 commit behind, not connected to any of your branches:
f647a1b Some Changes in EG proj
If you want to keep it by creating a new branch, this may be a good time to do so with:
git branch f647a1b
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
git log --oneline --graph * c9ec96c Some Changes in EG proj
* 928b5ea Merge branch 'testHDFS'
|\
| * 1504e3f Redact Task
| * a9dffca Add xmlResult
| * 82cd8fb EGp with MetaCode
| * db93620 Add EG progect to test
* | 536029f Redact Task
* | 44cc081 Add xmlResult
* | 370584a EGp with MetaCode
* | 96c5388 Add EG progect to test
|/
* 765ca4c v5HDFS
* 5da3f2a v4HDFS
* cedc686 v3HDFS
* 28d0e1a v2HDFS
* a6f9d63 v1HDFS
Я понимаю, что создалась новая ветка и я могу по хэшу переключиться на head. Но не понимаю почему не удалились старые коммиты. Пытался дропнуть их и через rebase и через reset. Если ввести команду rebase для f647a1b (пересчитанный коммит), то на него смотрят коммиты, которые "выше" c9ec96c. Видимо не до конца произошло перебазирование и появился конфликт.
Ответ
насколько я понял, вы хотите удалить четыре «продублированных» коммита (и коммит слияния). для этого можно воспользоваться интерактивным вариантом команды rebase $ git rebase -i коммит.до.разветвления
пример: $ git log --oneline --graph
* aabf478 7
* 5430d97 6
* 696565e bind
|\
| * dff29c3 15
| * 5709144 14
| * 133cf40 13
* | 1807d0e 5
* | f61ce99 4
* | c5c42a9 3
|/
* c521dd2 2
* fd32efc 1
требуется, чтобы история выглядела так: 1 - 2 - 3 - 4 - 5 - 6 - 7, а коммиты с сообщениями 13, 14, 15 и bind — вообще убрать. в данном случае коммит до разветвления — это коммит с сообщением 2 и хэшем c521dd2 $ git rebase -i c521dd2
откроется редактор со следующими строками (обратите внимания — коммита слияния с сообщением bind в этом списке нет (и не должно быть)): pick c5c42a9 3
pick f61ce99 4
pick 1807d0e 5
pick 133cf40 13
pick 5709144 14
pick dff29c3 15
pick 5430d97 6
pick aabf478 7
надо просто удалить строки с сообщениями 13, 14, 15, чтобы остался такой список: pick c5c42a9 3
pick f61ce99 4
pick 1807d0e 5
pick 5430d97 6
pick aabf478 7
сохраняем файл и закрываем редактор. git закончит работу и выдаст примерно следующее: Successfully rebased and updated refs/heads/master.
теперь история выглядит так, как требовалось: $ git log --oneline --graph
* 894f56f 7
* 305ff84 6
* 1807d0e 5
* f61ce99 4
* c5c42a9 3
* c521dd2 2
* fd32efc 1
естественно, хэши у перезаписанных коммитов (с сообщениями 6 и 7) изменились. но «содержание» у них осталось прежним, и в рабочем каталоге сейчас та же «картина», что и до вызова rebase
Нужно подключить базу данных, в приоритете Microsoft Access, но можно и другие варианты
Как это можно осуществить? В WindowsForm был готовый компонент отвечающий за подключения базы данных, а как это реализовать здесь? System.Data- не знает Предлагали через Вид->Другие окна->Источники данных->База данных Но в выборе источников базы данных нет(Visual Studio 2015)
Ответ
Насколько мне известно, подключение к базам данных в XNA, к сожалению, сильно ограничено (вроде как в целях безопасности). Потому, на просторах (в том числе и на спецресурсах по XNA) рекомендуют использовать специальные классы для хранения данных Microsoft.Xna.Framework.Storage (по сути - работа с файлами) или использовать SQLite. Т.е. ответ на ваш вопрос - видимо, штатным образом, к сожалению, никак.
Здравствуйте, друзья! У меня очень серьезная проблему по созданию структуры БД. У меня есть о-очень много пользователей, у каждого будут свои категории(которые он сам будет создавать), в категориях будут "папки" данной категории, которые тоже будет создавать пользователь, а в "папках" будут ссылки, ссылок будет очень много и они будут ежедневно даже ежечасно добавляться. Я думал создать отдельную таблицу для ссылок, но он очень быстро пополнится, и это меня пугает. Вопрос: Есть какие то идеи? Буду рад любой идей. Заранее спасибо.
Ответ
Не стоит делать из этого проблему. Производительность вашей РСУБД зависит от используемого железа (правильную архитектуру не забываем здесь). Поставили SSD диск, мощный процессор, побольше памяти и никаких проблем с производительностью при средней нагрузке не будет на выгрузках, но если у вас большая нагрузка, и еще не только выгрузки, а еще всякие расчеты, то против природы не пойдешь, большие данные требуют больших ресурсов для обработки. Нужно больше чтения - подняли второй сервер в режиме слейва. Чисто теоретический, один сервер, в котором один диск на 480 ГБ, при максимальном размере ссылки в 1024 символа, может хранить где-то 400 млн записей в таблице ссылок у Вас даже не возникнет проблем размещения всего этого на одном сервере, главное сделайте индексы на свои папки. Иногда используют словарный подход для контроля ссылок, это таблица вида id - hash - value, позволяет сократить расходы на одинаковые ссылки, но также требует ресурсов для работы, применять нужно, только если есть необходимость в этом функционале. Не беспокойтесь, если объем таблицы перевалит за размер одного сервера, тогда займетесь партицированнием таблицы и способами кластеризации вашего сервера.
Есть 2 pojo класса: public class Component {
private String ID;
private Set environmentSet; public class Environment {
private String host;
private String name;
private Set components;
И контейнер для второго: public class EnvironmentContainer {
private List allEnvironments;
Мне по данному пути нужно вернуть лист из контейнера @RequestMapping("/environments")
@ResponseBody
public List getAllEnvironments() {
return environmentcontainer.getAllEnvironments();
}
При выполнении возникает ошибка, скорее всего из за взаимосвязи между pojo, построенной на set:
java.lang.IllegalStateException: Cannot call sendError() after the
response has been committed at
org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:466)
Слышал в спринге есть аннотация, которая обрубает бесконечное извлечение, или есть другие пути как это исправить?
Ответ
Нижеизложенное справедливо если вы используете Jackson для сериализации ваших бинов. В Jackson есть аннотации, позволяющие управлять сериализацией бинов, связанных циклическими ссылками. Это @JsonManagedReference и @JsonBackReference. Первой помечается поле или геттер основного класса (с которого начинается сериализация) со ссылками на зависимые объекты, второй - поле или геттер зависимого класса со ссылкой на основной: public class Environment {
@JsonManagedReference
private Set components;
} public class Component {
@JsonBackReference
private Set environmentSet;
}
Теперь Jackson не уйдёт в бесконечную рекурсию при сериализации. Другая аннотация, которая может помочь - @JsonIgnore. Поля, помеченные такой аннотацией, не включаются в сериализованный объект. Если объекты класса Component никогда не будут сериализовываться отдельно от объектов Environment, то можно пометить поле environmentSet аннотацией @JsonIgnore, эффект будет аналогичный. Ещё один вариант - @JsonIdentityInfo. Этой аннотацией помечается весь класс. С её помощью можно подсказать Jackson'у, как определить уникальный ключ объекта (например, по полю ID): @JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "ID")
public class Environment { ... }
Встретив при сериализации объект с ключом, который он уже обрабатывал, Jackson подставит вместо него его ключ. Также есть возможность управлять сериализацией циклических ссылок через @JsonView (подробнее об этом и других способах читайте в этой статье), но это требует регистрации в Spring'е кастомного сериализатора.
Имеется бд oracle , в которой nls_lang установлено как russian_russia. Необходимо поменять кодировку на american. как я проверяю кодировку : select * from nls_database_parameters Пробовал изменить реестр и установить кодировку, что мне нужна. Пробовал прописать set nls_lang = american_america, но ничего не работает. Переустанавливать не хочется. Может есть работающие алгоритмы смены кодировки?
Ответ
Если вы хотите установить окружение, то - set NLS_LANG=american_america.
Так Вы измените окружение только для клиентских програм. Я так понял Вам надо изменить на уровне ДБ. Тогда надо в файле параметрах init.ora прописать NLS_LANGUAGE и NLS_TERRITORY отдельно. NLS_LANG не используется в init.ora. UPD Выше сказаное касалось языка и территории.
Кодировкa устанавливается в NLS_CHARACTERSET, т.е. v 3-й составляющей NLS_LANG (languge_territory.characterset).
Кодировку можно изменить только, если новая кодировка является строгим супермножеством старой кодировки, т.е. нельзя поменять WE8ISO8859P5 на AL32UTF8, а US7ASCII можно всегда. Если повезло, то alter database character set AL32UTF8;
Если нет - миграция данных и в худшем случае програм, которые не совсем понимают новую кодировку.
Подробнее читаем тут или в общих чертах по-русски тут
Нужно как-то наложить сетку поверх экрана, чтобы при этом обрабатывались нажатия по элементам, находящимся за этой сеткой. Как такое можно реализовать?
Ответ
Для этого есть FrameLayout. Например, вот тут на переднем плане - наполовину прозрачная "пленка", а за ней ProgressBar
Замените ProgressBar на Layout с вашими кнопками и поставьте сетку :)
Имеется два стримера avermedia один транслирует на телевидение другой на радио
Нужно транслировать и на сайт.
Есть веб сервер на котором стоит сам сайт.
Медиа сервер для видео,радио каждому отдельный нужен или можно один сервер использовать?
Еще какие оборудования нужны? Помогите пожалуйста а то я как ёжик в тумане...)
Спасибо
Ответ
Все упирается в процессоры и каналы. Количество серверов прямо пропорционально количеству слушателей. Количество слушателей ограничено пропускной способностью канала, причем как по скорости, так и по количеству пакетов в секунду. Софт: Серверы отдачи контента: nginx-rtmp - прекрасный плагин к nginx. Авторская статья о нем icecast2 - умеет отдавать WebM, это значит, что работатет с мобильными браузерами Транскодеры: ffmpeg gstreamer Плееры для браузера: Flowplayer - хорош тем, что поддерживает кучу форматов. Технологическая цепочка: транскодер - серверы отдачи - плеер. Транскодер может быть один, он должен генерировать несколько форматов видео, которые затем можно Multicast-потоком пускать на серверы отдачи.
Пусть создан индекс по строковой колонке (не важно какой). Как известно, он будет представлять собой дерево, где каждый лист - подстрока. Каким образом устанавливается, какой длины подстрока в листе?
Ответ
Как известно, он будет представлять собой дерево, где каждый лист - подстрока.
Нет, это не так. В оф. документации говорится:
The leaf blocks contain every indexed data value and a corresponding rowid used to locate the actual row.
Каждая запись (leaf entry) в листке (leaf node) содержит пару key+value, соостоящая из полного значения индексированой колонки и адреса-указателя на соответствующую строку в таблице данных. Например, построим два индекса с ключами одной и той же длины, один уникальный со случайными символами, и другой безсмысленный, с одним и тем же символом заполнителем. create table tab1 as
select dbms_random.string('u', 80) itemNo, rpad ('A', 80, 'A') itemDs
from xmltable('1 to 100'); create unique index idx_tab1_uniq on tab1 (itemNo);
create index idx_tab1_same on tab1 (itemDs); exec dbms_stats.gather_table_stats(user, upper('tab1')); select index_name, blevel, leaf_blocks, num_rows, clustering_factor
from user_indexes where table_name=upper('tab1')
order by 2,3; INDEX_NAME BLEVEL LEAF_BLOCKS NUM_ROWS CLUSTERING_FACTOR
---------------- ---------- ----------- ---------- -----------------
IDX_TAB1_SAME 1 2 100 3
IDX_TAB1_UNIQ 1 2 100 63
Получили уровень ветвления 1 по 2 блока листьев . Проведём анализ индексов: analyze index idx_tab1_uniq validate structure offline;
analyze index idx_tab1_same validate structure offline;
-- выполнить после анализа каждого индекса
select name, height, lf_blks, lf_rows, lf_rows_len, br_blks, br_rows, br_rows_len
from index_stats t
; NAME HEIGHT LF_BLKS LF_ROWS LF_ROWS_LEN
---------------- ---------- ---------- ---------- -----------
IDX_TAB1_UNIQ 2 2 100 9100
IDX_TAB1_SAME 2 2 100 9200
Оба индекса не намного отличаются по длине записей:
lf_rows_len/lf_rows=avgLength 91 и 92 байта средняя длина записи. Дамп блоков с листьями выглядит так (здесь только выдержка двух первых записей в первом листе каждого индекса): Leaf block dump
===============
header address 139975326998628=0x7f4e8ba4a064
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 2
kdxcosdc 0
kdxconro 78
kdxcofbo 192=0xc0
kdxcofeo 1012=0x3f4
kdxcoavs 820
kdxlespl 0
kdxlende 0
kdxlenxt 50335373=0x3000e8d
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8032
row#0[7942] flag: -------, lock: 0, len=90
col 0; len 80; (80):
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41
col 1; len 6; (6): 03 00 0e 7b 00 00
row#1[7852] flag: -------, lock: 0, len=90
col 0; len 80; (80):
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41
41 41 41 41 41
col 1; len 6; (6): 03 00 0e 7b 00 01 Leaf block dump
===============
header address 139975326998628=0x7f4e8ba4a064
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 1
kdxcosdc 0
kdxconro 78
kdxcofbo 192=0xc0
kdxcofeo 1090=0x442
kdxcoavs 898
kdxlespl 0
kdxlende 0
kdxlenxt 50335365=0x3000e85
kdxleprv 0=0x0
kdxledsz 6
kdxlebksz 8032
row#0[7943] flag: -------, lock: 0, len=89, data:(6): 03 00 0e 7c 00 0a
col 0; len 80; (80):
41 43 45 48 54 42 41 58 4f 52 45 5a 46 56 46 47 45 59 4a 51 53 49 4e 55 5a
56 54 4c 52 42 4e 42 42 48 54 4f 52 48 4a 52 4a 5a 55 43 42 44 43 51 49 43
43 48 47 42 56 41 58 58 54 4c 43 4e 59 50 59 59 4e 57 43 50 58 4f 59 44 53
55 4d 51 4b 48
row#1[7854] flag: -------, lock: 0, len=89, data:(6): 03 00 0e 7c 00 11
col 0; len 80; (80):
41 43 49 51 41 57 4b 4b 4d 4b 46 44 4d 57 59 54 54 42 43 56 49 4a 58 4f 44
4e 51 41 56 49 53 54 55 47 42 49 4c 51 48 4a 4f 45 52 42 58 53 47 41 4a 56
54 51 59 43 4f 44 50 59 51 56 45 43 44 47 51 48 4c 59 4e 46 44 48 47 55 58
47 42 45 50 4d
Допустим у нас есть 2 WCF сервиса, которые хостятся на сервере:
Пользователь при входе в программу отправляет инфу на сервер что он зашел. Сервер хранит коллбэки всех пользователей которые сейчас в сети.
Второй сервис дуплексный и он хочет просто отправить какие-то данные определенному пользователю, но для этого эму нужно получить коллбэк из первого сервиса.
Как правильно в данной ситуации нужно действовать?
Ответ
У дуплексных служб, колбеки от клиента прописываются в контракте. Когда клиент подключается, он передает свой контекст сервису и сервис получает через этот контекст доступ к колбекам клиента. Передача контекста между сервисами не предусмотрена, т.к. в зависимости от настроек сервиса создается отдельный инстанс сервиса на подключение или сессию для каждого клиента. Если ваше приложение использует больше одного сервиса в своей работе, то оно обязано подключаться к каждому из них независимо, таким образом необходимости в передаче контекста между службами просто не может быть.
Есть таблица (group_id int, text varchar(max), sum decimal(19,2)) данные 1 | qwe | 3.00 1 | asd | 5.00 2 | zxc | 10.00 2 | 123 | 15.00
Нужно индексированное представление, которое вернет 1 | qwe,asd | 8.00 2 | zxc,123 | 25.00
Ответ
В данном случае обычное представление можно создать, индексированное - нет. Любой способ, которым можно выполнить конкатенацию в SqlServer попадёт под ограничения (ссылка, см. раздел Дополнительные требования). Дело в том, что если в индексированном представлении используется агрегация, то оно не только должно "уметь" агрегировать данные, при добавлении или изменении строк в таблицах, на которых оно основано, но также и деагрегировать их, при удалении строк. И с целью улучшения производительности это делается инкрементально, а не полным перестроением индекса. С функциями наподобие sum() и count() это можно сделать легко и однозначно. Если добавили строк в таблицу, то значения их [sum] добавятся к соответствующим строкам индексированного представления. Если удалили строки, то их [sum] вычтутся. С конкатенацией нельзя такого сделать. Допустим у нас есть строки asd, qwe и d,q в одной группе. Конкатенируя их через запятую мы получим в индексированном представлении строку asd,qwe,d,q Теперь, допустим, удаляется строка с d,q. Как определить в каком месте в asd,qwe,d,q нужно убрать d,q? Однозначно - никак. Поэтому такие вещи и запрещены. Альтернатива - дополнительная постоянная таблица, которая будет обновляться (например, триггером) при изменении данных в основной таблице.
Есть программа на Delphi XE8, висящая в области уведомлений и при определённых событиях показывающая окно с информацией. Под Windows 7 следующий код обеспечивал показ формы поверх всех окон практически на 100%. with TfrmInfo.Create(self) do
begin
Show;
Application.NormalizeTopMosts;
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE + SWP_NOMOVE + SWP_NOSIZE);
end;
И этот код перестал срабатывать под Windows 10. Точнее, иногда окно появляется поверх всех, но гораздо чаще оказывается наоборот в самом "низу", под всеми окнами. Может кто сталкивался с таким? И как это попробовать полечить?
Ответ
"Виновником" оказалась строка с Application.NormalizeTopMosts. Я её в своё время без особых раздумий по какому-то примеру в код вставил. И под семёркой она по крайней мере не мешала. А вот под десяткой получил проблему. Просто убрал эту строку - и всё заработало!
Уважаемые гуру, прошу растолковать по привязкам. В учебных статьях "для чайников" вопросы утечек вообще не рассматриваются, а самостоятельный поиск информации по частям привел к тому, что я запутался. Что я нарыл:
Для борьбы с утечками памяти в WPF, нужно привязываться к объектам, реализующим INotifyCollectionChanged. Ок, в случае коллекций, все понятно. Привязываемся через ObservableCollection
Но как быть с простыми типами данных?
Допустим у нас простая страничка, на которой есть текстовое поле, куда пользователь вводит свое имя. Для работы с этим именем, привяжем его к полю name View: ViewModel: public string name {get; set;}
...
this.DataContext = this;
this.InitializeComponent();
Согласно этой страницы, для борьбы с утечкой, необходимо или реализовать INotifyPropertyChanged на объекте-источнике, либо сделать свойство DependencyProperty. Но я нигде не могу найти простой пример, как это правильно сделать.
Тут, в последнем абзаце, вообще написано:
Если вы используете .NET Framework 4.5, то у вас не будет утечки
памяти
Так как правильно реализовать привязку данных?
Ответ
В документе, на которые вы ссылаетесь, написано следующее:
This issue occurs if the following conditions are true:
A data-binding path refers to property P of object X
Object X contains a direct reference or an indirect reference to the target of the data-binding operation.
Property P is accessed through a PropertyDescriptor object instead of a DependencyProperty object or a PropertyInfo object.
Из этих условий необычным является второе: «Object X contains a direct reference or an indirect reference to the target of the data-binding operation». Если вы программируете с использованием MVVM, ваш объект X скорее всего VM-объект, а целевой элемент привязки — View-объект. В нормальной ситуации объекты VM не имеют права знать о View, и таким образом не должны содержать на него прямых или непрямых ссылок. Значит, проблема может возникнуть только если у вас View-объект ссылается на другой View-объект. Но свойства UI-объектов обычно являются DependencyProperty, поэтому этот случай тоже в подавляющем большинстве случаев не имеет места. Что нужно делать?
Если вы производите Binding UI-объекта к другому свойству UI-объекта, имеет смысл обратить внимание на то, является ли то, что вы привязываете, DependencyProperty. В подавляющем большинстве случаев это так и будет.
Если всё же оказывается, что вам кровь из носу нужно забиндить свойство одного UI-объекта на другое свойство, которое не является DependencyProperty (например, как в примере из статьи, которую вы привели: в этом примере memory leak возникает и в VS 2015), вам нужно поменять Binding на OneTime: в этом случае всё равно вы не получаете нотификаций об изменении свойства (т. к. INotifyPropertyChanged не реализовано, и свойство не есть DependencyProperty).
Более прагматичный подход — не парьтесь с каждой привязкой, тестируйте ваше приложение при помощи memory profiler'а, и если обнаружите утечку памяти, описанную в статье, почините её как указано в п. 2.
Добрый день, коллеги!
Не выходит настроить правильный редирект средствами php. UPD: 21/10/2016 Вынес поддомен на который должна быть переадресация в отдельный конфиг nginx и отдельный пул php-fpm. Не помогло. Конфиг nginx основного домена:
domain.conf: server {
server_name www.domain.ru;
rewrite ^(.*) http://domain.ru$1 permanent;
}
server {
listen 80;
root /var/www/folder/public; index index.html index.htm index.php; server_name anotherdomain.ru subdomain2.domain.ru domain.ru;
location ~ \.php$ {
# root /var/www try_files $uri =404;
fastcgi_keep_conn on;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include /etc/nginx/fastcgi_params;
} location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
} location ~ /\.ht {
deny all;
}
}
Конфиг nginx поддомена: subdomain.conf: server {
listen 80;
root /var/www/folder/public; index index.html index.htm index.php; server_name subdomain.domain.ru;
gzip on;
gzip_disable "msie6";
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
location ~ \.php$ {
# root /var/www try_files $uri =404;
fastcgi_keep_conn on;
fastcgi_pass unix:/var/run/php5-fpm-subdomain.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include /etc/nginx/fastcgi_params;
} location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
} location ~ /\.ht {
deny all;
}
}
При таком коде:
В ответ получаю: [root@svm]# curl -I http://domain.ru/indexfile.php
HTTP/1.1 302 Moved Temporarily
Connection: close
Date: Mon, 17 Oct 2016 13:57:59 GMT
Location: http://domain.ru/
Content-Type: text/html; charset=UTF-8
Server: nginx/1.4.6 (Ubuntu)
Но при этом, в консоли отладки firefox вижу такой Url Запроса:
http://domain.ru/subdomain.domain.ru А при таком коде:
Прилетает это: [root@svm]# curl -I http://domain.ru/indexfile2.php
HTTP/1.1 302 Moved Temporarily
Connection: close
Date: Mon, 17 Oct 2016 13:57:59 GMT
Location: http://subdomain2.domain.ru/
Content-Type: text/html; charset=UTF-8
Server: nginx/1.4.6 (Ubuntu)
Для одного конкретного поддомена не присваивается новый заголовок с location.
В чём может быть проблема и как её исправить? Наблюдение: Если в Location: указывать uri без http (То есть просто //subdomain.domain.ru, то перенаправление работает. Почему? Как исправить? Интересный факт - Добавил в файл несколько произвольных заголовков и их вывод: "print_r(headers_list());". Судя по всему, php правильно выставляет headers, но они либо не применяются, либо их переписывает nginx: [root@svm]# curl -v http://domain.ru/indexfile.php
* About to connect() to 4cio.ru port 80 (#0)
* Trying 11.11.11.11...
* Connected to domain.ru (11.11.11.11) port 80 (#0)
> GET /indexfile.php HTTP/1.1
> User-Agent: curl/7.29.0
> Host: domain.ru
> Accept: /
>
< HTTP/1.1 302 Moved Temporarily
< Connection: Keep-Alive
< Transfer-Encoding: chunked
< Expires: Mon, 26 Jul 2666 05:00:00 GMT
< Date: Tue, 18 Oct 2016 14:46:44 GMT
< Location: **http://domain.ru** - Ну вот откуда он берётся?
< Content-Type: text/html; charset=UTF-8
< Server: nginx/1.4.6 (Ubuntu)
< Cache-Control: no-cache
<
Array
(
[0] => Expires: Mon, 26 Jul 2666 05:00:00 GMT
[1] => Cache-Control: no-cache
[2] => Location: http://subdomain.domain.ru
)
UPD 2: 21.10.2016 Добавил логи nginx в debug-режиме: Лог очень большой. Сравнил два лога- один для поддомена на который переадресация выполяется нормально, второй для поддомена на который переадресация не выполняется. В обоих случаях, nginx получает новый location при первой обработке php-файла. Ниже предоставлены выдержки с того момента, как они начинают отличаться: Лог для не работающего поддомена: http fastcgi sent end request
pipe write downstream: 1
pipe write downstream done
event timer: 61, old: 1477057711592, new: 1477057711593
http upstream exit: 0000000000000000
finalize http upstream request: 0
finalize http fastcgi request
free rr peer 1 0
close http upstream connection: 61
free: 000000000240DFA0, unused: 48
event timer del: 61: 1477057711592
reusable connection: 0
http upstream temp fd: -1
http output filter "/indexfile.php?"
http copy filter: "/indexfile.php?"
image filter
xslt filter body
http postpone filter "/indexfile.php?" 00007FFF3BF1A200
http chunk: 0
write old buf t:1 f:0 000000000249A7E8, pos 000000000249A7E8, size: 274 file: 0, size: 0
write new buf t:0 f:0 0000000000000000, pos 00000000004AA3DA, size: 5 file: 0, size: 0
http write filter: l:1 f:0 s:279
http write filter limit 0
writev: 279
http write filter 0000000000000000
http copy filter: 0 "/indexfile.php?"
http finalize request: 0, "/indexfile.php?" a:1, c:1
set http keepalive handler
http close request
http log handler
free: 000000000249AA20
free: 0000000002487340, unused: 8
free: 0000000002499A10, unused: 8
free: 0000000002409890, unused: 3556
free: 00000000024B1630
hc free: 0000000000000000 0
hc busy: 0000000000000000 0
tcp_nodelay
reusable connection: 1
event timer add: 60: 65000:1477057716593
post event 00000000024E0FA0
delete posted event 00000000024E0FA0
http keepalive handler
malloc: 00000000024B1630:1024
recv: fd:60 -1 of 1024
recv() not ready (11: Resource temporarily unavailable)
free: 00000000024B1630
post event 00000000024E0FA0
post event 00000000024F47B0
delete posted event 00000000024F47B0
http empty handler
delete posted event 00000000024E0FA0
http keepalive handler
malloc: 00000000024B1630:1024
recv: fd:60 329 of 1024
reusable connection: 0
posix_memalign: 0000000002487340:4096 @16
event timer del: 60: 1477057716593
http process request line
http request line: "GET / HTTP/1.1"
http uri: "/"
http args: ""
http exten: ""
posix_memalign: 0000000002499A10:4096 @16
http process request header line
http header: "Reverse-Via: FF-SRV"
http header: "Host: domain.ru" ------Вот здесь должен быть subdomain.domain.ru
http header: "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
http header: "Accept-Language: en-US,ru-RU;q=0.8,ru;q=0.5,en;q=0.3"
http header: "DNT: 1"
http header: "Upgrade-Insecure-Requests: 1"
http header: "Connection: Keep-Alive"
http header done
Лог для работающего поддомена: http fastcgi sent end request
posix_memalign: 00000000024B2620:4096 @16
pipe write downstream: 1
pipe write downstream done
event timer: 55, old: 1477057946320, new: 1477057946320
http upstream exit: 0000000000000000
finalize http upstream request: 0
finalize http fastcgi request
free rr peer 1 0
close http upstream connection: 55
free: 0000000002413EC0, unused: 48
event timer del: 55: 1477057946320
reusable connection: 0
http upstream temp fd: -1
http output filter "/indexfile.php?"
http copy filter: "/indexfile.php?"
image filter
xslt filter body
http postpone filter "/indexfile.php?" 00007FFF3BF1A200
http chunk: 0
write old buf t:1 f:0 000000000249C4B0, pos 000000000249C4B0, size: 270 file: 0, size: 0
write new buf t:0 f:0 0000000000000000, pos 00000000004AA3DA, size: 5 file: 0, size: 0
http write filter: l:1 f:0 s:275
http write filter limit 0
writev: 275
http write filter 0000000000000000
http copy filter: 0 "/indexfile.php?"
http finalize request: 0, "/indexfile.php?" a:1, c:1
set http keepalive handler
http close request
http log handler
free: 000000000240A000
free: 00000000025096F0, unused: 8
free: 000000000249B6E0, unused: 8
free: 00000000024B2620, unused: 3572
free: 0000000002488790
hc free: 0000000000000000 0
hc busy: 0000000000000000 0
tcp_nodelay
reusable connection: 1
event timer add: 54: 65000:1477057951320
post event 00000000024E0030
delete posted event 00000000024E0030
http keepalive handler
malloc: 0000000002488790:1024
recv: fd:54 -1 of 1024
recv() not ready (11: Resource temporarily unavailable)
free: 0000000002488790
delete posted event 00000000024F3840
http empty handler
accept: 22.22.22.22 fd:55
event timer add: 55: 60000:1477057946388
reusable connection: 1
epoll add event: fd:55 op:1 ev:80000001
post event 00000000024E1BD0
delete posted event 00000000024E1BD0
http wait request handler
posix_memalign: 00000000024888A0:256 @16
malloc: 00000000024889B0:1024
recv: fd:55 336 of 1024
reusable connection: 0
posix_memalign: 00000000025096F0:4096 @16
http process request line
http request line: "GET / HTTP/1.1"
http uri: "/"
http args: ""
http exten: ""
posix_memalign: 000000000249B6E0:4096 @16
http process request header line
http header: "Reverse-Via: FF-SRV"
http header: "Host: subdomain2.domain.ru"
http header: "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0"
http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
http header: "Accept-Language: en-US,ru-RU;q=0.8,ru;q=0.5,en;q=0.3"
http header: "DNT: 1"
http header: "Upgrade-Insecure-Requests: 1"
http header: "Connection: Keep-Alive"
http header done
UPD 3: 24/10/2016 Наблюдение Ели я размещаю файлик с переадресацией в subdomain2.domain.ru, то перенаправление на subdomain.domain.ru работает без проблем.
Ответ
Коллеги, проблема решена. Проблема оказалась вообще не в nginx. ПЕМКИС, как это часто и бывает. Оказывается, на стороне Заказчика стоит прозрачный TMG, о чём не сообщили. В этом TMG было включено некорректное правило с изменением заголовков. Было включено "Подставлять действительный заголовок вместо запрошенного" для зоны domain.ru p.s. ПЕМКИС = Проблема Есть Между Клавиатурой И Стулом
Доброго времени суток.
В методе equals не работает приведение типов. В чем проблема? class Pair
{
private T first;
private U second;
public Pair()
{
first = null;
second = null;
}
public Pair(T f, U s)
{
first = f;
second = s;
}
public void setFirst(T arg)
{
first = arg;
}
public void setSecond(U arg)
{
second = arg;
}
public T getFirst()
{
return first;
}
public U getSecond()
{
return second;
}
public String toString()
{
return first.toString()+" "+second.toString();
}
@Override
public boolean equals(Object other)
{
if (other == null)
return false;
if (getClass()!=other.getClass())
return false;
if (this == other)
return true;
Pair Other = (Pair) other; //эта строка не работает
if (getFirst().equals(Other.getFirst())&&getSecond().equals(Other.getSecond()))
return true;
return false;
}
@Override
public int hashCode()
{
return 3*getFirst().hashCode()-4*getSecond().hashCode();
}
}
Ответ
Вообще то, конструкция вида Pair Other = (Pair) other;
не является корректной, т.к. в райнтайме дженерики стираются. Вместо U, T у полей будет тип Object. Естественно компилятор пытается предупредить вас о возможной ошибке. Но вы можете проверить, является ли данный объект типом Pair, а затем проверить каждое поле на равенство либо, сопоставимость типов: @Override
public boolean equals(Object other) {
if (other == null)
return false;
if (this == other)
return true; if (!(other instanceof Pair))
return false; Pair obj = (Pair) other;
if (Objects.equals(obj.first, this.first) && Objects.equals(obj.second, this.second))
return true; return false;
}
Но если вы точно знаете и совершенно уверены в том, что делаете то аннотация @SuppressWarnings("unchecked") для вас. Она избавляет от этих назойливых предупреждений во время компиляции.
Пример с дополнением интерфейса: class Playback {
private Media current; public void play(Media media) {
current.stop();
current = media;
current.play();
} public void next() {
Media media // получение следующей по какому либо алгоритму
play(media);
} public void prev() {
Media media // получение предыдущей по какому либо алгоритму
play(media);
}
}
Пример с добавлением классов операций: class Playback {
private Media current; public Media current() {
return current;
} public void play(Media media) {
current.stop();
current = media;
current.play();
}
} abstract class PlayOperation {
private Playback playback; public void execute() {
Media media = provide();
playback.play(media);
} protected abstract Media provide();
} class NextOperation extends PlayOperation {
public Media provide() {
Media media // получение следующей по какому либо алгоритму
return media;
}
} class PrevOperation extends PlayOperation {
public Media provide() {
Media media // получение предыдущей по какому либо алгоритму
return media;
}
} class RandomOperation extends PlayOperation {
private Random random; public Media provide() {
Media media // получение рандомной
return media;
}
}
Пример с новыми классами выглядит привлекательнее, а стоит ли оно того?
Ответ
Пример с добавлением классов операций
То что вы описали в примере, это почти шаблон проектирования "Посетитель" . NextOperation , PrevOperation , RandomOperation - посетители класса Playback . В данном случае этот шаблон вряд ли обоснован, так как он призван добавлять поведение иерархии классов, и он действительно при работе с иерархией играет на OCP (т.к. необходимость добавления поведения в дерево наследников с помощью добавления метода в базовый класс как-раз нарушит OCP). У вас же класс один Playback - OCP не будет нарушено в первом случае - Playback открыт для расширения наследованием (если конечно поменять private на protected), и закрыт для изменения (это значит, что переписывать его вам не требуется для доработки поведения в наследниках). Нельзя не увидеть минус второго подхода - вы серьёзно усложняете систему, размазывая простую логику на множество классов ( это Anti-SRP ). Поэтому я бы посоветовал оставить первый вариант, как минимум, когда система простая - так усложнять её нельзя, YAGNI против. Но если Playback становится базовым классом иерархии - использование посетителей будет уже обосновано, и следует добавить метод visit(PlayOperation operation), при чём возможность посещения Playback - не значит что метод next(), например, обязательно должен быть вынесен в класс-посетитель: в посетителей лучше выносить дополнительные операции, а основные - оставлять внутри класса.
Доброго времени суток коллеги! У меня похоже не правильно работает эта функция. Мне нужно:
Cоздать массив.
Установить массив в качестве изображения
Я написал примерно такую реализацию: //функция создаёт массив пикселей
- (void)ProccessImage { //352*288*4 = РАЗМЕР КАРТИНКИ unsigned char * buf = (unsigned char*)malloc(352*288*4);//выделить память под массив
unsigned int *ibuf = (unsigned int *)buf; // for(int i = 0; i<352*288*4; i++){ //заполняем массив пикселей
ibuf[i] = i|0x80808080;
}
UIImage*imageFromArray = [self convertBitmapRGBA8ToUIImage:buf withWidth:352 withHeight:288]; //создание изображения из массива пикселей.
[ChangeImageView setImage:imageFromArray]; //установка изображения в ImageView free(buf);
} /*Функция по конвертации массива unsigned сhar в картинку. Дёрнута отсюда https://stackoverflow.com/questions/7650144/how-to-convert-bytearray-to-image-in-objective-c
*/
- (UIImage *) convertBitmapRGBA8ToUIImage:(unsigned char *) buffer
withWidth:(int) width
withHeight:(int) height {
size_t bufferLength = width * height * 4;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, bufferLength, NULL);
size_t bitsPerComponent = 8;
size_t bitsPerPixel = 32;
size_t bytesPerRow = 4 * width; CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
if(colorSpaceRef == NULL) {
NSLog(@"Error allocating color space");
CGDataProviderRelease(provider);
return nil;
} CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; CGImageRef iref = CGImageCreate(width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorSpaceRef,
bitmapInfo,
provider, // data provider
NULL, // decode
YES, // should interpolate
renderingIntent); uint32_t* pixels = (uint32_t*)malloc(bufferLength); if(pixels == NULL) {
NSLog(@"Error: Memory not allocated for bitmap");
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpaceRef);
CGImageRelease(iref);
return nil;
}
// memcpy(pixels,buffer,bufferLength);
CGContextRef context = CGBitmapContextCreate(pixels,
width,
height,
bitsPerComponent,
bytesPerRow,
colorSpaceRef,
bitmapInfo); if(context == NULL) {
NSLog(@"Error context not created");
free(pixels);
} UIImage *image = nil;
if(context) { CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), iref); CGImageRef imageRef = CGBitmapContextCreateImage(context); // Support both iPad 3.2 and iPhone 4 Retina displays with the correct scale
if([UIImage respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) {
float scale = [[UIScreen mainScreen] scale];
image = [UIImage imageWithCGImage:imageRef scale:scale orientation:UIImageOrientationUp];
} else {
image = [UIImage imageWithCGImage:imageRef];
} CGImageRelease(imageRef);
CGContextRelease(context);
} CGColorSpaceRelease(colorSpaceRef);
CGImageRelease(iref);
CGDataProviderRelease(provider); if(pixels) {
free(pixels);
}
return image;
}
//Конец функции по конвертации массива в изображение
В результате вышеуказанной реализации, устанавливается в imageView белый экран. Вопрос: Как изменить реализацию так, чтобы в imageView был заполнен разноцветными точками (чем-нибудь отличающимся от белого цвета)?
Ответ
Вот этот код генерирует мне картинку шума, если его вставить, например, во viewDidLoad int width = 500;
int height = 500; size_t bufferLength = width * height * 4;
uint8_t* pixels = (uint8_t*)malloc(bufferLength);
for (int i = 0; i < bufferLength; i++) {
pixels[i] = rand() % 255;
} CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(pixels, width, height, 8, width * 4, space, kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast); CGImageRef toCGImage = CGBitmapContextCreateImage(ctx);
UIImage * uiimage = [[UIImage alloc] initWithCGImage:toCGImage]; CGImageRelease(toCGImage);
CGColorSpaceRelease(space);
CGContextRelease(ctx);
free(pixels);
UIImageView *imageView = [[UIImageView alloc] initWithImage:uiimage];
[self.view addSubview:imageView];
Для заполнения массива чем-то конкретным Есть формат пикселя, который определяется параметром kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast. Это значит RGBA, то есть каждый пиксель состоит из 4-х байтов, последовательно - красный (Red), зелёный (Green), синий (Blue), альфа (прозрачность). То есть, для установки конкретного массива пикселей, нужно забивать массив последовательностью из 4-х байт, последний из которых - 255 (то есть без прозрачности).
Например: for (int i = 0; i < width * height; i++)
{
pixels[i * 4] = 100; //баланс красного
pixels[i * 4 + 1] = 200; //баланс зеленого
pixels[i * 4 + 2] = 50; //баланс синего
pixels[i * 4 +3] = 255; //прозрачности
}
Есть программа, которая принимает данные из COM порта. Возникла проблема, как заставить программу ждать данные и не выполняться дальше? При использовании бесконечного цикла while, программа нагружает ЦП до 50%. forchar = 0
idcom = [] ser = serial.Serial(
port = 'COM2',\
baudrate=2400,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=0) print("connected to: " + ser.portstr)
count=1 while True:
for line in ser.readline():
forchar = forchar + 1
idcom.append(line)
if forchar >= 13:
break
Ответ
У вас порт настроен на неблокирующее чтение, так как установлен timeout=0, Либо уберите эту опцию, либо напишите timeout=None, тогда порт у вас будет ждать данные, до тех пор пока они не появятся. Если же вам все таки нужно неблокирующее соединение, то в цикл while надо добавить небольшую задержку time.sleep, тогда нагрузка процессора уйдет.
Как я знаю, все приложения андроид запускаются на виртуальной машине, подобной jvm, но более оптимизированной. Можно ли как-нибуть, пользуясь кросс-компайлингом, собрать программу, которая будет работать в графическом режиме? Именно программу для ядра linux? Я знаю, что меня назовут самоубийцей, но кого не затруднит, ответьте!
Ответ
К сожалению андройд не даёт никаких возможностей запуска пользовательских приложений совсем без использования jvm. Но из Java кода можно передать управление нативному, который может например напрямую работать с графикой, так например делают большинство графических движков. Но данные с сенсеров всёравно придется получать через прослойку Java кода... PS а с чего вы взяли что ART или dalvik более оптимизированные? Это вопрос довольно спорный и по большей части скорее всего не в пользу гугловских JVM
Я решил реализовать кнопку "Определения местоположения" со всеми состояниями, как в Google maps. Подробнее:
Неактивная - Когда пользователь шастает по карте.
Активная - Когда пользователь определил свое местоположение на карте, и камера следует за ее перемещением.
Теперь к коду: Кнопка определения местоположения: FAB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cameraFromPosition();
followUser = true;
FAB.setColorFilter(ContextCompat.getColor(getApplicationContext(),R.color.primary)); // синий цвет т.е. активная
}
});
Слежка за местоположением: @Override
public void onLocationChanged(Location location) {
if (followUser) { // начинаем слежку т.к. нажата кнопка "определения местоположения" и цвет ей синий
cameraFromPosition();
}
}
Как лучше реализовать метод "Отлова, когда пользователь опять начал шастать по карте, и тем самым кнопку сделать неактивной т.е. серой"?
Ответ
Откопал я таки официальную серию новых методов от Google [Doc], которые отлавливают скролл по карте и не только. P.S. all inclusive. Для решения моей задачи хватило только следующее:
implements GoogleMap.OnCameraMoveStartedListener
В методе public void onMapReady(GoogleMap googleMap)
добавитьmap.setOnCameraMoveStartedListener(this);
И последнее: @Override
public void onCameraMoveStarted(int reason) {
if (reason == GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE) {
followUser = false;
FAB.setColorFilter(ContextCompat.getColor(getApplicationContext(),R.color.grey));
}
}
P.S. Готовый Callback от Google в подарок.
Доброго дня! При использовании DevExpress для WinForms есть возможность менять внешний вид приложения посредством LookAndFeel, но при этом все системные диалоги, например, OpenFileDialog остаются неизменными (не стилизованными). Очень интересно, имеется ли возможность средствами самой библиотеки DevExpress привести внешний вид диалогов в соответствие с внешним видом самого приложения? Если да, то как это сделать? Грубо говоря, если у приложения используется тёмный скин, то и унифицированный вид диалога тоже должен быть тёмным.
Ответ
К сожалению, нет решения "из коробки". Ждем уже 11 лет: DevExpress Support Center
Здравствуйте. Недавно начал изучать Twig, и совсем не понимаю как работать с дочерними шаблонами (лайаутами). Как мне отправлять данные в дочерний лайаут, чтобы после вывода основного лайаута, дочерние отображались с переданными данными. Или тут надо все лайауты с данными строить по кусочкам а потом собирать? Ну вот как тут, к примеру, передать массив menu лайауту menu.twig index.php/*...CODE...*/
Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem($twig_filesystem);
$twig = new Twig_Environment($loader, array(
'cache' => TWIG_CACHE,
'debug' => TWIG_DEBUG));
$twig->display('main.twig', array());
/*...CODE...*/ main.twig /*...CODE...*/
{% include "header.twig" %}
/*...CODE...*/ header.twig /*...CODE...*/
{% include "menu.twig" %}
/*...CODE...*/ menu.twig /*...CODE...*/
{% for link in menu %}
{% endfor %}
/*...CODE...*/
Помогите, пожалуйста. Заранее спасибо! UPD: хотя бы ссылок дайте, пожалуйста)
Ответ
Как то сложно вы страницу строите. Посмотрите раздел Extends http://twig.sensiolabs.org/doc/tags/extends.html
Проще создать один главный (или пару) шаблон, наследоваться от него и создавать похожие шаблоны переопределяя блоки. А про переменные в include смотрите http://x-twig.ru/tags/include/ они передаются {% include 'template.html' with {'foo': 'bar'} %}
Т.е. передаете в основной шаблон переменные, в основном шаблоне указываете какие переменные передать дочернему при include
На данный вопрос уже ответили:
Python 3. Проверка на целое число—условие на проверку данных, введенных пользователем
5 ответов
Есть код для ввода числа number = str(input('print even number '))
if int(number) in lst():
return True
список состоит из чисел,
нужно сделать обработку ошибки если type(number) != int
но при таком условии все равно выдает ошибку ввода.
Как решить?
Ответ
Обернуть в try/except для обработки исключения: number = input('print even number ') try:
if int(number) in lst():
return True except ValueError:
print("Введено неправильное число")
Уважаемые программисты javascript!
Меня мучает один вопрос - как отследить события на чужом сайте с помощью javascript?
Буду благодарен, если поможете с ответом.
Вводные данные: есть чужой (то есть я не могу писать код на нем) одностраничный сайт с динамическим контентом.
Вопрос: можно ли, и если да, то каким образом, отследить изменение контента на этом сайте с помощью javascript?
Например, есть div'ы, в которых динамически появляется интересующая меня информация, и если в div'е обнаруживается мною заданное ключевое слово, то мне на рабочем столе выводится уведомление.
Сам функционал по выводу сообщения и обнаружению ключевого слова я сделаю. Мне лишь непонятно, как организовать отлов изменения контента на сайте. Ведь я не могу писать код на сайте.
Ответ
Всегда можно добавить клинетский код на страницу сайта при помощи расширения для браузера, но также можно просто вписать код в консоль браузера.
(Chrome: Ctrl+Shift+J or F12) В этом примере мы будем следить за изменениями в
прямо на этой странице.
Для этого скопируем этот код в консоль браузера. // select the target node
var target = document.getElementById('question-header'); // create an observer instance
var observer = new MutationObserver(function(mutations) {
Notification.requestPermission(function (permission) {
if (permission === "granted") {
var notification = new Notification("Something has changed!");
}
});
mutations.forEach(function(mutation) {
console.log(mutation.type);
});
}); // configuration of the observer:
var config = { attributes: true, childList: true, characterData: true }; // pass in the target node, as well as the observer options
observer.observe(target, config);
Затем, чтобы проверить, что всё работает давайте добавим элемент, прописав этот код опять же в консоль браузера. var node = document.createElement("b");
var textnode = document.createTextNode("Hello new item");
node.appendChild(textnode);
document.getElementById("question-header").appendChild(node);
По изменению каких системных файлов можно определить наверняка, что вот прямо сейчас поступила команда reboot (shutdown -r) и начинается перезагрузка?
Ответ
Решение я тогда нашел: в бесконечном цикле читать /proc/$PID/cmdline/ (все процессы) на наличие команд типа shutdown, reboot, init 0, init 6, etc. Причем отлавливало в 99% случаев.
Но это настолько дико выжирало процессор, что для меня такое решение оказалось неприемлемым. А при добавлении слипов отлавливать не успевало Но мало ли кому пригодится
Сделал регистрацию на сайте asp.net MVC 5, с использованием EF. При добавлении строки в таблицу, поле с кириллицей записывается как "?????". Столбец типа NVARCHAR(100), так что проблема не в БД. На HTML-странице использую UTF-8 кодировку, как и файл этого контроллера и самой страницы. Выводит из БД русский текст тоже без проблем. Может, проблема в самом сервере? Или что-то добавить в Web.config?
Пробовал добавлять в connectionStrings параметр charset=utf8 в разные места, ловил исключения:
The underlying provider failed on ConnectionString.
Keyword not supported: 'charset'.
Установлена английская Visual Studio Enterprise 2015 (v.14.0.25420.01 Update 3). В настройках проекта: Neutral Language: Russian (Russia)
Код страницы: @model HotelSystem.hs_users @{
Layout = null;
}
} @Scripts.Render("~/bundles/bootstrap")
Код контроллера: using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc; namespace HotelSystem.Controllers
{
public class userController : Controller
{
HotelSystemDatabaseEntities1 db = new HotelSystemDatabaseEntities1(); ... public ActionResult register()
{
return View();
} [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult register(hs_users U)
{
if (ModelState.IsValid)
{
U.role = 1;
U.time = DateTime.Now;
db.hs_users.Add(U);
db.SaveChanges();
ModelState.Clear();
U = null;
return RedirectToAction("index", "home");
}
return View(U);
} [HttpPost]
public JsonResult doesUserNameExist(string username)
{
int user = 0;
try
{
user = db.hs_users.Count(u => u.username == username);
}
catch { } if (user == 0)
{
return Json(true);
}
else
{
return Json(false);
}
} [HttpPost]
public JsonResult doesEmailAddressExist(string email)
{
int user = 0;
try
{
user = db.hs_users.Count(u => u.email == email);
}
catch { } if (user == 0)
{
return Json(true);
}
else
{
return Json(false);
}
}
}
}
Код модели: namespace HotelSystem
{
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc; public partial class hs_users
{
public long ID { get; set; } [Required(ErrorMessage = "Заполните поле")]
[Remote("doesUserNameExist", "user", HttpMethod = "POST", ErrorMessage = "Такой логин уже зарегистрирован")]
[RegularExpression(@"^(?!.*\.\.)(?!.*\.$)[^\W][\w.]{2,49}$", ErrorMessage = "Некорректный логин")]
public string username { get; set; } [Required(ErrorMessage = "Заполните поле")]
[StringLength(50, ErrorMessage = "Пароль должен быть от {2} до {1} символов", MinimumLength = 6)]
[DataType(DataType.Password)]
public string password { get; set; } [Required(ErrorMessage = "Заполните поле")]
[System.Web.Mvc.Compare("password", ErrorMessage = "Введенные пароли не совпадают")]
[DataType(DataType.Password)]
public string confirmPassword { get; set; } [Required(ErrorMessage = "Заполните поле")]
public string fullname { get; set; } [Required(ErrorMessage = "Заполните поле")]
[Remote("doesEmailAddressExist", "user", HttpMethod = "POST", ErrorMessage = "Такой Email уже зарегистрирован")]
[EmailAddress(ErrorMessage = "Введите корректный Email")]
public string email { get; set; } public System.DateTime time { get; set; } public int role { get; set; }
}
}
Connection string из файла Web.config
Ответ
EF кэширует модель базы в момент рефреша. У вас в Model1.edmx/edmx:StorageModels написано следующее: И это заставляет EF криво мапить данные. Рефреш модели на основе базы решает проблему.
С сайта безопасныедороги.рф необходимо из открытых данных в виде JSON вытащить информацию о геолокациях каждого дтп: em_place_latitude и em_place_longitude. Сам файл весит 1Гб и просто когда подключаешь файл - то выскакивает ошибка
GC overhead limit exceeded
Я работал с библиотекой simple-json в Eclipse Так как я только начал знакомство с JSON, то вообще не понимаю как вытаскивать оттуда информацию, тем более из огромного файла. Спасибо!
Ответ
На самом деле всё достаточно просто, если не загружать всё содержимое документа в память. Нужно, в принципе, помнить два основных подхода в разборе документов различных форматов: читается всё с помощью потока (InputStream/Reader или их аналоги) и решается как будет обрабатываться его содержимое: или собиранием всего в память (аналог XML DOM, когда документ, будучи полностью в памяти, позволяет с лёгкостью обходить его дерево), или же работать согласно событийной модели (аналог XML SAX или его pull-аналоги, когда парсер сообщает о том, какие токены встречаются в документе, а пользователь уже сам решает что и как с ними делать). Очевидно, что первый вариант проще в использовании, но требует куда больше ресурсов, в то время как второй вариант сложнее, но и более гибок, зачастую требуя вообще минимум ресурсов. Gson позволяет работать с JSON-потоками с помощью pull-метода: это когда парсер не генерирует события, а предполагает, что пользователь сам знает, что и в каком порядке нужно "тянуть" с потока токенов, но и требуя чтобы каждый токен был обработан хоть как-то. Например: private static final String ITEMS_NAME = "items";
// em_place_latitude не описан в схеме и не встречается в документе
private static final String LATITUDE_PROPERTY = "latitude";
// em_place_longitude не описан в схеме и не встречается в документе
private static final String LONGITUDE_PROPERTY = "longitude"; static void parseCrashCoordinates(final JsonReader jsonReader, final ICoordinatesListener listener)
throws IOException {
// Считываем { как начало объекта.
// Если его не считать или считать неверно, выбросится исключение -- это и есть суть pull-метода.
jsonReader.beginObject();
// Смотрим имя следующего свойства объекта и сравниваем его с ожидаемым.
final String itemsName = jsonReader.nextName();
if ( !itemsName.equals(ITEMS_NAME) ) {
// Не items? Возможно, у нас нет идей как его обработать -- лучше выбросить исключение.
throw new MalformedJsonException(ITEMS_NAME + " expected but was " + itemsName);
}
// Так же теперь вычитываем [
jsonReader.beginArray();
// И читаем каждый элемент массива
while ( jsonReader.hasNext() ) {
// Судя по схеме, каждый элемент массива - объект
jsonReader.beginObject();
double latitude = 0;
double longitude = 0;
// И так же пробегаемся по всех свойствах этого объекта
while ( jsonReader.hasNext() ) {
// Теперь просто смотрим, являются ли они нам известными
final String property = jsonReader.nextName();
switch ( property ) {
// latitude? Запоминаем.
case LATITUDE_PROPERTY:
latitude = jsonReader.nextDouble();
break;
// longitude? Запоминаем.
case LONGITUDE_PROPERTY:
longitude = jsonReader.nextDouble();
break;
// Иначе просто пропускаем любое значение свойства.
default:
jsonReader.skipValue();
break;
}
}
// Просто делегируем полученные координаты в обработчик
listener.onCoordinates(latitude, longitude);
// И говорим, что с текущим элементом массива, именно объектом, покончено.
jsonReader.endObject();
}
// Также закрываем последние ] и }
jsonReader.endArray();
jsonReader.endObject();
}
Как выглядит обработчик: interface ICoordinatesListener { void onCoordinates(double latitude, double longitude); }
В принципе, возможны ситуации, когда в документе в координатах указана или широта или долгота, или оба значения отсутствуют (и, в принципе, обработка таких случаев является хорошим тоном), но при обработке 148817911056482-crash.json мне такие случаи не встречались. Теперь протестируем всё это дело. public static void main(final String... args)
throws IOException {
testOutput();
testCollecting();
} // Этот тест просто выводит содержимое координат в стандартный поток вывода
// Заметьте: parseCrashCoordinates() сам не решает _что_ делать с координатами -- это целиком наше дело
// Поскольку мы вообще просто передаём данные дальше, нас вообще не волнует размер входных данных
// Теоретически, это может быть бесконечный поток данных -- круто ведь?
private static void testOutput()
throws IOException {
readAndParse((lat, lng) -> System.out.println("(" + lat + "; " + lng + ")"));
} // Здесь мы, напротив, собираем координаты в список.
// Выдержит ли JVM увеличение списка coordinates? Возможно, но не факт: зависит от размера данных и памяти, доступной JVM.
private static void testCollecting()
throws IOException {
final List coordinates = new ArrayList<>();
readAndParse((lat, lng) -> coordinates.add(new Coordinate(lat, lng)));
System.out.println(coordinates.size());
} private static final class Coordinate { private final double latitude;
private final double longitude; private Coordinate(final double latitude, final double longitude) {
this.latitude = latitude;
this.longitude = longitude;
} } private static void readAndParse(final ICoordinatesListener listener)
throws IOException {
try ( final JsonReader jsonReader = new JsonReader(new BufferedReader(new InputStreamReader(new FileInputStream(...)))) ) {
parseCrashCoordinates(jsonReader, listener);
}
}
Этим примером мне удалось разобрать 148817911056482-crash.json размером 746 МБ, не особо тратясь на вычислительные ресурсы (громко сказано, тем не менее :)). Хвост вывода таков:
(55.632584; 37.80792)
(51.5703; 135.8539)
(51.9139; 39.2233)
99497
(3 последние координаты и размер списка, в который были собраны все координаты).
Я тут сутки не спал, поэтому помогите мне подумать. Есть плеер Vine. У него есть апи https://dev.twitter.com/web/vine/oembed .
Можете сразу посмотреть все заголовки ответа тут https://vine.co/oembed.json?id=5xJVBXAunrD Мне нужно с клиента получить данные
отправляю запрос
$.ajax({
url: 'https://vine.co/oembed.json?id=5xJVBXAunrD',
dataType: "jsonp",
contentType: "application/json",
success: () => {
console.log(arguments)
},
})
Получаю по лицу:
Refused to execute script from
'https://vine.co/oembed.json?id=5xJVBXAunrD&callback=jQuery211011806981946079831_1482419611704&_=1482419611705'
because its MIME type ('application/json') is not executable, and
strict MIME type checking is enabled.
В общем, как я понял, из-за того самого строго соответствия мне нужно все это "Добро" проксировать?
Ответ
Ошибка происходит из-за того, что сервис отдает json, а dataType = jsonp. Если бы сервис разрешал обращаться к себе с различных сайтов достаточно было бы просто заменить dataType на json. Но в данном случае сервис не разрешает и браузер выдаст ошибку
No 'Access-Control-Allow-Origin' header is present on the requested resource.
В качестве решение можно либо делать запрос к своему серверу, и уже с него делать серверными средствами запрос, либо воспользоваться одним из сервисов, например: https://cors-anywhere.herokuapp.com/ Пример:
$.ajax({
url: 'https://cors-anywhere.herokuapp.com/https://vine.co/oembed.json?id=5xJVBXAunrD',
dataType: "json",
contentType: "application/json",
success: data => {
console.log(data)
},
});
.as-console-wrapper {
top: 0;
max-height: 100% !important;
}
Известно, что есть класс java.util.Collections в котором есть методы вида unmodifiable* возвращающие неизменяемые коллекции. Теперь вопрос, как определить, что коллекция является неизменяемой?
Ответ
Какое-либо универсальное хорошее решение Вы вряд ли найдете. На мой взгляд, самое некостыльное из костылей – .getClass().isInstance(...) List list = new ArrayList<>();
List unmodifiableList = Collections.unmodifiableList(list);
boolean isUnmodifiable = Collections.unmodifiableList(list).getClass().isInstance(unmodifiableList);
Еще варианты:
Ловить UnsupportedOperationException при добавлении элемента. Но тогда, в случае изменяемой коллекции, после теста элемент нужно удалить.
.getClass().getSimpleName().equals(...)
Добрый день! Написал (точнее скопипастил) такой сервер: from http.server import HTTPServer, CGIHTTPRequestHandler
import time server_address = ('192.168.0.198', 800)
httpd = HTTPServer(server_address, CGIHTTPRequestHandler)
begin_time = time.asctime()
print('Server started on', begin_time)
print('Server is running on address', server_address[0], 'on port', server_address[1])
httpd.serve_forever()
Он принимает данные (GET-запрос) с платы ESP8266. Эти данные в консоли отображаются, но вот нормально их обработать не могу (хочу выводить на отдельной странице). Что посоветуете? UPD. С точки зрения пользователя должно быть так: зашел на 192.168.0.198:800/... и увидел окошко со значением температуры (её я и получаю get-запросом). На этом же адресе запущен сервер.
Ответ
микроконтроллер с датчиком температуры отправляет показания методом get
Чтобы создать http-сервер, который записывает температуру, полученную в GET запросе от микроконтроллера, и показывает её позже в последующих запросах, можно использовать bottle библиотеку #!/usr/bin/env python
from bottle import route, request, run, template # $ pip install bottle temperature = None @route('/')
def index():
global temperature
temperature = request.query.temperature or temperature
return template('Temperature: {{temperature}}',
temperature=temperature) run(host='localhost', port=8000)
При запуске этого Питон-скрипта, запускается http-cервер, который слушает на локальной машине на 8000 порту. При получении GET-запроса, содержащего temperature параметр, глобальная переменная temperature обновляется и тут же показывается как html. Если temperature параметр не указан, то возвращается предыдущее значение или None, если ещё ни разу не был temperature параметр задан. То есть ожидается, что часть читающая температуру с датчика выполняет запросы типа: $ http ':8000?temperature=20'
что устанавливает значение (20). Чтобы прочитать это значение, достаточно не указывать параметр: $ http :8000
Можно в браузере посмотреть (тот же запрос): $ python -mwebbrowser http://localhost:8000
http команду можно получить, установив httpie библиотеку $ pip install httpie
Обычно вместо использования глобальных переменных используется база данных (что позволяет сохранять значение температуры между запусками серверного процесса или его экземплярами в разных процессах). В простейшем случае, простой плоский текстовый файл может использован. Вот пример c sqlite Если не хочется ставить bottle с помощью команды (предпочтительно внутри virtualenv): $ pip install bottle
то достаточно скачать bottle.py и положить его рядом с кодом сервера.