tag:blogger.com,1999:blog-43945702954560019992024-03-19T12:16:26.144+01:00Jorgen’s WeblogAnonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comBlogger138125tag:blogger.com,1999:blog-4394570295456001999.post-85766704991866118792016-05-27T15:24:00.003+02:002016-05-27T15:24:54.981+02:00Circe 2.3 released<p>We just released version 2.3 of Circe, a Client for IRC in Emacs.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/circe/">Homepage</a></li>
</ul>
<p>The package is available from github, MELPA stable and MELPA unstable.
The latter will track further development changes, so use at your own risk.</p>
<a name='more'></a>
<h2>Changes</h2>
<ul>
<li>Circe (Lui) now has a track bar. Use <tt>(enable-lui-track-bar)</tt> to get
a bar where you stopped reading when you did hide a buffer.</li>
<li>Buffers are now by default limited to 100k, as large buffers cause
unreasonable slowdown in Emacs.</li>
<li>Autopaste now defaults to ix.io and also knows about ptpb.pw.</li>
<li>A number of faces have been updated to be nicer to the eye.</li>
<li>Improve compatibility with the Slack IRC gateway.</li>
<li>Lots of bug fixes.</li>
</ul>
<p>Thanks to defanor, Janis Dzerins and Vasilij Schneidermann for their contributions.</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-19643655129003718932016-04-14T18:22:00.003+02:002016-04-14T18:22:25.818+02:00Logging in New-Style Daemons with systemdI wrote an <a href="https://www.loggly.com/blog/logging-in-new-style-daemons-with-systemd/">article on logging in new-style daemons with systemd</a> for the nice folks at Loggly. systemd makes writing daemons a lot simpler in a number of ways. Logging correctly is among them.Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-43541818475162113692016-03-31T09:39:00.002+02:002016-03-31T09:39:47.162+02:00Can You Trust Your Logs?I wrote an article called <i>Can You Trust Your Logs?</i> about trust issues in log output which was published by the good folks at Loggly Inc. – <a href="https://www.loggly.com/blog/can-you-trust-your-logs/">read more</a>.Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-19617507578307754772016-03-29T10:59:00.000+02:002016-03-29T10:59:57.737+02:00Buttercup 1.5 released<p>I just released version 1.5 of Buttercup, the Behavior-Driven Emacs
Lisp Testing framework.</p>
<p>Buttercup is a behavior-driven development framework for testing
Emacs Lisp code. It is heavily inspired
by <a href="https://jasmine.github.io/">Jasmine</a>.</p>
<ul>
<li>
<a href="https://github.com/jorgenschaefer/emacs-buttercup/">
Homepage and documentation
</a>
</li>
</ul>
<a name='more'></a>
<h2>Installation and Use</h2>
<p>Buttercup is available
from <a href="http://stable.melpa.org/">MELPA Stable</a>.</p>
<p>Example test suite:</p>
<pre><code class="lisp">(describe "A suite"
(it "contains a spec with an expectation"
(expect t :to-be t)))
</code></pre>
<p>Suites group tests, and suites can be nested. Contrary to ERT,
suites can share set-up and tear-down code for tests, and Buttercup
comes with built-in support for mocks in the form of spies. See the
package homepage above for a full description of the syntax for test
suites and specs.</p>
<p>Buttercup comes with a shell script to run the default discover
runner. If used together with cask, <tt>cask exec buttercup</tt>
will find, load and run test suites in your project.</p>
<h2>Changes Since 1.4</h2>
<ul>
<li>The new <code>assume</code> form makes it easier to skip tests when certain assumptions do not hold (thanks to Sebastian Wiesner for the patch!)</li>
<li>Buttercup is now available in Debian 9 and Ubuntu 16.10 or later: <code>apt-get install elpa-buttercup</code> (thanks to Sean Whitton!)</li>
<li>The <code>describe</code> form now also takes a <code>:var</code> argument to make variables available in the body, removing one level of nesting compared to a <code>let</code></li>
<li>Pending specs are now tracked separately, making test run reports more easily readable</li>
<li>And a number bug fixes</li>
</ul>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-30472409644117661872016-02-26T17:40:00.001+01:002016-02-26T17:40:23.734+01:00Circe 2.2 released<p>We just released version 2.2 of Circe, a Client for IRC in Emacs.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/circe/">Homepage</a></li>
</ul>
<p>The package is available from github, MELPA stable and MELPA unstable.
The latter will track further development changes, so use at your own risk.</p>
<a name='more'></a>
<h2>Changes</h2>
<ul>
<li>Server configuration now accepts the <code>:reduce-lurker-spam</code> keyword
to set that variable.</li>
<li>Lui now supports inline markup with <code>*bold*</code> and similar. Customize
<code>lui-formatting-list</code> for this.</li>
<li><code>lui-add-input</code> is a new function to tell lui about new input that
did not originate from lui itself. It is added to the history.</li>
<li>Circe now adds the argument to <code>/query</code> to the chat history of a
query buffer.</li>
<li>The new variables <code>lui-time-stamp-time</code> and <code>lui-time-stamp-zone</code>
allow programmers to customize the time zone for time stamps in lui.</li>
<li>And lots of bug fixes.</li>
</ul>
<p>Thanks to Tom Willemse and Vasilij Schneidermann for their contributions.</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-4141255444520193192016-01-31T10:26:00.000+01:002016-01-31T10:26:01.422+01:00Elpy 1.11.0 released<p>I just released version 1.11.0 of Elpy, the Emacs Python
Development Environment. This is a feature release.</p>
<p>Elpy is an Emacs package to bring powerful Python editing to Emacs.
It combines and configures a number of other packages, both written in
Emacs Lisp as well as Python.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/elpy/">Homepage</a></li>
<li><a href="http://elpy.readthedocs.org/">Manual</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Features">Features</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Installation">Installation</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("elpy" .
"https://jorgenschaefer.github.io/packages/"))</code></pre>
<p>Then run <code>M-x package-install RET elpy RET</code>.</p>
<p>Finally, run the following (and add them to your <code>.emacs</code>):</p>
<pre><code class="lisp">(package-initialize)
(elpy-enable)</code></pre>
<h2>Changes in 1.11.0</h2>
<a name='more'></a>
<ul>
<li>Elpy now supports yapf in addition to autopep8 to format your code.</li>
<li>You can now adjust whether Elpy should hide modes from the mode line or not using <tt>elpy-remove-modeline-lighter</tt></li>
<li>When the new option <tt>elpy-disable-backend-error-display</tt> is set, Elpy will not show its error pop-up anymore. This can be useful if you run into an annoying bug in Jedi, for example.</li>
<li>New command <tt>elpy-goto-definition-other-window</tt> on <kbd>C-x 4 M-.</kbd>.</li>
<li>Expanding <tt>super</tt> now gives the short form supported in Python 3.</li>
<li>All Rope errors are now caught, as the upstream maintainers did not show interest in distinguishing between malformed input and bugs in their library.</li>
<li>Various other bug fixes.</li>
</ul>
<p>Thanks to ChillarAnand, Clément Pit–Claudel, Daniel Gopar, Moritz Kuett, Shuai Lin and Zhaorong Ma for their contributions!</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-20380270551899759392016-01-09T09:30:00.001+01:002016-01-09T09:30:47.412+01:00Buttercup 1.3 released<p>I just released version 1.3 of Buttercup, the Behavior-Driven Emacs
Lisp Testing framework.</p>
<p>Buttercup is a behavior-driven development framework for testing
Emacs Lisp code. It is heavily inspired
by <a href="https://jasmine.github.io/">Jasmine</a>.</p>
<ul>
<li>
<a href="https://github.com/jorgenschaefer/emacs-buttercup/">
Homepage and documentation
</a>
</li>
</ul>
<a name='more'></a>
<h2>Installation and Use</h2>
<p>Buttercup is available
from <a href="http://stable.melpa.org/">MELPA Stable</a>.</p>
<p>Example test suite:</p>
<pre><code class="lisp">(describe "A suite"
(it "contains a spec with an expectation"
(expect t :to-be t)))
</code></pre>
<p>Suites group tests, and suites can be nested. Contrary to ERT,
suites can share set-up and tear-down code for tests, and Buttercup
comes with built-in support for mocks in the form of spies. See the
package homepage above for a full description of the syntax for test
suites and specs.</p>
<p>Buttercup comes with a shell script to run the default discover
runner. If used together with cask, <tt>cask exec buttercup</tt>
will find, load and run test suites in your project.</p>
<h2>Changes Since 1.2</h2>
<ul>
<li>The test discovery can now skip tests based on a pattern,
given by the <tt>-p</tt> command line argument.</li>
<li>The <tt>buttercup-pending</tt> signal now takes an argument
which is displayed during spec execution. This enables users
to provide a visual explanation as to why a spec was skipped.</li>
</ul>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-7503786745855336692016-01-09T09:26:00.001+01:002016-01-09T09:26:34.553+01:00Why Journald?I wrote an article on <a href="https://www.loggly.com/blog/why-journald/"><em>Why Journald?</em></a> which was published on the blog of the nice people at <a href="https://www.loggly.com/">Loggly</a>.Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-45794483134798852442015-11-29T15:27:00.000+01:002015-11-29T15:27:44.642+01:00Circe 2.1 released<p>We just released version 2.1 of Circe, a Client for IRC in Emacs.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/circe/">Homepage</a></li>
</ul>
<p>The package is available from github, MELPA stable and MELPA unstable.
The latter will track further development changes, so use at your own risk.</p>
<a name='more'></a>
<h2>Changes</h2>
<ul>
<li>New option: <tt>circe-inhibit-nick-highlight-function</tt> – this allows
you to disable nick highlighting in some messages.</li>
<li>New extension: <tt>circe-new-day-notifier.el</tt> – show date changes in
chat buffers. (Thanks to Pásztor János!)</li>
<li>Improve Bitlbee support by adding a default port (6667) and
disabling lagmon if it is used.</li>
<li>Improved buttonizing of various references, like PEP links or Emacs
debbugs references.</li>
<li>Fix a bug that would confuse Emacs with lots of <tt>nil</tt> faces</li>
<li>Lots of other bug fixes.</li>
</ul>
<p>Thanks to Chunyang Xu, Pásztor János, Riccardo Murri and Vasilij Schneidermann for their contributions!</pi>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-48356687342680824022015-11-01T13:06:00.002+01:002015-11-01T13:06:39.635+01:00Elpy 1.10.0 released<p>I just released version 1.10.0 of Elpy, the Emacs Python
Development Environment. This is a feature release.</p>
<p>Elpy is an Emacs package to bring powerful Python editing to Emacs.
It combines a number of other packages, both written in Emacs Lisp as
well as Python.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/elpy/">Homepage</a></li>
<li><a href="http://elpy.readthedocs.org/">Manual</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Features">Features</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Installation">Installation</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("elpy" .
"https://jorgenschaefer.github.io/packages/"))</code></pre>
<p>Then run <code>M-x package-install RET elpy RET</code>.</p>
<p>Finally, run the following (and add them to your <code>.emacs</code>):</p>
<pre><code class="lisp">(package-initialize)
(elpy-enable)</code></pre>
<h2>Changes in 1.10.0</h2>
<a name='more'></a>
<ul>
<li>Marking the current indentation level at the top level will now mark
the whole buffer.</li>
<li>The region will be normalized before re-indenting it, making the
behavior more predictable for partially marked lines.</li>
<li>Using autopep8 on the whole buffer will now keep point (roughly) at
the same location as it was.</li>
<li>The autopep8 code now also uses the same configuration options as
the command line tool.
<li>Malformed JSON data from the backend is now handled better.</li>
<li> RPC processes are restarted when the current virtualenv changes.</li>
<li>Python 3.5 is now officially supported.</li>
<li>Flymake will now not be enabled in buffers without file name, where
it can't run anyhow, or when the checker program does not exist in
the first place.</li>
<li>It is now possible to ask Elpy not to remove the mode line lighter
of company mode, which can be useful if you use company in other
modes.</li>
<li>Test discovery now also allows file names without "test" in them to
be tested. Classes and methods still require the substring, though.</li>
<li>Spurious equals signs at the end of completions from Jedi will now
be ignored.</li>
<li>Various other bug fixes.</li>
</ul>
<p>Thanks to ChillarAnand and Georg Brandl for their contributions!</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-79941406354077646542015-09-27T12:14:00.002+02:002015-09-27T12:14:42.350+02:00Buttercup 1.2 released<p>I just released version 1.2 of Buttercup, the Behavior-Driven Emacs
Lisp Testing framework.</p>
<p>Buttercup is a behavior-driven development framework for testing
Emacs Lisp code. It is heavily inspired
by <a href="https://jasmine.github.io/">Jasmine</a>.</p>
<ul>
<li>
<a href="https://github.com/jorgenschaefer/emacs-buttercup/">
Homepage and documentation
</a>
</li>
</ul>
<a name='more'></a>
<h2>Installation and Use</h2>
<p>Buttercup is available
from <a href="http://stable.melpa.org/">MELPA Stable</a>.</p>
<p>Example test suite:</p>
<pre><code class="lisp">(describe "A suite"
(it "contains a spec with an expectation"
(expect t :to-be t)))
</code></pre>
<p>Suites group tests, and suites can be nested. Contrary to ERT,
suites can share set-up and tear-down code for tests, and Buttercup
comes with built-in support for mocks in the form of spies. See the
package homepage above for a full description of the syntax for test
suites and specs.</p>
<p>Buttercup comes with a shell script to run the default discover
runner. If used together with cask, <tt>cask exec buttercup</tt>
will find, load and run test suites in your project.</p>
<h2>Changes Since 1.1</h2>
<ul>
<li>The <tt>:to-have-been-called-with</tt> matcher now shows the
actual call arguments in addition to the expected ones to make it
easier to figure out what went wrong.</li>
<li>Interactive test calls now show the end of the output buffer to
make it easier to see results, and do not change the selected
window in case of errors anymore.</li>
<li>Test discovery now does not accidentally load non-Lisp files
anymore, and excludes dotfiles more reliably.</li>
</ul>
<p>Many thanks to Matus Goljer for testing and bugfixes!</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-21457490891941856072015-08-30T14:18:00.000+02:002015-09-03T09:46:23.035+02:00Elpy 1.9.0 released<p>I just released version 1.9.0 of Elpy, the Emacs Python Development
Environment. This is a feature release.</p>
<p>Elpy is an Emacs package to bring powerful Python editing to Emacs.
It combines a number of other packages, both written in Emacs Lisp as
well as Python.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/elpy/">Homepage</a></li>
<li><a href="http://elpy.readthedocs.org/">Manual</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Features">Features</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Installation">Installation</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("elpy" .
"https://jorgenschaefer.github.io/packages/"))</code></pre>
<p>Then run <code>M-x package-install RET elpy RET</code>.</p>
<p>Finally, run the following (and add them to your <code>.emacs</code>):</p>
<pre><code class="lisp">(package-initialize)
(elpy-enable)</code></pre>
<h2>Changes in 1.9.0</h2>
<a name='more'></a>
<ul>
<li>Elpy now supports the <code>autopep8</code> library for
automatically formatting Python code. All refactoring-related code
is now grouped under <code>C-c C-r</code>. Use <code>C-c C-r
i</code> to fix up imports using importmagic, <code>C-c C-r
p</code> to fix up Python code with autopep8, and <code>C-c C-r
r</code> to bring up the old Rope refactoring menu.</li>
<li><code>C-c C-b</code> will now select a region containing
surrounding lines of the current indentation or more.</li>
<li><code>C-c C-z</code> in a Python shell will now switch back to
the last Python buffer, allowing to use the key to cycle back and
forth between the Python buffer and shell.</li>
<li>The pattern used for <code>C-c C-s</code> is now customizeable in
<code>elpy-rgrep-file-pattern</code>.</li>
<li><code><C-return></code> now can be used to send the
current statement to the Python shell. Be careful, this can break
with nested statements.</li>
<li>The Elpy minor mode now also works in modes derived from
<code>python-mode</code>, not just in the mode itself.</li>
</ul>
<p>Thanks to ChillarAnand, raylu and Chedi for their contributions!</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-32926749165782070192015-08-10T13:26:00.001+02:002015-08-10T13:30:28.961+02:00Circe 2.0 released – Circe turns 10<p>We just released version 2.0 of Circe, the Client for IRC in Emacs.</p>
<p>Circe is a Client for IRC in Emacs. It tries to have sane defaults,
and integrates well with the rest of the editor, using standard Emacs
key bindings and indicating activity in channels in the status bar so
it stays out of your way unless you want to use it.</p>
<p>This is an anniversary release – today 10 years ago, Circe has had
its first commit! Since then, the code base expanded quite a bit and
Circe has gained a lot of good features, contributed by over a dozen
people over time. And the client now has a number of users.</p>
<p>It's a weird feeling when you realize that this piece of software you wrote because you were unhappy with the existing solutions not only has been with you for a decade, but has other people using and contributing to it.</p>
<p>Major thanks to all the awesome people I know through this software. On to the next 10 years!</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/circe/">Homepage</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("melpa-stable" . "http://stable.melpa.org/packages/") t)
(package-initialize)</code></pre>
<p>Then run <code>M-x package-install RET circe RET</code>.</p>
<p>After this, <code>M-x circe</code> should work.</p>
<h2>Changes in 2.0</h2>
<a name='more'></a>
<ul>
<li>Circe has had its IRC backend completely rewritten. It is now a separate library, <code>irc.el</code>, and much more powerful. Alas, this means a lot of existing configuration code will break.</li>
<li>Because of this, Circe now fully supports SASL authentication, extended joins, and a few other modern IRC capabilities.</li>
<li>XKCD references, CVE numbers and github issues are now buttonized.</li>
<li>All IRC buffers change to the home directory by default.</li>
<li>Circe now uses <a href="https://github.com/jorgenschaefer/emacs-buttercup">buttercup</a> for tests and Travis-CI for continuous integration tests.</li>
<li>A number of options were removed to focus on sensible defaults. Re-check your configuration.</li>
<li>Nick colors are now pre-computed to make them more appropriate for the current display and more distinct from each other.</li>
<li>A lot of format strings have been added. Check the <code>circe-format</code> customization group.</li>
</ul>
<p>Thanks to Vasilij Schneidermann, Taylan Ulrich Bayırlı/Kammer, Steve Purcell and Alex Dunn for their contributions!</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-11242068121948911112015-05-02T16:45:00.002+02:002015-05-02T16:45:56.730+02:00Elpy 1.8.0 released<p>I just released version 1.8.0 of Elpy, the Emacs Python Development
Environment. This is a feature release.</p>
<p>Elpy is an Emacs package to bring powerful Python editing to Emacs.
It combines a number of other packages, both written in Emacs Lisp as
well as Python.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/elpy/">Homepage</a></li>
<li><a href="http://elpy.readthedocs.org/">Manual</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Features">Features</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Installation">Installation</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("elpy" .
"http://jorgenschaefer.github.io/packages/"))</code></pre>
<p>Then run <code>M-x package-install RET elpy RET</code>.</p>
<p>Finally, run the following (and add them to your <code>.emacs</code>):</p>
<pre><code class="lisp">(package-initialize)
(elpy-enable)</code></pre>
<h2>Changes in 1.8.0</h2>
<a name='more'></a>
<ul>
<li>Emacs 24.5 is now officially supported</li>
<li>The new configuration option <tt>elpy-rpc-ignored-buffer-size</tt> defines a maximum buffer size to be handle completion in, to avoid laggy interaction in unusually large files</li>
<li>Indentation block movement was replaced with code that just moves the marked block or the current line; this should be a lot less magical and more predictable</li>
<li>Running the test at point now correctly ignores any inner methods</li>
<li>Jedi docstrings now show the full name of the object</li>
<li>The RPC interpreter is now chosen correctly on cygwin</li>
<li><tt>elpy-shell-send-region-or-buffer</tt> now warns of tabs in the data being sent</li>
<li>Elpy now binds stdout and stderr to <tt>/dev/null</tt> to avoid being confused by spurious output from other libraries</li>
<li>RPC buffers (and processes) are removed after some time to avoid them piling up endlessly</li>
<li>It is not possibly anymore to use customize alone to use ipython, because of some bad interaction between custom options in Elpy and python.el</li>
<li>And lots of bugfixes (50 issues closed!)</li>
</ul>
<p>Thanks to Aaron Schumacher, Clément Pit–Claudel, Georg Brandl, Pierre Allix, Roshan Shariff and Simen Heggestøyl for their contributions!</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-40117964374274283022015-04-26T19:46:00.001+02:002015-04-26T19:46:27.094+02:00Buttercup 1.1 Released<p>I just released version 1.1 of Buttercup, the Behavior-Driven Emacs
Lisp Testing framework.</p>
<p>Buttercup is a behavior-driven development framework for testing
Emacs Lisp code. It is heavily inspired
by <a href="https://jasmine.github.io/">Jasmine</a>.</p>
<ul>
<li>
<a href="https://github.com/jorgenschaefer/emacs-buttercup/">
Homepage and documentation
</a>
</li>
</ul>
<a name='more'></a>
<h2>Installation and Use</h2>
<p>Buttercup is available
from <a href="https://marmalade-repo.org/">Marmalade</a>
and <a href="http://stable.melpa.org/">MELPA Stable</a>.</p>
<p>Example test suite:</p>
<pre><code class="lisp">(describe "A suite"
(it "contains a spec with an expectation"
(expect t :to-be t)))
</code></pre>
<p>Suites group tests, and suites can be nested. Contrary to ERT,
suites can share set-up and tear-down code for tests, and Buttercup
comes with built-in support for mocks in the form of spies. See the
package homepage above for a full description of the syntax for test
suites and specs.</p>
<p>Buttercup comes with a shell script to run the default discover
runner. If used together with cask, <tt>cask exec buttercup</tt>
will find, load and run test suites in your project.</p>
<h2>Changes Since 1.0</h2>
<ul>
<li>Buttercup now sports a full reporter interface, in case you want
to write your own reporter. By default, there is a batch and an
interactive reporter.</li>
<li>Reporters now display failed tests properly at the end of the
test run, together with a properly-formatted backtrace.</li>
<li>Pending specs and disabled suites as in Jasmine are now
supported.</li>
<li>Emacs 24.5 is now officially supported.</li>
<li>There’s now a buttercup script to run the most common command
line.</li>
<li>Test runners are now autoloaded.</li>
<li>Test discovery now ignores dot files and dot directories.</li>
<li>Buttercup tests can now be instrumented with Edebug.</li>
</ul>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-59503193211006503262015-03-27T21:12:00.000+01:002015-03-27T21:12:36.925+01:00Buttercup 1.0 released<p>I just released version 1.0 of Buttercup, the Behavior-Driven Emacs
Lisp Testing framework.</p>
<p>Buttercup is a behavior-driven development framework for testing
Emacs Lisp code. It is heavily inspired
by <a href="https://jasmine.github.io/">Jasmine</a>.</p>
<ul>
<li>
<a href="https://github.com/jorgenschaefer/emacs-buttercup/">
Homepage
</a>
</li>
</ul>
<h2>Installation and Use</h2>
<p>Buttercup is available
from <a href="https://marmalade-repo.org/">Marmalade</a>
and <a href="http://stable.melpa.org/">MELPA Stable</a>.</p>
<p>Example test suite:</p>
<pre><code class="lisp">(describe "A suite"
(it "contains a spec with an expectation"
(expect t :to-be t)))
</code></pre>
<p>See the package homepage above for a full description of the syntax
for test suites and specs.</p>
<p>If placed in a file named like <code>my-test.el</code>, this
command executed in the same directory will run the suite:</p>
<pre>
emacs -batch -l buttercup.el -f buttercup-run-discover
</pre>
Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-18220516041379392062015-03-06T14:26:00.000+01:002015-03-06T14:26:13.545+01:00Circe 1.6 released<p>We just released version 1.6 of Circe, a Client for IRC in Emacs.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/circe/">Homepage</a></li>
</ul>
<p>The package is available from github, Marmalade, MELPA stable and
MELPA unstable, even though the latter will track further
development changes, so use at your own risk.</p>
<a name='more'></a>
<h2>Changes</h2>
<ul>
<li>The <tt>auto-join-channels</tt> setting now also accepts an
<tt>:after-cloak</tt> specifier to join channels only after the user’s
hostname was successfully cloaked.</li>
<li>Scrolling behavior now tries to keep the input line at the
bottom of the window via various methods by default. See the
docstring for <tt>lui-stroll-behavior</tt> for details.</li>
<li>A channel buffer is now created already when a <TT>/JOIN</TT> command
is issued. This makes new buffer behavior less confusing.</li>
<li>Tab completion now excludes your own nick. Sorry, talking to
yourself has become more complicated.</li>
<li>Circe’s various modes now include separate keymaps so you can
easily specify keys that work in all chat modes or even in all
Circe modes the same way.</li>
<li>Logging can now create subdirectories, allowing for formats like
<tt>"{buffer}/%Y-%m-%d.txt"</tt>.</li>
<li>The circe-color-nicks module won’t highlight Nicks anymore after
they have left the channel. It also now includes a way of
excluding nicks from highlighting, to avoid common-word nicks
polluting normal messages. Various other bugfixes were included,
too.</li>
</ul>
<p>Thanks to defanor, Taylan Ulrich Bayırlı, and Vasilij Schneidermann for
making this release possible!</p>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-77797737182806447652015-02-06T19:16:00.000+01:002015-02-06T19:16:01.112+01:00Elpy 1.7.0 released<p>I just released version 1.7.0 of Elpy, the Emacs Python Development
Environment. This is a feature release.</p>
<p>Elpy is an Emacs package to bring powerful Python editing to Emacs.
It combines a number of other packages, both written in Emacs Lisp as
well as Python.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/elpy/">Homepage</a></li>
<li><a href="http://elpy.readthedocs.org/">Manual</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Features">Features</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Installation">Installation</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("elpy" .
"http://jorgenschaefer.github.io/packages/"))</code></pre>
<p>Then run <code>M-x package-install RET elpy RET</code>.</p>
<p>Finally, run the following (and add them to your <code>.emacs</code>):</p>
<pre><code class="lisp">(package-initialize)
(elpy-enable)</code></pre>
<h2>Changes in 1.7.0</h2>
<a name='more'></a>
<ul>
<li>Elpy now can add missing import directives automatically, by
using Alec Thomas'
excellent <a href="https://github.com/alecthomas/importmagic">importmagic</a>
library. Use <tt>C-c C-m</tt> to add a single import statement,
or <tt>C-c C-S-m</tt> to include all missing import statements.
Many thanks to Georg Brandl for doing a lot of work to bring this
feature to Elpy!</li>
<li>The Jedi backend now also supports <tt>C-c C-d</tt> to display a
docstring. Thanks again to Georg Brandl for the patch.</li>
<li>It is now possible to disable the display of the current function in
the echo area by setting <tt>elpy-eldoc-show-current-function</tt> to
<tt>nil</tt>.</li>
<li>idomenu was removed as a dependency. Elpy did not have any
particular provision for this aside from loading it. Users who
want to keep using it can just install the package manually.</li>
<li>Twisted's Trial test runner is now supported. Thanks to Elric
Milon for the patch!</li>
<li>All test runners now use a variable to decide which command to run,
which for example allows using <tt>manage.py</tt> for the Django test
runner, or your own test script which sets up the environment
correctly.</li>
<li>Emacs 24.4 is now officially supported.</li>
<li>Various bugfixes.</li>
</ul>
More thanks go out to Georg Brandl, fleimgruber, Eric Hanchrow, Elric
Milon and eduardo naufel schettino for their contributions.Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-57780884970618381912015-01-24T18:39:00.000+01:002015-01-24T18:39:36.458+01:00The Low-Fad Diet<p>I am not sure if there is any other single topic where you can find so
much confusing, contradicting, and absolutely misleading information
as on diets and nutrition. Regardless of what, how or when you like to
eat, you can find someone who demonizes that as the root cause for any
failing diet, and for pretty much any major (or minor) food component,
you can find someone who will decry it as the sole cause of all that
is bad in the world.</p>
<p>This is weird, as the science, while certainly not settled and with
many fields of research still open, is actually quite solid on the
general ideas.</p>
<p>I used to weigh just shy of 127 kg. I have lost over 40 kg since then.
Without following any fad diet. And I was enjoying myself the whole
time. What follows are ideas I have collected over the years, based on
reading medical studies and what I have experimented with myself.</p>
<a name='more'></a>
<p>This means I am just another voice in the chorus of people online
talking about nutrition. So do not take my word as the law. But if
this post helps you to lose weight and live healthier and happier
life, that would make me very happy.</p>
<p>Yes, this post is directed at overweight people. There is a real issue
with underweight, and I can only urge you to be careful if you fall
into that category. But I have no experience with that.</p>
<h1>Motivation and Mind Set</h1>
<h2>Lifestyle Change</h2>
<p>You are not overweight because of that one ginormous cake two weeks
ago, or that huge buffet last month. While such singular incidents can
have an impact, they alone would not be a problem.</p>
<p>You are overweight because of small, bad decisions every day.</p>
<p>This means that to permanently lose weight, you need to change the way
you live. There is nothing you can do for a few weeks and be done with
it.</p>
<p>Whatever you do, make sure that you can sustain it not just for a few
weeks, but forever. If a diet is too restrictive for that, it won’t
help you in the long term.</p>
<h2>Root Causes</h2>
<p>At some point, do take the time to think about why you are overweight.
It is likely that you are at least slightly depressed, unhappy with
something—or even many things. Do work on that in addition to the
other things you do.</p>
<p>If you feel it is impossible to work against unhappiness, do not
hesitate to seek professional help. Depression is very real, and not
unusual. Sometimes, it needs help from a professional to break out.</p>
<h2>Goals</h2>
<p>Losing weight won’t solve your problems. You won’t suddenly find
friends, the love of your live, have more fun in general, attend more
parties, or anything like that just because you lost weight.</p>
<p>Losing weight can make you happier, more healthy, and more active in
general.</p>
<p>Consequently, lose weight because you love your body and want to do
something good for it. If you hate your body, losing weight won’t
change that.</p>
<h2>Eating Disorder</h2>
<p>Losing weight is hard, takes time, and requires some focus on the
changes you implement in your life. This is ok. Especially the first
month or two requires learning, un-learning and re-learning many
things, so it will take time and focus. But you are in this for the
long haul. After a few months, the diet should be something you have
in the back of your head, not something that occupies your thoughts
the whole time. It is all too easy to develop an eating disorder that
way.</p>
<p>Do not become obsessed with food, “good” and “bad” food types, diet
rules, and whatnot. If the diet requires you to be vigilant all the
time, it is a bad diet.</p>
<p>The rules and guidelines I talk about here are meant to help you find
a way to live a happy life. They are not meant to suffocate you or
make you unhappy. Do not forget this.</p>
<h1>Diet</h1>
<p>Your diet is the one single thing that will make or break your goal of
losing weight. You can lose weight with the right diet no matter what
else you do. Without the right diet, it does not matter what else you
do, you will still not lose weight.</p>
<p>While there are long discussions even among scientists about different
aspects of a good diet, all these differences are minor compared to
one overarching factor: Calories. In the end, fat is an energy store.
Food contains energy, your body requires energy to function. If you
take in more energy than your body needs, there is an energy surplus
which will be stored as fat. If you take in less energy than your body
needs, it will get the energy from stored reserves. It really is as
simple as that.</p>
<p>Every aspect of your diet is there to help you achieve a negative
energy balance without being constantly hungry or having to worry
about it all the time. Whatever works for you to achieve this goal is
a good diet for you. Whatever does not work for you is a bad diet.</p>
<p>Also, your calorie goal is not only an upper limit of what you may
eat, it is also a lower limit of what you <em>should</em> eat.</p>
<p>One of the psychological problems I had to overcome when I was obese
was that I always felt slightly bad when eating something. All the
time I was thinking: I’m eating <em>again</em>. I probably shouldn’t eat
this. I had a constant, low-key negative feeling every time I ate
something. If you have a similar problem, use the calorie goal to
combat it: You <em>may</em> eat this amount of food. It is <em>fine</em> to eat
this. Actually, you <em>should</em> eat this!</p>
<h2>Calorie Consumption</h2>
<p>The first step is to figure out how many calories you expend per day
at your goal weight. Once you know that, you know you can eat that
amount, and your body will level out at the appropriate weight all by
itself.</p>
<p>Humans are all different, though, so figuring out the exact amount of
calories you expend is not easy. There are formulas for this, but they
only give you an approximation. What I did was to use the amount of
calories I expend doing nothing but sitting at home, and aim for that.
This is almost certainly less than the amount of calories I really
expend, as any kind of movement, walking, chores or exercise adds to
it, so it should let me lose weight in any case, but it’s not so
little that it would be impossible to sustain. Also, this takes into
account that we generally underestimate the amount of calories we
consume, and allows for some cheat days, so it’s a nice general rule
of thumb.</p>
<style type="text/css">
form#calc {
float: right;
border: 1px solid #bbb;
margin: 0 0 0.5em 1em;
}
#calc table {
padding: 0.2em;
}
#calc select, #calc button {
width: 100%;
}
</style>
<form action="#" id="calc">
<script type="text/javascript">
function calcGoalWeight () {
var height = parseFloat(document.getElementById("height").value),
age = parseFloat(document.getElementById("age").value),
goalBmi = 25,
kg = 25 * (height / 100) * (height / 100),
weightElt = document.getElementById("weight");
weightElt.value = kg.toFixed(1);
return false;
}
function calcGoalCalories () {
var height = parseFloat(document.getElementById("height").value),
age = parseFloat(document.getElementById("age").value),
sexSelect = document.getElementById("sex"),
sex = sexSelect.options[sexSelect.selectedIndex].value,
weight = parseFloat(document.getElementById("weight").value);
if (isNaN(weight)) {
calcGoalWeight();
weight = parseFloat(document.getElementById("weight").value);
}
var bmr = (10 * weight +
+ 6.25 * height
- 5 * age
+ (sex == "m" ? 5 : -161)),
kcalElt = document.getElementById("kcal");
kcalElt.innerHTML = bmr.toFixed(0);
}
</script>
<table>
<tr><td>Height (cm):</td><td><input type="number" id="height"></td></tr>
<tr><td>Age (years):</td><td><input type="number" id="age"></td></tr>
<tr><td>Sex:</td>
<td>
<select name="sex" id="sex">
<option value="m">Male</option>
<option value="f">Female</option>
<option value="m">Other</option>
</select>
</td></tr>
<tr><td colspan="2"><hr></td></tr>
<tr><td>Goal weight (kg):</td><td><input type="text" id="weight"></td></tr>
<tr><td></td><td><button onclick="calcGoalWeight(); return false;">Calculate goal weight</button></td></tr>
<tr><td colspan="2"><hr></td></tr>
<tr><td>Energy (kcal/day):</td><td><span id="kcal"></span></td></tr>
<tr><td></td><td><button onclick="calcGoalCalories(); return false;">Calculate energy need</button></td></tr>
</table>
</form>
<p>The calculator to the right does two things. First, it calculates a
goal weight for you. You can use that, or you can set something else.
Especially if you are very far from that goal, aiming for a
intermediate weight at first is a good idea. Then it uses that goal
weight and gives you the calories an average human being of your size,
age and sex expends at this weight.</p>
<p>The goal weight is calculated using the <a href="http://en.wikipedia.org/wiki/Body_mass_index">Body Mass Index (BMI)</a>.
While not ideal for individuals, it can give you a rough ballpark
number for your height. The goal weight here will give you a BMI of
25, which is officially normal weight. If you are there, you’re doing
fine. There is no medical reason to lose more weight.</p>
<p>The energy consumption is calculated using the
<a href="http://en.wikipedia.org/wiki/Basal_metabolic_rate#BMR_estimation_formulas">estimation formula by Mifflin and St. Jeor</a>. An
average person of your height, age, and sex at the given weight,
sitting at home, doing nothing, will most likely expend around that
amount of calories per day. As it is an estimate, you can round it to
the next 100s for easier memorizing. Nothing much is lost that way.</p>
<p>This means that the whole calorie number gives you some wiggle room.
It’s an estimate. Likewise, you can usually only estimate the amount
of calories in your food. Sometimes, you will consume more, sometimes
less. In the long run, if you aim for this number, it’ll all balance
out, but, most importantly, you do not have to be too meticulous about
it. Remember, you’re here for the long run.</p>
<h2>Diet Plan</h2>
<p>Now you have your calorie goal. As I said, the rest is just about
finding ways of sticking to the calorie goal without having to worry
about it all the time. This is the part where you have to find what
works for you and what does not. People are different. What follows
are ideas that worked for me. Try them if you like, and also do find
ways that work for you.</p>
<p>I structured my day into three meals, breakfast, lunch and dinner.
Each meal got a defined time so I not only eat when I’m hungry, but
also know that I just have to hold out for another hour and I’m fine.
I then split my calorie goal between the three, and did not consume
any calories in between those meals.</p>
<p>My usual breakfast consists of bread with jelly or honey. I used a
scale to measure how much jelly I put on my bread, and found out that
two slices of my favorite bread with the usual amounts of jelly or
honey add up to 450-500 kcal. Ok, so if I assume my breakfast gives me
that, I can just eat my normal breakfast, stick to two slices of bread
with topping, and not worry about calculating anything there.</p>
<p>Due to my job, I do eat warm during the day and not in the evening, so
my usual dinner consists of more bread, with cheese and sausage as
toppings. I did calculate this once here, too, and figured out that
two slices of bread with my usual toppings amount to 450-500 kcal,
too. Incidentally, no matter what topping I used, if I left out the
most calorie rich ones. So, normal dinner, no special measuring
required here, either.</p>
<p>This means I consume 900-1000 kcal for breakfast and dinner. The
calculator above gives me about 1700 kcal, which leaves me with 700
kcal for lunch. I asked the cafeteria I usually eat at, and their
usual meals vary around 600-700 kcal. That actually gives me some
space for a dessert sometimes.</p>
<p>On weekends, I cook myself and I created my recipes to fit my calorie
goal, too. No snacks on any day, and only calorie-free drinks. That
means water, unsweetened tea, black coffee, or zero calorie sodas, all
are fine.</p>
<p>So unless I experiment with a new recipe, I do not really do calorie
calculation day to day at all. When I get hungry, I know when I will
get to eat the next time, and that’s usually enough to get me over the
day, because I do not eat so little that I couldn’t sustain it. If I
absolutely can’t wait for the next meal, I have some carrots, bell
peppers and similar low-calorie foods at home to bridge the time, but
I try to avoid having to resort to that.</p>
<p>Which means my diet plan is rather simple: Two slices of bread with
any of my usual toppings for breakfast, any option at the cafeteria I
usually eat at for lunch, and two slices of bread with any of my usual
toppings for dinner.</p>
<p>This is the kind of diet plan you should aim for. It’s simple so you
do not have to worry about it all the time, it allows for enough
variety so you do not get bored, and it is designed to stick to your
calorie goal.</p>
<h2>Cheat Days</h2>
<p>Your calorie goal is almost certainly below the amount of calories you
consume. This means if you stick to that goal for most days, you will
lose weight. But it also means you can, from time to time, consume
more than your goal. All that will do is slow your weight loss down,
it won’t break it.</p>
<p>If you are invited to a party with friends, forget your diet and
calorie goal for the evening. You don’t have to overdo it, but please,
do enjoy yourself. Your diet is meant to help you have a happier life,
not to ruin it.</p>
<p>Just make sure that you do not fall for having a cheat day too often.
That’s not how it works.</p>
<h2>More Healthy Diet</h2>
<p>One of the largest health complications from diets is due to obesity
and being overweight. Simply losing weight will mean you are much,
much more healthy than ever before. No matter what exactly you eat.
For healthy living, I could stop here and be done with it. But some
people want to do more than to lose weight, and pick more healthy
foods over less healthy ones. And there is a whole load of bad advice
on that available online, too.</p>
<p>If you ever see any dietary advice that tells you to “detox” yourself,
run screaming in the other direction. Or at least ignore it. Nothing
you can buy as food in western civilizations is, in moderate
quantities, dangerous for you. There are long trials and admission
requirements. If you absolutely love that deep fried marshmallow
pizza, do eat it (from time to time, and keep to your calorie goal).
There is no type of food that you can’t ever eat. Remember, your diet
is here to help you have a happier life.</p>
<p>Still, if you want, there are some more guidelines that can help you
improve your diet. For these, I recommend looking at national dietary
guidelines over ad-riddled, click-baiting blogs.</p>
<p>For example the <a href="http://www.who.int/mediacentre/factsheets/fs394/en/">WHO Healthy Diet Factsheet</a> gives a few good rules
on the contents of a healthy diet:</p>
<ul>
<li>fruits, vegetables, legumes (e.g. lentils, beans), nuts and whole
grains (e.g. unprocessed maize, millet, oats, wheat, brown rice);</li>
<li>at least 400 g (5 portions) of fruit and vegetables a day. Potatoes,
sweet potatoes, cassava and other starchy roots are not classified
as fruits or vegetables;</li>
<li>less than 10% of total energy from free sugars equivalent to 50g (or
around 12 level teaspoons), but possibly less than 5% of total
energy for additional health benefits. Most free sugars are added to
foods by the manufacturer, cook or consumer, and can also be found
in sugars naturally present in honey, syrups, fruit juices and fruit
concentrates;</li>
<li>less than 30% of total energy from fat. Unsaturated fats (e.g. found
in fish, avocado, nuts, sunflower, canola and olive oils) are
preferable to saturated fats (e.g. found in fatty meat, butter, palm
and coconut oil, cream, cheese, ghee and lard). Industrial trans
fats (found in processed food, fast food, snack food, fried food,
frozen pizza, pies, cookies, margarines and spreads) are not part of
a healthy diet;</li>
<li>less than 5 g of salt (equivalent to approximately one teaspoon) per
day and use iodized salt.</li>
</ul>
<p>Note that they do say “less than” and “at least”, not “no” and “only”.
For example, you can eat meat on a healthy diet, but do reduce it to
reduce the saturated fat intake. This means lean white meat is
preferable to fatty red meat, and fish with its larger amounts of
unsaturated fat is preferable to white meat. But if you get invited to
that barbecue with the excellent lamb steaks, enjoy them. Just don’t
do that all the time.</p>
<p>If you want an even more condensed form, the following works as well:</p>
<ul>
<li>Eat more vegetables and fruits</li>
<li>Prefer whole grains over processed grains</li>
<li>Prefer unsaturated fats over saturated fats</li>
<li>Reduce fat, sugar and salt</li>
</ul>
<p>Most online healthy diet advice is way too complex and mostly wrong.</p>
<h1>Exercise</h1>
<p>Exercise is a hot topic. Many people hate it, and many discussions on
losing weight focus on it. You can lose weight without exercise. You
can not lose weight without a good diet. So focus on the diet first
and foremost.</p>
<p>But exercise helps with losing weight a lot, and it’s also important
for general health, so it would not be good to ignore it completely.
Exercise will help you control hunger thus reduce calorie intake, burn
calories, and make you more fit in general, which means you move more,
which also burns more calories. It’s just a good idea overall.</p>
<p>The
<a href="http://www.who.int/dietphysicalactivity/factsheet_adults/en/">WHO recommends 150 minutes of physical activity per week</a>.
That’s 2.5 hours. And it does not matter so much <em>what</em> you do, as
long as you do it.</p>
<p>What helped me here was to simply pick two or three days a week and a
time on that day where I do my sports. For example, Monday and
Thursday after work, go to the gym for one hour. Walk to get groceries
on Saturday, that’s half an hour. You already reached your exercise
goal.</p>
<p>The trickiest part is finding some kind of sports that you can stick
to. Running, walking, workouts at home, gym, swimming, etc. are all
ideas. If you have a sports club nearby, consider joining. Team up
with a friend and make it part of your pastime. Do whatever you like,
but <em>do</em> it.</p>
<h1>Summary</h1>
<p>That’s about it, my advice for losing weight and living a happier
life. Aim for a change in your lifestyle, because that’s the only way
to get lasting results. Know how many calories you can eat every day
to reach your target weight, and use that both as a limit and as an
allowance, enabling yourself to enjoy that amount of food to its
fullest extend. Do incorporate some exercise into your weekly routine,
and do not let any of this ruin your life.</p>
<p>It’s not magic, and very doable.</p>
<p>Good luck. I know you can do it.</p>
<span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rft.type=blogPost&rft.format=text&rft.au=Jorgen+Sch%C3%A4fer&rft.title=The+Low-Fad+Diet&rft.date=2015-01-24"></span>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-48317452197709784792014-10-31T17:56:00.001+01:002014-10-31T17:56:59.625+01:00Elpy 1.6.0 released<p>I just released version 1.6.0 of Elpy, the Emacs Python Development Environment.
This is a feature release.</p>
<p>Elpy is an Emacs package to bring powerful Python editing to Emacs. It
combines a number of other packages, both written in Emacs Lisp as
well as Python.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/elpy/">Homepage</a></li>
<li><a href="http://elpy.readthedocs.org/">Manual</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Features">Features</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Installation">Installation</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("elpy" .
"http://jorgenschaefer.github.io/packages/"))</code></pre>
<p>Then run <code>M-x package-install RET elpy RET</code>.</p>
<p>Finally, run the following (and add them to your <code>.emacs</code>):</p>
<pre><code class="lisp">(package-initialize)
(elpy-enable)</code></pre>
<h2>Changes in 1.6.0</h2>
<a name='more'></a>
<ul>
<li>When point is on a line with a flymake error, Elpy will now show the
error in the echo area.</li>
<li>The movement commands (<tt>C-<cursor></tt>) have been reworked again.
Going left and right will now move by indentation levels left of the
current indentation, i.e. jump four spaces, and by words right of
the current indentation. Going up and down will go to the previous
or next line with the indentation level point is at, not the
indentation the line has. Try it, it's more difficult to explain
than to use.</li>
<li>Completion results are now sorted more sensibly, with
single-underscore symbols at the end, and double-underscore symbols
after normal symbols, but before single-underscore ones.</li>
<li><tt>M-x elpy-config</tt> will now point out if there are newer versions
available for packages used by Elpy.</li>
<li><tt>M-x elpy-config</tt> will now warn if <tt>~/.local/bin</tt> is not in
<tt>PATH</tt> while there is no virtualenv active.</li>
<li>The <tt>M-x elpy-version</tt> command is back by popular demand.</li>
<li>RPC buffers used by Elpy are now hidden by default, having a space
at the beginning of the name.</li>
<li>When the Rope library throws an error, Elpy will now also attempt to
provide reproduction steps. This used to only happen for Jedi.</li>
<li>Various bug fixes.</li>
</ul>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-69428059196651173582014-10-26T17:42:00.000+01:002014-10-26T17:42:18.809+01:00The Paradox of Freedom of Speech<p>Freedom of speech needs to be restricted to protect freedom of speech.</p>
<p>This apparent paradoxical statement is well-founded in philosophy, but
it is the cause of much confusion in online debates. Quite regularly,
any kind of moderation activity in comment sections or other
discussion spaces is likened to censorship, with the argument that the
basic human right of freedom of speech needs to be protected.</p>
<p>While it is possible to silence all dissent using moderation, most of
the time when freedom of speech is invoked, it is done in the
misguided assumption that ultimate freedom is the goal.</p>
<p>It can not be.</p>
<a name='more'></a>
<h1>What is Freedom of Speech?</h1>
<p><a href="https://en.wikipedia.org/wiki/Freedom_of_speech">freedom of speech</a> is the idea that the ability to freely
communicate your ideas to others is both beneficial and valuable to
society as a whole.</p>
<p>This idea has been with us since at least the days of the Athens’
democracy, and has been reinforced again and again over the years.
These days, the right is called <em>freedom of speech</em> or <em>freedom of
expression</em> and it is protected by a large number of
<a href="https://en.wikipedia.org/wiki/First_Amendment_to_the_United_States_Constitution">national</a> <a href="http://www.gesetze-im-internet.de/englisch_gg/englisch_gg.html#p0030">laws</a> and international treaties,
including but not limited to article 19 of the
<a href="http://www.un.org/en/documents/udhr/index.shtml#a19">United Nation’s Universal Declaration of Human Rights</a>, article
10 of the <a href="http://www.echr.coe.int/Documents/Convention_ENG.pdf">European Convention on Human Rights</a>, article 13 of
the <a href="http://www.cidh.org/Basicos/English/Basic3.American%20Convention.htm">American Convention on Human Rights</a> and article 9 of the
<a href="http://www.achpr.org/instruments/achpr/#a9">African Charter on Human and Peoples’ Rights</a>.</p>
<p>On the other hand, pretty much all laws and most of these treaties
also include provisions for the restriction of this (and other)
rights. The <em>European Convention on Human Rights</em> is rather explicit:</p>
<blockquote>
<p>“The exercise of these freedoms, since it carries with it duties and
responsibilities, may be subject to such formalities, conditions,
restrictions or penalties as are prescribed by law and are necessary
in a democratic society […].”</p>
</blockquote>
<p>The notion here is that, while the free exchange of ideas is generally
beneficial to society and restricting this free exchange is bad,
unlimited use of this freedom can cause harm as well, so it needs
careful regulation.</p>
<p>Most of these laws and treaties are primarily concerned with limiting
the restriction of freedom of speech through governmental
intervention, but this freedom has a value in other contexts as well.</p>
<p>When online communities are created and grow, it is a good idea to
copy ideas from existing organizations. Freedom of speech as well as
the other human rights have a long history, so we do well in trying to
respect them in our online spaces, too. We have been rather good at
this. But at the same time, the long history also taught us that they
need to be restricted in some form or other, and we would do well in
learning <em>that</em> lesson, too. In particular related to freedom of
speech, we seem to have had trouble with that so far.</p>
<p>But if a right is inherently beneficial and valuable, isn’t it
consequently bad to restrict it in any way? This might intuitively
seem logical, but it does not hold up to closer scrutiny.</p>
<h1>Paradox of Freedom</h1>
<p>A freedom—any freedom—inherently includes its own undoing.</p>
<p>There is a common saying that <em>your right to swing your arms ends just
where the other man’s nose begins</em>, which explains rather visually how
the exercise of your own freedom can be used to limit another person’s
freedom. Hence, to protect the freedom of the other person, your
freedom needs to be restricted.</p>
<p>In philosophy, this is called the <em>paradox of freedom.</em> Karl Popper
describes the concept in his book <em>The Open Society And Its Enemies I</em>
(p. 226) as follows:</p>
<blockquote>
<p>“The so-called paradox of freedom is the well-known idea that
freedom in the sense of absence of any restraining control must lead
to very great restraint, since it makes the bully free to enslave
the meek. This idea is, in a slightly different form, and with a
very different tendency, clearly expressed by Plato.”</p>
</blockquote>
<p>As usual with paradoxes in philosophy, this one is primarily a paradox
in language. We’re talking about two different types of freedom,
namely the freedom of specific individuals as opposed to the freedom
of all individuals as a whole, that is, the freedom of society.</p>
<p>Ultimate freedom of a specific individual can require the loss of the
freedom of another individual. As soon as we put value into the
freedom of more than one individual, we get the problem of having to
balance the freedom of one with that of the other. This is a hard
problem, and the question of how much some freedoms can be restricted
to protect others’ is the main topic for supreme and constitutional
courts in various countries. There are, sadly, no simple answers.</p>
<p>While the paradox of freedom is most obvious for physical freedom and
assault, the same paradox is inherent in every freedom. Including the
freedom of speech. And while it is usually easily understood that
physical assault can restrict freedom of speech, it is an important
observation that exercising freedom of speech can be used to restrict
other freedoms, and even freedom of speech itself.</p>
<h1>Restricting Speech</h1>
<p>The most obvious way of using one’s freedom of speech to restrict
another’s is to not let someone get a word in at all. If you just keep
talking, the other person is left to either start a yelling match or
simply not speak. Their freedom of speech has been restricted.</p>
<p>As this is universally considered rude and not acceptable, some forms
have developed that use a similar pattern for similar goals. If you
get a large group of people with similar if not identical ideas, you
can have each and every one talk a bit, thus not appearing to be
occupying the whole discussion space, but still droning out opposing
points.</p>
<p>This is called <em>dogpiling</em> and the (usually) unintentional use of
which can be seen in many comment sections. As more and more comments
are added, any further constructive comment requires more work to read
through all the positions, thus increasing the barrier of entry for
most comments except the <em>me too!</em> type. This, too, is a restriction
of freedom of speech, as it limits the beneficial effects of the right
through exercising the right itself.</p>
<p>The same effect is utilized by <em>derailing,</em> where more or less
unrelated discussions are started that flood the discussion space,
thus increasing the effort needed to participate constructively.</p>
<p>As I mentioned, these things do not even necessarily happen willfully.
We accept some amount of this because we respect the participant’s
freedom of speech, but we would be doing well in being careful just
how much we allow, as this does, as noted, actively <em>harm</em> the idea
behind freedom of speech.</p>
<p>This assumption of civility and best intentions of others has been
used by those who willfully want to undermine the free exchange of
ideas, though.</p>
<p>The technique of a <a href="https://en.wikipedia.org/wiki/Duane_Gish#Debates">Gish Gallop</a> refers to flooding the debate space
with badly-supported, minor and often reworded claims where opponents
would need much longer to refute each single minor claim, again
reducing the willingness to engage and driving others out of the
discussion.</p>
<p>In recent times, the focus on civil discourse has spawned another
technique, called <a href="http://wondermark.com/1k62/">Sea Lioning</a>, in which a debate participant
assumes a false air of civility and keeps pestering others with
questions, often repeated, and often not reacting to or accepting
responses. Not only does this reduce the available discussion space
for constructive exchanges, it also quickly becomes a form of
harassment.</p>
<p>Harassment itself, even when done in the most civil tone, is probably
the starkest form of limiting other people’s freedom of speech. If you
have to be afraid that you stating your opinion will lead to you being
harassed, and be it by a horde of sea lions following you to your
bedroom for a “reasoned discussion”, you are much less likely to
express your opinion publicly.</p>
<p>This, much more so than any moderator action, is a danger to freedom
of speech.</p>
<h1>Protecting Speech</h1>
<p>These tactics and techniques are not new. They have been, in one form
or another, used in public debates and discussions for a long time. We
have already found a solution for these problems, too.</p>
<p>It’s called <a href="https://en.wikipedia.org/wiki/Discussion_moderator">discussion moderation</a>.</p>
<p>Whenever there is a public discussion, there has to be a person whose
job it is to make sure that no participant gets to utilize techniques
like I describe above to silence others, and that everyone with good
intentions can participate constructively.</p>
<p>This type of moderation is <em>required</em> to protect freedom of speech.</p>
<p>Online, this can have different implementations. As the topics of
discussion spaces differ, so does the idea of what does and does not
constitute derailing. For example, a discussion among physicists about
the Higgs Boson should be allowed to proceed without having to
accommodate beginner’s questions, even though beginner’s questions are
important and interesting—just not in this place.</p>
<p>The great thing about the internet, contrary to the physical world, is
that it is increasingly simple to create your own discussion space.
Websites and blogs are easy to set up, and social media makes it even
more simple. When your discussion attempt is not welcome in some place
because it would derail or otherwise limit the freedom of speech of
the participating people, it is trivial to start this discussion in
another.</p>
<h1>Summary</h1>
<p>I have not touched on all aspects of how freedom of speech can be
limited. Spreading lies, false statements, gas lighting, libel and
character assassination are more examples that might be worth
mentioning, but I wanted to focus on the general idea, not a detailed
list of examples.</p>
<p>Freedom of speech is a valuable and important good for a society, and
this also applies to communities online. On the other hand, like any
freedom, it is easy to lose. In attempts to protect freedom of speech
in our online communities, we all too often forget that unlimited
freedom necessarily contains its own undoing. Speech needs to be
restricted to some extent to allow for <em>everyone</em> to exercise this
basic freedom equally.</p>
<p>We’d all do well in remembering this the next time a moderator asks us
to drop a topic in a discussion. It is not as simple as yelling
<em>censorship.</em></p>
<span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rft.type=blogPost&rft.format=text&rft.au=Jorgen+Sch%C3%A4fer&rft.title=The+Paradox+of+Freedom+of+Speech&rft.date=2014-10-26"></span>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-58450499897721791922014-09-21T18:50:00.003+02:002014-09-21T18:50:59.061+02:00Programming Research I Would Like to See<p>When discussing programming and programming language research with
others, I often feel that topics of research that would benefit my
daily work the most are missing. The following is a quick overview of
topics I think need more looking into.</p>
<a name='more'></a>
<h1>Correctness</h1>
<p>A large part of programming research focuses on correctness. The main
goal of static typing, probably the biggest tool in the research
toolkit, is to ensure correctness. Bug-free software is a noble goal,
but there is a small catch:</p>
<p>The absolute correctness of the program is not the main goal of most
programming.</p>
<p>Realistically, a (non-trivial) piece of software is never entirely
bug-free. The more bugs you fix, the more effort you have to put into
fixing the next bug. At some point, the effects of the bugs is just
not severe enough to warrant the needed effort.</p>
<p>There is a saying for new products that goes “make sure you are
building the <em>right it</em> before you build <em>it right</em>,” which
encapsulates the priorities nicely. A slightly buggy product now is
quite often infinitely better than a slightly less buggy product next
week. For a new product, you need to see if there is actual demand for
it so you can drop it early if there isn’t. The more time you spend
getting a minimum viable product out of the door the more money you
are wasting if it fails. And make no mistake, most new products and
services fail.</p>
<p>So while it is nice if programs are correct and bug-free, the effort
to get to that point has to be weighed against other priorities.</p>
<p>This does not mean that buggy programs are great, or that programmers
shouldn’t worry about bugs that they add to the software. It is the
insight that there are different classes of bugs that warrant
different levels of effort to fix.</p>
<p>For the average web app, a bug that causes an internal server error
once in a while that’s fixed by a simple reload is pretty much
irrelevant. And while this changes in fields like medicine or nuclear
power plants, not all programmers work in those fields.</p>
<p>On the other hand, some bugs are indeed critical even for web
applications. Leaked user details, remote exploits and similar
security-related bugs are important to avoid even for catselfies.org.</p>
<p>When all bugs are treated the same, this leads to the situation where
programmers have to either prioritize fixing irrelevant bugs or
down-prioritize fixing important bugs. Neither of which is a good
choice.</p>
<p>I would love to see more research that looks at different classes of
bugs, their relative severities in different contexts, and how to
focus on avoiding specific classes of bugs while caring less about
others.</p>
<h1>Change Management</h1>
<p>Not all bugs are programming mistakes. Sometimes, a programmer
implemented exactly what they wanted to implement, and it’s still
wrong. Either the programmer misunderstood the specification, or the
specification changed. This is a very common situation and actively
embraced by agile programming, where products are released early and
often to get quick feedback precisely because requirements tend to not
survive the first contact with reality.</p>
<p>“Embrace change” is one of the mantras of agile programming. But there
is very little research on how to do this well.</p>
<p>Automated tests have been the main tool that really helped in this
regard. From xUnit via BDD-style tests to Cucumber/Gherkin, from
regression tests to two-cycle TDD, there are a lot of approaches and
ideas on how to do tests well, but very little concrete evidence.</p>
<p>What sort of features in a language or in a library make it easy to
change a program to adapt to new or changed requirements, but still
adhere to the unchanged ones? What is the best way of writing tests,
or which way of writing tests excels in which situation?</p>
<p>I think this is such a central part of programming that it really
could do with being the focus of more research.</p>
<h1>Empiricism</h1>
<p>These questions quickly cease to be about formal methods and proofs
and tend to go into empiric science, even social science. Empiricism
is key here.</p>
<p>A while back, I participated in a discussion about <em>truthiness</em> in
programming languages. Should there be more than one value that is
considered true or false? Should <code>if</code> statements only work for
strictly boolean arguments? An interesting topic with different
experiences.</p>
<p>In this discussion, one participant at one point complained about
people learning Scheme who think that 0 (the number) is a false value,
and how it has to be repeated over and over again that 0 is a true
value in Scheme. People who argued that a single false value is a good
idea argued that this was a sign of bad influence from other languages
and the fault of the learners, not a problem of the language at hand.</p>
<p>A bit later in the same discussion, someone mentioned that they
checked for a value other than <code>None</code> in Python using a simple truth
check, which failed as Python has multiple false values. The same
people as above saw this as a problem of the language and the
confusion of the user as a proof of how having more than one false
value is obviously not a good idea.</p>
<p>This is a beautiful example of confirmation bias which is quite common
in programming language discussions, although it’s not always this
obvious. We have preconceived opinions on what we consider true and
good, and will interpret any evidence we find to support our opinions.
This is normal human behavior, and part of what the scientific method
is meant to help us avoid. But as programming language research is
often treated as a purely theoretical field, anything beyond formal
models is rarely treated with the same scientific rigor.</p>
<p>As so many aspects of programming are outside of the scope of formal
models, we really need more empiricism in programming language
research and discussions.</p>
<h1>Summary</h1>
<p>I would like to see more research that differentiates between
different classes of bugs, as not all bugs are equal and bug-free
software is not the only (or even main) focus of programming.</p>
<p>I would like to see more research on change management in programming,
how to design and write programs so that they are more easily adapted
to ever changing requirements.</p>
<p>And I would like to see all of this done with empiricism instead of
emotional arguments.</p>
<p>This research exists, and I greatly enjoyed reading a number of papers
on these topics, but really …</p>
<p>More research is needed.</p>
<span class="Z3988" title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Adc&rft.type=blogPost&rft.format=text&rft.au=Jorgen+Sch%C3%A4fer&rft.title=Programming+Research+I+Would+Like+to+See&rft.date=2014-09-20"></span>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-85497090756243848542014-08-22T18:24:00.000+02:002014-08-22T18:24:07.556+02:00Circe 1.4 released<p>I just released version 1.4 of Circe, a Client for IRC in Emacs.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/circe/">Homepage</a></li>
</ul>
<p>The package is available from github and MELPA unstable, even
though the latter will track further development changes, so use at
your own risk.</p>
<p>Due
to <a href="http://blog.jorgenschaefer.de/2014/06/the-sorry-state-of-emacs-lisp-package.html">the
sorry state of Emacs Lisp package archives</a>, I
am <a href="https://plus.google.com/u/0/+JorgenSch%C3%A4fer/posts/BxVcb9Vpo1f">currently
unable to do an actual release</a> of Circe.</p>
<a name='more'></a>
<h2>Changes</h2>
<ul>
<li>Non-blocking TLS connections. Circe now supports secure TLS
connections to IRC servers without blocking during the connect.
(Thanks to defanor for the patches!)</li>
<li>PEP (Python Enhancement Proposals) mentions are now buttonized
by default, like RFCs and SRFIs.</li>
<li>URLs are now buttonized with the logic from the built-in
thingatpt.el library.</li>
<li>Topic changes are highlighted correctly. Before, Circe would
show diffs for topics one older than the last.</li>
<li>Circe will now try a random nick when the server says that the
initial nick is erraneous. This could happen when the server set a
collision-avoiding nick, and Circe tried to retain it after a
reconnect.</li>
<li>The lui-logging module can now easily be enabled or disabled
globally.</li>
<li>The new option <tt>circe-server-buffer-name</tt> can be used to
influence the name of the server buffer, especially useful for
people using the same bouncer for multiple networks. This can also
be set on a per-network basis.</li>
</ul>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-40743772646295999512014-08-10T09:23:00.003+02:002014-08-10T09:23:27.487+02:00Elpy 1.5.1 released<p>I just released version 1.5.1 of Elpy, the Emacs Python Development Environment.
This is a bug fix release.</p>
<p>Elpy is an Emacs package to bring powerful Python editing to Emacs. It
combines a number of other packages, both written in Emacs Lisp as
well as Python.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/elpy/">Homepage</a></li>
<li><a href="http://elpy.readthedocs.org/">Manual</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Features">Features</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Installation">Installation</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("elpy" .
"http://jorgenschaefer.github.io/packages/"))</code></pre>
<p>Then run <code>M-x package-install RET elpy RET</code>.</p>
<p>Finally, run the following (and add them to your <code>.emacs</code>):</p>
<pre><code class="lisp">(package-initialize)
(elpy-enable)</code></pre>
<h2>Changes in 1.5.1</h2>
<a name='more'></a>
<ul>
<li>Fix a bug where company-mode might get confused about the
current backend, leading to an error about <tt>Symbol’s function
definition is void: nil</tt></li>
<li>Fix Rope so it won’t search the whole project directory. This
was an intended feature in v1.5 which did not work
originally.</li>
<li>Use <tt>yas-text</tt> instead of <tt>text</tt> in snippets for
compatibility with the unreleased yasnippet from MELPA (thanks to
Daniel Wu!)</li>
</ul>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.comtag:blogger.com,1999:blog-4394570295456001999.post-30916247173087409312014-08-02T11:30:00.002+02:002014-08-02T11:30:54.523+02:00Elpy 1.5.0 released<p>I just released version 1.5.0 of Elpy, the Emacs Python Development Environment.
This is a major feature release.</p>
<p>Elpy is an Emacs package to bring powerful Python editing to Emacs. It
combines a number of other packages, both written in Emacs Lisp as
well as Python.</p>
<ul>
<li><a href="https://github.com/jorgenschaefer/elpy/">Homepage</a></li>
<li><a href="http://elpy.readthedocs.org/">Manual</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Features">Features</a></li>
<li><a href="https://github.com/jorgenschaefer/elpy/wiki/Installation">Installation</a></li>
</ul>
<h2>Quick Installation</h2>
<p>Evaluate this:</p>
<pre><code class="lisp">(require 'package)
(add-to-list 'package-archives
'("elpy" .
"http://jorgenschaefer.github.io/packages/"))</code></pre>
<p>Then run <code>M-x package-install RET elpy RET</code>.</p>
<p>Finally, run the following (and add them to your <code>.emacs</code>):</p>
<pre><code class="lisp">(package-initialize)
(elpy-enable)</code></pre>
<h2>Changes in 1.5.0</h2>
<a name='more'></a>
<ul>
<li>Elpy now has a <a href="http://elpy.readthedocs.org/">manual</a>. Additionally, there's a menu bar now which
should make it easier to discover Elpy features.
</li><li>The Elpy Python package now ships with the Emacs Lisp package,
removing the need to install Elpy via pip.
</li><li>Python 3.4 is now officially supported.
</li><li>The new command <tt>elpy-config</tt> can be used to configure Elpy using
Emacs' built-in customize system. Elpy has been changed to make the
most of this.
</li><li>Elpy now uses company-mode instead of auto-complete for on-the-fly
auto completion. This changes a few things. There is no automatic
documentation popup anymore. Instead, you can type <tt>C-d</tt> and get
the documentation buffer. In addition, you can type <tt>C-w</tt> to see
the source of the current candidate in context.
</li><li>Elpy now uses pyvenv as the virtualenv module, enabling
virtualenvwrapper hooks.
</li><li>We now ship with a large number of YASnippet snippets. Try ``M-x
yas-insert-snippet``.
</li><li>The new unified test running interface on <tt>C-c C-t</tt> will try to
determine the current test and run it, or, failing that, run all
tests. Provide a prefix argument to just run all tests no matter
what. You can change the test runner to be used using
<tt>elpy-set-test-runner</tt>. Elpy supports the default unittest
discover runner, the Django discover runner, nosetests and py.test
by default. New test runners can easily be defined.
</li><li>There's a new multi-edit functionality. <tt>C-c C-e</tt> will edit all
occurrences of the symbol under point. When using Jedi, this is
using semantic information as opposed to just syntactic one. When a
region is active, edit all occurrences of the text in region in the
current buffer.
</li><li>When sending Python code to the interactive interpreter using ``C-c
C-c``, Elpy will now not automatically pop to the interpreter
anymore. Use <tt>C-c C-z</tt> to switch to the interpreter.
</li><li>Elpy will now display the current class and function if there is no
call tip to be displayed. Removes the <tt>C-c C-q</tt> binding.
</li><li>If there is a call tip, highlight the current argument (requires Jedi).
</li><li>The documentation interface using <tt>C-c C-d</tt> is much smarter now,
falling back to pydoc when necessary and providing sensible
completion for that, too. Provide a prefix argument if you want no
smarts, just pydoc.
</li><li><tt><S-return></tt> and <tt><C-S-return></tt> now open a line below or above
the current one.
</li><li><tt><C-cursor></tt> will now navigate between Python blocks of the same
indentation level. <tt><M-cursor></tt> will move the current block. Try
it, it's easier to understand when you see it than to explain it.
</li><li>There's a new concept of modules. The variable
<tt>elpy-default-minor-modes</tt> is gone (use <tt>elpy-mode-hook</tt> for
minor modes). Instead, there's now <tt>elpy-modules</tt> which can be
used to enable or disable certain features of Elpy.
</li><li><tt>elpy-clean-modeline</tt> is gone, modules now clean themselves up.
</li><li>Elpy now distinguishes between the project root, where project files
are located, and the library root, which should be part of
<tt>sys.path</tt> to import the module under development.
</li><li><tt>elpy-project-ignored-directories</tt> replaces the old
<tt>elpy-rgrep-ignored-directories</tt> and is used by more features.
</li><li><tt>elpy-doc-websearch</tt> has been removed as it was barely useable
as is.
</li><li>Elpy now tries to be more helpful when errors in the backend happen.
This removes <tt>elpy-rpc-traceback</tt>, as that will be displayed by
default.
</li><li>Optimizations were added to handle large files, making general
interaction a lot faster.
</li><li>When Rope is being used, do not search through unusually large
directories. This should speed up interaction in those cases,
especially when editing a file in the home directory.
</li><li>And a whole lot of minor bug fixes and little improvements.</li>
</ul>Anonymoushttp://www.blogger.com/profile/04147366717406338283noreply@blogger.com