小编Ric*_*rth的帖子

使用 Cro 保护 WebSocket

简而言之:我使用 Cro 和 websocket 在互联网服务器上创建了一项服务。使用 Cro 示例非常简单。当页面作为本地主机时,从 HTML 页面发送和接收数据时没有问题。当使用 https 提供页面时,无法建立 websocket。wss协议如何与Cro一起使用?

更新:安装cro并运行后cro stub :secure,service.p6 还有一些文档中未明确的代码。

更多详细信息:我有一个在互联网服务器上运行的 docker 文件,Cro 设置为侦听 35145,因此 docker 命令是docker --rm -t myApp -p 35145:35145

服务文件包含

use Cro::HTTP::Log::File;
use Cro::HTTP::Server;
use Cro::HTTP::Router;
use Cro::HTTP::Router::WebSocket;

my $host = %*ENV<RAKU_WEB_REPL_HOST> // '0.0.0.0';
my $port = %*ENV<RAKU_WEB_REPL_PORT> // 35145;
my Cro::Service $http = Cro::HTTP::Server.new(
    http => <1.1>,
    :$host,
    :$port,
    application => routes(),
    after => [
        Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR)
    ] …
Run Code Online (Sandbox Code Playgroud)

websocket cro raku

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

如何获取对象上的 `&lt; ... &gt;` 语法?

在 Raku 中:当我使用 CALL-ME 方法创建对象时,我想使用< ... >签名语法而不是( '...' )when ...is a Str。在文档中,有一个创建运算符的示例,它是具有特殊语法的普通 Raku sub。这种 sub 自动转换< ... >为 Str。例如,如果我有

use v6.d;
class A {
   has %.x;
   method CALL-ME( Str:D $key ) { say %!x{ $key } }
}

my A $q .= new( :x( <one two three> Z=> 1..* ) );
$q('two');
$q<two>;

Run Code Online (Sandbox Code Playgroud)

但这会产生

2
Type A does not support associative indexing.
  in block <unit> at test.raku line 10
Run Code Online (Sandbox Code Playgroud)

object calling-convention raku

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

如何对 for 中的散列使用排序

我有一个散列%h,我想for按键的字母顺序处理语句中的数据。

但是如果我sort在散列上使用 a ,我会得到一个Pairs的列表,这是可以理解的。但是我如何解压这个for声明。

目前我正在使用以下内容:

my %h = <xabsu ieunef runf awww bbv> Z=> 1..*; # create a hash with random key names
for %h.sort { 
  my ($name, $num) = (.key, .value);
  say "name: $name, num: $num"
}
# Output
# name: awww, num: 4
# name: bbv, num: 5
# name: ieunef, num: 2
# name: runf, num: 3
# name: xabsu, num: 1

Run Code Online (Sandbox Code Playgroud)

但我更喜欢更惯用的形式:

my %h = <xabsu …
Run Code Online (Sandbox Code Playgroud)

sorting hash raku

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

是否可以将 CompUnit 模块用于收集的数据?

我开发了一个用于处理文档集合的模块

该软件的一次运行会收集有关它们的信息。数据存储在称为%processed和 的两个结构中%symbols。需要缓存数据以供后续在同一组文档上运行软件,其中一些文档可能会发生变化。(文档本身是使用CompUnit 模块缓存的)。

目前数据结构的存储/恢复如下:

# storing
'processed.raku`.IO.spurt: %processed.raku;
'symbols.raku`.IO.spurt: %symbol.raku;

# restoring
my %processed = EVALFILE 'processed.raku';
my %symbols = EVALFILE 'symbols.raku';
Run Code Online (Sandbox Code Playgroud)

将这些结构输出到可能非常大的文件中可能会很慢,因为散列被解析以创建字符串化形式,并且因为它们正在重新编译而在输入时很慢。

它不用于检查缓存文件,仅用于保存软件运行之间的状态。

此外,虽然这对我的用例来说不是问题,但这种技术不能在一般情况下使用,因为字符串化(序列化)不适用于 Raku 闭包 - 据我所知。

我想知道是否可以使用 CompUnit 模块,因为它们用于存储模块的编译版本。那么也许,它们可以用来存储数据结构的“编译”或“内部”版本?

有没有办法做到这一点?

如果没有,是否有任何技术原因可能无法实现?

performance caching raku

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

如何以及如何最好地基于布尔值选择方法/子方法?

我在类中有一个方法来返回哈希值,目的是让子类覆盖该方法。但出于测试目的,我想要一个不同的哈希值。当类被实例化时,我希望测试选项被假定为 False,因此:test在不需要时可以省略。

目前我这样做:

class A {
  has %.tmps;
  submethod BUILD( :$test = False ) {
    %!tmps = $test ?? self.test-tmps !! self.default-tmps
  }
  method test-tmps { ... }
  method default-tmps { ... }
}
Run Code Online (Sandbox Code Playgroud)

这就是我想要的,调用my A $x .= newdefault-tmps,并my A $y .=new(:test)调用test-tmps。

但我想知道如何通过多重调度删除 $test 的显式检查。但我无法找出适当的语法。我试过

class A {
  has %.tmps;
  submethod BUILD( :$test = False ) {
    %!tmps = self.get-tmps( :$test )
  }
  multi method get-tmps( :test($)! where * ) {
     # return the …
Run Code Online (Sandbox Code Playgroud)

raku

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

使用方法:自用CompUnit以来

我试图通过使用CompUnit类集预编译来创建POD6的缓存.

我可以创建,存储和检索pod,如下所示:

use v6.c;
use nqp;
my $precomp-store =     CompUnit::PrecompilationStore::File.new(prefix=>'cache'.IO);
my $precomp = CompUnit::PrecompilationRepository::Default.new(store=> $precomp-store );
my $key = nqp::sha1('test.pod6');
'test.pod6'.IO.spurt(q:to/CONTENT/);
=begin pod
=TITLE More and more

Some more text

=end pod

CONTENT
$precomp.precompile('test.pod6'.IO, $key, :force);
my $handle = $precomp.load($key, )[0];
my $resurrected = nqp::atkey($handle.unit,'$=pod')[0];
say $resurrected ~~ Pod::Block::Named;
Run Code Online (Sandbox Code Playgroud)

所以现在我改变POD,我该如何使用:since旗帜?我认为如果:since在编译后包含一段时间,那么句柄的值将为Nil.情况似乎并非如此.

my $new-handle = $precomp.load($key, :since('test.pod6'.IO.modified));
say 'I got a new handle' with $new-handle;
Run Code Online (Sandbox Code Playgroud)

输出是'我有一个新手柄'.

我做错了什么?这是一个包含代码和输出的pastebin链接:https://pastebin.com/wtA9a0nP

perl6

8
推荐指数
1
解决办法
141
查看次数

Perl6从字符串中获取正则表达式

我想把一个正则表达式放在一个YAML配置文件中(例如:config/filename.yaml),例如.

-
  section: Begining
  regex: '/ ^ <[ a..b, A..B ]> /'
-
  section: Next
  regex: '/ ^ <[ c..z, C..Z ]> /'
Run Code Online (Sandbox Code Playgroud)

当我把它读成哈希(例如,使用YAMLish)时,例如,

use YAMLish;
my @h = load-yaml('config/filename.yaml'.IO.slurp);
Run Code Online (Sandbox Code Playgroud)

我自然有一根绳子 @h[0]<regex>

那么如何从字符串中恢复正则表达式以便在匹配中使用?

我想要类似下面的东西,但以下不起作用:

say 'Its a beginning' if 'A beginning' ~~ @h[0]<regex>
Run Code Online (Sandbox Code Playgroud)

它不能按预期工作,因为它@h[0]<regex>是一个Str,因此智能匹配是@h[0]<regex>针对Str文字测试Str.那么如何让正则表达式脱离Str?

regex perl6

8
推荐指数
1
解决办法
138
查看次数

内容检查部分而非全部类属性

我有一个带有属性的类。我想检查是否定义了一些但不是全部。所以:

class A { 
    has $.a is rw;
    has $.b is rw;
    has $.c is rw;
    has $.d is rw;

    method delete { ... }
}

my A $x .= new(:a<hi>, :d<good>);

## later
$x.b = 'there';

## code in which $x.c may or may not be defined.

## now I want to check if the attributes a, b, and c are defined, without
## needing to know about d
my Bool $taint = False;
for <a b c> { …
Run Code Online (Sandbox Code Playgroud)

class introspection raku

8
推荐指数
1
解决办法
85
查看次数

查找本地编译的 Raku 模块

如何找到已在本地安装的模块,以及我可以use在 Raku 程序中找到的模块?

假设我们有三个分布:Parent、Brother、Sister。父母'提供'Top.rakumod,而 Brother 和 Sister 分别提供 'Top::Son.rakumod' 和 'Top::Daughter.rakumod'。兄弟姐妹在他们的 META6.json 中有一个 'depends': 'Top'。

每个发行版都在它自己的 git 存储库中。每个都是由zef安装的。

假设 Top 被设置为一个带有接口方法的类,可能类似于: multi method on-starting { ... },每个子类都必须实现它,并且在运行时为调用者​​提供有关子类的信息。这样既Top::BrotherTop::Daughter实施on-starting。也可能Top::Aunt存在未在本地安装的发行版等。我们需要找到安装了哪些。

所以,现在我们运行一个 Top 实例(在 Parent 中定义)。它需要寻找匹配的已安装模块Top::*。开始的地方(我认为)是$*REPO,它是包含已安装模块的存储库的链接列表。$*REPO 还承担 CompUnit::Repository 角色,后者又具有“need”方法。

我不明白的是如何操作 $*REPO 来获取所有匹配的候选模块的列表Top::*,以及整个链表。

一旦我有了候选列表,我就可以使用^can它来检查它是否有一个on-starting方法,然后调用该方法。

如果这不是得到 Top 发现本地安装模块的结果的方法,我会很感激我刚刚提出的方案的一些替代方案。

module precompiled raku

8
推荐指数
1
解决办法
89
查看次数

使用 Cro run 重建更改的客户端文件

cro run当目录树中的任何内容发生更改时,停止服务器,重新编译,重新启动服务器。那太棒了。

但是在开发客户端 UI 并使用 NPX/yarn/webpack 时,需要一个额外的步骤来生成main.js文件。

在 Cro 教程中,这一步似乎是手动完成的,即,我们有一行“我们有了它。npm run build刷新,然后试一试”。npm run build是一个必须“手动”运行的命令。

有没有一种简单的方法,例如,.cro.yml在检测到子目录树中的更改时使用强制另一个命令?例如,如果客户端 UI 文件在下面,path/to/cro-app/client-ui-directory并且在任何文件更改时要运行的命令是path/to/cro-app/client-ui/directory/yarn build

cro raku

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