From 7c54e5f1b97a75b451baf2b9e3f13d919915f18b Mon Sep 17 00:00:00 2001 From: Emmanuel Lujan Date: Sun, 29 May 2022 13:29:14 -0400 Subject: [PATCH 1/6] Removing Xranklin dependency and adding two missing variables to avoid warnings. The issue related to variables arbitrarily set to 'nothing' persists. You must run 'serve' twice for it to work. Is this a bug in Franklin? --- Project.toml | 1 - index.md | 2 ++ news/index.md | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 7017d96..96288a9 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,6 @@ [deps] Franklin = "713c75ef-9fc9-4b05-94a9-213340da978e" NodeJS = "2bd173c7-0d6d-553b-b6af-13a54713934c" -Xranklin = "558449b0-171e-4e1f-900f-d076a5ddf486" [compat] Franklin = "0.10.56" diff --git a/index.md b/index.md index 54af122..cbda2cb 100644 --- a/index.md +++ b/index.md @@ -1,2 +1,4 @@ +@def title = "News" + {{news}} diff --git a/news/index.md b/news/index.md index 901bb9a..7321b73 100644 --- a/news/index.md +++ b/news/index.md @@ -1,3 +1,5 @@ +@def title = "News" + {{news}} From 0720c2d68d8fc7e40721082f6d0b21ff07322abd Mon Sep 17 00:00:00 2001 From: Emmanuel Lujan Date: Tue, 31 May 2022 15:11:13 -0400 Subject: [PATCH 2/6] Replacing @def by +++ --- news/2022/04/hello_world1.md | 17 ++++++++++------- news/2022/04/hello_world10.md | 17 ++++++++++------- news/2022/04/hello_world11.md | 17 ++++++++++------- news/2022/04/hello_world12.md | 18 ++++++++++-------- news/2022/04/hello_world2.md | 18 ++++++++++-------- news/2022/04/hello_world3.md | 18 ++++++++++-------- news/2022/04/hello_world4.md | 18 ++++++++++-------- news/2022/04/hello_world5.md | 18 ++++++++++-------- news/2022/04/hello_world6.md | 18 ++++++++++-------- news/2022/04/hello_world7.md | 18 ++++++++++-------- news/2022/04/hello_world8.md | 17 ++++++++++------- news/2022/04/hello_world9.md | 17 ++++++++++------- news/2022/05/dagger_julius_benchmark.md | 13 ++++++++----- 13 files changed, 128 insertions(+), 96 deletions(-) diff --git a/news/2022/04/hello_world1.md b/news/2022/04/hello_world1.md index e635ef6..a18ea69 100644 --- a/news/2022/04/hello_world1.md +++ b/news/2022/04/hello_world1.md @@ -1,10 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip1" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip1" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world10.md b/news/2022/04/hello_world10.md index 2f3c0dc..b3c7aa7 100644 --- a/news/2022/04/hello_world10.md +++ b/news/2022/04/hello_world10.md @@ -1,10 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip2" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip2" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world11.md b/news/2022/04/hello_world11.md index e635ef6..a18ea69 100644 --- a/news/2022/04/hello_world11.md +++ b/news/2022/04/hello_world11.md @@ -1,10 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip1" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip1" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world12.md b/news/2022/04/hello_world12.md index 2f3c0dc..e1e17d5 100644 --- a/news/2022/04/hello_world12.md +++ b/news/2022/04/hello_world12.md @@ -1,11 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip2" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] - ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip2" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world2.md b/news/2022/04/hello_world2.md index e635ef6..dbc15f1 100644 --- a/news/2022/04/hello_world2.md +++ b/news/2022/04/hello_world2.md @@ -1,11 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip1" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] - ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip1" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world3.md b/news/2022/04/hello_world3.md index 2f3c0dc..e1e17d5 100644 --- a/news/2022/04/hello_world3.md +++ b/news/2022/04/hello_world3.md @@ -1,11 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip2" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] - ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip2" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world4.md b/news/2022/04/hello_world4.md index 2f3c0dc..e1e17d5 100644 --- a/news/2022/04/hello_world4.md +++ b/news/2022/04/hello_world4.md @@ -1,11 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip2" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] - ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip2" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world5.md b/news/2022/04/hello_world5.md index e635ef6..dbc15f1 100644 --- a/news/2022/04/hello_world5.md +++ b/news/2022/04/hello_world5.md @@ -1,11 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip1" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] - ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip1" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world6.md b/news/2022/04/hello_world6.md index 2f3c0dc..e1e17d5 100644 --- a/news/2022/04/hello_world6.md +++ b/news/2022/04/hello_world6.md @@ -1,11 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip2" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] - ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip2" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world7.md b/news/2022/04/hello_world7.md index 2f3c0dc..e1e17d5 100644 --- a/news/2022/04/hello_world7.md +++ b/news/2022/04/hello_world7.md @@ -1,11 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip2" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] - ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip2" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world8.md b/news/2022/04/hello_world8.md index e635ef6..a18ea69 100644 --- a/news/2022/04/hello_world8.md +++ b/news/2022/04/hello_world8.md @@ -1,10 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip1" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip1" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world9.md b/news/2022/04/hello_world9.md index e635ef6..a18ea69 100644 --- a/news/2022/04/hello_world9.md +++ b/news/2022/04/hello_world9.md @@ -1,10 +1,13 @@ -@def post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -@def short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -@def post_author = "Philip1" -@def hascode = true -@def date = Date(2022, 04, 04) -@def rss = "Hello world" -@def tags = ["hpc", "internals", "news"] ++++ +using Dates +post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" +short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." +post_author = "Philip1" +hascode = true +date = Date(2022, 04, 04) +rss = "Hello world" +tags = ["hpc", "internals", "news"] ++++ # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/05/dagger_julius_benchmark.md b/news/2022/05/dagger_julius_benchmark.md index 0581bec..6d40e64 100644 --- a/news/2022/05/dagger_julius_benchmark.md +++ b/news/2022/05/dagger_julius_benchmark.md @@ -1,8 +1,11 @@ -@def title = "Comments on the Julius Graph Engine Benchmark" -@def hascode = true -@def date = Date(2022, 05, 29) -@def rss = "Comments on the Julius Graph Engine Benchmark" -@def tags = ["dagger", "benchmarks", "news"] ++++ +using Date +title = "Comments on the Julius Graph Engine Benchmark" +hascode = true +date = Date(2022, 05, 29) +rss = "Comments on the Julius Graph Engine Benchmark" +tags = ["dagger", "benchmarks", "news"] ++++ # Comments on the Julius Graph Engine Benchmark \toc From 65e913a0178b9c826752599f3fff3691a7e066a8 Mon Sep 17 00:00:00 2001 From: Emmanuel Lujan Date: Mon, 20 Jun 2022 14:15:08 -0400 Subject: [PATCH 3/6] new template with Xranklin --- 404.md | 4 +- Project.toml | 6 - _assets/.DS_Store | Bin 0 -> 6148 bytes _css/adjust.css | 2 +- _css/minimal-mistakes.css | 4 +- _layout/tag.html | 6 +- _libs/.DS_Store | Bin 0 -> 6148 bytes _rss/head.xml | 37 ----- _rss/item.xml | 60 ------- config.md | 25 +-- index.md | 4 +- news/2022/04/hello_world11.md | 1 - news/2022/04/hello_world12.md | 16 -- news/2022/05/dagger_julius_benchmark.md | 207 ------------------------ news/index.md | 6 +- resources/.DS_Store | Bin 0 -> 6148 bytes resources/logos/.DS_Store | Bin 0 -> 6148 bytes teaching/index.md | 4 +- tutorials/index.md | 4 +- tutorials/preferences.md | 5 +- utils.jl | 20 +-- 21 files changed, 29 insertions(+), 382 deletions(-) delete mode 100644 Project.toml create mode 100644 _assets/.DS_Store create mode 100644 _libs/.DS_Store delete mode 100644 _rss/head.xml delete mode 100644 _rss/item.xml delete mode 100644 news/2022/04/hello_world12.md delete mode 100644 news/2022/05/dagger_julius_benchmark.md create mode 100644 resources/.DS_Store create mode 100644 resources/logos/.DS_Store diff --git a/404.md b/404.md index 3faee37..bae7349 100644 --- a/404.md +++ b/404.md @@ -1,4 +1,6 @@ -@def title = "404" ++++ +title = "404" ++++ ~~~
diff --git a/Project.toml b/Project.toml deleted file mode 100644 index 96288a9..0000000 --- a/Project.toml +++ /dev/null @@ -1,6 +0,0 @@ -[deps] -Franklin = "713c75ef-9fc9-4b05-94a9-213340da978e" -NodeJS = "2bd173c7-0d6d-553b-b6af-13a54713934c" - -[compat] -Franklin = "0.10.56" diff --git a/_assets/.DS_Store b/_assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2bc9d3c1a6d8c4df7527037640fb127ac3e23abb GIT binary patch literal 6148 zcmeHKu};H44E42@21?9EdzRuH5xMF8azYdnQ3Pci>|^*sc%8K;gJ9uBCwt^{P8l6hPS-te zGwdP*T70h84YXaqitbR&HC<4ZT~20;A}{3t!w0T=EH(ZnCNI)-o)vTWM$eno`1Npe z{Ij^_uj0z9c8)Kc>K;|Jpj(`)#96whpwo5Vqn-29Ta)vree&WX!|h(3eCUz$F);>= z0b^iS7(mZviN=aH8Ux0FG0-r;-vmQHb`&|7 {{insert style.html}} - Tag: {{fill fd_tag}} + Tag: {{fill tag_name}} {{insert body_layout.html}} -
-

