Страницы

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

суббота, 16 марта 2019 г.

Как наилучшим образом “смержить” два JSONObject?

Имеем: JSONObject o1 = { "one": "1", "two": "2", "three": "3" } JSONObject o2 = { "four": "4", "five": "5", "six": "6" } В результате слияния o1 и o2 должны получить: JSONObject result = { "one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6" } Один из вариантов - использвать иторатор по keys, и пока hasNext - добавлять поле по ключу в новый объект. Ищу более красивый способ. Note - Ключи в o1 и o2 повторяться не могут.


Ответ

Я пришел к тому, что наилучшим решением будет использования иторатора jsonObject.keys() и ручной сборки результурующего объекта. public JSONObject mergeJsonObjects(JSONObject o1, JSONObject o2) { JSONObject result = new JSONObject(); Iterator i1 = o1.keys(); Iterator i2 = o2.keys(); String tmp_key; while (i1.hasNext()) { tmp_key = (String) i1.next(); try { result.put(tmp_key, o1.get(tmp_key)); }catch (JSONException ignored){} } while (i2.hasNext()) { tmp_key = (String) i2.next(); try { result.put(tmp_key, o2.get(tmp_key)); }catch (JSONException ignored){} } return result; } upd: public JSONObject mergeJsonObjects(ArrayList jsonObjects) { JSONObject result = new JSONObject(); String tmp_key; for (JSONObject jsonObject: jsonObjects){ Iterator iterator = jsonObject.keys(); while (iterator.hasNext()) { tmp_key = (String) iterator.next(); try { result.put(tmp_key, jsonObject.get(tmp_key)); }catch (JSONException ignored){} } } return result; }

ВКонтакте доступ к jQuery из UserJS

Если открыть консоль браузера на странице ВКонтакте, то введя
$
увидим в выводе объект jQuery, но если внедрить на страницу UserScript:
function append() { console.log( $ ); };
window.setInterval( append, 1000 );
то ровно раз в секунду в консоль будет падать ошибка undefined В каком пространстве имен искать jQuery и как вообще такое может быть, ведь UserScript исполняется в глобальном контексте и в том же контексте происходит работа, если напрямую вводить команды в консоль ?


Ответ

Команды из консоли выполняются в контексте window + доступно API самого браузера. То, что вы видите, это ссылка на один из методов API браузера. Подробно с API системой вы можете познакомиться в документации соответствующего браузера. Сам сайт ВКонтакте не использует в своей работе библиотеку jQuery

Как сделать функцию с необязательным параметром в СИ

Имеется функция вида f(p1, *p2, *p3, *p4) { ... } По указателям p3 и p4 присваиваются определённые значения, которые не всегда нужны во внешней программе, т.е. эти аргументы, в отличие от p1 и p2, являются не обязательными. Как можно реализовать на Си, чтобы можно было использовать эту функцию без "возвращения" значений туда, на что указывают p3 и p4? Например, чтобы можно было использовать как f(a1, &a2), так и f(a1, &a2, a3, a4)


Ответ

