<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>JokevO</title><link>https://jokevo.github.io/</link><description>Recent content on JokevO</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 11 Apr 2026 08:30:00 +0000</lastBuildDate><atom:link href="https://jokevo.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Elgato Keylights: automating shutdown on linux</title><link>https://jokevo.github.io/snippets/2026-04-10-elgato-keylights-automation/</link><pubDate>Sat, 11 Apr 2026 08:30:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2026-04-10-elgato-keylights-automation/</guid><description>&lt;p&gt;I have some nice Elgato keylights that I have been using under windows for a long time. The software for windows has a nice feature that I missed when switching to linux: I had the option to automatically shut down the lights when I shut off my pc.&lt;/p&gt;
&lt;p&gt;I got pretty used to it and didn&amp;rsquo;t like that I manually had to turn them off, let alone that I forgot it everytime since I was used to the automation and I then had to go find my phone, find the app and turn them off manually.&lt;/p&gt;</description></item><item><title>Photoshop script: scripting listener</title><link>https://jokevo.github.io/snippets/2017-10-18-ps-script-scripting-listener/</link><pubDate>Wed, 18 Oct 2017 23:30:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2017-10-18-ps-script-scripting-listener/</guid><description>&lt;p&gt;When you are scripting in photoshop, you will notice not all operations you use in photoshop are found in the &lt;a href="http://www.adobe.com/content/dam/acom/en/devnet/photoshop/pdfs/photoshop-cc-javascript-ref-2015.pdf"&gt;scripting reference&lt;/a&gt;. These operations can be used through the action manager (if the action is recordable).&lt;/p&gt;
&lt;p&gt;To help you with the actions, you can install a plugin called &lt;a href="https://helpx.adobe.com/photoshop/kb/downloadable-plugins-and-content.html#ScriptingListenerplugin"&gt;ScriptingListener&lt;/a&gt;. This plugin will record every action you do in photoshop and output them in two txt files. These files will be saved on your desktop and are called &lt;code&gt;ScriptingListenerJS.log&lt;/code&gt; and &lt;code&gt;ScriptingListenerVB.log&lt;/code&gt;. &lt;code&gt;ScriptingListenerJS.log&lt;/code&gt; contains all recorded actions translated to javascript. &lt;code&gt;ScriptingListenerVB.log&lt;/code&gt; contains the same but translated to visual basic script.&lt;/p&gt;</description></item><item><title>Photoshop script: save image in pieces</title><link>https://jokevo.github.io/snippets/2017-10-11-ps-script-save-image-pieces/</link><pubDate>Wed, 11 Oct 2017 06:30:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2017-10-11-ps-script-save-image-pieces/</guid><description>&lt;p&gt;For my personal project, I started with a map of the world in photoshop. This map was 16384x8192. I exported the map at about half the scale to use in unreal. When I wanted to build the project on my phone, I bumped into an issue with it. My phone could only load images that were maximum 2048x2048px.&lt;/p&gt;
&lt;p&gt;To export the map at 2048x2048 would lose too much of the detail. What I did instead, I split up the map (and globe to put the map on) in eight pieces. Now I do iterate on the map quite a lot and it would be a hassle to actually keep seperate photshop files for every piece of the map.&lt;/p&gt;</description></item><item><title>Ruby: manipulate json</title><link>https://jokevo.github.io/snippets/2017-08-20-ruby-manipulate-json/</link><pubDate>Sun, 20 Aug 2017 06:30:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2017-08-20-ruby-manipulate-json/</guid><description>&lt;p&gt;I started a project, which used an existing json file full of data.
Because not all data was necessary, I decided to clean it up and rename some keywords.
Instead of doing that manually, I created a ruby script.&lt;/p&gt;
&lt;p&gt;Here is an example of the input and the preferred output json:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// json we start with
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Country Name&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Christmas Island&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ISO2&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CX&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ISO3&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CXR&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Continent&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Asia&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Capital&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Flying Fish Cove&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Country Name&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Cocos Islands&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ISO2&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CC&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;ISO3&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CCK&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Continent&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Asia&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Capital&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;West Island&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// the output we are going for
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Christmas Island&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;iso2&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CX&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;continent&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Asia&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;capital&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Flying Fish Cove&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Cocos Islands&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;iso2&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CC&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;continent&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Asia&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;capital&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;West Island&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the script used for modifying this json file:&lt;/p&gt;</description></item><item><title>Photoshop script: resize and save file</title><link>https://jokevo.github.io/snippets/2017-08-10-ps-script-save-history/</link><pubDate>Thu, 10 Aug 2017 06:30:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2017-08-10-ps-script-save-history/</guid><description>&lt;p&gt;For my own personal project, I have been working quite a lot with photoshop.
To keep the repetitive tasks to a minimum, I tried to script most of them. One of these is resizing and then saving/overwriting the image as a png to some location. Here is one way to do that:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;savePNG&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;saveFile&lt;/span&gt;) { 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;saveOptions&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PNGSaveOptions&lt;/span&gt;(); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;saveOptions&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;compression&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// (level of compression 0 .. 9 0 - without compression)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;saveOptions&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;interlaced&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;activeDocument&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;saveAs&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;File&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;saveFile&lt;/span&gt;), &lt;span style="color:#a6e22e"&gt;saveOptions&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Extension&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;LOWERCASE&lt;/span&gt;); 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;savedState&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;activeDocument&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;activeHistoryState&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;activeDocument&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;resizeImage&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;UnitValue&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2000&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;px&amp;#34;&lt;/span&gt;),&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;,&lt;span style="color:#a6e22e"&gt;ResampleMethod&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;AUTOMATIC&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;savePNG&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;C:/image.png&amp;#34;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;//3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;app&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;activeDocument&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;activeHistoryState&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;savedState&lt;/span&gt;; &lt;span style="color:#75715e"&gt;//4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Before manipulating the image in any way, make sure to store the current history state of the image &lt;code&gt;(1)&lt;/code&gt;. This way, you can always go back in history to that point. Then, resize the image to 2000 pixels in width &lt;code&gt;(2)&lt;/code&gt;. Using this method, the aspect ratio will be used for calculating height. After that, the image will be saved to &lt;code&gt;C:/image.png&lt;/code&gt; &lt;code&gt;(3)&lt;/code&gt;. This line will call the savePNG function above, saving it as a png with the compression and interlaced options added. To end the script, set the image history (saved in &lt;code&gt;(1)&lt;/code&gt;) to restore the image back to its original size &lt;code&gt;(4)&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Tasker: weather report</title><link>https://jokevo.github.io/snippets/2017-04-23-tasker-weather-report/</link><pubDate>Sun, 23 Apr 2017 06:30:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2017-04-23-tasker-weather-report/</guid><description>&lt;p&gt;Instead of using a weather app, I made a &lt;a href="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm"&gt;Tasker&lt;/a&gt; task that will give me a notification with a short weather description twice a day. In the morning the weather of the current day, and in the evening with the weather for the next day.&lt;/p&gt;
&lt;p&gt;Here is how I created the task for the current day.
I used the &lt;a href="http://api.wunderground.com"&gt;Wunderground&lt;/a&gt; api, I signed up for an api key so I can get that data.&lt;/p&gt;</description></item><item><title>Tasker: launch app when you plug in headphones</title><link>https://jokevo.github.io/snippets/2017-04-17-tasker-launch-app/</link><pubDate>Mon, 17 Apr 2017 09:18:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2017-04-17-tasker-launch-app/</guid><description>&lt;p&gt;Another &lt;a href="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm"&gt;Tasker&lt;/a&gt; post, I love how you can automate almost everything you usually have to do manually.
This is a very easy task, but I find it very useful. When I am at work, I listen to &lt;a href="https://play.google.com/store/apps/details?id=com.noisli.noisli"&gt;Noisli&lt;/a&gt;.
I find this helps me keep my focus, but you can also do this with &lt;a href="https://play.google.com/store/apps/details?id=com.spotify.music"&gt;Spotify&lt;/a&gt; or any other app.
I listen to this on my phone, but when I have a meeting, I do take my phone with me.&lt;/p&gt;</description></item><item><title>Tasker: automate your android phone</title><link>https://jokevo.github.io/snippets/2017-04-17-tasker-home-work/</link><pubDate>Mon, 17 Apr 2017 06:18:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2017-04-17-tasker-home-work/</guid><description>&lt;p&gt;If there is one app I can definitely recommend when having an android phone, it is &lt;a href="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm"&gt;Tasker&lt;/a&gt;. This app is not free, but well worth the money. When you have to do something on your phone manually over and over, you can just automate it using the app.
It also does not use a lot of battery but will potentially save some.&lt;/p&gt;
&lt;p&gt;One of the most simple things I do to save on battery, is to turn off wifi when I leave home, and turn it back on when at work and vice verca. Also, when I step outside I might want to get into the car and connect with it over Bluetooth. I would have to enable bluetooth when leaving home or work.&lt;/p&gt;</description></item><item><title>C++: view bit pattern</title><link>https://jokevo.github.io/snippets/2016-12-03-cpp-view-bits/</link><pubDate>Sat, 03 Dec 2016 10:18:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2016-12-03-cpp-view-bits/</guid><description>&lt;p&gt;I was working on a hardware project, and I needed to be able to send a lot of data with only 12 bytes. Therefore when I needed to puzzle some bytes together, I opened up an &lt;a href="http://codepad.org/"&gt;online c++ compiler&lt;/a&gt; and got to testing quickly.
In C++ you can import a library called &lt;code&gt;bitset&lt;/code&gt;. It is useful when you want to print out your bitpattern and see the result when you are shifting bits. Here is an example:&lt;/p&gt;</description></item><item><title>Blender Script: bulk export objects</title><link>https://jokevo.github.io/snippets/2016-09-01-blender-bulk-export/</link><pubDate>Thu, 01 Sep 2016 10:18:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2016-09-01-blender-bulk-export/</guid><description>&lt;p&gt;When working with blender, something you will most likely do is export your object.
If there are a lot of these objects, and you want to export your meshes into separate .obj files, it can be a very tedious job.
The script below is one I use to make this as fast and easy as possible:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; bpy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -----&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# optional if you want to export a folder but the folder might not exist yet&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;directory &lt;span style="color:#f92672"&gt;=&lt;/span&gt; bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;abspath(&lt;span style="color:#e6db74"&gt;&amp;#34;//exports/&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;exists(directory):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;makedirs(directory)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -----&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; obj &lt;span style="color:#f92672"&gt;in&lt;/span&gt; bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;data&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects: &lt;span style="color:#75715e"&gt;#1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; obj&lt;span style="color:#f92672"&gt;.&lt;/span&gt;type &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;MESH&amp;#39;&lt;/span&gt;: &lt;span style="color:#75715e"&gt;#2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object&lt;span style="color:#f92672"&gt;.&lt;/span&gt;select_all(action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;DESELECT&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		obj&lt;span style="color:#f92672"&gt;.&lt;/span&gt;select &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt; &lt;span style="color:#75715e"&gt;#4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		file_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;path&lt;span style="color:#f92672"&gt;.&lt;/span&gt;abspath(&lt;span style="color:#e6db74"&gt;&amp;#34;//exports/&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; obj&lt;span style="color:#f92672"&gt;.&lt;/span&gt;name &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;.obj&amp;#34;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;export_scene&lt;span style="color:#f92672"&gt;.&lt;/span&gt;obj(filepath&lt;span style="color:#f92672"&gt;=&lt;/span&gt;file_path, use_selection&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, use_materials&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;, global_scale&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, use_smooth_groups&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, use_normals&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, use_uvs&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First, we loop over all the objects in the scene &lt;code&gt;(1)&lt;/code&gt; and check if the object is a mesh &lt;code&gt;(2)&lt;/code&gt;.
If we found a mesh, we deselect everything in the scene &lt;code&gt;(3)&lt;/code&gt;, and select the mesh we want to export &lt;code&gt;(4)&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Terminal: check for valid json</title><link>https://jokevo.github.io/snippets/2016-08-18-terminal-json/</link><pubDate>Thu, 18 Aug 2016 10:18:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2016-08-18-terminal-json/</guid><description>&lt;p&gt;When I manually want to check for a valid json, I have always used &lt;a href="http://jsonlint.com/"&gt;jsonlint&lt;/a&gt;. I discovered that jsonlint has an npm and ruby package.
You can find the plugin here: &lt;a href="https://github.com/zaach/jsonlint"&gt;npm&lt;/a&gt; or &lt;a href="https://github.com/PagerDuty/jsonlint"&gt;ruby&lt;/a&gt;.
You can either install it with &lt;code&gt;npm install jsonlint -g&lt;/code&gt; (for npm) or &lt;code&gt;gem install jsonlint&lt;/code&gt; (for ruby).&lt;/p&gt;
&lt;p&gt;You can now use it in terminal like this &lt;code&gt;jsonlint filepath.json&lt;/code&gt;. This will output nothing if it was successful or it will print where it went wrong.&lt;/p&gt;</description></item><item><title>Blender script: How to change the object data name to the object name</title><link>https://jokevo.github.io/snippets/2016-08-15-blender-datanames/</link><pubDate>Mon, 15 Aug 2016 10:18:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2016-08-15-blender-datanames/</guid><description>&lt;p&gt;If you rename an object in blender, you likely didn&amp;rsquo;t change the name of the object data.
There is a difference in the name of the object itself, and the name of the object data.
When you rename one, the other isn&amp;rsquo;t automatically renamed.&lt;/p&gt;
&lt;p&gt;When you export your object to a &lt;code&gt;.obj&lt;/code&gt; and the object has different names, it will put these names together during export. For instance, your object is named &lt;code&gt;Floor&lt;/code&gt;, and the object data name is &lt;code&gt;Plane&lt;/code&gt;.
When the object is exported, the mesh will have the name &lt;code&gt;FloorPlane&lt;/code&gt;. If both names are equal, it will not duplicate the names. For example; the object name and data name are both &lt;code&gt;Floor&lt;/code&gt;, the exported name will be &lt;code&gt;Floor&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Blender script: How to make sure that every face has maximum 4 edges</title><link>https://jokevo.github.io/snippets/2016-08-14-blender-polygon/</link><pubDate>Sun, 14 Aug 2016 10:18:00 +0000</pubDate><guid>https://jokevo.github.io/snippets/2016-08-14-blender-polygon/</guid><description>&lt;p&gt;When exporting an &lt;code&gt;.obj&lt;/code&gt; object for use within Three.js, you will likely use the &lt;code&gt;OBJLoader.js&lt;/code&gt; for importing the object.
One thing the OBJLoader does not support, are objects with n-gons.&lt;/p&gt;
&lt;p&gt;In order for the object to correctly import, every face can have maximum 4 edges. I made a script that will automatically check if these faces are present and change them to quads/triangles.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; bpy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; obj &lt;span style="color:#f92672"&gt;in&lt;/span&gt; bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;data&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects: &lt;span style="color:#75715e"&gt;#1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; obj&lt;span style="color:#f92672"&gt;.&lt;/span&gt;type &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;MESH&amp;#39;&lt;/span&gt;: &lt;span style="color:#75715e"&gt;#2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;context&lt;span style="color:#f92672"&gt;.&lt;/span&gt;scene&lt;span style="color:#f92672"&gt;.&lt;/span&gt;objects&lt;span style="color:#f92672"&gt;.&lt;/span&gt;active &lt;span style="color:#f92672"&gt;=&lt;/span&gt; obj &lt;span style="color:#75715e"&gt;#3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mode_set(mode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;EDIT&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;context&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tool_settings&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mesh_select_mode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mesh&lt;span style="color:#f92672"&gt;.&lt;/span&gt;select_all(action&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;DESELECT&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mesh&lt;span style="color:#f92672"&gt;.&lt;/span&gt;select_face_by_sides(number&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;GREATER&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mesh&lt;span style="color:#f92672"&gt;.&lt;/span&gt;quads_convert_to_tris() &lt;span style="color:#75715e"&gt;#8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mesh&lt;span style="color:#f92672"&gt;.&lt;/span&gt;tris_convert_to_quads() &lt;span style="color:#75715e"&gt;#9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		bpy&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ops&lt;span style="color:#f92672"&gt;.&lt;/span&gt;object&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mode_set(mode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;OBJECT&amp;#39;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;#10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;First, we loop over all the objects in the scene &lt;code&gt;(1)&lt;/code&gt; and check if the object is a mesh &lt;code&gt;(2)&lt;/code&gt;. When we have a mesh, we will make that mesh the currently active object &lt;code&gt;(3)&lt;/code&gt;.
We do this to make sure we have the right object selected when we are going into EDIT mode &lt;code&gt;(4)&lt;/code&gt;. In EDIT mode, we make sure we are going to work with the faces &lt;code&gt;(5)&lt;/code&gt;, and deselect all faces that would currently be selected &lt;code&gt;(6)&lt;/code&gt;.
After that, we search and select all the faces that have more than 4 edges &lt;code&gt;(7)&lt;/code&gt;. We triangulate these faces &lt;code&gt;(8)&lt;/code&gt;, and then attempt to convert these triangles into quads &lt;code&gt;(9)&lt;/code&gt;.
Last but not least, before moving on and searching for the next mesh, we set the scene back into object mode &lt;code&gt;(10)&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>