Compare commits

..

96 Commits

Author SHA1 Message Date
1e51dc8fe5 删除 Protocol 有关的内容,本项目只用于存储有关 Discourse 有关的默认文档结构 2022-08-20 07:51:47 -04:00
18d4f2d5c8 更新 README 文件,并且删除不需要的文件 2022-08-14 11:04:42 -04:00
1a9f0cf8f8 更新联系方式页面 2022-08-14 10:46:06 -04:00
f8e3672c04 修改本地的运行文件 2022-08-14 10:31:16 -04:00
861f0d83db 修改模板配置文件 2022-08-14 10:19:43 -04:00
ae40affffc 修改许可证为 MIT 许可证 2022-08-14 10:11:13 -04:00
c025706576
Merge pull request #37 from cwiki-us-docs/discourse
修改 Java 核心编程的内容
2021-08-11 22:18:13 -04:00
54236a80c3
Merge remote-tracking branch 'origin/master' into discourse 2021-08-11 22:17:05 -04:00
26be54f7ac
修改 Java 核心编程的内容 2021-08-11 22:16:43 -04:00
601c371a37
Merge pull request #36 from cwiki-us-docs/discourse
对 Java 文件的排版布局进行修正
2021-08-11 22:05:58 -04:00
93f95dc3f6
Merge remote-tracking branch 'origin/discourse' into discourse 2021-08-11 22:05:16 -04:00
29b443875e
修改针对 Java 的文件排版布局 2021-08-11 22:04:43 -04:00
e3f7a39334
Merge pull request #35 from cwiki-us-docs/discourse
对网站使用的快递导航进行重新排序
2021-08-11 17:04:11 -04:00
e55c220b91 对网站使用的快递导航进行重新排序 2021-08-11 11:58:27 -04:00
513c4db6ba
Merge pull request #34 from cwiki-us-docs/discourse
Discourse
2021-08-05 13:02:31 -04:00
12b0dc1089 提交代码 2021-08-05 13:01:51 -04:00
cc157a31c5 删除不需要的英文字符。 2021-07-21 14:51:35 -04:00
17f6fb0199
Merge pull request #33 from cwiki-us-docs/discourse
Discourse 分支更新导航中的名称
2021-07-21 14:49:11 -04:00
264ec78c00 Merge remote-tracking branch 'origin/master' into discourse 2021-07-21 14:48:15 -04:00
44a2d4a16c 更新联系方式在导航中的链接 2021-07-21 14:48:04 -04:00
409f767b75
Merge pull request #32 from cwiki-us-docs/discourse
Discourse 更新联系方式内容
2021-07-21 14:46:51 -04:00
addd1ae94c 更新联系方式页面内容 2021-07-21 14:45:25 -04:00
8847b70e82 Merge remote-tracking branch 'origin/master' into discourse 2021-07-21 14:44:29 -04:00
b24df2ef3f 更新联系方式页面 2021-07-21 12:03:34 -04:00
8a59be936d
Merge pull request #31 from cwiki-us-docs/discourse
更新图片链接
2021-07-21 10:50:59 -04:00
054dc82f0a Merge remote-tracking branch 'origin/master' into discourse 2021-07-21 10:49:16 -04:00
3549c06ce7 更新 Discourse 云平台的安装文档图片链接 2021-07-21 10:49:00 -04:00
ed746fce2b
Merge pull request #30 from cwiki-us-docs/discourse
Discourse 基于云的安装文档
2021-07-21 10:25:51 -04:00
04268f7d75 Merge remote-tracking branch 'origin/master' into discourse 2021-07-21 10:25:11 -04:00
0cb1080067 完成云平台的安装内容翻译 2021-07-21 10:25:02 -04:00
f52cf84cc2 完成云平台的安装内容翻译 2021-07-21 10:17:22 -04:00
5db82c2493
Merge pull request #29 from cwiki-us-docs/discourse
创建链接
2021-07-21 09:35:01 -04:00
45e72bdc72 创建链接 2021-07-21 09:34:20 -04:00
311971ff70 提交 Discourse 初始化文件 2021-07-21 09:26:38 -04:00
YuCheng Hu
c6c470f069 更新子网站链接 2021-07-12 15:40:48 -04:00
ac813f6722
Merge pull request #28 from cwiki-us-docs/it_interview
It interview
2021-05-13 10:08:34 -04:00
66c3b97650
Update content for 2021 疫情期间美国公司技术岗的面试流程 https://www.ossez.com/t/topic/13463 2021-05-13 10:04:59 -04:00
186401fe22
Update the ctx 2021-05-12 09:31:25 -04:00
d5ee93f952
Merge pull request #27 from cwiki-us-docs/it_interview
Update the link for https://www.ossez.com/t/topic/13462
2021-05-12 09:30:17 -04:00
3aaa98b247
Update the link for https://www.ossez.com/t/topic/13462 2021-05-12 09:14:17 -04:00
e93531c52c Update the link for https://www.ossez.com/t/topic/13461 about 从一个工作到一个工作 2021-05-12 07:05:24 -04:00
45534e0b17
Merge pull request #26 from cwiki-us-docs/it_interview
Spring Reactive
2021-04-30 01:22:45 -04:00
d417c42553 Spring Reactive 2021-04-30 01:22:10 -04:00
0985a88859
Merge pull request #25 from cwiki-us-docs/it_interview
It interview
2021-04-29 17:04:10 -04:00
617692cf6b algorithm 2021-04-29 11:35:56 -04:00
0792e3448f Prime numbers from 1 to 100 2021-04-29 11:30:06 -04:00
bd5bd59e5b algorithm content 2021-04-29 11:29:06 -04:00
8298582ef3
Merge pull request #24 from cwiki-us-docs/it_interview
https://www.ossez.com/t/topic/13451 for new experience
2021-04-29 11:22:46 -04:00
228d426364 https://www.ossez.com/t/topic/13451 for new experience 2021-04-29 10:59:34 -04:00
93d2ebbbe1
Merge pull request #23 from cwiki-us-docs/it_interview
It interview for Java documents folder init
2021-04-29 10:06:40 -04:00
a6c5ba2594 init submit all java related documents 2021-04-29 10:05:14 -04:00
e92ddde554 init folder for multi thread 2021-04-29 09:59:48 -04:00
6671163b02 Init the folder for JVM 2021-04-29 09:58:27 -04:00
22a9c9e329 Change the content for IT interview 2021-04-29 09:54:54 -04:00
YuCheng Hu
97750b76b1
Merge pull request #22 from cwiki-us-docs/protocol-buffers
添加 Spring 项目文档的快速链接
2021-02-17 11:00:08 -05:00
YuCheng Hu
a0549cc87f
添加 Spring 项目文档的快速链接 2021-02-17 10:58:18 -05:00
YuCheng Hu
0cd1993c85
Merge pull request #21
Merge pull request #20 from cwiki-us-docs/add-license-1
2020-12-01 10:07:18 -05:00
YuCheng Hu
879b754cef
Merge pull request #20 from cwiki-us-docs/add-license-1
Create LICENSE
2020-12-01 10:01:02 -05:00
YuCheng Hu
a95a124a46
Create LICENSE 2020-12-01 10:00:47 -05:00
YuCheng Hu
b193099ebc
Merge pull request #19
签名提交
2020-11-30 11:29:42 -05:00
YuCheng Hu
7ef0580560
签名提交 2020-11-30 11:27:38 -05:00
YuCheng Hu
f7f0c049f2
Merge pull request #18
protocol-buffers 文档修改和合并
2020-11-30 09:46:27 -05:00
YuCheng Hu
d9739146f3 合并修改 Protocol Buffers 的文档 2020-11-30 09:45:40 -05:00
YuCheng Hu
3e83e6d7f8 初始化提交 Protocol Buffers 的文档结构 2020-11-30 09:38:10 -05:00
YuCheng Hu
2a794ea441
Merge pull request #17
更新 MessagePack 文档使用 MD 文件
2020-11-30 09:27:47 -05:00
YuCheng Hu
7602bdef62 更新 MessagePack 文档使用 MD 文件 2020-11-30 09:27:04 -05:00
YuCheng Hu
72c4c91e5d
Merge pull request #16
修改为不同的链接和默认的 MD 文件
2020-11-29 12:53:29 -05:00
YuCheng Hu
aa5a0db7f6 修改为不同的链接和默认的 MD 文件 2020-11-29 12:52:31 -05:00
YuCheng Hu
05629f46e0
Merge pull request #15
MessagePack
2020-11-29 12:47:08 -05:00
YuCheng Hu
94189f572c 更新 MP 文件和 2020-11-29 12:45:47 -05:00
YuCheng Hu
61b3f40793 Merge remote-tracking branch 'origin/master' into MessagePack 2020-11-29 12:38:24 -05:00
YuCheng Hu
10e01554cd 删除不需要的 ASCIIDOCS build 文件 2020-11-29 12:37:44 -05:00
YuCheng Hu
9aa572b63e
Merge pull request #14
Merge remote-tracking branch 'remotes/messagepack/master' into MessagePack
2020-11-29 12:32:32 -05:00
YuCheng Hu
fbe4824ea5 Merge remote-tracking branch 'remotes/messagepack/master' into MessagePack
# Conflicts:
#	.gitignore
#	src/docs/asciidoc/index.adoc
2020-11-29 12:27:12 -05:00
YuCheng Hu
02dfa8fc58 修改页面的描述文件 2019-09-10 23:20:14 -04:00
YuCheng Hu
13067122c7 针对项目添加 .gitignore 文件 2019-09-10 23:18:40 -04:00
YuCheng Hu
25f039d237 添加页面的 toc 2019-09-10 23:15:37 -04:00
YuCheng Hu
34c6c5ba85 更新文件使用 OSSEZ 的文档样式 2019-09-10 16:40:39 -04:00
YuCheng Hu
e976c34ac9 修改项目的名称 2019-09-10 14:22:22 -04:00
YuCheng Hu
1543c67894 添加完整的代码 2019-08-07 00:46:36 -04:00
YuCheng Hu
b84cd2d94b List 元素的序列化 2019-08-07 00:13:19 -04:00
YuCheng Hu
0a895131cd 添加序列化多种类型的方法和描述 2019-08-06 23:36:23 -04:00
YuCheng Hu
a869f1dded 更新代码和过期的的测试代码,并且提交代码到 GIT 库中 2019-08-06 11:59:01 -04:00
YuCheng Hu
cd27777ee3 修改使用 JGP 格式的 logo 图标 2019-08-05 22:07:01 -04:00
YuCheng Hu
5feb925873 添加快速导航中的链接 2019-08-05 17:55:41 -04:00
YuCheng Hu
be9c5d5294 更新 安装 相关的源代码 2019-08-05 17:53:52 -04:00
YuCheng Hu
5bb7b86a3d 更使用的文档 2019-08-05 17:52:20 -04:00
YuCheng Hu
eeb5532bff 提交 gradle 到构建项目中 2019-08-05 17:01:21 -04:00
YuCheng Hu
9e29cf14bb 添加项目的 logo 文件 2019-08-05 16:58:39 -04:00
YuCheng Hu
c3819a69e3 添加首页文件 2019-08-05 16:58:09 -04:00
YuCheng Hu
10c4b99e54 添加构建需要的源代码文件 2019-08-05 16:49:03 -04:00
YuCheng Hu
f9f812d1e3 添加 gradle 构建文件 2019-08-05 16:47:06 -04:00
YuCheng Hu
7c920fa887 构建文件用于自动化集成 2019-08-05 16:18:31 -04:00
YuCheng Hu
f191fd47ae README 文件 2019-08-05 16:17:33 -04:00
YuCheng Hu
4ebc3891d9 文档的 build 文件 2019-08-05 16:14:53 -04:00
YuCheng Hu
f1e652bcce Initial commit 2019-08-05 16:04:32 -04:00
33 changed files with 958 additions and 69 deletions

