rawfeed 0.0.1 → 0.1.0
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.
- checksums.yaml +4 -4
- data/LICENSE.txt +21 -0
- data/README.md +153 -1
- data/_data/resume.yml +184 -0
- data/_includes/alert +3 -0
- data/_includes/chart +34 -0
- data/_includes/details +57 -0
- data/_includes/enddetails +2 -0
- data/_includes/endtabs +2 -0
- data/_includes/image +61 -0
- data/_includes/layout/blog_search.html +18 -0
- data/_includes/layout/data.liquid +3 -0
- data/_includes/layout/disqus.html +30 -0
- data/_includes/layout/footer.html +34 -0
- data/_includes/layout/giscus.html +21 -0
- data/_includes/layout/google_analytics.html +11 -0
- data/_includes/layout/head.html +59 -0
- data/_includes/layout/header.html +143 -0
- data/_includes/layout/maintenance.html +30 -0
- data/_includes/layout/paginator.html +35 -0
- data/_includes/socials +22 -0
- data/_includes/tabs +94 -0
- data/_includes/toc +160 -0
- data/_includes/video +10 -0
- data/_layouts/blog.html +46 -0
- data/_layouts/contact.html +285 -0
- data/_layouts/default.html +248 -0
- data/_layouts/error.html +15 -0
- data/_layouts/home.html +58 -0
- data/_layouts/page.html +9 -0
- data/_layouts/post.html +103 -0
- data/_layouts/resume.html +260 -0
- data/_layouts/tag.html +22 -0
- data/_layouts/tag_posts.html +27 -0
- data/_sass/base/_index.scss +63 -0
- data/_sass/base/_reset.scss +10 -0
- data/_sass/base/_typography.scss +0 -0
- data/_sass/components/_badges.scss +24 -0
- data/_sass/components/_button.scss +17 -0
- data/_sass/components/_forms.scss +42 -0
- data/_sass/components/_gifs.scss +5 -0
- data/_sass/components/_index.scss +5 -0
- data/_sass/components/_markdown.scss +453 -0
- data/_sass/includes/_footer.scss +45 -0
- data/_sass/includes/_header.scss +240 -0
- data/_sass/includes/_highlight.scss +87 -0
- data/_sass/includes/_index.scss +9 -0
- data/_sass/includes/_maintenance.scss +16 -0
- data/_sass/includes/_paginator.scss +22 -0
- data/_sass/includes/_rouge-dark.scss +81 -0
- data/_sass/includes/_rouge-light.scss +121 -0
- data/_sass/includes/_terminal.scss +208 -0
- data/_sass/layouts/_blog.scss +96 -0
- data/_sass/layouts/_contact.scss +55 -0
- data/_sass/layouts/_default.scss +14 -0
- data/_sass/layouts/_error.scss +18 -0
- data/_sass/layouts/_home.scss +19 -0
- data/_sass/layouts/_index.scss +10 -0
- data/_sass/layouts/_page.scss +5 -0
- data/_sass/layouts/_post.scss +109 -0
- data/_sass/layouts/_resume.scss +330 -0
- data/_sass/layouts/_tag-posts.scss +48 -0
- data/_sass/layouts/_tag.scss +22 -0
- data/_sass/main.scss +128 -0
- data/_sass/theme/_dark.scss +79 -0
- data/_sass/theme/_index.scss +13 -0
- data/_sass/theme/_light.scss +56 -0
- data/assets/css/style.scss +5 -0
- data/assets/images/avatar_back.png +0 -0
- data/assets/images/avatar_dark.png +0 -0
- data/assets/images/avatar_light.png +0 -0
- data/assets/images/favicon.png +0 -0
- data/assets/js/avatar.js +50 -0
- data/assets/js/blog_search.js +102 -0
- data/assets/js/default.js +148 -0
- data/assets/js/terminal.js +15 -0
- data/assets/js/toc.js +20 -0
- data/assets/json/blog_search.json +16 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.css +4124 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.css +4123 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-grid.rtl.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.css +488 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.css +485 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-reboot.rtl.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.css +4266 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.css +4257 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap-utilities.rtl.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap.css +10878 -0
- data/assets/vendor/bootstrap/css/bootstrap.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap.min.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap.rtl.css +10842 -0
- data/assets/vendor/bootstrap/css/bootstrap.rtl.css.map +1 -0
- data/assets/vendor/bootstrap/css/bootstrap.rtl.min.css +7 -0
- data/assets/vendor/bootstrap/css/bootstrap.rtl.min.css.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.js +7075 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js +7 -0
- data/assets/vendor/bootstrap/js/bootstrap.bundle.min.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.esm.js +5202 -0
- data/assets/vendor/bootstrap/js/bootstrap.esm.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.esm.min.js +7 -0
- data/assets/vendor/bootstrap/js/bootstrap.esm.min.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.js +5249 -0
- data/assets/vendor/bootstrap/js/bootstrap.js.map +1 -0
- data/assets/vendor/bootstrap/js/bootstrap.min.js +7 -0
- data/assets/vendor/bootstrap/js/bootstrap.min.js.map +1 -0
- data/assets/vendor/simple-jekyll-search.js +433 -0
- data/assets/vendor/simple-jekyll-search.min.js +6 -0
- data/lib/rawfeed/draft.rb +31 -0
- data/lib/rawfeed/installer.rb +37 -0
- data/lib/rawfeed/layout.rb +138 -0
- data/lib/rawfeed/page.rb +33 -0
- data/lib/rawfeed/post.rb +60 -0
- data/lib/rawfeed/resume.rb +59 -0
- data/lib/rawfeed/utils.rb +74 -0
- data/lib/rawfeed/version.rb +1 -1
- data/lib/rawfeed.rb +5 -7
- metadata +145 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fffc0bf2ccbe95651efc1a83be2240bf6466265d4395aa4bd52517888f914228
|
|
4
|
+
data.tar.gz: f4f5052baa4748d050e3414ffc381e2cdc2d584e532f4d11401fda43e1acba3d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1e564f7e571f243ffbfcf6ade235b85a2fcb2a17c1813c81aa4c16b741fb8444f12025ae0adf3e874ac7feb4d9558beb5241ddfe186eb05ac1656cb3432f0ce6
|
|
7
|
+
data.tar.gz: 3f45e9f451ea0d0a3e2bb77bfd16572d6f6ee06f5006ed580cd0fd0936a4a9f7d82192dd0f68e7506d2dab6b4227e9e8a6afcbbc39012d4e3157ea79abe3c2a0
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 William C. Canin <william.costa.canin@gmail.com>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
CHANGED
|
@@ -1,2 +1,154 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src=".github/logo.png" alt="Rawfeed" width="150">
|
|
3
|
+
<br>
|
|
4
|
+
<small>Rawfeed — A raw Jekyll theme for minimalists</small>
|
|
5
|
+
<br>
|
|
6
|
+
<a href="https://williamcanin.github.io/rawfeed" target="_blank">Theme Preview</a>
|
|
7
|
+
</p>
|
|
2
8
|
|
|
9
|
+
# Requirements
|
|
10
|
+
|
|
11
|
+
| Required | Version | How to verify | How to install |
|
|
12
|
+
| -------- | ------- | ------------- | --------------------------------- |
|
|
13
|
+
| Git | >= 2 | `git -v` | [Git](http://git-scm.com/) |
|
|
14
|
+
| Ruby | >= 3.0 | `ruby -v` | [Ruby](https://www.ruby-lang.org) |
|
|
15
|
+
| Gem | >= 3.0 | `gem -v` | **Ruby** contains **Gem** |
|
|
16
|
+
| Bundler | >= 2.0 | `bundler -v` | `gem install bundler` |
|
|
17
|
+
| NodeJs | >= 20 | `node -v` | [NodeJS](https://nodejs.org) |
|
|
18
|
+
| Npm | >= 9 | `npm -v` | **NodeJS** contains **Npm** |
|
|
19
|
+
|
|
20
|
+
# Features
|
|
21
|
+
|
|
22
|
+
- [x] One-command installation (via Unix|PowerShell);
|
|
23
|
+
- [x] A terminal emulator on the home page with commands;
|
|
24
|
+
- [x] Commands for manipulating page headers, posts and drafts in markdown;
|
|
25
|
+
- [x] Smart floating TOC in posts;
|
|
26
|
+
- [x] Theme change: light/dark;
|
|
27
|
+
- [x] Chart in posts;
|
|
28
|
+
- [x] Stylized Markdown;
|
|
29
|
+
- [x] Avatar opens in modal with inversion animation for each different theme (light/dark);
|
|
30
|
+
- [x] Enables and Disables weblog;
|
|
31
|
+
- [x] Home page with about or blog, you decide with one command;
|
|
32
|
+
- [x] A quick search field on the weblog using keyword and date;
|
|
33
|
+
- [x] Weblog pagination;
|
|
34
|
+
- [x] YouTube video in weblog posts;
|
|
35
|
+
- [x] Social network link on the home page or by command in the terminal;
|
|
36
|
+
- [x] Feed in weblog;
|
|
37
|
+
- [x] SEO-rich website;
|
|
38
|
+
- [x] Entire site minified in build: html, images, css and javascript.
|
|
39
|
+
- [x] Maintenance page;
|
|
40
|
+
- [x] Comments on blog posts with Giscus or Disqus (only in production [jekyll build]);
|
|
41
|
+
- [x] Google Analytics (only in production [jekyll build]);
|
|
42
|
+
|
|
43
|
+
# Installation
|
|
44
|
+
|
|
45
|
+
In the terminal/Command Prompt, run the commands below according to the OS.
|
|
46
|
+
|
|
47
|
+
**Unix:**
|
|
48
|
+
|
|
49
|
+
```shell
|
|
50
|
+
curl -fsSL https://williamcanin.github.io/install/rawfeed | sh
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Windows:**
|
|
54
|
+
|
|
55
|
+
```shell
|
|
56
|
+
iwr -useb https://williamcanin.github.io/install/rawfeed | iex
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
# Usage
|
|
60
|
+
|
|
61
|
+
**(1)** - Install dependencies:
|
|
62
|
+
|
|
63
|
+
```shell
|
|
64
|
+
npm install
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**(2)** - For **rawfeed** manipulation commands, use:
|
|
68
|
+
|
|
69
|
+
```shell
|
|
70
|
+
npm run help
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
# Settings
|
|
74
|
+
|
|
75
|
+
## Avatar
|
|
76
|
+
|
|
77
|
+
**(1)** - Create the folder directory: `assets/images`.
|
|
78
|
+
|
|
79
|
+
**(2)** - Place your website's images (.jpg|.png) inside this `assets/images` directory.
|
|
80
|
+
|
|
81
|
+
> Recommendation: Use a 4x4 image.
|
|
82
|
+
|
|
83
|
+
**(3)** - In the `_config.yml` file, in the `section: [avatar]`, change the value of "`avatar.image`"
|
|
84
|
+
to the name of your images. For example:
|
|
85
|
+
|
|
86
|
+
```yml
|
|
87
|
+
avatar:
|
|
88
|
+
open: true
|
|
89
|
+
flip: true
|
|
90
|
+
# note: the image (.jpg|.png) will be searched in the directory: assets/images/
|
|
91
|
+
image:
|
|
92
|
+
front:
|
|
93
|
+
light: your_image_light.png
|
|
94
|
+
dark: your_image_dark.png
|
|
95
|
+
back: your_image_back.png
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Posts
|
|
99
|
+
|
|
100
|
+
Creating a blog post is very easy, first you create a draft (`npm run draft`) and after you finish
|
|
101
|
+
the draft, you move it to the post with the command `npm run posts`.
|
|
102
|
+
|
|
103
|
+
> Note: If you start the server (`npm run serve`), drafts will appear in posts, but they will not
|
|
104
|
+
go into production mode (`npm run build`).
|
|
105
|
+
|
|
106
|
+
**Comments:**
|
|
107
|
+
|
|
108
|
+
Post comments use [Giscus](https://giscus.app) or [Disqus](https://disqus.com),
|
|
109
|
+
configurable in the `_config.yml` file under `section: [blog]`. Whichever one you choose,
|
|
110
|
+
you must set the appropriate settings in the `_config.yml` file under `section: [blog]`, and
|
|
111
|
+
each post must have `comments: true` set.
|
|
112
|
+
|
|
113
|
+
To learn more about both, such as how to set them up, visit [Giscus](https://giscus.app) or
|
|
114
|
+
[Disqus](https://disqus.com).
|
|
115
|
+
|
|
116
|
+
# For developer
|
|
117
|
+
|
|
118
|
+
**Clone and install:**
|
|
119
|
+
|
|
120
|
+
```shell
|
|
121
|
+
git clone https://github.com/williamcanin/rawfeed.git; cd rawfeed; npm install
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
**Manage gem:**
|
|
125
|
+
|
|
126
|
+
**(1)** - Compile the gem:
|
|
127
|
+
|
|
128
|
+
```shell
|
|
129
|
+
npm run gem
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**(2)** - Publish the gem:
|
|
133
|
+
|
|
134
|
+
```shell
|
|
135
|
+
npm run publish
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
For more tasks, see: `bundle exec rake --tasks`
|
|
139
|
+
|
|
140
|
+
## Donation
|
|
141
|
+
|
|
142
|
+
Click on the image below to be redirected the donation forms:
|
|
143
|
+
|
|
144
|
+
<div class="donate">
|
|
145
|
+
<a href="https://github.com/williamcanin/donations/blob/main/README.md">
|
|
146
|
+
<img width="160" height="100" src="https://raw.githubusercontent.com/williamcanin/donations/main/svg/donate/donate-hand.svg" alt="Donations"/>
|
|
147
|
+
</a>
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
See the list of our [CONTRIBUTORS](CONTRIBUTING.md).
|
|
151
|
+
|
|
152
|
+
# License
|
|
153
|
+
|
|
154
|
+
The theme is available as open source under the terms of [this License](https://github.com/williamcanin/rawfeed/blob/dev/LICENSE.txt).
|
data/_data/resume.yml
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# --------------------------------------------------------------------------------------------------
|
|
2
|
+
# Note: Two pages is acceptable for experienced professionals. Stick to the one-page rule if you
|
|
3
|
+
# have less than 10 years of experience, or two pages if you're senior/academic.
|
|
4
|
+
# Do not put exaggerated information.
|
|
5
|
+
# --------------------------------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
# section: [Full name]
|
|
8
|
+
full_name: John A. Doe
|
|
9
|
+
|
|
10
|
+
# section: [Photo]
|
|
11
|
+
photo:
|
|
12
|
+
space: false
|
|
13
|
+
|
|
14
|
+
# section: [Buttons]
|
|
15
|
+
buttons:
|
|
16
|
+
print:
|
|
17
|
+
enable: true
|
|
18
|
+
text: print
|
|
19
|
+
|
|
20
|
+
# ---------------------------------------- SIDEBAR -------------------------------------------------
|
|
21
|
+
sidebar:
|
|
22
|
+
# section: [Contact]
|
|
23
|
+
contact:
|
|
24
|
+
enable: true
|
|
25
|
+
caption: Contact
|
|
26
|
+
items:
|
|
27
|
+
- key: Email
|
|
28
|
+
value: contact@johndoe.com
|
|
29
|
+
link: #
|
|
30
|
+
- key: Site
|
|
31
|
+
value: johndoe.com
|
|
32
|
+
link: https://github.com/williamcanin/rawfeed
|
|
33
|
+
- key: Phone
|
|
34
|
+
value: +1 9 99999-9999
|
|
35
|
+
link: #
|
|
36
|
+
- key: GitHub
|
|
37
|
+
value: "@rawfeed"
|
|
38
|
+
link: https://github.com/williamcanin/rawfeed
|
|
39
|
+
|
|
40
|
+
# section: [Personal Details]
|
|
41
|
+
# IMPORTANT!!!: "Personal details" are sensitive data. For security reasons, enable it ONLY if
|
|
42
|
+
# you're printing it; never leave it exposed online.
|
|
43
|
+
personal_details:
|
|
44
|
+
enable: false
|
|
45
|
+
caption: Personal Details
|
|
46
|
+
items:
|
|
47
|
+
- title: DOB
|
|
48
|
+
value: 1901/01/01
|
|
49
|
+
- title: City
|
|
50
|
+
value: Boston
|
|
51
|
+
- title: State
|
|
52
|
+
value: Massachusetts
|
|
53
|
+
- title: Nationality
|
|
54
|
+
value: American
|
|
55
|
+
- title:
|
|
56
|
+
value: Valid Driver's License
|
|
57
|
+
|
|
58
|
+
# section: [Languages]
|
|
59
|
+
languages:
|
|
60
|
+
enable: true
|
|
61
|
+
caption: Languages
|
|
62
|
+
names:
|
|
63
|
+
- value: English
|
|
64
|
+
- value: Portuguese
|
|
65
|
+
- value: Spanish
|
|
66
|
+
|
|
67
|
+
# section: [Education]
|
|
68
|
+
education:
|
|
69
|
+
enable: true
|
|
70
|
+
caption: Education
|
|
71
|
+
section:
|
|
72
|
+
- degree: MSc in Informatics
|
|
73
|
+
time: 2014-2016
|
|
74
|
+
university: Ionian University
|
|
75
|
+
link: https://github.com/williamcanin/rawfeed
|
|
76
|
+
|
|
77
|
+
- degree: BSc in Computer Science
|
|
78
|
+
time: 2010-2014
|
|
79
|
+
university: XYZ University
|
|
80
|
+
link: #
|
|
81
|
+
|
|
82
|
+
# section: [Skills]
|
|
83
|
+
skills:
|
|
84
|
+
enable: true
|
|
85
|
+
caption: Skills
|
|
86
|
+
section:
|
|
87
|
+
- group: OS
|
|
88
|
+
tools: [Linux, Windows]
|
|
89
|
+
- group: Programming
|
|
90
|
+
tools: [C, Rust, Python, Javascript]
|
|
91
|
+
- group: Frameworks
|
|
92
|
+
tools: [React, Node.js]
|
|
93
|
+
- group: DevOps
|
|
94
|
+
tools: [Docker, Kubernetes]
|
|
95
|
+
- group: Others
|
|
96
|
+
tools: [Git, AWS]
|
|
97
|
+
|
|
98
|
+
# ---------------------------------------- BODY ----------------------------------------------------
|
|
99
|
+
body:
|
|
100
|
+
# section: [Sumary]
|
|
101
|
+
# Note: The "Sumary" should be a concise paragraph (3-4 lines) that presents your profile,
|
|
102
|
+
# your main expertise, and your greatest impact. It is your initial "advertisement."
|
|
103
|
+
sumary:
|
|
104
|
+
enable: true
|
|
105
|
+
caption: Sumary
|
|
106
|
+
content: |
|
|
107
|
+
Senior Software Engineer and Researcher with **8 years of experience** in the full systems
|
|
108
|
+
development lifecycle. Proficient in high-performance languages (**Rust**, **C++**, **Python**) and
|
|
109
|
+
front-end frameworks (**React**). Focused on systems optimization, having **reduced latency by
|
|
110
|
+
20%** in new modules and worked in applied research at Microsoft.
|
|
111
|
+
|
|
112
|
+
# section: [Experience]
|
|
113
|
+
# Always start the bullet point with a past tense verb.
|
|
114
|
+
experience:
|
|
115
|
+
enable: true
|
|
116
|
+
caption: Experience
|
|
117
|
+
section:
|
|
118
|
+
- role: Software Engineer
|
|
119
|
+
description: Backend Optimization & Infrastructure
|
|
120
|
+
company: Google
|
|
121
|
+
link: https://about.google
|
|
122
|
+
time: 2020-Present
|
|
123
|
+
details: |
|
|
124
|
+
- I developed and launched **Module X**, reducing **latency by 20%** on the backend and
|
|
125
|
+
increasing **user satisfaction (KPIs)**.
|
|
126
|
+
- I improved the **CI/CD pipeline** for **Go** and **C++** by integrating **Kubernetes**
|
|
127
|
+
and **Docker**, speeding up deployments by **15%**.
|
|
128
|
+
- I led the migration of **legacy microservices** to **TypeScript** and **Angular**,
|
|
129
|
+
resulting in a more scalable and maintainable architecture.
|
|
130
|
+
|
|
131
|
+
- role: Researcher
|
|
132
|
+
description:
|
|
133
|
+
company: Microsoft
|
|
134
|
+
link: https://microsoft.com
|
|
135
|
+
time: 2016-2020
|
|
136
|
+
details: |
|
|
137
|
+
- I conducted research and development of **algorithm Y** (using **Python** and **TensorFlow**),
|
|
138
|
+
reducing the error **rate by 10%** compared to the previous solution.
|
|
139
|
+
- I have published two conference papers on **Machine Learning** models, contributing to the
|
|
140
|
+
advancement of the field of Natural Language Processing (NLP).
|
|
141
|
+
- I collaborated with engineering teams to deploy **Keras** and **Matlab** models in production
|
|
142
|
+
environments, impacting **millions of platform** users.
|
|
143
|
+
|
|
144
|
+
# section: [Publications]
|
|
145
|
+
# Full links will only appear in print mode. Online and PDF modes are clickable.
|
|
146
|
+
publications:
|
|
147
|
+
enable: true
|
|
148
|
+
caption: Publications
|
|
149
|
+
section:
|
|
150
|
+
- title: Presentation of the functionality of F47X1 chip
|
|
151
|
+
link: https://github.com/williamcanin/rawfeed
|
|
152
|
+
authors: John A. Doe, Jane Doe
|
|
153
|
+
conference: Conference Tech Central Park, 2016
|
|
154
|
+
|
|
155
|
+
# section: [Projects]
|
|
156
|
+
# Full links will only appear in print mode. Online and PDF modes are clickable.
|
|
157
|
+
projects:
|
|
158
|
+
enable: true
|
|
159
|
+
caption: Projects
|
|
160
|
+
section:
|
|
161
|
+
- title: Support for the F47X1 chip in the Linux kernel
|
|
162
|
+
link: https://github.com/williamcanin/rawfeed
|
|
163
|
+
details: |
|
|
164
|
+
- I implemented the F47X1 chip to recognize macOS applications with plug-play on USB 3.1
|
|
165
|
+
|
|
166
|
+
- title: Facial Functionality Tool in Gemini
|
|
167
|
+
link: #
|
|
168
|
+
details: |
|
|
169
|
+
- Together with a group of 4 people, **I conducted** research on the new version of **Gemini** in
|
|
170
|
+
Gemini's facial recognition on mobile.
|
|
171
|
+
|
|
172
|
+
# section: [Volunteering]
|
|
173
|
+
# Full links will only appear in print mode. Online and PDF modes are clickable.
|
|
174
|
+
volunteering:
|
|
175
|
+
enable: true
|
|
176
|
+
caption: Volunteering
|
|
177
|
+
section:
|
|
178
|
+
- role: AI Professor
|
|
179
|
+
company: Seeds of Tomorrow Engineering School
|
|
180
|
+
link: https://github.com/williamcanin/rawfeed
|
|
181
|
+
time: 2020-2022
|
|
182
|
+
details: |
|
|
183
|
+
- I led a class of **Computer Engineering** students in the modern **AI course**.
|
|
184
|
+
It was over **170 hours** of classes.
|
data/_includes/alert
ADDED
data/_includes/chart
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<canvas class="chart" id="chart-{{ include.label | slugify }}"> </canvas>
|
|
2
|
+
|
|
3
|
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
4
|
+
<script>
|
|
5
|
+
document.addEventListener("DOMContentLoaded", function () {
|
|
6
|
+
const ctx = document.getElementById("chart-{{ include.label | slugify }}");
|
|
7
|
+
if (!ctx) return;
|
|
8
|
+
new Chart(ctx, {
|
|
9
|
+
type: "{{ include.type | default: 'line' }}",
|
|
10
|
+
data: {
|
|
11
|
+
labels: "{{ include.labels }}".split(","),
|
|
12
|
+
datasets: [{
|
|
13
|
+
label: "{{ include.label | default: 'Dataset' }}",
|
|
14
|
+
data: "{{ include.data }}".split(",").map(Number),
|
|
15
|
+
borderColor: "{{ include.color | default: '#00bfff' }}",
|
|
16
|
+
backgroundColor: "{{ include.color | default: '#00bfff' }}33",
|
|
17
|
+
fill: true,
|
|
18
|
+
tension: 0.3,
|
|
19
|
+
borderWidth: 2,
|
|
20
|
+
pointRadius: 4,
|
|
21
|
+
pointHoverRadius: 6
|
|
22
|
+
}]
|
|
23
|
+
},
|
|
24
|
+
options: {
|
|
25
|
+
responsive: true,
|
|
26
|
+
plugins: { legend: { display: true, labels: { color: '#444444' } } },
|
|
27
|
+
scales: {
|
|
28
|
+
x: { ticks: { color: '#131313' }, grid: { color: '#111111' } },
|
|
29
|
+
y: { ticks: { color: '#131313' }, grid: { color: '#111111' } }
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
</script>
|
data/_includes/details
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<div class="details-start" data-summary="{{ include.summary | escape }}"></div>
|
|
2
|
+
|
|
3
|
+
<script>
|
|
4
|
+
(function(){
|
|
5
|
+
if (window.__jekyll_details_setup) return;
|
|
6
|
+
window.__jekyll_details_setup = true;
|
|
7
|
+
|
|
8
|
+
function initDetails(){
|
|
9
|
+
const starts = document.querySelectorAll('.details-start');
|
|
10
|
+
starts.forEach(start => {
|
|
11
|
+
const summary = start.getAttribute('data-summary') || 'Detalhes';
|
|
12
|
+
|
|
13
|
+
let end = start.nextSibling;
|
|
14
|
+
while(end && !(end.nodeType === 1 && end.classList.contains('details-end'))){
|
|
15
|
+
end = end.nextSibling;
|
|
16
|
+
}
|
|
17
|
+
if(!end) return;
|
|
18
|
+
|
|
19
|
+
let node = start.nextSibling;
|
|
20
|
+
const content = [];
|
|
21
|
+
while(node && node !== end){
|
|
22
|
+
const next = node.nextSibling;
|
|
23
|
+
if(node.nodeType === Node.ELEMENT_NODE || (node.nodeType === Node.TEXT_NODE && node.textContent.trim())){
|
|
24
|
+
content.push(node.cloneNode(true));
|
|
25
|
+
}
|
|
26
|
+
node = next;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const details = document.createElement('details');
|
|
30
|
+
const sum = document.createElement('summary');
|
|
31
|
+
sum.textContent = summary;
|
|
32
|
+
details.appendChild(sum);
|
|
33
|
+
|
|
34
|
+
const wrapper = document.createElement('div');
|
|
35
|
+
wrapper.className = 'details-content-wrapper';
|
|
36
|
+
|
|
37
|
+
content.forEach(el => wrapper.appendChild(el));
|
|
38
|
+
|
|
39
|
+
details.appendChild(wrapper);
|
|
40
|
+
|
|
41
|
+
start.parentNode.insertBefore(details, start);
|
|
42
|
+
let cur = start;
|
|
43
|
+
while(cur){
|
|
44
|
+
const next = cur.nextSibling;
|
|
45
|
+
cur.remove();
|
|
46
|
+
if(cur === end) break;
|
|
47
|
+
cur = next;
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if(document.readyState === 'loading')
|
|
53
|
+
document.addEventListener('DOMContentLoaded', initDetails);
|
|
54
|
+
else
|
|
55
|
+
initDetails();
|
|
56
|
+
})();
|
|
57
|
+
</script>
|
data/_includes/endtabs
ADDED
data/_includes/image
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{%- assign right_style = "float: right; margin-left: 10px;" -%}
|
|
2
|
+
{%- assign left_style = "float: left; margin-right: 10px;" -%}
|
|
3
|
+
{%- assign bottom_style = "margin-bottom: 15px;" -%}
|
|
4
|
+
|
|
5
|
+
{%- assign w = include.width | default: "" -%}
|
|
6
|
+
{%- if w != "" -%}
|
|
7
|
+
{%- if w contains '%' -%}
|
|
8
|
+
{%- assign wrapper_width = w -%}
|
|
9
|
+
{%- elsif w contains 'px' -%}
|
|
10
|
+
{%- assign wrapper_width = w -%}
|
|
11
|
+
{%- else -%}
|
|
12
|
+
{%- assign wrapper_width = w | append: 'px' -%}
|
|
13
|
+
{%- endif -%}
|
|
14
|
+
{%- else -%}
|
|
15
|
+
{%- assign wrapper_width = 'auto' -%}
|
|
16
|
+
{%- endif -%}
|
|
17
|
+
|
|
18
|
+
{%- if include.align == "center" -%}
|
|
19
|
+
<figure class="img-include-wrapper img-include-align-center" style="width: {{ wrapper_width }};">
|
|
20
|
+
<img
|
|
21
|
+
src="{{ include.src }}"
|
|
22
|
+
alt="{{ include.title | default: include.caption | escape }}"
|
|
23
|
+
style="display:block; width:100%; height: {{ include.height | default: 'auto' }}; border-radius: {{ include.border-radius | default: 0 }}px; border: 2px solid {{ include.border-color | default: '#ddd' }};" />
|
|
24
|
+
{%- if include.caption -%}
|
|
25
|
+
<figcaption class="img-include-caption">{{ include.caption }}</figcaption>
|
|
26
|
+
{%- endif -%}
|
|
27
|
+
</figure>
|
|
28
|
+
|
|
29
|
+
{%- elsif include.align == "right" -%}
|
|
30
|
+
<figure class="img-include-wrapper img-include-align-right" style="{{ right_style }} width: {{ wrapper_width }};">
|
|
31
|
+
<img
|
|
32
|
+
src="{{ include.src }}"
|
|
33
|
+
alt="{{ include.title | default: include.caption | escape }}"
|
|
34
|
+
style="display:block; width:100%; height: {{ include.height | default: 'auto' }}; border-radius: {{ include.border-radius | default: 0 }}px; border: 2px solid {{ include.border-color | default: '#ddd' }};" />
|
|
35
|
+
{%- if include.caption -%}
|
|
36
|
+
<figcaption class="img-include-caption">{{ include.caption }}</figcaption>
|
|
37
|
+
{%- endif -%}
|
|
38
|
+
</figure>
|
|
39
|
+
|
|
40
|
+
{%- elsif include.align == "left" -%}
|
|
41
|
+
<figure class="img-include-wrapper img-include-align-left" style="{{ left_style }} width: {{ wrapper_width }};">
|
|
42
|
+
<img
|
|
43
|
+
src="{{ include.src }}"
|
|
44
|
+
alt="{{ include.title | default: include.caption | escape }}"
|
|
45
|
+
style="display:block; width:100%; height: {{ include.height | default: 'auto' }}; border-radius: {{ include.border-radius | default: 0 }}px; border: 2px solid {{ include.border-color | default: '#ddd' }};" />
|
|
46
|
+
{%- if include.caption -%}
|
|
47
|
+
<figcaption class="img-include-caption">{{ include.caption }}</figcaption>
|
|
48
|
+
{%- endif -%}
|
|
49
|
+
</figure>
|
|
50
|
+
|
|
51
|
+
{%- else -%}
|
|
52
|
+
<figure class="img-include-wrapper" style="width: {{ wrapper_width }};">
|
|
53
|
+
<img
|
|
54
|
+
src="{{ include.src }}"
|
|
55
|
+
alt="{{ include.title | default: include.caption | escape }}"
|
|
56
|
+
style="display:block; width:100%; height: {{ include.height | default: 'auto' }}; border-radius: {{ include.border-radius | default: 0 }}px; border: 2px solid {{ include.border-color | default: '#ddd' }};" />
|
|
57
|
+
{%- if include.caption -%}
|
|
58
|
+
<figcaption class="img-include-caption">{{ include.caption }}</figcaption>
|
|
59
|
+
{%- endif -%}
|
|
60
|
+
</figure>
|
|
61
|
+
{%- endif -%}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{%- if site.blog.search.enable -%}
|
|
2
|
+
<div class="row blog-search" aria-hidden="true">
|
|
3
|
+
<div class="col-sm">
|
|
4
|
+
<div class="blog-search__wapper">
|
|
5
|
+
<strong>»</strong><input id="blog-search__input" type="text" class="blog-search__input" placeholder="{{ site.text.blog.search.placeholder }}" aria-label="{{ site.blog.search.placeholder }}">
|
|
6
|
+
<button id="blog-search__btn-clean" class="blog-search__btn-clean" type="button">
|
|
7
|
+
{{ site.text.blog.search.button_clean.text }}
|
|
8
|
+
</button>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div id="blog-search__results-wrapper" class="row disabled">
|
|
13
|
+
<h2 class="blog-subtitle">[ {{ site.text.blog.search.results | default: "results" }} ]</h2>
|
|
14
|
+
<ul id="blog-search__results" class="row blog-list"></ul>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
</div>
|
|
18
|
+
{%- endif -%}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{% if site.blog.post.comments.disqus.shortname != "" %}
|
|
2
|
+
<div class="row comments">
|
|
3
|
+
<h1 class="comments-title">[ {{ site.text.post.comments | default: "comments" }} ]</h1>
|
|
4
|
+
<div class="comments-content">
|
|
5
|
+
<div id="disqus_thread"></div>
|
|
6
|
+
<script>
|
|
7
|
+
/**
|
|
8
|
+
* RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES
|
|
9
|
+
*/
|
|
10
|
+
var disqus_shortname = '{{ site.blog.post.comments.disqus.shortname }}';
|
|
11
|
+
|
|
12
|
+
// The unique URL for the discussion, usually the post's permalink.
|
|
13
|
+
var disqus_config = function () {
|
|
14
|
+
this.page.url = '{{ page.url | absolute_url }}'; // Replace with your full permalink
|
|
15
|
+
this.page.identifier = '{{ page.id }}'; // Unique ID for the discussion, use page.id or page.url
|
|
16
|
+
this.page.disable_ads = true; // disabled ads
|
|
17
|
+
this.page.recommendations = false; // disabled recommendations
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
(function() {
|
|
21
|
+
var d = document, s = d.createElement('script');
|
|
22
|
+
s.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
|
23
|
+
s.setAttribute('data-timestamp', +new Date());
|
|
24
|
+
(d.head || d.body).appendChild(s);
|
|
25
|
+
})();
|
|
26
|
+
</script>
|
|
27
|
+
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" rel="nofollow">comments powered by Disqus.</a></noscript>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
{% endif %}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{%- include layout/data.liquid -%}
|
|
2
|
+
|
|
3
|
+
<footer class="container-fluid fixed-bottom footer">
|
|
4
|
+
{%- if site.footer.top_button.enable -%}
|
|
5
|
+
<div class="row top">
|
|
6
|
+
<div class="col-sm d-flex justify-content-end">
|
|
7
|
+
<!-- old: <a id="top-link" class="top-link" href="#top"><i class="fa-regular fa-square-caret-up"></i></a> -->
|
|
8
|
+
<a id="top-link" class="top-link" href="#top">^</a>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
{%- endif -%}
|
|
12
|
+
|
|
13
|
+
<div class="row footer-wrapper">
|
|
14
|
+
|
|
15
|
+
{%- if site.text.footer.copyright -%}
|
|
16
|
+
<div class="col-sm">
|
|
17
|
+
<div class="footer-copyright">{{ site.title | default: theme_name }} {{ site.text.footer.copyright }}</div>
|
|
18
|
+
</div>
|
|
19
|
+
{%- endif -%}
|
|
20
|
+
|
|
21
|
+
{%- if site.text.footer.message -%}
|
|
22
|
+
<div class="col-sm">
|
|
23
|
+
<div class="footer-message">{{ site.text.footer.message }}</div>
|
|
24
|
+
</div>
|
|
25
|
+
{%- endif -%}
|
|
26
|
+
|
|
27
|
+
<div class="col-sm">
|
|
28
|
+
<div class="footer-made-by">
|
|
29
|
+
Using the <a href="{{ project_url }}" target="_blank" rel="noopener noreferrer">{{ theme_name }}</a> theme for <a href="https://jekyllrb.com" target="_blank" rel="noopener noreferrer">Jekyll</a>.
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
|
|
33
|
+
</div>
|
|
34
|
+
</footer>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{%- if site.blog.post.comments.giscus.repo != "" and site.blog.post.comments.giscus.category_id != "" -%}
|
|
2
|
+
<div class="row comments">
|
|
3
|
+
<h1 class="comments-title">[ {{ site.text.post.comments | default: "comments" }} ]</h1>
|
|
4
|
+
<div class="row comments-content">
|
|
5
|
+
<script src="https://giscus.app/client.js"
|
|
6
|
+
data-repo="{{ site.blog.post.comments.giscus.repo }}"
|
|
7
|
+
data-repo-id="{{ site.blog.post.comments.giscus.repo_id }}"
|
|
8
|
+
data-category-id="{{ site.blog.post.comments.giscus.category_id }}"
|
|
9
|
+
data-mapping="{{ site.blog.post.comments.giscus.mapping | default: 'pathname' }}"
|
|
10
|
+
data-strict="0"
|
|
11
|
+
data-reactions-enabled="{{ site.blog.post.comments.giscus.reactions_enabled | default: 1 }}"
|
|
12
|
+
data-emit-metadata="0"
|
|
13
|
+
data-input-position="bottom"
|
|
14
|
+
data-theme="{{ site.blog.post.comments.giscus.theme_light | default: 'light' }}"
|
|
15
|
+
data-lang="{{ site.blog.post.comments.giscus.lang | default: 'en' }}"
|
|
16
|
+
crossorigin="anonymous"
|
|
17
|
+
async>
|
|
18
|
+
</script>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
{%- endif -%}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
|
|
3
|
+
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
|
4
|
+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
|
5
|
+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
|
6
|
+
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
|
|
7
|
+
|
|
8
|
+
ga('create', '{{ site.google.analytics.id }}', 'auto');
|
|
9
|
+
ga('send', 'pageview');
|
|
10
|
+
}
|
|
11
|
+
</script>
|