<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Phillip M. Alday</title>
<link>https://phillipalday.com/blog/</link>
<atom:link href="https://phillipalday.com/blog/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.8.26</generator>
<lastBuildDate>Tue, 12 Jan 2021 14:00:00 GMT</lastBuildDate>
<item>
  <title>Postscript to “Statistics is not shit”</title>
  <link>https://phillipalday.com/blog/2021-01-12-postscript.html</link>
  <description><![CDATA[ 





<p><em>For context, please see the <a href="../blog/2020-12-22-statistics-is-not-shit.html">previous post</a>.</em></p>
<p>I intentionally did not address what statistics is/does, nor what role it should have in the cognitive (neuro)sciences. Many of the attitudes and misunderstandings are all too familiar to me and are topics for a different blogpost (series). In the Twitter debate that spawned those comments, there is also a legitimate concern about the mismatch between the level of statistical expertise required and the level present in the cognitive sciences.</p>
<p>Instead, as indicated in the <em>tl;dr</em>, I really wanted to address the sociological aspect of insulting a group and then patronizing them instead of actually apologizing. But what bothered me even more is that the vast majority of my test readers warned me that I was burning bridges / poking the bear / creating all sorts of problems for myself. <strong>This is horrible.</strong> A senior, male figure with a tenured – i.e.&nbsp;secure – position at an American R1 institution (i.e.&nbsp;a person of great privilege) is intentionally ignorant, insulting and patronizing and calling that out is viewed as risky? <strong>Wow.</strong></p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <guid>https://phillipalday.com/blog/2021-01-12-postscript.html</guid>
  <pubDate>Tue, 12 Jan 2021 14:00:00 GMT</pubDate>
</item>
<item>
  <title>Statistics is not shit: An open letter to the psycholinguistics community</title>
  <link>https://phillipalday.com/blog/2020-12-22-statistics-is-not-shit.html</link>
  <description><![CDATA[ 





<p><strong>tl;dr</strong>: <em>Please don’t insult an entire community via bathroom analogies, then claim to speak for what they want. The words and attitudes of senior scientists have profound implications for the state of the field and lives and careers of junior scientists.</em></p>
<p>Dear all,</p>
<p>Recently, the community entered a fury of discussion based on a few comments made by prominent members of the community. Some of these tweets really bothered me and pointed to profound ignorance about the role of statistics and lack of sympathy for statisticians. Let me address a few of these tweets:</p>
<blockquote class="blockquote">
<p><a href="https://web.archive.org/web/20201221183457/https://twitter.com/victorf13/status/1341089602870775810">Doing statistics should be like going to the bathroom. Yes, you have to do it. Yes, when you do it, you want to do it right. But don’t make a big deal out of it, be careful about telling other people how to do it, and if your whole life is centered on it, there’s something wrong.</a></p>
</blockquote>
<p>Statistics is not going to the bathroom.</p>
<p>I am appalled that a senior scientist takes pride in willful ignorance and then insults an entire community of researchers before “apologizing” by claiming to speak for that community (of which I am a member):</p>
<blockquote class="blockquote">
<p><a href="https://web.archive.org/web/20201222151706/https://twitter.com/victorf13/status/1341391146669363200">And dividing and conquering, bringing statisticians onto our papers in author roles raises problems. There aren’t enough statisticians to serve as authors <em>and reviewers</em> on all our papers. And it’s limiting for the statisticians themselves, as they spend less time in lead roles.</a></p>
</blockquote>
<p>In my experience, it goes the other way: methods people are willing to take on such roles, but are unable to find academic jobs and thus are forced into the private sector.</p>
<p>Or as a different senior scientist told me a few years ago, “methods people don’t get [academic] jobs” – such prophecies are by their nature self-fulfilling.</p>
<hr>
<p>I suspect part of the reason psychology and psycholinguistics are so willing to accept statistical incompetence and malpractice is that it doesn’t matter if the statistics are wrong. Nobody will die. But countless careers and young minds will be wasted chasing noise, as the replication crisis has shown us.</p>
<p>Or to use the original toilet humor: your (statistical) hygiene practices in your private (data) space can have big implications for the health of the broader community. As we all learned in 2020, it’s important to listen to experts and follow best practices.</p>
<p>Phillip Alday</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <guid>https://phillipalday.com/blog/2020-12-22-statistics-is-not-shit.html</guid>
  <pubDate>Tue, 22 Dec 2020 19:19:00 GMT</pubDate>
</item>
<item>
  <title>A New Chapter (Title): Statistical Nihilism</title>
  <link>https://phillipalday.com/blog/2020-12-03-statistical-nihilism.html</link>
  <description><![CDATA[ 





<p>This past year has been rather interesting. Beyond all the global events that will undoubtedly be interesting to tell future generations about, there were some rather significant changes in my personal and professional life. Most relevant for this blog, I can’t really claim to be a young academic anymore. So I decided to move to a new title for a new chapter in my life. There are no more <em>Adventures in Academia</em>.</p>
<p><em>Statistical Nihilism</em> is a somewhat joking belief that there are no true effects. A charitable interpretation is a form of skepticism, heavily informed by my professional experiences and an increasing understanding of the myriad issues underlying statistics as commonly practiced (low power, poor data designs, inappropriate methods and hidden multiple testing). It’s mixed with a bit of disillusionment and disenchantment about what this means for science, both in academia and in industry.</p>
<p>I’m planning on getting back into blogging and two major topic areas are my departure from my previous career trajectory and common statistical/technical/inferential issues I see in my research fields. That might make the mixture of snark and seriousness in statistical nihilism more apparent. But also might be strangely appropriate if there’s no effect of best laid plans.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <guid>https://phillipalday.com/blog/2020-12-03-statistical-nihilism.html</guid>
  <pubDate>Thu, 03 Dec 2020 18:46:00 GMT</pubDate>
</item>
<item>
  <title>Marr’s Levels</title>
  <link>https://phillipalday.com/blog/2018-10-10-marrs-levels.html</link>
  <description><![CDATA[ 





<p>I’m really tired of seeing “Marr’s three levels” referenced.</p>
<p>The very first sentence of the abstract from Marr <em>and</em> Poggio (1976) is:</p>
<blockquote class="blockquote">
<p>The CNS needs to be understood at four nearly independent level of description: (1) that a twhich the nature of a computation is expressed; (2) that at which the algorithms that implement a computation are characterized; (3) that at which an algorithm is committed to particular mechanisms; and (4) that at which the mechanisms are realized in hardware.<sup>1</sup></p>
</blockquote>
<p>So, it’s four levels, not three, and it’s Marr <strong>and</strong> Poggio. Yes, I understand that it’s common today to collapse levels (2) and (3) together into one level, but that’s not what Marr and Poggio wrote. They clearly viewed them as distinct levels.</p>
<p>This is why it’s so important to actually read the original articles and not just keep doing indirect quotations.</p>




<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a><div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>Marr, D., &amp; Poggio, T. (1976). From Understanding Computation to Understanding Neural Circuitry. AI Memos, 357.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <guid>https://phillipalday.com/blog/2018-10-10-marrs-levels.html</guid>
  <pubDate>Wed, 10 Oct 2018 12:53:00 GMT</pubDate>
</item>
<item>
  <title>Assumptions about (statistical) assumptions</title>
  <link>https://phillipalday.com/blog/2017-07-27-assumptions-about-assumptions.html</link>
  <description><![CDATA[ 





<blockquote class="blockquote">
<p>Parametric statistics are not appropriate for mutual information because the values are non-normally distributed.</p>
</blockquote>
<p>Source: Cohen, Michael X. (2014). Analyzing Neural Time Series Data. MIT Press. p 405.</p>
<p>That’s not quite true. Not all parametric statistics depend on normality; indeed the whole class of <em>generalized</em> linear models removes the normality assumption and replaces it with another, appropriate, but still parametric distributional assumption.</p>
<p><em>Parametric</em> does not mean “assumption of normality” nor does <em>non parametric</em> mean “assumption free”. <em>Parametric</em> simply means that a given distribution (and hence statistical model) can be described via parameters to a given function or functions (in particular, the probability density function, PDF, and the cumulative density function, CDF<sup>1</sup>). For example, the normal distribution is described by the probability density function</p>
<p><img src="https://latex.codecogs.com/png.latex?%20f%5Cleft(x;%20%5Cmu,%20%5Csigma%5Cright)%20=%20%5Cfrac%7B1%7D%7B%5Csqrt%7B2%5Cpi%5Csigma%5E2%7D%7D%20e%5E%7B-%5Cfrac%7B%5Cleft(x-%5Cmu%5Cright)%5E2%7D%7B2%5Csigma%5E2%7D%7D%20"></p>
<p>Setting the parameters <img src="https://latex.codecogs.com/png.latex?%5Cmu"> (population mean) and <img src="https://latex.codecogs.com/png.latex?%5Csigma"> (standard deviation) (or equivalently <img src="https://latex.codecogs.com/png.latex?%5Csigma%5E2">, the variance) completely determines the distribution, giving it a nice, easy-to-compute closed form. Nearly every distribution that you can name is ‘parametric’ in this sense: Student’s <img src="https://latex.codecogs.com/png.latex?t">, Pareto, Gamma, Cauchy, Laplace, Beta, Binomial, etc. So it’s quite possible that there is a parametric statistical model that fits a given problem, even when conditional normality<sup>2</sup> can be completely excluded. In any case, attempts to ‘correct’ a statistical model based on the normality assumption when normality is known not to hold are likely to have other latent issues and tradeoffs.</p>
<p>As an alternative to parametric statistics and their distributional assumptions (i.e.&nbsp;that the conditional data distribution can be expressed as a given parametric distribution), non parametric statistics are often presented as an ‘assumption free’ if computationally more expensive alternatives. Computer time is cheap nowadays and the loss of power for modern non parametric methods compared to parametric methods is minimal even when the latter’s assumptions hold, so it seems natural to just use these. (Indeed, Rand Wilcox’s promotion of robust – which goes beyond ‘non parametric’ – statistics is based on this combined with an observation going back to Tukey that most bell-curves are not normal and so the normality assumption may often be invalid.) That’s fine, but these methods also have lots of assumptions, some of them quite strong. For example, the bootstrap assumes that the samples are independent and identically distributed (i.i.d.). In the case of mutual information applied to different EEG channels on the same participant, no two simultaneous measurements from a single person’s scalp can be said to be truly independent (Gauss’ law, spherical conductors, and all that jazz), so this assumption is violated. Violating testing assumptions isn’t the end of the world, but it does mean that you may experience what C programmers dread, namely, <em>undefined behavior</em>.</p>
<p>Now, I do suspect that a permutation test is probably the best option for comparing (within the significance-testing framework) these information-theoretic measures in EEG work. But that’s not because the data aren’t normally distributed, but rather we have no idea what the underlying “ground-truth” distribution is!</p>




<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a><div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>Strictly speaking, for discrete distributions, you have <em>mass</em> functions instead of <em>density</em> functions, but the same holds.↩︎</p></li>
<li id="fn2"><p>It is useful to emphasize here that the assumption of normality present in many common statistical models is <em>normality of the conditional response</em> or equivalently, <em>normality of the residuals</em>. This is part of why the <em>homoskedacity</em> assumption is important: heteroskedacity means the residuals are distributed as a mixture of (normal) distributions and not as a single normal distribution. In practical terms, this messes up your error estimates, which impacts the calculation of <img src="https://latex.codecogs.com/png.latex?p">-values, etc. In many ways, the field of robust statistics is just a long discussion of how to handle mixture distributions in your error term.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <guid>https://phillipalday.com/blog/2017-07-27-assumptions-about-assumptions.html</guid>
  <pubDate>Thu, 27 Jul 2017 13:31:00 GMT</pubDate>
</item>
<item>
  <title>Likelihood vs. Posterior</title>
  <link>https://phillipalday.com/blog/2015-04-23-likelihood-vs-posterior.html</link>
  <description><![CDATA[ 





<blockquote class="blockquote">
<p>You need to remember that “likelihood” is a technical term. The likelihood of <img src="https://latex.codecogs.com/png.latex?H">, <img src="https://latex.codecogs.com/png.latex?Pr(O%5C%7CH)">, and the posterior probability of <img src="https://latex.codecogs.com/png.latex?H">, <img src="https://latex.codecogs.com/png.latex?Pr(H%5C%7CO)">, are different quantities and they can have different values. The likelihood of <img src="https://latex.codecogs.com/png.latex?H"> is the probability that <img src="https://latex.codecogs.com/png.latex?H"> confers on <img src="https://latex.codecogs.com/png.latex?O">, not the probability that <img src="https://latex.codecogs.com/png.latex?O"> confers on <img src="https://latex.codecogs.com/png.latex?H">. Suppose you hear a noise coming from the attic of your house. You consider the hypothesis that there are gremlins up there bowling. The likelihood of this hypothesis is very high, since if there are gremlins bowling in the attic, there probably will be noise. But surely you don’t think that the noise makes it very probable that there are gremlins up there bowling. In this example, <img src="https://latex.codecogs.com/png.latex?Pr(O%5C%7CH)"> is high and <img src="https://latex.codecogs.com/png.latex?Pr(H%5C%7CO)"> is low. The gremlin hypothesis has a high likelihood (in the technical sense) but a low probability.</p>
</blockquote>
<p>Source:</p>
<p>Sober, E. (2008). Evidence and Evolution: the Logic Behind the Science. Cambridge University Press.</p>
<p>As quoted in <a href="http://stats.stackexchange.com/a/112547/26743">this answer</a> to <a href="http://stats.stackexchange.com/questions/112451/maximum-likelihood-estimation-mle-in-layman-terms">this question on CrossValidated</a>.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <guid>https://phillipalday.com/blog/2015-04-23-likelihood-vs-posterior.html</guid>
  <pubDate>Thu, 23 Apr 2015 07:55:00 GMT</pubDate>
</item>
<item>
  <title>User and Project Pages on GitHub</title>
  <link>https://phillipalday.com/blog/2014-06-11-user-and project-pages-on-github.html</link>
  <description><![CDATA[ 





<p>If you want to use both User and Project pages on <a href="https://pages.github.com">GitHub Pages</a>, then you need to create the User page first. Project pages created before the User page will no longer be accessible. To restore the project page, make any change to the <code>gh-pages</code> branch for the Project page, commit and push.</p>
<p>I’m guessing this is related to the name structure used. Project pages are <code>http://username.github.io/repository</code> and User pages are <code>http://username.github.io</code>, so Project pages are in a broad sense “subdirectories” of the User pages. Initializing the User page thus blocks the existing subdirectories, in case you have a subdirectory in the User repository with that same name. Changing the Project <code>gh-pages</code> branch re-initializes / refreshes the Project page, restoring the mount point.</p>
<p>What happens when you have a name collision?</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <guid>https://phillipalday.com/blog/2014-06-11-user-and project-pages-on-github.html</guid>
  <pubDate>Wed, 11 Jun 2014 15:20:00 GMT</pubDate>
</item>
<item>
  <title>Embedding R-help with knitr</title>
  <link>https://phillipalday.com/blog/2014-06-10-embedding-R-help-with-knitr.html</link>
  <description><![CDATA[ 





<p><a href="http://www.rstudio.com/">RStudio</a>, <a href="http://rmarkdown.rstudio.com/">R Markdown</a>/<a href="http://yihui.name/knitr/"><code>knitr</code></a> and <a href="http://git-scm.com/">Git</a> are great for teaching a <a href="https://github.com/Uni-Marburg-IGS-Statistik/Statistik-f-r-Sprachwissenschaftler">statistics class</a>.<sup>1</sup> You can encourage good documentation (of both the development and the final result), an absolute necessity for reproducible research, via literate programming and DVCS. When using built in data sets for examples, it would be nice to include the description for their online help without resorting to copy and paste. Unfortunately, the naive approach</p>
<pre><code>
```{r}
?mtcars
```
</code></pre>
<p>does not work, because the online help works by side effect. Using <code>help(...,help_type)</code> instead of <code>?</code> doesn’t help either.</p>
<p><a href="http://stackoverflow.com/questions/24146843/including-r-help-in-knitr-output">StackOverflow</a> as usual provides a place to get several useful answers. I’ve adapted / extended <a href="http://stackoverflow.com/a/24147536">this answer</a> to display the online help for a given data set inside a box.</p>
<pre><code>
&lt;div style="border: 2px solid black; padding: 5px"&gt;
```{r, echo=FALSE, results='asis'}
tools:::Rd2HTML(utils:::.getHelpFile(help(mtcars)),stylesheet="")
```
&lt;/div&gt;
</code></pre>
<p>This will also work for any thing accessible via the online help, but is less ideal for longer help pages because it placed completely inline. For longer help pages, you should probably add a maximum height and scrollbar to the outer div. Also, I’m not sure that the resulting document is 100% well-formed, because the quick-and-easy presented here doesn’t strip the <code>&lt;html&gt;</code>, <code>&lt;head&gt;</code> and <code>&lt;body&gt;</code> tags from the document being embedded.</p>
<p>The output looks like this (note that CSS styles from the embedding document are carried over):</p>
<div style="border: 2px solid black; padding: 5px">


<title>
R: Motor Trend Car Road Tests
</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="">


<table width="100%" summary="page for mtcars">
<tbody><tr>
<td>
mtcars
</td>
<td align="right">
R Documentation
</td>
</tr>
</tbody></table>
<table summary="Rd table">
<tbody><tr>
<td align="right">
[, 1]
</td>
<td align="left">
mpg
</td>
<td align="left">
Miles/(US) gallon
</td>
</tr>
<tr>
<td align="right">
[, 2]
</td>
<td align="left">
cyl
</td>
<td align="left">
Number of cylinders
</td>
</tr>
<tr>
<td align="right">
[, 3]
</td>
<td align="left">
disp
</td>
<td align="left">
Displacement (cu.in.)
</td>
</tr>
<tr>
<td align="right">
[, 4]
</td>
<td align="left">
hp
</td>
<td align="left">
Gross horsepower
</td>
</tr>
<tr>
<td align="right">
[, 5]
</td>
<td align="left">
drat
</td>
<td align="left">
Rear axle ratio
</td>
</tr>
<tr>
<td align="right">
[, 6]
</td>
<td align="left">
wt
</td>
<td align="left">
Weight (lb/1000)
</td>
</tr>
<tr>
<td align="right">
[, 7]
</td>
<td align="left">
qsec
</td>
<td align="left">
1/4 mile time
</td>
</tr>
<tr>
<td align="right">
[, 8]
</td>
<td align="left">
vs
</td>
<td align="left">
V/S
</td>
</tr>
<tr>
<td align="right">
[, 9]
</td>
<td align="left">
am
</td>
<td align="left">
Transmission (0 = automatic, 1 = manual)
</td>
</tr>
<tr>
<td align="right">
[,10]
</td>
<td align="left">
gear
</td>
<td align="left">
Number of forward gears
</td>
</tr>
<tr>
<td align="right">
[,11]
</td>
<td align="left">
carb
</td>
<td align="left">
Number of carburetors
</td>
</tr>
</tbody></table>
<h3 class="anchored">
Source
</h3>
<p>
Henderson and Velleman (1981), Building multiple regression models interactively. <em>Biometrics</em>, <b>37</b>, 391–411.
</p>
<h3 class="anchored">
Examples
</h3>
<pre>require(graphics)
pairs(mtcars, main = "mtcars data")
coplot(mpg ~ disp | as.factor(cyl), data = mtcars,
       panel = panel.smooth, rows = 1)
</pre>


</div>


<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a><div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Footnotes</h2>

<ol>
<li id="fn1"><p>Please note: your students will <em>hate</em> having to learn so much software and “computer science” at the start, but the not horrible ones will start to see the light the first time you correct a mistake and they can seamlessly pull in your changes or they delete their homework and can checkout the last version.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>R</category>
  <category>knitr</category>
  <category>markdown</category>
  <category>RMarkdown</category>
  <guid>https://phillipalday.com/blog/2014-06-10-embedding-R-help-with-knitr.html</guid>
  <pubDate>Tue, 10 Jun 2014 19:00:00 GMT</pubDate>
</item>
<item>
  <title>New Blog</title>
  <link>https://phillipalday.com/blog/2014-06-05-New-Blog.html</link>
  <description><![CDATA[ 





<p>I’ve decided to move to running my own blog as part of my webpage on Bitbucket. With DVCS and <a href="http://jekyllrb.com/">Jekyll</a>, I can write and edit posts on the go and regenerate the static site when I’m ready to publish. I’m hoping this will make it easier for me to get posting again. There’s a number of things I’ve been planning on writing about for a while now but never got around to it.</p>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <guid>https://phillipalday.com/blog/2014-06-05-New-Blog.html</guid>
  <pubDate>Thu, 05 Jun 2014 12:35:00 GMT</pubDate>
</item>
<item>
  <title>Speed up R (on Linux)</title>
  <link>https://phillipalday.com/blog/2013-05-31-Speed-up-R-(on-Linux).html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<p>
You can drastically speed up R in many cases by using a better/more tuned BLAS (linear algebra library) implementation. ATLAS (Automatically Tuned Linear Algebra System) is one such option, but the basic compiled version distributed with Debian and Ubuntu won’t help you out much — you get the most benefit when you compile it yourself so that it’s optimally <em>tuned</em> for your system. (This is also why Debian stopped distributing semi-optimized builds as binary packages.)
</p>
<p>
No worries though, installing ATLAS from source isn’t hard, and Debian and Ubuntu even maintain a source package.
</p>
<p>
On Ubuntu and Debian, installing ATLAS goes likes this:
</p>
<pre><code>user@localhost:~$ sudo apt-get build-dep atlas<br>user@localhost:~$ sudo apt-get install build-essential dpkg-dev cdbs devscripts \ <br> gfortran liblapack-dev liblapack-pic <br>user@localhost:~$ sudo apt-get source atlas<br>user@localhost:~$ cd atlas*<br>user@localhost:~$ sudo fakeroot debian/rules custom<br></code></pre>
<p>
If you get a warning about cpufreq not being set to performance mode, then you’ll have to change that for each CPU (numbered from 0). This will turn off frequency-scaling, which offers a speed boost in and of itself, but perhaps isn’t the best option for laptops as it increases power consumption.
</p>
<p>
Set <em>n</em> equal to the number of cpus (including virtual HT cpus) minus one:
</p>
<pre><code>user@localhost:~$ for i in {0..n}; do sudo cpufreq-set -g performance -c$i; done <br></code></pre>
<p>
After you set your CPU to performance mode, you can try again:
</p>
<pre><code>user@localhost:~$ sudo fakeroot debian/rules custom<br>user@localhost:~$ sudo apt-get install libatlas-base-dev libatlas-base<br>user@localhost:~$ sudo dpkg -i libatlas3gf-*.deb <br></code></pre>
<p>
I recommend using tab completion instead of wildcards, but it should now be installed. You can switch back and forth between different BLAS implementations (and see which one is active) with:
</p>
<pre><code>user@localhost:~$ sudo update-alternatives --config libblas.so.3<br><br>There are 2 choices for the alternative libblas.so.3 (providing /usr/lib/libblas.so.3).<br>Selection    Path                                    Priority   Status<br>------------------------------------------------------------<br>* 0            /usr/lib/atlas-base/atlas/libblas.so.3   35        auto mode<br>  1            /usr/lib/atlas-base/atlas/libblas.so.3   35        manual mode<br>  2            /usr/lib/libblas/libblas.so.3            10        manual mode<br><br>Press enter to keep the current choice[*], or type selection number: <br></code></pre>
<p>
I was happy with auto-selection favoring ATLAS, so I just hit enter.
</p>
<p>
Now for the benchmarks using large matrix multiplication in R.
</p>
<h2 class="anchored">
Before:
</h2>
<pre><code>&gt; a = matrix(rnorm(5000*5000), 5000, 5000) <br>&gt; b = matrix(rnorm(5000*5000), 5000, 5000) <br>&gt; system.time( a%*%b )<br>   user  system elapsed <br>191.668   0.108 191.828 <br></code></pre>
<h2 class="anchored">
After:
</h2>
<pre><code>&gt; a = matrix(rnorm(5000*5000), 5000, 5000) <br>&gt; b = matrix(rnorm(5000*5000), 5000, 5000) <br>&gt; system.time(a%*%b)<br>   user  system elapsed <br> 34.726   0.200  17.687<br></code></pre>
<p>
That’s more than a 10x speedup in elapsed time!
</p>
<h3 class="anchored">
Sources
</h3>
<ul>
<li>
http://packages.debian.org/unstable/libatlas3-base
</li>
<li>
http://anonscm.debian.org/viewvc/debian-science/packages/atlas/tags/3.8.4-2/README.Debian?revision=38541&amp;view=markup
</li>
<li>
http://wiki.debian.org/DebianScience/LinearAlgebraLibraries
</li>
<li>
https://gist.github.com/palday/5685150
</li></ul>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>compile</category>
  <category>Linux</category>
  <category>R</category>
  <guid>https://phillipalday.com/blog/2013-05-31-Speed-up-R-(on-Linux).html</guid>
  <pubDate>Fri, 31 May 2013 16:11:39 GMT</pubDate>
</item>
<item>
  <title>Totally Open Science: A Proposal for a New Type of Preregistration</title>
  <link>https://phillipalday.com/blog/2013-05-02-Totally-Open-ScienceA-Proposal-for-a-New-Type-of-Preregistration.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-euj3FmBDcBI/UYAGNJhVBPI/AAAAAAAAAAk/WRxEuurGVY8/s1600/iwantopendata.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="http://1.bp.blogspot.com/-euj3FmBDcBI/UYAGNJhVBPI/AAAAAAAAAAk/WRxEuurGVY8/s320/iwantopendata.png" width="196"></a>
</div>
<br>Methodological rigor has been the center of a growing debate in the&nbsp;behavioral&nbsp;and brain sciences. &nbsp;A big problem thus far is that we’ve largely only published <b>results</b>. Preregistration forces us to publish <b>methods and hypotheses&nbsp;</b>ahead of time, which can help with&nbsp;<a href="http://pss.sagepub.com/content/22/11/1359">p-value hacking</a>, post-hoc storytelling and the <a href="http://psycnet.apa.org/journals/bul/86/3/638/">“file drawer” method</a> for dealing with negative or unwanted results. Even prominent journals like <i>Cortex</i> are getting in on&nbsp;<a href="https://www.ncbi.nlm.nih.gov/pubmed/23347556">preregistration&nbsp;with a publication guarantee</a>, effectively focusing peer review on methods and hypotheses and not on “interesting” results. Some journals also require <b>data</b> sharing, including <i>Cortex </i>in its new initiative, by uploading to public hosting services like&nbsp;<a href="http://figshare.com/">FigShare</a>.<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-_L0C1ls6IJU/UYAK55HRgBI/AAAAAAAAAA0/tlwYyYxsxPM/s1600/process-broad.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="http://3.bp.blogspot.com/-_L0C1ls6IJU/UYAK55HRgBI/AAAAAAAAAA0/tlwYyYxsxPM/s320/process-broad.png" width="320"></a>
</div>
<br><br>I want to go one step further and suggest that it’s time to share&nbsp;<b>data, method and process</b>. I want every box in that little chart covered, and moreover, I want to be able to look at how we get from box to box.<br><br>Preregistration is great and should help us to avoid a lot of post-hoc tomfoolery. But preregistration is difficult to use for certain types of exploratory or simulation-based research. While the reporting of incidental results are still allowed under certain forms of preregistration (including the <i>Cortex</i>) model, purely exploratory studies, including iterative simulation development studies, don’t fit in well with preregistration. The&nbsp;<a href="http://blogs.discovermagazine.com/neuroskeptic/2013/04/29/preregistration-problem/#.UX_iWCvk6pM">Neuroskeptic</a> agrees that such results don’t fit the preregistration model per se, but should be marked as exploratory (perhaps implicitly via their missing registration) so that it’s clear that any interesting patterns could be the result of careful selection:<br>
<blockquote class="tr_bq blockquote">
<i>We all know </i>that any 1000C finding might be a picked cherry from a rich fruit basket.
</blockquote>
By opening up process, we can still learn a lot about the fruit left in the basket.<br><br>The following is my proposal for a variant of preregistration compatible with exploratory and simulation-based research. It is based on open access and open source principles and will discourage the post-hoc practices that lead to unreliable results. The <b>key idea is transparency at every step</b> – making the context of an experiment and an analysis available and apparent not only encourages “honesty” of individual researchers in their claims but also allows us to get away from the binary world of “significance”.&nbsp;<b>This is just an initial proposal, so I won’t go into all the details and I am aware that there are a few kinks to work out.</b><br><br>
<h2 style="text-align: left;" class="anchored">
Beyond Preregistration: Full Logging
</h2>
<div>
<br>My basic proposal is this: public, append-only tracking of research process and iteration via distributed version control systems like <a href="http://mercurial.selenic.com/">Mercurial</a> and <a href="http://git-scm.com/">Git</a>. &nbsp;In essence, this is a form of extensive, semi-automated logging / snapshotting. For the individual user, this also has the nice advantage of allowing you to go back in time to older versions, compare different versions, and even help track down inconsistencies between analyses.
</div>
<div>
<br>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-dbKBgLyU3_A/UYARCXFJa2I/AAAAAAAAABE/RUxnqOHD9l0/s1600/Mercurial-log.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="182" src="http://1.bp.blogspot.com/-dbKBgLyU3_A/UYARCXFJa2I/AAAAAAAAABE/RUxnqOHD9l0/s640/Mercurial-log.png" width="640"></a>
</div>
<br><br>The initial entry in the log should clearly state whether the study is confirmatory or exploratory. Simulatory or not is orthogonal to confirmatory/exploratory: if you’re just testing whether a new model fits the data reasonably well, then you should define ahead of time what you mean by “reasonably well” and test that as you would any hypothesis in a real-world experimental investigation. If you’re trying to develop a model/simulation in the first place and just want to see how good you can make it for the data at hand, then that is exploratory research and should be marked as such. <a href="https://en.wikipedia.org/wiki/Texas_sharpshooter_fallacy">Texas sharp-shooting</a> is just as problematic, if not more so, in simulation-based research as in research in the real world.<br><br>This should then dovetail nicely into a&nbsp;<i><a href="http://www.frontiersin.org/">Frontiers</a></i>&nbsp;type publishing model with an iterative, interactive review. The review process would just be part of the log.<br><br>
<h3 style="text-align: left;" class="anchored">
Context and Curiosity
</h3>
<br>A fundamental problem with our statistics is that we think in binary: “significant” or “not significant” and often completely ignore the context and assumptions of statistical tests. Even xkcd has touched upon the&nbsp;<a href="http://xkcd.com/552/">many</a>&nbsp;<a href="http://xkcd.com/795/">of the</a>&nbsp;<a href="http://xkcd.com/882/">common</a>&nbsp;<a href="http://www.xkcd.com/892/">issues</a>&nbsp;<a href="http://www.xkcd.com/925/">in</a>&nbsp;<a href="http://www.xkcd.com/1132/">understanding</a>&nbsp;<a href="http://www.xkcd.com/1138/">statistics</a>. Many issues arise from post-hoc thinking, and this is what preregistration tries to prevent. <b>Post-hoc thinking violates statistical assumptions.</b>&nbsp;Odds are there are some interesting patterns in your data that occurred by chance. If you test them after you’ve already seen that they’re there, then you’re <a href="https://en.wikipedia.org/wiki/Begging_the_question">begging the question</a>. If you report that you found this pattern while doing something else, then it presents a direction for future research. But if you present that pattern as the one you were looking for all along, then you’ve violated the assumption of randomness that null hypothesis testing is based on.<br><br>By recording the little steps, we give our data the full context to understand and interpret them, even if they are “just” exploratory data. Exploratory data has a different context and it’s the context we need to fully evaluate a result, and not some label like “significant”.<br><br>
<div>
Isaac Asimov supposedly once said that “The most exciting phrase to hear in science, the one that heralds new discoveries, is not ‘Eureka’ but ‘That’s funny…’”. &nbsp;Even if serendipitous&nbsp;success is the exception and not the rule, we need a forum to get all the data we have out in the open in a way that doesn’t distort its meaning.<br><br>
<h2 style="text-align: left;" class="anchored">
Some Details&nbsp;
</h2>
</div>
<div>
<br>The following gets a tad more technical, but should make my idea a bit more concrete. There are a lot more details that I have given serious thought to, but won’t address here. &nbsp;
</div>
<div>
<br>
<h3 style="text-align: left;" class="anchored">
Implementation
</h3>
</div>
<div>
<br>More precisely, I’m suggesting something like <a href="https://github.com/">GitHub</a> or <a href="https://bitbucket.org/">Bitbucket</a>, but with the key difference that history is immutable and repositories cannot be deleted (to prevent ad-hoc mutation via deletion and recreation.) The preregistration component would be the initial commit, in which a README type document would outline the plan. For confirmatory research, this README would follow the same form as preregistration. (Indeed, the initial commit could even be done automatically following a traditional, web-based preregistration form.) For exploratory research (e.g.&nbsp;mining data corpora for interesting patterns as hints for planning confirmatory research), the README would be a description of the corpora (or a description of the planned corpora), including the planned size (i.e.&nbsp;test subjects and trials) of the corpus (optional stopping is bad). For simulation-based research, the README would include a description of the methodology for testing goodness of fit as well as an outline of the theoretical background being implemented computationally (lowering the bar of your model post hoc is bad). Exploratory dead ends would be apparent as unmerged branches. &nbsp;
</div>
</div>
<div>
<br>
</div>
<div>
As stated above, this should tie nicely into a <i>Frontiers</i>&nbsp;type publishing model with an iterative, interactive review. Publications coming from a particular experimental undertaking would have to be included in the repository (or a fork thereof if you’re&nbsp;analyzing&nbsp;somebody else’s data), which would make it clear when somebody’s been double dipping as well as quickly giving an overview of all relevant publications. As part of this, all the scripts that go into generating figures should be present in the repository. This of course requires that you write a script for everything, even if it’s just one line to document exactly what command-line options you gave.&nbsp;
</div>
<div>
<br>
</div>
<div>
The open repository nature also supports&nbsp;reproduciblity&nbsp;via extensive documentation/logging and openness of the original data. The latter is also important for “warm-ups” to confirmatory research: getting a good preregistration protocol outlined often requires playing with some existing data beforehand to work out kinks in the design. For exploratory and simulatory work, <i>everything</i>&nbsp;is documented: you know what was tried out, what did and didn’t work, as well as both the results of statistical tests and their context, all of which is required to figure out useful future directions.&nbsp;
</div>
<div>
<br>
<h3 style="text-align: left;" class="anchored">
A Few Obvious Concerns
</h3>
</div>
<div>
<br>
</div>
<div>
Now, there are a few obvious problems that we need to address now, despite me trying to avoid too many details.
</div>
<div>
<ol style="text-align: left;">
<li>
<i>The log given by the full repository is far too big to be reviewed in its entirety</i>. This is certainly true, but a full review should rarely be necessary, and the presence of such data would both discourage dishonesty as well as providing a better means to track it down. Of course, this is assuming that people publish the intermediate steps where data were falsified or distorted, but then again, the presence of large, opaque jumps in the log would also be an indicator of something odd going on. (“Jumps” in the logical sense and not necessarily in the temporal sense. Commit messages can and should provide additional context.) For more general perusal or tracking down a particular error source, there are many well-known methods for finding a particular entry – and many of them are already part of both Mercurial and Git!
</li>
<li>
<i>Data often comes in large binary formats. </i>I know, neither Mercurial nor Git do too well with large binary files; however, the original data files (measurements) should be immutable, which means that there will be no changes to track. Derived data files (e.g filtered data in EEG research, anything that can be generated from the original measurements) should not be tracked, but their creation should be trivial if all support scripts are included in the repository. This will also reduce the amount of data that has to be hosted somewhere.
</li>
<li>
<i>Even if we get people to submit to this idea, they can still lie by modifying history before pushing to the central repository</i>. I don’t have a full answer to this yet beyond “cheating is always possible, but this system should make it harder.” Even under traditional preregistration, it’s still possible to cheat by playing with time stamps on your files and preregistering afterwards. Non trivial, but possible. And so it is here. However, as pointed out above, the form of the record should also give some indication that something fishy is going on. Moreover, the initial commit reduces to traditional preregistration in the case of confirmatory research. Finally, this approach is about getting everything out in the sunlight; it does not guarantee publication, if for example, there is a fundamental flaw in your methodology. But the openness may allow somebody to comment and help you before you’ve gone too far off the path!&nbsp;
</li>
</ol>
<h2 style="text-align: left;" class="anchored">
Open (for Comments)
</h2>
</div>
<div>
<br>More so than even with traditional preregistration, the system proposed above should encourage and enforce a radical openness in science. For the edge cases of preregistration (exploratory and simulatory work), you can avoid some of the rigidity of preregistation at a heavy price: everything is open and it is very clear that your data is exploratory and indeed it’s clear when you found interesting data. It’s clear when &nbsp;you find something after a long fishing expedition, which means it’s clear that the result is to be taken with a grain of salt. But it also provides an unbelievably open format for showing people interesting patterns in the data, which potentially support existing research but also demand further investigation with a more focused experiment.&nbsp;
</div>
<div>
<br>It’s not science if it’s not open.<br><br>(Special thanks to <a href="http://www.uni-marburg.de/fb09/igs/mitarbeiter/sassenhagen">Jona Sassenhagen</a> for his extensive feedback on previous drafts and long discussions in the office.<a href="http://blogs.discovermagazine.com/neuroskeptic/2013/02/03/unilaterally-raising-the-scientific-standard/#.UYKfdCvk6pM"> Long a fan of preregistration</a>, you can find his first foray into the system proposed here on <a href="https://github.com/jona-sassenhagen/charvis-analysis">GitHub</a>.)
</div>
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>automation</category>
  <category>documentation</category>
  <category>git</category>
  <category>hg</category>
  <category>open science</category>
  <category>preregistration</category>
  <category>publishing</category>
  <category>reuse</category>
  <category>statistics</category>
  <category>version control</category>
  <guid>https://phillipalday.com/blog/2013-05-02-Totally-Open-ScienceA-Proposal-for-a-New-Type-of-Preregistration.html</guid>
  <pubDate>Thu, 02 May 2013 17:22:10 GMT</pubDate>
</item>
<item>
  <title>Backups: Your Relationship to Your Data and Your IT Guy</title>
  <link>https://phillipalday.com/blog/2013-02-19-Backups-Your-Relationship-to-Your-Data-and-Your-IT-Guy.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
My plan for this blog was a series of tips, tricks and suggestions for good practices in using the various pieces of technology I work with on a daily basis as well as my thoughts on using those to support good practices in science. Well, today I have a few tips not just on the technology side, but also on the social side, all inspired by an email I got this morning (loosely translated and anonymized) :<br>
<div>
<br>
</div>
<blockquote class="tr_bq blockquote">
Good Morning [my name misspelled],&nbsp; <br>I’m turning to you, because I don’t know where else to go. I somehow – I really don’t know how – managed to delete my pictures folder, and no, I don’t have a TimeMachine Backup…[everything is gone, list of important events whose pictures are gone]
</blockquote>
<blockquote class="tr_bq blockquote">
I tried the trial version of Data Rescue 3 and saw that the pictures are still “there”, but the trial version will only rescue a small amount of data. I really can’t afford the 50€ to buy the program at the moment, and who knows, how often you [impersonal – this is clear in the original] really need it. I’ll definitely start using TimeMachine now!
</blockquote>
<blockquote class="tr_bq blockquote">
I’ve asked around and don’t know anybody who has such a program. Can you help me?&nbsp;
</blockquote>
<blockquote class="tr_bq blockquote">
It would be really great if you could, because those are really unique and precious memories for me. I’ll gladly make sure that you get good, strong coffee this month and next. [This last part sounded better in the original, but the literal meaning is correct.]
</blockquote>
<blockquote class="tr_bq blockquote">
Best, <br>Anna [name changed]
</blockquote>
<br>Now the person in question is a passing acquaintance, who worked as the student assistant for a workgroup on the same floor as mine where a few of my friends work, and the computer in question is a personal machine. Finally, I’m not actually in terms of my contract an IT person, I was just more or less drafted into it because I can do it and generally enjoy working with computers.<br><br>So that’s the baseline information. Now on to what we can learn from all this. &nbsp;I’m going to discuss:<br>
<ol style="text-align: left;">
<li>
How deletion works and why programs like Data Rescue 3 can (sometimes) undelete
</li>
<li>
What this means if you find yourself needing such a program
</li>
<li>
Why you should still be using real backup software and a few recommendations on that front (i.e.&nbsp;there is no excuse for not backing up given the utilities built in modern OSes)
</li>
<li>
What we can learn from Anna’s experience in terms of dealing with your IT guy (and for the IT guys: how to not come off as a jerk yet not get abused by coworkers)&nbsp;
</li>
</ol>
<div>
This is clearly going to be a long one…
</div>
<div>
<br><a name="more"></a><br>
</div>
<h2 style="text-align: left;" class="anchored">
How deletion works and why programs like Data Rescue 3 can (sometimes) undelete
</h2>
<div>
On the majority of filesystems out there today, there is some sort of “table” which lists files and their locations on disk. (Sorry, I know, I’m massively oversimplifying this, but if you know how filesystems work, you should probably skip this section anyway.) Now, the locations are actually fixed size chunks of the disk (think of them as rooms in a building) and a file may be bigger than a single chunk in which case it’s spread out amongst several locations. These locations don’t necessarily have to be adjacent. For example, the file could “grow” after the location immediately following it is filled – this is the same as what happens when the storage capacity of a room is exceeded but the adjacent rooms are already taken – &nbsp; and then the rest of the file has to be written to another location. (This is the “fragmentation” that <i>defragmentation</i>&nbsp;tries to get rid of – clearly, it’s more efficient to read the data when it’s all in a row, at least on traditional hard drives. SSDs &nbsp;don’t really suffer from this problem, but that’s a discussion for another time.)&nbsp;
</div>
<div>
<br>
</div>
<div>
When you request a file, the location is looked up in the table and fetched for you. When you write a file, you can determine the free spots on the drive by looking at the same table. (Again, an oversimplification, but this works for now.) So, when you delete a file, you don’t actually need to go out to the location on disk and erase the data there, you can just delete the entry in the table and mark the disk location as “free”. (Sometimes you see the option for “secure delete” or something similar – in that case, the data is actually written over by some pattern.)
</div>
<div>
<br>
</div>
<div>
On modern OS X, Windows and, depending on your choice of desktop, Linux, there is an extra level of diversion. You first move things to the “Trash” or “Recycle Bin”, where they aren’t really deleted, just stored in a special location in the directory structure. If you then decide to delete for good, you empty the waste storage container &nbsp;in question and the files are removed from the allocation table and their location on disk is marked as free.
</div>
<div>
<br>
</div>
<div>
Programs like Data Rescue 3 take advantage of all this when recovering deleted files. Instead of looking at the allocation table, these programs search the sections marked as free looking for bits and pieces of deleted files. If they can assemble an entire file, it’s then listed as recoverable and you’re given the option of getting it back.&nbsp;
</div>
<br><br>
<h2 style="text-align: left;" class="anchored">
What this means if you find yourself needing such a program
</h2>
<div>
<b>Too long, didn’t read</b>:<i> don’t do anything with that computer, because almost everything can lead to a disk write, which potentially means overwriting your files now in the area marked as “free”!&nbsp;</i>
</div>
<div>
<br>
</div>
<div>
This is a subtle but important point: if you use your web browser, then it has a disk cache, which means disk writes. If you use your email client, then it also has a local disk cache. Your operating system has various logs it keeps, which means disk writes. Even your music program writes to disks to keep track of things like play counts. If you’re really lucky, then there is still a lot of free space on your disk and the portion with your files on it won’t come up for a write. But there’s a lot of luck involved there even if your disk is mostly empty. If your disk was nearly full, then it’s just ticking away the pieces of your data with every second.
</div>
<div>
<br>
</div>
<div>
So don’t touch the computer except to do the recovery! Don’t even download the recovery software or look up the recovery software online with that computer! Even the install process for the recovery software risks overwriting valuable data! (This is why the better ones offer the option of running directly from CD or the like.) &nbsp;
</div>
<div>
<br>
</div>
<h2 class="anchored">
</h2>
<h2 class="anchored">
Why you should still be using real backup software and a few recommendations on that front (i.e.&nbsp;there is no excuse for not backing up given the utilities built in modern OSes)
</h2>
So, as you can see, recovery software is an iffy proposition at best. But there are a lot of more catastrophic problems that can befall your data – your drive could die (there is a long list of horrible and sudden ways for disks of all kinds to die, and the operating environments of laptops only make it more likely). Various methods of adding&nbsp;redundancy&nbsp;to your disks are also problematic at best – even the best RAID setup won’t save you from&nbsp;accidental&nbsp;deletion (because the&nbsp;redundancy&nbsp;is only in space and not in time) or the problems that happen when additional disks fail in the rebuild process (<a href="http://www.zdnet.com/blog/storage/why-raid-5-stops-working-in-2009/162">which happens more often than you think</a>).<br>
<div>
<br>
</div>
<div>
Now I’m a huge fan of ZFS – it provides protection against silent corruption, the copy-on-write snapshots provide a TimeMachine like history for your files, and its method of rebuilding make it quite a bit robuster than traditional RAID. But it’s not ready for the average home user, and a lot of its advantages only become apparent in a multiple-disk, server-type setup, which means it’s not going to help you on your average laptop. &nbsp; &nbsp;
</div>
<div>
<br>
</div>
<div>
But both Windows and OS X have offered for several years a passable backup system. Windows has supposedly had one built in for many years, but starting from Win7, it’s become quite useable. I haven’t had much experience testing it myself (luckily, the disk in the machine I use it on hasn’t shown any problems yet), but I’ve heard generally good things about it. On OS X, you have TimeMachine, which is really the easiest thing you could imagine. The only thing you have to watch out for is that older &nbsp;backups don’t get deleted when the backup disk gets full. Both provide coarse-grained historical versioning, so you can even revert a file that you changed in an&nbsp;undesirable&nbsp;way. (Though for such things, you really should consider getting into the DVCS groove.) In the newest versions of OS X, you even get the versioning bit to some extent <i>without the TimeMachine.</i>
</div>
<div>
<br>
</div>
<div>
If you’re using your computer at work or for work, many large organizations offer a central backup service. While it might not be practical to do the initial backup from anywhere but the internal network, incremental backups mean that small changes don’t take that long to backup even from home.&nbsp;
</div>
<div>
<br>
</div>
<div>
Especially if you’re working on something like a valuable presentation or your thesis, use something like <a href="https://www.dropbox.com/">Dropbox</a> or <a href="https://spideroak.com/">SpiderOak</a> or <a href="https://www.wuala.com/">Wuala</a>. Dropbox is probably the easiest to use, but the others have their advantages, too, especially if you’re concerned about privacy of cloud storage. These services all offer versioning (if rather coarse-grained temporally), so you can restore things from older versions (for Dropbox, you have to use the web interface for this), and even if your computer, apartment, etc. spontaneously combusts, you still have a copy somewhere. (Oh yeah: if you’re really paranoid, you should have at least one backup stored offsite just in case some physical calamity – like say a burst pipe or fire – befalls both your computer and your backup disk.)&nbsp;
</div>
<div>
<br>
</div>
<div>
If you need versions, I really, really, recommend looking into DVCS for a variety of reasons. I use Mercurial most of the time, but Git and Bazaar are also quite good. Joel Spolsky gives perhaps <a href="http://hginit.com/01.html">the best introduction</a> to all the concepts involved. <a href="http://sparkleshare.org/">SparkleShare</a>&nbsp;provides a Dropbox-like interface for Git, but there are all sorts of graphical tools for the different systems, which hide the command line but not the abstractions involved (better if you’re doing anything nonlinear).&nbsp;
</div>
<div>
<br>
</div>
<div>
What doesn’t work is just copying your home folder over to an external drive every couple of days. Let’s be honest: if it’s not automatic, you’re not going to have truly regular backups. Further, you’re either wasting a lot of space in&nbsp;redundancy&nbsp;by having multiples copies for each day/week/month’s backup or you’re continuously overwriting the old backup, which means that you only have one snapshot. If you discover afterwards that you deleted the files accidentally, then your one snapshot won’t have them either. In both cases, you’re wasting a lot of time on full copies, when most of the time you only need to note the comparatively small changes. (This is how things like TimeMachine work so efficiently.)<br><br><br>
</div>
<div>
<h2 class="anchored">
What we can learn from Anna’s experience in terms of dealing with your IT guy (and for the IT guys: how to not come off as a jerk yet not get abused by coworkers)
</h2>
</div>
<div>
So, Anna’s bottom line was “Livius can help me and I’ll save 50€.” Now, my post-taxes wage is around 15€/hour (officially, i.e.&nbsp;under the assumption that I work exactly the number of hours in my contract, which is a horrible joke for doctoral students). So, if I take more than about 3 hours and 20minutes for this little project, then the cost to me – in terms of pay, ignoring things like time stress for my real job – is equal to the amount she would have paid for the software. And she hopes to reimburse me with coffee?&nbsp;
</div>
<div>
<br>
</div>
<div>
The problem here is of course the relative price of my time and the value of her pictures. Clearly, those pictures mean a lot to her. And clearly, 50€ for a one time thing is also an expensive proposition. <a href="http://www.cracked.com/blog/5-things-you-should-know-before-trying-to-fix-your-computer/">But my time is expensive, too.</a> And I’ve made it far enough that I don’t depend on coffee donations to make it. At least take me to a nice lunch. Wait,&nbsp;scratch&nbsp;that. I don’t want to eat lunch with you, I want to eat in peace. Bring me a nice lunch from my favorite Indian place so that I have something to do while babysitting the recovery process, and <a href="http://www.cracked.com/blog/6-reasons-guy-whos-fixing-your-computer-hates-you/">go read a book somewhere until I’m done</a>&nbsp;(but do leave me your password or the password to a temporary admin account).&nbsp;&nbsp;
</div>
<div>
<br>
</div>
<div>
This is why your IT guy is so grumpy. And when your IT guy isn’t actually getting paid to do IT for the computers at work, but is still forced to do so, and then you bring your personal computer with a problem caused by not following good practice and being too cheap to pay for your mistakes, and you expect him to make it all magically go away for a cup of coffee, it gets irritating. Sometimes, there is a bit of two-minute magic, and then it’s less annoying. But anything involving large amounts of data is going to take several hours. &nbsp;
</div>
<div>
<br>
</div>
<div>
<h4 style="text-align: left;" class="anchored">
So, what can you do as a non tech person?
</h4>
Well, first, stop making excuses and start making backups. Second, follow the advice in the Cracked articles I linked up there – the Cracked style can be a bit … offensive at times, but it’s solid advice. Don’t get panicky or hovery, just be honest and nice and understand that you are asking for a <b>major</b>&nbsp;favor. And finally, don’t be cheap. If you can’t afford 50€, but you can do 20€, then offer to buy your tech guy that nice lunch and then leave him alone to eat in peace. If you can afford 50€, but are too cheap so spend it on that software, then take an honest look at just how valuable you think those pictures actually are. And if you can afford the software, but are scared of screwing something up while using it, then go to your tech guy and ask him for help with the offer of purchasing the software. If you don’t have any more money to motivate him, consider giving him the software license to keep as a small thank you for helping you out.
</div>
<div>
<br>
</div>
<div>
<h4 class="anchored">
So, what can you do as the tech person?
</h4>
Slowly, but surely introduce and enforce some basic yet &nbsp;important policies. &nbsp;For me, this means that work machines are generally free to repair, but depending on my relationship to you and the nature of the problem, I may bill you for repairing your personal machine. Also, if you have a problem involving a piece of software I have explicitly mentioned as not supporting or have a problem that follows from ignoring my previous advice, then you get less sympathy and a lower spot on my todo list. For the cost of certain repairs, I have a price sheet that divides up “active work time” and “passive observation (e.g.&nbsp;monitoring a process where I can do something else on the side)” into two separate price categories.&nbsp;
</div>
<div>
<br>
</div>
<div>
I used to feel bad for taking payment for tech services, but it seems to be the only way to make people realize that they are actually asking a non trivial favor for me. &nbsp;Everybody thinks computer repair shop rates are high; part of the reason for that thought is seen in how little people value computer guys’ time as evidenced by the nature of favors asked of tech people. Doing things at an hourly rate, which is still less than the average repair shop despite offering at times better service, keeps things fair for everybody. &nbsp;But if you are charging somebody for service, you have to remember that part of service is being polite and less pissy. Roll your eyes the second they’re gone and absolutely remind them of best practices when telling them what went wrong. But don’t assign blame (it really doesn’t matter at that point) and be at least civil.&nbsp;
</div>
<div>
<br>
</div>
<div>
For coworkers, especially when you’re an unofficial IT guy, introduce set “tech office hours”. You’re available to help during those times, but not outside of them for non critical things. A system bursts into flames? You can help outside of office hours. They put something off and suddenly realize at the last moment that they can’t get their script to work? Don’t screw yourself over helping them: state clearly and honestly that you have your own things to worry about and you’ll help if you get your stuff done in time. It’s tough love, but it seems to me that it’s the only way to help without getting abused in the process.
</div>
<div>
<br>
</div>
<div>
Of course, all of these are somewhat influenced by the type of relationship you have with a person in and out of work. Your significant other should probably get tech support more or less at whim!&nbsp;
</div>
<div>
<br>
</div>
<div>
Oh, and one final tip: be very clear about what can go wrong with certain repairs and make sure to absolve yourself of liability (in writing if need be). Last summer, I repaired an ancient PowerBook, whose ridiculously small screws&nbsp;tightened&nbsp;way too tight &nbsp;quickly stripped. (I think there’s a metaphor for Apple in there somewhere…) &nbsp;I wound up having to drill out one 5mm long screw located directly above the motherboard. Not fun. But at that point, the risk was worth it – if I didn’t get that screw out, the system would remain completely dead anyway and so there was nothing to lose in some sense. But I was terrified that I would somehow be held liable if I screwed it up. So, get it in writing.
</div>
<div>
<br>
</div>
<div>
I’ve only partly implemented these suggestions, but after today, I’m going to have to start following my own advice.
</div>
<div>
<br>
</div>
<div>
What became of Anna? Luckily, I found <a href="http://www.cgsecurity.org/wiki/PhotoRec">a piece of free (GPL) software </a>that seems to be doing the trick as I write this. &nbsp;You have to use it via the command line, which is a bit scary for some users, I’ll admit, but it actually had informative and nice prompts as well as a decent wiki page. So, there was some magic to be had after all. But that coffee better be really good.
</div>
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>backups</category>
  <category>data</category>
  <category>recovery</category>
  <category>restore</category>
  <category>tech guys</category>
  <category>version control</category>
  <guid>https://phillipalday.com/blog/2013-02-19-Backups-Your-Relationship-to-Your-Data-and-Your-IT-Guy.html</guid>
  <pubDate>Tue, 19 Feb 2013 15:44:57 GMT</pubDate>
</item>
<item>
  <title>Shout out</title>
  <link>https://phillipalday.com/blog/2013-02-18-Shout-out.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
My officemate is getting some recognition for his go-get-’em attitude towards good science.<br><br><a href="http://neuroskeptic.blogspot.co.uk/2013/02/unilaterally-raising-scientific-standard.html">http://neuroskeptic.blogspot.co.uk/2013/02/unilaterally-raising-scientific-standard.html</a><br><br>Go Jona!
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>open science</category>
  <guid>https://phillipalday.com/blog/2013-02-18-Shout-out.html</guid>
  <pubDate>Mon, 18 Feb 2013 17:34:24 GMT</pubDate>
</item>
<item>
  <title>Searching for NULL: Making hg and git recognize text as text.</title>
  <link>https://phillipalday.com/blog/2013-01-29-Searching-for-NULL-Making-hg-and-git-recognize-text-as-text.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
<br>
</div>
Recently, my boss sent me her version of the LaTeX source for the paper we’re working on together, which I then proceeded to enter into the Mercurial repository. (Why she herself isn’t using Hg is a story for another time, but it’s also not that hard to do her commits for her, I just make sure to track which commit is the parent.) I wanted to see what changes she had made, so I did “hg diff” and was informed that I was comparing a binary file. I tried both “traditional” diff and git-diff and both attempted to handle the file as binary. However, I was still able to open the file in a text editor without any problems. I had read various places that tbe BOM on UTF-16 could cause problems and so I made sure that I was saving the file as UTF-8 without BOM (UTF-8 is a must for us since we had some German examples with Umlauts and Esszet ß). I was growing increasingly frustrated and was about to just damn the torpedoes and commit anyway – the diffs are calculated and stored the same way, regardless of whether or not the file is binary; only the display is adjusted – when I <a href="http://stackoverflow.com/questions/2366484/why-does-mercurial-think-my-sql-files-are-binary">read</a> that <a href="http://mercurial.selenic.com/wiki/BinaryFiles">the presence of the NULL byte</a> was one of the ways that a file is determined to be binary. So I found <a href="http://superuser.com/questions/287997/how-to-use-sed-to-remove-null-bytes">a way to remove NULL</a> and everything worked as desired. Still, I was kinda curious about where exactly there were NULLs in this file. I so searched a bit more and found a way to <a href="http://www.cygwin.com/ml/cygwin/2005-07/msg00871.html">grep them</a> and it turns out that NULL was being inserted as the very last byte in the file. Whether this was an issue with the text editor on my boss’s end or a by-product of <a href="https://en.wikipedia.org/wiki/MIME">encoding 8-bit formats into 7-bits for email</a> – especially given that her emails are usually encoded in Western ISO 8859-1, which means that two different 8-bit formats were being encoded into 7-bit ASCII – I don’t know. Anyway, here’s a summary of ways to deal with NULL in plain text files.
<script src="https://gist.github.com/4665843.js"></script>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>automation</category>
  <category>bash</category>
  <category>code</category>
  <category>git</category>
  <category>hg</category>
  <category>latex</category>
  <category>version control</category>
  <guid>https://phillipalday.com/blog/2013-01-29-Searching-for-NULL-Making-hg-and-git-recognize-text-as-text.html</guid>
  <pubDate>Tue, 29 Jan 2013 18:23:39 GMT</pubDate>
</item>
<item>
  <title>Diffs for LaTeX in Version Control</title>
  <link>https://phillipalday.com/blog/2013-01-29-Diffs-for-LaTeX-in-Version-Control.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
I use Mercurial to track changes in my LaTeX documents. While there’s latexdiff and the older texdiff to produce a conveniently marked up difference document (like Track Changes in Word or OpenOffice), those depend on having both versions available at the same time – a bit of a pain when using version control. You have to update to the old version, rename it, update to the new version and then compare them – far from trivial for documents with many files. Well, now there’s a convenient utility to do that for you with Mercurial and Git, <a href="http://www.numbertheory.nl/2012/02/09/scm-latexdiff-a-python-script-to-calculate-diffs-for-tex-files-in-git-or-mercurial-repositories/">scm-latexdiff</a>. Check it out.<br>
<div>
<br>
</div>
<div>
<br><br>
</div>
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>automation</category>
  <category>bash</category>
  <category>code</category>
  <category>latex</category>
  <category>version control</category>
  <guid>https://phillipalday.com/blog/2013-01-29-Diffs-for-LaTeX-in-Version-Control.html</guid>
  <pubDate>Tue, 29 Jan 2013 16:53:55 GMT</pubDate>
</item>
<item>
  <title>Pushing all bookmarks in mercurial</title>
  <link>https://phillipalday.com/blog/2013-01-29-Pushing-all-bookmarks-in-mercurial.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
<div dir="ltr" style="text-align: left;" data-trbidi="on">
<br>
</div>
<script src="https://gist.github.com/4664196.js"></script>
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>automation</category>
  <category>bash</category>
  <category>hg</category>
  <category>version control</category>
  <guid>https://phillipalday.com/blog/2013-01-29-Pushing-all-bookmarks-in-mercurial.html</guid>
  <pubDate>Tue, 29 Jan 2013 16:53:22 GMT</pubDate>
</item>
<item>
  <title>Best Software Practices for Science / Scientific Computing</title>
  <link>https://phillipalday.com/blog/2012-10-06-Best-Software-Practices-for-Science--Scientific-Computing.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
I highly recommend this:<br><br><a href="http://software-carpentry.org/2012/10/best-practices-for-scientific-computing/">http://software-carpentry.org/2012/10/best-practices-for-scientific-computing/</a><br><br>The most important tips that I would like to see my own group use more of are (abridged from link):<br><br>
<ol style="text-align: left;">
<li>
version control (with modern DVCS, there’s no reason not to have even your little scripts under version control)
</li>
<li>
automate&nbsp;repetitive&nbsp;tasks and use the computer to record (command) history (I think these two really go hand in hand with each other and with #1)
</li>
<li>
Don’t repeat yourself (or others).
</li>
<ol>
<li>
Every piece of data must have a single authoritative representation in the system.&nbsp;
</li>
<li>
Code should be modularized rather than copied and pasted.
</li>
<li>
Re-use code instead of rewriting it
</li>
</ol>
</ol>
<div>
Copy and pasting leads to the code blocs getting out of sync, i.e., inconsistent analyses. And I can’t tell you the number of times I’ve found a mess of &nbsp;inconsistent scripts and literally hundreds of gigabytes of duplicated data, with no single copy “authoritative”. (Luckily, in the last case, SHA1 revealed that the individual data files were identical; however, each set had a slightly different collection of files…). And if you do right from the beginning, it doesn’t even take that much time!
</div>
<div>
<br>
</div>
<div>
I think all of this can be summarized into two points:
</div>
<div>
<ol style="text-align: left;">
<li>
Use version control&nbsp;
</li>
<li>
Use good coding/documentation practices, including modularity
</li>
</ol>
</div>
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>automation</category>
  <category>code</category>
  <category>documentation</category>
  <category>reuse</category>
  <category>software</category>
  <category>version control</category>
  <guid>https://phillipalday.com/blog/2012-10-06-Best-Software-Practices-for-Science--Scientific-Computing.html</guid>
  <pubDate>Sat, 06 Oct 2012 10:03:48 GMT</pubDate>
</item>
<item>
  <title>rEFIt, broken GRUB repair following updates</title>
  <link>https://phillipalday.com/blog/2012-10-04-rEFIt-broken-GRUB-repair-following-updates.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
If you mess up your GRUB configuration on an Intel Mac dual booting via rEFIt (or rEFInd), there are several things you can do.<br><br>There’s all sorts hints and tips that may or may not work on your setup and are all very particular to your partitioning scheme, but I found a few to be quite informative, especially in understanding &nbsp;the underlying technical problem (ie why GRUB is such a pain to get working right in these setups).<br><br><a href="https://bbs.archlinux.org/viewtopic.php?id=99097">https://bbs.archlinux.org/viewtopic.php?id=99097</a><br><a href="http://mac.linux.be/content/problems-refit-and-grub-after-installation">http://mac.linux.be/content/problems-refit-and-grub-after-installation</a><br><a href="http://ubuntuforums.org/showthread.php?t=1704357">http://ubuntuforums.org/showthread.php?t=1704357</a><br><br>In the last one, the author of an important EFI / GPT-MBR hybrid utility chips in some advice and information. I would try to avoid doing a hard recreation of your hybrid MBR though. One thing you will definitely need is some type of live boot disk.<br><br>After trying several bits and pieces of the above advice, and apparently failing to properly reinstall GRUB, I went from a working GRUB that just couldn’t find my OSes after selecting to them to a GRUB that never got past displaying “loading”. &nbsp;If you get that far, then you may have to force an install.<br><br>Based on <a href="http://askubuntu.com/questions/13554/how-to-reinstall-or-recover-grub-mbr-on-an-intel-mac">this post</a>, I wrote <a href="https://gist.github.com/3833559">this script</a> for my set up. And that fixed things.<br><br>
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>boot</category>
  <category>EFI</category>
  <category>GRUB</category>
  <category>install</category>
  <category>Linux</category>
  <category>OS X</category>
  <category>rEFIt</category>
  <category>restore</category>
  <guid>https://phillipalday.com/blog/2012-10-04-rEFIt-broken-GRUB-repair-following-updates.html</guid>
  <pubDate>Thu, 04 Oct 2012 13:59:05 GMT</pubDate>
</item>
<item>
  <title>Compiling libeep on OS X (for importing data into EEGLAB)</title>
  <link>https://phillipalday.com/blog/2012-10-04-Compiling-libeep-on-OS-X-(for-importing-data-into-EEGLAB).html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
For OS X, there are a few important tips:&nbsp;
<div>
<br>
</div>
<div>
<ol>
<li>
You need a compiler installed -&gt; you need XCode installed. You can get these via the App Store for free or, pre-Lion releases, from your install disc. &nbsp;
</li>
<li>
Most important tip** Before running <span style="font-family: Courier New, Courier, monospace;">./configure –enable-matlab</span>, you need to set the <span style="font-family: Courier New, Courier, monospace;">$MATLAB</span> environment variable, which isn’t set by default on OS X. Do this via <span style="font-family: Courier New, Courier, monospace;">export MATLAB=/Applications/MATLAB_R2012a.app</span> (with ’R2012a‘ changed to whatever your MATLAB version is.)&nbsp;
</li>
<li>
&nbsp;You don’t need to ‘make install’ for using EEGLAB. Instead just copy the <span style="font-family: Courier New, Courier, monospace;">.mexmaci64</span> files from the<span style="font-family: Courier New, Courier, monospace;"> mex/matlab</span> folder to the anteepimport1.08 (version number may differ, but that was the latest based on a SVN checkout from a few days ago) subfolder in the eeglab <span style="font-family: Courier New, Courier, monospace;">plugins</span> folder. If you there is no anteepimport plugin folder, then you need to create one and copy the contents of both <span style="font-family: Courier New, Courier, monospace;">mex/matlab</span> and <span style="font-family: Courier New, Courier, monospace;">mex/eeglab</span> to it.&nbsp;
</li>
<li>
&nbsp;If you need to<span style="font-family: Courier New, Courier, monospace;"> make install </span>for other reasons, you have to <span style="font-family: Courier New, Courier, monospace;">sudo</span>.&nbsp;
</li>
</ol>
</div>
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>compile</category>
  <category>EEGLAB</category>
  <category>EEProbe</category>
  <category>libeep</category>
  <category>OS X</category>
  <guid>https://phillipalday.com/blog/2012-10-04-Compiling-libeep-on-OS-X-(for-importing-data-into-EEGLAB).html</guid>
  <pubDate>Thu, 04 Oct 2012 13:53:36 GMT</pubDate>
</item>
<item>
  <title>sudo fu</title>
  <link>https://phillipalday.com/blog/2012-10-02-sudo-fu.html</link>
  <description><![CDATA[ 





<p><em>This was originally posted on <a href="http://codingtrauma.blogspot.com/">Blogger.</a> Comments were not migrated.</em></p>
<div dir="ltr" style="text-align: left;" data-trbidi="on">
So apparently, you have to use<br>
<center>
<code>sudo su someuser</code>
</center>
<center>
<code><br></code>
</center>
to do something as another user on Linux Mint Debian Edition. Oh, and the <code>wheel</code> group is actually the <code>sudo</code> group. &nbsp;
</div>



<a onclick="window.scrollTo(0, 0); return false;" id="quarto-back-to-top"><i class="bi bi-arrow-up"></i> Back to top</a> ]]></description>
  <category>bash</category>
  <category>Debian</category>
  <category>Linux</category>
  <category>Linux Mint</category>
  <category>su</category>
  <category>sudo</category>
  <guid>https://phillipalday.com/blog/2012-10-02-sudo-fu.html</guid>
  <pubDate>Tue, 02 Oct 2012 12:44:25 GMT</pubDate>
</item>
</channel>
</rss>
