Страницы

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

четверг, 28 марта 2019 г.

Мощный парсер JSON для C#

Здравствуйте! Появилась задача парсить несложные json файлы из .NET приложения. Ссылка на пример такого файла. мне удалось разглядеть 4 массива: "artists", "tracks", "friends", "albums". Сам только начинающий программист, подскажите, пожалуйста, нужную библиотеку для доступа к массивам и их содержимому.


Ответ

Ну для начала удобный он-лайн парсер, просто, что бы понять структуру: json.parser.online.fr Ну и сама библиотека для .Net: json.codeplex.com

Как сделать, чтобы элемент двигался вместе scrollbar?

Здравствуйте. Я хочу поставить div element вверху страницу, а когда буду изменять scrooll, то элемент должен вместе с ним двигаться.


Ответ

Элементу Нужно установить фиксированное позиционнирование Например #main{ position:fixed; } или

В чем польза рекурсии?

Читал что "рекурсия обычно замедляет работу программы и расходует лишнюю память". Это во всех случаях? И какая еще от нее есть польза кроме как компактной записи кода? И в каких случаях она необходима?


Ответ

Бытует мнение, что рекурсия является очень выразительным|естественным|няшечка|etc средством для реализации некоторых действий. Рекурсия общего вида: Замедляет, т.к. много ( в т.ч. бесконечно ) вызовов функций. Расходует память, т.к. каждый вызов функции хранит данные в стеке Есть ещё, т.н., хвостовая рекурсия. ( ИМХО - не рекурсия вовсе, а просто сахар для цикла ): Суть в том, что результат вызова итерации хвостовой рекурсии - не обрабатывается предыдущим шагом, и копилятор/интерпритатор может заменить работу с такой функцией - на цикл, который лишён недостатков указанных выше. 1) Пример хвостовой рекурсии ( JS, факториал ): function fact( step, res ){ if ( step < 2 ) return res; else return fact( step - 1, res * step ); }
fact_10 = fact( 10, 1 ); 2) Тот-же смысл, но обычная рекурсия: function fact( step ){ if ( step < 2 ) return 1; else return step * fact( step - 1 ); }
fact_10 = fact( 10 ); Разница, как уже указывал: Результат вызова никак не используется ( просто проброс на уровень выше ) Результат вызова перед возвращением подвергается некой операции. Вариант 1 легко ( алгоритм простой ) оптимизируется до такого кода: function fact( num ){ var res = 1;
while( num > 1 ){ res *= num; num--; }
return res; } Либо совсем кратко ( но в asm - тоже самое ): function fact( num ){ var res = 1;
while( num > 1 ) res *= num--;
return res; }

Получение текущих GPS координат

Как запросить текущие GPS координаты устройства? Я видел функцию getLasKnownLocation но ее название и применение говорит само за себя. Требуется получать (запрашивать у модуля) текущую локацию телефона


Ответ

Примерно так: public class MyLocationActivity extends Activity implements LocationListener { private static final String TAG=MyLocationActivity.class.getName();
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this); }
@Override public void onLocationChanged(Location location) { if (location != null) { Log.d(TAG, "Широта="+location.getLatitude()); Log.d(TAG, "Долгота="+location.getLongitude()); } }
@Override public void onProviderDisabled(String provider) { }
@Override public void onProviderEnabled(String provider) { }
@Override public void onStatusChanged(String provider, int status, Bundle extras) { } } Только надо озаботиться соотвествующими пермишеном в манифесте

Аналог push() для объектов

Всем привет. Сегодня столкнулся с такой проблемой. Мне понадобилось добавлять элементы в ассоциативный массив. На JavaScript нет ассоциативных массивов ,поэтому я сделал как объект. Теперь не могу найти аналог функции push(). Подскажите, если кто-нибудь знает. Спасибо.


Ответ

