Страницы

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

воскресенье, 2 июня 2019 г.

Что такое template, как и зачем?

Что такое template в C++? Для каких целей он используется? Как он используется? - Желательно бы пример использования.


Ответ

Шаблоны (template) в C++ являются отдельными синтаксическими конструкциями.
Шаблоны используются для обобщённого программирования. Вы пишете алгоритм, который работает с различными типами данных, требуя от них только некоторой небольшой функциональности, а компилятор при использовании этого шаблона с конкретным типом подставляет тип и фактически сам генерирует требуемый код на C++
Вот простейший пример использования шаблонов:
template T min(const T x, const T y) { return x < y ? x : y; }
Мы написали код, который работает с любым типом данных, требуя от этого типа только наличия операции "меньше" (operator<). (На самом деле ещё конструктора копирования, но это уже детали.) Теперь мы можем использовать наш шаблон:
int x, y; int z = min(x,y); // Автоматический вывод типа. double a, b; double c = min(a,b); // Автоматический вывод типа. double d = min(x,y); // Явное указание типа.
std::vector::iterator i, j, k; k = min(i,j);
Видно, что нам удалось использовать этот шаблон не только к обычным числовым типам, но и к сложным сущностям - итераторам.
В этом мощь обобщённого программирования - код, написанный один раз используется многократно. Но есть и недостаток - "разбухание" бинарного кода - для каждого типа параметра шаблона компилятор создаст свой бинарный код.

AlertDialog с помощью RxJava

С помощью AsyncTask при обработке массива данных мы легко можем вывести с помощью AlertDialog прогресс выполнения обработки.
Можно ли это сделать с помощью RxJava? Прошу вашего простейшего примера.
И как решается проблема поворота девайса при загрузке данных с сервера при помощи RxJava и отображения прогресса на AlertDialog?


Ответ

Самый простой способ это заюзать метод from:
List list = new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add("item "+i); }
Observable.from(list) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber() { @Override public void onCompleted() { if(progress!=null && progress.isShowing()) progress.dismiss(); }
@Override public void onError(Throwable e) { if(progress!=null && progress.isShowing()) progress.dismiss(); }
@Override public void onNext(String s) { progress = ProgressDialog.show(this, "dialog title", "dialog message", true); } });

Адаптивные квадратные скобки посредством HTML и CSS

Как сделать резиновые квадратные скобки средствами HTML и CSS? При этом необходимо, чтобы данный блок был резиновый по ширине и высоте:
Сходу, в голову приходит только вариант с дополнительным вложенным блоком и с использованием псевдо-элементов after и before и с абсолютным позиционирования "миниграниц-изображений".


Ответ

Нашел более красивое, а главное оптимальное, на мой взгляд, и кроссбраузерное решение:
.b-matrix { position: relative; margin: 0 30px 25px 0; padding: 2px 4px; border-left: 2px solid #444; border-right: 2px solid #444; position: relative; display: inline-block; } /*-----border-----*/ .b-matrix_border:before, .b-matrix_border:after, .b-matrix__table_border:before, .b-matrix__table_border:after { position: absolute; display: block; width: 8px; height: 2px; background: #444; content: ''; } .b-matrix_border:before { top: 0; left: 0; } .b-matrix_border:after { top: 0; right: 0; } .b-matrix__table_border:before { bottom: 0; left: 0; } .b-matrix__table_border:after { bottom: 0; right: 0; } /*-----border end-----*/ .matrix-cell { display: block; width: 40px; height: 40px; border: 1px solid #ddd; text-align: center; }


Android: ссылка на контакт Skype в TextView

Как сделать ссылку на контакт Skype в TextView?
TextView распознает ссылки типа URL, e-mail и т.п., но не распознает ссылки на Skype.
Пробовал: skype:мой_id, tel:мой_id, call:мой_id — не работает.
Информацию по данному вопросу в интернете не нашел. Есть ли вообще в Android возможность запуска Skype по ссылке, на подобии как в Web??


Ответ

Intent для запуска скайпа с нужной url создаётся так
Uri skypeUri = Uri.parse(mySkypeUri); Intent intent = new Intent(Intent.ACTION_VIEW, skypeUri); intent.setComponent(new ComponentName("com.skype.raider", "com.skype.raider.Main")); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Поддерживаемые форматы URL'ок описаны тут
Далее надо сделать линки скайпа в тексте кликабельными и ловить клики, что бы перейти в скайп. Как сделать перехват кликов по ссылкам описано тут, а что бы сделать ссылками то что по формату TextView ссылкой не считает надо завернуть эти ссылки в тэг skype:username и текст с этими ссылками пропустить через метод Html.fromHtml

NumberFormatException при вызове Integer.parseInt() не во всех случаях и при непустой валидной строке

Что за Exception выкидывает? Вот участок кода на который ругается.
55 StringBuilder quotientStr = new StringBuilder();
56 quotientStr.append(arrOfVar[2]);**//добавляем число из массива** 57 quotientStr.append(5); 58 int quotient = Integer.parseInt(quotientStr.toString());
Exception in thread "main" java.lang.NumberFormatException: For input string: "4090303030" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:495) at java.lang.Integer.parseInt(Integer.java:527) at TaskTwo.division.LongDivision.intermCalc(LongDivision.java:58)


