Страницы

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

воскресенье, 12 мая 2019 г.

После загрузки данных Ajax'ом отображает только последнее значение

Есть таблица, в ней много ячеек. Хочу Ajax'ом лениво выдергивать значения из базы и по готовности вставлять.
При первом обходе и рисовании таблицы на PHP собираю массив ID для дальнейшей отправки Ajax'ом.
Но отображаются данные только в последней ячейке:
$(document).ready(function() { //console.log(array); var path = ''; //путь к контролеру for (var i = 0; i < array.length; i++) { var elem = array[i]; var url = path + "ajaxAll?val=" + encodeURIComponent(elem); console.log(elem, url); $.ajax({ type: "POST", url: url, dataType: "json", success: function(data) { //alert ($id); document.getElementById(elem).innerHTML = data; //запись в ячейку } }) // document.getElementById(elem).innerHTML = elem; //так нормально пишет в нужную ячейку }

пример array
["37_2015-06-1_1_2", "38_2015-06-1_1_2", "39_2015-06-1_1_2", "58_2015-06-1_1_2", "62_2015-06-1_1_2", "66_2015-06-1_1_2", "37_2015-06-2_1_2", "38_2015-06-2_1_2", "39_2015-06-2_1_2"]
то есть ид все есть. да и document.getElementById(elem).innerHTML = elem; нормально данные вставляет
innerHTML += записал все ответы в одну последнюю ячейку. то есть ajax запрос идет, а вот ид он берет последний


Ответ

Хотите я Вам фокус покажу?
for (var i = 0; i < 10; i++) { var elem = i; window.setTimeout(function(){ console.log(elem) },1000); }
Вы думаете данный код вернет последовательность от 0 до 9? А вот и не угадали, он вернет Вам десять раз девятку. точно так же, как ваш код вставит все данные в только в конечный elem, а не по последовательности. Это связанно с областями видимости, да данный момент возникает замыкание на внешний контекст.
Спасибо @Regent за подсказку, код можно изменить так, обернув функцию и разорвав замыкание:
success: (function (elem){ return function(data) { document.getElementById(elem).innerHTML = data; }})(elem)

Поиск в истории в сеансе PowerShell

В линуксовых терминалах есть поиск по истории, вызываемый нажатием Сtrl+R. Существует ли аналог в PowerShell?


Ответ

Есть, вызывается тем же самым Сtrl+R

Поиск вперед по истории - Сtrl+S
У меня 10-ка, не уверен, есть ли этот функционал в более старых версиях. Но его точно можно доставить через
Install-Module PSReadline
вместе с подстветкой и другими плюшками: The Search for a Better PowerShell Console Experience
UP: Install-Module - это сниппет из PsGet
(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex

Как заблокировать ip диапазон посредством iptables?

Я хотел бы заблокировать исходящий трафик на все ip-адреса, начинающиеся на 115.
Нужно заблокировать все ip вида:
115.*.*.*
Debian 6.0
Как это можно сделать?


Ответ

Заблокировать и сохранить:
sudo iptables -A OUTPUT -d 115.0.0.0/8 -j DROP sudo iptables-save > /etc/iptables/rules.v4
Потом восстановить из сохраненного, если понадобится:
sudo iptables-restore < /etc/iptables/rules.v4
Для Debian начиная с 6.0 есть утилита автозагрузки сохраненных правил "iptables-persistent". Её достаточно установить:
sudo apt-get install iptables-persistent
Warning Играя с iptables вы легко можете потерять доступ к серверу. Даже когда, казалось бы, «что может пойти не так?!» – ошибки совершаются. Наступал на эти грабли n раз. Поэтому не рвите SSH сеанс с сервером, пока не убедитесь, что всё ещё можете до него достучаться хотя бы по SSH в новом параллельном сеансе.

Отфильтровать по диапазону дат из связаной таблицы

Задача:
Есть 2 таблицы: Марка автомобиля и Модель автомобиля
class Manufacturer(models.Model): title = models.CharField(_("Full name"), max_length=255, blank=True)
class CarModel(models.Model): manufacturer = models.ForeignKey(Manufacturer, on_delete=models.PROTECT, related_name="models_car") production_start = models.DateField(null=True, blank=True) production_end = models.DateField(null=True, blank=True)
Для каждой модели авто есть год начала и окончания выпуска (конец не для всех есть).
От пользователя приходит год.
Необходимо вернуть марки автомобилей для которых есть хотя бы одна модель с годом выпуска, полученным от пользователя.

Т.е. по сути необходима функция которая на вход получает число, а на выходе отдает QuerySet из Manufacturer.

Пример:
Manufacturer: id title =========== 1 Audi 2 BMW
Model: mfa_id start end ========================= 1 1932 1960 1 1980 2001 2 1977 2014 2 2004 ----
От пользователя приходит год = 1954
Нужно вернуть только Audi, тк у BMW нет модели 1954 года выпуска.


Ответ

Сделал так:
def get_mfa(year): year = date(int(year), 1, 1) cm = CarModel.objects.filter(Q(production_end__gte=d) | Q(production_end=None), production_start__lte=d)
return Manufacturer.objects.filter(models_car__in=cm).distinct()

Составить правильную структуру БД на mySQL?

Есть проект, нужно создать интернет магазин с фильтром товаров. Пример можно посмотреть тут!. Справа видна фильтрация.
Есть некоторые догадки какую структуру сделать:
1) У каждой категории будут свои атрибуты по выборке товаров. т.е. атрибуты привязаны к категории а не к товарам.
2) Каждый товар привязан к одной конкретной категории (телевизор к телевизору, ноутбук к ноутбуку)
3) Когда добавляется товар, он будет выбирать категорию к которой хочет привязать его, а так как атрибуты привязаны к категории, то при добавлении мы показываем какие атрибуты показывать.
4) Значение атрибут мы будем хранить в отдельной таблице.
Вот как то так, ниже видно схему как я очертил ее.
Какие недочеты вы видите в этой работе, и вообще в нужном ли я направлении мыслю? Может быть не париться, а просто создавать для каждой категории таблицу с атрибутами. Если вы хотите дополнить мою карикатуру ссылка на схему тут.


Ответ

У меня реализована похожая схема. В принципе путь правильный, однако я бы предложил рассмотреть пару вариантов, которые Ваша схема не учитывает.
Скорее всего будут аттрибуты, которые одинаковы по своим параметрам для разных категорий. Например: все товары имеют размеры (ширина, высота, длина). Если Ваш магазин продает товары одной направленности (скажем, только электронику), тогда имеет смысл сделать аттрибут Brand (марка). Эти аттрибуты по своим свойствам одинаковы для всех товаров. Не важно холодильник это, или телевизор. Следуя созданной Вами структуре, для каждой категории придется создавать каждый из этих аттрибутов отдельно, что "не есть хорошо" :) Решения вижу два: 1.1 В таблице attr изменить id_category на varchar и хранить id категорий разделенные запятыми. Выборку можно делать с использование FIND_IN_SET(). Да, я знаю, что это не лучший вариант, но для маленьких магазинов сойдет. 1.2 Создать промежуточную таблицу attVsCategory, в которой хранить какой аттрибут к какой категории относится. Аттрибуты могут быть разного типа. Используя мой пример выше: размеры будут представлять из себя текстовое поле, а вот brand лучше сделать выпадающим списком. Для поддержки этого варианта нужно будет 2.1 создать таблицу типа attr_values_list, где хранить варианты аттрибутов, представленных выпадающим списком, или checkbox, или radio (короче аттрибуты с фиксированными вариантами ответов) 2.2 добавить в attr_value текстовое поле, и в нем хранить либо текстовое значение (для текстовых аттрибутов), либо id из вновь созданной таблицы attr_values_list
Думаю, что сделав продуманную Вами структуру, и добавив туда указанные выше пункты, вы покроете максимум возможных вариантов описания товаров. И это, вобщем-то, будет работать для магазинов абсолютно любой индустрии.
Удачи

