Repository files navigation

SimpleHelpers.Net

Collection of simple pieces of utility code

Description and Examples

MemoryCache

Simple lightweight object in-memory cache, with a background timer to remove expired objects.

Fast in-memory cache for data that are expensive to create and can be used in a thread-safe manner.

All stored items are kept in concurrent data structures (ConcurrentDictionary) to allow multi-thread usage of the MemoryCache static methods. Note that the stored objects must be thread-safe, since the same instance of an object can and will be returned by multiple calls of Get methods. If you wish to use non-thread safe object instances you must use the Remove method to atomically (safelly) get and remove the object instance from the cache.

Note: this nuget package contains csharp source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the MemoryCache settings. It should be done for each type, since since the JIT compiler will generate different code at run time, MemoryCache is considered a different class, for example, from MemoryCache or MemoryCache<byte[]>.

// setup (called once in application initialization)// set a duration of an item in the cache to 1 secondMemoryCache<string>.Expiration=TimeSpan.FromSeconds(1);// set the internal maintenance timed task to run each 500 ms removing expired itemsMemoryCache<string>.MaintenanceStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsMemoryCache<string>.OnExpiration+=(stringkey,stringitem)=>{// do something};

Example

// store an itemMemoryCache<string>.Set("k1","test");// get itstringvalue=MemoryCache<string>.Get("k1");// check if we got itif(value!=null){// ok we got it!}

Using a factory to create a new item if the in memory cache does not have it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.stringvalue=MemoryCache<string>.GetOrAdd("key2",factory);

Using a more complex concurrent scenario where, if the item is not found, we only want to call the factory only once. So all concurrent calls will wait until factory (that is guaranteed to be called only once) has created and stored the new item, and will return it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.// It the factory takes more than 250 milliseconds to create then new instance,// it will exit returning the default value for the classstringvalue=MemoryCache<string>.GetOrSyncAdd("key2",factory,TimeSpan.FromMilliseconds(250));// check if we got itif(value!=null){// ok we got it!}

NamedLock

Synchronization helper: a static lock collection associated with a key.

NamedLock manages the lifetime of critical sections that can be accessed by a key (name) throughout the application. It also have some helper methods to allow a maximum wait time (timeout) to acquire the lock and safely release it.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

Simple usage where we try to acquire the lock for 100 ms. So if somewhere else in our application this same lock was already acquired, we will wait until we acquire the lock or 100 ms has passed.