вы хотите, чтобы ключами были обычные инкрементирующиеся числа? Не совсем. Первый ключ - какое-то слово, второй ключ - числа. obj['key'] = []; obj['key'].push('value1'); obj['key'].push('value2'); obj['key'][0];// 'value1' obj['key'][1];// 'value2'

Кодировка в Sublime Text 2

Раньше был на Notepad++, сейчас решил осваивать новый для меня текстовый редактор. Возник вопрос по поводу кодировки: где её задавать/изменять? В Notepad++ у файла была кодировка UTF-8 (без BOM): открываю его в Sublime Text и вижу, что кириллица отображается некорректно.


Ответ

У меня в меню File есть пункт Reopen With Encoding... Однако, я использую Mac-версию, но думаю, что и на остальных есть такая.

Затемнение родительского окна (wpf)

Те кто работал с delphi должны понять о чем речь, при открытии в модальном окне дочернего окна, нужно сделать затемнение родительского, кто знает как это сделать в wpf? А то у нас окон много, и при открытии они немного сливаются по цветам...вообщем нужно затемнить прошлое окно, есть идеи?


Ответ

Если не ошибаюсь, вам надо вот это
///

/// Apply Blur Effect on the window /// /// private void ApplyEffect(Window win) { System.Windows.Media.Effects.BlurEffect objBlur = new System.Windows.Media.Effects.BlurEffect(); objBlur.Radius = 4; win.Effect = objBlur; }
/// /// Remove Blur Effects /// /// private void ClearEffect(Window win) { win.Effect = null; }
и, собственно, применение:
private void btnShowDialog_Click(object sender, RoutedEventArgs e) { WinModalDialog objModal = new WinModalDialog(); objModal.Owner = this; ApplyEffect(this);
objModal.ShowDialog();
ClearEffect(this); }

Способы уменьшения числа запросов к базе данных

Проект, над которым я сейчас работаю, организован как некий каркас, который обрастает модулями. Практически каждый модуль - это получение данных из БД или запись в БД. Внутри самого модуля тоже может быть несколько запросов: надо проверить данные, и - в зависимости от результата проверки - что-то записать или изменить. Интересно, какие есть способы, позволяющие уменьшить число запросов к базе. Писать данные в локальное хранилище? сессии? куки? кэширование? хаки в SQL-запросах? Ну и еще: возможно ли такое соотношение одна страница = один запрос к БД? при том, что данные реально разные.


Ответ

Вы в принципе все способы и перечислили. Основной - кеширование. возможно ли такое соотношение одна страница = один запрос к БД? при том, что данные реально разные. Очень абстрактный вопрос. Он решается на уровне существующего приложения. Судя по вопросам, вы совершаете типичную ошибку начинающего - "оптимизация на спичках". Задумываетесь об оптимизации, еще не зная узких мест приложения.

Привести число в нормальный вид на JS

Есть число. Например 0.66111 Как средствами js получить - 0.6?


Ответ

function cut(value, precision){ var dec = Math.pow(10, precision) return Math[(value > 0) ? 'floor' : 'ceil'](value * dec) / dec } Для вашего случая просто примените cut(0.66111, 1) P.S. Хочу обратить внимание, что я написал функцию обрезания числа, а не его округления UPD. Учитывая замечание @VladD, функция доработана для использования с отрицательными числами.

Не работает функция the_content(); в single.php

Доброго времени суток, подскажите почему не работает в single.php, просто написано, должна работать без цикла the_loop в данном файле, но не работает. Зато работает , она без проблем выводит название поста. Вот код single.php:




Ax Ay Bx By Cx Cy Dx Dy # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111 pools = [tuple(pool) for pool in args] * repeat result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod)

Ошибка в выводе бинома ньютона(c++)

