Страницы

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

понедельник, 22 апреля 2019 г.

C++ Qt - неразрешенный внешний символ

Сразу хочу сказать, что это я читал: Ссылка на неразрешенный внешний символ (возможные причины) Однако проблемы с классами Qt(который, по идее, свои библиотеки линкует автоматически)
Несколько ошибок:
testclass.obj:-1: ошибка: LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: __cdecl QTcpSocket::QTcpSocket(class QObject *)" (__imp_??0QTcpSocket@@QEAA@PEAVQObject@@@Z) в функции "public: __cdecl TestClass::TestClass(class QString)" (??TestClass@@QEAA@VQString@@@Z) testclass.obj:-1: ошибка: LNK2019: ссылка на неразрешенный внешний символ "__declspec(dllimport) public: virtual __cdecl QTcpSocket::~QTcpSocket(void)" (__imp_??1QTcpSocket@@UEAA@XZ) в функции "public: virtual void * __cdecl QTcpSocket::`scalar deleting destructor'(unsigned int)" (??_GQTcpSocket@@UEAAPEAXI@Z) testclass.obj:-1: ошибка: LNK2001: неразрешенный внешний символ ""public: virtual bool __cdecl QAbstractSocket::atEnd(void)const " (?atEnd@QAbstractSocket@@UEBA_NXZ)"
И прочие ошибки в том же стиле. Кто может сказать, что не так с include-ами?
#include #include #include #include #include "testclass.h"
Пробовал подключать еще QAbstactSocket, не особо помогло (к слову он напрямую в коде не используется)


Ответ

Подключение библиотеки в C++ делается в два этапа:
для компилятора - пишется нужный #include для компоновщика - дописывается соответствующий параметр командной строки
В Qt за параметры командной строки отвечает система сборки. Ей управляет файл проекта с расширением pro. В нем есть директива QT= core gui [...]. Чтобы стали доступны сетевые функции, туда нужно дописать network
Чтобы библиотека вошла в состав exe, нужно компоновать проект с Qt статически. Для этого требуется:
соблюсти условия LGPL (опубликовать объектные файлы) собрать Qt статически, что является нетривиальной задачей.
Для Windows
Чтобы подготовить комплект dll для выпуска exe, существует утилита windeployqt, входящая в состав Qt. Статья о ней
Для Linux
Все зависит от целевого дистрибутива. В общих чертах, вы распространяете только ваш бинарник, а в пакете указываете зависимости от нужных библиотек. Остальное решает система управления зависимостями дистрибутива.
Для Mac
Аналогично Windows, только утилита называется macdeployqt
Еще одна статься о подготовке к релизу

Вывести картинку на весь экран Unity 5

Необходимо вывести (по команде в скрипте) картинку на весь экран. Перекрывающую всё. Из задумок - только создать вторую камеру, поставить ей картинку как фон, в нужный момент - переключить на нее. Можно ли это сделать как нибудь проще?


Ответ

Да проще варианта особо и нет. Куда может быть проще включить (SetActive(true)) или отключить (SetActive(false)) что-то в нужный момент? Одна команда на одно действие и одна команда - на другое.
Единственное, чтоб не таскать лишнюю камеру и т.к. наверняка используете UI, то можно сразу этим самым UI и воспользоваться. Т.е.
Добавляем к Canvas (т.е.к UI) пустой объект. Называем его Overlay и говорим его ширине и высоте занимать весь экран:
У этого объекта добавляем потомка UI -> Image (Image принимает себе не простую картинку, а sprite. Это значит нужно картинку сделать типом спрайт. Если хотите чистую картинку, можете вместо Image выбрать RawImage). Обзываем потока например OverlayBackground.

которому можно назначить картинку или просто в монотонный цвет закрасить или сделать прозрачность.

И в итоге конкретно с этим Overlay делаем что хотим: скрываем, показываем, назначем бэкграунды для OverlayBackground, добавляем еще какие-нибудь объекты, например отображение результата игры или меню или кнопки выхода и прочее.
Ну и конечно включаем или выключаем в нужный момент.

Примерная иерархия:

Как создать резервную копию всего сервера ubuntu 9 с помощью Live CD?

Имеется сервер с ubuntu 9 без графической оболочки, логина и пароля к нему нет, надо сделать полную резервную копию сервера использую Live CD. Как это сделать? Можно ли подключить HDD сервера к компьютеру с Ubuntu с графической оболочкой и сделать ctrl+c ctrl+v?


Ответ

Для начала надо ответ дать на вопрос - с какой целью снимается дамп (копия) сервера?
Например, дамп может быть нужен для целей восстановления данных или криминалистики
Самый простой, но не обязательно правильный путь - подключить второй накопитель и использовать утилиту dd. В качестве аргумента if указываете исходный накопитель, а в качестве of - или файл, или накопитель-назначение (объемом не меньше изначального). Пример команды: dd if=/dev/sdb of=usb-image.dsk Чуть менее простой. Качаем Acronis TrueImage в виде загрузочного ISO диска и снимаем им посекторную копию диска. Минусы в том, что если Acronis не знает файловую систему, то образ будет объемом как исходный винчестер. Если знает, то он может свободное место на файловой системе не копировать и образ будет занимать ровно столько места, сколько сами файлы. Сделать пофайловую копию любой из утилит резервного копирования под Linux. Их список можно найти здесь. Самая стандартная из них - rsync. Учитывая, что они делают пофайловый образ, то из него всегда можно вытянуть произвольный файл.

Написание прокси-сервера для чайника

В прошлом вопросе (Вопрос) я выяснил , что для запроса погоды мне нужен прокси сервер, который будет кэшировать данные с погодного сервера. Писать сервер придется мне самому, но до этого ни с чем подобным не сталкивался (серверной частью). Писать решил на python 3. Можете ли ткнуть в литературу или дать ссылки как можно реализовать такой кэширующий сервер, и правильно ли я вообще выбрал python?


Ответ

«По-науке» эта конструкция называется «Обратный прокси» (reverse proxy). У вас есть некоторый backend-сервер, который генерирует какие-то полезные данные, и есть frontend-сервер, который кеширует на себе редкоизменяемые данные. Такая схема чаще используется, для кеширования локальных ресурсов какого-нибудь сайта, чтобы не гонять данные лишний раз, через основной backend-сервер.
В вашем случае backend-сервером будет погодный сервер.
Если, логику формирования запросов клиенты возьмут на себя, то проще будет использовать некий уже готовый и отлаженный web-сервер. В принципе, тут подойдет любой (nginx, lighttpd, apache, Ваш собственный). Чаще всего для таких целей используют nginx. Он весьма шустр и достаточно прост в настройке.
Вот, например, настройки для nginx
http://reviewsignal.com/blog/2013/08/29/reverse-proxy-and-cache-server-with-nginx/
http://ashep.org/2011/nginx-obratnyj-proksi-server/#.V6ECut_XfmE
Официальная документация:
https://www.nginx.com/blog/nginx-caching-guide/
В итоге у вас получится что-то вроде:
events { worker_connections 8096; multi_accept on; use epoll; }
http {
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:60m max_size=1G;
server { listen 80; server_name your-proxy-server-name.com;
location / { proxy_pass http://any-weather-server.com; proxy_redirect off; proxy_set_header Host $host; proxy_cache STATIC; proxy_cache_valid 200 1d; proxy_cache_use_stale error timeout invalid_header updating \ http_500 http_502 http_503 http_504; } } }
Тут надо будет внимательно отнестись к заголовкам, которые ожидает сервер погоды от вас. Вероятно, вам придется немножко поколдовать с
proxy_ignore_headers proxy_hide_headers proxy_set_headers
Подобную проблему обсуждают тут:
https://stackoverflow.com/questions/9230812/nginx-as-cache-proxy-not-caching-anything
Заголовки, вам придется настраивать в любом случае, в том числе и если frontend-сервер будете писать сами.

Если писать самому, я думаю, было бы проще найти некоторое готовое решение, и его переиспользовать. Например, достаточно просто это сделать с помощью tornado. А в качестве кеша использовать наример memcached или redis
https://stackoverflow.com/questions/16524545/how-to-write-a-web-proxy-in-python

Как узнать сумму соседних элементов для каждого элемента из списка

Здравствуйте! Изучаю Python, попалась такая задача:
"Напишите программу, на вход которой подаётся список чисел одной строкой. Программа должна для каждого элемента этого списка вывести сумму двух его соседей. Для элементов списка, являющихся крайними, одним из соседей считается элемент, находящий на противоположном конце этого списка. Например, если на вход подаётся список "1 3 5 6 10", то на выход ожидается список "13 6 9 15 7" (без кавычек).
Если на вход пришло только одно число, надо вывести его же."
В моём варианте пишет, что ошибка в строке 8, мол, не знает числа с таким индексом. Подскажите, пожалуйста, что я делаю не так, в чём ошибка?
a = [int(x) for x in input().split()] b = [] i = 0 if len (a) == 1: print(a) else: for c in a: b.append(int(a[i - 1]) + int(a[i + 1])) i = i + 1 print(b)


Ответ

Да, ошибка в том, что вы обращаетесь к элементу за пределами массива. Можно исправить, явно обозначив границы окна, в котором вы считаете сумму. Так можно обойтись без лишних условий на конец массива или использования кольцевого буфера:
initial_list = [1, 3, 5, 6, 10] sum_list = []
left_index = -1 right_index = -len(initial_list) + 1 middle_index = 0
while middle_index < len(initial_list): print(left_index, right_index) sum_list.append(initial_list[left_index] + initial_list[right_index]) left_index += 1 right_index += 1 middle_index += 1
print(sum_list)
Отрицательный индекс - это индекс "с конца" массива.
Код можно переписать и покороче, опустив объявления границ скользящего окна:
sum_list.append(initial_list[middle_index - 1] + initial_list[middle_index - len(initial_list) + 1])
Следуя по пути сокращения строк и далее, можно все записать в одну строку:
sum_list = [initial_list[index - 1] + initial_list[index - len(initial_list) + 1] for index, element in enumerate(initial_list)] print(sum_list)

Узнать количество символов в массиве BYTE

Узнать количество символов в строке можно так:
TCHAR* someStr = "Hello World!"; size_t sizeStr = strlen(someStr);
Как узнать количество символов в массиве байт, например:
BYTE * someByte = "\xFF\xAA\x55"; size_t sizeByte = strlen((TCHAR*)someByte );
Работает не корректно, особенно при юникоде. Как быть?


Ответ

Для разных типов строк следует использовать разные функции.
С описанием можно ознакомиться в документации на MSDN

Вывод массива слов в строку через запятую JAVA

Как осуществить вывод слов через запятую? Есть вариант создать StringBuilder, записать в него "word_from_array" + ",". И потом удалить лишнюю запятую в конце. Но может есть какой-то красивый способ это сделать?


Ответ

Вы можете воспользоваться String.join
String result = String.join(",", container);
Проверка: http://ideone.com/9fXTJT
Ну или используйте StringJoiner, которым String.join пользуется внутри:
StringJoiner joiner = new StringJoiner(","); for (String s : container) joiner.add(s); String result = joiner.toString();
Проверка: http://ideone.com/myQarW
Если вы пользуетесь Stream API, подойдёт ещё Collectors.joining

MSSQL не понимает кириллицу

Проблема следующая. Создаю базу
create database MyTestDB on primary (name = MyTestDB, filename = 'd:\MyTestDB.mdf', size = 12MB, maxsize = 20MB, filegrowth = 2MB ) LOG ON (name = MyTestDB_Log, filename = 'd:\\MyTestDB_Log.ldf', size = 2MB, maxsize = 12MB, filegrowth = 1MB) COLLATE Latin1_General_CI_AI;
Затем создаю табличку
CREATE TABLE Students( ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Students PRIMARY KEY, Name nvarchar(30) NOT NULL )
Ну и собственно заполняю её (текстовые поля - кириллицой). Как итог, всё то что на кириллице в таком виде ????? Подскажите, в чем может быть проблема ? Где-то с кодировкой накосячил? Да вроде универсальная.


Ответ

Строковые литералы Unicode - nvarchar - нужно задавать с префиксом N:
N'Иванов'
Без префикса строка будет преобразована с использованием кодовой страницы базы, и часть символов скорее всего будет испорчена:
Prefix Unicode character string constants with the letter N. Without the N prefix, the string is converted to the default code page of the database. This default code page may not recognize certain characters.

Как обозначить i+2 элемент массива

Помогите. Есть программа, которая расшифровывает нужный мне шифр по типу: А -- В (толко с инглишем) Г -- Е Буква вводится с клавиатуры и сравнивается с буквой в алфавите (который представлен в массиве) и, если введеная буква совпадает с i- элементом, то в другой (пустой) массив добавляется буква, идущая через 1 от этот i в алфавите, то есть i+2. Но у меня вылетает : Can't convert 'int' object to str implicitly
Как правильно обозначить i+2 элемент?
http://ideone.com/Kcv64C
n = 1 while n: x = (input('х : ')) exp = [] a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] for i in a:
if x == i: ex = i + 2 exp.append(ex) elif x == 'y': exp.append('a') if x == ' ': exp.append(x) elif x == '.': exp.append(x) print(exp)


Ответ

Это называется "шифр Цезаря".
Можно использовать функцию enumerate, чтобы знать текущую позицию в списке.
for i, char in enumerate(a): if x == char: exp.append(a[i + 2])
Чтобы не вываливалось IndexError в конец массива и не приходилось костыли приписывать, можно использовать типичный для таких случаев трюк с оператором %, чтобы индекс не выходил за предел:
for i, char in enumerate(a): if x == char: exp.append(a[(i + 2) % 26])
Если вы хотите проверить является символ буквой, то можно воспользоваться следующим методом, а не писать на каждый символ свое условие:
x.isalpha()
К слову: вам не обязательно пробегать по списку, ведь у букв есть известный порядок. Вы можете узнать номер буквы в таблице юникода с помощью функции ord() - прописные латинские начинаются с 97 позиции (a) и следуют до 122 (z). Затем прибавляем к номеру 2 и узнаем какая буква находится на этой позиции через функцию chr(). Только нужно опять быть аккуратным и не выскочить за границы 97-122, а также корректно обрабатывать заглавные.

В чем разница git push -u origin master и git push?

Ну вот собственно, такой простой вопрос... Создал ветку, внес изменения, добавил файлы в отслеживаемые, закомитил, смержил с веткой master и вот теперь хочу отправить изменения на сервер...
Как это сделать просто
git push
или
git push -u origin master
?


Ответ

Второй вариант явно показывает, куда вы пушите коммит, первый - неявно.
В большинстве случаев достаточно указать первый вариант, в крайнем случае вам появится (git 2.0 - 2.8) нотификация типа:
[ak@server abc]$ git push warning: push.default is unset; its implicit value is changing in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the current behavior after the default changes, use:
git config --global push.default matching
To squelch this message and adopt the new behavior now, use:
git config --global push.default simple
See 'git help config' and search for 'push.default' for further information. (the 'simple' mode was introduced in Git 1.7.11. Use the similar mode 'current' instead of 'simple' if you sometimes use older versions of Git)
Counting objects: 5, done. Delta compression using up to 2 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 367 bytes | 0 bytes/s, done. Total 3 (delta 2), reused 0 (delta 0) To abc@asdf:/asdfasddf.git b41acb4..b8c32bd master -> master
Цитирую
Одним из самых главных изменений является поведение команды git push. Теперь по умолчанию (если не указана ветка) push будет осуществлен только в текущую ветку. Git 1.* по умолчанию делал push во все ветки, которые были изменены локально. Конечно же можно вернуться к прежнему поведению, для этого служит опция push.default.
Это очень популярный вопрос на английском so, там тоже самое написано:
matching означает, что git push отправит все ваши локальные ветки в такие же на удалённом сервере. simple означает, что git push отправит только текущую ветку в такую же на удалённом сервере.
Simple более интуитивный режим, поэтому он является режимом по умолчанию и используется если push.default не установлен.

получить адрес из инструкции “call”

Потихоньку изучаю ассемблер и пытаюсь разобраться в отладке своей программы, поиском уязвимостей и т.д.
Проблема в следующем, при просмотре программы в дизассемблере, есть инструкция по адресу 0x11BC132 , выглядит она так
call test.exe+CBB18
Вот как мне программно получить этот адрес "test.exe+CBB18"? Пробовал так:
DWORD call = *(DWORD*)0x11BC132
Нечего не вышло, думаю здесь нужна асм-вставка, помогите пожалуйста оформить ее, так как в "асм" не силен, по возможности, подскажите как обойтись без асм вставок, так как асм-вставки не работают в х64. Заранее спасибо.


Ответ

Для 32-битного приложения
Команда call имеет опкод E8 + delta (4b), где delta = to - (from + 5)
from - адрес команды call
to - адрес вызываемой функции
const size_t from = 0x11BC132; int delta = *(int*)((unsigned char*)from + 1); // приведение к unsigned char* нужно, если арифметика типа from отличается от стандартной size_t to = from + delta + 5;
Чтобы преобразовать call something в call test.exe + something_else, нужно вычесть из something так называемый image_base. Для типичных 32-битных PE он равняется 0x400000. То есть в Вашем случае адрес функции с большой вероятность равен 0x4CBB18

Для 64-битного приложения
Команда call может иметь аналогичный вид, если delta <= 0xFFFFFFFF, поэтому можно проверять следующим образом:
const size_t from = 0x11BC132; if (*((unsigned char *)from) == 0xE8) { int delta = *(int*)((unsigned char*)from + 1); size_t to = from + delta + 5; }
Крайне сомневаюсь, что delta может превысить 2 гигабайта, поэтому можно использовать этот вариант (даже без if, если уверены, что это call)

Memcache - как сделать продление жизни

Как в memcache сделать продление жизни элемента? Есть идея делать replace с новым значением времени жизни, стоит ли так делать есть ли другой способ? Хотелось бы выслушать чужое мнение.


Ответ

При использовании расширения memcache только replace. В расширении memcached есть метод touch который позволяет выставить новое время хранения.

Правильный вывод степени

Как в окне правильно вывести степени, т.е. не x^2, а чтобы двойка находилась выше?


Ответ

Для начала, вам нужно настроить правильный вывод Unicode. Как это делать, описано в этом вопросе
Имея вывод в Unicode, легко подсмотреть номера юникодных символов, и написать функцию перекодировки. Например, такую:
wchar_t digitToSuperscript(unsigned int digit) { if (digit >= 10) throw std::out_of_range("digit"); switch (digit) { case 1: return 0x00B9; case 2: return 0x00B2; case 3: return 0x00B3; default: return 0x2070 + digit; } }
(Ну или если вам больше нравится, lookup в таблице из 10 элементов.)
Пробуем:
#include "stdafx.h" #include #include #include #include
wchar_t digitToSuperscript(unsigned int digit) { if (digit >= 10) throw std::out_of_range("digit"); switch (digit) { case 1: return 0x00B9; case 2: return 0x00B2; case 3: return 0x00B3; default: return 0x2070 + digit; } }
int wmain(int argc, wchar_t* argv[]) { _setmode(_fileno(stdout), _O_U16TEXT); _setmode(_fileno(stdin), _O_U16TEXT); _setmode(_fileno(stderr), _O_U16TEXT);
std::wcout << L"x"; for (int d = 0; d < 10; d++) std::wcout << digitToSuperscript(d);
return 0; }
Результат:

Есть ли способ закрыть блок при клике на его after?

Давно мучает этот вопрос меня , реализовал для примера вот такую конструкцию :
$(document).ready(function(){ $(".box1:after").click(function(){ $(".box1").hide(); }); }); *{ margin:0; padding:0; line-height:1; } html,body{ height:100%; } section{ display:block; height:100%; background:rgba(0,0,0,.3); position:relative; } .box1{ width:50%; min-height:200px; max-height:450px; padding:20px; position:absolute; top:0;left:0; bottom:0;right:0; margin:auto; background:#fff; } .box1 p{ font:800 20px Georgia; color:#909090; line-height:1.7; } .box1:after{ content:""; position:absolute; top:0; left:0; display:block; width:20px; height:20px; background:#909090; border-radius:100%; margin:3px; transition:all .1s; } .box1:hover:after{ content:"close"; width:60px; text-align:center; line-height:20px; color:#fff; cursor:pointer; } .none{ display:none; }

People tend to read writing. Default text is for web developers and designers that need default text quickly. If it is not real text, they will focus on the design. Default text is for web developers and designers that need default text quickly. I hope you enjoyed the fake text. A designer can use default text to simulate what text would look like. Using default text is a simple way to create the appearance of content without having to create it. Thank you for using this application. This text will not appear in a consistent order. This string is randomly generated.


libcurl - как парсить HTTP заголовок?

Учусь писать HTTP веб-сервер. Сам сервер есть. Запускаю сервак, посылаю HTTP-запрос curl -D dumpbin 127.0.0.1:2000. На сервере сохраняю запрос в строковую переменную. Теперь (и я не знаю, как это сделать) мне надо распарсить весь полученный запрос, составить ответ и отправить обратно. С отправкой я справлюсь, а вот с парсингом и с составлением ответа возникли проблемы. Сказали, что следует использовать libcurl, но я не понимаю, как им можно парсить готовые строки и можно ли. Помогите, пожалуйста, примером такого использования этой либы, если он возможен. Посоветуйте, какие можно использовать библиотеки еще, чтобы решить эту задачу.
//Вид запроса (это то, что вернул мой эхо-сервер при использовании утилиты curl):
request = "GET /index.html HTTP/1.1
" "Host: 127.0.0.1:5991
" "User-Agent: curl/7.47.0
" "Accept: */*
" "
";
//Вид ответа (это я прочитал в комментах к заданию на степике): answer = "HTTP/1.0 200 OK
" "Content-length: %d
" "Connection: close
" "Content-Type: text/html
" "
" "%s";
Суть в том, что есть данные, которые разделены
и заканчиваются двойным переводом каретки и строки


Ответ

tl;dr см. конец ответа для реализации парсера заголовков

licurl используют, как правило, для написания клиентов, смотрите FAQ
5.17 Can I write a server with libcurl? No. libcurl offers no functions or building blocks to build any kind of internet protocol server. libcurl is only a client-side library. For server libraries, you need to continue your search elsewhere but there exist many good open source ones out there for most protocols you could possibly want a server for. And there are really good stand-alone ones that have been tested and proven for many years. There's no need for you to reinvent them!
В вольном переводе:
5.17 Могу ли я использовать libcurl для написания сервера? Нет. libcurl не предлагает функций или других строительных блоков для создания какого либо IP сервера. libcurl это только клиентская библиотека. Вам нужно продолжить ваши поиски библиотеки для построения сервера. Существует большое количество таких библиотек с открытым исходным кодом для большинства протоколов. Также существует большое кол-во проверенных годами stand-alone приложений. Вам не стоит изобретать их заново.
Хотя для построения клиента libcurl действительно очень удобная вещь, как упомянул в своем ответе @Pink Tux. В том числе заголовки вы получаете уже разбитые по одному.

Для построения сервера, как один из вариантов, можно использовать mongoose (на c, в виде пары .c/.h, добавляемой к вашему проекту, либо одну из многочисленных c++ оберток). Пример минимального сервера достаточно громоздкий, поэтому приводить здесь не буду. Можно посмотреть здесь

Еще один вариант - библиотека cpp-netlib которая изначально планировалась как часть boost (но потом планы разработчиков поменялись). В простейшем виде http сервер выглядит так:
namespace http = boost::network::http;
struct handler; typedef http::server http_server;
struct handler { void operator() (http_server::request const &request, http_server::response &response) { response = http_server::response::stock_reply( http_server::response::ok, "Hello, world!"); }
void log(http_server::string_type const &info) { std::cerr << "ERROR: " << info << '
'; } };
int main(int arg, char * argv[]) { handler handler_; http_server::options options(handler_); http_server server_( options.address("0.0.0.0") .port("8000")); server_.run(); }

Если вам нужно что-то еще более высокоуровневое (с поддержкой шаблонов, json, middlewares), можно взять crow, которая подключается к вашему проекту одним заголовочным файлом. По духу это напоминает Python Flask. Пример сервера:
#include "crow_all.h"
int main() { crow::SimpleApp app;
CROW_ROUTE(app, "/")([](){ return "Hello world"; });
app.port(18080).multithreaded().run(); }

Если все-таки интересно самому разобрать заголовки, то можно например таким кодом:
std::istringstream rawstream(raw); std::map headers; std::string header; while (std::getline(rawstream, header) && header != "
") { std::string::size_type index = header.find(':'); if (index != std::string::npos) { headers.insert(std::make_pair( boost::algorithm::trim_copy(header.substr(0, index)), boost::algorithm::trim_copy(header.substr(index + 1)) )); } }
В raw типа std::string помещаете строку с вашими заголовками (либо даже целиком запрос клиента), в headers получаете map из имен/значений заголовков. Используете к примеру так:
std::cout << headers["Content-Type"] << std::endl;
Обратите внимание, что по стандарту имя заголовка может иметь любой регистр. Поэтому CONTENT-TYPE, content-type и Content-Type это все один заголовок, и для удобства можно перед добавлением в map привести имя заголовка в нижний регистр:
headers.insert(std::make_pair( boost::algorithm::to_lower_copy(boost::algorithm::trim_copy(header.substr(0, index))), boost::algorithm::trim_copy(header.substr(index + 1)) ));
Действующий пример на Ideone.com

P.S. Для тестирования вместо curl можно использовать postman в котором можно задавать заголовки, тело страниц (в том числе json), сохранять наборы запросов и т.д.

Можно ли IEnumerator привести к IEnumerable?

Объясните,пожалуйста,почему в ниже приведенном коде возможен Upcast типа IEnumerator к типу IEnumerable,ведь IEnumerator не наследуется от IEnumerable

static IEnumerator GetOddNumbers(params int[] numbers) { foreach (var number in numbers) { if (number % 2 != 0) yield return number; } }
static void Main(string[] args) {
IEnumerable enumerable = (IEnumerable)GetOddNumbers(1, 2, 3); IEnumerator enumerator = GetOddNumbers(1, 2, 3);

//List oddnumbers = new List(GetOddNumbers(1, 2, 3));
//foreach (var number in oddnumbers) //{ // Console.WriteLine(number); //}
//Console.ReadLine(); }


Ответ

Извините, неверно прочитал вопрос вначале, ответ полностью переписан.

Дело в том, что в C# любой объект можно закастить к любому интерфейсу на этапе компиляции:
interface I1 { }
class Program { static void Main(string[] args) { I1 i1 = (I1)(new Program()); } }
В рантайме, если объект реально не имплементирует интерфейс, выбросится исключение InvalidCastExcetion

Почему же разрешён каст к интерфейсу, хотя объект на самом деле не имплементирует этот интерфейс? Рассмотрим код
Program p = new Program(); I1 i1 = (I1)p;
В этой точке статический тип выражения p, на которое навешен каст — Program. Но реальный, динамический тип может быть любой, производный от Program. И этот тип вполне может имплементировать интерфейс! Поэтому компилятор не может доказать, что каст невозможен, и откладывает проверку до момента реального выполнения.
Сравните:
interface I1 { }
sealed class Program // добавили sealed { static void Main(string[] args) { I1 i1 = (I1)(new Program()); // Не компилируется, ошибка CS0030 } }
В этих условиях компилятор таки может доказать, что выражение не может имплементировать интерфейс, ведь класс Program этот интерфейс не имплементирует, а производных классов быть не может. Вот этот код и не компилируется.

Компилятор, конечно, мог бы быть суперумным, и увидеть, что выражение GetOddNumbers(...) есть вызов функции-генератора, и не имплементирует IEnumerable. Но при этом он должен был бы решать это не по декларируемому типу (IEnumerator), а анализируя поток выполнения программы. Это в общем случае неразрешимая задача, так что компилятор C# и не пробует браться за неё. (За исключением нескольких простых случаев, да.)

Кросс доменная авторизация на yii2

Всем привет! Возникла такая проблема, нужно реализовать кросс доменную авторизацию. Схема такая: 1. На первом домене(user.mysite.com) находится личный кабинет пользователя который работает на yii2 и через который будет проходить авторизация. 2. На втором домене(mysite.com) находится интернет магазин на "самописном" движке который должен работать с авторизированным пользователем. 3. БД у них одна. 4. Лежат на одном сервере, в соседних каталогах. 5. должна быть реализована опция "запомнить меня"
Подскажите, можно ли это заставить работать? И как это лучше сделать?


Ответ

В конфиге
'user' => [ 'identityClass' => 'common\models\User', 'enableAutoLogin' => true, 'identityCookie' => [ 'name' => '_identity', 'httpOnly' => true, 'domain' => '.' . DOMAIN, ], ], 'session' => [ 'cookieParams' => [ 'domain' => '.' . DOMAIN, 'httpOnly' => true, ], ],
В index.php
defined('DOMAIN') or define('DOMAIN', 'mysite.com');
Куки будут общими для домена и сабдоменов

Смена картинки imageView

Как можно сменить картинку, которая есть в ресурсах. В ресурсах нет imageName, а есть картинки p1, p2 ,p3,.. и т.д. Нужно, чтобы каждый раз показывались разные картинки в зависимости от position
String imageName = ("p"+position); imageView.setImageDrawable(R.drawable.imageName);


Ответ

Вам нужно получить идентификатор ресурса по его имени:
String mDrawableName = "p" + position; int resID = imageView.getContext().getResources().getIdentifier(mDrawableName , "drawable", imageView.getContext().getPackageName()); imageView.setImageResource(resID);

Как узнать установлена ли определенная программа на телефоне?

Мне в приложении нужно давать возможность пользователю отправлять сообщения через месседжеры, которые установлены у него на телефоне, как узнать установлен ли у пользователя Viber, WhatsApp и тому подобные программы?


Ответ

private boolean isPackageInstalled(String packagename, Context context) { PackageManager pm = context.getPackageManager(); try { pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES); return true; } catch (NameNotFoundException e) { return false; } }
В packagename передавать имя пакета приложения. Например, у вайбера это com.viber.voip

Visual Studio 2015 добавляет лишний Resources1.Designer.cs

Я редактирую содержимое ресурсов вручную в студии. После этого проект перестаёт собираться, причина - Студия добавляет в проект новый файл Resources1.Designer.cs. Т.к. один файл Resources.Designer.cs уже есть, студия ругается. Приходится после каждого редактирования файла ресурсов удалять этот Resources1.Designer.cs, после чего проект нормально собирается. Этот эффект проявлялся не сразу, не после создания проекта, а через некоторое время (пару недель). Кто знает, почему студия добавляет дополнительный файл Resources1.Designer.cs, и как это дело пофиксить?


Ответ

Проверьте, что содержится в файле проекта (.csproj)
Если в теге LastGenOutput указано Resources1, например, так:
ResXFileCodeGenerator Resources1.Designer.cs
То уберите единицу:
ResXFileCodeGenerator Resources.Designer.cs

Java. БД. Консольный ввод-вывод

Всем привет.
Есть следующая задача:
Реализовать консольный ввод-вывод имени и фамилии используя БД (программа позволяет ввести ФИО, сохранить ФИО, вывести список всех данных из БД).
Я еще ни разу не сталкивалась с работой с БД. С чего начать вообще? Так-то я могу просто записывать все в какой-нибудь ArrayList и сортировать по алфавиту, но подозреваю, что это как-то по-другому должно выглядеть.


Ответ

Данная задача решается с помощью JDBC
1.Создай локальную БД. К примеру,
CREATE TABLE USERS (user_name text)
2.Подключи к проекту соответствующей БД JDBC-драйвер.
3.Создай метод или класс обращения к JDBC. К примеру такой:
Connection connection = null; Statement statement = null; ResultSet result = null;
String url = "CONNECTION_URL"; // url конекшена JDBC String login = "LOGIN"; // логин БД String password = "PASSWORD"; // пароль БД
try { Class.forName("org.mysql.Driver"); // путь к драйверу connection = DriverManager.getConnection(url, login, password); statement = connection.createStatement(); result = statement.executeQuery("SELECT * FROM USERS"); while(result.next()) { System.out.println(result.getString("user_name")); // считываем имя пользователя, полученной записи } } catch(ClassNotFoundException | SQLException exc) { } finally { try { if(connection!=null) connection.close(); if(statement!=null) statement.close(); if(result!=null) result.close(); } catch (SQLException exc) {} }
Cоветую ознакомиться с документацией Оракла, там все довольно понятно объяснено и много примеров.
Ну, а также еще советую этот источник

Создание меню toolbar (три точки)

Доброго времени суток. Подскажите пожалуйста, как создать меню в виде трех точек в тулбаре. До этого создавал меню так:
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); return true; }
Но это вызов через функциональную клавишу. Также еще хотелось бы узнать как разместить иконку перед названием приложения в тулбаре? Спасибо.
UPD Решение нашел в соответствии с этой статьей.


Ответ

В три точки (Overflow) убираются элементы меню со значениями ifRoom/never атрибута app:showAsAction. ifRoom элементы убирутся только если не поместятся в тулбар. иконку ставить как-то так:
toolbar.setIcon(R.drawable.ic_launcher);

Странности с закрытием PrintWriter в Java

Почему такой пример выполняется, не выдвавая никаких исключений.
PrintWriter os = new PrintWriter(System.out, true); os.close(); os.println("text");


Ответ

PrintWriter не совсем обычный класс, если посмотреть документацию к классу, то увидим следующее:
Methods in this class never throw I/O exceptions, although some of its constructors may. The client may inquire as to whether any errors have occurred by invoking {@link #checkError checkError()}.
Т.е. он проглатывает все ошибки, связанные с вводом-выводом.

Поиск файлов в директориях

Необходимо найти все файлы на диске. Есть такой код:
System.IO.DirectoryInfo number = new System.IO.DirectoryInfo(@"D:\"); int count = number.GetFiles().Length;
Ищет, но не ищет во всех папках. Пробовал так:
System.IO.DirectoryInfo number = new System.IO.DirectoryInfo(@"D:\"); int count = number.GetFiles(".", SearchOption.AllDirectories).Length;


Ответ

SearchOption.AllDirectories будет ронять весь поиск, если к одному из подкаталогов нет доступа. А учитывая, что ты передаёшь корень диска, там гарантированно попадётся System Volume Information и поиск упадёт. В остальном код работоспособный.
Чтобы правильно обработать каталоги, к которым нет доступа, надо вместо передачи этого флага написать рекурсивную функцию, которая будет сама перебирать каталоги и игнорировать (или каким-либо ещё образом обрабатывать) исключения ошибки доступа.
PS: https://ru.stackoverflow.com/a/419435/178988 http://bbs.vbstreets.ru/viewtopic.php?f=2&t=44440 http://www.cyberforum.ru/csharp-beginners/thread957151.html

Как сделать чтобы каждые 0.5 секунд к переменной прибавлялось 1?

Как сделать чтобы каждые 0.5 секунд к переменной прибавлялось 1?


Ответ

Функция, которая вызывается каждые 500мс и увеличивает переменную counter на 1:
new Timer().scheduleAtFixedRate(new TimerTask(){ @Override public void run(){ counter++; Log.i("tag", "A Kiss every 5 seconds"); } }, 0, 500);
Понятное дело, переменная counter должна быть определена в доступной области видимости, например - в свойствах текущего класса.

Как правильно закрыть окно Qt?

Есть многооконное приложение. Виджеты иногда меняют родителей и переходят из одного окна в другое. Возникает необходимость закрывать окна с остатками виджетов. Например, было два окна, в каждом по два QLabel. Из одного окна в другое перешел QLabel. Окно с оставшимся в нем одним QLabel больше не нужно и его можно полностью удалить со всеми виджетами в нем. Как теперь правильно удалить это окно, чтобы не было утечек памяти и других неприятных вещей? Или память освобождается автоматически?


Ответ

Для каждого окна установите атрибут:
setAttribute(Qt::WA_DeleteOnClose);
Этот атрибут делает следующее:
Makes Qt delete this widget when the widget has accepted the close event (see QWidget::closeEvent()).
Другими словами, когда окно получает QCloseEvent, оно самоуничтожается

перенос программы с С++ Builder на Visual Studio? или другое? [закрыт]

Есть старая программа на С++ Builder и желание перейти на Visual C++. Всегда считал, что аналогом нынешнего Embarcadero является проект С++ WinForm в VS. Однако в версии VS 2013 Community, с которой я начал пробовать, такого типа проектов нет (только WinForms для С# и VB). Что это означает? Что сейчас обычные windows-приложения на С++ таким путём уже не делают? А что тогда вместо этого позволяет создать форму и таскать на неё компоненты? Microsoft рекламирует WPF, но это опять не для С++, а только для С# и VB. Почитал ссылки на StackOverflow и выясняется, что народ в большинстве советует вообще использовать Qt. Итого: каков же сейчас "правильный" путь перевода старой программы С++ Builder на VS или другой софт?
Update: причина, по которой хочется отказаться от С++ Builder - просто ненадёжность (последнее пёрышко - ошибка линкера LME288). Если бы не это - программа отличная.


Ответ

По-простому VCL гуйню под WPF/WinForms/Qt Вы всё равно не переведете. Т.е. заимствовать дизайн конечно можно, но всё наполнение придется делать по-новой. Бизнес-логика должна перенестись без особых проблем, если мы говорим о сохранении языка C++, то есть без перехода на C# или ещё что. Т.о. если решение об отказе от Embarcadero окончательное, из всего обозначенного проще всего перейти на реализацию под Qt
P.S. в общем и целом, данный вопрос, не совсем подходящий для StackOverflow.

SQL. Как посчитать количество строк с нулевым значением (NULL) [дубликат]

На данный вопрос уже ответили: Как проверить есть ли NULL в списке? 3 ответа Подскажите правильный запрос в SQL, чтобы посчитать количество строк с нулевым значением NULL.


Ответ

Как вариант, хоть ни разу и не оптимальный:
SELECT COUNT(*) - COUNT(someField) FROM someTable