Страницы

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

Показаны сообщения с ярлыком обновление. Показать все сообщения
Показаны сообщения с ярлыком обновление. Показать все сообщения

среда, 22 января 2020 г.

Вывод данных в консоль, с ее очисткой

#java #консоль #обновление


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

boolean[][] dots = new boolean[5][5];

    Random randomBoolean = new Random();

    //Now i want to create a table with random boolean values
    //Eternal loop
    for (;;) {
        try {
            Thread.sleep(500);
            for (int i = 0; i < 5; i++)
            {

                for (int j = 0; j < 5; j++)
                    {
                    dots[i][j] = randomBoolean.nextBoolean();
                    System.out.print(dots[i][j] + "\t");
                    }
                    //Close the column
                System.out.println();
            }
           System.out.println();
        }
        catch (InterruptedException e)
        {
        }

    }


Что и куда мне нужно для этого добавить? 
Спасибо
    


Ответы

Ответ 1



Сама Java очищать консоль не умеет. Но есть небольшая библиотечка, позволяющая отправлять управляющие последовательности в любую ANSI-совместимую консоль - Jansi: import java.util.Random; import org.fusesource.jansi.AnsiConsole; public class Main { public static void main(String[] args) { AnsiConsole.systemInstall(); Random randomBoolean = new Random(); for (;;) { System.out.print("\u001b[2J"); System.out.flush(); try { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.print(randomBoolean.nextBoolean() + "\t"); } System.out.println(); } System.out.println(); Thread.sleep(500); } catch (InterruptedException e) {} } } }

вторник, 31 декабря 2019 г.

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

#android #установка #обновление


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

Если пользователь обновляет приложение, то хочу выводить всплывающее окно. 

При первичной же установке с GooglePlay это окно не должно появляться.

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


Ответы

Ответ 1



Есть такой подход - регистрируем ресивер на переустановку своего приложения: public class MyAppUpdatedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // этот код будет выполнен после каждой переустановки // но при первой установке не вызывается } } Другой вариант: записываем куда-нибудь номер версии и при каждом старте сравниваем с текущим, если изменился - выводим ченжлог

Ответ 2



Можно так проверять: public static boolean isFirstInstall() { try { long firstInstallTime = App.getContext().getPackageManager().getPackageInfo(getPackageName(), 0).firstInstallTime; long lastUpdateTime = App.getContext().getPackageManager().getPackageInfo(getPackageName(), 0).lastUpdateTime; return firstInstallTime == lastUpdateTime; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return true; } } public static boolean isInstallFromUpdate() { try { long firstInstallTime = App.getContext().getPackageManager().getPackageInfo(getPackageName(), 0).firstInstallTime; long lastUpdateTime = App.getContext().getPackageManager().getPackageInfo(getPackageName(), 0).lastUpdateTime; return firstInstallTime != lastUpdateTime; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); return false; } }

Ответ 3



Все очень просто. В теории: Вы получаете программно текущую версию кода приложения, сохраняете её в SharedPrefereneces, и делаете условие, если сохраненная версия соответствует текущей версии, не происходит ничего. То есть, юзер впервые скачал приложение, версия кода у которого равна 1, или пусть 32, и этот номер сохраняется. И как только сохраненный номер кода станет меньше текущего, это будет означать что приложение обновили, тогда выполняется условие вызова диалогового окна например, со списком изменений. На практике: // Реализовываем SharedPreferences SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(this); @SuppressLint("CommitPrefEdits") SharedPreferences.Editor mEditor = mPreferences.edit(); // Получаем текущую версию кода int versionCode = BuildConfig.VERSION_CODE; // Получаем сохраненную версию кода int lastVersionCode = mPreferences.getInt("update_true", versionCode); // Если lastVersionCode меньше чем текущий versionCode выполняется условие if (lastVersionCode < versionCode) { // Вызываем диалоговое окно со списком измненений } // Сохраняем текущую версию кода mEditor.putInt("update_true", versionCode).apply();

вторник, 10 декабря 2019 г.

Игнорирование ненужного пакета-зависимости при обновлении

#linux #archlinux #обновление #зависимости


TL;DR Arch Linux, pacman, два пакета конфликтуют, первый нужен, а второй является
зависимостью нужного meta-пакета. Удалил второй пакет, но при обновлении pacman выдаёт
ошибку, как убрать её?