stringkey="our lock name";using(varpadlock=newNamedLock(key)){if(padlock.Enter(TimeSpan.FromMilliseconds(100))){// do something as we now own the lock}else{// do some other thing since we could not aquire the lock}}

Another usage example with a static helper method.

stringkey="our lock name";using(varpadlock=NamedLock.CreateAndEnter(key,TimeSpan.FromMilliseconds(100))){if(padlock.IsLocked){// do something }}

ObjectPool

A simple lightweight object pool for fast and simple object reuse.

Fast lightweight thread-safe object pool for objects that are expensive to create or could efficiently be reused.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

// Get or create a new random generatorRandomrnd=ObjectPool<Random>.Get(CreateRandomGenerator);// start generating random numberstry{// ...varnum=rnd.Next(max);// ...}finally{// Release the random generator by putting it back in the object poolObjectPool<Random>.Put(rnd);}// our factoryprivatestaticRandomCreateRandomGenerator(){returnnewRandom((int)DateTime.UtcNow.Ticks);}

TimedQueue

Simple lightweight queue that stores data in a concurrent queue and periodically process the queued items.

Useful for:

  • processing items in batches;
  • grouping data for later processing;
  • async processing (consumer/producer);
  • etc.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the TimedQueue settings. It should be done for each type, since the JIT compiler will generate differente code at run time, TimedQueue<string> is considered a different class, for example, from TimedQueue<StringBuilder> or TimedQueue<byte[]>.

// setup (called once in application initialization)// set the queue timed task to run each 500 ms executing the registered actionSimpleHelpers.TimedQueue<Our_Object>.TimerStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsSimpleHelpers.TimedQueue<Our_Object>.OnExecution+=(IEnumerable<Our_Object>items)=>{foreach(varevtinitems)// do something};

Example

// our method that does an network call to store out object // and keeps retrying in case of failurepublicstaticvoidSaveEvent(Our_Objectevt){// try to savetry{SaveOverTheInternet(evt);}catch(System.IO.IOExceptionex){// log.Error (ex);SimpleHelpers.TimedQueue<Our_Object>.Put(evt);}}

ConfigManager

Simple configuration manager to get and set the values in the AppSettings section of the default configuration file.

Note: this nuget package contains csharp source code and depends on Generics introduced in .Net 2.0.

Configuration

// setup (called once in application initialization)// set to add any new keys added during the application executionConfigManager.AddNonExistingKeys=true;

** Example **

stringaddress=ConfigManager.Get("MongoDBaddress","localhost");intport=ConfigManager.Get("MongoDBport",21766);

SQLiteStorage

Simple key value storage using sqlite.

All member methods are thread-safe, so a instance can be safely be accessed by multiple threads.

All stored items are serialized to json by json.net.

Note: this nuget package contains csharp source code and depends on .Net 4.0.

Configuration

// setup:SQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());

** Example **

// create a new instanceSQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());// save an item with a key associateddb.Set("my_key_for_this_item",newMy_Class());// get it backMy_Classmy_obj=db.Get("my_key_for_this_item").FirstOrDefault();// to save any changes, just call set againdb.Set("my_key_for_this_item",my_obj);// get all stored itemsforeach(varitemindb.Get()){// ...}

About

Collection of simple pieces of utility code

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

SimpleHelpers.Net

Collection of simple pieces of utility code

Description and Examples

MemoryCache

Simple lightweight object in-memory cache, with a background timer to remove expired objects.

Fast in-memory cache for data that are expensive to create and can be used in a thread-safe manner.

All stored items are kept in concurrent data structures (ConcurrentDictionary) to allow multi-thread usage of the MemoryCache static methods. Note that the stored objects must be thread-safe, since the same instance of an object can and will be returned by multiple calls of Get methods. If you wish to use non-thread safe object instances you must use the Remove method to atomically (safelly) get and remove the object instance from the cache.

Note: this nuget package contains csharp source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the MemoryCache settings. It should be done for each type, since since the JIT compiler will generate different code at run time, MemoryCache is considered a different class, for example, from MemoryCache or MemoryCache<byte[]>.

// setup (called once in application initialization)// set a duration of an item in the cache to 1 secondMemoryCache<string>.Expiration=TimeSpan.FromSeconds(1);// set the internal maintenance timed task to run each 500 ms removing expired itemsMemoryCache<string>.MaintenanceStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsMemoryCache<string>.OnExpiration+=(stringkey,stringitem)=>{// do something};

Example

// store an itemMemoryCache<string>.Set("k1","test");// get itstringvalue=MemoryCache<string>.Get("k1");// check if we got itif(value!=null){// ok we got it!}

Using a factory to create a new item if the in memory cache does not have it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.stringvalue=MemoryCache<string>.GetOrAdd("key2",factory);

Using a more complex concurrent scenario where, if the item is not found, we only want to call the factory only once. So all concurrent calls will wait until factory (that is guaranteed to be called only once) has created and stored the new item, and will return it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.// It the factory takes more than 250 milliseconds to create then new instance,// it will exit returning the default value for the classstringvalue=MemoryCache<string>.GetOrSyncAdd("key2",factory,TimeSpan.FromMilliseconds(250));// check if we got itif(value!=null){// ok we got it!}

NamedLock

Synchronization helper: a static lock collection associated with a key.

NamedLock manages the lifetime of critical sections that can be accessed by a key (name) throughout the application. It also have some helper methods to allow a maximum wait time (timeout) to acquire the lock and safely release it.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

Simple usage where we try to acquire the lock for 100 ms. So if somewhere else in our application this same lock was already acquired, we will wait until we acquire the lock or 100 ms has passed.

stringkey="our lock name";using(varpadlock=newNamedLock(key)){if(padlock.Enter(TimeSpan.FromMilliseconds(100))){// do something as we now own the lock}else{// do some other thing since we could not aquire the lock}}

Another usage example with a static helper method.

stringkey="our lock name";using(varpadlock=NamedLock.CreateAndEnter(key,TimeSpan.FromMilliseconds(100))){if(padlock.IsLocked){// do something }}

ObjectPool

A simple lightweight object pool for fast and simple object reuse.

Fast lightweight thread-safe object pool for objects that are expensive to create or could efficiently be reused.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

// Get or create a new random generatorRandomrnd=ObjectPool<Random>.Get(CreateRandomGenerator);// start generating random numberstry{// ...varnum=rnd.Next(max);// ...}finally{// Release the random generator by putting it back in the object poolObjectPool<Random>.Put(rnd);}// our factoryprivatestaticRandomCreateRandomGenerator(){returnnewRandom((int)DateTime.UtcNow.Ticks);}

TimedQueue

Simple lightweight queue that stores data in a concurrent queue and periodically process the queued items.

Useful for:

  • processing items in batches;
  • grouping data for later processing;
  • async processing (consumer/producer);
  • etc.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the TimedQueue settings. It should be done for each type, since the JIT compiler will generate differente code at run time, TimedQueue<string> is considered a different class, for example, from TimedQueue<StringBuilder> or TimedQueue<byte[]>.

// setup (called once in application initialization)// set the queue timed task to run each 500 ms executing the registered actionSimpleHelpers.TimedQueue<Our_Object>.TimerStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsSimpleHelpers.TimedQueue<Our_Object>.OnExecution+=(IEnumerable<Our_Object>items)=>{foreach(varevtinitems)// do something};

Example

// our method that does an network call to store out object // and keeps retrying in case of failurepublicstaticvoidSaveEvent(Our_Objectevt){// try to savetry{SaveOverTheInternet(evt);}catch(System.IO.IOExceptionex){// log.Error (ex);SimpleHelpers.TimedQueue<Our_Object>.Put(evt);}}

ConfigManager

Simple configuration manager to get and set the values in the AppSettings section of the default configuration file.

Note: this nuget package contains csharp source code and depends on Generics introduced in .Net 2.0.

Configuration

// setup (called once in application initialization)// set to add any new keys added during the application executionConfigManager.AddNonExistingKeys=true;

** Example **

stringaddress=ConfigManager.Get("MongoDBaddress","localhost");intport=ConfigManager.Get("MongoDBport",21766);

SQLiteStorage

Simple key value storage using sqlite.

All member methods are thread-safe, so a instance can be safely be accessed by multiple threads.

All stored items are serialized to json by json.net.

Note: this nuget package contains csharp source code and depends on .Net 4.0.

Configuration

// setup:SQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());

** Example **

// create a new instanceSQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());// save an item with a key associateddb.Set("my_key_for_this_item",newMy_Class());// get it backMy_Classmy_obj=db.Get("my_key_for_this_item").FirstOrDefault();// to save any changes, just call set againdb.Set("my_key_for_this_item",my_obj);// get all stored itemsforeach(varitemindb.Get()){// ...}

About

Collection of simple pieces of utility code

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

SimpleHelpers.Net

Collection of simple pieces of utility code

Description and Examples

MemoryCache

Simple lightweight object in-memory cache, with a background timer to remove expired objects.

Fast in-memory cache for data that are expensive to create and can be used in a thread-safe manner.

All stored items are kept in concurrent data structures (ConcurrentDictionary) to allow multi-thread usage of the MemoryCache static methods. Note that the stored objects must be thread-safe, since the same instance of an object can and will be returned by multiple calls of Get methods. If you wish to use non-thread safe object instances you must use the Remove method to atomically (safelly) get and remove the object instance from the cache.

Note: this nuget package contains csharp source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the MemoryCache settings. It should be done for each type, since since the JIT compiler will generate different code at run time, MemoryCache is considered a different class, for example, from MemoryCache or MemoryCache<byte[]>.

// setup (called once in application initialization)// set a duration of an item in the cache to 1 secondMemoryCache<string>.Expiration=TimeSpan.FromSeconds(1);// set the internal maintenance timed task to run each 500 ms removing expired itemsMemoryCache<string>.MaintenanceStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsMemoryCache<string>.OnExpiration+=(stringkey,stringitem)=>{// do something};

Example

// store an itemMemoryCache<string>.Set("k1","test");// get itstringvalue=MemoryCache<string>.Get("k1");// check if we got itif(value!=null){// ok we got it!}

Using a factory to create a new item if the in memory cache does not have it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.stringvalue=MemoryCache<string>.GetOrAdd("key2",factory);

Using a more complex concurrent scenario where, if the item is not found, we only want to call the factory only once. So all concurrent calls will wait until factory (that is guaranteed to be called only once) has created and stored the new item, and will return it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.// It the factory takes more than 250 milliseconds to create then new instance,// it will exit returning the default value for the classstringvalue=MemoryCache<string>.GetOrSyncAdd("key2",factory,TimeSpan.FromMilliseconds(250));// check if we got itif(value!=null){// ok we got it!}

NamedLock

Synchronization helper: a static lock collection associated with a key.

NamedLock manages the lifetime of critical sections that can be accessed by a key (name) throughout the application. It also have some helper methods to allow a maximum wait time (timeout) to acquire the lock and safely release it.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

Simple usage where we try to acquire the lock for 100 ms. So if somewhere else in our application this same lock was already acquired, we will wait until we acquire the lock or 100 ms has passed.

stringkey="our lock name";using(varpadlock=newNamedLock(key)){if(padlock.Enter(TimeSpan.FromMilliseconds(100))){// do something as we now own the lock}else{// do some other thing since we could not aquire the lock}}

Another usage example with a static helper method.

stringkey="our lock name";using(varpadlock=NamedLock.CreateAndEnter(key,TimeSpan.FromMilliseconds(100))){if(padlock.IsLocked){// do something }}

ObjectPool

A simple lightweight object pool for fast and simple object reuse.

Fast lightweight thread-safe object pool for objects that are expensive to create or could efficiently be reused.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

// Get or create a new random generatorRandomrnd=ObjectPool<Random>.Get(CreateRandomGenerator);// start generating random numberstry{// ...varnum=rnd.Next(max);// ...}finally{// Release the random generator by putting it back in the object poolObjectPool<Random>.Put(rnd);}// our factoryprivatestaticRandomCreateRandomGenerator(){returnnewRandom((int)DateTime.UtcNow.Ticks);}

TimedQueue

Simple lightweight queue that stores data in a concurrent queue and periodically process the queued items.

Useful for:

  • processing items in batches;
  • grouping data for later processing;
  • async processing (consumer/producer);
  • etc.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the TimedQueue settings. It should be done for each type, since the JIT compiler will generate differente code at run time, TimedQueue<string> is considered a different class, for example, from TimedQueue<StringBuilder> or TimedQueue<byte[]>.

// setup (called once in application initialization)// set the queue timed task to run each 500 ms executing the registered actionSimpleHelpers.TimedQueue<Our_Object>.TimerStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsSimpleHelpers.TimedQueue<Our_Object>.OnExecution+=(IEnumerable<Our_Object>items)=>{foreach(varevtinitems)// do something};

Example

// our method that does an network call to store out object // and keeps retrying in case of failurepublicstaticvoidSaveEvent(Our_Objectevt){// try to savetry{SaveOverTheInternet(evt);}catch(System.IO.IOExceptionex){// log.Error (ex);SimpleHelpers.TimedQueue<Our_Object>.Put(evt);}}

ConfigManager

Simple configuration manager to get and set the values in the AppSettings section of the default configuration file.

Note: this nuget package contains csharp source code and depends on Generics introduced in .Net 2.0.

Configuration

// setup (called once in application initialization)// set to add any new keys added during the application executionConfigManager.AddNonExistingKeys=true;

** Example **

stringaddress=ConfigManager.Get("MongoDBaddress","localhost");intport=ConfigManager.Get("MongoDBport",21766);

SQLiteStorage

Simple key value storage using sqlite.

All member methods are thread-safe, so a instance can be safely be accessed by multiple threads.

All stored items are serialized to json by json.net.

Note: this nuget package contains csharp source code and depends on .Net 4.0.

Configuration

// setup:SQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());

** Example **

// create a new instanceSQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());// save an item with a key associateddb.Set("my_key_for_this_item",newMy_Class());// get it backMy_Classmy_obj=db.Get("my_key_for_this_item").FirstOrDefault();// to save any changes, just call set againdb.Set("my_key_for_this_item",my_obj);// get all stored itemsforeach(varitemindb.Get()){// ...}

About

Collection of simple pieces of utility code

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

SimpleHelpers.Net

Collection of simple pieces of utility code

Description and Examples

MemoryCache

Simple lightweight object in-memory cache, with a background timer to remove expired objects.

Fast in-memory cache for data that are expensive to create and can be used in a thread-safe manner.

All stored items are kept in concurrent data structures (ConcurrentDictionary) to allow multi-thread usage of the MemoryCache static methods. Note that the stored objects must be thread-safe, since the same instance of an object can and will be returned by multiple calls of Get methods. If you wish to use non-thread safe object instances you must use the Remove method to atomically (safelly) get and remove the object instance from the cache.

Note: this nuget package contains csharp source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the MemoryCache settings. It should be done for each type, since since the JIT compiler will generate different code at run time, MemoryCache is considered a different class, for example, from MemoryCache or MemoryCache<byte[]>.

// setup (called once in application initialization)// set a duration of an item in the cache to 1 secondMemoryCache<string>.Expiration=TimeSpan.FromSeconds(1);// set the internal maintenance timed task to run each 500 ms removing expired itemsMemoryCache<string>.MaintenanceStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsMemoryCache<string>.OnExpiration+=(stringkey,stringitem)=>{// do something};

Example

// store an itemMemoryCache<string>.Set("k1","test");// get itstringvalue=MemoryCache<string>.Get("k1");// check if we got itif(value!=null){// ok we got it!}

Using a factory to create a new item if the in memory cache does not have it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.stringvalue=MemoryCache<string>.GetOrAdd("key2",factory);

Using a more complex concurrent scenario where, if the item is not found, we only want to call the factory only once. So all concurrent calls will wait until factory (that is guaranteed to be called only once) has created and stored the new item, and will return it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.// It the factory takes more than 250 milliseconds to create then new instance,// it will exit returning the default value for the classstringvalue=MemoryCache<string>.GetOrSyncAdd("key2",factory,TimeSpan.FromMilliseconds(250));// check if we got itif(value!=null){// ok we got it!}

NamedLock

Synchronization helper: a static lock collection associated with a key.

NamedLock manages the lifetime of critical sections that can be accessed by a key (name) throughout the application. It also have some helper methods to allow a maximum wait time (timeout) to acquire the lock and safely release it.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

Simple usage where we try to acquire the lock for 100 ms. So if somewhere else in our application this same lock was already acquired, we will wait until we acquire the lock or 100 ms has passed.

stringkey="our lock name";using(varpadlock=newNamedLock(key)){if(padlock.Enter(TimeSpan.FromMilliseconds(100))){// do something as we now own the lock}else{// do some other thing since we could not aquire the lock}}

Another usage example with a static helper method.

stringkey="our lock name";using(varpadlock=NamedLock.CreateAndEnter(key,TimeSpan.FromMilliseconds(100))){if(padlock.IsLocked){// do something }}

ObjectPool

A simple lightweight object pool for fast and simple object reuse.

Fast lightweight thread-safe object pool for objects that are expensive to create or could efficiently be reused.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

// Get or create a new random generatorRandomrnd=ObjectPool<Random>.Get(CreateRandomGenerator);// start generating random numberstry{// ...varnum=rnd.Next(max);// ...}finally{// Release the random generator by putting it back in the object poolObjectPool<Random>.Put(rnd);}// our factoryprivatestaticRandomCreateRandomGenerator(){returnnewRandom((int)DateTime.UtcNow.Ticks);}

TimedQueue

Simple lightweight queue that stores data in a concurrent queue and periodically process the queued items.

Useful for:

  • processing items in batches;
  • grouping data for later processing;
  • async processing (consumer/producer);
  • etc.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the TimedQueue settings. It should be done for each type, since the JIT compiler will generate differente code at run time, TimedQueue<string> is considered a different class, for example, from TimedQueue<StringBuilder> or TimedQueue<byte[]>.

// setup (called once in application initialization)// set the queue timed task to run each 500 ms executing the registered actionSimpleHelpers.TimedQueue<Our_Object>.TimerStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsSimpleHelpers.TimedQueue<Our_Object>.OnExecution+=(IEnumerable<Our_Object>items)=>{foreach(varevtinitems)// do something};

Example

// our method that does an network call to store out object // and keeps retrying in case of failurepublicstaticvoidSaveEvent(Our_Objectevt){// try to savetry{SaveOverTheInternet(evt);}catch(System.IO.IOExceptionex){// log.Error (ex);SimpleHelpers.TimedQueue<Our_Object>.Put(evt);}}

ConfigManager

Simple configuration manager to get and set the values in the AppSettings section of the default configuration file.

Note: this nuget package contains csharp source code and depends on Generics introduced in .Net 2.0.

Configuration

// setup (called once in application initialization)// set to add any new keys added during the application executionConfigManager.AddNonExistingKeys=true;

** Example **

stringaddress=ConfigManager.Get("MongoDBaddress","localhost");intport=ConfigManager.Get("MongoDBport",21766);

SQLiteStorage

Simple key value storage using sqlite.

All member methods are thread-safe, so a instance can be safely be accessed by multiple threads.

All stored items are serialized to json by json.net.

Note: this nuget package contains csharp source code and depends on .Net 4.0.

Configuration

// setup:SQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());

** Example **

// create a new instanceSQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());// save an item with a key associateddb.Set("my_key_for_this_item",newMy_Class());// get it backMy_Classmy_obj=db.Get("my_key_for_this_item").FirstOrDefault();// to save any changes, just call set againdb.Set("my_key_for_this_item",my_obj);// get all stored itemsforeach(varitemindb.Get()){// ...}

About

Collection of simple pieces of utility code

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

SimpleHelpers.Net

Collection of simple pieces of utility code

Description and Examples

MemoryCache

Simple lightweight object in-memory cache, with a background timer to remove expired objects.

Fast in-memory cache for data that are expensive to create and can be used in a thread-safe manner.

All stored items are kept in concurrent data structures (ConcurrentDictionary) to allow multi-thread usage of the MemoryCache static methods. Note that the stored objects must be thread-safe, since the same instance of an object can and will be returned by multiple calls of Get methods. If you wish to use non-thread safe object instances you must use the Remove method to atomically (safelly) get and remove the object instance from the cache.

Note: this nuget package contains csharp source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the MemoryCache settings. It should be done for each type, since since the JIT compiler will generate different code at run time, MemoryCache is considered a different class, for example, from MemoryCache or MemoryCache<byte[]>.

// setup (called once in application initialization)// set a duration of an item in the cache to 1 secondMemoryCache<string>.Expiration=TimeSpan.FromSeconds(1);// set the internal maintenance timed task to run each 500 ms removing expired itemsMemoryCache<string>.MaintenanceStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsMemoryCache<string>.OnExpiration+=(stringkey,stringitem)=>{// do something};

Example

// store an itemMemoryCache<string>.Set("k1","test");// get itstringvalue=MemoryCache<string>.Get("k1");// check if we got itif(value!=null){// ok we got it!}

Using a factory to create a new item if the in memory cache does not have it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.stringvalue=MemoryCache<string>.GetOrAdd("key2",factory);

Using a more complex concurrent scenario where, if the item is not found, we only want to call the factory only once. So all concurrent calls will wait until factory (that is guaranteed to be called only once) has created and stored the new item, and will return it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.// It the factory takes more than 250 milliseconds to create then new instance,// it will exit returning the default value for the classstringvalue=MemoryCache<string>.GetOrSyncAdd("key2",factory,TimeSpan.FromMilliseconds(250));// check if we got itif(value!=null){// ok we got it!}

NamedLock

Synchronization helper: a static lock collection associated with a key.

NamedLock manages the lifetime of critical sections that can be accessed by a key (name) throughout the application. It also have some helper methods to allow a maximum wait time (timeout) to acquire the lock and safely release it.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

Simple usage where we try to acquire the lock for 100 ms. So if somewhere else in our application this same lock was already acquired, we will wait until we acquire the lock or 100 ms has passed.

stringkey="our lock name";using(varpadlock=newNamedLock(key)){if(padlock.Enter(TimeSpan.FromMilliseconds(100))){// do something as we now own the lock}else{// do some other thing since we could not aquire the lock}}

Another usage example with a static helper method.

stringkey="our lock name";using(varpadlock=NamedLock.CreateAndEnter(key,TimeSpan.FromMilliseconds(100))){if(padlock.IsLocked){// do something }}

ObjectPool

A simple lightweight object pool for fast and simple object reuse.

Fast lightweight thread-safe object pool for objects that are expensive to create or could efficiently be reused.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

// Get or create a new random generatorRandomrnd=ObjectPool<Random>.Get(CreateRandomGenerator);// start generating random numberstry{// ...varnum=rnd.Next(max);// ...}finally{// Release the random generator by putting it back in the object poolObjectPool<Random>.Put(rnd);}// our factoryprivatestaticRandomCreateRandomGenerator(){returnnewRandom((int)DateTime.UtcNow.Ticks);}

TimedQueue

Simple lightweight queue that stores data in a concurrent queue and periodically process the queued items.

Useful for:

  • processing items in batches;
  • grouping data for later processing;
  • async processing (consumer/producer);
  • etc.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the TimedQueue settings. It should be done for each type, since the JIT compiler will generate differente code at run time, TimedQueue<string> is considered a different class, for example, from TimedQueue<StringBuilder> or TimedQueue<byte[]>.

// setup (called once in application initialization)// set the queue timed task to run each 500 ms executing the registered actionSimpleHelpers.TimedQueue<Our_Object>.TimerStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsSimpleHelpers.TimedQueue<Our_Object>.OnExecution+=(IEnumerable<Our_Object>items)=>{foreach(varevtinitems)// do something};

Example

// our method that does an network call to store out object // and keeps retrying in case of failurepublicstaticvoidSaveEvent(Our_Objectevt){// try to savetry{SaveOverTheInternet(evt);}catch(System.IO.IOExceptionex){// log.Error (ex);SimpleHelpers.TimedQueue<Our_Object>.Put(evt);}}

ConfigManager

Simple configuration manager to get and set the values in the AppSettings section of the default configuration file.

Note: this nuget package contains csharp source code and depends on Generics introduced in .Net 2.0.

Configuration

// setup (called once in application initialization)// set to add any new keys added during the application executionConfigManager.AddNonExistingKeys=true;

** Example **

stringaddress=ConfigManager.Get("MongoDBaddress","localhost");intport=ConfigManager.Get("MongoDBport",21766);

SQLiteStorage

Simple key value storage using sqlite.

All member methods are thread-safe, so a instance can be safely be accessed by multiple threads.

All stored items are serialized to json by json.net.

Note: this nuget package contains csharp source code and depends on .Net 4.0.

Configuration

// setup:SQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());

** Example **

// create a new instanceSQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());// save an item with a key associateddb.Set("my_key_for_this_item",newMy_Class());// get it backMy_Classmy_obj=db.Get("my_key_for_this_item").FirstOrDefault();// to save any changes, just call set againdb.Set("my_key_for_this_item",my_obj);// get all stored itemsforeach(varitemindb.Get()){// ...}

About

Collection of simple pieces of utility code

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

SimpleHelpers.Net

Collection of simple pieces of utility code

Description and Examples

MemoryCache

Simple lightweight object in-memory cache, with a background timer to remove expired objects.

Fast in-memory cache for data that are expensive to create and can be used in a thread-safe manner.

All stored items are kept in concurrent data structures (ConcurrentDictionary) to allow multi-thread usage of the MemoryCache static methods. Note that the stored objects must be thread-safe, since the same instance of an object can and will be returned by multiple calls of Get methods. If you wish to use non-thread safe object instances you must use the Remove method to atomically (safelly) get and remove the object instance from the cache.

Note: this nuget package contains csharp source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the MemoryCache settings. It should be done for each type, since since the JIT compiler will generate different code at run time, MemoryCache is considered a different class, for example, from MemoryCache or MemoryCache<byte[]>.

// setup (called once in application initialization)// set a duration of an item in the cache to 1 secondMemoryCache<string>.Expiration=TimeSpan.FromSeconds(1);// set the internal maintenance timed task to run each 500 ms removing expired itemsMemoryCache<string>.MaintenanceStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsMemoryCache<string>.OnExpiration+=(stringkey,stringitem)=>{// do something};

Example

// store an itemMemoryCache<string>.Set("k1","test");// get itstringvalue=MemoryCache<string>.Get("k1");// check if we got itif(value!=null){// ok we got it!}

Using a factory to create a new item if the in memory cache does not have it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.stringvalue=MemoryCache<string>.GetOrAdd("key2",factory);

Using a more complex concurrent scenario where, if the item is not found, we only want to call the factory only once. So all concurrent calls will wait until factory (that is guaranteed to be called only once) has created and stored the new item, and will return it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.// It the factory takes more than 250 milliseconds to create then new instance,// it will exit returning the default value for the classstringvalue=MemoryCache<string>.GetOrSyncAdd("key2",factory,TimeSpan.FromMilliseconds(250));// check if we got itif(value!=null){// ok we got it!}

NamedLock

Synchronization helper: a static lock collection associated with a key.

NamedLock manages the lifetime of critical sections that can be accessed by a key (name) throughout the application. It also have some helper methods to allow a maximum wait time (timeout) to acquire the lock and safely release it.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

Simple usage where we try to acquire the lock for 100 ms. So if somewhere else in our application this same lock was already acquired, we will wait until we acquire the lock or 100 ms has passed.

stringkey="our lock name";using(varpadlock=newNamedLock(key)){if(padlock.Enter(TimeSpan.FromMilliseconds(100))){// do something as we now own the lock}else{// do some other thing since we could not aquire the lock}}

Another usage example with a static helper method.

stringkey="our lock name";using(varpadlock=NamedLock.CreateAndEnter(key,TimeSpan.FromMilliseconds(100))){if(padlock.IsLocked){// do something }}

ObjectPool

A simple lightweight object pool for fast and simple object reuse.

Fast lightweight thread-safe object pool for objects that are expensive to create or could efficiently be reused.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

// Get or create a new random generatorRandomrnd=ObjectPool<Random>.Get(CreateRandomGenerator);// start generating random numberstry{// ...varnum=rnd.Next(max);// ...}finally{// Release the random generator by putting it back in the object poolObjectPool<Random>.Put(rnd);}// our factoryprivatestaticRandomCreateRandomGenerator(){returnnewRandom((int)DateTime.UtcNow.Ticks);}

TimedQueue

Simple lightweight queue that stores data in a concurrent queue and periodically process the queued items.

Useful for:

  • processing items in batches;
  • grouping data for later processing;
  • async processing (consumer/producer);
  • etc.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the TimedQueue settings. It should be done for each type, since the JIT compiler will generate differente code at run time, TimedQueue<string> is considered a different class, for example, from TimedQueue<StringBuilder> or TimedQueue<byte[]>.

// setup (called once in application initialization)// set the queue timed task to run each 500 ms executing the registered actionSimpleHelpers.TimedQueue<Our_Object>.TimerStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsSimpleHelpers.TimedQueue<Our_Object>.OnExecution+=(IEnumerable<Our_Object>items)=>{foreach(varevtinitems)// do something};

Example

// our method that does an network call to store out object // and keeps retrying in case of failurepublicstaticvoidSaveEvent(Our_Objectevt){// try to savetry{SaveOverTheInternet(evt);}catch(System.IO.IOExceptionex){// log.Error (ex);SimpleHelpers.TimedQueue<Our_Object>.Put(evt);}}

ConfigManager

Simple configuration manager to get and set the values in the AppSettings section of the default configuration file.

Note: this nuget package contains csharp source code and depends on Generics introduced in .Net 2.0.

Configuration

// setup (called once in application initialization)// set to add any new keys added during the application executionConfigManager.AddNonExistingKeys=true;

** Example **

stringaddress=ConfigManager.Get("MongoDBaddress","localhost");intport=ConfigManager.Get("MongoDBport",21766);

SQLiteStorage

Simple key value storage using sqlite.

All member methods are thread-safe, so a instance can be safely be accessed by multiple threads.

All stored items are serialized to json by json.net.

Note: this nuget package contains csharp source code and depends on .Net 4.0.

Configuration

// setup:SQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());

** Example **

// create a new instanceSQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());// save an item with a key associateddb.Set("my_key_for_this_item",newMy_Class());// get it backMy_Classmy_obj=db.Get("my_key_for_this_item").FirstOrDefault();// to save any changes, just call set againdb.Set("my_key_for_this_item",my_obj);// get all stored itemsforeach(varitemindb.Get()){// ...}

About

Collection of simple pieces of utility code

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

SimpleHelpers.Net

Collection of simple pieces of utility code

Description and Examples

MemoryCache

Simple lightweight object in-memory cache, with a background timer to remove expired objects.

Fast in-memory cache for data that are expensive to create and can be used in a thread-safe manner.

All stored items are kept in concurrent data structures (ConcurrentDictionary) to allow multi-thread usage of the MemoryCache static methods. Note that the stored objects must be thread-safe, since the same instance of an object can and will be returned by multiple calls of Get methods. If you wish to use non-thread safe object instances you must use the Remove method to atomically (safelly) get and remove the object instance from the cache.

Note: this nuget package contains csharp source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the MemoryCache settings. It should be done for each type, since since the JIT compiler will generate different code at run time, MemoryCache is considered a different class, for example, from MemoryCache or MemoryCache<byte[]>.

// setup (called once in application initialization)// set a duration of an item in the cache to 1 secondMemoryCache<string>.Expiration=TimeSpan.FromSeconds(1);// set the internal maintenance timed task to run each 500 ms removing expired itemsMemoryCache<string>.MaintenanceStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsMemoryCache<string>.OnExpiration+=(stringkey,stringitem)=>{// do something};

Example

// store an itemMemoryCache<string>.Set("k1","test");// get itstringvalue=MemoryCache<string>.Get("k1");// check if we got itif(value!=null){// ok we got it!}

Using a factory to create a new item if the in memory cache does not have it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.stringvalue=MemoryCache<string>.GetOrAdd("key2",factory);

Using a more complex concurrent scenario where, if the item is not found, we only want to call the factory only once. So all concurrent calls will wait until factory (that is guaranteed to be called only once) has created and stored the new item, and will return it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.// It the factory takes more than 250 milliseconds to create then new instance,// it will exit returning the default value for the classstringvalue=MemoryCache<string>.GetOrSyncAdd("key2",factory,TimeSpan.FromMilliseconds(250));// check if we got itif(value!=null){// ok we got it!}

NamedLock

Synchronization helper: a static lock collection associated with a key.

NamedLock manages the lifetime of critical sections that can be accessed by a key (name) throughout the application. It also have some helper methods to allow a maximum wait time (timeout) to acquire the lock and safely release it.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

Simple usage where we try to acquire the lock for 100 ms. So if somewhere else in our application this same lock was already acquired, we will wait until we acquire the lock or 100 ms has passed.

stringkey="our lock name";using(varpadlock=newNamedLock(key)){if(padlock.Enter(TimeSpan.FromMilliseconds(100))){// do something as we now own the lock}else{// do some other thing since we could not aquire the lock}}

Another usage example with a static helper method.

stringkey="our lock name";using(varpadlock=NamedLock.CreateAndEnter(key,TimeSpan.FromMilliseconds(100))){if(padlock.IsLocked){// do something }}

ObjectPool

A simple lightweight object pool for fast and simple object reuse.

Fast lightweight thread-safe object pool for objects that are expensive to create or could efficiently be reused.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

// Get or create a new random generatorRandomrnd=ObjectPool<Random>.Get(CreateRandomGenerator);// start generating random numberstry{// ...varnum=rnd.Next(max);// ...}finally{// Release the random generator by putting it back in the object poolObjectPool<Random>.Put(rnd);}// our factoryprivatestaticRandomCreateRandomGenerator(){returnnewRandom((int)DateTime.UtcNow.Ticks);}

TimedQueue

Simple lightweight queue that stores data in a concurrent queue and periodically process the queued items.

Useful for:

  • processing items in batches;
  • grouping data for later processing;
  • async processing (consumer/producer);
  • etc.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the TimedQueue settings. It should be done for each type, since the JIT compiler will generate differente code at run time, TimedQueue<string> is considered a different class, for example, from TimedQueue<StringBuilder> or TimedQueue<byte[]>.

// setup (called once in application initialization)// set the queue timed task to run each 500 ms executing the registered actionSimpleHelpers.TimedQueue<Our_Object>.TimerStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsSimpleHelpers.TimedQueue<Our_Object>.OnExecution+=(IEnumerable<Our_Object>items)=>{foreach(varevtinitems)// do something};

Example

// our method that does an network call to store out object // and keeps retrying in case of failurepublicstaticvoidSaveEvent(Our_Objectevt){// try to savetry{SaveOverTheInternet(evt);}catch(System.IO.IOExceptionex){// log.Error (ex);SimpleHelpers.TimedQueue<Our_Object>.Put(evt);}}

ConfigManager

Simple configuration manager to get and set the values in the AppSettings section of the default configuration file.

Note: this nuget package contains csharp source code and depends on Generics introduced in .Net 2.0.

Configuration

// setup (called once in application initialization)// set to add any new keys added during the application executionConfigManager.AddNonExistingKeys=true;

** Example **

stringaddress=ConfigManager.Get("MongoDBaddress","localhost");intport=ConfigManager.Get("MongoDBport",21766);

SQLiteStorage

Simple key value storage using sqlite.

All member methods are thread-safe, so a instance can be safely be accessed by multiple threads.

All stored items are serialized to json by json.net.

Note: this nuget package contains csharp source code and depends on .Net 4.0.

Configuration

// setup:SQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());

** Example **

// create a new instanceSQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());// save an item with a key associateddb.Set("my_key_for_this_item",newMy_Class());// get it backMy_Classmy_obj=db.Get("my_key_for_this_item").FirstOrDefault();// to save any changes, just call set againdb.Set("my_key_for_this_item",my_obj);// get all stored itemsforeach(varitemindb.Get()){// ...}

About

Collection of simple pieces of utility code

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

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

Repository files navigation

SimpleHelpers.Net

Collection of simple pieces of utility code

Description and Examples

MemoryCache

Simple lightweight object in-memory cache, with a background timer to remove expired objects.

Fast in-memory cache for data that are expensive to create and can be used in a thread-safe manner.

All stored items are kept in concurrent data structures (ConcurrentDictionary) to allow multi-thread usage of the MemoryCache static methods. Note that the stored objects must be thread-safe, since the same instance of an object can and will be returned by multiple calls of Get methods. If you wish to use non-thread safe object instances you must use the Remove method to atomically (safelly) get and remove the object instance from the cache.

Note: this nuget package contains csharp source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the MemoryCache settings. It should be done for each type, since since the JIT compiler will generate different code at run time, MemoryCache is considered a different class, for example, from MemoryCache or MemoryCache<byte[]>.

// setup (called once in application initialization)// set a duration of an item in the cache to 1 secondMemoryCache<string>.Expiration=TimeSpan.FromSeconds(1);// set the internal maintenance timed task to run each 500 ms removing expired itemsMemoryCache<string>.MaintenanceStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsMemoryCache<string>.OnExpiration+=(stringkey,stringitem)=>{// do something};

Example

// store an itemMemoryCache<string>.Set("k1","test");// get itstringvalue=MemoryCache<string>.Get("k1");// check if we got itif(value!=null){// ok we got it!}

Using a factory to create a new item if the in memory cache does not have it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.stringvalue=MemoryCache<string>.GetOrAdd("key2",factory);

Using a more complex concurrent scenario where, if the item is not found, we only want to call the factory only once. So all concurrent calls will wait until factory (that is guaranteed to be called only once) has created and stored the new item, and will return it.

// prepare our factoryvarfactory=(stringkey)=>{returnkey+DateTime.Now.ToString();};// try to get the associated value if the cache does not have it// then use the factory to create a new one, store and return it.// It the factory takes more than 250 milliseconds to create then new instance,// it will exit returning the default value for the classstringvalue=MemoryCache<string>.GetOrSyncAdd("key2",factory,TimeSpan.FromMilliseconds(250));// check if we got itif(value!=null){// ok we got it!}

NamedLock

Synchronization helper: a static lock collection associated with a key.

NamedLock manages the lifetime of critical sections that can be accessed by a key (name) throughout the application. It also have some helper methods to allow a maximum wait time (timeout) to acquire the lock and safely release it.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

Simple usage where we try to acquire the lock for 100 ms. So if somewhere else in our application this same lock was already acquired, we will wait until we acquire the lock or 100 ms has passed.

stringkey="our lock name";using(varpadlock=newNamedLock(key)){if(padlock.Enter(TimeSpan.FromMilliseconds(100))){// do something as we now own the lock}else{// do some other thing since we could not aquire the lock}}

Another usage example with a static helper method.

stringkey="our lock name";using(varpadlock=NamedLock.CreateAndEnter(key,TimeSpan.FromMilliseconds(100))){if(padlock.IsLocked){// do something }}

ObjectPool

A simple lightweight object pool for fast and simple object reuse.

Fast lightweight thread-safe object pool for objects that are expensive to create or could efficiently be reused.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Example

// Get or create a new random generatorRandomrnd=ObjectPool<Random>.Get(CreateRandomGenerator);// start generating random numberstry{// ...varnum=rnd.Next(max);// ...}finally{// Release the random generator by putting it back in the object poolObjectPool<Random>.Put(rnd);}// our factoryprivatestaticRandomCreateRandomGenerator(){returnnewRandom((int)DateTime.UtcNow.Ticks);}

TimedQueue

Simple lightweight queue that stores data in a concurrent queue and periodically process the queued items.

Useful for:

  • processing items in batches;
  • grouping data for later processing;
  • async processing (consumer/producer);
  • etc.

Note: this nuget package contains c# source code and depends on System.Collections.Concurrent introduced in .Net 4.0.

Configuration

Simple configuration of the TimedQueue settings. It should be done for each type, since the JIT compiler will generate differente code at run time, TimedQueue<string> is considered a different class, for example, from TimedQueue<StringBuilder> or TimedQueue<byte[]>.

// setup (called once in application initialization)// set the queue timed task to run each 500 ms executing the registered actionSimpleHelpers.TimedQueue<Our_Object>.TimerStep=TimeSpan.FromMilliseconds(500);// Our event, if we want to treat the removed expired itemsSimpleHelpers.TimedQueue<Our_Object>.OnExecution+=(IEnumerable<Our_Object>items)=>{foreach(varevtinitems)// do something};

Example

// our method that does an network call to store out object // and keeps retrying in case of failurepublicstaticvoidSaveEvent(Our_Objectevt){// try to savetry{SaveOverTheInternet(evt);}catch(System.IO.IOExceptionex){// log.Error (ex);SimpleHelpers.TimedQueue<Our_Object>.Put(evt);}}

ConfigManager

Simple configuration manager to get and set the values in the AppSettings section of the default configuration file.

Note: this nuget package contains csharp source code and depends on Generics introduced in .Net 2.0.

Configuration

// setup (called once in application initialization)// set to add any new keys added during the application executionConfigManager.AddNonExistingKeys=true;

** Example **

stringaddress=ConfigManager.Get("MongoDBaddress","localhost");intport=ConfigManager.Get("MongoDBport",21766);

SQLiteStorage

Simple key value storage using sqlite.

All member methods are thread-safe, so a instance can be safely be accessed by multiple threads.

All stored items are serialized to json by json.net.

Note: this nuget package contains csharp source code and depends on .Net 4.0.

Configuration

// setup:SQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());

** Example **

// create a new instanceSQLiteStorage<My_Class>db=newSQLiteStorage<My_Class>("path_to_my_file.sqlite",SQLiteStorageOptions.UniqueKeys());// save an item with a key associateddb.Set("my_key_for_this_item",newMy_Class());// get it backMy_Classmy_obj=db.Get("my_key_for_this_item").FirstOrDefault();// to save any changes, just call set againdb.Set("my_key_for_this_item",my_obj);// get all stored itemsforeach(varitemindb.Get()){// ...}

About

Collection of simple pieces of utility code

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages