小编use*_*527的帖子

使git跟踪自动生成的文件但忽略diff

我有源代码(大部分的存储库*.php,*.js)和文档文件(主要是*.md,*.html,*.svg)自动从注释生成.所有文档都位于./doc存储库中的单独子目录()中.

一方面,我希望通过跟踪文档,git如果它发生变化,我希望它被提交/推送到服务器,因为它有一个很好的可浏览和最新文档很不方便由github显示.

另一方面,在输出git diff命令期间看到自动生成的文件是非常烦人的.例如,如果在两次提交之间更改了一行源代码,则git diff不仅会输出此单行,而且还会输出所有自动生成的文档,因为整个自动生成的文档已更改.

有没有办法告诉git跟踪文档但diff默认情况下将其排除?如果git将所有文档文件视为blob,我也会对我好.然后,至少diff只会声称文件已更改,但不会显示所有文档行每行.

git code-generation auto-generate gitignore

12
推荐指数
2
解决办法
2258
查看次数

JsDoc:我如何记录对象可以具有arbritrary(未知)属性但具有特定类型?

这与问题30360391类似.我想表达一个函数的参数是一个普通的JS对象,它可以具有任意属性(具有未知的)名称,但所有属性都是具有固定属性的对象本身.

一个例子:函数就是这样的

/**
 * @param {Descriptor} desc
 */
function foo( desc ) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

和典型的desc外观