В arch linux есть пакеты openbabel и babel-cli, которые конфликтуют. Пакет openbabel
является зависимостью пакета kalzium, тот является зависимостью пакета kde-meta-kdeedu,
который является зависимостью пакета kde-applications-meta. Вот схема зависимости:

kde-applications-meta
|
v
kde-meta-kdeedu
|
v
kalzium
|
v
openbabel


Пакет kde-applications-meta скорее всего полезный, так что его удалять нельзя. Пакет
openbabel мне не нужен (там что-то, связанное с химией), поэтому при установки пакета
babel-cli я удалил пакет openbabel, выполнив pacman -Rdd openbabel. Однако теперь при
обновлении системы (pacman -Syu) pacman пытается заново установить openbabel (как зависимость
kalzium), и у него, конечно, не получается:

разрешение зависимостей...
проверка конфликтов...
ошибка: обнаружен неразрешимый конфликт пакетов
ошибка: не удалось подготовить транзакцию (конфликтующие зависимости)
:: 'babel-cli' и 'openbabel' конфликтуют


Какой наиболее правильный способ сказать pacman'у, чтобы он при обновлении kalzium
не пытался установить openbabel?



В комментариях советуют добавить пакет openbabel к игнорируем с помощью строки IgnorePkg
в файле /etc/pacman.conf. Совет хороший, но тогда каждый раз при обновлении pacman
будет спрашивать, примерно так:

разрешение зависимостей...
предупреждение: пропуск пакета openbabel-2.4.1-4
предупреждение: не удалось разрешить "openbabel", зависимость "kalzium"
:: Этот пакет не может быть обновлен из-за неразрешимых зависимостей:
      kalzium

:: Вы уверены что хотите пропустить этот пакет при обновлении? [y/N] 


Как тогда убрать этот вопрос?
    


Ответы

Ответ 1



Создай виртуальный пакет openbabel-fake, который будет предоставлять альтернативу openbabel. Не прокатило из-за явного конфликта. Когда-нибудь мейнтейнеры должны с этим разобраться. А пока: extra/kalzium 17.08.1-1 (kde-applications kdeedu) Periodic Table of Elements Кажется не очень нужным пакетом. Заменим его, тогда мета не будет ругаться. Создай виртуальный пакет kalzium-fake, который будет предоставлять альтернативу kalzium Пример aur/akonadi-fake. Если только один раз поставить, то можно прямо на месте исправить PKGBUILD. Создавай свой пакет если ставить не один раз. А полный текст пакета будет такой: # Maintainer: Your Name pkgname=kalzium-fake pkgver=1000.0.0 pkgrel=3 pkgdesc="A fake empty kalzium package for those who don't want openbabel installed on their system" arch=('any') url="https://aur.archlinux.org/packages/${pkgname}/" license=('GPL') provides=('kalzium') replaces=('kalzium') package() { true }

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

Sql server первое обновление очень долгое

Доброго времени суток! Имеется код на C#:
try { using (var ts = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0, 2, 0, 0))) { using (var sqlConnection1 = new SqlConnection(Settings.Default.DefaultConnectionString)) { var taDivisions = new DivisionsTableAdapter();
try { sqlConnection1.Open();
taDivisions.Update(data);
ts.Complete(); } finally { if (sqlConnection1.State != ConnectionState.Closed) sqlConnection1.Close(); } } } } catch (Exception exception) { //Log it throw; }
Проблема в следующем: при первом выполнении, затраченное время ~ 1 минута ( иногда больше ), притом что в таблице не более 10 строк, и за раз изменяется не более чем 1 строка. Причем время выполнения не зависит вообще никак от таблицы которую обновляем. Запрос выполняется, не отваливается по таймауту, при следующем выполнении - обновление происходит моментально. Конфигурация: 2 сервака IIS + SQL Server Читал что сиквел сервер при обращение кэширует запросы, поэтому при первом обновлении такое происходит. Буду признателен если дадут комментарий, либо реальную причину по которой это может происходить, либо на что обратить внимание. Спасибо!
UPD.

Скрин как раз сделан в момент обновления, который занял ~ 1.5 минуты на 1 запись
UPD. UPD.
Проблема явно в использовании транзакций. Если этот же самый код использовать без транзакции все работает очень хорошо. Если применить: проблема та же, первый раз очень долго выполняется.


Ответ

Если присмотреться к вашему коду, то в нем есть подвох - вы нигде не используете sqlConnection1. Т.е. вы его создаете, открываете и сразу закрываете. В DivisionsTableAdapter вы его не передаете.
Вызов taDivisions.Update(data); использует какое-то другое соединение. А sqlConnection1 в коде никак не используется. Но мешает.
По сути вы открываете два соединения в рамках одного Transaction Scope. Это приводит к регистрации транзакции как распределенной, через механизм MS Distributed Transaction Coordinator.
Этот механизм требует настройки Firewall. Кроме того, он требует огромных накладных расходов по сравнению с обычными транзакциями.
Уберите из кода работу с sqlConnection1 - и он заработает быстро:
using (var ts = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0, 2, 0, 0))) { var taDivisions = new DivisionsTableAdapter(); taDivisions.Update(data); ts.Complete(); }
А еще лучше - перестаньте работать через TableAdapter-ы и DataSet-ы - это древний механизм для работы с данными, он не дает ни типизации, ни нормального контроля над выполняемым кодом. Возьмите или Entity Framework (строгая типизация) или Dapper (контроль и скорость).

