tag:blogger.com,1999:blog-74297633318467557692024-03-04T22:19:00.316-07:00Running Code WinsJason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.comBlogger15125tag:blogger.com,1999:blog-7429763331846755769.post-55676026649315662812013-12-24T01:37:00.002-07:002013-12-24T01:37:26.259-07:00The blogosphere was better than the current WebContent was freer and better. The only virality we had to worry about was Seth Godin, but his hucksterism was transparent enough.<br />
<br />
We need a return to independent platforms, with features designed, prototyped, developed, and spread by authors and editors, rather than by CEOs and marketers.<br />
<br />
Social Media is liberating, and has led to a magnificent proliferation of voices. But we're seeing a new age, as the major corporations behind the sites we've grown dependent on go public, and shareholders' needs begin to dominate those of authors and readers.<br />
<br />
Publishing on the Internet is still far from settled. We can still create the IndieWeb we all deserve.<br />
<br />
Who's disrupting the disrupters?Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-14598032088465416282013-12-02T02:04:00.002-07:002013-12-02T02:04:34.715-07:00More reading notesEvening of 2013.12.01. I'm thinking I should probably start a separate section of my site for these sorts of explorations. In honor of Vannevar Bush, perhaps I'll call it memex. <br />
<h3>
"The three faces of City 2.0"</h3>
by unattributed / Paris Tech Review 2012.05.09<br /><a href="http://translate.google.com/translate?hl=en&sl=fr&tl=en&u=http%3A%2F%2Fwww.paristechreview.com%2F2012%2F05%2F09%2Ftrois-visages-ville%2F&sandbox=1">http://translate.google.com/translate?hl=en&sl=fr&tl=en&u=http%3A%2F%2Fwww.paristechreview.com%2F2012%2F05%2F09%2Ftrois-visages-ville%2F&sandbox=1</a><br /><br />"New experiences like Songo also raise the question of individual freedom. In a city where everything is connected, the idea of privacy is not it default setting?"<br /><br />With existing infrastructure like 4G phones, cctvs, pervasive netowrks, sensors, etc, "the city is, in fact, already digital"<br /><br />"More than the threat of a widespread surveillance, then it is the collaborative practices that define the digital city."<br /><br />Rise of 'web 2.0' as a term: "Without major technical changes without central decision, a set of new tools (blogs, RSS son), new platforms (social networks, video sharing sites), new practices, both among providers and users, have transformed the place that the web plays in the lives of millions of people."<br /><br />"The people become "co-designers"." end the central monopoly on urban design and planning, involve more citizens in shaping their city. the technology enables, but is not primary.<br /><br />"The development of ICT, far from the city dissolve or free ourselves from the physical constraints on the contrary has reinforced the need to be in space." technology has made location and physical place more important (within the city)<br /><br />Access and representation: "the data collected through the sensors will inevitably biased, and at the same time it is difficult to imagine that local governments do not use it to build their policies. The risk therefore exists only refer to a citizen idealized - a virtual citizen, in both senses of the word." - Jacques Levy<br /><br /><br /><br />
<h3>
Against the Smart City</h3>
by Adam Greenfield<br /><a href="http://urbanomnibus.net/2013/10/against-the-smart-city/">http://urbanomnibus.net/2013/10/against-the-smart-city/</a><br /><br />Deconstruct big vendors' ideal: “Several decades from now cities will have countless autonomous, intelligently functioning IT systems that will have perfect knowledge of users’ habits and energy consumption, and provide optimum service…The goal of such a city is to optimally regulate and control resources by means of autonomous IT systems.”<br /><br />omniscience, infallability<br /><br />me: a quest for the technical perfection of public policy. requires perfect translation and implementation of these systems, in light of heclo's "iron triangle." in my metaphysics, perfect translation is unattainable. system would further be subject to imperfections magnified by absolutism pointed out in lessig's "code"<br /><br />"We act in historical space and time, as do the technological systems we devise and enlist as our surrogates and extensions. " - how Latourian!<br /><br />Argument: perfect knowledge is impossible<br />- heisenberg, can't observe perfectly<br />- only capture things amenable to quantification<br />- actors may change their behavior to distory recorded data<br />- humans in the system will misuse the data if possible<br /><br />"The Siemens scenario amounts to a bizarre compound assertion that each of our acts has a single salient meaning,"<br />me: i'm not sure i agree with this claim<br />" which is always and invariably straightforwardly self-evident — in fact, so much so that this meaning can be recognized, made sense of and acted upon remotely, by a machinic system, without any possibility of mistaken appraisal."<br /><br />"“the data is the data”: transcendent, limpid and uncompromised by human frailty. This mystification of “the data” goes ... unchallenged"<br /><br />"Perceptions of risk in a neighborhood can be transformed by altering the taxonomy used to classify reported crimes ever so slightly." http://urbanomnibus.net/2013/10/against-the-smart-city/foryoutou.se/oaklandcrime<br /><br />Making data "neutrality and dispassionate scientific objectivity." is a particular political expression (me: and a cheap rhetorical trick meant to silence criticism)<br /><br />"would seem to repose an undue amount of trust in the party responsible for authoring the algorithm." - me: need for visibility and insight into the system making the decision as systems move from decision support to decision making (ie completely autonomous systems)<br /><br />"the element of the arbitrary we see here should give us pause"<br />"the authorship of an algorithm intended to guide the distribution of civic resources is itself an inherently political act."<br /><br />"some easily-measured value used as a proxy for a reality that is harder to quantify, and again we see the distortion of ostensibly neutral results by the choices made by an algorithm’s designers"<br />me: operationalization and methodology are risky, hard to get right even under favorable non-adversarial circumstances, and both are subject to deliberate manipulation<br /><br />Greenfield picks up on the word 'goal':<br />"What is being suggested here strikes me as a rather profound misunderstanding of what a city is. Hierarchical organizations can be said to have goals, certainly, but not anything as heterogeneous in composition as a city, and most especially not a city in anything resembling a democratic society."<br /><br />(me: I read Siemens' phrasing here as 'goal of implementing this city design is to have a city capable of the following' - that is, the goal is adopted at a point in time by a group of actors (a city council?), similar to adopting a master plan. i don't read it as meaning a permanently chartered goal, which would seem to go against the democratic spirit Greenfield appeals to)<br />Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com1tag:blogger.com,1999:blog-7429763331846755769.post-35641833052804557992013-11-30T02:27:00.001-07:002013-11-30T02:43:21.402-07:00readings in tech and urban design<div id="the-data-city">
as surfed the evening of 2013-11-29 </div>
<h2 id="the-data-city">
the data city</h2>
by jack self, 2009.10.04<br />
<a href="http://millenniumppl.blogspot.com/2009/10/data-city-jules-verne.html">http://millenniumppl.blogspot.com/2009/10/data-city-jules-verne.html</a><br />
a critique of <a href="http://www.thingsmagazine.net/2009/10/on-battlesuits-collage-city-seeking-and.htm">http://www.thingsmagazine.net/2009/10/on-battlesuits-collage-city-seeking-and.htm</a><br />
<br />
linked to... <br />
<h2 id="on-battlesuits-the-collage-city-seeking-and-remembering">
On battlesuits, the collage city, seeking and remembering</h2>
unattributed via things magazine, 2009.10.01<br />
<a href="http://www.thingsmagazine.net/2009/10/on-battlesuits-collage-city-seeking-and.htm">http://www.thingsmagazine.net/2009/10/on-battlesuits-collage-city-seeking-and.htm</a><br />
Makes the claim "The modern city is the data city." <br />
"The data city of the future will be unnavigable without technology, granted..."<br />
Speculates about role of changing patterns of information consumption & memory<br />
<br />
linked to... <br />
<h2 id="the-city-is-a-battlesuit-for-surviving-the-future">
the city is a battlesuit for surviving the future</h2>
by matt jones, 2009.09.20<br />
<a href="http://io9.com/5362912/the-city-is-a-battlesuit-for-surviving-the-future">http://io9.com/5362912/the-city-is-a-battlesuit-for-surviving-the-future</a><br />
Archigram, a 1960s "protoblog" architectural collective actant<br />
"cities as systems, reflecting the contemporary vogue for cybernetics and belief in automation."<br />
"people are walking architecture"<br />
Adam Greenfield, Nokia design director: "a searchable, query-able city" - a read/write city<br />
"Behaviour and information as the raw material to design cities with as much as steel, glass and concrete."<br />
"chaotic sprawls of the industrialising world such as the "maximum cities" of Mumbai or Guangzhou. Here the infrastructures are layered, ad-hoc, adaptive and personal"<br />
"Cities are entities that network outside of nations as their wealth often exceeds that of the rest of the nation put together - it's natural they solve transnational, global problems."<br />
<br />
linked to... <br />
<h2 id="the-street-as-platform">
the street as platform</h2>
by dan hill, 2008.02.11<br />
<a href="http://www.cityofsound.com/blog/2008/02/the-street-as-p.html">http://www.cityofsound.com/blog/2008/02/the-street-as-p.html</a><br />
"The way the street feels may soon be defined by what cannot be seen with the naked eye."<br />
"Each element of data causes waves of responses in other connected databases, sometimes interacting with each other physically through proximity, other times through semantic connections across complex databases, sometimes in real-time, sometimes causing ripples months later. Some data is proprietary, enclosed and privately managed, some is open, collaborative and public."<br />
Quoth Archigram: '“When it’s raining on Oxford Street, the buildings are no more important than the rain”'<br />
Data ephemeral like the weather (like Archigram's rain)<br />
"So the more relevant question is how do the buildings and the rain of data interrelate?"<br />
"Considering the non-visual senses might be a better analogy when it comes to perceiving the way data affects i.e. looking at the way the street sounds, feels or smells."<br />
"Holes in data, public and private, may become more relevant than the pothole in the pavement - until you trip over it, at least."<br />
re availablility of services, "a sense of fragility in the network, perceived but not comprehended by users"<br />
Two possible future streets: "Locked down street", "Open source street"<br />
Generativity: " Proprietary systems, while ideally suited to high-security purposefully-closed networks, are intrinsically unlikely to enable a form of creative aggregation and connection unintended by the owners and makers."<br />
Localization of data:<br />
"Intrinsic local detail will tend to require collaborative updates from local users themselves."<br />
"An open approach to descriptive data can enable a far richer local dataset to emerge, more accurately conveying the sense of what the street is. It may also be patchy, however."<br />
Commercial efforts are likely to be poorly adapted for local needs.<br />
"This commercial development is a given, and often not related to those whose job it is to shape streets."<br />
"The various information modelling systems - the building information modelling system; those conveying the state of local services; those broadcasting the presence of a bus - could be built with openness in mind. Why do this? In order to enable maximum coverage and to stimulate engagement and innovation, with occasional possibility for unintended creative use. And often, it's public data and therefore part of a civic relationship."<br />
"Just as good street planning might leave a space open to possibility, and not over-prescribe its program, so informational systems can leave themselves open to possibility."<br />
Re open analytics:<br />
"The patterns of use in their data become as self-evident as that shortcut worn through the grass in front of the library."<br />
"actually showing the seams of an object is far more likely to engender trust, engagement and appropriation."<br />
<br />
=== thoughts:<br />
we are architects, historians, geographers. sociographers, demographers, planners. social workers, teachers, counselors.<br />
"As Reyner Banham said, when you’re running with technology, you’re in fast company - and you may have “discard the professional garments by which you are recognised”."<br />
<br />
=== further reading list:<br />
<br />
Adam Greenfield, Everywhere - on ubiquitous computing<br />
<br />
Transmetropolitan - graphic novel, prototypal dystopian megacity futureJason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-72553614645473563872013-07-11T01:19:00.002-06:002013-07-11T01:19:26.572-06:00I want to help build products which maximize freedom, agency, enlightenment, and well-being. Top-down approaches fail because the universe is made of atoms. Products which pander to passé procurement models are willfully negligent and ought to constitute developer malpractice.Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-84482158382465752932013-04-02T10:49:00.001-06:002013-04-02T10:51:28.821-06:00Thinking in PromisesThis morning I had an epiphany: of course some people find promises to be "easy" and "intuitive" at the same time while others find them "hard" and "unwieldy":<br />
<br />
<strong>Programming in promises requires thinking about type signatures.</strong><br />
<br />
Depending on your perspective, this is either a great thing or The Worst Thing Ever<sup>TM</sup><br />
<br />
People who have programmed in statically typed languages before are used to thinking about parameter types and return value types. For these people, it is easier to reason about a function from a URL to a Response object in terms of <code>(URL) => Response</code> rather than <code>(URL, (Error, Response) => void) => void</code> (using <a href="https://github.com/jden/jsig">jsig notation</a>). The former clearly expresses the expected input and output of the function, while the later only has input which is presumably being evaluated for its side effects.<br />
<br />
People who are used to programming in dynamic languages primarily aren't used to having to think in terms of types and signatures, so this additional overhead contributes to their perception of promises as being too hard, too mysterious, or too much to think about. Programmers used to thinking about types are <em>already</em> thinking about this, so this mental overhead is negligible, and the abstraction of promises makes code easier to reason about simply because it let's them reuse the abstractions, patterns, and mental models they're already used to.<br />
<br />
My relativistic assertion is that neither approach is correct, just as neither The British <code>colour</code> nor the American <code>color</code> is correct. This assertion is not without controversy, but neither are Promises. I appreciate the clarity that having type signatures gives me in communicating about code to fellow programmers (including my future self).<br />
<br />
Finally, I want to clear the air. There is an unfortunate amount of FUD on the side of some promise proponents, whom I've heard say things like "callbacks aren't composable". It is possible to do metaprogramming on callbacks, including things like control flow manipulation (parallelization), map/reduce, decorator pipelining, etc. It's just that this needs to be done either in an <em>ad hoc</em> way or using some purpose-built library like <a href="https://npm.im/async">async</a> (or any one of the dozens of other control flow libraries in npm). These are not always clear to reason about. I won't make any claims as to which is easier, but with promises, since they're just values, one can use the same value programming techniques like map and reduce that is typical in synchronous code.Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com1tag:blogger.com,1999:blog-7429763331846755769.post-91898388683699718512013-02-24T22:38:00.001-07:002013-02-24T22:54:45.000-07:00building F# compiler on Mac OS X 10.8 Mountain LionF# is a lovely mixed paradigm functional language targeting the Common Language Runtime, which works great cross-platform on Mono.<br />
<br />
I had some trouble getting it installed on my machine, so this documents the exact steps I followed at the end of February, 2013, to get everything up and running. Initially I was following <a href="http://7sharpnine.com/posts/Fsharp-3-in-the-Mac-and-Mono-World/">F# 3.0 in the Mac and Mono World</a>. Dave's blog has a bunch of other great content which I recommend you check out.<br />
<br />
<br />
- Download and run the installer for mono 3.x: http://www.go-mono.com/mono-downloads/download.html<br />
<br />
In the console:<br />
<pre><code>
# Check installed mono version:
$ mono -V
# I get 3.0.4.
# add mono to pkgconfig path
# in your .bash_profile:
export PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/Lib/pkgconfig/
# Git clone fsharpc:
$ git clone git://github.com/fsharp/fsharp.git
# Make sure brew packages are installed and up to date:
$ brew update
$ brew install pkg-config
$ brew install autoconf
# cd to fsharpc directory and comment out mono version check in ./configure:
$ cd ~/dev/fsharpc
# For me, lines 1764 - 1766
# #if ! pkg-config --atleast-version=$MONO_REQUIRED_VERSION mono; then
# # as_fn_error $? "\"You need mono $MONO_REQUIRED_VERSION\"" "$LINENO" 5
# #fi
# Run config script with correct paths:
$ ./autogen.sh --prefix=/Library/Frameworks/Mono.framework/Versions/Current/ --with-gacdir=/Library/Frameworks/Mono.framework/Versions/Current/lib/mono/gac
$ make
$ sudo make install
# verify the install:
$ fsharpc
F# Compiler for F# 3.0 (Open Source Edition)
Freely distributed under the Apache 2.0 Open Source License
error FS0207: No inputs specified
</code></pre><br />
Now you're ready to go.Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-87384496588197733562013-01-13T12:41:00.002-07:002013-01-13T12:41:48.753-07:00call to network citizenship<p>Aaron wasn't a victim of a cruel Department of Justice, unless we all are. His death is tragic, and this country (both our culture and our society) is terrible at dealing with mental illness. And the grossly disproportionate charges sought by his prosecution, and the prospect of facing more than 30 years in prison for his alleged and victimless crime no doubt caused great stress for a sensitive, idealistic, brilliant 26-year-old.</p><p>But we should remember his work, and his message of openness, and take from it a renewed urgency to educate ourselves as citizens of a networked space.</p><p>He was an activist, fighting at the vanguard of liberalism and freedom in our bold new networked age. He understood what was at stake in an interconnected world, how easy it is for individuals to be subsumed and left powerless by faceless, distributed, protocol-based power structures.</p><p>As network citizens, we must treat ignorance and willful idiocy of networked power structures as no more acceptable than not knowing that there are 50 states, or that the Constitution was not signed in 1776, or that there are three branches of the American federal system.</p><p>The network is the dominant power structure of our lifetimes, and it is incumbent upon us to be conversant in this new territory, to understand the stakes, the parties involved, the competing powered and monied interests, and to recognize that we still have legitimate popular sovereignty over these several corporate and special interests. Citizenship is a duty for any individual caught living in an advanced society. Be a citizen.</p><p>Requiescat in pace, Aaron Swartz.</p><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://www.flickr.com/photos/jewschool/6722393349/in/set-72157628931600397/" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgita8KhXv2Fgm_vNnVn58nAfb7kxCOsym5SKvTDe4UklbgFl710UFUHngZXFiV-wrmMutDC6px_1yBRz6YPktYeLE0uCEUjdcB6SKxNH2sSOJFAz7QN8m6bmjRBgccto3Pfew0fsCCRWye/s320/6722393349_aa757ae441.jpg" width="320" /></a></div>Aaron Swartz speaking at a PIPA/SOPA opposition rally in New York. <br/>(Photo (c) <a href="http://www.flickr.com/photos/jewschool/">selfagency</a> under a <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons BY-SA 2.0 license</a>)<br />
<br />
I reproduce here Aaron's Guerrilla Open Access Manifesto:<br />
<blockquote><p>Information is power. But like all power, there are those who want to keep it for themselves. The world’s entire scientific and cultural heritage, published over centuries in books and journals, is increasingly being digitized and locked up by a handful of private corporations. Want to read the papers featuring the most famous results of the sciences? You’ll need to send enormous amounts to publishers like Reed Elsevier.<br />
</p><p>There are those struggling to change this. The Open Access Movement has fought valiantly to ensure that scientists do not sign their copyrights away but instead ensure their work is published on the Internet, under terms that allow anyone to access it. But even under the best scenarios, their work will only apply to things published in the future. Everything up until now will have been lost.<br />
</p><p>That is too high a price to pay. Forcing academics to pay money to read the work of their colleagues? Scanning entire libraries but only allowing the folks at Google to read them? Providing scientific articles to those at elite universities in the First World, but not to children in the Global South? It’s outrageous and unacceptable.<br />
“I agree,” many say, “but what can we do? The companies hold the copyrights, they make enormous amounts of money by charging for access, and it’s perfectly legal — there’s nothing we can do to stop them.” But there is something we can, something that’s already being done: we can fight back.<br />
</p><p>Those with access to these resources — students, librarians, scientists — you have been given a privilege. You get to feed at this banquet of knowledge while the rest of the world is locked out. But you need not — indeed, morally, you cannot — keep this privilege for yourselves. You have a duty to share it with the world. And you have: trading passwords with colleagues, filling download requests for friends.<br />
Meanwhile, those who have been locked out are not standing idly by. You have been sneaking through holes and climbing over fences, liberating the information locked up by the publishers and sharing them with your friends.<br />
</p><p>But all of this action goes on in the dark, hidden underground. It’s called stealing or piracy, as if sharing a wealth of knowledge were the moral equivalent of plundering a ship and murdering its crew. But sharing isn’t immoral — it’s a moral imperative. Only those blinded by greed would refuse to let a friend make a copy.<br />
Large corporations, of course, are blinded by greed. The laws under which they operate require it — their shareholders would revolt at anything less. And the politicians they have bought off back them, passing laws giving them the exclusive power to decide who can make copies.<br />
</p><p>There is no justice in following unjust laws. It’s time to come into the light and, in the grand tradition of civil disobedience, declare our opposition to this private theft of public culture.<br />
</p><p>We need to take information, wherever it is stored, make our copies and share them with the world. We need to take stuff that's out of copyright and add it to the archive. We need to buy secret databases and put them on the Web. We need to download scientific journals and upload them to file sharing networks. We need to fight for Guerilla Open Access.<br />
</p><p>With enough of us, around the world, we’ll not just send a strong message opposing the privatization of knowledge — we’ll make it a thing of the past. Will you join us?<br />
<br/>Aaron Swartz<br />
<br/><br />
July 2008, Eremo, Italy</p></blockquote>Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-54128417608193280882012-11-04T15:19:00.000-07:002012-11-04T15:19:35.089-07:00Allow me to recapitulate a few of the things I believe and care about- om. connectedness<br />
- the great opposition to entropy<br />
- work on stuff that matters<br />
- symphony<br />
- excelsior<br />
- be humble yet ambitious<br />
- no ownership, no secrets<br />
- start often<br />
- when in doubt, work harder<br />
- keep moving, moving is living<br />
- you know less the more you go on<br />
- explore<br />
- honor awe<br />
- keep a healthy disregard for the impossible<br />
- be intentional<br />
- play. play nice.<br />
- waste time, money & resources<br />
- break laws, policies, norms and taboos<br />
- hack the world around you<br />
- hack everything. be constructive.<br />
- consume less, create more<br />
- test limits<br />
- challenge metaphors<br />
- build models<br />
- improvise<br />
- travel light<br />
- embrace ambiguity<br />
- avoid pretension<br />
- be better<br />
- be stylish<br />
- be selective & critical<br />
- make truth & beauty<br />
- leave a paper trail<br />
- challenge perspectives<br />
- be incorrigible<br />
- be called a damn fool<br />
- be arbitrary and capricious<br />
- experiment more<br />
- mad science, mad hacking, mad making.<br />
- drink, eat, smoke to excess<br />
- throw stones at cathedrals<br />
- help people in need<br />
- travel abroad. travel off planet.<br />
- document everything<br />
- embellish liberally<br />
- win by your own rulesJason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-52374457286921133222012-10-23T18:52:00.003-06:002012-10-23T18:52:41.256-06:00Thoughts on JavaScript from 38,000 feet.<br />
<!DOCTYPE html><html><head><meta charset="UTF-8"><style>html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
body{
color:#444;
font-family:Georgia, Palatino, 'Palatino Linotype', Times,
'Times New Roman', serif,
"Hiragino Sans GB", "STXihei", "微软雅黑";
font-size:12px;
line-height:1.5em;
background:#fefefe;
width: 45em;
margin: 10px auto;
padding: 1em;
outline: 1300px solid #FAFAFA;
}
a{ color: #0645ad; text-decoration:none;}
a:visited{ color: #0b0080; }
a:hover{ color: #06e; }
a:active{ color:#faa700; }
a:focus{ outline: thin dotted; }
a:hover, a:active{ outline: 0; }
span.backtick {
border:1px solid #EAEAEA;
border-radius:3px;
background:#F8F8F8;
padding:0 3px 0 3px;
}
::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
::selection{background:rgba(255,255,0,0.3);color:#000}
a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
a::selection{background:rgba(255,255,0,0.3);color:#0645ad}
p{
margin:1em 0;
}
img{
max-width:100%;
}
h1,h2,h3,h4,h5,h6{
font-weight:normal;
color:#111;
line-height:1em;
}
h4,h5,h6{ font-weight: bold; }
h1{ font-size:2.5em; }
h2{ font-size:2em; border-bottom:1px solid silver; padding-bottom: 5px; }
h3{ font-size:1.5em; }
h4{ font-size:1.2em; }
h5{ font-size:1em; }
h6{ font-size:0.9em; }
blockquote{
color:#666666;
margin:0;
padding-left: 3em;
border-left: 0.5em #EEE solid;
}
hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }
pre , code, kbd, samp {
color: #000;
font-family: monospace;
font-size: 0.88em;
border-radius:3px;
background-color: #F8F8F8;
border: 1px solid #CCC;
}
pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 5px;}
pre code { border: 0px !important; }
code { padding: 0 3px 0 3px; }
b, strong { font-weight: bold; }
dfn { font-style: italic; }
ins { background: #ff9; color: #000; text-decoration: none; }
mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }
ul, ol { margin: 1em 0; padding: 0 0 0 2em; }
li p:last-child { margin:0 }
dd { margin: 0 0 0 2em; }
img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
table { border-collapse: collapse; border-spacing: 0; }
td { vertical-align: top; }
@media only screen and (min-width: 480px) {
body{font-size:14px;}
}
@media only screen and (min-width: 768px) {
body{font-size:16px;}
}
@media print {
* { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
body{font-size:12pt; max-width:100%;}
a, a:visited { text-decoration: underline; }
hr { height: 1px; border:0; border-bottom:1px solid black; }
a[href]:after { content: " (" attr(href) ")"; }
abbr[title]:after { content: " (" attr(title) ")"; }
.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
@page :left { margin: 15mm 20mm 15mm 10mm; }
@page :right { margin: 15mm 10mm 15mm 20mm; }
p, h2, h3 { orphans: 3; widows: 3; }
h2, h3 { page-break-after: avoid; }
}</style></head><body><br />
<br />
<p><em>Note: what follows is some stream-of-consciousness writing from the plane on my way back from EmpireJS in New York this past Monday. It's a reflection of some of my current thoughts on JavaScript as a platform.</em></p><br />
<p>Let's say I wanted to build a robot to do something really awesome, like make toast or drive in space or fly a rocket crane or something. And I wanted to be able to do that in an expressive, high-level language.<br />
Here's the thing. JavaScript won on the web, because it is everywhere. But with new platforms, do we want to be doing it in JavaScript just because it's familiar?</p><br />
<p>What, actually, are the good parts about JavaScript? Not just Crockford's favorite language features - I mean in terms of the ecosystem.</p><br />
<p>Npm is obviously a good part. We've done a great job of finding a good level of granularity to promote incredibly productive code reuse, and at the same time built a community to build thousands of these modules. This is good, and we should keep it. Now, bear with me:</p><br />
<p>I like programming because, as Fred Brooks so brilliantly put it, it makes me feel like a wizard. You sit at a terminal, type a few arcane and idiosyncratic incantations, and suddenly this machine does things. That's cool. But I want to be able to build things faster. Here's the thing - and I know I'm something of an anomoly here - I don't actually like programming. I like making things. I like being able to see the result, sharing things with people, and doing zany or useful or silly or amazing or trivial things. But i dont like typing things. One of the things I love about code is the ability to change things.</p><br />
<p>I have very little tolerance for idle bitching. Unfortunately, I also tend to complain a lot. Maybe not complain, but criticize, in the sense of identifying things that could (and should) be better. I'm not always a very happy person, because I see so much badnesss around me. But then I give myself the power to change some of it.</p><br />
<p>In his talk at EmpireJS, @domenic characterized a lot of what we as JavaScript developers do as Stockholm syndrome - we repeat things to ourselves to convince ourselves that we like and enjoy some of the dumb things in JavaScript which no person in their right mind would actually enjoy. Life is too short, the list of problems to be solved too long.</p><br />
<p>I submit we should be embracing this prolific explosion of compile-to-JavaScript languages. People are making things which solve their on problems. You dont have to use it. Write in whatever you like. But dont feel obligated to write in things you don't like. Don't tolerate badness. Do you like coffeescript? Maybe, maybe not. Now, do you use modules written in coffeescript in your projects? If not, why not? It better not be for some silly reason. Here's the thing - it shouldn't matter what language the code is written in. JavaScript is our vm. Whatever tools we use to arrive at that JavaScript should be wholly immaterial. We need to stop caring so much about imolementations, and start caring more about interfaces.</p><br />
<p>I heard a crazy and seditious idea last night - to start publishing tons of C modules to npm. At first that sounded crazy: native modules are evil, etc, etc. But why not? There's an argument to be made that having a common implementation language is better for encouraging community contributions. But most modules, I would contend, are written in whole or in large part by a single author. We shouldd acknowledge and embrace this, and realize that the really interesting things we should care about are tiny piece of functionality - especially domain-specific things. We don't need another damn templating language - we need fun things like math and science modules. It shouldn't matter if someone wants to write in R or Fortran. The biggest platform advantage we can have is fostering the incredible environment of code reuse and productivity, built on top of the right abstractions and interoperability.</p><br />
<p>Rather than promoting some perverse and conformist orthodoxy, I want to be a crowded bazaar at the intersection of exotic trade routes going to every far flung corner of the internet. I want to encourage mad hacking for its own sake - just to see what we can make. I want us to adopt creative and generative constraints, and discard traditional ones. Color outside the lines. Mostly, I want to look out at the world around me and see everything as mutable, as hackable, and continuously improveable. I want to be able to see the world like Neo from the Matrix - and I want to help others see the world this way, too.</p></body>Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-66052625365395449182012-07-04T15:56:00.004-06:002012-07-04T15:56:51.108-06:00Work on stuff that matters<style>html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
body{
color:#444;
font-family:Georgia, Palatino, 'Palatino Linotype', Times,
'Times New Roman', serif,
"Hiragino Sans GB", "STXihei", "微软雅黑";
font-size:12px;
line-height:1.5em;
background:#fefefe;
width: 45em;
margin: 10px auto;
padding: 1em;
outline: 1300px solid #FAFAFA;
}
a{ color: #0645ad; text-decoration:none;}
a:visited{ color: #0b0080; }
a:hover{ color: #06e; }
a:active{ color:#faa700; }
a:focus{ outline: thin dotted; }
a:hover, a:active{ outline: 0; }
span.backtick {
border:1px solid #EAEAEA;
border-radius:3px;
background:#F8F8F8;
padding:0px 3px 0px 3px;
}
::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
::selection{background:rgba(255,255,0,0.3);color:#000}
a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
a::selection{background:rgba(255,255,0,0.3);color:#0645ad}
p{
margin:1em 0;
}
img{
max-width:100%;
}
h1,h2,h3,h4,h5,h6{
font-weight:normal;
color:#111;
line-height:1em;
}
h4,h5,h6{ font-weight: bold; }
h1{ font-size:2.5em; }
h2{ font-size:2em; }
h3{ font-size:1.5em; }
h4{ font-size:1.2em; }
h5{ font-size:1em; }
h6{ font-size:0.9em; }
blockquote{
color:#666666;
margin:0;
padding-left: 3em;
border-left: 0.5em #EEE solid;
}
hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }
pre , code, kbd, samp {
color: #000;
font-family: monospace;
font-size: 0.88em;
border-radius:3px;
background-color: #F8F8F8;
border: 1px solid #CCC;
}
pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 5px;}
pre code { border: 0px !important; }
b, strong { font-weight: bold; }
dfn { font-style: italic; }
ins { background: #ff9; color: #000; text-decoration: none; }
mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }
ul, ol { margin: 1em 0; padding: 0 0 0 2em; }
li p:last-child { margin:0 }
dd { margin: 0 0 0 2em; }
img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
table { border-collapse: collapse; border-spacing: 0; }
td { vertical-align: top; }
@media only screen and (min-width: 480px) {
body{font-size:14px;}
}
@media only screen and (min-width: 768px) {
body{font-size:16px;}
}
@media print {
* { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
body{font-size:12pt; max-width:100%;}
a, a:visited { text-decoration: underline; }
hr { height: 1px; border:0; border-bottom:1px solid black; }
a[href]:after { content: " (" attr(href) ")"; }
abbr[title]:after { content: " (" attr(title) ")"; }
.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
@page :left { margin: 15mm 20mm 15mm 10mm; }
@page :right { margin: 15mm 10mm 15mm 20mm; }
p, h2, h3 { orphans: 3; widows: 3; }
h2, h3 { page-break-after: avoid; }
}</style><br />
<br />
<p>Some people ask me why I'm not doing my own startup. And the answer is I'm sure I will eventually - but not right now. For me, it's not about a big exit, but a big impact. There is a number of things that I could be doing with my time, including scrambling together a team to attack an idea largely for its own sake. But ultimately, I want to be im a place where I can tackle large ideas. That's how I approach my deicions right now: will this course of action position me to work on things that matter and make a difference in people's lives?</p><p>Right now, that path is software engineering. But importantly, I want to focus my efforts on the top layer, the membrane between the electronic bits and actual humans. The part that people see, touch, experience. If I do my job right in this area, they won't even notice the interface, but they'll experience joy, accomplish their tasks, or gain new understandings of themselves and the world around them. The technology is cool and shiny, and it's easy to get caught up in that, but I'm serious when I say the technology is only a means to a very human end.</p><p>So, the interface is what I want to create. But where do I want to do this? In his book The Passionate Programmer, Chad Fowler compares the career of an engineer to that of a musician. Growth requires practice, but moreover it requires collaboration and feedback with people better than you. Specifically, he advises "<a href="http://media.pragprog.com/titles/cfcar2/worst.pdf">always be the worst player in any band you're in</a>".</p><h2>What's next</h2><p>In developmental psychology, there's an idea called the zone of proximal development. This is the area of skills and knowledge that is just beyond your present level, and its this knowledge which is most engaging. Since it's similar to what you already know, you have a good foundation for developing the relations between concepts and facts. Since it's new material, it expands your knowledge and skills. The key then is to stay in this zone, to constantly push to take on new challenges, technologies, problems, in a way that builds on your existing experiences.</p><p>I feel I'm a pretty competent programmer, and I pick up on new concepts very quickly. Thus, my imperative is to surround myself with committed, passionate software players and creators. I want to be part of a world-class, high-impact, high-performance team. In service of the ultimate goal of working at the problem level - which will require a mix of technical, analytical, social, and business skills - I must seek out the best possible team in which to grow, learn, and contribute.</p><h2>Finding the right team is tricky.</h2><p>Great teams can only truly thrive in organizations with certain traits: Trust in team members over processes. Value people as a whole, not as a templated, arbitrarily-tilted job description. Encourage both internal and external communication of a shared vision, even at the expense of giving up some nominal control. Everyone should be empowered - and expected - to articulate the overall vision of the organization and understand how it relates back to their daily work.</p><p>The Adam Pisoni, Co-Founder and CTO of Yammer, gave a talk recently where he characterized heavily bureaucratic and process-driven organizations quite well. In these organizations, he says, "<a href="http://www.youtube.com/watch?v=3bNFqJU_n34&list=PL1FFC505CB0A887E9#!">you won't do it wrong, you also won't do it better.</a>" This kind of aspiration to mediocrity is fundamentally antithetical to my world view. I want to move people forward.</p><p>Reach out to me on twitter <a href="http://twitter.com/lejden">@leJDen</a></p>Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-10408275956955628062012-06-21T19:13:00.001-06:002012-06-21T19:13:20.560-06:00On Hypertext<em>I'm digging up some posts from previous blogs I've written that I think still have value. This is the first in a series. Originally published in 2011.</em><br />
<br />
In reading Vannevar Bush's 1945 piece, As We May Think, in which he is credited for conceptualizing hypertext "associative indexing," I am struck by one crucial difference between the "trails" of his memex and the hyperlinks of the web circa 2011. In the memex, a trail could be created by the reader as he uncovered interesting links. These trails were primarily there for his own recollection, although they could be shared with others by explicitly exporting them. Content could be published with links embedded by the authors, but they could just as easily create their own that made sense in their specific context. Along with associative links between published documents, readers could contribute their own analysis, excerpts, and annotations <em>in situ</em>, so that a trail captured an association of thought more completely.<br />
<br />
In today's web, links are the same for every every reader, placed only by the author. Some pages have a mechanism for reader-created links by means of comments, which invariably come at the bottom of the article, and which are frequently nothing more than spam. In any case, these are public, and difficult for the reader to later reference. Methods for annotation and recording thoughts are crude, through the use of blogs, microblogs (like this one), and social media. In this way, individual links can be shared with others, but the concept of creating custom "trails" of associated content is nascent at best, and fully unrealized at worst.<br />
<br />
Bush also talks of people who would actively create these links - "trail blazers." In today's web terms, we would call these people curators or mavens - surfacing the best content through their Twitter streams or blogs. However, these sharing mechanisms are still treating content atomicly, and interestingness has a tendency to surface either very timely or very weird content, such that anyone following a stream of links from a popular aggregation source is likely to still feel lost in a sea of lolcats and headline news. Whether this surfacing is done by an individual or a community, such as reddit, it is still subject to a crude, partial approximation of Bush's vision.<br />
<br />
The closest approximation to Bush's memex I can think of are wikis. They consist of vast collections of tightly hyperlinked content, due in part to a culture of what I'll call optimistic linking. That is, since they have a controlled domain and others can author content independently, an author can make any given term into a link. If a document exists for that link, then it is automatically referenced. If it does not exist, another author can come along and create that content. Wikis can range in scope from the "sum of all human knowledge" in the case of Wikipedia, to more narrowly focused around a given community or project, for example sites like pbwiki or wikia, which encourage the creation of new, topical wikis.<br />
<br />
However, these still fall short of Bush's ideal. They primarily link to internal content. While they can link to external content, they cannot retain context of linking to an arbitrary point within a page, and - more importantly - they can only link one level deep. After a wiki reader clicks through to an external link, she is not longer on the wiki, and she can no longer create a link to an arbitrary associated page.<br />
<br />
It is difficult to add annotations or new analysis. While most wikis are set up to allow anyone to contribute by creating and editing pages, they have a culture of preferring "content" rather than "metacontent". Since any edits made by one author are visible to all, there is a certain self-conscious act of "publishing" involved in editing a wiki. Further, an authors edits can be undone or refined by other authors, making a wiki non-permanent and poorly suited for an author's individual note-taking for later recall.<br />
<br />
Is there a need for these additional capabilities? I think it depends on our aims in reading and processing the information we find online. If we are merely flitting from one article to the next, possibly stopping to blog or tweet or comment about it along the way as an aside, never to return or further synthesize the information, then our current scheme is sufficient. If, however, we use the web with a more knowledge- and research-centric orientation, then we will soon find it lacking, particularly for personal recall.<br />
<br />
This is the aspect of hypertext that Bush most emphasizes, and one which I think is underrealized and potentially quite valuable. He characterizes his hypertext memex machine as "an enlarged intimate supplement to his memory." For simple facts and figures, a generic web search may prove to be immediate enough. "What's the movie with Tom Hanks and the volleyball?" for example. But for more complex intellectual concepts, a less transient, more personal means of assisting research, recall and serendipitous discovery of information is necessary.<br />
<br />
Nicolas Carr excoriates hypertext - and computers generally - in his work "The Shallows," claiming that hyperlinks contribute to shorter attention spans and flighty trains of thought. But he's making observations on the current implementations of hypertext. I take issue with his conclusions even on the basis of the current state of the web in 2011, even given the current state of hypertext. But given the addition of certain key conceptual features, ad-hoc hypertext has the promise of greatly increasing our ability to leverage, process, and synthesize the vast swaths of written knowledge. We must invent the tools to enable us to blaze trails across <em>terra semicognita</em>.Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-54092737897475766932012-06-19T18:16:00.000-06:002012-06-19T18:23:26.767-06:00Hackathon Tips from the Trenches<em>I'm digging up some posts from previous blogs I've written that I think still have value. This is the first in a series. Originally published in 2009.</em><br />
<br />
I participated in the first Idaho Startup Weekend in November 2009 in Boise. Going into it, I had seen some of the youtube videos, read through the website, but I still wasn’t quite sure what to expect. Here’s the guide I wish I’d had.<br />
<br />
<h3>1. Be Scrappy</h3><br />
It might be a no-brainer, but one weekend is a ridiculously short amount of time. Whatever best-practice methodology or design patterns or service architectures you use in your day job, chances are they weren’t designed with Startup Weekend in mind. You’ll be working with a team with widely varying backgrounds and technical abilities, and it’s just not worth the time to get everyone up to speed on your favorite buzz word. Get in the mindset of actuallybuilding something as quickly as you can. The code over the weekend is a prototype, a proof of concept. There’s the old software engineering truism, ‘build two to throw one away.’ If you product goes anywhere after the weekend, chances are you’ll be starting over from scratch with the codebase. So don’t fret, just build.<br />
<br />
<h3>2. Be Snappy</h3><br />
The weekend moves fast, and accelerates as it goes. You want to spend your time building, so get all of the basics out of the way before you leave on Friday. That means have a general product and rough feature list, decide on a name, and register your domain names. Get all of the group consensus stuff out of the way fast, so that everyone can do what they do best.<br />
<br />
<h3>3. Ubiquitous Capture</h3><br />
All weekend long, you’ll be refining the idea you went in with. My main takeaway is that rapid prototyping, and being forced to talk about your product all weekend, is a pretty amazing form of ideation. Fans of GTD already know this one: ubiquitous capture. You don’t have time to act on all your ideas, or even to properly evaluate if they suck or not. You don’t want this to distract you from building - see number 1. So, ubiquitous capture. Write everything down. Get it out of your head. In the case of my group, we used Google Wave to pretty good effect. By the end of the weekend, we decided to have a go of it, with a pretty solid understanding of our core product and a huge backlog of potential features.<br />
<br />
<h3>4. Divide & Conquer</h3><br />
As soon as you get into your group, do a quick skills inventory. Discover what everyone’s good at - and what they’re most productive at - and try to keep everyone in that role all weekend. Personally, I can hack around a bit in server-side code, but I’m certainly not very fluent, nor productive. However, we did have several other team members who were quite skilled in that area. Rather than having them waste time setting up their development environments, we had them go to work immediately. They were able to break away and draw arcane looking systems diagrams while I got them set up with the basics, like source control, ftp, and installing server software. I wasn’t able to start working on the front-end code until late Saturday, but the rest of my team was more productive for it.<br />
<br />
<h3>5. Control Scope… Ruthlessly</h3><br />
The weekend is a constant triage between what features are most important, and which can you actually build in the course of the weekend. Speed matters. Keep a master list. Don’t be afraid to cut and run. If you find yourself spinning your wheels on a feature, or -worse yet- spending time on Google researching how to build something- cut it from the scope. Seriously: you don’t have time right now, so skip it and move on to the next thing. Keep cutting things every few hours, working towards the drop-dead ship date of 6pm Sunday. Also, keep in mind that it’s a demo - you can mock up whatever you need to.<br />
<br />
<h3>6. Take a walk outside</h3><br />
The atmosphere in Startup Weekend is amazing - a swarm of people hacking away in the LCD glow, powered by adrenaline, caffeine, alcohol, and pure determination. But you can always take a break if you need to. By Saturday night, my team was up against a wall. We’d made some progress on the back end, but we still weren’t even sure what we would demo, let alone many of the business details. So we walked to the closest, smokiest bar we could find and - removed from computers - were able to bond and talk about our product. I referred to our bar excursion on Twitter as doing “market research.” The bar tweeted me back, “Don’t research and drive.”<br />
<br />
<h3>Bonus tip: reach out</h3><br />
At the end of the day, Startup Weekend was an amazing experience. Reach out beyond the walls of the room, through twitter, through email. Recruit your friends to help over the Internet. Capitalize on the buzz to launch your product. There will be media attention (at least in Boise, Idaho), so make the most of it. Please reach out to me on Twitter @leJDen.Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com1tag:blogger.com,1999:blog-7429763331846755769.post-76587619797031713462012-06-16T16:38:00.000-06:002012-06-16T16:38:11.794-06:00Diving into Mac OS X for the Windows Hacker<style>html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
body{
color:#444;
font-family:Georgia, Palatino, 'Palatino Linotype', Times,
'Times New Roman', serif,
"Hiragino Sans GB", "STXihei", "微软雅黑";
font-size:12px;
line-height:1.5em;
background:#fefefe;
width: 45em;
margin: 80px auto;
padding: 5em 5em;
outline: 1300px solid #FAFAFA;
}
a{ color: #0645ad; text-decoration:none;}
a:visited{ color: #0b0080; }
a:hover{ color: #06e; }
a:active{ color:#faa700; }
a:focus{ outline: thin dotted; }
a:hover, a:active{ outline: 0; }
span.backtick {
border:1px solid #EAEAEA;
border-radius:3px;
background:#F8F8F8;
padding:0px 3px 0px 3px;
}
::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
::selection{background:rgba(255,255,0,0.3);color:#000}
a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
a::selection{background:rgba(255,255,0,0.3);color:#0645ad}
p{
margin:1em 0;
}
img{
max-width:100%;
}
h1,h2,h3,h4,h5,h6{
font-weight:normal;
color:#111;
line-height:1em;
}
h4,h5,h6{ font-weight: bold; }
h1{ font-size:2.5em; }
h2{ font-size:2em; }
h3{ font-size:1.5em; }
h4{ font-size:1.2em; }
h5{ font-size:1em; }
h6{ font-size:0.9em; }
blockquote{
color:#666666;
margin:0;
padding-left: 3em;
border-left: 0.5em #EEE solid;
}
hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }
pre , code, kbd, samp {
color: #000;
font-family: monospace;
font-size: 0.88em;
border-radius:3px;
background-color: #F8F8F8;
border: 1px solid #CCC;
}
pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 5px;}
pre code { border: 0px !important; }
b, strong { font-weight: bold; }
dfn { font-style: italic; }
ins { background: #ff9; color: #000; text-decoration: none; }
mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }
ul, ol { margin: 1em 0; padding: 0 0 0 2em; }
li p:last-child { margin:0 }
dd { margin: 0 0 0 2em; }
img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
table { border-collapse: collapse; border-spacing: 0; }
td { vertical-align: top; }
@media only screen and (min-width: 480px) {
body{font-size:14px;}
}
@media only screen and (min-width: 768px) {
body{font-size:16px;}
}
@media print {
* { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
body{font-size:12pt; max-width:100%;}
a, a:visited { text-decoration: underline; }
hr { height: 1px; border:0; border-bottom:1px solid black; }
a[href]:after { content: " (" attr(href) ")"; }
abbr[title]:after { content: " (" attr(title) ")"; }
.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
@page :left { margin: 15mm 20mm 15mm 10mm; }
@page :right { margin: 15mm 10mm 15mm 20mm; }
p, h2, h3 { orphans: 3; widows: 3; }
h2, h3 { page-break-after: avoid; }
}</style><br />
<p><em>(I know you're out there)</em></p><p>So, I made the plunge. The Retina display MBP was just released. I ordered one the day it came out, and it got here about 10 days sooner than I was expecting. But there's one small problem: I've never owned a Mac before. Sure, I've used one on a daily basis before, and I've given tech support for them on more than one occasion to friends and family. But now I've got a problem: I know my way around Windows backwards and forwards. I know it's inner workings, and I have all the keyboard shortcuts memorized to an instinctual level. It's my first 72 hours with a Mac, and here are my impressions and tips to getting back up to speed as soon as possible.</p><h2>Why a Mac?</h2><p>Let me get this out of the way. Feel free to skip this section. I use computers for a far larger proportion of my day than could possibly be healthy, so it's worth it to me to invest in the best possible hardware. It's funny how emotional some people can get in defending their technology choices. Mac vs PC vs *nix. The most common knock I hear against Macs (and I've repeated this line myself) is that they're overpriced. Well, sure they're more expensive than a commodity PC, in the same way a Lexus is more expensive than a Kia. They both turn on, they can both drive on the same road, but one will afford you some more creature comforts, have better design and engineering, and give a better experience overall. Is than intangible difference worth it to you? At the end of the day, they're both cars, or they're both computers. So go with what you like.</p><h2>First, the keys</h2><p><em>(or, How the hell do I copy and paste?)</em></p><p>In Windows, the <span class="backtick">Control</span> key is king. In OS X, it's <span class="backtick">Command</span>. In fact, changing most of your Control keyboard shortcuts to Command will work fine. Common examples include <span class="backtick">Command + C</span> to copy, <span class="backtick">Command + V</span> to paste, <span class="backtick">Command + X</span> to cut, <span class="backtick">Command + S</span> to save, and <span class="backtick">Command + Z</span> to undo.</p><h3>Window Management</h3><p>Just as in Windows, <span class="backtick">Command + W</span> will close a tab in a tabbed application. To close an app, it's <span class="backtick">Command + Q</span>, whereas in Windows it would be <span class="backtick">Alt + F4</span>. To cycle through visible windows, <span class="backtick">Command + Tab</span> works just like <span class="backtick">Alt + Tab</span>. Also try the three-finger swipe up gesture to show all windows in an overview mode, with windows form the same Application grouped together. Three-finger swipe up again to return to your current application, or click a window to bring it to the front.</p><h3>Text manipulation</h3><p>I spend much of my day in text editors. Being able to quikly navigate large files without moving from the keyboard is important to me. So, here goes:</p><ul><li><span class="backtick">Option + Left or Right</span>: move the cursor left or right by a whole word. Equivalent of <span class="backtick">Ctrl + Left or Right</span> on Windows. Of course, holding down <span class="backtick">Shift</span> at the same time selects text in that direction a word at a time, and <span class="backtick">Delete</span> deletes text a word at a time.</li>
<li><span class="backtick">Fn + Delete</span>: deletes text to the right - equivalent of the Windows <span class="backtick">Delete</span> key. The regular OS X <span class="backtick">Delete</span> key deletes text to the left, like the Windows <span class="backtick">Backspace.</span> You can use this in combination with other modifiers to delete a word at a time to the right: <span class="backtick">Option + Fn + Delete</span>.</li>
</ul><h3>Custom Keys</h3><p>On Windows, you'd need special software to define system-wide custom keyboard shortcuts. In OS X, it's as easy as going to <span class="backtick">System Preferences</span> (Apple Icon in the upper left -> <span class="backtick">System Preferences</span>), <span class="backtick">Keyboard</span> preferences pane, and clicking the <span class="backtick">Keyboard Shortcuts</span> tab. Here, you can remap existing shortcuts, or go down to the <span class="backtick">Applications</span> item and add your own. Enter the name of a menu item and map it to a keyboard combination, and any application with a menu item matching that name will automatically have that keyboard shortcut enabled.</p><h3>Spotlight</h3><p>Windows 7 was great because it introduced a great keyboard-friendly launcher built into the start menu: mash <span class="backtick">Windows</span> and start typing, and you could launch apps, directories, or files. Of course, this feature came out in OS X earlier. No matter. In OS X, it's called Spotlight, and you get to it by typing <span class="backtick">Command + Space</span>. Use it early, use it often. Knock yourself out.</p><h2>Second, use gestures</h2><p>One thing I've long disliked about Mac user interface is how hard they make it to maximize your active application. I like working on one applicaiton at a time to keep visual distraction to a minimum and keep my focus flowing. In Windows, of course, I could mash <span class="backtick">Window + Up Arrow</span> to maximize an application. For those that support it, hitting <span class="backtick">F11</span> will enter full screen mode. Mac OS X Lion (which the new MBPs ship with, for now) has really great full screen application mode. You can visually see if an application supports it by the 'full screen' icon in the top-right corner:</p><p><img alt="full screen icon" src="http://i.imgur.com/r1sXd.png" /></p><p>This is where it gets cool: once your application is in full screen mode, you can three-finger swipe left and right to move between that full-screen application and the rest of your desktop. Whereas in Windows, alt-tabbing out of a full screen application often takes it out of full screen mode, in OS X it's really easy to keep a text editor in full screen view, for example, and swipe over to context switch when necessary. You can also three-finger swipe to the left from your main desktop view to access desktop widgets, which seem like they're on their way out in OS X Lion, but can still be handy for a quick glance at the weather, traffic, filght tracking, or other passive information.</p><h3>Just drag your fingers everywhere on the lucsious touchpad</h3><p>Seriously. Coming from Windows, the best gestures I had on my laptop's touchpad were two-fingered scroll. Here, I'm taking advantage of two-finger left- and right-swipes to navigate backwards and forwards (in both Safari and Chrome), five-finger splay to easily access my desktop (<span class="backtick">Windows + D</span> in Windows-land), and of course, buttery smooth two-finger scrolling in both dimensions. OS X Lion defaults to direct scrolling: moving your fingers down moves the contents of the window down. At first, it's opposite form what you might be used to, especially using the scroll wheel of a mouse - but you quickly realize it's the same as on a touch screen device, like a phone or an iPad. If you don't like it, you can go back to the old way in System Preferences.</p><h2>Screenshots</h2><p>Windows has faily rudimentary screenshot support out of the box. Hit <span class="backtick">Print Screen</span> and the entire contents of the screen is copied to the clipboard. Want to save the screenshot? It's up to you to launch a program and save it. Have multiple screens? The entire area is copied. Want to capture only a portion of the screen, or only one window? You'll have to pick up a 3rd party utility (I like <a href="http://chocolatey.org/packages/Shotty">Shotty</a>) In OS X, those functions as built in. The keyboard shortcuts are not super intuitive, but I suspect I'll soon have these memorized:</p><ul><li><span class="backtick">Command + Control + Shift + 3</span> (yes, really): Take a screenshot and copy to clipboard (equivalent to Windows <span class="backtick">Print Screen</span>). In fact, using <span class="backtick">Control</span> in combination with the other commands copies the result to the clipboard instead of saving an image to the desktop.</li>
<li><span class="backtick">Command + Shift + 3</span>: take a screnshot and save to desktop</li>
<li><span class="backtick">Command + Shift + 4</span>: clip part of the screen and save to desktop</li>
<li><span class="backtick">Command + Shift + 4, Space</span>: click a window to capture it and save to desktop</li>
</ul><h2>Next: to the Terminal and beyond</h2><p>One of the best parts of OS X is that you have a real *nix terminal under the hood. Mash <span class="backtick">Command + Space, term, Return</span> and you're in a real bash shell, in your home user directory. I love that <span class="backtick">Command + Plus or Minus</span> still works to adjust the font size, and the Preferrences screen (universally accessed in OS X apps with <span class="backtick">Command + ,</span>) lets you tweak out every other aspect of your Terminal: fonts, transparency, tabbed windows, and shells. Get comfy with Terminal, and use it as much as you can. Get back to your hacker roots, and kiss Windows' lousy CMD goodbye.</p><p>I'll continue to post tips and tricks as I come across things that are especially useful. I still think Windows Explorer and the Windows File Open and File Save dialogs are better than OS X, but I expect that's just because they're more familiar to me. In the mean time, I've got Windows 8 running in a VM for Visual Studio and some other Windows-only utilities that I use.</p><p>Got a tip? Post it in the comments, or reach me <a href="https://twitter.com/lejden">@leJDen</a> on twitter.</p>Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com0tag:blogger.com,1999:blog-7429763331846755769.post-26432693002279386672012-06-11T00:04:00.001-06:002012-06-12T02:20:54.827-06:00Creating your first package with Chocolatey NuGet<!DOCTYPE html><html><head><meta charset="utf-8"><style>html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
body{
color:#444;
font-family:Georgia, Palatino, 'Palatino Linotype', Times,
'Times New Roman', serif,
"Hiragino Sans GB", "STXihei", "微软雅黑";
font-size:12px;
line-height:1.5em;
background:#fefefe;
width: 45em;
margin: 80px auto;
padding: 5em 5em;
outline: 1300px solid #FAFAFA;
}
a{ color: #0645ad; text-decoration:none;}
a:visited{ color: #0b0080; }
a:hover{ color: #06e; }
a:active{ color:#faa700; }
a:focus{ outline: thin dotted; }
a:hover, a:active{ outline: 0; }
span.backtick {
border:1px solid #EAEAEA;
border-radius:3px;
background:#F8F8F8;
padding:0px 3px 0px 3px;
}
::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
::selection{background:rgba(255,255,0,0.3);color:#000}
a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
a::selection{background:rgba(255,255,0,0.3);color:#0645ad}
p{
margin:1em 0;
}
img{
max-width:100%;
}
h1,h2,h3,h4,h5,h6{
font-weight:normal;
color:#111;
line-height:1em;
}
h4,h5,h6{ font-weight: bold; }
h1{ font-size:2.5em; }
h2{ font-size:2em; }
h3{ font-size:1.5em; }
h4{ font-size:1.2em; }
h5{ font-size:1em; }
h6{ font-size:0.9em; }
blockquote{
color:#666666;
margin:0;
padding-left: 3em;
border-left: 0.5em #EEE solid;
}
hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }
pre , code, kbd, samp {
color: #000;
font-family: monospace;
font-size: 0.88em;
border-radius:3px;
background-color: #F8F8F8;
border: 1px solid #CCC;
}
pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 5px;}
pre code { border: 0px !important; }
b, strong { font-weight: bold; }
dfn { font-style: italic; }
ins { background: #ff9; color: #000; text-decoration: none; }
mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }
ul, ol { margin: 1em 0; padding: 0 0 0 2em; }
li p:last-child { margin:0 }
dd { margin: 0 0 0 2em; }
img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
table { border-collapse: collapse; border-spacing: 0; }
td { vertical-align: top; }
@media only screen and (min-width: 480px) {
body{font-size:14px;}
}
@media only screen and (min-width: 768px) {
body{font-size:16px;}
}
@media print {
* { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
body{font-size:12pt; max-width:100%;}
a, a:visited { text-decoration: underline; }
hr { height: 1px; border:0; border-bottom:1px solid black; }
a[href]:after { content: " (" attr(href) ")"; }
abbr[title]:after { content: " (" attr(title) ")"; }
.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
@page :left { margin: 15mm 20mm 15mm 10mm; }
@page :right { margin: 15mm 10mm 15mm 20mm; }
p, h2, h3 { orphans: 3; widows: 3; }
h2, h3 { page-break-after: avoid; }
}</style></head><body><h4>What is it and why would I want to do it?</h4><p>Chocolatey is a way to download and install software in Windows from the command line. Its documentation describes it as 'a kind of apt-get for Windows'. If you're not familiar with package managers in other systems, think back to the last time you were setting up a new machine, or reinstalling your current machine. Launch Internet Explorer. Download a new browser. Search for the homepages of your favorite tools and utilities, download various zips or MSIs. Open your <span class="backtick">My Downloads</span> folder and run each of the installers individually, clicking <span class="backtick">yes</span> and <span class="backtick">continue</span> and <span class="backtick">ok</span> incessantly. Redownload some of the installers because you forgot to download the x64 executable. Rinse, repeat.</p><p>With Chocolatey, you can install software in one convenient step from the command line. Moreover, if the application you are looking for does not yet have a package in the Chocolatey repository, you can add it to save time for others (and your future self, when you go to reinstall that software again). So, think of an application or tool you love, and let's create a Chocolatey package for it.</p><h4>Get Chocolatey</h4><p>The first step is to install Chocolatey. This is bootstrapped by executing a one-line powershell script. Hit <span class="backtick">Windows + R</span> to bring up the "Run" dialog. Type <span class="backtick">cmd</span> and hit enter to bring up a Command prompt. Copy and paste the following line into the command prompt and run it:</p><pre><code>> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('http://bit.ly/psChocInstall'))"
</code></pre><p>This will download and install the latest version of Chocolatey and add it to your PATH environment variable. Now you can run Chocolatey from the command line. Run the following to show the help page:</p><pre><code>> chocolatey --help | more
</code></pre><p>To install a package, use <span class="backtick">chocolatey install <packageName></span> or the shortcut:</p><pre><code>> cinst <packageName>
</code></pre><p>You can list available packages by running <span class="backtick">chocolatey list</span> or browsing the main repository at <a href="http://chocolatey.org/packages">http://chocolatey.org/packages</a>.</p><h4>Register to create your own packages</h4><p>Chocolatey packages typically don't contain the executables themselves, but rather scripts to automate downloading and executing the installers. This means that, in most cases, you are free to create Chocolatey packages for your favorite tools and utilities. For open source software with licenses that explicitly allow redistribution, you should be fine. For proprietary licenses, use your best judgement and ask the software's author when in doubt. Refer to the wiki for more on <a href="https://github.com/chocolatey/chocolatey/wiki/Legal">distribution rights</a>.</p><p>First, <a href="http://chocolatey.org/account/Register">register at Chocolatey.org</a>. Click through the confirmation link in your email, log in, then go to your <a href="http://chocolatey.org/account">account page</a>. Scroll down to where it says <em>API Key</em> and click the area to show your API key. Copy this key to your clipboard.</p><p>Note that as of 6/10/2012, the instructions shown on the site are incorrect and apply to NuGet, not Chocolatey. To setup your API key in Chocolatey, run the following:</p><pre><code>> nuget setApiKey <apiKey> -Source http://chocolatey.org/api/v2/
</code></pre><p>Now we're ready to create the package. Chocolatey packages are NuGet packages that contain a PowerShell scipt named <span class="backtick">chocolateyinstall.ps1</span> in the <span class="backtick">/tools</span> directory. Chocolatey also provides some helper PowerShell functions to make writing the install scripts easier.</p><h4>Git clone the chocolatey template account</h4><p>You should have git installed on your machine. If you don't install it now:</p><pre><code>> cinst git
</code></pre><p>Now let's clone the Chocolatey and open the template folder:</p><pre><code>> git clone https://github.com/ferventcoder/nugetpackages.git
> cd nugetpackages/_template/chocolatey
> tree /F
Folder PATH listing
Volume serial number is ...
C:.
│ __NAME__.nuspec
│
└───tools
chocolateyInstall.ps1
</code></pre><p>As you can see, we have the <span class="backtick">.nuspec</span> file, which is an XML file containing metadata for the package, and the <span class="backtick">chocolateyInstall.ps1</span> file which contains the powershell script for downloading and running the installer.</p><p>Copy this directory stucture to a new folder for your package. You may want to keep this package in source control, for example Github. This will make it easier to manage updates to your packages as new versions are released.</p><p>Rename <span class="backtick">__NAME__.nuspec</span> to whatever you want your package name to be. Don't include a version number, as the package name will stay the same between versions. This is the name that people will type when they go to <span class="backtick">cinst</span> your package. Open this file and update the appropriate fields. Be complete, especially with the version number of the underlying software, the license information and links back to the project homepage. For more information about the nuspec file format, see the <a href="http://docs.nuget.org/docs/reference/nuspec-reference">nuspec reference</a>.</p><p>Edit the <span class="backtick">chocolateyInstall.ps1</span> file in your favorite text editor. This template file is commented and includes common examples. You can use any PowerShell commands you want in this file, but it's best to keep it simple. For more on the included Chocolatey commands, see the <a href="https://github.com/chocolatey/chocolatey/wiki/HelpersReference">helpers reference</a> on the wiki.</p><p>Make sure the <span class="backtick">chocolateyInstall.ps1</span> file is in a folder called <span class="backtick">/tools</span> under the folder which contains the <span class="backtick">nuspec</span> file. This is where Chocolatey will look to run the install script.</p><h4>Build and publish your package</h4><p>To finalize your package, navigate to the directory for your package in a command window and run:</p><pre><code>> chocolatey pack <packageName>.nuspec
</code></pre><p>This will create a file called <span class="backtick"><packageName>.nupkg</span>, which is a zip file containing the <span class="backtick">.nuspec</span> and <span class="backtick">chocolateyInstall.ps1</span> files. It also validates the metadata in the package. This resulting <span class="backtick">.nupkg</span> file is the package itself which we'll upload to the Chocolatey repository.</p><p>First, let's test the package. <span class="backtick">cinst</span> has a <span class="backtick">-source</span> flag which will let you specify a location other than the main Chocolatey repository to check for packages. This can also be a folder on your local machine. We'll also use the <span class="backtick">-force</span> flag so we can repeat the installer while we're testing the package. By default, Chocolatey will only install a package once.</p><pre><code>> cinst <packageName> -source <pathToYourPackage> -force
</code></pre><p>Note that <span class="backtick">-force</span> makes Chocolatey re-run the <span class="backtick">chocolateyInstall.ps1</span> script, but it won't redownload the NuGet package. If you need to make a change, delete the package folder from <span class="backtick">c:\Chocolatey\lib\<packageName></span>. Then re-run <span class="backtick">chocolatey pack <packageName>.nuspec</span> and run <span class="backtick">cinst</span> again. Repeat as necessary.<br />
</p><p>Verify that everything worked as expected. All set? Let's push the package to Chocolatey.</p><pre><code>> chocolatey push <packageName>.nupkg
</code></pre><p>That's it! You can verify that your package uplaoded successfully by going to the <a href="http://chocolatey.org/packages?sortOrder=package-created">package list page ordered by created date</a>.</p><h4>In conclusion</h4><p>Having real package management in Windows is a huge win. It makes installing software and setting up a development environment dirt simple and extremely fast. Spread the word to other developers your know, and announce your new Chocolatey packages. Inform the original authors that you created a Chocolatey package to help distribute their work to build awareness of Chocolatey. Lastly, take a look at the Chocolatey source on Github and see if you can contribute by looking through the open issues and possibly contributing a pull request or updating wiki documentation.</p><p><em>Thanks to R in the comments for pointing out some corrections</em></p></body>Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com3tag:blogger.com,1999:blog-7429763331846755769.post-6453853042747627092012-03-08T19:12:00.001-07:002012-03-08T19:12:44.323-07:00Obligatory inaugural blog post<p>“starting up my blog again, I promise to write often, all the cool kids have blogs, I need to share my ego with the Internet, this will just be a place for me to dump stuff I make and come across, etc, etc.”</p> <p>With that out of the way, I <em>have</em> been meaning to write more and share longer-form ideas. Twitter is well and good, but it’s a very passive form of creation. With a blog, I hope to take advantage of a longer format to better articulate my ideas and solicit more meaningful feedback.</p> <p>There’s no real content in this post. Thanks for your attention anyhow.</p> Jason Denizachttp://www.blogger.com/profile/17396359849387516823noreply@blogger.com3