<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4604437282989290623</atom:id><lastBuildDate>Sat, 31 Aug 2024 03:45:01 +0000</lastBuildDate><category>Open Source</category><category>CFML</category><category>Python</category><category>Software Development</category><category>Linux</category><category>Ubuntu</category><category>Django</category><category>Greedy Corporations</category><category>Mach-II</category><category>Conferences</category><category>Open BlueDragon</category><category>General</category><category>Google App Engine</category><category>Link</category><category>MySQL</category><category>Security</category><category>cfobjective</category><category>Adobe</category><category>Music</category><category>YubiKey</category><category>Amazon</category><category>Aside</category><category>Google</category><category>Heroku</category><category>OSes</category><category>Prototype</category><category>User Experience</category><category>Apache</category><category>Apple</category><category>CFMeetup</category><category>Contributing</category><category>GitHub</category><category>Google FI</category><category>Gunicorn</category><category>Help</category><category>Javascript</category><category>LastPass</category><category>Levity</category><category>Life</category><category>Minneapolis</category><category>Operating Systems</category><category>Philosophy</category><category>Posterous</category><category>Presentations</category><category>Rant</category><category>Reminders</category><category>Social Commentary</category><category>Twitter Bootstrap</category><category>moto x4</category><category>off topic</category><category>tomcat</category><category>404</category><category>API</category><category>Active Directory</category><category>Advice</category><category>Allyson</category><category>Analogies</category><category>Android</category><category>Authentication</category><category>BOINC</category><category>Bonsai.io</category><category>Bugs</category><category>Build</category><category>CDP</category><category>Car2Go</category><category>Careers</category><category>CentOS</category><category>Cloud</category><category>College</category><category>Composing</category><category>Creativity</category><category>Debian</category><category>Divorce</category><category>Django-CMS</category><category>Django-Debug-Toolbar</category><category>Django-Haystack</category><category>Django-Stronghold</category><category>Do the Right Thing</category><category>Droid</category><category>Eclipse</category><category>ElasticSearch</category><category>Energy</category><category>Fail</category><category>Feud</category><category>Frameworks</category><category>GPU</category><category>Games</category><category>Grails</category><category>GreatBizTools</category><category>Green</category><category>H2</category><category>HR</category><category>HTML</category><category>HTTP</category><category>Hackathon</category><category>Horn</category><category>Image</category><category>JQuery</category><category>JRun</category><category>JS</category><category>Java</category><category>Jobs</category><category>MTP</category><category>MXUnit</category><category>Mac</category><category>Maker</category><category>Meritocracy</category><category>Microsoft</category><category>Mint 11</category><category>Monitors</category><category>Movies</category><category>Nvidia</category><category>OGG Vorbis</category><category>OpenBD</category><category>PAM</category><category>Partenting</category><category>Passwords are broken</category><category>Podcast</category><category>Politics</category><category>Postgres</category><category>Predictions</category><category>PyCharm</category><category>PyCon</category><category>PyUCA</category><category>Quote</category><category>R1Soft</category><category>RCS</category><category>REST</category><category>RosettaHome</category><category>Running</category><category>SAML2</category><category>SSH</category><category>Sad</category><category>Scroogle</category><category>Sharing</category><category>Software Licenses</category><category>Teamwork</category><category>Transportation</category><category>Tutorials</category><category>UUID</category><category>Unit Testing</category><category>Uwsgi</category><category>VPython</category><category>Video</category><category>VirtualBox</category><category>Windows</category><category>YSlow</category><category>accented character</category><category>apt-get</category><category>backup</category><category>base64</category><category>cf.Objective</category><category>coffee</category><category>frontend</category><category>iPhone</category><category>mysql databases</category><category>open source software</category><category>pyMNtos</category><category>quotes</category><category>sorting</category><category>thanks</category><category>wxPython</category><title>The Harmonious Programmer</title><description></description><link>https://blog.maestropublishing.com/</link><managingEditor>noreply@blogger.com (Peter J. Farrell)</managingEditor><generator>Blogger</generator><openSearch:totalResults>167</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-4151900387918462167</guid><pubDate>Thu, 02 Jul 2020 20:30:00 +0000</pubDate><atom:updated>2020-07-02T13:31:54.092-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Active Directory</category><category domain="http://www.blogger.com/atom/ns#">base64</category><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><category domain="http://www.blogger.com/atom/ns#">Python</category><category domain="http://www.blogger.com/atom/ns#">SAML2</category><category domain="http://www.blogger.com/atom/ns#">UUID</category><title>Convert Microsoft LDAP ObjectGuid from base64 to Python UUID</title><description>&lt;p&gt;I needed to convert an objectGuid from Microsoft AD which was provided to me in base64. What I did not know is the Microsoft uses little-endian UUIDs instead of big-endian like the rest of world uses. This caused issues trying to convert the binary to UUID. Luckily, Python&#39;s UUID has bytes_le (little-endian) just for this use case.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/maestrofjp/e70517ba9f91545b20f6504ceed736ec.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;Blogging this for the future.&lt;/p&gt;</description><link>https://blog.maestropublishing.com/2020/07/convert-microsoft-ldap-objectguid-from.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-3890424600970700290</guid><pubDate>Tue, 21 Apr 2020 00:49:00 +0000</pubDate><atom:updated>2020-04-20T17:49:40.025-07:00</atom:updated><title>Python FizzBuzz</title><description>I watched Tom Scott&#39;s One Simple Interview Question on YouTube earlier and decided take a stab at a flexible implementation of FizzBuzz.

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/QPZ0pIK_wsc&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;

