Страницы

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

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

Вопросы по 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е условие не выполнится, произойдёт переход на второе условие и так далее.
Спасибо людям, оставившим комменты, я использовал их советы