tag:blogger.com,1999:blog-302682432024-02-18T18:25:48.070-08:00chainlynx / c|-|41nl`/n><Day-to-day trials and tribulations of a DIY computer enthusiast/Silicon Valley programmerUnknownnoreply@blogger.comBlogger114125tag:blogger.com,1999:blog-30268243.post-63495504834155486682022-05-26T05:58:00.000-07:002022-05-26T06:00:24.462-07:00AIGLX/Beryl<a title="Beryl" href="http://www.beryl-project.org/">Beryl</a> is a super-sweet, super-configurable fork of <a title="Compiz" href="http://en.opensuse.org/Compiz">Compiz</a> (also see earlier post). Here I will describe how I got it set up on my system and some cool things to do with it.
<span style="font-weight: bold;">Setup</span>
Here are my specs:
<ul><li>2 Hyundai 17" screens</li><li>32-bit OS (Ubuntu Edgy Eft 6.10)</li><li>nVidia Geforce graphics card</li></ul>Following the instructions on the <a title="Unofficial Edgy Eft Starter Guide" href="http://ubuntuguide.org/wiki/Ubuntu_Edgy#How_to_install_Beryl.2FAIGLX_.28Nvidia.29">Unofficial Edgy Eft Starter Guide</a>, I got AIGLX/Beryl to work on only one screen without problems. To enable Twinview (sharing one desktop accross two physical screens), enter <span style="font-weight: bold;">sudo nvidia-settings</span> in a terminal and go to <span style="font-weight: bold;">X Server Display Configuration</span> (this, by the way, beats the hell out of hacking the /etc/X11/xorg.conf file). Click the <span style="font-weight: bold;">Configure...</span> button on the middle right and select <span style="font-weight: bold;">Twinview</span>. Be sure to back up your xorg.conf file before clicking <span style="font-weight: bold;">Save to X Configuration File</span> at the bottom and then exiting out of the settings manager. Hit <span style="font-weight: bold;">Ctrl+Alt+Backspace</span> to restart the X server.
Unfortunately, Beryl on Twinview made windows appear without titlebars or borders. I also got this message in the terminal when I disabled the session startup scripts and tried to run <span style="font-weight: bold;">beryl-manager</span> in the terminal:
<span class="searchword0">beryl:</span> <span class="searchword1">No</span> <span class="searchword2">GLXFBConfig</span> <span class="searchword3">for</span> <span class="searchword4">depth</span> <span class="searchword0">32</span>
<span class="searchword0">beryl:</span> <span class="searchword1">No</span> <span class="searchword2">GLXFBConfig</span> <span class="searchword3">for</span> <span class="searchword4">depth</span> <span class="searchword0">32</span>
<span class="searchword0">beryl:</span> <span class="searchword1">No</span> <span class="searchword2">GLXFBConfig</span> <span class="searchword3">for</span> <span class="searchword4">depth</span> <span class="searchword0">32
So, to the xorg.conf file! Under the Screen section, add this line:
<span style="font-weight: bold;">Option "AddARGBGLXVisuals" "true"</span>
I restarted the X server again and everything worked fine. Well, let me qualify that: at least nothing was obviously wrong. Some things are still somewhat slow like window resizing and scrolling. It appears that </span><a title="others are having similar problems" href="http://forum.beryl-project.org/viewtopic.php?f=36&t=411&st=0&sk=t&sd=a">others are having similar problems</a><span class="searchword0">. However, this works well enough for me.
</span><span class="searchword0"></span><span class="searchword0">
<span style="font-weight: bold;">Features/Cool things to do</span>
All these commands (and the themes) are completely configurable... just fool with the settings by clicking on the red stone in the system tray and selecting one of the managers... here are just some of the default settings
</span> <ul><li><span class="searchword0">Ctrl+Super_L: water drop on desktop (hold down keys and move mouse for trail)</span></li><li><span class="searchword0">Shirt+F7: Window wake
</span></li><li><span class="searchword0">Shirt+F9: Raindrops</span></li><li><span class="searchword0">Super+Mouse Wheel: Zoom</span></li><li><span class="searchword0">Alt+Mouse Wheel: Make a window transparent/opaque</span></li><li><span class="searchword0">Super+N: Make a window negative</span></li><li><span class="searchword0">Super+M: Make the whole screen negative</span></li><li><span class="searchword0">Alt+Left Mouse Button: Drag a window</span></li><li><span class="searchword0">Alt+Click Wheel: Resize a window</span></li><li><span class="searchword0">Ctrl+Alt+Left/Right: Spin the cube</span></li><li><span class="searchword0">Ctrl+Alt+Left Mouse Button: Drag the cube</span></li><li><span class="searchword0">Alt+Tab: Switch applications</span></li><li><span class="searchword0">F10: Expose-like effect
</span></li></ul> <span class="searchword0"> Here's where to configure desirable features in the <span style="font-weight: bold;">Beryl Settings Manager</span>:
</span> <ul><li><span class="searchword0">A 3D world: Have windows separated in a third dimension from each other (drag and rotate the cube to see!)
</span></li><li><span class="searchword0">Animations: Flames, Magic Lanterns and such</span></li><li><span class="searchword0">Scale: Expose-like effect</span></li></ul><a href="http://www.youtube.com/results?search_query=beryl&search=Search">Some Beryl demos on YouTube</a>
<span class="searchword0"></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-23742021493453030982011-05-09T19:51:00.000-07:002011-05-09T19:56:45.149-07:00How to get a RSS feed from a Twitter accountSo it seems that Twitter has <a href="http://support.twitter.com/groups/31-twitter-basics/topics/111-features/articles/15361-how-to-find-your-rss-feed">killed</a> RSS feeds (I'm not sure what that has to do with implementing OAuth), but fortunately, there's an easy workaround.<br /><br />You can get an RSS feed by <a href="http://dev.twitter.com/doc/get/statuses/user_timeline">querying</a> another URL for the desired user. For instance, to get the RSS feed for user <a href="http://twitter.com/#%21/ggreenwald">ggreenwald</a>, you can find the feed at this url: <a href="http://twitter.com/statuses/user_timeline/ggreenwald.rss">http://twitter.com/statuses/user_timeline/ggreenwald.rss</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-74598049565176180232011-03-12T10:29:00.000-08:002011-03-12T10:32:24.965-08:00Facebook Wall questionI sometimes have the question asked of me, "Danny, you are such a strong advocate of transparency and access; aren't you being a hypocrite by not allowing others to comment on your Facebook wall?"<br /><br />This has always struck me as a rather strange question because it confuses the obligations of a person with the obligations of a state or corporation. It is true that I think that, say, governments should be relatively transparent -- that's a prerequisite for accountability. I, on the other hand, am a priori accountable to no one so I don't have those same obligations.<br /><br />This accusation is analogous to claiming that WikiLeaks is a hypocritical organization because its members don't share all their internal communication with the world (many in the mainstream media do make this point after each release from WikiLeaks in order to discredit the organization). As if 1) there is any equivalence between the transparency obligations of states/corporations and activist groups or 2) WikiLeaks isn't facing an existential threat from organizations that would use that internal information to try and destroy the group.<br /><br />But that aside, there is a valid question contained within the query. Why do I have the personal preference of configuring my Facebook Wall settings in such a way? I just don't feel that it is worth the time and mental strain to police my Facebook profile 24/7 to expunge things said by others (whether said out of malice, ignorance or superfluousness) that I would rather not have on there. There are sufficient potentially undesirable comments that may be put on one's profile for this to be a valid concern.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-59972085903361347472010-05-22T19:10:00.000-07:002010-05-22T19:19:24.522-07:00Multidimensional arrays with GCC's variable length arraysGCC's extensions allow you to do some crazy things with multidimensional arrays. For C99, GCC implements <a href="http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html">variable-length arrays</a>. So a declaration like this:<br /><br /><span style="font-family: courier new;">int matrix[a][b + 1];</span><br /><br />Can be passed by reference to a function with this prototype:<br /><br /><span style="font-family: courier new;">void foo(int a, int b, int matrix[a][b+1]);</span><br /><br />Or, if you want to get really crazy, you can use forward declarations and change around the parameter order:<br /><br /><span style="font-family: courier new;">void foo(int a; int b; int matrix[a][b+1], int a, int b);</span><br /><br />No malloc needed! Much better than <a href="http://www.eumus.edu.uy/eme/c/c-notes_summit/intermediate/sx9.html">the old way</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-87101312734151140702010-04-10T08:22:00.000-07:002010-04-10T08:26:02.443-07:00Which application is using that port?See which ports are open, as an attacker would:<br /><br /><span style="font-weight: bold;">nmap 127.0.0.1</span><br /><br />(Superuser seems to need to be used on some the following commands)<br /><br />See which process is using port 25:<br /><br /><span style="font-weight: bold;">netstat -nlp | grep 25</span><br /><br />Same, with a bit less info:<br /><br /><span style="font-weight: bold;">fuser -n tcp 25</span><br /><br />Or you could also do:<br /><br /><span style="font-weight: bold;">fuser -u smtp/tcp</span><br /><br />Discovered <a href="http://blog.spikesource.com/fuser_netstat.htm">here</a><br /><span style="font-weight: bold;"></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-16701820550817652632010-03-17T19:34:00.000-07:002010-03-17T19:47:00.453-07:00Sansa Clip and KarmicUpon upgrade to Karmic Koala Ubuntu (9.10), my trusty <a href="http://www.amazon.com/Sandisk-Sansa-Clip-Player-Black/dp/B001H9O6QW/ref=sr_1_1?ie=UTF8&s=electronics&qid=1268879813&sr=8-1">Sansa Clip</a> player was not autodetecting like it did under the Ubuntu distribution I was previously using. So I scoured the web and found <a href="http://www.howtoforge.com/sandisk_mp3_player_linux">this site</a> which gives a workaround: when the Sansa Clip is disconnected, go to <span style="font-weight: bold;">Settings->USB Mode</span> on the Sansa Clip and set it to <span style="font-weight: bold;">MSC</span>. It should now present itself to the computer as a normal file system. Unless, of course, the file system is screwed up, in which case you'll have to go to <span style="font-weight: bold;">Settings->Format</span> and format the Sansa Clip drive before connecting it again.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-30797195977689484222010-03-05T21:52:00.000-08:002010-03-25T16:01:09.635-07:00Funny C tricksTaken from Bill Rowan's <a href="http://stanfordacm.com/">Stanford ACM</a> <a href="http://stanfordacm.com/2010/03/acm-general-meeting/">presentation</a>:<br /><br />The "downto" operator:<br /><pre><br />int main()<br />{<br />int i = 5;<br />while(i --> 0) // --> is the downto operator!<br />{<br /> printf("%d\n", i);<br />}<br />return 0;<br />}<br /></pre><br />Cast any type to "bool" type (that is, 1 or 0):<br /><pre>!!foo</pre>"Computed goto" (compiler-dependent && unary operator):<br /><pre>void print_loop(int s, int e) {<br /> assert(s < e); <br /> top: <br /> printf("%d\n", s); <br /> goto *( &&top + ( !!(s++/e) ) * ( &&end - &&top ) ); <br /> end: <br /> ;<br />} </pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-89333630827755034642010-01-12T18:31:00.000-08:002010-01-12T18:59:12.903-08:00Make a big file into many small files (and back again)Adapted from <a href="http://tech.slashdot.org/story/10/01/12/1932232/Google-Docs-To-Host-Any-File-Type">this slashdot thread</a><br /><br />Create many little files called "chunks00000" etc. from bigfile that are all just under 10MB in size: <span style="font-weight: bold;">split -a 5 -b 10MB -d bigfile chunks</span><br /><br />Put the chunks back together: <span style="font-weight: bold;">cat * > newbigfile</span><br /><br />Do the same, except with compression: <span style="font-weight: bold;">tar -zc bigfile | split -a 5 -b 10MB -d - chunks</span><br /><br />Put the compressed chunks back together: <span style="font-weight: bold;">cat chunks000* | tar -zxO > newbigfile</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-41558007498650150022009-12-02T07:30:00.000-08:002009-12-02T07:36:25.939-08:00Browsing as Googlebot to circumvent paywallsInteresting technique from <a href="http://yro.slashdot.org/story/09/12/02/0224250/Google-May-Limit-Free-News-Access?from=rss&utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+Slashdot%2Fslashdot+%28Slashdot%29">a Slashdot article</a> and commenter <a href="http://slashdot.org/%7Edarthflo">darthflo</a>:<br /><div class="commentBody"> <div id="comment_body_30295374"><p></p><blockquote><p>Most 'papers like Google and the visitors Google sends them; so the Google Bot and hits with a google.com Referer tend to get a free pass. Use this to your advantage:</p><ul><li>Google the Article's URI, click the link and off you go (with a real Google referer).</li><li>If it's not indexed yet and you're using Opera: Go to any Google page, press Ctrl + U, change any one link's href to the article's URI, click "Save Changes", click the link and off you go (with a fake Google referer. This works for any fake referer, by the way).</li><li>If they're picky, they mightn't let hits from Google through but still allow the Google bot to index their pages. Change your User-Agent accordingly. In Firefox, go to about:config and change general.useragent.extra.firefox to Googlebot 2.1 and off you go (as Googlebot).</li><li>As a last resort, there's quite a few ad-blocking personal proxies out there. Most of them allow you to fake Referers or change User-Agents, for any browser.</li></ul></blockquote></div> </div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-38718551984685744752009-10-25T12:38:00.000-07:002009-10-26T11:14:56.333-07:00Insidious C bugsHere's a couple novel C bugs that I've encountered recently (using gcc). Man, it sucks when these happen.<br /><br /><span style="font-weight: bold;">1) No compiler warnings when not instantiating structs correctly</span><br /><br />The following code will give no warning indicating that you have not, when declaring an array of structs using the curly bracket notation, instantiated all members of the struct:<br /><pre>#include <stdio.h><br /><br />int main()<br />{<br /> struct a_struct {<br /> int a;<br /> int b;<br /> } buggy[] = {<br /> { 1, 2, },<br /> { 3, /* oops! */ },<br /> { 5, 6, },<br /> };<br /><br /> int i;<br /> for(i = 0; i < sizeof(buggy) / sizeof(*buggy); i++)<br /> {<br /> printf("%i: %i %i\n", i, buggy[i].a, buggy[i].b);<br /> }<br /><br /> return 0;<br />}<br /></pre>Here's the ouptut:<br /><pre>0: 1 2<br />1: 3 0<br />2: 5 6<br /></pre>Oops! It would have been nice for the compiler to tell us about this...<br /><br /><span style="font-weight: bold;">2) Forgetting to delete the semicolon when turning an assert into an if statement</span><br /><br />Say you have<br /><pre>assert(cond);<br /></pre>But you want to make it an if statement to have a little more debugging output when it triggers. So you change it to:<br /><pre>if(!cond); /* oops! */<br />{<br /> dump_stats();<br /> assert(0);<br />}<br /></pre>Whoops! Now the if statement has an empty body and the block between the curly braces will always execute!<br /><br /><span style="font-weight: bold;">3) Strange things you can't do within case statements<br /><br /></span><span>This isn't really insidious so much as annoying</span><span style="font-weight: bold;"> </span><span>-- why are you allowed to do some things inside a case statement (that don't seem to make sense) but aren't allowed to do others (that seem to make much more sense)? For instance:</span><br /><pre><br />int main() {<br /> int i = 0;<br /><br /> switch(i)<br /> {<br /> int j = 5; /* fine */<br /> case 0:<br /> char ch; /* error */<br /> break;<br /> case 1:<br /> i = 1;<br /> char ch2; /* fine */<br /> break;<br /> default:; <br /> char ch3; /* fine */<br /> break;<br /> }<br /><br /> return i;<br />}<br /></pre>Note the semicolon following the 'default:' There's a good discussion of this problem <a href="http://bytes.com/topic/c/answers/214730-c99-variable-declarations-inside-switch-statements">here</a>. Essentially, the first thing after a label cannot be a declaration. The error that the compiler gives here is usually pretty cryptic, too.<br /><br /><span style="font-weight: bold;">Similar links</span><br /><ul><li><a href="http://www.andromeda.com/people/ddyer/topten.html">Top 10 Ways to get screwed by the C programming language</a></li></ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-59343977830238390352009-10-04T23:50:00.000-07:002010-12-26T14:22:03.267-08:00Youtube kung-fu on LinuxThis is just a collection of commands that I have used in the past to edit video, especially for uploading to online video sites such as YouTube. This entry is small now, hopefully it grows as I figure out how to do more useful stuff.<br /><pre><br /># Cut a clip from a whole video file (-ss is base, -t is offset)<br />ffmpeg -sameq -i input.avi -ss 00:1:23 -t 00:02:35 output.avi<br /><br /># Boost the volume of a video file<br />ffmpeg -sameq -vol 1000 -i input.avi output.avi<br />or, see Avidemux tutorial here: http://www.youtube.com/watch?v=w8K0D2t0ysE<br /><br /># Dump audio of an flv video file to mp3<br />ffmpeg -i inputfile.flv -f mp3 -vn -acodec copy ouputfile.mp3<br /></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-16896431479924432352009-09-23T10:47:00.000-07:002009-09-23T10:52:41.778-07:00Mandating key-based logins with sshd<a href="http://sial.org/howto/openssh/publickey-auth/">This page</a> provides a pretty good summary of creating a public/private key pair on the client and adding the public key to the server's authorized_keys file. <br /><br />On the server side, edit <span style="font-weight: bold;">/etc/ssh/sshd_config</span> and add the directive <span style="font-weight: bold;">PasswordAuthentication no</span> and then restart sshd with <span style="font-weight: bold;">sudo /etc/init.d/ssh restart</span> Anyone that tries to log in to your server without a public key in the server's authorized_keys file will now not even be given the chance to enter a password.<br /><br /><a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?sshd_config+5">sshd_config manpage</a>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-30268243.post-53263365090904917552009-09-21T18:01:00.000-07:002009-12-07T18:53:40.289-08:00xmonad<a href="http://xmonad.org/">Xmonad</a> is a <a href="http://xmonad.org/tour.html">sweet</a> window manager. So sweet, in fact, that I've decided to use it. Here's a quick reference, basically the manpage rearranged (mod = alt by default) ... (also, remember to change the session login to "Run Xclient script" so that other things, like xmodmap, can be run in .xsession):<br /><pre><br />=== Launch ===<br />mod-shift-q -- Quit xmonad<br />mod-q -- Restart xmonad (and reload config file)<br />mod-shift-return -- Launch terminal<br />mod-shift-c -- Close the focused window<br />mod-p -- Launch dmenu<br /><br />=== Layout ===<br />mod-space -- Rotate through the available layout algorithms<br />mod-shift-space -- Reset the layouts on the current workspace to default<br /><br />=== Focus ===<br />mod-tab -- Move focus to the next window<br />mod-shift-tab -- Move focus to the previous window<br />mod-j -- Move focus to the next window<br />mod-k -- Move focus to the previous window<br />mod-m -- Move focus to the master window<br /><br />=== Swap ===<br />mod-return -- Swap the focused window and the master window<br />mod-shift-j -- Swap the focused window with the next window<br />mod-shift-k -- Swap the focused window with the previous window<br /><br />=== Resize ===<br />mod-h -- Shrink the master area<br />mod-l -- Expand the master area<br /><br />=== Master Area (the area on the left) ===<br />mod-comma -- Increment the number of windows in the master area<br />mod-period -- Deincrement the number of windows in the master area<br /><br />=== Workspace ===<br />mod-[1..9] -- Switch to workspace N<br />mod-shift-[1..9] -- Move client to workspace N<br /><br />=== Multiple Screens ===<br />mod-{w,e,r} -- Switch to physical/Xinerama screens 1, 2, or 3<br />mod-shift-{w,e,r} -- Move client to screen 1, 2, or 3<br /><br />=== Mouse ===<br />mod-button1 -- Set the window to floating mode and move by dragging<br />mod-button2 -- Raise the window to the top of the stack<br />mod-button3 -- Set the window to floating mode and resize by dragging<br />mod-t -- Push window back into tiling<br /><br />=== Setup ===<br />sudo apt-get install xmonad dwm xlockmore xclock htop<br /><br />=== ? ===<br />mod-shift-p -- Launch gmrun<br />mod-n -- Resize viewed windows to the correct size<br />mod-b -- Toggle the status bar gap<br /></pre><br />Here are some other useful utilities to replace functionality that is present in, say, GNOME on the command line:<br /><ul><li><a href="http://www.xfree86.org/4.0.2/xclock.1.html">xclock</a> -- tell the time<br /></li><li><a href="http://gwyn.tux.org/%7Ebagleyd/xlockmore.html">xlock</a> -- lock the X window session<br /></li><li><a href="http://htop.sourceforge.net/">htop</a> -- a better system monitor<br /></li><li><a href="http://en.wikipedia.org/wiki/Alsamixer">alsamixer</a> -- control volume, etc.<br /></li><li><a href="http://mp3blaster.sourceforge.net/">mp3blaster</a> -- play music</li><li><a href="http://linux.about.com/library/cmd/blcmdl1_cal.htm">cal</a> -- calendar<br /></li></ul><span style="font-size:130%;"><span style="font-weight: bold;">How to install <a href="http://code.haskell.org/%7Earossato/xmobar/">Xmobar</a></span></span><br /><br />First, install the necessary packages:<br /><span style="font-weight: bold;">sudo apt-get install libghc6-http-dev libghc6-zlib-dev libx11-dev libxft-dev</span><br /><br />I hadn't installed any packages with <a href="http://www.haskell.org/cabal/">cabal</a> before, so I needed to set up that as well. I found it necessary to do the standard download, untar, runhaskell Setup configure && runhaskell Setup build && sudo runhaskell Setup install for the following packages:<br /><ul><li>http://hackage.haskell.org/packages/archive/HTTP/4000.0.8/HTTP-4000.0.8.tar.gz</li><li>http://haskell.org/cabal/release/cabal-1.6.0.2/Cabal-1.6.0.2.tar.gz</li><li>http://haskell.org/cabal/release/cabal-install-0.6.2/cabal-install-0.6.2.tar.gz</li></ul>A <span style="font-weight: bold;">cabal update</span> initializes the package database and a <span style="font-weight: bold;">cabal install xmobar</span> grabs the package.<br /><br />Put this in your <span style="font-weight: bold;">xmonad.hs</span> (changing the paths appropriately, of course):<br /><pre><br />import XMonad<br />import XMonad.Hooks.DynamicLog<br />import XMonad.Hooks.ManageDocks<br />import XMonad.Util.Run(spawnPipe)<br />import System.IO<br /><br />main = do<br />xmproc <- spawnPipe "/home/dannyc/.cabal/bin/xmobar /home/dannyc/.xmonad/xmobarrc"<br />xmonad $ defaultConfig {<br /> layoutHook = avoidStruts $ layoutHook defaultConfig<br />, logHook = dynamicLogWithPP $ xmobarPP<br /> { ppOutput = hPutStrLn xmproc<br /> , ppTitle = xmobarColor "green" "" . shorten 50<br /> }<br />}<br /></pre>And put this in your<span style="font-weight: bold;"> xmobarrc</span>:<br /><pre>Config { font = "-*-Fixed-Bold-R-Normal-*-13-*-*-*-*-*-*-*"<br /> , bgColor = "black"<br /> , fgColor = "grey"<br /> , position = TopW L 90<br /> , commands = [ Run Weather "EGPF" ["-t"," <tempF>F","-L","64","-H","77",<br />"--normal","green","--high","red","--low","lightblue"] 36000<br /> , Run Cpu ["-L","3","-H","50","--normal","green","--high","red"] 10<br /> , Run Memory ["-t","Mem: <usedratio> 10<br /> , Run Swap [] 10<br /> , Run Date "%a %b %_d %l:%M" "date" 10<br /> , Run StdinReader<br /> ]<br /> , sepChar = "%"<br /> , alignSep = "}{"<br /> , template = "%StdinReader% }{ %cpu% | %memory% * %swap% <fc=#ee9a00>date%<fc> | %EGPF%"<br /> }<br /><tempf><usedratio><br /></usedratio></tempf></pre>There, you now have a bare-bones xmobar install. I figured this out by loosely following the instructions <a href="http://haskell.org/haskellwiki/Xmonad/Config_archive/John_Goerzen%27s_Configuration">here</a>. I don't know any haskell (yet) and this is my first time messing with the xmonad config, so I don't guarantee at all that I am doing things the Right Way. If your xmonad keeps locking up because of this configuration, see the big bold comment in the link above which points to <a href="http://haskell.org/haskellwiki/Xmonad/Frequently_asked_questions#XMonad_stops_but_the_current_window_still_responds_to_keys">here</a>.<br /><br /><span style="font-weight: bold;font-size:130%;" >TODO</span><br /><ul><li>customize xmobar<br /></li><li>some kind of screen-like titleing for workspaces</li><li>better fonts?</li><li>picture background on startup (/transparent windows?)<br /></li></ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-23278082680919369052009-08-24T19:34:00.001-07:002009-12-02T11:26:16.601-08:00Video DownloadHelper Firefox extension + YouTube = Napster<a href="https://addons.mozilla.org/en-US/firefox/addon/3006">Video DownloadHelper</a> can download videos from <a href="http://www.youtube.com/">YouTube</a> (or other video sites) and convert the audio to <a href="http://en.wikipedia.org/wiki/MP3">mp3</a> (or other formats) using <a href="http://ffmpeg.org/">ffmpeg</a> (the default). Pick the mp4 (high quality / high definition -- these are format 18 or 22) videos off of YouTube to get the highest quality audio (128 kbps).<br /><br />Ah, this <a href="http://static.userland.com/images/radiodiscuss/napsterScreenShot.gif">brings me back</a>...<br /><br />Update: Even better, now that <a href="http://www.lala.com/">Lala</a>, et al are providing music streaming <a href="http://latimesblogs.latimes.com/technology/2009/10/google-music-myspace-lala-ilike.html">straight from a Google search</a>, one need not even bother with YouTube -- faster download/conversion, and same (better?) quality.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-39622073410552965762009-07-25T14:06:00.000-07:002009-07-28T22:39:08.661-07:00Photo metadata<pre># get <a href="http://www.sno.phy.queensu.ca/%7Ephil/exiftool/">exiftool</a><br />sudo apt-get install libimage-exiftool-perl<br /><br /># get <a href="http://libexif.sourceforge.net/">libexif</a> CLI tool<br />sudo apt-get install exif<br /><br /># erase all metadata<br />exiftool -all='' img.jpg<br /><br /># see what metadata tags your photo has<br />exif -l img.jpg<br /><br /># see the values of the included metadata tags<br />exif img.jpg<br /></pre><br />EXIF specifications: http://www.exif.org/specifications.html<br />For PNGs: http://pmt.sourceforge.net/pngmeta/index.htmlUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-58570709958855184892009-07-23T22:48:00.001-07:002009-07-23T23:08:54.692-07:00And now, a demonstration in how ridiculously easy it is to hack stuff with GoogleInspired by <a href="http://www.reddit.com/r/programming/comments/9351d/how_not_to_secure_your_network_printers/">this <span class="blsp-spelling-error" id="SPELLING_ERROR_0">reddit</span> thread</a> (look <a href="http://chainlynx.blogspot.com/2006/11/google-hacking-maximize-effectiveness.html">here</a> for help deciphering the Google syntax).<br /><br /><a href="http://www.google.com/search?hl=en&q=inurl%3ASELECT+inurl%3AFROM+inurl%3AWHERE+intitle%3Aphpmyadmin&btnG=Search"><span class="blsp-spelling-error" id="SPELLING_ERROR_1">phpMyAdmin</span></a> -- <span class="blsp-spelling-error" id="SPELLING_ERROR_2">inurl</span>:SELECT <span class="blsp-spelling-error" id="SPELLING_ERROR_3">inurl</span>:FROM <span class="blsp-spelling-error" id="SPELLING_ERROR_4">inurl</span>:WHERE <span class="blsp-spelling-error" id="SPELLING_ERROR_5">intitle</span>:<span class="blsp-spelling-error" id="SPELLING_ERROR_6">phpmyadmin</span><br /><br /><a href="http://www.google.com/search?q=%22identify+the+document+you+want+to+print+by+using+either+option+shown+below,+then+select+the+apply+button.%22&num=100&hl=en&safe=off&client=firefox-a&rls=org.mozilla:en-US:official&filter=0">HP Laserjet printers</a> -- "identify the document you want to print by using either option shown below, then select the apply button."<br /><a href="http://www.google.co.uk/search?hl=en&safe=off&client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&hs=33a&q=%22Web+Image+Monitor%22+location+comment+%22device+name%22&btnG=Search&meta="><br />More printers</a> -- "Web Image Monitor" location comment "device name"<br /><a href="http://www.google.com/search?q=inurl:%22viewerframe+mode=%22"><br />Web cams</a> -- inurl:"viewerframe mode="<br /><br />And, let's not forget the <a href="http://johnny.ihackstuff.com/ghdb/">Google Hacking Database</a> or how to use Google to <a href="http://it.slashdot.org/article.pl?sid=07/11/20/1914209">crack MD5-hashed passwords</a>!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-9105905435276262042009-07-12T10:18:00.001-07:002009-07-12T10:23:16.531-07:00batch: like at, but better<a href="http://linux.die.net/man/1/batch">batch</a> is a tool that is identical to <a href="http://linux.die.net/man/1/batch">at</a> (same manpage even), except it runs a specified job when the <a href="http://www.linuxjournal.com/article/9001">load</a> averages are low instead of at a certain time. Very handy if one needs a job to execute on a busy server and doesn't care when it happens, just that it happens.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-82291780090807494232009-05-31T14:37:00.000-07:002009-05-31T14:49:02.472-07:00Stanford students 'better than other people'?<span id="mn_Global"><span id="mn_Article">A telling quote from a Stanford student in today's San Jose Mercury News <a href="http://www.mercurynews.com/topstories/ci_12486425?nclick_check=1">front-page story</a>:<br /><br />"When they welcome you to freshman orientation," Robbins says, "part of what they tell you is that you're better than other people."<br /><br />Not smarter, not better at standardized test scores or kissing ass to get ahead, but unequivocally superior human beings than all those proles that attend state schools. I have to say, this quote typifies the holier-than-thou, aristocratic, snub-nosed attitude that runs through a lot of the student body (and faculty).</span></span><span id="mn_Global"><span id="mn_Article"><br /></span></span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-89514204775810242872009-05-30T00:24:00.001-07:002010-06-10T12:12:42.671-07:00My .pythonrc.py<pre><br />#!/usr/bin/python<br /><br />import sys<br />import os<br />import atexit<br /><br /># color prompt<br />sys.ps1 = '\001\033[1;36m\002>>> \001\033[0m\002'<br /><br /># tab completion<br /># from http://www.doughellmann.com/PyMOTW/rlcompleter/index.html<br />try:<br /> import readline<br />except ImportError:<br /> # Silently ignore missing readline module<br /> pass<br />else:<br /> import rlcompleter<br /> readline.parse_and_bind("tab: complete")<br /><br /># history<br /># from http://dotfiles.org/~remote/.pythonrc.py<br />histfile = os.path.join(os.environ["HOME"], ".python_history")<br />try:<br /> readline.read_history_file(histfile)<br />except IOError:<br /> pass<br /><br />atexit.register(readline.write_history_file, histfile)<br />del os, histfile<br /></pre><br /><br />If running 'python' on the command line does not run the file, you can always alias python to 'python -i ~/.pythonrc.py'Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-30268243.post-53945747696441950922009-05-26T23:21:00.000-07:002009-05-26T23:24:16.570-07:00Critique of Laughlin's "The Crime of Reason"When I saw Robert <span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline">Laughlin</span> speak at Stanford, I was terribly disturbed by some of his ideas and intrigued by others. As someone who drinks the free software/culture <span class="misspell" suggestions="kook,Koo,Kohl,cool,kohl">kool</span>-aid, I was always of the opinion that the free flow of information helped humanity, not hurt it. As a follow up on his talk, I decided to pick up a copy of <span class="misspell" suggestions="Laughing's,Laughton's,Lanolin's,Lifeline's,Lurline's">Laughlin's</span> book, <a title="The Crime of Reason" href="http://www.amazon.com/Crime-Reason-Closing-Scientific-Mind/dp/0465005071" id="xv2x">The Crime of Reason</a>, to investigate his ideas further. The book, like is talk, contains some very interesting and important ideas but is poorly put together and rather meandering. Writing style aside, the book discusses the following topics, which I will comment on in turn:<br /><b><br />The Intellectual Property system is necessary for economic progress<br /><br /></b><span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline">Laughlin</span> states that "Universal access to knowledge is fundamentally incompatible with market economics." (p.45) By this he mostly means that the patent system in the United States is necessary for economic development. He doesn't provide any convincing evidence to back this up, but merely provides a false analogy equating the economy with a game of poker in which everyone has incentives to hide and steal from each other. Perhaps these dynamics apply in certain sectors of the economy (particularly looking through the lens of a physicist who has spent his entire life inside the bowels of the military-industrial complex), but in other cases they do not. The open-source software industry immediately springs to mind as an example in which companies have an interest in freely sharing knowledge with each other.<br /><br />In any event, the idea of the necessity of a patent system has been completely eviscerated by <span class="misspell" suggestions="Bouldering,Bolding,Aldrin,Balduin,Baldwin">Boldrin</span> and Levine in their book <a title="Against Intellectual Monopoly" href="http://www.amazon.com/Against-Intellectual-Monopoly-Michele-Boldrin/dp/0521879280" id="owmk">Against Intellectual Monopoly</a>. Looking at history, the acquisition of a patent in a particular field coincided with a stall of progress in an industry until the patent expired and, not coincidentally, substantially increased patent lawsuits within that industry as the patent holder sought to restrict anyone else from innovating. Patents are a type of monopoly and, as any econ 101 student will tell you, monopolies are a Bad Thing because they deprive both consumers of a low cost for products and also prevent other potential producers from making money by entering the market. Awarding patents is hardly "necessary for living" (p.49) as <span id="bad_word" class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline">Laughlin</span> claims.<br /><br /><b>How and why technical knowledge becomes illegal<br /><br /></b>The main thrust of the book has to do with the troubling tendency of modern societies to effectively outlaw knowledge. <span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline">Laughlin</span> compiles a list of fields today whose study has been criminalized in some form or another:<br /><br />- cryptography<br />- circumvention (<span class="misspell" suggestions="YMCA,MAC,MYCA,MICA,DC">DMCA</span>)<br />- physics (nukes)<br />- genetics<br />- bioengineering (engineered diseases)<br />- biology (cloning, chimeras)<br />- national security related processes<br />- chemistry<br />- etc.<br /><br />He asserts that learning about these fields has been criminalized either in the law itself (which is rarely challenged in open court because of the potential government 'secrets' a trial could leak) or by <span class="misspell" suggestions="DE,De,DEA,DOE,Dee">de</span> facto means such as withdrawal of research funds or public ostracism. This development, of course, is quite at odds with the way that learning is supposed to work in our society, as <span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline">Laughlin</span> recognizes: "Modern civilization rests on two mutually exclusive kinds of thinking -- one embodied in the free speech guarantees in the First Amendment of the U.S. constitution, the other in the Atomic Energy Act." (p.82) His most effective case in point is that of nuclear physics, in which the U.S. government has led a campaign of a quasi-legal nature to suppress the spreading of knowledge on the subject. He reasons that this censorship "set a precedent that has now led, by small steps, to a significant and growing threat to our freedom to reason and learn." (p.84) This is the most convincing, and consequential, argument of the book, and deserves serious thought by all members of our government and society. Are we really willing to sacrifice our freedoms to pursue intellectually interesting scientific facts for the sake of purported security, morality and order?<br /><br /><b>The consequences for a society which deems scientific knowledge illegal<br /><br /></b>In the final chapter, <span class="misspell" suggestions="Laughing,Laughton,Lanolin,Lifeline,Lurline">Laughlin</span> conducts a thought experiment: what will smart people do if and when we achieve this nightmare society in which the pursuit of any and all interesting technical knowledge is illegal? <span class="misspell" suggestions="Laughing's,Laughton's,Lanolin's,Lifeline's,Lurline's">Laughlin's</span> suggestion that "The sensible course of action would probably be to give up" (p.144) is deeply unsatisfying. He then postulates that the talented technical folk (that is, everyone that didn't become a doctor or a lawyer or a businessman) will either seek employment in the service of rogue dictatorships that allow science, become 'guerrilla warriors' of a sort within their own country or go somewhere else (in the interplanetary sense) to establish a new society where there is no crime of reason. It's very romantic to think of the creation of a new order by a disgruntled segment of society (a la the emigration of persecuted religious groups to America). If it is necessary, however, is another matter entirely. It's certainly way too early, in my opinion, to 'give up' on our present society. A more enlightened public debate on this topic, if not reform, is not out of reach.<br /><br />You can read <a href="http://www.amazon.com/Crime-Reason-Closing-Scientific-Mind/product-reviews/0465005071/ref=cm_cr_dp_all_helpful?ie=UTF8&coliid=&showViewpoints=1&colid=&sortBy=bySubmissionDateDescending">other peoples' opinions on the book on Amazon</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-81886047331855386102009-05-21T22:04:00.000-07:002011-02-04T23:42:11.248-08:00Twitter: Good or Evil (or Irrelevant or Same ol')?Everyone seems to be talking about and using <a title="Twitter" href="http://twitter.com/" id="ybce">Twitter</a> these days (I'm not on it and have no plans to join in the immediate future). It seems as though Twitter is the newest wave of social media hype, for better or for worse. If you cut through the frenzied enthusiasm about Twitter, however, you get a picture of a service that is just another method of communication, with all the positives and negatives that that provides (albeit with a unique short-message twist).<br /><br />Twitter has proven itself as one of a number of social media platforms that can be used to report breaking news events faster than traditional news reporters can arrive on the scene. The most important and striking example of this was the coverage of the <a title="Mumbai Terror Attacks" href="http://www.telegraph.co.uk/news/worldnews/asia/india/3530640/Mumbai-attacks-Twitter-and-Flickr-used-to-break-news-Bombay-India.html" id="j463"><span class="misspell" suggestions="Mamba,Mambo,Rumba,Mambas,Mumble">Mumbai</span> Terror Attacks</a>. Other sites, notably <span class="misspell" suggestions="Wiped,Wimped,Kipped,Wicked,Whipped">Wikipedia</span> and <span class="misspell" suggestions="Flickery,Flicker,Flick,Flicks,Flickers">Flickr</span>, also contained up-to-the-minute details of the attack that mainstream media sites such as CNN cribbed for their stories on the incident. Twitter has also been used by activists to organize and rapidly disseminate information. Consider reporters in Egypt that were <a title="able to alert colleagues to their arrest" href="http://www.cnn.com/2008/TECH/04/25/twitter.buck/" id="hvoq">able to alert colleagues to their arrest</a> via Twitter. Others recently mounted a campaign to expose Amazon.<span class="misspell" suggestions="Com's,Como's,coma's,corm's,Cm's">com's</span> system that placed <a title="gay and lesbian-related items lower" href="http://www.internetnews.com/ec-news/article.php/3815101" id="j20c">gay and lesbian-related items lower</a> in the site rankings.<br /><br />But Twitter not only has the power to educate and organize, it also has the power to misinform. Consider the recent swine flu panic: Twitter users reacted to the global scare by essentially <a title="amplifying the pig paranoia" href="http://neteffect.foreignpolicy.com/posts/2009/04/25/swine_flu_twitters_power_to_misinform" id="a.nf">amplifying the pig paranoia</a> rather than providing any useful information about the disease. The 'social' factor of Twitter exacerbates this phenomena: often users post not to communicate substance, but to fit in. The result is a hysterical echo chamber of misinformation. (In fact, the author of the linked Foreign Policy article speculates that Twitter would be a very good medium for someone who wanted to intentionally incite fear in the populace.) <span class="misspell" suggestions="Valley wag,Valley-wag,Vallejo,Valenka,Villeinage">Valleywag</span> nicely <a title="summarizes this point" href="http://valleywag.gawker.com/5254702/why-googlefail-is-really-a-twitterfail" id="t93v">summarizes this point</a>: "What Twitter actually does is inflate problems out of all proportion, as <span class="misspell" suggestions="Totterers,Twittered,Twitters,Totterer's,Twittery">Twitterers</span> noisily tweet about how with it, on it, and over it they all are, repeating each other's messages without adding anything of value. Any [person looking to inform themselves] would go mad long before he extracted useful information." The desire of many Twitter users to be on the cutting edge of news also enhances their gullibility, and the lack of context inherent in 140 character posts makes it much easier to pull the wool over a reader's eyes. Twitter users fell for the <span class="misspell" suggestions="Fax,fax,aux,flux">faux</span> news items of <a title="Patrick Swaze's death" href="http://valleywag.gawker.com/5261286/todays-twitter-hysteria-says-patrick-swayze-has-died-he-didnt" id="nzyk">Patrick <span class="misspell" suggestions="Swazi's,Swazis,Saxe's,Swanee's,Sewage's">Swaze's</span> death</a> and nefarious items snuck into <a title="Obama's stimulus package" href="http://www.dailykos.com/story/2009/3/26/713407/-Twitter-+-StimulusConservative-Stupidity" id="sm0o"><span class="misspell" suggestions="IBM's,Obama,ABMs,Asama's,Baum's">Obama's</span> stimulus package</a>, to cite only two examples.<br /><br />The fact that entries on Twitter are limited to 140 characters apiece makes it difficult to convey much useful insight in one post. Many use Twitter for precisely that reason -- they have little or nothing to say. Glenn <span class="misspell" suggestions="Grunewald,Reinwald,Greenwood,Greenmailed,Greenfield">Greenwald</span> <a title="nails it" href="http://www.salon.com/opinion/greenwald/2009/03/22/various_matters/" id="iye0">nails it</a>: "About Twitter messages, John says 'they all read like cell phone text messages between 12 year <span class="misspell" suggestions="ODs,old,bolds,colds,folds">olds</span>,' and indeed, the only purpose I can discern is that it provides a format for expressing thoughts that are too inconsequential to merit a stand-alone article or post. For precisely that reason, it is unsurprising that Twitter has become <a target="_blank" href="http://www.washingtonpost.com/wp-dyn/content/article/2009/02/22/AR2009022201921.html">a huge hit among our media stars</a>, for whom triviality is a guiding principle." Appropriately, a vast cult of <a title="celebrity Twitter worship" href="http://www.victoriaadvocate.com/news/2009/apr/30/bc-cpt-celebtwittercc-_-entertainment/?entertainment" id="xf0v">celebrity Twitter worship</a> has emerged, with eager fans eating up every last tasteless morsel that is tossed to them by their gods. The fact that Twitter is often an outlet for the mundane is hammered home by spoof sites such as <a title="MyLifeIsAverage" href="http://www.techcrunch.com/2009/05/14/mylifeisaverage-the-service-twitter-was-meant-to-be/" id="jiqc"><span class="misspell" suggestions="">MyLifeIsAverage</span></a>.<br /><br />Quite possibly the most devastating critique of Twitter is not that it incites fear or inhabited by vapid users, but that there is simply nothing special about it -- that it is more of the same. Seth <span class="misspell" suggestions="">Finkelstein</span> <a title="maintains" href="http://sethf.com/infothought/blog/archives/001428.html" id="ky82">maintains</a> that Twitter is just another <a title="sucker's game that only serves the needs of a tiny elite" href="http://www.guardian.co.uk/technology/2009/may/07/twitter-is-a-suckers-game" id="j3dr">sucker's game that only serves the needs of a tiny elite</a>: 'After I saw Twitter in use, I realised the difference was that, while <span class="misspell" suggestions="RIC,IRV,IR,RC,ARC">IRC</span> had all participants equal, Twitter implements a distilled version of many problematic aspects of blogging. Namely, a one-to-many broadcasting system that serves the needs of high-attention individuals, combined with an appeal to low-attention individuals that the details of one's life matter to an audience... Twitter is low-level celebrity for the chattering class. And the pathologies of celebrity are all on display, including the exploitative industries that prey on the human desire to be heard and noticed. My answer to <span class="misspell" suggestions="Twitters,Twister's,Tweeter's,Titer's,Titters">Twitter's</span> slogan of "What are you doing?" is: 'Not playing a sucker's game.'" Twitter, in other words, is just another way for the powerful to broadcast their message and for advertisers to blast users with pitches for their newest products and <a title="peer into consumers' minds" href="http://www.nytimes.com/2009/04/14/technology/internet/14twitter.html?pagewanted=2&_r=1&partner=rss" id="h:mw">peer into consumers' minds</a>, all the while deluding the average user that it's an empowering service.<br /><br />Clearly, Twitter is many things to many people. Perhaps that's the only conclusion that one can draw from such a myriad of uses. Twitter is a communication medium and, like any other one, can be used and <a title="abused" href="http://www.theage.com.au/news/technology/security/report-warns-of-terrorist-twitter-dangers/2008/10/27/1224955904519.html" id="nb49">abused</a> for just about any purpose. Although Twitter encourages its own unique kind of communication from being a 140-character accepting social media service, many of these sites' quirks are simply a reflection of their users, and it's wrong to blame the tool for having too much influence in shaping what people do with it. As one <a title="responder to Greenwald put it" href="http://letters.salon.com/opinion/greenwald/2009/03/22/various_matters/permalink/f6db5aa3862e7c65f04ebadd4b204fc1.html" id="cj10">responder to <span class="misspell" suggestions="Grunewald,Reinwald,Greenwood,Greenmailed,Greenfield">Greenwald</span> put it</a>, "Criticizing the form [of Twitter] is like criticizing haiku as a form."<br /><br />UPDATE:<br /><ul><li>TechCrunch takes a <a href="http://www.techcrunch.com/2009/11/07/nsfw-after-fort-hood-another-example-of-how-citizen-journalists-cant-handle-the-truth/">pessimistic viewpoint</a>, in the context of the Fort Hood Massacre.</li><li>Valleywag <a href="http://valleywag.gawker.com/5404764/killing-them-softly-the--______-is-dead-twitter-meme">lays down the rules</a> for the manipulate-the-gullible-public-into-believing-someone-is-dead-when-they're-not game</li><li>Joel Spolsky also has some <a href="http://www.joelonsoftware.com/items/2010/03/14.html">unkind words</a> for Twitter</li><li><a href="http://sethf.com/infothought/blog/archives/001433.html">Study</a>: Men follow Men and Nobody Tweets<br /></li></ul>I finally caved. <a href="http://twitter.com/#%21/danny_colligan">danny_colligan</a> is my twitter handle.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-30833777580255197882009-05-17T15:10:00.000-07:002009-08-23T13:42:25.852-07:00.gdbinit filePersonal settings for gdb -- nothing too elaborate<br /><br /># color prompt<br />set prompt \001\033[1;36m\002(gdb) \001\033[0m\002<br /><br /># history across invocations<br />set history save on<br />set history filename ~/.gdb_historyUnknownnoreply@blogger.com1tag:blogger.com,1999:blog-30268243.post-47804348481700579162009-04-25T16:23:00.000-07:002009-04-25T16:33:42.010-07:00How NOT to recruit software engineersAfter going through Stanford's recruiting process for a summer internship for the first time (and having been contacted sporadically by headhunters for quite some time), I've been genuinely disappointed in a select few of my interactions with recruiters. A certain subset of recruiters commit some boneheaded errors that one might think would be precluded by an iota of common sense. These missteps waste my time and give the recruiters' respective companies a bad reputation with the students. Additionally, I have no reason to think my experience is unique amongst my fellow engineering student peers. Since my blog is actively read by thousands of recruiters worldwide (well, maybe not, but I'll pretend like it is anyway) I have resolved to better their recruiting process by providing them a few helpful tips on what NOT to do when trying to gather talent:<br /><br /><b>Schedule appointments unilaterally</b><br />Remember, the applicant's life already revolves around your company, so have no qualms about telling him when an interview will be. Never take his schedule or conflicts into account. Never ask if he can make an appointment, simply assume he can.<br /><b><br />Don't keep appointments</b><br /><span class="body">If you schedule an appointment with a recruit, make sure you do not show up. Optionally, show up at a different time and/or place. The same goes for phone calls: try calling at a different time than which you promised.</span><br /><br /><b>Don't follow up after interviews</b><br />Feel free to cut off contact with the recruit at any time, for any reason or without reason. Resist closure for the applicant. Never tell him if or why he was or was not accepted for the position.<br /><b><br />Strive for an inconsistent message</b><br />Make sure the recruit has multiple contacts at the company, and make sure each of them is sending him a different message. Give him the impression that working for your company will entail functioning within a hopelessly mismanaged bureaucracy.<br /><br /><b>Be annoying</b><br />Clog the recruit's inbox with as much irrelevant information as possible. Send multiple copies of the same email. Send the same message over several different mediums (phone, email, pager, carrier pigeon, etc.). Ensure that mandatory forms are filled out multiple times. Redouble your efforts after the recruit says he is not available or not interested.<br /><br /><b>Treat the applicant like a number, not a person</b><br />Make sure the recruit knows that he is just another anonymous cog in the corporate machine. Send out obviously templatized emails that start with things such as "Dear $applicantName." Never make exceptions for an individual's extenuating circumstances.<br /><br /><b>Never apologize</b><br />No matter how badly you screw up, never acknowledge that you did anything wrong. Refuse to apologise. Stand your ground, especially in the case of overwhelming evidence to the contrary.<br /><br />On a related note, if you are a recruiter/interviewer and wondering what you <i>should</i> be doing, please read the authoritative documents on <a title="recuiting" href="http://www.joelonsoftware.com/articles/FindingGreatDevelopers.html" id="nv.o">recruiting</a> and <a title="interviewing" href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html" id="u1rt">interviewing</a> from the <a title="Joel on Software blog" href="http://www.joelonsoftware.com/" id="l9nj">Joel on Software blog</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-55566476855189554432009-02-17T19:48:00.000-08:002009-02-17T19:49:51.397-08:00Dispelling Google Latitude Privacy HysteriaGoogle recently came out with a new service called <a title="Latitude" href="http://www.google.com/latitude/intro.html" id="b0cf">Latitude</a> which allows people to share their locations with each other via a Google Maps interface. [1] Almost immediately, talk about privacy concerns <a title="dominated the dialogue" href="http://tech.slashdot.org/article.pl?sid=09/02/07/0014204&tid=217" id="xy.z">dominated the dialogue</a> concerning Latitude. These fears, upon closer scrutiny, are largely baseless. Latitude does not present a significant danger to users' privacy; any suggestion otherwise is mere technophobia and headline-grabbing Google-bashing.<br /><br />The most important point in this entire conversation is that your cell phone is already a tracking device in and of itself. Carrying around a cell phone surreptitiously exposes more personal information than Latitude could ever dream of doing. The GPS, wireless Internet, and cell phone signals that emanate from your phone can be used to locate you any time your phone is on. The cell phone companies, obviously, know your location because they need it to deliver you service; the government can get it via <a title="Triggerfish" href="http://www.schneier.com/blog/archives/2008/11/government_can.html" id="ao68">Triggerfish</a> or by <a title="just asking" href="http://www.washingtonpost.com/wp-dyn/content/article/2007/11/22/AR2007112201444_pf.html" id="aq_-">just asking the phone companies</a>. But a phone can be used as more than just a locator -- it can also be used as an eavesdropper. Consider the well-known <a title="NSA surveillance program" href="http://en.wikipedia.org/wiki/NSA_warrantless_surveillance_controversy" id="tb1i">NSA surveillance program</a> that slurps up cell phone conversations, or the ability of the government to listen to whatever noise a cell phone picks up <a title="even when it is powered off" href="http://arstechnica.com/tech-policy/news/2006/12/8343.ars" id="h75j">even when it is powered off</a>. If you are seriously worried about your privacy, you won't even be carrying around a phone in the first place.<br /><br />Google Latitude can not honestly be called a privacy threat because it is opt-in at every level and gives one the opportunity to leave or disable the service at any time. For another person to have access to your location, you must 1) explicitly enable Latitude 2) request the other person to receive your location via Latitude or accept a similar request from him 3) not turn the service off. Disabling the service can come in the form of either opting out of Latitude entirely or hiding your location temporarily. You can even enable a 'city-level-only' location option, which only shares your location to the town level of granularity, or set a manuallocation that doesn't move. (Your mobile location can be exactly determined only if you install Latitude on your mobile phone as opposed to using the stationary option.) Again, no one besides the group of people you explicitly agree to share your location with can see your location. <br /><br />The <a title="example scenarios" href="http://www.privacyinternational.org/article.shtml?cmd%5B347%5D=x-347-563567" id="s0-o">example scenarios</a> that have been raised by <a title="Privacy International" href="http://www.privacyinternational.org/" id="kxw4">Privacy International</a> with regard to Latitude's purported privacy degradation that have captured headlines are pretty far-fetched. All of the scenarios involve a malicious user creating a Google account, enabling Latitude on a phone and giving the phone to someone else with the intention of tracking them (without, of course, informing them that Latitude is enabled on the phone). Any reasonably competent person would quickly discover that Latitude was enabled on the phone, if he had not inspected the phone in the first place when he initially received it. There are many other major invasions of privacy taking place elsewhere, and Privacy International would do well to raise a stink about those issues rather than chase windmills at the Googleplex.<br /><br />There is a legitimate privacy concern that Google will store the history of a user's location, which could be used to construct a profile of where a user was at certain points in time. However, Google states in the <a title="Latitude FAQ" href="http://www.google.com/support/mobile/bin/topic.py?topic=19501" id="eo_9">Latitude FAQ</a> that this is not the case: "Google Latitude only reports your last updated location and does not keep a history of previously reported locations." As long as Google keeps its word in this regard, and I believe that to be a reasonably safe assumption, there is no privacy danger here.<br /><br />It is unfortunate that so much ado has been made about a service that is essentially a useful visualization of your friend group. [2] Google Latitude is a service that you should have no qualms about using, provided that carrying around a cell phone does not make you queasy.<br /><br />============================<br /><span style="font-weight: bold;">Footnotes:</span><br />[1] As several other commentators on Slashdot pointed out, Google is not the first company to offer this kind of service (<a title="Brightkite" href="http://brightkite.com/" id="yi.3">Brightkite</a>, <a title="Loopt" href="http://www.loopt.com/" id="f2-d">Loopt</a>, and <a title="Mologogo" href="http://www.mologogo.com/" id="tg91">Mologogo</a> to name just a few).<br /><br />[2] One could imagine other use cases: giving truckers cell phones to track their shipments, planning visits to friends based on their proximity to a certain destination, serendipitousmeetup opportunities with nearby friends, etc.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-30268243.post-11453694310864280172008-12-14T13:01:00.000-08:002008-12-14T13:53:12.313-08:00iPhone App Pyramid Scheme PlanWhere is the next fertile soil for a <a href="http://en.wikipedia.org/wiki/Pyramid_scheme">pyramid scheme</a>? Why, the <a href="http://www.apple.com/iphone/appstore/">iPhone Application store</a>, of course! Following these few easy directions, you can scam millions of yuppies for fun and profit.<br /><br /><span style="font-weight: bold;">How</span>: First, create an iPhone Application with some kind of cheesy social-networking appeal (e.g. 'How many friends do you REALLY have?'). It doesn't really matter what the functionality of the app is as long as each install of the app is assigned a unique identifier. The buyer will enter the id of the person who referred them to the app. In this way, an n-ary tree can be constructed (with you at the root) of subsequent referrals and installs of the app. Motivate the spread of the app by promising some amount of money to a user every time someone else buys the app and enters the his or her 'promo code.' Price the app such that you net the difference of the cost of the app and the amount you are paying out on each install.<br /><br /><span style="font-weight: bold;">Why it will work</span>: People who purchase iPhones have a <a href="http://www.iphonealley.com/news/app-store-statistics-show-steady-growth-despite-bad-times">proven record</a> of buying a lot of iPhone applications with their disposable income. It is perfectly reasonable to believe that many of them would not mind spending a few bucks more to purchase another novelty application (indeed, some have proven that they will <a href="http://www.foxnews.com/story/0,2933,399461,00.html">spend a great deal</a> for a novelty application / status symbol). Second, sites like Facebook have proven users' insatialbe thirst for social applications that connect them to their friends/coworkers/strangers/etc. Many of <a href="http://www.facebook.com/apps/">these applications</a> exploit some kind of emotional dynamic (for instance, who are your '<a href="http://www.facebook.com/apps/application.php?id=2425101550&b=&ref=pd_r">Top Friends</a>'?) to appeal to users. The sucess of these applications leaves no doubt that other appeals of the same kind would find an audience. Third, the iPhone App store provides a quick and easy means of distribution and, presumably, payment. Finally, every pyramid scheme exploits people's motivation for profit, a powerful motive indeed.<br /><br /><span style="font-weight: bold;">Variables</span>: The setting of a reasonable price and payout is critical. Ask too much and nobody will buy the app; ask too little and you won't make much money. Promise too much as a payout and you won't make much money, promise too little and the app will not virally spread. Another important decision is the appeal of the application -- how are you going to convince uses to buy the application in the first place? What is the most compelling social/emotional/psychological/whatever message that you can send to them that makes them want to buy? Going hand in hand with that, what does the application actually do? Does it simply redirect to a web page showing some statistics of who has recruited the most people to the scheme, or does it have something more sophisticated?<br /><br /><span style="font-weight: bold;">Unknowns</span>: Apps need to be approved by Apple and can be yanked by Apple at any time, with or without explanation. The app needs to be written in such a way that it does not appear to be something that Apple would find questionable. The <a href="http://www.ftc.gov/speeches/other/dvimf16.shtm">legality</a> of these practices is another issue. Depending on what the function of the application is, you might be able to make a case that you are actually delivering a product to the user. Another unknown is the most effective way to move many small payments of money between people, and what kind of cost is incurred for those services.Unknownnoreply@blogger.com0