Написал программу для вычисления бинома Ньютона. При вводе аргумента в диапазоне [1,13] все работает. Если вводить больший аргумент, то программа работает неправильно. В чем проблема?
#include #include
using namespace std;
int fact(int n) { int k = 1; if (n == 0) return 1; for (int i = 1; i <= n; i++) k = k*i; return k; }
void func(int n) { for (int j = 0; j < n; j++) { for (int i = 0; i <= j; i++) cout << (fact(j) / (fact(i)*fact(j - i))) << " "; cout << endl; } }
int main() { int n; cin >> n; func(n); system("pause"); }
Также вот вариант в онлайн компиляторе.


Ответ

13! = 6227020800
14! = 87178291200
int (4 байта) имеет диапазон [−2147483648; +2147483647], поэтому числа просто не влезают
Чтобы расширить возможности, не меняя алгоритма, можно поменять тип на unsigned long long (8 байт)

Расчет “цветовой карты” в C#

Нужно чтобы числа от 0 до 255 соответствовали такой вот color map
и в результате получались три числа RGB, например (0,0,255)


Ответ

Вам поможет вот эта иллюстрация с Википедии (ссылка)

Ваш пример начинается с 240° и идет налево до 0°.
Вам нужно разделить всю ширину на 4 области.
1 четверть: Синий 100%, Зеленый растет от 0% до 100% 2 четверть: Зеленый 100%, Синий уменьшается со 100% до 0% 3 четверть: Зеленый 100%, Красный растет от 0% до 100% 4 четверть: Красный 100%, Зеленый уменьшается со 100% до 0%
Думаю с арифметикой приведения вы справитесь

Как научится разбиратся с ошибками во время разработки

В моём примере это отчёт об ошибках Tomcat Server.. Хотел узнать если есть какие либо программы или возможности упростить этот отчёт об ошибках в самом томкат сервере ? Может какнибудь настроить подругому ? Я как новичок замучался читать этот непонятный для меня отчёт.. вот пример:
java.lang.NoSuchMethodError: com.sun.jersey.core.spi.component.ProviderServices. (Lcom/sun/jersey/core/spi/factory/InjectableProviderFactory;Lcom/sun/jersey/core /spi/component/ProviderFactory;Ljava/util/Set;Ljava/util/Set;)V at com.sun.jersey.api.client.Client.(Client.java:172) at com.sun.jersey.api.client.Client.(Client.java:139) at com.sun.jersey.api.client.Client.create(Client.java:416) at appl.test.ApplTest.main(ApplTest.java:25) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Для меня очень трудно разобратся с данным ужасом как новичку и это очень сильно замедляет разработку.. Все возможные решения для этой проблемы будут приветствоватся.


Ответ

Что случилось?
Все на самом деле довольно несложно. Давайте просто читать стэктрейс по-порядку.
java.lang.NoSuchMethodError - эта ошибка бросается, когда во время выполнения программы JVM не может найти вызываемый метод. Очевидно на момент компиляции класса метод был доступен, иначе класс бы не скомпилировался. Такая ошибка, как правило появляется, если используются несовместимые версии библиотек.
Что это за метод? Его сигнатура следует далее:
com.sun.jersey.core.spi.component.ProviderServices.(Lcom/sun/jersey/core/spi/factory/InjectableProviderFactory;Lcom/sun/jersey/core /spi/component/ProviderFactory;Ljava/util/Set;Ljava/util/Set;)
в более читаемом виде метод - это конструктор:
ProviderServices(InjectableProviderFactory arg0, ProviderFactory arg1, Set arg2, Set arg3)
и, что немаловажно, стэктрейс сообщает нам, где именно вызов этого конструктора привел к ошибке:
at com.sun.jersey.api.client.Client.(Client.java:172)
Итого: у нас есть класс com.sun.jersey.api.client.Client, который на 172й строчке своего исходного кода вызывает конструктор ProviderServices из другой библиотеки, который ему не доступен.