Ответ

Проблема в том, что вы вышли за границы максимальнно возможного значения содержимого переменной типа int, кое равняется 2147483647, т.е. 2млрд+. А у вас 4млрд+ Таким образом, например, вы не можете поместить всё население нашей планеты в переменную int. А вот население Китая вполне поместится в такой переменной. И программа такая будет работать исправно ровно до тех пор, пока Китай не присоединит к себе Индию. Только представьте: вы играете в к-л игру за Китай, развязываете n-мировую войну, побеждаете и присоединяете к себе Индию... А вместо сообщения "Поздравляем, теперь коммунистов в мире 2млрд+!" ваша игра вылетает на рабочий стол! Ибо в такой игре захватить Индию невозможно безнаказанно)
Решение:
Для таких больших чисел надо использовать класс BigInteger, передавая вашу строку в его конструктор:
BigInteger quotient = new BigInteger(quotientStr.toString()); System.out.println(quotient); //в вашем случае без проблем выведет 4090303030

Точность вычислений в языке python

Столкнулся с некой странностью с действительными числами в python.
Например, print(0.3+0.3+0.3) вместо вполне ожидаемых 0.9 выведет 0.8999999999999999.
Знаю про точность вычислений, про хранение в компьютере вещественных чисел, но почему, print(0.3*3 == 0.9) выдает false?
UPD Можно обойти это, сравнивая вот так print('%.2f'%(0.3*3) == '%.2f'%(0.9)) Но есть ли какой-нибудь другой способ?


Ответ

Потому что 0.3 - это не ровно 0.3, а, как вы сами предположили, немного меньше. Что и дает требуемую погрешность при умножении.
Представьте, что по каким-то причинам компьютер сохраняет числа в формате 0.01 + 0.02k. В этом случае 0.3 будет преобразован в 0.299, а 0.9 - в 0.899. Теперь же, если умножить 0.3 на 3, будет получен результат 0.897, а не 0.899.
Вышеописанный пример не имеет никакого отношения к реальности, но, надеюсь, показывает, как при умножении минимальная погрешность становится достаточно большой, чтобы результирующее число было округлено в нужную сторону.
0.3 + 0.3 + 0.3 же будет равно 0.3 * 3, хотя гарантировать постоянное соблюдение этого равенства я не берусь.

Создание корректных запросов для yandex.tank\phantom

Т.к. я только начинаю знакомиться с танком, возник еще один вопрос - как правильно задать ему запрос. Имеется локальный web-сервер, на нем крутиться небольшой сайт. К нему напрямую подключен сервер с танком. Нагрузка генерируется фантомом. Но апач постоянно выдает в логах ssl ошибку Invalid URI in request. Можете посоветовать, чем можно "вытащить" корректные запросы к сайту? wget? может быть, curl?
UPD
пример вывода answ.log
208 488 35886 852 0 HTTP/1.1 404 Not Found Date: Thu, 28 Jan 2016 13:39:50 GMT Server: Apache/2.4.6 (CentOS) Content-Length: 289 Connection: close Content-Type: text/html; charset=iso-8859-1 ERROR 404: Not Found. HTTP/1.1 400 Bad Request^M Date: Tue, 02 Feb 2016 10:56:39 GMT^M Server: Apache/2.4.6 (CentOS)^M Content-Length: 307^M Connection: close^M Content-Type: text/html; charset=iso-8859-1^M ^M 400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.


Apache/2.4.6 (CentOS) Server at 192.168.238.211 Port 443

366 488 35985 688 0 HTTP/1.1 200 OK Date: Thu, 28 Jan 2016 13:39:50 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sat, 26 Jun 2010 09:38:02 GMT ETag: "369-489eba4cc1280" Accept-Ranges: bytes Content-Length: 873 Connection: close Content-Type: text/css 0K 100% 44,7M=0s HTTP/1.1 400 Bad Request^M Date: Tue, 02 Feb 2016 10:56:39 GMT^M Server: Apache/2.4.6 (CentOS)^M Content-Length: 307^M Connection: close^M Content-Type: text/html; charset=iso-8859-1^M ^M 400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.


Apache/2.4.6 (CentOS) Server at 192.168.238.211 Port 443

