duc-mt 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/latest-blogs.yml +25 -0
- package/.github/workflows/stackoverflow-activities.yml +24 -0
- package/.github/workflows/waka-stats.yml +22 -0
- package/README.md +130 -0
- package/assets/banner.png +0 -0
- package/assets/developer.gif +0 -0
- package/card.js +121 -0
- package/package.json +38 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
name: 📜 Update latest blogs
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
schedule:
|
|
6
|
+
- cron: "0 * * * *"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
update:
|
|
10
|
+
name: Update
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: 📥 Checkout Repository
|
|
14
|
+
uses: actions/checkout@main
|
|
15
|
+
with:
|
|
16
|
+
fetch-depth: 0
|
|
17
|
+
|
|
18
|
+
- name: ⤵️ Pull in ducmt.netlify.app Blogs
|
|
19
|
+
uses: gautamkrishnar/blog-post-workflow@master
|
|
20
|
+
with:
|
|
21
|
+
feed_list: "https://ducmt.netlify.app/posts/index.xml"
|
|
22
|
+
template: "$newline - $emojiKey(💯,🔥,💫,🚀,🌮) $date - [$title]($url)"
|
|
23
|
+
date_format: "UTC:mmmm d, yyyy"
|
|
24
|
+
commit_message: "docs(readme): update new blogs"
|
|
25
|
+
remove_duplicates: true
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: 💻 Update StackOverflow activities
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
schedule:
|
|
6
|
+
- cron: "0 * * * *"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
update:
|
|
10
|
+
name: Update
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: 📥 Checkout Repository
|
|
14
|
+
uses: actions/checkout@main
|
|
15
|
+
with:
|
|
16
|
+
fetch-depth: 0
|
|
17
|
+
|
|
18
|
+
- name: ⤵️ Pull in @tanducmai Activities
|
|
19
|
+
uses: gautamkrishnar/blog-post-workflow@master
|
|
20
|
+
with:
|
|
21
|
+
comment_tag_name: "STACKOVERFLOW"
|
|
22
|
+
feed_list: "https://stackoverflow.com/feeds/user/16999206"
|
|
23
|
+
template: "<tr><td>$title</td><td>$url</td></tr>"
|
|
24
|
+
commit_message: "docs(readme): update StackOverflow activities"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: 🧮 Update coding statistics
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
schedule:
|
|
6
|
+
- cron: "0 0 * * *"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
update:
|
|
10
|
+
name: Update
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: anmol098/waka-readme-stats@master
|
|
14
|
+
with:
|
|
15
|
+
WAKATIME_API_KEY: ${{ secrets.WAKATIME_API_KEY }}
|
|
16
|
+
GH_TOKEN: ${{ secrets.GH_TOKEN }}
|
|
17
|
+
SHOW_OS: "True"
|
|
18
|
+
SHOW_PROJECTS: "False"
|
|
19
|
+
SHOW_LINES_OF_CODE: "True"
|
|
20
|
+
SHOW_LOC_CHART: "False"
|
|
21
|
+
COMMIT_MESSAGE: "docs(readme): update coding statistics"
|
|
22
|
+
COMMIT_USERNAME: "github-actions[bot]"
|
package/README.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
<p align="center"><img src="assets/banner.png" /></p>
|
|
2
|
+
|
|
3
|
+
[//]: 
|
|
4
|
+
[//]: 
|
|
5
|
+
[//]: 
|
|
6
|
+
|
|
7
|
+
# $ whoami
|
|
8
|
+
|
|
9
|
+
- :mortar_board:: Network Engineer | Open-Source Contributor.
|
|
10
|
+
- :telescope:: Check out my [portfolio](https://ducmt.netlify.app/).
|
|
11
|
+
- :seedling:: I'm currently learning everything that is network-related.
|
|
12
|
+
- :earth_asia:: I build and automate resilient networks, contribute to open-source, and share what I learn on my blog.
|
|
13
|
+
- :speech_balloon:: `I'm a fixer. I fixed it.`
|
|
14
|
+
|
|
15
|
+
# :credit_card: Personal Card
|
|
16
|
+
|
|
17
|
+
Connect with me via the terminal by issuing the following `npx` command:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
$ npx duc-mt
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
# :coffee: Get in Touch
|
|
24
|
+
|
|
25
|
+
<a target="_blank" href="https://www.linkedin.com/in/duc-mt">
|
|
26
|
+
<img alt="LinkedIn" src="https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white" />
|
|
27
|
+
</a>
|
|
28
|
+
<a target="_blank" href="mailto:ducmai.network@gmail.com">
|
|
29
|
+
<img alt="Email" src="https://img.shields.io/badge/Gmail-D14836?style=for-the-badge&logo=gmail&logoColor=white" />
|
|
30
|
+
</a>
|
|
31
|
+
<a target="_blank" href="https://stackoverflow.com/users/16999206/tanducmai">
|
|
32
|
+
<img alt="StackOverflow" src="https://img.shields.io/static/v1?message=Stackoverflow&logo=stackoverflow&label=&color=FE7A16&logoColor=white&labelColor=&style=for-the-badge" />
|
|
33
|
+
</a>
|
|
34
|
+
|
|
35
|
+
# :closed_lock_with_key: PGP Key Fingerprint
|
|
36
|
+
|
|
37
|
+
`D2F1 F373 9A4E 465E 737C 1F38 F9E9 1488 183E D044` or `ducmai-network@gmail.com`
|
|
38
|
+
|
|
39
|
+
# :scroll: On My Blog
|
|
40
|
+
|
|
41
|
+
<!-- BLOG-POST-LIST:START -->
|
|
42
|
+
|
|
43
|
+
- 💯 February 10, 2026 - [Stateful Switchover - SSO](https://ducmt.netlify.app/posts/ccnp-enterprise-core/stateful-switchover-sso/)
|
|
44
|
+
- 🔥 September 19, 2025 - [Analysis of Optus 2025 Outage](https://ducmt.netlify.app/posts/blogs/analysis-of-optus-2025-outage/)
|
|
45
|
+
- 💫 June 13, 2025 - [Meta Unmasked: The June 2025 Android Tracking Phenomenon](https://ducmt.netlify.app/posts/blogs/meta-unmasked-june-2025/)
|
|
46
|
+
- 🚀 May 18, 2025 - [Network Automation with Netmiko: A Practical Guide](https://ducmt.netlify.app/posts/python/network-automation-with-netmiko/)
|
|
47
|
+
- 🌮 March 15, 2025 - [Advanced Network Automation with Ansible and AWX](https://ducmt.netlify.app/posts/blogs/advanced-network-automation-with-awx/)<!-- BLOG-POST-LIST:END -->
|
|
48
|
+
|
|
49
|
+
# :1234: Statistics
|
|
50
|
+
|
|
51
|
+
<!--START_SECTION:waka-->
|
|
52
|
+
|
|
53
|
+

|
|
54
|
+
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+

|
|
58
|
+
|
|
59
|
+
**🐱 My GitHub Data**
|
|
60
|
+
|
|
61
|
+
> 📦 252.1 kB Used in GitHub's Storage
|
|
62
|
+
>
|
|
63
|
+
> 🏆 21 Contributions in the Year 2026
|
|
64
|
+
>
|
|
65
|
+
> 💼 Opted to Hire
|
|
66
|
+
>
|
|
67
|
+
> 📜 32 Public Repositories
|
|
68
|
+
>
|
|
69
|
+
> 🔑 6 Private Repositories
|
|
70
|
+
>
|
|
71
|
+
> **I'm an Early 🐤**
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
🌞 Morning 1172 commits ███████░░░░░░░░░░░░░░░░░░ 29.58 %
|
|
75
|
+
🌆 Daytime 1152 commits ███████░░░░░░░░░░░░░░░░░░ 29.08 %
|
|
76
|
+
🌃 Evening 1424 commits █████████░░░░░░░░░░░░░░░░ 35.94 %
|
|
77
|
+
🌙 Night 214 commits █░░░░░░░░░░░░░░░░░░░░░░░░ 05.40 %
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
📅 **I'm Most Productive on Monday**
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
Monday 732 commits █████░░░░░░░░░░░░░░░░░░░░ 18.48 %
|
|
84
|
+
Tuesday 517 commits ███░░░░░░░░░░░░░░░░░░░░░░ 13.05 %
|
|
85
|
+
Wednesday 647 commits ████░░░░░░░░░░░░░░░░░░░░░ 16.33 %
|
|
86
|
+
Thursday 516 commits ███░░░░░░░░░░░░░░░░░░░░░░ 13.02 %
|
|
87
|
+
Friday 512 commits ███░░░░░░░░░░░░░░░░░░░░░░ 12.92 %
|
|
88
|
+
Saturday 584 commits ████░░░░░░░░░░░░░░░░░░░░░ 14.74 %
|
|
89
|
+
Sunday 454 commits ███░░░░░░░░░░░░░░░░░░░░░░ 11.46 %
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
📊 **This Week I Spent My Time On**
|
|
93
|
+
|
|
94
|
+
```text
|
|
95
|
+
🕑︎ Time Zone: Asia/Ho_Chi_Minh
|
|
96
|
+
|
|
97
|
+
💬 Programming Languages:
|
|
98
|
+
Markdown 4 hrs 3 mins ██████████████████░░░░░░░ 70.52 %
|
|
99
|
+
Text 54 mins ████░░░░░░░░░░░░░░░░░░░░░ 15.89 %
|
|
100
|
+
gitconfig 13 mins █░░░░░░░░░░░░░░░░░░░░░░░░ 04.03 %
|
|
101
|
+
Bash 9 mins █░░░░░░░░░░░░░░░░░░░░░░░░ 02.82 %
|
|
102
|
+
TOML 9 mins █░░░░░░░░░░░░░░░░░░░░░░░░ 02.71 %
|
|
103
|
+
|
|
104
|
+
🔥 Editors:
|
|
105
|
+
Vim 5 hrs 45 mins █████████████████████████ 100.00 %
|
|
106
|
+
|
|
107
|
+
💻 Operating System:
|
|
108
|
+
WSL 5 hrs 45 mins █████████████████████████ 100.00 %
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**I Mostly Code in Python**
|
|
112
|
+
|
|
113
|
+
```text
|
|
114
|
+
Python 19 repos ███████████████████░░░░░░ 76.00 %
|
|
115
|
+
PowerShell 1 repo █░░░░░░░░░░░░░░░░░░░░░░░░ 04.00 %
|
|
116
|
+
HTML 1 repo █░░░░░░░░░░░░░░░░░░░░░░░░ 04.00 %
|
|
117
|
+
Vim Script 1 repo █░░░░░░░░░░░░░░░░░░░░░░░░ 04.00 %
|
|
118
|
+
Shell 1 repo █░░░░░░░░░░░░░░░░░░░░░░░░ 04.00 %
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Last Updated on 21/02/2026 01:44:08 UTC
|
|
122
|
+
|
|
123
|
+
<!--END_SECTION:waka-->
|
|
124
|
+
|
|
125
|
+
# :computer: StackOverflow Activities
|
|
126
|
+
|
|
127
|
+
<!-- STACKOVERFLOW:START -->
|
|
128
|
+
<!-- STACKOVERFLOW:END -->
|
|
129
|
+
|
|
130
|
+
<p align="center"><img src="assets/developer.gif" /></p>
|
|
Binary file
|
|
Binary file
|
package/card.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import boxen from "boxen";
|
|
4
|
+
import chalk from "chalk";
|
|
5
|
+
import inquirer from "inquirer";
|
|
6
|
+
import clear from "clear";
|
|
7
|
+
import open from "open";
|
|
8
|
+
import fs from "fs";
|
|
9
|
+
import request from "request";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import ora from "ora";
|
|
12
|
+
import cliSpinners from "cli-spinners";
|
|
13
|
+
|
|
14
|
+
clear();
|
|
15
|
+
|
|
16
|
+
// Profile data
|
|
17
|
+
const data = {
|
|
18
|
+
name: chalk.bold.green(" Duke Mike"),
|
|
19
|
+
handle: chalk.white("@duc-mt"),
|
|
20
|
+
work: `${chalk.white("Network Engineer at")} ${chalk.hex("#2b82b2").bold("CMC Telecom")}`,
|
|
21
|
+
github: chalk.gray("https://github.com/") + chalk.green("duc-mt"),
|
|
22
|
+
linkedin: chalk.gray("https://linkedin.com/in/") + chalk.blue("duc-mt"),
|
|
23
|
+
web: chalk.gray("https://") + chalk.cyan("ducmt") + chalk.gray(".netlify.app/"),
|
|
24
|
+
npx: chalk.white("npx") + " " + chalk.red("duc-mt"),
|
|
25
|
+
|
|
26
|
+
labelWork: chalk.white.bold(" Work:"),
|
|
27
|
+
labelGitHub: chalk.white.bold(" GitHub:"),
|
|
28
|
+
labelLinkedIn: chalk.white.bold(" LinkedIn:"),
|
|
29
|
+
labelWeb: chalk.white.bold(" Web:"),
|
|
30
|
+
labelCard: chalk.white.bold(" Card:"),
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// Business card box
|
|
34
|
+
const me = boxen(
|
|
35
|
+
[
|
|
36
|
+
`${data.name}`,
|
|
37
|
+
``,
|
|
38
|
+
`${data.labelWork} ${data.work}`,
|
|
39
|
+
``,
|
|
40
|
+
`${data.labelGitHub} ${data.github}`,
|
|
41
|
+
`${data.labelLinkedIn} ${data.linkedin}`,
|
|
42
|
+
`${data.labelWeb} ${data.web}`,
|
|
43
|
+
``,
|
|
44
|
+
`${data.labelCard} ${data.npx}`,
|
|
45
|
+
``,
|
|
46
|
+
chalk.italic(`Network Engineer specialising in ${chalk.green("IP networking")},`),
|
|
47
|
+
chalk.italic(` ${chalk.cyan("advanced routing protocols")} and ${chalk.cyan("telecom systems")}.`),
|
|
48
|
+
chalk.italic(`Experienced with ${chalk.yellow("multi‑vendor technologies")},`),
|
|
49
|
+
chalk.italic(` ${chalk.blue("Wi‑Fi infra")}, and ${chalk.magenta("cross‑functional collaboration")}.`),
|
|
50
|
+
].join("\n"),
|
|
51
|
+
{
|
|
52
|
+
margin: 1,
|
|
53
|
+
float: "center",
|
|
54
|
+
padding: 1,
|
|
55
|
+
borderStyle: "single",
|
|
56
|
+
borderColor: "green",
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
console.log(me);
|
|
61
|
+
|
|
62
|
+
// Menu choices
|
|
63
|
+
const questions = [
|
|
64
|
+
{
|
|
65
|
+
type: "rawlist",
|
|
66
|
+
name: "action",
|
|
67
|
+
message: "What do you want to do?",
|
|
68
|
+
choices: [
|
|
69
|
+
{ name: `Send me an ${chalk.green.bold("💬 email")}?`, value: "email" },
|
|
70
|
+
{ name: `Head to my ${chalk.redBright.bold("💳 website")}?`, value: "website" },
|
|
71
|
+
{ name: `View my ${chalk.magentaBright.bold("🎓 resume")}?`, value: "resume" },
|
|
72
|
+
{ name: `Attain my ${chalk.hex("#FFD700").bold("🔑 PGP")} public key?`, value: "pgp" },
|
|
73
|
+
{ name: "Just quit.", value: "quit" },
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
];
|
|
77
|
+
|
|
78
|
+
// Action handler
|
|
79
|
+
const handleAction = async (choice) => {
|
|
80
|
+
switch (choice) {
|
|
81
|
+
case "email":
|
|
82
|
+
await open("mailto:ducmai.network@gmail.com");
|
|
83
|
+
console.log("\nDone, see you soon at inbox.");
|
|
84
|
+
break;
|
|
85
|
+
|
|
86
|
+
case "website":
|
|
87
|
+
await open("https://ducmt.netlify.app/");
|
|
88
|
+
console.log("\nDone, happy browsing!");
|
|
89
|
+
break;
|
|
90
|
+
|
|
91
|
+
case "resume":
|
|
92
|
+
const loader = ora({ text: " Downloading Resume", spinner: cliSpinners.material }).start();
|
|
93
|
+
const resumeUrl = "https://ducmt.netlify.app/resume/MaiTanDuc_Resume.pdf";
|
|
94
|
+
const outputFile = "./MaiTanDuc_Resume.pdf";
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
const pipe = request(resumeUrl).pipe(fs.createWriteStream(outputFile));
|
|
98
|
+
pipe.on("finish", () => {
|
|
99
|
+
const downloadPath = path.join(process.cwd(), "MaiTanDuc_Resume.pdf");
|
|
100
|
+
console.log(`\nResume downloaded at ${downloadPath}`);
|
|
101
|
+
open(downloadPath);
|
|
102
|
+
loader.stop();
|
|
103
|
+
});
|
|
104
|
+
} catch (err) {
|
|
105
|
+
loader.fail("Failed to download resume.");
|
|
106
|
+
console.error(err);
|
|
107
|
+
}
|
|
108
|
+
break;
|
|
109
|
+
|
|
110
|
+
case "pgp":
|
|
111
|
+
console.log("D2F1 F373 9A4E 465E 737C 1F38 F9E9 1488 183E D044");
|
|
112
|
+
break;
|
|
113
|
+
|
|
114
|
+
case "quit":
|
|
115
|
+
console.log("Cheers!");
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Run prompt
|
|
121
|
+
inquirer.prompt(questions).then((answers) => handleAction(answers.action));
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "duc-mt",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "<p align=\"center\"><img src=\"assets/banner.png\" /></p>",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"duc-mt": "card.js"
|
|
9
|
+
},
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/duc-mt/duc-mt.git"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"test": "node card.js",
|
|
16
|
+
"pub": "npm version major & npm publish"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"boxen": "^8.0.1",
|
|
20
|
+
"chalk": "^5.6.2",
|
|
21
|
+
"clear": "^0.1.0",
|
|
22
|
+
"cli-spinners": "^3.4.0",
|
|
23
|
+
"inquirer": "^13.2.5",
|
|
24
|
+
"open": "^11.0.0",
|
|
25
|
+
"ora": "^9.3.0",
|
|
26
|
+
"request": "^2.88.2"
|
|
27
|
+
},
|
|
28
|
+
"keywords": [
|
|
29
|
+
"card",
|
|
30
|
+
"npm",
|
|
31
|
+
"npm card",
|
|
32
|
+
"npx",
|
|
33
|
+
"npx card",
|
|
34
|
+
"business card"
|
|
35
|
+
],
|
|
36
|
+
"author": "Duke Mike <ducmai.network@gmail.com> (https://ducmt.netlify.app/)",
|
|
37
|
+
"license": "ISC"
|
|
38
|
+
}
|