&lt;script src=&quot;https://gist.github.com/maestrofjp/630b0775c143dbefdc6db764ac1b58a6.js&quot;&gt;&lt;/script&gt;</description><link>https://blog.maestropublishing.com/2020/04/python-fizzbuzz.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-5776505013789661653</guid><pubDate>Thu, 02 Jan 2020 20:41:00 +0000</pubDate><atom:updated>2020-01-02T12:41:14.549-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google FI</category><category domain="http://www.blogger.com/atom/ns#">moto x4</category><title>Moto X4 on Google FI - Microphone Muffled / Bad - Possible Fix</title><description>I&#39;ve been having people complain they cannot hear me or that I sound extremely muffled when I making phone calls on my Moto X4. I confirmed it was definitely the phone because I tested it with a wired headphones/microphone without issues.&lt;br /&gt;
&lt;br /&gt;
Many forums suggest returning the device as a RMA. This really isn&#39;t an option for my nearly 2 year old phone which is out of warranty. One interesting comment I read was related to the position of the microphone holes -- one of which is very near the fingerprint reader. My phone is always in a case, so the rear microphone hole seemed clear but the front microphone hole seemed slightly dirty.&lt;br /&gt;
&lt;br /&gt;
The phone is rated IP68 which allows for submersion in water for 1 hour up to 1 meter. Since my next option was to buy a new phone, I decided to put the IP68 rating to the test.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Of course, what I did next -- only do at your own risk. I am not responsible for anything you decide to do to your own phone.&lt;/b&gt;&lt;/i&gt; &lt;br /&gt;
&lt;br /&gt;
With 100% rubbing alcohol, I cleaned out the microphone holes with a cotton swab and let dry. Using a recording app, the sounds was marginally better.&amp;nbsp;&amp;nbsp; More drops of alcohol but this time I used an electric toothbrush to vibrate all the junk which was more than I expected (ick).&lt;br /&gt;
&lt;br /&gt;
Voila, things sounded 100% better and I no longer need a new phone!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>https://blog.maestropublishing.com/2020/01/moto-x4-on-google-fi-microphone-muffled.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-609342767100211845</guid><pubDate>Thu, 02 Jan 2020 20:21:00 +0000</pubDate><atom:updated>2020-01-02T12:21:11.338-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Google FI</category><category domain="http://www.blogger.com/atom/ns#">moto x4</category><category domain="http://www.blogger.com/atom/ns#">RCS</category><title>Moto X4 on Google FI - Enable RCS Messages</title><description>On my Moto X4 (Google FI), I couldn&#39;t enable RCS messages in the Messages application as it was stuck &quot;verifying&quot; my phone number. After a bunch of support forums, this is the procedure that ultimately worked for me.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Turn on Airplane mode.&lt;/li&gt;
&lt;li&gt;Open the Settings -&amp;gt; Apps &amp;amp; notifications.&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;If you don&#39;t see all your apps, first tap See all apps or App info.&lt;/li&gt;
&lt;li&gt;At the top right, tap More More and then Show system.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Find the Carrier Services app.&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Tap Force stop and confirm.&lt;/li&gt;
&lt;li&gt;Tap Storage and then Clear data.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Go back to the &quot;App info&quot; screen and find the Messages app.&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;Tap Force stop and confirm&lt;/li&gt;
&lt;li&gt;&amp;nbsp;Tap Storage and then Clear data.&lt;/li&gt;
&lt;/ol&gt;
&lt;li&gt;Turn off Airplane mode.&lt;/li&gt;
&lt;li&gt;Open Messages and checked the settings, it should said &quot;Connected - Chat features are ready for use&quot;.&lt;/li&gt;
&lt;/ol&gt;
I&#39;m blogging this so I don&#39;t forget the process if this ever comes up in the future. </description><link>https://blog.maestropublishing.com/2020/01/moto-x4-on-google-fi-enable-rcs-messages.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-3010361344576966347</guid><pubDate>Fri, 13 Dec 2019 01:02:00 +0000</pubDate><atom:updated>2019-12-12T17:02:25.367-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">accented character</category><category domain="http://www.blogger.com/atom/ns#">Python</category><category domain="http://www.blogger.com/atom/ns#">PyUCA</category><category domain="http://www.blogger.com/atom/ns#">sorting</category><title>Python Sort List of Dictionaries with Accented Characters</title><description>&lt;p&gt;I needed to sort a list of dictionaries by a label key. It happens that the labels are in FR and normal sorting causes issues with ordering when accented characters are present. I happened to have PyUCA installed from PyPi.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/maestrofjp/cc8d8da66a3dfb4c42d3d77aa4fe6b7a.js&quot;&gt;&lt;/script&gt;

</description><link>https://blog.maestropublishing.com/2019/12/python-sort-list-of-dictionaries-with.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-2268731954354954271</guid><pubDate>Mon, 11 Nov 2019 04:44:00 +0000</pubDate><atom:updated>2019-12-12T17:31:24.034-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">404</category><category domain="http://www.blogger.com/atom/ns#">Django</category><category domain="http://www.blogger.com/atom/ns#">Django-CMS</category><title>Custom 404 Page for Django CMS</title><description>For a side project, I needed a 404 page that was editable by users in Django CMS. Suffice it say, it took a while to figure out how to do it without having the Django cache the CMS page response and provide the right 404 http status code. Other techniques wrongly serve the page as a 200 OK which is wrong for search engines.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;First create a 404 page in Django CMS and publish it.&lt;/li&gt;
&lt;li&gt;Set you handler404 in your urls.py (change the path to your view file accordingly):&lt;br /&gt; &lt;code&gt;handler404 = &#39;shared.views.page_not_found&#39;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The view:&lt;br /&gt;&lt;br /&gt;
&lt;pre  style=&quot;font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;padding:0px;color:#000000;text-align:left;line-height:20px;&quot;&gt;&lt;code style=&quot;color:#000000;word-wrap:normal;&quot;&gt;1:  from cms.views import details  
2:  from django.http import HttpResponse  
3:  def page_not_found(request, exception):  
4:    response = details(request, &#39;404&#39;)  # 404 is the slug you named your page in Django CMS
5:    return HttpResponse(content=response.rendered_content, content_type=&#39;text/html; charset=utf-8&#39;, status=404)  
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
</description><link>https://blog.maestropublishing.com/2019/11/custom-404-page-for-django-cms.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-165846732525923148</guid><pubDate>Fri, 16 Jan 2015 18:28:00 +0000</pubDate><atom:updated>2016-02-04T16:43:35.037-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Django</category><category domain="http://www.blogger.com/atom/ns#">Gunicorn</category><category domain="http://www.blogger.com/atom/ns#">Heroku</category><category domain="http://www.blogger.com/atom/ns#">Postgres</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Gunicorn dyno death spiral on Heroku -- Part II</title><description>After a lot of investigation, we&#39;ve figured out there is an issue with NewRelic, Postgres and Gunicorn. I summarized the issue here:&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;https://discussion.heroku.com/t/gunicorn-dyno-death-spiral/136/13&quot;&gt;https://discussion.heroku.com/t/gunicorn-dyno-death-spiral/136/13&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;After discussing this with Graham Dumpleton over Twitter there is an issue with libpq. Below is a summary of a rather long Twitter discussion. Anything in quotes is from Graham but could have been paraphrased or reworded slightly to make sense here. Didn&#39;t want anyone to think that using Graham&#39;s words as my own...&lt;br/&gt;&lt;br/&gt;The real issue is caused by &quot;the use of the NewRelic agent in a background thread which does SSL HTTP calls -- surfaced issues with libpq SSL connections to database.&quot; This can be replicated by the use of a script someone wrote when the bug was reported to Postgres in October, 2014 (see link below). It&#39;s not the fault of the NR agent -- just that it uses a background thread and triggers the same behavior. That&#39;s why you can reproduce the issue without the NR agent.&lt;br/&gt;&lt;br/&gt;So the &quot;NR agent will create a background thread, but if you had other threads for other reasons which did SSL connections, [it] still occurs. If process is completely single threaded without multiple request handler threads, nor background threads doing SSL, [then it] is okay.&quot;&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;http://www.postgresql.org/message-id/CAHUL3dpWYFnUgdgo95OHYDQ4kugdnBKPTjq0mNbTuBhCMG4xvQ@mail.gmail.com&quot;&gt;http://www.postgresql.org/message-id/CAHUL3dpWYFnUgdgo95OHYDQ4kugdnBKPTjq0mNbTuBhCMG4xvQ@mail.gmail.com&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;So in a perfect storm, libpq deadlocks which causes large issues for Gunicorn. The reason why is how Gunicorn is designed and that a &quot;main thread is used to handle requests and if that deadlocks then signals aren&#39;t handled or if it uses a pipe of death, it will never return to accept on connection where it gets message to shutdown.&quot;&lt;br/&gt;&lt;br/&gt;By default, &quot;Django creates a new database connection per request which exacerbates the problem.&quot; So the problem can mostly be alleviated by using some sort of database connection pooling -- either what is built-in into Django 1.6+ or something like django-postgresql-pool or PGBouncer however it still can cause issues for Gunicorn as the db pool only reduces the likelihood of the problem. Also, because of the way the main thread works -- that is why I personally saw that the Gunicorn timeout directive have no affect on the problem because the worker was still waiting for Postgres and therefore was still alive despite the fact that Heroku killed the request on the client side.&lt;br/&gt;&lt;br/&gt;The only real work around until libpq is fixed is to use something other than Gunicorn like Uwsgi and deal with the Harakiri requests OR don&#39;t mix DB calls when calls to HTTPS resources. In our case, we are using Amazon S3 so some requests need to make a bucket request to get information and sometimes cause this deadlock issue.&lt;br/&gt;&lt;br/&gt;I know many other people in my local user group that have written off Gunicorn on Heroku thinking the issue was Gunicorn and/or New Relic. However, the problem is in Postgres and it is exacerbated when the NR agent is used.&lt;br/&gt;&lt;br/&gt;While we (GreatBizTools) has a workaround in place, it would be great if Heroku (and maybe you can get New Relic) to poke at the Postgres folks to fix this deadlock into that was reported to them in October, 2014. I can&#39;t image the number of folks that have been caught out in the rain in the past year or so by this. There are several blog posts that (now wrongly) point fingers at Heroku for not supporting Gunicorn correctly.&lt;br/&gt;&lt;br/&gt;We can&#39;t be the only people to use Heroku on Python with New Relic and Postgres? It must be a really popular combination.&lt;br/&gt;&lt;br/&gt;---&lt;br/&gt;&lt;br/&gt;Edit: Heroku is now aware of the issue and is working with respective parties in order to rectify this low level issue. -- January 16th, 2015</description><link>https://blog.maestropublishing.com/2015/01/gunicorn-dyno-death-spiral-on-heroku_16.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-3380973139099789991</guid><pubDate>Mon, 12 Jan 2015 20:01:00 +0000</pubDate><atom:updated>2016-02-04T16:43:35.023-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Django</category><category domain="http://www.blogger.com/atom/ns#">Gunicorn</category><category domain="http://www.blogger.com/atom/ns#">Heroku</category><category domain="http://www.blogger.com/atom/ns#">Python</category><category domain="http://www.blogger.com/atom/ns#">Uwsgi</category><title>Gunicorn dyno death spiral on Heroku</title><description>FYI -- &lt;a href=&quot;http://blog.maestropublishing.com/2015/01/16/gunicorn-dyno-death-spiral-on-heroku-part-ii/&quot;&gt;Gunicorn dyno death spiral on Heroku -- Part II is now available&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;-----&lt;br/&gt;&lt;br/&gt;We recently released our app XXXX on Heroku using Gunicorn however we quickly found in even the most modest of production load (as little as 10 users) that some dynos would stop responding and start throwing continuous H12 errors for hours.&lt;br/&gt;&lt;br/&gt;We experience three separate events (from January 5-6) where one or more dynos would stop serving requests with Gunicorn and throw H12 errors for every request and the load metrics would spike from .2-.5 to 1.5 or higher on that particular dyno. The only remedy was to manually run &lt;code&gt;heroku ps:restart web.X&lt;/code&gt; after reading logs and kill the appropriate dyno.&lt;br/&gt;&lt;br/&gt;We experienced the same issue as outlined on this thread on the Heroku forums:&lt;br/&gt;&lt;br/&gt;&lt;a href=&quot;https://discussion.heroku.com/t/gunicorn-dyno-death-spiral/136&quot;&gt;https://discussion.heroku.com/t/gunicorn-dyno-death-spiral/136&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;We were able to track it down to &quot;bad clients&quot; using the application -- they were always Verizon Wireless or Sprint Mobility aircards on laptop computers. We have a single client using this application so it was easy to confirm with them that the reverse IP was indeed Verizon Wireless or Sprint.&lt;br/&gt;&lt;br/&gt;Our guess is that a client would not close a connect or respond with ACK messages for the streamed response and therefore exceed the 30 second limit. When Heroku performed an H12 on it, it left the worker on Gunicorn to continue working -- left tied up in an unrecoverable state. This would repeatedly happen (we were only running 3 workers per dyno) until all workers on a single dyno stopped responding. At this point, the the routing mesh would continue routing requests to this rogue dyno but the dyno would just return H12s until it was manually restarted.&lt;br/&gt;&lt;br/&gt;We have confirmed it is NOT our application code. The application runs just fine when Gunicorn is swapped out with Uwsgi (we also tested Waitress with success as well). Currently, we are running Uwsgi on the XXXX application since the evening of January 6th. We have not experience any more events where dynos would death spiral out of control after switching to Uwsgi permanently. We still occasionally see a bad client and request -- however we are using the Harakiri option in Uwsgi and the rogue worker is killed and respawned after 25 seconds.&lt;br/&gt;&lt;br/&gt;The question we have is why Heroku continues to recommend using Gunicorn when other people like ourselves have experienced terrible results with this particular application server.</description><link>https://blog.maestropublishing.com/2015/01/gunicorn-dyno-death-spiral-on-heroku.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-7844311178079391878</guid><pubDate>Tue, 30 Dec 2014 18:12:00 +0000</pubDate><atom:updated>2016-02-04T16:43:35.012-08:00</atom:updated><title>Python / Django / Selenium: Set viewport size (window size)</title><description>The default viewport size for PhantomJs is like a phone size width. I found plenty of examples of setting the viewport size of the window for Java, C# and Ruby but not much for Python.  It&#39;s ridiculously simple.  Below is an example basically for my future reminder, but here for your enjoyment. This sets the viewport 1280px wide by 720px high.&lt;br/&gt;&lt;pre&gt;CustomLiveServerTestCase(LiveServerTestCase):&lt;br/&gt;    def setUp(self):&lt;br/&gt;        self.wd = webdriver.PhantomJS()&lt;br/&gt;        self.wd.set_window_size(1280, 720)&lt;br/&gt;        super(CustomLiveServerTestCase, self).setUp()&lt;br/&gt;&lt;br/&gt;    def tearDown(self):&lt;br/&gt;        super(CustomLiveServerTestCase, self).tearDown()&lt;br/&gt;        self.wd.close()&lt;br/&gt;&lt;/pre&gt;</description><link>https://blog.maestropublishing.com/2014/12/python-django-selenium-set-viewport.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-8237857178040239398</guid><pubDate>Tue, 30 Dec 2014 16:54:00 +0000</pubDate><atom:updated>2017-11-19T22:46:22.108-08:00</atom:updated><title>Python / Django / Selenium: &amp;quot;Webdriver Exception: Unable to startphantomjs with ghostdriver&amp;quot;</title><description>You might be using an outdated version of Selenium or possibly running it on Windows. Try the latest version of Selenium for Python first.&lt;br /&gt;
&lt;br /&gt;
However, if that doesn&#39;t solve your issues you might have a failing test and not closing the webdriver down in your teardown method in your test if you have a custom test case:&lt;br /&gt;
&lt;pre&gt;CustomLiveServerTestCase(LiveServerTestCase):
    def setUp(self):
        self.wd = webdriver.PhantomJS()
        super(CustomLiveServerTestCase, self).setUp()

    def tearDown(self):
        super(CustomLiveServerTestCase, self).tearDown()
        self.wd.close()&lt;/pre&gt;
</description><link>https://blog.maestropublishing.com/2014/12/python-django-selenium-exception-unable.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-5251707956802068368</guid><pubDate>Mon, 29 Dec 2014 20:14:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.968-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Django</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Show Django-Debug-Toolbar when development IP addresses are dynamic&#xa;(Vagrant, Landrush, etc.)</title><description>In certain circumstances, your IP address in development changes and therefore it&#39;s hard to have all the IP address in the list of INTERNAL_IPS that Django Debug Toolbar uses.  In your development.py settings file (you separate them out right?), you can add this to shortcircuit the logic and allow ANY IP address (be careful):&lt;br/&gt;&lt;pre&gt;def show_toolbar(request):&lt;br/&gt;    return True&lt;br/&gt;&lt;br/&gt;DEBUG_TOOLBAR_CONFIG = {&lt;br/&gt;    &#39;SHOW_TOOLBAR_CALLBACK&#39;: &#39;YourAppName.settings.development.show_toolbar&#39;,&lt;br/&gt;}&lt;/pre&gt;</description><link>https://blog.maestropublishing.com/2014/12/show-django-debug-toolbar-when.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-8875071999627930447</guid><pubDate>Tue, 16 Dec 2014 14:23:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.953-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Django</category><category domain="http://www.blogger.com/atom/ns#">Django-Debug-Toolbar</category><category domain="http://www.blogger.com/atom/ns#">Django-Stronghold</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Django-Stronghold with Django-Debug-Toolbar</title><description>Django Stronghold intercepts calls to Django Debug Toolbar panels which cause the panels to show your login page. This can easily be fixed to exclude the Debug Toolbar urls in your settings.py file:&lt;br/&gt;&lt;pre&gt;STRONGHOLD_DEFAULTS = True&lt;br/&gt;STRONGHOLD_PUBLIC_URLS = (&lt;br/&gt;    r&#39;^/__debug__/.+$&#39;,&lt;br/&gt;)&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;The STRONGHOLD_DEFAULTS tells Stronghold to include regex patterns for Static and Media file urls so your static assets will work too.</description><link>https://blog.maestropublishing.com/2014/12/django-stronghold-with-django-debug.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-7964540711314948054</guid><pubDate>Wed, 10 Dec 2014 16:33:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.912-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Bonsai.io</category><category domain="http://www.blogger.com/atom/ns#">Django</category><category domain="http://www.blogger.com/atom/ns#">Django-Haystack</category><category domain="http://www.blogger.com/atom/ns#">ElasticSearch</category><category domain="http://www.blogger.com/atom/ns#">Heroku</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Correct connection settings for ElasticSearch / Django-Haystack on&#xa;Bonsai.io</title><description>I should have read the documentation about this better, so I&#39;m blogging this because I&#39;m sure other people have had the same issue. Bonsai.io requires the username and password to be sent as an http_auth header.&lt;br/&gt;&lt;pre&gt;from urlparse import urlparse&lt;br/&gt;&lt;br/&gt;es = urlparse(os.environ.get(&#39;BONSAI_URL&#39;))&lt;br/&gt;port = es.port or 80&lt;br/&gt;&lt;br/&gt;HAYSTACK_CONNECTIONS = {&lt;br/&gt;    &#39;default&#39;: {&lt;br/&gt;        &#39;ENGINE&#39;: &#39;haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine&#39;,&lt;br/&gt;        &#39;URL&#39;: es.scheme + &#39;://&#39; + es.hostname + &#39;:&#39; + str(port),&lt;br/&gt;        &#39;INDEX_NAME&#39;: &#39;your_index_name&#39;,&lt;br/&gt;    },&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;if es.username:&lt;br/&gt;    HAYSTACK_CONNECTIONS[&#39;default&#39;][&#39;KWARGS&#39;] = {&quot;http_auth&quot;: es.username + &#39;:&#39; + es.password}&lt;/pre&gt;</description><link>https://blog.maestropublishing.com/2014/12/correct-connection-settings-for.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-5429291698725346179</guid><pubDate>Mon, 01 Sep 2014 12:44:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.897-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSes</category><category domain="http://www.blogger.com/atom/ns#">Ubuntu</category><title>Dell Sputnik Tip: Mouse / Cursor is broken or frozen after resuming&#xa;from suspend or sleep</title><description>&lt;p&gt;For some reason my third generation Dell Sputnik (aka Dell XPS13 with Ubuntu pre-installed) sometimes has a frozen or broken mouse / cursor after I suspend or sleep my laptop.  You can easily get it working again (this is not a permanent fix) by switching to a different TTY and then back to the TTY that holds the x-server GUI.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ctrl+alt+F6 to switch to TTY6 (this will give you a terminal)&lt;/li&gt;&lt;li&gt;Do nothing in the terminal&lt;/li&gt;&lt;li&gt;ctrl-alt+F7 to switch back to the TTY7 which is the Ubuntu x-server&lt;/li&gt;&lt;li&gt;Voila... your mouse should be working again.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;If anyone has a permanent fix, please let me know.&lt;/p&gt;</description><link>https://blog.maestropublishing.com/2014/09/dell-sputnik-tip-mouse-cursor-is-broken.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-7537226711102035434</guid><pubDate>Thu, 21 Aug 2014 18:20:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.860-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Python</category><category domain="http://www.blogger.com/atom/ns#">Ubuntu</category><title>Installing Cython - x86_64-linux-gnu-gcc: error: unrecognized command&#xa;line option ‘-fstack-protector-strong’</title><description>&lt;p&gt;I went around and around trying to get Cython install on my Ubuntu 14.04 LTS box.  I kept getting:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;x86_64-linux-gnu-gcc: error: unrecognized command line option ‘-fstack-protector-strong’&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Turns out that the ‘-fstack-protector-strong’ option was not added to the GCC compiler until version 4.9.  Upgraded my GCC to the latest available fixed the issue.&lt;/p&gt;</description><link>https://blog.maestropublishing.com/2014/08/installing-cython-x8664-linux-gnu-gcc.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-7446362981329927359</guid><pubDate>Tue, 19 Aug 2014 13:56:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.834-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">OSes</category><category domain="http://www.blogger.com/atom/ns#">Ubuntu</category><title>The City of Munich -- Switching Back to Windows from Linux?</title><description>&lt;blockquote&gt;&lt;p&gt; &lt;strong&gt;Munich’s &lt;a title=&quot;Switching to Linux Saved Munich City Tens of Millions&quot; href=&quot;http://www.omgubuntu.co.uk/2014/07/munich-city-saves-millions-going-open-source&quot;&gt;much vaunted migration to Linux&lt;/a&gt; could be about to unravel, sending the city back into the fee-driven bosom of Microsoft.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.omgubuntu.co.uk/2014/08/munich-city-linux-switching-back-windows&quot;&gt;http://www.omgubuntu.co.uk/2014/08/munich-city-linux-switching-back-windows&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The City of Munich, Germany has been a Linux user for over 10 years but it appears that city employees are clamoring to switch back to Windows.&lt;/p&gt;&lt;p&gt;The issue I see is that they built their own distribution - &lt;a href=&quot;http://en.wikipedia.org/wiki/LiMux&quot;&gt;LiMux&lt;/a&gt;. It was originally based on Debian and then switched to Ubuntu. The last stable release of LiMux was in 2011 and is based on Ubuntu 10.04 LTS which was released in April 2010. That version of Ubuntu is seriously old in the tooth now -- even Microsoft releases new version of Windoze faster.&lt;/p&gt;&lt;p&gt;Seems to me that the City of Munich suffers from &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Not_Invented_Here&quot;&gt;Not invented here&lt;/a&gt;&quot; syndrome and would be better off if they just switch to an vendor with commercial support like Ubuntu or Red Hat instead of trying to build and maintain their own distro.&lt;/p&gt;</description><link>https://blog.maestropublishing.com/2014/08/the-city-of-munich-switching-back-to.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-2540671704270728969</guid><pubDate>Mon, 11 Aug 2014 17:45:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.822-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Uninstall all Python packages via pip</title><description>&lt;p&gt;This is for my future reference because it&#39;s really handy if you don&#39;t want to drop a virtualenv or doing some crazy work on a vagrant box.  Even ignores any packages you installed from git or vcs sources with the -e flag&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;pip freeze | grep -v &quot;^-e&quot; | xargs pip uninstall -y&lt;/pre&gt;&lt;/blockquote&gt;</description><link>https://blog.maestropublishing.com/2014/08/uninstall-all-python-packages-via-pip.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-7816361416229431992</guid><pubDate>Fri, 25 Jul 2014 20:26:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.807-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Link</category><category domain="http://www.blogger.com/atom/ns#">Ubuntu</category><title>Logitech Unifying Receiver Pairing on Linux</title><description>&lt;p&gt;This post is mostly for my future reference. Really simple to pair a new mouse with an existing receiver on Linux.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://lekensteyn.nl/logitech-unifying.html&quot;&gt;ltunify&lt;/a&gt; is a program resulting from the gathered knowledge on the Logitech HID++ protocol. It allows you to pair additional devices like keyboards and mice to your Unifying receiver, unpair existing devices and list information about connected devices. This section will show you how to install the &lt;em&gt;ltunify&lt;/em&gt; program.&lt;/p&gt;&lt;p&gt;Besides a C compiler and a way to fetch sources (wget+tar or git), you will need Linux 3.2 or newer with the &lt;em&gt;hid-logitech-dj&lt;/em&gt; module. On Debian and Ubuntu distributions, the required packages can be installed using:&lt;/p&gt;&lt;pre&gt;sudo apt-get install git gcc&lt;br/&gt;&lt;/pre&gt;&lt;p&gt;Fetch the sources and install &lt;code&gt;ltunify&lt;/code&gt; to &lt;code&gt;$HOME/bin/&lt;/code&gt; using the next commands:&lt;/p&gt;&lt;pre&gt;git clone https://git.lekensteyn.nl/ltunify.git&lt;br/&gt;cd ltunify&lt;br/&gt;make install-home&lt;br/&gt;&lt;/pre&gt;&lt;p&gt;The following steps will assume that &lt;code&gt;$HOME/bin&lt;/code&gt; is available in your path. If not, run:&lt;/p&gt;&lt;pre&gt;export PATH=&quot;$HOME/bin:$PATH&quot;&lt;br/&gt;&lt;/pre&gt;&lt;p&gt;If everything went well, you should be able to run &lt;code&gt;ltunify --help&lt;/code&gt; to show the available options:&lt;/p&gt;&lt;pre&gt;Usage: ltunify [options] cmd [cmd options]&lt;br/&gt;Logitech Unifying tool version dev&lt;br/&gt;Copyright (C) 2013 Peter Wu &amp;lt;lekensteyn@gmail.com&amp;gt;&lt;br/&gt;&lt;br/&gt;Generic options:&lt;br/&gt;  -d, --device path Bypass detection, specify custom hidraw device.&lt;br/&gt;  -D                Print debugging information&lt;br/&gt;  -h, --help        Show this help message&lt;br/&gt;&lt;br/&gt;Commands:&lt;br/&gt;  list            - show all paired devices&lt;br/&gt;  pair [timeout]  - Try to pair within &quot;timeout&quot; seconds (1 to 255,&lt;br/&gt;                    default 0 which is an alias for 30s)&lt;br/&gt;  unpair idx      - Unpair device&lt;br/&gt;  info idx        - Show more detailed information for a device&lt;br/&gt;  receiver-info   - Show information about the receiver&lt;br/&gt;In the above lines, &quot;idx&quot; refers to the device number shown in the&lt;br/&gt; first column of the list command (between 1 and 6). Alternatively, you&lt;br/&gt; can use the following names (case-insensitive):&lt;br/&gt; Keyboard Mouse Numpad Presenter Trackball Touchpad&lt;br/&gt;&lt;/pre&gt;&lt;p&gt;The below session shows you how to use a &lt;em&gt;device index&lt;/em&gt; to unpair a mouse.&lt;/p&gt;&lt;pre&gt;$ sudo ltunify list&lt;br/&gt;Devices count: 1&lt;br/&gt;Connected devices:&lt;br/&gt;idx=&lt;b&gt;1&lt;/b&gt;   Mouse   M525&lt;br/&gt;&lt;br/&gt;$ sudo ltunify unpair &lt;b&gt;1&lt;/b&gt;&lt;br/&gt;Device 0x01 Mouse successfully unpaired&lt;br/&gt;&lt;br/&gt;$ sudo ltunify list&lt;br/&gt;Devices count: 0&lt;br/&gt;Connected devices:&lt;br/&gt;&lt;br/&gt;$ sudo ltunify pair&lt;br/&gt;Please turn your wireless device off and on to start pairing.&lt;br/&gt;Found new device, id=&lt;b&gt;0x01&lt;/b&gt; Mouse&lt;br/&gt;&lt;br/&gt;$ sudo ltunify list&lt;br/&gt;Devices count: 1&lt;br/&gt;Connected devices:&lt;br/&gt;idx=&lt;b&gt;1&lt;/b&gt;   Mouse   M525&lt;br/&gt;&lt;/pre&gt;&lt;p&gt;It is also possible to select a device by device type (case-insensitive). When multiple devices of the same type are available, the first one will be selected.&lt;/p&gt;&lt;pre&gt;$ sudo ltunify unpair &lt;b&gt;mouse&lt;/b&gt;&lt;br/&gt;Device 0x01 &lt;b&gt;Mouse&lt;/b&gt; successfully unpaired&lt;/pre&gt;&lt;/blockquote&gt;</description><link>https://blog.maestropublishing.com/2014/07/logitech-unifying-receiver-pairing-on.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-3111492924660133868</guid><pubDate>Wed, 30 Apr 2014 21:21:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.794-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Quote</category><title>PyCon 2015 will...</title><description>&lt;blockquote&gt;PyCon 2015 will be held in Montreal again next year from April 8th - 16th, 2015. We hope to see you there!&lt;br/&gt;&lt;br/&gt;Tutorials: April 8th - 9th&lt;br/&gt;Conference: April 10th - 12th&lt;br/&gt;Sprints: April 13th - 16th&lt;br/&gt;&lt;/blockquote&gt;&lt;p&gt;Blogging this because it&#39;s hard to find the dates for PyCon 2015&lt;/p&gt;</description><link>https://blog.maestropublishing.com/2014/04/pycon-2015-will.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-1765645992862254809</guid><pubDate>Fri, 14 Feb 2014 19:14:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.781-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Car2Go</category><category domain="http://www.blogger.com/atom/ns#">Transportation</category><title>Car2Go Minneapolis Promo Code - Expires 3/16/14</title><description>&lt;p&gt;Didn&#39;t get a free lifetime membership to Car2Go Minneapolis last Fall? This is the last &quot;cheap&quot; promo for Car2Go and lifetime memberships. My wife and I used Car2Go in both Portland and Seattle during our recent vacation. We never had to rent a car!&lt;br /&gt;&lt;br /&gt;The &lt;strong&gt;PFAR1030&lt;/strong&gt; promo code gives you a discounted $10 car2go registration fee (instead of the normal $35) AND 30 free minutes of car2go drive time. My promo code expires on 3/16.&lt;/p&gt;</description><link>https://blog.maestropublishing.com/2014/02/car2go-minneapolis-promo-code-expires.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-7043844270590753717</guid><pubDate>Wed, 12 Feb 2014 22:13:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.741-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">apt-get</category><category domain="http://www.blogger.com/atom/ns#">CDP</category><category domain="http://www.blogger.com/atom/ns#">R1Soft</category><title>How to fix a R1Soft NO_PUBKEY error during apt-get update</title><description>&lt;p&gt;During a recent apt-get update of one of our systems, we encountered an error with the R1Soft repository for CDP:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;W: GPG error: http://repo.r1soft.com stable Release: The following signatures couldn&#39;t be verified because the public key is not available: NO_PUBKEY 1BF3530AA40384ED&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;It appears that R1Soft started using a new key which they publish.  In order to get this repository working again, you must update to use the new key.  Use the following commands to import the new key:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;wget http://repo.r1soft.com/r1soft.asc&lt;/code&gt;&lt;br /&gt;&lt;code&gt;apt-key add r1soft.asc&lt;/code&gt;&lt;br /&gt;&lt;code&gt;apt-get update&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;The key (pun intendned) of this post is to remind myself of the URL of the public key block.&lt;/p&gt;</description><link>https://blog.maestropublishing.com/2014/02/how-to-fix-r1soft-nopubkey-error-during.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-6410535120133188048</guid><pubDate>Wed, 05 Feb 2014 16:31:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.553-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Django</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Reaction to Two Scoops of Django 1.6 FAQ - No Digital Edition?!?!</title><description>&lt;blockquote&gt;Considering that we publicly offered a free electronic copy to those who requested it, seeing piracy of the electronic editions from the first day of sales has been disheartening. As indie authors, it hurts to see this happening.&lt;/blockquote&gt;&lt;br/&gt;It is awful to think of the piracy that occurred, however this just punishes the people that want an electronic format and are honest in the first place. If somebody wants to pirate a copy, they will do it whether an electronic edition is available or not.&lt;br/&gt;&lt;br/&gt;I can totally understand the argument on multiple ebook formats being an issue due to formatting.  The solution is simple -- only offer a PDF that is a rendering of the physical book.&lt;br/&gt;&lt;br/&gt;It is legal (* from what I can tell) to scan a book that was legally acquired for personal use. This &lt;a href=&quot;http://gigaom.com/2013/11/14/google-wins-book-scanning-case-judge-finds-fair-use-cites-many-benefits/&quot;&gt;falls under the fair usage laws&lt;/a&gt; (similar ripping MP3s of CDs you own).  I&#39;ve scanned books at home into PDF and then shredded them (I have fairly limited space for tech books at home).  The results are only fair and are better if I slice off the binding.&lt;br/&gt;&lt;br/&gt;It is more than likely that with this edition of Two Scoops of Django, I will buy via Amazon and ship directly to 1dollarscan.com which will scan ($1 per 100 pages) a book into a PDF and then after two weeks they shred the book (they do not return books).  Talk about a waste of natural resources -- paper manufacturing, printing, ship to a warehouse and ship to a scanning company, etc.&lt;br/&gt;&lt;br/&gt;Maybe an alternative is to sell PDFs but password protect them which makes it easier to figure the origin if a pirated copy is discovered and watermark the header on the top each page with the name, email and phone number of the original purchaser.&lt;br/&gt;&lt;br/&gt;Physical books won&#39;t stop the pirates.  Yes, it does make it harder for them (marginally), however this just punishes the majority of honest people that used the electronic format in a responsible and legal manner for the few (relatively) that decided to pirate a copy.  So the only thing that has changed is increased the cost of my book by about $4 (the cost to scan at 1dollarscan.com) and I can no longer search it (unless I pay extra for the OCR option).&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Edit on Feb. 7th, 2014 due to feedback -- I want to clarify some points:&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;This post is a reaction to not publishing a digital edition and points to how I&#39;m probably solving the &quot;no digital edition&quot; issue for myself.  I will still purchase a legal physical copy of the book. I still want Danny and Audrey to take my money because I want the content.  I just expressed my wishes to get an official digital edition. Using a scanning service is a lazy hack, however Fair Use hack (as long as I don&#39;t distribute it).  Also, I do not support pirating media and therefore this post isn&#39;t a &quot;how to pirate&quot; manual -- merely a legitimate fair use solution to having a digital version for personal use.&lt;br/&gt;&lt;br/&gt;Other than this post... I have not participated in any public discussions (other than the single automated tweet when this post was publishing).  I&#39;ve now been counted and blamed as one of the trolls that &quot;caused&quot; future editions of Two Scoops of Django to not happen. This is a rather unfair assessment.&lt;br/&gt;&lt;br/&gt;The point is pirates will still pirate a copy of this book because they want to.  If anything, this is a testament to quality of the content that Danny and Audrey produce.  I must admit it is sad that the availability of pirated copies of Two Scoops is a compliment to the authors.  It does reinforce that quality content is in demand and there are people that un-willing or just plain too cheap to buy a legitimate copy.&lt;br/&gt;&lt;br/&gt;The real losers here are the legitimate users that want to buy a legal copy of a book. The only thing done by not making a digital edition available is that making the first pirated copy is just slighly harder to make. I would guess about 45 minutes at a flatbed scanner is about it. Not having a digital edition won&#39;t stop piracy at all and therefore I don&#39;t except that as a legitimate reason to not do a digital edition.  On to a real reason... time!&lt;br/&gt;&lt;br/&gt;Two Scoops 1.5 edition was released with three digital edition types (mobi, epub and pdf).  The PDF looks like the print copy and I never used the epub or mobi editions.  Considering the target devices for epub and mobi, I suspect it took Danny and Audrey a LOT of time to probably do it right (which they indicated in their FAQ).  This was an ambitious and lofty goal to release so many formats. Kudos to them for doing it however I&#39;m sure it contributed to the reason to not release a digital edition for this version.  So it understandable that time is a factor for the authors (rightfully so). The solution is export a PDF version of the book and skip the tedious hand grooming of epub and mobi formats.</description><link>https://blog.maestropublishing.com/2014/02/reaction-to-two-scoops-of-django-16-faq.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-100139343874980459</guid><pubDate>Sat, 23 Nov 2013 11:11:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.538-08:00</atom:updated><title>Unimpressed with CreditSesame.com - A Review</title><description>After listening to Marketplace Money on NPR this morning, I decided to try &lt;a href=&quot;http://creditsesame.com&quot; target=&quot;_blank&quot;&gt;CreditSesame.com&lt;/a&gt; after they discussed tools to managing your finances. I decided on CreditSesame because I&#39;ve tried Credit Karma and I don&#39;t like to use anything Intuit (i.e. Mint.com) if possible. After 15 minutes, I&#39;m thoroughly unimpressed.&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Thoughts&lt;/strong&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;During the registration process, there is a place to set your financial goals.  CreditSesame seems to forget that I just want to sign-up.  I don&#39;t want to have to set goals to just get in for the first time.  The only way I could proceed was to make some dummy goals (which defeats the point).  This needs to be rethought!&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;The UI of the website is less than impressive.  For example, entering or confirming expenses like PMI on our mortgage is very unclear -- do you want the monthly or annual amount?&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;On my Dashboard, it recommends that I enroll in their free credit monitoring despite the fact that I enrolled during registration.  Why must you nag more about something I already did?&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;On the My Credit page, I get a badge for using my credit wisely and then a warning that &quot;Your credit card balances may be getting close to your credit limits&quot;.  Strange warning when the same page reports my credit usage at only 2%.  I guess that is too much!&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;It seems the main point of anything I do is to sell me a $9.95 credit report.  Yes, I know their service is free however&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;I get random errors using the site like this.  One thing that bothered me was that the Java stacktrace is publicly visible.  This is a security no-no in the web world and this place has my SSN!&lt;a style=&quot;line-height:1.5;&quot; href=&quot;http://maepub.files.wordpress.com/2013/11/creditsesame.png&quot;&gt;&lt;img class=&quot;size-full wp-image&quot; id=&quot;i-333&quot; alt=&quot;Image&quot; src=&quot;http://maepub.files.wordpress.com/2013/11/creditsesame.png?w=487&quot; /&gt;&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2&gt;My Rating: I deleted my account!&lt;/h2&gt;</description><link>https://blog.maestropublishing.com/2013/11/unimpressed-with-creditsesamecom-review.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-1697149756669844454</guid><pubDate>Fri, 22 Nov 2013 01:00:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.525-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Link</category><category domain="http://www.blogger.com/atom/ns#">Maker</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Micro Python: Python for Microcontrollers</title><description>&lt;p&gt;&lt;a href=&quot;http://www.kickstarter.com/projects/214379695/micro-python-python-for-microcontrollers&quot; title=&quot;Micro Python: Python for Microcontrollers&quot;&gt;Micro Python: Python for Microcontrollers&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I backed this Kickstarter for £28 (includes £4 for shipping to the USA).  Sounds like a bunch of fun over Arduino.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Micro Python is a lean and fast implementation of the Python programming language that is optimized to run on a microcontroller.  The Micro Python board is a small electronic circuit board that runs the Micro Python language.  The aim of this Kickstarter campaign is to make Micro Python open source software so you can use it in your own projects, and also to fund a small manufacturing run of Micro Python boards so that you can own one for yourself!&lt;/p&gt;&lt;/blockquote&gt;</description><link>https://blog.maestropublishing.com/2013/11/micro-python-python-for-microcontrollers.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4604437282989290623.post-558777297042438974</guid><pubDate>Fri, 15 Nov 2013 14:15:00 +0000</pubDate><atom:updated>2016-02-04T16:43:34.511-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">GPU</category><category domain="http://www.blogger.com/atom/ns#">Link</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Nvidia</category><category domain="http://www.blogger.com/atom/ns#">Ubuntu</category><title>GPUTest - Stress Test and Benchmarking for Linux</title><description>&lt;p&gt;&lt;a href=&quot;http://www.geeks3d.com/20131028/gputest-0-6-0-opengl-benchmark-for-windows-mac-os-x-and-linux-downloads/&quot; title=&quot;GPUTest - Stress Test and Benchmarking for Linux&quot;&gt;GPUTest - Stress Test and Benchmarking for Linux&lt;/a&gt;&lt;/p&gt;</description><link>https://blog.maestropublishing.com/2013/11/gputest-stress-test-and-benchmarking.html</link><author>noreply@blogger.com (Peter J. Farrell)</author><thr:total>0</thr:total></item></channel></rss>