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.
@@ -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
+ [//]: ![](https://github.com/duke-mai/duke-mai/actions/workflows/waka-stats.yml/badge.svg)
4
+ [//]: ![](https://github.com/duke-mai/duke-mai/actions/workflows/latest-blogs.yml/badge.svg)
5
+ [//]: ![](https://github.com/duke-mai/duke-mai/actions/workflows/stackoverflow-activities.yml/badge.svg)
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
+ ![Code Time](http://img.shields.io/badge/Code%20Time-268%20hrs%2058%20mins-blue?style=flat)
54
+
55
+ ![Profile Views](http://img.shields.io/badge/Profile%20Views-1-blue?style=flat)
56
+
57
+ ![Lines of code](https://img.shields.io/badge/From%20Hello%20World%20I%27ve%20Written-9.13%20million%20lines%20of%20code-blue?style=flat)
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
+ }