-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcv.py
More file actions
182 lines (150 loc) · 9.59 KB
/
Copy pathcv.py
File metadata and controls
182 lines (150 loc) · 9.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.units import mm
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, HRFlowable, Table, TableStyle
from reportlab.lib.enums import TA_RIGHT
output = "./Mohammed Naser.pdf"
doc = SimpleDocTemplate(
output,
pagesize=A4,
leftMargin=13*mm,
rightMargin=13*mm,
topMargin=8*mm,
bottomMargin=8*mm,
)
W = A4[0] - 26*mm
dark = colors.HexColor("#1a1a1a")
muted = colors.HexColor("#555555")
rule_color = colors.HexColor("#cccccc")
thin_rule = colors.HexColor("#e0e0e0")
link_color = colors.HexColor("#1a56a0")
def style(name, **kw):
base = dict(fontName="Helvetica", fontSize=12, leading=14, textColor=dark, spaceAfter=0, spaceBefore=0)
base.update(kw)
return ParagraphStyle(name, **base)
s_name = style("name", fontSize=18, fontName="Helvetica-Bold", leading=22, spaceAfter=1)
s_sub = style("sub", fontSize=9, textColor=muted, leading=12)
s_contact = style("contact", fontSize=7.5,textColor=muted, leading=10.5)
s_sec = style("sec", fontSize=7.5,fontName="Helvetica-Bold", textColor=muted, leading=10, spaceBefore=4, spaceAfter=1, letterSpacing=0.8)
s_body = style("body", fontSize=8.5,leading=12, textColor=dark)
s_entry = style("entry", fontSize=9, fontName="Helvetica-Bold", leading=11.5)
s_date = style("date", fontSize=8, textColor=muted, leading=11.5, alignment=TA_RIGHT)
s_esub = style("esub", fontSize=8, textColor=muted, leading=10, spaceAfter=1.5)
s_bullet = style("bullet", fontSize=8.5,leading=11.5, leftIndent=9, textColor=dark)
s_skill_l = style("skill_l", fontSize=8, fontName="Helvetica-Bold", textColor=muted, leading=11.5, letterSpacing=0.4)
s_skill_v = style("skill_v", fontSize=8.5,leading=11.5, textColor=dark)
def hr(color=rule_color, thickness=0.6):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=3, spaceBefore=0)
def thin_hr():
return HRFlowable(width="100%", thickness=0.35, color=thin_rule, spaceAfter=2, spaceBefore=0)
def section(title):
return [Paragraph(title.upper(), s_sec), hr()]
def entry_row(title, date, url=None):
t_para = Paragraph(f'<a href="{url}" color="{link_color.hexval()}">{title}</a>', s_entry) if url else Paragraph(title, s_entry)
t = Table([[t_para, Paragraph(date, s_date)]], colWidths=[W*0.75, W*0.25])
t.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),
("LEFTPADDING",(0,0),(-1,-1),0),
("RIGHTPADDING",(0,0),(-1,-1),0),
("TOPPADDING",(0,0),(-1,-1),0),
("BOTTOMPADDING",(0,0),(-1,-1),0.5),
]))
return t
def bullet(text):
return Paragraph(f"• {text}", s_bullet)
def skill_row(label, value):
t = Table([[Paragraph(label.upper(), s_skill_l), Paragraph(value, s_skill_v)]], colWidths=[W*0.22, W*0.78])
t.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),
("LEFTPADDING",(0,0),(-1,-1),0),
("RIGHTPADDING",(0,0),(-1,-1),0),
("TOPPADDING",(0,0),(-1,-1),0.4),
("BOTTOMPADDING",(0,0),(-1,-1),0.4),
]))
return t
def link(url, label):
return f'<a href="{url}" color="{link_color.hexval()}">{label}</a>'
story = []
# ── Header ───────────────────────────────────────────────────────────────
story.append(Paragraph("Mohammed Naser AbdElhamid", s_name))
story.append(Paragraph("Software Engineering", s_sub))
story.append(Spacer(1, 2))
story.append(Paragraph(
f'+20 111 251 5687 | '
f'{link("mailto:MohammedNaser2826@gmail.com","MohammedNaser2826@gmail.com")} | '
f'{link("https://github.com/MohammedNaser28","github.com/MohammedNaser28")} | '
f'{link("https://linkedin.com/in/mohammed-naser-2253a0235","Linkedin")} | '
f'Cairo, Egypt',
s_contact))
story.append(Spacer(1, 3))
story.append(hr(dark, 1.0))
story.append(Spacer(1, 1))
# ── Education ─────────────────────────────────────────────────────────────
story += section("Education")
story.append(entry_row("Bachelor of Science, Computer Science", "2024 – Present"))
story.append(Paragraph("Faculty of Computers and Information · Sophomore · Ain Shams University", s_esub))
story.append(Spacer(1, 1))
# ── Summary ───────────────────────────────────────────────────────────────
story += section("Summary")
story.append(Paragraph(
"Sophomore CS student with practical experience in Linux systems, backend development, and DevOps tooling. "
"Head of the Linux Committee at Open Source Community (OSC) — lead workshops, build community tooling, and contribute to open source. "
"Actively expanding knowledge in embedded systems and CI/CD automation.",
s_body))
story.append(Spacer(1, 2))
# ── Projects ──────────────────────────────────────────────────────────────
story += section("Projects")
story.append(entry_row("osc-linux — Arch Linux Distribution [Team]", "2026", url="https://github.com/Open-Source-Community/distro-linux"))
story.append(Paragraph("Go · Rust · Bash · GitHub Actions · mkarchiso", s_esub))
story.append(bullet("Contributed to a branded Arch Linux distro for an OSC exhibition; worked on the Go/Bubble Tea TUI installer, Rust welcome app, Plymouth animation, and GRUB theme."))
story.append(bullet("Set up GitHub Actions CI/CD to cross-compile Go and Rust binaries before running mkarchiso."))
story.append(Spacer(1, 1.5))
story.append(entry_row("rit — Minimal Git Implementation", "2025", url="https://github.com/MohammedNaser28/rit"))
story.append(Paragraph("Rust · Git internals · SHA-1 hashing", s_esub))
story.append(bullet("Solo project implementing git init and git add with blob object creation and SHA-1 content hashing from scratch."))
story.append(Spacer(1, 1.5))
story.append(entry_row("Recipe Management System [Team Lead]", "2025", url="https://github.com/MohammedNaser28/Structure-Programming-project"))
story.append(Paragraph("C++ · Qt · OOP · Structs · File I/O", s_esub))
story.append(bullet("Led a team to build a desktop recipe manager with Qt; implemented search, sort, and filter functionality over file-persisted recipe records."))
story.append(Spacer(1, 1.5))
story.append(entry_row("Badger — Badge System Web App", "2026", url="https://github.com/MohammedNaser28/badger"))
story.append(Paragraph("Next.js · TypeScript · Discord OAuth2", s_esub))
story.append(bullet("Built a badge management system with Discord OAuth2; resolved TypeScript prop typing issues and optimized the dev environment for memory-constrained machines."))
story.append(Spacer(1, 1.5))
story.append(entry_row("Wiki-Linux — OSC Linux Knowledge Base [Team]", "2026", url="https://open-source-community.github.io/Wiki-Linux/"))
story.append(Paragraph("Markdown · GitHub Pages", s_esub))
story.append(bullet("Contributed to a community Linux reference wiki; organized and reviewed content used by OSC workshops."))
story.append(Spacer(1, 1.5))
story.append(entry_row("Embedded Linux Self-Study Guide", "2026"))
story.append(Paragraph("GCC · Make · CMake · GDB", s_esub))
story.append(bullet("Produced a one-week structured guide covering GCC cross-compilation, Make, CMake, and GDB for the OSC study group."))
story.append(Spacer(1, 2))
# ── Skills ────────────────────────────────────────────────────────────────
story += section("Skills")
story.append(skill_row("Languages", "C, C++, Rust, Bash, Python, TypeScript"))
story.append(thin_hr())
story.append(skill_row("DevOps & CI/CD", "GitHub Actions, Docker, Linux, systemd"))
story.append(thin_hr())
story.append(skill_row("Backend", "REST APIs, OAuth2"))
story.append(thin_hr())
story.append(skill_row("Frontend", "Next.js, React, TypeScript"))
story.append(thin_hr())
story.append(skill_row("Systems", "GCC cross-compilation, Buildroot, BusyBox, U-Boot (fundamentals), Linux kernel basics"))
story.append(thin_hr())
story.append(skill_row("Tools", "Git, Make, CMake, GDB, Arch Linux, Hyprland"))
story.append(Spacer(1, 2))
# ── Leadership ────────────────────────────────────────────────────────────
story += section("Leadership & Involvement")
story.append(entry_row("Head of Linux Committee — OSC (Open Source Community)", "2025 – Present"))
story.append(bullet("Lead the Linux Committee; organized a Linux distribution party, produced distro/CLI cheat sheets, and am designing an 11-session embedded Linux workshop curriculum."))
story.append(Spacer(1, 1.5))
story.append(entry_row("Vice President of PR & Media — RoboTech Community", "2025 – Present"))
story.append(bullet("Manage PR strategy and communication campaigns for a technical robotics-focused student community."))
story.append(Spacer(1, 1.5))
story.append(entry_row("Volunteer — Resala Charity", "Jan 2025 – May 2025"))
story.append(bullet("Attended PR and management sessions; collaborated with the team in weekly idea-generation meetings."))
doc.build(story)
from pypdf import PdfReader
r = PdfReader(output)
print(f"Pages: {len(r.pages)}")