From 9518c83a0d839ae5a1e4edd9dbc17c31b62bb85b Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Thu, 6 Apr 2023 21:12:29 +0300 Subject: [PATCH] feat(emacs): more charts --- content/posts/2023-04-14-emacs.md | 18 +- org/2023-04-14-emacs.org | 17 ++ .../data/2023-03-14-emacs/emacs-packages.json | 78 ++++++++ .../2023-03-14-emacs/emacs-vim-switch.json | 42 +++++ static/js/2023-04-14-emacs.js | 178 +++++++++++++++++- 5 files changed, 329 insertions(+), 4 deletions(-) create mode 100644 static/data/2023-03-14-emacs/emacs-packages.json create mode 100644 static/data/2023-03-14-emacs/emacs-vim-switch.json diff --git a/content/posts/2023-04-14-emacs.md b/content/posts/2023-04-14-emacs.md index 870f8d2..ca2ba24 100644 --- a/content/posts/2023-04-14-emacs.md +++ b/content/posts/2023-04-14-emacs.md @@ -9,6 +9,18 @@ scripts = ["/js/chart.js", "/js/chartjs-adapter-date-fns.bundle.min.js", "/js/ch Hello world + +## Numbers {#numbers} + +- Total time on Config: [REDACTED] +- Total time on Packages: [REDACTED] +- % time on Config: [REDACTED] +- Hours on `org-journal-tags`: [REDACTED] +- Total time on Vim config: 39 hours + + +## Charts {#charts} + @@ -17,4 +29,8 @@ Hello world - \ No newline at end of file + + + + + diff --git a/org/2023-04-14-emacs.org b/org/2023-04-14-emacs.org index 8c0cd53..c776b68 100644 --- a/org/2023-04-14-emacs.org +++ b/org/2023-04-14-emacs.org @@ -8,6 +8,15 @@ Hello world +* Numbers +- Total time on Config: @@html:[REDACTED]@@ +- Total time on Packages: @@html:[REDACTED]@@ +- % time on Config: @@html:[REDACTED]@@ +- Hours on =org-journal-tags=: @@html:[REDACTED]@@ +- Total time on Vim config: 39 hours + +* Charts + #+begin_export html #+end_export @@ -27,3 +36,11 @@ Hello world #+begin_export html #+end_export + +#+begin_export html + +#+end_export + +#+begin_export html + +#+end_export diff --git a/static/data/2023-03-14-emacs/emacs-packages.json b/static/data/2023-03-14-emacs/emacs-packages.json new file mode 100644 index 0000000..afd1b90 --- /dev/null +++ b/static/data/2023-03-14-emacs/emacs-packages.json @@ -0,0 +1,78 @@ +[ +{"name":"org-journal-tags","hours":45.80413027777777}, +{"name":"Unknown Project","hours":30.883538055555544}, +{"name":"elfeed-summary","hours":24.781949999999995}, +{"name":"lyrics-fetcher","hours":19.423725}, +{"name":"reverso","hours":16.14068888888889}, +{"name":"pomm","hours":15.724073888888888}, +{"name":"elfeed_sync","hours":10.33835}, +{"name":"perspective-exwm","hours":7.68676111111111}, +{"name":"ivy-pass","hours":4.8407888888888895}, +{"name":"exwm-modeline","hours":4.785227777777777}, +{"name":"elfeed","hours":1.9590416666666668}, +{"name":"elfeed-recommender","hours":1.606401111111111}, +{"name":"avy-dired","hours":1.5198916666666664}, +{"name":"sqrtminusone.xyz","hours":1.4861027777777778}, +{"name":"copilot","hours":1.393622222222222}, +{"name":"SEM10_DataP","hours":1.3383138888888888}, +{"name":"org-mode","hours":1.285122222222222}, +{"name":"emms","hours":1.2402194444444448}, +{"name":"digital-trajectories-backend","hours":0.817338888888889}, +{"name":"SEM11_SD","hours":0.6001722222222221}, +{"name":"dank-mode","hours":0.5951249999999999}, +{"name":"org-roam","hours":0.5180888888888888}, +{"name":"sqrtminusone.github.io","hours":0.4424444444444445}, +{"name":"eshell-info-banner","hours":0.3441305555555555}, +{"name":"org-ref","hours":0.3417222222222222}, +{"name":"org","hours":0.33160555555555554}, +{"name":"org-contrib","hours":0.2974138888888889}, +{"name":"perspective-el","hours":0.291275}, +{"name":"wakatime-mode","hours":0.2859333333333333}, +{"name":"exwm","hours":0.2593944444444445}, +{"name":"elcord","hours":0.25727777777777777}, +{"name":"general","hours":0.2553944444444444}, +{"name":"digital-trajectories-frontend","hours":0.25507222222222226}, +{"name":"flycheck-mix-alphabets","hours":0.1779611111111111}, +{"name":"evil-collection","hours":0.17116388888888892}, +{"name":"lispy","hours":0.16847222222222222}, +{"name":"devdocs","hours":0.16563333333333333}, +{"name":"mmm-mode","hours":0.14494444444444443}, +{"name":"posframe","hours":0.13803333333333334}, +{"name":"ytel","hours":0.13270833333333334}, +{"name":"melpa","hours":0.11238055555555555}, +{"name":"tldr","hours":0.11088888888888888}, +{"name":"org-journal","hours":0.10692777777777777}, +{"name":"deft","hours":0.09949999999999999}, +{"name":"org-transclusion","hours":0.08256666666666668}, +{"name":"transient","hours":0.08187777777777777}, +{"name":"treemacs","hours":0.08161666666666667}, +{"name":"lsp-treemacs","hours":0.07749722222222223}, +{"name":"web-mode","hours":0.07611666666666667}, +{"name":"dap-mode","hours":0.070775}, +{"name":"themes","hours":0.06796666666666668}, +{"name":"Emacs-langtool","hours":0.06696388888888888}, +{"name":"projectile","hours":0.0635}, +{"name":"doom-modeline","hours":0.06344999999999999}, +{"name":"package-build","hours":0.06199444444444445}, +{"name":"emacs-which-key","hours":0.06048055555555555}, +{"name":"jest-test-mode","hours":0.05506944444444444}, +{"name":"gazprom-classes-frontend","hours":0.04866388888888889}, +{"name":"digital-schedule-backend","hours":0.04549166666666667}, +{"name":"company-mode","hours":0.04083888888888889}, +{"name":"emacs-jupyter","hours":0.03719166666666666}, +{"name":"swiper","hours":0.03139444444444444}, +{"name":"org-habit-stats","hours":0.028275}, +{"name":"SEM9_AMOS","hours":0.016411111111111112}, +{"name":"elfeed-org","hours":0.014444444444444446}, +{"name":"org-agenda-conflict","hours":0.013563888888888887}, +{"name":"org-ql","hours":0.013541666666666667}, +{"name":"test","hours":0.013236111111111112}, +{"name":"alert","hours":0.012311111111111111}, +{"name":"prodigy","hours":0.0079}, +{"name":"lsp-mode","hours":0.007405555555555556}, +{"name":"google-translate","hours":0.007016666666666668}, +{"name":"err","hours":0.005344444444444444}, +{"name":"testing","hours":0.004497222222222223}, +{"name":"dired-plus","hours":0.003427777777777778}, +{"name":"magit","hours":0.0} +] \ No newline at end of file diff --git a/static/data/2023-03-14-emacs/emacs-vim-switch.json b/static/data/2023-03-14-emacs/emacs-vim-switch.json new file mode 100644 index 0000000..cd34d8f --- /dev/null +++ b/static/data/2023-03-14-emacs/emacs-vim-switch.json @@ -0,0 +1,42 @@ +[ +{"period":"2020-10-01T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":4.593828333333334,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-02T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":5.804007777777778,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-03T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":0.7722222222222223,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-04T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":4.997453333333334,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-05T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":3.792777777777778,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-06T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":1.2219444444444443,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-07T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":0.6566666666666666,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-08T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":2.1977777777777776,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-09T00:00:00Z","misc_emacs_hours":1.544538888888889,"emacs_other_code_hours":0.0,"vim_other_code_hours":2.2808333333333333,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-10T00:00:00Z","misc_emacs_hours":2.166045,"emacs_other_code_hours":0.0,"vim_other_code_hours":2.765833333333333,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-11T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":1.522777777777778,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-12T00:00:00Z","misc_emacs_hours":3.373538055555555,"emacs_other_code_hours":0.0,"vim_other_code_hours":2.8524999999999996,"config_hours":1.1968416666666668,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-13T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":3.1955855555555557,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-14T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.6688305555555559,"vim_other_code_hours":0.07459444444444445,"config_hours":2.822041666666667,"orgmode_hours":0.0,"package_hours":0.06048055555555555}, +{"period":"2020-10-15T00:00:00Z","misc_emacs_hours":1.0370783333333335,"emacs_other_code_hours":4.3661255555555565,"vim_other_code_hours":0.24187555555555554,"config_hours":3.7891083333333335,"orgmode_hours":0.0,"package_hours":0.2898111111111111}, +{"period":"2020-10-16T00:00:00Z","misc_emacs_hours":1.2085813888888888,"emacs_other_code_hours":2.804672222222222,"vim_other_code_hours":0.0020166666666666666,"config_hours":0.4711361111111111,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-17T00:00:00Z","misc_emacs_hours":1.5149327777777772,"emacs_other_code_hours":1.431163888888889,"vim_other_code_hours":0.24356111111111112,"config_hours":2.4144055555555557,"orgmode_hours":1.0415694444444443,"package_hours":0.0}, +{"period":"2020-10-18T00:00:00Z","misc_emacs_hours":1.185498611111111,"emacs_other_code_hours":4.190124999999999,"vim_other_code_hours":0.0,"config_hours":0.1758361111111111,"orgmode_hours":0.5317666666666666,"package_hours":0.0}, +{"period":"2020-10-19T00:00:00Z","misc_emacs_hours":1.0136511111111104,"emacs_other_code_hours":2.7192686111111115,"vim_other_code_hours":0.0022222222222222222,"config_hours":0.03091111111111111,"orgmode_hours":0.3985694444444444,"package_hours":0.0}, +{"period":"2020-10-20T00:00:00Z","misc_emacs_hours":1.6019416666666655,"emacs_other_code_hours":1.8278999999999996,"vim_other_code_hours":0.0,"config_hours":0.09761388888888889,"orgmode_hours":1.1227472222222223,"package_hours":0.0}, +{"period":"2020-10-21T00:00:00Z","misc_emacs_hours":0.10150999999999932,"emacs_other_code_hours":4.24669138888889,"vim_other_code_hours":0.014744444444444444,"config_hours":0.4583833333333333,"orgmode_hours":0.1297222222222222,"package_hours":0.0}, +{"period":"2020-10-22T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":5.37636388888889,"vim_other_code_hours":0.05089722222222222,"config_hours":0.024694444444444446,"orgmode_hours":0.21722777777777777,"package_hours":0.0}, +{"period":"2020-10-23T00:00:00Z","misc_emacs_hours":0.40990444444444485,"emacs_other_code_hours":4.576274999999999,"vim_other_code_hours":0.09225833333333333,"config_hours":0.6420833333333333,"orgmode_hours":0.5016444444444444,"package_hours":0.08161666666666667}, +{"period":"2020-10-24T00:00:00Z","misc_emacs_hours":0.07689472222222271,"emacs_other_code_hours":1.2494466666666666,"vim_other_code_hours":0.0061111111111111106,"config_hours":0.4475111111111111,"orgmode_hours":0.8585111111111111,"package_hours":0.0}, +{"period":"2020-10-25T00:00:00Z","misc_emacs_hours":1.3529136111111115,"emacs_other_code_hours":2.2984227777777777,"vim_other_code_hours":0.0,"config_hours":0.22775833333333334,"orgmode_hours":0.03581666666666667,"package_hours":0.0}, +{"period":"2020-10-26T00:00:00Z","misc_emacs_hours":2.2822991666666663,"emacs_other_code_hours":1.8299355555555556,"vim_other_code_hours":0.21062777777777777,"config_hours":0.5299861111111112,"orgmode_hours":0.9724463888888889,"package_hours":0.0}, +{"period":"2020-10-27T00:00:00Z","misc_emacs_hours":2.4492977777777787,"emacs_other_code_hours":1.3149833333333336,"vim_other_code_hours":0.0,"config_hours":1.6067777777777779,"orgmode_hours":0.7547583333333333,"package_hours":0.0}, +{"period":"2020-10-28T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.9042833333333333,"vim_other_code_hours":0.08348333333333334,"config_hours":0.7079055555555556,"orgmode_hours":0.14482499999999998,"package_hours":0.0}, +{"period":"2020-10-29T00:00:00Z","misc_emacs_hours":0.328835555555556,"emacs_other_code_hours":3.784140277777778,"vim_other_code_hours":0.15638888888888888,"config_hours":0.4212972222222222,"orgmode_hours":0.07462222222222221,"package_hours":0.0}, +{"period":"2020-10-30T00:00:00Z","misc_emacs_hours":0.27459194444444435,"emacs_other_code_hours":0.07239999999999996,"vim_other_code_hours":0.2136111111111111,"config_hours":0.38052222222222226,"orgmode_hours":0.20900277777777776,"package_hours":0.0}, +{"period":"2020-10-31T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":2.46487,"vim_other_code_hours":0.0,"config_hours":0.16100555555555557,"orgmode_hours":0.04638055555555556,"package_hours":0.0}, +{"period":"2020-11-01T00:00:00Z","misc_emacs_hours":0.609663055555556,"emacs_other_code_hours":5.329877777777778,"vim_other_code_hours":0.0,"config_hours":0.02627777777777778,"orgmode_hours":0.30374999999999996,"package_hours":0.0}, +{"period":"2020-11-02T00:00:00Z","misc_emacs_hours":1.6059166666666673,"emacs_other_code_hours":2.984023055555556,"vim_other_code_hours":0.02325,"config_hours":0.8176666666666665,"orgmode_hours":0.016177777777777777,"package_hours":0.003427777777777778}, +{"period":"2020-11-03T00:00:00Z","misc_emacs_hours":0.3323786111111109,"emacs_other_code_hours":2.076485,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.44376611111111114,"package_hours":0.0}, +{"period":"2020-11-04T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":5.921964722222222,"vim_other_code_hours":0.0,"config_hours":0.500686111111111,"orgmode_hours":1.411311111111111,"package_hours":0.0}, +{"period":"2020-11-05T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":7.012325,"vim_other_code_hours":0.0,"config_hours":0.3160166666666667,"orgmode_hours":0.008994444444444446,"package_hours":0.0}, +{"period":"2020-11-06T00:00:00Z","misc_emacs_hours":0.8303497222222229,"emacs_other_code_hours":1.9601530555555557,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":1.155611111111111,"package_hours":0.0}, +{"period":"2020-11-07T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":5.815349444444445,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-11-08T00:00:00Z","misc_emacs_hours":0.5992686111111123,"emacs_other_code_hours":7.439156111111109,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.08499444444444444,"package_hours":0.0}, +{"period":"2020-11-09T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":2.465256666666667,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.620813888888889,"package_hours":0.0} +] \ No newline at end of file diff --git a/static/js/2023-04-14-emacs.js b/static/js/2023-04-14-emacs.js index 7e587c0..98c0a3f 100644 --- a/static/js/2023-04-14-emacs.js +++ b/static/js/2023-04-14-emacs.js @@ -15,7 +15,7 @@ const EMACS_ITEM = { const COLORS = [ "#77bceb", "#ff6384", - "#77c0c0", + "#73d9d9", "#ff9f40", "#ffcd56", "#c9cbcf", @@ -75,6 +75,16 @@ const EMACS_DATA = { yAxisID: "yAxis1", ...EMACS_ITEM, }, + { + label: "ranger", + data: [ + { + name: "File manager", + span: [new Date("2019-04-03"), new Date("2020-02-17")], + }, + ], + yAxisID: "yAxis2", + }, { label: "vifm", data: [ @@ -169,6 +179,16 @@ const EMACS_DATA = { ], yAxisID: "yAxis5", }, + { + label: "Google Play Music", + data: [ + { + name: "Multimedia", + span: [new Date("2019-05-12"), new Date("2020-07-26")], + }, + ], + yAxisID: "yAxis6", + }, { label: "MPD", data: [ @@ -250,6 +270,15 @@ const EMACS_DATA = { }), }; +function replaceNumbers(data) { + for (const [key, value] of Object.entries(data)) { + const items = document.querySelectorAll(`[data-num="${key}"]`); + for (const item of items) { + item.innerHTML = value; + } + } +} + function emacsChart() { const ctx = document.getElementById("chart-emacs-history"); new Chart(ctx, { @@ -259,7 +288,7 @@ function emacsChart() { options: { indexAxis: "y", grouped: true, - aspectRatio: 1.2, + aspectRatio: 1.1, parsing: { yAxisKey: "name", xAxisKey: "span", @@ -345,6 +374,26 @@ async function emacsTimeChart() { backgroundColor: color, })), }; + const replaceData = {}; + for (const [key] of labels) { + replaceData[`${key}_total`] = 0; + replaceData[`${key}_percent`] = 0; + } + let total = 0; + for (const rawDatum of rawData) { + for (const [key] of labels) { + replaceData[`${key}_total`] += rawDatum[key] || 0; + total += rawDatum[key] || 0; + } + } + for (const [key] of labels) { + replaceData[`${key}_total`] = replaceData[`${key}_total`].toFixed(1); + replaceData[`${key}_percent`] = ( + (replaceData[`${key}_total`] / total) * + 100 + ).toFixed(1); + } + replaceNumbers(replaceData); const ctx = document.getElementById("chart-emacs-time"); new Chart(ctx, { @@ -609,12 +658,135 @@ async function configsChart() { }); } +async function packagesChart() { + const response = await fetch("/data/2023-03-14-emacs/emacs-packages.json"); + const rawData = await response.json(); + + const data = [ + ...rawData.slice(0, 15), + { + name: "Other", + hours: rawData.slice(15).reduce((acc, d) => acc + d.hours, 0), + }, + ]; + + const replaceData = {}; + for (const datum of data) { + replaceData[`${datum.name}_total`] = datum.hours.toFixed(1); + } + replaceNumbers(replaceData); + + const ctx = document.getElementById("chart-emacs-packages"); + new Chart(ctx, { + type: "bar", + data: { + labels: data.map((d) => d.name), + datasets: [ + { + data, + }, + ], + }, + options: { + aspectRatio: 1.3, + parsing: { + yAxisKey: "name", + xAxisKey: "hours", + }, + indexAxis: "y", + scales: { + x: { + title: { + display: true, + text: "Hours", + }, + }, + }, + plugins: { + title: { + display: true, + text: "Time per Emacs packages", + color: "black", + font: { + size: 15, + }, + }, + legend: { + display: false, + }, + }, + }, + }); +} + +async function emacsVimSwitchChart() { + const response = await fetch("/data/2023-03-14-emacs/emacs-vim-switch.json"); + const rawData = await response.json(); + const labels = [ + ["config_hours", "Config", "#A989C5"], + ["package_hours", "Emacs Packages", "#7172AD"], + ["orgmode_hours", "Org Mode", "#509EE3"], + ["emacs_other_code_hours", "Other Code (Emacs)", "#F2A86F"], + ["vim_other_code_hours", "Other Code (Vim)", "#59c26e"], + ["misc_emacs_hours", "Misc (Emacs)", "#F9D45C"], + ]; + const data = { + labels: rawData.map((d) => new Date(d["period"])), + datasets: labels.map(([key, label, color]) => ({ + label, + data: rawData.map((d) => ({ + period: new Date(d["period"]), + value: d[key], + })), + backgroundColor: color, + })), + }; + + const ctx = document.getElementById("chart-emacs-vim-switch"); + new Chart(ctx, { + type: "bar", + data, + options: { + parsing: { + xAxisKey: "period", + yAxisKey: "value", + }, + scales: { + x: { + type: "time", + min: data.labels[0], + stacked: true, + }, + y: { + stacked: true, + title: { + display: true, + text: "Hours", + }, + }, + }, + plugins: { + title: { + display: true, + text: "Switch from Emacs to Vim", + color: "black", + font: { + size: 15, + }, + }, + }, + }, + }); +} + document.addEventListener( "DOMContentLoaded", - function () { + async function () { emacsChart(); emacsTimeChart(); configsChart(); + packagesChart(); + emacsVimSwitchChart(); }, false );