├── .gitignore
├── .nojekyll
├── 404.qmd
├── _extensions
├── mcanouil
│ └── iconify
│ │ ├── LICENSE
│ │ ├── _extension.yml
│ │ ├── iconify-icon.min.js
│ │ └── iconify.lua
├── quarto-ext
│ └── fontawesome
│ │ ├── _extension.yml
│ │ ├── assets
│ │ ├── css
│ │ │ ├── all.css
│ │ │ └── latex-fontsize.css
│ │ └── webfonts
│ │ │ ├── fa-brands-400.ttf
│ │ │ ├── fa-brands-400.woff2
│ │ │ ├── fa-regular-400.ttf
│ │ │ ├── fa-regular-400.woff2
│ │ │ ├── fa-solid-900.ttf
│ │ │ ├── fa-solid-900.woff2
│ │ │ ├── fa-v4compatibility.ttf
│ │ │ └── fa-v4compatibility.woff2
│ │ └── fontawesome.lua
└── sellorm
│ └── social-embeds
│ ├── _extension.yml
│ ├── gists.lua
│ ├── loom.lua
│ ├── mastodon.lua
│ ├── twitter.lua
│ ├── vimeo.lua
│ └── youtube.lua
├── _freeze
├── blog
│ ├── 4-realizations-from-atomic-habits
│ │ └── index
│ │ │ ├── execute-results
│ │ │ └── html.json
│ │ │ └── figure-html
│ │ │ └── unnamed-chunk-1-1.png
│ ├── emnist-manual-loading
│ │ └── index
│ │ │ └── execute-results
│ │ │ └── html.json
│ ├── functional-programming-r-basics
│ │ └── index
│ │ │ └── execute-results
│ │ │ └── html.json
│ ├── ggsimplex-prerelease
│ │ └── index
│ │ │ ├── execute-results
│ │ │ └── html.json
│ │ │ └── figure-html
│ │ │ ├── unnamed-chunk-10-1.png
│ │ │ ├── unnamed-chunk-12-1.png
│ │ │ ├── unnamed-chunk-3-1.png
│ │ │ ├── unnamed-chunk-5-1.png
│ │ │ ├── unnamed-chunk-7-1.png
│ │ │ └── unnamed-chunk-8-1.png
│ └── outlines-r
│ │ └── index
│ │ └── execute-results
│ │ └── html.json
├── cv
│ └── index
│ │ └── execute-results
│ │ └── html.json
└── site_libs
│ ├── clipboard
│ └── clipboard.min.js
│ ├── cookie-consent
│ ├── cookie-consent.css
│ └── cookie-consent.js
│ └── quarto-listing
│ ├── list.min.js
│ └── quarto-listing.js
├── _quarto.yml
├── _redirects
├── assets
├── meta_uncertainty_poster_aistats.pdf
├── poster_bayescomp_mms.pdf
├── sc_abi_poster_ICML.pdf
└── support_button.png
├── blog
├── 4-realizations-from-atomic-habits
│ ├── atomic_habits_thumbnail_new.png
│ ├── atomic_habits_twitter_card.png
│ └── index.qmd
├── _footer.qmd
├── _metadata.yml
├── agile-methods-for-academia
│ ├── agile-academia-thumbnail.png
│ └── index.qmd
├── emnist-manual-loading
│ ├── emnist-manual-loading-thumbnail.png
│ └── index.qmd
├── functional-programming-r-basics
│ ├── function_as_argument_apply.png
│ ├── index.qmd
│ └── thumbnail.png
├── ggsimplex-prerelease
│ ├── figures
│ │ ├── ggsimplex-hexsticker-thumbnail.png
│ │ ├── ggsimplex-hexsticker.png
│ │ └── illustration_simplices.png
│ └── index.qmd
├── hello-world
│ ├── hello-world-bg.jpg
│ ├── hello-world-thumbnail.png
│ └── index.qmd
├── index.qmd
├── laptop-mic-obs
│ ├── index.qmd
│ └── thumbnail.png
├── mac-email-shortcut
│ ├── img
│ │ ├── email_shortcut.gif
│ │ ├── email_shortcut.mov
│ │ ├── screenshot_1.png
│ │ ├── screenshot_2.png
│ │ ├── screenshot_3.png
│ │ └── screenshot_4.png
│ ├── index.qmd
│ └── mac_email_thumbnail_new.png
├── outlines-r
│ ├── index.qmd
│ └── outlines-r-thumbnail.png
├── scientists-should-have-a-website
│ ├── index.ipynb
│ ├── index.qmd
│ ├── quarto-tutorial-screenshot.png
│ └── thumbnail.png
├── website-tutorial-quarto
│ ├── custom_styles.css
│ ├── index.qmd
│ ├── opengraph_thumbnail.png
│ ├── screenshots
│ │ ├── screenshot_github_pages_settings.png
│ │ ├── screenshot_github_repo.png
│ │ ├── screenshot_rstudio_build_tab.png
│ │ ├── website_template_screenshot_1.png
│ │ ├── website_template_screenshot_2.png
│ │ ├── website_template_screenshot_3.png
│ │ ├── website_template_screenshot_4.png
│ │ └── website_url_meme.jpeg
│ └── website-tutorial-thumbnail.png
└── youtube-channel
│ ├── index.qmd
│ └── youtube-channel-thumbnail.jpeg
├── cv
├── CV_Marvin_Schmitt.pdf
└── index.qmd
├── docs
├── .nojekyll
├── 404.html
├── _extensions
│ └── quarto-ext
│ │ └── fontawesome
│ │ └── assets
│ │ ├── css
│ │ ├── all.css
│ │ └── latex-fontsize.css
│ │ └── webfonts
│ │ ├── fa-brands-400.ttf
│ │ ├── fa-brands-400.woff2
│ │ ├── fa-regular-400.ttf
│ │ ├── fa-regular-400.woff2
│ │ ├── fa-solid-900.ttf
│ │ ├── fa-solid-900.woff2
│ │ ├── fa-v4compatibility.ttf
│ │ └── fa-v4compatibility.woff2
├── _redirects
├── assets
│ ├── meta_uncertainty_poster_aistats.pdf
│ ├── poster_bayescomp_mms.pdf
│ ├── sc_abi_poster_ICML.pdf
│ └── support_button.png
├── blog
│ ├── 4-realizations-from-atomic-habits
│ │ ├── atomic_habits_thumbnail_new.png
│ │ ├── atomic_habits_twitter_card.png
│ │ ├── index.html
│ │ └── index_files
│ │ │ └── figure-html
│ │ │ └── unnamed-chunk-1-1.png
│ ├── agile-methods-for-academia
│ │ ├── agile-academia-thumbnail.png
│ │ └── index.html
│ ├── emnist-manual-loading
│ │ ├── emnist-manual-loading-thumbnail.png
│ │ └── index.html
│ ├── functional-programming-r-basics
│ │ ├── function_as_argument_apply.png
│ │ ├── index.html
│ │ └── thumbnail.png
│ ├── functional-programming-r-partial
│ │ ├── index.html
│ │ └── index_files
│ │ │ └── figure-html
│ │ │ ├── unnamed-chunk-2-1.png
│ │ │ └── unnamed-chunk-3-1.png
│ ├── ggsimplex-prerelease
│ │ ├── figures
│ │ │ ├── ggsimplex-hexsticker-thumbnail.png
│ │ │ └── illustration_simplices.png
│ │ ├── index.html
│ │ └── index_files
│ │ │ └── figure-html
│ │ │ ├── unnamed-chunk-10-1.png
│ │ │ ├── unnamed-chunk-12-1.png
│ │ │ ├── unnamed-chunk-3-1.png
│ │ │ ├── unnamed-chunk-5-1.png
│ │ │ ├── unnamed-chunk-7-1.png
│ │ │ └── unnamed-chunk-8-1.png
│ ├── hello-world
│ │ ├── hello-world-bg.jpg
│ │ ├── hello-world-thumbnail.png
│ │ └── index.html
│ ├── index.html
│ ├── laptop-mic-obs
│ │ ├── index.html
│ │ └── thumbnail.png
│ ├── mac-email-shortcut
│ │ ├── img
│ │ │ ├── email_shortcut.gif
│ │ │ ├── email_shortcut.mov
│ │ │ ├── screenshot_1.png
│ │ │ ├── screenshot_2.png
│ │ │ ├── screenshot_3.png
│ │ │ └── screenshot_4.png
│ │ ├── index.html
│ │ └── mac_email_thumbnail_new.png
│ ├── mac-setup
│ │ ├── index.html
│ │ └── mac_setup_thumbnail.png
│ ├── outlines-r
│ │ ├── index.html
│ │ └── outlines-r-thumbnail.png
│ ├── sbi-taxonomy
│ │ ├── ddm_parameters.png
│ │ ├── forward_inverse.png
│ │ ├── index.html
│ │ └── index_files
│ │ │ └── figure-html
│ │ │ ├── cell-10-output-1.png
│ │ │ ├── cell-12-output-1.png
│ │ │ ├── cell-15-output-1.png
│ │ │ ├── cell-18-output-1.png
│ │ │ ├── cell-4-output-1.png
│ │ │ ├── cell-5-output-1.png
│ │ │ ├── cell-7-output-1.png
│ │ │ ├── cell-8-output-1.png
│ │ │ └── cell-9-output-1.png
│ ├── scientists-should-have-a-website
│ │ ├── index.html
│ │ ├── quarto-tutorial-screenshot.png
│ │ └── thumbnail.png
│ ├── website-tutorial-quarto
│ │ ├── index.html
│ │ ├── opengraph_thumbnail.png
│ │ └── screenshots
│ │ │ ├── screenshot_github_pages_settings.png
│ │ │ ├── screenshot_github_repo.png
│ │ │ ├── screenshot_rstudio_build_tab.png
│ │ │ ├── website_template_screenshot_1.png
│ │ │ ├── website_template_screenshot_2.png
│ │ │ ├── website_template_screenshot_3.png
│ │ │ ├── website_template_screenshot_4.png
│ │ │ └── website_url_meme.jpeg
│ └── youtube-channel
│ │ ├── index.html
│ │ └── youtube-channel-thumbnail.jpeg
├── cv
│ ├── CV_Marvin_Schmitt.pdf
│ └── index.html
├── html
│ ├── TweenMax.min.js
│ ├── jquery.min.js
│ └── landing_page_styles.css
├── img
│ ├── 404_error.png
│ ├── bayesflow_overview.png
│ ├── bg_trees.png
│ ├── bg_trees_dark_banner.png
│ ├── cmpe_banner.png
│ ├── favicon.ico
│ ├── favicon.png
│ ├── jana_figure_1.png
│ ├── marvin_foto.png
│ ├── marvin_foto_hex.png
│ ├── marvin_foto_round.png
│ ├── marvin_headshot.png
│ ├── marvins_log_logo.png
│ ├── marvins_log_thumbnail.png
│ ├── meta_uncertainty_banner.png
│ ├── model_misspecification_amortized_sbi.png
│ ├── ms_icon.png
│ ├── multi_npe_banner.png
│ ├── self_consistency_banner.png
│ ├── shk_thumbnail.png
│ └── website_thumbnail.png
├── impressum
│ └── index.html
├── index.html
├── listings.json
├── projects
│ └── index.html
├── robots.txt
├── search.json
├── site_libs
│ ├── bootstrap
│ │ ├── bootstrap-038b721a36534e6c6b149a7f47c70fb9.min.css
│ │ ├── bootstrap-7a6534ec52bef88457fbedc5eca67451.min.css
│ │ ├── bootstrap-icons.css
│ │ ├── bootstrap-icons.woff
│ │ ├── bootstrap.min.css
│ │ └── bootstrap.min.js
│ ├── clipboard
│ │ └── clipboard.min.js
│ ├── cookie-consent
│ │ ├── cookie-consent.css
│ │ └── cookie-consent.js
│ ├── quarto-contrib
│ │ ├── fontawesome6-0.1.0
│ │ │ ├── 1e21o67
│ │ │ │ ├── fa-brands-400.ttf
│ │ │ │ ├── fa-brands-400.woff2
│ │ │ │ ├── fa-regular-400.ttf
│ │ │ │ ├── fa-regular-400.woff2
│ │ │ │ ├── fa-solid-900.ttf
│ │ │ │ ├── fa-solid-900.woff2
│ │ │ │ ├── fa-v4compatibility.ttf
│ │ │ │ └── fa-v4compatibility.woff2
│ │ │ ├── all.css
│ │ │ └── latex-fontsize.css
│ │ ├── iconify-2.1.0
│ │ │ └── iconify-icon.min.js
│ │ └── twitter-0.0.1
│ │ │ ├── _extension.yml
│ │ │ ├── gists.lua
│ │ │ ├── loom.lua
│ │ │ ├── mastodon.lua
│ │ │ ├── twitter.lua
│ │ │ ├── vimeo.lua
│ │ │ └── youtube.lua
│ ├── quarto-html
│ │ ├── anchor.min.js
│ │ ├── popper.min.js
│ │ ├── quarto-syntax-highlighting-879e302ca45bb6811b6062ec9bd6e23b.css
│ │ ├── quarto-syntax-highlighting.css
│ │ ├── quarto.js
│ │ ├── tippy.css
│ │ ├── tippy.umd.min.js
│ │ └── zenscroll-min.js
│ ├── quarto-listing
│ │ ├── list.min.js
│ │ └── quarto-listing.js
│ ├── quarto-nav
│ │ └── quarto-nav.js
│ └── quarto-search
│ │ ├── autocomplete.umd.js
│ │ ├── fuse.min.js
│ │ └── quarto-search.js
├── sitemap.xml
├── speaking
│ ├── index.html
│ └── pdf
│ │ ├── poster_detecting_mms.pdf
│ │ ├── poster_meta_uncertainty.pdf
│ │ ├── slides_detecting_mms_gcpr.pdf
│ │ ├── slides_detecting_mms_lightning.pdf
│ │ ├── slides_reliable_abi_botb.pdf
│ │ └── slides_self_consistency_unireps.pdf
└── thesis_qr
│ └── index.html
├── html
├── TweenMax.min.js
├── blog
│ └── listing.ejs
├── blog_footer.html
├── jquery.min.js
├── landing_page_banner.html
├── landing_page_banner_old.html
├── landing_page_style_old.css
├── landing_page_styles.css
├── landing_page_styles_midnightblue.css
├── margin_image.html
├── newpagelink.lua
├── parallax.js
├── seo.html
└── styles.scss
├── img
├── 404_error.png
├── bayesflow_overview.png
├── bg_trees.png
├── bg_trees_dark_banner.png
├── cmpe_banner.png
├── favicon.ico
├── favicon.png
├── jana_figure_1.png
├── marvin_foto.png
├── marvin_foto_hex.png
├── marvin_foto_round.png
├── marvin_headshot.png
├── marvins_log_logo.png
├── marvins_log_thumbnail.png
├── meta_uncertainty_banner.png
├── model_misspecification_amortized_sbi.png
├── ms_icon.png
├── multi_npe_banner.png
├── self_consistency_banner.png
├── shk_thumbnail.png
└── website_thumbnail.png
├── impressum
└── index.qmd
├── index.qmd
├── marvinschmitt-dot-com.Rproj
├── projects
├── index.qmd
├── meta_uncertainty_poster_aistats.pdf
└── poster_bayescomp_mms.pdf
├── sitemap.xml
├── speaking
├── index.qmd
└── pdf
│ ├── poster_detecting_mms.pdf
│ ├── poster_meta_uncertainty.pdf
│ ├── slides_detecting_mms_gcpr.pdf
│ ├── slides_detecting_mms_lightning.pdf
│ ├── slides_reliable_abi_botb.pdf
│ └── slides_self_consistency_unireps.pdf
└── thesis_qr
└── index.qmd
/.gitignore:
--------------------------------------------------------------------------------
1 | .Rproj.user
2 | .Rhistory
3 | .RData
4 | .Ruserdata
5 |
6 |
7 | .DS_Store
8 |
9 |
10 | dev/
11 | rsonnect/
12 | public/
13 |
14 | README.html
15 |
16 | content/top/impressum.md
17 |
18 |
19 | /.quarto/
20 | /_site/
21 | blog/mac-setup/index.ipynb
22 | blog/mac-setup/index.qmd
23 | blog/mac-setup/mac_setup_thumbnail.png
24 | functional-programming-r-partial
25 | sbi-taxonomy
--------------------------------------------------------------------------------
/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/.nojekyll
--------------------------------------------------------------------------------
/404.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "404"
3 | comments: false
4 | sidebar: false
5 | ---
6 |
7 | :::{.column-screen}
8 | {fig-align="center"}
9 | :::
--------------------------------------------------------------------------------
/_extensions/mcanouil/iconify/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 Mickaël Canouil
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.
22 |
--------------------------------------------------------------------------------
/_extensions/mcanouil/iconify/_extension.yml:
--------------------------------------------------------------------------------
1 | title: Iconify support
2 | author: Mickaël Canouil
3 | version: 2.1.2
4 | quarto-required: ">=1.2.280"
5 | contributes:
6 | shortcodes:
7 | - iconify.lua
8 |
--------------------------------------------------------------------------------
/_extensions/mcanouil/iconify/iconify.lua:
--------------------------------------------------------------------------------
1 | --[[
2 | # MIT License
3 | #
4 | # Copyright (c) Mickaël Canouil
5 | #
6 | # Permission is hereby granted, free of charge, to any person obtaining a copy
7 | # of this software and associated documentation files (the "Software"), to deal
8 | # in the Software without restriction, including without limitation the rights
9 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | # copies of the Software, and to permit persons to whom the Software is
11 | # furnished to do so, subject to the following conditions:
12 |
13 | # The above copyright notice and this permission notice shall be included in all
14 | # copies or substantial portions of the Software.
15 |
16 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | # SOFTWARE.
23 | ]]
24 |
25 | local function ensure_html_deps()
26 | quarto.doc.add_html_dependency({
27 | name = 'iconify',
28 | version = '2.1.0',
29 | scripts = {"iconify-icon.min.js"}
30 | })
31 | end
32 |
33 | local function is_empty(s)
34 | return s == nil or s == ''
35 | end
36 |
37 | local function is_valid_size(size)
38 | if is_empty(size) then
39 | return ''
40 | end
41 | local size_table = {
42 | ["tiny"] = "0.5em",
43 | ["scriptsize"] = "0.7em",
44 | ["footnotesize"] = "0.8em",
45 | ["small"] = "0.9em",
46 | ["normalsize"] = "1em",
47 | ["large"] = "1.2em",
48 | ["Large"] = "1.5em",
49 | ["LARGE"] = "1.75em",
50 | ["huge"] = "2em",
51 | ["Huge"] = "2.5em",
52 | ["1x"] = "1em",
53 | ["2x"] = "2em",
54 | ["3x"] = "3em",
55 | ["4x"] = "4em",
56 | ["5x"] = "5em",
57 | ["6x"] = "6em",
58 | ["7x"] = "7em",
59 | ["8x"] = "8em",
60 | ["9x"] = "9em",
61 | ["10x"] = "10em",
62 | ["2xs"] = "0.625em",
63 | ["xs"] = "0.75em",
64 | ["sm"] = "0.875em",
65 | ["lg"] = "1.25em",
66 | ["xl"] = "1.5em",
67 | ["2xl"] = "2em"
68 | }
69 | for key, value in pairs(size_table) do
70 | if key == size then
71 | return 'font-size: ' .. value .. ';'
72 | end
73 | end
74 | return 'font-size: ' .. size .. ';'
75 | end
76 |
77 | return {
78 | ["iconify"] = function(args, kwargs)
79 | -- detect html (excluding epub which won't handle fa)
80 | if quarto.doc.is_format("html:js") then
81 | ensure_html_deps()
82 | local icon = pandoc.utils.stringify(args[1])
83 | local set = "fluent-emoji"
84 |
85 | if #args > 1 and string.find(pandoc.utils.stringify(args[2]), ":") then
86 | quarto.log.warning(
87 | 'Use "set:icon" or "set icon" syntax, not both! ' ..
88 | 'Using "set:icon" syntax and discarding first argument!'
89 | )
90 | icon = pandoc.utils.stringify(args[2])
91 | end
92 |
93 | if string.find(icon, ":") then
94 | set = string.sub(icon, 1, string.find(icon, ":") - 1)
95 | icon = string.sub(icon, string.find(icon, ":") + 1)
96 | elseif #args > 1 then
97 | set = icon
98 | icon = pandoc.utils.stringify(args[2])
99 | end
100 |
101 | local attributes = ' icon="' .. set .. ':' .. icon .. '"'
102 | local default_label = 'Icon ' .. icon .. ' from ' .. set .. ' Iconify.design set.'
103 |
104 | local size = is_valid_size(pandoc.utils.stringify(kwargs["size"]))
105 | if not is_empty(size) then
106 | attributes = attributes .. ' style="' .. size .. '"'
107 | end
108 |
109 | local aria_label = pandoc.utils.stringify(kwargs["label"])
110 | if is_empty(aria_label) then
111 | aria_label = ' aria-label="' .. default_label .. '"'
112 | else
113 | aria_label = ' aria-label="' .. aria_label .. '"'
114 | end
115 |
116 | local title = pandoc.utils.stringify(kwargs["title"])
117 | if is_empty(title) then
118 | title = ' title="' .. default_label .. '"'
119 | else
120 | title = ' title="' .. title .. '"'
121 | end
122 |
123 | attributes = attributes .. aria_label .. title
124 |
125 | local width = pandoc.utils.stringify(kwargs["width"])
126 | if not is_empty(width) and is_empty(size) then
127 | attributes = attributes .. ' width="' .. width .. '"'
128 | end
129 | local height = pandoc.utils.stringify(kwargs["height"])
130 | if not is_empty(height) and is_empty(size) then
131 | attributes = attributes .. ' height="' .. height .. '"'
132 | end
133 | local flip = pandoc.utils.stringify(kwargs["flip"])
134 | if not is_empty(flip) then
135 | attributes = attributes .. ' flip="' .. flip.. '"'
136 | end
137 | local rotate = pandoc.utils.stringify(kwargs["rotate"])
138 | if not is_empty(rotate) then
139 | attributes = attributes .. ' rotate="' .. rotate .. '"'
140 | end
141 |
142 | local inline = pandoc.utils.stringify(kwargs["inline"])
143 | if is_empty(inline) or inline ~= "false" then
144 | attributes = ' inline ' .. attributes
145 | end
146 |
147 |
148 | return pandoc.RawInline(
149 | 'html',
150 | ''
151 | )
152 | else
153 | return pandoc.Null()
154 | end
155 | end
156 | }
157 |
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/_extension.yml:
--------------------------------------------------------------------------------
1 | title: Font Awesome support
2 | author: Carlos Scheidegger
3 | version: 1.1.0
4 | quarto-required: ">=1.2.269"
5 | contributes:
6 | shortcodes:
7 | - fontawesome.lua
8 |
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/css/latex-fontsize.css:
--------------------------------------------------------------------------------
1 | .fa-tiny {
2 | font-size: 0.5em;
3 | }
4 | .fa-scriptsize {
5 | font-size: 0.7em;
6 | }
7 | .fa-footnotesize {
8 | font-size: 0.8em;
9 | }
10 | .fa-small {
11 | font-size: 0.9em;
12 | }
13 | .fa-normalsize {
14 | font-size: 1em;
15 | }
16 | .fa-large {
17 | font-size: 1.2em;
18 | }
19 | .fa-Large {
20 | font-size: 1.5em;
21 | }
22 | .fa-LARGE {
23 | font-size: 1.75em;
24 | }
25 | .fa-huge {
26 | font-size: 2em;
27 | }
28 | .fa-Huge {
29 | font-size: 2.5em;
30 | }
31 |
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.ttf
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-brands-400.woff2
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.ttf
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-regular-400.woff2
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.ttf
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-solid-900.woff2
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.ttf
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_extensions/quarto-ext/fontawesome/assets/webfonts/fa-v4compatibility.woff2
--------------------------------------------------------------------------------
/_extensions/quarto-ext/fontawesome/fontawesome.lua:
--------------------------------------------------------------------------------
1 | local function ensureLatexDeps()
2 | quarto.doc.use_latex_package("fontawesome5")
3 | end
4 |
5 | local function ensureHtmlDeps()
6 | quarto.doc.add_html_dependency({
7 | name = 'fontawesome6',
8 | version = '0.1.0',
9 | stylesheets = {'assets/css/all.css', 'assets/css/latex-fontsize.css'}
10 | })
11 | end
12 |
13 | local function isEmpty(s)
14 | return s == nil or s == ''
15 | end
16 |
17 | local function isValidSize(size)
18 | local validSizes = {
19 | "tiny",
20 | "scriptsize",
21 | "footnotesize",
22 | "small",
23 | "normalsize",
24 | "large",
25 | "Large",
26 | "LARGE",
27 | "huge",
28 | "Huge"
29 | }
30 | for _, v in ipairs(validSizes) do
31 | if v == size then
32 | return size
33 | end
34 | end
35 | return ""
36 | end
37 |
38 | return {
39 | ["fa"] = function(args, kwargs)
40 |
41 | local group = "solid"
42 | local icon = pandoc.utils.stringify(args[1])
43 | if #args > 1 then
44 | group = icon
45 | icon = pandoc.utils.stringify(args[2])
46 | end
47 |
48 | local title = pandoc.utils.stringify(kwargs["title"])
49 | if not isEmpty(title) then
50 | title = " title=\"" .. title .. "\""
51 | end
52 |
53 | local label = pandoc.utils.stringify(kwargs["label"])
54 | if isEmpty(label) then
55 | label = " aria-label=\"" .. icon .. "\""
56 | else
57 | label = " aria-label=\"" .. label .. "\""
58 | end
59 |
60 | local size = pandoc.utils.stringify(kwargs["size"])
61 |
62 | -- detect html (excluding epub which won't handle fa)
63 | if quarto.doc.is_format("html:js") then
64 | ensureHtmlDeps()
65 | if not isEmpty(size) then
66 | size = " fa-" .. size
67 | end
68 | return pandoc.RawInline(
69 | 'html',
70 | ""
71 | )
72 | -- detect pdf / beamer / latex / etc
73 | elseif quarto.doc.is_format("pdf") then
74 | ensureLatexDeps()
75 | if isEmpty(isValidSize(size)) then
76 | return pandoc.RawInline('tex', "\\faIcon{" .. icon .. "}")
77 | else
78 | return pandoc.RawInline('tex', "{\\" .. size .. "\\faIcon{" .. icon .. "}}")
79 | end
80 | else
81 | return pandoc.Null()
82 | end
83 | end
84 | }
85 |
--------------------------------------------------------------------------------
/_extensions/sellorm/social-embeds/_extension.yml:
--------------------------------------------------------------------------------
1 | title: social-embeds
2 | author: Mark Sellors
3 | version: 0.0.2
4 | contributes:
5 | shortcodes:
6 | - gists.lua
7 | - loom.lua
8 | - twitter.lua
9 | - vimeo.lua
10 | - youtube.lua
11 | - mastodon.lua
12 |
--------------------------------------------------------------------------------
/_extensions/sellorm/social-embeds/gists.lua:
--------------------------------------------------------------------------------
1 | function gist(args)
2 | if quarto.doc.isFormat('html') then
3 | local user = pandoc.utils.stringify(args[1])
4 | local gist_id = pandoc.utils.stringify(args[2])
5 | local file_fragment = ''
6 | if args[3] ~= nil then
7 | local file = pandoc.utils.stringify(args[3])
8 | file_fragment = '?file=' .. file
9 | end
10 |
11 | -- Assemble HTML to be returned
12 | local html = ''
19 |
20 | return pandoc.RawInline('html', html)
21 | else
22 | return pandoc.Null()
23 | end
24 | end
25 |
--------------------------------------------------------------------------------
/_extensions/sellorm/social-embeds/loom.lua:
--------------------------------------------------------------------------------
1 | function loom(args)
2 | if quarto.doc.isFormat('html') then
3 | local videoid = pandoc.utils.stringify(args[1])
4 |
5 | -- Assemble HTML to be returned
6 | local html = '
'
9 |
10 | return pandoc.RawInline('html', html)
11 | else
12 | return pandoc.Null()
13 | end
14 | end
15 |
16 |
--------------------------------------------------------------------------------
/_extensions/sellorm/social-embeds/mastodon.lua:
--------------------------------------------------------------------------------
1 | function mastodon(args)
2 | if quarto.doc.isFormat('html') then
3 | local status_url = pandoc.utils.stringify(args[1])
4 | print(status_url)
5 | -- Assemble HTML to be returned
6 | local html = '
'
7 |
8 | return pandoc.RawInline('html', html)
9 | else
10 | return pandoc.Null()
11 | end
12 | end
13 |
--------------------------------------------------------------------------------
/_extensions/sellorm/social-embeds/twitter.lua:
--------------------------------------------------------------------------------
1 | local function ensureHtmlDeps()
2 | quarto.doc.addHtmlDependency({
3 | name = 'twitter',
4 | version = '0.0.1',
5 | scripts = {
6 | {
7 | path = "",
8 | attribs = {src="https://platform.twitter.com/widgets.js"},
9 | afterBody = true
10 | }
11 | }
12 | })
13 | end
14 |
15 | local function isEmpty(s)
16 | return s == nil or s == ''
17 | end
18 |
19 | function tweet(args, kwargs)
20 | if quarto.doc.isFormat('html') then
21 | ensureHtmlDeps()
22 |
23 | if isEmpty(args[1]) then
24 | user = pandoc.utils.stringify(kwargs["user"])
25 | status_id = pandoc.utils.stringify(kwargs["id"])
26 | else
27 | user = pandoc.utils.stringify(args[1])
28 | status_id = pandoc.utils.stringify(args[2])
29 | end
30 |
31 | -- Assemble the twitter oembed API URL from the user inputs
32 | local tweet_embed = 'https://publish.twitter.com/oembed?url=https://twitter.com/'
33 | .. user
34 | .. '/status/'
35 | .. status_id
36 | .. '&align=center'
37 |
38 | print(tweet_embed)
39 |
40 | local mt, api_resp = pandoc.mediabag.fetch(tweet_embed)
41 |
42 | -- generate a random number to append to the html div ID to avoid re-use
43 | local id = math.random(10000, 99999)
44 |
45 | local tweet_data = ''
52 |
53 | return pandoc.RawInline('html', tweet_data)
54 | else
55 | return pandoc.Null()
56 | end
57 | end
58 |
--------------------------------------------------------------------------------
/_extensions/sellorm/social-embeds/vimeo.lua:
--------------------------------------------------------------------------------
1 | function vimeo(args)
2 | if quarto.doc.isFormat('html') then
3 | local videoid = pandoc.utils.stringify(args[1])
4 |
5 | -- Assemble HTML to be returned
6 | local html = '
'
9 |
10 | return pandoc.RawInline('html', html)
11 | else
12 | return pandoc.Null()
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/_extensions/sellorm/social-embeds/youtube.lua:
--------------------------------------------------------------------------------
1 | function youtube(args)
2 | if quarto.doc.isFormat('html') then
3 | local videoid = pandoc.utils.stringify(args[1])
4 |
5 | -- Assemble HTML to be returned
6 | local html = ''
9 |
10 | return pandoc.RawInline('html', html)
11 | else
12 | return pandoc.Null()
13 | end
14 | end
15 |
--------------------------------------------------------------------------------
/_freeze/blog/4-realizations-from-atomic-habits/index/figure-html/unnamed-chunk-1-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_freeze/blog/4-realizations-from-atomic-habits/index/figure-html/unnamed-chunk-1-1.png
--------------------------------------------------------------------------------
/_freeze/blog/emnist-manual-loading/index/execute-results/html.json:
--------------------------------------------------------------------------------
1 | {
2 | "hash": "1837d2ea8674a7929b63eda147c5bce2",
3 | "result": {
4 | "engine": "jupyter",
5 | "markdown": "---\ntitle: \"Download EMNIST manually\"\ndescription: \"EMNIST is a classic image data set for machine learning. Sometimes the automatic PyTorch download fails, that bugs me. Here's a quick guide to download the EMNIST data set manually and make it work with PyTorch.\"\ndate: 04-15-2024\ncategories: \n - programming\n - python\n - machine learning\n - technical\ndraft: false\nnumber-sections: false\nimage: emnist-manual-loading-thumbnail.png\nformat:\n html:\n fig-cap-location: bottom\n include-before-body: ../../html/margin_image.html\n include-after-body: ../../html/blog_footer.html\n comments: false\neditor: \n markdown: \n wrap: sentence\n---\n\n:::{.callout}\nThis is a quick reference for my future self, maybe it's helpful for you as well.\n\n**TL;DR:** Manual EMNIST data download requires directory name updates to make `PyTorch` happy. Need `./EMNIST/raw/`.\n:::\n\n## Problem: Automatic EMNIST download failed\n\nEarlier today, I wanted to reproduce the results of a machine learning paper that uses the EMNIST digits data set to train a `PyTorch` model.\nNormally, PyTorch makes loading *and even downloading* data sets extremely easy for us.\nThe `torchvision.datasets` module provides a handful of commonly used data sets with a user-friendly API.\nMost importantly for us right now, the data set loaders come with the convenient `download=True` argument to download a data set automatically:\n\n::: {#1001b362 .cell execution_count=1}\n``` {.python .cell-code}\nimport torchvision\n\ntrain_data = torchvision.datasets.EMNIST(\n root=\"./\", \n split=\"digits\", \n train=True,\n download=True\n)\n```\n:::\n\n\nUnfortunately, that throws a `RuntimeError`:\n\n```\nRuntimeError: File not found or corrupted.\n```\n\nNext, I wanted to just *download* the data from a URL via `torchvision.datasets.util.download_url(...)`.\nI found a handful of EMNIST URLs on the internet, but either got the same old `File not found or corrupted` or an SSL error.\n\n## Fix: Manual download and directory adjustments\n\nHere's a brief list of steps for downloading the EMNIST data manually and then preparing the directory for `torchvision.datasets.EMNIST(..., download=False)`.\n\n### Step 1: Download the files\n\nGo to the official [EMNIST website (Link)](https://www.nist.gov/itl/products-and-services/emnist-dataset) and head to *Binary format as the original MNIST dataset*.\nAlternatively, here's the link: [EMNIST Direct Download Link](https://biometrics.nist.gov/cs_links/EMNIST/gzip.zip)\n\nThat archive with the great name `gzip.zip` has a size of approximately 500MB.\n\n\n### Step 2: Unpack the `gzip.zip` archive\n\nHead to your project's data directory (or global data directory if you have that) and unpack the previously downloaded `gzip.zip` archive there.\nYou will get a folder `gzip/` that contains a whole lot of `*.gz` files:\n\n```\n.\n└── gzip\n ├── emnist-balanced-mapping.txt\n ├── emnist-balanced-test-images-idx3-ubyte.gz\n ├── emnist-balanced-test-labels-idx1-ubyte.gz\n ├── emnist-balanced-train-images-idx3-ubyte.gz\n ├── emnist-balanced-train-labels-idx1-ubyte.gz\n ├── ...\n ├── emnist-digits-mapping.txt\n ├── emnist-digits-test-images-idx3-ubyte.gz\n ├── emnist-digits-test-labels-idx1-ubyte.gz\n ├── emnist-digits-train-images-idx3-ubyte.gz\n ├── emnist-digits-train-labels-idx1-ubyte.gz\n ├── ...\n ├── emnist-mnist-mapping.txt\n ├── emnist-mnist-test-images-idx3-ubyte.gz\n ├── emnist-mnist-test-labels-idx1-ubyte.gz\n ├── emnist-mnist-train-images-idx3-ubyte.gz\n └── emnist-mnist-train-labels-idx1-ubyte.gz\n```\n\n:::{.callout-note}\n## EMNIST splits\n\nYou'll notice a structure: There are different splits, encoded in the filenames as `emnist--...`. \nThis `` corresponds to the `split=...` argument in `torchvision.datasets.EMNIST`.\nFor this project, I only needed the `digits` split, so I deleted the files of all the other splits.\n:::\n\n### Step 3: Unpack the individual `.gz` files\n\nUnpack all the `*.gz` files that you need.\nOn MacOS, the built-in archive tools can handle `.gz` files, YMMV.\nDelete the `*.gz` files after you're done unpacking.\nYou should have the following structure now:\n\n```\n.\n└── gzip\n ├── emnist-balanced-mapping.txt\n ├── emnist-balanced-test-images-idx3-ubyte\n ├── emnist-balanced-test-labels-idx1-ubyte\n ├── emnist-balanced-train-images-idx3-ubyte\n ├── emnist-balanced-train-labels-idx1-ubyte\n ├── ...\n ├── emnist-digits-mapping.txt\n ├── emnist-digits-test-images-idx3-ubyte\n ├── emnist-digits-test-labels-idx1-ubyte\n ├── emnist-digits-train-images-idx3-ubyte\n ├── emnist-digits-train-labels-idx1-ubyte\n ├── ...\n ├── emnist-mnist-mapping.txt\n ├── emnist-mnist-test-images-idx3-ubyte\n ├── emnist-mnist-test-labels-idx1-ubyte\n ├── emnist-mnist-train-images-idx3-ubyte\n └── emnist-mnist-train-labels-idx1-ubyte\n```\n\n### Step 4: Adjust the directory structure for PyTorch\n\nIf we try to load the data set into PyTorch with the `download=False` argument now,\n\n::: {#fd77ec16 .cell execution_count=2}\n``` {.python .cell-code}\ntrain_data = torchvision.datasets.EMNIST(\n root=\"./\", \n split=\"digits\", \n train=True,\n download=False\n)\n```\n:::\n\n\nwe get the following error:\n\n```\nRuntimeError: Dataset not found. You can use download=True to download it\n```\n\nWell, we kind of did all the downloading so that we *circumvent* the problematic `download=True` call.\n\nAs you might expect, we have to make `PyTorch` find our downloaded EMNIST data. That's a two-step process: (1) We will make the EMNIST data fit the format that `PyTorch` expects; and (2) we will point `PyTorch` to where our EMNIST data lives.\n\n#### (1) Required directory tree\n\n`PyTorch` wants the following structure:\n\n```\nDATASET_NAME\n└── raw\n ├── ...-mapping.txt\n ├── ...-ubyte\n```\n\nTo achieve this, we simply rename `gzip` to `raw` and wrap the entire `raw` folder into a parent folder called `EMNIST`.\nNow your file tree should look like this:\n\n```\nEMNIST\n└── raw\n ├── emnist-balanced-mapping.txt\n ├── emnist-balanced-test-images-idx3-ubyte\n ├── emnist-balanced-test-labels-idx1-ubyte\n ├── emnist-balanced-train-images-idx3-ubyte\n ├── emnist-balanced-train-labels-idx1-ubyte\n ├── ...\n ├── emnist-digits-mapping.txt\n ├── emnist-digits-test-images-idx3-ubyte\n ├── emnist-digits-test-labels-idx1-ubyte\n ├── emnist-digits-train-images-idx3-ubyte\n ├── emnist-digits-train-labels-idx1-ubyte\n ├── ...\n ├── emnist-mnist-mapping.txt\n ├── emnist-mnist-test-images-idx3-ubyte\n ├── emnist-mnist-test-labels-idx1-ubyte\n ├── emnist-mnist-train-images-idx3-ubyte\n └── emnist-mnist-train-labels-idx1-ubyte\n```\n\n#### (2) Point `PyTorch` to the correct path.\n\nFinally, the call to the `PyTorch` data loader will work as intended because the `EMNIST` folder is directly below my current working directory `./`:\n\n::: {#859ec235 .cell execution_count=3}\n``` {.python .cell-code}\ndata_root = \"./\"\n\ntrain_data = torchvision.datasets.EMNIST(\n root=data_root, \n split=\"digits\", \n train=True,\n download=False\n)\n```\n:::\n\n\nIf your `EMNIST/` folder lives somewhere else (e.g., in a dedicated `data/` folder), simply adjust `data_root`.\n\n### Step 5: Profit!\n\nNow off you go and make some fancy machine learning stuff with EMNIST! ✨\n\n\n--Marvin\n\n",
6 | "supporting": [
7 | "index_files"
8 | ],
9 | "filters": [],
10 | "includes": {}
11 | }
12 | }
--------------------------------------------------------------------------------
/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-10-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-10-1.png
--------------------------------------------------------------------------------
/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-12-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-12-1.png
--------------------------------------------------------------------------------
/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-3-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-3-1.png
--------------------------------------------------------------------------------
/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-5-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-5-1.png
--------------------------------------------------------------------------------
/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-7-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-7-1.png
--------------------------------------------------------------------------------
/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-8-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/_freeze/blog/ggsimplex-prerelease/index/figure-html/unnamed-chunk-8-1.png
--------------------------------------------------------------------------------
/_freeze/blog/outlines-r/index/execute-results/html.json:
--------------------------------------------------------------------------------
1 | {
2 | "hash": "5d514f5d911a01e4fb5bfa30fb5b1d0a",
3 | "result": {
4 | "engine": "knitr",
5 | "markdown": "---\ntitle: \"Structured Language Generation with Outlines in R\"\ndescription: \"Calling the Outlines Python package in R with the reticulate package, with OpenAI's GPT-4o as a language model.\"\ndate: 10-15-2024\ncategories: \n - tech\n - programming\ndraft: false\nnumber-sections: false\nimage: outlines-r-thumbnail.png\nformat:\n html:\n fig-cap-location: bottom\n include-before-body: ../../html/margin_image.html\n include-after-body: ../../html/blog_footer.html\n comments: false\neditor: \n markdown: \n wrap: sentence\n---\n\n\nPython is a great Swiss army knife for many tasks, especially when it comes to deep learning these days.\nHowever, many statisticians and data scientists prefer working in R. \nIn this short blog post, we'll use the `reticulate` package to work with Python code inside R.\nThis lets us use the great `outlines` package by dottxt, and OpenAI's GPT-4o as a language model backend.\n\n## Load Reticulate and Set Up the Environment\n\nLoad the `reticulate` library to interface between R and Python, and specify the conda environment that contains the necessary Python packages (`outlines`, `openai` and `tiktoken` in my case).\n\n\n::: {.cell}\n\n```{.r .cell-code}\nlibrary(reticulate)\n```\n\n::: {.cell-output .cell-output-stderr}\n\n```\nWarning: package 'reticulate' was built under R version 4.4.1\n```\n\n\n:::\n\n```{.r .cell-code}\nuse_condaenv(\"/Users/marvin/miniforge3/envs/outlines_py310\", required = TRUE)\nos <- import(\"os\")\noutlines <- import(\"outlines\")\n```\n:::\n\n\n## Set Up the OpenAI Model\n\nSet up the OpenAI model using the `outlines` package. \nYou should not write your API key directly in the code.\nInstead, we use an environment variable which we set in the terminal before running the R script.\nThis ensures that you don't accidentally leak your secret API key.\n\n\n::: {.cell}\n\n```{.r .cell-code}\napi_key <- Sys.getenv(\"OPENAI_API_KEY\")\nmodel <- outlines$models$openai(\"gpt-4o\", api_key = api_key)\n```\n:::\n\n\n## Generate a Response\n\nNow we'll use the language model to answer a question, and restrict the answer to a choice from multiple options.\nFor demonstration purposes, let's see whether GPT-4 can answer a basic question about Bayesian statistics.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchoices = c(\"Prior\", \"Likelihood\", \"Marginal Likelihood\", \"Evidence\", \"Posterior\")\ngenerator <- outlines$generate$choice(model, choices)\n\nresult <- generator(\"In a Bayesian model, what do we call the probability distribution of parameters given the data?\")\nprint(result)\n```\n\n::: {.cell-output .cell-output-stdout}\n\n```\n[1] \"Posterior\"\n```\n\n\n:::\n:::\n\n\nLet's try another more technical question, this time about the choice of a suitable distibution family to model count data.\n\n\n::: {.cell}\n\n```{.r .cell-code}\nchoices = c(\"Gaussian\", \"Poisson\", \"Negative-Binomial\", \"Gamma\")\ngenerator <- outlines$generate$choice(model, choices)\n\nresult <- generator(\"We have a Bayesian model for count data $y$. The data $y$ is lower-bounded at zero, can take on integer values, and is probably overdispersed. The most suitable distribution family for the data model is \")\nprint(result)\n```\n\n::: {.cell-output .cell-output-stdout}\n\n```\n[1] \"Negative-Binomial\"\n```\n\n\n:::\n:::\n\n\n\n## Next Steps\n\nIn this demonstrator, we used `reticulate` as a simple bridge to call Python packages from within R.\nAs a next steps, you can try other generation schemes (not just multiple choice) or build more complex pipelines.\nAlso, Outlines really shines if you use it with a local open source LLM, so you should try that as well.\n",
6 | "supporting": [],
7 | "filters": [
8 | "rmarkdown/pagebreak.lua"
9 | ],
10 | "includes": {},
11 | "engineDependencies": {},
12 | "preserve": {},
13 | "postProcess": true
14 | }
15 | }
--------------------------------------------------------------------------------
/_freeze/cv/index/execute-results/html.json:
--------------------------------------------------------------------------------
1 | {
2 | "hash": "a573b322cd95a33000626724042de288",
3 | "result": {
4 | "engine": "knitr",
5 | "markdown": "---\nlayout: page\ntitle: Curriculum vitae\nexcerpt: My current CV\ncomments: false\nexecute:\n freeze: true # never re-render during project render\nengine: knitr \ncv:\n pdf: \"CV_Marvin_Schmitt.pdf\"\n---\n\n::: {.cell}\n\n:::\n\n```{=html}\n
6 |
7 | ```{r, echo=FALSE}
8 | library(sessioninfo)
9 | # save the session info as an object
10 | pkg_sesh <- session_info(pkgs = "attached")
11 | # get the quarto version
12 | quarto_version <- quarto::quarto_version()
13 | # inject the quarto info
14 | pkg_sesh$platform$quarto <- paste(
15 | quarto::quarto_version(),
16 | "@",
17 | quarto::quarto_path()
18 | )
19 | # print it out
20 | pkg_sesh
21 | ```
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/blog/_metadata.yml:
--------------------------------------------------------------------------------
1 | # options specified here will apply to all posts in this folder
2 |
3 | # freeze computational output
4 | # (see https://quarto.org/docs/projects/code-execution.html#freeze)
5 | freeze: true
6 | description-meta: "{{< meta description >}}"
7 |
8 | # Enable banner style title blocks
9 | title-block-banner: "../img/bg_trees_dark_banner.png"
10 |
11 | # Default for table of contents
12 | toc: true
13 | toc-title: Contents
14 | toc-location: left
15 |
16 | # Default knitr options
17 | execute:
18 | echo: true
19 | message: true
20 | warning: true
21 |
22 | format:
23 | html:
24 | code-tools: true
25 | comments:
26 | giscus:
27 | repo: marvinschmitt/marvinschmitt-dot-com
28 | category: Announcements
29 | loading: lazy
30 | input-position: bottom
31 | language: en
32 | quarto-template-params:
33 | banner-header-class: "blog-post"
34 | include-after-body: ../html/blog_footer.html
35 |
36 | # Default author
37 | author:
38 | - name: Marvin Schmitt
39 | url: https://www.marvinschmitt.com/
40 | orcid: 0000-0002-7967-4723
--------------------------------------------------------------------------------
/blog/agile-methods-for-academia/agile-academia-thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/agile-methods-for-academia/agile-academia-thumbnail.png
--------------------------------------------------------------------------------
/blog/agile-methods-for-academia/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Agile methods in academia"
3 | description: "Boost your productivity and feel less overwhelmed with these six agile methods."
4 | date: 03-07-2023
5 | categories:
6 | - psychology
7 | - academia
8 | image: agile-academia-thumbnail.png
9 | draft: false
10 | number-sections: true
11 |
12 | format:
13 | html:
14 | include-before-body: ../../html/margin_image.html
15 | include-after-body: ../../html/blog_footer.html
16 | ---
17 |
18 | # Introduction
19 |
20 | As the academic world becomes increasingly competitive, researchers often find it challenging to keep up with the rigorous research demands while maintaining a balanced work-life schedule. Fortunately, there are project management tools that can help streamline workflows, increase productivity, and help achieve research goals with greater ease.
21 |
22 | In this blog post, we will discuss agile methods, which are practical and straightforward and can be applied to all academic disciplines. These methods can be applied in virtually any field where there is an abundance of work, and managing the work is a task by itself.
23 |
24 | # What are agile methods?
25 |
26 | Agile methods are a set of project management practices that prioritize flexibility, collaboration, and continuous improvement. The core idea of agile methods is to break down a project into smaller, more manageable tasks, and then to work on those tasks iteratively, with frequent feedback and adjustments. This allows for greater adaptability and responsiveness to changing circumstances, and helps to avoid the pitfalls of a rigid, top-down approach to project management.
27 |
28 | Agile methods emphasize the importance of communication, teamwork, and transparency, and encourage a culture of experimentation and learning. By incorporating feedback from stakeholders, and constantly re-evaluating and adjusting the project plan as necessary, agile methods help to ensure that the project stays on track and meets its goals. Overall, the goal of agile methods is to empower teams to work more efficiently and effectively, and to deliver high-quality results that meet the needs of all stakeholders.
29 |
30 | # How can I use agile methods?
31 |
32 | So, how can project management tools help you streamline your workflow and increase your productivity? Let's dive into some agile methods and explore how they can help you manage your research projects more efficiently.
33 |
34 | ## Method 1: Breaking down a project into smaller tasks
35 |
36 | Breaking down a large project into smaller, more manageable tasks is a common agile method that can help you focus on what needs to be done. This method is especially helpful if you tend to feel overwhelmed by the sheer scope of a project.
37 |
38 | For instance, if you're working on a research paper, you can break it down into smaller tasks such as conducting a literature review, drafting an outline, writing the introduction, collecting data, analyzing data, and writing the conclusion. This approach helps you manage your time more effectively and makes it easier to track your progress.
39 |
40 | ## Method 2: Specifying the "definition of done"
41 |
42 | Each task should have a clear "definition of done", which means identifying what needs to be done to complete that task. For example, if I am working on a plot for a research paper, my definition of done includes:
43 |
44 | - ✅ a colorblind-friendly palette,
45 | - ✅ a clear legend, proper labels,
46 | - ✅ a descriptive caption,
47 | - ✅ subfigures that match with alignment and font size.
48 |
49 | Specifying the "definition of done" helps you set clear expectations and ensures that you're meeting the requirements for each task. It also helps you avoid the feeling of being stuck in a never-ending cycle of revisions. If you're done (according to your definition of done) with all tasks, you can still re-iterate and polish the entire project.
50 |
51 | ## Method 3: Conducting retrospectives
52 |
53 | Retrospectives are crucial for reflecting on your workflow, identifying areas for improvement, and making changes for future projects. By reflecting on your successes and failures, you can work more efficiently and improve your research processes.
54 |
55 | To perform a retrospective, the team should set aside a specific time to reflect on the completed project or a particular phase of the project. Each team member should be encouraged to share their thoughts, feelings, and feedback openly and honestly. The team should discuss what worked well, what didn't work, and what could be improved. Retrospectives should be conducted regularly, preferably after each iteration, to continuously improve the workflow and achieve better results.
56 |
57 | As a junior researcher, you may not have the opportunity to issue a retrospective with all members of a project. However, you can still have a solo retrospective on your tasks. You can ask yourself questions like "What worked well and should be repeated next time?" or "What didn't work out well and should be changed right away?" or "What are the next steps, and when are they due?"
58 |
59 | ## Method 4: Setting work-in-progress limits
60 |
61 | Setting a limit on the number of tasks you're working on can help you avoid feeling overwhelmed and stay focused on the task at hand. For instance, you can limit yourself to two to three tasks for maximum efficiency.
62 |
63 | By setting work-in-progress limits, you can avoid overcommitting and ensure that you're making progress on the right tasks.
64 |
65 | also helps you prioritize your work and avoid the tendency to multitask, which can be counterproductive.
66 |
67 | ## Method 5: Estimating the required amount of work for each task
68 |
69 | Estimating the required amount of work for each task helps you plan your time more effectively and avoid over-committing. It also facilitates communication with collaborators by setting realistic expectations for when they can expect results.
70 |
71 | Estimating the required amount of work for each task also helps you avoid underestimating the amount of work required for a task, which can lead to delays and missed deadlines.
72 |
73 | ## Method 6: Prioritizing tasks
74 |
75 | Prioritizing tasks based on their importance and urgency is an essential skill for managing research projects. The Eisenhower Matrix is a useful tool for prioritizing tasks based on four categories: urgent and important, important but not urgent, urgent but not important, and neither urgent nor important.
76 |
77 | | | urgent | not urgent |
78 | |------------------:|:------------:|:----------------:|
79 | | **important** | Do it now. | Schedule a time. |
80 | | **not important** | Delegate it. | Delete it. |
81 |
82 | : Illustration of the Eisenhower matrix for prioritizing tasks.
83 |
84 | By using the Eisenhower Matrix, you can prioritize your tasks and make progress toward your goals without feeling overwhelmed. Learning to say no is also an essential skill in prioritizing tasks.
85 |
86 | # Conclusion
87 |
88 | In conclusion, implementing agile methods in academia can help you work more efficiently and achieve your research goals with greater ease. By breaking down a project into smaller tasks, defining the "definition of done", conducting retrospectives, setting work-in-progress limits, estimating the required amount of work for each task, and prioritizing tasks, you can manage your research projects more effectively and stay on track. Don't be afraid to give it a try!
89 |
90 | # TL;DR
91 |
92 | Agile methods are great, try those:
93 |
94 | 1. Break a project into manageable tasks 🧩
95 | 2. Definition of done ✅
96 | 3. Retrospectives 👀
97 | 4. Limit work in progress 🛑
98 | 5. Estimate the amount of work ⏳
99 | 6. Prioritize tasks ⚠️
100 |
--------------------------------------------------------------------------------
/blog/emnist-manual-loading/emnist-manual-loading-thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/emnist-manual-loading/emnist-manual-loading-thumbnail.png
--------------------------------------------------------------------------------
/blog/functional-programming-r-basics/function_as_argument_apply.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/functional-programming-r-basics/function_as_argument_apply.png
--------------------------------------------------------------------------------
/blog/functional-programming-r-basics/thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/functional-programming-r-basics/thumbnail.png
--------------------------------------------------------------------------------
/blog/ggsimplex-prerelease/figures/ggsimplex-hexsticker-thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/ggsimplex-prerelease/figures/ggsimplex-hexsticker-thumbnail.png
--------------------------------------------------------------------------------
/blog/ggsimplex-prerelease/figures/ggsimplex-hexsticker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/ggsimplex-prerelease/figures/ggsimplex-hexsticker.png
--------------------------------------------------------------------------------
/blog/ggsimplex-prerelease/figures/illustration_simplices.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/ggsimplex-prerelease/figures/illustration_simplices.png
--------------------------------------------------------------------------------
/blog/hello-world/hello-world-bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/hello-world/hello-world-bg.jpg
--------------------------------------------------------------------------------
/blog/hello-world/hello-world-thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/hello-world/hello-world-thumbnail.png
--------------------------------------------------------------------------------
/blog/hello-world/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Hello World!"
3 | description: "For the past years, my homepage has just been a placeholder. It served a single purpose: People who enter the domain of my email address in their browser should not look at some weird empty page. So here we go!"
4 | date: 05-20-2022
5 | categories:
6 | - news
7 | image: hello-world-thumbnail.png
8 | reference-location: margin
9 | draft: false
10 | title-block-banner: hello-world-bg.jpg
11 |
12 | format:
13 | html:
14 | include-before-body: ../../html/margin_image.html
15 | include-after-body: ../../html/blog_footer.html
16 | ---
17 |
18 | (Photo by [Markus Spiske](https://www.pexels.com/photo/display-coding-programming-development-1921326/))
19 |
20 | For the past years, my homepage was just a placeholder. It served a single purpose: People who enter the domain of my email address in their browser should not look at some weird empty page. So here we go!
21 |
22 | Thanks to the incredible Quarto project it was really a matter of a few hours to set everything up. Thank you!
23 |
24 | BTW: The top banner is a stock photo. If I ever produce code that looks anything like this dense mess, please remind me to quit programming forever.
25 |
26 | As pretty much every aspiring early career researcher, I am obviously planning to publish valuable, insightful, and thought-provoking blog posts regularly. See you ~~tomorrow~~ ~~next week~~ ~~in a month~~ at some time for the first actual post. Cheers!
--------------------------------------------------------------------------------
/blog/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "`Marvin.log()`"
3 | author: ""
4 | title-block-banner: false
5 | page-layout: full
6 | description-meta: "Welcome to my blog, I’m thrilled to welcome you! Here, you will find a collection of articles on a wide variety of topics. Take a look around and let me know what you think!"
7 |
8 | listing:
9 | - id: posts_2024
10 | contents:
11 | - "outlines-r/index.qmd"
12 | - "laptop-mic-obs/index.qmd"
13 | - "youtube-channel/index.qmd"
14 | - "emnist-manual-loading/index.qmd"
15 | sort: "date desc"
16 | template: ../html/blog/listing.ejs
17 | categories: true
18 | - id: posts_2023
19 | contents:
20 | - "functional-programming-r-basics/index.qmd"
21 | - "scientists-should-have-a-website/index.qmd"
22 | - "website-tutorial-quarto/index.qmd"
23 | - "agile-methods-for-academia/index.qmd"
24 | - "ggsimplex-prerelease/index.qmd"
25 | - "4-realizations-from-atomic-habits/index.qmd"
26 | - "mac-email-shortcut/index.qmd"
27 | sort: "date desc"
28 | template: ../html/blog/listing.ejs
29 | categories: true
30 | - id: posts_2022
31 | contents:
32 | - "hello-world/index.qmd"
33 | sort: "date desc"
34 | template: ../html/blog/listing.ejs
35 |
36 | toc-title: Year
37 | toc-location: right
38 | date-format: "MMMM D, YYYY"
39 | image: ""
40 | code-tools: false
41 | comments: false
42 | ---
43 |
44 | Welcome to my blog, which I called `Marvin.log()`. Here's a loose collection of articles. Currently, there is no real ordering or coherent theme, but that might change in the future. I'm not very consistent with writing regular blog posts either -- I'm proud that I made it past the lonely "Hello World!" post though. If you want to get a notification when I add a new blog post, you can enter your email address at the bottom of the page. It's free and I won't send spam. I appreciate any kind of feedback and I'm genuinely thankful for your interest and time.
45 |
46 | ## 2024
47 |
48 | :::{#posts_2024}
49 | :::
50 |
51 | ## 2023
52 |
53 | :::{#posts_2023}
54 | :::
55 |
56 | ## 2022
57 |
58 | :::{#posts_2022}
59 | :::
60 |
61 | ---
62 |
63 | The blog post listing is based on the website source of [Andrew Heiss](https://www.andrewheiss.com/), who has put together an incredible listing template under CC-BY-SA 4.0 license. Thank you!
--------------------------------------------------------------------------------
/blog/laptop-mic-obs/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Make your built-in laptop mic sound good in OBS"
3 | description: "Some quick tips to improve the audio quality of your recordings and screen captures."
4 | date: 08-10-2024
5 | categories:
6 | - technology
7 | image: thumbnail.png
8 | draft: false
9 | format:
10 | html:
11 | fig-cap-location: bottom
12 | include-before-body: ../../html/margin_image.html
13 | include-after-body: ../../html/blog_footer.html
14 | editor:
15 | markdown:
16 | wrap: sentence
17 | resources:
18 | - "thumbnail.png"
19 | ---
20 |
21 | I recorded a short tutorial video, where I walk you through the steps to improve the audio quality of your built-in laptop microphone in OBS. Here's the video:
22 |
23 | {{< video https://www.youtube.com/watch?v=r2vSvVaIWNc
24 | title="Make your built-in laptop microphone sound good in OBS"
25 | aspect-ratio="16x9" >}}
26 |
27 |
28 | The video is unlisted because it doesn't fit in the usual content of my channel. If you're interested in a polished version of the video for the main channel, let me know and I'll add it to my content list. If you have any questions or suggestions, feel free to reach out -- always happy to help.
--------------------------------------------------------------------------------
/blog/laptop-mic-obs/thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/laptop-mic-obs/thumbnail.png
--------------------------------------------------------------------------------
/blog/mac-email-shortcut/img/email_shortcut.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/mac-email-shortcut/img/email_shortcut.gif
--------------------------------------------------------------------------------
/blog/mac-email-shortcut/img/email_shortcut.mov:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/mac-email-shortcut/img/email_shortcut.mov
--------------------------------------------------------------------------------
/blog/mac-email-shortcut/img/screenshot_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/mac-email-shortcut/img/screenshot_1.png
--------------------------------------------------------------------------------
/blog/mac-email-shortcut/img/screenshot_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/mac-email-shortcut/img/screenshot_2.png
--------------------------------------------------------------------------------
/blog/mac-email-shortcut/img/screenshot_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/mac-email-shortcut/img/screenshot_3.png
--------------------------------------------------------------------------------
/blog/mac-email-shortcut/img/screenshot_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/mac-email-shortcut/img/screenshot_4.png
--------------------------------------------------------------------------------
/blog/mac-email-shortcut/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Quick hack: Mac email shortcut "
3 | description: "Create a custom keyboard shortcut for your email addresses on Mac."
4 | date: 01-24-2023
5 | categories:
6 | - tech
7 | image: mac_email_thumbnail_new.png
8 | reference-location: margin
9 | draft: false
10 |
11 | format:
12 | html:
13 | include-before-body: ../../html/margin_image.html
14 | include-after-body: ../../html/blog_footer.html
15 | ---
16 |
17 |
18 |
19 | 👆 That shortcut has saved me a bunch of time, and many many typos in email addresses. Whenever I type `@@g`, my computer automatically changes that to `mail.marvinschmitt@gmail.com`.
20 |
21 | I have a `@@_` shortcut for every email address I use. In this short blog post, I'll give you a quick tutorial on how to set up these custom shortcuts on a Mac. It's probably gonna take you less than five minutes, and save you way more than that in return.
22 |
23 | ⭐ Sounds like a plan? Let's go! ⭐
24 |
25 | 1. Go to `System Preferences` and select the `Keyboard` submenu.\
26 | 
27 |
28 | 2. Navigate to the `Text` tab and hit the `+` button to add a new shortcut.\
29 | 
30 |
31 | 3. Add the *Shortcut* to the "Replace" column, and the full email address to the "With" column. I recommend to prefix the shortcut with `@@` because it makes it practically impossible to trigger the shortcut accidentally. Yet, it's reminiscent of an email address.\
32 | 
33 |
34 | 4. Repeat, profit.\
35 | 
36 |
37 | 🏁 That's it! 🥳
38 |
39 | You can use this method to create many more custom shortcuts, but my primary use case are all my email addresses. What are your ideas for custom shortcuts? I'd love to hear about them in the comment section below 👇
40 |
41 | PS: This method has one crucial caveat. When I'm typing on someone else's computer, I regularly type `@@g` on laser speed, followed by a brief moment of confusion, and a brief moment of disappointment when the shortcut doesn't fire. But well, *He giveth and he taketh away* 🤷
42 |
43 | \-\--
44 |
45 | Thumbnail photo by Maksim Goncharenok: https://www.pexels.com/photo/gold-letter-y-on-black-background-5605061/
46 |
--------------------------------------------------------------------------------
/blog/mac-email-shortcut/mac_email_thumbnail_new.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/mac-email-shortcut/mac_email_thumbnail_new.png
--------------------------------------------------------------------------------
/blog/outlines-r/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Structured Language Generation with Outlines in R"
3 | description: "Calling the Outlines Python package in R with the reticulate package, with OpenAI's GPT-4o as a language model."
4 | date: 10-15-2024
5 | categories:
6 | - tech
7 | - programming
8 | draft: false
9 | number-sections: false
10 | image: outlines-r-thumbnail.png
11 | format:
12 | html:
13 | fig-cap-location: bottom
14 | include-before-body: ../../html/margin_image.html
15 | include-after-body: ../../html/blog_footer.html
16 | comments: false
17 | editor:
18 | markdown:
19 | wrap: sentence
20 | ---
21 |
22 | Python is a great Swiss army knife for many tasks, especially when it comes to deep learning these days.
23 | However, many statisticians and data scientists prefer working in R.
24 | In this short blog post, we'll use the `reticulate` package to work with Python code inside R.
25 | This lets us use the great `outlines` package by dottxt, and OpenAI's GPT-4o as a language model backend.
26 |
27 | ## Load Reticulate and Set Up the Environment
28 |
29 | Load the `reticulate` library to interface between R and Python, and specify the conda environment that contains the necessary Python packages (`outlines`, `openai` and `tiktoken` in my case).
30 |
31 | ```{r}
32 | library(reticulate)
33 | use_condaenv("/Users/marvin/miniforge3/envs/outlines_py310", required = TRUE)
34 | os <- import("os")
35 | outlines <- import("outlines")
36 | ```
37 |
38 | ## Set Up the OpenAI Model
39 |
40 | Set up the OpenAI model using the `outlines` package.
41 | You should not write your API key directly in the code.
42 | Instead, we use an environment variable which we set in the terminal before running the R script.
43 | This ensures that you don't accidentally leak your secret API key.
44 |
45 | ```{r}
46 | api_key <- Sys.getenv("OPENAI_API_KEY")
47 | model <- outlines$models$openai("gpt-4o", api_key = api_key)
48 | ```
49 |
50 | ## Generate a Response
51 |
52 | Now we'll use the language model to answer a question, and restrict the answer to a choice from multiple options.
53 | For demonstration purposes, let's see whether GPT-4 can answer a basic question about Bayesian statistics.
54 |
55 | ```{r}
56 | choices = c("Prior", "Likelihood", "Marginal Likelihood", "Evidence", "Posterior")
57 | generator <- outlines$generate$choice(model, choices)
58 |
59 | result <- generator("In a Bayesian model, what do we call the probability distribution of parameters given the data?")
60 | print(result)
61 | ```
62 |
63 | Let's try another more technical question, this time about the choice of a suitable distribution family to model count data.
64 |
65 | ```{r}
66 | choices = c("Gaussian", "Poisson", "Negative-Binomial", "Gamma")
67 | generator <- outlines$generate$choice(model, choices)
68 |
69 | result <- generator("We have a Bayesian model for count data $y$. The data $y$ is lower-bounded at zero, can take on integer values, and is probably overdispersed. The most suitable distribution family for the data model is ")
70 | print(result)
71 | ```
72 |
73 |
74 | ## Next Steps
75 |
76 | In this demonstrator, we used `reticulate` as a simple bridge to call Python packages from within R.
77 | As a next steps, you can try other generation schemes (not just multiple choice) or build more complex pipelines.
78 | Also, Outlines really shines if you use it with a local open source LLM, so you should try that as well.
79 |
--------------------------------------------------------------------------------
/blog/outlines-r/outlines-r-thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/outlines-r/outlines-r-thumbnail.png
--------------------------------------------------------------------------------
/blog/scientists-should-have-a-website/index.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "raw",
5 | "metadata": {},
6 | "source": [
7 | "---\n",
8 | "title: \"Every Scientist Should Have a Website\"\n",
9 | "description: \"How putting yourself out there helps you show your research, expand your network, control your own content, reach an audience, and enhance your opportunities.\"\n",
10 | "date: 06-21-2023\n",
11 | "categories: \n",
12 | " - website\n",
13 | " - academia\n",
14 | "image: thumbnail.png\n",
15 | "draft: false\n",
16 | "format:\n",
17 | " html:\n",
18 | " fig-cap-location: bottom\n",
19 | " include-before-body: ../../html/margin_image.html\n",
20 | " include-after-body: ../../html/blog_footer.html\n",
21 | "editor: \n",
22 | " markdown: \n",
23 | " wrap: sentence\n",
24 | "resources: \n",
25 | " - \"thumbnail.png\"\n",
26 | " - \"quarto-tutorial-screenshot.png\"\n",
27 | "---"
28 | ],
29 | "id": "9f26fa6a"
30 | },
31 | {
32 | "cell_type": "markdown",
33 | "metadata": {},
34 | "source": [
35 | "In today's fast-paced and competitive academic landscape, establishing a strong online presence is crucial for scientists to showcase their research, connect with peers, and enhance their professional brand. While a digital publication list is undoubtedly valuable, having a personal website offers much more than a mere collection of papers. It serves as a powerful tool that allows scientists to highlight their achievements, foster collaborations, and inspire others on a global scale. In this blog post, we will explore compelling reasons why every scientist should have a personal website and discover how it can significantly benefit their scientific career.\n",
36 | "\n",
37 | "# Reason 1: Showcasing Your Research Journey\n",
38 | "\n",
39 | "Imagine having a central hub where you can effectively present your research achievements, publications, and expertise to the scientific community and beyond. A personal website provides precisely that. By curating your work in one place, you can stand out in the competitive scientific landscape and make it easier for others to discover and appreciate your valuable contributions. This platform offers a holistic view of your research journey, establishing you as a credible authority in your field.\n",
40 | "\n",
41 | "# Reason 2: Expanding Your Professional Network\n",
42 | "\n",
43 | "Collaboration is key to scientific progress. Your personal website acts as a gateway, connecting you with fellow scientists, potential collaborators, and industry professionals. It opens doors to new opportunities and facilitates the expansion of your professional network. By providing contact information and showcasing your research interests, you can attract like-minded individuals who share your passion and expertise. Through your website, you can foster collaborations, exchange ideas, and forge valuable connections that propel your research endeavors to new heights.\n",
44 | "\n",
45 | "# Reason 3: Exerting Control Over Your Online Presence\n",
46 | "\n",
47 | "In today's digital age, maintaining control over your online presence is essential. While social media platforms and other online channels offer great reach, they often come with limitations and constraints. A personal website grants you the freedom to share your research findings, insights, and perspectives on your own terms. You are not bound by character counts or algorithmic filters. This level of control allows you to maintain a professional online persona while freely expressing your thoughts and ideas.\n",
48 | "\n",
49 | "# Reason 4: Reaching a Global Audience\n",
50 | "\n",
51 | "While traditional scientific publications hold immense value, their reach can be limited. A personal website breaks down these barriers, enabling you to reach a global audience. By sharing your research with the world, you can engage with science enthusiasts, inspire others, and make a lasting impact beyond the confines of academia. Whether your goal is to communicate complex scientific concepts to a broader audience or connect with fellow researchers on a global scale, a personal website provides an ideal platform to achieve these goals effectively.\n",
52 | "\n",
53 | "# Reason 5: Enhancing Career Opportunities\n",
54 | "\n",
55 | "A personal website serves as a powerful tool for potential employers and academic institutions to explore your work, achievements, and contributions. It offers them a comprehensive understanding of your expertise, research interests, and the impact of your work. By showcasing your accomplishments and highlighting your unique perspectives, you significantly enhance your chances of securing exciting career opportunities. Whether it's a prestigious position in academia, industry collaborations, or speaking engagements, a well-crafted personal website leaves a lasting impression on those seeking to work with you.\n",
56 | "\n",
57 | "# How to Start Today\n",
58 | "\n",
59 | "So why wait? Take the leap and create your personal website today! To assist you, I have prepared a free tutorial and template to get you started on the right foot:\n",
60 | "\n",
61 | "\n",
62 | "\n",
63 | "```{html}\n",
64 | "\n",
65 | "```\n",
66 | "\n",
67 | "\n",
68 | "\n",
69 | "# Conclusion\n",
70 | "\n",
71 | "In summary, having a personal website is no longer a luxury but a necessity for scientists. It empowers you to showcase your work, expand your professional network, maintain control over your content, reach a global audience, and enhance your career opportunities. So, seize the opportunity and create your personal website today! By harnessing the power of this platform, you can amplify your research impact, connect with peers worldwide, and inspire others to join you on the path of scientific exploration and discovery."
72 | ],
73 | "id": "d07d974e"
74 | }
75 | ],
76 | "metadata": {
77 | "kernelspec": {
78 | "display_name": "Python 3",
79 | "language": "python",
80 | "name": "python3"
81 | }
82 | },
83 | "nbformat": 4,
84 | "nbformat_minor": 5
85 | }
--------------------------------------------------------------------------------
/blog/scientists-should-have-a-website/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Every Scientist Should Have a Website"
3 | description: "How putting yourself out there helps you show your research, expand your network, control your own content, reach an audience, and enhance your opportunities."
4 | date: 06-21-2023
5 | categories:
6 | - website
7 | - academia
8 | image: thumbnail.png
9 | draft: false
10 | format:
11 | html:
12 | fig-cap-location: bottom
13 | include-before-body: ../../html/margin_image.html
14 | include-after-body: ../../html/blog_footer.html
15 | editor:
16 | markdown:
17 | wrap: sentence
18 | resources:
19 | - "thumbnail.png"
20 | - "quarto-tutorial-screenshot.png"
21 | ---
22 |
23 | # Introduction
24 |
25 | In today's fast-paced academic landscape, establishing a strong online presence is crucial for scientists to showcase their research, connect with peers, and build their professional brand. Don't get me wrong, a digital publication list is nice and cool; but having a personal website means much more than a mere collection of papers. It is a great tool to highlight our achievements, foster collaborations, and inspire others on a global scale. Let's take a look at five compelling reasons why you should consider creating your own website as well.
26 |
27 | # Reason 1: Showcase Your Work
28 |
29 | Imagine having a central hub where you can effectively present your research achievements, publications, and expertise to the scientific community and beyond. A personal website provides precisely that. By curating your work in one place, you can stand out in the competitive scientific landscape and make it easier for others to discover and appreciate your valuable contributions. This platform offers a great view of your research journey.
30 |
31 | # Reason 2: Expand Your Network
32 |
33 | Collaboration is key to scientific progress. Your personal website acts as a gateway, connecting you with fellow scientists, potential collaborators, and industry professionals. It opens doors to new opportunities and facilitates the expansion of your professional network. By providing contact information and writing about your research interests, you can attract like-minded individuals who share your passion and expertise. Through your website, you can foster collaborations, exchange ideas, and forge valuable connections.
34 |
35 | # Reason 3: Have Control Over Your Content
36 |
37 | In today's digital age, maintaining control over your online presence is essential. While social media platforms and other online channels offer great reach, they often come with limitations and constraints. A personal website grants you the freedom to share your research findings, insights, and perspectives on your own terms. You are not bound by character counts or algorithmic filters. This level of control allows you to maintain a professional online persona while freely expressing your thoughts and ideas.
38 |
39 | # Reason 4: Reach an Audience
40 |
41 | While traditional scientific publications are the currency of academia, their reach can be limited. A personal website breaks down these barriers and makes you reach a global audience. By sharing your research with the world, you can engage with science enthusiasts, inspire others, and make a lasting impact beyond academic papers. Whether your goal is to communicate complex scientific concepts to a broader audience or connect with fellow researchers on a global scale, a personal website will bring you one step closer to your goal.
42 |
43 | # Reason 5: Enhance Opportunities
44 |
45 | A personal website is a way for potential employers and academic institutions to find out about your work, achievements, and contributions. It offers them a comprehensive understanding of your expertise, research interests, and the impact of your work. By showcasing your accomplishments and highlighting your unique perspectives, you can enhance your chances of exciting career opportunities.
46 |
47 | # How to Start Today
48 |
49 | So why wait? Take the leap and create your personal website today! To assist you, I have prepared a free tutorial and template to get you started on the right foot:
50 |
51 |
52 | ```{=html}
53 |
54 | ```
55 |
56 |
57 | # Conclusion
58 |
59 | Having a personal website empowers you to showcase your work, expand your professional network, maintain control over your content, reach a global audience, and enhance your career opportunities.
60 | Remember: Your research is valuable, and you can create a personal website to put yourself out there and share your knowledge with others in no time.
--------------------------------------------------------------------------------
/blog/scientists-should-have-a-website/quarto-tutorial-screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/scientists-should-have-a-website/quarto-tutorial-screenshot.png
--------------------------------------------------------------------------------
/blog/scientists-should-have-a-website/thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/scientists-should-have-a-website/thumbnail.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/custom_styles.css:
--------------------------------------------------------------------------------
1 | .tip-thanks p{
2 | font-size: 8pt;
3 | color: gray;
4 | }
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/opengraph_thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/opengraph_thumbnail.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/screenshots/screenshot_github_pages_settings.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/screenshots/screenshot_github_pages_settings.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/screenshots/screenshot_github_repo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/screenshots/screenshot_github_repo.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/screenshots/screenshot_rstudio_build_tab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/screenshots/screenshot_rstudio_build_tab.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/screenshots/website_template_screenshot_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/screenshots/website_template_screenshot_1.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/screenshots/website_template_screenshot_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/screenshots/website_template_screenshot_2.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/screenshots/website_template_screenshot_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/screenshots/website_template_screenshot_3.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/screenshots/website_template_screenshot_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/screenshots/website_template_screenshot_4.png
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/screenshots/website_url_meme.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/screenshots/website_url_meme.jpeg
--------------------------------------------------------------------------------
/blog/website-tutorial-quarto/website-tutorial-thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/website-tutorial-quarto/website-tutorial-thumbnail.png
--------------------------------------------------------------------------------
/blog/youtube-channel/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "I started a YouTube channel!"
3 | description: "The videos will be about early career research, technical ML/DL topics, and applied programming in R and Python. Check out my first video!"
4 | date: 07-12-2024
5 | categories:
6 | - announcement
7 | draft: false
8 | number-sections: false
9 | image: youtube-channel-thumbnail.jpeg
10 | format:
11 | html:
12 | fig-cap-location: bottom
13 | include-before-body: ../../html/margin_image.html
14 | include-after-body: ../../html/blog_footer.html
15 | comments: false
16 | editor:
17 | markdown:
18 | wrap: sentence
19 | ---
20 |
21 | This is a short blog post to share an exciting announcement with you.
22 | This thought has been on my mind for a while, and I finally decided to take the plunge.
23 |
24 | ## ✨ I’m starting a YouTube channel ✨
25 |
26 | The videos on the YouTube channel will fall into three categories:
27 |
28 | - Early career research: tips and advice based on my own experience
29 |
30 | - Technical topics: Data science, machine learning, and deep learning
31 |
32 | - Applied programming: Visualization, reports, websites, and software design in R and Python
33 |
34 | {{< tweet user=MarvinSchmittML id=1809903233751503253 >}}
35 |
36 | ## About the channel 🧭
37 |
38 | The direction of the channel is not set in stone, and I’ll try to figure things out along the way.
39 | For now, my main goal is to get better at talking to the camera and practice video editing.
40 | If that piques your interest, I would be thrilled if you checked out my channel.
41 | In my first video, I talk about my background and my plans for the channel (i.e., I have none lol)
42 |
43 | {{< youtube 5Z9yNEgbbfU >}}
44 |
45 | ## Restructuring my website and newsletter 🏗
46 |
47 | The launch of the YouTube channel will lead to some restructuring work on my website overall.
48 | Setting up the channel made me think about what my vision is for future content.
49 | The blog will follow the same structure as the channel, with posts on early career research, technical ML/DL topics, and applied programming.
50 | I plan to use the `tag` system to make it easier for you to find the content you are interested in.
51 | This whole process may take a while and I appreciate your patience.
52 | For now, the **newsletter** (see bottom of the page) will mainly be used to send notifications about new content.
53 | I would like to focus on a consistent content schedule before I start sending out newsletters with additional content.
54 | So if you want to stay up to date and get occasional updates directly into your inbox, feel free to subscribe below (it's free!).
55 |
56 | ## What are your thoughts? 🧠
57 |
58 | You would make my day if you took a minute to engage with my content.
59 | I truly appreciate any kind of feedback (e.g., my voice is too bass-heavy in the video) or comments.
60 | For example, you might want to let me know:
61 |
62 | - What topics should I cover?
63 | - Do you have positive examples of similar content that you enjoy?
64 | - What mistakes should I avoid? What annoys you about other creators?
65 | - What makes a video worth watching for you?
66 | - How can I add to the existing conversation on early career research and machine learning?
67 |
68 | ## Get in touch 📬
69 |
70 | Feel free to drop me a message via email ([mail.marvinschmitt@gmail.com](mailto:mail.marvinschmitt@gmail.com)), or reach out on any social media platform.
71 |
72 | Thanks for reading, see you!
73 |
74 | --Marvin
75 |
--------------------------------------------------------------------------------
/blog/youtube-channel/youtube-channel-thumbnail.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/blog/youtube-channel/youtube-channel-thumbnail.jpeg
--------------------------------------------------------------------------------
/cv/CV_Marvin_Schmitt.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/marvinschmitt/marvinschmitt.github.io/de17fb2893d209c86b6cb19dad328addc13cda11/cv/CV_Marvin_Schmitt.pdf
--------------------------------------------------------------------------------
/cv/index.qmd:
--------------------------------------------------------------------------------
1 | ---
2 | layout: page
3 | title: Curriculum vitae
4 | excerpt: My current CV
5 | comments: false
6 | execute:
7 | freeze: true # never re-render during project render
8 | engine: knitr
9 | cv:
10 | pdf: "CV_Marvin_Schmitt.pdf"
11 | ---
12 |
13 | ```{css echo=FALSE}
14 | .embed-container {
15 | position: relative;
16 | padding-bottom: 129%;
17 | height: 0;
18 | overflow: hidden;
19 | max-width: 100%;
20 | }
21 | .embed-container iframe,
22 | .embed-container object,
23 | .embed-container embed {
24 | position: absolute;
25 | top: 0;
26 | left: 0;
27 | width: 100%;
28 | height: 100%;
29 | }
30 | ```
31 |
32 | ```{=html}
33 |
I am a Data and Computer Scientist and a Psychologist.
7 | Explore my blog and newsletter to learn more about deep learning, Bayesian statistics, psychology, software engineering, and a bit of everything in between.