desc = {
  unknownEntity1: {
    priority: 5;
    writable: false;
  },
  unknownEntity2: {
    priority: 42;
    writable: true;
  },
  unknownEntity3: {
    priority: 9;
    writable: false;
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经有了

/**
 * @typedef {Object} DescriptorEntry
 * @property {number} priority - The priority of the entity
 * @property {boolean} writable - True, if the entity can be modified
 */
Run Code Online (Sandbox Code Playgroud)

我还需要一个typedef用于Descriptor基本上表达描述符与任意属性的对象,但所有类型的 …

javascript documentation jsdoc jsdoc3

10
推荐指数
1
解决办法
1138
查看次数

FCM 高优先级消息如何以及在什么条件下被取消优先级?如何从服务器获取缓存的 FCM 消息?

根据FCM 文档,如果 FCM 服务器检测到高优先级消息不会导致用户交互的模式,则高优先级消息可能会被取消优先级。这种机制的细节没有具体说明。问题:

  • 这是如何工作的?
  • 检测算法如何收集数据?
  • 消息被取消优先级多长时间?

其次,Android 应用程序有一个方法可以检查最近收到的消息的时间。如果具有正常优先级的消息尚未传递但仍缓存在 FCM 服务器上,则此方法有时会报告错误的结果。题:

  • 如何让 Android 应用程序首先获取所有消息?

一些可选的背景信息:

我正在为某些安全关键应用程序编写监控应用程序。本地服务器可以处于两种互斥状态中的一种:“空闲”或“警报”。状态通过 FCM 发送到所有注册的客户端。为确保服务器仍在运行,状态会作为心跳定期广播。这些心跳消息以正常优先级发送。此外,每当状态从“空闲”变为“警报”时,都会立即发送具有高优先级的附加异常消息。例如,消息序列类似于

...  idle  idle  idle  *alarm*  alarm  alarm  alarm  idle  idle  ...
Run Code Online (Sandbox Code Playgroud)

由于连续第一条警报消息触发通知,而所有其他消息仅具有正常优先级,因此(希望)没有被 FCM 取消优先级的风险。

Android 应用程序包含一个PeriodicWorkRequest用作看门狗并检查心跳是否仍在传入的 。如果最近收到的消息太旧(超过 30 分钟),则会向用户显示“连接丢失”通知以警告他。

这是问题所在:

通常的心跳消息具有正常的优先级并缓存在 FCM 服务器上。看门狗发出错误的“连接丢失”通知。设备被唤醒(由于通知),突然收到最新的心跳消息(它们在服务器上折叠)。

我看到两个解决方案(或解决方法):

  • 将所有消息设为高优先级消息,以便立即传送它们并且看门狗始终看到最新的消息。但是,我担心 FCM 去优先级算法会起作用。(99,95% 是无聊的“空闲”消息)

  • 在看门狗检查最新消息的时间并最终发出警告之前,我必须以编程方式确保已获取所有消息。

边注:

我完全理解为什么谷歌对后台执行和异步任务实施越来越多的限制。(广播接收器或多或少变得无用,AlarmManager 受到限制,JobScheduler 可以推迟,Android 9 引入了“备用桶”的概念。)许多开发人员滥用这些 API 来做疯狂的事情) 解决方案本来就存在。然而,所有这些限制使得实施受法律法规约束的安全关键应用程序变得非常困难,该应用程序必须提供可靠性保证,因此需要对不可靠的网络进行线路监控。

所有的电源管理机制似乎都没有考虑与安全相关的场景。用户无意使用该应用程序(这很好),并且在这种特殊情况下没有消息是好消息。即应用程序只是停留在后台。不幸的是,该应用程序被归类为“稀有”应用程序的备用存储区,并且该应用程序受到惩罚,这并不好。

android watchdog push-notification android-background firebase-cloud-messaging

9
推荐指数
1
解决办法
1879
查看次数

IllegalStateException:活动没有设置 NavController

我尝试编写一个 Android 应用程序,它使用 androidx 中的导航组件、工具栏和抽屉布局来从左侧滑入设置菜单。我按照导航组件入门指南进行操作,并尝试使用本指南使用 NavigationUI 更新 UI 组件来添加顶部应用栏和设置。

当我的应用程序启动时,会引发以下异常:

java.lang.IllegalStateException: Activity ....MainActivity@e686cd8 does not have a NavController set on 2131230993
Run Code Online (Sandbox Code Playgroud)

旁注:如果我nav_graph.xml在设计模式下打开,主机窗格会报告“未找到 NavHostFragments。必须从布局中的 NavHostFragment 引用此导航图才能访问。” 也许这个错误和异常是相关的并且具有相同的根本原因。然而,我的导航图被一个虽然引用NavHostFragment,见下文。

活动_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/drawer_layout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:fitsSystemWindows="true"
  tools:context=".MainActivity">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/main_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:theme="?attr/actionBarTheme" />

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph" />
  </LinearLayout>

  <com.google.android.material.navigation.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/drawer_view"
    app:headerLayout="@layout/nav_header" />
</androidx.drawerlayout.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

这个布局 …

android android-fragments navigation-drawer android-architecture-components android-architecture-navigation

7
推荐指数
1
解决办法
6699
查看次数

从根的有效计算多项式系数

我有一个monic多项式的根,即

p(x) = (x-x_1)*...*(x-x_n)
Run Code Online (Sandbox Code Playgroud)

我需要系数a_n,...,a_0来自

p(x) = x^n + a_{n-1}x^{n-1} + ... + a_0.
Run Code Online (Sandbox Code Playgroud)

有人知道一种计算效率高的方法吗?如果有人知道C/C++实现,这实际上是最好的.(我已经看过GSL,但它没有提供功能.)

当然,我知道如何以数学方式.我知道,系数a_i是具有n-i元素的子集的所有乘积的总和.但是,如果我以愚蠢的方式做到这一点,这意味着迭代所有子集,我需要

sum^{n-1}_{k=1} ( k choose n) * (k-1)
Run Code Online (Sandbox Code Playgroud)

乘法和

sum^n_{k=0} ( k choose n) - n
Run Code Online (Sandbox Code Playgroud)

补充.因此,两个项都增长O(n!),这是一个太多的计算,无法将n根列表转换为n系数列表.我相信必须有一些聪明的方法来重用大多数中间结果,但我找不到一个.

c++ algorithm performance polynomial-math

5
推荐指数
1
解决办法
2056
查看次数

JS事件队列中事件的顺序

(我相信)了解的事情

尽管现代浏览器是多线程的,但JavaScript是单线程执行的,并且可以保证同步执行。这意味着,如果输入了调用堆栈,则JS会不间断运行,直到调用堆栈再次变空。特别是,可以确保没有两个JS脚本同时运行。

但是,JavaScript是事件驱动的。根据MDN上并发模型描述,浏览器维护事件队列。如果空闲,浏览器将从队列中获取第一个事件并执行相关联的JS(如果有)。脚本终止后,浏览器再次获得控制权并继续进行下一个事件。执行JS脚本时,浏览器不会执行其他任何操作,尤其是它会阻止UI。后者是臭名昭著的“长时间运行脚本警告”的原因。

setTimeout运行系统(又名浏览器)提供了一些真正的异步功能。它们可以用于将新事件放在事件队列中,并且如果事件已被触发并且调用栈为空,则关联的回调将被放在调用栈中。如果不使用本机异步功能之一,开发人员就无法创建自己的“自己的”异步功能。

话虽如此,setTimeout( someFunction, 0 )它提供了一个选项,该选项如何将长时间运行的代码片段分割成小段,否则这些代码会触发“长时间运行的脚本警告”。如果调用堆栈为空,则浏览器可以在执行下一段代码之前赶上其他事件(例如UI)。

一个例子

为了检查我是否正确,我创建了这段代码

"use strict";
for( var i = 0; i != 5; i++ ) {
  confirm( 'This is #: ' + i );
  setTimeout(
    ( function(j) {
      return function() { confirm( 'This is #: ' + j ); };
    } )( i+10 ),
    0
  );
}
Run Code Online (Sandbox Code Playgroud)

预期成绩

我希望警报框以正确的顺序出现:0、1、2、3、4、10、11、12、13和14。我的想法是在每次迭代中都会发生以下两个步骤:(a)第一个确认框同步显示。(b)将新事件推送到事件队列的末尾。但是,回调尚未被调用而是被推迟,因为由于循环仍在运行,因此调用堆栈不为空。

因此,我希望依次看到警报0、1、2、3、4,因为这是同步循环的一部分。然后循环终止,调用堆栈变得清晰。下一个事件是从事件队列中获取的,该事件恰巧是第一个异步超时。所以我希望接下来会看到10。关闭确认对话框后,调用堆栈再次变得清晰。所以我希望接下来会看到11。等等。

实际结果

警报框以混合顺序显示,例如0、1、2、10、11、3、12、4、13、14。

为什么警报框混在一起?如果至少在块中显示了同步部分(0、1、2、3、4),并且仅混合了回调,那么我将接受事件队列不能保证事件顺序。但是,似乎甚至同步循环也被异步事件中断和交错。我认为这不会发生。这里发生了什么?

javascript asynchronous javascript-events settimeout

5
推荐指数
1
解决办法
1850
查看次数

如何在 WorkManger 系统范围内注册一次定期工作请求(即启动或安装后)

我的 Android 应用程序中需要一个组件,最好将其描述为看门狗,即每 30 分钟 +/- 5 分钟执行一次并断言仍满足某个条件的函数。还必须在设备重新启动后执行看门狗,而用户此后没有明确打开应用程序。应用程序的安装也必须如此。即使在安装后未明确打开应用程序,也必须安排看门狗定期执行。

我知道使用WorkManager是最好的或“现代”的方式。无需WorkManager我为不同的 API 级别编写单独的代码,即BroadcastReceiver用于 API 级别 <27 和JobScheduler更高 API 级别的设备。WorkManager应该抽象出这些差异。

但我不明白在哪里打电话WorkManager.getInstance().enqueue( myWatchdogRequest );。使用任何主要活动的回调(即onCreate和类似的)都不是正确的地方,因为我不能依赖正在创建的活动。

我希望除了以编程方式排队作业之外,还应该有一种方法如何在清单中声明这些作业,从而将它们通知给系统(类似于老式的BroadcastReceiver)。实际上,JobScheduler如果我决定使用这种方法,我也会遇到同样的问题。

我在哪里排队WorkRequest“全局”?

android watchdog job-scheduling android-jobscheduler android-workmanager

5
推荐指数
1
解决办法
2767
查看次数

排除安卓应用被放入备用桶

随着 Android 9 电池优化得到进一步推进,应用程序根据用户最近与应用程序交互的程度将应用程序分类为待机存储区(请参阅Android 文档)。系统会根据应用所在的存储桶限制每个应用可用的设备资源。

即使用户不与之交互,我如何将我的应用程序保留在“工作集”存储桶中?(我没有找到任何允许覆盖此电源管理功能的权限或类似权限。)

更具体地说,我有一个PeriodicWorkRequest必须每 30 分钟运行一次,灵活性为 10 分钟。但是,如果我了解强加的电源限制表,如果我的应用程序被放入“稀有”存储桶,则此类工作请求最多可以推迟 24 小时。(在幕后,Work 库使用作业调度程序。)

情景的更多细节

该应用程序对安全至关重要,不适合公共使用,但仅对有限的用户有意义。但是,如果其他人使用此应用程序,不会发生任何不好的事情,但该应用程序对他/她没有任何作用。

更准确地说,该应用程序连接到特定建筑物的中央火警站。所有员工都被要求在他们的智能手机上安装该应用程序。如果该建筑物的中央火灾报警站检测到事件,它会向所有注册的智能手机发送推送通知(通过 FCM),并且该应用程序会播放警报声。这意味着(希望)很长一段时间内没有任何事情发生,并且用户无意以任何方式与应用程序进行交互。该应用程序本身不提供任何交互,它仅说明当前状态(即绿色“OK”标志或红色“ALERT”标志)并在其余时间在后台等待。

由于应用程序对安全至关重要,因此必须检测应用程序与服务器断开连接的故障情况。为此,服务器实际上在后台发送消息周期性,即序列idleidleidleidlealarmalarmalarmalarmidleidleidle,...通常情况下,消息被广播低FCM优先级,每5分钟。如果状态发生变化,则会立即发送具有高 FCM 优先级(cp. 粗体字母)的附加消息。

该应用程序使用PeriodicWorkRequest上述问题中提到的方法实现了一个看门狗。这个看门狗有双重作用:唤醒设备并使设备接收所有(低优先级)已被推迟的 FCM 消息,然后检查最近的消息是否不超过 1.5*5 分钟。如果失败,应用程序会尝试向服务器重新注册自己,并等待状态消息开始再次传入。如果这也失败了,应用程序会向用户发出警告。

到目前为止一切正常。唯一的问题是新的电池优化,它会在某个时间点减慢看门狗的速度。当然,我可以制定一个常设规定,强制所有员工不时打开应用程序并简单地查看它,但这有点愚蠢。

我可以重新表述上面的问题:我完全理解为什么 Android 将电池优化推向了边缘。有很多(疯狂的)应用程序误用了周期性任务,目的是本应以不同的方式解决。并且网络上仍然充斥着“愚蠢”的编程建议,例如每 5 秒检查一次特定网页的修改情况。但是,如果电池优化越来越成为一个障碍,我如何期望编写需要看门狗用于合法目的的安全关键应用程序。谷歌的规则“如果用户不使用你的应用程序,这对他/她来说显然不重要”在这里并不适用。

android background-process power-management android-powermanager

5
推荐指数
1
解决办法
3065
查看次数

Qt 5.2模型 - 视图 - 模式:如何通知模型对象底层数据结构的变化

我有一个类用于永久存储某些项目,这些项目以表格方式组织.这个类与Qt完全无关,来自不同的库.让我们DataContainer在这个问题的其余部分打电话给这个课程.它提供了与std-c ++兼容的迭代器来访问和操作内容.

我需要通过Qt GUI显示和修改数据.我的想法是创建一个DataContainerQtAdaptor继承自QAbstractTableModel并存储指向DataContainer对象的指针的类.在DataContainerQtAdaptor充当适配器的DataContainer对象,并从我的Qt应用程序中的所有操作都通过该适配器来完成.然后我使用QTableView小部件来显示信息.

不幸的DataContainer是,线程/进程可能会改变它们.(例如,DataContainer可以将某个C++类视为封装数据库连接,并且该数据库可能会被其他人更改.)

问题:

1)假设每次DataContainer更改对象的内部结构时都会调用一个函数.QAbstractTableModel必须调用的正确函数是什么,以通知模型的潜在变化?我需要像"亲爱的模型,您的持久存储后端已更改.请更新自己并向每个附加的视图发出信号以反映此更改".

