查看系统中所有标签的链接在左侧的链接对话框中。 在标签页面的下方有一个查看所有标签的链接。 可以单击上图中的链接,查看系统中所有的标签。 如我们当前系统中的所有标签。 https://www.ossez.com/t/discourse/14444
查看系统中所有标签的链接在左侧的链接对话框中。 在标签页面的下方有一个查看所有标签的链接。 可以单击上图中的链接,查看系统中所有的标签。 如我们当前系统中的所有标签。 https://www.ossez.com/t/discourse/14444
【配置 MAXMIND,Discourse 需要重新构建,这将会导致服务中断。 】 什么是 MAXMIND 和为什么我们需要使用这个服务 Discourse 使用 MAXMIND 来通过 IP 地址反向查询具体的物理地址。 如果 Discourse 没有配置 Maxmind’s 数据库,我们看到的配置信息如下: 或者在对 Discourse 容器重新编译的时候,看到下面的信息: MaxMind IP database updates require a license Please set DISCOURSE_MAXMIND_LICENSE_KEY to one you generated at https://www.maxmind.com 为什么我们需要对 IP 地址进行查询 我们通常使用 IP 的地址查询来了解访问系统中的用户地址,这些用户是谁并且是在哪里访问我们的额网站。如果有问题的话,你还可以了解到,这些用户 Special-ISP" 经常访问我的网站。 从 Discourse 2.2.0.beta4 版本开始,Discourse 同时使用这些 IP 地址信息来通知管理员有新的登录地址来访问你的网站。 如果你不配置 Maxmind 数据库,Discourse 没有办法向管理员提供上面的信息。 如果我没有这个 Key 会有什么问题 如果你对上面提到的这些问题并不是非常关心的话,那么就算不配置 maxmind 数据库也没有关系。 最差的情况就是没有办法获得新 IP 地址用户访问通知和查询具体用户的 IP 地址信息。 当然,你也可以拷贝 IP 地址到其他开放的网络上进行查询。 如何获得 Key 请查看 Maxmind’s https://support.maxmind.com/hc/en-us/articles/4407111582235-Generate-a-License-Key 网站页面来获得如何创建 Key 的文章。 访问 GeoLite2 Sign Up 页面。 在 “My License Keys” 链接页面中创建一个 Key。你需要对创建的 Key 进行保存,如果 Key 丢失的话,你需要重新创建一个 Key。 把你获得的 Key 添加到 app.yml 的 ENV 环境变量中,配置文件看起来如下: DISCOURSE_MAXMIND_LICENSE_KEY: your-key-here 或者通过 discourse-setup 来进行配置。 IPv6 用户说明 Discourse 的默认安装方式并不能百分之一百的支持 IPv6。 如果你的服务器配置了 IPv6,你需要确定 Discourse 能够获得用户真实的 IPv6 地址。 通常可以通过在 Discourse 中设置反向代理来完成这个配置,通常这个配置需要更多的管理员配置。 https://www.ossez.com/t/discourse-maxmind-ip/14445
大部分情况都是公司发什么用什么。如果可以选,就选自己用得最顺手的,赶紧搞完收工。 有公司,不知道上面出了什么问题,要求新换的电脑必须要给程序 Mac,有人就是死扛不要 Mac,不是因为 Mac 有多不好,也不是因为 Windows 有多好,就是懒得再学一套快捷键。 当然和每天用的东西也有关系,天天用的就是 IntelliJ IDEA 那几个命令行,用得着去 Mac 不。 更多的时候都是 docking 挂双屏,还不是怎么方便怎么来。 有些 NodeJS 的确实头疼点,编译的时候要跑 Linux,否则编译都不通过。 好在现在有了 WSL,也问题不大。 BTW, 用的数据库是 MySQL 跑生产,要知道 MySQL 在 Windows 下表是不区分大小写的,公司表的设计有问题,然后搞个 Mac 来掩盖下糟糕的设计? https://www.ossez.com/t/mac/14439
有时候,我们在对文件进行测试的时候,可能需要创建一个临时的大文件。 那么问题来了,在 Java 中如何创建大文件呢? 问题和解决 有些人想到的办法就是定义一个随机的字符串,然后重复很多次,然后将这个字符串写入到文件中。 当然,这个是一个解决方法。 我们可以使用下面的代码来进行创建。 @Test public void writingToLargeFile() throws IOException { final RandomAccessFile stream = new RandomAccessFile(fileNameLarge, "rw"); stream.setLength(1024 * 1024 * 1024); } 生成的文件的大小为 1 个 G。 RandomAccessFile 实例 此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。 如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。 该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。 现有如下的一个需求,向已存在1G数据的 txt 文本里末尾追加一行文字, 可能大多数朋友会觉得这个需求很容易,直接把文件读到内存中,获得文件的字符串,然后在字符串后添加就可以了。 那么,如果我们现在的文件有 10 GB,那怎么办? 如果全部读到内存中,估计大概率情况会内存溢出了。 这个时候可以使用 RandomAccessFile 来进行操作了。 因为 Random 的大意就是针对文件内容的指针你可以随意进行操作,那么对大文件的读取和处理,这个类就是你的好伙伴了。 另外,从 RandomAccessFile 的构造方法,我们就看到,你需要提供的是文件的路径,而不是文件对象。 这个很容易理解吧,如果我们提供的是文件对象的话,那么你的 JVM 将会要对这个对象实例化以后才能操作,这个内存早就可能会出问题了。 有下面的一些参数你可以使用: r: 以只读方式打开文件,如果执行写入操作会抛出IOException; rw: 以读、写方式打开文件,如果文件不存在,则尝试创建文件; rws: 以读、写方式打开文件,要求对文件内容或元数据的每次更新都同步写入底层存储设备; rwd: 以读、写方式打开文件,要求对文件内容的每次更新都同步写入底层存储设备; https://www.ossez.com/t/java/14438
针对新注册的用户要多长时间才在这个页面中出现? 解决和说明 上面页面的内容需要缓存才显示的。 通常这个页面的缓存时间需要 24 个小时,所以如果是新注册的用户,要在上面的页面显示出来,至少需要 24 个小时。 https://www.ossez.com/t/discourse/14437
在 Intellij IDEA 的配置中,找到插件选项。 在插件选项中,选择需要删除的插件,然后在右侧的对话框中选择 uninstall 就可以了。 卸载以后,可能不会要求重启,为了安全起见,还是重启下你的 IDE 吧。 https://www.ossez.com/t/intellij-idea/14436
最近升级 Intellij IDEA 后老提示 Thrift Support 不兼容。 后来看了下这个插件已经不少时间没有更新了,也一直不知道这个插件是干什么 用的, 后来看了下,这个插件是: Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。 它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统)Cappuccino、Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk编程语言开发。 2007由Facebook开源,2008年5月进入Apache孵化器, 2010年10月成为Apache的顶级项目。 看来可能是原来调试 GRPC 时候装上的。 因为已经和现在的 IDE 不兼容了,看来还是删掉就好了。 https://www.ossez.com/t/intellij-idea-thrift-support/14435
因为使用了 CloudFlare 的反向地址。 所有 Discourse 获得的用户的 IP 地址其实是 CloudFlare 的服务器地址。 修改 好在 Discourse 已经提供了相关的解决方案。 需要在 Discourse 的配置文件中,添加下面的内容: “templates/cloudflare.template.yml” 然后重新 Build 你的 Discourse 的安装实例。 ./launcher rebuild app 使用上面的命令就可以对 Discourse 直接进行重构了,需要注意的是重构需要 10 分钟左右,这 10 分钟系统是无法访问的。 https://www.ossez.com/t/discourse-ip-cloudflare-ip/14432
最近公司的项目突然出现了下面的提示。 PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target -> [Help 2] 问题和解决 出现上面的提示的问题是因为 SSL 签名的问题。 但是我们访问的网站的 SSL 签名是没有问题的,唯独使用公司的电脑有这个问题。 后来发现是因为公司电脑装的一个 zscaler 的安全软件导致的签名问题。 解决办法就是让 Maven 不对 SSL 进行校验,这个 zscaler 比较奇葩,对你访问的网站还先自签名一次,然后再让你访问。 解决的办法就是在需要运行 Maven 的地方,添加下面的参数: -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true 下面的参数能够让 Maven 不对访问的仓库进行签名校验。 有关参数的配置,请参考网站:Apache Maven Wagon :: Providers :: HTTP Provider – Maven Wagon HTTP 上的内容。 Maven 命令行运行 如果你使用的是 Maven 命令行来进行编译的话,你需要使用下面的命令: mvn clean install -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -U 这样通常能够让你在命令行中跳过 SSL 证书的检查。 IntelliJ 如果你还想让你的 IntelliJ 也跳过 SSL 证书的检查,那么你需要把下面的参数 -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true 添加到 IntelliJ 的 VM options 下。 然后再次运行 mvn 的命令,这个应该能够让你跳过 SSL 的证书检查,并完成下载。 https://www.ossez.com/t/maven-pkix-path-building-failed/14429
在本快速指南中,我们将会解释如何在 Java 把一个 List 转换为 String 字符串。 这个在某些特定的场合可能比较有用,比如说在控制台中输出 List 中的内容,转换为可以人为阅读的内容来进行调试。 使用 List 中标准的 toString() 方法 一个最简单的方法就是调用 List 中的 toString() 方法: @Test public void whenListToString_thenPrintDefault() { List<Integer> intLIst = Arrays.asList(1, 2, 3); System.out.println(intLIst); } 上面的代码将会输出: [1, 2, 3] 从技术上来说,上面的方法将会针对 List 中的每一个对象调用 toString() 方法来进行输出。 在上面的代码中,我们将会使用 Integer 类型的 toString() 方法来把元素中的内容来进行输出。 但是,这里会有一个问,如果你的 List 中使用的是自定义的对象的话,例如我们自定义一个 Person 对象,那么在输出的时候,你需要在 Person 对象中重写(override) toString() 这个方法,而不能使用默认的 toString() 方法。 如果你不这样做的话,你在控制台上大概率会看到下面输出内容: [org.baeldung.java.lists.ListToSTring$Person@1edf1c96, org.baeldung.java.lists.ListToSTring$Person@368102c8, org.baeldung.java.lists.ListToSTring$Person@6996db8] java.lang.Object - 类名 @ - 符号 d716361 - 哈希值的十六进制值 上面的数字不是你对象的实际内容,而是对象的十六进制哈希值。 使用 Collectors 的自定义实现 有时候,我们希望我们的输出使用特定的格式。 对比上面的例子,我们希望在输出的值之间使用 comma (,) hyphen (-), 或者方括号 ([, ]) 或者 braces ({, }) 来进行输出: @Test public void whenCollectorsJoining_thenPrintCustom() { List<Integer> intList = Arrays.asList(1, 2, 3); String result = intList.stream() .map(n -> String.valueOf(n)) .collect(Collectors.joining("-", "{", "}")); System.out.println(result); } 上面代码输出的内容为: {1-2-3} Collectors.joining() 方法需要一个 CharSequence,所以我们可以把数组对象中的整数转换为 String。 同时我们可以看到上面的方法使用了 Java 8 开始提供的 Stream,我们可以使用上面 Stream 的方法来对对象中内容进行输出。 其实主要理解就是使用了 Stream 方法,然后对 List 中的对象进行遍历。 使用其他外部类 我们还可以使用 Apache Commons’ StringUtils 类来得到同样的结果。 Maven 依赖 首先需要确保你的项目中有下面的依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.11</version> </dependency> 实现 实现的方法也非常简单,就是使用 StringUtils.join 就可以了。 @Test public void whenStringUtilsJoin_thenPrintCustom() { List<Integer> intList = Arrays.asList(1, 2, 3); System.out.println(StringUtils.join(intList, "|")); } 输出 1|2|3 需要注意的是,就算你使用了 StringUtils.join 方法,这个方法也还是使用的是对象内部的 toString() 方法。 如果不对自有对象的 toString() 重写(override)进行重写的话,你还是可能得到的是对象的哈希值而不是对象中具体的内容。 结论 本文对如何在 Java 中对 List 中的内容进行 String 转换并且输出进行了简单的说明。 需要注意的是对 toString() 方法,在某些时候需要进行重写(override)以便于得到正确的值。 https://www.ossez.com/t/java-list/14427