gcc линковщик выдаёт undefined reference to 'sin'

Компилирую следующий код:
#include #include #include
double f(double x) { return sin(x); }
int main(int argc, char** argv) { return 0; }
Вылезает ошибка линковщика:
/tmp/ccWto7Ot.o: In function f': temp.c:(.text+0x13): undefined reference tosin' collect2: ld returned 1 exit status
Никак не могу понять где я накосячил. Перебрал весь код, приведённый пример является минимальным для воспроизведения ошибки. Компилирую без опций, т.е. просто
gcc test.c


Ответ

Компилирую без опций, т.е. просто
$ gcc test.c
а надо как минимум подключить библиотеку libm.so, для чего следует указать опцию -lm
$ gcc -lm test.c
или, например, так:
$ make test CFLAGS=-lm

Как отловить exception если он обработан внутри и не пробрасывается? (Java)

Суть проблемы следующая:
Есть класс, с большим количеством разных методов, с большим количеством вложенностей (которые тоже полны методов). Многие из них могут вызвать эксепшены. Эксепшены не пробрасываются, почти всегда обрабатываются на месте (выше обозначенного класса практически ни один не выбрасывает).
Как с минимальным вмешательством в код выловить информацию о всех исключениях (вместе со стеком)? Возможно обернуть в другой класс? Если да, то как сделать что бы гарантированно я мог узнать о всех эксепшенах?


Ответ

Если нет возможности изменить исходный код или это очень сложно, то можно использовать модификацию байткода (bytecode instrumentation).
Например с помощью библиотеки ASM и метода MethodVisitor.visitTryCatchBlock найти все блоки try\catch и модифицировать их таким образом, чтобы все исключения перед обработкой сохранялись в некоторую структуру данных или выводились в лог.

Вычисление пропорций цветов

Дано: 4 RGB цвета - A,B,C,D Цвет D получен в результате смешивания A,B,C.
Вопрос: как получить пропорцию выбранного нами цвета(например А) в результирующем D?
Моя попытка решить:
Преобразуем A,B,C,D в CIELAB для использования результата в виде Vector3. Строим треугольник где A,B,C вершины, D - центр масс(предположительно) Из D строим перпендикуляры к AB и AC и получаем четырехугольник, который представляет собой площадь, которая является пропорцией искомого цвета.(предположительно) Считаем площадь треугольника, и вычисляем отношение с результатом из пункта 3.
У меня затык в пункте 3, туго с математикой. Прошу помочь с алгоритмом(С++). Так же возможно мой ход мыслей не правильный, в таком случае прошу представить ваш вариант решения данной задачи.
PS: CIELAB вполне ок, в задаче с 2-мя цветами результат отвечает ожиданиям.
Для лучшего понимания проблемы прикладываю пикчи:
Это слой, который содержит так называемые цветовые идентификаторы объекта(colorId), этим цветом заливается объект целиком.
Этот слой содержит сглаживание:

Нужно получить:
Поясню почему так. В данном случае объекты которые имеют зеленый и коричневый colorId выбраны, и их нужно отобразить. Причем мне нужно выделить их так на маске, что бы граница не была резкой. Для вычисления границ используются данные из слоев colorId и colorId + AA. В случаях когда рядом с пикселем граничат лишь 2 colorId, проблем с расчетом пропорций нет. Проблема когда 2+.
Варианты с блюрами\и различными сглаживаниями не катят. Нужно повторить 1 в 1 то что изображено на 3-й картинке, т.к. данный продукт используется в графике.


Ответ

А почему бы не взять просто средневзвешенное?
result.r = (A.R * weight_A + B.R * weight_B + C.R * weight_C) / (weight_A + weight_B + weight_C);
и т. д.

По результатам дискуссии в чате, выяснилось следующее.
При сглаживании цветов цвет резцльтирующего пикселя будет (приближённо) оцениваться как средневзвешенное цветов исходных пикселей с некоторыми весовыми коэффициентами. Задача состоит в том, чтобы найти эти самые весовые коэффициенты. Причём под значением пикселя подразумевается его координаты в цветовом пространстве LAB (как ни странно, это имеет определённый физический смысл).
Итак, вычисление. Пусть компоненты цветов A, B, C в цветовой модели LAB равны (x₁, y₁, z₁), (x₂, y₂, z₂), (x₃, y₃, z₃) соответственно, а компоненты результирующего цвета D — (x, y, z). Пусть неизвестные весовые коэффициенты равны α, β, γ. Имеем:
α ⋅ (x₁, y₁, z₁) + β ⋅ (x₂, y₂, z₂) + γ ⋅ (x₃, y₃, z₃) = (x, y, z)
Поскольку суммарный вес должен равняться 1, то α + β + γ = 1. Получаем систему
α ⋅ x₁ + β ⋅ x₂ + γ ⋅ x₃ = x α ⋅ y₁ + β ⋅ y₂ + γ ⋅ y₃ = y α ⋅ z₁ + β ⋅ z₂ + γ ⋅ z₃ = z α + β + γ = 1
Поскольку точки должны лежать в одной плоскости, третье уравнение обязано быть следствием первых двух, убираем его. Заменяем γ = 1 − α − β, получаем:
α ⋅ x₁ + β ⋅ x₂ + (1 − α − β) ⋅ x₃ = x α ⋅ y₁ + β ⋅ y₂ + (1 − α − β) ⋅ y₃ = y
или
α ⋅ (x₁ − x₃) + β ⋅ (x₂ − x₃) = x − x₃ α ⋅ (y₁ − y₃) + β ⋅ (y₂ − y₃) = y − y₃
Это система линейных уравнений с двумя неизвестными, решаем её стандартным образом.

Получение FAT32 свойств файла

Я хочу получить FAT32 свойства некоторого файла. Я уже разобрался как FAT32 хранит их и написал структуру для их хранения. Но возник вопрос: как их получить?
Сначала я хотел сделать так:
FILE* in = fopen("H:\\test.txt", "rb");
Но fopen() лишает нас этой информации.
Можно ли каким-либо образом получить FAT32 свойства файла?


Ответ

С++ абстрагирует от вас свойства файловой системы, так что вам придётся пользоваться системно-специфическими функциями.
Для Windows информация, которая вам нужна, находится в структуре WIN32_FIND_DATA. Её можно получить, например, при помощи FindFirstFile
Код из MSDN:
#include
WIN32_FIND_DATA FindFileData; HANDLE hFind = FindFirstFile(filename, &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { // обработать ошибку return; } else { // можно пользоваться
// не забудьте в конце: FindClose(hFind); }
Для Linux-платформы аналогичную информацию выдаёт функция stat (2)
#include #include
struct stat sb; if (stat(argv[1], &sb) == -1) { // обработать ошибку return; } else { // можно пользоваться }

Запуск приложения с помощью собственного протокола

На сетевом диске лежит приложение abc.exe. Как написать протокол, чтобы такая команда abc:\\param запускала это приложение с параметром param? Как пишется протокол? Все ли пользователи, имеющие доступ к шаре смогут использовать такой протокол или требуется на каждой машине требуется выполнить еще что-то?


Ответ

Протокол прописывается в реестре Windows.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\yourprotocolname] @="URL:Direct Connect Protocol" "URL Protocol"=""
[HKEY_CLASSES_ROOT\yourprotocolname\Shell\Open\Command] @="cmd /c echo %1 & pause"
Обращаю внимание, что в браузере можно создавать ссылки на такой протокол. И таким ссылкам можно настроить автоматическое выполнение без запроса.
Поэтому очень важно отнестись к обработке передаваемых параметров внимательно. Например, определённый выше протокол с именем yourprotocolname представляет собой огромную дыру в безопасности, поскольку можно сделать что-то типа yourprotocolname:text & format d:
PS: Знаю, что в linux'е тоже возможно создавать кастомные протоколы, но не имею ни малейшего представления, как это делать.

Как проверить файл на то, что его содержимым является XML документ?

У меня есть схема, при помощи которой я проверяю переданный документ на валидность. Но если я передаю другой файл, текстовый или картинку, то программа загибается еще на этапе открытия. Как вариант, можно открытие обернуть в Try..catch, но хотелось бы узнать, есть ли иной способ?


Ответ

Оборачивайте открытие в try/catch
Все стандатные способы работы с XML выбрасывают исключения при невалидности (в смысле well-formed) документа. Методов IsWellFormed нет.
Единственное, что можно улучшить (если вы это еще не сделали) - использовать для валидации именно XmlReader c ValidationType = ValidationType.Schema - чтобы избежать потенциальных проблем с огромными документами, которые "биты" в самом конце.

Локализация -Как русифицировать страницы MAN в Linux mint?

Как русифицировать страницы MAN в Linux mint?


Ответ

надеюсь, я правильно понял вопрос, что интересует отображение уже готовых, а не написание новых man-страниц.

man-страницы обычно входят в пакеты с программами.
например, в пакет gnupg входят такие файлы с man-страницами:
$ dpkg -L gnupg | grep 'man.*gz' /usr/share/man/man1/gpg.1.gz /usr/share/man/man1/lspgpot.1.gz /usr/share/man/man1/gpg-zip.1.gz /usr/share/man/man1/gpgsplit.1.gz /usr/share/man/ru/man1/gpg.1.gz /usr/share/man/man7/gnupg.7.gz
если есть соответствующий файл в каталогах /usr/share/man/ru/*/ (ru — это и есть «на русском»), то и man-страницу «по-русски» можно посмотреть.
согласно man man (man-страница о самой программе man), по умолчанию на выбор языка влияет значение переменных окружения LANG, LC_MESSAGES и других, имеющих отношение к локали. (насколько мне известно, список, в порядке приоритета от большего к меньшему — LC_ALL, LANG, LC_MESSAGES, LANGUAGE).
собственно, если у вас правильно настроены эти переменные для отображения русского языка в интерфейсе (посмотреть их все «разом» можно командой locale), то и man-страницы будут отображаться (при наличии) — русскоязычные.
если по каким-то причинам вам не нужна перенастройка локали (или, хотя бы, переопределение какой-нибудь из перечисленных переменных), то вы можете вызвать программу man с опцией -L язык. например:
$ man -L ru man

на всякий случай приведу и примеры с переназначением переменных:
$ LC_ALL=ru_RU.UTF-8 man man $ LANG=ru_RU.UTF-8 man man $ LC_MESSAGES=ru_RU.UTF-8 man man $ LANGUAGE=ru man man
для LANGUAGE имеет смысл указывать именно так — только язык (ru), без территории (RU) и набора символов (UTF-8).

Как узнать, что именно разрешено делать через sudo?

Известно, что *nix-подобных ОС правила для sudo настраиваются в файле /etc/sudoers, но если в нём много разных правил для разных пользователей, особенно если используются алиасы/макросы, как удобно продиагностировать, что же именно разрешено делать через sudo определённому пользователю?


Ответ

Многие не знают, что sudo имеет встроенную возможность для удобной диагностики, для этого служит ключ -l
# sudo -l -U vasya-pupkin
Runas and Command-specific defaults for vasya-pupkin:
User vasya-pupkin may run the following commands on this host: (root) /usr/bin/tailf, /bin/ls, /usr/sbin/tcpdump (asterisk) NOPASSWD: /bin/mv
Если вызывать sudo -l без дополнительных ключей, будут показаны разрешенные в sudoers команды для текущего пользователя. Используя дополнительный ключ -U username можно посмотреть разрешенные команды для любого пользователя в системе (но только если смотрящий - root).
В приведённом примере пользователь vasya-pupkin может запускать tailf, ls и tcpdump от рута, а также от имени пользователя asterisk перемещать файлы (удобно, если нужно предоставить не-рутовому пользователю возможность манипулировать файлами, пренадлежащими третьему пользователю).

Не импортируется TabLayout

При попытке написать:
TabLayout tabLayout = new TabLayout(this);
выскакивает ошибка:
TabLayout cannot be resolved to a type
Что делать?
Вот полный код:
import android.app.ActionBar; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.widget.LinearLayout; import android.widget.TextView;
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity);
LinearLayout v = (LinearLayout)findViewById(R.id.LinearLayout_for_tabs_1);
TabLayout tabLayout = new TabLayout(this); tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
tabLayout.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 50));
v.addView(tabLayout); } }


Ответ

У вас не подключена библиотека support:design
Чтобы подключить библиотеку в Eclipse
Скачайте её через SDK Manager в Eclipse - New->Android_project_from_existing_code Ищем в папке ПУТЬ_К ПАПКЕ_SDK\extras\android\support\design Помечаем библиотекой его Подключаем к основному проекту (Свойства->Android->Libraries->Add)

Сортировка точек ломаной линии на 2D плоскости

Есть массив точек с координатами x, y. Точки разбросаны хаотично, но если соединить каждую из них с ближайшими, то получим ломаную, с началом и концом, пример: Задача: отсортировать точки от начала ломаной к концу (не важно, в каком направлении), либо (приоритетнее) составить массив ребер (с концами в известных вершинах) так же отсортированный по порядку от начала ломаной к концу.
То, что набыдлокодил я в состоянии невменяемости, выкладывать с вашего позволения не стану.
upd: Что я попробовал: перебираю точки в массиве, для выбранной точки (пусть будет 2), ищу двух ближайших соседов, добавляю новые ребра в массив: 2-4 и 2-5. При дальнейшем переборе ребра 4-2 и 5-2 отсеиваются как повторы. Но, для начала, ребер в некоторых случаях получится не 5, а 6-7, например для приведенного рисунка у точки 1 будет так же два ребра: 1-2 и 1-4, что неверно и нужна пост-обработка массива для отсеивания лишних ребер. А потом эти ребра еще и отсортировать нужно, пока не соображу как.


Ответ

Мне алгоритм решения задачи видится следующим образом:
Найти конец ломаной линии. Конечную точку поместить в начало массива. Использовать конечную точку как текущую. Сравнить расстояния от текущей точки до всех остальных и найти ближайшую точку (если есть несколько точек с одинаковым расстоянием, равным минимальному, можно взять любую из них). Переместить ближайшую точку в массиве, в позицию, следующую за текущей. Использовать ближайшую точку как текущую. Повторить пункты 4 - 7 для всех оставшихся точек
На выходе вы получите массив точек удовлетворяющий начальному условию.
UPD:
Поскольку в задаче не сказано, откуда должна начинаться ломаная линия, я бы предложил сначала найти геометрический центр скопления точек и использовать наиболее удаленную от центра точку как конечную.

Запуск одного окна один раз

Как сделать, чтобы нельзя было открыть окно, если оно уже открыто?


Ответ

Очень просто. Создаёте переменную boolean
Boolean WindowOpened = false;
При запросе на открытие окна проверяете, равна ли переменная false, если равна - открываете окно и присваиваете переменной значение true:
if(!WindowOpened){ OpenWindow(); WindowOpened = true; }

Рекурсивный вывод числа наоборот

Есть задача, написать рекурсивную процедуру для вывода на экран цифр натурального числа в обратном порядке. Я её решил, но хочу что бы на выходе из рекурсии получалось целое число. Вот, что я сейчас имею.
public class MyClass { public static int consoleInputFirstNumber() { Scanner scan = new Scanner(System. in ); System.out.print("Enter number: "); if (scan.hasNextInt()) { return scan.nextInt(); } else { System.out.println("Entered not number. Try again."); return consoleInputFirstNumber(); } }
public static void numberReverseOrder(int number) { if (number == 0) { return; } else { System.out.print(number % 10); numberReverseOrder(number / 10); } }
public static void consoleOutput(int result) { System.out.println(result); }
public static void main(String[] args) { int input = consoleInputFirstNumber(); numberReverseOrder(input); } }
Кто знает, что нужно что бы решить мою проблему дайте подсказку или напишите решение. Заранее спасибо.


Ответ

Вообще-то ваша программа вроде как работает. Она только для 0 ничего не выводит, поэтому непонятно, чего вы хотите. Но вот для разнообразия моё решение.
Проще такую задачу решать, преобразовав число в строку и сведя её к выводу перевёрнутой строки. Кроме того я бы разделил преобразование строки к перевёрнутой и собственно вывод. Вот как вашу задачу можно решить рекурсивно:
import java.util.Scanner;
public class RecursiveReverse { public static String reverse(String str) { return str.isEmpty() ? "" : reverse(str.substring(1)) + str.charAt(0); }
public static void main(String[] args) { try (Scanner scan = new Scanner(System.in)) { System.out.print("Enter number: "); System.out.println("Reversed: " + reverse(String.valueOf(scan.nextInt()))); } } }

Как проверить, является ли apache бэкэндом для nginx?

Есть сервер на Ubuntu 14.04.3, и к нему есть доступ по SSH. На сервере установлен nginx/1.4.6 и Apache/2.4.7
Но вот в чем вопрос. Работают ли в паре Nginx+Apache? То есть, является ли nginx «фронтэндом», а apache «бэкэндом»?
Есть ли какая нибудь ssh-команда, которая бы показала это?


Ответ

можно воспользоваться такой командой:
$ sudo lsof -Pn -iTCP -sTCP:LISTEN -c nginx -c apache -c httpd -a
и проанализировать её вывод. пример (реальный сервер, часть строк опущена для наглядности):
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache2 2206 root 3u IPv4 58834967 0t0 TCP 127.0.0.1:8080 (LISTEN) apache2 13377 www-data 3u IPv4 58834967 0t0 TCP 127.0.0.1:8080 (LISTEN) nginx 13289 root 6u IPv4 58829785 0t0 TCP *:80 (LISTEN) nginx 13289 root 7u IPv4 58829786 0t0 TCP *:443 (LISTEN) nginx 13624 www-data 6u IPv4 58829785 0t0 TCP *:80 (LISTEN) nginx 13627 www-data 7u IPv4 58829786 0t0 TCP *:443 (LISTEN)
из него видно, что nginx слушает 80-й и 443-й порты на всех адресах (*:80 и *:443), а apache — лишь порт 8080 и только на адресе 127.0.0.1 (127.0.0.1:8080).
откуда вытекает вполне логичный вывод: nginx слушает внешние обращения и (возможно) передаёт (некоторые из них) apache-у.

«расшифровка» использованных опций программы lsof
-P — отображать номера портов, а не имена, взятые из файла /etc/services -n — отображать ip-адреса, не пытаясь преобразовать их в доменные имена -iTCP -sTCP:LISTEN — отобразить процессы, слушающие tcp-порты -c nginx -c apache -c httpd — отобразить процессы, начинающиеся с этих строк -a — логическое and для параметров (правда, не для всех: в данном случае применяется для «связывания» -iTCP и -c имя). если его опустить, то будут выведены ещё и открытые указанными (с помощью опций -c) процессами файлы (вообще программа lsof в первую очередь для отображения открытых файлов и писалась).

Как обновить ListView из кастомного SimpleCursorAdapter

У меня есть ListView связанный с БД через MySimpleCursorAdapter (extends android.widget.SimpleCursorAdapter) И свой файл разметки, в котором есть кнопка удалить. Я хочу при нажатии на кнопку удалить строку из БД и тут же обновить ListView
Всю логику нажатия на кнопку я реализую в MySimpleCursorAdapter
Как мне обновить ListView находясь в MySimpleCursorAdapter?
public class MySimpleCursorAdapter extends android.support.v4.widget.SimpleCursorAdapter implements View.OnClickListener { ......
public View getView(final int position, View convertView, ViewGroup parent) { ImageView IV_delete = (ImageView) view.findViewById(R.id.item_imageView_delete_note); ..... IV_delete.setOnClickListener(this); }
@Override public void onClick(View v) { ... case R.id.item_imageView_delete_note: Log.d(MainActivity.MY_TAG, "delete" + getItemId(lposition)); MainActivity.db.delete_row(getItemId(lposition)); } }


Ответ

Чтобы обновить список, подключенный к адаптеру на основе CursorAdapter, нужно вызвать метод changeCursor() - он информирует адаптер, что данные в курсоре изменились и нужно перестроить список используя новые данные.
Вызвать данный метод можно непосредственно в любом другом методе или конструктуре класса адаптера:
public class MySimpleCursorAdapter extends android.support.v4.widget.SimpleCursorAdapter implements View.OnClickListener { ......
public View getView(final int position, View convertView, ViewGroup parent) { ImageView IV_delete = (ImageView) view.findViewById(R.id.item_imageView_delete_note); ..... IV_delete.setOnClickListener(this); }
@Override public void onClick(View v) { ... case R.id.item_imageView_delete_note: Log.d(MainActivity.MY_TAG, "delete" + getItemId(lposition)); MainActivity.db.delete_row(getItemId(lposition)); changeCursor(); } }
так и "извне" - обратившись к экземпляру вашего адаптера, подключенного к списку:
MySimpleCursorAdapter myAdapter = new MySimpleCursorAdapter(...); listView.setAdapter(myAdapter); .... myAdapter.changeCursor(); // обновить список

C# Double.Parse вопрос

Есть строка "1.260", с помощью Double.Parse("1.260") получается число double 1.26.
Как сделать так, чтобы после парсинга 0 на конце остался, и мы получили переменную double a = 1.260?


Ответ

Значение 1.260 хранится в памяти как
00111111 11110100 00101000 11110101 11000010 10001111 01011100 00101001
0 на конце существует только в десятичном строковом представлении числа. Собственно, его вы и видите в отладчике. Его же вы видите при выводе, например, на консоль:
Console.WriteLine(1.26); // 1.26
если вам нужно получить ровно 3 символа после точки в строковом представлении - вы должны явно указать это при преобразовании числа обратно в строку:
string stringRepresentation = 1.26.ToString("0.000"); // 1.26 -> "1.260" Console.WriteLine(stringRepresentation);
или
Console.WriteLine("{0:0.000}", 1.26); // 1.260
подробно особенности форматирования чисел расписаны в MSDN, в статье Строки настраиваемых числовых форматов

Объединить два массива, только совпадающие элементы

long[] a = new long[]{45017,96741,11751,23772,58825}; long[] b = new long[]{23772,88781,23777};
Как 2 массива объединить в один, чтобы в новом (третьем) массиве были только совпадающие элементы, в данном случае 23772 ?


Ответ

Как вариант:
private static List asList(long[] array) { List res = new ArrayList<>(array.length); for (long l : array) { res.add(l); } return res; }
public static void main(String[] args) { long[] a = new long[]{45017,96741,11751,23772,58825}; long[] b = new long[]{23772,88781,23777}; List cList = asList(a); cList.retainAll(asList(b));
System.out.println(cList); }

Как нарисовать круг в XML

Как нарисовать незакрашенный круг (желательно с возможностью задавать ширину контура), который будет использоваться в android?
Картинка png страдает качеством, поэтому лучше использовать xml.
И еще он должен быть полностью прозрачным, кроме самой линии контура.


Ответ

По идее как раз таки и надо использовать png. Просто надо грамотно картину разложить по папкам в drawable. Круг в xml нарисовать можно таким образом:

Как получить коллекцию окон под курсором мыши?

Есть WinAPI функция WindowFromPoint. Она возвращает хэндл окна под курсором. А как мне получить все окна под курсором?
На самом деле мне нужно получить второе окно под курсором, но скорее всего решение этой задачи сведется к возврату всех окон и выбору из них второго.
Полагаю, что dotNet не знает, как это сделать, но на всякий случай добавил тег языка, в котором мне это потребовалось, на случай если таки можно обойтись без WinAPI.
UPD:
Написал такую функцию, но она не всегда возвращает правильный результат (часто возвращает не то окно). Посмотрите, что может быть не так. Координаты курсора определяются верно (проверил).
public static Window SecondFromCursor() { var curPos = new System.Drawing.Point(); if (EtherDragDrop.GetCursorPos(ref curPos)) { var wRect = new Int32Rect(); var k = 0; for (IntPtr hWnd = GetTopWindow(IntPtr.Zero); hWnd != IntPtr.Zero; hWnd = GetWindow(hWnd, GW_HWNDNEXT)) { if (GetWindowRect(hWnd, ref wRect)) { if ((curPos.X>wRect.X && curPos.X<(wRect.X+wRect.Width)) && (curPos.Y > wRect.Y && curPos.Y < (wRect.Y + wRect.Height))) { k++; if (k == 2) { //Console.WriteLine($"{hWnd}: ({wRect.X}; {wRect.Y}) ({wRect.Width}; {wRect.Height}). TopHwnd ({GetTopWindow(IntPtr.Zero)})"); var hs = HwndSource.FromHwnd(hWnd); return hs?.RootVisual as Window; } } } }
} return null; }
UPD2:
Вот тестовое использование функции
var wnd = EtherApp.SecondFromCursor(); if (wnd != null) { var cp = new System.Drawing.Point(); GetCursorPos(ref cp); wnd.Title = $"({cp.X}; {cp.Y})"; }
Происходит при перемещении окна (LocationChanged). Так вот, я перемещаю одно окно над другим (этого же приложения). В результате ожидаю, на нижнем окне изменение заголовка на координаты курсора. Окно занимает большую часть экрана. Двигаю в одной его области и меняется его заголовок. Двигаю в другой области, меняется заголовок того окна, которое двигаю (то есть верхнего). Двигаю еще по каким то местам и ничего не меняется. В консоль выводятся при этом неизвестные мне хэндлы (если раскомментировать вывод в рабочей функции). Я не могу найти закономерность.
UPD3:
Еще раз перечитал описание функции GetWindowRect. Она возвращает две координаты точек, а я их использовал как координату левой верхней и размеры. Исправил, но проблему это не решило. Координаты окон вычисляются теперь верно, но почему функция иногда возвращает какие то другие окна или самое верхнее окно (то окно, которое я двигаю), я не понимаю. У нее в логике прописано, что она должна возвращает результат только когда k==2
UPD4:
Когда мне возвращается верхнее окно (которое я перемещаю), его hWnd при этом отличается от того, что получено при помощи GetTopWindow. Получается, что на одно и то же визуальное окно ссылаются разные hWnd? Как так?


Ответ

В консоль выводятся при этом неизвестные мне хэндлы
Многие из этих окон невидимы или размер у них 1х1.
Для того, чтобы получить список всех окон под курсором, надо у WinAPI функции WindowFromPoint получить hwnd, а затем вызывать GetWindow. При этом надо для каждого окна получить его границы, т.е. Rectangle и выбрать только те, окна у которых границы пересекаются с границами окна под курсором мыши.
Ниже пример приложения TEST, в котором выводится список окон под курсором мыши.

// Microsoft (R) Roslyn C# Compiler version 1.1.0.51204 #r "System.Windows.Forms"
using System.Windows.Forms; using System.Runtime.InteropServices; using System.Drawing;
enum Gw : uint { GW_HWNDNEXT = 2, GW_HWNDPREV = 3 } [DllImport("user32.dll", SetLastError = true)] static extern IntPtr GetWindow(IntPtr hWnd, Gw uCmd); [DllImport("user32.dll")] static extern IntPtr WindowFromPoint(System.Drawing.Point p); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] static extern int GetWindowTextLength(IntPtr hWnd); static string GetTitle(IntPtr hwnd) { var sb = new StringBuilder(GetWindowTextLength(hwnd) * 2); GetWindowText(hwnd, sb, sb.Capacity); return sb.ToString(); } [StructLayout(LayoutKind.Sequential)] struct RECT { public int Left; public int Top; public int Right; public int Bottom; } [DllImport("user32.dll", SetLastError = true)] static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect); static Rectangle GetRectangle(IntPtr hwnd) { var r = new RECT(); GetWindowRect(hwnd, out r); return Rectangle.FromLTRB(r.Left, r.Top, r.Right, r.Bottom); } [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool IsWindowVisible(IntPtr hWnd);

static IEnumerable GetWindows(IntPtr hwnd, Gw gw) { for (var h = hwnd; h != IntPtr.Zero; h = GetWindow(h, gw)) yield return h; }
class Info { public Info(IntPtr hwnd) { this.Hwnd = hwnd; } public Rectangle Bounds { get { return GetRectangle(this.Hwnd); } } public IntPtr Hwnd; public string Title { get { return GetTitle(this.Hwnd); } } public bool Visible { get { return IsWindowVisible(this.Hwnd); } } public override string ToString() { return String.Format("{0,15}\t{1,-50}\t{2}", this.Hwnd, this.Bounds, this.Title); } }

var frm = new Form() { Width = 800, Height = 500, TopMost = true, Text = "TEST" }; var rtb = new RichTextBox() { Parent = frm, Dock = DockStyle.Fill, WordWrap = false }; new System.Windows.Forms.Timer() { Interval = 500, Enabled = true } .Tick += (s, e) => { var pos = Cursor.Position; var i = new Info(WindowFromPoint(pos)); var p = GetWindows(i.Hwnd, Gw.GW_HWNDNEXT) .Select(h => new Info(h)) .Where(v => v.Visible && Control.FromHandle(v.Hwnd) != rtb) .Where(v => !v.Bounds.IsEmpty && v.Bounds.IntersectsWith(i.Bounds)); rtb.Text = String.Join("
", p); }; frm.ShowDialog();

Для компиляции кода и запуска приложения, например, в Visual Studio Community 2015 надо открыть View - Other Windows - C# Interactive, скопировать в него код и нажать Enter.
Visual Studio Community 2015 - бесплатная версия, ее можно скачать тут

Как узнать, откуда был инициирован callback?

Есть функция, использующая внутри вызов с асинхронным callback ($.ajax или просто window.setTimeout):
function someFuncton() { window.setTimeout(function() { debugger; }); } function a() { someFuncton(); } function b() { someFuncton(); } b();
В отладчике хрома при этом callstack выглядит как
(anonymous function) (js:15)
Как, при остановке отладчиком на строчке debugger;, узнать, откуда был инициирован callback - из a() или из b()?


Ответ

В стеке вызовов, предварительно установив галочку "Async" - асинхронные вызовы захватываются только когда установлена:

Печать jpg файла в С#

Как из программы написанной на С# напечатать файл с расширением .jpg ?


Ответ

// Путь к изображению. string file = @"C:\1.png";
using(var pd = new System.Drawing.Printing.PrintDocument()) { pd.PrintPage += (o,e) => { var img = System.Drawing.Image.FromFile(file);
e.Graphics.DrawImage(img, new Point(50, 50)); }; pd.Print(); }

Автоматическое растягивание элементов WPF под размер родителя (растягивание внутри ListBox)

Есть ListBox выводящий список заказов

Toolbar + кнопки + стрелка “назад” + менюшка в правом углу - как?

Не могу найти пример как же создать простую активити с toolbar наверху и поместить туда мои кнопки типа обновить, выполнить http запрос и еще парочку каких-нибудь.
То есть, не только стандартные кнопки, но и/или кастомные тоже. И кнопка меню в правом углу. И еще стрелка "Назад" в этом же toolbar
Как сделать это?


Ответ

Вот простые примеры, сейчас появился отдельный компонент toolbar вместо ActionBarActivity теперь AppCompatActivity. Для дополнительных кнопок
http://habrahabr.ru/post/256643/
http://developer.android.com/intl/ru/guide/topics/ui/menus.html

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

Есть код:
const double Pi = 3.14; double a = Pi; double b = Pi;
кода типа:
double x = 3.; double b = (4.0 - x) * Pi;
в программе быть не может, т.е. всегда идет присваивание var = Pi
Корректно ли в этом (и только в этом) случае сравнивать a == b?
Чуть добавлю. Присвение константы в программе может выглядеть примерно так:
double b = some_expression; if (b < Pi + epsilon && Pi - epsilon < b) b = Pi;
И никак иначе.
П.С. Использвание числа, похожего на математическое "пи" - только для примера, к реальности отношения не имеет.
Попробуем сформулировать вопрос более широко. Есть две строки кода, идущие подряд.
double x = some_value; double y = x; // not double y = some_expression_that_equal_to_x;
Типы x, y одинаковые, это важно. Гарантированно ли одинаковое двоичное представление x и y?


Ответ

Ответ на более "широкий" вопрос. Да, одинаковое двоичное представление гарантировано. Без вариантов. В противном случае (помимо просто абсурдности) были бы возможны всякие интересные штуки например, при:
double a = 3.14;
операция
a = a;
меняла бы двоичное представление a

Окно ввода логина/пароля в WPF

В моей программе на WPF я использую библиотеку MahAps.Metro и при запуске программы я хочу отображать диалоговое окно, где можно будет ввести логин/пароль.
Но выдает ошибку System.InvalidOperationException. Не пойму, в чем дело. Может потому что метод, отображающий окно, в конструкторе вызываю?
public MainWindow() // Конструктор { InitializeComponent(); LogIn(); }
private async void LogIn() { LoginDialogData result = await this.ShowLoginAsync("Authentication", "Enter your credentials", new LoginDialogSettings { ColorScheme = this.MetroDialogOptions.ColorScheme, InitialUsername = "MahApps" }); }
У меня есть код, обрабатывающий нажатие кнопки. При нажатии возникает диалоговое окно, где можно вести логин/пароль. Внутри обработчика нажатия на копку все работает, но если этот код скопировать в метод выше, то опять будет та же ошибка...
private async void buttonLogOut_Click(object sender, RoutedEventArgs e) { var title = "Enter your credentials"; var settings = new LoginDialogSettings { ColorScheme = MetroDialogOptions.ColorScheme }; while (true) { var result = await this.ShowLoginAsync("Authentication", title, settings); if (result.Username == "dima" && result.Password == "123456") break; title = "Wrong data, try again"; } }


Ответ

Исходя из сообщения об ошибке, нужно запускать LogIn после загрузки окна:
public MainWindow() // Конструктор { InitializeComponent(); Loaded += (o, args) => LogIn(); }

Почему не обновляется статистика в Google Play Developer Console?

Почему не обновляется статистика в Google Play Developer Console? Опубликовал приложение 29 октября.


Ответ

Постоянные задержки с обновлением данных - норма. Задержки бывают вплоть до нескольких дней. Единственное, что остаётся - ждать.

Можно ли запустить Genymotion и Android Studio на разных машинах?

В целях быстродействия, хотелось бы запустить эмулятор и студию на разных машинах, возможно ли это ?


Ответ

Да возможно. Genymotion все равно работает в виртуальной машине Oracle VM так что ему без разницы, а отладчику надо указать куда коннектиться.
Со стороны студии придется врукопашную запускать ADB с указанием IP адреса где запущен GenyMotion:
adb tcpip 5555 //говорим adb чтобы перешел в режим TCP/IP на порту 5555 adb connect 192.168.X.Y //коннектимся к хосту где запущен эмулятор
По идее должно сработать.

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

Дали тестовое задание : разработать андроид-приложение, которое будет подключаться к новостному ресурсу (ria.ru) и закачивать в кэш оттуда данные. Я относительный новичок в программировании и знаком только с Java SE. Пытался гуглить по направлению веб сервисов для андроид но ничего не смог найти.
Дайте пожалуйста совет, что конкретно нужно искать чтобы наладить такое взаимодействие между приложением и веб ресурсом? Какие технологии можно/нужно для этого использовать?
Спасибо!


Ответ

URL url = new URL("http://ria.ru"); BufferedReader br = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
String tmp; StringBuilder sb = new StringBuilder();
while((tmp = br.readLine()) != null) sb.append(tmp);
String html = sb.toString();
Потом можно с помощью regex вытащить данные из html.

Как отцентрировать изображения Owl Carousel?

Есть карусель с изображениями различного размера. Как их отцентрировать внутри карусели? У меня не получается...
UPD. Отцентрировать и по вертикали, и по горизонтали.
http://jsfiddle.net/8bJUc/524/
$(document).ready(function() { $("#owl-demo").owlCarousel({ navigation: true, pagination: true, lazyLoad: true }); }); @import url('//cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.css'); @import url('//cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.theme.css'); #owl-demo .owl-item > div { padding: 0px 2px; display: table; } #owl-demo .owl-item > div img { display: block; width: 100%; display: table-cell; vertical-align: middle; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; margin-bottom: 4px; }



Ответ

Owl Carousel создаёт дополнительные блоки внутри вашей вёрстки. Поэтому, чтобы правильно добавить CSS свойства, надо работать вот с такой структурой:


То есть, таблицей делаем .owl-wrapper, а ячейками — .owl-item И на все элементы карусель навешивает атрибут style. Например, у блока с классом .owl-wrapper там прописывается display: block;. Поэтому в своих стилях приходится добавить !important Чтобы сработало вертикальное центрирование по ячейкам таблицы, нужно перебить им свойство float Ну а для горизонтального центрирования достаточно text-align: center;
Приятно, что в этом решении высота карусели не скачет, когда самая высокая картинка уезжает за пределы экрана. Проверьте результат:
http://jsfiddle.net/glebkema/yqfwzkL0/
$(document).ready(function() { $("#owl-demo").owlCarousel({ navigation: true, pagination: true, lazyLoad: true }); }); @import url('//cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.carousel.css'); @import url('//cdnjs.cloudflare.com/ajax/libs/owl-carousel/1.3.3/owl.theme.css'); #owl-demo .owl-wrapper { display: table !important; margin-bottom: 4px; padding: 0px 2px; } #owl-demo .owl-item { display: table-cell; float: none; vertical-align: middle; } #owl-demo .owl-item > div { text-align: center; } #owl-demo .owl-item img { -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; }

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

Помогите пожалуйста разобраться с динамической загрузкой классов в java. Как я понимаю, при старте программы загружаются классы из rt.jar, потом загружается главный класс, а все остальные пользовательские классы загружаются по мере необходимости (например класс A загружается только когда в программе создается объект класса A). Первый мой вопрос заключается в следующем: что собственно значит "JVM загружает класс"? Имеется в виду что в этот момент происходит компиляция класса? Так же мне интересно, зачем JVM загружает класс, когда используется его статический метод? Я провел небольшой эксперимент: написал класс, в котором есть один статический метод и несколько нестатических.
public class StExmp { static{ c = 5; } private int a; public int getA() { return a; }
public void setA(int a) { this.a = a; }
public int getB() { return b; }
public void setB(int b) { this.b = b; }
private int b; private static int c;
public StExmp(int a, int b){ this.a = a; this.b = b; c = 5; }
public static void show(){ System.out.println(c); } }
Вызываю статический метод в главном классе StExmp.show();, потом запускаю программу с флагом -verbose:class и вижу что когда программа дошла до вызова этого метода, она загрузила весь класс. А почему нельзя загружать только статические члены класса? Ведь получилось что из-за вызова одного маленького метода пришлось загрузить весь класс, хотя он больше никак и не используется. И главный вопрос: Когда может потребоваться самому загружать классы? Например с помощью ClassLoader.loadClass()? Вот этого я совсем не могу понять. Ведь если мы загружаем какой то класс, значит мы собираемся его как то использовать? Почему тогда нельзя просто использовать его в программе (например, создать объект) JVM же сама его загрузит. А когда это может потребоваться делать методом ClassLoader.loadClass()?


Ответ

Ну и топик. Про загрузку классов можно много чего написать. Тема интересная, правда, уже 100 лет теорией не занимался. В контексте треда, пожалуй, отвечу на вопросы конкретные. Если в чём-то не прав, поправляйте, критика приветствуется.
Первый мой вопрос заключается в следующем: что собственно значит "JVM загружает класс"?
У вас есть скомпилированные байт коды классов, ClassLoader их грузить по мере необходимости.
Зачем нам держать в памяти класс, если он не используется? Класс будет загружен только в момент использования. Точно так же, если на класс не осталось никаких ссылок, то ClassLoader может выгрузить класс из памяти при проходе GC.
Имеется в виду что в этот момент происходит компиляция класса?
Ваши классы уже скомпилированы javac. ClassLoader в память его грузит. Это если в 2-х словах, на самом деле там происходит верификация байт-кода и т.п.
Так же мне интересно, зачем JVM загружает класс, когда используется его статический метод?
Статически метод, константы - это метаданные класса. Не представляю, как их можно загрузить в отрыве без класс.
А почему нельзя загружать только статические члены класса? Ведь получилось что из-за вызова одного маленького метода пришлось загрузить весь класс, хотя он больше никак и не используется.
Предположим, есть у вас:
public class StExmp { public static void show(){ System.out.println(c); } }
Ок, давайте методом рассуждения выведем необходимость грузить класс. Вы хотите, чтобы метод show был загружен без класса. Но ведь в коде вы потом вызываете метод как StExmp.show()? Если класс не загружен, как вы себе представляете вызов метода? Ну хорошо, предположим загрузчик метод добавить в какую-то общую таблицу виртуальных методов. А потом вы создадите класс:
public class StExmp2 { public static void show(){ System.out.println(c); } }
Метод show загрузчик так же добавит его в общую таблицу статических методов? Проблему уже видите? Как потом при вызове StExmp2.show() понять какой из этих методов вызвать?
Когда может потребоваться самому загружать классы? Например с помощью ClassLoader.loadClass()? Вот этого я совсем не могу понять. Ведь если мы загружаем какой то класс, значит мы собираемся его как то использовать? Почему тогда нельзя просто использовать его в программе (например, создать объект) JVM же сама его загрузит. А когда это может потребоваться делать методом ClassLoader.loadClass()?
Например, у вас high-load проект. Приложение должно работать непрерывно. Но вам понадобилось заменить реализацию какого-то метода. Не перезапускать же всё приложение? Если оно стетйтлесс, то ещё ладно, но если там в памяти много данных/кэш и т.п.?
Можно заменить налету. Когда это надо? Ну, скажем, вы хотите поправить какой-то критический баг, оптимизировали метод и т.п.
Тут можно много чего придумать. К примеру у вас игра, в которой есть возможность добавлять кастомных npc. Вы просто пишите новые класс, который в рантайме подтягивается. Или просто неизвестно какой класс будет использоваться в итоге, решение принимаете в рантайме и грузите необходимый класс.
Бывает случаи, когда классы хранятся в базе (да-да, бывает такое). Их иначе и не загрузить вовсе.

Как покрыть тестами конструктор класса в java?

Есть код, который по алгоритму Эвклида находит наибольший общий делитель.
import java.util.Scanner;
/** * Created by user on 24.11.2015. * По данным двум числам 1 public static int Euclid(int a, int b) { //конструктор if (a == 0 || b == 0) { //Рассматривается случай, когда одно из if (a == 0) { //делимых равно нулю return b; } else { return a; } } else { if (a > b) { return Euclid(a % b, b); //рекурсивно вызовется } // алгоритм, если будет остаток от деления большего if (b > a) { // числа на меньшее и наоборот return Euclid(a, b % a); } else return Euclid(a % b, b);
} } public static void main(String[] args) {
Scanner sc1 = new Scanner(System.in); //ввод с клавиатуры Scanner sc2 = new Scanner(System.in); int a = sc1.nextInt(); int b = sc2.nextInt(); System.out.println(Euclid(a,b)); } }
Несмотря на то, что программа работает, я решил по практиковаться на ней в разработке через тестирование.
Пишу тест:
import org.junit.Test;
import static org.junit.Assert.*; public class EuclidTest {
@Test public void testEuclid() throws Exception {
int result = new Euclid(234, 45); //в этой строке ошибка компиляции assertEquals(9, result, 1e-9); } }
В строке, где я объявляю result мне показывает ошибку компиляции.
Когда я переписал класс, заменив конструктор методом с другим названием всё прошло как по маслу. Связи с этим вопросы:
Можно ли покрыть конструктор тестами так, чтобы не вызвать ошибку компиляции? Как это сделать?


Ответ

public static int Euclid(int a, int b) { //конструктор
Дело в том, что это у вас не конструктор, а статический метод, возвращающий int. Конструктор был бы такой (он возвращает объект класса Euclid):
public Euclid(int a, int b) { //конструктор
Вообще, конструктор здесь не нужен никоим образом. Вам не нужно хранить какое-то состояние, так что и объекты создавать незачем.
Переименуйте ваш метод euclid с маленькой буквы, как положено по стандарту именования и пишите вот такой тест:
import org.junit.Test;
import static org.junit.Assert.*; public class EuclidTest {
@Test public void testEuclid() throws Exception { assertEquals(9, euclid(234, 45), 1e-9); } }

Создание ссылок TextView на Android

помогите с созданием ссылок TextView пожалуйста, перепробовал много вариантов никакой не помогает, выходит ошибка java.lang.NullPointerException
пробовал эти варианты:
1) добавить слушателя
texttest.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View view) { Uri adress= Uri.parse("www.google.ru"); Intent browser= new Intent(Intent.ACTION_VIEW, adress); startActivity(browser); }
});
2)
TextView clickableTextLink = (TextView)findViewById(R.id.textView_About); clickableTextLink.setMovementMethod(LinkMovementMethod.getInstance());
3) Этот способ работает, но не получается создать ссылку вида
Google


Ответ

Сложный способ позволяющий не только сделать ссылки кликабельными, но и отловить нажатие на них:
Берём обычный TextView
Создаём класс для обработки нажатий на ссылки в тексте:
public class MakeLinksClicable { private final static String LOG = MakeLinksClicable.class.getSimpleName();
public static class CustomerTextClick extends ClickableSpan { String mUrl;
public CustomerTextClick(String url) { mUrl = url; }
@Override public void onClick(View widget) { //Тут можно как-то обработать нажатие на ссылку //Сейчас же мы просто открываем браузер с ней Log.i(LOG, "url clicked: " + this.mUrl);
Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(mUrl)); widget.getContext().startActivity(i); } }
public static SpannableStringBuilder reformatText(CharSequence text) { int end = text.length(); Spannable sp = (Spannable) text; URLSpan[] urls = sp.getSpans(0, end, URLSpan.class); SpannableStringBuilder style = new SpannableStringBuilder(text); for (URLSpan url : urls) { style.removeSpan(url); MakeLinksClicable.CustomerTextClick click = new MakeLinksClicable.CustomerTextClick(url.getURL()); style.setSpan(click, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }
return style; } } Присваиваиваем TextView текст, указав ему, что он в HTML формате и кликабельный и ловим клики на ссылки с помощью класса из предыдущего пункта:
TextView textView = ... //находим TextView //Экранируем кавычки в атрибуте html тега слэшем: String textWithLink = "Google"; //Указываем с помощью Html.fromHtml, что у нас не просто текст: textView.setText(Html.fromHtml(textWithLink, null, null)); ////Указываем что разрешаем ссылки кликать: textView.setLinksClickable(true); textView.setMovementMethod(LinkMovementMethod.getInstance()); //Научаемся отлавливать клики пропустив текст через наш класс из пред. пункта. CharSequence text = textView.getText(); if (text instanceof Spannable) { textView.setText(MakeLinksClicable.reformatText(text)); }
Итого:
Ссылка в TextView окрасится дефолтным цветом выделения ссылок, а при нажатии на неё в логи выведется адрес и запустится браузер с этой ссылкой.
UPD_0:
Чтобы дополнить вопрос - нажмите "править" - см. скриншот.

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

Объявление двумерного массива java

Друзья, помогите, пожалуйста, с таким вопросом. Встретил такой кусок кода в Java
public String saveComputingResult(int firstNumber, int secondNumber, String operation) { String[][] arr = new String[2][0]; //** arr[0] = new String[1]; //** arr[1] = new String[1]; //** arr[0][0] = getOperation(operation); arr[1][0] = Integer.toString(getComputingResult(firstNumber, secondNumber, operation)); return arr[0][0] + " - " + arr[1][0];
Кто может пояснить выделенные комментарием //** строки? Объявляется двумерный массив типа String, имеет две строки и....0!!! столбцов. Это как? Что это означает? В Шилдте и Эккеле таких примеров нету, есть только примеры где размер массива указывается для первого массива, так как это обязательно, а второй [] просто остается пустым, но что означает если там 0 внутри? И что означают эти строки при этом??
arr[0] = new String[1]; arr[1] = new String[1];


Ответ

Объявляется массив состоящий из двух массивов нулевой длины. То есть каждый элемент массива имеет указатель на физический адрес, где хранится массив нулевой длины.
При объявлении:
String[][] arr = new String[2][];
каждому элементу массива присвоено значение null вместо указателя на адрес, то есть:
arr[0]=null; arr[1]=null;
В вашем же случае:
String[][] arr = new String[2][0];
тоже самое что:
String[][] arr = new String[2][]; arr[0] = new String[0]; arr[1] = new String[0];
Массивы нулевой длины объявлены и хранятся в памяти, а arr[0] и arr[1] присвоены указатели на адреса в памяти.

Как загрузить данные из БД, показывая процесс ProgressDialog'ом

Мне нужно загрузить данные из базы данных в ArrayList, вo втором потоке, сопровождая выгрузку DialogFragment'ом. При помощи чего это можно сделать?

Хотел сделать через IntentServise, но он не дружит с List'ами (насколько я понял). Проповал запустить выгрузку во втором потоке, остановивши первый, но ProgressDialog спит с основным потоком. Даже пробовал сделать все в основном потоке, но ProgressDialog не успевает запуститься и зависает с основным потоком...


Ответ

Делается это через AsyncTask, примерная схема такая:
Создаем класс наследующий от AsyncTask В конструкторе класса создаем ProgressDialog В методе onPreExecute() показываем диалог progressDialog.show(), проводим другие мероприятия - подготовку у чтению БД и проч. В методе doInBackground() организуем чтение данных из БД в цикле и в ходе чтения вызываем this.publishProgress(), который будет вызывать onProgressUpdate() (см. ниже) В методе onProgressUpdate() увеличиваем счетчик progressDialog.setProgress() В методе onPostExecute() закрываем счетчик progressDialog.dismiss()

Когда выбирать реляционную БД, а когда не реляционную?

Пишу сайт. Подразумевается большое количество записей разного размера. Подумал о том, что при большом объёме записей БД будет долго обрабатывать запрос, поэтому надо её раскинуть на несколько серверов. но вычитал, что реляционные БД плохо масштабируются и для больших объемов данных используют не реляционные.

подВопрос: Как поступить: пока не заморачиваться над этим и потом, при необходимости, перенести данные в не реляционную БД ИЛИ выбрать реляционную/не реляционную БД ?


Ответ

Подумал о том, что при большом объёме записей БД будет долго обрабатывать запрос
Планирование не может начинаться с "подумал", боттлнеки всегда бывают в иных местах. Реляционки спокойно работают с миллионами записей.
поэтому надо её раскинуть на несколько серверов. но вычитал, что реляционные БД плохо масштабируются
Тут у меня опять претензия в ту же степь. Вы не знаете, что именно вы вычитали. Они действительно плохо масштабируются из-за того, что (по крайней мере у большинства) есть только одна модель master-slaves, которая упирается в мастер по скорости записи (поправьте, если есть популярные движки с многочисленными мастерами). В любом случае в базе данных не должно быть тяжелых подсчетов - если вы считаете количество записей в БД, то это должно рассчитываться внутри БД и кэшироваться на уровне приложения, если вы рассчитываете аналитику, то тут БД уже ничего считать не должна.
В общем, у меня большие сомнения, что вам нужна масштабируемая система. Что до нереляционок, то их нельзя выбрать просто потому что "лучше масштабируются" - их только основных типов четыре штуки под свои задачи (вряд ли вы будете использовать key-value или графовую БД). Что до масштабирования, то есть row-column (т.е. хранение данных практически как в SQL) Cassandra, которая шардит данные по узлам и имеет практически линейную масштабируемость, т.е. добавление сервера в кластер из N серверов обеспечивает практически 100 * (1 / N + 1) процентов прироста производительности. Если есть знание кассандры, то делать проект на чем-то другом я не вижу смысла (единственная претензия - отсутствие готовых утилит для миграций, но это, надеюсь, изменится), классические реляционки как концепция по факту уже умерли - они, конечно, останутся, но в узком применении, и ближайшие N лет их популярность будет снижаться.

правильная сортировка массива по значению

есть массив
[0] => Array ( [title] => ITEM1 [id] => 1 [voites] => 0 )
[1] => Array ( [title] => ITEM2 [id] => 2 [voites] => 0 )
[2] => Array ( [title] => ITEM3 [id] => 3 [voites] => 4 // высший рейтинг ) [3] => Array ( [title] => ITEM4 [id] => 4 [voites] => 0 )
нужно отсортировать по полю voites... и нужно, чтобы не нарушался порядок.. например, обычная отсортировка выводит сначала элемент с наибольшим значение в voites(что и логично), но остальные, у которых это поле равно 0, выводит с конца... сортирую через usort()... не получается написать к нему cmp функцию
public function srtCMP($a, $b){ return $b["voites"] - $a["voites"]; }
повторюсь: нужно, чтобы не нарушался порядок... элементы у которых высший рейтинг должны подниматься вверх, а остальные оставить как есть
вот так:
[0] => Array ( [title] => ITEM3 [id] => 3 [voites] => 4 // высший рейтинг ) [1] => Array ( [title] => ITEM1 [id] => 1 [voites] => 0 )
[2] => Array ( [title] => ITEM2 [id] => 2 [voites] => 0 ) [3] => Array ( [title] => ITEM4 [id] => 4 [voites] => 0 )


Ответ

По сути, имеется две сортировки: по убыванию voites и (при их равенстве) - по возрастанию ключа элемента. Для применения функции usort() надо временно запомнить этот ключ внутри элемента. Например, так:
$common = Array( "0" => Array ( "title" => ITEM1, "id" => 1, "voites" => 0 ),
"1" => Array ( "title" => ITEM2, "id" => 2, "voites" => 0 ),
"2" => Array ( "title" => ITEM3, "id" => 3, "voites" => 4 // высший рейтинг ), "3" => Array ( "title" => ITEM4, "id" => 4, "voites" => 0 ) );
function cmp($a, $b) { if ($a["voites"] == $b["voites"]) { if (end($a) == end($b)) { return 0; } return (end($a) < end($b)) ? -1 : 1; } return ($a > $b) ? -1 : 1; }
function add_key(&$item, $key){ array_push($item,$key); }
function delete_key(&$item, $key){ array_pop($item); }
array_walk($common, 'add_key'); usort($common, 'cmp'); array_walk($common, 'delete_key'); var_dump($common);
Результат:
array (size=4) 0 => array (size=3) 'title' => string 'ITEM3' (length=5) 'id' => int 3 'voites' => int 4 1 => array (size=3) 'title' => string 'ITEM1' (length=5) 'id' => int 1 'voites' => int 0 2 => array (size=3) 'title' => string 'ITEM2' (length=5) 'id' => int 2 'voites' => int 0 3 => array (size=3) 'title' => string 'ITEM4' (length=5) 'id' => int 4 'voites' => int 0