load.ini
[phantom] threads=60 phantom_path=/usr/bin/phantom phantom_modules_path=/usr/lib/phantom/ instances=5000 address=192.168.238.211 ;Target's address port=443 ;target's port rps_schedule=const(1000,30s) ;load scheme writelog=all gatling_ip=192.168.238.210 ;generator's network interface ammofile=https://192.168.238.211/ammo/ammo.txt ssl=1


Ответ

В комментах уже выяснили, что у вас неверный формат запросов, как нужно делать описано в документации
На практике наиболее используемые uri-style и request-style. Uri-style – это просто список uri в отдельном файле, опционально после uri через пробел можно задать тег, тогда будут дополнительные агрегаты по тегам; заголовки задаются в любом месте в [] и применяются ко всем последующим запросам:
[Connection: close] [Host: example.com] / /test?param=1
Если у вас только GET запросы - этого достаточно.
Чтобы слать запросы произвольного вида нужно использовать request-style, там содержимое запроса отправляется практически "как есть" исправляются только переводы строки в заголовках на
при необходимости, формат описан в документации
Собрать GET запросы можно по логам веб-сервера, с POST/PUT сложнее, если нужны они то, можно сделать генератор под конкретный сервис, узнав, что за данные в него нужно слать. Если нет хорошего описания, что за данные надо слать, можно посмотреть, что фактически отправляется - или через developer tools браузера или при помощи утилит для захвата трафика, например, wireshark (с https тут будут проблемы).

Не распознается смартфон на Ubuntu 14.04

Помогите исправить проблему при подключении физического устройства на Ubuntu 14.04! Сделал все настройки но студия не распознает смартфон (android 4.2)
Ранее возникала такая проблема, но старыми методами не решилось!
Использовал данную инструкцию


Ответ

Мне всегда помогает выбор подключения - Камера (PTP). Его можно выбрать в верхней сдвигающейся шторке.

Отваливается sshfs

Имеется 2 сервера в качестве серверов приложений и один файловый сервер. К файловому серверу подключаются 2 сервера приложений для доступа к файлам.
На одном из серверов отваливается подключение примерно раз в сутки в логе syslog такая ошибка
kernel: [5499115.202786] sshfs[15014]: segfault at 7f36780018 ip 00007f370509d323 sp 00007f366$
Папка к которой подключен удаленный диск выглядит как битая мякгая ссылка то есть красным цветом в mc
При попытке подключится к ней еще раз пишет
Transport endpoint is not connected
Все это дело решается umount и повторный коннект, но хотелось бы чтобы не отваливалось.
Самое интересное что на втором сервере точно такая же схема подключения, версия sshfs идентичная первому серверу, но там все стабильно.
Версия sshfs на обоих серверах
SSHFS version 2.5 FUSE library version: 2.9.3 fusermount version: 2.9.3 using FUSE kernel interface version 7.19
Вопрос какие варианты решения данной проблемы?


Ответ

Происходит segfault - в sshfs присутствует некая ошибка, из-за которой в некий момент он пытается прочитать/записать что-то в область памяти, которая ему не доступна.
Если у вас достаточно мотивации - соберите на том сервере sshfs с отладочной информацией, запустите под gdb(либо с libSegFault + addr2line), да получите backtrace в момент возникновения ошибки. После этого можете либо просто отправить эту информацию в Issues(в текущей версии, без backtrace'а её слишком мало для работы над исправлением), либо самостоятельно исправить ошибку в коде и отправить Pull Request.
Правда sshfs фактически заброшен с 2011-го года(ну не считая обновлений всяких ReadMe в репозитории и косметического рефакторинга), и вероятно ответные действия разработчиков появятся не скоро.
Однако, если мотивации у вас не достаточно - просто перейдите на NFS вместо sshfs - он несравнимо менее ресурсозатратен, более стабилен и быстр.

Как реализовать парсер Markdown?

Смысл задания: Преобразовать строки, содержащие определенные символы. Использовать регулярные выражения.
Header - Строка, которая начинается с #, ##, ### и т.д. является заголовком. Данные строки должны оборачиваться тегами

,

,

и т.д. Простая строка должна оборачиваться тегом

Если в строке встречается * ... * то тогда обернуть в тег и т.д.
Пример:
Header line
Simple * line * with strong Line with link [Link to google](h ttps://www.google.com) in center...
Результат преобразования:
< html> < body>

Header line

Simple < strong>line< /strong> with strong

Line with link Link to google in center


Ответ

Воспользуйтесь библиотеками - pegdown либо txtmark. Это не насколько тривиальная задача, что бы отказываться от готовых библиотек.

Как изменить межбуквенное растояние?

Как убрать/уменьшить межбуквенный интервал (запас для символа другой ширины)?
C этим ответом ознакомился, но ни вариант с кастомной вьюхой, ни android:textScaleX мне не подходит.


Ответ

Эту возможность добавили в API 21: .setLetterSpacing(float) или в xml файл: android:letterSpacing Если вы хотите решить эту задачу в более ранних версиях, вам нужно создать ваш TextView
public myTextView(Context context, AttributeSet attrs) { super(context, attrs); }
в AttributeSet написать пару строчек, в которых проставите свои "spacing" между буквами.

Как уменьшить размер картинки?

Добавляю в ImageView картинку из библиотеки. И так как как фото много весит это грузит приложение.
Как снизить качество фото для отображаемого View-элемента? Есть наработки у кого то?
Нашел в туториалах такое решение и не могу понять какие компоненты использовать.
Что нужно для полей : getResources(), R.id.myimage ,reqHeight, reqWidth.
В тоториале говорится:
getResources() The resources object containing the image data R.id.myimage The resource id of the image data
Но что бы это могло значить? E меня есть только url картинки и View.
BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(getResources(), R.id.myimage, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType;
// Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2; final int halfWidth = width / 2;
// Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) > reqHeight && (halfWidth / inSampleSize) > reqWidth) { inSampleSize *= 2; } }


Ответ

Используйте отечественную разработку Universal Image Loader. После её настройки согласно инструкции по ссылке процесс загрузки будет выглядеть так:
imageLoader.displayImage(imageUri, imageView);
При этом, если вы жёстко зададите параметры высоту/ширины ImageView, то библиотека сама уменьшит размеры картинки до размеров контейнера. Т.е., если, например у вас есть картинка 1000х1000 пикселей, а ImageView у вас размерами в 30х30 пикселей, то библиотека в процессе загрузки уменьшит изображение до 30х30 пикселей. Вы можете это проверить получив Bitmap из ImageView и получив его параметры.

Подобных библиотек множество. Из последних - fresco от лицоКниги. Они тоже, наверняка это могут, но, я лично не проверял.

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

Как сделать запуск других приложений. Когда пользователь нажимает на, допустим, кнопку и открывается приложение, например "настройки"?


Ответ

Для запуска активности и получения от нее результата( 0 - идентификатор ответа ):
startActivityForResult(new Intent(android.provider.Settings.ACTION_SETTINGS), 0);
Для обычного запуска нужной активности:
startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS));

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

Рассмотрим простой пример:
void f(); void f_exception();
class A { private: std::string m_name;
public: A(std::string name) : m_name(name) {/*NOP*/}
~A() { std::cout << "Destroy object \"" << m_name << "\"." << std::endl; } };
int main() { f();
try { f_exception(); } catch (const std::runtime_error& e) { std::cout << "Catch exception." << std::endl; }
return 0; }
void f() { A a("a");
std::cout << "Before block" << std::endl; { A b("b"); } std::cout << "After block." << std::endl; }
void f_exception() { A c("c");
std::cout << "Before block" << std::endl; { A d("d"); throw std::runtime_error("exception"); } }
Стандарт гарантирует, что объекты с automatic storage duration будут удалены при выходе из блока кода, в котором они объявлены. Я предположил, что при компиляции создаются соответствующие инструкции, но ведь выход из блока может быть осуществлен и ранее (при использовании исключений, оператора goto, оператора return и т.д.). Т.е. необходимость вызова деструктора должна определяться динамически при выполнении программы. Это и подтверждает приведенный выше пример (вывод в консоль):
Before block Destroy object "b". After block. Destroy object "a". Before block Destroy object "d". Destroy object "c". Catch exception.
Собственно интересует, как это реализуется во время выполнения программы.


Ответ

Почему динамически? Все инструкции известны компилятору, а это значит что он для всякой инструкции, которая ведёт к «покиданию» текущей области может добавить вызов деструктора(ов). Здесь нет никакой магии, и не требуется анализа рантайма — просто работа для компилятора.
Кстати, вот это:
Стандарт гарантирует, что объекты с automatic storage duration будут удалены при выходе из блока кода, в котором они объявлены.
Не совсем правда. Попробуйте написать exit(0) в коде — Вы не увидите ни одного деструктора или попробуйте добавить noexcept к функции f_exception() — будет похожий результат.

Не удается запушить проект на github

После создания репы на git обнаружил, что вместе с файлами залил рабочий каталог .idea Добавил каталог в игнор, удалил его онлайн на github, сделал pull и попытка сделать push приводит вот к такому сообщению: Everything up-to-date. Что я сделал не так и как нужно правильно?


Ответ

Вопрос решился простым коммитом и последующим пушем.

Не работает автозапуск сервиса при загрузке телефона

Не получается настроить автозапуск сервиса при загрузке телефона. BroadcastReceiver просто не отрабатывает.
В манифесте:


Код ресивера
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d("======MyReceiver=======", "------onReceive-----"); context.startService(new Intent(context, MyService.class)); } }
После установки перед перезагрузкой запускал, тестировал приложение, как сказано здесь
Пробовал добавлять другие интент-фильтры:

