Java and Ruby Libraries

Martin Prout edited this page Aug 1, 2013 · 41 revisions

Ruby-Processing can load a whole mess o’ libraries. From pure-Java libraries, to hybrid Java-C native libs, to pure-Ruby ones, you can make them all get along. Use the class method load_library "my_lib". This will look in the directory library/my_lib, and load in the Java or Ruby library that it finds by that name. So, all together now, an example that loads both hemesh and the vbo (java and ruby) libraries would look like this:

load_libraries:hemesh,:vboincludeMS# module MS imports necessary java classes and contains ruby MeshToVBO classRES=20attr_reader:mesh_ret,:inv_mesh_ret,:renderdefsetupsize(800,800,P3D)# Code goes here . . .end

Here we load the processing contributed library hemesh, and very own vbo library that translates the hemesh mesh to PShape objects.

There’s also a way to check if a library has been successfully loaded, so you can conditionally enable bits of your app that need certain libraries. library_loaded? :library_name will let you know.

Context-Free library

Some initial work has been done on a pure-Ruby context-free library that allows you to sketch along the lines of Context Free.app, or Algorithm Ink. Details available at the context_free project page. To use it, download the “context_free.rb” library, and place it in “library/context_free”. It allows you to define a set of rules that call one another probabilistically while transforming a set of reference values that are used for drawing — fractals, essentially.

JVM Arguments

Some sketches benefit from passing arguments to the JVM, setting the stack size to be larger than the default, etc. You can put all of your JVM arguments into a file called java_args.txt inside of your sketch’s data folder, and they’ll be passed along to the JVM every time you run it. To see what’s possible, check out Oracle’s documentation.

Cautionary Notes

Simply loading in the code for a library via load_library may not be enough to actually import the library’s classes into your namespace. For some libraries, such as Minim, you’ll want to import the package as well (as you would in Java):

load_library'minim'java_import'ddf.minim'java_import'ddf.minim.analysis'
Some libraries use Java’s reflective capacities to try and invoke methods on your sketch. If the methods that they’re looking for happen to be defined in Ruby alone, Java won’t be able to find them. Better support for this sort of thing should be forthcoming in a future JRuby release, but for now you’ll either need to patch the library to stop using reflection on the sketch, or insert a thin Java interface that lets the library know where your methods are. For example, the Carnivore library uses reflection to try and find a packetEvent() method on the sketch. An appropriate fix is to create, compile and jar-up a java interface, and then include it into your sketch. (It’s icky, I know.)
publicinterfacePacketListener {
publicvoidpacketEvent(org.rsg.carnivore.CarnivorePacketpacket); }

Compile it, jar it up.

javac -cp path/to/carnivore.jar PacketListener.java
jar cvf packet_listener.jar PacketListener.java

And then include it in your sketch…

require'packet_listener'includeJava::PacketListenerdefpacketEvent(packet)# code goes here...end

Clone this wiki locally

, '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

Java and Ruby Libraries

Martin Prout edited this page Aug 1, 2013 · 41 revisions

Ruby-Processing can load a whole mess o’ libraries. From pure-Java libraries, to hybrid Java-C native libs, to pure-Ruby ones, you can make them all get along. Use the class method load_library "my_lib". This will look in the directory library/my_lib, and load in the Java or Ruby library that it finds by that name. So, all together now, an example that loads both hemesh and the vbo (java and ruby) libraries would look like this:

load_libraries:hemesh,:vboincludeMS# module MS imports necessary java classes and contains ruby MeshToVBO classRES=20attr_reader:mesh_ret,:inv_mesh_ret,:renderdefsetupsize(800,800,P3D)# Code goes here . . .end

Here we load the processing contributed library hemesh, and very own vbo library that translates the hemesh mesh to PShape objects.

There’s also a way to check if a library has been successfully loaded, so you can conditionally enable bits of your app that need certain libraries. library_loaded? :library_name will let you know.

