Страницы

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

пятница, 21 июня 2019 г.

Вывод данных из базы в динамическую таблицу

Имеется вот такая примерно таблица -
#{msgs.pageTitle} #{msgs.customerIdHeader} #{customer.id} #{msgs.NDOKHeader} #{customer.NDOK} #{msgs.SODRABHeader} #{customer.SODRAB}
Как написать правильный код с использованием jdbc, который бы подключался к базе и получал данные, а затем они попадали в данную таблицу?


Ответ

1) Для подключения к MSSQL вам поднадобится соответствующий драйвер. В Maven Central его нету, поэтому вам будет нужно самостоятельно добыть внутри каталога установки драйвера:
\sqljdbc_\\sqljdbc.jar \sqljdbc_\\sqljdbc4.jar \sqljdbc_\\sqljdbc41.jar \sqljdbc_\\sqljdbc42.jar
согласно документации Microsoft
Скачать драйвер можно с сайта Microsoft
(Поясню на всякий случай: installation directory не надо никуда прописывать - это просто путь до драйвера при обычной установке из инсталлятора. Если у вас уже все скачано, достаточно добавить драйвер в CLASSPATH.)
Далее этот драйвер нужно добавить в CLASSPATH любым методом, специфичным для вашего проекта. Например, если вы собираете вручную из консоли, то это будет нечто вроде:
CLASSPATH =.;C:\Program Files\Microsoft JDBC Driver 6.0 for SQL Server\sqljdbc_4.2\enu\sqljdbc42.jar
CLASSPATH =.:/home/usr1/mssqlserverjdbc/Driver/sqljdbc_4.2/enu/sqljdbc42.jar
Если вы используете IntelliJ IDEA, то это делается так:
нужно зайти в настройки проекта (File->Project Structure) в разделе Modules найти ваш модуль на вкладке Dependencies в самом низу нажать на плюсик выбрать "JARs or Directories" добавить нужную директорию
Если используется Maven, то есть проблема, в Maven Central нету этого артефакта, то есть его придется оформить самостоятельно.
Для серьезных больших проектов, самый правильный способ - поднять собственный репозиторий. На выбор, например, есть Artifactory и Nexus. Как работать с этими инструментами - описывать слишком долго, не влезет в максимальный размер ответа. Скорей всего, у вас не тот случай, но я был обязан предупредить.
Для небольших проектов, можно установить нужный jar в локальный репозиторий Maven. Про это на сайте Maven есть специальная документация. Вкратце, достаточно просто запустить в терминале строчку:
mvn install:install-file -Dfile=<путь до джарки с жрайвером без угловых скобочек> -DgroupId=com.microsoft.sqlserver \ -DartifactId=com.microsoft.sqlserver.jdbc.SQLServerDriver -Dversion=4.2 -Dpackaging=jar
и далее добавить в pom.xml новую зависимость вида:
com.microsoft.sqlserver com.microsoft.sqlserver.jdbc.SQLServerDriver 4.2
В общем, добавление новой джарки с сборку проекта очень зависит от характеристик вашего проекта, способов сборки, деплоймента, итп. Тут все каждый решает для себя.
2) Далее у нас есть допустим Entity класс:
public class Customer {
private Integer id; private String NDOK; private String SODRAB;
public Customer() { }
public Customer(Integer id, String NDOK, String SODRAB) { this.id = id; this.NDOK = NDOK; this.SODRAB = SODRAB; }
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getNDOK() { return NDOK; }
public void setNDOK(String NDOK) { this.NDOK = NDOK; }
public String getSODRAB() { return SODRAB; }
public void setSODRAB(String SODRAB) { this.SODRAB = SODRAB; } }
3) Далее создаем managed bean:
import java.io.Serializable; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped;
@ManagedBean @SessionScoped public class CustomerBean implements Serializable {
private static final long serialVersionUID = 6081417964063918994L;
public List getCustomers() throws ClassNotFoundException, SQLException {
Connection connect = null;
//Привел пример, как указать еще и в url, это необязательно String url = "jdbc:sqlserver://localhost:1433;" + "databaseName=CustomerDatabase;user=user;password=password";
String username = "user"; String password = "password";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
connect = DriverManager.getConnection(url, username, password); // System.out.println("Connection established"+connect);
} catch (SQLException ex) { System.out.println("in exec"); System.out.println(ex.getMessage()); }
List customers = new ArrayList(); PreparedStatement pstmt = connect .prepareStatement("select id, NDOK, SODRAB from Customer"); ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
Customer customer = new Customer(); customer.setId(rs.getInt("id")); customer.setNDOK(rs.getString("NDOK")); customer.setSODRAB(rs.getString("SODRAB"));
customers.add(customer);
}
// close resources rs.close(); pstmt.close(); connect.close();
return customers;
}
}
4) Передаете данные в таблицу способом, описанным в стартовом посте.
5) PROFIT

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

Допустим есть клиентская база депозитных счетов, есть таблица с историями операций по счету, где есть поля "баланс", "сумма операции", "порядковый номер операции по счету" и "дата совершения операции".
Необходимо найти строки операций по которым произошли нарушения арифметической последовательности операции.
Т.е., баланс не соответствует нужному числу с учетом суммы операций.
И еще найти такие строки, по которым дата операции с меньшим номером больше даты операции с большим номером.


Ответ

Вы не привели структуру таблиц и данные. Применим экстрасенсорные способности. Структура таблицы такая:
create table table1( usr_id int, -- Клиент opnum int, -- Порядковый номер операции, начиная с 1 opval int, -- Сумма операции balance int, -- Текущий баланс dt date -- Дата операции );
Баланс в любой строке равен сумме всех операций по данному клиенту с первой по текущую. Номера операций идут подряд +1 к предыдущей записи данного клиента, начиная с 1.
Тестовые данные:
insert into table1 values(1,1,100,100,sysdate-12); insert into table1 values(1,2,100,200,sysdate-11); insert into table1 values(1,3,-30,170,sysdate-9); -- Ошибка даты insert into table1 values(1,4,300,470,sysdate-10); -- Ошибка номера, ошибка суммы insert into table1 values(2,1,100,100,sysdate-12); insert into table1 values(2,3,100,200,sysdate-11); -- Пропущен номер операции "2" insert into table1 values(2,4,100,300,sysdate-10); insert into table1 values(2,5,50,350, sysdate-9); insert into table1 values(2,6,-150,200,sysdate-8); insert into table1 values(2,7,100,250,sysdate-7); -- Ошибка в сумме
Запрос:
select * from ( select a.*, (lag(opnum,1,0) over(partition by usr_id order by dt))+1 n_opnum, -- Ожидаемый номер sum(opval) over(partition by usr_id order by dt) n_balance -- Ожидаемая сумма from table1 a order by usr_id,dt -- Для наглядности, на правильность работы не влияет ) where n_opnum!=opnum -- Номер операции не соответствует or n_balance!=balance -- Сумма не соответствует
Результат:
USR_ID OPNUM OPVAL BALANCE DT N_OPNUM N_BALANCE 1 4 300 470 28.01.2016 18:27:37 3 500 1 3 -30 170 29.01.2016 18:27:37 5 470 2 3 100 200 27.01.2016 18:27:37 2 200 2 7 100 250 31.01.2016 18:27:37 7 300
Вот примерно так. Используются оконные функции, незаменимые в таких случаях. lag(opnum,1,0) дает значение поля opnum из предыдущей записи в окне, 0 - для первой записи в окне. sum(opval) over(order by) - нарастающая сумма opval в окне
Окно в таких функциях можно задавать различными способами. В данном случае мы используем partition by что бы окно было в пределах одного клиента и применяем order by для указания порядка операций в пределах клиента.

CSRF-токен в куках

почему некоторые сайты хранят CSRF-токен в куках?
Ведь если отправить, к примеру, GET-запрос - или я что-то не понимаю??


Ответ

Само по себе это действительно бесполезно, если сервер помнит соответствие токен-пользователь и проверяет только его.
Но в сочетании с передачей такого же токена в параметрах это становится быстрым и простым способом защиты от CSRF: вы ставите пользователю в куки совершенно случайный токен и проверяете, что в параметрах запроса впоследствии приходит точно такой же. Проверяется соответствие запрос-кука
Потенциальный атакующий не сможет достать его из-за Same Origin Policy (можно ещё досыпать сверху HttpOnly, чтобы не получить дыр из-за JS), а потому не сможет его продублировать в запросе. И нет необходимости запоминать что-либо на сервере.

Как вернуть результат из callback в функцию [дубликат]

На данный вопрос уже ответили: Как вернуть значение из события или из функции обратного вызова? Или хотя бы дождаться их окончания 3 ответа Столкнулся с проблемой асинхронного выполнения запросов. Подскажите, как правильно написать код:
// Determine the only image extension on the url function getImgType(objUrl) { var res = null; chrome.downloads.search({url: objUrl}, function(items) { var mime = items[0].mime; if (mime.indexOf('image/') == 0) { res = mime.substring(6); console.log('1- res = ' + res); }; }); console.log('2- res = ' + res); return res; };
Результат работы:
2- res = null 1- res = jpeg
Нужно чтобы getImgType вернула результат только после завершения работы callback в функции function(items)


Ответ