@Ilyazh, если еще актуально, то вот пример такой функции (из рабочей программы в Linux) static int check_args_nz(void *a, ...) { va_list ap; va_start(ap, a);
int i; for (i = 0; a; i++) a = va_arg(ap, void *);
va_end(ap); return i; } Для теста вызывать можно примерно так: int a = 1; char *b = "abc"; double c;
printf ("%d %d %d
", check_args_nz(0, "2", &a, 0), check_args_nz(&a, b, &b, &c, 0), check_args_nz((void *)a, 0)); результат: $ ./a.out 0 4 1 $

Странный роутинг в kohana3

Приветствую вас. Столкнулся с очень странной проблемой: kohana3, судя по поведению, в нетрезвом состоянии, так как при правильно заданном маршруте для роутера выскакивает ошибочка: Kohana_HTTP_Exception [ 404 ]: The requested URL signup was not found on this server. Маршрут написан по мануалу в точности. Route::set('assest', '', array( 'action' => '(login|signup|logout)' )) ->defaults(array( 'controller' => 'Assest' )); .htaccess стандартный, изменения не вносились. Вот такие вот странности, знает кто, как лечить это?


Ответ

Снова моя не внимательность, не обратил внимание на строчку из документации, так как она написано очень мелким шрифтом, которая гласит, что маршрут должен быть задан до стандартного :D

Работа с Git и человеком, который им не пользуется

Добрый день! Ситуация такая: есть проект, который лежит на удаленном сервере, я все изменения вношу на локальной машине, потом при помощи Git отправляю изменения на сервер, есть дизайнер, который не умеет работать с Git и вносит правки на продакшене. Мне приходится лезть на сервер добавлять все правки дизайнера в репозиторий, а потом пулить (pull) изменения в свою локальную версию проекта. Хочется перестать сливать изменения дизайнера на продакшене, а делать это на своей локальной машине, а потом все одим махом отправлять на удаленный сервер. Есть ли в Git какой-нибудь инструмент, с помощью которого можно пулить незафиксированные изменения? Может быть, есть какой другой способ работы в команде в такой ситуации? Заранее спасибо за Ваш ответ/совет. P.S. Ответ капитана: Научить дизайнера использовать Git.


Ответ

Если он ещё и верстальщик (а может, и фронтенд разработчик), то без гита тяжело, настройте ему .ssh ключ чтобы не требовалось вводить никаких паролей и научите такой команде: git add . && git commit -am 'frontend development' && git pull origin master && git push origin master - объясните что это будет что-то типа "сохранить свои изменения и вылить". В консоле гита ему достаточно будет набрать "вверх" и "enter" и всё. :) Если про "батник", то смысл в следующем: найти папку, куда установлен гит, у меня это C:\Program Files (x86)\Git\bin элемент списка; добавить "переменную среду" (PATH): Панель управления > Система > Дополнительные параметры > Переменные среды > выбираем параметр PATH и дописываем через этот пусть к гиту; создаем файл, например, apply.bat, и прописываем там: git add . && git commit -am 'frontend development' && git pull origin master && git push origin master Не забудьте поменять ветку на свою.

С какого запроса следует начинать авторизацию на DropBox?

Доброго времени суток, уважаемые форумчане!
Изучаю документацию по протоколу Oauth 1.0 для DropBox, но не могу понять, с какого запроса следует начинать сеанс обращения к серверу DropBox. В документации написано, что первый запрос должен содержать следующие параметры:
oauth_consumer_key: The Consumer Key. oauth_signature_method: The signature method the Consumer used to sign the request. oauth_signature: The signature as defined in Signing Requests. oauth_timestamp: As defined in Nonce and Timestamp. oauth_nonce: As defined in Nonce and Timestamp. oauth_version: OPTIONAL. If present, value MUST be 1.0 . Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present. Service Providers’ response to non-1.0 value is left undefined. Additional parameters: Any additional parameters, as defined by the Service Provider.
Для вычисления подписи предлагается использовать PLAINTEXT, HMAC-SHA1 или RSA-SHA1. Методом PLAINTEXT ничего не получилось, как не пыталась отправлять запросы, сервер всё время возвращал ошибку "Not authorized".
Решила попробовать создавать подпись с помощью HMAC-SHA1, но не понятно, что будет являться входным параметром, а что ключом. Подскажите ещё, пожалуйста, какой нужно отправлять метод: POST или GET, куда передавать параметры: в строку запроса или в тело запроса?
Ссылка на рефы DropBox: http://oauth.net/core/1.0/#signing_process
Пример:
wstring url = L"https://www.dropbox.com/home/request_token"; wstring oauth_nonce; CreateRequestParam(oauth_nonce); wstring oauth_callback = L""; wstring oauth_consumer_key = L"my App key"; wstring oauth_consumer_secret = L"my App secret"; wstring oauth_signature_method = L"PLAINTEXT"; wstring oauth_timestamp = to_wstring(*(double*)time); wstring oauth_version = L"1.0"; wstring oauth_signature = oauth_consumer_secret + L"&"; wstring params = L"oauth_consumer_key=" + oauth_consumer_key + L"&oauth_signature_method=" + oauth_signature_method + L"&oauth_signature=" + oauth_signature + L"&oauth_timestamp=" + oauth_timestamp + L"&oauth_nonce=" + oauth_nonce + L"&oauth_version=" + oauth_version;
int err = PostRequest(url, params);
На указанный url отправляю HTTP POST запрос, в теле передаю параметры, указанные выше. Должны возвращаться out_token и outh_secret, но возвращается страница в html-формате, в которой нет ни того, ни другого. Что я делаю не так?


Ответ

Не знаю, актуален ли еще вопрос, попробую ответить.
Первый запрос на адрес https://api.dropbox.com/1/oauth/request_token
Пример:
POST https://api.dropbox.com/1/oauth/request_token HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0 Host: api.dropbox.com Accept: */* Accept-Encoding: deflate, gzip Authorization: OAuth oauth_consumer_key="973quph3jxdgqoe",oauth_nonce="105816471209",oauth_signature="wloizpn331cc8zd&",oauth_signature_method="PLAINTEXT",oauth_timestamp="Wed%2C%2013%20May%202015%2015%3A37%3A53%20%2B0000",oauth_version="1.0" Content-Length: 0 Content-Type: application/x-www-form-urlencoded
В ответ получаете oauth_token
HTTP/1.1 200 OK Server: nginx Date: Wed, 13 May 2015 15:46:32 GMT Content-Type: application/x-www-form-urlencoded ... Content-Length: 64
oauth_token_secret=LZl8HyVRQuP1ifON&oauth_token=RS4XReiBykw8WHNz
Затем отправляете пользователя в браузер на страничку https://www.dropbox.com/1/oauth/authorize?oauth_token=RS4XReiBykw8WHNz
Пользователь нажимает кнопочку Allow.
Затем выполняете запрос на второй URL (подписываете его уже с использованием полученного ранее oauth_token_secret
https://api.dropbox.com/1/oauth/access_token
POST https://api.dropbox.com/1/oauth/access_token HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0 Host: api.dropbox.com Accept: */* Accept-Encoding: deflate, gzip Authorization: OAuth oauth_consumer_key="973quph3jxdgqoe",oauth_nonce="847334669",oauth_signature="wloizpn331cc8zd&LZl8HyVRQuP1ifON",oauth_signature_method="PLAINTEXT",oauth_timestamp="Wed%2C%2013%20May%202015%2015%3A46%3A46%20%2B0000",oauth_token="RS4XReiBykw8WHNz",oauth_version="1.0" Content-Length: 0 Content-Type: application/x-www-form-urlencoded
И получаете в ответ токен, который будете использовать при последующих запросах:
HTTP/1.1 200 OK Server: nginx Date: Wed, 13 May 2015 15:46:55 GMT Content-Type: application/x-www-form-urlencoded Connection: keep-alive ... Content-Length: 76
oauth_token_secret=32mdalirxxxxa8j&oauth_token=yx8f9rdxxxxj8dia&uid=1921xxxx
Пример авторизации на Dropbox
Пример OAuth авторизации на Flickr с подписыванием запроса HMAC-SHA1

Зачем нужна константа TYPE внутри классов, определённых в пакете java.lang?

Задаю вопрос исключительно ради "научного" интереса. Используется эта константа для компилятора? Или её можно использовать в коде? Если да, то зачем?
Для ясности о чём идёт речь, полное содержимое файла Void.java:
package java.lang;
/** * The {@code Void} class is an uninstantiable placeholder class to hold a * reference to the {@code Class} object representing the Java keyword * void. * * @author unascribed * @since JDK1.1 */ public final class Void {
/** * The {@code Class} object representing the pseudo-type corresponding to * the keyword {@code void}. */
@SuppressWarnings("unchecked") public static final Class TYPE = (Class) Class.getPrimitiveClass("void");
/* * The Void class cannot be instantiated. */ private Void() {} }


Ответ

Например для того, чтобы убедиться, что найденный вами через рефлекшен метод ничего не возвращает. То есть:
if (Void.TYPE == m.getReturnType())