Context-Free library

Some initial work has been done on a pure-Ruby context-free library that allows you to sketch along the lines of Context Free.app, or Algorithm Ink. Details available at the context_free project page. To use it, download the “context_free.rb” library, and place it in “library/context_free”. It allows you to define a set of rules that call one another probabilistically while transforming a set of reference values that are used for drawing — fractals, essentially.

JVM Arguments

Some sketches benefit from passing arguments to the JVM, setting the stack size to be larger than the default, etc. You can put all of your JVM arguments into a file called java_args.txt inside of your sketch’s data folder, and they’ll be passed along to the JVM every time you run it. To see what’s possible, check out Oracle’s documentation.

Cautionary Notes

Simply loading in the code for a library via load_library may not be enough to actually import the library’s classes into your namespace. For some libraries, such as Minim, you’ll want to import the package as well (as you would in Java):

load_library'minim'java_import'ddf.minim'java_import'ddf.minim.analysis'
Some libraries use Java’s reflective capacities to try and invoke methods on your sketch. If the methods that they’re looking for happen to be defined in Ruby alone, Java won’t be able to find them. Better support for this sort of thing should be forthcoming in a future JRuby release, but for now you’ll either need to patch the library to stop using reflection on the sketch, or insert a thin Java interface that lets the library know where your methods are. For example, the Carnivore library uses reflection to try and find a packetEvent() method on the sketch. An appropriate fix is to create, compile and jar-up a java interface, and then include it into your sketch. (It’s icky, I know.)
publicinterfacePacketListener {
publicvoidpacketEvent(org.rsg.carnivore.CarnivorePacketpacket); }

Compile it, jar it up.

javac -cp path/to/carnivore.jar PacketListener.java
jar cvf packet_listener.jar PacketListener.java

And then include it in your sketch…

require'packet_listener'includeJava::PacketListenerdefpacketEvent(packet)# code goes here...end

Clone this wiki locally

, '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

Java and Ruby Libraries

Martin Prout edited this page Aug 1, 2013 · 41 revisions

Ruby-Processing can load a whole mess o’ libraries. From pure-Java libraries, to hybrid Java-C native libs, to pure-Ruby ones, you can make them all get along. Use the class method load_library "my_lib". This will look in the directory library/my_lib, and load in the Java or Ruby library that it finds by that name. So, all together now, an example that loads both hemesh and the vbo (java and ruby) libraries would look like this:

load_libraries:hemesh,:vboincludeMS# module MS imports necessary java classes and contains ruby MeshToVBO classRES=20attr_reader:mesh_ret,:inv_mesh_ret,:renderdefsetupsize(800,800,P3D)# Code goes here . . .end

Here we load the processing contributed library hemesh, and very own vbo library that translates the hemesh mesh to PShape objects.

There’s also a way to check if a library has been successfully loaded, so you can conditionally enable bits of your app that need certain libraries. library_loaded? :library_name will let you know.

Context-Free library

Some initial work has been done on a pure-Ruby context-free library that allows you to sketch along the lines of Context Free.app, or Algorithm Ink. Details available at the context_free project page. To use it, download the “context_free.rb” library, and place it in “library/context_free”. It allows you to define a set of rules that call one another probabilistically while transforming a set of reference values that are used for drawing — fractals, essentially.

JVM Arguments

Some sketches benefit from passing arguments to the JVM, setting the stack size to be larger than the default, etc. You can put all of your JVM arguments into a file called java_args.txt inside of your sketch’s data folder, and they’ll be passed along to the JVM every time you run it. To see what’s possible, check out Oracle’s documentation.

Cautionary Notes

Simply loading in the code for a library via load_library may not be enough to actually import the library’s classes into your namespace. For some libraries, such as Minim, you’ll want to import the package as well (as you would in Java):

load_library'minim'java_import'ddf.minim'java_import'ddf.minim.analysis'
Some libraries use Java’s reflective capacities to try and invoke methods on your sketch. If the methods that they’re looking for happen to be defined in Ruby alone, Java won’t be able to find them. Better support for this sort of thing should be forthcoming in a future JRuby release, but for now you’ll either need to patch the library to stop using reflection on the sketch, or insert a thin Java interface that lets the library know where your methods are. For example, the Carnivore library uses reflection to try and find a packetEvent() method on the sketch. An appropriate fix is to create, compile and jar-up a java interface, and then include it into your sketch. (It’s icky, I know.)
publicinterfacePacketListener {
publicvoidpacketEvent(org.rsg.carnivore.CarnivorePacketpacket); }

Compile it, jar it up.

javac -cp path/to/carnivore.jar PacketListener.java
jar cvf packet_listener.jar PacketListener.java

And then include it in your sketch…

require'packet_listener'includeJava::PacketListenerdefpacketEvent(packet)# code goes here...end

Clone this wiki locally

, '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

Java and Ruby Libraries

Martin Prout edited this page Aug 1, 2013 · 41 revisions

Ruby-Processing can load a whole mess o’ libraries. From pure-Java libraries, to hybrid Java-C native libs, to pure-Ruby ones, you can make them all get along. Use the class method load_library "my_lib". This will look in the directory library/my_lib, and load in the Java or Ruby library that it finds by that name. So, all together now, an example that loads both hemesh and the vbo (java and ruby) libraries would look like this:

load_libraries:hemesh,:vboincludeMS# module MS imports necessary java classes and contains ruby MeshToVBO classRES=20attr_reader:mesh_ret,:inv_mesh_ret,:renderdefsetupsize(800,800,P3D)# Code goes here . . .end

Here we load the processing contributed library hemesh, and very own vbo library that translates the hemesh mesh to PShape objects.

There’s also a way to check if a library has been successfully loaded, so you can conditionally enable bits of your app that need certain libraries. library_loaded? :library_name will let you know.

Context-Free library

Some initial work has been done on a pure-Ruby context-free library that allows you to sketch along the lines of Context Free.app, or Algorithm Ink. Details available at the context_free project page. To use it, download the “context_free.rb” library, and place it in “library/context_free”. It allows you to define a set of rules that call one another probabilistically while transforming a set of reference values that are used for drawing — fractals, essentially.

JVM Arguments

Some sketches benefit from passing arguments to the JVM, setting the stack size to be larger than the default, etc. You can put all of your JVM arguments into a file called java_args.txt inside of your sketch’s data folder, and they’ll be passed along to the JVM every time you run it. To see what’s possible, check out Oracle’s documentation.

Cautionary Notes

Simply loading in the code for a library via load_library may not be enough to actually import the library’s classes into your namespace. For some libraries, such as Minim, you’ll want to import the package as well (as you would in Java):

load_library'minim'java_import'ddf.minim'java_import'ddf.minim.analysis'
Some libraries use Java’s reflective capacities to try and invoke methods on your sketch. If the methods that they’re looking for happen to be defined in Ruby alone, Java won’t be able to find them. Better support for this sort of thing should be forthcoming in a future JRuby release, but for now you’ll either need to patch the library to stop using reflection on the sketch, or insert a thin Java interface that lets the library know where your methods are. For example, the Carnivore library uses reflection to try and find a packetEvent() method on the sketch. An appropriate fix is to create, compile and jar-up a java interface, and then include it into your sketch. (It’s icky, I know.)
publicinterfacePacketListener {
publicvoidpacketEvent(org.rsg.carnivore.CarnivorePacketpacket); }

Compile it, jar it up.

javac -cp path/to/carnivore.jar PacketListener.java
jar cvf packet_listener.jar PacketListener.java

And then include it in your sketch…

require'packet_listener'includeJava::PacketListenerdefpacketEvent(packet)# code goes here...end

Clone this wiki locally

, '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

Java and Ruby Libraries

Martin Prout edited this page Aug 1, 2013 · 41 revisions

Ruby-Processing can load a whole mess o’ libraries. From pure-Java libraries, to hybrid Java-C native libs, to pure-Ruby ones, you can make them all get along. Use the class method load_library "my_lib". This will look in the directory library/my_lib, and load in the Java or Ruby library that it finds by that name. So, all together now, an example that loads both hemesh and the vbo (java and ruby) libraries would look like this:

load_libraries:hemesh,:vboincludeMS# module MS imports necessary java classes and contains ruby MeshToVBO classRES=20attr_reader:mesh_ret,:inv_mesh_ret,:renderdefsetupsize(800,800,P3D)# Code goes here . . .end

Here we load the processing contributed library hemesh, and very own vbo library that translates the hemesh mesh to PShape objects.

There’s also a way to check if a library has been successfully loaded, so you can conditionally enable bits of your app that need certain libraries. library_loaded? :library_name will let you know.

Context-Free library

Some initial work has been done on a pure-Ruby context-free library that allows you to sketch along the lines of Context Free.app, or Algorithm Ink. Details available at the context_free project page. To use it, download the “context_free.rb” library, and place it in “library/context_free”. It allows you to define a set of rules that call one another probabilistically while transforming a set of reference values that are used for drawing — fractals, essentially.

JVM Arguments

Some sketches benefit from passing arguments to the JVM, setting the stack size to be larger than the default, etc. You can put all of your JVM arguments into a file called java_args.txt inside of your sketch’s data folder, and they’ll be passed along to the JVM every time you run it. To see what’s possible, check out Oracle’s documentation.

Cautionary Notes

Simply loading in the code for a library via load_library may not be enough to actually import the library’s classes into your namespace. For some libraries, such as Minim, you’ll want to import the package as well (as you would in Java):

load_library'minim'java_import'ddf.minim'java_import'ddf.minim.analysis'
Some libraries use Java’s reflective capacities to try and invoke methods on your sketch. If the methods that they’re looking for happen to be defined in Ruby alone, Java won’t be able to find them. Better support for this sort of thing should be forthcoming in a future JRuby release, but for now you’ll either need to patch the library to stop using reflection on the sketch, or insert a thin Java interface that lets the library know where your methods are. For example, the Carnivore library uses reflection to try and find a packetEvent() method on the sketch. An appropriate fix is to create, compile and jar-up a java interface, and then include it into your sketch. (It’s icky, I know.)
publicinterfacePacketListener {
publicvoidpacketEvent(org.rsg.carnivore.CarnivorePacketpacket); }

Compile it, jar it up.

javac -cp path/to/carnivore.jar PacketListener.java
jar cvf packet_listener.jar PacketListener.java

And then include it in your sketch…

require'packet_listener'includeJava::PacketListenerdefpacketEvent(packet)# code goes here...end

Clone this wiki locally

, '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

Java and Ruby Libraries

Martin Prout edited this page Aug 1, 2013 · 41 revisions

Ruby-Processing can load a whole mess o’ libraries. From pure-Java libraries, to hybrid Java-C native libs, to pure-Ruby ones, you can make them all get along. Use the class method load_library "my_lib". This will look in the directory library/my_lib, and load in the Java or Ruby library that it finds by that name. So, all together now, an example that loads both hemesh and the vbo (java and ruby) libraries would look like this:

load_libraries:hemesh,:vboincludeMS# module MS imports necessary java classes and contains ruby MeshToVBO classRES=20attr_reader:mesh_ret,:inv_mesh_ret,:renderdefsetupsize(800,800,P3D)# Code goes here . . .end

Here we load the processing contributed library hemesh, and very own vbo library that translates the hemesh mesh to PShape objects.

There’s also a way to check if a library has been successfully loaded, so you can conditionally enable bits of your app that need certain libraries. library_loaded? :library_name will let you know.

Context-Free library

Some initial work has been done on a pure-Ruby context-free library that allows you to sketch along the lines of Context Free.app, or Algorithm Ink. Details available at the context_free project page. To use it, download the “context_free.rb” library, and place it in “library/context_free”. It allows you to define a set of rules that call one another probabilistically while transforming a set of reference values that are used for drawing — fractals, essentially.

JVM Arguments

Some sketches benefit from passing arguments to the JVM, setting the stack size to be larger than the default, etc. You can put all of your JVM arguments into a file called java_args.txt inside of your sketch’s data folder, and they’ll be passed along to the JVM every time you run it. To see what’s possible, check out Oracle’s documentation.

Cautionary Notes

Simply loading in the code for a library via load_library may not be enough to actually import the library’s classes into your namespace. For some libraries, such as Minim, you’ll want to import the package as well (as you would in Java):

load_library'minim'java_import'ddf.minim'java_import'ddf.minim.analysis'
Some libraries use Java’s reflective capacities to try and invoke methods on your sketch. If the methods that they’re looking for happen to be defined in Ruby alone, Java won’t be able to find them. Better support for this sort of thing should be forthcoming in a future JRuby release, but for now you’ll either need to patch the library to stop using reflection on the sketch, or insert a thin Java interface that lets the library know where your methods are. For example, the Carnivore library uses reflection to try and find a packetEvent() method on the sketch. An appropriate fix is to create, compile and jar-up a java interface, and then include it into your sketch. (It’s icky, I know.)
publicinterfacePacketListener {
publicvoidpacketEvent(org.rsg.carnivore.CarnivorePacketpacket); }

Compile it, jar it up.

javac -cp path/to/carnivore.jar PacketListener.java
jar cvf packet_listener.jar PacketListener.java

And then include it in your sketch…

require'packet_listener'includeJava::PacketListenerdefpacketEvent(packet)# code goes here...end

Clone this wiki locally

, '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

Java and Ruby Libraries

Martin Prout edited this page Aug 1, 2013 · 41 revisions

Ruby-Processing can load a whole mess o’ libraries. From pure-Java libraries, to hybrid Java-C native libs, to pure-Ruby ones, you can make them all get along. Use the class method load_library "my_lib". This will look in the directory library/my_lib, and load in the Java or Ruby library that it finds by that name. So, all together now, an example that loads both hemesh and the vbo (java and ruby) libraries would look like this:

load_libraries:hemesh,:vboincludeMS# module MS imports necessary java classes and contains ruby MeshToVBO classRES=20attr_reader:mesh_ret,:inv_mesh_ret,:renderdefsetupsize(800,800,P3D)# Code goes here . . .end

Here we load the processing contributed library hemesh, and very own vbo library that translates the hemesh mesh to PShape objects.

There’s also a way to check if a library has been successfully loaded, so you can conditionally enable bits of your app that need certain libraries. library_loaded? :library_name will let you know.

Context-Free library

Some initial work has been done on a pure-Ruby context-free library that allows you to sketch along the lines of Context Free.app, or Algorithm Ink. Details available at the context_free project page. To use it, download the “context_free.rb” library, and place it in “library/context_free”. It allows you to define a set of rules that call one another probabilistically while transforming a set of reference values that are used for drawing — fractals, essentially.

JVM Arguments

Some sketches benefit from passing arguments to the JVM, setting the stack size to be larger than the default, etc. You can put all of your JVM arguments into a file called java_args.txt inside of your sketch’s data folder, and they’ll be passed along to the JVM every time you run it. To see what’s possible, check out Oracle’s documentation.

Cautionary Notes

Simply loading in the code for a library via load_library may not be enough to actually import the library’s classes into your namespace. For some libraries, such as Minim, you’ll want to import the package as well (as you would in Java):

load_library'minim'java_import'ddf.minim'java_import'ddf.minim.analysis'
Some libraries use Java’s reflective capacities to try and invoke methods on your sketch. If the methods that they’re looking for happen to be defined in Ruby alone, Java won’t be able to find them. Better support for this sort of thing should be forthcoming in a future JRuby release, but for now you’ll either need to patch the library to stop using reflection on the sketch, or insert a thin Java interface that lets the library know where your methods are. For example, the Carnivore library uses reflection to try and find a packetEvent() method on the sketch. An appropriate fix is to create, compile and jar-up a java interface, and then include it into your sketch. (It’s icky, I know.)
publicinterfacePacketListener {
publicvoidpacketEvent(org.rsg.carnivore.CarnivorePacketpacket); }

Compile it, jar it up.

javac -cp path/to/carnivore.jar PacketListener.java
jar cvf packet_listener.jar PacketListener.java

And then include it in your sketch…

require'packet_listener'includeJava::PacketListenerdefpacketEvent(packet)# code goes here...end

Clone this wiki locally

, '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

Java and Ruby Libraries

Martin Prout edited this page Aug 1, 2013 · 41 revisions

Ruby-Processing can load a whole mess o’ libraries. From pure-Java libraries, to hybrid Java-C native libs, to pure-Ruby ones, you can make them all get along. Use the class method load_library "my_lib". This will look in the directory library/my_lib, and load in the Java or Ruby library that it finds by that name. So, all together now, an example that loads both hemesh and the vbo (java and ruby) libraries would look like this:

load_libraries:hemesh,:vboincludeMS# module MS imports necessary java classes and contains ruby MeshToVBO classRES=20attr_reader:mesh_ret,:inv_mesh_ret,:renderdefsetupsize(800,800,P3D)# Code goes here . . .end

Here we load the processing contributed library hemesh, and very own vbo library that translates the hemesh mesh to PShape objects.

There’s also a way to check if a library has been successfully loaded, so you can conditionally enable bits of your app that need certain libraries. library_loaded? :library_name will let you know.

Context-Free library

Some initial work has been done on a pure-Ruby context-free library that allows you to sketch along the lines of Context Free.app, or Algorithm Ink. Details available at the context_free project page. To use it, download the “context_free.rb” library, and place it in “library/context_free”. It allows you to define a set of rules that call one another probabilistically while transforming a set of reference values that are used for drawing — fractals, essentially.

JVM Arguments

Some sketches benefit from passing arguments to the JVM, setting the stack size to be larger than the default, etc. You can put all of your JVM arguments into a file called java_args.txt inside of your sketch’s data folder, and they’ll be passed along to the JVM every time you run it. To see what’s possible, check out Oracle’s documentation.

Cautionary Notes

Simply loading in the code for a library via load_library may not be enough to actually import the library’s classes into your namespace. For some libraries, such as Minim, you’ll want to import the package as well (as you would in Java):

load_library'minim'java_import'ddf.minim'java_import'ddf.minim.analysis'
Some libraries use Java’s reflective capacities to try and invoke methods on your sketch. If the methods that they’re looking for happen to be defined in Ruby alone, Java won’t be able to find them. Better support for this sort of thing should be forthcoming in a future JRuby release, but for now you’ll either need to patch the library to stop using reflection on the sketch, or insert a thin Java interface that lets the library know where your methods are. For example, the Carnivore library uses reflection to try and find a packetEvent() method on the sketch. An appropriate fix is to create, compile and jar-up a java interface, and then include it into your sketch. (It’s icky, I know.)
publicinterfacePacketListener {
publicvoidpacketEvent(org.rsg.carnivore.CarnivorePacketpacket); }

Compile it, jar it up.

javac -cp path/to/carnivore.jar PacketListener.java
jar cvf packet_listener.jar PacketListener.java

And then include it in your sketch…

require'packet_listener'includeJava::PacketListenerdefpacketEvent(packet)# code goes here...end

Clone this wiki locally