普通视图

发现新文章,点击刷新页面。
昨天以前TCPGNL

IntelliJ Platform Plugin Template 中文版

作者 TCPGNL
2021年10月17日 09:21

IntelliJ Platform Plugin Template

太长不看版本: 点击 Use this template 按钮并在 intellij IDEA 中克隆仓库

IntelliJ Platform Plugin Template 是一个提供了让创建插件项目更简单的一个纯净的模版( 点击 从模版中创建仓库 文章)的仓库 .

这个模版的主要目标是通过预先配置项目脚手架和 CI,链接到适当的文档页面,并保持组织的一切,进而帮助新人和有经验的开发者加速准备阶段。

If you’re still not quite sure what this is all about, read our introduction: What is the IntelliJ Platform?

如果你仍然不确定这是关于什么的,可以阅读我们的介绍:什么是 IntelliJ 平台?

TIP : 点击 watch 按钮上面通知发布包含新功能和修复。

目录

在这个 README 中,我们将重点介绍以下模板项目创建的元素:

Getting started

我们深入了解插件开发之前以及和与它有关的一切, 提及使用 Github 模版的好处是值得的。
通过当下的模版创建一个新的项目,你可以使用没有关于这个项目的任何历史和引用开始你的项目。
This allows you to create a new repository easily without copying and pasting previous content, clone repositories, or clearing the history manually.

这允许你无需复制粘贴之前的内容,克隆仓库以及手动清除历史即可创建非常轻松地创建一个全新的仓库

All you have to do is click the Use this template button (you must be logged in with your GitHub account).

你仅仅需要做的就是点击 Use this template 按钮(你必须登陆 Github)

image.png

After using the template to create your blank project, the Template Cleanup workflow will be triggered to override or remove any template-specific configurations, such as the plugin name, current changelog, etc.

当使用创建了你的空白的项目,这个 Template Cleanup 工作流就会被触发覆盖或者移除任何模版特定的配置,比如插件的名字,当前的版本等。
Once this is complete, the project is ready to be cloned to your local environment and opened with IntelliJ IDEA.

一旦这个过程完成,这个项目就可以被克隆到本地的环境进而可以使用 IntelliJ IDEA 打开项目。

For the last step, you have to manually review the configuration variables described in the gradle.properties file and optionally move sources from the com.github.username.repository package to the one that works best for you.
Then you can get to work implementing your ideas.

对于最后一步,你必须手动检查在gradle.properties 中的配置便利那个的信息和可以将配置从 com.github.username.repository 修改为最适合你的那一个。

TIP: To use Java in your plugin, create the /src/main/java directory.

提示:如果在你的插件中使用 Java, 创建 /src/main/java 目录。

Gradle configuration

The recommended method for plugin development involves using the Gradle setup with the gradle-intellij-plugin installed.
The gradle-intellij-plugin makes it possible to run the IDE with your plugin and publish your plugin to JetBrains Marketplace Repository.

推荐的插件开发的方法是使用 gradle-intellij-plugin 和使用 Gradle 进行配置

NOTE: Make sure to always upgrade to the latest version of gradle-intellij-plugin.

注意:确定总是升级最新的 gradle-intellij-plugin 的版本。

A project built using the IntelliJ Platform Plugin Template includes a Gradle configuration already set up.

项目使用 IntelliJ 平台构建插件模板包括一个 Gradle 配置已经建立。
Feel free to read through the Using Gradle articles to understand your build better and learn how to customize it.

随时阅读 Using Gradle 文章更好地理解您的构建和学习如何定制它。

The most significant parts of the current configuration are:

当前配置的最重要的部分是:

更多细节关于 Kotlin 集成,请参阅 IntelliJ 平台插件 SDK 文档中的 Kotlin for Plugin Developers 章节。

Gradle properties

The project-specific configuration file gradle.properties contains:

Property name Description
pluginGroup Package name – afterusingthe template, this will be set to com.github.username.repo.
pluginName Plugin name displayed in the JetBrains Marketplace and the Plugins Repository.
pluginVersion The current version of the plugin.
pluginSinceBuild The since-build attribute of the tag.
pluginUntilBuild The until-build attribute of the tag.
pluginVerifierIdeVersions Versions of the IDEs that will be used with Plugin Verifier.
platformType The type of IDE distribution.
platformVersion The version of the IntelliJ Platform IDE will be used to build the plugin.
platformDownloadSources IDE sources downloaded while initializing the Gradle build.
platformPlugins Comma-separated list of dependencies to the bundled IDE plugins and plugins from the Plugin Repositories.
javaVersion Java language level used to compile sources and generate the files for – Java 11 is required since 2020.3.
gradleVersion Version of Gradle used for plugin development.

具体项目的配置文件 gradle.properties 包含:

属性名称 描述
pluginGroup 包名称——使用模板后,这将被设置为 com.github.username.repo.
pluginName 插件名称显示在 JetBrains 市场和插件仓库。
pluginVersion 当前版本的插件。
pluginSinceBuild since-build 属性标签。
pluginUntilBuild until-build 属性标签。
pluginVerifierIdeVersions 此处填写的 IDEs 版本将用于插件的插件
platformType IDE 的类型分布
platformVersion IntelliJ 平台的版本的 IDE 将用于构建插件
platformDownloadSources 初始化 Gradle 构建的时候 IDE 资源下载
platformPlugins 以逗号分隔的依赖性的 IDE 插件和插件捆绑插件存储库。
javaVersion Java 语言水平用于编译和生成文件来源—— 2020.3 以来的 Java 11 是必需的。
gradleVersion Gradle 用于插件开发的版本。

Environment variables

Some values used for the Gradle configuration shouldn’t be stored in files to avoid publishing them to the Version Control System.

一些用于 Gradle 配置的值不应存储在文件中,以避免将它们发布到版本控制系统。

来避免这种情况,介绍了环境变量,它可以提供在运行/调试配置在 IDE 中,或在 CI – 比如在 GitHub 中: ⚙️ Settings > Secrets.

Environment variables used by the current project are related to the plugin signing and publishing.

当前项目所使用的环境变量有关 plugin signing and publishing.。

Environment variable name Description
PRIVATE_KEY 证书的私钥,应该包含:-----BEGIN ENCRYPTED PRIVATE KEY-----...-----END ENCRYPTED PRIVATE KEY-----
PRIVATE_KEY_PASSWORD 密码用于加密证书文件。
CERTIFICATE_CHAIN 证书链,应该包含:-----BEGIN CERTIFICATE-----...-----END CERTIFICATE----
PUBLISH_TOKEN 发布令牌生成在 JetBrains 市场概要仪表板。

更多细节如何生成适当的值,检查上面提到的相关部分。

配置 GitHub 环境变量 ,去 ⚙️ Settings > Secrets 部分项目的存储库:

Settings > Secrets” /></a></p>
<h2>插件模版结构</h2>
<p>A generated IntelliJ Platform Plugin Template repository contains the following content structure:</p>
<p>生成的 IntelliJ 平台插件模板库结构包含以下内容:</p>
<pre><code class=. ├── .github/ GitHub Actions workflows and Dependabot configuration files ├── .run/ Predefined Run/Debug Configurations ├── gradle │ └── wrapper/ Gradle Wrapper ├── build/ Output build directory ├── src Plugin sources │ └── main │ ├── kotlin/ Kotlin source files │ └── resources/ Resources - plugin.xml, icons, messages │ └── test │ ├── kotlin/ Kotlin test files │ └── testData/ Test data used by tests ├── .gitignore Git ignoring rules ├── build.gradle.kts Gradle configuration ├── CHANGELOG.md Full change history ├── gradle.properties Gradle configuration properties ├── gradlew *nix Gradle Wrapper binary ├── gradlew.bat Windows Gradle Wrapper binary ├── LICENSE License, MIT by default ├── qodana.yml Qodana configuration file ├── README.md README └── settings.gradle.kts Gradle project settings

In addition to the configuration files, the most crucial part is the src directory, which contains our implementation and the manifest for our plugin – plugin.xml.

TIP: To use Java in your plugin, create the /src/main/java directory.

插件模版结构

A generated IntelliJ Platform Plugin Template repository contains the following content structure:

生成的 IntelliJ 平台插件模板库结构包含以下内容:

.
├── .github/                GitHub Actions 工作流和 Dependabot 配置文件
├── .run/                   预定义的运行/调试配置
├── gradle
│   └── wrapper/            Gradle wrapper
├── build/                  输出构建目录
├── src                     插件的来源
│   └── main
│       ├── kotlin/         Kotlin 源文件
│       └── resources/      资源 - plugin.xml, icons, messages
│   └── test
│       ├── kotlin/         Kotlin 测试文件
│       └── testData/       测试所使用的测试数据
├── .gitignore              Git ignore 规则
├── build.gradle.kts        Gradle配置
├── CHANGELOG.md            完整的修改历史
├── gradle.properties       Gradle配置属性
├── gradlew                 *nix Gradle Wrapper 文件
├── gradlew.bat             Windows Gradle Wrapper 文件
├── LICENSE                 许可证书, 默认为MIT授权
├── qodana.yml              Qodana 配置文件
├── README.md               README
└── settings.gradle.kts     Gradle 项目设置

In addition to the configuration files, the most crucial part is the src directory, which contains our implementation and the manifest for our plugin – plugin.xml.

除了配置文件,最重要的部分是 src 目录,其中包含我们的实现,我们的插件的清单

TIP: To use Java in your plugin, create the /src/main/java directory.

提示 在你的插件,使用 Java 创建 Java /src/main/java 的目录

插件配置文件

这个插件的配置文件是 plugin.xml 文件位于 src/main/resources/META-INF 目录。

它提供一般信息插件,其依赖关系,扩展,和监听器。


  org.jetbrains.plugins.template
  Template
  JetBrains
  com.intellij.modules.platform

  
    
    
  

  
    
  

你可以在我们的文档 Plugin Configuration File 章节阅读更多的信息。

示例代码

The prepared template provides as little code as possible because it is impossible for a general scaffold to fulfill all the specific requirements for all types of plugins (language support, build tools, VCS related tools).

预处理模版提供了尽可能少的代码因为它不可能为一个通用的脚手架提供所有类型的插件所有特定的依赖(语言支持,编译工具,版本控制相关的工具)
Therefore, the template contains only the following files:

然而,模版仅仅包含下列的文件

.
├── MyBundle.kt                         包类提供的资源信息
├── listeners
│   └── MyProjectManagerListener.kt     项目经理监听器,处理项目生命周期
└── services
    ├── MyApplicationService.kt         对于所有的应用设置的应用级别服务
    └── MyProjectService.kt             项目级别的服务

这些文件位于 src/main/kotlin.
这个位置显示所使用的语言。
所以如果你决定使用 Java (或者除了 Kotlin 语言), 这些文件应该位于 src/main/java 目录。

开始时的实际实现, 你或许应该检索我们的 IntelliJ Platform SDK DevGuide, 它包含介绍插件的基本领域一起开发专门的教程。

对于那些, 那些做的最好的示例文件, 在 IntelliJ SDK Code SamplesIntelliJ Platform Explorer – 搜索工具浏览扩展点在现有的开源实现 IntelliJ 平台插件可以查询到.

测试

Testing plugins 是一个重要的组成部分,IntelliJ-based IDE 的插件开发,以确保一切工作如预期之间的 IDE 插件版本和重构。
IntelliJ 平台插件模板项目提供集成的两种测试方法——功能和用户界面测试。

功能测试

大部分的 IntelliJ 平台代码测试模型级,在无头环境中运行使用一个实际的 IDE 实例。

测试通常测试功能作为一个整体而不是单个函数组成它的实现(就像单元测试)

src/test/kotlin, 你会发现一个 MyPluginTest 测试它利用 BasePlatformTestCase 运行检查的 XML 文件来显示一个示例操作创建动态文件或阅读他们从 src/test/resources/rename 测试文件.

TIP: Run your tests using predefined Run Tests configuration or by invoking the ./gradlew test Gradle task.

提示:使用预定义的运行你的测试运行测试配置或者调用 ./gradlew test Gradle 任务。

UI 测试

如果你的插件提供了复杂的用户界面,你应该考虑在上面覆盖了测试和他们使用的功能。

IntelliJ UI Test Robot 允许您编写和执行 UI 测试在 IntelliJ IDE 运行实例。
你可以使用 XPath query language 发现在当前可用的 IDE 视图组件。
一旦带有 robot-server IDE 开始, 你可以打开 http://localhost:8082 页面,它在 HTML 中展示了现在的 IDEA UI 组件的层次结构格式和使用一个简单的 XPath 生成器, 他可以帮助你测试用户界面.

TIP: Run IDE for UI tests using predefined Run IDE for UI Tests and then Run Tests configurations or by invoking the ./gradlew runIdeForUiTests and ./gradlew tests Gradle tasks.

提示:使用预定义的 IDE UI 测试运行

检查项目可以使用 UI 测试例子作为参考你的插件设置 UI 测试: intellij-ui-test-robot/ui-test-example.

class MyUITest {

  @Test
  fun openAboutFromWelcomeScreen() {
    val robot = RemoteRobot("http://127.0.0.1:8082")
    robot.find(byXpath("//div[@myactionlink = 'gearHover.svg']")).click()
    // ...
  }
}