От прочих системных событий ресивер тоже не срабатывает. Зато вполне успешно запускается при вызове из другого приложения таким кодом:
Intent intent = new Intent(); intent.setAction("com.example.andrey.myapplication.TEST"); sendBroadcast(intent);


Ответ

Я думаю ,что проблема в заглавных буквах. action name на самом деле должен выглядеть, как
android.intent.action.BOOT_COMPLETED

Как настроить кеш браузера для статики и медиа в Django

Подскажите пожалуйста, как настроить кеш браузера для статики и медиа в Django

вот справка гугла.. developers.google.com/speed/docs/insights/LeverageBrowserCaching
Я настроил кэширование фаловой системе по мануалу djbook.ru/rel1.8/topics/cache.html#filesystem-caching
т.е. добавил в настройки
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', 'LOCATION': '/var/tmp/django_cache', } }
и
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware', .... 'django.middleware.cache.FetchFromCacheMiddleware', )
При загрузке страниц появился Expires в заголовке.
Но вот как сделать чтобы оно было для файлов из статики и из media, непонятно..


Ответ

Django не должен отвечать за установку хедеров статики. За это должен отвечать сервер который будет её обслуживать, например Nginx или Apache.
На локальной машине вашу ститику обслуживает сам django(скорее всего), но как и написано в мануале - это крайне неэффективно с точки зрения производительности.
Для ясности, картина работу выглядит так. Приходит http запрос -> Nginx определяет тип запроса - если статика, то сам её отдает, если нет отдает далее стоящему приложению -> т.к Django общается с сервером по wsgi протоколу то саму django обслуживает (запускает) другое приложение, например uWSGI(uWSGI реализация wsgi протокола) -> запрос приходит в саму django. Ответ уходит по цепочке вверх. Теперь становится понятно почему это так неэффективно и почему django не должен этим заниматься.
Почитайте документацию Django Managing static files
Определитесь с тем - кто будет обслуживать статику на боевом сервере, и читайте в этом направлении.
Например настройка Nginx

Что делать с файлом имяпроекта.v12.suo GIT

У меня есть проект, я его закомитил и создал новую ветку потом поработал в ней и закомитил ещё раз чтоб вернуться в основную ветку. Потом вернулся в основную ветку, в VS попросило нажать reload я жму, и потом пишу git status. Мне показывает что мой файл имяпроекта.v12.suo modified. Тоже самое происходит когда я возвращаюсь обратно в новую ветку, опять имяпроекта.v12.suo modified, тоесть чтоб переключаться между ветками мне приходится дополнять коммит git commit --amend. Что с этим делать?


Ответ

Добавьте *.suo в .gitignore
Файлы .suo содержат состояние открытых панелей Visual Studio и тому подобные вещи, интересные только на локальной машине. В репозитории им не место.

Вот большой список того, что должно быть в .gitignore для проектов под Visual Studio: https://www.gitignore.io/api/visualstudio

Android Studio - Что за красный прямоугольник?

Выводится такой красный прямоугольник когда вывожу строки в Resources. strings.xml c с комбинацией ALT+ENTER , как только появляется этот прямоугольник комбинация ALT+ENTER не работает! Приходится закрывать окно и заново открывать после чего комбинация работает , до следушего появления прямоугольника, что обычно происходит после перврго или второго вывода строки в strings.xml


Ответ

В моем случае данных прямоугольник появляться после дублирования строки. Создается новая строка кода и текст который выделен красным можно редактировать. Если нажать Enter то текст перестает подсвечивать.

Использование “красивых” стилей элементов окна

Пытаюсь в окне сделать кнопку.
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HFONT hFont; HWND hButton; switch(message) { case WM_CREATE: hButton = CreateWindow("button", "Press me!", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 5, 5, 100, 100, hWnd, (HMENU)(1), (HINSTANCE)GetWindowLong(hWnd, -6), NULL); hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); SendMessage(hButton, WM_SETFONT, (WPARAM)hFont, 1); return 0 ; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, message, wParam, lParam) ; }
Получается такая:

А как сделать кнопку, по стилю как в остальных приложениях (такую, например: ). Система Windows 7, компилятор gcc.exe (tdm64-1) 5.1.0.


Ответ

Действительно, как сказал Abyx, надо было добавить манифест (я надеялся, что есть путь проще). В итоге порядок действий:
Создать файл Application.manifest (например в директории с main.c):
Just button. Создать файл ресурсов resources.rc в той же директории, что и манифест, в которой будет одна строка:
1 24 "Application.manifest" Далее нужно скомпилировать файл ресурсов (выполнить команду в командной строке):
windres resources.rc -o resources.o Нужно добавить некоторый код в main.cpp
#define _WIN32_WINNT 0x0600 //для запуска нужна система Vista или новее #include #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { INITCOMMONCONTROLSEX icex; icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_STANDARD_CLASSES; InitCommonControlsEx(&icex); /* Далее код создания окна и все остальное */ } Ну и теперь нужно непосредственно скомпилировать программу (естественно надо не забыть про библиотеку):
g++ -o program.exe main.cpp resources.o -lcomctl32 -mwindows

Java - эмуляция ввода

Можно ли в Java юзать эмуляцию клавиатуры, и как это сделать ? С помощью Robot я разобрался только как вводить единичные символы - т.е. по одному. Пытаясь сделать это в цикле - как-то так:
for(char ch:str.toCharArray()){ robot.keyPress((int)ch); robot.keyRelease((int)ch); }
выходит какая-то ересь. Есть ли какой-нибудь метод, типа someMethod("text"), которой отправляет в текстбокс переданную ему аргументом строку ? Если кто-то подскажет java api для Sikuli - тоже буду рад ответу.


Ответ

Сделал так, оказывается, все просто: после того, как курсор оказался в поле для ввода, нужно просто вызвать метод type для объекта Screen и передать ему аргументом нужную строку. И все работает. [sikuli api for java]
UPD_0:
public class GITest { private Screen _screen; ....... private static final String _user = "user_139"; ....... } private void setPersonalData(){ try{ // сейчас курсор окажется в текстбоксе _screen.click("img/004.png"); // следующая операция - ввод _screen.type(_user); ........ } catch (FindFailed | InterruptedException ex){ _rbuffer.append("One of searching element not find.
"); writeLogBufferToFile(); System.exit(-1); } }

Эффект покачивания

Как сделать эффект покачивания на jquery или css как здесь при наведении на опцию http://www.bestprogramminglanguagefor.me/q ?


Ответ

*{ padding: 0; margin: 0; } .block{ position: relative; } .circle{ width: 100px; height: 100px; background: #ccc; border-radius: 50%; margin: 0; position: absolute; top: 0; left: 50%; margin-left: -50px; } .block:hover .circle{ position: absolute; top: 0; -webkit-animation: anim 4s infinite; animation: anim 4s infinite; } @-webkit-keyframes anim { 0% { top: 0; left: 50%; } 50% { top: 40px; left: 50%;} 100% { top: 0; left: 50%;} } @keyframes anim { 0% { top: 0; left: 50%; } 50% { top: 40px; left: 50%;} 100% { top: 0; left: 50%;} }


Как упростить код Jquery

Народ, посоветуйте плиз как можно упростить следующий код, сделать его красивым.
$(".qq_80").text("Минимальное количество символов 40. Вы ввели "+count_letters).slideDown(function(){ var t=this; setTimeout(function(){ $(t).slideUp(); }, 3000) });


Ответ

Выстроить в цепочку вызовов в стиле jQuery. Для задержки дальнейшего выполнения вместо setTimeout() можно использовать родной .delay() от jQuery:
var $el = $(".qq_80") ,count_letters = 12 ,txt = "Минимальное количество символов 40. Вы ввели " + count_letters ; $el.text(txt).hide().slideDown().delay(3e3).slideUp();

Ololo

Наследование с вложенными классами

class SinglyLinkedList extends AbstractList { protected Node first; protected Node last; protected int size;
static class Node { Node next; Object val;
Node(Node next, Object val) { this.next = next; this.val = val; }
Node() { this.next = null; this.val = null; } }
Я собираюсь от односвязного списка унаследовать двусвязный список, при этом в вложенном классе, который будет находиться в DoublyLinkedList должно быть ещё одно поле и соответственно конструктор.
public class DoublyLinkedList extends SinglyLinkedList { static class Node extends SinglyLinkedList.Node { Node prev;
Node(Node next, Object val, Node prev) { super(next, val); this.prev = prev; } }
Уверен, что делаю это не правильно.


Ответ

Правильно будет вынести общую логику списков в абстрактный класс и унаследовать от него оба списка. Если Node хранит только состояние, то пусть он будет отличаться в реализациях списка. Либо его можно вынести в protected / package-private классы, для того чтобы была видимость только внутри пакета.
Статические внутренние классы не нарушают SOLID, с их помощью обычно выполняют логическую группировку сущностей внутри класса. В вашем случае плохо то, что вы усложняете дизайн, что сопряжено в последующей тестируемостью и расширяемостью кода, не извлекая при этом никакой практической пользы.
Примеры из JDK:
AbstractSequentialList LinkedList

Как правильно включить сжатие файлов?

Как правильно настроить gzip в Apache?
Для чего нужна эта конструкция - IfModule mod_deflate.c? Что выполняет этот пункт - BrowserMatch?
Настройка в .htaccess

Так?
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4.0[678] no-gzip BrowserMatch bMSIE !no-gzip !gzip-only-text/html
или просто так?
AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript


Ответ

Для чего нужна эта конструкция - IfModule mod_deflate.c?
Проверяет, активирован ли необходимый модуль mod_deflate
Что выполняет этот пункт - BrowserMatch
Позволяет задать поведение на основе заголовка user-agent. Используется для установки env-переменных, которые использует Apache.
Как правильно прописать настройки?
Использовать комбинацию из двух процитированных вариантов. Раз уж в первом варианте делается проверка одного из используемых модулей, пусть делается проверка и для второго.
AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE application/rss+xml AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE application/x-javascript BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
Данный фрагмент файла .htaccess проверяет наличие модуля mod_deflate и, если он доступен, включает сжатие для перечисленных типов файлов. После этого идет проверка наличие модуля mod_setenvif и, если он доступен, изменяются параметры сжатия для некоторых браузеров, которые некорректно обрабатывают сжатые файлы.

Как получить координаты центра отображаемой Google-карты?

При загрузке страницы на карте после определения геолокации (html5) появляется маркер.
Задача: после того, как он появился, при перетягивании карты он должен постоянно быть в центре (т.е. карта перетаскивается, а этот маркер всё время остаётся в центре).


Ответ

Вы можете вызвать: map.getCenter()это вернет вам объект содержаний Lon,Lat.
А вот так можно получить координаты по нажатию правой кнопки мыши:
google.maps.event.addListener(map, "rightclick", function(event) { var lat = event.latLng.lat(); var lng = event.latLng.lng(); ... });

Приложение не запускается

Уже 3 дня мучаюсь... Я создавал табы отдельно и recyclerView отдельно, теперь обьединил. Запускаю не запускается Unfortunately!!! В чем может быть проблема?
MainActivity:
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar; private TabLayout tabLayout; private ViewPager viewPager;
private int[] tabIcons = { R.drawable.ic_action_person, R.drawable.ic_action_group, R.drawable.ic_action_call };
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
viewPager = (ViewPager) findViewById(R.id.viewpager); setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tablayout); tabLayout.setupWithViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) { ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); adapter.addFragment(new TabOneFragment(), "One"); adapter.addFragment(new TabTwoFragment(), "Two"); adapter.addFragment(new TabThreeFragment(), "Three"); viewPager.setAdapter(adapter);
} }
TabOneFragment:
public class TabOneFragment extends Fragment {
private RecyclerView recyclerview;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_one_fragment, container, false);
recyclerview = (RecyclerView)view.findViewById(R.id.recyclerview); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); recyclerview.setLayoutManager(layoutManager);
return view; }
@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState);
ArrayList items = new ArrayList<>();
RVAdapter adapter = new RVAdapter(items); recyclerview.setAdapter(adapter);
}
}
RVAdapter:
public class RVAdapter extends RecyclerView.Adapter {
private List mItems;
public RVAdapter(List mItems) { this.mItems = mItems;
}
public class ItemViewHolder extends RecyclerView.ViewHolder {
TextView departCode; TextView departTime; TextView departDate; TextView arriveCode; TextView arriveTime; TextView arriveDate; TextView flyTime; Button ticketPrice; ImageView airlineLogo;
public ItemViewHolder(View itemView) { super(itemView);
departCode = (TextView) itemView.findViewById(R.id.tvAirCodeDepart); departTime = (TextView) itemView.findViewById(R.id.tvDepartTime); departDate = (TextView) itemView.findViewById(R.id.tvDepartDate); arriveCode = (TextView) itemView.findViewById(R.id.tvCodeArrive); arriveTime = (TextView) itemView.findViewById(R.id.tvArriveTime); arriveDate = (TextView) itemView.findViewById(R.id.tvArriveDate); flyTime = (TextView) itemView.findViewById(R.id.tvTime); ticketPrice = (Button) itemView.findViewById(R.id.btnTickPrice); airlineLogo = (ImageView) itemView.findViewById(R.id.ivAirlineLogo); } }
@Override public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) {
itemViewHolder.departCode.setText(mItems.get(i).getDepartCode()); itemViewHolder.departTime.setText(mItems.get(i).getDepartTime()); itemViewHolder.departDate.setText(mItems.get(i).getDepartDate()); itemViewHolder.arriveCode.setText(mItems.get(i).getArriveCode()); itemViewHolder.arriveTime.setText(mItems.get(i).getArriveTime()); itemViewHolder.arriveDate.setText(mItems.get(i).getArriveDate()); itemViewHolder.flyTime.setText(mItems.get(i).getFlyTime()); itemViewHolder.ticketPrice.setText(mItems.get(i).getTicketPrice()); itemViewHolder.airlineLogo.setImageResource(mItems.get(i).getAirlineLogo()); }
@Override public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, viewGroup, false); return new ItemViewHolder(view); }
@Override public int getItemCount() { return mItems.size(); } }
TicketsObjects
public class TicketObjects {
private String departCode; private String departTime; private String departDate; private String arriveCode; private String arriveTime; private String arriveDate; private String flyTime; private String ticketPrice; private int airlineLogo;
public TicketObjects(String departCode, String departTime, String departDate, String arriveCode, String arriveTime, String arriveDate, String flyTime, String ticketPrice, int airlineLogo) {
this.departCode = departCode; this.departTime = departTime; this.departDate = departDate; this.arriveCode = arriveCode; this.arriveTime = arriveTime; this.arriveDate = arriveDate; this.flyTime = flyTime; this.ticketPrice = ticketPrice; this.airlineLogo = airlineLogo; }
public String getDepartCode(){ return departCode; }
public void setDepartCode(String departCode){ this.departCode = departCode; }
public String getDepartTime(){ return departTime; }
public void setDepartTime(String departTime){ this.departTime = departTime; }
public String getDepartDate(){ return departDate; }
public void setDepartDate(String departDate){ this.departDate = departDate; }
public String getArriveCode(){ return arriveCode; }
public void setArriveCode(String arriveCode){ this.arriveCode = arriveCode; }
public String getArriveTime(){ return arriveTime; }
public void setArriveTime(String arriveTime){ this.arriveTime = arriveTime; }
public String getArriveDate(){ return arriveDate; }
public void setArriveDate(String arriveDate){ this.arriveDate = arriveDate; }
public String getFlyTime(){ return flyTime; }
public void setFlyTime(String flyTime){ this.flyTime = flyTime; }
public String getTicketPrice(){ return ticketPrice; }
public void setTicketPrice(String ticketPrice){ this.ticketPrice = ticketPrice; }
public int getAirlineLogo(){ return airlineLogo; }
public void setAirlineLogo(int airlineLogo){ this.airlineLogo = airlineLogo; }
}
Error:
.recyclerview.MainActivity}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.


