分类 默认分类 下的文章

Rocky Linux 8 上安装 nginx 后对 nginx.conf 进行修改增加了一个 /var/www 路径的 root 配置,但用 curl 测试访问一个文件时却返回了 403 Forbidden。

2022/06/03 <masked> [error] <pid>#0: *1 open() "/var/www/.well-known/test" failed (13: Permission denied), client: <masked>, server: _, request: "GET /.well-known/test HTTP/1.1", host: "localhost"

namei 命令查看一下权限,没有发现问题。

# namei -om /var/www/.well-known/test
f: /var/www/.well-known/test
 dr-xr-xr-x root root /
 drwxr-xr-x root root var
 drwxr-xr-x root root www
 drwxr-xr-x root root .well-known
 -rw-r--r-- root root test

网上查阅资料发现可能是 SELinux 问题,故执行 setenforce 0 后再次测试,此时可以访问了。

但关闭 SELinux 并不是最合理的方案,进一步查找资料发现 https://www.nginx.com/blog/using-nginx-plus-with-selinux/ 这篇文章,文中介绍了 SELinux 对文件上下文的永久变更是通过 semanage fcontext 控制的,让我们来看一下目前系统的配置。

# semanage fcontext -l | grep httpd_sys_content_t
<trimmed>
/var/lib/trac(/.*)?                                all files          system_u:object_r:httpd_sys_content_t:s0
/var/www(/.*)?                                     all files          system_u:object_r:httpd_sys_content_t:s0
/var/www/icons(/.*)?                               all files          system_u:object_r:httpd_sys_content_t:s0
/var/www/svn/conf(/.*)?                            all files          system_u:object_r:httpd_sys_content_t:s0

# ls -Z /var/www/.well-known/test
unconfined_u:object_r:var_t:s0 /var/www/.well-known/test

可以发现 /var/www 目录下任意路径已经在 httpd_sys_content_t 的 file\_spec 中了但没有应用到文件上,所以直接用 restorecon 命令恢复文件和文件夹默认的安全上下文就行。

restorecon -Rv /var/www/.well-known

首先用 conda 创建一个新环境并安装 R。

conda create -n r4ds_r4.1 r=4.1 r-devtools r-terra
conda activate r4ds_r4.1
rstudio

然后在 RStudio 的 Console 中执行以下命令,用 devtools 安装编译 r4ds 所需的包。

devtools::install_github("hadley/r4ds", dependencies = TRUE)

最后在 RStudio 中打开 r4ds.Rproj 项目,在菜单里选择 Build → Build All。

Update(2022-05-10): 用 conda 预先安装 DESCRIPTION 文件中提到的包可以减少 devtools 安装命令的耗时,因为可以跳过一部分包的编译。

虽然最理想的情况是所有依赖的项目都分别打包到不同的 port,但不同包对同一个依赖项目可能有不兼容的要求。OpenSSL、Boost 这种基础包可以通过拆包来解决兼容问题,例如 Boost 在 MacPorts 就打包了 boost169boost171boost173 等等很多个版本,但这也要求所有这些子包的使用方都要对编译 flags 进行修改,才能让编译器找到正确版本的依赖,导致整个过程非常复杂,维护也非常耗费时间。

一般使用方不多的库不会有分版本的 subport,为了提供一个小众软件要求的版本实现多版本并存有点得不偿失。此时如果项目的构建系统本来就把依赖 vendor 到 Git 子模块里,我们就可以通过 distfiles 的手段把依赖库的源代码拉下来放到子模块的文件夹里。通过 master_sitesdistfiles-appendgithub 1.0 等关键字进行组合搜索可以找到 macports-ports 中可以参考的方案,最终效果如下。

PortGroup           github  1.0
PortGroup           meson   1.0

github.setup        joshkunz ashuffle 3.13.3 v
github.tarball_from archive
master_sites        ${github.master_sites}:ashuffle
distfiles           ${distname}${extract.suffix}:ashuffle

...

# BEGIN abseil (requires C++17 build)
set abseil_project  abseil-cpp
set abseil_version  20211102.0

master_sites-append https://github.com/abseil/${abseil_project}/archive/${abseil_version}:abseil
distfiles-append    ${abseil_project}-${abseil_version}${extract.suffix}:abseil
checksums-append    ${abseil_project}-${abseil_version}${extract.suffix} \
                    rmd160  bca4a16eaab1602cdc7ace8dd1ff82467b71b59e \
                    sha256  dcf71b9cba8dc0ca9940c4b316a0c796be8fab42b070bb6b7cab62b48f0e66c4 \
                    size    1884080

post-extract {
    foreach submodule [list subprojects/absl:${abseil_project}] {
        set submodule_target [lindex [split ${submodule} :] 0]
        set submodule_package [lindex [split ${submodule} :] 1]
        delete ${worksrcpath}/${submodule_target}
        move {*}[glob ${workpath}/${submodule_package}-*] ${worksrcpath}/${submodule_target}
    }
}
# END abseil

首先通过 count() 计算出各种 cut 的钻石各有多少个,存到名为 n 的列里,然后通过 mutate 计算出总和为1的占比。此时如果用 geom_col() 画图可以得出一个高度为1的堆积图。

library(tidyverse)

diamonds %>%
  count(cut) %>%
  mutate(p = n / sum(n)) %>%
  ggplot(aes("", p, fill = cut)) +
  geom_col() +
  scale_fill_brewer(type = "div")

p1.png

再加以 coord_polar() 变换转换为极座标,就可以画出一张饼图了。在此基础上多叠加一层 geom_text() 就实现了百分比的显示,非常灵活。

diamonds %>%
  count(cut) %>%
  mutate(p = n / sum(n)) %>%
  mutate(labels = scales::label_percent(accuracy = 0.01)(n / sum(n))) %>%
  ggplot(aes("", p, fill = cut)) +
  geom_col() +
  geom_text(aes(label = labels), position = position_stack(0.5)) +
  coord_polar("y") +
  scale_fill_brewer(type = "div")

p2.png

如果不想显示极座标轴和灰色背景,可以通过加上 theme_void() 来实现。对于重叠的文字则是可以用 ggrepel 打散,最终效果如图。

p3.png

micromamba

首先使用 MacPorts 安装 micromamba$HOME/micromamba 并初始化 shell 配置。

sudo port install micromamba
micromamba shell init --shell=zsh --prefix=~/micromamba

执行完成后需要重开 shell 以加载 .zshrc,如果使用的 shell 不是 zsh 需要对应调整 --shell 参数。

此时 micromamba 已安装完成。如果不需要完整的 conda 功能,到这里就可以使用 micromamba 命令了。

mamba

为了兼容 conda 可以用 micromamba 安装 mamba 并重新初始化 shell 配置。

micromamba install mamba -n base -c conda-forge
mamba init zsh

重开一次 shell 之后就有完整的 mamba 环境了,可以运行 mambaconda 命令,但 activate 命令还需要用 micromamba

环境

除了安装 mamba 外,不建议使用 base 环境安装其他包。以下命令可以新创建一个名叫 sci 的环境并安装。

mamba create -n sci <list of packages>

如果觉得默认源包太少或太旧,可以启用 conda-forge 并设置为默认。源配置的调整建议在新环境创建前完成,否则依赖关系可能出问题。

conda config --add channels conda-forge
conda config --set channel_priority strict