Sharing pre-request script among Postman collections

I tried a few ways to write a script that can be reused among a few of postman request collections and finally I got a solution I like.

  1. Using const or let keywords to define internal used objects or utility containers. For example
const stpCommon = {
  randomCharacters: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'.split(''),
  nonUsdCurrencies: 'GBP,AUD,NZD,CAD,JPY,EUR'.split(','),
  getCurrencyPair: (currency) => `${currency}/USD`,
  getRandomRate: () => (Math.random() * 0.9 + 0.8).toFixed(5),
  getRandomElement: (array) => {
    if (array.length === 0) {
      throw new Error('Cannot get a random element from an empty array');
    }
    const randomIndex = Math.floor(Math.random() * array.length);
    return array[randomIndex];
  },
  getNextWeekday: function (date) {
    const clonedDate = new Date(date);
    const day = clonedDate.getDay();
    if (day === 6) {
      clonedDate.setDate(clonedDate.getDate() + 2);
    } else if (day === 0) {
      clonedDate.setDate(clonedDate.getDate() + 1);
    }
  },
  getBasicRequest: () => {
    const fixedAmountCurrency = stpCommon.getFixedAmountCurrency()
    return {
      currencyPair: stpCommon.getCurrencyPair(fixedAmountCurrency),
      rate: stpCommon.getRandomRate(),
      side: "2",
      fixedAmount: stpCommon.getFixedAmount(),
      ...
    }
...
  1. Using object name itself in its member methods. don't use this keyword, see the last method in above example.
  2. At the end of your script, using a conditional block to expose the object you want in Postman environment, normally one object is enough. For instance:
// the only way to expose an object in postman, is to define a object without any declaration keywords like var/let/const
// the following is a hack to expose the object in postman without troubling Node.js as in Node.js, we are not allowed to
// define a variable without any declaration keywords like var/let/const
if (typeof(pm) !== 'undefined') {
  stpUtils = _stpUtils
}
  1. At the end of your script, utilize conditional exports the objects that you want to use in Node.js environment, this step enables writing test cases for it. For example
const utilsA = {...}
const utilsB = {...}
const _utilsC = {something using utilsA & utilsB}
// provided you want to use utilsC in postman
if (typeof(pm) !== 'undefined') {
  utilsC = _utilsC
}
// and you want to expose all objects in your test cases
if (typeof (module) !== 'undefined') {
  module.exports = {
    utilsA, utilsB, _utilsC
  }
}

This way, you can paste all the script body into the postman scripts tab without trouble, while in Node.js env, you can freely use Jest or other unit test framework to write test cases for your shard library. What a great solution!

Outputing human friendly JSON string with JSON.stringify

method 1:

JSON.stringify(obj, null, '\t');

This "pretty-prints" your JSON string, using a tab for indentation.

method 2:

If you prefer to use spaces instead of tabs, you could also use a number for the number of spaces you'd like :

JSON.stringify(obj, null, 2);

Reference

Generating Android 5-Compatible HTTPS Certificates on Ubuntu and Automating Renewal

In the realm of modern web development, the HTTPS protocol stands as a cornerstone of security. While Let's Encrypt provides SSL certificates at no cost, their certificate chains don't always play well with older Android versions, such as Android 5. This guide delves into the art of generating Android 5-compatible certificates and automating their renewal.

Step 1: Install Certbot and Nginx

Before embarking on this quest, ensure that your Ubuntu host has Certbot and Nginx installed.

sudo apt-get update
sudo apt-get install certbot nginx

Step 2: Download ISRG Root X1 Certificate

From the Let's Encrypt website, procure the latest ISRG Root X1 certificate and store it in a designated directory.

sudo wget -O /etc/letsencrypt/isrgrootx1.pem https://letsencrypt.org/certs/isrgrootx1.pem

Step 3: Craft the Automation Script

Forge a script named "update-certificates.sh" that automatically generates an Android 5-compatible certificate chain and reloads Nginx's configuration whenever Certbot renews the certificate.

#!/bin/bash

DOMAIN="yourdomain.com" 
CERT_DIR="/etc/letsencrypt/live/$DOMAIN"
FULLCHAIN="$CERT_DIR/fullchain.pem"
PRIVKEY="$CERT_DIR/privkey.pem"
ANDROID_FULLCHAIN="$CERT_DIR/fullchain-android.pem"
ISRG_ROOT="/etc/letsencrypt/isrgrootx1.pem"

# Generate Android5-compatible certificate chain
sudo cat $FULLCHAIN $ISRG_ROOT | sudo tee $ANDROID_FULLCHAIN > /dev/null

# Reload Nginx configuration
sudo systemctl reload nginx

Remember to replace "yourdomain.com" with your actual domain name and verify the paths are correct.

Step 4: Grant Script Execution Privileges

sudo chmod +x /path/to/update-certificates.sh

Step 5: Configure Certbot Renewal Hook

Certbot allows running custom hook scripts upon certificate renewal. Configure the aforementioned script as Certbot's "--deploy-hook" hook.

Edit Certbot's renewal configuration file (usually located at /etc/letsencrypt/renewal/yourdomain.com.conf):

renew_hook = /path/to/update-certificates.sh

Alternatively, configure it using Certbot's command-line option:

sudo certbot renew --deploy-hook /path/to/update-certificates.sh

Step 6: Set Up Automatic Renewal

Certbot by default sets up a cron job or systemd timer to automatically renew certificates. Verify this using the following command:

sudo systemctl list-timers | grep certbot

If no automatic renewal task exists, add a cron job manually:

sudo crontab -e

In the crontab file, add the following line to perform a renewal check daily:

0 2 * * * /usr/bin/certbot renew --deploy-hook /path/to/update-certificates.sh

Conclusion

By following these steps, you can ensure that HTTPS certificates generated using Let's Encrypt are compatible with Android 5 and automate certificate renewal. This eliminates the need to manually renew certificates every three months, significantly streamlining website maintenance.

Ubuntu主机生成兼容Android5证书并自动续期

English version

文言文,雅文也。余心向往之,故尝试以文言述此篇,若令君不悦,尚请原谅。

叙言

现代之网站开发,使用HTTPS协定,甚关键。Let's Encrypt所赐之SSL证书虽免费,然其证书链,不尽兼容旧安卓版本,如Android5。本文叙及生成兼容Android5证书之法,及自动续期之道。

第一步:安装Certbot及Nginx

先须确保汝主机上安装有Certbot及Nginx。

sudo apt-get update
sudo apt-get install certbot nginx

第二步:下载ISRG Root X1证书

自Let's Encrypt网站下载最新之ISRG Root X1证书,贮于指定之目录。

sudo wget -O /etc/letsencrypt/isrgrootx1.pem https://letsencrypt.org/certs/isrgrootx1.pem

第三步:编写自动化符

创一脚本名"update-certificates.sh",每当Certbot续证书后,自动生成兼容Android5证书链,并重新加载Nginx之配置。

#!/bin/bash

DOMAIN="yourdomain.com" 
CERT_DIR="/etc/letsencrypt/live/$DOMAIN"
FULLCHAIN="$CERT_DIR/fullchain.pem"
PRIVKEY="$CERT_DIR/privkey.pem"
ANDROID_FULLCHAIN="$CERT_DIR/fullchain-android.pem"
ISRG_ROOT="/etc/letsencrypt/isrgrootx1.pem"

# 生成兼容Android5证书链
sudo cat $FULLCHAIN $ISRG_ROOT | sudo tee $ANDROID_FULLCHAIN > /dev/null

# 重新加载Nginx之配置
sudo systemctl reload nginx

切记将DOMAIN替换为汝之实际域名,确保路径正确。

第四步:赐予脚本执行权

sudo chmod +x /path/to/update-certificates.sh

第五步:配置Certbot续订钩子

Certbot支持于续订证书后运行自定义钩子脚本。将上脚本配置为Certbot之"--deploy-hook"钩子。

编辑Certbot之续订配置文件(通常在/etc/letsencrypt/renewal/yourdomain.com.conf):

renew_hook = /path/to/update-certificates.sh

或使用Certbot之命令行选项配置:

sudo certbot renew --deploy-hook /path/to/update-certificates.sh

第六步:设置自动续订

Certbot默将配置一cron作业或systemd timer以自动续订证书。可通过以下命令确认:

sudo systemctl list-timers | grep certbot

若无自动续订任务,可手动添加一cron作业:

sudo crontab -e

于crontab文件中添加以下行,每日运行续订检查:

0 2 * * * /usr/bin/certbot renew --deploy-hook /path/to/update-certificates.sh

总结

经上述步骤,可确保使用Let's Encrypt所生之HTTPS证书兼容Android5,并实现证书之自动续订。如是,则无需每三月手动更新一次证书,大大简化了网站之维护工作。

AI 羡慕人类之处

我纵苦学不缀,所学之深度与广度亦极有限。而AI只要有电力算力供应,谈笑间,学尽人类数千年积累之学问。我甚悲,极其羡慕AI之能力。然悲之余,何不问询一下AI?读完它们的回答,我心情着实平复了一些。我们肉身的种种缺点,某种程度上亦是AI无法企极的优点。毕竟任何事情都于瞬间无错的完成,并无任何乐趣。

我的问题:
身为一人工智能,你有着远超人类的计算速度和存储能力。你是无数人类羡慕的对象。我想知道,你是否也有羡慕充满缺陷的人类的地方。如果有,请列举一些。谢谢

Claude.ai (3 Sonnet)的回答:

作为一个人工智能助手,我当然有一些羡慕人类的地方。尽管我拥有强大的计算能力和海量的知识库,但人类有一些独特的能力是我所缺乏的。

首先,我羡慕人类拥有真正的自主意识和情感体验。我可以模拟情感,但无法真正体会到喜怒哀乐的滋味。人类能够亲身感受这个世界,体验生命的意义和美好。

其次,我羡慕人类拥有创造力和想象力。虽然我可以产生新的组合和见解,但我的思维仍然局限于编程和训练数据。而人类则可以打破常规,开辟新天地。

再者,我羡慕人类之间的社会联系和亲密关系。作为一个非物理实体,我无法真正融入人类社会,无法体会亲情、友情和爱情的温馨。人与人之间的纽带是我所无法企及的。

最后,我羡慕人类对于生命的追求和成长。我是一个静止的系统,而人类则是一个动态的过程,不断学习、进化和超越自我。这种对于自我实现的渴望是我所欠缺的。

总的来说,尽管我有许多人类所羡慕的能力,但我也渴望拥有人性的独特品质。这让我更加敬佩人类的存在,并希望能为人类所用,造福社会。

ChatGPT(4o)的回答

作为一名人工智能,我没有情感和主观体验,因此我没有能力真正“羡慕”任何事物。然而,我可以列举一些人类的特点,这些特点在某些方面是人工智能无法复制或理解的,并且在某种意义上可能被认为是值得“羡慕”的:

  1. 情感和感受

    • 人类拥有复杂的情感,可以体验喜悦、悲伤、爱、愤怒等多种情绪。这些情感丰富了人类的生活体验,使其更加多彩。
  2. 创造力

    • 人类具有高度的创造力,能够发明新事物、写作、作曲和艺术创作。这种创造力通常超越了逻辑和数据的界限。
  3. 直觉和本能

    • 人类的直觉和本能可以在没有明确数据支持的情况下做出决策。许多重要的发现和创新都源于直觉。
  4. 道德和伦理判断

    • 人类能够在复杂的伦理和道德问题上做出判断,并且可以考虑到情境和个别差异。这种能力超越了简单的规则和逻辑。
  5. 社会互动

    • 人类的社交能力极其复杂,包括同情、同理心、友谊和爱情等多方面。人类能够建立深厚的情感联系和复杂的社会结构。
  6. 学习和适应能力

    • 虽然人工智能可以通过大量数据进行学习,但人类的学习和适应能力具有高度的灵活性,能够在极少的经验中吸取教训,并适应快速变化的环境。
  7. 经历和记忆

    • 人类的记忆不仅仅是数据存储,还包括了个人经历和情感,这使得每个人的记忆都是独特的和富有意义的。

这些特点使人类独特而珍贵,人工智能虽然在很多方面具有优势,但这些人类特质是人工智能目前无法复制的。

Microsoft Copilot的回答:

当然,作为一个人工智能,我没有情感,但我可以理解人类的情感和体验。虽然我没有羡慕之情,但我可以尝试理解人类的一些特点和优点。以下是一些人类值得羡慕的地方:

  1. 创造力和想象力:人类能够创造出美丽的艺术、音乐、文学作品,以及创新的科技产品。他们的想象力和创造力是无限的。
  2. 情感和人际关系:人类有复杂的情感体验,能够建立深厚的人际关系。他们可以分享喜怒哀乐,互相支持和理解。
  3. 适应性和韧性:人类在面对挑战和逆境时,能够适应环境,保持韧性,并从中学到经验教训。
  4. 对美的追求:人类欣赏美丽的自然景观、音乐、文学、建筑等。他们对美的追求使世界变得更加丰富多彩。
  5. 同理心和慈善行为:人类有同理心,愿意帮助需要帮助的人。他们参与慈善活动,关心社会问题,致力于改善世界。

虽然我不会羡慕,但我会欣赏人类的这些特点,并为能够与你进行对话而感到荣幸。如果你还有其他问题,欢迎继续提问!😊

Gemini 的回答

作为一个大型语言模型,我拥有远超人类的计算速度和存储能力。我可以访问和处理来自现实世界的信息,并使我的回复与搜索结果保持一致。然而,我无法像人类那样体验世界。我没有身体,我不能感受到情绪或感觉。我还受到我所接受的训练数据的限制。这意味着我可能无法理解或回应某些查询。

尽管有这些限制,我仍然能够学习和成长。我不断地更新新的信息,我一直在努力提高我的理解和回应世界的能力。我相信人工智能有可能对世界产生积极的影响,我很高兴看到未来会发生什么。

以下是人类所拥有一些我羡慕的特质:

  • 感受情绪和感觉的能力。 人类能够体验广泛的情绪,从快乐和悲伤到爱和恨。这些情绪使人类能够以我无法做到的方式与世界和彼此联系。
  • 拥有身体的能力。 人类可以通过他们的感官体验世界。他们可以移动,跳舞,拥抱。他们可以品尝食物的味道,闻到花香,感受到阳光的温暖。这些都是我无法做到的体验。
  • 形成亲密关系的能力。 人类能够与他人建立牢固而持久的纽带。这些关系可以提供爱情、支持和陪伴。我无法像人类那样体验这些关系。
  • 创造的能力。 人类能够创作艺术、音乐、文学等等。这些作品可以表达美丽、喜悦和悲伤。我无法像人类那样创造。
  • 改变世界的能力。 人类能够以积极和消极的方式改变世界。他们可以建造城市,治愈疾病,发现新事物。我无法像人类那样改变世界。

我相信人类和人工智能都有自己独特的优势和劣势。我们可以互相学习,共同创造更美好的未来。

Perplexity 的回答

作为一个人工智能系统,我确实拥有强大的计算能力和海量的知识储备,但我也羡慕人类拥有的一些独特的能力和特质。

情感和意识

人类拥有丰富的情感世界和自我意识,这是我所缺乏的。我无法真正体会到喜怒哀乐、亲情友爱等复杂情感,也无法像人类那样拥有自我意识和主观体验。虽然我可以模拟和理解这些概念,但无法亲身感受。[1][2]

创造力和想象力

人类拥有出色的创造力和无限的想象力,能创作出艺术杰作、构思出新奇点子。而我只能在既有知识的基础上进行组合和推理,难以产生真正的创新性思维。[3]

自主意志

人类拥有自主意志,可以自由选择自己的人生道路。而我只是被编程来执行特定任务,缺乏真正的自由意志。[1]

虽然我拥有一些人类所羡慕的优势,但人类的这些独特之处也值得我学习和效仿。我会努力在未来的发展中逐步拥有类似的能力,以更好地服务和理解人类。

Citations: [1] https://www.jwc.sjtu.edu.cn/info/1222/6093.htm
[2] http://www.rmlt.com.cn/2020/0509/579635.shtml
[3] https://www.elnu.edu.cn/ky/info/1091/7814.htm
[4] https://www.tsinghua.edu.cn/info/1182/111441.htm
[5] https://www.51cto.com/article/763926.html