UI Testing

一个专门的 Run UI Tests 工作流 is available for manual triggering to run UI tests against three different operating systems: macOS, Windows, and Linux.
Due to its optional nature, this workflow isn’t set as an automatic one, but this can be easily achieved by changing the on trigger event, like in the Build workflow file.

Qodana integration

To increase the project value, the IntelliJ Platform Plugin Template got integrated with Qodana, a code quality monitoring platform that allows you to check the condition of your implementation and find any possible problems that may require enhancing.

为了增加项目的价值,IntelliJ 平台插件模版可以和 Qodana 进行集成,一个代码质量监测平台,允许您检查您的实现的条件和找到任何可能出现的需要提高问题,

Qodana brings into your CI/CD pipelines all the smart features you love in the JetBrains IDEs and generates an HTML report with the actual inspection status.

Qodana 带给你你的 CI\/ CD 管道所有你喜爱的 JetBrains IDEs 的智能特性并生成一个 HTML 报告与实际检验状态。

Qodana inspections are accessible within the project on two levels:

Qodana 检查可在项目中在两个层面:

Qodana inspection is configured with the qodana { ... } section in the Gradle build file, and qodana.yml YAML configuration file.

Qodana 检查配置了 qodana { ... } 部分 Gradle 构建文件,qodana.yml YAML 配置文件。

NOTE: Qodana requires Docker to be installed and available in your environment.

*注意:* Qodana 需要安装和码头工人可以在您的环境中。

运行检查,您可以使用一个预定义的运行 Qodana 配置,这将提供一个完整的报告 http://localhost:8080, 或直接与调用它的任务 ./gradlew runInspections 命令行.

最终的报告在 ./build/reports/inspections/ 目录.

Qodana

预定义的运行/调试配置

在默认的项目结构, 有 .run 目录提供包含预定义的运行/调试配置,使相应 Gradle 任务:

Run/Debug configurations

Configuration name Description
Run Plugin 运行:runIdeGradle IntelliJ 插件的任务. 使用 theDebug 按钮进行.
Run Verifications 运行:runPluginVerifierGradle IntelliJ 插件任务来检查插件对于特定的 IntelliJ IDEs 检查插件的实用性。
Run Qodana 运行:runInspectionsGradle Qodana 插件任务. 在 Docker 容器中开始 Qodana 检查并在 localhost:8080 生成报告。
Run Tests 运行:testGradle 任务.
Run IDE for UI Tests 运行:runIdeForUiTestsGradle IntelliJ 插件任务来运行在 IntelliJ IDE 运行 UI 测试

TIP: You can find the logs from the running task in the idea.log tab.

提示:你可以找到从正在运行的任务的日志 idea.log 选项卡。

Run/Debug configuration logs

持续集成

持续集成依赖于 GitHub Actions, 一组工作流程,使其可能的自动化测试和发布过程。
由于这样的自动化,可以委托测试和验证阶段持续集成 (CI),而是专注于开发(和)编写更多的测试。

.github/workflows 目录, 你可以找到以下 GitHub 操作工作流的定义:

  • Build
    • pushpull_request 事件中触发.
    • 运行 Gradle Wrapper Validation Action 来验证 wrapper’s 校验和.
    • 运行 verifyPlugintest Gradle 任务.
    • 使用 buildPlugin 编译插件,Gradle 任务并在工作流中为下一个任务提供一个新的制品。
    • 使用 *IntelliJ Plugin 验证工作验证工作.
    • 准备发布的草稿 GitHub 手动验证版本页面.
  • Release
    • 通过 released 事件触发.
    • 提供发行日志中的内容更新 CHANGELOG.md 文件.
    • 在发布之前使用提供的证书进行签名
    • 将插件 JetBrains 发布市场使用提供的 PUBLISH_TOKEN.
    • 设置发布渠道根据插件版本, i.e. 1.0.0-beta -> beta 频道
    • 补丁的更新日志和提交。
  • Run UI Tests
    • 手动触发。
    • 在 macOS、Windows 和 Linux 运行。
    • 运行 runIdeForUiTests and test Gradle tasks.
  • Template Cleanup
    • 当创建了一个新的基于模板库采用 push 事件触发 。
    • 覆盖文件从脚手架 .github/template-cleanup 目录.
    • 覆盖 JetBrains-specific 句子或包名称的特定目标库中。
    • 删除冗余文件。

所有工作流文件有精确的文档, 因此查看相关的资源是一个好的方法。

依赖关系管理

这个模板项目取决于 Gradle 插件和外部库,在开发,您将添加更多的人。

保持良好的项目和所有依赖项更新需要时间和努力,但是可以使用 Dependabot 自动化这个过程。

Dependabot GitHub 检查所提供的是一个机器人构建配置文件和审查任何过时的或不安全的依赖你的——如果任何更新可用,它创建一个新的请求提供 the proper change.

笔记:Dependabot 不支持检测 Gradle Wrapper。
检查 Gradle Releases 页面来升级 gradle.properties 文件

更新日志的维护

当发布一个更新,必须让用户知道新版本提供。
这样做的最好办法是提供发行说明。

更新日志是一个策划列表包含任何新特性信息,修复和用法。

当他们提供,这些列表可以在几个不同的地方:

There are many methods for handling the project’s changelog.

有很多的方法来处理项目的变更日志
The one used in the current template project is the Keep a Changelog approach.

其中一个是在当前的项目模版中的 Keep a Changelog 方法

The Gradle Changelog Plugin takes care of propagating information provided within the CHANGELOG.md to the Gradle IntelliJ Plugin.

Gradle Changelog Plugin 负责 在 CHANGELOG.mdGradle IntelliJ Plugin 提供的信息进行信息传播
You only have to take care of writing down the actual changes in proper sections of the [Unreleased] section.

你仅仅需要关心的是在 [Unreleased] 章节的合适的模块写下真实的变更信息。

你从一个几乎空的更新日志:

# YourPlugin Changelog

