8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 Finagle 服务器上使用自签名证书

Weird_dog 2月前

168 0

我在 scala 中使用 twitter finagle.Http.server .configured(Transport.ServerSsl(Some(SslServerConfiguration( keyCredentials = KeyCredentials.CertAndKey(certFi...) 设置了一个简单的 https 服务器

我使用 twitter finagle 在 scala 中设置了一个简单的 https 服务器。

Http.server
  .configured(Transport.ServerSsl(Some(SslServerConfiguration(
      keyCredentials = KeyCredentials.CertAndKey(certFile, certKey),
      trustCredentials = TrustCredentials.Insecure
  ))))

当我从具有自签名证书的 Web 客户端连接到它时,出现此错误:

2024-03-20 19:03:41,587 WARN incDefaultChannelPipeline - 触发了 exceptionCaught() 事件,并且到达了管道尾部。这通常意味着管道中的最后一个处理程序未处理异常。io.netty.handler.codec.DecoderException:javax.net.ssl.SSLHandshakeException:error:10000418:SSL 例程:OPENSSL_internal:TLSV1_ALERT_UNKNOWN_CA

据我所知,我需要以某种方式处理 finagle 中因不受信任的 CA 而引发的异常,但我找不到有关如何执行此类操作的文档。

帖子版权声明 1、本帖标题:如何在 Finagle 服务器上使用自签名证书
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Weird_dog在本站《scala》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我编写了一个生成弦图的简短函数。我希望该函数将图输出为一个对象,以便我在 PDF 中使用它,或保存到 RData 文件中。但是,我不希望...

    我编写了一个生成和弦图的简短函数。我希望该函数将绘图输出为一个对象,以便我在 PDF 中使用它,或保存到 RData 文件中。但是,我不希望它输出到控制台。这是因为这是 rmarkdown 文件的一部分,我不希望它被绘图弄得乱七八糟。我似乎找不到一种在不破坏函数的情况下抑制绘图的方法 recordPlot() 。例如, pdf(NULL) 停止记录绘图。有人能想到解决办法吗?这是一个可行的示例:

    comparison_table <- structure(c(0, 153, 429, 1, 29, 72, 11, 6, 81, 19, 13, 25, 119, 
    16, 36, 1, 40, 2, 160, 12, 2, 0, 20, 4, 1, 8, 4, 0, 1, 16, 6, 
    3, 3, 40, 1, 0, 0, 33, 2, 35, 0, 2, 0, 388, 26, 7, 27, 9, 11, 
    27, 36, 12, 6, 2, 179, 1, 4, 1, 23, 0, 34, 4, 4, 26, 4, 3, 0, 
    1, 2, 2, 0, 1, 0, 0, 0, 2, 2, 0, 0, 2, 0, 7, 0, 0, 0, 478, 62, 
    5, 23, 25, 17, 16, 77, 17, 8, 4, 192, 5, 10, 0, 28, 2, 117, 2, 
    2, 0, 27, 2, 0, 2, 1, 3, 0, 3, 1, 0, 0, 4, 0, 0, 0, 2, 0, 1, 
    0, 0, 0, 22, 1, 0, 10, 5, 6, 1, 22, 1, 4, 2, 10, 2, 0, 0, 3, 
    0, 31, 0, 2, 0, 17, 3, 0, 3, 3, 1, 2, 7, 4, 2, 0, 17, 0, 0, 0, 
    96, 0, 15, 1, 0, 0, 18, 9, 0, 3, 6, 4, 0, 19, 0, 3, 2, 13, 5, 
    4, 0, 2, 1, 28, 0, 1, 0, 13, 2, 0, 1, 3, 0, 3, 4, 4, 0, 0, 4, 
    0, 0, 0, 5, 0, 5, 0, 0, 0, 9, 2, 0, 4, 4, 0, 0, 8, 2, 0, 0, 12, 
    0, 0, 0, 1, 0, 5, 0, 1, 9, 297, 99, 1, 54, 145, 66, 11, 297, 
    21, 24, 15, 283, 117, 6, 17, 46, 18, 542, 2, 45, 1, 80, 10, 0, 
    2, 13, 14, 0, 32, 3, 0, 0, 27, 3, 0, 2, 2, 0, 21, 0, 1, 7, 312, 
    80, 4, 56, 73, 16, 28, 157, 17, 44, 9, 662, 22, 33, 29, 62, 16, 
    608, 4, 58, 1, 436, 68, 5, 55, 64, 27, 30, 183, 5, 27, 31, 340, 
    18, 5, 3, 50, 4, 245, 8, 16, 1, 7, 1, 0, 2, 0, 1, 3, 4, 0, 2, 
    0, 13, 0, 0, 0, 1, 1, 11, 0, 1, 0, 4, 10, 0, 3, 2, 0, 5, 6, 2, 
    2, 1, 2, 0, 1, 0, 8, 1, 22, 0, 2, 0, 6, 0, 0, 0, 1, 1, 2, 4, 
    0, 1, 1, 11, 2, 0, 1, 1, 1, 25, 0, 2, 0, 8, 7, 0, 2, 8, 4, 3, 
    31, 1, 2, 0, 36, 10, 0, 1, 1, 3, 169, 0, 9, 4, 108, 11, 11, 13, 
    51, 16, 7, 116, 2, 10, 4, 95, 14, 1, 36, 20, 8, 213, 0, 11, 0, 
    74, 12, 0, 8, 23, 15, 2, 121, 3, 1, 2, 29, 21, 2, 0, 5, 2, 192, 
    1, 3, 1, 22, 2, 0, 5, 11, 10, 1, 15, 0, 8, 3, 26, 0, 1, 2, 4, 
    1, 73, 1, 2, 0, 98, 2, 38, 8, 6, 1, 15, 22, 2, 5, 4, 150, 1, 
    1, 4, 12, 2, 23, 1, 1, 5, 138, 20, 3, 25, 65, 30, 12, 184, 6, 
    30, 11, 243, 62, 17, 17, 18, 19, 521, 1, 49, 9, 263, 21, 4, 37, 
    28, 10, 44, 80, 5, 14, 36, 597, 20, 6, 4, 38, 11, 220, 1, 27, 
    0, 8, 0, 0, 1, 5, 2, 0, 16, 1, 0, 0, 8, 2, 0, 0, 0, 1, 37, 0, 
    1, 0, 33, 1, 0, 1, 4, 1, 1, 15, 1, 0, 1, 30, 2, 0, 1, 2, 6, 29, 
    0, 2, 0, 24, 2, 0, 2, 7, 10, 0, 21, 1, 1, 1, 29, 1, 0, 10, 4, 
    0, 60, 0, 2), dim = c(21L, 28L), dimnames = list(c("royalblue1", 
    "brown1", "green1", "lightyellow1", "pink1", "red1", "purple1", 
    "tan1", "yellow1", "cyan1", "grey1", "midnightblue1", "blue1", 
    "magenta1", "grey601", "salmon1", "black1", "lightgreen1", "turquoise1", 
    "lightcyan1", "greenyellow1"), c("red2", "cyan2", "pink2", "darkturquoise2", 
    "black2", "white2", "grey602", "midnightblue2", "lightyellow2", 
    "orange2", "darkorange2", "blue2", "salmon2", "turquoise2", "brown2", 
    "darkgrey2", "darkred2", "darkgreen2", "tan2", "magenta2", "purple2", 
    "grey2", "greenyellow2", "green2", "yellow2", "royalblue2", "lightgreen2", 
    "lightcyan2")))
    
    colour_vector <- c(royalblue1 = "royalblue", brown1 = "brown", green1 = "green", 
    lightyellow1 = "lightyellow", pink1 = "pink", red1 = "red", purple1 = "purple", 
    tan1 = "tan", yellow1 = "yellow", cyan1 = "cyan", grey1 = "grey", 
    midnightblue1 = "midnightblue", blue1 = "blue", magenta1 = "magenta", 
    grey601 = "grey60", salmon1 = "salmon", black1 = "black", lightgreen1 = "lightgreen", 
    turquoise1 = "turquoise", lightcyan1 = "lightcyan", greenyellow1 = "greenyellow", 
    red2 = "red", cyan2 = "cyan", pink2 = "pink", darkturquoise2 = "darkturquoise", 
    black2 = "black", white2 = "white", grey602 = "grey60", midnightblue2 = "midnightblue", 
    lightyellow2 = "lightyellow", orange2 = "orange", darkorange2 = "darkorange", 
    blue2 = "blue", salmon2 = "salmon", turquoise2 = "turquoise", 
    brown2 = "brown", darkgrey2 = "darkgrey", darkred2 = "darkred", 
    darkgreen2 = "darkgreen", tan2 = "tan", magenta2 = "magenta", 
    purple2 = "purple", grey2 = "grey", greenyellow2 = "greenyellow", 
    green2 = "green", yellow2 = "yellow", royalblue2 = "royalblue", 
    lightgreen2 = "lightgreen", lightcyan2 = "lightcyan")
    
    dataset_pair <- c("rnaseq_20221003", "rnaseq_20240520")
    
    chord_function <- function(comparison_table, colour_vector, dataset_pair) {
    
        # Clear existing circos plot to reset parameters
        circos.clear()
        
        # Set gap degrees for sectors
        circos.par(gap.after = c(rep(1, length(rownames(comparison_table)) - 1), 10, rep(1, length(colnames(comparison_table)) - 1), 10),
                   start.degree = -90, # Rotate the plot so that the first sector starts at the top
                   canvas.xlim = c(-1.5, 1.5), # Adjust x-axis limits for more space
                   canvas.ylim = c(-1.5, 1.5)) # Adjust y-axis limits for more space
        # track.margin = c(0.01, 0.1), # Adjust track margins
        # track.height = 0.05) # Adjust track height
        
        # Create chord diagram
        chordDiagram(comparison_table, 
                     transparency = 0.5, 
                     grid.col = colour_vector,
                     annotationTrack = "grid",
                     preAllocateTracks = list(track.height = 0.1))
        
        # Add custom tracks and annotations
        circos.trackPlotRegion(track.index = 1, panel.fun = function(x, y) {
          xlim = get.cell.meta.data("xlim")
          ylim = get.cell.meta.data("ylim")
          sector.name = get.cell.meta.data("sector.index")
          circos.text(CELL_META$xcenter,
                      ylim[1] + cm_h(3), # Move the text further out
                      sector.name,
                      facing = "clockwise",
                      niceFacing = TRUE,
                      adj = c(0, 0.5))
          circos.axis(h = "bottom",
                      labels.cex = 0.6,
                      sector.index = sector.name)
        }, bg.border = NA)
        
        # Add the title
        title(paste(dataset_pair, collapse = " - "))
        
        # Draw sectors
        highlight.sector(rownames(comparison_table), 
                         track.index = 1, 
                         col = rgb(0, 0, 1, 0.3), # More opaque fill
                         border = NA) # Remove border
        highlight.sector(colnames(comparison_table), 
                         track.index = 1, 
                         col = rgb(1, 0, 0, 0.3), # More opaque fill
                         border = NA) # Remove border
        
        # Legend
        legend("right", 
               legend = dataset_pair, 
               fill = c(rgb(0, 0, 1, 0.3), rgb(1, 0, 0, 0.3)),
               border = NA,
               bty = "n", # No box around the legend
               cex = 1.2,
               x.intersp = 0.25, # Reduce horizontal spacing between legend boxes and text
               y.intersp = 0.75, # Reduce vertical spacing between legend lines
               inset = c(-0.1, -0.1)) # Move the legend further from the plot
        
        # Record
        my_plot <- recordPlot()
        
        # Output
        return(my_plot)
        
      }
    
    
    plot_to_save <- chord_function(comparison_table = comparison,
                             colour_vector = my_colours,
                             dataset_pair = dataset_pair)
    

    enter image description here

    我尝试过在堆栈上查找和进行谷歌搜索,但解决方案似乎不起作用。

  • 。这是一个非常简单的例子,尽管可以随意删除组。我需要它与 chordDiagram 一起工作。我可以让它适用于其他基本图,但这个 chordDiagram 似乎很棘手

  • 据我所知,RMarkdown 中的每个块都会生成一个新的图形设备。因此,您可以 dev.off() 在函数末尾添加一个以删除块的输出:

    chord_function <- function(comparison_table, colour_vector, dataset_pair) {
      
      # Clear existing circos plot to reset parameters
      circos.clear()
      
      # Set gap degrees for sectors
      circos.par(gap.after = c(rep(1, length(rownames(comparison_table)) - 1), 10, rep(1, length(colnames(comparison_table)) - 1), 10),
                 start.degree = -90, # Rotate the plot so that the first sector starts at the top
                 canvas.xlim = c(-1.5, 1.5), # Adjust x-axis limits for more space
                 canvas.ylim = c(-1.5, 1.5)) # Adjust y-axis limits for more space
      # track.margin = c(0.01, 0.1), # Adjust track margins
      # track.height = 0.05) # Adjust track height
      
      # Create chord diagram
      chordDiagram(comparison_table, 
                   transparency = 0.5, 
                   grid.col = colour_vector,
                   annotationTrack = "grid",
                   preAllocateTracks = list(track.height = 0.1))
      
      # Add custom tracks and annotations
      circos.trackPlotRegion(track.index = 1, panel.fun = function(x, y) {
        xlim = get.cell.meta.data("xlim")
        ylim = get.cell.meta.data("ylim")
        sector.name = get.cell.meta.data("sector.index")
        circos.text(CELL_META$xcenter,
                    ylim[1] + cm_h(3), # Move the text further out
                    sector.name,
                    facing = "clockwise",
                    niceFacing = TRUE,
                    adj = c(0, 0.5))
        circos.axis(h = "bottom",
                    labels.cex = 0.6,
                    sector.index = sector.name)
      }, bg.border = NA)
      
      # Add the title
      title(paste(dataset_pair, collapse = " - "))
      
      # Draw sectors
      highlight.sector(rownames(comparison_table), 
                       track.index = 1, 
                       col = rgb(0, 0, 1, 0.3), # More opaque fill
                       border = NA) # Remove border
      highlight.sector(colnames(comparison_table), 
                       track.index = 1, 
                       col = rgb(1, 0, 0, 0.3), # More opaque fill
                       border = NA) # Remove border
      
      # Legend
      legend("right", 
             legend = dataset_pair, 
             fill = c(rgb(0, 0, 1, 0.3), rgb(1, 0, 0, 0.3)),
             border = NA,
             bty = "n", # No box around the legend
             cex = 1.2,
             x.intersp = 0.25, # Reduce horizontal spacing between legend boxes and text
             y.intersp = 0.75, # Reduce vertical spacing between legend lines
             inset = c(-0.1, -0.1)) # Move the legend further from the plot
      
      # Record
      my_plot <- recordPlot()
      
      dev.off()
      
      # Output
      invisible(my_plot)
      
    }
    

    我在 RMarkdown 文件中尝试了这个,它只删除了当前块中的图,其他图仍然显示。

  • 当口头谈论方法时,我从来不确定是否应该使用参数或参数这个词或其他词。无论哪种方式,其他人都知道我的意思,但什么是正确的,什么是

    当口头谈论方法时,我从来不确定是否应该使用 “参数” “参数” 或其他词。无论哪种方式,其他人都知道我的意思,但什么是正确的,这些术语的历史又是什么?

    我是一名 C# 程序员,但我也想知道人们在不同的语言中是否使用不同的术语。

    顺便说一下,我是自学成才,没有计算机科学背景。(请不要告诉我去读 《代码大全》 ,因为我是为了让那些还没有 Steve McConnell 的精彩著作的人受益。)

  • 我交替使用它们..没有人嘲笑我..“这个函数有 4 个参数..这个函数接受 4 个参数。”听起来一样。

  • 除了当您试图描述参数如何工作以及如何传递参数等时,可以互换使用它们。此时精确的术语(有时表达起来很麻烦)很有用。

  • 这是一个可移动的目标。多年前,当我刚开始从事 IT 行业时,它一直是“形式参数,实际参数”。从这里的答案来看,现在显然是相反的。

  • 因此,我找到了适用于 Excel 工作簿的单元格函数=FILTER(A1:B29,ISNUMBER(SEARCH(C1,A1:A29)),\'None\'),我想将其放入我拥有的 Google 工作簿中。我只需使用 Excel 即可...

    所以我有这个为 Excel 工作簿找到的单元格函数

    =FILTER(A1:B29,ISNUMBER(SEARCH(C1,A1:A29)),\'无\')

    我想将其放入我已有的 Google 工作簿中。我只想使用 Excel 来处理此工作簿,但如果将其转换为 Excel 工作簿,则需要进行大量重新格式化。

    我该如何更改它才能使其在 Google 表格中正常工作?

  • 我认为无论你是否处于正式环境中,你都应该努力使用正确的术语。我认为这很简单。当你调用一个方法时,你会传入参数。当你定义方法时,你正在定义将从方法/函数调用中获取参数的参数。参数 - 与函数相关联的独立变量,并确定函数的值。参数 - 定义特定过程或活动范围的限制或边界。

  • @Scott Craner 的评论实际上回答了这个问题。编写公式的另一种方法是使用

  • 引用 12

    参数是方法定义中的变量。调用方法时,实参就是您传递给方法参数的数据。

    public void MyMethod(string myParam) { }
    
    ...
    
    string myArg1 = "this is my argument";
    myClass.MyMethod(myArg1);
    
  • 我有一张包含多列的表格,其中一些列使用数字命名(例如 1、2、3、...)。当我尝试使用这些列名的 CATX 函数时(例如 CATX(\'+\', _1, _2, _3,...

    我有一张包含多列的表格,其中一些列使用数字命名(例如 1、2、3、...)。当我尝试使用带有这些列名的 CATX 函数(例如 CATX(\'+\', _1, _2, _3, ..., _26))时,我遇到一个问题,它报告这些列不存在。这种行为过去在常规 SAS 中有效,但现在我使用 SAS Grid 时,它不再按预期运行。我收到一条错误消息,提示这些列不存在。

  • 答案提到“参数是方法定义中的变量”,但最好说“方法声明”[如果有人区分“声明”和“定义”]

  • validvarnames=any 可能已启用,您需要在这些列中使用名称文字。例如:

    '1'n , '2'n , '3'n , ETC。

    catx() 在这些列上使用,请改用名称文字格式:

    catx('+', of '1'n--'26'n)

    要强制 SAS 在这些列名上添加下划线,请设置 validvarname=v7

    options validvarname=v7;

    SAS 将用下划线替换无效字符,并在以数字开头的列前添加下划线。

  • 参数 => 当我们定义函数时,参数 => 当我们调用该方法时。(如果我错了,请纠正我。)

  • 您的表可能是由 IMPORT、TRANSPOSE 或某些基于数组的枢轴创建的,并且有一些不存在的编号列。

    您可以使用运算符连接变量列表 OF

    例子:

    类似的前缀 ( : ) 说明符用于列出以下划线开头的所有变量 ( _ )

    length result $32767 ;
    result = catx('+', of _:) ;
    

    可以使用 SQL DICTIONARY.COLUMNS

    %let names = "" ; %* for the case of no prxmatches ;
    proc sql noprint ;
      select name into :names separated by ','
      from dictionary.columns
      where libname = 'WORK' and memname = 'HAVE'
      and prxmatch ('m/^_\d+$/,trim(name))
      order input(substr(name,2),best8.);
    data want;
      set WORK.HAVE ;
    ...
      result = catx('+', &names) ;
    ...
    
  • 引用 18

    参数 是函数声明中的变量。

    参数 是传递给函数的该变量的实际值。

  • 这些语言通常将传递给方法的参数/参数列表称为 *args 或 ARGV,而不是 *params :-)

  • @karatedog 实际上,这完全符合这一区别。参数在声明时命名,参数仅在调用时才知道。语法 *args 声明一个参数 args,其值是参数(其数量仅在调用时才知道)的列表(声明时知道名称和类型)。

返回
作者最近主题: