provide full messaging system - #206

Open
paciorek wants to merge 10 commits into
mainfrom
messaging
Open

provide full messaging system#206
paciorek wants to merge 10 commits into
mainfrom
messaging

Conversation

@paciorek

Copy link
Copy Markdown
Contributor

This surfaces the work I did some time ago on a careful, comprehensive messaging system.

We decided not to try to merge this in for now.

When we do come back to this we need to find Josh' work to pass DSL code through to C++ run-time error messages such as dimension checking so that users can see the line of their code that resulted in the error. Perry thinks Josh' code might be hidden behind an option as it's not being used now based on the error messages we currently see.

@perrydv

Copy link
Copy Markdown
Contributor

@paciorek We've deferred effort on your messaging work, but I could use it now so I am going to work on this. One thing I want to look at is using Rcpp and/or R API calls where possible, and I think in some cases that could replace the steps of looking up a function from the R environment and calling it.

@paciorek

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I put a fair amount of thought into the user/developer experience here, so please keep me in the loop in terms of changes, particularly anything user-facing.

@perrydv

Copy link
Copy Markdown
Contributor

Hi @paciorek, I like a lot of this but have some questions and some changes I've drafted (just locally so far) but will run by you first:

  • We can consolidate several of the handlers in the generateCpp stage. This is purely internal.
  • For nStop, we can have the ultimate C++ call be Rcpp::stop. I think this is safer and cleaner in some way of recovering out of the call stack and possibly cleaning up objects better than when throwing a C++ error. Drafted.
  • For nWarning, similarly we can go through Rcpp::warning. Drafted.
  • For both of these and the others, I think it's better to make local std::ostringstream objects rather than one global one (which was nimble's approach). It will be simpler for object cleanup and also allow thread-safe behavior if multiple threads are giving errors or warnings. Drafted.
  • For nCat, we can use the Rcpp std output stream Rcpp:Rcout. Drafted.
  • nMessage is trickier because you've brought in the logging features using package logger. That looks useful, but I am wondering if we should keep it a distinct concept from "message", which is a standard R concept? One idea would be to have nMessage simply report a message and then introduce a new keyword like log_message or something else that uses the logging system. Easy to draft. What do you think?
  • I'm a little concerned about having the logger capitalized log levels become global names in both R and C++ that take over some common words. At least in C++ we could arrange otherwise. I guess in R we could rely on namespace or just accept that users of the logger package get these words reserved. What do you think if I modify this in R and/or C++?
  • If we go with the Rcpp tools as I'm suggesting, we can make a note later to look at package RcppThreads for some thread-safe versions. Easy to draft.
  • I think it would be nice to have nPrint (alias print). In nimble that is pretty much the same as cat, but we could make it a little more consistent with R's print, or decide it doesn't matter much. But I'd like to have it because cat is a bit nerdy and print is very natural. What do you think?
  • The progress bar feature is very nice. It is not ideal to look up an R function every time it is updated. If we create the bar by instantiating a C++ object (the RAII approach), we could do that look-up once and retain it. (But the down-side would be that we would need progress_update() to be called locally, in the same function where the progress bar was created, not in some other function. Or we would need to pass the object around.) I guess I'm just spitballing here and there is no need to change it unless we hear of performance issues.
  • Other tweaks and extensions occurred to me, but I'm not looking to put more effort in on this and the above seem relevant and simple for now.

Let me know what you think and I could make a PR to your branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@paciorek@perrydv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

provide full messaging system - #206

Open
paciorek wants to merge 10 commits into
mainfrom
messaging
Open

provide full messaging system#206
paciorek wants to merge 10 commits into
mainfrom
messaging

Conversation

@paciorek

Copy link
Copy Markdown
Contributor

This surfaces the work I did some time ago on a careful, comprehensive messaging system.

We decided not to try to merge this in for now.

When we do come back to this we need to find Josh' work to pass DSL code through to C++ run-time error messages such as dimension checking so that users can see the line of their code that resulted in the error. Perry thinks Josh' code might be hidden behind an option as it's not being used now based on the error messages we currently see.

@perrydv

Copy link
Copy Markdown
Contributor

@paciorek We've deferred effort on your messaging work, but I could use it now so I am going to work on this. One thing I want to look at is using Rcpp and/or R API calls where possible, and I think in some cases that could replace the steps of looking up a function from the R environment and calling it.

@paciorek

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I put a fair amount of thought into the user/developer experience here, so please keep me in the loop in terms of changes, particularly anything user-facing.

@perrydv

Copy link
Copy Markdown
Contributor

Hi @paciorek, I like a lot of this but have some questions and some changes I've drafted (just locally so far) but will run by you first:

  • We can consolidate several of the handlers in the generateCpp stage. This is purely internal.
  • For nStop, we can have the ultimate C++ call be Rcpp::stop. I think this is safer and cleaner in some way of recovering out of the call stack and possibly cleaning up objects better than when throwing a C++ error. Drafted.
  • For nWarning, similarly we can go through Rcpp::warning. Drafted.
  • For both of these and the others, I think it's better to make local std::ostringstream objects rather than one global one (which was nimble's approach). It will be simpler for object cleanup and also allow thread-safe behavior if multiple threads are giving errors or warnings. Drafted.
  • For nCat, we can use the Rcpp std output stream Rcpp:Rcout. Drafted.
  • nMessage is trickier because you've brought in the logging features using package logger. That looks useful, but I am wondering if we should keep it a distinct concept from "message", which is a standard R concept? One idea would be to have nMessage simply report a message and then introduce a new keyword like log_message or something else that uses the logging system. Easy to draft. What do you think?
  • I'm a little concerned about having the logger capitalized log levels become global names in both R and C++ that take over some common words. At least in C++ we could arrange otherwise. I guess in R we could rely on namespace or just accept that users of the logger package get these words reserved. What do you think if I modify this in R and/or C++?
  • If we go with the Rcpp tools as I'm suggesting, we can make a note later to look at package RcppThreads for some thread-safe versions. Easy to draft.
  • I think it would be nice to have nPrint (alias print). In nimble that is pretty much the same as cat, but we could make it a little more consistent with R's print, or decide it doesn't matter much. But I'd like to have it because cat is a bit nerdy and print is very natural. What do you think?
  • The progress bar feature is very nice. It is not ideal to look up an R function every time it is updated. If we create the bar by instantiating a C++ object (the RAII approach), we could do that look-up once and retain it. (But the down-side would be that we would need progress_update() to be called locally, in the same function where the progress bar was created, not in some other function. Or we would need to pass the object around.) I guess I'm just spitballing here and there is no need to change it unless we hear of performance issues.
  • Other tweaks and extensions occurred to me, but I'm not looking to put more effort in on this and the above seem relevant and simple for now.

Let me know what you think and I could make a PR to your branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@paciorek@perrydv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

provide full messaging system - #206

Open
paciorek wants to merge 10 commits into
mainfrom
messaging
Open

provide full messaging system#206
paciorek wants to merge 10 commits into
mainfrom
messaging

Conversation

@paciorek

Copy link
Copy Markdown
Contributor

This surfaces the work I did some time ago on a careful, comprehensive messaging system.

We decided not to try to merge this in for now.

When we do come back to this we need to find Josh' work to pass DSL code through to C++ run-time error messages such as dimension checking so that users can see the line of their code that resulted in the error. Perry thinks Josh' code might be hidden behind an option as it's not being used now based on the error messages we currently see.

@perrydv

Copy link
Copy Markdown
Contributor

@paciorek We've deferred effort on your messaging work, but I could use it now so I am going to work on this. One thing I want to look at is using Rcpp and/or R API calls where possible, and I think in some cases that could replace the steps of looking up a function from the R environment and calling it.

@paciorek

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I put a fair amount of thought into the user/developer experience here, so please keep me in the loop in terms of changes, particularly anything user-facing.

@perrydv

Copy link
Copy Markdown
Contributor

Hi @paciorek, I like a lot of this but have some questions and some changes I've drafted (just locally so far) but will run by you first:

  • We can consolidate several of the handlers in the generateCpp stage. This is purely internal.
  • For nStop, we can have the ultimate C++ call be Rcpp::stop. I think this is safer and cleaner in some way of recovering out of the call stack and possibly cleaning up objects better than when throwing a C++ error. Drafted.
  • For nWarning, similarly we can go through Rcpp::warning. Drafted.
  • For both of these and the others, I think it's better to make local std::ostringstream objects rather than one global one (which was nimble's approach). It will be simpler for object cleanup and also allow thread-safe behavior if multiple threads are giving errors or warnings. Drafted.
  • For nCat, we can use the Rcpp std output stream Rcpp:Rcout. Drafted.
  • nMessage is trickier because you've brought in the logging features using package logger. That looks useful, but I am wondering if we should keep it a distinct concept from "message", which is a standard R concept? One idea would be to have nMessage simply report a message and then introduce a new keyword like log_message or something else that uses the logging system. Easy to draft. What do you think?
  • I'm a little concerned about having the logger capitalized log levels become global names in both R and C++ that take over some common words. At least in C++ we could arrange otherwise. I guess in R we could rely on namespace or just accept that users of the logger package get these words reserved. What do you think if I modify this in R and/or C++?
  • If we go with the Rcpp tools as I'm suggesting, we can make a note later to look at package RcppThreads for some thread-safe versions. Easy to draft.
  • I think it would be nice to have nPrint (alias print). In nimble that is pretty much the same as cat, but we could make it a little more consistent with R's print, or decide it doesn't matter much. But I'd like to have it because cat is a bit nerdy and print is very natural. What do you think?
  • The progress bar feature is very nice. It is not ideal to look up an R function every time it is updated. If we create the bar by instantiating a C++ object (the RAII approach), we could do that look-up once and retain it. (But the down-side would be that we would need progress_update() to be called locally, in the same function where the progress bar was created, not in some other function. Or we would need to pass the object around.) I guess I'm just spitballing here and there is no need to change it unless we hear of performance issues.
  • Other tweaks and extensions occurred to me, but I'm not looking to put more effort in on this and the above seem relevant and simple for now.

Let me know what you think and I could make a PR to your branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@paciorek@perrydv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

provide full messaging system - #206

Open
paciorek wants to merge 10 commits into
mainfrom
messaging
Open

provide full messaging system#206
paciorek wants to merge 10 commits into
mainfrom
messaging

Conversation

@paciorek

Copy link
Copy Markdown
Contributor

This surfaces the work I did some time ago on a careful, comprehensive messaging system.

We decided not to try to merge this in for now.

When we do come back to this we need to find Josh' work to pass DSL code through to C++ run-time error messages such as dimension checking so that users can see the line of their code that resulted in the error. Perry thinks Josh' code might be hidden behind an option as it's not being used now based on the error messages we currently see.

@perrydv

Copy link
Copy Markdown
Contributor

@paciorek We've deferred effort on your messaging work, but I could use it now so I am going to work on this. One thing I want to look at is using Rcpp and/or R API calls where possible, and I think in some cases that could replace the steps of looking up a function from the R environment and calling it.

@paciorek

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I put a fair amount of thought into the user/developer experience here, so please keep me in the loop in terms of changes, particularly anything user-facing.

@perrydv

Copy link
Copy Markdown
Contributor

Hi @paciorek, I like a lot of this but have some questions and some changes I've drafted (just locally so far) but will run by you first:

  • We can consolidate several of the handlers in the generateCpp stage. This is purely internal.
  • For nStop, we can have the ultimate C++ call be Rcpp::stop. I think this is safer and cleaner in some way of recovering out of the call stack and possibly cleaning up objects better than when throwing a C++ error. Drafted.
  • For nWarning, similarly we can go through Rcpp::warning. Drafted.
  • For both of these and the others, I think it's better to make local std::ostringstream objects rather than one global one (which was nimble's approach). It will be simpler for object cleanup and also allow thread-safe behavior if multiple threads are giving errors or warnings. Drafted.
  • For nCat, we can use the Rcpp std output stream Rcpp:Rcout. Drafted.
  • nMessage is trickier because you've brought in the logging features using package logger. That looks useful, but I am wondering if we should keep it a distinct concept from "message", which is a standard R concept? One idea would be to have nMessage simply report a message and then introduce a new keyword like log_message or something else that uses the logging system. Easy to draft. What do you think?
  • I'm a little concerned about having the logger capitalized log levels become global names in both R and C++ that take over some common words. At least in C++ we could arrange otherwise. I guess in R we could rely on namespace or just accept that users of the logger package get these words reserved. What do you think if I modify this in R and/or C++?
  • If we go with the Rcpp tools as I'm suggesting, we can make a note later to look at package RcppThreads for some thread-safe versions. Easy to draft.
  • I think it would be nice to have nPrint (alias print). In nimble that is pretty much the same as cat, but we could make it a little more consistent with R's print, or decide it doesn't matter much. But I'd like to have it because cat is a bit nerdy and print is very natural. What do you think?
  • The progress bar feature is very nice. It is not ideal to look up an R function every time it is updated. If we create the bar by instantiating a C++ object (the RAII approach), we could do that look-up once and retain it. (But the down-side would be that we would need progress_update() to be called locally, in the same function where the progress bar was created, not in some other function. Or we would need to pass the object around.) I guess I'm just spitballing here and there is no need to change it unless we hear of performance issues.
  • Other tweaks and extensions occurred to me, but I'm not looking to put more effort in on this and the above seem relevant and simple for now.

Let me know what you think and I could make a PR to your branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@paciorek@perrydv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

provide full messaging system - #206

Open
paciorek wants to merge 10 commits into
mainfrom
messaging
Open

provide full messaging system#206
paciorek wants to merge 10 commits into
mainfrom
messaging

Conversation

@paciorek

Copy link
Copy Markdown
Contributor

This surfaces the work I did some time ago on a careful, comprehensive messaging system.

We decided not to try to merge this in for now.

When we do come back to this we need to find Josh' work to pass DSL code through to C++ run-time error messages such as dimension checking so that users can see the line of their code that resulted in the error. Perry thinks Josh' code might be hidden behind an option as it's not being used now based on the error messages we currently see.

@perrydv

Copy link
Copy Markdown
Contributor

@paciorek We've deferred effort on your messaging work, but I could use it now so I am going to work on this. One thing I want to look at is using Rcpp and/or R API calls where possible, and I think in some cases that could replace the steps of looking up a function from the R environment and calling it.

@paciorek

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I put a fair amount of thought into the user/developer experience here, so please keep me in the loop in terms of changes, particularly anything user-facing.

@perrydv

Copy link
Copy Markdown
Contributor

Hi @paciorek, I like a lot of this but have some questions and some changes I've drafted (just locally so far) but will run by you first:

  • We can consolidate several of the handlers in the generateCpp stage. This is purely internal.
  • For nStop, we can have the ultimate C++ call be Rcpp::stop. I think this is safer and cleaner in some way of recovering out of the call stack and possibly cleaning up objects better than when throwing a C++ error. Drafted.
  • For nWarning, similarly we can go through Rcpp::warning. Drafted.
  • For both of these and the others, I think it's better to make local std::ostringstream objects rather than one global one (which was nimble's approach). It will be simpler for object cleanup and also allow thread-safe behavior if multiple threads are giving errors or warnings. Drafted.
  • For nCat, we can use the Rcpp std output stream Rcpp:Rcout. Drafted.
  • nMessage is trickier because you've brought in the logging features using package logger. That looks useful, but I am wondering if we should keep it a distinct concept from "message", which is a standard R concept? One idea would be to have nMessage simply report a message and then introduce a new keyword like log_message or something else that uses the logging system. Easy to draft. What do you think?
  • I'm a little concerned about having the logger capitalized log levels become global names in both R and C++ that take over some common words. At least in C++ we could arrange otherwise. I guess in R we could rely on namespace or just accept that users of the logger package get these words reserved. What do you think if I modify this in R and/or C++?
  • If we go with the Rcpp tools as I'm suggesting, we can make a note later to look at package RcppThreads for some thread-safe versions. Easy to draft.
  • I think it would be nice to have nPrint (alias print). In nimble that is pretty much the same as cat, but we could make it a little more consistent with R's print, or decide it doesn't matter much. But I'd like to have it because cat is a bit nerdy and print is very natural. What do you think?
  • The progress bar feature is very nice. It is not ideal to look up an R function every time it is updated. If we create the bar by instantiating a C++ object (the RAII approach), we could do that look-up once and retain it. (But the down-side would be that we would need progress_update() to be called locally, in the same function where the progress bar was created, not in some other function. Or we would need to pass the object around.) I guess I'm just spitballing here and there is no need to change it unless we hear of performance issues.
  • Other tweaks and extensions occurred to me, but I'm not looking to put more effort in on this and the above seem relevant and simple for now.

Let me know what you think and I could make a PR to your branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@paciorek@perrydv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

provide full messaging system - #206

Open
paciorek wants to merge 10 commits into
mainfrom
messaging
Open

provide full messaging system#206
paciorek wants to merge 10 commits into
mainfrom
messaging

Conversation

@paciorek

Copy link
Copy Markdown
Contributor

This surfaces the work I did some time ago on a careful, comprehensive messaging system.

We decided not to try to merge this in for now.

When we do come back to this we need to find Josh' work to pass DSL code through to C++ run-time error messages such as dimension checking so that users can see the line of their code that resulted in the error. Perry thinks Josh' code might be hidden behind an option as it's not being used now based on the error messages we currently see.

@perrydv

Copy link
Copy Markdown
Contributor

@paciorek We've deferred effort on your messaging work, but I could use it now so I am going to work on this. One thing I want to look at is using Rcpp and/or R API calls where possible, and I think in some cases that could replace the steps of looking up a function from the R environment and calling it.

@paciorek

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I put a fair amount of thought into the user/developer experience here, so please keep me in the loop in terms of changes, particularly anything user-facing.

@perrydv

Copy link
Copy Markdown
Contributor

Hi @paciorek, I like a lot of this but have some questions and some changes I've drafted (just locally so far) but will run by you first:

  • We can consolidate several of the handlers in the generateCpp stage. This is purely internal.
  • For nStop, we can have the ultimate C++ call be Rcpp::stop. I think this is safer and cleaner in some way of recovering out of the call stack and possibly cleaning up objects better than when throwing a C++ error. Drafted.
  • For nWarning, similarly we can go through Rcpp::warning. Drafted.
  • For both of these and the others, I think it's better to make local std::ostringstream objects rather than one global one (which was nimble's approach). It will be simpler for object cleanup and also allow thread-safe behavior if multiple threads are giving errors or warnings. Drafted.
  • For nCat, we can use the Rcpp std output stream Rcpp:Rcout. Drafted.
  • nMessage is trickier because you've brought in the logging features using package logger. That looks useful, but I am wondering if we should keep it a distinct concept from "message", which is a standard R concept? One idea would be to have nMessage simply report a message and then introduce a new keyword like log_message or something else that uses the logging system. Easy to draft. What do you think?
  • I'm a little concerned about having the logger capitalized log levels become global names in both R and C++ that take over some common words. At least in C++ we could arrange otherwise. I guess in R we could rely on namespace or just accept that users of the logger package get these words reserved. What do you think if I modify this in R and/or C++?
  • If we go with the Rcpp tools as I'm suggesting, we can make a note later to look at package RcppThreads for some thread-safe versions. Easy to draft.
  • I think it would be nice to have nPrint (alias print). In nimble that is pretty much the same as cat, but we could make it a little more consistent with R's print, or decide it doesn't matter much. But I'd like to have it because cat is a bit nerdy and print is very natural. What do you think?
  • The progress bar feature is very nice. It is not ideal to look up an R function every time it is updated. If we create the bar by instantiating a C++ object (the RAII approach), we could do that look-up once and retain it. (But the down-side would be that we would need progress_update() to be called locally, in the same function where the progress bar was created, not in some other function. Or we would need to pass the object around.) I guess I'm just spitballing here and there is no need to change it unless we hear of performance issues.
  • Other tweaks and extensions occurred to me, but I'm not looking to put more effort in on this and the above seem relevant and simple for now.

Let me know what you think and I could make a PR to your branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@paciorek@perrydv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

provide full messaging system - #206

Open
paciorek wants to merge 10 commits into
mainfrom
messaging
Open

provide full messaging system#206
paciorek wants to merge 10 commits into
mainfrom
messaging

Conversation

@paciorek

Copy link
Copy Markdown
Contributor

This surfaces the work I did some time ago on a careful, comprehensive messaging system.

We decided not to try to merge this in for now.

When we do come back to this we need to find Josh' work to pass DSL code through to C++ run-time error messages such as dimension checking so that users can see the line of their code that resulted in the error. Perry thinks Josh' code might be hidden behind an option as it's not being used now based on the error messages we currently see.

@perrydv

Copy link
Copy Markdown
Contributor

@paciorek We've deferred effort on your messaging work, but I could use it now so I am going to work on this. One thing I want to look at is using Rcpp and/or R API calls where possible, and I think in some cases that could replace the steps of looking up a function from the R environment and calling it.

@paciorek

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I put a fair amount of thought into the user/developer experience here, so please keep me in the loop in terms of changes, particularly anything user-facing.

@perrydv

Copy link
Copy Markdown
Contributor

Hi @paciorek, I like a lot of this but have some questions and some changes I've drafted (just locally so far) but will run by you first:

  • We can consolidate several of the handlers in the generateCpp stage. This is purely internal.
  • For nStop, we can have the ultimate C++ call be Rcpp::stop. I think this is safer and cleaner in some way of recovering out of the call stack and possibly cleaning up objects better than when throwing a C++ error. Drafted.
  • For nWarning, similarly we can go through Rcpp::warning. Drafted.
  • For both of these and the others, I think it's better to make local std::ostringstream objects rather than one global one (which was nimble's approach). It will be simpler for object cleanup and also allow thread-safe behavior if multiple threads are giving errors or warnings. Drafted.
  • For nCat, we can use the Rcpp std output stream Rcpp:Rcout. Drafted.
  • nMessage is trickier because you've brought in the logging features using package logger. That looks useful, but I am wondering if we should keep it a distinct concept from "message", which is a standard R concept? One idea would be to have nMessage simply report a message and then introduce a new keyword like log_message or something else that uses the logging system. Easy to draft. What do you think?
  • I'm a little concerned about having the logger capitalized log levels become global names in both R and C++ that take over some common words. At least in C++ we could arrange otherwise. I guess in R we could rely on namespace or just accept that users of the logger package get these words reserved. What do you think if I modify this in R and/or C++?
  • If we go with the Rcpp tools as I'm suggesting, we can make a note later to look at package RcppThreads for some thread-safe versions. Easy to draft.
  • I think it would be nice to have nPrint (alias print). In nimble that is pretty much the same as cat, but we could make it a little more consistent with R's print, or decide it doesn't matter much. But I'd like to have it because cat is a bit nerdy and print is very natural. What do you think?
  • The progress bar feature is very nice. It is not ideal to look up an R function every time it is updated. If we create the bar by instantiating a C++ object (the RAII approach), we could do that look-up once and retain it. (But the down-side would be that we would need progress_update() to be called locally, in the same function where the progress bar was created, not in some other function. Or we would need to pass the object around.) I guess I'm just spitballing here and there is no need to change it unless we hear of performance issues.
  • Other tweaks and extensions occurred to me, but I'm not looking to put more effort in on this and the above seem relevant and simple for now.

Let me know what you think and I could make a PR to your branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@paciorek@perrydv
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

provide full messaging system - #206

Open
paciorek wants to merge 10 commits into
mainfrom
messaging
Open

provide full messaging system#206
paciorek wants to merge 10 commits into
mainfrom
messaging

Conversation

@paciorek

Copy link
Copy Markdown
Contributor

This surfaces the work I did some time ago on a careful, comprehensive messaging system.

We decided not to try to merge this in for now.

When we do come back to this we need to find Josh' work to pass DSL code through to C++ run-time error messages such as dimension checking so that users can see the line of their code that resulted in the error. Perry thinks Josh' code might be hidden behind an option as it's not being used now based on the error messages we currently see.

@perrydv

Copy link
Copy Markdown
Contributor

@paciorek We've deferred effort on your messaging work, but I could use it now so I am going to work on this. One thing I want to look at is using Rcpp and/or R API calls where possible, and I think in some cases that could replace the steps of looking up a function from the R environment and calling it.

@paciorek

Copy link
Copy Markdown
ContributorAuthor

Sounds good. I put a fair amount of thought into the user/developer experience here, so please keep me in the loop in terms of changes, particularly anything user-facing.

@perrydv

Copy link
Copy Markdown
Contributor

Hi @paciorek, I like a lot of this but have some questions and some changes I've drafted (just locally so far) but will run by you first:

  • We can consolidate several of the handlers in the generateCpp stage. This is purely internal.
  • For nStop, we can have the ultimate C++ call be Rcpp::stop. I think this is safer and cleaner in some way of recovering out of the call stack and possibly cleaning up objects better than when throwing a C++ error. Drafted.
  • For nWarning, similarly we can go through Rcpp::warning. Drafted.
  • For both of these and the others, I think it's better to make local std::ostringstream objects rather than one global one (which was nimble's approach). It will be simpler for object cleanup and also allow thread-safe behavior if multiple threads are giving errors or warnings. Drafted.
  • For nCat, we can use the Rcpp std output stream Rcpp:Rcout. Drafted.
  • nMessage is trickier because you've brought in the logging features using package logger. That looks useful, but I am wondering if we should keep it a distinct concept from "message", which is a standard R concept? One idea would be to have nMessage simply report a message and then introduce a new keyword like log_message or something else that uses the logging system. Easy to draft. What do you think?
  • I'm a little concerned about having the logger capitalized log levels become global names in both R and C++ that take over some common words. At least in C++ we could arrange otherwise. I guess in R we could rely on namespace or just accept that users of the logger package get these words reserved. What do you think if I modify this in R and/or C++?
  • If we go with the Rcpp tools as I'm suggesting, we can make a note later to look at package RcppThreads for some thread-safe versions. Easy to draft.
  • I think it would be nice to have nPrint (alias print). In nimble that is pretty much the same as cat, but we could make it a little more consistent with R's print, or decide it doesn't matter much. But I'd like to have it because cat is a bit nerdy and print is very natural. What do you think?
  • The progress bar feature is very nice. It is not ideal to look up an R function every time it is updated. If we create the bar by instantiating a C++ object (the RAII approach), we could do that look-up once and retain it. (But the down-side would be that we would need progress_update() to be called locally, in the same function where the progress bar was created, not in some other function. Or we would need to pass the object around.) I guess I'm just spitballing here and there is no need to change it unless we hear of performance issues.
  • Other tweaks and extensions occurred to me, but I'm not looking to put more effort in on this and the above seem relevant and simple for now.

Let me know what you think and I could make a PR to your branch.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@paciorek@perrydv