Результат работы правильный, у вас скрипт выполняется в однопоточной среде, поэтому вы сначала увидели результат переменной res равной null, затем сработал асинхронный callback переданный в функцию search и переменной res присвоилось заначение jpeg. Правильно будет передавать callback в функцию getImgType или использовать Promise
function getImgType(objUrl, callback) { chrome.downloads.search({url: objUrl}, function(items) { var mime = items[0].mime; if (mime.indexOf('image/') == 0) { callback(mime.substring(6)); }; }); };
И собственно вызов
getImgType("http://some-url/", function(mimeType){ // какие-то операции с mimeType });
C использованием Promise
function getImgType(objUrl){ return new Promise(function(resolve, reject){ chrome.downloads.search({url: objUrl}, function(items) { var mime = items[0].mime; if (mime.indexOf('image/') == 0) { resolve(mime.substring(6)); } else { reject(new Error("Incorrect mime type") } }); }); }
Вызов функции getImgType будет выглядеть теперь иначе
getImgType("http://some-url/") .then(function(mimeType){ // какие-то операции с mimeType }) .catch(function(err){ // обработка ошибки });

Не запускается Java из консоли

При попытке запуска из консоли java, получаю ответ, "java" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. Переменная %JAVA_HOME% установлена. java не стартует, даже если перейти в папку где лежит она. При этом если прописать java.exe с любого местоположения, все работает. Как сделать так, что бы из консоли можно было запустить не только java.exe, но и без указания расширения?


Ответ

Проверьте содержимое переменной окружения PATHEXT для этого можно в той же консоли прописать echo %PATHEXT%. В выводе консоли вы должны увидеть список поддержимавемых расширений. Проверьте наличие .EXE, если такого расширения по какой то причине нету, добавьте его: set PATHEXT=%PATHEXT%;.EXE Если переменной нету, не спешите добавлять ее, убедитесь, что в переменных среды пользователя не определена такая переменная. Если такая переменная заведена в переменных пользователя, то вероятно лучше ее удалить. И тогда все заработает.

Почему появляются дубли одного пакета в разных путях и как исправить ситуацию?

По какой-то причине у меня оказались установленными две версии пакета ansible. Я удалил один из них с помощью apt-get purge, но второй остался установлен.
ppa:ansible/ansible это официальный репозиторий ansible (кто бы мог подумать) ubuntu.local — это наше локальное зеркало.
$ cat /etc/apt/sources.list.d/ppa_ansible_ansible_trusty.list http://ppa.launchpad.net/ansible/ansible/ubuntu
$ sudo apt-cache policy ansible ansible: Installed: (none) Candidate: 2.0.0.2-1ppa~trusty Version table: 2.0.0.2-1ppa~trusty 0 500 http://ppa.launchpad.net/ansible/ansible/ubuntu/ trusty/main amd64 Packages 1.7.2+dfsg-1~ubuntu14.04.1 0 100 http://ubuntu.local/ubuntu/ trusty-backports/universe amd64 Packages 1.5.4+dfsg-1 0 500 http://ubuntu.local/ubuntu/ trusty/universe amd64 Packages
$ dpkg -l | grep ansible (возвращает пустую строку)
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ ansible --version ansible 1.9.4 configured module search path = None
$ which ansible /usr/local/bin/ansible
Похоже, apt-get устанавливает его в другое место
$ sudo apt-get install ansible $ ls /usr/bin/ansible -l -rwxr-xr-x 1 root root 3944 Jan 15 04:33 /usr/bin/ansible
Понятно, что я могу просто поменять переменную $PATH и будет использоваться нужная мне версия. Но я хочу разобраться в причине дублирования и полностью его устранить.


Ответ

/usr/local/bin/ansible — этот файл явно появился здесь в обход пакетного менеджера.
проверить это можно, сделав запрос к базе данных dpkg:
$ dpkg -S /usr/local/bin/ansible
и получив в ответ, что no path found matching pattern

Но я хочу разобраться в причине дублирования и полностью его устранить.
вероятно, вы запустили какой-нибудь «инсталлятор» (install.sh, pip install что-нибудь и т.д. и т.п.)
Понятно, что я могу просто поменять переменную $PATH
вот этого делать, по-моему, не стоит. если у использованного «инсталлятора» нет функции «убрать весь мусор, который он разложил по разным уголкам файловой системы», то, в конце концов, можно удалить/переименовать (например, в /usr/local/bin/ansible-1.9.4) неиспользуемый файл.

Расскажите, кто как работает в django с формами? [закрыт]

Добрый день, тут хочу для себя разьяснить что лучше, точнее предпочтительнее, "рисовать" самому форму или просто воспользоваться from django import forms, а в html просто вывести {{ form }}, т.к. и ежу понятно, что если у тебя всего пара полей, то можно особо не выдумывать и вывести через {{ form }}, а если у меня десяток полей, где надо ввести и числа и строки и сделать выбор из селектов....


Ответ

Возможностей для кастомизации форм довольно много. В forms можно указать нужные виджеты для полей. В темплейтах можно использовать встроенные методы для форм
{{ form.as_p }} {{ form.as_table }}
Можно обращаться к определенным полям и добавлять их в нужные теги

{{ form.some_field }}


Можно использовать батарейки, как crispy_forms
Лучше всего почитать документацию по формам и выбрать что то подходящее для вашей проблемы.

вставка блока внутрь иного блока

Имеется конструкция типа

, и нужно вставить внутрь блока span. Проблем с созданием спана, его класса и его содержимого нет, но вот когда я пытаюсь вставить спан в блок, то выходит [object HTMLSpanElement](через console.log(number_span) выводит всё правильно, то что вставить собственно нужно). Делаю так:
var div = document.getElementById('show_chosen_address'), number_span = d.createElement('span');
number_span.className = "number"; number_span.innerHTML = "test"; div.innerHTML = number_span;


Ответ

либо используйте appendChild, либо вставляйте number_span.outerHTML
var div = document.getElementById('show_chosen_address'), number_span = document.createElement('span'); number_span.className = "number"; number_span.innerHTML = "test"; div.innerHTML = number_span.outerHTML; var div2 = document.getElementById('show_chosen_address2'), number_span2 = document.createElement('span'); number_span2.className = "number"; number_span2.innerHTML = "test2"; div2.appendChild(number_span2); #show_chosen_address, #show_chosen_address2 { border: 1px solid; width: 200px; margin-bottom: 10px; }


Как правильно закэшировать в браузер Javascript/CSS файлы?

1. Как правильно кэшировать в браузер Javascript/CSS файлы, что бы при изменении версии файла, файл кэшировался.
2. И как правильно сделать версионность кэшируемых файлов?


Ответ

Кеширование осуществляется за счет заголовков ответа (Cache-Control). В apache кеширование можно включить используя mod_expires Тут документация Так же может быть полезным для общего развития прочтение данной статьи Часто используют добавление get параметра к имени файла. Например /_build.css?v=1. Второй подход - это складывать файл в папку с именем версии /v1/_build.css. Но первый вариант проще, т.к. он позволяет легче поддерживать прошлые версии (при публикации новой версии - старая останется доступна).
По просьбе из комментариев дополню первый пункт: Т.к. мы управляем версиями наших файлов, то мы можем включить кеширование на максимальный срок (Хотя уверен, что хватит и месяца). Вот код для apache всё из той же статьи
Header set Cache-Control "max-age=2592000, must-revalidate"
Т.е. для всех файлов с расширением css и js мы добавляем заголовок ответа, который говорит браузеру, что данные файлы необходимо закешировать на 2592000 секунд (30 дней)

Как присвоить ссылки цветным полосам на резиновом фоне?

Как присвоить ссылки резиновому фоновому изображению, где полоса цветная и будет ссылкой. Высота задаётся за счёт свойства width: 10%; соседнего блока, она и образует высоту всего блока в котором находится квадрат и цветные полосы. Но не получается сделать так, чтобы полосы становились той же высоты.

Совместимы ли методы из библиотеки Delphi с P/Invoke?

Совместимы ли методы из библиотеки, написанной на Delphi с P/Invoke? И если нет - есть ли какая либо возможность сделать их совместимыми?
Есть доступ к исходникам .dll.


Ответ

Для начала - стоит посмотреть в исходниках, с каким соглашением о вызовах функции из библиотеки экспортируются.
Если там stdcall или cdecl - то такая функция без проблем может быть вызвана через P/Invoke. Если же там соглашение не указано - то так просто не получится.
В таком случае, если исходники библиотеки менять нельзя - самым простым решением будет прослойка из еще одной библиотеки на Delphi:
procedure Foo(...); external 'MyLib.dll';
// ...
procedure Foo_Std(...); stdcall; begin Foo(...); end;
// ...
exports Foo_Std name 'Foo';

Как сделать, что бы в IDLE импортировался по умолчанию модуль pprint?

Как сделать, что бы в IDLE (только в shell) импортировался по умолчанию модуль pprint (что-бы не импортировать каждый раз вручную)?


Ответ

Имеется системная переменная PYTHONSTARTUP, в которую можно записать путь и имя скрипта, который должен быть выполнен интерпретатором перед запуском программы. Создайте файл с директивами импорта и укажите его в PYTHONSTARTUP

как правильно организовать MVC модель?

Пишу учебное задание, пытаюсь написать некоторое подобие MVC. Пытаюсь разделить логику программы и интерфейса в разные классы. Соответственно, запилил классы Controller и View. View содержит нажатия всяких кнопок, считывание с полей, обновление содержимого меток и т.п. Controller же должен по идее инициировать запуск View и считывать получаемые значения для проведения операций над ними и передачи этого добра в модель. Я сделал вьюху элементом контроллера, вызываю её, но столкнулся с проблемой - а как, собственно получать из вьюхи данные? Т.е. например, я понимаю, что можно запустить view->show() и прочие методы вызывать из контроллера, но как обеспечить свободную работу с формой пользователю и при этом вовремя получать информацию о его действиях?


Ответ

Так у вас слоты вьюхи и так срабатывают по событиям пользователя. И в этих слотах должны вызываться методы контроллера. А вот как раз в контроллере не должно быть вызовов методов вьюхи, иначе они получаются привязаны сильно. По событиям контроллера (по его сигналам) так же должна обновляться view.

System.ExecutionEngineException при попытке маршализации структуры

Есть программа на C#, предназначенная для конфигурирования устройства на микроконтроллере через USB порт. Для того, чтобы корректно передавать данные микроконтроллеру (Си, жесткие требования к ресурсам), я храню их в виде структуры фиксированного размера:
SystemPack InternalSystemPacket = new SystemPack(); // Текущий пакет данных со стороны ПК
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)] public unsafe struct SystemPack { public ushort PackLength; // Перед отправкой пакета контроллеру сюда надо записать общую длину пакета
// Вкладка "Информация" [MarshalAs(UnmanagedType.ByValArray, SizeConst = DEVICENAMELENGTH)] public byte[] DeviceName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = STRINGLENGTH)] public byte[] DeviceVersion;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = REQUESTLENGTH)] public byte[] DeviceIMEI;
и т. д.
Перед передачей данных контроллеру по USB (а также для записи данных на диск) я подвергаю структуру маршализации для превращения ее в массив данных:
byte[] buffer = new byte[System.Runtime.InteropServices.Marshal.SizeOf(InternalSystemPacket)];
GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned); Marshal.StructureToPtr(InternalSystemPacket, h.AddrOfPinnedObject(), false); h.Free();
Все работало нормально. Но при изменении структуры (я удлинил один ее член):
[MarshalAs(UnmanagedType.ByValArray, SizeConst = REQUESTLENGTH + 1)] public byte[] DeviceIMEI;
при попытке маршализации вылетает System.ExecutionEngineException


Ответ

Рискну предположить, что массив, записанный в поле DeviceIMEI, остался старого размера.
PS Но зачем все так сложно? Зачем вам вообще маршаллинг структуры, если все что нужно - это сформировать правильный массив?
var ms = new MemoryStream(); var writer = new BinaryWriter(ms); writer.Write((ushort)0); // Место для длины пакета
Debug.Assert(packet.DeviceName.Length == DEVICENAMELENGTH); writer.Write(packet.DeviceName);
Debug.Assert(packet.DeviceVersion.Length == STRINGLENGTH); writer.Write(packet.DeviceVersion);
Debug.Assert(packet.DeviceIMEI.Length == REQUESTLENGTH); writer.Write(packet.DeviceIMEI);
var length = writer.Seek(0, SeekOrigin.Current); writer.Seek(0, SeekOrigin.Begin); writer.Write((ushort)length); writer.Flush();
var packetData = ms.ToArray();
Кстати, BinaryWriter умеет и строки напрямую записывать, если ему в конструктор кодировку передать. Только с проверкой длины придется что-нибудь думать, вроде такого:
// Код ниже напрашивается на вынесение в отдельную подпрограмму var i = writer.Seek(0, SeekOrigin.Current); writer.Write(packet.DeviceName); // Допустим, это - строка i = writer.Seek(0, SeekOrigin.Current) - i; if (i > DEVICENAMELENGTH) throw new ArgumentException("too long", "packet.DeviceName"); else for (; i < DEVICENAMELENGTH; i++) writer.Write((byte)0);

Как выбрать с помощью jQuery только один li, с условием выборки двух классов?

Есть следующие классы:


  • Как выбрать с помощью jQuery, только один li, с условием выборки двух классов? К примеру, пробую так, не получается:
    $('li').find('.holiday_homes, .steel_structures');


    Ответ

    В селекторах jQuery применяется синтаксис аналогичный CSS таким образом выбор элементов с двумя классами будет выглядеть так
    $('elementName.ClassName1.ClassName2')
    Если нужно выбрать только первый, то применять функцию first описанную ниже, либо eq(0), который так же можно добавить в селектор.
    Важно: Если есть уверенность, что элемент с этими двумя классами только один, либо все с такими классами, то никаких дополнительных манипуляций не нужно.

    Есть множество способов, например метод first
    $( "li" ).first().css( "background-color", "red" );

    Изменение цвета на png программно

    Есть изображение .png, это иконка для таба, для нее я сделал селектор, что бы при активном и неактивном табе она имела разный цвет. Пробовал PorterDuff.Mode но результат не совсем такой как я хотел. Меня интересует как можно заменить в селекторе цвет активной иконки динамически. Что бы вместо фиолетовой иконки можно было сделать, красную, зеленую, желтую и т.д.
    Пример моего селектора:


    Пример иконки:


    Ответ

    Изменить цвет можно так:
    TintIcons.java
    public class TintIcons {
    public static Drawable tintIcon(Drawable icon, ColorStateList colorStateList) { if(icon!=null) { icon = DrawableCompat.wrap(icon).mutate(); DrawableCompat.setTintList(icon, colorStateList); DrawableCompat.setTintMode(icon, PorterDuff.Mode.SRC_IN); } return icon; }
    public static void tintImageView(ImageView imageView, int colorStateListResId) { ColorStateList list = ContextCompat.getColorStateList(imageView.getContext(), colorStateListResId); if (list != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { imageView.setImageTintList(list); } else { imageView.setImageDrawable(tintIcon(imageView.getDrawable(), list)); } } } }
    /res/color/icon_state_list.xml

    MainActivity.java
    public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TintIcons.tintImageView((ImageView) findViewById(R.id.img_view), R.color.icon_state_list); } }
    Вместо списка состояний можно передавать просто цвет (например, R.color.colorPrimary), тогда картинка просто перекрасится. Аналогично можно перекрасить фон кнопок и т.д. (получив предварительно картинку фона через imageView.getBackground()).
    Как видно все эти причуды нужны для pre-Lollipop. Для lollipop+ достаточно titnList задать в разметке...

    Как уменьшить зависимость заголовочных файлов C++?

    Допустим есть файл A1.h с описанием класса A1 (class A1 { ...};), файл A2.h с описанием класса A2 (class A2 {...};). Есть файл B1.h, в котором подключаются заголовочные файлы A1.h и A2.h и описывается класс B1 (
    #include "A1.h" #include "A2.h"
    class B1 { A1* pA1; A2* pA2; ... };
    ). Как уменьшить зависимость заголовочных файлов, чтобы когда подключалась dll библиотека не нужно было тянуть за собой много заголовочных файлов ?


    Ответ

    В вашем примере в файле B1.h нет необходимости подключать файлы A1.h и A2.h, так как описанный вами класс В1 содержит лишь указатели на классы А1 и А2. Достаточно будет предварительного объявления:
    class A1; class A2;
    class B1 { A1* pA1; A2* pA2; };
    А заголовочные файлы А1.h и А2.h необходимо подключить в файле реализации B1.cpp.

    удаление SOCKET из памяти

    #include #pragma comment(lib, "ws2_32.lib" )
    void main(){
    WSADATA buff; WSAStartup(0x202, &buff); SOCKET S;
    while (1){ S = ::socket(AF_INET, SOCK_STREAM, 0); closesocket(S); } }
    При работе память в диспетчере все растет и растет, как исправить?


    Ответ

    В данном случае сбоил socket модуль, помогло netsh winsock reset

    Реализация приложения с обновляемыми формами

    Стоит задача изменения используемых в приложении форм во время его работы. копал в сторону выгрузки динамических библиотек (чтобы они содержали формы). Т.е. загрузил в AppDomain библиотеку, получил нужный
    контрол (допустим, что обновлять нужно не только формы) разместил его где нужно, отобразил с его помощью нужные данные.
    Получив сигнал о необходимости обновить контрол - свернули всё это хозяйство, выгрузили домен, получили новую версию DLL, создали новый домен - и поехали заново.
    Проблемы, возникшие по ходу реализации:
    Вся инфа по работе между доменами ведет к интерфейсам и неким абстрактным классам - а мне нужен хотя бы System.Forms.Control При обмене данными между доменами приложений используется маршаллинг. Используемые контролы имеют всего лишь несколько внешних свойств, которые позволяют их настроить и для получения данных они используют
    OracleConnection, который не может быть передан между доменами (он не маршаллится).
    т.е. выходит, что подход изначально не верный - загрузка библиотеки в другой домен, создание контрола отображения для данных из oracle-сессии из первого домена.
    Как можно реализовать набор таких обновлямых контролов, причем не прерывая соединения с бд, т.е. не выгружая ехе, если это реально?
    UPDATE попробовал передать между доменами
    общая библиотека OracleCall.dll //интерфейс для класса, через который передаю оригинальный оракловый коннекшн public interface IConnectInitializer { void CreateConnectionClone(Oracle.DataAccess.Client.OracleConnection conn); }
    вторая библиотека libForNewClasses.dll, содержащая ссылку на общую в этой библиотеке реализуется статический хранитель оралового соединения:
    public class oracleConnInitializer : MarshalByRefObject, IConnectInitializer { public static Oracle.DataAccess.Client.OracleConnection conn;
    public void CreateConnectionClone(Oracle.DataAccess.Client.OracleConnection connection) { conn = (Oracle.DataAccess.Client.OracleConnection)connection.Clone(); conn.Open(); } }
    и контрол:
    public class newControl : UserControl { private void newControl_Load(object sender, EventArgs e) { OracleCall.OraCallProc.getData(oracleConnInitializer.conn); } }
    третий модуль, ехе-шник, содержит ссылку на первый, общий, чтобы работать с передачей OracleConnection в нем находится форма, на которую и нужно положить контрол из второй библиотеки.
    public partial class Form1 : Form {
    // образец соединения static Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(connString);
    // домен, куда будем грузить третью библиотеку с дополнительным контролом AppDomain dmn;
    public Form1() { InitializeComponent(); init(); } void init() { // создаем домен dmn = AppDomain.CreateDomain("newDomain");
    // загружаем библиотеку с контролом Assembly asm = dmn.Load("libForNewClasses");
    // создаем передатчик коннекшена IConnectInitializer connInit = (IConnectInitializer) dmn.CreateInstanceAndUnwrap("libForNewClasses", "libForNewClasses.oracleConnInitializer");
    // передаем коннекшн connInit.CreateConnectionClone(conn);
    // создаем контрол Control ctrl = (Control) dmn.CreateInstanceAndUnwrap("libForNewClasses", "libForNewClasses.newControl");
    this.Controls.Add(ctrl);// пытаемся добавить - БАБАХ! ОШИБКА!!!! } }
    ОШИБКА: Remoting cannot find field 'parent' on type 'System.Windows.Forms.Control'.
    Что я делаю не так?
    UPDATE 2 переделал общую библиотеку. дабы придать ей общий вид обзовем ее common.dll теперь она содержит образец контрола: public class myControls : UserControl { private Button button1;
    private void InitializeComponent() { // ... } public IntPtr _handle { get; set; } public void SetParentHandle(IntPtr handle) { _handle = handle; } protected override CreateParams CreateParams { get { CreateParams createParams = base.CreateParams; createParams.Parent = _handle; // Сюда надо передать Handle формы return createParams; } } protected Oracle.DataAccess.Client.OracleConnection Connection; public void InitConnection(Oracle.DataAccess.Client.OracleConnection conn) { Connection = conn; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); InitializeComponent(); // почему-то без этого не видно } }
    дочерний контрол также изменил свой код:
    public class newControl : myControls { private Label label1;
    private void InitializeComponent() { // ... }
    protected override void OnLoad(EventArgs e) { base.OnLoad(e); InitializeComponent(); // почему-то без этого не видно OraCallProc.getData(Connection); // БАБАХ! падаем с ошибкой! } }
    ушел от статического хранения соединения, теперь на главной форме:
    public partial class Form1 : Form { // образец соединения static Oracle.DataAccess.Client.OracleConnection conn = new Oracle.DataAccess.Client.OracleConnection(connString); // домен, куда будем грузить третью библиотеку с дополнительным контролом AppDomain dmn; public Form1() { InitializeComponent(); init(); } void init() { // открываем conn.Open(); // создаем dmn = AppDomain.CreateDomain("newDomain"); // грузим сборку в новый домен Assembly asm = dmn.Load("libForNewClasses"); // создаем контрол myControls ctrl = (myControls) dmn.CreateInstanceAndUnwrap("libForNewClasses", "libForNewClasses.newControl"); // отправляем контролу соединение ctrl.InitConnection(conn); // устанавливанем хэндл формы ctrl.SetParentHandle(this.Handle); ctrl.Visible = true; ctrl.CreateControl(); // БАБАХ! падаем с ошибкой! (это та, что на OnLoad) } }
    вопросы:
    1) ошибка: Remoting cannot find field 'm_collRef' on type 'Oracle.DataAccess.Client.OracleParameter'.
    2) даже если не подключаться к базе, newControl теряет весь свой вид. Почему приходится самому переинициализировать в OnLoad? Не красиво ведь в каждом наследнике переопределять
    3) т.е. для каждого типа нового контрола нужно создать наследника (будь то TextEdit, ListView и подобных), даже если нет необходимости подключаться к БД, мне нужен метод SetParentHandle? Как-то это негибко и громоздко получается


    Ответ

    Внимание, ответ по ''Remoting cannot find field 'm_collRef' on type'' Ошибка была не в передаче соединения. С ним работа была налажена. Она крылась в процедуре
    OraCallProc.getData(Connection);
    это был статический метод, который выглядел примерно так:
    public static DataTable getData(OracleConnection conn) { using (OracleCommand cmd = conn.CreateCommand()) { cmd.CommandType = System.Data.CommandType.StoredProcedure; cmd.CommandText = "TESTSHEME.TESTPROC.GETDATAFUNCTION"; OracleParameter outvalue = new OracleParameter(); // неправильно! объект создается не в том домене!!! outvalue.OracleDbType = OracleDbType.RefCursor; outvalue.Direction = ParameterDirection.ReturnValue; outvalue.ParameterName = "OUTP"; cmd.Parameters.Add(outvalue); // при попытке добавить объект из одного домена к списку параметров команды из другого возникает ошибка с m_colRef
    // вообще и здесь не верно. OracleDataAdapter также создается в другом домене OracleDataAdapter da = new OracleDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); // здесь адаптер пытается обратиться к соединению из другого домена, пытается изменить m_state, и тоже падаем return dt;
    } }
    решить проблему получилось таким образом:
    public static DataTable getData(OracleConnection conn) { using (OracleCommand cmd = conn.CreateCommand()) { cmd.CommandText = "TESTSHEME.TESTPROC.GETDATAFUNCTION"; cmd.CommandType = System.Data.CommandType.StoredProcedure; OracleParameter outvalue = cmd.CreateParameter(); //создается в том же потоке, что и cmd outvalue.OracleDbType = OracleDbType.RefCursor; outvalue.Direction = ParameterDirection.ReturnValue; outvalue.ParameterName = "OUTP"; cmd.Parameters.Add(outvalue); // поэтому здесь нет ошибки междоменного доступа к внутренним полям // OracleDataAdapter не нашел как создать в том же домене, зато есть ExecuteReader DataTable dt = new DataTable(OracleDataAdapter.DefaultSourceTableName); using (OracleDataReader r = cmd.ExecuteReader()) { for (int i = 0; i < r.FieldCount; i++) dt.Columns.Add(r.GetName(i), r.GetFieldType(i)); object[] rowValues = new object[r.FieldCount]; while (r.Read()) { // не нашел метода получения значений всей строки, получаю поштучно for (int i = 0; i < r.FieldCount; i++) // мне нужны "чистые" значения, поэтому DBNull -> null rowValues[i] = object.Equals(r.GetValue(i), DBNull.Value) ? null : r.GetValue(i); dt.Rows.Add(rowValues); } }
    return dt; } }
    Так что междоменное взаимодействие с OracleConnection вполне реально, надо быть просто внимательнее. Всем спасибо за помощь

    Выборка из БД если поле принимает одно из перечисленных значений

    Столкнулся с проблемой - в таблице есть, к примеру, поле color, в которое может быть записано число от 1 до 12, и есть поле sect - в него записывается произвольный численный id. Хочу сформировать запрос по типу:
    $tmp = mysql_query("SELECT * FROM gone WHERE color = '1' OR color = '2' OR color = '4' AND sect = '5'");
    при том, чтобы выборка производилась, если sect = 5, а color равен либо 1 либо 2 либо 4. Можно ли такое?


    Ответ

    У вас не совсем верный запрос. У вас будет условие в виде "color=1 или color=2 или (color=4 и одновременно sect=5)", т.е. sect будет действовать только на color=4. Для того, чтобы распространилось на все, надо взять в скобки.
    Верный запрос будет как:
    SELECT * FROM gone WHERE (color = 1 or color = 2 or color = 4) and sect = `5`

    Работа рекурсивной функции, суть на машинном уровне

    void preOrderTravers(Node* root) { if (root) { printf("%d ", root->data); preOrderTravers(root->left); preOrderTravers(root->right); } }
    Как работает рекурсия? Вот допустим, что в обходе бинарного дерева мы вышли на левый нижний узел. Я так понимаю, формируются стек вызова рекурсивной функции, и, дойдя до тупика, машина переходит на предыдущий шаг и выполняет preOrderTravers(root->right). Так, да? Просто я где то что то читал но не могу сейчас найти.


    Ответ

    Каждый вызов функции преобразуется в команду типа call xxx. В результате выполнения этой команды в стек заносится адрес возврата. Пока не достигнуто дно рекурсии функция не завершается, а вызывает сама себя. Когда достигается дно рекурсии функция завершается. При этом выполняется команда типа ret, которая выполняет переход по сохранённому в стеке адресу - происходит возврат на один уровень вверх.
    Таким образом, в случае дерева, функция вызывает себя до достижения листа, что является признаком дна рекурсии. После этого происходит возврат из вызванных функций.

    Выбор нескольких дат на Календаре

    Я использую библиотеку MaterialDateTimePicker , и у меня два TextView (Откуда - Куда)... Так вот при нажатии на "Откуда", должен открыться диалоговое окно с календарем и там выбираю одну дату. Потом при открытии "Куда", предыдущая выбранная дата должна отображаться, то есть две даты выбираются. У меня пока для каждого textView по диалогу... Просто мне кажется это неправильный подход.
    Так вот хотел спросить, как использовать для обоих TextView один Диалог и при этом получать два результата? Где именно копать?


    Ответ

    Создайте локальную boolean переменную, назовите её, скажем, isFrom = false
    При клике на кнопку/вьюшку, которая вызывается диалог для "откуда" присваивайте Вашей булевой переменной значение true. Для диалога "Куда", соответственно false устанавливайте обратно.
    По идее Dialog у Вас открывается примерно таким способом:
    private void showDatePickerDialog() { Calendar now = Calendar.getInstance(); DatePickerDialog dpd = DatePickerDialog.newInstance( CreateEventActivity.this, now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) ); dpd.show(getFragmentManager(), "Datepickerdialog"); }
    Далее перекрываем onDateSet, в котором и будем смотреть в какое текстовое поле вставить значение
    @Override public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) { String month = String.valueOf(monthOfYear + 1); String day = String.valueOf(dayOfMonth); if (isFrom) fromTextView.setText(day + "." + (month) + "." + year); else whereTextView.setText(day + "." + (month) + "." + year); showTimePickerDialog(); }

    Обновить widget при изменения данных сайта http/https

    Я сделала виджет) который показывает статистику и новости, с сайта. Всё работает отлично. Я хочу чтоб он обновлялся, когда данные страницы меняются. Первая идея была делать запрос, и если данные изменились, то выводить уже к примеру уведомление."новые новости". Но начала читать и пишут, что это антипаттерн, так делать нельзя, тк батарея садится. А как тогда сделать? Есть ли возможность обновить виджет сразу, после такого как изменились определенные данные на страничке?


    Ответ

    Есть мысль использовать Push-уведомления и обновлять данные, когда придет пуш на устройство. Идея такая: веб-мастер правит страницу - посылается пуш на девайс - а далее несколько вариантов: либо особый запрос слать на сервер, либо какие-то данные получать из пуша. Но максимальный размер пуша - 4КБ.
    Ну и способ влоб вы уже частично описали: запрос в AlarManager, который например раз в час будет долбить сервер и обновлять виджет.

    Как запустить свое веб-приложение на Jetty в IntelliJ Idea

    Здравствуйте! Я разрабатываю Spring MVC веб-приложение и мне нужно чтобы оно работало на Jetty-сервере, не требующем внешнего контейнера. Я добавил сервер jetty стандартным образом через "edit run configuration". Он также успешно отображается в Project Structure.

    Но, когда я запускаю Jetty то он просто не запускается и выдает мне следущее:
    "C:\Program Files\Java\jdk1.8.0_65\bin\java" -DSTOP.PORT=0 -Dcom.sun.management.jmxremote= -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -DOPTIONS=jmx -Didea.launcher.port=7535 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.4\bin" -Dfile.encoding=windows-1251 -classpath "D:\jetty-distribution-9.3.7.v20160115\start.jar;C:\Program Files\Java\jdk1.8.0_65\lib\tools.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA 15.0.4\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain org.eclipse.jetty.start.Main --module=jmx C:\Windows\Temp\context4config\jetty-contexts.xml [2016-03-03 07:17:55,511] Artifact DVDExchange:war exploded: Server is not connected. Deploy is not available. Detected server http port: 8080 java.nio.file.AccessDeniedException: C:\Windows\Temp\context4config\jetty-contexts.xml at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83) at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:90) at sun.nio.fs.WindowsLinkSupport.getRealPath(WindowsLinkSupport.java:259) at sun.nio.fs.WindowsPath.toRealPath(WindowsPath.java:836) at sun.nio.fs.WindowsPath.toRealPath(WindowsPath.java:44) at org.eclipse.jetty.start.FS.toRealPath(FS.java:165) at org.eclipse.jetty.start.StartArgs.addUniqueXmlFile(StartArgs.java:217) at org.eclipse.jetty.start.StartArgs.resolveExtraXmls(StartArgs.java:1123) at org.eclipse.jetty.start.Main.processCommandLine(Main.java:342) at org.eclipse.jetty.start.Main.main(Main.java:74) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
    Usage: java -jar start.jar [options] [properties] [configs] java -jar start.jar --help # for more information Disconnected from server
    Process finished with exit code -9

    Возможно, одна из причин - это пустой файл jetty-web.xml



    Как мне все-таки застваить Jetty работать? Приведите пожалуйста весь список файлов что нужно описать, а еще лучше поделитесь живым примером (туториалом или исходником), где четко все описано что и зачем. Мне очень срочно нужно разобраться с этим jetty.


    Ответ

    Отвечаю на собственный вопрос, дабы поделиться со всеми опытом. Не во всех уроках есть информация о том, что нужно нажать галочку на Use custom context root

    Без этой галочки сервер и не запускался, хотя Intellij IDEA пропускала такую конфигурацию и не требовала, чтобы эта галочка была отмечена, т.е. спокойно можно было нажать Apply и без нее. В поле рядом с этим checkbox через слэш пишите что угодно, что хотите, чтобы отображалось в адресной строке браузера после localhost:8080. И вуаля - все работает.
    Также проверьте настройки версии языка в IDEA и конкретно в проекте - они должны удовлетворять требованиям вашей текущей версии сервера Jetty.
    Надеюсь вам это тоже поможет если у вас возникла подобная ситуация.

    Как рисовать в android

    вводим число n и рисуются n кругов соединенные между собой как можно реализовать что-то вроде этого


    Ответ

    Используйте для этих целей Canvas: http://developer.android.com/intl/ru/reference/android/graphics/Canvas.html http://developer.android.com/intl/ru/training/custom-views/custom-drawing.html
    Пример круга:
    canvas.drawCircle(mPointerX, mPointerY, mPointerSize, mTextPaint);

    Как распечатать символ стрелки?

    Выяснил, что символы стрелок имеют следующие ASCII коды:
    72 - вверх 75 - влево 77 - вправо 80 - вниз
    Но эти же коды имеют некоторые буквы в верхнем регистре.
    Возможно, эта информация ошибочна, но при проверке мне никак не удалось напечатать символы стрелок. Подскажите пожалуйста как это сделать через обычный printf? Поддерживается только ASCII.


    Ответ

    эти коды хоть и соответствуют стрелочкам, но не все так просто - они там составные. То есть, код стрелки - это два байта, а не один. И первый байт Вы забили указать. Этот байт - 224. То есть, код стрелки вверх - 224 72. Вот только распечатать их нельзя. Это управляющие символы клавиатуры. Более того, их нет в стандартной аски таблице.
    Когда то давно, когда был дос и нужны были стрелочки, делали кодогенераторы. То есть, готовиться своя таблица, в которой прописано отображение каждого символа. И можно взять часть символов, записать туда правильные картинки и использовать. Я даже не знаю, возможно ли это сейчас, но думаю, что все возможно. В любом случае, можно перевести видеорежим в графический и рисовать красиво.

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

    Требуется сохранить куку для всех под доменов, но не получается.
    Что не так? Код:
    function cetcooke(status) { var date = new Date; var SERVER_NAME = ".site.ru"; date.setDate(date.getDate() + 15); // время жизни куки document.cookie = "sound="+ status +"; expires="+date.toUTCString()+"; path='"+SERVER_NAME+"'"; // ставим куку }
    нажимаю на кнопочку сохраняет как для определенной страницы, но не для домена.
    Помогите решить проблему.


    Ответ

    Не верно в path данные записываете. Нужно так:
    path="/"
    А то что у Вас в переменной var SERVER_NAME = ".site.ru"; нужно записывать в domain
    Вот у меня всегда есть функция для создание cookie:
    function set_cookie ( name, value, exp_y, exp_m, exp_d, path, domain, secure ) { var cookie_string = name + "=" + escape ( value );
    if ( exp_y ) { var expires = new Date ( exp_y, exp_m, exp_d ); cookie_string += "; expires=" + expires.toGMTString(); }
    if ( path ) cookie_string += "; path=" + escape ( path );
    if (domain) cookie_string += "; domain=" + escape (domain);
    if ( secure ) cookie_string += "; secure";
    document.cookie = cookie_string; }
    Вот так использую:
    set_cookie('nameCookie', "valueInCookie", 0, 0, 0, "/");

    Возврат из функции

    Можно ли возвращать ссылку на локальную переменную? Будет ли это быстрее, чем возврат по значению?
    int const& func(...) { int x; ... return x; }


    Ответ

    Нет, возвращать ссылку на локальную переменную нельзя (т.е. компилятор допускает, но категорически не стоит так делать), так как в результате таких действий вы получите ссылку на область памяти, выделенную под локальную перемменную из функции, которая вышла из области видимости за её пределами. Вследствие чего, эта область памяти будет помечена, как свободная (заметьте, что она будет лишь помечена свободной, а не перезаписана 0-ми или чем-нибудь еще, что в общем случае зависит от конкретного компилятора), а в дальнейшем может в любой момент быть перезаписана кем-угодно (например, при выделении памяти под какую-нибудь другую переменную).
    Контрольный пример:
    #include
    int const& func() { int x = 1; return x; }
    int main() { const int& x = func(); std::cout << x << std::endl; // немаловероятно, что уже здесь область памяти будет перезаписана и результат будет "неожиданным" std::cout << x << std::endl; // нет уверенности даже в том, что в данной строчке будет выведно тоже значение, что и в предыдущей }
    Можете посмотреть здесь на примере компилятора gcc

    В тоже время, если воспользоваться локальной static переменной из функции (синглтон Майерса), то такое действие будет валидно, так как такая переменная будет "жить" все время "жизни" приложения. Вследствие чего, область памяти, выделенная под нее (на которую мы будем ссылаться), не будет помечена свободной все время "жизни" приложения (не следует так делать - это чисто для примера):
    #include
    int const& func() { static int x = 1; return x; }
    int main() { const int& x = func(); std::cout << x << std::endl; // 1 }

    Настройка меню в android

    Использую ToolBar и на нем эсть кнопка меню в виде трех точек! Мне нужно заменить ее на свое изображение ... Но я не знаю как !
    Прошу подсказки: как это можно сделать ???
    Или можно настроить так чтоб точки были другим цветом ???


    Ответ

    Чтобы заменить на свое изображение:


    Если хотите изменить цвет:

    Заменить все методом replaceAll без использования регулярных выражений

    Дано:
    Есть строка типа

    Задача:
    Надо убрать все встреченные максимально просто. Например, методом replaceAll().
    Пробовал:
    По аналогии с методом replace пробовал просто подставить ненужное первым аргументом, но оно не принимается, т.к. ожидает регулярное выражение, а Возможное решение:
    Я могу, конечно, пройтись циклом по строке и удалить всё методом replace... Но есть же метод replaceAll...
    Вопрос:
    Как должен выглядеть первый аргумент метода replacAll выбирающий ? Решение регулярками не предлагать)


    Ответ

    Так пробовали?
    System.out.print(" ".replaceAll("(<\\!\\[CDATA\\[)|(\\]\\]>)",""));
    Результат:
    ТУТ_ТЕКСТ И_ТУТ_ТОЖЕ И_ЕЩЁ
    ЗЫ Для студии есть плагин RegexpTester. ЗЗЫ Экранирование сделает студия сама, если вставлять регулярку внутрь строки.

    Spring перехват ошибок (404)

    Всем привет. Изучаю Java Web и Spring MVC. Столкнулся с такой проблемой. Нужно сделать свою страницу ошибок. Я не до конца понял как эти ошибки отлавливать. Понятно как отлавливать ошибки в контроллере типа ("page/${id}"). Мы ищем инфу по данному id и если такой нет, выбрасываем исключение или тупо редиректим куда нибудь. Тут всё понятно. Но я хочу, что бы это всё делалось не в каждом контроллере, а где то в одном месте и не важно по какому роуту была эта ошибка. Что то в роде такого. Прописать, что для всех исключений (404), мы резолвим такую jsp и передаём в модель то-то и то-то. И вообще пофиг какой роут вызвал эту ошибку. В общем как то так. Заранее благодарен.


    Ответ

    Spring Web построен на сервлетах. Чтобы наиболее полно ответить на ваш вопрос, давайте посмотрим под DispatcherServlet, который в Spring отвечает за обработку всех запросов.
    Вот код, который вызывается, если Spring не находит метод контроллера, который должен обрабатывать запрос:
    protected void noHandlerFound(HttpServletRequest request, HttpServletResponse response) throws Exception { if (pageNotFoundLogger.isWarnEnabled()) { pageNotFoundLogger.warn("No mapping found for HTTP request with URI [" + getRequestUri(request) + "] in DispatcherServlet with name '" + getServletName() + "'"); } if (this.throwExceptionIfNoHandlerFound) { throw new NoHandlerFoundException(request.getMethod(), getRequestUri(request), new ServletServerHttpRequest(request).getHeaders()); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND); } }
    Из него видно, что:
    Пишется сообщение в лог Если установлен флаг throwExceptionIfNoHandlerFound, то бросается исключение NoHandlerFoundException Если флаг throwExceptionIfNoHandlerFound не установлен, то вызывается метод объекта HttpServletResponse sendError()
    По умолчанию, флаг сброшен throwExceptionIfNoHandlerFound = false, т.е. вызывается метод sendError(), и как результат контейнер сервлетов переадресует вас на страницу ошибки. Чтобы переопределить эту страницу на собственную, согласно спецификации JEE. вам нужно задать параметр error-page в дескрипторе развертывания web.xml
    404 /404
    Соответственно, нужно создать и метод контроллера, который будет замапен на URL /404 и вернет нужную страницу.

    Может случиться так, что вам потребуется выкинуть пользователя на страницу 404 вручную. Глобально это можно сделать через аннотацию @ControllerAdvice, действия перечисленные в классе помеченным данной аннотацией являются дефолтными для всех контроллеров.
    Создаем собственный класс исключения:
    public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException() { super(); } }
    Ловим это исключение глобально для всех контроллеров, и перекидываем на /404
    @ControllerAdvice public class ExceptionInterceptor {
    @ExceptionHandler(ResourceNotFoundException.class) public ModelAndView handleError404(HttpServletRequest request, Exception e) { ModelAndView mv = new ModelAndView("/404"); return mv; } }
    Соотвественно чтобы выкинуть пользователя на 404 из любого контроллера, просто бросаете это исключение. Передать дополнительный параметры можно просто добавив нужных полей в класс исключения: собственный код ошибки, сообщение и т.д.

    Теперь когда у нас есть глобальный @ExceptionHandler можно вспомнить про флаг throwExceptionIfNoHandlerFound и сделать так, что 404 будет обрабатываться только в нем.
    Меняем значение флага:
    public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override public void customizeRegistration(ServletRegistration.Dynamic registration) { registration.setInitParameter("throwExceptionIfNoHandlerFound", "true"); } }
    И дописываем в @ExceptionHandler перехват соответствующего класса исключений:
    @ExceptionHandler(value = {ResourceNotFoundException.class, NoHandlerFoundException.class}) public ModelAndView handleError404(HttpServletRequest request, Exception e) { ModelAndView mv = new ModelAndView("/404"); return mv; }
    При этом параметры error-page обычно все равно стараются оставлять "на всякий пожарный случай" как fallback, чтобы пользователь вдруг не увидел трекстрейс, который Tomcat показывает в своих сообщениях по дефолту.

    Полезные ссылки на официальные примеры:
    error-page Spring error handling

    Выбор случайного значения в базе данных

    В общем есть база вида id | group | user
    Надо выбрать 1 случайную строку из 100 которая содержит group = "vip" , а user = "". И записать в user этой строки например 'что-то'. Как это сделать?
    UPD: Запрос в ответе не работает, выдает ошибку 1064, вот таблица, может что-то там поправить (ошибка у key).


    Ответ

    Самый простой вариант, это извлечь случайный идентификатор из этих таблиц
    SELECT id FROM tbl WHERE group = "vip" AND user = "" ORDER BY RAND() LIMIT 1
    Далее полученный таким образом идентификатор использовать для UPDATE-запроса
    UPDATE tbl SET user = 'что-то' WHERE id = 3432
    Будьте осторожны с ORDER BY RAND() на гигантских таблицах, так как это полный скан таблицы. Если есть возможность вычислить случайный идентификатор другим способом - хорошо бы им воспользоваться (однако, для этого нужно больше информации о проекте).

    Возможности options_from_collection_for_select

    есть
    .origin.select select#origin = options_from_collection_for_select(Airport.all, :id, :name)
    HTML получается каким

    Можно ли как то в options_from_collection_for_select для option задать отображение не только по :name но и по нескольким полям типа так:
    = options_from_collection_for_select(Airport.all, :id, ("#{:name} #{:city}(#{:country})")
    Что бы получилось как то так


    Ответ

    В классе, откуда вы извлекаете данные Airport следует реализовать метод, скажем full_name, который будет возвращать строку, эквивалентную той, которую вы хотите вызывать
    class Airport
    def full_name # Тут формируете нужный вам формат вывода "#{self.name} #{self.city}(#{self.country})" end
    end
    тогда вы можете вызвать этот новый метод, передав в третьем параметре символ с его именем
    .origin.select select#origin = options_from_collection_for_select(Airport .all, :id, :full_name)

    как организовать контроль date на нескольких машинах?

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


    Ответ

    я проверяю время на машинах таким скриптом:
    #!/bin/bash
    for i in "$@"; do echo -n "$i " r=$(ssh $i TZ=UTC /bin/date -R) l=$(TZ=UTC /bin/date -R) if [ "$r" != "$l" ]; then echo "remote: $r local: $l" else echo ok fi done
    используется беспарольный ssh-доступ (так удобнее, чтобы пароли постоянно не вводить). пример вызова:
    $ этот-скрипт user1@host1 user2@host2 user1@host1 remote: Mon, 14 Mar 2016 11:48:38 +0000 local: Mon, 14 Mar 2016 11:48:40 +0000 user2@host2 ok
    видно, что на host1 часы отстают примерно на две секунды от часов на локальной машине, где запускался скрипт.
    сравниваются, собственно, строки, возвращаемые командой /bin/date -R, т.е., если разница во времени немного меньше секунды, в большинстве случаев сравнение даст положительный результат.

    для большей точности лучше поставить пакет с ntpd (обычно пакет так и называется). тогда и сверять время надо будет только в диагностических целях. даже если у машин нет выхода в интернет, с помощью ntpd можно настроить синхронизацию между ними, без привязки к внешнему миру.

    Автоматическое изменение цвета у заданных слов в Sublime Text

    Необходимо, чтобы, например, набор символов тест в документах, открытых Sublime Text 3, всегда был оранжевого цвета; <пример> — красного, @stackoverflow — синего и т. п. . Не подсветка, а именно другой цвет. Особо не имеет значения, сразу во всех цветовых схемах или же только в той, которой пользуюсь
    Цель — хочется простенький ToDo-менеджер прямо в Sublime Text, где разноцветные слова выполняли бы роль тегов, по которым легко ориентироваться. ToDo-плагин PlainTasks не устраивает.
    Возможно ли так сделать?


    Ответ

    Решение проверено в Windows XP и новейшей (на март 2016) версии редактора — Sublime Text 3 Build 3103.
    Если установлена более старая версия Sublime Text 3, скачиваем Build 3103 с официального сайта, для 64-битной Windows и других операционных систем ссылки тут В верхнем меню Sublime Text 3 открываем Preferences ► Browse Packages... , в папке User создаём файл ToDo Manager.sublime-settings, куда копируем следующее содержимое:
    %YAML 1.2 --- # http://www.sublimetext.com/docs/3/syntax.html name: ToDo Manager file_extensions: - task scope: text.task contexts: main: - match: (?i)@Работа scope: meta.work - match: (?i)@Проект1 scope: meta.project1 - match: (?i)@Срочно scope: meta.avral
    Где ToDo Manager — имя файла подсветки, которое должно совпадать с именем до расширения .sublime-settings только что созданного нами в папке User файла; task — расширение файлов, при открытии которых программой Sublime Text 3 будет функционировать наша подсветка, должно совпадать со словом после scope: text. в следующей строке (не поставил расширение todo, поскольку оно уже зарезервировано плагином ).
    Если теги нашего ToDo-менеджера будут иметь вид @'Название тега', вписываем их, как в примере выше, желаете по-другому — используйте вместо @ свой вариант. Взамен work, project1 и avral можно вписать любые значения, лишь бы они совпадали с дальнейшей вставкой.
    Как лучше всего подобрать цветовую схему для Sublime Text 3. Переходим на страницу онлайн-сервиса TmTheme Editor, в левом меню выбираем предпочтительную цветовую схему, настраиваем её в зависимости от наших пожеланий. Доступен предпросмотр цветов и подсветки для различных языков разметки/программирования:
    TmTheme Editor http://pokit.org/get/img/4ba225a894915a99fbc8dacf4367e80b.jpg
    Save ► Download — сохраняем файл в папку, где хранятся цветовые схемы: Preferences ► Browse Packages... ► User. Переключение на схему осуществляется посредством Preferences ► Color Scheme ► User
    Перед следующими строками в конце файла цветовой схемы
    uuid 6B90703E-4E4B-43C8-9D32-921BEDF6D725 colorSpaceName sRGB semanticClass theme.dark.espresso_libre

    вставляем текст:
    name work scope meta.work settings background fontStyle foreground Yellow name project1 scope meta.project1 settings background fontStyle foreground #00FF00 name avral scope meta.avral settings background fontStyle foreground Red
    Значения должны совпадать с теми, что мы вписывали в файл ToDo Manager.sublime-settings. Между тегами вводим цвета. Лучше прописывать их в HEX, а не X11 colors, поскольку в Sublime Text 3 могут некорректно отображаться как минимум цвета aqua, fuchsia и lime
    Для подсветки цветов в форматах HEX и RGB служит плагин ColorHighlighter. Самый простой способ установки — через Package Control: в Sublime Text 3 нажимаем Ctrl+Shift+P ► в открывшуюся строку вводим Package Control: Install Package ► среди всплывающих вариантов выбираем соответствующий пункт ► теперь вводим в ту же строку Color Highlighter ► среди всплывающих вариантов выбираем соответствующий пункт ► плагин установлен.
    Создаём файл с расширением .task . Открываем его нашим Sublime Text 3, выполняем: View ► Syntax ► Open all with current extension as... ► User ► ToDo Manager. Пробуем в этом же файле, что у нас получилось:

    Всё, раскрашиваем содержимое task-файлов, как душе угодно. Спасибо за подробное объяснение ув-мому Мэтту Моррисону

    Вызов телефонного звонка из приложения (обработка исключений)

    Для вызова телефонного звонка из приложения использую код:
    androidVersion = Integer.parseInt(Build.VERSION.RELEASE.substring(0, 1)); String contact_number="123456789"; Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + contact_number)); if (androidVersion < 5) callIntent.setPackage("com.android.phone"); else callIntent.setPackage("com.android.server.telecom"); startActivity(callIntent);
    Т.е. если версия Андроид < 5, использую setPackage: "com.android.phone". Версия 5 и более - использую setPackage: "com.android.server.telecom"
    Но, как показала практика, не все смартфоны с 5 версией используют "com.android.server.telecom". Подскажите, плиз. как обработать такое исключение, чтобы не попасть на ".ActivityNotFoundException android.intent.action.CALL" и какой setPackage использовать в ОС Андроид 6.0 ?!
    Заранее, благодарю!


    Ответ

    А если попробовать вот так:
    String contact_number="123456789"; Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + contact_number)); try { callIntent.setPackage("com.android.phone"); startActivity(callIntent); } catch(Exception e) { callIntent.setPackage("com.android.server.telecom"); startActivity(callIntent); }

    Как сделать, чтобы команда tree не выводила некоторые файлы?

    Как переписать регулярное выражение из примера ниже, чтобы не выводились дополнительно к файлами *.*~ ещё и файлы вида *.pyc?
    dzmitry@mycomp:~/myenv/myproj$ tree -I *.*'~' . ├── db.sqlite3 ├── manage.py ├── myapp1 │   ├── admin.py │   ├── apps.py │   ├── __init__.py │   ├── migrations │   │   ├── 0001_initial.py │   │   ├── __init__.py │   │   └── __pycache__ │   │   ├── 0001_initial.cpython-34.pyc │   │   └── __init__.cpython-34.pyc │   ├── models.py │   ├── __pycache__ │   │   ├── admin.cpython-34.pyc │   │   ├── apps.cpython-34.pyc │   │   ├── __init__.cpython-34.pyc │   │   ├── models.cpython-34.pyc │   │   ├── urls.cpython-34.pyc │   │   └── views.cpython-34.pyc │   ├── templates │   │   └── myapp1 │   │   ├── form.html │   │   └── result.html │   ├── tests.py │   ├── urls.py │   └── views.py └── myproj ├── __init__.py ├── __pycache__ │   ├── __init__.cpython-34.pyc │   ├── settings.cpython-34.pyc │   ├── urls.cpython-34.pyc │   └── wsgi.cpython-34.pyc ├── settings.py ├── urls.py └── wsgi.py
    8 directories, 29 files dzmitry@mycomp:~/myenv/myproj$


    Ответ

    Символ | (or) нужно просто экранировать в командной строке linux, иначе она его рассматривает как pipe:
    tree -I *.*'~'\|*.pyc
    либо же взять выражение в кавычки:
    tree -I '*.*'~'|*.pyc'

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

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


    Ответ

    Вам поможет функция PHP array_chunk(), которая разбивает массив на несколько мелких по N элементов. Например:
    array_chunk( [1,2,3,4,5,6,7,8], 3) // даст [ [1,2,3], [4,5,6], [7,8] ]
    Склеить элементы массивов можно функцией implode(). Например:
    implode( ":", [1,2,3]) // даст "1:2:3"
    Сможете дальше сами?

    Привязка команды к нажатию клавиши в TextBox

    Есть текстовое поле и кнопочка рядом. Кнопочке назначена команда. В качестве параметра передается текст текстового поля. Вопрос, а как ту же самую команду использовать для текстового поля по нажатии клавиши Enter, например?


    Ответ

    Нашел решение

    Точно так же можно привязываться к действиям мыши через MouseBinding

    регулярное выражение, удаляющее комментарии. Perl

    Задание: есть текст, допустим abc/*de/*f*/m*/x с комментариями, которые нужно удалить регулярным выражением, причем, если в комментарии есть вложенный комментарий, то сначала надо удалить его.
    У меня получилось что-то такое:
    while ($string =~ m|/\*(.*?)\*/|) { $string =~ s|(/\*((?!(.*?/\*).*?).*?)\*/.*?)|$_|; print ""$string
    ; }
    Получим:
    abc/*de/*f*/m*/x abc/*dem*/x abcx
    И все вроде работает хорошо, но если в примере будут идти два комментария подряд, допустим теперь строка abc/*de/*f*/*/x, то программа зациклится.
    Подскажите, как можно решить эту проблему.


    Ответ

    $string="abc/*def/*gh/*j*/ik*/lmn*/opq/*r/*st*/uvw*/xyz"; print "$string

    "; while($string=~m|/\*.*?\*/|) { # До тех пор пока комментарии остались $string=~s|/\*((?!.*?(?0)).*?)\*/||; # Вырезаем один print "$string
    "; }
    Результат:
    abc/*def/*gh/*j*/ik*/lmn*/opq/*r/*st*/uvw*/xyz
    abc/*def/*gh/*j*/ik*/lmn*/opq/*ruvw*/xyz abc/*def/*gh/*j*/ik*/lmn*/opqxyz abc/*def/*ghik*/lmn*/opqxyz abc/*deflmn*/opqxyz abcopqxyz
    Смысл вырезающей регулярки:
    /\* # Комментарий открылся ( # Выделяющая группа (?!.*?(?0)) # Внутри которой не содержится еще одно выражение .*? ) \*/ # Комментарий закрылся
    Основа в ссылке (?0), которая на свое место подставляет текст всего выражения целиком, рекурсивно.

    Как просмотреть все коммиты в git?

    Потерялся коммит из неродительской ветки. Как сделать checkout?
    git log его не видит


    Ответ

    для просмотра всех коммитов во всех ветках (с псевдо-графическими элементами для отображения связей между коммитами) можно использовать команду:
    $ git log --all --graph --decorate
    пример вывода для репозитория git-up (вставляю картинкой, чтобы показать раскраску):


    если эти параметры надо использовать часто, можно сделать псевдоним (alias). например, la
    $ git config --global alias.la 'log --all --graph --decorate'
    тогда можно будет вызывать ту же команду короче:
    $ git la

    Как правильно организовать базу данных

    Столкнулся с такой проблемой. У отелей есть много услуг (например трансфер, парковка, интернет и т.д.), так же у каждой комнаты в отеле могут быть разные услуги (минибар, балкон, вид на море/парк и т.д.). Получается что объект (отель или комната) предоставляют услуги. Связь многие ко многим.
    Таблица будет выглядеть примерно так (составной внешний ключ)

    А как связать модели?
    class Service < ActiveRecord::Base has_many :service_in_object has_many :hotels, through: :service_in_object end
    class ServiceInObject < ActiveRecord::Base belongs_to :object #хмм belongs_to :service end
    class Hotel < ActiveRecord::Base has_many :rooms
    has_many :service_in_object has_many :service, through: :service_in_object end
    class Room < ActiveRecord::Base belongs_to :hotel
    has_many :service_in_object has_many :service, through: :service_in_object end
    Как правильно это организовать?


    Ответ

    У вас получается полиморфная связь, которую нужно ввести при помощи ключевого слова polymorphic. Если не возражаете, я немного переделаю таблицу service_in_objects, чтобы избавиться от object - не очень хорошее название, давайте сделаем serviceable. Миграции для таблиц могут выглядеть следующим образом
    create_table :hotels, comment: "Оттели" do |t| t.string :title, comment: "Название" end
    create_table :rooms, comment: "Комнаты" do |t| t.string :title, comment: "Номер" t.integer :hotel_id, comment: "Внешний ключ для связи с оттелем" end
    create_table :services, comment: "Сервисы" do |t| t.string :title, comment: "Название" end
    create_table :service_in_objects, comment: "Промежуточная cвязующая таблица" do |t| t.integer :service_id, comment: "Внешний ключ для связи с сервисом" t.integer :serviceable_id, comment: "Внешний ключ для связи с оттелем или комнатой" t.string :serviceable_type, comment: "Внешний ключ для связи с оттелем или комнатой" end
    Тогда модели с учетом полиморфной связи через промежуточную таблицу service_in_objects могут принять следующий вид
    class Service < ActiveRecord::Base has_many :service_in_objects
    has_many \ :rooms, through: :service_in_objects, source: :serviceable, source_type: 'Room' has_many \ :hotels, through: :service_in_objects, source: :serviceable, source_type: 'Hotel' end
    class ServiceInObject < ActiveRecord::Base belongs_to :service belongs_to :serviceable, polymorphic: true end
    class Hotel < ActiveRecord::Base has_many :rooms
    has_many :service_in_objects, as: :serviceable, dependent: :destroy has_many :services, through: :service_in_objects end
    class Room < ActiveRecord::Base belongs_to :hotel
    has_many :service_in_objects, as: :serviceable, dependent: :destroy has_many :services, through: :service_in_objects end
    Убедиться в том, что полиморфная связь работает, можно при помощи сидов (db/seed.rb):
    ActiveRecord::Base.connection.execute('TRUNCATE hotels'); ActiveRecord::Base.connection.execute('TRUNCATE rooms'); ActiveRecord::Base.connection.execute('TRUNCATE services'); ActiveRecord::Base.connection.execute('TRUNCATE service_in_objects');
    services = [{title: 'internet'}, {title: 'parking'}, {title: 'service1'}] Service.create services
    hotels = [{title: 'mariot'}, {title: 'hilton'}] Hotel.create hotels Hotel.all.each do |h| h.rooms.create [{title: '1'}, {title: '2'}, {title: '4'}] h.services << [Service.all.sample, Service.all.sample] h.save end
    Room.all.each do |r| r.services << [Service.all.sample, Service.all.sample] r.save end
    В реальном проекте настоятельно рекомендуется покрыть тестами хотя бы связи - у вас примере идущем с вопросом явные ошибки с единственным/множественным числом - тесты вас сильно выручат на данном этапе. Напортачить в связях не сложно, модели будут работать и со сломанными связями, только воспользоваться ими не получится и при этом сообщения об ошибках на сломанных связях не совсем очевидны.
    Обратите внимание:
    Связь belongs_to - всегда единственное число, has_many - всегда множественное число.
    Название таблиц - всегда множественное число, название моделей - всегда единственное число.

    CSS размер текста относительно чего?

    Если написать так, то размер текста будет 150% от его стандартного размера или 150% от размера блока в котором он находится?
    p { font-size: 150%; }


    Ответ

    За 100% берется размер шрифта родительского элемента.
    Источник
    А здесь можете поиграться.

    Вопросы по docker'у

    Зашел сегодня на vps и увидел загрузку cpu под 100%, потом посмотрел статистику по контейнерам и заметил такую занимательную вещь:
    CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O kibana 96.45% 536.8 MB / 536.9 MB 99.99% 884.5 MB / 306.2 MB 2.682 TB / 5.369 GB
    Отсюда несколько вопросов:
    Как ограничить использование cpu докером или может есть софт, который сам прибивает процессы, если они выходят за определенные рамки? Что значат 2 последних столбца и откуда терабайты в последнем?


    Ответ

    Документация, сэр. Можно настроить пропорцию выделяемого контейнеру (конкретному!) процессорного времени с помощью параметра cpu-shares (по умолчанию "всем поровну", по 1024); а можно задать параметры для CFS: cpu-quota процессорного времени за cpu-period реального: настраиваются оба, целыми числами в микросекундах (1000..1 000 000). Все параметры задаются при docker run. Shares мягче, с ними контейнеру позволяется забирать почти весь процессор, если больше им никто особо не пользуется; когда CFS ставит "жёсткий потолок на все времена". Общий объём операций ввода/вывода над "блочными устройствами", например дисками. Чтение одних и тех же данных, при условии отсутствия кэширования, будет каждый раз увеличивать этот счётчик, поэтому это число вполне себе может превышать общий объём всех подключенных устройств. То же самое с записью: перезапись данных счётчиком учитывается, как обычная запись.

    Listview раскрывающиеся элементы

    Подскажите пожалуйста как сделать вот такие дочерние объекты у listview? Точнее как называется тип этих дочерних объектов, а дальше я уже сам разберусь :)


    Ответ

    Из описания неясно, что у вас за задача, поэтому посмотрите две вещи:
    Класс Expander — элемент управления, реализующий подобное разворачивание. Состоит из нажимаемого заголовка и разворачиваемого содержимого. Свойство CollectionViewSource.GroupDescriptions и всё с ним связанное, при помощи которого реализуется "родная" группировка в списках. В конечном счёте по умолчанию она работает через тот же Expander.

    Запрет неявного преобразования

    struct B; struct A { operator B(); }; struct B { B operator + (B) {return B();} }; A::operator B() { return B(); } int main() { A x; B y; y+x; // Как запретить неявное преобразование для данного оператора/ группы операторов? };


    Ответ

    Неявное преобразование можно запретить так:
    struct A { explicit operator B(); };
    Теперь только явно можно преобразовать A в B

    Если же хочется оставить неявное преобразование в целом, но в частных случаях оно нежелательно, тогда можно воспользоваться таким трюком:
    #include //... struct B { template::value>> B operator + (TB) { return B(); } };

    Как выбрать последние сообщения?

    Есть вот такая таблица : id | id_from | id_for | message | message_status И есть такой запрос:
    SELECT m.message AS message, fu.username AS username, fu.img AS img, fu.id as id, m.message_status as status, m.id as idm FROM users AS fu LEFT JOIN user_message AS m ON m.id_for = fu.id WHERE m.id_from = "'.$_SESSION['id'].'" order by idm desc
    Сейчас он выбирает первое сообщение в чате между пользователями, а мне нужно последнее. Т.е message где id больше предыдущих сообщений


    Ответ

    Правильно ли я понимаю, что вам нужна информация об одном сообщении и соответствующему ему пользователю? Вам обязательно решить задачу одним запросом? Там будет один основной и 3 коррелированных запроса или JOIN. Это не всегда самый продуктивный путь - уложить все в один запрос. Выполните два запроса - это тоже не так много. Первым запросом извлеките всю информацию об адресатах
    SELECT message AS message, id_for AS id_for, message_status as status, id as idm FROM user_message WHERE id_from = "'.$_SESSION['id'].'" ORDER BY m.id DESC
    В цикле вы помещает всю информацию об ответах в массива $answers, плюс дополнительно готовите массив $id_for с идентификаторами пользователей. Далее выполняете запрос
    SELECT * FROM user WHERE id IN ( ".implode(",", $id_for)." )
    Помещаете информацию обо всех пользователей в ассоциативный массив $users, в котором ключем служит идентификатор пользователя. Затем в цикле формируете таблицу ответов $answers, когда нужно получить информацию о пользователе обращаетесь к массиву $users
    $users[$answers['id_for']]

    Двумерный массив, задача. Помогите разобраться

    Дан двумерный массив N*N, который содержит несколько прямоугольников. Различные прямоугольники не соприкасаются и не накладываются. Внутри прямоугольник весь заполнен 1-ками. В массиве:
    1) a[i, j] = 1, если элемент (i, j) принадлежит какому-либо прямоугольнику
    2) a[i, j] = 0, в противном случае. getRectangleCount должен возвращать количество прямоугольников.
    Метод main не участвует в тестировании:
    public class ArrayWithRectsGetThemCount21032016 { public static void main(String[] args) { byte[][] a = new byte[][]{ {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 1} }; int count = getRectangleCount(a); System.out.println("count = " + count + ". Должно быть 2"); } public static int getRectangleCount(byte[][] a) { return 0; } }


    Ответ

    Задача довольно несложная. Метод - делаем почти также, как если бы делали на листочке:
    public static void main(String[] args) { byte[][] a = new byte[][]{ {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 1} }; int count = getRectangleCount(a); System.out.println("count = " + count + ". Должно быть 2"); } public static int getRectangleCount(byte[][] a) { int count = 0, tmp = -1, jt = a[0].length; boolean findRect = false; while (tmp != count) { //если счётчик увеличился за проход по матрице - снова делаем проход по матрице tmp = count;
    outerloop: for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[0].length; j++) { if (a[i][j] == 1 && !findRect) { //случай, когда встретили прямоугольник count++; jt = j; //запоминаем столбец, в котором начался прямоугольник findRect = true; a[i][j] = 0; } else if (a[i][j] == 1 && findRect) {//обнуляем, чтобы не мешался a[i][j] = 0; } else if (a[i][j] == 0 && findRect && j == jt) { //если элемент под прямоугольник равен 0 - он закончился break outerloop; //выходим из внешнего цикла } else if (a[i][j] == 0 && findRect && j > jt) { //если элемент справа от прямоугольника равен 0 - идем на след строку break; } } } findRect = false; } return count; }
    Вывод программы:
    count = 2. Должно быть 2
    ¯ \ _ (ツ) _ / ¯

    Android. Неявный Intent

    Вот тут написано: "При вызове метода startActivity() система анализирует все установленные приложения, чтобы определить, какие из них могут откликнуться на объект Intent этого вида.... ....Если объект Intent принимают несколько операций, система отображает диалоговое окно, в котором пользователь может выбрать приложение для выполнения данного действия."
    Возник вопрос - можно ли исключить из диалогового окна конкретное приложение, если оно установлено у пользователя?


    Ответ

    Как вариант кастомизировать выбор приложения.
    Получить список
    Intent videoIntent = new Intent(android.content.Intent.ACTION_VIEW); videoIntent.setDataAndType(Uri.parse("url"), "video/*"); List video = getPackageManager().queryIntentActivities(videoIntent, 0); ArrayList list = new ArrayList(); for (ResolveInfo info : video){ if(!info.activityInfo.packageName.equals("packageName")){ list.add(info.loadLabel(getPackageManager()).toString()); } }
    Предложить выбор
    AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select"); builder.setItems(list.toArray(new String[list.size()]), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //... } }); builder.show();

    Picasso, русские символы в названии картинки

    У меня есть адаптер, который должен брать адрес картинки с объекта класса и передавать его в метод Picasso.
    Но дело в том, что картинка имеет адрес с русскими символами, или в пути адреса русские символы, поэтому Picasso не хочет её грузить, как я понял. Какие пути решения можно использовать?
    В пути адреса "http://" тоже добавлял, не помогло. Другие картинки грузит(проверял закомментированной строкой)
    URLDecoder и URLEncoder уже методом тыка начал использовать, думал в другой кодировке сработает, нет, не сработало =(
    GIF формат вроде бы поддерживается Picasso, поэтому не грешу на расширение картинки
    public View getView(int position, View convertView, ViewGroup parent) { // LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); // 3 обязательные строки при создании Array адаптера View newView = vi.inflate(R.layout.item_news, parent, false); // (в Cursor адаптере метод bindview)
    TextView tv1 = (TextView) newView.findViewById(R.id.textListViewZagolovok); TextView tv2 = (TextView) newView.findViewById(R.id.textListViewOpisanie); ImageView imv = (ImageView) newView.findViewById(R.id.imageListViewNovosti); String url = abc.get(position).image; // String url = "https://i.ytimg.com/vi/-DRziE7lYsk/hqdefault.jpg"; Log.e("pic in adapter", url); tv1.setText(abc.get(position).title); tv2.setText(abc.get(position).content);
    try{ // вот здесь косячит Picasso.with(context).load(URLEncoder.encode(url)).placeholder(R.drawable.headeronmenu).error(R.drawable.krest).into(imv); Log.e("encode", "0 " + url); Log.e("encode", "1 " + URLEncoder.encode(url, "UTF-8")); Log.e("encode", "2 " + URLDecoder.decode(url, "UTF-8"));
    }catch (UnsupportedEncodingException e){ e.printStackTrace(); }
    if(position == abc.size()-4 && !flagDow){ flagDow = true; downNextPage.startDowNextPage(); }
    return newView; }
    Логи:
    03-24 10:42:55.525 21687-21687/ru.diitcenter.lakdistrict E/pic in adapter: gazikumuh.ru/images/2016/ЦиркХури.gif 03-24 10:42:55.640 21687-21687/ru.diitcenter.lakdistrict E/encode: 0 gazikumuh.ru/images/2016/ЦиркХури.gif 03-24 10:42:55.645 21687-21687/ru.diitcenter.lakdistrict E/encode: 1 gazikumuh.ru%2Fimages%2F2016%2F%D0%A6%D0%B8%D1%80%D0%BA%D0%A5%D1%83%D1%80%D0%B8.gif 03-24 10:42:55.645 21687-21687/ru.diitcenter.lakdistrict E/encode: 2 gazikumuh.ru/images/2016/ЦиркХури.gif 03-24 10:42:55.720 21687-21687/ru.diitcenter.lakdistrict E/pic in adapter: gazikumuh.ru/images/2016/КурклиКультура.gif 03-24 10:42:55.720 21687-21687/ru.diitcenter.lakdistrict E/encode: 0 gazikumuh.ru/images/2016/КурклиКультура.gif 03-24 10:42:55.725 21687-21687/ru.diitcenter.lakdistrict E/encode: 1 gazikumuh.ru%2Fimages%2F2016%2F%D0%9A%D1%83%D1%80%D0%BA%D0%BB%D0%B8%D0%9A%D1%83%D0%BB%D1%8C%D1%82%D1%83%D1%80%D0%B0.gif 03-24 10:42:55.725 21687-21687/ru.diitcenter.lakdistrict E/encode: 2 gazikumuh.ru/images/2016/КурклиКультура.gif 03-24 10:43:00.760 21687-21687/ru.diitcenter.lakdistrict E/111: AboutNewsActivity.url = gazikumuh.ru/images/2016/ЦиркХури.gif
    (Картинки в браузере открываются)


    Ответ

    При помощи ссылок ниже, сделал метод
    [https://stackoverflow.com/questions/9366742/android-regular-expression-return-matched-string ]
    [http://www.javaportal.ru/java/articles/regexp.html ]
    public String convertUrl(String url){ Pattern p = Pattern.compile("[А-я]+_+[А-я]+_[А-я]+|[А-я]+_+[А-я]+|[А-я]+-+[А-я]+-+[А-я]+|[А-я]+-+[А-я]+|[А-я]+[0-9]+[А-я]+|[0-9]+[А-я]+|[А-я]+"); Matcher m = p.matcher(url); if(m.find()) { Log.e("regular", m.group(0)); String s = m.group(0);
    try { Log.e("regula2", URLEncoder.encode(s, "UTF-8")); return url.replace(s, URLEncoder.encode(s, "UTF-8")); } catch (UnsupportedEncodingException e) {
    } } return url; }
    Он переводит названия, в которых есть символы типа
    http://gazikumuh.ru/images/2016/Прием_граждан_в.jpg http://gazikumuh.ru/images/2016/Прием_граждан.jpg http://gazikumuh.ru/images/2016/первый-второй-третий.jpg http://gazikumuh.ru/images/2016/первый-второй.jpg http://gazikumuh.ru/images/2016/первый0886796второй.jpg http://gazikumuh.ru/images/2016/0886796текст.gif http://gazikumuh.ru/images/2016/текст.gif
    Где "[А-я]" это 1 русский символ, "+" это свойство множества
    "[А-я]+" набор русских символов
    "[А-я]+_+[А-я]+" это слово_слово или слово______слово
    Мои условия разделяются символом " | " и если 1е условие не выполнится, произойдёт переход на второе условие и так далее.
    Спасибо людям, оставившим комменты, я использовал их советы