## [Unreleased]
### Added
- Initial scaffold created from [IntelliJ Platform Plugin Template](https://github.com/JetBrains/intellij-platform-plugin-template)

Now proceed with providing more entries to the Added group, or any other one that suits your change the most (see How do I make a good changelog? for more details).

现在处理更多的信息添加到 Added 组中,或者任何其他的合适的变化(观看 How do I make a good changelog? 查询更多的信息).

When releasing a plugin update, you don’t have to care about bumping the [Unreleased] header to the upcoming version – it will be handled automatically on the Continuous Integration (CI) after you publish your plugin.

当发布一个插件更新,你不需要关心修改 [Unreleased] 请求头到新的版本 – 它将在你发布你的插件后被自动在持续集成环境中处理。
GitHub Actions will swap it and provide you an empty section for the next release so that you can proceed with your development:

GitHub Actions 会互换它,为下一个版本提供你一个空的部分,这样您就可以开始你的开发:

# YourPlugin Changelog

## [Unreleased]

## [0.0.1]
### Added
- An awesome feature
- Initial scaffold created from [IntelliJ Platform Plugin Template](https://github.com/JetBrains/intellij-platform-plugin-template)

### Fixed
- One annoying bug

To configure how the Changelog plugin behaves, i.e., to create headers with the release date, see Gradle Changelog Plugin README file.

Release flow

The release process depends on the workflows already described above.

发布过程取决于上述已经被描绘的工作流。
When your main branch receives a new pull request or a direct push, the Build workflow runs multiple tests on your plugin and prepares a draft release.

当你的主要分支收到一个新的拉请求或直接推送,Build 工作流运行你的插件的多个测试,并准备一份发布草稿。

Release draft

The draft release is a working copy of a release, which you can review before publishing.

草稿发布是一个发布的工作副本,你可以回顾之前出版。

It includes a predefined title and git tag, the current plugin version, for example, v0.0.1.

它包括一个预定义的标题和 git 标签,当前插件版本,例如,v0.0.1.

使用 gradle-changelog-plugin 自动提供更新日志

在插件的附件中就几十年后附属一个编译后的文件

每一个新的构建覆盖之前的草稿来保持版本页面干净。

When you edit the draft and use the Publish release button, GitHub will tag your repository with the given version and add a new entry to the Releases tab.
Next, it will notify users who are watching the repository, triggering the final Release workflow.

当你编辑草稿并使用发布版本按钮,GitHub 将标签与给定的存储库版本并将一个新条目添加到版本标签。

接下来,它将通知关注存储库发行新版本的用户。

插件签名

Plugin Signing is a mechanism introduced in the 2021.2 release cycle to increase security in JetBrains Marketplace and all of our IntelliJ-based IDEs.

插件签名是一种在 2021.2 的发布周期增加的安全机制中用来增加 JetBrains Marketplace 的安全和我们所有的 IntelliJ-based IDEs 的安全。

JetBrains Marketplace signing is designed to ensure that plugins are not modified over the course of the publishing and delivery pipeline.

JetBrains 市场签名旨在确保插件不修改的出版和输送管道。

The current project provides a predefined plugin signing configuration that lets you sign and publish your plugin from the Continuous Integration (CI) and local environments.

当前项目提供了一个预定义的插件配置让你可以在持续集成和发布你的插件(CI)和本地环境签名。

To find out how to generate signing certificates, check the Plugin Signing section in the IntelliJ Platform Plugin SDK documentation.

为了找出如何生成签名证书, 检查在 IntelliJ Platform Plugin SDK 文档的 Plugin Signing 章节。

发布插件

Releasing a plugin to JetBrains Marketplace is a straightforward operation that uses the publishPlugin Gradle task provided by the gradle-intellij-plugin.

JetBrains 市场发行一个插件是一个简单的操作,使用在 gradle-intellij-plugin 中提供的 publishPlugin Gradle 任务。
In addition, the Release workflow automates this process by running the task when a new release appears in the GitHub Releases section.

另外,当一个新的 release 出现在 Github 发行章节时,Release 工作流自动地处理这个发布插件的工作。

TIP : Set a suffix to the plugin version to publish it in the custom repository channel, i.e. v1.0.0-beta will push your plugin to the beta release channel.

提示:设置一个后缀的插件版本发布它在自定义库通道,比如 v1.0.0-beta 将会将插件推送到 beta release channel.

The authorization process relies on the PUBLISH_TOKEN secret environment variable, specified in the Secrets section of the repository Settings .

这个认证过程依赖于在环境变量中的 PUBLISH_TOKEN 信息,在 Secrets section of the repository 设置中配置

You can get that token in your JetBrains Marketplace profile dashboard in theMy Tokens tab.

你可以在你 JetBrains 市场内容仪表板在 My Tokens 选项卡中得到你的令牌。

重要:

在使用自动化部署过程之前,需要手动创建一个新的插件在 JetBrains 市场像许可证指定选项,存储库 URL 等等。

请按 Publishing a Plugin 说明进行操作。

FAQ

如何使用 Java 在我的项目吗?

Java language is supported by default along with Kotlin.

Java 语言和 Kotlin 语言是默认支持的
最初, 这个 /src/main/kotlin 目录在自己的示例项目是默认存在的.
你仍然可以取代它或者添加 /src/main/java 目录开始使用 Java 语言。

如何使用 [skip ci] 提交信息来测试构建工作?

2021 年 2 月以来,GitHub Actionssupport the skip CI feature

如果信息中包含 [skip ci], [ci skip], [no ci], [skip actions], or [actions skip] 中的一个,工作流将不会被触发。

用户链接

IntelliJ Platform Plugin Template 中文版最先出现在TCPGNL

SDKMAN 使用教程

作者 TCPGNL
2021年10月10日 19:38

SDKMAN 是一个 SDK 的管理工具,SDKMAN 对于 SDK 相当于 homebrew 对于 mac 上面的软件,可以将其称 sdk 的管理工具,我使用 SDKMAN 的主要的目的是管理 JAVA 的版本,本文的主要的目的也是管理 Java 版本的工具。

本文仅适用于 MacOS (类 Unix 系统) 的 操作系统

SDKMAN 的使用教程主要分为安装和使用这两个步骤,或者还有第三个步骤是删除

SDKMAN 参考链接 sdkman

1. 安装 SDKMAN

curl -s "https://get.sdkman.io" | bash # 下载并执行
source "$HOME/.sdkman/bin/sdkman-init.sh" # 更新环境变量
sdk version # 查看SDK 版本

显示效果如下

SDKMAN 5.xx.x

显示上述的内容则证明安装成功

2. 安装 JDK

2.1 列出当下版本的 jdk

首先查看现在所有的 JDK 版本

sdk list java

显示效果如下:

================================================================================
Available Java Versions
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 AdoptOpenJDK  |     | 16.0.1.j9    | adpt    |            | 16.0.1.j9-adpt
               |     | 16.0.1.hs    | adpt    |            | 16.0.1.hs-adpt
               |     | 11.0.11.j9   | adpt    |            | 11.0.11.j9-adpt
               | >>> | 11.0.11.hs   | adpt    | installed  | 11.0.11.hs-adpt
               |     | 8.0.292.j9   | adpt    |            | 8.0.292.j9-adpt
               |     | 8.0.292.hs   | adpt    | installed  | 8.0.292.hs-adpt
 Corretto      |     | 17.0.0.35.2  | amzn    |            | 17.0.0.35.2-amzn
               |     | 16.0.2.7.1   | amzn    |            | 16.0.2.7.1-amzn
               |     | 11.0.12.7.2  | amzn    |            | 11.0.12.7.2-amzn
               |     | 8.302.08.1   | amzn    |            | 8.302.08.1-amzn
 GraalVM       |     | 21.2.0.r16   | grl     |            | 21.2.0.r16-grl
               |     | 21.2.0.r11   | grl     |            | 21.2.0.r11-grl
               |     | 20.3.3.r11   | grl     |            | 20.3.3.r11-grl
               |     | 19.3.6.r11   | grl     |            | 19.3.6.r11-grl
 Java.net      |     | 18.ea.18     | open    |            | 18.ea.18-open
               |     | 18.ea.17     | open    |            | 18.ea.17-open
               |     | 18.ea.2.lm   | open    |            | 18.ea.2.lm-open
               |     | 17           | open    |            | 17-open
               |     | 17.ea.3.pma  | open    |            | 17.ea.3.pma-open
               |     | 16.0.2       | open    |            | 16.0.2-open
               |     | 11.0.2       | open    |            | 11.0.2-open
 Liberica      |     | 17.0.0.fx    | librca  |            | 17.0.0.fx-librca
               |     | 17.0.0       | librca  |            | 17.0.0-librca
               |     | 16.0.2.fx    | librca  |            | 16.0.2.fx-librca
               |     | 16.0.2       | librca  |            | 16.0.2-librca
               |     | 11.0.12.fx   | librca  |            | 11.0.12.fx-librca
               |     | 11.0.12      | librca  |            | 11.0.12-librca
               |     | 8.0.302.fx   | librca  |            | 8.0.302.fx-librca
               |     | 8.0.302      | librca  |            | 8.0.302-librca
 Liberica NIK  |     | 21.2         | nik     |            | 21.2-nik
 Microsoft     |     | 17.0.0       | ms      |            | 17.0.0-ms
               |     | 16.0.2.7.1   | ms      |            | 16.0.2.7.1-ms
               |     | 11.0.12.7.1  | ms      |            | 11.0.12.7.1-ms
 Oracle        |     | 17.0.0       | oracle  | installed  | 17.0.0-oracle
 SapMachine    |     | 17           | sapmchn |            | 17-sapmchn
               |     | 16.0.2       | sapmchn |            | 16.0.2-sapmchn
               |     | 11.0.12      | sapmchn |            | 11.0.12-sapmchn
 Semeru        |     | 16.0.2       | sem     |            | 16.0.2-sem
               |     | 11.0.12      | sem     |            | 11.0.12-sem
               |     | 8.0.302      | sem     |            | 8.0.302-sem
 Temurin       |     | 17.0.0       | tem     |            | 17.0.0-tem
               |     | 16.0.2       | tem     |            | 16.0.2-tem
               |     | 11.0.12      | tem     |            | 11.0.12-tem
               |     | 8.0.302      | tem     |            | 8.0.302-tem
 Trava         |     | 11.0.9       | trava   |            | 11.0.9-trava
               |     | 8.0.232      | trava   |            | 8.0.232-trava
 Zulu          |     | 17.0.0       | zulu    |            | 17.0.0-zulu
               |     | 17.0.0.fx    | zulu    |            | 17.0.0.fx-zulu
               |     | 16.0.2       | zulu    |            | 16.0.2-zulu
               |     | 16.0.2.fx    | zulu    |            | 16.0.2.fx-zulu
               |     | 11.0.12      | zulu    |            | 11.0.12-zulu
               |     | 11.0.12.fx   | zulu    |            | 11.0.12.fx-zulu
               |     | 8.0.302      | zulu    |            | 8.0.302-zulu
               |     | 8.0.302.fx   | zulu    |            | 8.0.302.fx-zulu
               |     | 7.0.312      | zulu    |            | 7.0.312-zulu
================================================================================
Omit Identifier to install default version 17.0.0-tem:
    sdk install java
Use TAB completion to discover available versions sdk install java [TAB]
Or install a specific version by Identifier:
    $ sdk install java 17.0.0-tem
Hit Q to exit this list view
================================================================================

use >>> 指的是现在环境变量中使用的版本

Status installed 指的是现在已经安装的软件

安装特定版本的 jdk

主要的内容还是上述的 list 的最后一列为指定的版本号

安装命令

sdk install java 11.0.11.hs-adpt # 安装adpt 的 Java11 版本

我安装的时候 oracle 家的只有 17 版本 安装命令如下

sdk install java 17.0.0-oracle

3. 切换版本

 sdk use java 17.0.0-oracle

显示返回值如下:

Using java version 17.0.0-oracle in this shell.

使用 java -version 查看 Java 版本

java version "17" 2021-09-14 LTS
Java(TM) SE Runtime Environment (build 17+35-LTS-2724)
Java HotSpot(TM) 64-Bit Server VM (build 17+35-LTS-2724, mixed mode, sharing)

主要参考 SDKMAN 官网

SDKMAN 使用教程最先出现在TCPGNL

也谈写作软件选择

作者 TCPGNL
2021年7月27日 22:45

我挑选写作软件也挑选了不少, 从txt 文档到各种编辑器 比如 typora Evernote 印象笔记, mweb, notion, ulysses, drafts, 熊掌记等等软件, 也废了不少心去做软件的选择, 自己的笔记也散落在各个地方, 现在留存的也很少, 因此也就出现了这篇文章

还记得我曾经写的一篇文章, 当然还没有发表(因为还没有完成), 叫做无压力写作, 我刚才看了一下, 就写了一行无压力写作这个是最近比较火的ClubHouse的无压力社交的源头而产生的。无压力写作和无压力社交的相似点有很多。

写文章的时候不能将自己放在条条框框中, 要没有任何压力进行写作, 这才能充分地将自己的思路进行拓展, 毫无拘束地创作, 这对于所有的创作都是很重要的, 因此写作软件第一个版本应该在一个好的平台中进行, 比如我最近使用 drafts 进行写作, 可以减轻写作的分类的压力, 写作的时候不用先去相当,诶 这篇文章属于哪个分类啊, 这些圈定文章的分类方向的问题. make wirite just write.
上述是写作的问题, 写作完成后, 就要进行文章的规整, 毕竟就像整理物品一样, 将物品整理好了之后想找的时候就很容易找到, 这是很重要的问题, 分类的软件我选择哪个呢, 我比较推荐的是MWeb 支持 Markdown 当然支持的还不是 很好, 图片很难显示, 还有很多缺点, Markdown 显示最好的编辑软件, typora 的不能自动规整笔记项目, 否则, typora 将是一个无可替代的选择, 与此同时, mweb 支持文章发布到不同的平台 还是比较推荐的.

更新时间: 2021-07-27

也谈写作软件选择最先出现在TCPGNL

如何从 0 到 1 搭建博客(VPS)

作者 TCPGNL
2021年7月27日 00:54

如何从 0 到 1 搭建博客(VPS)

拥有一个数据自己的博客是一个很棒的事情, 无需其他人的各种的评级, 无需为了流量追逐热点, 专心写下文字(折腾), 也是一键很有趣的事情, 本篇文章主要的内容就是, 如何从 0 到 1 使用 VPS 搭建博客.

我的历程: 免费域名 + 免费空间, 独立域名 + 收费VPS, 独立域名 + Gihub Page, 独立域名 + 收费 VPS. 本文章主要书写的是 如何使用独立域名+VPS来实现一个博客系统.

回想我的那些年, 往事似乎历历在目,
曾经用似乎叫免费部落的网站(现在网站已经无法寻找到)去寻找虚拟主机 和freenom免费域名 去搭建网站,
后来有了自己的独立的域名, 在hostinger家的免费空间 搭建 WordPress 主题,
后来有又到了 使用 GitHub page 和自己的域名搭建网站, 使用 hexo,jekyll 等软件生成静态网站,
再后来, 就到了使用独立域名和自己的 VPS 来搭建的 VPS 博客, 一路走来, 充满了折腾, 也似乎充满了乐趣, 毕竟也是这些填充了我的大学中的很多时光, 这一路走来, 需要感谢的前辈有很多, 那些前辈们一篇篇指导我实践的博客, 带领我走向现在的发展, 而我的这篇文章, 也算是对前辈们的回馈吧.

主要的步骤如下, 购买域名和 VPS, 配置 VPS, 搭建博客程序, 完成搭建.

前置准备 购买域名和 VPS

购买域名或者申请免费域名

购买域名
国内购买可以从 阿里云 腾讯云 购买 最好通过代理商注册 买服务器的话价格相对来说便宜一点, 当然域名一般是不打折的.
国外购买 可以从 Google domain 或者Gandi 购买 Google domain 全 Gandi 价格相对来说优惠 都带邮箱转发, 可以实现网站邮箱的功能.

此步骤很简单 添加购物车-> 按照提示填写信息(个人信息)-> 付钱 -> 等待即可

购买 VPS

本文推荐使用腾讯云的香港轻量云主机 进行搭建, 有以下的优点1. 价格便宜 2. 不需要外币银行卡 3.不需要备案(刚开始搭建博客,要把热情用在折腾上)
购买地址: https://cloud.tencent.com/product/lighthouse
点击立即选购后 进入选购页面
地域选择 中国香港 镜像选择系统镜像 系统选择 CentOS 7.6 套餐选择价格最低的即可, 以后不够用可以加钱升级🐶, 选择一个月 付款即可.

注: 此处没有直接选择宝塔面板是因为想将宝塔安装过程步骤化展现, 宝塔面板将在后续的配置 VPS中说明.

验证购买成功

进入https://console.cloud.tencent.com/lighthouse/instance/index 网页显示有中国香港区域的机器 即代表消费成功.

中间准备 配置 VPS

此步骤都以腾讯云轻量主机为参照
这个步骤主要是 打开服务器的安全端口, ssh 远程连接服务器, 安装宝塔面板, 安装 lnmp服务.

打开服务器安全端口

打开轻量云管理页面https://console.cloud.tencent.com/lighthouse/instance/index
点击进入服务器的管理页面, 选择防火墙, 放行以下端口. 网络访问(80 443) SSH 连接端口(22) 宝塔管理端口(8888)
打开服务器安全端口

ssh 远程连接服务器

因为腾讯云轻量服务器在购买的时候并没有数据密码的地方, 如果我们采用远程 ssh 进行连接的时候需要输入密码 才能进行连接,因此我们需要在腾讯云管理页面重置密码 充值密码页面如下:
重置密码
使用 macOS 终端连接 ,命令如下:

ssh root@{remote-ip}

ssh-connect-remote

安装宝塔面板

宝塔官网: https://www.bt.cn/
安装地址: https://www.bt.cn/bbs/thread-19376-1-1.html

复制 CentOS 的宝塔安装命令 比如我安装时(2021-07-26)的安装命令如下:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

按照指示输入 y 即可安装完成
最后输出如下日志即代表服务器可视化面板安装成功:

宝塔输出信息

安装 LNMP 服务

从上面的输出的日志进入网页, 输出上面的用户名密码, 登录宝塔页面(如果出现, 相应时间过长, 很有可能是有端口没有打开, 需要在服务商(此处为腾讯云)的防火墙那里打开相应的端口)
同意宝塔协议
宝塔安装 LNMP
诶 你会发现有讨厌的宝塔的登录弹窗, 我们得去掉它 QAQ
宝塔弹窗

rm /www/server/panel/data/bind.pl

如果出现了询问是否删除的提示
输入 y 即可
我们再继续回到安装 LNMP的进程中
宝塔 LNMP 进程中
当安装程序执行完毕后 我们的 VPS 配置就已经完成了.

搭建博客程序

VPS 配置完成后, 其中的 LNMP的安装也随之完成, 下面我们开始正式的进入博客的搭建程序中.
此步骤涵盖的子步骤是 1. 安装搭建博客程序的前期软件准备 2. 域名解析商解析域名 3. 安装配置 WordPress

1. 安装搭建博客程序的前期软件准备

此步骤主要安装的是: 宝塔的宝塔一键部署源码 以供 第三步安装 WordPress 软件
途径如下: 打开主页 -> 选择左侧 软件商店 Tab页面 -> 在 Tab 页面中搜索 宝塔一键部署源码 在下面的列出的软件进行安装宝塔一键部署源码 如图所示:
安装宝塔一键部署源码

2. 域名解析商解析域名

在域名的解析上中添加域名的解析, 比如本次的域名解析如下 www.demo.fund 下图为腾讯云的 DNS 解析示例图
域名解析图

3. 安装配置 WordPress

再次打开本部分第一步的步骤
途径如下: 打开主页 -> 选择左侧 软件商店 Tab页面 -> 在 Tab 页面中搜索 宝塔一键部署源码 -> 点击宝塔一键部署源码 的设置
在弹出的页面中找到博客的 Tab 页面 -> 在找到 WordPress 的条目 -> 选择其后面的一键部署, 开始进行应用的部署(如果没有合适的 PHP版本号, 则安装对应的 PHP 应用). 示例图如下:

选择安装 WordPress 应用
填写 域名信息 进行域名绑定 示意图如下:
填写域名信息
点击提交即完成配置, 显示如下的成功示意图, 注意此图信息, 一会用到, 最好新开一个网页去做初始网站的配置信息
宝塔安装后的提示信息
我们可以按住 command/ctrl 键 在新的网页中 打开站点网址, 显示结果如下:
Wordpress 初始化
点击现在就开始, 进入数据库的配置 我们将刚才的网页数据库的信息输入, 如果刚才不小心关掉了,
Wordpress 配置数据库信息
完成配置数据库信息进行提交即可,显示成功信息即配置完成 WordPress 数据库, 紧接着创建用户,即进行安装.
WordPress 配置数据库完成提示
填写用户的配置信息即可. 填写完成后点击安装 WordPress 即可
WordPress 站点设置
如果显示下述信息,证明安装过程全部完成.
WordPress 安装成功信息

可以登录博客后台进行书写博客 或者 可以开始欣赏现在的博客的主题.
注:博客的默认管理地址为 绑定域名/wp-admin 用户名 密码用户 是刚才设置的用户名密码.

如何从 0 到 1 搭建博客(VPS)最先出现在TCPGNL

Docker MySQL 数据库配置

作者 TCPGNL
2021年7月21日 12:00

# Docker MySQL 数据库配置

当我们使用 Docker 搭建 MySQL 的时候, 我们可能有很多的想法, 比如, 这个不会和宿主机的环境起冲突, 且搭建起来比较简单, 尤其是对于临时使用的人, Docker 的便利点尤为突出. 本文主要想解决的是两个问题, 一个是数据库字符设置的问题, 一个是脚本导入的问题.

docker 建立本地数据库

docker run -itd --name mysql-test -p 23306:3306 -v {本地绝对路径}:{远程绝对路径}  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.32

数据库字符设置的问题

这个问题主要是因为 Docker 的 MySQL 数据库默认的字符设置的是 瑞典的拉丁文, 并不是 utf-8 因此造成中文显示会无法显示, 这也是其中一个很大的问题.

解决办法

  1. 修改 docker 容器的设置 重启mysql 服务(或者重启 docker 服务亦可以) 修改设置如下:
    在 /etc/mysql/my.cnf 中添加如下的配置信息, 如果存在相应的配置信息,则直接修改即可
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

重启 MySQL 或者重启 docker 容器即可显示中文信息 那如何检测呢?

mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+

显示上述信息即可完成本地中文化的配置
.

第二个挂在本地目录

这个和其他的 docker 配置一样 很简单 只需要在 docker 命令行中添加 -v {本地绝对路径}:{远程绝对路径} 即可

多文件SQL导入

在 bash 中执行如下操作

for SQL in *.sql; do mysql -uroot -p"123456" {databasename} < $SQL ; done -default-character-set = utf8

tips:
查询 数据库中的两个数据表是否有不同数据

SELECT DISTINCT a.id FROM a WHERE a.id NOT in(SELECT id FROM b)

msyql 导入 csv 命令

mysqlimport --ignore-lines=1 --fields-terminated-by=, --verbose --local -u root query ./address.csv

参考文档

  1. https://www.awaimai.com/2382.html
  2. https://blog.csdn.net/weixin_44096448/article/details/102485592
  3. https://www.tutorialspoint.com/How-can-we-import-CSV-files-into-MySQL-tables-by-using-mysqlimport

Docker MySQL 数据库配置最先出现在TCPGNL

使用 screen 在 Linux 后台运行软件

作者 TCPGNL
2021年7月21日 12:00

这个问题会使用很多次, 如果我们通过 SSH 连接远程服务器的时候, 执行相应的命令行, 比如 java -jar(比如我的世界) ***.jar 文件 或者其他的命令比如 hexo hugo 等等, 因此后台执行就迫在眉睫, 本文选择的方法是采用 screen 命令进行实现.

执行步骤

执行步骤由以下组成, 创建新的 screen, 在 screen 中执行命令, 保留原来的 ssh 界面并保持命令行执行

yum install screen # 安装

创建新的 screen

screen -S {screen-name}

在 screen 中执行命令

java -jar mc.jar

暂时断开 (detach)

Ctrl-A Ctrl-D

回到原来的 SSH 界面并保持命令行任务执行

显示当前所有的 screen

screen -ls
screen -r {screen-name || screen-id}

引用:
1. https://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

使用 screen 在 Linux 后台运行软件最先出现在TCPGNL

MacOS 使用网易 MuMu 以及 Charles 进行应用调试

作者 TCPGNL
2021年7月19日 23:28

MacOS 使用网易 MuMu 以及 Charles 进行应用调试

近期在工作中遇到一个移动端应用调试的问题, 再次记录下, 以供后人来参考.
应用应用抓包一直以来都是一个很大的问题, 似乎网络上还没有相应的教程, 当然也有可能是太简单了, 大家都懒得写, 那我就抛个砖, 写下这篇文章, 以供后来人参考.
问题情境还原: 移动端软件有问题, 需要查看移动端的请求的地址, 以便在 kibana 中查询相应的请求 , 进而定位问题.

具体步骤

前提准备 软件的安装

网易 mumu 下载地址: https://mumu.163.com/
Charles 下载地址: https://www.charlesproxy.com/

PC 设置

PC 的设置主要分为两个方面
1. Charles root 证书的安装
2. 监听端口的设置和 SSL 端口的监听 (SSL 端口如果不涉及就无需配置, 但是推荐配置上, 因为 SSL 逐渐成为一种常态)

1. root证书的安装

安装证书的界面如下图所示, 根据提示安装证书即可 我安装的是默认的位置, 因此此处弹出的默认位置即可以使用.
charles-setting-root

2. 监听端口设置及 SSL 端口的监听

监听端口设置 Proxy -> Proxy Setting -> Http Setting -> Port
charles-proxy-setting-port
设置端口
charles-proxy-setting-port-2
完成上述操作后, 并保存后, 即可完成了端口的保存.
设置 SSL 类型的监听 Proxy -> SSL Proxy Seeting -> SSL Proxying -> include 加入 *:*(即放心所有地址的端口) 即可. 图片如下:
charles-ssl-proxying
设置 include
charles-ssl-proxying-1

charles-ssl-proxying-2

此时已经完成了Charles 的设置, 可以开始进行网易 mumu 或者其他终端的设置

网易 mumu 设置

这个设置比较简单, 需要提前获取电脑的内网 ip 地址 ifconfig(mac || Linux) or ipconfig(windows)
打开网易 mumu , 打开虚拟手机设置, 长按内网的 WiFi 网络, 显示出高级设置, 并修改WiFi 的代理设置, 具体界面操作如下图:
mumu-wifi-modify-web
mumu-wifi-modify-web-2
此时需要在浏览器中输入 chls.pro/ssl 以安装手机 ssl 证书, 此步骤需要设置手机安全密码(锁屏密码) 即可进行抓取手机的 https 链接.

通过以上两个设置, 前期设置已经完成, 现在可以开始进行抓取操作

抓取测试

打开两个软件 随便访问一个地址, 电脑端首次连接会弹出下面的界面 点击允许就好.
charles-connection
而后 即可显示抓包的数据请求
mumu-report
便可以从中寻找请求去 kibana 中查询. 点击一个请求, 右边的上面是请求体,下面是result内容.
charles-content
此内容更新完毕.

MacOS 使用网易 MuMu 以及 Charles 进行应用调试最先出现在TCPGNL

如何做到最快最好地交付产品

作者 TCPGNL
2021年7月15日 11:44

人生的价值似乎在于实现与协助实现

keyword: 理解客户需求,内部敢于放权,工具强于记忆,内部核心保证。

前言

参加工作已经快一年了 还记得第一次参加工作的时间是7月20号,马上就一年了,而且今天又快到年中了,时间真的是如流水般,绵长且迅速。

参加工作一年的时间,从原来的项目老大,提倡站会 迭代等一系列关于敏捷的事项,逐渐了解到了敏捷的发展,而后加入了提倡敏捷的公司,正式观摩,学习实践敏捷,有些许思考,在此记录下,可能后期会更改看法。但谁又知道是什么时候呢。不如Just Go, Watch and Study.
我所服务的公司或者说我在做的多数都是ToB的,但我也是很多ToC软件的一个客户,作为一个developer, 我更想从一个开发者的角度来看,如何快速的交付最好的产品,且对用户最负责。
在这中间做一个插曲,我并不认为前端和后端有什么区别,都是开发者啊,能有啥区别,都是实现的方式,都可以为用户实现需求,仅仅是分工不同而已. 当然我认为其他的角色也似乎都是相同的,比如质量保证或者运维的角色都是如此.
有时候也在想人生在世似乎都在围绕着价值在流转(常常体现的方式是:工资), 我们因为在不断地为其他人创造价值和获得自己的价值, 从而获取劳动所得,作为公司的一个职员,我们要站在公司的立场中,为公司创值,有时候做的事自己喜欢或者说是感兴趣的工作, 有时候似乎做的是自己号不感兴趣的工作, 但无论如何都是在创值, 对于用户来讲,亦是如此, 都想为自己的公司也好自身也好都想省出相应的钱, 为公司或自己剩下最多的钱. 这是价值的问题. 当一切的成本的问题确定后,如何做到最快最好地交付产品呢?

理解用户需求

首先是理解客户的需求, 可以采用用户故事也好,采用其他的方式也好,采用敏捷的方式,持续的听取用户的意见和建议, 持续地向用户提供反馈和接受用户的信息.了解客户的目标,为用户提供创值.

内容敢于放权

第二点, 内部敢于放权, 传统的公司或者相关的信息也好,都是采用层层审批,谁审批谁负责的制度保证产品的质量, 但是产品的安全保证我认为并不是限制权限可以解决的, 我诚然承认新手无法保证完全地保证数据的安全, 可能会或者说很有可能会出现问题, 但是我觉得数据的安全性保证要和快速上手达到一个平衡, 接触地越多,自然对于相应的流程越熟悉, 制度是为了限制人, 而不是为了保护人, 而保护人会带来更大的收益, 限制人只会让事情变得复杂, 变得很难难以去进行, 让很多人不高兴, 不开心, 比如软件开发, 为了数据的安全性, 我们很多时候采用的是明确分工, 明确责任人, 比如采用明确的审批制度, 但是保护带来的东西会更多, 不仅仅是效率还有彼此的信任,以及工作的热情, 那如何保护呢? 采用数据多次备份,保证数据的安全性, 数据的安全性保证等等.

工具强于记忆

人的头脑都是被占用的状态, 采用工具来记忆,去推进要比头脑记忆强得多, 比如 GTD 也好,其他的方式也好,都是对于复杂性转移的一个实现, 任务确定时,复杂性不能消失,只能转移. 与其讲复杂度交付给大脑不如讲复杂度交付给工具.

内容核心保证

内容要保证安全,此事项还需要详细分析

成本保证

希望尽全力保证放权或者说信任,其中的一个问题是多备份出现问题后, 成本可能会逐渐增加, chaos monkey 会时不时的出现,如何保证成本最低也是一个很重要的问题, 这也是相对来说比较重要的地方,可以开发时多备份, 定版本后可以减少备份的频次,尽量减少成本, 环境需要快速启动,快速拓展,一键快速创建,正常冗余.

如何做到最快最好地交付产品最先出现在TCPGNL

如何写一篇文章

作者 TCPGNL
2021年5月13日 23:06

近期在看重构和Clean Code 对于写博客的认识也多了一些,不得不说,我以前写的博客都是几乎一遍过,就是为了解决问题而写的笔记,直接成文,解决问题后立刻走人,最近在看Clean Code这本书,有了写不同的认识,或者说有了更深刻的认识。
一个人写一篇博客,是否都是一次性成文,我以前认为可能大人物写博客都是严谨的,对于思考的认识,有很深的积淀,很有可能是一次性过,今天开始,我有了不同的认识。博客的文章也是不断的重构而来的。
原文如下: 代码和写别的东西很像。在写论文或文章时,你先想写什么就写什么,然后再打磨它,初稿也许粗陋无序,你就斟酌推敲,直至达到你心目中的样子。
从上面的话,我想起了硅谷一位举足轻重的人物,Paul Graham(《黑客与画家》作者,Y Combinator创始人,Hacker News创办者) 他的文章很有深度,他的文章很多都会感谢替他审稿的人,他书写的文章质量高也就成为很平常的事情了。
中文的作者也有很多,比如,陈皓(左耳朵耗子,常用昵称haoel,CoolShell站长, Mege创办人,),其博客的质量也很高,他书写文章也看得出来是精心打磨的。
因此,如何写一篇博客(文章)呢,我这里很赞同首先采用快速写作的方式,将想要书写的内容写下来,再细细打磨,仔细推敲,直到达到心目中的样子,再发出来,在书写文章和推敲的过程中,也是对自己知识的一个很好的检测,检测自己是否真实地了解所书写的内容,是否有需要修补的地方,这些对于知识的认识都是有好处的。
由此观止,或许其中存在着一个法则,快速出成果,不断迭代更新,不断重构,实施敏捷,在任何领域都适用,当然快速出成果并不是没有任何标准的快速制作,而是将需要注意的事情,进行内化。

如何写一篇文章最先出现在TCPGNL

❌
❌