Страницы

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

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

Отправка header методом POST PHP (замена xhr.setRequestHeader) [закрыт]

Можно ли как то перевести это в PHP, если да то подскажите пожалуйста как?
function request(func, params, onSuccess) { var xhr = new XMLHttpRequest(); xhr.open('POST', 'http://FF2:7000/$gate/request', true); xhr.setRequestHeader("pro-verba-esb-queue", "IM"); xhr.setRequestHeader("x-function", encodeURI(func)); xhr.onreadystatechange = function() { if (this.readyState != 4) return; if (this.status != 200) { alert( 'ошибка: ' + (this.status ? this.statusText : 'запрос не удался') ); return; } onSuccess(this.responseText); } xhr.send(JSON.stringify(params)); }


Ответ

Воспользуйтесь curl
$url = 'http://FF2:7000/$gate/request';
$headers = array( 'pro-verba-esb-queue: IM', 'x-function: '+encodeURI(func) );
$ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, count($params)); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

Запустить java файл с кастомной версией java

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


Ответ

Да, разумеется можете. Допустим, вы запускаете файл с помощью системной java так:
java -jar myapp.jar
тогда если скачав другую версию, например в директорию /home/user/downloads/jdk/ вы можете запускать свой файл так:
/home/user/downloads/jdk/bin/java -jar myapp.jar

Как разбить строку на слова, чтобы в словах остались только буквенные и цифровые символы?

К примеру есть вот такая строка: String text = "The urn was then carried for several rounds around the cremation site, for the last leg of the procession."
Мне надо разбить её на слова, удалив при этом все знаки препинания и спецсимволы, а слова поместить в список.
ArrayList words = new ArrayList<>(); String word = text.replaceAll(",", " "); - тут, насколько я понимаю, надо делать регулярное выражение ? Или можно без него удалить знаки препинания и спецсимволы ?


Ответ

Можно разбить строку с помощью регулярного выражения.
String text = "The urn was then carried for several rounds around the cremation site, for the last leg of the procession."; String[] results = text.split("\\W+"); System.out.println(Arrays.toString(results)); // [The, urn, was, then, carried, for, several, rounds, around, the, cremation, site, for, the, last, leg, of, the, procession]
Чтобы \\W+ "понимал" Юникод, добавьте (?U) перед регулярным выражением (чтобы не удалялись русские и другие буквы), "(?U)\\W+"
Обратите внимание, что \\W+ не найдёт знака подчёркивания _ и если его надо найти, используйте "[\\W_]+"
См. демо онлайн
Можно найти все буквы Юникода (\p{L}) и ASCII-цифры ([0-9]) с помощью
String text = "The urn was then carried for several rounds around the cremation site, for the last leg of the procession. И ещё..."; Pattern pattern = Pattern.compile("[\\p{L}0-9]+"); Matcher matcher = pattern.matcher(text); List result = new ArrayList<>(); while (matcher.find()){ result.add(matcher.group(0)); } System.out.println(result); // [The, urn, was, then, carried, for, several, rounds, around, the, cremation, site, for, the, last, leg, of, the, procession, И, ещё]
Ещё одно Java-демо

вопросы по поводу работы с жесткими дисками в linux

Здравствуйте, читаю "Системное программирование" Роберта Лава, он пишет про fsync(), O_SYNC, но не понятно о назначении этих функций...
Где необходимы вызовы этих функций? Если б это было нужно всегда, то синхронизация бы была по дефолту установлена. Цитата из книжки.
Налицо огромное увеличение издержек, поэтому синхронизированный ввод-вывод следует использовать только при отсутствии альтернатив. Со сколькими параллельными операциями ввода / вывода может работать жесткий диск? Ну т.е. хочу я в 1000 нитях параллельно читать или писать в разные файлы на диске, будет ли толк, или начнет всё тормозить (имеется ввиду не из-за переключения контекста, а из-за каких-то причин с самим диском)?


Ответ

fsync и его подвиды требуются, когда приложение хочет получить гарантию, что данные уже записаны на физический диск, а не будут записаны на диск.
Впрочем, начну лучше со второго вопроса:
со сколькими параллельными операциями ввода/вывода может работать жесткий диск?
С одной. Потому что внутри HDD только один блок головок чтения-записи. И из-за ограничений физических законов нашей вселенной этот блок может одновременно находиться только над одним местом магнитного диска.
И следующее механическое ограничение - магнитные диски вращаются с постоянной скоростью, а читать-писать можно только в одном месте. Значит если мы хотим прочитать сектора в разных местах диска нам требуется:
спозиционировать на эту дорожку блок головок чтения-записи дождаться, пока требуемый сектор не окажется под головкой
Простым математическим подсчётом получаем механический предел в 120 операций в секунду для 7200 rpm дисков (с частотой вращения 7200 оборотов в минуту). Будет меньше операций если надо читать с разных областей диска, т.к. перемещение магнитной головки штука медленная мало того из-за того что механическая операция но должна осуществляться точно (речь о микрометрах), так ещё и в условиях вибрации от собственно самого диска и всех прочих вибраций. Как итог вполне можно попасть не на ту дорожку и придётся перепозиционировать головки ещё раз.
Но зато можно успеть прочитать больше данных, если они идут последовательно в секторах одной дорожки.
В общем, механический диск - штука крайне медлительная и прогресс CPU и оперативной памяти (не имеющих механический частей и потому значительно более быстрых) в прошлом тысячелетии потребовали вводить всевозможные ухищрения. В частности, операционные системы начали кешировать операции чтения и записи данных в неиспользуемых в данный момент выполняющимися программами областях оперативной памяти. И если с чтением всё просто - точно такая же копия лежит в энергонезависимой памяти механических дисков - то с кешированием записи как-то печальнее. Операционная система отвечает приложению "данные записаны", а на самом деле они размещены в оперативной памяти и будут записаны когда-нибудь чуть позже, может через несколько секунд. И это замечательно работает и ускоряет все операции с дисков. Вот только при критическом сбое системы (например по питанию) данные будут потеряны.
И чтобы дать приложениям возможность попросить систему именно записать какие-то данные в энергонезависимую память и добавили вызов fsync, который синхронизирует кэш записи с дисками.

Повторюсь - для механических дисков позиционировать головки операция очень медленная. Поэтому если вы начнёте читать-писать с механическим диском с 1000 потоков - это будет бесконечно долго. При том, ситуацию для вас всеми своими силами постараются сгладить и планировщики ввода-вывода и кэширование файловых операций. Из-за позиционирования головки механические диски могут давать неплохую производительность на последовательных операциях, но производительность случайных операций у механики удручающая.
Но, к счастью, за последние лет 10 сильно подешевела flash-память и появились SSD диски. Дисками их называют только по привычке, на самом деле никакой механики там уже нет. И параллельная обработка запросов (пусть и за счёт обращений к разным кристаллам памяти) и куда более внушительная производительность по метрике количества операций в секунду (iops) - всё возможно. И, вероятно, со временем будут пересмотрены в сторону упрощения и планировщики ввода-вывода (собственно blk_mq в ядре linux уже) и упрощены другие нагромождения этих десятилетий когда для хранения данных использовалась медлительная механика. У flash-памяти своих интересных фокусов тоже хватает (например, есть не 2 операции чтение и запись, а чтение, стирание, запись - запись возможна только в предварительно очищенную страницу. Отсюда выросла необходимость в команде trim) - но это уже тема отдельных изысканий.

Упрощение sql запроса с подзапросами. Oracle

Здравствуйте. Нужно упростить запрос но пока что не как не могу понять как это сделать. Идея в том что бы все вложенные селекты переписать в джоины. ПОдскажит пожалуйста как это сделать. Вот мой запрос.
select weight from myTableData where port = (select port from myTableDict where Name = 'название') and date = ( select max(date) from myTableData where port = (select port from myTableDict where Name = 'название'));
Это пример моего запроса. Надеюсь всё расписал достаточно понятно. Если нет то пишите объясню. Нужно сделать вместо селектов вложенных, джоины не могу пока что понять как именно это сделать.
План запроса:
udp_port это port, w это myTableData, s это myTableDict. Собстенно в таблице WEIGHER_DATA, 31 милион записей с небольшим. На ней есть 2 индекса. На поле upd_port и на поле insert_date которое я подписал в примере как date. Стоимость запроса почти под 56 тысяч как по мне многовато. С этой информацией можно как то упростить и понизить стоимость запроса?


Ответ

select max(weight) keep (dense_rank last order by M.port,M.date) from myTableData M, myTableDict D where D.Name='название' and M.port=D.port
Конструкция KEEP дает значение поля weight для последней (dense_rank last) записи в порядке сортировки по дате. т.е. значение на максимальную дату. JOIN сокращен до запятой и параметры из ON перенесены в where.

Переопределение имени глобальной переменной

Почему оно работает? Слышал об предварительном объявлении, но это явно другой случай. Или в чистом виде UB?
Сам код на IdeOne
#include using namespace std; const int x = 5;
int main(){ int x[x]; cout << "OK!" << endl; return 0; }


Ответ

Нет, это не UB. Согласно стандарту, раздел 6.3.2, клауза 2 упоминает в точности ваш пример:
const int i = 2; { int i[i]; }
В нём определяется массив из двух целых чисел внутри блока.

Полная цитата из стандарта (перевод мой):
Точка декларации имени находится непосредственно за её полным декларатором (...) и перед инициализатором (если он есть), за исключением замечаний ниже. [ Пример:
unsigned char x = 12; { unsigned char x = x; }
Здесь второй x инициализируется своим собственным (неопределённым) значением. — конец примера ] [ Замечание: Имя из внешней области действует вплоть до точки декларации имени, которое его перекрывает. [ Пример:
const int i = 2; { int i[i]; }
определяет внутриблоковый массив из двух целых. — конец примера ] — конец замечания ]

Button не отжимается после выполнения Command

Иногда кнопка после выполнения команды не становится активной. Помогает клик по форме. Скажете пожалуйста в чем может быть проблема?

XAML: