Reverse Engineerhttp://blog.alexou.netIt is not enough to succeed. Others must fail.Wed, 21 Nov 2018 03:38:38 -0500hourly1Evo-CMS3D Printed Working Stargatehttp://blog.alexou.net/?stargateMon, 07 Aug 2017 19:07:00 -0400Mon, 24 Sep 2018 11:40:21 -0400http://blog.alexou.net/968<div class="article message"><div class="gallery cols-3"><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_20170502_042659062.jpg" rel="gjzjauphecu"><img alt="IMG_20170502_042659062.jpg" src="http://blog.alexou.net/upload/image/IMG_20170502_042659062.jpg?size=480x480" style="max-height: initial; max-width:32%" title="IMG_20170502_042659062.jpg" /></a></span> <span class="gallery-container"><a href="http://blog.alexou.net/upload/image/LVz_1_.jpg" rel="gjzjauphecu"><img alt="LVz_1_.jpg" src="http://blog.alexou.net/upload/image/LVz_1_.jpg?size=480x480" style="max-height: initial; max-width:32%" title="LVz_1_.jpg" /></a></span> <span class="gallery-container"><a href="http://blog.alexou.net/upload/image/Stargate_2017-May-27_07-00-37PM-000_CustomizedView51208375703.png" rel="gjzjauphecu"><img alt="Stargate_2017-May-27_07-00-37PM-000_CustomizedView51208375703.png" src="http://blog.alexou.net/upload/image/Stargate_2017-May-27_07-00-37PM-000_CustomizedView51208375703.png?size=480x480" style="max-height: initial; max-width:32%" title="Stargate_2017-May-27_07-00-37PM-000_CustomizedView51208375703.png" /></a></span></div> <h4>Introduction</h4> <p>This is a replica of a Milky Way&#39;s style Stargate and the SGC ramp. My goal was to design something that is both easy to print and easy to assemble. Some trade-offs had to be made, for example the symbols and textures are all simplified so they can print correctly on smaller printers. Initially I wanted to post this project on thingiverse, and I still might, but I have yet to write detailed assembly instructions and for the time being I still wanted to showcase this project. This post includes all the design files, the stl, the arduino code, a few photos, and some notes on assembly but it is by no means a step-by-step guide.</p> <div><a href="#Download">Go to download</a></div> <div>&nbsp;</div> <h4>Conception, Printing, and Assembly</h4> <p>The 3D models have been designed in 123D Design which, in retrospect, was a poor choice for this project. It is <strong>extremely</strong> slow on complex sketches such as the symbols ring. On top of that it was recently discontinued! I am unaware of any method to export to Fusion 360 in a format that is editable but you can still <a href="http://www.softpedia.com/get/Science-CAD/Autodesk-123D.shtml">download 123D for free</a> if you wish to edit my designs.</p> <div class="gallery" contenteditable="false" images="364,363,360,359"><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/exploded_view_1_.png" rel="2rezcuk7yi"><img alt="exploded_view_1_.png" src="http://blog.alexou.net/upload/image/exploded_view_1_.png?size=150x150" title="exploded_view_1_.png" /></a></span><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/Stargate_2017-May-27_06-42-05PM-000_CustomizedView34708598698.png" rel="2rezcuk7yi"><img alt="Stargate_2017-May-27_06-42-05PM-000_CustomizedView34708598698.png" src="http://blog.alexou.net/upload/image/Stargate_2017-May-27_06-42-05PM-000_CustomizedView34708598698.png?size=150x150" title="Stargate_2017-May-27_06-42-05PM-000_CustomizedView34708598698.png" /></a></span><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/exploded_view_8_.png" rel="2rezcuk7yi"><img alt="exploded_view_8_.png" src="http://blog.alexou.net/upload/image/exploded_view_8_.png?size=150x150" title="exploded_view_8_.png" /></a></span><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/exploded_view_3_.png" rel="2rezcuk7yi"><img alt="exploded_view_3_.png" src="http://blog.alexou.net/upload/image/exploded_view_3_.png?size=150x150" title="exploded_view_3_.png" /></a></span></div> <p>&nbsp;</p> <p>Cura 2.5 was used to generate the GCode with the following settings:</p> <ul> <li>Layer height: 0.1</li> <li>Infill: 100%</li> <li>Temperature: 210C/60C</li> <li>Speed: 60mm/s</li> <li>Support: Only &quot;gate - back&quot; and &quot;gate - front&quot; (I strongly recommend &quot;Support Interface&quot; for easy removal)</li> </ul> <p>The printer used was a Monoprice Select Mini and the material was Hatchbox grey PLA (white for the chevrons). I designed everything with a 120x120mm printer in mind and the STL will give you a 117mm(4.6&quot;) gate diameter. If you decide to resize it, special attention might be needed for the motor gear.</p> <p>To assemble the project you will only need glue and I recommend Loctite 401 or low temperature hot glue. The <a href="https://en.wikipedia.org/wiki/Friction#Static_friction">starting friction</a> of PLA on PLA is quite high and your stepper might have an issue starting. I suggest using a paper ring that sits between the symbols ring and the back rail so that it&#39;s not PLA against PLA. Grease or oil might also work.</p> <p><a id="Download" name="Download"></a></p> <p>&nbsp;</p> <h4>Download</h4> <div class="fichier"><a href="http://blog.alexou.net/upload/archive/Working_Stargate_website_release_.zip">Working_Stargate_website_release_.zip</a> (8 MB)</div> <p>&nbsp;</p> <h4>Video</h4> <div class="fichier"> <video controls="" src="http://blog.alexou.net/upload/video/ezgif-2-bebdb73633.mp4">ezgif-2-bebdb73633.mp4</video> <br /> <strong>demo.mp4</strong> (14 MB)</div> <p>&nbsp;</p> </div><div class="article message"><div class="gallery cols-3"><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_20170502_042659062.jpg" rel="gjzjauphecu"><img alt="IMG_20170502_042659062.jpg" src="http://blog.alexou.net/upload/image/IMG_20170502_042659062.jpg?size=480x480" style="max-height: initial; max-width:32%" title="IMG_20170502_042659062.jpg" /></a></span> <span class="gallery-container"><a href="http://blog.alexou.net/upload/image/LVz_1_.jpg" rel="gjzjauphecu"><img alt="LVz_1_.jpg" src="http://blog.alexou.net/upload/image/LVz_1_.jpg?size=480x480" style="max-height: initial; max-width:32%" title="LVz_1_.jpg" /></a></span> <span class="gallery-container"><a href="http://blog.alexou.net/upload/image/Stargate_2017-May-27_07-00-37PM-000_CustomizedView51208375703.png" rel="gjzjauphecu"><img alt="Stargate_2017-May-27_07-00-37PM-000_CustomizedView51208375703.png" src="http://blog.alexou.net/upload/image/Stargate_2017-May-27_07-00-37PM-000_CustomizedView51208375703.png?size=480x480" style="max-height: initial; max-width:32%" title="Stargate_2017-May-27_07-00-37PM-000_CustomizedView51208375703.png" /></a></span></div> <h4>Introduction</h4> <p>This is a replica of a Milky Way&#39;s style Stargate and the SGC ramp. My goal was to design something that is both easy to print and easy to assemble. Some trade-offs had to be made, for example the symbols and textures are all simplified so they can print correctly on smaller printers. Initially I wanted to post this project on thingiverse, and I still might, but I have yet to write detailed assembly instructions and for the time being I still wanted to showcase this project. This post includes all the design files, the stl, the arduino code, a few photos, and some notes on assembly but it is by no means a step-by-step guide.</p> <div><a href="#Download">Go to download</a></div> <div>&nbsp;</div> <h4>Conception, Printing, and Assembly</h4> <p>The 3D models have been designed in 123D Design which, in retrospect, was a poor choice for this project. It is <strong>extremely</strong> slow on complex sketches such as the symbols ring. On top of that it was recently discontinued! I am unaware of any method to export to Fusion 360 in a format that is editable but you can still <a href="http://www.softpedia.com/get/Science-CAD/Autodesk-123D.shtml">download 123D for free</a> if you wish to edit my designs.</p> <div class="gallery" contenteditable="false" images="364,363,360,359"><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/exploded_view_1_.png" rel="2rezcuk7yi"><img alt="exploded_view_1_.png" src="http://blog.alexou.net/upload/image/exploded_view_1_.png?size=150x150" title="exploded_view_1_.png" /></a></span><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/Stargate_2017-May-27_06-42-05PM-000_CustomizedView34708598698.png" rel="2rezcuk7yi"><img alt="Stargate_2017-May-27_06-42-05PM-000_CustomizedView34708598698.png" src="http://blog.alexou.net/upload/image/Stargate_2017-May-27_06-42-05PM-000_CustomizedView34708598698.png?size=150x150" title="Stargate_2017-May-27_06-42-05PM-000_CustomizedView34708598698.png" /></a></span><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/exploded_view_8_.png" rel="2rezcuk7yi"><img alt="exploded_view_8_.png" src="http://blog.alexou.net/upload/image/exploded_view_8_.png?size=150x150" title="exploded_view_8_.png" /></a></span><span class="gallery-container"><a href="http://blog.alexou.net/upload/image/exploded_view_3_.png" rel="2rezcuk7yi"><img alt="exploded_view_3_.png" src="http://blog.alexou.net/upload/image/exploded_view_3_.png?size=150x150" title="exploded_view_3_.png" /></a></span></div> <p>&nbsp;</p> <p>Cura 2.5 was used to generate the GCode with the following settings:</p> <ul> <li>Layer height: 0.1</li> <li>Infill: 100%</li> <li>Temperature: 210C/60C</li> <li>Speed: 60mm/s</li> <li>Support: Only &quot;gate - back&quot; and &quot;gate - front&quot; (I strongly recommend &quot;Support Interface&quot; for easy removal)</li> </ul> <p>The printer used was a Monoprice Select Mini and the material was Hatchbox grey PLA (white for the chevrons). I designed everything with a 120x120mm printer in mind and the STL will give you a 117mm(4.6&quot;) gate diameter. If you decide to resize it, special attention might be needed for the motor gear.</p> <p>To assemble the project you will only need glue and I recommend Loctite 401 or low temperature hot glue. The <a href="https://en.wikipedia.org/wiki/Friction#Static_friction">starting friction</a> of PLA on PLA is quite high and your stepper might have an issue starting. I suggest using a paper ring that sits between the symbols ring and the back rail so that it&#39;s not PLA against PLA. Grease or oil might also work.</p> <p><a id="Download" name="Download"></a></p> <p>&nbsp;</p> <h4>Download</h4> <div class="fichier"><a href="http://blog.alexou.net/upload/archive/Working_Stargate_website_release_.zip">Working_Stargate_website_release_.zip</a> (8 MB)</div> <p>&nbsp;</p> <h4>Video</h4> <div class="fichier"> <video controls="" src="http://blog.alexou.net/upload/video/ezgif-2-bebdb73633.mp4">ezgif-2-bebdb73633.mp4</video> <br /> <strong>demo.mp4</strong> (14 MB)</div> <p>&nbsp;</p> </div>Bypass "Insufficient Storage available" on Androidhttp://blog.alexou.net/?2014/11/bypass-insufficient-storage-available-on-androidMon, 24 Nov 2014 21:04:00 -0500Wed, 24 Oct 2018 10:50:06 -0400http://blog.alexou.net/974<div class="article message"><p><img alt="" height="150" src="http://blog.alexou.net/upload/image/android-logo-298x300-1.jpg?size=150x150" style="float:left" width="150" />Android reserves a certain percentage of the data partition for itself to make sure apps won&#39;t run out of working space (Receiving SMS, emails, call logs, etc). On phones with no external storage it means that when you are down to 10% free OR 500MB (whichever is smaller) you won&#39;t be able to update/install anything, <strong>even if it&#39;s only a couple kilobytes.</strong> It&#39;s really annoying for devices with 4-8GB to lose 500MB like that.<br /> &nbsp;</p> <p><span style="color:#B22222;">IMPORTANT: </span>If you have plenty of space available and yet have the insufficient storage error, you should look elsewhere to fix your issue. The following guide is only to reclaim the 10% remaining, <u>not fix Play Store issues</u>. The procedure should work with any Android 4.x, but it was tested only on stock Moto G and LG G1.</p> <h3>How to</h3> <p>Before starting you need to choose how much space you wish to reserve for Android. You can choose a percentage, a size, or both (the system will pick the smallest value). This guide uses 100MB and 2%, change values accordingly. You need to be rooted. Procedure overview (step-by-step below):</p> <p style="text-align: center;">Database Path: <strong>/data/data/com.android.providers.settings/databases/settings.db</strong></p> <p style="text-align: center;">Insert rows in table: <strong>global</strong></p> <table align="center" border="1" cellpadding="1" cellspacing="1" height="39" width="505"> <tbody> <tr> <td><strong>name</strong></td> <td><strong>value</strong></td> </tr> <tr> <td>sys_storage_threshold_percentage</td> <td>2</td> </tr> <tr> <td>sys_storage_threshold_max_bytes</td> <td> <p>104857600</p> </td> </tr> </tbody> </table> <h5>&nbsp;</h5> <p><em><span style="color: rgb(255, 0, 0);">Note:</span> In older Android the table might be named <strong>secure</strong>. If that is the case please replace <strong>global</strong> by <strong>secure</strong> in the following instructions. Thanks to Patrick in the comments!</em></p> <p>&nbsp;</p> <h5><strong>Using a sqlite3 editor:</strong></h5> <ol> <li>Get a <em>rooted</em> sqlite3 editor from the play store. I tested this procedure successfully with <a href="https://play.google.com/store/apps/details?id=oliver.ehrenmueller.dbadmin">SQLite Debugger</a> and <a href="https://play.google.com/store/apps/details?id=dk.andsen.asqlitemanager">aSQLiteManager</a>. <a href="https://play.google.com/store/apps/details?id=com.dundastech.sqlitemasterpro">SQLite Master Pro </a>is easier to use but not free.</li> <li>Open the aforementioned database.</li> <li>Navigate to the table named <strong>global</strong>.</li> <li>Insert the rows as specified. (when inserting only fill name/value, leave the remaining fields empty)</li> <li>reboot!</li> </ol> <h5><strong>Using the command line:</strong></h5> <ol> <li>You will need a rooted phone with sqlite3. If you do not have the sqlite3 command installed, try <a href="http://forum.xda-developers.com/showthread.php?t=2730422">this one</a> or try the <a href="https://play.google.com/store/apps/details?id=ptSoft.util.sqlite3forroot&amp;hl=en">Sqlite3 installer</a>.</li> <li>Connect to your phone via adb shell or use a root terminal emulator.</li> <li> <pre> <code class="language-bash"># sqlite3 /data/data/com.android.providers.settings/databases/settings.db SQLite version 3.8.6 2014-08-15 11:46:33 Enter ".help" for usage hints. sqlite&gt; replace into global (name, value) values('sys_storage_threshold_percentage', '2'); sqlite&gt; replace into global (name, value) values('sys_storage_threshold_max_bytes', '104857600'); sqlite&gt; .quit # reboot</code></pre> <p>&nbsp;</p> </li> </ol> <p>You should be able to install more apps now :)</p> <p>&nbsp;</p> <h3>Look further</h3> <p>A quick note about the table name first: I instructed you to insert lines in the &quot;global&quot; table. I believe the proper place for all Android is the &quot;secure&quot; table and &quot;global&quot; has the ability to override settings from &quot;secure&quot;. I have not tested recent Android 4+ with &quot;secure&quot; instead of &quot;global&quot;, that&#39;s why I kept &quot;global&quot; above.</p> <p>Here&#39;s some technical info if you want to patch at the rom level or write an xposed mod or whatever:</p> <p>I tracked the check down to getMemThreshold() in <a href="http://osxr.org/android/source/frameworks/base/services/java/com/android/server/DeviceStorageMonitorService.java#0273">DeviceStorageMonitorService.java</a>.</p> <pre> <code class="language-java">private long getMemThreshold() { long value = Settings.Secure.getInt( mContentResolver, Settings.Secure.SYS_STORAGE_THRESHOLD_PERCENTAGE, DEFAULT_THRESHOLD_PERCENTAGE); if(localLOGV) Slog.v(TAG, "Threshold Percentage="+value); value *= mTotalMemory; long maxValue = Settings.Secure.getInt( mContentResolver, Settings.Secure.SYS_STORAGE_THRESHOLD_MAX_BYTES, DEFAULT_THRESHOLD_MAX_BYTES); //evaluate threshold value return value &lt; maxValue ? value : maxValue; }</code></pre> <p>The default value is specified earlier in the same file:</p> <pre> <code class="language-java">private static final int DEFAULT_THRESHOLD_PERCENTAGE = 10; private static final int DEFAULT_THRESHOLD_MAX_BYTES = 500*1024*1024; // 500MB</code></pre> <p>The setting key can be found in <a href="http://osxr.org/android/source/frameworks/base/core/java/android/provider/Settings.java#3703">frameworks/base/core/java/android/provider/Settings.java</a></p> <p>The installer calls it from PackageManagerService.java in <span class="pln">checkFreeStorage</span><span class="pun">()</span></p> <p>&nbsp;</p> <h3>Method with Tasker:</h3> <p><span style="font-size:12px;">(From Daniel in the comments.)</span></p> <p>For those having tasker it is even easier:</p> <p>Task with this 2 actions:</p> <ol> <li>Run shell (under code) - enter the following values <ol> <li>Command: sqlite3 /data/data/com.android.providers.settings/databases/settings.db &quot;replace into global (name, value) values(&#39;sys_storage_threshold_percentage&#39;, &#39;2&#39;)&quot;;</li> <li>Tick &quot;use root&quot;</li> <li>If you want you can save the error output and display it with a notify action</li> </ol> </li> <li>&nbsp;2nd action same but put this command: <ol> <li>sqlite3 /data/data/com.android.providers.settings/databases/settings.db &quot;replace into global (name, value) values(&#39;sys_storage_threshold_max_bytes&#39;, &#39;104857600&#39;)&quot;;</li> </ol> </li> </ol> <p>Run the task and reboot ...</p> </div><div class="article message"><p><img alt="" height="150" src="http://blog.alexou.net/upload/image/android-logo-298x300-1.jpg?size=150x150" style="float:left" width="150" />Android reserves a certain percentage of the data partition for itself to make sure apps won&#39;t run out of working space (Receiving SMS, emails, call logs, etc). On phones with no external storage it means that when you are down to 10% free OR 500MB (whichever is smaller) you won&#39;t be able to update/install anything, <strong>even if it&#39;s only a couple kilobytes.</strong> It&#39;s really annoying for devices with 4-8GB to lose 500MB like that.<br /> &nbsp;</p> <p><span style="color:#B22222;">IMPORTANT: </span>If you have plenty of space available and yet have the insufficient storage error, you should look elsewhere to fix your issue. The following guide is only to reclaim the 10% remaining, <u>not fix Play Store issues</u>. The procedure should work with any Android 4.x, but it was tested only on stock Moto G and LG G1.</p> <h3>How to</h3> <p>Before starting you need to choose how much space you wish to reserve for Android. You can choose a percentage, a size, or both (the system will pick the smallest value). This guide uses 100MB and 2%, change values accordingly. You need to be rooted. Procedure overview (step-by-step below):</p> <p style="text-align: center;">Database Path: <strong>/data/data/com.android.providers.settings/databases/settings.db</strong></p> <p style="text-align: center;">Insert rows in table: <strong>global</strong></p> <table align="center" border="1" cellpadding="1" cellspacing="1" height="39" width="505"> <tbody> <tr> <td><strong>name</strong></td> <td><strong>value</strong></td> </tr> <tr> <td>sys_storage_threshold_percentage</td> <td>2</td> </tr> <tr> <td>sys_storage_threshold_max_bytes</td> <td> <p>104857600</p> </td> </tr> </tbody> </table> <h5>&nbsp;</h5> <p><em><span style="color: rgb(255, 0, 0);">Note:</span> In older Android the table might be named <strong>secure</strong>. If that is the case please replace <strong>global</strong> by <strong>secure</strong> in the following instructions. Thanks to Patrick in the comments!</em></p> <p>&nbsp;</p> <h5><strong>Using a sqlite3 editor:</strong></h5> <ol> <li>Get a <em>rooted</em> sqlite3 editor from the play store. I tested this procedure successfully with <a href="https://play.google.com/store/apps/details?id=oliver.ehrenmueller.dbadmin">SQLite Debugger</a> and <a href="https://play.google.com/store/apps/details?id=dk.andsen.asqlitemanager">aSQLiteManager</a>. <a href="https://play.google.com/store/apps/details?id=com.dundastech.sqlitemasterpro">SQLite Master Pro </a>is easier to use but not free.</li> <li>Open the aforementioned database.</li> <li>Navigate to the table named <strong>global</strong>.</li> <li>Insert the rows as specified. (when inserting only fill name/value, leave the remaining fields empty)</li> <li>reboot!</li> </ol> <h5><strong>Using the command line:</strong></h5> <ol> <li>You will need a rooted phone with sqlite3. If you do not have the sqlite3 command installed, try <a href="http://forum.xda-developers.com/showthread.php?t=2730422">this one</a> or try the <a href="https://play.google.com/store/apps/details?id=ptSoft.util.sqlite3forroot&amp;hl=en">Sqlite3 installer</a>.</li> <li>Connect to your phone via adb shell or use a root terminal emulator.</li> <li> <pre> <code class="language-bash"># sqlite3 /data/data/com.android.providers.settings/databases/settings.db SQLite version 3.8.6 2014-08-15 11:46:33 Enter ".help" for usage hints. sqlite&gt; replace into global (name, value) values('sys_storage_threshold_percentage', '2'); sqlite&gt; replace into global (name, value) values('sys_storage_threshold_max_bytes', '104857600'); sqlite&gt; .quit # reboot</code></pre> <p>&nbsp;</p> </li> </ol> <p>You should be able to install more apps now :)</p> <p>&nbsp;</p> <h3>Look further</h3> <p>A quick note about the table name first: I instructed you to insert lines in the &quot;global&quot; table. I believe the proper place for all Android is the &quot;secure&quot; table and &quot;global&quot; has the ability to override settings from &quot;secure&quot;. I have not tested recent Android 4+ with &quot;secure&quot; instead of &quot;global&quot;, that&#39;s why I kept &quot;global&quot; above.</p> <p>Here&#39;s some technical info if you want to patch at the rom level or write an xposed mod or whatever:</p> <p>I tracked the check down to getMemThreshold() in <a href="http://osxr.org/android/source/frameworks/base/services/java/com/android/server/DeviceStorageMonitorService.java#0273">DeviceStorageMonitorService.java</a>.</p> <pre> <code class="language-java">private long getMemThreshold() { long value = Settings.Secure.getInt( mContentResolver, Settings.Secure.SYS_STORAGE_THRESHOLD_PERCENTAGE, DEFAULT_THRESHOLD_PERCENTAGE); if(localLOGV) Slog.v(TAG, "Threshold Percentage="+value); value *= mTotalMemory; long maxValue = Settings.Secure.getInt( mContentResolver, Settings.Secure.SYS_STORAGE_THRESHOLD_MAX_BYTES, DEFAULT_THRESHOLD_MAX_BYTES); //evaluate threshold value return value &lt; maxValue ? value : maxValue; }</code></pre> <p>The default value is specified earlier in the same file:</p> <pre> <code class="language-java">private static final int DEFAULT_THRESHOLD_PERCENTAGE = 10; private static final int DEFAULT_THRESHOLD_MAX_BYTES = 500*1024*1024; // 500MB</code></pre> <p>The setting key can be found in <a href="http://osxr.org/android/source/frameworks/base/core/java/android/provider/Settings.java#3703">frameworks/base/core/java/android/provider/Settings.java</a></p> <p>The installer calls it from PackageManagerService.java in <span class="pln">checkFreeStorage</span><span class="pun">()</span></p> <p>&nbsp;</p> <h3>Method with Tasker:</h3> <p><span style="font-size:12px;">(From Daniel in the comments.)</span></p> <p>For those having tasker it is even easier:</p> <p>Task with this 2 actions:</p> <ol> <li>Run shell (under code) - enter the following values <ol> <li>Command: sqlite3 /data/data/com.android.providers.settings/databases/settings.db &quot;replace into global (name, value) values(&#39;sys_storage_threshold_percentage&#39;, &#39;2&#39;)&quot;;</li> <li>Tick &quot;use root&quot;</li> <li>If you want you can save the error output and display it with a notify action</li> </ol> </li> <li>&nbsp;2nd action same but put this command: <ol> <li>sqlite3 /data/data/com.android.providers.settings/databases/settings.db &quot;replace into global (name, value) values(&#39;sys_storage_threshold_max_bytes&#39;, &#39;104857600&#39;)&quot;;</li> </ol> </li> </ol> <p>Run the task and reboot ...</p> </div>Disable Chrome Update Prompt On Androidhttp://blog.alexou.net/?2014/09/disable-chrome-update-prompt-on-androidThu, 09 Oct 2014 21:19:00 -0400Tue, 05 Sep 2017 12:08:26 -0400http://blog.alexou.net/856<div class="article message"><div class="alert alert-danger"><em>As of 2016, this post is outdated and may no longer apply.</em></div> <p><a class="fancybox" href="http://blog.alexou.net/upload/image/unnamed.png"><img alt="unnamed.png" height="113" src="http://blog.alexou.net/upload/image/unnamed.png?size=150" style="float:right" width="113" /></a></p> <p>Updating Chrome on Android is always a gamble. If I were to pick a game to best describe the experience I&#39;d choose Russian roulette. Sometimes everything is fine, improved even. But too often things fall apart, up to the point you may reluctantly have to revert to the factory version. You may choose, like me, to preemptively remain on an older version. It works fine, if you can live with chrome prompting you to update to a &quot;newer, greater version&quot; at each start...</p> <p>But you like your current version and you don&#39;t want to be prompted to update each time you tap the Chrome icon... There is no setting that I could find to disable this behavior.</p> <p>Luckily if you are rooted you can manually edit one of Chrome&#39;s config file, the one concerning Omaha aka Google Update. You will need a root text editor or file manager, I use ES File Explorer<br /> with root enabled (swipe the left pane).<a class="fancybox" href="http://blog.alexou.net/upload/image/L93.png"><img alt="L93.png" src="http://blog.alexou.net/upload/image/L93.png?size=200" style="float:right" /></a></p> <p><span style="color:#FF8C00;">Note: This will <strong><em>not</em> </strong>disable the Play Store auto-update or manual update. It will <strong><em>only </em></strong>hide the annoying &quot;Chrome just got better&quot; prompts when you start Chrome.</span></p> <p>&nbsp;</p> <p>Before starting make sure to swipe Chrome away from the activity view , it will avoid having Chrome overwriting your changes.</p> <p><em><a href="http://blog.alexou.net/2014/09/disable-chrome-update-prompt-on-android#omahaclient">I&#39;ve added a second (non-tested) method, scroll down</a> to see it. It is actually much simpler, maybe it&#39;s worth trying first.</em></p> <div style="page-break-after: always"><span style="display: none;">&nbsp;</span></div> <h3>Editing the config file</h3> <p>The file to edit is:<br /> <strong>/data/data/com.android.chrome/shared_prefs/com.google.android.apps.chrome.omaha.xml</strong></p> <p><br /> You need to set the latest version to a number less than your current version and change a few timestamps:</p> <ol> <li>latestVersion =&gt; lower version than yours</li> <li>delay =&gt; just bump that number</li> <li>timestampForNextPostAttempt =&gt; set in the far future</li> <li>timestampForNewRequest =&gt; set in the far future</li> <li>timestampOfInstall =&gt; set in the far future</li> </ol> <p>. Here&#39;s an example file with modifications highlighted:</p> <p><span style="color:#696969;"><em>&nbsp;&nbsp; /data/data/com.android.chrome/shared_prefs/com.google.android.apps.chrome.omaha.xml</em></span></p> <pre> &lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39; standalone=&#39;yes&#39; ?&gt; &lt;map&gt; &lt;int name=&quot;backoffFailedAttempts&quot; value=&quot;0&quot; /&gt; &lt;string name=&quot;latestVersion&quot;&gt;<span style="background-color:#FFFF00;">32.0.2125.102</span>&lt;/string&gt; &lt;string name=&quot;installSource&quot;&gt;system_image&lt;/string&gt; &lt;string name=&quot;marketURL&quot;&gt;market://details?id=com.android.chrome&lt;/string&gt; &lt;long name=&quot;delay&quot; value=&quot;<span style="background-color:#FFFF00;">7200000000</span>&quot; /&gt; &lt;long name=&quot;timestampOfInstall&quot; value=&quot;<span style="background-color:#FFFF00;">2012905877353</span>&quot; /&gt; &lt;long name=&quot;timestampForNextPostAttempt&quot; value=&quot;<span style="background-color:#FFFF00;">2012905877353</span>&quot; /&gt; &lt;long name=&quot;timestampOfRequest&quot; value=&quot;-1&quot; /&gt; &lt;string name=&quot;persistedRequestID&quot;&gt;invalid&lt;/string&gt; &lt;boolean name=&quot;sendInstallEvent&quot; value=&quot;false&quot; /&gt; &lt;long name=&quot;timestampForNewRequest&quot; value=&quot;<span style="background-color:#FFFF00;">2012920277663</span>&quot; /&gt; &lt;/map&gt; </pre> <p>&nbsp;</p> <p>And for reference here&#39;s the stock one:</p> <pre> &lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39; standalone=&#39;yes&#39; ?&gt; &lt;map&gt; &lt;int name=&quot;backoffFailedAttempts&quot; value=&quot;0&quot; /&gt; &lt;string name=&quot;installSource&quot;&gt;system_image&lt;/string&gt; &lt;string name=&quot;latestVersion&quot;&gt;38.0.2125.102&lt;/string&gt; &lt;string name=&quot;marketURL&quot;&gt;market://details?id=com.android.chrome&lt;/string&gt; &lt;string name=&quot;persistedRequestID&quot;&gt;invalid&lt;/string&gt; &lt;long name=&quot;timestampOfRequest&quot; value=&quot;-1&quot; /&gt; &lt;long name=&quot;timestampForNextPostAttempt&quot; value=&quot;1412907273247&quot; /&gt; &lt;long name=&quot;timestampOfInstall&quot; value=&quot;1412903606751&quot; /&gt; &lt;long name=&quot;timestampForNewRequest&quot; value=&quot;1412921673585&quot; /&gt; &lt;boolean name=&quot;sendInstallEvent&quot; value=&quot;false&quot; /&gt; &lt;/map&gt; </pre> <p>&nbsp;</p> <h3>Changing Permissions</h3> <p>Once the changes are made you need to do some permission changes:</p> <ol> <li>Change the permissions to 444 (Read: User, Group, Global / Write: none)</li> <li>Change the owner and group of the file for any other user, root for example</li> <li>Set the sticky bit so that Chrome can&#39;t change back the permissions or delete and recreate the file</li> </ol> <p><strong>Recap:</strong> Change owner/group to group and set permissions to 1444 (sticky bit + read user + read group + read world). It may seem overzealous but trust me, Chrome is very tenacious when it comes to its config files.</p> <p>&nbsp;</p> <p>If at this point Chrome still somehow fix the file, it&#39;s worth looking for very good alternatives such as <a href="https://play.google.com/store/apps/details?id=acr.browser.barebones&amp;hl=en">lightning</a> or <a href="https://play.google.com/store/apps/details?id=org.tint&amp;hl=en">tint</a>!</p> <p>&nbsp;</p> <p>I hope this post will be helpful to some people! :)</p> <p>&nbsp;</p> <h3>Edit, alternate method - <u>NON TESTED</u>:<a id="omahaclient" name="omahaclient"></a></h3> <h3>Disabling the Omaha Service</h3> <p>This is a method I have not tested, I&#39;m merely guesstimating it has a fair chance of working.</p> <p><em><span style="font-size:10px;">Disclaimer: I <u>did</u> test the procedure myself and Chrome still works fine afterward, what isn&#39;t tested is the <u>anti-update/banner/prompt/annoyance itself</u> </span></em><em><span style="font-size:10px;">(long story short I do not have access to old enough Chrome right now). Why am I posting untested root tricks? Because it is safe if you don&#39;t play around the app I&#39;m linking too much (don&#39;t touch what you don&#39;t understand, although you can revert at any time) and someone might be desperate. Because seriously I didn&#39;t find anyone else trying to stop this Chrome behavior without (or even with, for that matter) patching chrome but I receive quite a bit of traffic from google search and even got a friendly commenter! So I assume there is some interest.</span></em></p> <ol> <li>Download <a href="https://play.google.com/store/apps/details?id=cn.wq.disableservice&amp;hl=en">Disable Service</a> from the play store (or elsewhere).</li> <li>Open and go to Chrome</li> <li>Uncheck OmahaClient</li> </ol> <p>My logic: Disable Service will stop the service from running, ever. OmahaClient is the name of Chrome&#39;s updater.</p> <p>&nbsp;</p> <p>If this new attempt doesn&#39;t work then I guess... It&#39;s time to patch the apk or make an Xposed module! The module is likely a better option because it won&#39;t cause signature conflicts, should work across chrome versions, and be easier for people to install.</p> <p>But at this point it&#39;s worth wondering if we really want Chrome that bad, don&#39;t you think?</p> </div><div class="article message"><div class="alert alert-danger"><em>As of 2016, this post is outdated and may no longer apply.</em></div> <p><a class="fancybox" href="http://blog.alexou.net/upload/image/unnamed.png"><img alt="unnamed.png" height="113" src="http://blog.alexou.net/upload/image/unnamed.png?size=150" style="float:right" width="113" /></a></p> <p>Updating Chrome on Android is always a gamble. If I were to pick a game to best describe the experience I&#39;d choose Russian roulette. Sometimes everything is fine, improved even. But too often things fall apart, up to the point you may reluctantly have to revert to the factory version. You may choose, like me, to preemptively remain on an older version. It works fine, if you can live with chrome prompting you to update to a &quot;newer, greater version&quot; at each start...</p> <p>But you like your current version and you don&#39;t want to be prompted to update each time you tap the Chrome icon... There is no setting that I could find to disable this behavior.</p> <p>Luckily if you are rooted you can manually edit one of Chrome&#39;s config file, the one concerning Omaha aka Google Update. You will need a root text editor or file manager, I use ES File Explorer<br /> with root enabled (swipe the left pane).<a class="fancybox" href="http://blog.alexou.net/upload/image/L93.png"><img alt="L93.png" src="http://blog.alexou.net/upload/image/L93.png?size=200" style="float:right" /></a></p> <p><span style="color:#FF8C00;">Note: This will <strong><em>not</em> </strong>disable the Play Store auto-update or manual update. It will <strong><em>only </em></strong>hide the annoying &quot;Chrome just got better&quot; prompts when you start Chrome.</span></p> <p>&nbsp;</p> <p>Before starting make sure to swipe Chrome away from the activity view , it will avoid having Chrome overwriting your changes.</p> <p><em><a href="http://blog.alexou.net/2014/09/disable-chrome-update-prompt-on-android#omahaclient">I&#39;ve added a second (non-tested) method, scroll down</a> to see it. It is actually much simpler, maybe it&#39;s worth trying first.</em></p> <div style="page-break-after: always"><span style="display: none;">&nbsp;</span></div> <h3>Editing the config file</h3> <p>The file to edit is:<br /> <strong>/data/data/com.android.chrome/shared_prefs/com.google.android.apps.chrome.omaha.xml</strong></p> <p><br /> You need to set the latest version to a number less than your current version and change a few timestamps:</p> <ol> <li>latestVersion =&gt; lower version than yours</li> <li>delay =&gt; just bump that number</li> <li>timestampForNextPostAttempt =&gt; set in the far future</li> <li>timestampForNewRequest =&gt; set in the far future</li> <li>timestampOfInstall =&gt; set in the far future</li> </ol> <p>. Here&#39;s an example file with modifications highlighted:</p> <p><span style="color:#696969;"><em>&nbsp;&nbsp; /data/data/com.android.chrome/shared_prefs/com.google.android.apps.chrome.omaha.xml</em></span></p> <pre> &lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39; standalone=&#39;yes&#39; ?&gt; &lt;map&gt; &lt;int name=&quot;backoffFailedAttempts&quot; value=&quot;0&quot; /&gt; &lt;string name=&quot;latestVersion&quot;&gt;<span style="background-color:#FFFF00;">32.0.2125.102</span>&lt;/string&gt; &lt;string name=&quot;installSource&quot;&gt;system_image&lt;/string&gt; &lt;string name=&quot;marketURL&quot;&gt;market://details?id=com.android.chrome&lt;/string&gt; &lt;long name=&quot;delay&quot; value=&quot;<span style="background-color:#FFFF00;">7200000000</span>&quot; /&gt; &lt;long name=&quot;timestampOfInstall&quot; value=&quot;<span style="background-color:#FFFF00;">2012905877353</span>&quot; /&gt; &lt;long name=&quot;timestampForNextPostAttempt&quot; value=&quot;<span style="background-color:#FFFF00;">2012905877353</span>&quot; /&gt; &lt;long name=&quot;timestampOfRequest&quot; value=&quot;-1&quot; /&gt; &lt;string name=&quot;persistedRequestID&quot;&gt;invalid&lt;/string&gt; &lt;boolean name=&quot;sendInstallEvent&quot; value=&quot;false&quot; /&gt; &lt;long name=&quot;timestampForNewRequest&quot; value=&quot;<span style="background-color:#FFFF00;">2012920277663</span>&quot; /&gt; &lt;/map&gt; </pre> <p>&nbsp;</p> <p>And for reference here&#39;s the stock one:</p> <pre> &lt;?xml version=&#39;1.0&#39; encoding=&#39;utf-8&#39; standalone=&#39;yes&#39; ?&gt; &lt;map&gt; &lt;int name=&quot;backoffFailedAttempts&quot; value=&quot;0&quot; /&gt; &lt;string name=&quot;installSource&quot;&gt;system_image&lt;/string&gt; &lt;string name=&quot;latestVersion&quot;&gt;38.0.2125.102&lt;/string&gt; &lt;string name=&quot;marketURL&quot;&gt;market://details?id=com.android.chrome&lt;/string&gt; &lt;string name=&quot;persistedRequestID&quot;&gt;invalid&lt;/string&gt; &lt;long name=&quot;timestampOfRequest&quot; value=&quot;-1&quot; /&gt; &lt;long name=&quot;timestampForNextPostAttempt&quot; value=&quot;1412907273247&quot; /&gt; &lt;long name=&quot;timestampOfInstall&quot; value=&quot;1412903606751&quot; /&gt; &lt;long name=&quot;timestampForNewRequest&quot; value=&quot;1412921673585&quot; /&gt; &lt;boolean name=&quot;sendInstallEvent&quot; value=&quot;false&quot; /&gt; &lt;/map&gt; </pre> <p>&nbsp;</p> <h3>Changing Permissions</h3> <p>Once the changes are made you need to do some permission changes:</p> <ol> <li>Change the permissions to 444 (Read: User, Group, Global / Write: none)</li> <li>Change the owner and group of the file for any other user, root for example</li> <li>Set the sticky bit so that Chrome can&#39;t change back the permissions or delete and recreate the file</li> </ol> <p><strong>Recap:</strong> Change owner/group to group and set permissions to 1444 (sticky bit + read user + read group + read world). It may seem overzealous but trust me, Chrome is very tenacious when it comes to its config files.</p> <p>&nbsp;</p> <p>If at this point Chrome still somehow fix the file, it&#39;s worth looking for very good alternatives such as <a href="https://play.google.com/store/apps/details?id=acr.browser.barebones&amp;hl=en">lightning</a> or <a href="https://play.google.com/store/apps/details?id=org.tint&amp;hl=en">tint</a>!</p> <p>&nbsp;</p> <p>I hope this post will be helpful to some people! :)</p> <p>&nbsp;</p> <h3>Edit, alternate method - <u>NON TESTED</u>:<a id="omahaclient" name="omahaclient"></a></h3> <h3>Disabling the Omaha Service</h3> <p>This is a method I have not tested, I&#39;m merely guesstimating it has a fair chance of working.</p> <p><em><span style="font-size:10px;">Disclaimer: I <u>did</u> test the procedure myself and Chrome still works fine afterward, what isn&#39;t tested is the <u>anti-update/banner/prompt/annoyance itself</u> </span></em><em><span style="font-size:10px;">(long story short I do not have access to old enough Chrome right now). Why am I posting untested root tricks? Because it is safe if you don&#39;t play around the app I&#39;m linking too much (don&#39;t touch what you don&#39;t understand, although you can revert at any time) and someone might be desperate. Because seriously I didn&#39;t find anyone else trying to stop this Chrome behavior without (or even with, for that matter) patching chrome but I receive quite a bit of traffic from google search and even got a friendly commenter! So I assume there is some interest.</span></em></p> <ol> <li>Download <a href="https://play.google.com/store/apps/details?id=cn.wq.disableservice&amp;hl=en">Disable Service</a> from the play store (or elsewhere).</li> <li>Open and go to Chrome</li> <li>Uncheck OmahaClient</li> </ol> <p>My logic: Disable Service will stop the service from running, ever. OmahaClient is the name of Chrome&#39;s updater.</p> <p>&nbsp;</p> <p>If this new attempt doesn&#39;t work then I guess... It&#39;s time to patch the apk or make an Xposed module! The module is likely a better option because it won&#39;t cause signature conflicts, should work across chrome versions, and be easier for people to install.</p> <p>But at this point it&#39;s worth wondering if we really want Chrome that bad, don&#39;t you think?</p> </div>Mouse and Keyboard Monitorhttp://blog.alexou.net/?mouse-and-keyboard-monitorTue, 01 Jul 2014 06:46:00 -0400Tue, 08 Jul 2014 01:05:21 -0400http://blog.alexou.net/206<div class="article message"><p><a class="fancybox" href="http://blog.alexou.net/upload/image/sP6-1.png"><img alt="sP6-1.png" src="http://blog.alexou.net/upload/image/sP6-1.png?size=150" style="float: right;" /></a><a href="http://alexou.net/pub/?PbCounter">PbCounter</a> is a small Windows utility that counts how many times each mouse button and each keyboard key is pressed. With these statistics it does three things:</p> <ol> <li>Display the counters, obviously :)</li> <li>Create an heat map to put in evidence the most used keys on your keyboard</li> <li>Upload the statistics at regular interval to a web page of your choice (an example PHP script <a href="http://alexou.net/pub/PbCounter/php/">here</a> or <a href="http://alexou.net/pub/?PbCounter/php/index.php">source</a>)</li> </ol> <p>It is purposely compatible with scripts made for <a href="http://www.blacksunsoftware.com/mousotron-submit-scores.html">Mousotron</a>. It takes less than 3MB of ram and uses very little CPU.</p> <p>Configuration can be done by editing the ini file, more information included in the help file. Important: While it tracks how many times each key is pressed, it doesn&#39;t record what you type (it is not a keylogger).</p> <p>&nbsp;</p> <p style="text-align: center;"><img alt="dtY-1.png" src="http://blog.alexou.net/upload/image/dtY-1.png" /></p> <p style="text-align: center;">&nbsp;</p> <p>The program is free to use and modify under the MIT license. If you want to compile it you will need <a href="http://www.purebasic.com/">PureBasic</a> 5+ (The demo won&#39;t work as PbCounter uses the win32 API).</p> <p>&nbsp;</p> <p><a href="http://alexou.net/pub/?PbCounter">Download</a></p> <p>&nbsp;</p> <p>Tags: Click counter, Mouse Spy, Keyboard activity, Statistics</p> </div><div class="article message"><p><a class="fancybox" href="http://blog.alexou.net/upload/image/sP6-1.png"><img alt="sP6-1.png" src="http://blog.alexou.net/upload/image/sP6-1.png?size=150" style="float: right;" /></a><a href="http://alexou.net/pub/?PbCounter">PbCounter</a> is a small Windows utility that counts how many times each mouse button and each keyboard key is pressed. With these statistics it does three things:</p> <ol> <li>Display the counters, obviously :)</li> <li>Create an heat map to put in evidence the most used keys on your keyboard</li> <li>Upload the statistics at regular interval to a web page of your choice (an example PHP script <a href="http://alexou.net/pub/PbCounter/php/">here</a> or <a href="http://alexou.net/pub/?PbCounter/php/index.php">source</a>)</li> </ol> <p>It is purposely compatible with scripts made for <a href="http://www.blacksunsoftware.com/mousotron-submit-scores.html">Mousotron</a>. It takes less than 3MB of ram and uses very little CPU.</p> <p>Configuration can be done by editing the ini file, more information included in the help file. Important: While it tracks how many times each key is pressed, it doesn&#39;t record what you type (it is not a keylogger).</p> <p>&nbsp;</p> <p style="text-align: center;"><img alt="dtY-1.png" src="http://blog.alexou.net/upload/image/dtY-1.png" /></p> <p style="text-align: center;">&nbsp;</p> <p>The program is free to use and modify under the MIT license. If you want to compile it you will need <a href="http://www.purebasic.com/">PureBasic</a> 5+ (The demo won&#39;t work as PbCounter uses the win32 API).</p> <p>&nbsp;</p> <p><a href="http://alexou.net/pub/?PbCounter">Download</a></p> <p>&nbsp;</p> <p>Tags: Click counter, Mouse Spy, Keyboard activity, Statistics</p> </div>Montréal Mini Maker Faire 2014http://blog.alexou.net/?montreal-mini-maker-faire-2014Fri, 13 Jun 2014 19:43:00 -0400Sat, 14 Jun 2014 00:31:19 -0400http://blog.alexou.net/134<div class="article message"><p>Here&#39;s a short overview of the <a href="http://www.makerfairemontreal.ca/">Montreal Mini Maker Faire 2014</a>. As usual, pictures are provided by <a href="http://pascalnet.net/">Pascal</a> :)</p> <div class="gallery" contenteditable="false" images="149,151,154,152,179,180,174,183,181"> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6837-1.jpg" rel="59nks7evfku"><img alt="IMG_6837-1.jpg" src="http://blog.alexou.net/upload/image/IMG_6837-1.jpg?size=150x150" title="IMG_6837-1.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6841-3.jpg" rel="59nks7evfku"><img alt="IMG_6841-3.jpg" src="http://blog.alexou.net/upload/image/IMG_6841-3.jpg?size=150x150" title="IMG_6841-3.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6848-7.jpg" rel="59nks7evfku"><img alt="IMG_6848-7.jpg" src="http://blog.alexou.net/upload/image/IMG_6848-7.jpg?size=150x150" title="IMG_6848-7.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6842-4.jpg" rel="59nks7evfku"><img alt="IMG_6842-4.jpg" src="http://blog.alexou.net/upload/image/IMG_6842-4.jpg?size=150x150" title="IMG_6842-4.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6918-55.jpg" rel="59nks7evfku"><img alt="IMG_6918-55.jpg" src="http://blog.alexou.net/upload/image/IMG_6918-55.jpg?size=150x150" title="IMG_6918-55.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6922-58.jpg" rel="59nks7evfku"><img alt="IMG_6922-58.jpg" src="http://blog.alexou.net/upload/image/IMG_6922-58.jpg?size=150x150" title="IMG_6922-58.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6898-39.jpg" rel="59nks7evfku"><img alt="IMG_6898-39.jpg" src="http://blog.alexou.net/upload/image/IMG_6898-39.jpg?size=150x150" title="IMG_6898-39.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6927-61.jpg" rel="59nks7evfku"><img alt="IMG_6927-61.jpg" src="http://blog.alexou.net/upload/image/IMG_6927-61.jpg?size=150x150" title="IMG_6927-61.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6923-59.jpg" rel="59nks7evfku"><img alt="IMG_6923-59.jpg" src="http://blog.alexou.net/upload/image/IMG_6923-59.jpg?size=150x150" title="IMG_6923-59.jpg" /></a></div> </div> <div style="page-break-after: always"><span style="display: none;">&nbsp;</span></div> <div class="gallery" contenteditable="false" images="186,185,184,182,177,178,176,175,173,172,167,169,170,171,166,165,161,160,164,163,162,157,158,159,156,155,154,153,152,150"> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6931-64.jpg" rel="s9i57ax2md"><img alt="IMG_6931-64.jpg" src="http://blog.alexou.net/upload/image/IMG_6931-64.jpg?size=150x150" title="IMG_6931-64.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6930-63.jpg" rel="s9i57ax2md"><img alt="IMG_6930-63.jpg" src="http://blog.alexou.net/upload/image/IMG_6930-63.jpg?size=150x150" title="IMG_6930-63.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6929-62.jpg" rel="s9i57ax2md"><img alt="IMG_6929-62.jpg" src="http://blog.alexou.net/upload/image/IMG_6929-62.jpg?size=150x150" title="IMG_6929-62.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6924-60.jpg" rel="s9i57ax2md"><img alt="IMG_6924-60.jpg" src="http://blog.alexou.net/upload/image/IMG_6924-60.jpg?size=150x150" title="IMG_6924-60.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6916-53.jpg" rel="s9i57ax2md"><img alt="IMG_6916-53.jpg" src="http://blog.alexou.net/upload/image/IMG_6916-53.jpg?size=150x150" title="IMG_6916-53.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6917-54.jpg" rel="s9i57ax2md"><img alt="IMG_6917-54.jpg" src="http://blog.alexou.net/upload/image/IMG_6917-54.jpg?size=150x150" title="IMG_6917-54.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6908-45.jpg" rel="s9i57ax2md"><img alt="IMG_6908-45.jpg" src="http://blog.alexou.net/upload/image/IMG_6908-45.jpg?size=150x150" title="IMG_6908-45.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6900-40.jpg" rel="s9i57ax2md"><img alt="IMG_6900-40.jpg" src="http://blog.alexou.net/upload/image/IMG_6900-40.jpg?size=150x150" title="IMG_6900-40.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6894-38.jpg" rel="s9i57ax2md"><img alt="IMG_6894-38.jpg" src="http://blog.alexou.net/upload/image/IMG_6894-38.jpg?size=150x150" title="IMG_6894-38.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6893-37.jpg" rel="s9i57ax2md"><img alt="IMG_6893-37.jpg" src="http://blog.alexou.net/upload/image/IMG_6893-37.jpg?size=150x150" title="IMG_6893-37.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6881-26.jpg" rel="s9i57ax2md"><img alt="IMG_6881-26.jpg" src="http://blog.alexou.net/upload/image/IMG_6881-26.jpg?size=150x150" title="IMG_6881-26.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6888-32.jpg" rel="s9i57ax2md"><img alt="IMG_6888-32.jpg" src="http://blog.alexou.net/upload/image/IMG_6888-32.jpg?size=150x150" title="IMG_6888-32.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6889-33.jpg" rel="s9i57ax2md"><img alt="IMG_6889-33.jpg" src="http://blog.alexou.net/upload/image/IMG_6889-33.jpg?size=150x150" title="IMG_6889-33.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6892-36.jpg" rel="s9i57ax2md"><img alt="IMG_6892-36.jpg" src="http://blog.alexou.net/upload/image/IMG_6892-36.jpg?size=150x150" title="IMG_6892-36.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6880-25.jpg" rel="s9i57ax2md"><img alt="IMG_6880-25.jpg" src="http://blog.alexou.net/upload/image/IMG_6880-25.jpg?size=150x150" title="IMG_6880-25.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6879-24.jpg" rel="s9i57ax2md"><img alt="IMG_6879-24.jpg" src="http://blog.alexou.net/upload/image/IMG_6879-24.jpg?size=150x150" title="IMG_6879-24.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6869-20.jpg" rel="s9i57ax2md"><img alt="IMG_6869-20.jpg" src="http://blog.alexou.net/upload/image/IMG_6869-20.jpg?size=150x150" title="IMG_6869-20.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6867-18.jpg" rel="s9i57ax2md"><img alt="IMG_6867-18.jpg" src="http://blog.alexou.net/upload/image/IMG_6867-18.jpg?size=150x150" title="IMG_6867-18.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6876-23.jpg" rel="s9i57ax2md"><img alt="IMG_6876-23.jpg" src="http://blog.alexou.net/upload/image/IMG_6876-23.jpg?size=150x150" title="IMG_6876-23.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6873-22.jpg" rel="s9i57ax2md"><img alt="IMG_6873-22.jpg" src="http://blog.alexou.net/upload/image/IMG_6873-22.jpg?size=150x150" title="IMG_6873-22.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6872-21.jpg" rel="s9i57ax2md"><img alt="IMG_6872-21.jpg" src="http://blog.alexou.net/upload/image/IMG_6872-21.jpg?size=150x150" title="IMG_6872-21.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6863-15.jpg" rel="s9i57ax2md"><img alt="IMG_6863-15.jpg" src="http://blog.alexou.net/upload/image/IMG_6863-15.jpg?size=150x150" title="IMG_6863-15.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6865-16.jpg" rel="s9i57ax2md"><img alt="IMG_6865-16.jpg" src="http://blog.alexou.net/upload/image/IMG_6865-16.jpg?size=150x150" title="IMG_6865-16.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6866-17.jpg" rel="s9i57ax2md"><img alt="IMG_6866-17.jpg" src="http://blog.alexou.net/upload/image/IMG_6866-17.jpg?size=150x150" title="IMG_6866-17.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6850-9.jpg" rel="s9i57ax2md"><img alt="IMG_6850-9.jpg" src="http://blog.alexou.net/upload/image/IMG_6850-9.jpg?size=150x150" title="IMG_6850-9.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6849-8.jpg" rel="s9i57ax2md"><img alt="IMG_6849-8.jpg" src="http://blog.alexou.net/upload/image/IMG_6849-8.jpg?size=150x150" title="IMG_6849-8.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6848-7.jpg" rel="s9i57ax2md"><img alt="IMG_6848-7.jpg" src="http://blog.alexou.net/upload/image/IMG_6848-7.jpg?size=150x150" title="IMG_6848-7.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6844-5.jpg" rel="s9i57ax2md"><img alt="IMG_6844-5.jpg" src="http://blog.alexou.net/upload/image/IMG_6844-5.jpg?size=150x150" title="IMG_6844-5.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6842-4.jpg" rel="s9i57ax2md"><img alt="IMG_6842-4.jpg" src="http://blog.alexou.net/upload/image/IMG_6842-4.jpg?size=150x150" title="IMG_6842-4.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6838-2.jpg" rel="s9i57ax2md"><img alt="IMG_6838-2.jpg" src="http://blog.alexou.net/upload/image/IMG_6838-2.jpg?size=150x150" title="IMG_6838-2.jpg" /></a></div> </div> <p>&nbsp;</p></div><div class="article message"><p>Here&#39;s a short overview of the <a href="http://www.makerfairemontreal.ca/">Montreal Mini Maker Faire 2014</a>. As usual, pictures are provided by <a href="http://pascalnet.net/">Pascal</a> :)</p> <div class="gallery" contenteditable="false" images="149,151,154,152,179,180,174,183,181"> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6837-1.jpg" rel="59nks7evfku"><img alt="IMG_6837-1.jpg" src="http://blog.alexou.net/upload/image/IMG_6837-1.jpg?size=150x150" title="IMG_6837-1.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6841-3.jpg" rel="59nks7evfku"><img alt="IMG_6841-3.jpg" src="http://blog.alexou.net/upload/image/IMG_6841-3.jpg?size=150x150" title="IMG_6841-3.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6848-7.jpg" rel="59nks7evfku"><img alt="IMG_6848-7.jpg" src="http://blog.alexou.net/upload/image/IMG_6848-7.jpg?size=150x150" title="IMG_6848-7.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6842-4.jpg" rel="59nks7evfku"><img alt="IMG_6842-4.jpg" src="http://blog.alexou.net/upload/image/IMG_6842-4.jpg?size=150x150" title="IMG_6842-4.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6918-55.jpg" rel="59nks7evfku"><img alt="IMG_6918-55.jpg" src="http://blog.alexou.net/upload/image/IMG_6918-55.jpg?size=150x150" title="IMG_6918-55.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6922-58.jpg" rel="59nks7evfku"><img alt="IMG_6922-58.jpg" src="http://blog.alexou.net/upload/image/IMG_6922-58.jpg?size=150x150" title="IMG_6922-58.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6898-39.jpg" rel="59nks7evfku"><img alt="IMG_6898-39.jpg" src="http://blog.alexou.net/upload/image/IMG_6898-39.jpg?size=150x150" title="IMG_6898-39.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6927-61.jpg" rel="59nks7evfku"><img alt="IMG_6927-61.jpg" src="http://blog.alexou.net/upload/image/IMG_6927-61.jpg?size=150x150" title="IMG_6927-61.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6923-59.jpg" rel="59nks7evfku"><img alt="IMG_6923-59.jpg" src="http://blog.alexou.net/upload/image/IMG_6923-59.jpg?size=150x150" title="IMG_6923-59.jpg" /></a></div> </div> <div style="page-break-after: always"><span style="display: none;">&nbsp;</span></div> <div class="gallery" contenteditable="false" images="186,185,184,182,177,178,176,175,173,172,167,169,170,171,166,165,161,160,164,163,162,157,158,159,156,155,154,153,152,150"> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6931-64.jpg" rel="s9i57ax2md"><img alt="IMG_6931-64.jpg" src="http://blog.alexou.net/upload/image/IMG_6931-64.jpg?size=150x150" title="IMG_6931-64.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6930-63.jpg" rel="s9i57ax2md"><img alt="IMG_6930-63.jpg" src="http://blog.alexou.net/upload/image/IMG_6930-63.jpg?size=150x150" title="IMG_6930-63.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6929-62.jpg" rel="s9i57ax2md"><img alt="IMG_6929-62.jpg" src="http://blog.alexou.net/upload/image/IMG_6929-62.jpg?size=150x150" title="IMG_6929-62.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6924-60.jpg" rel="s9i57ax2md"><img alt="IMG_6924-60.jpg" src="http://blog.alexou.net/upload/image/IMG_6924-60.jpg?size=150x150" title="IMG_6924-60.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6916-53.jpg" rel="s9i57ax2md"><img alt="IMG_6916-53.jpg" src="http://blog.alexou.net/upload/image/IMG_6916-53.jpg?size=150x150" title="IMG_6916-53.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6917-54.jpg" rel="s9i57ax2md"><img alt="IMG_6917-54.jpg" src="http://blog.alexou.net/upload/image/IMG_6917-54.jpg?size=150x150" title="IMG_6917-54.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6908-45.jpg" rel="s9i57ax2md"><img alt="IMG_6908-45.jpg" src="http://blog.alexou.net/upload/image/IMG_6908-45.jpg?size=150x150" title="IMG_6908-45.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6900-40.jpg" rel="s9i57ax2md"><img alt="IMG_6900-40.jpg" src="http://blog.alexou.net/upload/image/IMG_6900-40.jpg?size=150x150" title="IMG_6900-40.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6894-38.jpg" rel="s9i57ax2md"><img alt="IMG_6894-38.jpg" src="http://blog.alexou.net/upload/image/IMG_6894-38.jpg?size=150x150" title="IMG_6894-38.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6893-37.jpg" rel="s9i57ax2md"><img alt="IMG_6893-37.jpg" src="http://blog.alexou.net/upload/image/IMG_6893-37.jpg?size=150x150" title="IMG_6893-37.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6881-26.jpg" rel="s9i57ax2md"><img alt="IMG_6881-26.jpg" src="http://blog.alexou.net/upload/image/IMG_6881-26.jpg?size=150x150" title="IMG_6881-26.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6888-32.jpg" rel="s9i57ax2md"><img alt="IMG_6888-32.jpg" src="http://blog.alexou.net/upload/image/IMG_6888-32.jpg?size=150x150" title="IMG_6888-32.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6889-33.jpg" rel="s9i57ax2md"><img alt="IMG_6889-33.jpg" src="http://blog.alexou.net/upload/image/IMG_6889-33.jpg?size=150x150" title="IMG_6889-33.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6892-36.jpg" rel="s9i57ax2md"><img alt="IMG_6892-36.jpg" src="http://blog.alexou.net/upload/image/IMG_6892-36.jpg?size=150x150" title="IMG_6892-36.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6880-25.jpg" rel="s9i57ax2md"><img alt="IMG_6880-25.jpg" src="http://blog.alexou.net/upload/image/IMG_6880-25.jpg?size=150x150" title="IMG_6880-25.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6879-24.jpg" rel="s9i57ax2md"><img alt="IMG_6879-24.jpg" src="http://blog.alexou.net/upload/image/IMG_6879-24.jpg?size=150x150" title="IMG_6879-24.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6869-20.jpg" rel="s9i57ax2md"><img alt="IMG_6869-20.jpg" src="http://blog.alexou.net/upload/image/IMG_6869-20.jpg?size=150x150" title="IMG_6869-20.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6867-18.jpg" rel="s9i57ax2md"><img alt="IMG_6867-18.jpg" src="http://blog.alexou.net/upload/image/IMG_6867-18.jpg?size=150x150" title="IMG_6867-18.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6876-23.jpg" rel="s9i57ax2md"><img alt="IMG_6876-23.jpg" src="http://blog.alexou.net/upload/image/IMG_6876-23.jpg?size=150x150" title="IMG_6876-23.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6873-22.jpg" rel="s9i57ax2md"><img alt="IMG_6873-22.jpg" src="http://blog.alexou.net/upload/image/IMG_6873-22.jpg?size=150x150" title="IMG_6873-22.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6872-21.jpg" rel="s9i57ax2md"><img alt="IMG_6872-21.jpg" src="http://blog.alexou.net/upload/image/IMG_6872-21.jpg?size=150x150" title="IMG_6872-21.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6863-15.jpg" rel="s9i57ax2md"><img alt="IMG_6863-15.jpg" src="http://blog.alexou.net/upload/image/IMG_6863-15.jpg?size=150x150" title="IMG_6863-15.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6865-16.jpg" rel="s9i57ax2md"><img alt="IMG_6865-16.jpg" src="http://blog.alexou.net/upload/image/IMG_6865-16.jpg?size=150x150" title="IMG_6865-16.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6866-17.jpg" rel="s9i57ax2md"><img alt="IMG_6866-17.jpg" src="http://blog.alexou.net/upload/image/IMG_6866-17.jpg?size=150x150" title="IMG_6866-17.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6850-9.jpg" rel="s9i57ax2md"><img alt="IMG_6850-9.jpg" src="http://blog.alexou.net/upload/image/IMG_6850-9.jpg?size=150x150" title="IMG_6850-9.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6849-8.jpg" rel="s9i57ax2md"><img alt="IMG_6849-8.jpg" src="http://blog.alexou.net/upload/image/IMG_6849-8.jpg?size=150x150" title="IMG_6849-8.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6848-7.jpg" rel="s9i57ax2md"><img alt="IMG_6848-7.jpg" src="http://blog.alexou.net/upload/image/IMG_6848-7.jpg?size=150x150" title="IMG_6848-7.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6844-5.jpg" rel="s9i57ax2md"><img alt="IMG_6844-5.jpg" src="http://blog.alexou.net/upload/image/IMG_6844-5.jpg?size=150x150" title="IMG_6844-5.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6842-4.jpg" rel="s9i57ax2md"><img alt="IMG_6842-4.jpg" src="http://blog.alexou.net/upload/image/IMG_6842-4.jpg?size=150x150" title="IMG_6842-4.jpg" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/upload/image/IMG_6838-2.jpg" rel="s9i57ax2md"><img alt="IMG_6838-2.jpg" src="http://blog.alexou.net/upload/image/IMG_6838-2.jpg?size=150x150" title="IMG_6838-2.jpg" /></a></div> </div> <p>&nbsp;</p></div>Source RCON Console (Ajax/PHP)http://blog.alexou.net/?source-rcon-console-ajax-phpSat, 10 May 2014 17:45:00 -0400Thu, 19 Jun 2014 06:05:07 -0400http://blog.alexou.net/176<div class="article message"><p>Source RCON Console is a basic implementation of the <a href="https://developer.valvesoftware.com/wiki/Source_RCON_Protocol" target="_blank">Source RCON protocol</a>. This project is presented as an ajax console, but the core is a small standalone PHP Class that can be used to send individual commands from other sources.</p> <p>The class implements only Source RCON protocol, it will not work with CS 1.6 and the like. However it does work with Source RCON-compatible games such as Minecraft and I made a small color parser for minecraft strings.</p> <p><img alt="bad[1]" class="size-full wp-image-2065 aligncenter" height="435" src="http://blog.alexou.net/upload/image/bad1.png" width="801" /></p> <h3>Tested Games</h3> <ul> <li>Counter-Strike: Source</li> <li>Minecraft</li> </ul> <h3>Requirements</h3> <ul> <li>PHP 5 with sockets enabled</li> <li>A game server with RCON enabled</li> <li>Browser with javascript support</li> </ul> <h3>Download</h3> <p><a href="http://alexou.net/pub/?rcon">http://alexou.net/pub/?rcon</a></p></div><div class="article message"><p>Source RCON Console is a basic implementation of the <a href="https://developer.valvesoftware.com/wiki/Source_RCON_Protocol" target="_blank">Source RCON protocol</a>. This project is presented as an ajax console, but the core is a small standalone PHP Class that can be used to send individual commands from other sources.</p> <p>The class implements only Source RCON protocol, it will not work with CS 1.6 and the like. However it does work with Source RCON-compatible games such as Minecraft and I made a small color parser for minecraft strings.</p> <p><img alt="bad[1]" class="size-full wp-image-2065 aligncenter" height="435" src="http://blog.alexou.net/upload/image/bad1.png" width="801" /></p> <h3>Tested Games</h3> <ul> <li>Counter-Strike: Source</li> <li>Minecraft</li> </ul> <h3>Requirements</h3> <ul> <li>PHP 5 with sockets enabled</li> <li>A game server with RCON enabled</li> <li>Browser with javascript support</li> </ul> <h3>Download</h3> <p><a href="http://alexou.net/pub/?rcon">http://alexou.net/pub/?rcon</a></p></div>Game Server Query PHP Classhttp://blog.alexou.net/?game-server-query-php-classSat, 10 May 2014 04:30:00 -0400Tue, 10 Jun 2014 14:49:42 -0400http://blog.alexou.net/127<div class="article message"><h3>What/Why</h3> <p>This is an adaptation of a very old code I made a decade ago. It is a class that is able to query/ping game servers including:</p> <ol> <li>Source Games</li> <li>Counter Strike 1.6</li> <li>Most Quake 3-based Games</li> <li>Doom 3</li> <li>Most Gamespy2-compatible Games</li> <li>Minecraft</li> </ol> <p>It will return different information depending on the server such as : Server description, players online, player list, current map, website, favicon, map download link, etc.</p> <h3>Download</h3> <p><a href="http://alexou.net/pub/?GameServerQuery">http://alexou.net/pub/?GameServerQuery</a></p> <h3>Example</h3> <p>Quake 3 Arena query reply:</p> <pre> array(31) { [&quot;roundlimit&quot;]=&gt; string(1) &quot;0&quot; [&quot;capturelimit&quot;]=&gt; string(2) &quot;10&quot; [&quot;g_blueTeam&quot;]=&gt; string(5) &quot;^ADAM&quot; [&quot;g_redTeam&quot;]=&gt; string(4) &quot;^EVE&quot; [&quot;sv_punkbuster&quot;]=&gt; string(1) &quot;0&quot; [&quot;sv_allowDownload&quot;]=&gt; string(1) &quot;1&quot; [&quot;sv_pure&quot;]=&gt; string(1) &quot;0&quot; [&quot;sv_dlRate&quot;]=&gt; string(4) &quot;2048&quot; [&quot;sv_maxRate&quot;]=&gt; string(5) &quot;25000&quot; [&quot;sv_minRate&quot;]=&gt; string(1) &quot;0&quot; [&quot;sv_maxclients&quot;]=&gt; string(2) &quot;20&quot; [&quot;sv_hostname&quot;]=&gt; string(5) &quot;Shost&quot; [&quot;timelimit&quot;]=&gt; string(2) &quot;20&quot; [&quot;fraglimit&quot;]=&gt; string(1) &quot;0&quot; [&quot;version&quot;]=&gt; string(24) &quot;ioq3 1.36 (viol v1.3dev)&quot; [&quot;com_gamename&quot;]=&gt; string(11) &quot;Quake3Arena&quot; [&quot;com_protocol&quot;]=&gt; string(2) &quot;71&quot; [&quot;dmflags&quot;]=&gt; string(1) &quot;0&quot; [&quot;g_gametype&quot;]=&gt; string(1) &quot;4&quot; [&quot;mapname&quot;]=&gt; string(8) &quot;frontier&quot; [&quot;bot_minplayers&quot;]=&gt; string(1) &quot;2&quot; [&quot;g_needpass&quot;]=&gt; string(1) &quot;0&quot; [&quot;gamename&quot;]=&gt; string(13) &quot;excessiveplus&quot; [&quot;Uptime&quot;]=&gt; string(16) &quot;27 days, 5:08:08&quot; [&quot;Info&quot;]=&gt; bool(false) [0]=&gt; bool(false) [&quot;players&quot;]=&gt; array(2) { [0]=&gt; array(3) { [&quot;frag&quot;]=&gt; string(1) &quot;3&quot; [&quot;ping&quot;]=&gt; string(2) &quot;49&quot; [&quot;name&quot;]=&gt; string(6) &quot;&quot;Esco&quot;&quot; } [1]=&gt; array(3) { [&quot;frag&quot;]=&gt; string(3) &quot;135&quot; [&quot;ping&quot;]=&gt; string(2) &quot;86&quot; [&quot;name&quot;]=&gt; string(5) &quot;&quot;KiD&quot;&quot; } } }</pre></div><div class="article message"><h3>What/Why</h3> <p>This is an adaptation of a very old code I made a decade ago. It is a class that is able to query/ping game servers including:</p> <ol> <li>Source Games</li> <li>Counter Strike 1.6</li> <li>Most Quake 3-based Games</li> <li>Doom 3</li> <li>Most Gamespy2-compatible Games</li> <li>Minecraft</li> </ol> <p>It will return different information depending on the server such as : Server description, players online, player list, current map, website, favicon, map download link, etc.</p> <h3>Download</h3> <p><a href="http://alexou.net/pub/?GameServerQuery">http://alexou.net/pub/?GameServerQuery</a></p> <h3>Example</h3> <p>Quake 3 Arena query reply:</p> <pre> array(31) { [&quot;roundlimit&quot;]=&gt; string(1) &quot;0&quot; [&quot;capturelimit&quot;]=&gt; string(2) &quot;10&quot; [&quot;g_blueTeam&quot;]=&gt; string(5) &quot;^ADAM&quot; [&quot;g_redTeam&quot;]=&gt; string(4) &quot;^EVE&quot; [&quot;sv_punkbuster&quot;]=&gt; string(1) &quot;0&quot; [&quot;sv_allowDownload&quot;]=&gt; string(1) &quot;1&quot; [&quot;sv_pure&quot;]=&gt; string(1) &quot;0&quot; [&quot;sv_dlRate&quot;]=&gt; string(4) &quot;2048&quot; [&quot;sv_maxRate&quot;]=&gt; string(5) &quot;25000&quot; [&quot;sv_minRate&quot;]=&gt; string(1) &quot;0&quot; [&quot;sv_maxclients&quot;]=&gt; string(2) &quot;20&quot; [&quot;sv_hostname&quot;]=&gt; string(5) &quot;Shost&quot; [&quot;timelimit&quot;]=&gt; string(2) &quot;20&quot; [&quot;fraglimit&quot;]=&gt; string(1) &quot;0&quot; [&quot;version&quot;]=&gt; string(24) &quot;ioq3 1.36 (viol v1.3dev)&quot; [&quot;com_gamename&quot;]=&gt; string(11) &quot;Quake3Arena&quot; [&quot;com_protocol&quot;]=&gt; string(2) &quot;71&quot; [&quot;dmflags&quot;]=&gt; string(1) &quot;0&quot; [&quot;g_gametype&quot;]=&gt; string(1) &quot;4&quot; [&quot;mapname&quot;]=&gt; string(8) &quot;frontier&quot; [&quot;bot_minplayers&quot;]=&gt; string(1) &quot;2&quot; [&quot;g_needpass&quot;]=&gt; string(1) &quot;0&quot; [&quot;gamename&quot;]=&gt; string(13) &quot;excessiveplus&quot; [&quot;Uptime&quot;]=&gt; string(16) &quot;27 days, 5:08:08&quot; [&quot;Info&quot;]=&gt; bool(false) [0]=&gt; bool(false) [&quot;players&quot;]=&gt; array(2) { [0]=&gt; array(3) { [&quot;frag&quot;]=&gt; string(1) &quot;3&quot; [&quot;ping&quot;]=&gt; string(2) &quot;49&quot; [&quot;name&quot;]=&gt; string(6) &quot;&quot;Esco&quot;&quot; } [1]=&gt; array(3) { [&quot;frag&quot;]=&gt; string(3) &quot;135&quot; [&quot;ping&quot;]=&gt; string(2) &quot;86&quot; [&quot;name&quot;]=&gt; string(5) &quot;&quot;KiD&quot;&quot; } } }</pre></div>Using sound to draw on an oscilloscopehttp://blog.alexou.net/?oscilloscope-drawingTue, 06 Aug 2013 19:13:00 -0400Mon, 12 Jan 2015 10:26:31 -0500http://blog.alexou.net/418<div class="article message"><h2 style="margin-top:0px;">What/Why</h2> <p>Oscilloscopes are cool. What is even cooler is using them to display arbitrary pictures instead of boring waves! We also can use them to write text (emulate a terminal) or maybe even play pong! But for now, let&#39;s focus on the basics of dot drawing using <strong>sound</strong>...</p> <table border="1" cellpadding="5" height="197" style="border-color: rgb(221, 221, 221);" width="516"> <thead> </thead> <tbody> <tr> <td style="width: 153px; border-color: rgb(221, 221, 221);"> <h2 style="margin-top: 0px; text-align: center;"><a class="fancybox" href="http://blog.alexou.net/upload/image/sequential.png"><img alt="sequential-2.png" src="http://blog.alexou.net/upload/image/sequential-2.png?size=150x150" /></a></h2> </td> <td style="width: 154px; text-align: center; border-color: rgb(221, 221, 221);"> <h2 style="margin-top: 0px; text-align: center;"><a class="fancybox" href="http://blog.alexou.net/upload/image/Soundcard_Oscilloscope_2015-01-12_10-10-57.png"><img alt="Soundcard_Oscilloscope_2015-01-12_10-10-57.png" src="http://blog.alexou.net/upload/image/Soundcard_Oscilloscope_2015-01-12_10-10-57.png?size=150x150" /></a></h2> </td> <td style="text-align: center; width: 161px; border-color: rgb(221, 221, 221);"> <h2 style="margin-top: 0px; text-align: center;"><a class="fancybox" href="http://blog.alexou.net/upload/image/face.png"><img alt="face.png" src="http://blog.alexou.net/upload/image/face.png?size=150x150" /></a></h2> </td> </tr> <tr> <td style="width: 153px; border-color: rgb(221, 221, 221); text-align: center;"> <p><strong>Sequential Drawing<br /> with no Persistence</strong></p> </td> <td style="width: 154px; text-align: center; border-color: rgb(221, 221, 221);"> <p><strong>Sequential Drawing</strong><br /> <strong>with Persistence</strong></p> </td> <td style="text-align: center; width: 161px; border-color: rgb(221, 221, 221);"> <p><strong>Dumb Shortest Path</strong></p> </td> </tr> </tbody> </table> <h2 style="margin-top:0px;">&nbsp;</h2> <h2 style="margin-top:0px;">Oscilloscope</h2> <p><a class="fancybox" href="http://blog.alexou.net/upload/image/osc11.gif"><img alt="osc1[1]" src="http://blog.alexou.net/upload/image/osc11.gif?size=150" style="float: left;" /></a><br /> An oscilloscope is a device that allows you to visualize signals (voltages) over time.<br /> When dealing with multiple signals (channels), you usually have three viewing mode: Dual, Add, and Chop. We will work in Dual.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">X-Y</h2> <p>For us the most interesting oscilloscope feature is called X-Y. In this mode you will view a single dot. The horizontal scale will no longer be time. It will be Channel 2&#39;s voltage. The Channel 1 will move the dot up and down according to its input voltage, the Channel 2 will move the dot left and right according to its input voltage. A bit like an Etch&#39;n&#39;Sketch.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Sound as a source</h2> <p><a href="http://blog.alexou.net/upload/image/WJSDpxZ1.png"><img alt="WJSDpxZ[1]" class="alignleft size-thumbnail wp-image-1975" height="114" src="http://blog.alexou.net/upload/image/WJSDpxZ1.png?size=150x114" style="float: left;" width="150" /></a><br /> A speaker creates sound by pulsing air at different frequencies. Sometimes it pushes air (positive voltage), sometimes it pulls air (negative voltage). In other words a speaker is driven by alternating current.</p> <p>By controlling the amplitude of the alternating current (or sound), we will be able to move the dot on the screen.</p> <p>Another key element to our project is stereo sound. Stereo sound means that we have two sound signals: Left and Right, X and Y.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Sound limitations</h2> <p>The oscilloscope has a sampling rate of millions of hertz. In other words it can measure the signals and move the dot accordingly millions of times per seconds, giving us impressive theoretical FPS for whatever we want to draw.</p> <p>BUT, the sampling rate of most digital music player is limited to 48000 hertz (or at best 96000 Hz), greatly limiting our FPS for complex pictures.</p> <p>Sound also have advantages like portability:<br /> - You can generate the sound file and bring it with you on your cellphone to do your demo on any oscilloscope around or share it on the demoscene<br /> - No extra hardware necessary, any sound card will work.</p> <p style="text-align: center;">&nbsp;</p> <h2 style="margin-top:0px;">Drawing Basics</h2> <p>We will move the dot so fast that the eye will be tricked into seeing a full picture.<br /> We set our scales at 1V and we center the dot (X-Y) on the oscilloscope screen. We will use a stereo sound source (two voltages) to move it. Left sound will move it horizontally and right sound will move it vertically. <strong>See first table up this page for an overview</strong>.</p> <p style="text-align: center;"><a class="fancybox" href="http://blog.alexou.net/upload/image/oscillo_face.png"><img alt="oscillo_face.png" src="http://blog.alexou.net/upload/image/oscillo_face.png?size=0" /></a></p> <h3 style="margin-left: 40px;">Drawing Sequentially</h3> <p style="margin-left: 40px;">This technique will draw a complete column (Y) pixel by pixel then advance the row (X), draw a new column, advance row, loop...</p> <p style="margin-left: 40px;">Thanks to Chris I realized that this technique only works if you have an oscilloscope with low display persistence and fair sampling rate.</p> <p style="margin-left: 40px;">If your scope <em>meet </em>these criteria the vertical lines in the image above should be fairly invisible.</p> <p style="margin-left: 40px;">If your oscilloscope <em>doesn&#39;t meet</em> these criteria then dots that shouldn&#39;t be connected together will be connected vertically(red lines in image), creating random lines hiding the picture&#39;s content.</p> <p style="margin-left: 40px;">My first script creates a wave file to draw sequentially. Find it at the end of this article.</p> <h3 style="margin-left: 40px;">Shortest Path Problem</h3> <p style="margin-left: 40px;">A better approach is to use a shortest past or path finding algorithm.</p> <p style="margin-left: 40px;">Basically what we want to do is compute the <a href="https://en.wikipedia.org/wiki/Shortest_path_problem"><u>best(shortest) route possible</u> </a>to connect all our pixels. The dot on screen will follow that route and hopefully minimize the noise (random lines) connecting isolated shapes. There will still be unwanted lines to connect our shapes, similar to a neon sign or cursive writing; but they will usually be thinner and dimmer than the rest of the shapes.</p> <p style="margin-left: 40px;">My second script implements a relatively dumb path finding algorithm. The result is <em>correct</em> for the pictures I tested, but I&#39;m studying <u><a href="https://en.wikipedia.org/wiki/Shortest_path_problem#Algorithms">real algorithms</a></u> and hopefully I&#39;ll do a proper path finding script.&nbsp; Find the current script at the end of this article.</p> <h3 style="margin-left: 40px;">Vector Drawing</h3> <p style="margin-left: 40px;">An elegant solution would be to generate vector graphics instead of raster. Using vectors would allow us to leverage the display persistence to form our shapes. I believe that is how Youscope was done. While it should be possible to transform a simple raster (gif/png) in vectors, it is way beyond my knowledge of image manipulation :).</p> <p>&nbsp;</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Sound Sample</h2> <p>A digital sound sample is a number that represent the amplitude of the audio signal.<br /> That number will represent one pixel coordinate (X or Y).</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Bits per sample</h2> <p>The bits per sample, or bit depth, is the resolution of the sample. With 8 bits, we have 256 amplitudes possible (-127 to +127).</p> <p>Assuming stereo sound at 8 bits, we could draw a picture of 65536 pixels (256x256). Because of output quality and oscilloscope precision, we could benefit of using 16 bit sound while keeping a low resolution and over sample it to make a sharper image.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Sampling rate</h2> <p>The sampling rate is how many samples are recorded or played in one second. Most digital devices have a sampling rate of 48000Hz (CD is 44100Hz). Because we use stereo sound, this means we can move our dot 24000 per second. To trick the eye we need <strong>at least</strong> 10fps, this means that we can only draw an image of 2400 pixels.</p> <p>Considering the oscilloscope&#39;s dot luminosity and our FPS limitation at this resolution, we can skip pixels. One full pixel, one empty pixel. The dot size would fill the voids.<br /> That brings us to 16384 pixels (128x128), or an ability to fill 15% of the screen and refresh it 10 times per second.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Wave</h2> <p>The <a href="http://www.sonicspot.com/guide/wavefiles.html">wave format</a> is perfect for us. We can use arbitrary sampling rate, bits per sample, and channels. Following the header, each channel samples are interlaced. The data look like this: left sample, right sample, left sample, right sample...</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Converting pixels to samples</h2> <p>For simplicity we will assume a 128x128 image with a white background. Anything that is not white will be a pixel to draw.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">/dev/dsp</h2> <p>- We can use /dev/dsp to stream the wave directly to the sound card by setting a very high sample numbers in the header<br /> <br /> &nbsp;</p> <h2 style="margin-top:0px;">Considerations</h2> <p>- Using lines.<br /> - Going back to 0V before moving to the next pixel<br /> - Using closest pixel instead of doing line per line<br /> - Remanence<br /> - Refresh rate 44100hz</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Script:</h2> <p>This PHP script allows you to transform an animated GIF or a directory of PNG files into a sound wave file.</p> <p>It can be run locally:</p> <pre> php oscillo.php inputfile.gif outputfile.wav</pre> <p>Or from a web page:</p> <p><a href="http://alexou.net/pub/oscilloscope/oscillo.php">http://alexou.net/pub/oscilloscope/oscillo.php</a></p> <p>&nbsp;</p> <p><strong><span style="font-size:16px;"><a href="http://alexou.net/pub/oscilloscope/oscilloscope.zip">View the original script</a></span></strong></p> <p><strong><span style="font-size:16px;"><a href="http://alexou.net/pub/?oscilloscope/oscilloscope-neighbors-new.php">View the new script with dumb path finding</a></span></strong></p> </div><div class="article message"><h2 style="margin-top:0px;">What/Why</h2> <p>Oscilloscopes are cool. What is even cooler is using them to display arbitrary pictures instead of boring waves! We also can use them to write text (emulate a terminal) or maybe even play pong! But for now, let&#39;s focus on the basics of dot drawing using <strong>sound</strong>...</p> <table border="1" cellpadding="5" height="197" style="border-color: rgb(221, 221, 221);" width="516"> <thead> </thead> <tbody> <tr> <td style="width: 153px; border-color: rgb(221, 221, 221);"> <h2 style="margin-top: 0px; text-align: center;"><a class="fancybox" href="http://blog.alexou.net/upload/image/sequential.png"><img alt="sequential-2.png" src="http://blog.alexou.net/upload/image/sequential-2.png?size=150x150" /></a></h2> </td> <td style="width: 154px; text-align: center; border-color: rgb(221, 221, 221);"> <h2 style="margin-top: 0px; text-align: center;"><a class="fancybox" href="http://blog.alexou.net/upload/image/Soundcard_Oscilloscope_2015-01-12_10-10-57.png"><img alt="Soundcard_Oscilloscope_2015-01-12_10-10-57.png" src="http://blog.alexou.net/upload/image/Soundcard_Oscilloscope_2015-01-12_10-10-57.png?size=150x150" /></a></h2> </td> <td style="text-align: center; width: 161px; border-color: rgb(221, 221, 221);"> <h2 style="margin-top: 0px; text-align: center;"><a class="fancybox" href="http://blog.alexou.net/upload/image/face.png"><img alt="face.png" src="http://blog.alexou.net/upload/image/face.png?size=150x150" /></a></h2> </td> </tr> <tr> <td style="width: 153px; border-color: rgb(221, 221, 221); text-align: center;"> <p><strong>Sequential Drawing<br /> with no Persistence</strong></p> </td> <td style="width: 154px; text-align: center; border-color: rgb(221, 221, 221);"> <p><strong>Sequential Drawing</strong><br /> <strong>with Persistence</strong></p> </td> <td style="text-align: center; width: 161px; border-color: rgb(221, 221, 221);"> <p><strong>Dumb Shortest Path</strong></p> </td> </tr> </tbody> </table> <h2 style="margin-top:0px;">&nbsp;</h2> <h2 style="margin-top:0px;">Oscilloscope</h2> <p><a class="fancybox" href="http://blog.alexou.net/upload/image/osc11.gif"><img alt="osc1[1]" src="http://blog.alexou.net/upload/image/osc11.gif?size=150" style="float: left;" /></a><br /> An oscilloscope is a device that allows you to visualize signals (voltages) over time.<br /> When dealing with multiple signals (channels), you usually have three viewing mode: Dual, Add, and Chop. We will work in Dual.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">X-Y</h2> <p>For us the most interesting oscilloscope feature is called X-Y. In this mode you will view a single dot. The horizontal scale will no longer be time. It will be Channel 2&#39;s voltage. The Channel 1 will move the dot up and down according to its input voltage, the Channel 2 will move the dot left and right according to its input voltage. A bit like an Etch&#39;n&#39;Sketch.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Sound as a source</h2> <p><a href="http://blog.alexou.net/upload/image/WJSDpxZ1.png"><img alt="WJSDpxZ[1]" class="alignleft size-thumbnail wp-image-1975" height="114" src="http://blog.alexou.net/upload/image/WJSDpxZ1.png?size=150x114" style="float: left;" width="150" /></a><br /> A speaker creates sound by pulsing air at different frequencies. Sometimes it pushes air (positive voltage), sometimes it pulls air (negative voltage). In other words a speaker is driven by alternating current.</p> <p>By controlling the amplitude of the alternating current (or sound), we will be able to move the dot on the screen.</p> <p>Another key element to our project is stereo sound. Stereo sound means that we have two sound signals: Left and Right, X and Y.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Sound limitations</h2> <p>The oscilloscope has a sampling rate of millions of hertz. In other words it can measure the signals and move the dot accordingly millions of times per seconds, giving us impressive theoretical FPS for whatever we want to draw.</p> <p>BUT, the sampling rate of most digital music player is limited to 48000 hertz (or at best 96000 Hz), greatly limiting our FPS for complex pictures.</p> <p>Sound also have advantages like portability:<br /> - You can generate the sound file and bring it with you on your cellphone to do your demo on any oscilloscope around or share it on the demoscene<br /> - No extra hardware necessary, any sound card will work.</p> <p style="text-align: center;">&nbsp;</p> <h2 style="margin-top:0px;">Drawing Basics</h2> <p>We will move the dot so fast that the eye will be tricked into seeing a full picture.<br /> We set our scales at 1V and we center the dot (X-Y) on the oscilloscope screen. We will use a stereo sound source (two voltages) to move it. Left sound will move it horizontally and right sound will move it vertically. <strong>See first table up this page for an overview</strong>.</p> <p style="text-align: center;"><a class="fancybox" href="http://blog.alexou.net/upload/image/oscillo_face.png"><img alt="oscillo_face.png" src="http://blog.alexou.net/upload/image/oscillo_face.png?size=0" /></a></p> <h3 style="margin-left: 40px;">Drawing Sequentially</h3> <p style="margin-left: 40px;">This technique will draw a complete column (Y) pixel by pixel then advance the row (X), draw a new column, advance row, loop...</p> <p style="margin-left: 40px;">Thanks to Chris I realized that this technique only works if you have an oscilloscope with low display persistence and fair sampling rate.</p> <p style="margin-left: 40px;">If your scope <em>meet </em>these criteria the vertical lines in the image above should be fairly invisible.</p> <p style="margin-left: 40px;">If your oscilloscope <em>doesn&#39;t meet</em> these criteria then dots that shouldn&#39;t be connected together will be connected vertically(red lines in image), creating random lines hiding the picture&#39;s content.</p> <p style="margin-left: 40px;">My first script creates a wave file to draw sequentially. Find it at the end of this article.</p> <h3 style="margin-left: 40px;">Shortest Path Problem</h3> <p style="margin-left: 40px;">A better approach is to use a shortest past or path finding algorithm.</p> <p style="margin-left: 40px;">Basically what we want to do is compute the <a href="https://en.wikipedia.org/wiki/Shortest_path_problem"><u>best(shortest) route possible</u> </a>to connect all our pixels. The dot on screen will follow that route and hopefully minimize the noise (random lines) connecting isolated shapes. There will still be unwanted lines to connect our shapes, similar to a neon sign or cursive writing; but they will usually be thinner and dimmer than the rest of the shapes.</p> <p style="margin-left: 40px;">My second script implements a relatively dumb path finding algorithm. The result is <em>correct</em> for the pictures I tested, but I&#39;m studying <u><a href="https://en.wikipedia.org/wiki/Shortest_path_problem#Algorithms">real algorithms</a></u> and hopefully I&#39;ll do a proper path finding script.&nbsp; Find the current script at the end of this article.</p> <h3 style="margin-left: 40px;">Vector Drawing</h3> <p style="margin-left: 40px;">An elegant solution would be to generate vector graphics instead of raster. Using vectors would allow us to leverage the display persistence to form our shapes. I believe that is how Youscope was done. While it should be possible to transform a simple raster (gif/png) in vectors, it is way beyond my knowledge of image manipulation :).</p> <p>&nbsp;</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Sound Sample</h2> <p>A digital sound sample is a number that represent the amplitude of the audio signal.<br /> That number will represent one pixel coordinate (X or Y).</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Bits per sample</h2> <p>The bits per sample, or bit depth, is the resolution of the sample. With 8 bits, we have 256 amplitudes possible (-127 to +127).</p> <p>Assuming stereo sound at 8 bits, we could draw a picture of 65536 pixels (256x256). Because of output quality and oscilloscope precision, we could benefit of using 16 bit sound while keeping a low resolution and over sample it to make a sharper image.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Sampling rate</h2> <p>The sampling rate is how many samples are recorded or played in one second. Most digital devices have a sampling rate of 48000Hz (CD is 44100Hz). Because we use stereo sound, this means we can move our dot 24000 per second. To trick the eye we need <strong>at least</strong> 10fps, this means that we can only draw an image of 2400 pixels.</p> <p>Considering the oscilloscope&#39;s dot luminosity and our FPS limitation at this resolution, we can skip pixels. One full pixel, one empty pixel. The dot size would fill the voids.<br /> That brings us to 16384 pixels (128x128), or an ability to fill 15% of the screen and refresh it 10 times per second.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Wave</h2> <p>The <a href="http://www.sonicspot.com/guide/wavefiles.html">wave format</a> is perfect for us. We can use arbitrary sampling rate, bits per sample, and channels. Following the header, each channel samples are interlaced. The data look like this: left sample, right sample, left sample, right sample...</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Converting pixels to samples</h2> <p>For simplicity we will assume a 128x128 image with a white background. Anything that is not white will be a pixel to draw.</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">/dev/dsp</h2> <p>- We can use /dev/dsp to stream the wave directly to the sound card by setting a very high sample numbers in the header<br /> <br /> &nbsp;</p> <h2 style="margin-top:0px;">Considerations</h2> <p>- Using lines.<br /> - Going back to 0V before moving to the next pixel<br /> - Using closest pixel instead of doing line per line<br /> - Remanence<br /> - Refresh rate 44100hz</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <h2 style="margin-top:0px;">Script:</h2> <p>This PHP script allows you to transform an animated GIF or a directory of PNG files into a sound wave file.</p> <p>It can be run locally:</p> <pre> php oscillo.php inputfile.gif outputfile.wav</pre> <p>Or from a web page:</p> <p><a href="http://alexou.net/pub/oscilloscope/oscillo.php">http://alexou.net/pub/oscilloscope/oscillo.php</a></p> <p>&nbsp;</p> <p><strong><span style="font-size:16px;"><a href="http://alexou.net/pub/oscilloscope/oscilloscope.zip">View the original script</a></span></strong></p> <p><strong><span style="font-size:16px;"><a href="http://alexou.net/pub/?oscilloscope/oscilloscope-neighbors-new.php">View the new script with dumb path finding</a></span></strong></p> </div>Home voltage monitoring (using OCR)http://blog.alexou.net/?home-voltage-monitoring-using-ocr-2Thu, 21 Feb 2013 14:57:00 -0500Mon, 09 Jun 2014 22:28:18 -0400http://blog.alexou.net/117<div class="article message"><h2 style="margin-top:0px;">What/Why</h2> <p><img src="http://blog.alexou.net/upload/image/voltmeter.png" style="display:none;" /><br /> The goal of this small project is to monitor my home voltage using a voltmeter and a webcam. There are better ways to interface a voltmeter with your computer and here&#39;s two techniques that I wish to cover in future projects:</p> <ol> <li>Interface in serie with the multimeter micro controller using an opto-isolator</li> <li>Build a custom voltage detection device</li> </ol> <h2>Prerequisites</h2> <ul> <li>A computer that is always on (I will use a raspberry pi)</li> <li>A digital multimeter (ideally with a backlight, otherwise plan external lightning)</li> <li>A webcam</li> <li>A SPDT relay if you want to monitor two circuits (Eg X and Y on split-phase supply)</li> </ul> <h2>How it works</h2> <p>&nbsp;</p> <div style="clear:both;"><strong>1. Voltmeter</strong><br /> <a href="http://blog.alexou.net/upload/image/117.jpg"><img alt="117" class="alignleft size-thumbnail wp-image-1905" height="48" src="http://blog.alexou.net/upload/image/117.jpg?size=150x150" style="float: left;" width="48" /></a>I originally did this project using my multimeter but the auto-off feature was triggered even if there was power on the test leads... I eventually got this project working using a <a href="http://www.p3international.com/products/special/p4400/p4400-ce.html">kill-a-watt</a>. Unlike the multimeter, the KAW doesn&#39;t need an external power supply for continuous usage and we can monitor anything the kill-a-watt can report (Amperage or Power for example).</div> <div style="clear:both;">&nbsp;</div> <div style="clear:both;"><strong>2. Display lightning</strong><br /> <a href="http://blog.alexou.net/upload/image/maxxima-mln-10-led-night-light.jpg"><img alt="maxxima-mln-10-led-night-light" class="alignleft size-thumbnail wp-image-1908" height="48" src="http://blog.alexou.net/upload/image/maxxima-mln-10-led-night-light.jpg?size=150x150" style="float: left;" width="48" /></a>The kill-a-watt lacks a backlight but its power plug was ideal to connect a LED night light with the light &quot;dissipator&quot; removed. <p>&nbsp;</p> </div> <div style="clear:both;"><strong>3. Image capture</strong><br /> <a href="http://blog.alexou.net/upload/image/sku_25948_1_small.jpg"><img alt="sku_25948_1_small" class="alignleft size-full wp-image-1899" height="48" src="http://blog.alexou.net/upload/image/sku_25948_1_small.jpg" style="float: left;" width="64" /></a>I attached a <a href="https://dx.com/p/compact-usb-pc-webcam-300k-pixel-25948">cheap webcam</a> to the kill-a-watt using card board and white paper to reflect light(It increased the contrast dramatically). <p>&nbsp;</p> </div> <div style="clear:both;"><strong>4. Data collecting</strong><br /> <a href="http://blog.alexou.net/upload/image/munin.png"><img alt="munin" class="alignleft size-thumbnail wp-image-1881" height="48" src="http://blog.alexou.net/upload/image/munin.png?size=150x150" style="float: left;" width="64" /></a>I hooked the webcam to a <a href="http://raspberrypi.org/">raspberry pi</a> running linux. The raspberry pi also controls the relay(<a href="https://www.sparkfun.com/products/100">JZC-11F</a>) for monitoring two circuits. The capture is done with a tool called fswebcam and the &quot;dumb&quot; OCR is implemented in PHP. Lighttpd allows remote voltage querying. I use my remote munin machine to create graphs (using ocr.php?silent=1). <p>&nbsp;</p> <p>Fswebcam is actually called by the OCR php script in this way:<br /> <code>fswebcam -r 160x120 -S 10 --jpeg 95 --set sharpness=15 --set contrast=60% --set brightness=50% --set &quot;White Balance Temperature&quot;=0 --no-banner --save /tmp/power.jpg</code></p> </div> <div style="clear:both;"> <p><strong>5. The OCR</strong><br /> <a href="http://blog.alexou.net/upload/image/ocr.jpg"><img alt="ocr" class="alignleft size-thumbnail wp-image-1886" height="48" src="http://blog.alexou.net/upload/image/ocr.jpg?size=150x120" style="float: left;" width="64" /></a>I tried several tools for that (like <a href="https://www.unix-ag.uni-kl.de/~auerswal/ssocr/">SSOCR</a>) but for some reason they all failed to detect the digits on my snapshots. I ended up writing a <a href="http://alexou.net/pub/script-collection/ocr.phps">small php script</a> that compares several points to a reference. In other words it will detect if a segment is on or off on a <a href="https://en.wikipedia.org/wiki/Seven-segment_display">7-segment display</a> type.</p> </div></div><div class="article message"><h2 style="margin-top:0px;">What/Why</h2> <p><img src="http://blog.alexou.net/upload/image/voltmeter.png" style="display:none;" /><br /> The goal of this small project is to monitor my home voltage using a voltmeter and a webcam. There are better ways to interface a voltmeter with your computer and here&#39;s two techniques that I wish to cover in future projects:</p> <ol> <li>Interface in serie with the multimeter micro controller using an opto-isolator</li> <li>Build a custom voltage detection device</li> </ol> <h2>Prerequisites</h2> <ul> <li>A computer that is always on (I will use a raspberry pi)</li> <li>A digital multimeter (ideally with a backlight, otherwise plan external lightning)</li> <li>A webcam</li> <li>A SPDT relay if you want to monitor two circuits (Eg X and Y on split-phase supply)</li> </ul> <h2>How it works</h2> <p>&nbsp;</p> <div style="clear:both;"><strong>1. Voltmeter</strong><br /> <a href="http://blog.alexou.net/upload/image/117.jpg"><img alt="117" class="alignleft size-thumbnail wp-image-1905" height="48" src="http://blog.alexou.net/upload/image/117.jpg?size=150x150" style="float: left;" width="48" /></a>I originally did this project using my multimeter but the auto-off feature was triggered even if there was power on the test leads... I eventually got this project working using a <a href="http://www.p3international.com/products/special/p4400/p4400-ce.html">kill-a-watt</a>. Unlike the multimeter, the KAW doesn&#39;t need an external power supply for continuous usage and we can monitor anything the kill-a-watt can report (Amperage or Power for example).</div> <div style="clear:both;">&nbsp;</div> <div style="clear:both;"><strong>2. Display lightning</strong><br /> <a href="http://blog.alexou.net/upload/image/maxxima-mln-10-led-night-light.jpg"><img alt="maxxima-mln-10-led-night-light" class="alignleft size-thumbnail wp-image-1908" height="48" src="http://blog.alexou.net/upload/image/maxxima-mln-10-led-night-light.jpg?size=150x150" style="float: left;" width="48" /></a>The kill-a-watt lacks a backlight but its power plug was ideal to connect a LED night light with the light &quot;dissipator&quot; removed. <p>&nbsp;</p> </div> <div style="clear:both;"><strong>3. Image capture</strong><br /> <a href="http://blog.alexou.net/upload/image/sku_25948_1_small.jpg"><img alt="sku_25948_1_small" class="alignleft size-full wp-image-1899" height="48" src="http://blog.alexou.net/upload/image/sku_25948_1_small.jpg" style="float: left;" width="64" /></a>I attached a <a href="https://dx.com/p/compact-usb-pc-webcam-300k-pixel-25948">cheap webcam</a> to the kill-a-watt using card board and white paper to reflect light(It increased the contrast dramatically). <p>&nbsp;</p> </div> <div style="clear:both;"><strong>4. Data collecting</strong><br /> <a href="http://blog.alexou.net/upload/image/munin.png"><img alt="munin" class="alignleft size-thumbnail wp-image-1881" height="48" src="http://blog.alexou.net/upload/image/munin.png?size=150x150" style="float: left;" width="64" /></a>I hooked the webcam to a <a href="http://raspberrypi.org/">raspberry pi</a> running linux. The raspberry pi also controls the relay(<a href="https://www.sparkfun.com/products/100">JZC-11F</a>) for monitoring two circuits. The capture is done with a tool called fswebcam and the &quot;dumb&quot; OCR is implemented in PHP. Lighttpd allows remote voltage querying. I use my remote munin machine to create graphs (using ocr.php?silent=1). <p>&nbsp;</p> <p>Fswebcam is actually called by the OCR php script in this way:<br /> <code>fswebcam -r 160x120 -S 10 --jpeg 95 --set sharpness=15 --set contrast=60% --set brightness=50% --set &quot;White Balance Temperature&quot;=0 --no-banner --save /tmp/power.jpg</code></p> </div> <div style="clear:both;"> <p><strong>5. The OCR</strong><br /> <a href="http://blog.alexou.net/upload/image/ocr.jpg"><img alt="ocr" class="alignleft size-thumbnail wp-image-1886" height="48" src="http://blog.alexou.net/upload/image/ocr.jpg?size=150x120" style="float: left;" width="64" /></a>I tried several tools for that (like <a href="https://www.unix-ag.uni-kl.de/~auerswal/ssocr/">SSOCR</a>) but for some reason they all failed to detect the digits on my snapshots. I ended up writing a <a href="http://alexou.net/pub/script-collection/ocr.phps">small php script</a> that compares several points to a reference. In other words it will detect if a segment is on or off on a <a href="https://en.wikipedia.org/wiki/Seven-segment_display">7-segment display</a> type.</p> </div></div>TrueCrypt vs DiskCryptor on SSD (Windows 7 FDE)http://blog.alexou.net/?truecrypt-vs-diskcryptor-on-ssd-windows-7-fdFri, 01 Feb 2013 18:35:00 -0500Mon, 09 Jun 2014 18:22:55 -0400http://blog.alexou.net/116<div class="article message"><p>This post will expose benchmarks I&#39;ve ran on Windows 7 Pro running a mSata M4 SSD. Full disk encryption is accomplished with <strong>DiskCryptor 1.0.757.115</strong> and <strong>TrueCrypt 7.1a</strong>. If you don&#39;t care about my intro, <a href="http://blog.alexou.net/truecrypt-vs-diskcryptor-on-ssd-windows-7-fd#bench">jump to the pictures</a>!</p> <p>For a few years I&#39;ve seen a lot of disinformation regarding SSD software encryption on the Internet. So let&#39;s make it clear:</p> <ul> <li>Yes, wear leveling might expose unencrypted data on the drive, that is why it is important to encrypt the drive <strong>before</strong> moving secure data to it.</li> <li>No, encryption will not shorten the useful life of the drive. Traditionally, the operating system works at the sector level. Change one single bit and the whole sector needs to be rewritten. A sector is usually 512 bits. Encryption is usually performed on blocks ranging from 128 to 512 bits.</li> <li>Yes, hibernation time will suck big time. With both tools.</li> <li>Bonus: You&#39;ll be disappointed if you buy a <strong>Sandforce</strong> based ssd hoping to get announced performance. Sandforce compresses data to achieve its impressible performance. Sadly encryption is incompressible.</li> </ul> <p>I found two issues in DiskCryptor: Its filter driver approach breaks Resmon disk access monitoring, and encrypted <strong>hard drives</strong> never spin down. I&#39;ve reported these in 2008 and it&#39;s not yet fixed (if fixable). Also the author use lowercase &quot;mb&quot; &quot;gb&quot; while it&#39;s &quot;MB&quot; &quot;GB&quot;. Nitpicking, but the guy is supposedly knowledgeable about disk drivers and cryptography...</p> <h3>Test protocol:</h3> <ol> <li>The SSD is installed in the mSata port (only sata II) of a Thinkpad x220 i7 and it has been filled with random data to make sure all sector were written to at least once.</li> <li>Windows 7 Pro was installed on the SSD.</li> <li>Superfetch, Windows Search, Media streamer, and Defragmenter were disabled.</li> <li>SSD optimizations were enabled in both encryption software.</li> <li>I&#39;ve in turn encrypted and decrypted the ssd with truecrypt and diskcryptor using <strong>hardware accelerated AES</strong>.</li> </ol> <p>The benchmarks were done with <strong>AS SSD Benchmark 1.7.4739</strong> because it is file based, directly testing the underlying encryption.</p> <p>Each benchmark was ran three times, with reboot between each run. For this post, I picked only the best performance in each category because the results were very consistent with a difference of at most 5%.</p> <p>&nbsp;</p> <p><a id="bench"> </a></p> <h3>No encryption</h3> <p><a href="http://blog.alexou.net/upload/image/No-encryption-2.png"><img alt="No encryption-2" class="size-full wp-image-1827" height="501" src="http://blog.alexou.net/upload/image/No-encryption-2.png" width="503" /></a></p> <h3>TrueCrypt</h3> <p><a href="http://blog.alexou.net/upload/image/truecrypt-3.png"><img alt="truecrypt-3" class="size-full wp-image-1828" height="501" src="http://blog.alexou.net/upload/image/truecrypt-3.png" width="503" /></a></p> <h3>DiskCryptor</h3> <p><a href="http://blog.alexou.net/upload/image/DiskCryptor-1.png"><img alt="DiskCryptor-1" class="size-full wp-image-1826" height="501" src="http://blog.alexou.net/upload/image/DiskCryptor-1.png" width="503" /></a></p> <p>As we can see DiskCryptor is pretty darn close to native performance while TrueCrypt doesn&#39;t scale very well to threaded random accesses. With both results you&#39;d get that snappy feeling typical for SSDs, but for certain applications DiskCryptor certainly has an edge.</p></div><div class="article message"><p>This post will expose benchmarks I&#39;ve ran on Windows 7 Pro running a mSata M4 SSD. Full disk encryption is accomplished with <strong>DiskCryptor 1.0.757.115</strong> and <strong>TrueCrypt 7.1a</strong>. If you don&#39;t care about my intro, <a href="http://blog.alexou.net/truecrypt-vs-diskcryptor-on-ssd-windows-7-fd#bench">jump to the pictures</a>!</p> <p>For a few years I&#39;ve seen a lot of disinformation regarding SSD software encryption on the Internet. So let&#39;s make it clear:</p> <ul> <li>Yes, wear leveling might expose unencrypted data on the drive, that is why it is important to encrypt the drive <strong>before</strong> moving secure data to it.</li> <li>No, encryption will not shorten the useful life of the drive. Traditionally, the operating system works at the sector level. Change one single bit and the whole sector needs to be rewritten. A sector is usually 512 bits. Encryption is usually performed on blocks ranging from 128 to 512 bits.</li> <li>Yes, hibernation time will suck big time. With both tools.</li> <li>Bonus: You&#39;ll be disappointed if you buy a <strong>Sandforce</strong> based ssd hoping to get announced performance. Sandforce compresses data to achieve its impressible performance. Sadly encryption is incompressible.</li> </ul> <p>I found two issues in DiskCryptor: Its filter driver approach breaks Resmon disk access monitoring, and encrypted <strong>hard drives</strong> never spin down. I&#39;ve reported these in 2008 and it&#39;s not yet fixed (if fixable). Also the author use lowercase &quot;mb&quot; &quot;gb&quot; while it&#39;s &quot;MB&quot; &quot;GB&quot;. Nitpicking, but the guy is supposedly knowledgeable about disk drivers and cryptography...</p> <h3>Test protocol:</h3> <ol> <li>The SSD is installed in the mSata port (only sata II) of a Thinkpad x220 i7 and it has been filled with random data to make sure all sector were written to at least once.</li> <li>Windows 7 Pro was installed on the SSD.</li> <li>Superfetch, Windows Search, Media streamer, and Defragmenter were disabled.</li> <li>SSD optimizations were enabled in both encryption software.</li> <li>I&#39;ve in turn encrypted and decrypted the ssd with truecrypt and diskcryptor using <strong>hardware accelerated AES</strong>.</li> </ol> <p>The benchmarks were done with <strong>AS SSD Benchmark 1.7.4739</strong> because it is file based, directly testing the underlying encryption.</p> <p>Each benchmark was ran three times, with reboot between each run. For this post, I picked only the best performance in each category because the results were very consistent with a difference of at most 5%.</p> <p>&nbsp;</p> <p><a id="bench"> </a></p> <h3>No encryption</h3> <p><a href="http://blog.alexou.net/upload/image/No-encryption-2.png"><img alt="No encryption-2" class="size-full wp-image-1827" height="501" src="http://blog.alexou.net/upload/image/No-encryption-2.png" width="503" /></a></p> <h3>TrueCrypt</h3> <p><a href="http://blog.alexou.net/upload/image/truecrypt-3.png"><img alt="truecrypt-3" class="size-full wp-image-1828" height="501" src="http://blog.alexou.net/upload/image/truecrypt-3.png" width="503" /></a></p> <h3>DiskCryptor</h3> <p><a href="http://blog.alexou.net/upload/image/DiskCryptor-1.png"><img alt="DiskCryptor-1" class="size-full wp-image-1826" height="501" src="http://blog.alexou.net/upload/image/DiskCryptor-1.png" width="503" /></a></p> <p>As we can see DiskCryptor is pretty darn close to native performance while TrueCrypt doesn&#39;t scale very well to threaded random accesses. With both results you&#39;d get that snappy feeling typical for SSDs, but for certain applications DiskCryptor certainly has an edge.</p></div>Javascript IRC WebClienthttp://blog.alexou.net/?irc-webclientTue, 18 Sep 2012 17:56:00 -0400Thu, 19 Jun 2014 06:04:37 -0400http://blog.alexou.net/175<div class="article message"><h2 style="margin-top: 0px;">What/Why</h2> <p><a class="fancybox" href="http://blog.alexou.net/upload/image/Mein-chat_1348790633110.png"><img alt="Mein-chat_1348790633110.png" src="http://blog.alexou.net/upload/image/Mein-chat_1348790633110.png?size=1" style="float: left;" /></a>I present you <a href="https://alexou.net/pub/?meinchat">MeinChat</a>, an irc client written in javascript with a little help from the PHP backend.</p> <p>The client side, written in javascript, manages the IRC protocol and the html interface. It aims to implement the complete IRC protocol client side. The server side exchanges messages between the client(HTTP) and the server (Raw data). It is also a small http server serving the static files (javascript, html) to the client and an identd server giving a unique username to the server for each client.</p> <p>&nbsp;</p> <p><a class="fancybox" href="http://blog.alexou.net/upload/image/server-select.png"><img alt="server-select.png" src="http://blog.alexou.net/upload/image/server-select.png?size=1" style="float: right;" /></a>As of now it does not implement the complete IRC protocol, but it is very usable. It can connect to any irc network or bouncer and so long that you know basic irc commands like /nick /join /part, you will be able to join any network and have a great time chatting!</p> <p>One interesting feature is that you can make a list of servers</p> <p>clients can select from a drop down on the connect screen. There is two parts to this client: the backend and the client. The whole IRC protocole is implemented client side in javascript. The backend is basically The backend also implements an identd server. The client interface is fully customizable with CSS.</p> <h2>Prerequisites</h2> <ul> <li>PHP 5.3</li> <li>A modern web browser with javascript support</li> </ul> <p>The back end should work on any platform where PHP can run. <strong>It can&#39;t run correctly from a webserver (apache module/cgi), it MUST be run from the command line.</strong></p> <h2>How to use</h2> <p>Download the package. Edit config.php to your liking. Then run <strong>php server.php</strong> FROM THE COMMAND LINE and visit http://bind_ip:bind_port/ (default http://yourip:8080/).<br /> <strong>Demo: <a href="https://alexou.net/irc/" style="color: red;">https://alexou.net/irc/</a></strong></p> <h2>To do</h2> <ul> <li>Admin commands (reload, disconnect, die, etc..)</li> <li>History in the inputbox (up/down arrow)</li> <li>Tab completion</li> <li>Auto linking</li> </ul> <h2>Downloads</h2> <p><a href="https://alexou.net/pub/?meinchat">https://alexou.net/pub/?meinchat</a></p></div><div class="article message"><h2 style="margin-top: 0px;">What/Why</h2> <p><a class="fancybox" href="http://blog.alexou.net/upload/image/Mein-chat_1348790633110.png"><img alt="Mein-chat_1348790633110.png" src="http://blog.alexou.net/upload/image/Mein-chat_1348790633110.png?size=1" style="float: left;" /></a>I present you <a href="https://alexou.net/pub/?meinchat">MeinChat</a>, an irc client written in javascript with a little help from the PHP backend.</p> <p>The client side, written in javascript, manages the IRC protocol and the html interface. It aims to implement the complete IRC protocol client side. The server side exchanges messages between the client(HTTP) and the server (Raw data). It is also a small http server serving the static files (javascript, html) to the client and an identd server giving a unique username to the server for each client.</p> <p>&nbsp;</p> <p><a class="fancybox" href="http://blog.alexou.net/upload/image/server-select.png"><img alt="server-select.png" src="http://blog.alexou.net/upload/image/server-select.png?size=1" style="float: right;" /></a>As of now it does not implement the complete IRC protocol, but it is very usable. It can connect to any irc network or bouncer and so long that you know basic irc commands like /nick /join /part, you will be able to join any network and have a great time chatting!</p> <p>One interesting feature is that you can make a list of servers</p> <p>clients can select from a drop down on the connect screen. There is two parts to this client: the backend and the client. The whole IRC protocole is implemented client side in javascript. The backend is basically The backend also implements an identd server. The client interface is fully customizable with CSS.</p> <h2>Prerequisites</h2> <ul> <li>PHP 5.3</li> <li>A modern web browser with javascript support</li> </ul> <p>The back end should work on any platform where PHP can run. <strong>It can&#39;t run correctly from a webserver (apache module/cgi), it MUST be run from the command line.</strong></p> <h2>How to use</h2> <p>Download the package. Edit config.php to your liking. Then run <strong>php server.php</strong> FROM THE COMMAND LINE and visit http://bind_ip:bind_port/ (default http://yourip:8080/).<br /> <strong>Demo: <a href="https://alexou.net/irc/" style="color: red;">https://alexou.net/irc/</a></strong></p> <h2>To do</h2> <ul> <li>Admin commands (reload, disconnect, die, etc..)</li> <li>History in the inputbox (up/down arrow)</li> <li>Tab completion</li> <li>Auto linking</li> </ul> <h2>Downloads</h2> <p><a href="https://alexou.net/pub/?meinchat">https://alexou.net/pub/?meinchat</a></p></div>fkcd.ca : File hosting and Encrypted Pasteshttp://blog.alexou.net/?fkcd-ca-file-hostingSat, 15 Sep 2012 03:38:00 -0400Mon, 24 Sep 2018 10:40:13 -0400http://blog.alexou.net/932<div class="article message"><p>It supports albums, pasting, json api, end-to-end encryption. Expiration is customizable and supports burn after reading. No access logs is kept but each file has a download counter and a last access timestamp (for expiration).</p> </div><div class="article message"><p>It supports albums, pasting, json api, end-to-end encryption. Expiration is customizable and supports burn after reading. No access logs is kept but each file has a download counter and a last access timestamp (for expiration).</p> </div>Lighttpd and W3 Total Cachehttp://blog.alexou.net/?lighttpd-w3-total-cacheSun, 02 Sep 2012 09:33:00 -0400Mon, 01 Dec 2014 19:22:44 -0500http://blog.alexou.net/319<div class="article message"><p>As I was looking for a javascript and css minification plugin solution to reduce the size and number of requests needed to view this page, I stumbled upon <a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a>. Its feature set is impressive, it does static file caching and &quot;<a href="https://en.wikipedia.org/wiki/Minification_(programming)#Web_development">minifying</a>&quot;, exactly what I wanted.</p> <p>However, its setup was not as straightforward as Wp Super Cache. See, with this kind of caching tool what you really want is a way to serve static cached files directly from the web server. PHP can serve cached files, but it is much slower (although faster than re-generating the page). On a properly configured server and caching tool, it usually go as this:</p> <p><strong>IF</strong> visitor has a login cookie <strong>OR</strong> the url contains a query string <em>(?param=value)</em>:<br /> the visitor might require specific content, call php to serve a dynamic page<br /> <strong>ELSE IF</strong> a static version of the requested url exists:<br /> serve it<br /> <strong>ELSE</strong><br /> call php who will generate the missing static page.</p> <p>Wp Super Cache tries to detect if Apache&#39;s mod_rewrite is enabled, but we can force it to use static file caching anyway. This is not possible with W3 Total Cache and it refuses to create static files unless it detects apache, nginx or litespeed. I was a bit annoyed that they decided for me what my server could or couldn&#39;t do. But the pros of the tool were enough for me to keep digging.</p> <p>First I tried to create the test rewrite rules present in nginx or .htaccess example files, maybe W3 would see this as a sign of rewrite support:</p> <pre> url.rewrite-if-not-file = ( &quot;^/wp-content/w3tc/min/w3tc_rewrite_test$&quot; =&gt; &quot;wp-content/w3tc/min/index.php?w3tc_rewrite_test=1&quot;, &quot;^(.*\/)?w3tc_rewrite_test$&quot; =&gt; &quot;$1?w3tc_rewrite_test=1&quot;, ) </pre> <p>But <strong>&quot;Disk: Enhanced&quot;</strong> option was still grayed out. Apparently it doesn&#39;t even care about its own test rules, so they can be forgotten. Next simple solution was to trick W3 and make it believe I was running nginx. This is done by adding a single line to your wp-config.php:</p> <pre> $_SERVER[&#39;SERVER_SOFTWARE&#39;] = &#39;nginx 2.2&#39;;</pre> <p>And it worked! Usually it is not good practice to manipulate PHP&#39;s super globals, but I suggest it anyway because it&#39;s easier to maintain. If you were to edit W3, you&#39;d have to remember to edit it every time it is updated.</p> <p>Now that we fooled W3, we can enable <strong>&quot;Disk: Enhanced&quot;</strong> option for <strong>Page Cache</strong> and <strong>&quot;Disk&quot;</strong> for <strong>Minify</strong>.</p> <p>Only thing missing to make it all work are the rewrite rules (Note: they must be inside your virtual host if you have one). One to generate missing minified files and one to serve cached pages.</p> <pre> server.error-handler-404 = &quot;index.php&quot; <em>#minify doesn&#39;t depend on cookies</em> url.rewrite-if-not-file = ( &quot;^/wp-content/w3tc/min/(.+\.(css|js))$&quot; =&gt; &quot;wp-content/w3tc/min/index.php?file=$1&quot;) $HTTP[&quot;cookie&quot;] !~ &quot;^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$&quot; { url.rewrite-once = ( &quot;^/wp-admin(.*)(?:\?(.*))?$&quot; =&gt; &quot;wp-admin$1?$2&quot; ) url.rewrite-if-not-file += (&quot;^/([^\?]*)$&quot; =&gt; &quot;wp-content/w3tc/pgcache/$1/_index.html&quot;) } </pre> <p>This is not a complete 1:1 translation of W3&#39;s nginx rewrite rules, however it was all I needed. If you have problems, take a look at the nginx.conf file generated by W3 Total Cache in your base directory, you might use a feature that I do not.</p> </div><div class="article message"><p>As I was looking for a javascript and css minification plugin solution to reduce the size and number of requests needed to view this page, I stumbled upon <a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a>. Its feature set is impressive, it does static file caching and &quot;<a href="https://en.wikipedia.org/wiki/Minification_(programming)#Web_development">minifying</a>&quot;, exactly what I wanted.</p> <p>However, its setup was not as straightforward as Wp Super Cache. See, with this kind of caching tool what you really want is a way to serve static cached files directly from the web server. PHP can serve cached files, but it is much slower (although faster than re-generating the page). On a properly configured server and caching tool, it usually go as this:</p> <p><strong>IF</strong> visitor has a login cookie <strong>OR</strong> the url contains a query string <em>(?param=value)</em>:<br /> the visitor might require specific content, call php to serve a dynamic page<br /> <strong>ELSE IF</strong> a static version of the requested url exists:<br /> serve it<br /> <strong>ELSE</strong><br /> call php who will generate the missing static page.</p> <p>Wp Super Cache tries to detect if Apache&#39;s mod_rewrite is enabled, but we can force it to use static file caching anyway. This is not possible with W3 Total Cache and it refuses to create static files unless it detects apache, nginx or litespeed. I was a bit annoyed that they decided for me what my server could or couldn&#39;t do. But the pros of the tool were enough for me to keep digging.</p> <p>First I tried to create the test rewrite rules present in nginx or .htaccess example files, maybe W3 would see this as a sign of rewrite support:</p> <pre> url.rewrite-if-not-file = ( &quot;^/wp-content/w3tc/min/w3tc_rewrite_test$&quot; =&gt; &quot;wp-content/w3tc/min/index.php?w3tc_rewrite_test=1&quot;, &quot;^(.*\/)?w3tc_rewrite_test$&quot; =&gt; &quot;$1?w3tc_rewrite_test=1&quot;, ) </pre> <p>But <strong>&quot;Disk: Enhanced&quot;</strong> option was still grayed out. Apparently it doesn&#39;t even care about its own test rules, so they can be forgotten. Next simple solution was to trick W3 and make it believe I was running nginx. This is done by adding a single line to your wp-config.php:</p> <pre> $_SERVER[&#39;SERVER_SOFTWARE&#39;] = &#39;nginx 2.2&#39;;</pre> <p>And it worked! Usually it is not good practice to manipulate PHP&#39;s super globals, but I suggest it anyway because it&#39;s easier to maintain. If you were to edit W3, you&#39;d have to remember to edit it every time it is updated.</p> <p>Now that we fooled W3, we can enable <strong>&quot;Disk: Enhanced&quot;</strong> option for <strong>Page Cache</strong> and <strong>&quot;Disk&quot;</strong> for <strong>Minify</strong>.</p> <p>Only thing missing to make it all work are the rewrite rules (Note: they must be inside your virtual host if you have one). One to generate missing minified files and one to serve cached pages.</p> <pre> server.error-handler-404 = &quot;index.php&quot; <em>#minify doesn&#39;t depend on cookies</em> url.rewrite-if-not-file = ( &quot;^/wp-content/w3tc/min/(.+\.(css|js))$&quot; =&gt; &quot;wp-content/w3tc/min/index.php?file=$1&quot;) $HTTP[&quot;cookie&quot;] !~ &quot;^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$&quot; { url.rewrite-once = ( &quot;^/wp-admin(.*)(?:\?(.*))?$&quot; =&gt; &quot;wp-admin$1?$2&quot; ) url.rewrite-if-not-file += (&quot;^/([^\?]*)$&quot; =&gt; &quot;wp-content/w3tc/pgcache/$1/_index.html&quot;) } </pre> <p>This is not a complete 1:1 translation of W3&#39;s nginx rewrite rules, however it was all I needed. If you have problems, take a look at the nginx.conf file generated by W3 Total Cache in your base directory, you might use a feature that I do not.</p> </div>Vidéotron IPv6 6rd with Tomatohttp://blog.alexou.net/?videotron-ipv6-6rd-with-tomatoThu, 30 Aug 2012 02:24:00 -0400Mon, 12 Jan 2015 11:04:16 -0500http://blog.alexou.net/426<div class="article message"><h2 style="margin-top:0px;">What/Why</h2> <p><img src="http://blog.alexou.net/upload/image/videotron.png" style="display:none;" /><span style="color:red;font-weight:bold">Update: See end of post for easier way to get IPv6!</span><br /> <br /> <br /> Ever since my ISP announced their IPv6 beta, I&#39;ve wanted to use it. They chose a <a href="https://en.wikipedia.org/wiki/IPv6_rapid_deployment#Current_usage" target="_blank">recent</a> protocol for their offering: 6rd. Support for this protocol is very limited among home routers and I&#39;m not ready to give up on the advanced features found in custom firmwares.</p> <p><a href="https://tools.ietf.org/html/rfc5969" target="_blank">6rd</a> is basically a 6to4 tunnel for which we receive configuration through dhcp by enabling a flag in the request we send to our ISP. Instead of using public anycast relays, the ISP sends you the IPv4 of his own relay. And instead of using the standard 6to4 prefix 2002::/16, the ISP sends you one of his own prefix that you must combine with part of your IPv4 address to create your assigned IPv6 prefix.</p> <p>In theory calculation of our assigned prefix with the info received via dhcp is easy: If the assigned prefix length is a multiple of 8 (ex: Comcast&#39;s /64), it&#39;s easy, transform your IPv4 to hexadecimal with printf and append it to ISP&#39;s prefix. But if the assigned prefix length is not a multiple of 8 (Vid&eacute;otron&#39;s /60), we must work at the binary level and this is no fun with the limited busybox sh! (See the &quot;Calculating your settings&quot; in the log below to visualize how the combination is done)</p> <p><a href="https://alexou.net/pub/script-collection/tomato-6rd.sh" target="_blank">The script</a> is a proof of concept tested only with my own ISP and router(Toasman miniipv6). It retrieves the 6rd information with udhcpc and it configures your router accordingly (alternatively it can tell you the values you need to populate on the gui in 6in4 tunnel section without touching your configuration). It may be desirable to create the tunsit/tunnel manually with 6rd in mind, but I thought using existing 6in4 gui capability was easier for most people.</p> <h2>Prerequisites</h2> <ul> <li>The script will help you retrieves correct values to configure a ipv6 tunnel on any firmware (openwrt, dd-wrt, <a href="http://tomatousb.org/mods">tomatousb mods</a>) with a patched udhcpc and ipv6 support. Auto-configuration will only work on <a href="http://www.4shared.com/dir/v1BuINP3/Toastman_Builds.html">Toastman&#39;s firmware</a> or one of its cousins (shibby, Teaman, etc...).</li> </ul> <h2><span style="color: #000000;">How to use</span></h2> <p>Easiest way:</p> <pre style="padding-left: 20px;"> #SSH to your router: root@tomato# cd /tmp root@tomato# wget http://alexou.net/pub/script-collection/tomato-6rd.sh root@tomato# chmod +x tomato-6rd.sh root@tomato# ./tomato-6rd.sh</pre> <p><br /> <em>Note: The script will have to be rerun every time your IPv4 changes (In Vid&eacute;otron&#39;s case it&#39;s almost never, unless your router&#39;s MAC changes.)</em></p> <h2>Real run output</h2> <pre> <code>root@tomato:/tmp/home/root# /tmp/6rd.sh udhcpc (v1.18.5) started I&#39;m working as expected! Sending discover... Sending select for 96.20.41.45... Lease of 96.20.41.45 obtained, lease time 83700 Bound...6rd :) ip6rd 14 42 2607:FA48:6E00:0000:0000:0000:0000:0000 96.23.219.1 ip6rd_ipv4masklen 14 ip6rd_6rdprefixlen 42 ip6rd_6rdprefix 2607:FA48:6E00:0000:0000:0000:0000:0000 ip6rd_6rdbripv4address 96.23.219.1 -------------------------- Calculating your settings: bin_ip6rd_6rdprefix = [<span style="color: #008000;">001001100000011111111010010010000110111000</span>]00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 bin_wanip = 01100000000101[<span style="color: #008000;">000010100100101101</span>] bin_client_prefix = <span style="color: #008000;">001001100000011111111010010010000110111000000010100100101101</span> -------------------------- 6in4 static tunnel settings: Assigned / Routed Prefix = 2607:FA48:6E02:92D0:: Prefix Length = 60 Router IPv6 Address = Default Enable Router Advertisements = yes Tunnel Remote Endpoint (IPv4 Address) = 96.23.219.1 Tunnel Client IPv6 Address = 2607:FA48:6E02:92D0:: / 60 Do you want me to configure it for you? [y/n]y Applying settings...done Do you want to commit to nvram now? (Say no if you are testing) [y/n]n Restarting network.................................................................................Killed ......................................... Done. root@tomato:/tmp/home/root# ping6 ipv6.google.com PING ipv6.google.com (2607:f8b0:4002:802::1012): 56 data bytes 64 bytes from 2607:f8b0:4002:802::1012: seq=0 ttl=55 time=41.180 ms 64 bytes from 2607:f8b0:4002:802::1012: seq=1 ttl=55 time=40.246 ms 64 bytes from 2607:f8b0:4002:802::1012: seq=2 ttl=55 time=40.457 ms 64 bytes from 2607:f8b0:4002:802::1012: seq=3 ttl=55 time=40.468 ms --- ipv6.google.com ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 40.246/40.587/41.180 ms</code></pre> <h2><span style="color: #000000;">Download</span></h2> <p><a href="http://alexou.net/pub/script-collection/tomato-6rd.sh">http://alexou.net/pub/script-collection/tomato-6rd.sh</a></p> <h2><span style="color: #000000;">DD-WRT Version</span></h2> <p>Alexandre Blanchette made changes to the script to make it compatible with DD-WRT, you can download his version there: <a href="https://fc.csvdc.qc.ca/~blancha/ddwrt-6rd.txt">https://fc.csvdc.qc.ca/~blancha/ddwrt-6rd.txt</a>. I also mirrored it there: <a href="https://alexou.net/pub/script-collection/ddwrt-6rd.txt">https://alexou.net/pub/script-collection/ddwrt-6rd.txt</a></p> <h2>Update: Shibby</h2> <p>A reader sent me good news. Apparently Shibby firmware, version 100 up to 108, supports 6rd natively and have working RA! Why version 108? Because newer versions use dnsmasq for RA announcements and for some reason it doesn&#39;t work with Vid&eacute;otron IPv6. Version 108 or earlier use radvd.</p> <p>You can see the changelog here: <a href="http://tomato.groov.pl/?page_id=78">http://tomato.groov.pl/?page_id=78</a><br /> You can download the firmware here: <a href="http://tomato.groov.pl/?page_id=164">http://tomato.groov.pl/?page_id=164</a></p> </div><div class="article message"><h2 style="margin-top:0px;">What/Why</h2> <p><img src="http://blog.alexou.net/upload/image/videotron.png" style="display:none;" /><span style="color:red;font-weight:bold">Update: See end of post for easier way to get IPv6!</span><br /> <br /> <br /> Ever since my ISP announced their IPv6 beta, I&#39;ve wanted to use it. They chose a <a href="https://en.wikipedia.org/wiki/IPv6_rapid_deployment#Current_usage" target="_blank">recent</a> protocol for their offering: 6rd. Support for this protocol is very limited among home routers and I&#39;m not ready to give up on the advanced features found in custom firmwares.</p> <p><a href="https://tools.ietf.org/html/rfc5969" target="_blank">6rd</a> is basically a 6to4 tunnel for which we receive configuration through dhcp by enabling a flag in the request we send to our ISP. Instead of using public anycast relays, the ISP sends you the IPv4 of his own relay. And instead of using the standard 6to4 prefix 2002::/16, the ISP sends you one of his own prefix that you must combine with part of your IPv4 address to create your assigned IPv6 prefix.</p> <p>In theory calculation of our assigned prefix with the info received via dhcp is easy: If the assigned prefix length is a multiple of 8 (ex: Comcast&#39;s /64), it&#39;s easy, transform your IPv4 to hexadecimal with printf and append it to ISP&#39;s prefix. But if the assigned prefix length is not a multiple of 8 (Vid&eacute;otron&#39;s /60), we must work at the binary level and this is no fun with the limited busybox sh! (See the &quot;Calculating your settings&quot; in the log below to visualize how the combination is done)</p> <p><a href="https://alexou.net/pub/script-collection/tomato-6rd.sh" target="_blank">The script</a> is a proof of concept tested only with my own ISP and router(Toasman miniipv6). It retrieves the 6rd information with udhcpc and it configures your router accordingly (alternatively it can tell you the values you need to populate on the gui in 6in4 tunnel section without touching your configuration). It may be desirable to create the tunsit/tunnel manually with 6rd in mind, but I thought using existing 6in4 gui capability was easier for most people.</p> <h2>Prerequisites</h2> <ul> <li>The script will help you retrieves correct values to configure a ipv6 tunnel on any firmware (openwrt, dd-wrt, <a href="http://tomatousb.org/mods">tomatousb mods</a>) with a patched udhcpc and ipv6 support. Auto-configuration will only work on <a href="http://www.4shared.com/dir/v1BuINP3/Toastman_Builds.html">Toastman&#39;s firmware</a> or one of its cousins (shibby, Teaman, etc...).</li> </ul> <h2><span style="color: #000000;">How to use</span></h2> <p>Easiest way:</p> <pre style="padding-left: 20px;"> #SSH to your router: root@tomato# cd /tmp root@tomato# wget http://alexou.net/pub/script-collection/tomato-6rd.sh root@tomato# chmod +x tomato-6rd.sh root@tomato# ./tomato-6rd.sh</pre> <p><br /> <em>Note: The script will have to be rerun every time your IPv4 changes (In Vid&eacute;otron&#39;s case it&#39;s almost never, unless your router&#39;s MAC changes.)</em></p> <h2>Real run output</h2> <pre> <code>root@tomato:/tmp/home/root# /tmp/6rd.sh udhcpc (v1.18.5) started I&#39;m working as expected! Sending discover... Sending select for 96.20.41.45... Lease of 96.20.41.45 obtained, lease time 83700 Bound...6rd :) ip6rd 14 42 2607:FA48:6E00:0000:0000:0000:0000:0000 96.23.219.1 ip6rd_ipv4masklen 14 ip6rd_6rdprefixlen 42 ip6rd_6rdprefix 2607:FA48:6E00:0000:0000:0000:0000:0000 ip6rd_6rdbripv4address 96.23.219.1 -------------------------- Calculating your settings: bin_ip6rd_6rdprefix = [<span style="color: #008000;">001001100000011111111010010010000110111000</span>]00000000000000000000000000000000000000000000000000000000000000000000000000000000000000 bin_wanip = 01100000000101[<span style="color: #008000;">000010100100101101</span>] bin_client_prefix = <span style="color: #008000;">001001100000011111111010010010000110111000000010100100101101</span> -------------------------- 6in4 static tunnel settings: Assigned / Routed Prefix = 2607:FA48:6E02:92D0:: Prefix Length = 60 Router IPv6 Address = Default Enable Router Advertisements = yes Tunnel Remote Endpoint (IPv4 Address) = 96.23.219.1 Tunnel Client IPv6 Address = 2607:FA48:6E02:92D0:: / 60 Do you want me to configure it for you? [y/n]y Applying settings...done Do you want to commit to nvram now? (Say no if you are testing) [y/n]n Restarting network.................................................................................Killed ......................................... Done. root@tomato:/tmp/home/root# ping6 ipv6.google.com PING ipv6.google.com (2607:f8b0:4002:802::1012): 56 data bytes 64 bytes from 2607:f8b0:4002:802::1012: seq=0 ttl=55 time=41.180 ms 64 bytes from 2607:f8b0:4002:802::1012: seq=1 ttl=55 time=40.246 ms 64 bytes from 2607:f8b0:4002:802::1012: seq=2 ttl=55 time=40.457 ms 64 bytes from 2607:f8b0:4002:802::1012: seq=3 ttl=55 time=40.468 ms --- ipv6.google.com ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 40.246/40.587/41.180 ms</code></pre> <h2><span style="color: #000000;">Download</span></h2> <p><a href="http://alexou.net/pub/script-collection/tomato-6rd.sh">http://alexou.net/pub/script-collection/tomato-6rd.sh</a></p> <h2><span style="color: #000000;">DD-WRT Version</span></h2> <p>Alexandre Blanchette made changes to the script to make it compatible with DD-WRT, you can download his version there: <a href="https://fc.csvdc.qc.ca/~blancha/ddwrt-6rd.txt">https://fc.csvdc.qc.ca/~blancha/ddwrt-6rd.txt</a>. I also mirrored it there: <a href="https://alexou.net/pub/script-collection/ddwrt-6rd.txt">https://alexou.net/pub/script-collection/ddwrt-6rd.txt</a></p> <h2>Update: Shibby</h2> <p>A reader sent me good news. Apparently Shibby firmware, version 100 up to 108, supports 6rd natively and have working RA! Why version 108? Because newer versions use dnsmasq for RA announcements and for some reason it doesn&#39;t work with Vid&eacute;otron IPv6. Version 108 or earlier use radvd.</p> <p>You can see the changelog here: <a href="http://tomato.groov.pl/?page_id=78">http://tomato.groov.pl/?page_id=78</a><br /> You can download the firmware here: <a href="http://tomato.groov.pl/?page_id=164">http://tomato.groov.pl/?page_id=164</a></p> </div>Montréal Mini Maker Faire 2012http://blog.alexou.net/?montreal-mini-maker-faireWed, 29 Aug 2012 03:33:00 -0400Mon, 07 Jul 2014 22:00:22 -0400http://blog.alexou.net/203<div class="article message"><p><a href="http://www.makerfairemontreal.ca/" target="_blank"><img alt="montrealminimakerfaire" class="alignleft" src="http://blog.alexou.net/upload/image/montrealminimakerfaire.png?size=200" style="width: 150px; margin-top: 0px; margin-bottom: 0px; float: left;" title="montrealminimakerfaire" /></a>A couple days ago, I attended the first Maker Faire to happen in Montr&eacute;al and it was awesome! Apparently it was a great success, I sure hope this success translates to more Maker events nearby! I did not take pictures myself, but luckily <a href="http://pascalnet.net/blog/montreal-mini-maker-faire-2012/">Pascal</a> did. Some nice projects are missing from the following album like the <a href="http://www.echofab.org/">&eacute;choFab</a>, <a href="http://reseaulibre.ca/">R&eacute;seau Libre</a>, and the team of arcade cabinet artwork makers <a href="http://buttonmashers.biz/">The Buttonmashers</a>.<br /> &nbsp;</p> <div class="gallery" contenteditable="false" images="76,77,78,75,79,80,81,82,83"> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/76" rel="61lxwgh596"><img alt="WALL-E NXT by Marc-Andre Bazerqui" src="http://blog.alexou.net/getfile/76&amp;size=150x150" title="WALL-E NXT by Marc-Andre Bazerqui" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/77" rel="61lxwgh596"><img alt="R2-T54 Droid by Frédéric St-Amour" src="http://blog.alexou.net/getfile/77&amp;size=150x150" title="R2-T54 Droid by Frédéric St-Amour" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/78" rel="61lxwgh596"><img alt="RoboBrrds by RobotGrrl" src="http://blog.alexou.net/getfile/78&amp;size=150x150" title="RoboBrrds by RobotGrrl" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/75" rel="61lxwgh596"><img alt="SteamPunk by Jean-François Faucher" src="http://blog.alexou.net/getfile/75&amp;size=150x150" title="SteamPunk by Jean-François Faucher" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/79" rel="61lxwgh596"><img alt="3D Printing" src="http://blog.alexou.net/getfile/79&amp;size=150x150" title="3D Printing" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/80" rel="61lxwgh596"><img alt="3D Printing" src="http://blog.alexou.net/getfile/80&amp;size=150x150" title="3D Printing" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/81" rel="61lxwgh596"><img alt="Hacktastic Housewares by Wyld Collective" src="http://blog.alexou.net/getfile/81&amp;size=150x150" title="Hacktastic Housewares by Wyld Collective" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/82" rel="61lxwgh596"><img alt="Club Station Répétitrice de Laval" src="http://blog.alexou.net/getfile/82&amp;size=150x150" title="Club Station Répétitrice de Laval" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/83" rel="61lxwgh596"><img alt="Eggbot by Bertier Luyt" src="http://blog.alexou.net/getfile/83&amp;size=150x150" title="Eggbot by Bertier Luyt" /></a></div> </div> <div style="page-break-after: always"><span style="display: none;">&nbsp;</span></div> <div class="gallery" contenteditable="false" images="84,85,86,87,88,89,90,91,92,93,94"> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/84" rel="bdltkrw11a8"><img alt="K’Nex Brooklyn Bridge by Women In Engineering" src="http://blog.alexou.net/getfile/84&amp;size=150x150" title="K’Nex Brooklyn Bridge by Women In Engineering" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/85" rel="bdltkrw11a8"><img alt="Quadcopters by Canada Drones" src="http://blog.alexou.net/getfile/85&amp;size=150x150" title="Quadcopters by Canada Drones" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/86" rel="bdltkrw11a8"><img alt="Quadcopters by Canada Drones" src="http://blog.alexou.net/getfile/86&amp;size=150x150" title="Quadcopters by Canada Drones" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/87" rel="bdltkrw11a8"><img alt="Quadcopters by Canada Drones" src="http://blog.alexou.net/getfile/87&amp;size=150x150" title="Quadcopters by Canada Drones" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/88" rel="bdltkrw11a8"><img alt="Handmade Bike by GERRY LAUZON &amp; VINCE GAUCHEREAU" src="http://blog.alexou.net/getfile/88&amp;size=150x150" title="Handmade Bike by GERRY LAUZON &amp; VINCE GAUCHEREAU" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/89" rel="bdltkrw11a8"><img alt="Woodwork Workshop by Frank Di Turi" src="http://blog.alexou.net/getfile/89&amp;size=150x150" title="Woodwork Workshop by Frank Di Turi" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/90" rel="bdltkrw11a8"><img alt="Montreal Mini Maker Faire Badge " src="http://blog.alexou.net/getfile/90&amp;size=150x150" title="Montreal Mini Maker Faire Badge " /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/91" rel="bdltkrw11a8"><img alt="Rostock" src="http://blog.alexou.net/getfile/91&amp;size=150x150" title="Rostock" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/92" rel="bdltkrw11a8"><img alt="Nao 1337 by Carlos Asmat" src="http://blog.alexou.net/getfile/92&amp;size=150x150" title="Nao 1337 by Carlos Asmat" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/93" rel="bdltkrw11a8"><img alt="Thing-O-Matic" src="http://blog.alexou.net/getfile/93&amp;size=150x150" title="Thing-O-Matic" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/94" rel="bdltkrw11a8"><img alt="Light Synth BY ADAM BROWN" src="http://blog.alexou.net/getfile/94&amp;size=150x150" title="Light Synth BY ADAM BROWN" /></a></div> </div> </div><div class="article message"><p><a href="http://www.makerfairemontreal.ca/" target="_blank"><img alt="montrealminimakerfaire" class="alignleft" src="http://blog.alexou.net/upload/image/montrealminimakerfaire.png?size=200" style="width: 150px; margin-top: 0px; margin-bottom: 0px; float: left;" title="montrealminimakerfaire" /></a>A couple days ago, I attended the first Maker Faire to happen in Montr&eacute;al and it was awesome! Apparently it was a great success, I sure hope this success translates to more Maker events nearby! I did not take pictures myself, but luckily <a href="http://pascalnet.net/blog/montreal-mini-maker-faire-2012/">Pascal</a> did. Some nice projects are missing from the following album like the <a href="http://www.echofab.org/">&eacute;choFab</a>, <a href="http://reseaulibre.ca/">R&eacute;seau Libre</a>, and the team of arcade cabinet artwork makers <a href="http://buttonmashers.biz/">The Buttonmashers</a>.<br /> &nbsp;</p> <div class="gallery" contenteditable="false" images="76,77,78,75,79,80,81,82,83"> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/76" rel="61lxwgh596"><img alt="WALL-E NXT by Marc-Andre Bazerqui" src="http://blog.alexou.net/getfile/76&amp;size=150x150" title="WALL-E NXT by Marc-Andre Bazerqui" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/77" rel="61lxwgh596"><img alt="R2-T54 Droid by Frédéric St-Amour" src="http://blog.alexou.net/getfile/77&amp;size=150x150" title="R2-T54 Droid by Frédéric St-Amour" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/78" rel="61lxwgh596"><img alt="RoboBrrds by RobotGrrl" src="http://blog.alexou.net/getfile/78&amp;size=150x150" title="RoboBrrds by RobotGrrl" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/75" rel="61lxwgh596"><img alt="SteamPunk by Jean-François Faucher" src="http://blog.alexou.net/getfile/75&amp;size=150x150" title="SteamPunk by Jean-François Faucher" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/79" rel="61lxwgh596"><img alt="3D Printing" src="http://blog.alexou.net/getfile/79&amp;size=150x150" title="3D Printing" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/80" rel="61lxwgh596"><img alt="3D Printing" src="http://blog.alexou.net/getfile/80&amp;size=150x150" title="3D Printing" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/81" rel="61lxwgh596"><img alt="Hacktastic Housewares by Wyld Collective" src="http://blog.alexou.net/getfile/81&amp;size=150x150" title="Hacktastic Housewares by Wyld Collective" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/82" rel="61lxwgh596"><img alt="Club Station Répétitrice de Laval" src="http://blog.alexou.net/getfile/82&amp;size=150x150" title="Club Station Répétitrice de Laval" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/83" rel="61lxwgh596"><img alt="Eggbot by Bertier Luyt" src="http://blog.alexou.net/getfile/83&amp;size=150x150" title="Eggbot by Bertier Luyt" /></a></div> </div> <div style="page-break-after: always"><span style="display: none;">&nbsp;</span></div> <div class="gallery" contenteditable="false" images="84,85,86,87,88,89,90,91,92,93,94"> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/84" rel="bdltkrw11a8"><img alt="K’Nex Brooklyn Bridge by Women In Engineering" src="http://blog.alexou.net/getfile/84&amp;size=150x150" title="K’Nex Brooklyn Bridge by Women In Engineering" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/85" rel="bdltkrw11a8"><img alt="Quadcopters by Canada Drones" src="http://blog.alexou.net/getfile/85&amp;size=150x150" title="Quadcopters by Canada Drones" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/86" rel="bdltkrw11a8"><img alt="Quadcopters by Canada Drones" src="http://blog.alexou.net/getfile/86&amp;size=150x150" title="Quadcopters by Canada Drones" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/87" rel="bdltkrw11a8"><img alt="Quadcopters by Canada Drones" src="http://blog.alexou.net/getfile/87&amp;size=150x150" title="Quadcopters by Canada Drones" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/88" rel="bdltkrw11a8"><img alt="Handmade Bike by GERRY LAUZON &amp; VINCE GAUCHEREAU" src="http://blog.alexou.net/getfile/88&amp;size=150x150" title="Handmade Bike by GERRY LAUZON &amp; VINCE GAUCHEREAU" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/89" rel="bdltkrw11a8"><img alt="Woodwork Workshop by Frank Di Turi" src="http://blog.alexou.net/getfile/89&amp;size=150x150" title="Woodwork Workshop by Frank Di Turi" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/90" rel="bdltkrw11a8"><img alt="Montreal Mini Maker Faire Badge " src="http://blog.alexou.net/getfile/90&amp;size=150x150" title="Montreal Mini Maker Faire Badge " /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/91" rel="bdltkrw11a8"><img alt="Rostock" src="http://blog.alexou.net/getfile/91&amp;size=150x150" title="Rostock" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/92" rel="bdltkrw11a8"><img alt="Nao 1337 by Carlos Asmat" src="http://blog.alexou.net/getfile/92&amp;size=150x150" title="Nao 1337 by Carlos Asmat" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/93" rel="bdltkrw11a8"><img alt="Thing-O-Matic" src="http://blog.alexou.net/getfile/93&amp;size=150x150" title="Thing-O-Matic" /></a></div> <div class="gallery-container"><a href="http://blog.alexou.net/getfile/94" rel="bdltkrw11a8"><img alt="Light Synth BY ADAM BROWN" src="http://blog.alexou.net/getfile/94&amp;size=150x150" title="Light Synth BY ADAM BROWN" /></a></div> </div> </div>Open Sourcehttp://blog.alexou.net/?open-sourceWed, 13 Jun 2012 08:59:00 -0400Tue, 07 Aug 2018 09:52:09 -0400http://blog.alexou.net/918<div class="article message"><p>This is a collection of software I decided to give to the community.<br /> You can browse the projects <strong><a href="//alexou.net/pub">here</a></strong>.</p> <blockquote> <p><strong><a href="http://alexou.net/pub/?PbCounter">Mouse and Keyboard Monitor</a></strong><br /> <small>Added 2014-07-01</small> PbCounter is a small Windows utility that counts how many times each mouse button and each keyboard key is pressed. With these statistics it does three things: Display the counters, obviously :) Create an heat map to put in evidence the mo...</p> </blockquote> <blockquote> <p><a href="https://alexou.net/pub/?meinchat" title="MeinChat - irc webclient"><strong>MeinChat</strong></a><br /> <small>Added October 19, 2012</small> I present you MeinChat, an irc client written in javascript with a little help from the PHP backend. It&#39;s goal is to implement the entire irc rfcs using javascript. The PHP backend is only used to relay data between irc servers and your browser using long polling or websockets.</p> </blockquote> <blockquote> <p><a href="https://alexou.net/pub/?alex-album" title="simple album"><strong>Alex Album</strong></a><br /> <small>Added June 25, 2012</small> A simple album script with no dependencies beside GD. Features: directory browsing, thumbnails overlay,slideshow, breadcrumb navigation, more...check the demo!</p> </blockquote> <blockquote> <p><a href="https://alexou.net/pub/?rss-manipulator" title="RSS Manipulator"><strong>RSS Manipulator</strong></a><br /> <small>Added June 25, 2012</small> This tool started as a project to enable offline syncing of comics feeds. RSS Manipular edits the rss feed on the fly in order to insert the actual comic images in the feed instead of just a link. It can be used for a lot of other things, you have to play with it to really understand!</p> </blockquote> <blockquote> <p><a href="http://blog.alexou.net/2012/06/13/munin-node-php/" title="Munin-node.PHP"><strong>Munin-node.PHP</strong></a><br /> <small>Added June 13, 2012</small> This is a munin node written in PHP. It supports Munin native plugins and it is very easy to set up. It should work on most Unixes and maybe Windows.</p> </blockquote> </div><div class="article message"><p>This is a collection of software I decided to give to the community.<br /> You can browse the projects <strong><a href="//alexou.net/pub">here</a></strong>.</p> <blockquote> <p><strong><a href="http://alexou.net/pub/?PbCounter">Mouse and Keyboard Monitor</a></strong><br /> <small>Added 2014-07-01</small> PbCounter is a small Windows utility that counts how many times each mouse button and each keyboard key is pressed. With these statistics it does three things: Display the counters, obviously :) Create an heat map to put in evidence the mo...</p> </blockquote> <blockquote> <p><a href="https://alexou.net/pub/?meinchat" title="MeinChat - irc webclient"><strong>MeinChat</strong></a><br /> <small>Added October 19, 2012</small> I present you MeinChat, an irc client written in javascript with a little help from the PHP backend. It&#39;s goal is to implement the entire irc rfcs using javascript. The PHP backend is only used to relay data between irc servers and your browser using long polling or websockets.</p> </blockquote> <blockquote> <p><a href="https://alexou.net/pub/?alex-album" title="simple album"><strong>Alex Album</strong></a><br /> <small>Added June 25, 2012</small> A simple album script with no dependencies beside GD. Features: directory browsing, thumbnails overlay,slideshow, breadcrumb navigation, more...check the demo!</p> </blockquote> <blockquote> <p><a href="https://alexou.net/pub/?rss-manipulator" title="RSS Manipulator"><strong>RSS Manipulator</strong></a><br /> <small>Added June 25, 2012</small> This tool started as a project to enable offline syncing of comics feeds. RSS Manipular edits the rss feed on the fly in order to insert the actual comic images in the feed instead of just a link. It can be used for a lot of other things, you have to play with it to really understand!</p> </blockquote> <blockquote> <p><a href="http://blog.alexou.net/2012/06/13/munin-node-php/" title="Munin-node.PHP"><strong>Munin-node.PHP</strong></a><br /> <small>Added June 13, 2012</small> This is a munin node written in PHP. It supports Munin native plugins and it is very easy to set up. It should work on most Unixes and maybe Windows.</p> </blockquote> </div>Munin-node.PHPhttp://blog.alexou.net/?munin-node-phpWed, 16 May 2012 10:48:00 -0400Thu, 19 Jun 2014 06:04:09 -0400http://blog.alexou.net/173<div class="article message"><h2 style="margin-top: 0px;">What/Why</h2> <p>Munin is a great system monitoring software using the Maser/Node architecture:</p> <ol> <li>Munin. This is were the graphics and html pages are generated. He calls every nodes to collect statistics every couple of minutes. [Master]</li> <li>Munin-node: This is the node. A node is a machine that is monitored. Unlike Munin, munin-node must be installed on every machine that you wish to monitor. [Node]</li> </ol> <p>Surprisingly munin-node, unlike munin-master, is quite difficult to get working without root access.</p> <p>&nbsp;</p> <p><strong>Munin-node.PHP</strong> is a node server written entirely from scratch in PHP and has no further dependencies. Its goal is to provide a quick way to monitor a machine</p> <p style="font-size: 115%;"><a href="https://alexou.net/pub/?/munin-php/">Download</a></p> <h2>How to get started:</h2> <p>Edit the proper section in munin.conf on the master in order to add the node:</p> <pre> [mynode.net] address 127.0.0.1 port 4949 use_node_name yes</pre> <p>Before starting the node, check that plugins are made available. If the plugins/ directory is emply, go to the base directory (where munin-node.php is situated) and add a couple of plugins:</p> <pre> cd plugins ln -s ../extra/cpu cpu ln -s ../extra/memory memory ln -s ../extra/plugin.sh plugin.sh</pre> <p>Then you can launch munin-node.php on the node:</p> <pre> php munin-node.php nofork</pre> <p>nofork option forces the script to stay in forgrounds and display what is going on.</p> <p>&nbsp;</p> <p>The archive contains a couple of plugins taken from munin to get you started, but there&#39;s MANY more available to you from the munin community or munin default installation!</p> <h2>License</h2> <p>The node itself is provided under the ISC license. The plugins are provided under the GPL by munin.</p></div><div class="article message"><h2 style="margin-top: 0px;">What/Why</h2> <p>Munin is a great system monitoring software using the Maser/Node architecture:</p> <ol> <li>Munin. This is were the graphics and html pages are generated. He calls every nodes to collect statistics every couple of minutes. [Master]</li> <li>Munin-node: This is the node. A node is a machine that is monitored. Unlike Munin, munin-node must be installed on every machine that you wish to monitor. [Node]</li> </ol> <p>Surprisingly munin-node, unlike munin-master, is quite difficult to get working without root access.</p> <p>&nbsp;</p> <p><strong>Munin-node.PHP</strong> is a node server written entirely from scratch in PHP and has no further dependencies. Its goal is to provide a quick way to monitor a machine</p> <p style="font-size: 115%;"><a href="https://alexou.net/pub/?/munin-php/">Download</a></p> <h2>How to get started:</h2> <p>Edit the proper section in munin.conf on the master in order to add the node:</p> <pre> [mynode.net] address 127.0.0.1 port 4949 use_node_name yes</pre> <p>Before starting the node, check that plugins are made available. If the plugins/ directory is emply, go to the base directory (where munin-node.php is situated) and add a couple of plugins:</p> <pre> cd plugins ln -s ../extra/cpu cpu ln -s ../extra/memory memory ln -s ../extra/plugin.sh plugin.sh</pre> <p>Then you can launch munin-node.php on the node:</p> <pre> php munin-node.php nofork</pre> <p>nofork option forces the script to stay in forgrounds and display what is going on.</p> <p>&nbsp;</p> <p>The archive contains a couple of plugins taken from munin to get you started, but there&#39;s MANY more available to you from the munin community or munin default installation!</p> <h2>License</h2> <p>The node itself is provided under the ISC license. The plugins are provided under the GPL by munin.</p></div>/pub/ : Public Fileshttp://blog.alexou.net/?pubSat, 24 Mar 2012 10:38:00 -0400Mon, 24 Sep 2018 10:38:20 -0400http://blog.alexou.net/931<div class="article message"></div><div class="article message"></div>About mehttp://blog.alexou.net/?about-meFri, 27 Jan 2012 06:17:00 -0500Mon, 25 Jun 2018 16:28:29 -0400http://blog.alexou.net/872<div class="article message"><p>Hello visitor!</p> <p>My name is Alex. This blog was initially created as an exercice of programmation, but I find it interesting to keep a place to express myself. I believe in free speech and privacy, most of my services are log free or anonymized. After building VPS and server management tools for myself, I decided to offer my services to the public and I have been operating a small VPS hosting company since 2009. I&#39;m an electrician by trade and I have a special interest for electronics engineering and retro computing.</p> <p><a href="https://blog.alexou.net/contact" title="alex {a} alexou.net">Contact me</a></p> </div><div class="article message"><p>Hello visitor!</p> <p>My name is Alex. This blog was initially created as an exercice of programmation, but I find it interesting to keep a place to express myself. I believe in free speech and privacy, most of my services are log free or anonymized. After building VPS and server management tools for myself, I decided to offer my services to the public and I have been operating a small VPS hosting company since 2009. I&#39;m an electrician by trade and I have a special interest for electronics engineering and retro computing.</p> <p><a href="https://blog.alexou.net/contact" title="alex {a} alexou.net">Contact me</a></p> </div>Disable fastcgi (php) for one virtual host in lighttyhttp://blog.alexou.net/?disable-fastcgi-php-for-one-vhost-in-lighttpdThu, 20 Jan 2011 22:52:00 -0500Tue, 22 Aug 2017 14:34:34 -0400http://blog.alexou.net/844<div class="article message"><p>I found two simple way to disable fastcgi for a particular virtual host.</p> <p>You can have full fastcgi.server for each vhost where you want to allow fastcgi, but this isn&#39;t very efficient because it will fork a lot of useless php/perl process. And that&#39;ll make a messy configuration.</p> <p style="padding-top: 30px;">The first way is to disable all fcgi for a vhost. It is possible by adding the following snippet inside the vhost (<em>the $HTTP[&quot;host&quot;] == &quot;domain.td&quot; {} block</em>):</p> <pre> <code class="language-perl">static-file.exclude-extensions = () fastcgi.server = () fastcgi.map-extensions = ()</code></pre> <p style="padding-top: 30px;">The second way, and most likely the best way since you can have per-fcgi control, is to match on the file name by adding this snippet in the vhost configuration:</p> <pre> <code class="language-perl">$HTTP["url"] =~ ".php$" { static-file.exclude-extensions = () fastcgi.server = () }</code></pre> <p style="padding-top: 30px;">The last method I tried was using a UUID to declare the fcgi, and then map it to its extension. The main problem with this, it&#39;s that if your client see your configuration file somehow, he will be able to run a script by renaming it to the UUID.</p> <p>First, use a UUID instead of an extension to declare your fcgi servers:</p> <pre> <code class="language-php">fastcgi.server = ( "034343-43423423-php-342423" =&gt; (( "max-procs" =&gt; 1, "bin-path" =&gt; "/usr/bin/php-cgi", "bin-environment" =&gt; ( "PHP_FCGI_CHILDREN" =&gt; "3", "PHP_FCGI_MAX_REQUESTS" =&gt; "250" ), "socket" =&gt; "/tmp/php.socket" )), "034343-43423423-ruby-342423" =&gt; (( "max-procs" =&gt;; 1, "bin-path" =&gt; "/usr/bin/custom-fcgi", "bin-copy-environment" =&gt; ("LANG", "TERM"), "socket" =&gt; "/tmp/ruby.socket" )) ) fastcgi.map-extensions = (".php" =&gt; "034343-php-342423", ".rb" =&gt; "034343-ruby-342423" )</code></pre> <p>And then redeclare the map-extensions inside the vhost configuration according to what you want to allow:<br /> Eg, to disable php:</p> <pre> <code class="language-perl">fastcgi.map-extensions = (".rb" =&gt; "034343-43423423-ruby-342423" )</code></pre> <p>&nbsp;</p> <p>I hope that one of those methods will help you!</p> </div><div class="article message"><p>I found two simple way to disable fastcgi for a particular virtual host.</p> <p>You can have full fastcgi.server for each vhost where you want to allow fastcgi, but this isn&#39;t very efficient because it will fork a lot of useless php/perl process. And that&#39;ll make a messy configuration.</p> <p style="padding-top: 30px;">The first way is to disable all fcgi for a vhost. It is possible by adding the following snippet inside the vhost (<em>the $HTTP[&quot;host&quot;] == &quot;domain.td&quot; {} block</em>):</p> <pre> <code class="language-perl">static-file.exclude-extensions = () fastcgi.server = () fastcgi.map-extensions = ()</code></pre> <p style="padding-top: 30px;">The second way, and most likely the best way since you can have per-fcgi control, is to match on the file name by adding this snippet in the vhost configuration:</p> <pre> <code class="language-perl">$HTTP["url"] =~ ".php$" { static-file.exclude-extensions = () fastcgi.server = () }</code></pre> <p style="padding-top: 30px;">The last method I tried was using a UUID to declare the fcgi, and then map it to its extension. The main problem with this, it&#39;s that if your client see your configuration file somehow, he will be able to run a script by renaming it to the UUID.</p> <p>First, use a UUID instead of an extension to declare your fcgi servers:</p> <pre> <code class="language-php">fastcgi.server = ( "034343-43423423-php-342423" =&gt; (( "max-procs" =&gt; 1, "bin-path" =&gt; "/usr/bin/php-cgi", "bin-environment" =&gt; ( "PHP_FCGI_CHILDREN" =&gt; "3", "PHP_FCGI_MAX_REQUESTS" =&gt; "250" ), "socket" =&gt; "/tmp/php.socket" )), "034343-43423423-ruby-342423" =&gt; (( "max-procs" =&gt;; 1, "bin-path" =&gt; "/usr/bin/custom-fcgi", "bin-copy-environment" =&gt; ("LANG", "TERM"), "socket" =&gt; "/tmp/ruby.socket" )) ) fastcgi.map-extensions = (".php" =&gt; "034343-php-342423", ".rb" =&gt; "034343-ruby-342423" )</code></pre> <p>And then redeclare the map-extensions inside the vhost configuration according to what you want to allow:<br /> Eg, to disable php:</p> <pre> <code class="language-perl">fastcgi.map-extensions = (".rb" =&gt; "034343-43423423-ruby-342423" )</code></pre> <p>&nbsp;</p> <p>I hope that one of those methods will help you!</p> </div>