Tag: {{fill fd_tag}}

+
+

Tag: {{fill tag_name}}

{{taglist}} {{insert page_foot.html}}
diff --git a/_libs/.DS_Store b/_libs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d2d6d184e811618cdbbe1d8e713cc1557e03cf93 GIT binary patch literal 6148 zcmeHK%}T>S5T30STI!+4;wgAn=o`cmpP)W~tu3iEX$q|%c*$dU5}!cu9efV)4Lo}F zo1L|8NP_huVrO9X+n<@t?6+mNLquk9J?Rs5iKqo-Y_!o-2(Po2q~T@`fX03!p(~1M zM(ZRlS?k1KWPs1EjT4h|^Ukk7yv)+2r2IClwo0=o8YkHptF5QodFTD;`Lxb*vZdv6 z=0(P@3bIdg8qu1jbd$v1YVZEBxa#L~ce41*$Ma9KuRN+P3h@sgIDVH>@UwuX$RnX+ zJ6<895i*<7s*sg=*~-Vy^*r9>`fV(K2S4#E?904zjw;H4GO)W0$n8q4&hAp6J68sj zff@$*eh8q9p~GCzUL9y`2>@(j+6wwyOR!JiFm#v;Vg+Kv6)3L8l^90cF&{X)&|xkp z?qpo?VO(V6DimX*CtiJv)I_XFmPzL@L1Ev`bqXD+$ z-qzCQ_^l0~7f=?q%LO+s=-8(iw)_ - - - - - - <![CDATA[ {{fd2rss website_title}} ]]> - - {{website_url}} - - - - - diff --git a/_rss/item.xml b/_rss/item.xml deleted file mode 100644 index 07f6506..0000000 --- a/_rss/item.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - <![CDATA[ {{fd2rss rss_title}} ]]> - - {{fd_full_url}} - {{fd_full_url}} - - - - - - {{if rss_full_content}} - - - - {{end}} - - - {{RFC822 rss_pubdate}} - - - {{isnotempty rss_author}} - {{rss_author}} - {{end}} - {{isnotempty author}} - - {{author}} - - {{end}} - - {{isnotempty rss_category}} - {{rss_category}} - {{end}} - - {{isnotempty rss_comments}} - {{rss_comments}} - {{end}} - - {{isnotempty rss_enclosure}} - {{rss_enclosure}} - {{end}} - diff --git a/config.md b/config.md index 95f280c..7117ba4 100644 --- a/config.md +++ b/config.md @@ -2,34 +2,15 @@ Add here global page variables to use throughout your website. --> +++ + author = "JuliaParallel" mintoclevel = 2 -# Add here files or directories that should be ignored by Franklin, otherwise -# these files might be copied and, if markdown, processed by Franklin which -# you might not want. Indicate directories by ending the name with a `/`. -# Base files such as LICENSE.md and README.md are ignored by default. -ignore = ["node_modules/"] - -# RSS (the website_{title, descr, url} must be defined to get RSS) -generate_rss = true -website_title = "JuliaParallel" -website_descr = "JuliaParallel" -website_url = "https://juliaparallel.org/" - # Author badges using DelimitedFiles author_badges_mat = readdlm("_assets/author-badges.dat", ':') author_badges = Dict() -for i = 1:size(author_badges_mat,1) - author_badges[author_badges_mat[i]] = - rstrip.(lstrip.(split(author_badges_mat[i,2], ","))) -end +[author_badges[author_badges_mat[i]] = rstrip.(lstrip.(split(author_badges_mat[i,2], ","))) + for i in 1:size(author_badges_mat,1) ] +++ - - -\newcommand{\R}{\mathbb R} -\newcommand{\scal}[1]{\langle #1 \rangle} diff --git a/index.md b/index.md index cbda2cb..d9bb4c7 100644 --- a/index.md +++ b/index.md @@ -1,4 +1,6 @@ -@def title = "News" ++++ +title = "News" ++++ {{news}} diff --git a/news/2022/04/hello_world11.md b/news/2022/04/hello_world11.md index a18ea69..dbc15f1 100644 --- a/news/2022/04/hello_world11.md +++ b/news/2022/04/hello_world11.md @@ -8,7 +8,6 @@ date = Date(2022, 04, 04) rss = "Hello world" tags = ["hpc", "internals", "news"] +++ - # Lorem ipsum dolor sit amet \toc diff --git a/news/2022/04/hello_world12.md b/news/2022/04/hello_world12.md deleted file mode 100644 index e1e17d5..0000000 --- a/news/2022/04/hello_world12.md +++ /dev/null @@ -1,16 +0,0 @@ -+++ -using Dates -post_title = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt" -short_descr = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." -post_author = "Philip2" -hascode = true -date = Date(2022, 04, 04) -rss = "Hello world" -tags = ["hpc", "internals", "news"] -+++ -# Lorem ipsum dolor sit amet -\toc - -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - -{{addcomments}} diff --git a/news/2022/05/dagger_julius_benchmark.md b/news/2022/05/dagger_julius_benchmark.md deleted file mode 100644 index 6d40e64..0000000 --- a/news/2022/05/dagger_julius_benchmark.md +++ /dev/null @@ -1,207 +0,0 @@ -+++ -using Date -title = "Comments on the Julius Graph Engine Benchmark" -hascode = true -date = Date(2022, 05, 29) -rss = "Comments on the Julius Graph Engine Benchmark" -tags = ["dagger", "benchmarks", "news"] -+++ - -# Comments on the Julius Graph Engine Benchmark -\toc - -### Introduction - -![Shipping goods over the sea via ocean freighter](https://thumbnails.production.thenounproject.com/GZSNSq5eKQqKDoHfKGOFmb5QT4s=/fit-in/1000x1000/photos.production.thenounproject.com/photos/6D93E0C1-DFF3-410B-8086-214D12A2D362.jpg) -##### Public domain image courtesy of https://thenounproject.com/carolhighsmith/ - -Scheduling is a hard problem, but it's a necessary evil for modern civilization: - -- Moving perishable goods quickly from producer to consumer -- Tracking and re-routing aircraft to prevent collisions while optimizing flight paths -- Planning traffic light timings to avoid gridlock - -In the space of computing, we often have lots of different kinds of tasks we need to complete, but only a few computing resources to fulfill these tasks. There are plenty of naive ways to do scheduling, from round-robin to FIFO and LIFO, and these can work out well when your tasks and computing resources are homogeneous. But life is rarely so simple; tasks can be small or large and can have dependencies on each other, and computing resources aren't all alike (e.g. CPU vs. GPU). Using a naive scheduling algorithm for such problems is a recipe for sitting around, waiting for an analysis or computation to complete. Thankfully, there exist smarter schedulers, like Dask, Ray, and Dagger.jl, which are able to handle heterogeneous task scheduling effectively through resource queries, runtime metric collection, and other smart ideas. - -In this blog post, we'll introduce you to a benchmark of some of these schedulers, and walk you through how I optimized Dagger.jl's scheduler to more efficiently run the benchmark. I'll also introduce you to a new proprietary scheduler platform offered by a Julia-focused startup, and show how it stacks up against the open-source schedulers. I'll finally give some ideas for problems that these schedulers can solve effectively, which will help you understand how these schedulers can support your computational needs. - -### The Julius Graph Engine Benchmark - -In the last few weeks, it came to my attention that [Julius Technologies](https://www.juliustech.co/), a Julia-focused startup, published a [benchmark](https://juliustechco.github.io/JuliusGraph/dev/pages/t007_benchmark.html) of their "Graph Engine", which is a proprietary low/no-code programming platform and graph execution engine, likely written in Julia. They compared the performance of their engine on two kinds of benchmarks, and provided equivalent benchmark scripts written for Dask, TensorFlow, and Dagger.jl. The benchmark showed a very wide margin in runtimes between Julius Graph Engine (which I'll call "JGE") and the competition, with JGE coming in more than an order of magnitude faster, and scaling near-linearly. Notably, Dask and Dagger showed very poor performance, and weren't able to complete most of the benchmark, only working on smaller scales. - -As the maintainer of Dagger.jl, I have skin in this benchmarking game. Most users of Dagger came to it under the premise and with the promise of fast heterogeneous programming. Since these results showed that Dagger struggles with executing certain common kinds of programs, I decided to spend a few days tweaking Dagger to get the performance that I’d want. All of the changes that I’ll be describing in this post are going upstream to Dagger in one way or another. In this blog post, I'll introduce you to graph engines, I'll talk about how I profiled Dagger's runtime costs, and I'll walk you through how I brought Dagger's benchmark runtime down to within 10x of Julius' product offering. - -!!! note Julius has since updated their benchmark showing Dagger doing much better (thanks to improvements spurred by their benchmark), but I've kept my original benchmark results below for the purpose of explanation. - -### Graph Engines in Brief - -Let's back up for a second: why should you care? What is a "graph execution engine", and what does it have to do with graphs? Starting from the top: A "graph execution engine" is just a fancy way of talking about a program which executes code represented as a Directed Acyclic Graph, or DAG. Any program you've ever written can probably be represented as a DAG; the vertices of the DAG are typically basic operations, such as arithmetic or memory access, while the edges of the DAG represent calls between functions, or control flow like `for`-loops or `try-catch` blocks. For an example of this (using Dagger), see [this documentation section](https://juliaparallel.org/Dagger.jl/dev/#Simple-example). - -When typical Julia code is "lowered" by Julia's frontend, it's converted into a graph for later analysis and compilation, although it's not guaranteed to be acyclic (and if you write a `for` or `while` loop, it's definitely not acyclic). But that's not a problem (in theory) for graph execution engines, because you can just "unroll" a non-acyclic directed graph into an acyclic equivalent by doing lots of copy-pasta of the code within each graph cycle. Importantly, this isn't a trivial thing to do *efficiently* and with a nice API, so it's still an active area of research and development for graph execution engines. - -### Benchmark Results - Prelude and Interpretation - -Anyway, that's enough background. Let's scrutinize this benchmark a bit more, because at first guess, we shouldn't expect a newcomer to the graph execution space to handily beat out two different production Python engines and a pure-Julia engine (and kudos to Julius for pulling that off). The benchmark has two forms, which they call [`s_n`](https://juliustechco.github.io/JuliusGraph/dev/assets/widegraph.png) and [`y_n`](https://juliustechco.github.io/JuliusGraph/dev/assets/deepgraph.png) ([details here](https://juliustechco.github.io/JuliusGraph/dev/pages/t007_benchmark.html#Benchmark-Setup-1)). The `s_n` benchmark tests DAGs which are really "wide", which means that a single node has a lot of other directly-connected nodes. The `y_n` benchmark tests DAGs which are really "deep", which means that there is a really long path from start to finish (going through many different nodes). The core or "kernel" of each benchmark is a `fibsum` function, which is very cheap (two multiplies and one add per each of 10 array elements). This kind of setup is a pretty common way to stress-test graph engines, since it greatly stresses and exposes the cost of every little piece of the engine that isn't directly executing the kernel function (in other words, it exposes the overhead of the engine being used). - -Something else that we need to understand about this benchmark is that the four graph engines included are not all alike. First among the differences, there is the question of visibility; can the engine see the entire DAG before it starts executing, or does it only get bits and pieces as it goes along executing? This is an important consideration because being able to see the full DAG means that it's easy to perform optimizations on it, such as combining repetitive sub-graphs with a `for`-loop. - -From what I understand, the JGE can see the whole DAG before execution begins; the same is also true for TensorFlow. Dask, instead, only sees parts of the DAG, as it is being built. I will term these two modes "ahead-of-time" (AOT) and "just-in-time" (JIT), respectively (these are often also referred to as "static" and "dynamic", respectively). So what does Dagger do? Well, in the benchmark, Dagger is being used in JIT mode, although it also supports an AOT mode. JIT mode (using `@spawn` and `fetch`) is what's recommended for most users, as it is often easier to use, and doesn't require knowledge of the full graph before execution can begin. However, AOT mode (using `delayed` and `compute`) has the benefit of being very efficient at consuming a fully constructed DAG, and can use less memory at runtime for reasons I won't get into here. - -#### What graph-building modes are supported? - -| Feature | Dask | Ray | Dagger.jl | JGE | TensorFlow | Cilk | -| :-- | :--: | :--: | :--: | :--: | :--: | -| AOT (static) | :heavy_check_mark: | :heavy_check_mark: (Actors) | :heavy_check_mark: (`delayed`) | :heavy_check_mark: | :heavy_check_mark: (TF 1.x) | :x: | -| JIT (dynamic) | :x: | :heavy_check_mark: (Tasks) | :heavy_check_mark: (`@spawn`) | :x: | :heavy_check_mark (TF 2.x): | :heavy_check_mark: | - -There was also a minor issue with the benchmark that I noticed for Dask and Dagger that could possibly give them an unfair advantage over TF and JGE (which I've reported to Julius, who kindly updated their benchmark results). Specifically, the benchmarking script doesn’t wait on the launched computations to complete. This is a simple matter of calling `f2.compute()` and `fetch(f2)` for Dask and Dagger respectively, to force the execution of the full graph and the retrieval of the final result. - -### Benchmark Results - -For a quick comparison, I chose to briefly switch Dagger into AOT mode to get a better idea of how Dagger directly compared to JGE, and also how it compared with Dagger's JIT mode (Dask also added for comparison, and extra-long runs are excluded): - -Dagger AOT `s_n`: -- 1000: 34.108724 seconds - -Dagger JIT `s_n`: -- 1000: 4.031126 seconds -- 5000: 123.653653 seconds - -Dask `s_n`: -- 1000: 1.6458556 seconds -- 5000: 30.8954490 seconds -- 10000: 136.261454 seconds - -Dagger AOT `y_n`: -- 1000: 0.136007 seconds -- 5000: 0.771038 seconds -- 10000: 1.184655 seconds -- 100000: 13.019151 seconds -- 200000: 27.982819 seconds -- 500000: 73.965525 seconds - -Dagger JIT `y_n`: -- 1000: 3.378034 seconds -- 5000: 128.213972 seconds - -Dask `y_n`: -- 1000: 1.5771625 seconds -- 5000: 31.0315958 seconds -- 10000: 133.501586 seconds - -So AOT mode is *much* better than JIT mode on the `y_n` benchmark. AOT mode has some issues on the `s_n` benchmark, but that's due to splatting not being efficient at large scales in AOT mode (which is part of why I advise against using AOT mode). Still, regardless of the improvements from switching to AOT mode for `y_n`, I was disappointed by Dagger's performance in JIT mode, so I decided to continue investigating what I could do to improve that. The rest of this post will thus focus on Dagger's JIT mode. - -### Oh No! Can we fix it? - -Thankfully, the poor performance exhibited by Dagger is actually just the result of a lack of detailed optimizations in a select few (hot) code paths, which lead to slowdowns which dominate the majority of time that the benchmark was executing. Of course, all of these issues are now fixed on Dagger's `master` branch by the time this blog post reaches your eyes, but let's review what I fixed, just so you know that I'm not pulling a fast one on you. - -First, how did I find out what was slowing things down? Easy answer (and if you've used Julia to do anything performance-sensitive, you can probably guess): `Profile.@profile`. The `Profile` stdlib uses a statistical profiler to help us find where in our code we're spending the most amount of time, and is immensely useful for finding hot code paths in Julia code[^1]. - -Ok, so we've got a way to see where and how our execution time was being spent; what did I actually find? - -### First Fix: Object Size Calculation - -Let's start with the most eggregious offender first: `Base.summarysize()`. This function is simple: it calculates approximately how much memory a given object takes, including every other object it directly or indirectly references. Unfortunately, it is also very slow; because it's recursive, it needs to be able to detect cyclic references, and handles every kind of object that could ever be passed to it with good latency. Furthering the unfortunate situation, our dependency package MemPool.jl calls this function every time a Dagger task produces a result (in `MemPool.poolset`, if you're wondering). If that happens many times, and/or if the objects passed in are somewhat large and complicated, then we'll see this function taking a large proportion of our runtime. And this was exactly what I saw; more than 37% of our runtime was spent here on the 1000-deep run, which is absolutely atrocious (and it gets worse as the depth grows). - -So, what can we do about this? The specific case where this was occuring is in `add_thunk!`, which is where new tasks are generated and added to the scheduler. Here, thankfully, `MemPool.poolset` is being called on a small-ish task object for GC purposes; however, the size will not be used, because task objects can't be serialized over the network or to disk (the only two cases where size is used). To completely eliminate calls to `Base.summarysize()` when we don't want it called, we can just manually specify a size for the object being passed to `MemPool.poolset`, avoiding the `Base.summarysize()` call entirely. Therefore, we can safely pass any arbitrary size value to disable the automatic `Base.summarysize()` call. With [that change](https://github.com/JuliaParallel/Dagger.jl/commit/2f47217c29e4ac9b2f0921df7bc18bdfe4356e2b), how do we fare? - -Dagger JIT `s_n`: -- 1000: 0.899850 seconds -- 5000: 16.065269 seconds -- 10000: 65.198173 seconds - -Dagger JIT `y_n`: -- 1000: 0.947113 seconds -- 5000: 13.962618 seconds -- 10000: 66.801668 seconds - -Ok, that's much better! At 10000 depth, we shaved off about 50% from each benchmark! But we're still showing abysmal scaling, so what's next? - -### Second Fix: Node Memoization - -The next improvement came from how task dependencies are resolved. The `add_thunk!` function calls `reschedule_inputs!` to ensure that all "upstream" dependencies of a given task are satisfied before getting the task ready to be scheduled. While this function was recently optimized due to reported scaling issues, it's still far too slow, mostly because it recursively walks up the dependency chain until it finds that all upstream tasks are actively executing or finished executing. That's pretty silly; while not everything upstream is executing, that doesn't mean we need to keep walking through those tasks everytime we add a new task further down the DAG. What I chose to do was add a memoization dictionary to the scheduler that, when a task has been through `reschedule_inputs!` or an equivalent code path, holds an entry to that task to mark that it's not necessary to traverse it again. This was a [reasonably simple improvement](https://github.com/JuliaParallel/Dagger.jl/commit/c17b86d13423351617c7a68ff2d5dafd27d7d32a), trading a bit of memory for massively decreased execution overhead, leading us to these results: - -Dagger JIT `s_n`: -- 1000: 0.452218 seconds -- 5000: 5.234815 seconds -- 10000: 18.304120 seconds - -Dagger JIT `y_n`: -- 1000: 0.577350 seconds -- 5000: 4.086071 seconds -- 10000: 14.707820 seconds - -Nice, we just cut out 72% of the `s_n` runtime and 78% of the `y_n` runtime. We're making good progress, but let's keep going! - -### Third Fix: Domination Checks - -Still looking at the same region of code, we find that we're spending a lot of runtime in validating that our graph is actually acyclic. More specifically, the `register_future!` function is called from `add_thunk!` to register a `Distributed.Future` that will be filled with the result of the newly-created task once it's done executing, allowing the user to wait on and fetch the task result. This function needs to be somewhat defensive, though, when being called from one task targetting another. If a task tries to register and wait on a future for some other task that is downstream of itself, it will wait forever, because that downstream task won't execute until the task waiting on it completes (thus, a deadlock occurs). Similarly, a task shouldn't be able to wait on itself. To avoid this, `register_future!` checks whether the calling task "dominates" the targetted task; when a task A dominates a task B, that means that the completion of A is necessary before the execution and completion of B can occur. If the calling task dominates the target task, then an error is thrown, preventing accidental deadlock. This check is well-intended, but is also slow; thankfully, when adding tasks with `add_thunk!`, we generally can assume that this new task isn't going to be waited on by a downstream task (it's possible, but a careful developer can trivially avoid it; we shouldn't burden them with unnecessary checks). To alleviate this, I simply added a kwarg to `register_future!` that will by default do the domination check, but can allow it to be manually disabled. For `@spawn`, which implicitly calls `add_thunk!`, we disable the check, because in common usage of that API it's not easy to cause deadlocks[^2]. [This change](https://github.com/JuliaParallel/Dagger.jl/commit/d543c23815de79ae39616045aa1ee285665c014c) gives us the following excellent results: - -Dagger JIT `s_n`: -- 1000: 0.201789 seconds -- 5000: 1.216356 seconds -- 10000: 2.711312 seconds -- 100000: 25.743532 seconds -- 200000: 59.582494 seconds -- 500000: 201.391146 seconds - -Dagger JIT `y_n`: -- 1000: 0.223203 seconds -- 5000: 1.173638 seconds -- 10000: 2.428500 seconds -- 100000: 28.761774 seconds -- 200000: 64.312516 seconds -- 500000: 225.147642 seconds - -Wow, that's about 84% faster! - -This is a good time to stop; trimming down everything else in the profile trace will likely require optimizations that fundamentally affect Dagger's semantics, which are waters that I don't want to wade through just to win a benchmark. With all of these changes in place, the final benchmark that I ran can be found at [this link](https://gist.github.com/jpsamaroo/95c78b3361ae454a51916183f2cf346f) (and make sure to run with Dagger's `master` branch, where all these performance enhancements are now available!). - -### Giving credit where credit is due - -We've spent a lot of time discussing how Dagger can be made to compete better, but let's put that aside for a moment to be realistic and give credit where it's due; the work that Julius has done to make low/no-code programming both productive and performant in Julia (while expertly leveraging the many strengths of the language) is quite exceptional. The problem that their product is solving is one that us programmers often like to forget: programming is *hard* and it's *cumbersome*, and we all sometimes take that for granted when considering the best way for non-programmers to contribute their domain expertise to a business' success. It's easy to say, "Why don't you just learn to program?", but it's so much harder to actually learn even the bare basics (and yet more work to become proficient enough to make all this learning pay off). The Julius Graph Engine and its frontend UI environment cuts out the "cruft" of traditional programming, and lets domain experts do what they are lauded for without having to struggle on programming concepts that they didn't spend their entire schooling and careers training for. - -I know many of us in the Julia community understand this plight, and most of us had to just endure the pain and struggle the struggle to get to the point where we could express our knowledge in the form that our favorite language demands it to be written. While it's not particularly helpful to ask "what if's" about what our future would have looked like if JGE had shown up a bit earlier, we can look toward the future and help Julius build out their product to provide the power of Julia's amazing ecosystem of packages in a form that everyone can enjoy. - -### Debrief - -Let's recap briefly what we've covered over the course of this post: I introduced Julius and their Graph Engine product, explained the basics of graph execution engines, showed off Julius' multi-faceted DAG benchmark, and walked you through how I optimized Dagger to bring our benchmark runtime down from "terrible" to "pretty damned good" through a few different optimizations: - -- Avoiding automatic size calculations when object size is irrelevant -- Using memoization to prevent re-walking sections of the DAG -- Disabling graph cyclicity checks when unnecessary - -!!! note All of these changes are valid because we make certain simplifying assumptions about how code will be executed. If those assumptions stop holding, then we'll have to reconsider the correctness of these optimizations (which is quite similar to the question of when to use `@inbounds` in library code). - -We also recognized that Julius' product offering is a powerful alternative to Dagger, especially for organizations which desire a low/no-code interface and strong performance on very large graphs (among other features). - -### Conclusion - -All of this leads us to a final question: what can Dagger do for you? Maybe you have a lot of images of different sizes that you want to shrink down to thumbnails, while utilizing GPUs where possible. Or you might have many matrices that need to have their eigenvalues calculated with an iterative approach, which can take differing amounts of time. If you're a data scientist, you may have large tables that need processing that you can split into chunks and process independently. You might be developing a SaaS application and need a way to execute "serverless" functions on event triggers. - -#### Important graph engine features - -| Feature | Dask | Ray | Dagger.jl | JGE | TensorFlow | Cilk | -| :------ | :--: | :-: | :-------: | :--------: | :--: | -| Multithreading | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | -| Distributed | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: |:heavy_check_mark: | :x: | -| GPUs | :heavy_check_mark: | :heavy_check_mark: | :heavy_check_mark: | :x: | :heavy_check_mark: | :x: | -| Mutability | :x: | :heavy_check_mark: (Actors) | :heavy_check_mark: (`@mutable`) | :x: | :x: | :heavy_check_mark: | - -There are so many possibilities, and Dagger strives to handle all of them efficiently.If your problem sounds even remotely similar, Dagger might be the right choice for you. If you aren't sure if Dagger will suit your needs, please reach out to me; my contact information is below! - -### Aside: Future work and collaboration - -I must admit, I wasn't sure whether Dagger was going to be able to compete with JGE's performance, but clearly we're now getting pretty close! Of course, there's still more work to do to bring down these times even further, but that can be left for another day and maybe for another contributor. Speaking of which: if this post has gotten you interested in contributing a bit to Dagger (even just some small things like adding some docs, tests, or examples), I'd love the help! Improvements like these aren't too hard to accomplish in an afternoon or two, but can make a huge difference for our users. If you decide that you'd like to help out, please drop me a line! - -In the process of writing this post, I think I made it reasonably clear that graph execution engines are both simple yet simultaneously complicated beasts which rely on good performance engineering to get good runtime performance. Going forward, I'd like to cover other Dagger-related topics, such as the upcoming storage changes (aka "swap-to-disk"), and how to use Dagger and DaggerGPU for seamless GPU computing (among many other possible topics). If you have any ideas for a post that you'd like to read about, please message me with your thoughts! - -### Contact Information - -I'm `@jpsamaroo` on Slack, Zulip, or Discourse, and my email is jpsamaroo -AT- gmail -DOT- com. On Slack, Dagger questions are well-suited for the `#helpdesk`, `#multithreading` and `#distributed` channels. - -[^1]: `Profile.@profile myfunc(...)` runs `myfunc(...)` as usual, but also runs a background statistical profiler while the code is executing. This profiler will stochastically sample stacktraces from the running function, which can later by collected and processed by `Profile.print()`. The result of `Profile.print()` is essentially a view of all collected stacktraces overlayed on top of each other; this gives you a full view of *what* was happening at some point during `myfunc`'s execution. It also shows a counter next to each stackframe (approximately each function call), which shows you *how often* a given code location was hit. Combined with the count of the total number of stacktraces collected (shown at the bottom), it's possible to get an idea of what percentage of `myfunc`'s execution time was caused by each of its components, no matter how far down in the call stack you look. - -[^2]: Julia's native multitasking system also does not provide this check, even though it's fully possible to cause deadlocks in exactly the same way, yet this isn't considered an issue with Julia's multithreading system because the user is doing something that doesn't make semantic sense. - -{{addcomments}} diff --git a/news/index.md b/news/index.md index 7321b73..d9bb4c7 100644 --- a/news/index.md +++ b/news/index.md @@ -1,6 +1,6 @@ -@def title = "News" ++++ +title = "News" ++++ {{news}} - - diff --git a/resources/.DS_Store b/resources/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7ae85f91acecfaa7f8747a4ad40eb157e0474ecb GIT binary patch literal 6148 zcmeHKOG*Pl5UnyJ3}%z1%f=hz24fgckPAo*#Kpu3gzWoVuDz4s%2!>b*gD`Yh`fU8 zS6!c;nFrI|B_g^yZI>bo5ow`@YQ}_^dopwp$qi7;8pmO`TtAHa!^ARw(`D~|DT9o% zgVygqd%mip`?2pg!?=OBJ-t26UvFM+zh`WJ$v8ZIVW>$cr;q_MKnBPF88|BgII~UK zxg$q1KnBRbCj+)WB&cB*m>tX3fuXbjK)Xg4fo;8n)ug~KFgqdwQ7;90sYZ*TUJieX zye=?1dbwyc9~w{oXkN5D9qXr(F4{SABm-oiW?<&ig`NL*_+=)W{JMlQGC&6Y83Wq% z>wblginH~{=h<1Cp!ZM{%gbg!U{{v_Ol%*yEIhMi@0DI?-OEQGkFBMf z@8P;`^X0gzZu4DQd-?EHT$}-Cz!`7`oPje2>~tt5XL_GH1I~amAp1i=6O4vQF>f8{ z@--hghB^zzQcFloFpP#t5f%t*C{RP$N(|O;=!5x1!=$L;#8zOiWj+-zoU>#7kll%+ zqW8{#Gtg&1t5KTD`G1dJX0XWbhxp7Ha0dPv13WI5dc*{Jp)WB5hGq$sP1K8FMSB9IC3&KdXx2EG9awm)_N literal 0 HcmV?d00001 diff --git a/teaching/index.md b/teaching/index.md index ae98ece..00bb473 100644 --- a/teaching/index.md +++ b/teaching/index.md @@ -1,4 +1,6 @@ -@def title = "Teaching" ++++ +title = "Teaching" ++++ # Tutorials diff --git a/tutorials/index.md b/tutorials/index.md index 35a01f2..060834b 100644 --- a/tutorials/index.md +++ b/tutorials/index.md @@ -1,4 +1,6 @@ -@def title = "Tutorials" ++++ +title = "Tutorials" ++++ # Tutorials diff --git a/tutorials/preferences.md b/tutorials/preferences.md index 3992626..ead3fe1 100644 --- a/tutorials/preferences.md +++ b/tutorials/preferences.md @@ -1,5 +1,6 @@ -@def title = "Preferences" -@def hascode = true ++++ +title = "Preferences" ++++ # Preferences diff --git a/utils.jl b/utils.jl index 0764d01..51fefc1 100644 --- a/utils.jl +++ b/utils.jl @@ -1,20 +1,4 @@ - -function hfun_bar(vname) - val = Meta.parse(vname[1]) - return round(sqrt(val), digits=2) -end - -function hfun_m1fill(vname) - var = vname[1] - return pagevar("index", var) -end - -function lx_baz(com, _) - # keep this first line - brace_content = Franklin.content(com.braces[1]) # input string - # do whatever you want here - return uppercase(brace_content) -end +using Dates """ {{news}} @@ -76,7 +60,7 @@ function hfun_news() lines[i] *= """
""" end # sort by day - foreach(line -> write(io, line), lines[sortperm(days, rev=true)]) + foreach(line -> write(io, line), lines[sortperm(days, rev=false)]) end end write(io, """
""") From 84b44a1170e0f01af0b3980addece91841651396 Mon Sep 17 00:00:00 2001 From: Emmanuel Lujan Date: Mon, 20 Jun 2022 14:35:54 -0400 Subject: [PATCH 4/6] update Deploy.yml --- .github/workflows/Deploy.yml | 58 +++++++++++++----------------------- 1 file changed, 20 insertions(+), 38 deletions(-) diff --git a/.github/workflows/Deploy.yml b/.github/workflows/Deploy.yml index d56e009..7002b5b 100644 --- a/.github/workflows/Deploy.yml +++ b/.github/workflows/Deploy.yml @@ -1,45 +1,27 @@ -name: Build and Deploy +name: Deploy + on: push: branches: - main - - master + jobs: - build-and-deploy: + deploy: runs-on: ubuntu-latest + permissions: write-all steps: - - name: Checkout - uses: actions/checkout@v2 - with: - persist-credentials: false - # NOTE: Python is necessary for the pre-rendering (minification) step - - name: Install python - uses: actions/setup-python@v2 - with: - python-version: '3.8' - # NOTE: Here you can install dependencies such as matplotlib if you use - # packages such as PyPlot. - # - run: pip install matplotlib - - name: Install Julia - uses: julia-actions/setup-julia@v1 - with: - version: 1.6 - # NOTE - # The steps below ensure that NodeJS and Franklin are loaded then it - # installs highlight.js which is needed for the prerendering step - # (code highlighting + katex prerendering). - # Then the environment is activated and instantiated to install all - # Julia packages which may be required to successfully build your site. - # The last line should be `optimize()` though you may want to give it - # specific arguments, see the documentation or ?optimize in the REPL. - - run: julia -e ' - using Pkg; Pkg.activate("."); Pkg.instantiate(); - using NodeJS; run(`$(npm_cmd()) install highlight.js`); - using Franklin; - optimize()' - - name: Build and Deploy - uses: JamesIves/github-pages-deploy-action@releases/v3 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: __site + - uses: actions/checkout@v2 + - uses: tlienart/xranklin-build-action@v3.2 + with: + # NOTE: this is the Xranklin branch the site is built with + BRANCH: "dev" + # NOTE: this is the base URL prefix (landing page at /$BASE_URL_PREFIX/) + BASE_URL_PREFIX: "juliaparallel-xr" + + # =================================================================== + # DON'T CHANGE THE FOLLOWING UNLESS YOU HAVE GOOD REASONS TO + # >> amounts to build(clear=true) when commit message contains [clear] + CLEAR_CACHE: ${{ contains(github.event.head_commit.message, '[clear]') }} + # >> change the digit at the end if, for some reason, you believe + # that the cache used by the github action has an issue + CACHE_KEY: "franklin-cache" From 11dde20d977d3b712a502225dbf1936c43be26f2 Mon Sep 17 00:00:00 2001 From: Emmanuel Lujan Date: Tue, 21 Jun 2022 17:11:25 -0400 Subject: [PATCH 5/6] removing .DS_Store files, update on .gitignore and deploy.yml --- .github/workflows/Deploy.yml | 2 +- .gitignore | 5 ++++- _assets/.DS_Store | Bin 6148 -> 0 bytes _libs/.DS_Store | Bin 6148 -> 0 bytes resources/.DS_Store | Bin 6148 -> 0 bytes resources/logos/.DS_Store | Bin 6148 -> 0 bytes 6 files changed, 5 insertions(+), 2 deletions(-) delete mode 100644 _assets/.DS_Store delete mode 100644 _libs/.DS_Store delete mode 100644 resources/.DS_Store delete mode 100644 resources/logos/.DS_Store diff --git a/.github/workflows/Deploy.yml b/.github/workflows/Deploy.yml index 7002b5b..98a69d2 100644 --- a/.github/workflows/Deploy.yml +++ b/.github/workflows/Deploy.yml @@ -16,7 +16,7 @@ jobs: # NOTE: this is the Xranklin branch the site is built with BRANCH: "dev" # NOTE: this is the base URL prefix (landing page at /$BASE_URL_PREFIX/) - BASE_URL_PREFIX: "juliaparallel-xr" + BASE_URL_PREFIX: "" # =================================================================== # DON'T CHANGE THE FOLLOWING UNLESS YOU HAVE GOOD REASONS TO diff --git a/.gitignore b/.gitignore index 6a22b5b..1353e83 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,9 @@ # Files generated by invoking Julia with --track-allocation *.jl.mem +# .DS_Store files +.DS_Store + # System-specific files and directories generated by the BinaryProvider and BinDeps packages # They contain absolute paths specific to the host computer, and so should not be committed deps/deps.jl @@ -22,4 +25,4 @@ docs/site/ # committed for packages, but should be committed for applications that require a static # environment. Manifest.toml -__site \ No newline at end of file +__site diff --git a/_assets/.DS_Store b/_assets/.DS_Store deleted file mode 100644 index 2bc9d3c1a6d8c4df7527037640fb127ac3e23abb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKu};H44E42@21?9EdzRuH5xMF8azYdnQ3Pci>|^*sc%8K;gJ9uBCwt^{P8l6hPS-te zGwdP*T70h84YXaqitbR&HC<4ZT~20;A}{3t!w0T=EH(ZnCNI)-o)vTWM$eno`1Npe z{Ij^_uj0z9c8)Kc>K;|Jpj(`)#96whpwo5Vqn-29Ta)vree&WX!|h(3eCUz$F);>= z0b^iS7(mZviN=aH8Ux0FG0-r;-vmQHb`&|7S5T30STI!+4;wgAn=o`cmpP)W~tu3iEX$q|%c*$dU5}!cu9efV)4Lo}F zo1L|8NP_huVrO9X+n<@t?6+mNLquk9J?Rs5iKqo-Y_!o-2(Po2q~T@`fX03!p(~1M zM(ZRlS?k1KWPs1EjT4h|^Ukk7yv)+2r2IClwo0=o8YkHptF5QodFTD;`Lxb*vZdv6 z=0(P@3bIdg8qu1jbd$v1YVZEBxa#L~ce41*$Ma9KuRN+P3h@sgIDVH>@UwuX$RnX+ zJ6<895i*<7s*sg=*~-Vy^*r9>`fV(K2S4#E?904zjw;H4GO)W0$n8q4&hAp6J68sj zff@$*eh8q9p~GCzUL9y`2>@(j+6wwyOR!JiFm#v;Vg+Kv6)3L8l^90cF&{X)&|xkp z?qpo?VO(V6DimX*CtiJv)I_XFmPzL@L1Ev`bqXD+$ z-qzCQ_^l0~7f=?q%LO+s=-8(iw)_b*gD`Yh`fU8 zS6!c;nFrI|B_g^yZI>bo5ow`@YQ}_^dopwp$qi7;8pmO`TtAHa!^ARw(`D~|DT9o% zgVygqd%mip`?2pg!?=OBJ-t26UvFM+zh`WJ$v8ZIVW>$cr;q_MKnBPF88|BgII~UK zxg$q1KnBRbCj+)WB&cB*m>tX3fuXbjK)Xg4fo;8n)ug~KFgqdwQ7;90sYZ*TUJieX zye=?1dbwyc9~w{oXkN5D9qXr(F4{SABm-oiW?<&ig`NL*_+=)W{JMlQGC&6Y83Wq% z>wblginH~{=h<1Cp!ZM{%gbg!U{{v_Ol%*yEIhMi@0DI?-OEQGkFBMf z@8P;`^X0gzZu4DQd-?EHT$}-Cz!`7`oPje2>~tt5XL_GH1I~amAp1i=6O4vQF>f8{ z@--hghB^zzQcFloFpP#t5f%t*C{RP$N(|O;=!5x1!=$L;#8zOiWj+-zoU>#7kll%+ zqW8{#Gtg&1t5KTD`G1dJX0XWbhxp7Ha0dPv13WI5dc*{Jp)WB5hGq$sP1K8FMSB9IC3&KdXx2EG9awm)_N From 1c03351551b0d3e18133e04a73144a7f545cb644 Mon Sep 17 00:00:00 2001 From: Emmanuel Lujan Date: Tue, 21 Jun 2022 18:09:50 -0400 Subject: [PATCH 6/6] Adding Manifest.toml, Project.toml, and removing Manifest.toml from .gitignore. --- .gitignore | 2 +- Manifest.toml | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++ Project.toml | 7 ++ 3 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 Manifest.toml create mode 100644 Project.toml diff --git a/.gitignore b/.gitignore index 1353e83..1b6af8f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,5 +24,5 @@ docs/site/ # It records a fixed state of all packages used by the project. As such, it should not be # committed for packages, but should be committed for applications that require a static # environment. -Manifest.toml +# Manifest.toml __site diff --git a/Manifest.toml b/Manifest.toml new file mode 100644 index 0000000..22e9675 --- /dev/null +++ b/Manifest.toml @@ -0,0 +1,186 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.7.3" +manifest_format = "2.0" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[deps.CRC32c]] +uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" + +[[deps.Crayons]] +git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" +uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" +version = "4.1.1" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" + +[[deps.FranklinParser]] +deps = ["REPL"] +git-tree-sha1 = "34eab60f8bb982f55f40558a121ec5e50d5d254e" +uuid = "796511e7-1510-466f-ad0c-1823c64bcafa" +version = "0.6.0" + +[[deps.HTTP]] +deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.17" + +[[deps.IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[deps.IniFile]] +git-tree-sha1 = "f550e6e32074c939295eb5ea6de31849ac2c9625" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.1" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[deps.LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[deps.LiveServer]] +deps = ["Crayons", "FileWatching", "HTTP", "MIMEs", "Pkg", "Sockets", "Test"] +git-tree-sha1 = "79783c2901a09bab202f55f24fe07a9a03b14e8a" +uuid = "16fef848-5104-11e9-1b77-fb7a48bbb589" +version = "0.8.3" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[deps.MIMEs]] +git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" +uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" +version = "0.1.4" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[deps.MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.0.3" + +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[deps.OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[deps.REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[deps.Random]] +deps = ["SHA", "Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[deps.URIs]] +git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.3.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[deps.Xranklin]] +deps = ["CRC32c", "Dates", "FranklinParser", "IOCapture", "LiveServer", "Logging", "OrderedCollections", "Pkg", "REPL", "Serialization", "TOML", "URIs"] +git-tree-sha1 = "40e2ff898170175d5f7406929464341230f968e2" +repo-rev = "dev" +repo-url = "https://github.com/tlienart/Xranklin.jl" +uuid = "558449b0-171e-4e1f-900f-d076a5ddf486" +version = "0.1.0" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" diff --git a/Project.toml b/Project.toml new file mode 100644 index 0000000..9250f3e --- /dev/null +++ b/Project.toml @@ -0,0 +1,7 @@ +name = "juliaparallelwebsite" +uuid = "537948fd-c279-4aaa-8db0-b48e0ca81a15" +authors = ["Julia Lab"] +version = "0.1.0" + +[deps] +Xranklin = "558449b0-171e-4e1f-900f-d076a5ddf486"