Как это произошло?
Далее, попробуем найти это место. Вы легко можете перейти в IDE к нужному классу через поиск классов или Ctrl+клик на его имени, она подтянет исходники и вы окажетесь на этой злополучной 172й строке.
Но у меня такой возможности нет и я иду на http://grepcode.com/ - прекрасный поисковик по коду java-библиотек - и ищу класс com.sun.jersey.api.client.Client

Выясняется, что он входит в библиотеку jersey-client, и grepcode знает добрых три десятка версий этой библиотеки. Пробегаемся по версиям и смотрим на 172ю строчку. Это не так уж и долго. Выясняется, что ни в одной версии на 172й строке этот конструктор не вызывается. Может быть grepcode хранет в своем индексе не все-все версии jersey-client?
Отправляемся на http://mvnrepository.com/ - поисковик maven-артефактов и ищем jersey-client. Находим как org.glassfish.jersey.core:jersey-client так и com.sun.jersey:jersey-client. Нас интересует второй вариант, исходя из имени пакета com.sun.jersey. Действительно, выясняется, что версий вида 1.x.x было гораздо больше. Было бы досадно возиться со всем этим богаством. Но, к счастью, я нашел ваш недавний вопрос java.lang.NoSuchMethodError со списком ваших jar-ников.
Печально, что вы не удосужились приложить список библиотек к этому вопросу. Да и вообще, не совсем понятно, зачем плодить два почти одинаковых вопроса.
Но вернемся к нашему расследованию. Выберем из вашего списка то, что напрямую относится к Jersey:
jersey-client-1.0.3.jar jersey-client.jar jersey-common.jar jersey-container-servlet-core.jar jersey-container-servlet.jar jersey-core-1.8.jar jersey-entity-filtering-2.17.jar jersey-guava-2.22.2.jar jersey-media-jaxb.jar jersey-media-json-jackson-2.17.jar jersey-server.jar
Ага! Есть jersey-client-1.0.3.jar и неизвестный JAR jersey-client.jar (из чего я делаю вывод, что вы собирали библиотеки в кучу руками, а не каким-либо менеджером зависимостей). Что ж, попробуем посмотреть на jersey-client-1.0.3.jar. В нем есть класс com.sun.jersey.api.client.Client, и в его коде на 172й строчке наш конструктор:
ProviderServices providerServices = new ProviderServices( injectableFactory, this.componentProviderFactory, config.getClasses(), config.getSingletons());
Еще раз взглянем на список библиотек. Не может не смутить несоответствие версий jersey-core-1.8.jar и jersey-client-1.0.3.jar. Проверим на mvnrepository зависимости библиотеки jersey-client. Должна быть jersey-core версии 1.0.3!

На всякий случай посмотрим на grepcode исходники класса ProviderServices из jersey-core-1.8.jar - доступны только два конструктора:
ProviderServices(ProviderFactory componentProviderFactory, Set> providers, Set providerInstances)
и
ProviderServices(Class constraintToType, ProviderFactory componentProviderFactory, Set> providers, Set providerInstances)
, а нужного нам нет. Но он был единственным доступным конструктором в jersey-core-1.0.3.jar. Нестыковка действительно между версиями этих библиотек.
Поздравляю, это ваш первый JAR Hell

Что делать дальше?
Разобраться, какую версию jersey вы хотите использовать 1.0.3 или 1.8. Привести версии зависимостей в порядок, выкинуть лишние. Задуматься об использовании средств управления зависимостями (maven/ivy/gradle), чтобы никогда больше не заниматься раскладыванием jar-ников в /lib руками.

PS. Забудьте про "программы или возможности упростить этот отчёт об ошибках". Стэктрейс - это обычно все, что вам нужно при отладке исключений.

Знак коммента в начале JS-скриптов

Вопрос чисто теоретический.
Часто встречаю в чужих скриптах знак
Браузер, для которого предназначались такие трюки, очень старый Netscape, давно умер. Поэтому в этих комментариях нет нужды. Итак, для вставки скрипта мы просто пишем