среда, 17 апреля 2019 г.

Проблема с обновлениями Windows 7

Начиная с некоторого момента в пределах месяца (точнее сказать не могу) перестала работать служба обновления. Любые попытки ее запуска, поиска обновлений наталкиваются на
Центр обновлений Windows в настоящее время не может выполнить поиск обновлений, поскольку эта служба не запущена. Возможно, потребуется перезагрузить компьютер.
Понятно, что перегрузка ничего не дает. Службы "Центр обновления Windows" и "Фоновая интеллектуальная служба передачи" работают. Перезапускал вручную - не помогает.
Ничего нового вроде бы не ставил, настройки не менял.
Windows 7 64-разрядная.
Та же ерунда на еще двух машинах дома - только и того, что там Windows 7 32-разрядная.
Грешил на какое-то обновление - попробовал снести последние обновления Windows - тоже не помогло. Обновления Office или Visual Studio не сносил.
Windows Update Troubleshooter скачивал, запускал. Копался, сказал, что все исправлено - но ничего не изменилось.


Ответ

Вероятно, нарушились индексы в папке %systemroot%\SoftwareDistribution. Удалять ее пока не нужно, лучше переименовать. Подробный инструктаж, как это сделать. Если список вновь обнаруженных обновлений будет велик, не рекомендую устанавливать все скопом, - могут возникнуть противоречия, лучше устанавливать по нескольку за раз.

вторник, 12 марта 2019 г.

Вывод данных в консоль, с ее очисткой

Доброго дня, коллеги. Есть один код, который выводит в консоль таблицу случайных булевых значений. Все бы ничего, но мне нужно, чтобы значения не выводились потоком, одно за другим, а изменялись в реальном времени. Те по аналогии с часами в консоли: время должно не писаться в новой строке с каждой новой секундой, а должно находиться, и обновляться в изначальной.
boolean[][] dots = new boolean[5][5];
Random randomBoolean = new Random();
//Now i want to create a table with random boolean values //Eternal loop for (;;) { try { Thread.sleep(500); for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) { dots[i][j] = randomBoolean.nextBoolean(); System.out.print(dots[i][j] + "\t"); } //Close the column System.out.println(); } System.out.println(); } catch (InterruptedException e) { }
}
Что и куда мне нужно для этого добавить? Спасибо


Ответ

Сама Java очищать консоль не умеет. Но есть небольшая библиотечка, позволяющая отправлять управляющие последовательности в любую ANSI-совместимую консоль - Jansi
import java.util.Random; import org.fusesource.jansi.AnsiConsole;
public class Main { public static void main(String[] args) { AnsiConsole.systemInstall();
Random randomBoolean = new Random();
for (;;) { System.out.print("\u001b[2J"); System.out.flush();
try { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.print(randomBoolean.nextBoolean() + "\t"); } System.out.println(); } System.out.println();
Thread.sleep(500); } catch (InterruptedException e) {} } } }

четверг, 20 декабря 2018 г.

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

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


Ответ

Есть такой подход - регистрируем ресивер на переустановку своего приложения:


public class MyAppUpdatedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // этот код будет выполнен после каждой переустановки // но при первой установке не вызывается } }
Другой вариант: записываем куда-нибудь номер версии и при каждом старте сравниваем с текущим, если изменился - выводим ченжлог