小编Bir*_*abs的帖子

"空的延续线将成为错误"......我现在该如何评论我的Dockerfile?

考虑以下Dockerfile:

FROM alpine:edge

EXPOSE \
# web portal
8080 \
# backdoor
8081
Run Code Online (Sandbox Code Playgroud)

像这样建造:

docker build .
Run Code Online (Sandbox Code Playgroud)

我们观察到这样的输出

Sending build context to Docker daemon  17.1TB
Step 1/2 : FROM alpine:edge
 ---> 7463224280b0
Step 2/2 : EXPOSE 8080 8081
 ---> Using cache
 ---> 7953f8df04d9
[WARNING]: Empty continuation line found in:
    EXPOSE 8080 8081
[WARNING]: Empty continuation lines will become errors in a future release.
Successfully built 7953f8df04d9
Run Code Online (Sandbox Code Playgroud)

因此,鉴于将注释放在多行部分的中间很快就会变得非法:注释多行命令的新推荐方法是什么?

这对于RUN命令尤其重要,因为我们鼓励我们&&通过命令一起减少图像层.


不确定这是什么时候引入,但我目前在版本中遇到这个问题:

 docker --version
Docker version 17.07.0-ce, …
Run Code Online (Sandbox Code Playgroud)

docker dockerfile

18
推荐指数
2
解决办法
6836
查看次数

使用Spring Data JPA的"按示例查询"的Kotlinic模式

Spring Data JPA引入了一个很好的功能,"按示例查询"(QBE).您可以通过构建实体实例来表达搜索条件.

您不必编写JPQL.与使用存储库查询派生相比,它使用的"魔法"更少.语法很好.它可以防止普通存储库代码的爆炸.它很好地存在于重构中.

但是有一个问题:QBE只有在你可以部分构造一个对象时才有效.

这是我的实体:

@Entity
@Table(name="product")
data class Product(
        @Id val id: String,
        val city: String,
        val shopName: String,
        val productName: String,
        val productVersion: Short
)
Run Code Online (Sandbox Code Playgroud)

这是我的存储库(空!这是关于QBE的一件好事):

@Repository
interface ProductRepository : JpaRepository<Product, String>
Run Code Online (Sandbox Code Playgroud)

以下是您将如何获取List<Product>- 在某些城市的某些商店销售的所有产品:

productRepository.findAll(Example.of(Product(city = "London", shopName="OkayTea")))
Run Code Online (Sandbox Code Playgroud)

或者至少,这就是我想要做的.有一个问题.这是不可能的构造此对象:

Product(city = "London", shopName="OkayTea")
Run Code Online (Sandbox Code Playgroud)

这是因为Product构造函数要求定义其所有字段.事实上:这就是我大多数时候都想要的.

Java中通常的折衷方案是:使用no-args构造函数构造实体,使所有内容都可变,不保证完成性.

是否有一个很好的Kotlin模式来解决这个问题:

  • 通常要求所有args在构造时实例化
  • 提供了一些机制来生成部分构造的实例以与Example API一起使用

不可否认,这些目标看起来完全相互矛盾.但也许有另一种方法来解决这个问题?

例如:也许我们可以制作一个模拟/代理对象,它似乎是一个产品,但没有相同的构造约束?

spring-data-jpa kotlin

10
推荐指数
2
解决办法
924
查看次数

如何在Spring Boot应用程序上启用Bearer身份验证?

我想要实现的是:

  • 存储在通过jdbc访问的数据库(即MySQL)中的用户,权限,客户端和访问令牌
  • API公开了端点,让您问"我可以拥有OAuth2不记名令牌吗?我知道客户端ID和密码"
  • 如果您在请求标头中提供Bearer令牌,则API允许您访问MVC端点

我对此非常了解 - 前两点正在发挥作用.

我无法为我的Spring Boot应用程序使用完全默认的OAuth2设置,因为标准表名已经在我的数据库中使用(例如,我已经有一个"用户"表).

我手动构建了自己的JdbcTokenStore,JdbcClientDetailsS​​ervice和JdbcAuthorizationCodeServices实例,将它们配置为使用我的数据库中的自定义表名,并设置我的应用程序以使用这些实例.


所以,这就是我到目前为止所拥有的.我可以要求持票人令牌:

# The `-u` switch provides the client ID & secret over HTTP Basic Auth 
curl -u8fc9d384-619a-11e7-9fe6-246798c61721:9397ce6c-619a-11e7-9fe6-246798c61721 \
'http://localhost:8080/oauth/token' \
-d grant_type=password \
-d username=bob \
-d password=tom
Run Code Online (Sandbox Code Playgroud)

我收到了回复; 太好了!

{"access_token":"1ee9b381-e71a-4e2f-8782-54ab1ce4d140","token_type":"bearer","refresh_token":"8db897c7-03c6-4fc3-bf13-8b0296b41776","expires_in":26321,"scope":"read write"}
Run Code Online (Sandbox Code Playgroud)

现在我尝试使用该令牌:

curl 'http://localhost:8080/test' \
-H "Authorization: Bearer 1ee9b381-e71a-4e2f-8782-54ab1ce4d140"
Run Code Online (Sandbox Code Playgroud)

唉:

{
   "timestamp":1499452163373,
   "status":401,
   "error":"Unauthorized",
   "message":"Full authentication is required to access this resource",
   "path":"/test"
}
Run Code Online (Sandbox Code Playgroud)

这意味着(在这种特殊情况下)它已经回归到匿名身份验证.如果我添加到我的HttpSecurity,您可以看到真正的错误.anonymous().disable():

{
   "timestamp":1499452555312,
   "status":401,
   "error":"Unauthorized",
   "message":"An Authentication …
Run Code Online (Sandbox Code Playgroud)

java spring-security kotlin spring-boot spring-security-oauth2

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

如何获取 Alpine apk 包的“版本锁定文件”?(轻松锁定软件包版本)

我在 Docker 容器中使用 Alpine Linux 3.7。
我正在apkDockerfile 中执行一些命令。

我已成功将我的依赖项固定到特定的主要版本:

apk add --no-cache \
'openssl<2' \
'freeradius<4' \
'freeradius-mysql<4'
Run Code Online (Sandbox Code Playgroud)

但该命令的确切行为对于该命令运行的时间(即构建 Docker 映像的时间)很敏感。apk add

在撰写本文时,这些限制已解决:

apk add --no-cache \
'openssl=1.0.2m-r0' \
'freeradius=3.0.15-r3' \
'freeradius-mysql=3.0.15-r3'
Run Code Online (Sandbox Code Playgroud)

如果我apk add 'dep<majver' 明年跑步,可能会得到不同的结果。

  • 我不希望我的依赖项在我不知情的情况下更改版本。
    • 是的,连小版本都没有。我不相信 semver 100% 可以保证我免受破坏性更改/回归的影响,因此更改次要版本只能在监督下进行。
  • 我不想手写确切的版本分辨率(dep=ver)。'dep<majver'是优选的。

诸如npm和 之类的包管理器yarn对此有一个很好的解决方案。版本锁定文件。

您将有两个受版本控制的文档:

  • 一份手动创建的文档来表达'dep<majver'
  • 一个版本的锁定文件,表达(对于每个依赖项)dep=ver满足您所有约束的特定解决方案。
    • 这将是机器生成的。仅当您想要将每个依赖项更新为满足您的约束的最新版本时,您才会故意'dep<majver'重新生成它。

是否有某种 Alpine …

alpine-linux

6
推荐指数
0
解决办法
1362
查看次数

我的目标是与brew中的库动态链接.如何捆绑分发?

我构建了一个音频插件.我的目标.app.component.

我动态链接到Brew安装的库,libfluidsynth.

我复制libfluidsynth.app/ .component.
我曾经install_name_tool重新链接二进制文件指向捆绑libfluidsynth.

libfluidsynth取决于glib,gthread,intl.
我将这些库复制到捆绑包中,重新链接libfluidsynth以更喜欢捆绑的副本.
我也为这些库及其依赖项做了同样的事情.

这是一个快速查看看起来像:

ls /Users/me/git/juicysfplugin/Builds/MacOSX/build/Release/juicysfplugin.app/Contents/Frameworks
    libfluidsynth.1.7.1.dylib
    libglib-2.0.0.dylib
    libgthread-2.0.0.dylib
    libintl.8.dylib
    libpcre.1.dylib

otool -L \
/Users/me/git/juicysfplugin/Builds/MacOSX/build/Release/juicysfplugin.app/Contents/MacOS/juicysfplugin \
/Users/me/git/juicysfplugin/Builds/MacOSX/build/Release/juicysfplugin.app/Contents/Frameworks/* \
| grep -vE '\t(/System/Library|/usr/lib)'

/Users/me/git/juicysfplugin/Builds/MacOSX/build/Release/juicysfplugin.app/Contents/MacOS/juicysfplugin:
    @executable_path/../Frameworks/libfluidsynth.1.7.1.dylib (compatibility version 1.0.0, current version 1.7.1)
/Users/me/git/juicysfplugin/Builds/MacOSX/build/Release/juicysfplugin.app/Contents/Frameworks/libfluidsynth.1.7.1.dylib:
    @loader_path/../Frameworks/libfluidsynth.1.dylib (compatibility version 1.0.0, current version 1.7.1)
    @loader_path/../Frameworks/libgthread-2.0.0.dylib (compatibility version 5401.0.0, current version 5401.3.0)
    @loader_path/../Frameworks/libglib-2.0.0.dylib (compatibility version 5401.0.0, current version …
Run Code Online (Sandbox Code Playgroud)

macos dylib dynamic-linking dyld install-name-tool

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

递归noexcept()的含义是什么?

标准库定义了数组的交换,std::pair如下所示:

template <class T, size_t N>
void swap(T (&a)[N],
          T (&b)[N]) noexcept(noexcept(swap(*a, *b)));

template <class T1, class T2>
struct pair {
    …
    void swap(pair& p) noexcept(noexcept(swap(first,  p.first)) &&
                                noexcept(swap(second, p.second)));
    …
};
Run Code Online (Sandbox Code Playgroud)

有效的现代C++第14项说:

[...]它们是否noexcept取决于noexcept条款中的表达方式noexcept.
给定两个阵列Widget,例如,交换它们是noexcept仅当在阵列中交换单独的元件是noexcept,即,如果用于交换Widgetnoexcept.
即,反过来,确定其他互换,如一个用于数组的数组是否Widgetnoexcept.
类似地,交换std::pair包含Widgets的两个对象noexcept是否取决于Widgets的交换是否为noexcept.

但是根据这个解释,我无法理解为什么有必要将呼叫嵌套为noexcept(noexcept(swap(*a, *b))).

如果目标是"交换两个数组应该noexcept像交换元素一样",为什么还noexcept(swap(*a, *b))不够?

这些不同的重载是 …

c++ noexcept

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

在“rm -R /*”之后做什么

我在 root 下在我的网站上工作,我犯了一个 linux 用户可以做的最糟糕的事情:rm -R /*而不是rm -R ./*. 当我看到它花费了太长时间时,我已经停止了这个过程......我设法用 USB 密钥重新安装了 lubuntu,这是一个好主意还是有其他方法可以扭转这个大错误?

感谢任何答案

bash ubuntu rm

2
推荐指数
1
解决办法
2万
查看次数

java.util.List是否可变?

我们能够add/ remove元素List使用add()/ remove()方法而不创建看起来类似的另一个列表StringBuffer append().所以我认为List是可变的.谁能证实我的理解是正确的?如果有错,请用下面的代码说明

List<String> strList = new ArrayList<String>();
strList.add("abc");
strList.add("xyz"); 
Run Code Online (Sandbox Code Playgroud)

java

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