Ответ

Нашел ответ, твой ответ оказывается был близок...

Используются ли в современных веб-проектах Basic и Digest аутентификации?

Я в них не сильно разбираюсь, поэтому мое мало информированное мнение пока стоит на позиции, что они почти никогда не пригодятся, и если нужно будет создавать легкий или средний веб-проект, то алгоритм аутентификации и авторизации пользователей и админов будет целиком на плечах веб-разработчика, и скорее всего так все делают?


Ответ

Для начала, давайте разберемся как работают перечисленные вами механизмы аутентификации.
При HTTP Basic аутентификации вместе с каждым HTTP запросом вместе с заголовками передается связка логин/пароль, которые позволяют однозначно аутентифицировать пользователя.
HTTP Digest аутентификация похожа на HTTP Basic, но вместо связки логин/пароль передается контрольная сумма, вычисленная на основе параметров запроса (метода, URI, иногда тела запроса), логина, пароля и, возможно, еще нескольких дополнительных параметров. (Часто используется уникальный для каждого запроса параметр nonce, препятствующий выполнению атаки на повторение запросов.)
Если говорить о других типах аутентификации, то чаще всего web-приложения используют аутентификацию на базе Cookie. Пользователь передает логин/пароль на сервер, сервер проверяет эти данные и в случае успеха отдает пользователю заголовок Set-Cookie с идентификатором пользовательского сеанса. При всех последующих запросах пользователь передает посредством Cookie этот идентификатор, который и используется для аутентификации.
Принципиальная разница между первыми двумя методами и последним заключается в том, что для механизмов HTTP Basic и HTTP Digest серверу не нужно хранить сессионные данные пользователей (идентификатор пользовательской сессии). При таком подходе, каждый HTTP запрос содержит всю необходимую для построения ответа информацию и может быть изолирован от предыдущих/последующих запросов.
Идея сервера, не хранящего состояние пользовательских сессий лежит в основе довольно популярного RESTful подхода. Этот подход часто используется для построения серверного API.
И да, говорить, что HTTP Basic/Digest не используется в современных web-проектах -- неверно. Тут все зависит от сложности, целей и задач проекта.
Замечание:
Важно понимать разницу между аутентификацией и авторизацией
Под аутентификацией обычно понимают процесс определения того, что пользователь является именно тем, кем он представился. Под авторизацией обычно понимают проверку полномочий конкретного, уже аутентифицированного, пользователя на выполнение некоторых действий в системе.
Выше были указаны только методы аутентификации. Построение правильного механизма авторизации пользователей все равно лежит на плечах разработчика.