在我设置闹钟的函数中调用 alarmmanager.setAlarmClock 时发生崩溃(仅在 android 7 上)。我不知道这里出了什么问题。以及如何修复此崩溃。
这是调用 alarmManager.setAlarmClock 时崩溃的函数
fun setBeforeAlert(
context: Context,
offset: Long,
beforeMin: Int,
pendingIntent: PendingIntent
) {
if (offset - beforeMin * 60 * 1000 > 0) {
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val alarmClockInfo = AlarmManager.AlarmClockInfo((System.currentTimeMillis() + offset) - beforeMin * 60 * 1000, pendingIntent)
alarmManager.setAlarmClock(alarmClockInfo, pendingIntent)
}
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, (System.currentTimeMillis() + offset) - beforeMin * 60 * 1000, pendingIntent)
}
else {
alarmManager.set(AlarmManager.RTC_WAKEUP, …Run Code Online (Sandbox Code Playgroud) 我Taint在 Perl 变量、模式等方面阅读了很多内容,例如从文档中:
$AUTOLOAD现在可以被污染如果您通过污染名称调用子例程,并且它遵循
AUTOLOAD函数,$AUTOLOAD则将(正确地)受到污染。
虽然谷歌对 taint 一词的定义是:
污点的定义
动词
- 污染或污染(某物)。
“空气被汽车的烟雾污染了”
同义词:污染、污染、掺假、感染、枯萎、损坏、土壤、毁坏、破坏、污秽名词
- 不良或不良质量或物质的痕迹。
“依附于政权的腐败污点”
同义词:痕迹、触摸、暗示、暗示、色调、污点、污点、污点、污名、污点、污名、耻辱、耻辱、耻辱
那么Taint在 Perl 中一般是什么意思呢?
我需要运行 Perl 脚本几天来处理某些事情。在 Linux Centos 服务器上,我从 SSH 终端运行以下命令:
nohup perl script.cgi 2>&1 &
Run Code Online (Sandbox Code Playgroud)
这会在后台运行脚本并将输出写入 nohup.out。当我关闭 SSH 终端或什至我的互联网连接断开时,脚本就会终止。
关闭 SSH 终端后,我需要保持此命令在服务器后台运行。
我正在尝试Moose的例子:
has 'options' => (
traits => ['Hash'],
is => 'rw',
isa => 'HashRef[Str]',
default => sub { {} },
handles => {
set_option => 'set',
get_option => 'get',
has_no_options => 'is_empty',
num_options => 'count',
delete_option => 'delete',
option_pairs => 'kv',
},
);
Run Code Online (Sandbox Code Playgroud)
我发现它的工作原理如下:
$self->set_option("step1", "Step 1");
printf ("Get option %s\n", $self->get_option("step1"));
Run Code Online (Sandbox Code Playgroud)
但我想如果我删除句柄,我可以像这样访问哈希元素:
$self->options->set("step1", "Step 1");
printf ("Get option %s\n", $self->options->get("step1"));
Run Code Online (Sandbox Code Playgroud)
我需要在同一个类中有许多哈希,如何使用访问器访问每个哈希:
$self->hash1->get("key1");
$self->hash2->get("key1");
Run Code Online (Sandbox Code Playgroud) 一些Perl书籍建议在调用类方法时使用括号,这说明这有助于使解析器不必猜测代码的意图.但是,我所看到的几乎所有Perl代码(包括cpan上的模块)在调用没有参数的方法时很少使用括号.
放下这些括号是否正常,或者我应该总是输入它们.
我编写了一个小测试代码来衡量调用带括号和无括号的方法之间的区别,并且它确实显示了仅使用两种方法的类在1%和2%之间的微小差异.我想如果班级很大,这可能会增加.
这是我用来测试的测试脚本:
#!/usr/bin/perl
use Benchmark qw(:all);
{
package Messages;
sub new {
my ($self) = @_;
return bless {}, $self;
}
sub message {
my ($self) = @_;
return "Hello world";
}
sub another {
my ($self) = @_;
return "Another Hello world";
}
}
my $class = Messages->new();
cmpthese(10_000_000, {
'with () ' => sub { $class->message() },
'without () ' => sub { $class->message },
});
Run Code Online (Sandbox Code Playgroud)
这是基准测试的结果:
Rate without () with ()
without () 3320053/s -- …Run Code Online (Sandbox Code Playgroud) 我很想比较是否更好地使用哈希或引用哈希,哈希引用,因为我理解只是一个指向哈希本身的指针,所以我认为应该没有速度差异.
我做了一个基本的基准测试,我发现哈希引用比使用哈希直接平均速度慢20-27%.
这是我使用的基本基准代码:
use Benchmark qw(:all);
cmpthese(10_000_000, {
hash => sub { my %hash = (); },
hashref => sub { my $hahref = {}; }
});
cmpthese(10_000_000, {
hash => sub {
my %hash;
$hash{fname}="first name";
$hash{mname}="middle name";
$hash{lname}="last name";
},
hashref => sub {
my $hahref;
$hahref->{fname}="first name";
$hahref->{mname}="middle name";
$hahref->{lname}="last name";
},
hashrefs => sub {
my $hahref;
$$hahref{fname}="first name";
$$hahref{mname}="middle name";
$$hahref{lname}="last name";
},
});
Run Code Online (Sandbox Code Playgroud)
这是笔记本电脑戴尔,Windows 8,核心i7,16MB RAM的基准测试结果:
Rate hashref hash
hashref 5045409/s -- -17%
hash …Run Code Online (Sandbox Code Playgroud) 我已经在线阅读了一些关于Perl样式命名约定的文章,它建议使用小写字母并用下划线分隔单词的函数或方法名称.其他一些人使用小写的第一个单词然后将其他单词大写.当然Windows .NET等大写每个单词,没有下划线.
我有一些包方法很多单词entriesoncurrentpage,如果我按照Perl风格建议我应该这样做:
sub entries_on_current_page {...}
Run Code Online (Sandbox Code Playgroud)
这为方法名称添加了四个下划线字母,另一个样式是:
sub entriesOnCurrentPage {...}
Run Code Online (Sandbox Code Playgroud)
和Windows风格应该是:
sub EntriesOnCurrentPage {...}
Run Code Online (Sandbox Code Playgroud)
PHP有时会使用全部小写和下划线mysql_real_escape_string(),有时使用全部小写但没有下划线htmlspecialchars,当然PHP函数名称不区分大小写,因此Perl不支持此功能.
所以问题是,对于有很多单词的长名称,用于Perl编码的最佳样式是什么.
我开始看PSGI,我知道应用程序的响应应该是三个元素的数组引用,[code,headers,body]:
#!/usr/bin/perl
my $app = sub {
my $env = shift;
return [
200,
[ 'Content-type', 'text/plain' ],
[ 'Hello world' ],
]
};
Run Code Online (Sandbox Code Playgroud)
问题是如何发送文件例如zip或pdf以便下载到浏览器.
有没有好的方法来检测 Perl 脚本是从终端/DOS 调用还是从 Web 服务器调用。
我目前有这个代码:
sub cli {
# return 1 if called from browser, 0 if called from command line
if (defined $ENV{GATEWAY_INTERFACE} || exists $ENV{HTTP_HOST}){
return 0;
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
但请注意,并非所有服务器都设置了这些 ENV 变量。
原因是如果脚本从终端运行,我将打印文本/纯格式消息,如果从浏览器运行,我将打印 HTML 格式的消息。
我正在练习 Perl 和 PSGI/Plack。只是尝试简单的 PSGI 示例应用程序:
应用程序.psgi
#!/usr/bin/perl
my $counter = 0;
my $app = sub {
my $env = shift;
my $path = $env->{PATH_INFO} || $env->{REQUEST_URI};
$counter++;
my $content = "Hellow world.\nCounter=$counter\nPath: $path\n";
return [ 200, [ 'Content-type', 'text/plain' ], [ $content ] ]
};
Run Code Online (Sandbox Code Playgroud)
然后通过以下方式运行它:
plackup app.psgi
Run Code Online (Sandbox Code Playgroud)
如果我将浏览器指向任何路径,例如 /news/world:
http://localhost:5000/new/world
Run Code Online (Sandbox Code Playgroud)
没关系,我将 $path 变量设置为 /news/world 并且我将处理 cgi 响应。
如果我指向像 logo.png 这样的静态文件,就会出现问题
http://localhost:5000/logo.png
Run Code Online (Sandbox Code Playgroud)
我还将 $path 变量设置为 /logo.png
问题是,为什么 plackup 服务器不自动提供静态图像文件 logo.png。
我必须手动执行此操作吗?如果是这样,这意味着对于每个请求,我都必须先 ping 文件系统,检查是否 -f $path。
这意味着我正在构建一个完整的服务器处理程序,而不仅仅是我的脚本处理程序。我不明白什么。