8
.idea/.gitignore generated vendored
View File

@ -1,8 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Datasource local storage ignored files
/../../../../../../:\WorkDir\GitHub\cwiki-us-docs\cwikius-docs\.idea/dataSources/
/dataSources.local.xml
# Editor-based HTTP Client requests
/httpRequests/

View File

@ -1,25 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value>
<package name="java.util" alias="false" withSubpackages="false" />
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
<package name="io.ktor" alias="false" withSubpackages="true" />
</value>
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
</JetCodeStyleSettings>
<ScalaCodeStyleSettings>
<option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
</ScalaCodeStyleSettings>
</code_scheme>
</component>

View File

@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

6
.idea/thriftCompiler.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ThriftCompiler">
<compilers />
</component>
</project>

View File

@ -1,11 +1,40 @@
# 联系方式
请使用下面的联系方式和我们联系:
| 联系方式名称 | 联系方式 |
|--------|-----------------------------------------------|
| 电子邮件 | [service@ossez.com](mailto:service@ossez.com) |
| QQ 或微信 | 103899765 |
| 社区论坛 | https://www.ossez.com/c/open-source/java/15 |
# 公众平台
我们建议您通过社区论坛来和我们进行沟通,请关注我们公众平台上的账号
我们建议您通过社区论坛来和我们进行沟通,请关注我们公众平台上的账号。
扫描 QR 关注我们的微信公众号和头条号。
## 微信公众号
![](https://cdn.ossez.com/img/cwikius/cwikius-qr-wechat-search-w400.png)
## 头条号
我们也在头条号上创建了我们的公众号,请扫描下面的 QR 关注我们的头条号。
![](https://cdn.ossez.com/img/cwikius/cwikus-qr-toutiao.png)
## 知乎
请关注我们的知乎https://www.zhihu.com/people/huyuchengus
## 快速导航
在下面的表格中,我们列出了一些比较有用的 CWIKIUS 相关软件开发使用教程的导航,欢迎访问下面的链接获得更多的内容和参与讨论
| 网站名称 | URL | NOTE |
|----------------|--------------------------------------------------------|----------------------------|
| OSSEZ 社区 | [www.ossez.com](https://www.ossez.com/) | 开放社区,欢迎注册参与讨论 |
| WIKI 维基 | [www.cwiki.us](https://www.cwiki.us/) | 使用 Confluence 部署的 WIKI 知识库 |
| DOCS.OSSEZ.COM | [https://docs.ossez.com/#/](https://docs.ossez.com/#/) | 本手册的编译版本将会部署在这个链接上 |
| CN 博客 | [http://www.cwikius.cn/](http://www.cwikius.cn/) | CWIKIUS.CN 一个有独立思考和温度的清新站 |
##

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 OSSEZ.COM
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,30 +1,36 @@
# CWIKIUS 文档和手册
欢迎来到 CWIKIUS 文档和手册的空间
GitHub 上有关 CWIKIUS 的项目:[https://github.com/cwiki-us-docs/cwikius-docs](https://github.com/cwiki-us-docs/cwikius-docs)
GitHub 上有关 CWIKIUS 的项目:[https://src.ossez.com/honeymoose/Framework-Docsify](https://src.ossez.com/honeymoose/Framework-Docsify)
[联系我们](CONTACT.md ':include')
如果您有兴趣参与我们的小组和项目,请使用下面的联系方式和我们联系:
## 如何本地运行
本项目使用 docsify 进行构建。
| 联系方式名称 | 联系方式 |
|---|---|
| 电子邮件 | [service@ossez.com](mailto:service@ossez.com) |
| QQ 或微信 | 103899765 |
| QQ 交流群 Spring | 15186112 |
| 社区论坛 | [https://www.ossez.com/](https://www.ossez.com/) |
### 安装 docsify
如果你的本地计算机中没有安装 docsify 请运行命令行 `npm i docsify-cli -g` 来进行安装。
## 公众平台
我们建议您通过社区论坛来和我们进行沟通,请关注我们公众平台上的账号
### 版本检查
运行命令 `docsify -version` 来进行版本和环境检查,如果你能看到下面的内容,则说明已经安装成功了。
### 微信公众号
![](https://cdn.ossez.com/img/cwikius/cwikius-qr-wechat-search-w400.png)
```text
docsify-cli version:
4.4.3
```
### 头条号
我们也在头条号上创建了我们的公众号,请扫描下面的 QR 关注我们的头条号。
### 本地运行 docsify
在你的本地计算机终端中运行命令 `docsify serve ./` 后,你的控制台将会看到有余下的输出:
![](https://cdn.ossez.com/img/cwikius/cwikus-qr-toutiao.png)
```text
PS D:\WorkDir\Repository\honeymoose\Framework-Docsify> docsify serve ./
Serving D:\WorkDir\Repository\honeymoose\Framework-Docsify now.
Listening at http://localhost:3000
```
访问使用的默认端口是 3000随后你可以通过浏览器进行访问。
## CWIKIUS 文档和手册快速导航
@ -37,6 +43,19 @@ GitHub 上有关 CWIKIUS 的项目:[https://github.com/cwiki-us-docs/cwikius-d
| [github.io](https://cwiki-us-docs.github.io/cwikius-docs/#/) | [https://cwiki-us-docs.github.io/cwikius-docs/#/](https://cwiki-us-docs.github.io/cwikius-docs/#/) | 本手册的编译版本将会部署在这个链接上 |
| WWW.CWIKIUS.CN | [http://www.cwikius.cn/](http://www.cwikius.cn/) | CWIKIUS.CN 一个有独立思考和温度的清新站 |
### 前端和 UI
| 网站名称 | URL | NOTE |
|---|---|---|
| 前端端技术社区 | https://www.ossez.com/c/toolkit-algorithm-computer-science/web-front-end/26 | 计算机相关的前端框架和讨论 |
| Angular 技术手册 | https://angular.ossez.com/ | Angular 手册的在线翻译版本,从源代码中进行编译 |
### 后端和数据层
| 网站名称 | URL | NOTE |
|---|---|---|
| Apache Druid 技术手册 | https://druid.ossez.com/ | Druid 手册的在线翻译版本 |
### 容器 docker
| 网站名称 | URL | NOTE |
|---|---|---|

View File

@ -1,12 +1,20 @@
- CWIKIUS 文档概述
- [文档介绍和快速链接](README.md)
- [公众平台](CONTACT.md)
- [联系方式](CONTACT.md)
- Gradle
- [Deploy](deploy.md)
- Java
- [概述和环境配置](java/index.md)
- [语言基础](java/fundamentals/index.md)
- [核心编程](java/core/index.md)
- 其他小工具
- [JWT](jwt/README.md)
- [MessagePack](message-pack/index.md)
- [Discourse](discourse/index.md)
- [Awesome docsify](awesome.md)
- 面试和算法
- [面试问题和经验](interview/index.md)
- [算法题](algorithm/index.md)
- [DOCS.OSSEZ.COM](https://docs.ossez.com/#/)
- [Changelog](changelog.md)

19
algorithm/index.md Normal file
View File

@ -0,0 +1,19 @@
# 算法
在应聘技术岗位的时候,可能都会有一个让绝大部分人都比较讨厌的算法环节。
也不知道是谁搞出这么无聊的东西,但没有办法现实总是残酷的,在抱怨的同时也只能在找工作之前复习下这些在实际工作中基本上不用的算法题了。
因为 MD 文档格式的限制,所以我们在这里只放一个索引并且维护这个索引,有关的具体内容,请通过索引访问我们的社区进行查看,我们也非常欢迎您参与讨论,
您可以在社区注册后进行讨论。
## 算法问题
在这里我将按照我遇到算法问题的先后顺序进行排列。很多算法题目都是题库上面的原题,你可以到题库上面去找找。
我这里只是结合我在面试的时候遇到的题目来进行解答和进行一些点评,就当时总结和消遣吧,如果你希望有什么问题一起讨论的话,欢迎 Fork 这个项目并且登录社区进行讨论。
最新的内容在最前面。
### 内容索引
* [A “word-wrap” functionality一个字符串包裹函数](https://www.ossez.com/t/a-word-wrap-functionality/13452)
* [Prime numbers from 1 to 100 (打印 100 以内的素数)](https://www.ossez.com/t/prime-numbers-from-1-to-100-100/13450)

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />

197
discourse/index.md Normal file
View File

@ -0,0 +1,197 @@
# Discourse 文档
Discourse 文档是通过官方文档的整理翻译过来的,下面的内容与官方的内容基本一致。
针对中文环境下的时候,我们对遇到的一些问题发布到我们的讨论区中以方便大家快速导航访问:
- [Discourse CentOS 8 全新安装手册](https://www.ossez.com/t/discourse-centos-8/594) - 在 CentOS/RHEL 平台上全新安装 Discourse 的过程和命令。
- [Discourse 如何不使用 Lets Encrypt 而使用 CA 签名的密钥进行安装](https://www.ossez.com/t/discourse-lets-encrypt-ca/552) - 使用你自己已有的 CA 秘钥进行安装。
- [Discourse 设置 GTM](https://www.ossez.com/t/discourse-gtm/13240) - 使用 Google 的标签管理器来插入需要的 JS 代码。
## 云平台安装
**在基于云平台的 Discourse 安装通常不会超过 30 分钟**,哪怕你没有任何有关 Rails 或 Linux shell 的知识都能够顺利完成安装。
下面我们是通过 [DigitalOcean][do] 服务提供商来进行安装测的,但是所有的安装步骤都能够在
所有兼容 **Docker** 的云计算平台上进行,同时也可以在本地的服务器上完成安装。
> 🔔 如果你连 30 分钟都没有的话?你可以联系 Discourse 社区来帮你完成安装Discourse 社区将会收取一次性 $150 (美元)的费用。 [单击此处链接来对服务进行购买](https://www.literatecomputing.com/product/discourse-install/) 。
### 创建一个新的云服务器
创建一个你的新云服务器,例如:[DigitalOcean](https://www.digitalocean.com/?refcode=5fa48ac82415) ,当然你也可以使用其他平台提供的服务器。
- 默认配置 **当前版本的 LTS Ubuntu 操作系统** 能够很好的工作。最少,需要一个 64 位的 Linux 操作系统,并且这个操作系统的内核需要更新到最新的版本。
- 默认配置 **1 GB** 的内存针对小型的 Discourse 社区通常都能很好的运行。但我们推荐针对大型社区使用 2 GB 的内存。
- 默认配置 **New York** 数据中心针对北美和欧洲来说都是不错的地理分区,如果你的 Discourse 用户使用的对象多是其他地理位置的用户,那么你可以选择离你稍近的数据中心。
- 输入域名 `discourse.example.com` 来在 DigitalOcean 中创建一个 DropletDroplet 是 DigitalOcean 定义的服务器名称)。当然你也可以购买使用你自己的域名,通常 Discourse 的安装需要一个真实的域名,没有办法通过 IP 地址安装,所以我们建议你首先购买域名或者使用你已有域名的二级域名。
创建你的新 Droplet这个过程就等于你在 DigitalOcean 上创建了一个服务器,也等同你在其他平台上面创建了一个 VPS 或者服务器。
当完成创建后,你将会收到一个电子邮件,这个电子邮件中有你的 Root 用户的密码。
但是我们建议你 [设置使用 SSH keys](https://www.google.com/search?q=digitalocean+ssh+keys) 来增强你服务器访问的安全性。
### 访问你的云服务器
通过使用 IP 地址,并使用 SSH 来连接和访问你创建的服务器,或者针对 Windows 平台你可以安装 [Putty][put] 后运行下面的命令来进行连接:
ssh root@192.168.1.1
如果你没有配置 SSH Key 的话,你可以使用 DigitalOcean 发给你的电子邮件中包含的密码来进行登录,
或者使用你本地的 SSH Key 来进行连接。
### 安装 Docker / Git (可选的)
如果你希望使用你自己的 Docker 版本,你可以现在在你新设置的服务器上进行安装。
如果你的服务器上没有默认安装 Docker那么 `discourse-setup` 将会自动为你从 get.docker.com 下载后进行安装。
### 安装 Discourse
从 [官方 Discourse Docker 镜像][dd] 仓库中克隆代码到本地计算机的 `/var/discourse` 目录。
sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
你只需要执行上面的命令即可,在 Discourse 安装的过程中需要 root 权限。
### 电子邮件
> ⚠️ **电子邮件系统在 Discourse 的用户创建过程中非常重要。**
> 如果你没有在安装 Discourse 之前创建电子邮件 SMTP 服务器,那么你安装的 Discourse 无法访问也无法登录HAVE A BROKEN SITE
- 如果你已经有你自己的 SMTP 邮件服务器了,那么你就可以直接使用你已有的邮件服务器配置信息。
- 还有没有邮件服务器?请访问 [**Discourse 推荐使用的邮件服务器**][mailconfig].
- 为了确保你的邮件能够被正常投递,你必须在你的 DNS 中添加有效的 [SPF 和 DKIM 记录](https://www.google.com/search?q=spf+dkim) 。请访问你邮件服务提供商的文档如何设置这些信息。
根据我们实际使用的情况Discourse 的安装**必须**配置可用的域名和邮件服务器,针对中国境内的情况,你可以使用阿里云或者腾讯云提供的企业邮箱。
通常我们建议你使用境外的邮件服务器,比如说 AWS 的 SES或者 MailGun 都是不错的服务,你可能需要一张国际信用卡完成校验。
但这一步是必须的,否则你的的 Discourse 无法完成安装。
### 域名
> 🔔 Discourse 不能通过 IP 地址来工作,你必须拥有一个域名或者二级域名来进行安装,例如 `example.com`
- 如果你已经拥有一个域名了,那么可以选择任何一个二级域名来进行安装,例如 `discourse.example.com``talk.example.com``forum.example.com` 来安装你的 Discourse 实例。
- 还没有域名的话,你可以访问 [NameCheap](https://www.namecheap.com/domains/domain-name-search/) 网站来搜索你喜欢的域名,或者直接 Google 搜索 [great domain name registrars](https://www.google.com/search?q=best+domain+name+registrars) 来选择你喜欢的域名注册商。
- 你的 DNS 控制台应该是能够访问的,在你购买域名后,你还需要访问你的 DNS 配置来配置 DNS。针对你安装的 Discourse 网站,你需要通过你的 DNS 创建一个 [`A` 记录](https://support.dnsimple.com/articles/a-record/) ,这个 A 记录需要将你要安装的域名指向到一个特定的 IP 地址。这个 IP 地址通常为你在第一步购买的服务器 IP 地址。
### 编辑 Discourse 配置
通过下面的命令运行配置工具
./discourse-setup
你需要根据下面的提示配置所有参数:
Hostname for your Discourse? [discourse.example.com]:
Email address for admin account(s)? [me@example.com,you@example.com]:
SMTP server address? [smtp.example.com]:
SMTP port? [587]:
SMTP user name? [user@example.com]:
SMTP password? [pa$$word]:
Let's Encrypt account email? (ENTER to skip) [me@example.com]:
上面的输入数据将会为你的 Discourse 实例创建一个 `app.yml` 文件,这个文件将会在安装进行后对你的 Discourse 实例进行配置。
整个安装启动过程可能需要耗费 **2-8 分钟** 来为你的配置 Discourse。
如果在安装完成后你还需要对你的配置进行修改,你可以再次运行 `./discourse-setup` 命令(这个命令将会把已经存在的 `app.yml` 文件重新载入)。
或者你也可以手动直接编辑 `/containers/app.yml` 文件中的内容,然后再次运行 `./launcher rebuild app`,否则你的修改是不会生效的。
### 启动 Discourse
一旦初始化安装配置完成后,你的 Discourse 示例应该可以通过你配置的域名 `discourse.example.com` 在浏览器上进行访问。
<img src="https://cdn.ossez.com/discourse-uploads/optimized/2X/8/8db53b9128ec4fb74872bdb7c1231ff04d525218_2_616x500.png" width="650">
### 注册一个新的管理员账号
使用你再启动配置过程中输入的电子邮件地址来注册一个管理员账号。
<img src="https://cdn.ossez.com/discourse-uploads/original/2X/9/99476eac0ffa4aa3a923aa7ae864fedf546dab0a.png" width="650">
<img src="https://cdn.ossez.com/discourse-uploads/original/2X/5/58660d377a00d9797be8b74036ace9d0ebf57fff.png" width="650">
(如果你不能注册你的管理账号Admin请通过路径`/var/discourse/shared/standalone/log/rails/production.log` 检查日志,或者访问 [电子邮件问题检查列表](https://meta.discourse.org/t/troubleshooting-email-on-a-new-discourse-install/16326) 。)
当你完成管理员账号的注册后,设置向导将会启动并指引你配置你的 Discourse 实例。
<img src="https://cdn.ossez.com/discourse-uploads/original/2X/9/944509dd0c049a2cec42d6108369fa5cf5d92d0d.png" width="650">
当完成所有的设置向导你将会看到职员主题Staff topics**READ ME FIRST: Admin Quick Start Guide**
这个配置向导将会包含有针对后续配置的的一些建议和如何对你的 Discourse 安装实例进行自定义配置。
<img src="https://cdn.ossez.com/discourse-uploads/original/2X/8/8a60bc840705aaa1fc77b039a7babf77d6b4a10b.png" width="650">
### 安装后的维护
- 我们强烈建议打开你针对你操作系统的安全自动更新。在 Ubuntu 使用 `dpkg-reconfigure -plow unattended-upgrades` 命令。在 CentOS/RHEL使用 [`yum-cron`](https://www.cyberciti.biz/faq/fedora-automatic-update-retrieval-installation-with-cron/) 包。
- 如果你使用的是密码登录你的操作系统,而不是使用 SSH Key 的话,请确保你使用强密码。在 Ubuntu 使用 `apt-get install libpam-cracklib` 包。我们推荐使用 `fail2ban` ,这个将会对 3 次登录失败的 IP 地址禁止登录 10 分钟。
- **Ubuntu**: `apt-get install fail2ban`
- **CentOS/RHEL**: `sudo yum install fail2ban` (需要 [EPEL](https://support.rackspace.com/how-to/install-epel-and-additional-repositories-on-centos-and-red-hat/))
- 如果你希望默认安装防火墙, 针对 Ubuntu [打开 ufw](https://meta.discourse.org/t/configure-a-firewall-for-discourse/20584) 或者针对 CentOS/RHEL 7 及其后续版本使用 `firewalld`
当 Discourse 有新版本更新的时候,你的邮件地址将会收到更新提示。
请随时更新你的 Discourse 实例到最新版本以确保所有的安全问题被修复。
**更新 Discourse 到最新的版本**,请通过你的浏览器访问 `/admin/upgrade` 然后单击更新按钮。
`/var/discourse` 目录中的 `launcher` 命令被用来使用一些系统级别的维护:
``` text
Usage: launcher COMMAND CONFIG [--skip-prereqs] [--docker-args STRING]
Commands:
start: Start/initialize a container启动/初始化容器)
stop: Stop a running container停止一个运行的容器
restart: Restart a container重启容器
destroy: Stop and remove a container (停止然后删除一个容器)
enter: Use nsenter to get a shell into a container (使用 nsenter 来访问容器内的 Shell
logs: View the Docker logs for a container查看一个容器的日志
bootstrap: Bootstrap a container for the config based on a template从配置模板中来启动一个容器的配置和初始化
rebuild: Rebuild a container (destroy old, bootstrap, start new)(重构一个容器,将会删除老的容器,初始一个容器,启动新的容器)
cleanup: Remove all containers that have stopped for > 24 hours针对停止运行超过 24 个小时的容器进行删除)
Options:
--skip-prereqs Don't check launcher prerequisites (不运行安装器的环境校验)
--docker-args Extra arguments to pass when running docker (传递给容器内的额外参数)
```
### 添加更多的 Discourse 特性
下面的内容是一些快速的链接,能够帮助你扩展 Discourse 安装的功能:
- Users to log in *only* via your pre-existing website's registration system? [Configure Single-Sign-On](https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045).
- 用户可以使用 [Google](https://www.ossez.com/t/discourse-google-google-login/13582), [Twitter](https://meta.discourse.org/t/configuring-twitter-login-for-discourse/13395), [GitHub](https://www.ossez.com/t/discourse-github/13562), or [Facebook](https://meta.discourse.org/t/configuring-facebook-login-for-discourse/13394) 进行注册登录。
- Users to post replies via email? [Configure reply via email](https://meta.discourse.org/t/set-up-reply-via-email-support/14003).
- Automatic daily backups? [Configure backups](https://meta.discourse.org/t/configure-automatic-backups-for-discourse/14855).
- Free HTTPS / SSL support? [Configure Let's Encrypt](https://meta.discourse.org/t/setting-up-lets-encrypt-cert-with-discourse-docker/40709). Paid HTTPS / SSL support? [Configure SSL](https://meta.discourse.org/t/allowing-ssl-for-your-discourse-docker-setup/13847).
- Use a plugin [from Discourse](https://github.com/discourse) or a third party? [Configure plugins](https://meta.discourse.org/t/install-a-plugin/19157)
- Multiple Discourse sites on the same server? [Configure multisite](https://meta.discourse.org/t/multisite-configuration-with-docker/14084).
- Webhooks when events happen in Discourse? [Configure webhooks](https://meta.discourse.org/t/setting-up-webhooks/49045).
- A Content Delivery Network to speed up worldwide access? [Configure a CDN](https://meta.discourse.org/t/enable-a-cdn-for-your-discourse/14857). We recommend [Fastly](http://www.fastly.com/).
- Import old content from vBulletin, PHPbb, Vanilla, Drupal, BBPress, etc? [See our open source importers](https://github.com/discourse/discourse/tree/main/script/import_scripts).
- A user friendly [offline page when rebuilding or upgrading?](https://meta.discourse.org/t/adding-an-offline-page-when-rebuilding/45238)
- To embed Discourse [in your WordPress install](https://github.com/discourse/wp-discourse), or [on your static HTML site](https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963)?
Help us improve this guide! Feel free to ask about it on [meta.discourse.org][meta], or even better, submit a pull request.
[dd]: https://github.com/discourse/discourse_docker
[ssh]: https://help.github.com/articles/generating-ssh-keys
[meta]: https://meta.discourse.org
[do]: https://www.digitalocean.com/?refcode=5fa48ac82415
[put]: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
[mailconfig]: https://github.com/discourse/discourse/blob/main/docs/INSTALL-email.md

Binary file not shown.

View File

@ -1,5 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -16,14 +16,26 @@
<meta name="description" content="Description">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/lib/themes/vue.css">
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify-themeable@0/dist/css/theme-simple.css">
<style>
:root {
/* Reduce the font size */
/* --base-font-size: 14px; */
/* Change the theme color hue (0-360) */
/* --theme-hue: 325; */
/* Add sidebar navigation bullets */
/* --sidebar-nav-link-before-content-l1: "😀"; */
/* --sidebar-nav-link-before-content-l2: "💩"; */
--link-color: var(--theme-color);
}
</style>
</head>
<body>
<div id="app"></div>
<script>
window.$docsify = {
name: 'CWIKIUS 文档手册',
repo: 'https://github.com/cwiki-us-docs/cwikius-docs',
name: 'CWIKIUS 文档手册 模板',
repo: 'https://src.ossez.com/honeymoose/Framework-Docsify',
executeScript: true,
loadNavbar: true,
mergeNavbar: true,

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

28
interview/index.md Normal file
View File

@ -0,0 +1,28 @@
# 面试问题和经验文档
在应聘技术岗位的时候,通常会要求你进行一些算法和基础知识的考核。因计算机的知识比较复杂概念也非常多,这就给应聘者带来很大的困惑,应该怎么去做?
同时面试官很多时候也是突击某个问题,然后拿着这个问题来问应聘者。结果就导致了很多问题非常刁钻古怪,甚至有时候你根本就不可能在实际开发中遇到。
不管怎么样,这种面试方式至少目前来说是一种趋势,所以我们尽量收集一些技术岗的面试经验供大家参考。
![it-job-interview](_images/it-job-interview.jpg)
因为 MD 文档格式的限制,所以我们在这里只放一个索引并且维护这个索引,有关的具体内容,请通过索引访问我们的社区进行查看,我们也非常欢迎您参与讨论,
您可以在社区注册后进行讨论。
## 面试问题和经验索引
在这里我们希望按照年份进行一些分开,这样能够帮助大家尽量区分时间,同时我们的排序是按照倒序排列的。
最新的内容在最前面(按照时间倒序排序)。
### 2021
* [2021 疫情期间美国公司技术岗的面试流程](https://www.ossez.com/t/topic/13463)
* [从拒绝到被拒绝](https://www.ossez.com/t/topic/13462)
* [从一个工作到一个工作](https://www.ossez.com/t/topic/13461)
* [北美亚特兰大一金融服务公司面试总结](https://www.ossez.com/t/topic/13453)
* [北美一工作搜索引擎公司技术岗面经](https://www.ossez.com/t/topic/13451)
* [一房地产数据服务初创公司的面经](https://www.ossez.com/t/topic/13441)
### 2019
* [IT 技术岗位 2019 年北美求职流水账](https://www.ossez.com/t/it-2019/13433)

2
java/collection/index.md Normal file
View File

@ -0,0 +1,2 @@
# 集合

4
java/core/annotation.md Normal file
View File

@ -0,0 +1,4 @@
# Annotation注解
* [Java @Deprecated Annotation注解](https://www.ossez.com/t/java-deprecated-annotation/13676)

3
java/core/index.md Normal file
View File

@ -0,0 +1,3 @@
# Java 核心编程
[Annotation注解](annotation.md ':include')

View File

@ -0,0 +1,2 @@
# 基本概念

View File

@ -0,0 +1,2 @@
# 数据类型

View File

@ -0,0 +1,2 @@
# 异常处理

View File

@ -0,0 +1,2 @@
# 语言基础

2
java/fundamentals/io.md Normal file
View File

@ -0,0 +1,2 @@
# I/O 操作

View File

@ -0,0 +1,2 @@
# 语言结构

View File

@ -0,0 +1,2 @@
# 方法和函数

View File

@ -0,0 +1,2 @@
# 反射

10
java/index.md Normal file
View File

@ -0,0 +1,10 @@
# Java 技术问题导航
Java 是由 Sun Microsystems 公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称Java 1.0 [J2SE]。由James Gosling和同事们共同研发并在1995年正式推出。
本页面中主要对 Java 使用的基础知识和配置的内容进行快速导航。
## 安装
* [Windows 环境下安装 Oracle JDK](https://www.ossez.com/t/windows-oracle-jdk/7254)
## 配置环境
* [Java 在 Windows 10 中配置环境变量](https://www.ossez.com/t/java-windows-10/13675)

3
java/jvm/index.md Normal file
View File

@ -0,0 +1,3 @@
# JVM

View File

@ -0,0 +1,3 @@
# 多线程

View File

@ -0,0 +1,3 @@
# 新特性

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

549
message-pack/index.md Normal file
View File

@ -0,0 +1,549 @@
# MessagePack 文档
中文标题【MessagePack Java 0.6.X 快速开始指南】
MessagePack 的相关文档,本文是根据官方的内容和我们项目中的具体实践进行编辑的。
![messagepack logo](_images/messagepack-logo.jpg)
> :warning: 0.6.x 版本的 MessagePack 已经过期被淘汰了。如果你现在开始使用 MessagePack 话,请不要使用这个版本。
我们在这里保留 0.6.x 版本的内容主要用于参考用途。
最新的 MessagePack 版本请参考: https://github.com/msgpack/msgpack-java 中的项目源代码。
:information_source: MessagePack 中文文档请参考: http://docs.ossez.com/messagepack-docs/index.html
:information_source: MessagePack 测试和示例源代码: https://github.com/cwiki-us-demo/serialize-deserialize-demo-java
这个指南提供了使用 msgpack-java 的快速指南。在开始的时候,我们将会介绍如何安装 msgpack-java然后将会运行如何使用 msgpack 来对对象序列化/反序列化serialize/deserizalize对象。
## 安装
你可以使用下面 2 种方法来安装 msgpack-java —— 从 maven 下载或者直接构建 jar 包。
### 从 Maven2 仓库中进行安装
MessagePack 针对 Java 的使用已经发布到 Maven 的中央仓库中Maven Central Repository。你可以使用下面的参数来配置你项目的 pom.xml 文件。
````xml
<dependency>
<groupId>org.msgpack</groupId>
<artifactId>msgpack</artifactId>
<version>${msgpack.version}</version>
</dependency>
````
你需要将 ${msgpack.version} 替换为当前的 MessagePack 版本,有关可以使用的具体版本你可以访问 http://repo1.maven.org/maven2/org/msgpack/msgpack/ 中的版本。
请注意,在 0.6.x 版本中最新的版本只更新到 0.6.12。
### 从 git 仓库中进行安装
你可以从代码仓库中获得最新的代码。
----
```bash
$ git clone git@github.com:msgpack/msgpack-java.git
$ cd msgpack-java
$ mvn package
```
使用上面的代码进行编译后u你将会在 msgpack-java/target 目录中得到 msgpack.jar 包。
同时你也需要 https://code.google.com/p/json-simple/ 和 https://github.com/jboss-javassist/javassist 来让 msgpack.jar 可以在项目中使用。否则你将会收到 NoClassDefFoundError 错误。
## 如何使用
下面是如何使用的示例代码。
### 使用一个消息打包message-packable
使用注解 '_@Message_' 来让你可以序列化你自己类中对象的 public 字段。
本代码可以在 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Object.java 中下载到本地后进行编译测试。
```java
package com.insight.demo.msgpack;
import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.annotation.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.UUID;
import static org.junit.Assert.assertEquals;
/**
* MessagePack6Objects
*
* @author yhu
*/
public class MessagePack6Object {
final Logger logger = LoggerFactory.getLogger(MessagePack6Object.class);
/**
* MessageData Message Object
*/
@Message // Annotation
public static class MessageData {
// public fields are serialized.
public String uuid;
public String name;
public double version;
}
/**
* Test MessagePack6Objects
*/
@Test
public void testMessagePack6Objects() {
logger.debug("MessagePack6Objects for Objects");
String uuid = UUID.randomUUID().toString();
// INIT OBJ
MessageData src = new MessageData();
src.uuid = uuid;
src.name = "MessagePack6";
src.version = 0.6;
try {
MessagePack msgPack = new MessagePack();
// Serialization
logger.debug("------ Serialization ------");
byte[] bytes = msgPack.write(src);
logger.debug("Bytes Array Length: [{}]", bytes.length);
// Deserialization
logger.debug("------ Deserialization ------");
MessageData dst = msgPack.read(bytes, MessageData.class);
logger.debug("Check Object for UUID: [{}]", dst.uuid);
assertEquals(uuid, dst.uuid);
} catch (Exception ex) {
logger.error("MessagePack Serialization And Deserialization error", ex);
}
}
}
```
如果你希望按照顺序序列化多个对象的话,你可以使用 '_Packer_' 和 '_Unpacker_' 多个对象。
这是因为 '_MessagePack.write(Object)_' 和 '_read(byte[])_' 实际上每次都调用创建了 '_Packer_' 和 '_Unpacker_' 对象。
为了使用 '_Packer_' 和 '_Unpacker_' 对象,请调用 '_createPacker(OutputStream)_' 和 '_createUnpacker(InputStream)_'。
本代码可以 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Objects.java 中查看。
```java
package com.insight.demo.msgpack;
import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.annotation.Message;
import org.msgpack.packer.Packer;
import org.msgpack.unpacker.Unpacker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.UUID;
import static org.junit.Assert.assertEquals;
/**
* MessagePack6Objects
*
* @author yhu
*/
public class MessagePack6Objects {
final Logger logger = LoggerFactory.getLogger(MessagePack6Objects.class);
/**
* MessageData Message Objects
*/
@Message // Annotation
public static class MessageData {
// public fields are serialized.
public String uuid;
public String name;
public double version;
}
/**
* Test MessagePack6Objects
*/
@Test
public void testMessagePack6Objects() {
logger.debug("MessagePack6Objects for Objects");
String uuid = UUID.randomUUID().toString();
// INIT OBJ
MessageData src1 = new MessageData();
src1.uuid = uuid;
src1.name = "MessagePack6-src1";
src1.version = 0.6;
MessageData src2 = new MessageData();
src2.uuid = uuid;
src2.name = "MessagePack6-src2";
src2.version = 10.6;
MessageData src3 = new MessageData();
src3.uuid = uuid;
src3.name = "MessagePack6-src3";
src3.version = 1.6;
try {
MessagePack msgPack = new MessagePack();
// Serialization
logger.debug("------ Serialization ------");
ByteArrayOutputStream out = new ByteArrayOutputStream();
Packer packer = msgPack.createPacker(out);
packer.write(src1);
packer.write(src2);
packer.write(src3);
byte[] bytes = out.toByteArray();
logger.debug("Bytes Array Length: [{}]", bytes.length);
// Deserialization
logger.debug("------ Deserialization ------");
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
Unpacker unpacker = msgPack.createUnpacker(in);
MessageData dst1 = unpacker.read(MessageData.class);
MessageData dst2 = unpacker.read(MessageData.class);
MessageData dst3 = unpacker.read(MessageData.class);
logger.debug("Check Object for UUID: [{}]", dst1.uuid);
assertEquals(uuid, dst1.uuid);
} catch (Exception ex) {
logger.error("MessagePack Serialization And Deserialization error", ex);
}
}
}
```
### 多种类型变量的序列化和反序列化serialization/deserialization
类 '_Packer/Unpacker_' 允许序列化和反序列化多种类型的变量,如后续程序所示。这个类启用序列化和反序列化多种类型的变量和序列化主要类型变量以及包装类,'_String_' 对象,
'_byte[]_' 对象,'_ByteBuffer 对象等的方法相似。
如上面提示的,你可以序列化和反序列化你自己的对象,前提是你自己的对象需要使用 '_@Message_' 注解。
本代码可以在 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Types.java 中查看。
```java
package com.insight.demo.msgpack;
import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.packer.Packer;
import org.msgpack.unpacker.Unpacker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.math.BigInteger;
import java.nio.ByteBuffer;
/**
* MessagePack6Types
*
* @author yhu
*/
public class MessagePack6Types {
final Logger logger = LoggerFactory.getLogger(MessagePack6Types.class);
/**
* Test MessagePack6Types
*/
@Test
public void testMessagePack6Types() {
logger.debug("testMessagePack6Types for Types");
MessagePack msgpack = new MessagePack();
try {
//
// Serialization
//
ByteArrayOutputStream out = new ByteArrayOutputStream();
Packer packer = msgpack.createPacker(out);
// Serialize values of primitive types
packer.write(true); // boolean value
packer.write(10); // int value
packer.write(10.5); // double value
// Serialize objects of primitive wrapper types
packer.write(Boolean.TRUE);
packer.write(new Integer(10));
packer.write(new Double(10.5));
// Serialize various types of arrays
packer.write(new int[]{1, 2, 3, 4});
packer.write(new Double[]{10.5, 20.5});
packer.write(new String[]{"msg", "pack", "for", "java"});
packer.write(new byte[]{0x30, 0x31, 0x32}); // byte array
// Serialize various types of other reference values
packer.write("MessagePack"); // String object
packer.write(ByteBuffer.wrap(new byte[]{0x30, 0x31, 0x32})); // ByteBuffer object
packer.write(BigInteger.ONE); // BigInteger object
//
// Deserialization
//
byte[] bytes = out.toByteArray();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
Unpacker unpacker = msgpack.createUnpacker(in);
// to primitive values
boolean b = unpacker.readBoolean(); // boolean value
int i = unpacker.readInt(); // int value
double d = unpacker.readDouble(); // double value
// to primitive wrapper value
Boolean wb = unpacker.read(Boolean.class);
Integer wi = unpacker.read(Integer.class);
Double wd = unpacker.read(Double.class);
// to arrays
int[] ia = unpacker.read(int[].class);
Double[] da = unpacker.read(Double[].class);
String[] sa = unpacker.read(String[].class);
byte[] ba = unpacker.read(byte[].class);
// to String object, ByteBuffer object, BigInteger object, List object and Map object
String ws = unpacker.read(String.class);
ByteBuffer buf = unpacker.read(ByteBuffer.class);
BigInteger bi = unpacker.read(BigInteger.class);
} catch (Exception ex) {
logger.error("MessagePack Serialization And Deserialization error", ex);
}
}
}
```
方法 '_Packer#write()_' 允许序列化多种类型的数据。
类 '_Unpacker_' 针对反序列化二进制数据为主要变量,提供了一个反序列化方法。例如,你希望将二进制数据反序列化为 '_boolean_' (或者 '_int_') 数据类型,你可以使用 '_Unpacker_' 中的 '_readBoolean_' (或者 '_readInt_') 方法。
'_Unpacker_' 同时也为参考变量提供了一个读取的方法。这个方法允许为一个参考变量从二进制数据中进行反序列化。参考变量的定义为你将类型指定为一个参数。
例如,你希望反序列化二进制数据到 '_String_' (或者 '_byte[]_') 对象,你必须在调用 '_read(String.class)_' (或者 '_read(byte[].class)_') 方法的时候定义描述。
## List, Map 对象的序列化和反序列化serialization/deserialization
为了序列化原生的容器对象例如 '_List_' 和 '_Map_' 对象,你必须使用 '_Template_'。
'_Template_' 对象是 serializer 和 deserializer 的配对。例如,为了序列化一个 '_List_' 对象,在 '_List_' 对象中 '_Integer_' 对象为元素你可以使用下面的方法来创建一个模板对象Template object
```java
Template listTmpl = Templates.tList(Templates.TInteger);
```
类 '_tList_' '_TInteger_' 是静态方法,字段为 '_Templates_'。
一个 '_List 和 '_Map_' 对象的用例如下显示:
本代码可以在 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6Template.java 中查看。
```java
package com.insight.demo.msgpack;
import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.packer.Packer;
import org.msgpack.template.Template;
import org.msgpack.unpacker.Unpacker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.msgpack.template.Templates.*;
/**
* MessagePack6Template
*
* @author yhu
*/
public class MessagePack6Template {
final Logger logger = LoggerFactory.getLogger(MessagePack6Template.class);
/**
* Test MessagePack6Template
*/
@Test
public void testMessagePack6Template() {
logger.debug("MessagePack6Template for Template");
MessagePack msgpack = new MessagePack();
try {
// Create templates for serializing/deserializing List and Map objects
Template<List<String>> listTmpl = tList(TString);
Template<Map<String, String>> mapTmpl = tMap(TString, TString);
//
// Serialization
//
ByteArrayOutputStream out = new ByteArrayOutputStream();
Packer packer = msgpack.createPacker(out);
// Serialize List object
List<String> list = new ArrayList<String>();
list.add("msgpack");
list.add("for");
list.add("java");
packer.write(list); // List object
// Serialize Map object
Map<String, String> map = new HashMap<String, String>();
map.put("sadayuki", "furuhashi");
map.put("muga", "nishizawa");
packer.write(map); // Map object
//
// Deserialization
//
byte[] bytes = out.toByteArray();
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
Unpacker unpacker = msgpack.createUnpacker(in);
// to List object
List<String> dstList = unpacker.read(listTmpl);
// to Map object
Map<String, String> dstMap = unpacker.read(mapTmpl);
} catch (Exception ex) {
logger.error("MessagePack Serialization And Deserialization error", ex);
}
}
}
```
### 不使用注解annotations来序列化
如果你不能添加 @Message 到你的定义对象中但是你还是希望进行序列化。你可以使用 register 方法来在类中启用序列化对象。
如下的代码所示:
```java
MessagePack msgpack = new MessagePack();
msgpack.register(MyMessage2.class);
```
例如,如果 MyMessage2 类被包含到了外部的库中了。你没有办法比较容易的编辑源代码,添加 '_@Message_' 到源代码中。
register 方法能够允许为 MyMessage2 自动创建一个 serializer 和 deserializer 对。
你可以在执行方面后序列化对象 MyMessage2。
### 可选字段
你可添加一个新的字段来保持可用性。在新字段中使用 '_@Optional_' 注解。
```java
@Message
public static class MyMessage {
public String name;
public double version;
// new field
@Optional
public int flag = 0;
}
```
如果你尝试反序列化老版本数据的话,可选字段将会被忽略。
### 动态类型
我们知道 Java 是一个静态类型的语言。通过输入 '_Value_' MessagePack能够实现动态的特性。
'_Value_' 有方法来检查自己的类型('_isIntegerType()_', '_isArrayType()_', 等...),同时也转换为自己的类型 ('_asStringValue()_', '_convert(Template)_')。
本代码可以在 https://github.com/cwiki-us-demo/messagepack-6-demo-java/blob/master/src/test/java/com/insight/demo/msgpack/MessagePack6DynamicTyping.java 中查看。
```java
package com.insight.demo.msgpack;
import org.junit.Test;
import org.msgpack.MessagePack;
import org.msgpack.type.Value;
import org.msgpack.unpacker.Converter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import static org.msgpack.template.Templates.TString;
import static org.msgpack.template.Templates.tList;
/**
* MessagePack6Objects
*
* @author yhu
*/
public class MessagePack6DynamicTyping {
final Logger logger = LoggerFactory.getLogger(MessagePack6DynamicTyping.class);
/**
* Test MessagePack6Objects
*/
@Test
public void MessagePack6DynamicTyping() {
logger.debug("MessagePack6Objects for Objects");
// Create serialize objects.
List<String> src = new ArrayList<String>();
src.add("msgpack");
src.add("kumofs");
src.add("viver");
MessagePack msgpack = new MessagePack();
try {
// Serialize
byte[] raw = msgpack.write(src);
// Deserialize directly using a template
List<String> dst1 = msgpack.read(raw, tList(TString));
// Or, Deserialze to Value then convert type.
Value dynamic = msgpack.read(raw);
List<String> dst2 = new Converter(dynamic).read(tList(TString));
} catch (Exception ex) {
logger.error("MessagePack Serialization And Deserialization error", ex);
}
}
}
```