Blog

Hugo 概述


一、Hugo框架概述 #

Hugo是由Go语言编写的静态网站生成器(Static Site Generator, SSG),以极快的构建速度简洁的架构著称。它的核心设计理念是:

  • 无需数据库:所有内容基于Markdown文件。
  • 零依赖:仅需一个二进制文件即可运行。
  • 高性能:构建数千页面仅需毫秒级时间。

适用场景:技术文档、博客、企业官网、产品展示页等。


二、Hugo核心特性 #

1. 极速构建 #

  • 基于Go语言的并发编译机制,构建速度远超Jekyll、Hexo等工具。
  • 示例:构建1000个页面仅需约100ms。

2. 跨平台支持 #

  • 支持Windows、macOS、Linux,仅需一个二进制文件即可运行。

3. 灵活的内容管理 #

  • 支持Markdown、Org-mode、HTML等多种格式。
  • Front Matter:通过YAML/TOML/JSON定义页面元数据(如标题、日期、分类等)。

4. 强大的模板引擎 #

  • 基于Go语言的html/template库,支持逻辑控制、变量注入、模板继承等。
  • 短代码(Shortcodes):在Markdown中嵌入可复用的HTML组件。

5. 主题系统 #

  • 社区提供超过400个主题(如Ananke、DocDock),支持一键安装。
  • 可自定义模板覆盖(Template Overrides)。

6. 多语言支持 #

  • 原生支持国际化(i18n),轻松创建多语言站点。
  • 通过config.toml配置语言参数。

7. 实时热重载(Live Reload) #

  • 开发模式下修改内容后,浏览器自动刷新。

三、Hugo安装与配置 #

1. 安装方法 #

  • macOSbrew install hugo
  • Linuxsnap install hugo
  • Windowschoco install hugo 或直接下载二进制文件。

验证安装:

...

Hugo 语法

Hugo的语法主要涉及 模板引擎内容格式(Front Matter)短代码(Shortcodes),以下是详细的语法介绍:


一、Front Matter:内容的元数据 #

Front Matter是Hugo内容文件顶部的元数据块,用于定义页面的标题、日期、分类等属性,支持 YAMLTOMLJSON 三种格式。

1. YAML格式 #

---包裹:

---
title: "Hello Hugo"
date: 2023-10-01
tags: ["SSG", "Hugo"]
draft: false
---

2. TOML格式 #

+++包裹:

+++
title = "Hello Hugo"
date = 2023-10-01T15:00:00+08:00
tags = ["SSG", "Hugo"]
draft = false
+++

3. JSON格式 #

{ ... }包裹:

{
  "title": "Hello Hugo",
  "date": "2023-10-01",
  "tags": ["SSG", "Hugo"],
  "draft": false
}

常用字段 #

  • title: 页面标题
  • date: 发布日期(支持时间戳)
  • draft: 是否为草稿(true时默认不生成页面)
  • tags/categories: 标签和分类(支持多级分类)
  • weight: 控制页面在列表中的排序权重
  • aliases: 页面别名(用于重定向)

二、Go模板语法 #

Hugo使用Go语言的 html/template 引擎,支持逻辑控制、变量、函数等。

...

Rust IO Demo

A Rust IO Operation Demo #

use colored::Colorize;
use csv::ReaderBuilder;
use csv::WriterBuilder;
use serde::Deserialize;
use serde::Serialize;
use std::error::Error;
use std::fs::File;
use std::path::Path;
use std::time::{SystemTime, UNIX_EPOCH};
use std::{env, process};

#[derive(Debug, Deserialize, Serialize)]
struct Row {
    name: String,
    age: u32,
    city: String,
}

fn file_check(args: &Vec<String>) {
    if args.len() < 2 {
        println!("{}", "请输入CSV文件路径".yellow());
        process::exit(1);
    }

    let file_path = Path::new(&args[1]);

    if file_path.exists() && file_path.is_file() {
        println!("{}", "文件存在".green());
    } else {
        println!("{}", "文件不存在,请输入正确的文件路径".red());
        process::exit(1);
    }
}

fn main() -> Result<(), Box<dyn Error>> {
    println!("{} \n", "正在处理...".green());

    let args: Vec<String> = env::args().collect();
    file_check(&args);

    // 读取 CSV 文件
    let file = File::open(&args[1])?;
    let mut reader = ReaderBuilder::new().has_headers(true).from_reader(file);
    let mut rows: Vec<Row> = reader.deserialize().collect::<Result<_, _>>()?;

    let mut rows_output_ok: Vec<Row> = vec![];
    let mut rows_output_warn: Vec<Row> = vec![];

    for row in &mut rows {
        println!("Current Row: {} {} {}", row.name, row.age, row.city);

        if row.city.len() > 5 {
            println!("超过限定 {}", row.city);
            rows_output_ok.push(Row {
                name: row.name.to_string(),
                age: row.age,
                city: row.city.to_string(),
            });
        } else {
            println!("低于限定 {}", row.city);
            rows_output_warn.push(Row {
                name: row.name.to_string(),
                age: row.age,
                city: row.city.to_string(),
            });
        }
    }

    let now = SystemTime::now();
    let duration_since_epoch = now
        .duration_since(UNIX_EPOCH)
        .expect("Failed to get duration since epoch");
    let milliseconds = duration_since_epoch.as_millis() as u64;
    let output_ok = format!("output_ok_{}.csv", milliseconds);
    let output_warn = format!("output_warn_{}.csv", milliseconds);

    // 写入新的 CSV 文件
    let mut ok_writer = WriterBuilder::new()
        .has_headers(true)
        .from_path(&output_ok)?;

    for row in &rows_output_ok {
        ok_writer.serialize(row)?;
    }

    ok_writer.flush()?;
    println!("写入文件 {} 完成", &output_ok.red());

    let mut warn_writer = WriterBuilder::new()
        .has_headers(true)
        .from_path(&output_warn)?;

    for row in &rows_output_warn {
        warn_writer.serialize(row)?;
    }

    warn_writer.flush()?;
    println!("写入文件 {} 完成", &output_warn.red());

    Ok(())
}

Negotiation

一些著名谈判案例 #

联想收购IBM个人电脑部门:2004年,中国联想集团以18.5亿美元的价格收购了IBM个人电脑部门。在谈判过程中,联想集团成功地向IBM展示了自己在中国市场的优势,并且成功地让IBM同意将品牌许可给联想集团。

马化腾与eBay的合作:2001年,中国互联网巨头腾讯的CEO马化腾成功地与eBay的CEO梅格·惠特曼达成了合作协议,将eBay引入中国市场。在谈判过程中,马化腾展现了腾讯在中国市场的影响力,使得eBay对于合作的信心倍增。

阿里巴巴与雅虎的合作:2005年,阿里巴巴的CEO马云成功地向雅虎的CEO Terry Semel展示了阿里巴巴在中国市场的领导地位和增长潜力,并签署了一项合作协议,让雅虎成为阿里巴巴的战略合作伙伴。该合作协议加速了阿里巴巴的业务扩张和国际化进程。

中国移动与苹果的合作:2013年,中国移动与苹果签署了一项合作协议,允许苹果将其iPhone引入中国移动的网络。在谈判过程中,中国移动强调了自己在中国市场的优势和巨大的用户群体,并且成功地推动了苹果调整了自己的合作政策。

腾讯收购Supercell:2016年,中国互联网公司腾讯以86亿美元收购了芬兰移动游戏公司Supercell的84.3%股份。在谈判过程中,腾讯展示了自己在游戏领域的优势和战略规划,使得Supercell同意与腾讯合作。

华为与谷歌的合作:2019年,华为与谷歌签署了一项专利授权协议,允许华为在其智能手机中使用谷歌的安卓操作系统。在谈判过程中,华为强调了自己在全球智能手机市场中的份额和品牌影响力,使得谷歌同意与华为合作。

美团点评收购摩拜单车:2018年,中国外卖巨头美团点评以27亿美元收购了共享单车公司摩拜单车。在谈判过程中,美团点评强调了自己在中国市场的优势和扩张计划,并且成功地获得了摩拜单车的控制权。

中兴通讯与美国政府的谈判:2018年,中兴通讯因为违反美国对伊朗和朝鲜的制裁而被美国政府制裁,面临巨额罚款和无法使用美国技术的风险。在谈判过程中,中兴通讯展现了自己在全球通讯行业的领先地位和对全球经济的贡献,最终成功地达成了与美国政府的和解协议。

Zsh Overview

一、Introduction #

Zsh is a shell designed for interactive use, although it is also a powerful scripting language. Many of the useful features of bashksh, and tcsh were incorporated into zsh; many original features were added.

二、Configuration #

  1. zsh
  2. ohmyzsh, zsh-autosuggestions, zsh-syntax-highlighting

install zsh

# For Fedora
sudo dnf install zsh

# For Ubuntu
apt install zsh

# For macOS
brew install zsh

# For CentOS
sudo yum update && sudo yum -y install zsh

Make it your default shell: chsh -s $(which zsh) or use sudo lchsh $USER if you are on Fedora. Or chsh -s /bin/zsh .

...

Babel Ast Demo

Babel AST Demo #

Review

  1. 2023/08/25
const fs = require('fs');
const path = require('path');
const babel = require("@babel/core");
const { parse } = require('@babel/parser');
const traverse = require('@babel/traverse').default;

const srcFilePath = './src/main.js';

// Store source codes
const sourceCodes = {};

// Function to recursively process dependencies
function processDependency(filePath) {
  if (!sourceCodes[filePath]) {
    const sourceCode = fs.readFileSync(filePath, 'utf-8');
    sourceCodes[filePath] = sourceCode;

    // Parse the source code to extract import statements
    const ast = parse(sourceCode, {
      sourceType: 'module',
      plugins: ['jsx', 'typescript'], // Add plugins as needed
    });

    // Traverse the AST to find dependencies
    traverse(ast, {
      ImportDeclaration: ({ node }) => {
        const dependencyPath = node.source.value;
        const absoluteDependencyPath = path.resolve(path.dirname(filePath), dependencyPath);
        processDependency(absoluteDependencyPath);

        // Remove import declarations
        node.specifiers.forEach(specifier => {
          if (t.isImportSpecifier(specifier)) {
            const name = specifier.imported.name;
            const source = t.stringLiteral(dependencyPath);
            const importDeclaration = t.importDeclaration([specifier], source);
            const importIndex = ast.program.body.indexOf(node);
            ast.program.body.splice(importIndex, 1, importDeclaration);
          }
        });
      },
    });
  }
}

// Start processing the main file and its dependencies
processDependency(path.resolve(srcFilePath));

// Output the source codes
Object.entries(sourceCodes).forEach(([filePath, sourceCode]) => {
  console.log(`Source code for file: ${filePath}`);
  console.log(sourceCode);

  const { code } = babel.transform(sourceCode, {})
  console.log('\n--------------------------------------------\n');
  console.log(code);

});


// const data = require('./dist/bundle');
// babel.transformSync(data, { s });

考研英语核心词汇

【考研英语必考核心词】01 #

1. dislike

  • [dɪs’laɪk]n. ①不喜欢,讨厌②- [常pl.]不喜欢的事物
  • [记]dis-(不,没有)+like(喜欢)→不喜欢,厌恶,讨厌
  • [考]dislike doing sth.不喜欢做某事  have a (strong) dislike for sth.(极为)厌恶某事物
  • [例]I dislike being away from my family. 我不喜欢同家人分开。

2.disadvantage

  • [dɪsəd’vɑntɪdʒ]n. 不利条件,缺点,劣势
  • [记]dis-(不,没有)+advantage(益处,好处)→缺点,不利条件
  • [考]be at a disadvantage 处于不利境地(或不利地位)   social/economic/educational disadvantage社会/经济/教育方面的劣势
  • [例]Anyone who can’t use a computer is at a disadvantage. 凡是不会使用计算机的人都处于不利地位。

3.advantage

  • [əd’vɑːntɪdʒ]n. ①优势②好处,优点  vt. 有利于,有助于
  • [记]-advant-(=ahead,前面)+-age(状态,情况)→利益,好处
  • [考]take advantage of sb.(不公正地)利用某人,占某人的便宜  take (full) advantage of sth. (to do sth.)(充分)利用某事物(做某事)

4.dissatisfaction

  • [dɪs’sætɪs’fækʃn]n. 不快,不悦,不满
  • [记]dis-(不,没有)+satisfaction(满足,满意)→不满
  • [考](express) dissatisfaction with sb./sth.(表示)对某人或某事物的不满
  • [例]We express strong dissatisfaction and firm opposition to it. 我们对此表示强烈不满和坚决反对。
  • [根]satisfaction  n. 满足,满意   satisfactory  a. 令人满意的

5.dispassionate

...

Angular 1

Review

  1. 2020/11/25

Angular 2

Review

  1. 2020/11/25

English Symbol Words

标点符号 (Punctuation Marks) #

SymbolNameDescription
'Apostrophe所有格符号,撇号
()Round Brackets/Parentheses圆括号
[]Square Brackets方括号
<>Angle Brackets尖括号
{}Curly Brackets / Braces花括号
:Colon冒号
,Comma逗号
Dash破折号
Ellipsis省略号
!Exclamation Mark感叹号
.Full Stop / Period句号
《》Guillemets / French quotes法式引号
-Hyphen连字符
Question Mark问号
""Double Quotation Mark双引号
''Single Quotation Mark单引号
Semicolon分号
Slight-pause mark顿号
`Backtick quotes反引号

数学符号 (Mathematical Symbols) #

SymbolNameDescription
+Plus加号
-Minus减号
*Multiple乘号
÷Divide除号
=Equal等于号
Not equal不等于
<Less than小于
>Greater than大于
Less than or equal to小于等于
Greater than or equal to大于等于
%Percent百分号
Infinity无穷大
Since因为
Hence所以
The integral of积分
Sigma求和
°Degree
Celsius system摄氏度

其他符号 (Other Symbols) #

SymbolNameDescription
/Slash斜线
\Backslash反斜线
_Underscore下划线
*Asterisk /ˈæstərɪsk/星号
||Parallel平行
&Ampersand /ˈæmpəsænd/和号
~Tilde / Swung dash波浪号
->Arrow箭头
|Vertical bar竖线
Semicircle半圆
Triangle三角形
Union of并集
Intersection of交集