2)让我们说1)解决了.在通过GUI触发更改的情况下,避免"双重"GUI更新的最佳方法是什么?例如:用户点击表格小部件中的单元格setData- >模型的表格小部件调用- >模型将更改推送到后端 - >后端触发其自己的"onUpdate"功能 - >模型重新读取完整的后端(尽管它已经知道了更改) - > GUI第二次更新

3)用户应该能够通过GUI插入新的行/列并将数据放入其中.但是这个位置是由这个数据决定的,因为后端会保持数据的排序.因此,我有以下问题:用户决定在结尾创建一个新行,并将新数据推送到后端.重新读取后端/模型时,此数据通常不在最后位置,但已插入中间某处,所有其他数据已向前移动.我是否保持表格视图窗口小部件的所有属性,如"选择一个单元格"同步?

我相信,所有这些问题必须有一些简单的标准解决方案,因为它与QFileSystemModel作品一样.用户选择文件,而其他一些进程创建新文件.新文件显示在视图中,所有后续行向前移动.选择也向前发展.

马蒂亚斯

c++ model-view-controller user-interface qt model

3
推荐指数
1
解决办法
4147
查看次数

Javascript:将构造函数作为变量中的引用传递并调用此构造函数

我需要将对类构造函数的引用存储在变量中,并稍后构造该对象。这是我的最小代码示例:

function A() {
  var _foo = "A";
}

function Wrapper( constructorFunc  ) {
  var _constructorFunc = constructorFunc;

  this.constructorFunc = function() {
    return _constructorFunc;
  }
}

var wrapper = new Wrapper( A.constructor );
var cFunc = wrapper.constructorFunc();
var obj = new cFunc(); /* obj should be an A now */
Run Code Online (Sandbox Code Playgroud)

我希望我想做什么很清楚。Firebug 控制台给出错误TypeError: cFunc is not a constructor。正确的方法是什么?

此外,我必须能够“比较”构造函数,即我需要知道两个引用是否指向同一个构造函数。(在 C++ 中这是可能的,因为比较函数的地址。)举个例子:

function A() {
  var _foo = "A";
}

function B() {
  var _bar = "B";
}

function Wrapper( …
Run Code Online (Sandbox Code Playgroud)

javascript constructor factory function-pointers

3
推荐指数
1
解决办法
9364
查看次数