restructure posts, responsive layout, new style

This commit is contained in:
Sami Samhuri 2014-03-01 16:52:19 -08:00
parent c83c639b98
commit b11e6bf5b7
165 changed files with 2443 additions and 2027 deletions

View file

@ -1 +1 @@
exclude = "{$exclude,www,node_modules}"
exclude = "{$exclude,www,node_modules,tweets}"

View file

@ -15,14 +15,11 @@ function main() {
rm -rf "$TARGET"
"$HARP" compile . "$TARGET"
echo "* mungle html to make it available without the extension"
echo "* munge html files to make them available without an extension"
munge_html
echo "* minify js"
minify_js
echo "* minify css"
minify_css
}
function compile_rss() {
@ -30,7 +27,7 @@ function compile_rss() {
}
function munge_html() {
for FILE in "$TARGET"/*.html "$TARGET"/posts/*.html "$TARGET"/projects/*.html; do
for FILE in "$TARGET"/*.html "$TARGET"/posts/*/*/*.html "$TARGET"/projects/*.html; do
[[ "${FILE##*/}" = "index.html" ]] && continue
# make posts available without an .html extension
@ -46,10 +43,4 @@ function minify_js() {
done
}
function minify_css() {
for FILE in "$TARGET"/css/*.css; do
$DIR/minify-css.sh "$FILE" > /tmp/minified.css && mv /tmp/minified.css "$FILE" || echo "* failed to minify $FILE"
done
}
main

View file

@ -1,16 +0,0 @@
#!/bin/sh
DIR=$(dirname "$0")
JAR_FILENAME="$DIR/yuicompressor-2.4.8.jar"
function minify() {
INPUT="$1"
java -jar "$JAR_FILENAME" "$INPUT"
}
if [[ "$1" != "" ]]; then
minify "$1"
else
echo "usage: $0 [input file]"
exit 1
fi

21
bin/move.rb Executable file
View file

@ -0,0 +1,21 @@
#!/usr/bin/env ruby
def pad(n)
n = n.to_i
if n < 10
"0#{n}"
else
"#{n}"
end
end
Dir.chdir File.join(File.dirname(__FILE__), '../public/posts')
Dir['*.html.md'].each do |filename|
name = filename.sub('.html.md', '')
date, *rest = name.split('-')
year, month, _ = date.split('.')
slug = rest.join('-')
File.rename filename, File.join(year, pad(month), slug + '.html.md')
end

20
bin/redirects.rb Executable file
View file

@ -0,0 +1,20 @@
#!/usr/bin/env ruby
def pad(n)
n = n.to_i
if n < 10
"0#{n}"
else
"#{n}"
end
end
Dir.chdir File.join(File.dirname(__FILE__), '../public/posts')
Dir['*.html.md'].each do |filename|
name = filename.sub('.html.md', '')
date, *rest = name.split('-')
year, month, _ = date.split('.')
slug = rest.join('-')
puts "Redirect 301 /blog/#{name} /posts/#{year}/#{pad(month)}/#{slug}"
end

View file

@ -25,8 +25,9 @@ class Blag
self.new(dir).generate!
end
def initialize dir
def initialize dir, num_posts = 10
@dir = dir
@num_posts = num_posts
end
def generate!
@ -66,22 +67,25 @@ class Blag
def posts
@posts ||= begin
prefix = @dir + '/posts/'
json = File.read File.join(prefix, '_data.json')
data = JSON.parse json
data.map do |slug, post|
filename = find_post prefix, slug
content = File.read filename
post['slug'] = slug
post['type'] = post['link'] ? :link : :post
post['title'] += "" if post['type'] == :link
post['relative_url'] = '/posts/' + slug
post['url'] = root_url + post['relative_url']
post['content'] = content
post['body'] = RDiscount.new(post['content'], :smart).to_html
post['rfc822'] = Time.at(post['timestamp']).rfc822
post
end.sort_by { |p| -p['timestamp'] }.first(10)
Dir[File.join(@dir, 'posts/20*/*')].map do |dir|
json = File.read File.join(dir, '_data.json')
data = JSON.parse json
prefix = dir.sub(@dir, '')
data.map do |slug, post|
filename = find_post dir, slug
content = File.read filename
relative_url = File.join(prefix, slug)
post['slug'] = slug
post['type'] = post['link'] ? :link : :post
post['title'] = "#{post['title']}" if post['type'] == :link
post['relative_url'] = relative_url
post['url'] = root_url + post['relative_url']
post['content'] = content
post['body'] = RDiscount.new(post['content'], :smart).to_html
post['rfc822'] = Time.at(post['timestamp']).rfc822
post
end
end.flatten.sort_by { |p| -p['timestamp'] }.first(@num_posts)
end
end
@ -129,6 +133,7 @@ private
def feed_xml
xml = Builder::XmlMarkup.new
xml.instruct! :xml, version: '1.0'
xml.instruct! 'xml-stylesheet', href: root_url + '/css/normalize.css', type: 'text/css'
xml.instruct! 'xml-stylesheet', href: root_url + '/css/style.css', type: 'text/css'
xml.rss version: '2.0' do

Binary file not shown.

View file

@ -5,4 +5,4 @@
"email": "sami@samhuri.net",
"url": "http://samhuri.net"
}
}
}

View file

@ -20,8 +20,115 @@ ExpiresDefault A259200
Header append Cache-Control "private, must-revalidate"
</FilesMatch>
Redirect 301 /json-diff/ http://tlrobinson.net/projects/javascript-fun/jsondiff/
Redirect 301 /proj/ /projects/
Redirect 301 /blog/sjs.rss /feed.xml
Redirect 301 /blog/ /posts/
Redirect 301 /json-diff/ http://tlrobinson.net/projects/javascript-fun/jsondiff/
Redirect 301 /blog/2006.02.08-first-post /posts/2006/02/first-post
Redirect 301 /blog/2006.02.08-touch-screen-on-steroids /posts/2006/02/touch-screen-on-steroids
Redirect 301 /blog/2006.02.15-urban-extreme-gymnastics /posts/2006/02/urban-extreme-gymnastics
Redirect 301 /blog/2006.02.18-girlfriend-x /posts/2006/02/girlfriend-x
Redirect 301 /blog/2006.02.18-jump-to-viewcontroller-in-textmate /posts/2006/02/jump-to-viewcontroller-in-textmate
Redirect 301 /blog/2006.02.18-some-textmate-snippets-for-rails-migrations /posts/2006/02/some-textmate-snippets-for-rails-migrations
Redirect 301 /blog/2006.02.20-obligatory-post-about-ruby-on-rails /posts/2006/02/obligatory-post-about-ruby-on-rails
Redirect 301 /blog/2006.02.20-textmate-snippets-for-rails-assertions /posts/2006/02/textmate-snippets-for-rails-assertions
Redirect 301 /blog/2006.02.21-textmate-insert-text-into-self-down /posts/2006/02/textmate-insert-text-into-self-down
Redirect 301 /blog/2006.02.21-textmate-move-selection-to-self-down /posts/2006/02/textmate-move-selection-to-self-down
Redirect 301 /blog/2006.02.22-intelligent-migration-snippets-0.1-for-textmate /posts/2006/02/intelligent-migration-snippets-0.1-for-textmate
Redirect 301 /blog/2006.02.23-sjs-rails-bundle-0.2-for-textmate /posts/2006/02/sjs-rails-bundle-0.2-for-textmate
Redirect 301 /blog/2006.03.03-generate-selfdown-in-your-rails-migrations /posts/2006/03/generate-selfdown-in-your-rails-migrations
Redirect 301 /blog/2006.03.03-i-dont-mind-fairplay-either /posts/2006/03/i-dont-mind-fairplay-either
Redirect 301 /blog/2006.03.03-spore /posts/2006/03/spore
Redirect 301 /blog/2006.04.04-zsh-terminal-goodness-on-os-x /posts/2006/04/zsh-terminal-goodness-on-os-x
Redirect 301 /blog/2006.05.07-os-x-and-fitts-law /posts/2006/05/os-x-and-fitts-law
Redirect 301 /blog/2006.05.07-wikipediafs-on-linux-in-python /posts/2006/05/wikipediafs-on-linux-in-python
Redirect 301 /blog/2006.06.05-ich-bin-auslnder-und-spreche-nicht-gut-deutsch /posts/2006/06/ich-bin-auslnder-und-spreche-nicht-gut-deutsch
Redirect 301 /blog/2006.06.09-never-buy-a-german-keyboard /posts/2006/06/never-buy-a-german-keyboard
Redirect 301 /blog/2006.06.10-theres-nothing-regular-about-regular-expressions /posts/2006/06/theres-nothing-regular-about-regular-expressions
Redirect 301 /blog/2006.06.11-apple-pays-attention-to-detail /posts/2006/06/apple-pays-attention-to-detail
Redirect 301 /blog/2006.07.06-working-with-the-zend-framework /posts/2006/07/working-with-the-zend-framework
Redirect 301 /blog/2006.07.13-ubuntu-linux-for-linux-users-please /posts/2006/07/ubuntu-linux-for-linux-users-please
Redirect 301 /blog/2006.07.17-ruby-and-rails-have-spoiled-me-rotten /posts/2006/07/ruby-and-rails-have-spoiled-me-rotten
Redirect 301 /blog/2006.07.19-late-static-binding /posts/2006/07/late-static-binding
Redirect 301 /blog/2006.07.21-class-method-instance-method-it-doesnt-matter-to-php /posts/2006/07/class-method-instance-method-it-doesnt-matter-to-php
Redirect 301 /blog/2006.08.22-where-are-my-headphones /posts/2006/08/where-are-my-headphones
Redirect 301 /blog/2006.09.16-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo /posts/2006/09/buffalo-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo
Redirect 301 /blog/2006.09.22-some-features-you-might-have-missed-in-itunes-7 /posts/2006/09/some-features-you-might-have-missed-in-itunes-7
Redirect 301 /blog/2006.12.17-coping-with-windows-xp-activiation-on-a-mac /posts/2006/12/coping-with-windows-xp-activiation-on-a-mac
Redirect 301 /blog/2007.03.06-full-screen-cover-flow /posts/2007/03/full-screen-cover-flow
Redirect 301 /blog/2007.03.08-digg-v4-reply-to-replies-greasemonkey-script /posts/2007/03/digg-v4-reply-to-replies-greasemonkey-script
Redirect 301 /blog/2007.03.25-diggscuss-0.9 /posts/2007/03/diggscuss-0.9
Redirect 301 /blog/2007.04.04-a-triple-booting-schizophrenic-macbook /posts/2007/04/a-triple-booting-schizophrenic-macbook
Redirect 301 /blog/2007.04.11-activerecord-base.find_or_create-and-find_or_initialize /posts/2007/04/activerecord-base.find_or_create-and-find_or_initialize
Redirect 301 /blog/2007.04.16-getting-to-know-vista /posts/2007/04/getting-to-know-vista
Redirect 301 /blog/2007.04.26-quickly-inserting-millions-of-rows-with-mysql-innodb /posts/2007/04/quickly-inserting-millions-of-rows-with-mysql-innodb
Redirect 301 /blog/2007.04.30-funny-how-code-can-be-beautiful /posts/2007/04/funny-how-code-can-be-beautiful
Redirect 301 /blog/2007.05.01-typo-and-i-are-friends-again /posts/2007/05/typo-and-i-are-friends-again
Redirect 301 /blog/2007.05.03-a-scheme-parser-in-haskell-part-1 /posts/2007/05/a-scheme-parser-in-haskell-part-1
Redirect 301 /blog/2007.05.05-a-new-way-to-look-at-networking /posts/2007/05/a-new-way-to-look-at-networking
Redirect 301 /blog/2007.05.05-gotta-love-the-ferry-ride /posts/2007/05/gotta-love-the-ferry-ride
Redirect 301 /blog/2007.05.09-dtrace-ruby-goodness-for-sun /posts/2007/05/dtrace-ruby-goodness-for-sun
Redirect 301 /blog/2007.05.09-i-cant-wait-to-see-what-matt-stone-trey-parker-do-with-this /posts/2007/05/i-cant-wait-to-see-what-matt-stone-trey-parker-do-with-this
Redirect 301 /blog/2007.05.10-enumerable-pluck-and-string-to_proc-for-ruby /posts/2007/05/enumerable-pluck-and-string-to_proc-for-ruby
Redirect 301 /blog/2007.05.10-rails-plugins-link-dump /posts/2007/05/rails-plugins-link-dump
Redirect 301 /blog/2007.05.15-dumping-objects-to-the-browser-in-rails /posts/2007/05/dumping-objects-to-the-browser-in-rails
Redirect 301 /blog/2007.05.16-cheating-at-life-in-general /posts/2007/05/cheating-at-life-in-general
Redirect 301 /blog/2007.05.18-iphone-humour /posts/2007/05/iphone-humour
Redirect 301 /blog/2007.05.22-inspirado /posts/2007/05/inspirado
Redirect 301 /blog/2007.05.26-finnish-court-rules-css-ineffective-at-protecting-dvds /posts/2007/05/finnish-court-rules-css-ineffective-at-protecting-dvds
Redirect 301 /blog/2007.06.08-301-moved-permanently /posts/2007/06/301-moved-permanently
Redirect 301 /blog/2007.06.08-so-long-typo-and-thanks-for-all-the-timeouts /posts/2007/06/so-long-typo-and-thanks-for-all-the-timeouts
Redirect 301 /blog/2007.06.14-more-scheming-with-haskell /posts/2007/06/more-scheming-with-haskell
Redirect 301 /blog/2007.06.14-testspec-on-rails-declared-awesome-just-one-catch /posts/2007/06/testspec-on-rails-declared-awesome-just-one-catch
Redirect 301 /blog/2007.06.15-begging-the-question /posts/2007/06/begging-the-question
Redirect 301 /blog/2007.06.18-back-on-gentoo-trying-new-things /posts/2007/06/back-on-gentoo-trying-new-things
Redirect 301 /blog/2007.06.20-reinventing-the-wheel /posts/2007/06/reinventing-the-wheel
Redirect 301 /blog/2007.06.22-embrace-the-database /posts/2007/06/embrace-the-database
Redirect 301 /blog/2007.06.23-emacs-for-textmate-junkies /posts/2007/06/emacs-for-textmate-junkies
Redirect 301 /blog/2007.06.24-floating-point-in-elschemo /posts/2007/06/floating-point-in-elschemo
Redirect 301 /blog/2007.06.25-emacs-tagify-region-or-insert-tag /posts/2007/06/emacs-tagify-region-or-insert-tag
Redirect 301 /blog/2007.06.25-propaganda-makes-me-sick /posts/2007/06/propaganda-makes-me-sick
Redirect 301 /blog/2007.06.26-rtfm /posts/2007/06/rtfm
Redirect 301 /blog/2007.06.28-recent-ruby-and-rails-regales /posts/2007/06/recent-ruby-and-rails-regales
Redirect 301 /blog/2007.06.30-controlling-volume-via-the-keyboard-on-linux /posts/2007/06/controlling-volume-via-the-keyboard-on-linux
Redirect 301 /blog/2007.07.03-a-textmate-tip-for-emacs-users /posts/2007/07/a-textmate-tip-for-emacs-users
Redirect 301 /blog/2007.07.05-rushcheck-quickcheck-for-ruby /posts/2007/07/rushcheck-quickcheck-for-ruby
Redirect 301 /blog/2007.07.06-see-your-regular-expressions-in-emacs /posts/2007/07/see-your-regular-expressions-in-emacs
Redirect 301 /blog/2007.07.12-people /posts/2007/07/people
Redirect 301 /blog/2007.08.02-elschemo-boolean-logic-and-branching /posts/2007/08/elschemo-boolean-logic-and-branching
Redirect 301 /blog/2007.08.09-cheat-from-emacs /posts/2007/08/cheat-from-emacs
Redirect 301 /blog/2007.08.09-snap-crunchle-pop /posts/2007/08/snap-crunchle-pop
Redirect 301 /blog/2007.08.11-opera-is-pretty-slick /posts/2007/08/opera-is-pretty-slick
Redirect 301 /blog/2007.08.19-catch-compiler-errors-at-runtime /posts/2007/08/catch-compiler-errors-at-runtime
Redirect 301 /blog/2007.08.21-cheat-productively-in-emacs /posts/2007/08/cheat-productively-in-emacs
Redirect 301 /blog/2007.08.26-captivating-little-creatures /posts/2007/08/captivating-little-creatures
Redirect 301 /blog/2007.08.30-5-ways-to-avoid-looking-like-a-jerk-on-the-internet /posts/2007/08/5-ways-to-avoid-looking-like-a-jerk-on-the-internet
Redirect 301 /blog/2007.09.25-learning-lisp-read-pcl /posts/2007/09/learning-lisp-read-pcl
Redirect 301 /blog/2007.09.26-python-and-ruby-brain-dump /posts/2007/09/python-and-ruby-brain-dump
Redirect 301 /blog/2007.10.29-gtkpod-in-gutsy-got-you-groaning /posts/2007/10/gtkpod-in-gutsy-got-you-groaning
Redirect 301 /blog/2008.01.07-random-pet-peeve-of-the-day /posts/2008/01/random-pet-peeve-of-the-day
Redirect 301 /blog/2008.02.19-thoughts-on-arc /posts/2008/02/thoughts-on-arc
Redirect 301 /blog/2008.03.03-project-euler-code-repo-in-arc /posts/2008/03/project-euler-code-repo-in-arc
Redirect 301 /blog/2009.11.21-using-emacs-to-develop-mojo-apps-for-webos /posts/2009/11/using-emacs-to-develop-mojo-apps-for-webos
Redirect 301 /blog/2010.01.17-working-with-c-style-structs-in-ruby /posts/2010/01/working-with-c-style-structs-in-ruby
Redirect 301 /blog/2010.01.18-basics-of-the-mach-o-file-format /posts/2010/01/basics-of-the-mach-o-file-format
Redirect 301 /blog/2010.01.20-a-preview-of-mach-o-file-generation /posts/2010/01/a-preview-of-mach-o-file-generation
Redirect 301 /blog/2010.11.04-37signals-chalk-dissected /posts/2010/11/37signals-chalk-dissected
Redirect 301 /blog/2011.11.27-lights /posts/2011/11/lights
Redirect 301 /blog/2011.11.27-recovering-old-posts /posts/2011/11/recovering-old-posts
Redirect 301 /blog/2011.12.10-static-url-shortener-using-htaccess /posts/2011/12/static-url-shortener-using-htaccess
Redirect 301 /blog/2011.12.11-pure-css3-images-hmm-maybe-later /posts/2011/12/pure-css3-images-hmm-maybe-later
Redirect 301 /blog/2011.12.15-i-see-http /posts/2011/12/i-see-http
Redirect 301 /blog/2011.12.19-my-kind-of-feature-checklist /posts/2011/12/my-kind-of-feature-checklist
Redirect 301 /blog/2011.12.22-new-release-of-firefox-for-android-optimized-for-tablets /posts/2011/12/new-release-of-firefox-for-android-optimized-for-tablets
Redirect 301 /blog/2011.12.25-the-broken-pixel-theory /posts/2011/12/the-broken-pixel-theory
Redirect 301 /blog/2012.01.04-yak-shaving /posts/2012/01/yak-shaving
Redirect 301 /blog/2012.01.09-the-40-standup-desk /posts/2012/01/the-40-standup-desk
Redirect 301 /blog/2012.01.17-recovering-from-a-computer-science-education /posts/2012/01/recovering-from-a-computer-science-education
Redirect 301 /blog/2012.01.17-sopa-lives-and-mpaa-calls-protests-an-abuse-of-power /posts/2012/01/sopa-lives-and-mpaa-calls-protests-an-abuse-of-power
Redirect 301 /blog/2012.01.19-fujitsu-has-lost-their-mind /posts/2012/01/fujitsu-has-lost-their-mind
Redirect 301 /blog/2013.03.06-zelda-tones-for-ios /posts/2013/03/zelda-tones-for-ios
Redirect 301 /blog/2013.09.27-linky /posts/2013/09/linky
Redirect 301 /blog/2014.02.03-ember-structure /posts/2014/02/ember-structure

View file

@ -3,6 +3,7 @@
"subtitle": "words mean things",
"url": "http://samhuri.net",
"styles": [
"/css/normalize.css",
"/css/style.css"
],
"scripts": [
@ -15,8 +16,11 @@
"tags": [
"ember.js"
],
"author": "sjs",
"url": "/posts/2014.02.03-ember-structure",
"body": "<p>I made a diagram of an Ember app. There&rsquo;s <a href=\"http://discuss.emberjs.com/t/diagram-of-an-ember-apps-structure/4060\">a discussion about it</a> on the\n<a href=\"http://discuss.emberjs.com/\">Ember Discussion Forum</a>. Here is the source file, created with OmniGraffle: <a href=\"https://www.dropbox.com/s/onnmn1oq096hv5f/Ember%20structure.graffle\">Ember structure.graffle</a></p>\n\n<p><img src=\"/f/ember-structure.png\" alt=\"Structure of an Ember app\" /></p>\n"
"author": "Sami Samhuri",
"url": "/posts/2014/02/ember-structure",
"body": "<p>I made a diagram of an Ember app. There&rsquo;s <a href=\"http://discuss.emberjs.com/t/diagram-of-an-ember-apps-structure/4060\">a discussion about it</a> on the\n<a href=\"http://discuss.emberjs.com/\">Ember Discussion Forum</a>. Here is the source file, created with OmniGraffle: <a href=\"https://www.dropbox.com/s/onnmn1oq096hv5f/Ember%20structure.graffle\">Ember structure.graffle</a></p>\n\n<p><a href=\"/f/ember-structure.png\"><img src=\"/f/ember-structure.png\" alt=\"Structure of an Ember app\" /></a></p>\n"
},
"archive": {
"title": "Archive"
}
}

View file

@ -25,6 +25,7 @@
<% } -%>
<head>
<% if (typeof title != 'undefined') { -%>
<title><%= title %> - <%= site %></title>
<% } else { -%>
@ -32,7 +33,7 @@
<% } -%>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/gif" href="/images/s.gif">
@ -40,6 +41,7 @@
<link rel="stylesheet" href="<%= allStyles[i] %>">
<% } -%>
<link rel="author" type="text/plain" href="/humans.txt">
<link rel="alternate" type="application/rss+xml" href="/feed.xml" title="<%= site %>">
<script>
@ -59,22 +61,58 @@
</head>
<body>
<header>
<h1><a href="/"><%= site %></a></h1>
<h4>by <%= author %></h4>
<header class="primary">
<div class="title">
<h1><a href="/"><%= site %></a></h1>
<br>
<h4>By <%= author %></h4>
</div>
<nav>
<ul>
<li><a href="/archive">Archive</a></li>
<li><a href="/projects">Projects</a></li>
<li><a href="/feed.xml">RSS</a></li>
<li><a href="https://twitter.com/_sjs">Twitter</a></li>
</ul>
</nav>
<div class="clearfix"></div>
</header>
<nav>
<a href="/archive">archive</a>
<a href="/projects">projects</a>
<a href="/feed.xml">rss feed</a>
<a href="https://twitter.com/_sjs">twitter</a>
</nav>
<% if (typeof link != 'undefined') { -%>
<article class="container">
<header>
<h2><a href="<%= link %>">&rarr; <%= title %></a></h2>
<time><%= date %></time>
</header>
<%- yield %>
<p><a class="permalink" href="<%= url %>">&infin;</a></p>
</article>
<% } else if (typeof date != 'undefined') { -%>
<article class="container">
<header>
<h2><a href="<%= url %>"><%= title %></a></h2>
<time><%= date %></time>
</header>
<%- yield %>
</article>
<% } else if (typeof title != 'undefined') { -%>
<div class="container">
<h2><%= title %></h2>
<%- yield %>
<div class="clearfix">
</div>
<% } else { -%>
<div class="container">
<%- yield %>
<div class="clearfix">
</div>
<% } -%>
<%- yield %>
<footer>
Copyright &copy; 2006 - <%= new Date().getFullYear() %> <a href="mailto:<%= email %>"><%= author %></a>
<footer class="container">
&copy; 2006 - <%= new Date().getFullYear() %> <a href="mailto:<%= email %>"><%= author %></a>
</footer>
<% for (var i in allScripts) { -%>

View file

@ -1,8 +0,0 @@
<article>
<header>
<h2><a href="{{link}}">{{title}}</a></h2>
<time>{{date}}</time>
</header>
{{{body}}}
<p><a class="permalink" href="{{url}}">&infin;</a></p>
</article>

View file

@ -1,10 +1,51 @@
<ul id="index">
<% for (var slug in public.posts._data) { %>
<% var post = public.posts._data[slug] %>
<% if (slug == 'index' || slug[0] == '_' || post.hidden) continue %>
<% function pad(n) { -%>
<% return +n < 10 ? '0' + n : String(n) -%>
<% } -%>
<% var _months = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ') -%>
<% function formatDate(t) { -%>
<% var d = new Date(t) -%>
<% return _months[d.getMonth()] + ' ' + d.getDate() -%>
<% } -%>
<% function sortPosts(dir) { -%>
<% var slugs = Object.keys(dir._data) -%>
<% var posts = slugs.map(function(slug) { return dir._data[slug] }) -%>
<% posts.sort(function(a, b) { -%>
<% var t1 = a.timestamp -%>
<% var t2 = b.timestamp -%>
<% return t1 < t2 ? 1 : (t1 > t2 ? -1 : 0) -%>
<% }) -%>
<% return posts -%>
<% } -%>
<% function posts(dir, year) { -%>
<% if (!dir) return -%>
<h3><%= year %></h3>
<% for (var month = 12; month >= 1; month--) { -%>
<% var monthDir = dir[pad(month)] -%>
<% if (!monthDir) continue -%>
<ul class="archive">
<% var posts = sortPosts(monthDir) -%>
<% for (var i in posts) { -%>
<% var post = posts[i] -%>
<% if (post.hidden) continue -%>
<li>
<span class="date"><%= post.date %></span>
<a href="<%= post.url %>"><%= post.title %></a>
<% if (post.link) { -%>
<a href="<%= post.url %>">&rarr; <%= post.title %></a>
<% } else { -%>
<a href="<%= post.url %>"><%= post.title %></a>
<% } -%>
<span class="date"><%= formatDate(1000 * post.timestamp) %></span>
</li>
<% } %>
<% } -%>
</ul>
<% } -%>
<% } -%>
<% var year = new Date().getFullYear(); -%>
<% for (; year >= 2006; year--) { -%>
<% posts(public.posts[year], year) -%>
<% } -%>

View file

@ -1,140 +0,0 @@
/* phones and iPad */
@media only screen and (orientation: portrait) and (min-device-width: 768px) and (max-device-width: 1024px),
only screen and (min-device-width: 320px) and (max-device-width: 480px),
only screen and (max-device-width: 800px)
{
ul.nav { padding: 0.5em
; width: 60%
; max-width: 600px
}
ul.nav li { display: block
; font-size: 1.5em
; line-height: 1.8em
}
ul.nav li:after { content: '' }
}
/* phones */
@media only screen and (min-device-width: 320px) and (max-device-width: 480px),
handheld and (max-device-width: 800px)
{
/* common */
h1 { font-size: 2em
; margin-top: 0.5em
}
h2 { font-size: 1.3em; line-height: 1.2em }
.navbar { font-size: 0.9em }
.navbar { width: 32% }
#breadcrumbs { margin-left: 5px }
#show-posts { margin-top: 1em
; font-size: 0.8em
}
#forkme { display: none }
ul.nav { width: 80% }
ul.nav li { font-size: 1.4em
; line-height: 1.6em
}
td { font-size: 1em
; line-height: 1.1em
}
img { max-width: 100% }
#index { width: 90%
; min-width: 200px
; margin: 0.3em auto 1em
; padding: 0.5em
; font-size: 1em
}
#index li > span.date { display: block
; float: none
; color: #666
; font-size: 0.8em
}
#article h1,
article h1 { font-size: 1.6em
; line-height: 1.2em
; margin-top: 0
}
article h2 { font-size: 1.4em }
#article,
article { min-width: 310px
; margin: 0
; padding: 0.6em 0.4em
; font-size: 0.8em
}
.time,
time { font-size: 1.0em }
pre, .gist { font-size: 0.8em }
#comment-stuff { padding: 0
; margin-top: 2em
}
#comments { width: 100% }
#comment-form { width: 90%
; margin: 0 auto
}
input[type=text],
textarea { font-size: 1.2em
; width: 95%
}
input[type=submit] { font-size: 1em }
/* projects */
#info { width: 70%
; padding: 0 1em
}
#info > div { clear: left
; width: 100%
; max-width: 100%
; padding: 0.5em 0.2em 1em
; border-left: none
; font-size: 1em
}
#stats { font-size: 1em; margin-bottom: 0.5em }
footer { margin: 0
; padding: 0.5em 0
; font-size: 1em
; width: 100%
}
}
/* landscape */
@media only screen and (orientation: landscape) and (min-device-width: 768px) and (max-device-width: 1024px),
only screen and (orientation: landscape) and (min-device-width: 320px) and (max-device-width: 480px),
handheld and (orientation: landscape) and (max-device-width: 800px)
{
body { font-size: 0.8em }
}
/* iPad portrait */
@media only screen and (orientation: portrait) and (min-device-width: 768px) and (max-device-width: 1024px)
{
article > header > h1 { font-size: 1.8em }
}

View file

@ -0,0 +1,423 @@
/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
/**
* 1. Set default font family to sans-serif.
* 2. Prevent iOS text size adjust after orientation change, without disabling
* user zoom.
*/
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/**
* Remove default margin.
*/
body {
margin: 0;
}
/* HTML5 display definitions
========================================================================== */
/**
* Correct `block` display not defined in IE 8/9.
*/
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
nav,
section,
summary {
display: block;
}
/**
* 1. Correct `inline-block` display not defined in IE 8/9.
* 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
*/
audio,
canvas,
progress,
video {
display: inline-block; /* 1 */
vertical-align: baseline; /* 2 */
}
/**
* Prevent modern browsers from displaying `audio` without controls.
* Remove excess height in iOS 5 devices.
*/
audio:not([controls]) {
display: none;
height: 0;
}
/**
* Address `[hidden]` styling not present in IE 8/9.
* Hide the `template` element in IE, Safari, and Firefox < 22.
*/
[hidden],
template {
display: none;
}
/* Links
========================================================================== */
/**
* Remove the gray background color from active links in IE 10.
*/
a {
background: transparent;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
}
/* Text-level semantics
========================================================================== */
/**
* Address styling not present in IE 8/9, Safari 5, and Chrome.
*/
abbr[title] {
border-bottom: 1px dotted;
}
/**
* Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
*/
b,
strong {
font-weight: bold;
}
/**
* Address styling not present in Safari 5 and Chrome.
*/
dfn {
font-style: italic;
}
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari 5, and Chrome.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/**
* Address styling not present in IE 8/9.
*/
mark {
background: #ff0;
color: #000;
}
/**
* Address inconsistent and variable font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sup {
top: -0.5em;
}
sub {
bottom: -0.25em;
}
/* Embedded content
========================================================================== */
/**
* Remove border when inside `a` element in IE 8/9.
*/
img {
border: 0;
}
/**
* Correct overflow displayed oddly in IE 9.
*/
svg:not(:root) {
overflow: hidden;
}
/* Grouping content
========================================================================== */
/**
* Address margin not present in IE 8/9 and Safari 5.
*/
figure {
margin: 1em 40px;
}
/**
* Address differences between Firefox and other browsers.
*/
hr {
-moz-box-sizing: content-box;
box-sizing: content-box;
height: 0;
}
/**
* Contain overflow in all browsers.
*/
pre {
overflow: auto;
}
/**
* Address odd `em`-unit font size rendering in all browsers.
*/
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
/* Forms
========================================================================== */
/**
* Known limitation: by default, Chrome and Safari on OS X allow very limited
* styling of `select`, unless a `border` property is set.
*/
/**
* 1. Correct color not being inherited.
* Known issue: affects color of disabled elements.
* 2. Correct font properties not being inherited.
* 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
*/
button,
input,
optgroup,
select,
textarea {
color: inherit; /* 1 */
font: inherit; /* 2 */
margin: 0; /* 3 */
}
/**
* Address `overflow` set to `hidden` in IE 8/9/10.
*/
button {
overflow: visible;
}
/**
* Address inconsistent `text-transform` inheritance for `button` and `select`.
* All other form control elements do not inherit `text-transform` values.
* Correct `button` style inheritance in Firefox, IE 8+, and Opera
* Correct `select` style inheritance in Firefox.
*/
button,
select {
text-transform: none;
}
/**
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
* and `video` controls.
* 2. Correct inability to style clickable `input` types in iOS.
* 3. Improve usability and consistency of cursor style between image-type
* `input` and others.
*/
button,
html input[type="button"], /* 1 */
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button; /* 2 */
cursor: pointer; /* 3 */
}
/**
* Re-set default cursor for disabled elements.
*/
button[disabled],
html input[disabled] {
cursor: default;
}
/**
* Remove inner padding and border in Firefox 4+.
*/
button::-moz-focus-inner,
input::-moz-focus-inner {
border: 0;
padding: 0;
}
/**
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
* the UA stylesheet.
*/
input {
line-height: normal;
}
/**
* It's recommended that you don't attempt to style these elements.
* Firefox's implementation doesn't respect box-sizing, padding, or width.
*
* 1. Address box sizing set to `content-box` in IE 8/9/10.
* 2. Remove excess padding in IE 8/9/10.
*/
input[type="checkbox"],
input[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Fix the cursor style for Chrome's increment/decrement buttons. For certain
* `font-size` values of the `input`, it causes the cursor style of the
* decrement button to change from `default` to `text`.
*/
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
* (include `-moz` to future-proof).
*/
input[type="search"] {
-webkit-appearance: textfield; /* 1 */
-moz-box-sizing: content-box;
-webkit-box-sizing: content-box; /* 2 */
box-sizing: content-box;
}
/**
* Remove inner padding and search cancel button in Safari and Chrome on OS X.
* Safari (but not Chrome) clips the cancel button when the search input has
* padding (and `textfield` appearance).
*/
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* Define consistent border, margin, and padding.
*/
fieldset {
border: 1px solid #c0c0c0;
margin: 0 2px;
padding: 0.35em 0.625em 0.75em;
}
/**
* 1. Correct `color` not being inherited in IE 8/9.
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
*/
legend {
border: 0; /* 1 */
padding: 0; /* 2 */
}
/**
* Remove default vertical scrollbar in IE 8/9.
*/
textarea {
overflow: auto;
}
/**
* Don't inherit the `font-weight` (applied by a rule above).
* NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
*/
optgroup {
font-weight: bold;
}
/* Tables
========================================================================== */
/**
* Remove most spacing between table cells.
*/
table {
border-collapse: collapse;
border-spacing: 0;
}
td,
th {
padding: 0;
}

View file

@ -1,179 +0,0 @@
body { margin: 0
; padding: 0
}
h1 { margin: 0
; padding: 0.2em
; color: #9ab
}
.center { text-align: center
; font-size: 1.2em
}
.hidden { display: none }
#index { width: 80%
; min-width: 300px
; max-width: 800px
; border: solid 1px #999
; -moz-border-radius: 10px
; -webkit-border-radius: 10px
; border-radius: 10px
; background-color: #eee
; margin: 1em auto
; padding: 1em
; font-size: 1.2em
; line-height: 1.5em
; list-style-type: none
}
.date { float: right }
#article,
article { width: 80%
; min-width: 400px
; max-width: 800px
; margin: 0.6em auto
; font-size: 1.2em
; line-height: 1.4em
; color: #222
}
#article h1,
article h1 { text-align: left
; font-size: 2em
; line-height: 1.2em
; font-weight: normal
; color: #222
; margin: 0
; padding-left: 0
}
#article h1 a,
article h1 a { color: #222
; text-decoration: underline
; border-bottom: none
; text-shadow: #ccc 1px 1px 5px
; -webkit-transition: text-shadow 0.4s ease-in
}
#article h1 a:hover,
article h1 a:hover { text-shadow: 1px 1px 6px #ffc
; color: #000
}
#article h2,
article h2 { font-size: 1.8em
; font-weight: normal
; text-align: left
; margin: 1em 0
; padding: 0
; color: #222
}
#article h3,
article h3 { font-size: 1.6em
; font-weight: normal
}
.time,
time { color: #444
; font-size: 1.2em
}
.permalink { font-size: 1em }
.gist { font-size: 0.8em }
/* show discussion */
#sd-container { margin: 3em 0 }
input[type=submit],
#sd { border: solid 1px #999
; border-right-color: #333
; border-bottom-color: #333
; padding: 0.4em 1em
; color: #444
; background-color: #ececec
; -moz-border-radius: 5px
; -webkit-border-radius: 5px
; border-radius: 5px
; text-decoration: none
; margin: 0 2px 2px 0
}
input[type=submit]:active,
#sd:active { margin: 2px 0 0 2px
; color: #000
; background-color: #ffc
}
#comment-stuff { display: none
; color: #efefef
; margin: 0
; padding: 2em 0
}
#comments-spinner { text-align: center }
#comments { width: 70%
; max-width: 600px
; margin: 0 auto
}
.comment { color: #555
; border-top: solid 2px #ccc
; padding-bottom: 2em
; margin-bottom: 2em
}
.comment big { font-size: 2em
; font-family: Verdana, sans-serif
}
#comment-form { width: 400px
; margin: 2em auto 0
}
input[type=text],
textarea { font-size: 1.4em
; color: #333
; width: 100%
; padding: 0.2em
; border: solid 1px #999
; -moz-border-radius: 5px
; -webkit-border-radius: 5px
; border-radius: 5px
; font-family: verdana, sans-serif
}
input:focus[type=text],
textarea:focus { border: solid 1px #333 }
textarea { height: 100px }
input[type=submit] { font-size: 1.1em
; cursor: pointer
}
pre { background-color: #eeeef3
; margin: 0.5em 1em 1em
; padding: 0.5em
; border: dashed 1px #ccc
}
footer { margin: 0 auto
; padding: 0.2em 0
; border-top: solid 1px #ddd
; clear: both
; width: 80%
}
footer p { margin: 0.5em }
footer a { border-bottom: none
; color: #25c
; font-size: 1.2em
; text-decoration: none
}

View file

@ -1,63 +0,0 @@
td { font-size: 1.5em
; line-height: 1.6em
}
td:nth-child(2) { padding: 0 10px }
.highlight { font-size: 1.2em }
#stats a { text-decoration: none }
#info { text-align: center
; margin: 1em auto
; padding: 1em
; border: solid 1px #ccc
; width: 90%
; max-width: 950px
; background-color: #fff
; -moz-border-radius: 20px
; -webkit-border-radius: 20px
; border-radius: 20px
}
h4 { margin: 0.5em 0 0.7em }
#info > div { text-align: center
; font-size: 1.3em
; width: 31%
; max-width: 400px
; float: left
; display: inline
; padding: 0.5em 0.2em
; border-left: dashed 1px #aaa
}
#info > div:first-child { border-left: none }
#info ul { list-style-type: none
; text-align: center
; padding: 0
; margin: 0
}
#info li { padding: 0.2em 0
; margin: 0
}
#info > br.clear { clear: both }
#contributors-box a { line-height: 1.8em }
/* from projects/index, might not apply to projects/foo */
#gh { text-align: center }
#gh img { border: none }
span { padding: 5px }
#forkme { display: none }
#projects li p { margin: 0 }
#projects li p.description
{ font-size: 0.6em
; line-height: 1em
; color: #444
; margin-bottom: 0.5em
}
#stats a { text-decoration: none }

View file

@ -1,90 +0,0 @@
TODO: include mobile.css here, just one set of styles
body { background-color: #f7f7f7
; color: #222
; font-family: 'Helvetica Neue', Verdana, sans-serif
}
h1 { text-align: center
; font-size: 2em
; font-weight: normal
; margin: 0.8em 0 0.4em
; padding: 0
}
h2 { text-align: center
; font-size: 1.7em
; line-height: 1.1em
; font-weight: normal
; margin: 0.2em 0 1em
; padding: 0
}
a { color: #0E539C }
a.img { border: none }
.navbar { display: inline-block
; width: 33%
; font-size: 1.5em
; line-height: 1.8em
; margin: 0
; padding: 0
}
.navbar a { text-shadow: none }
#breadcrumbs a { color: #222 }
#title { text-align: center }
#archive { text-align: right }
#forkme { position: absolute
; top: 0
; right: 0
; border: none
}
ul.nav { text-align: center
; max-width: 400px
; margin: 0 auto
; padding: 1em
; border: solid 1px #ccc
; background-color: #fff
; -moz-border-radius: 20px
; -webkit-border-radius: 20px
; border-radius: 20px
}
ul.nav li { display: block
; font-size: 1.6em
; line-height: 1.8em
; margin: 0
; padding: 0
}
ul.nav li a { padding: 5px
; text-decoration: none
; border-bottom: solid 1px #fff
; text-shadow: #ccc 2px 2px 3px
}
ul.nav li a:visited { color: #227 }
ul.nav li a:hover,
ul.nav li a:active { text-shadow: #cca 2px 2px 3px
; border-bottom: solid 1px #aaa
}
ul.nav li a:active { text-shadow: none }
footer { text-align: center
; font-size: 1.2em
; margin: 1em
}
footer a { border-bottom: none }
#promote-js { margin-top: 3em
; text-align: center
}
#promote-js img { border: none }

276
public/css/style.css.less Normal file
View file

@ -0,0 +1,276 @@
/**
* Basic responsive layout from http://www.adamkaplan.me/grid/
*/
/* Small screen is the default set of styles */
@screen-medium: 40rem; /* ~ 640px */
@screen-large: 64rem; /* ~ 1024px */
html { font-size: 100%; }
@media (min-width: @screen-medium) {
html { font-size: 112%; }
}
@media (min-width: @screen-large) {
html { font-size: 120%; }
}
*, *:before, *:after {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.container {
margin: 0 auto;
max-width: 48rem;
width: 90%;
}
@media (min-width: @screen-medium) {
.column {
float: left;
padding-left: 1rem;
padding-right: 1rem;
}
.column.full { width: 100%; }
.column.two-thirds { width: 66.7%; }
.column.half { width: 50%; }
.column.third { width: 33.3%; }
.column.fourth { width: 24.95%; }
.column.flow-opposite { float: right; }
}
/**
* Modern clearfix hack
* http://nicolasgallagher.com/micro-clearfix-hack/
*/
.clearfix:before,
.clearfix:after {
content: " ";
display: table;
}
.clearfix:after {
clear: both;
}
/**
* Super barebones responsive images
*/
img {
max-width: 100%;
}
/**
* Site styles
*/
// colors
@background: #f7f7f7;
@text: #222;
@highlight: #a00;
// font weight
@weight-thin: 300;
body {
background-color: @background;
color: @text;
font-family: 'Helvetica Neue', 'Verdana', 'Roboto', sans-serif;
}
a {
color: lighten(@highlight, 5%);
}
a:visited {
color: @highlight;
}
header.primary {
background-color: darken(@text, 5%);
color: @background;
padding: 0.4rem 0.8rem;
.title {
float: left;
}
h1, h4 {
display: inline-block;
margin: 0;
padding: 0;
font-weight: @weight-thin;
}
h1 {
height: 1.3rem;
font-size: 1.3rem;
a, a:visited {
color: @background;
}
}
h4 {
height: 0.8rem;
font-size: 0.8rem;
color: darken(@background, 10%);
}
nav {
padding-top: 0.5rem;
clear: left;
@media (min-width: @screen-medium) {
float: right;
clear: none;
padding: 0.55rem 0;
height: 1rem;
font-size: 1rem;
}
a, a:visited {
color: lighten(@highlight, 15%);
}
ul {
margin: 0;
padding: 0;
@media (min-width: @screen-medium) {
font-weight: @weight-thin;
}
li {
display: inline-block;
list-style-type: none;
}
li:after {
font-weight: normal;
content: ' \2022 ';
}
li:last-child:after {
content: '';
}
} /* ul */
} /* nav */
} /* header.primary */
footer {
border-top: solid 1px lighten(@text, 70%);
padding: 1rem 0;
text-align: center;
a, a:visited {
color: @text;
}
}
/**
* Archive
*/
ul.archive {
padding-left: 0;
margin-left: 5%;
margin-bottom: 2rem;
list-style-type: none;
@media (min-width: @screen-medium) {
margin-right: 5%;
}
li {
margin: 0.8rem 0;
a {
text-decoration: none;
}
.date {
font-size: 80%;
padding-left: 0.5rem;
color: lighten(@text, 30%);
// float: right;
} /* .date */
} /* li */
} /* ul.archive */
/**
* Projects
*/
#octocat {
position: fixed;
bottom: 1rem;
width: 96%;
text-align: center;
z-index: -1;
opacity: 0.1;
@media (min-width: @screen-medium) {
right: 1rem;
width: auto;
}
}
.project-listing {
margin-bottom: 1rem;
h4, p {
margin: 0.5rem 0;
}
}
.project-stats {
text-align: center;
margin: 2rem 0;
a {
padding: 0 0.3rem;
}
}
.project-info {
h3 {
text-align: center;
margin-bottom: 0.2rem;
@media (min-width: @screen-medium) {
text-align: left;
}
}
.column {
margin-bottom: 2rem;
}
ul {
padding-left: 0;
li {
list-style-type: none;
}
}
}

10
public/humans.txt Normal file
View file

@ -0,0 +1,10 @@
/* SITE */
Site name: samhuri.net
Site URL: http://samhuri.net
Contact: sami@samhuri.net
Twitter: @_sjs
Location: Victoria, British Columbia, Canada
Standards: HTML 5, CSS 3, ES 5
Components: Mostly custom - Normalize.css - Compiled with Harp
Source: https://github.com/samsonjs/samhuri.net

View file

@ -1,9 +1,20 @@
<% var post = public._data.latest %>
<% var post = public._data.latest -%>
<article>
<header>
<h1><a href="<%= post.url %>"><%= post.title %></a></h1>
<time><%= post.date %></time>
</header>
<%- post.body %>
</article>
<% if (post.link) { -%>
<article>
<header>
<h2><a href="<%= post.link %>"><%= post.title %></a></h2>
<time><%= post.date %></time>
</header>
<%- post.body %>
<p><a class="permalink" href="<%= post.url %>">&infin;</a></p>
</article>
<% } else { -%>
<article>
<header>
<h2><a href="<%= post.url %>"><%= post.title %></a></h2>
<time><%= post.date %></time>
</header>
<%- post.body %>
</article>
<% } -%>

View file

@ -12,7 +12,7 @@ h1, h3, p, footer { text-align: center }
<footer>made by <a href=http://reddit.com/user/sjs>sjs</a></footer>
<script>
(function() {
$user = null, $answer = null;
var $user = null, $answer = null;
document.addEventListener('DOMContentLoaded', function() {
$user = document.getElementById('user');
$answer = document.getElementById('answer');

View file

@ -218,7 +218,7 @@
// Data is also available via the `data` property.
Resource.prototype.fetch = function(cb) {
if (this.data) {
cb(null, this.data)
cb.call(this, null, this.data)
}
else {
var self = this

View file

@ -24,11 +24,6 @@
}
}
function textHighlight(id, t) {
text(id, t)
document.getElementById(id).className = ' highlight'
}
function langsByUsage(langs) {
return Object.keys(langs).sort(function(a, b) {
return langs[a] < langs[b] ? -1 : 1
@ -57,23 +52,31 @@
html('langs', listify(langsByUsage(langs)))
}
function updateN(name, things) {
var pluralized = things.length == 1 ? name.replace(/s$/, '') : name
textHighlight('n' + name, things.length + ' ' + pluralized)
function updateN(name, n) {
var pluralized = n == 1 ? name : name + 's'
text('n' + name, (n == 0 ? 'no' : n) + ' ' + pluralized)
}
function updateStars(n) {
html('nstar', n + ' &#10029;')
}
var Months = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' ')
var t = data.get('t-' + SJS.projectName)
if (!t || +new Date() - t > 3600 * 1000) {
console.log('stale ' + String(t))
data.set('t-' + SJS.projectName, +new Date())
GITR.repo('samsonjs', SJS.projectName)
.fetchBranches(function(err, branches) {
var repo = GITR.repo('samsonjs', SJS.projectName)
repo
.fetch(function(err, repo) {
if (err) {
text('branches', '(oops)')
} else {
data.set('branches', branches)
updateBranches(SJS.projectName, branches)
text('updated', '(oops)')
return
}
var d = new Date(repo.updatedAt)
var updated = Months[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear()
text('updated', updated)
})
.fetchLanguages(function(err, langs) {
if (err) {
@ -93,27 +96,32 @@
})
.fetchWatchers(function(err, users) {
if (err) {
text('nwatchers', '?')
text('nstar', '?')
} else {
data.set('watchers', users)
updateN('watchers', users)
data.set('stars', users)
updateStars(users.length)
}
})
.fetchForks(function(err, repos) {
if (err) {
text('nforks', '?')
text('nfork', '?')
} else {
data.set('forks', repos)
updateN('forks', repos)
updateN('fork', repos.length)
}
})
} else {
console.log('hit ' + t + ' (' + (+new Date() - t) + ')')
updateBranches(SJS.projectName, data.get('branches'))
updateLangs(data.get('langs'))
updateContributors(data.get('contributors'))
updateN('watchers', data.get('watchers'))
updateN('forks', data.get('forks'))
try {
updateBranches(SJS.projectName, data.get('branches'))
updateLangs(data.get('langs'))
updateContributors(data.get('contributors'))
updateStars(data.get('stars').length)
updateN('fork', data.get('forks').length)
} catch (e) {
data.set('t-' + SJS.projectName, null)
initProject()
}
}
}

View file

@ -0,0 +1,178 @@
{
"first-post": {
"title": "First Post!",
"date": "February 8, 2006",
"timestamp": 1139368860,
"tags": [
"life"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/first-post"
},
"touch-screen-on-steroids": {
"title": "Touch Screen on Steroids",
"date": "February 8, 2006",
"timestamp": 1139407560,
"tags": [
"technology",
"touch"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/touch-screen-on-steroids"
},
"urban-extreme-gymnastics": {
"title": "Urban Extreme Gymnastics?",
"date": "February 15, 2006",
"timestamp": 1140028860,
"tags": [
"amusement"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/urban-extreme-gymnastics"
},
"girlfriend-x": {
"title": "Girlfriend X",
"date": "February 18, 2006",
"timestamp": 1140292200,
"tags": [
"crazy",
"funny"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/girlfriend-x"
},
"jump-to-viewcontroller-in-textmate": {
"title": "Jump to view/controller in TextMate",
"date": "February 18, 2006",
"timestamp": 1140303060,
"tags": [
"hacking",
"rails",
"textmate",
"rails",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/jump-to-viewcontroller-in-textmate"
},
"some-textmate-snippets-for-rails-migrations": {
"title": "Some TextMate snippets for Rails Migrations",
"date": "February 18, 2006",
"timestamp": 1140331680,
"tags": [
"textmate",
"rails",
"hacking",
"rails",
"snippets",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/some-textmate-snippets-for-rails-migrations"
},
"obligatory-post-about-ruby-on-rails": {
"title": "Obligatory Post about Ruby on Rails",
"date": "February 20, 2006",
"timestamp": 1140424260,
"tags": [
"rails",
"coding",
"hacking",
"migration",
"rails",
"testing"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/obligatory-post-about-ruby-on-rails",
"styles": [
"typocode"
]
},
"textmate-snippets-for-rails-assertions": {
"title": "TextMate Snippets for Rails Assertions",
"date": "February 20, 2006",
"timestamp": 1140508320,
"tags": [
"textmate",
"rails",
"coding",
"rails",
"snippets",
"testing",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/textmate-snippets-for-rails-assertions"
},
"textmate-move-selection-to-self-down": {
"title": "TextMate: Move selection to self.down",
"date": "February 21, 2006",
"timestamp": 1140510360,
"tags": [
"textmate",
"rails",
"hacking",
"hack",
"macro",
"rails",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/textmate-move-selection-to-self-down"
},
"textmate-insert-text-into-self-down": {
"title": "TextMate: Insert text into self.down",
"date": "February 21, 2006",
"timestamp": 1140562500,
"tags": [
"textmate",
"rails",
"hacking",
"commands",
"macro",
"rails",
"snippets",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/textmate-insert-text-into-self-down",
"styles": [
"typocode"
]
},
"intelligent-migration-snippets-0.1-for-textmate": {
"title": "Intelligent Migration Snippets 0.1 for TextMate",
"date": "February 22, 2006",
"timestamp": 1140607680,
"tags": [
"mac os x",
"textmate",
"rails",
"hacking",
"migrations",
"snippets"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/intelligent-migration-snippets-0.1-for-textmate"
},
"sjs-rails-bundle-0.2-for-textmate": {
"title": "SJ's Rails Bundle 0.2 for TextMate",
"date": "February 23, 2006",
"timestamp": 1140743880,
"tags": [
"textmate",
"rails",
"coding",
"bundle",
"macros",
"rails",
"snippets",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2006/02/sjs-rails-bundle-0.2-for-textmate",
"styles": [
"typocode"
]
}
}

View file

@ -0,0 +1,46 @@
{
"generate-selfdown-in-your-rails-migrations": {
"title": "Generate self.down in your Rails migrations",
"date": "March 3, 2006",
"timestamp": 1141450680,
"tags": [
"rails",
"textmate",
"migrations",
"rails",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2006/03/generate-selfdown-in-your-rails-migrations"
},
"spore": {
"title": "Spore",
"date": "March 3, 2006",
"timestamp": 1141450980,
"tags": [
"amusement",
"technology",
"cool",
"fun",
"games"
],
"author": "Sami Samhuri",
"url": "/posts/2006/03/spore"
},
"i-dont-mind-fairplay-either": {
"title": "I don't mind FairPlay either",
"date": "March 3, 2006",
"timestamp": 1141451760,
"tags": [
"apple",
"mac os x",
"life",
"drm",
"fairplay",
"ipod",
"itunes"
],
"author": "Sami Samhuri",
"url": "/posts/2006/03/i-dont-mind-fairplay-either"
}
}

View file

@ -0,0 +1,16 @@
{
"zsh-terminal-goodness-on-os-x": {
"title": "zsh terminal goodness on OS X",
"date": "April 4, 2006",
"timestamp": 1144187820,
"tags": [
"mac os x",
"apple",
"osx",
"terminal",
"zsh"
],
"author": "Sami Samhuri",
"url": "/posts/2006/04/zsh-terminal-goodness-on-os-x"
}
}

View file

@ -0,0 +1,34 @@
{
"os-x-and-fitts-law": {
"title": "OS X and Fitt's law",
"date": "May 7, 2006",
"timestamp": 1147059780,
"tags": [
"mac os x",
"apple",
"mac",
"os",
"usability",
"x"
],
"author": "Sami Samhuri",
"url": "/posts/2006/05/os-x-and-fitts-law"
},
"wikipediafs-on-linux-in-python": {
"title": "WikipediaFS on Linux, in Python",
"date": "May 7, 2006",
"timestamp": 1147060140,
"tags": [
"hacking",
"python",
"linux",
"fuse",
"linux",
"mediawiki",
"python",
"wikipediafs"
],
"author": "Sami Samhuri",
"url": "/posts/2006/05/wikipediafs-on-linux-in-python"
}
}

View file

@ -0,0 +1,52 @@
{
"ich-bin-auslnder-und-spreche-nicht-gut-deutsch": {
"title": "Ich bin Ausländer und spreche nicht gut Deutsch",
"date": "June 5, 2006",
"timestamp": 1149527460,
"tags": [
"life",
"munich",
"seekport",
"work"
],
"author": "Sami Samhuri",
"url": "/posts/2006/06/ich-bin-auslnder-und-spreche-nicht-gut-deutsch"
},
"never-buy-a-german-keyboard": {
"title": "Never buy a German keyboard!",
"date": "June 9, 2006",
"timestamp": 1149841020,
"tags": [
"apple",
"apple",
"german",
"keyboard"
],
"author": "Sami Samhuri",
"url": "/posts/2006/06/never-buy-a-german-keyboard"
},
"theres-nothing-regular-about-regular-expressions": {
"title": "There's nothing regular about regular expressions",
"date": "June 10, 2006",
"timestamp": 1149928080,
"tags": [
"technology",
"book",
"regex"
],
"author": "Sami Samhuri",
"url": "/posts/2006/06/theres-nothing-regular-about-regular-expressions"
},
"apple-pays-attention-to-detail": {
"title": "Apple pays attention to detail",
"date": "June 11, 2006",
"timestamp": 1150014600,
"tags": [
"technology",
"mac os x",
"apple"
],
"author": "Sami Samhuri",
"url": "/posts/2006/06/apple-pays-attention-to-detail"
}
}

View file

@ -0,0 +1,72 @@
{
"working-with-the-zend-framework": {
"title": "Working with the Zend Framework",
"date": "July 6, 2006",
"timestamp": 1152196560,
"tags": [
"coding",
"technology",
"php",
"framework",
"php",
"seekport",
"zend"
],
"author": "Sami Samhuri",
"url": "/posts/2006/07/working-with-the-zend-framework"
},
"ubuntu-linux-for-linux-users-please": {
"title": "Ubuntu: Linux for Linux users please",
"date": "July 13, 2006",
"timestamp": 1152804840,
"tags": [
"linux",
"linux",
"ubuntu"
],
"author": "Sami Samhuri",
"url": "/posts/2006/07/ubuntu-linux-for-linux-users-please"
},
"ruby-and-rails-have-spoiled-me-rotten": {
"title": "Ruby and Rails have spoiled me rotten",
"date": "July 17, 2006",
"timestamp": 1153140000,
"tags": [
"rails",
"ruby",
"php",
"coding",
"framework",
"php",
"rails",
"ruby",
"zend"
],
"author": "Sami Samhuri",
"url": "/posts/2006/07/ruby-and-rails-have-spoiled-me-rotten"
},
"late-static-binding": {
"title": "Late static binding",
"date": "July 19, 2006",
"timestamp": 1153329780,
"tags": [
"php",
"coding",
"coding",
"php"
],
"author": "Sami Samhuri",
"url": "/posts/2006/07/late-static-binding"
},
"class-method-instance-method-it-doesnt-matter-to-php": {
"title": "Class method? Instance method? It doesn't matter to PHP",
"date": "July 21, 2006",
"timestamp": 1153493760,
"tags": [
"php",
"coding"
],
"author": "Sami Samhuri",
"url": "/posts/2006/07/class-method-instance-method-it-doesnt-matter-to-php"
}
}

View file

@ -0,0 +1,13 @@
{
"where-are-my-headphones": {
"title": "Where are my headphones?",
"date": "August 22, 2006",
"timestamp": 1156257060,
"tags": [
"life",
"seekport"
],
"author": "Sami Samhuri",
"url": "/posts/2006/08/where-are-my-headphones"
}
}

View file

@ -0,0 +1,26 @@
{
"buffalo-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo": {
"title": "Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo",
"date": "September 16, 2006",
"timestamp": 1158469860,
"tags": [
"amusement",
"buffalo"
],
"author": "Sami Samhuri",
"url": "/posts/2006/09/buffalo-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo-buffalo",
"link": "http://en.wikipedia.org/wiki/Buffalo_buffalo_buffalo_buffalo_buffalo_buffalo_buffalo_buffalo"
},
"some-features-you-might-have-missed-in-itunes-7": {
"title": "Some features you might have missed in iTunes 7",
"date": "September 22, 2006",
"timestamp": 1158969540,
"tags": [
"apple",
"apple",
"itunes"
],
"author": "Sami Samhuri",
"url": "/posts/2006/09/some-features-you-might-have-missed-in-itunes-7"
}
}

View file

@ -1,3 +1 @@
Wouldn't the sentence 'I want to put a hyphen between the words Fish and And and And and Chips in my Fish-And-Chips sign' have been clearer if quotation marks had been placed before Fish, and between Fish and and, and and and And, and And and and, and and and And, and And and and, and and and Chips, as well as after Chips?
<a href="http://en.wikipedia.org/wiki/Buffalo_buffalo_buffalo_buffalo_buffalo_buffalo_buffalo_buffalo">Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo</a>

View file

@ -0,0 +1,16 @@
{
"coping-with-windows-xp-activiation-on-a-mac": {
"title": "Coping with Windows XP activiation on a Mac",
"date": "December 17, 2006",
"timestamp": 1166427000,
"tags": [
"parallels",
"windows",
"apple",
"mac os x",
"bootcamp"
],
"author": "Sami Samhuri",
"url": "/posts/2006/12/coping-with-windows-xp-activiation-on-a-mac"
}
}

View file

@ -0,0 +1,40 @@
{
"full-screen-cover-flow": {
"title": "Full-screen Cover Flow",
"date": "March 6, 2007",
"timestamp": 1173217860,
"tags": [
"apple",
"coverflow",
"itunes"
],
"author": "Sami Samhuri",
"url": "/posts/2007/03/full-screen-cover-flow"
},
"digg-v4-reply-to-replies-greasemonkey-script": {
"title": "Digg v4: Reply to replies (Greasemonkey script)",
"date": "March 8, 2007",
"timestamp": 1173424740,
"tags": [
"coding",
"digg",
"firefox",
"userscript"
],
"author": "Sami Samhuri",
"url": "/posts/2007/03/digg-v4-reply-to-replies-greasemonkey-script"
},
"diggscuss-0.9": {
"title": "Diggscuss 0.9",
"date": "March 25, 2007",
"timestamp": 1174834980,
"tags": [
"coding",
"digg",
"firefox",
"userscript"
],
"author": "Sami Samhuri",
"url": "/posts/2007/03/diggscuss-0.9"
}
}

View file

@ -0,0 +1,58 @@
{
"a-triple-booting-schizophrenic-macbook": {
"title": "A triple-booting, schizophrenic MacBook",
"date": "April 4, 2007",
"timestamp": 1175754600,
"tags": [
"linux",
"mac os x",
"windows"
],
"author": "Sami Samhuri",
"url": "/posts/2007/04/a-triple-booting-schizophrenic-macbook"
},
"activerecord-base.find_or_create-and-find_or_initialize": {
"title": "ActiveRecord::Base.find_or_create and find_or_initialize",
"date": "April 11, 2007",
"timestamp": 1176287040,
"tags": [
"activerecord",
"coding",
"rails",
"ruby"
],
"author": "Sami Samhuri",
"url": "/posts/2007/04/activerecord-base.find_or_create-and-find_or_initialize"
},
"getting-to-know-vista": {
"title": "Getting to know Vista",
"date": "April 16, 2007",
"timestamp": 1176746940,
"tags": [
"windows"
],
"author": "Sami Samhuri",
"url": "/posts/2007/04/getting-to-know-vista"
},
"quickly-inserting-millions-of-rows-with-mysql-innodb": {
"title": "Quickly inserting millions of rows with MySQL/InnoDB",
"date": "April 26, 2007",
"timestamp": 1177596360,
"tags": [
"linux",
"mysql"
],
"author": "Sami Samhuri",
"url": "/posts/2007/04/quickly-inserting-millions-of-rows-with-mysql-innodb"
},
"funny-how-code-can-be-beautiful": {
"title": "Funny how code can be beautiful",
"date": "April 30, 2007",
"timestamp": 1177942020,
"tags": [
"haskell"
],
"author": "Sami Samhuri",
"url": "/posts/2007/04/funny-how-code-can-be-beautiful"
}
}

View file

@ -0,0 +1,146 @@
{
"typo-and-i-are-friends-again": {
"title": "Typo and I are friends again",
"date": "May 1, 2007",
"timestamp": 1178081497,
"tags": [
"typo"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/typo-and-i-are-friends-again"
},
"a-scheme-parser-in-haskell-part-1": {
"title": "A Scheme parser in Haskell: Part 1",
"date": "May 3, 2007",
"timestamp": 1178178470,
"tags": [
"coding",
"haskell"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/a-scheme-parser-in-haskell-part-1"
},
"gotta-love-the-ferry-ride": {
"title": "Gotta Love the Ferry Ride",
"date": "May 5, 2007",
"timestamp": 1178364300,
"tags": [
"life",
"photo",
"bc",
"victoria"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/gotta-love-the-ferry-ride"
},
"a-new-way-to-look-at-networking": {
"title": "A New Way to Look at Networking",
"date": "May 5, 2007",
"timestamp": 1178406600,
"tags": [
"technology",
"networking"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/a-new-way-to-look-at-networking"
},
"dtrace-ruby-goodness-for-sun": {
"title": "dtrace + Ruby = Goodness for Sun",
"date": "May 9, 2007",
"timestamp": 1178725500,
"tags": [
"ruby",
"dtrace",
"sun"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/dtrace-ruby-goodness-for-sun"
},
"i-cant-wait-to-see-what-matt-stone-trey-parker-do-with-this": {
"title": "I Can't Wait to See What Trey Parker & Matt Stone Do With This",
"date": "May 9, 2007",
"timestamp": 1178746440,
"tags": [
"crazy"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/i-cant-wait-to-see-what-matt-stone-trey-parker-do-with-this"
},
"rails-plugins-link-dump": {
"title": "Rails Plugins (link dump)",
"date": "May 10, 2007",
"timestamp": 1178756520,
"tags": [
"rails"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/rails-plugins-link-dump"
},
"enumerable-pluck-and-string-to_proc-for-ruby": {
"title": "Enumurable#pluck and String#to_proc for Ruby",
"date": "May 10, 2007",
"timestamp": 1178838840,
"tags": [
"ruby",
"extensions"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/enumerable-pluck-and-string-to_proc-for-ruby"
},
"dumping-objects-to-the-browser-in-rails": {
"title": "Dumping Objects to the Browser in Rails",
"date": "May 15, 2007",
"timestamp": 1179261480,
"tags": [
"rails"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/dumping-objects-to-the-browser-in-rails"
},
"cheating-at-life-in-general": {
"title": "Cheating at Life in General",
"date": "May 16, 2007",
"timestamp": 1179308760,
"tags": [
"cheat",
"vim",
"emacs",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/cheating-at-life-in-general"
},
"iphone-humour": {
"title": "iPhone Humour",
"date": "May 18, 2007",
"timestamp": 1179513240,
"tags": [
"apple",
"funny",
"iphone"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/iphone-humour"
},
"inspirado": {
"title": "Inspirado",
"date": "May 22, 2007",
"timestamp": 1179865380,
"tags": [
"rails",
"inspirado"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/inspirado"
},
"finnish-court-rules-css-ineffective-at-protecting-dvds": {
"title": "Finnish court rules CSS ineffective at protecting DVDs",
"date": "May 26, 2007",
"timestamp": 1180175040,
"tags": [
"drm"
],
"author": "Sami Samhuri",
"url": "/posts/2007/05/finnish-court-rules-css-ineffective-at-protecting-dvds"
}
}

View file

@ -0,0 +1,179 @@
{
"301-moved-permanently": {
"title": "301 moved permanently",
"date": "June 8, 2007",
"timestamp": 1181350800,
"tags": [
"life"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/301-moved-permanently"
},
"so-long-typo-and-thanks-for-all-the-timeouts": {
"title": "so long typo (and thanks for all the timeouts)",
"date": "June 8, 2007",
"timestamp": 1181350860,
"tags": [
"mephisto",
"typo"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/so-long-typo-and-thanks-for-all-the-timeouts"
},
"more-scheming-with-haskell": {
"title": "More Scheming with Haskell",
"date": "June 14, 2007",
"timestamp": 1181783340,
"tags": [
"coding",
"haskell",
"scheme"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/more-scheming-with-haskell"
},
"testspec-on-rails-declared-awesome-just-one-catch": {
"title": "test/spec on rails declared awesome, just one catch",
"date": "June 14, 2007",
"timestamp": 1181830860,
"tags": [
"bdd",
"rails",
"test/spec"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/testspec-on-rails-declared-awesome-just-one-catch"
},
"begging-the-question": {
"title": "Begging the question",
"date": "June 15, 2007",
"timestamp": 1181933340,
"tags": [
"english",
"life",
"pedantry"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/begging-the-question"
},
"back-on-gentoo-trying-new-things": {
"title": "Back on Gentoo, trying new things",
"date": "June 18, 2007",
"timestamp": 1182215100,
"tags": [
"emacs",
"gentoo",
"linux",
"vim"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/back-on-gentoo-trying-new-things"
},
"reinventing-the-wheel": {
"title": "Reinventing the wheel",
"date": "June 20, 2007",
"timestamp": 1182356820,
"tags": [
"emacs",
"snippets"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/reinventing-the-wheel"
},
"embrace-the-database": {
"title": "Embrace the database",
"date": "June 22, 2007",
"timestamp": 1182507240,
"tags": [
"activerecord",
"rails",
"ruby"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/embrace-the-database"
},
"emacs-for-textmate-junkies": {
"title": "Emacs for TextMate junkies",
"date": "June 23, 2007",
"timestamp": 1182565020,
"tags": [
"emacs",
"textmate"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/emacs-for-textmate-junkies"
},
"floating-point-in-elschemo": {
"title": "Floating point in ElSchemo",
"date": "June 24, 2007",
"timestamp": 1182711180,
"tags": [
"elschemo",
"haskell",
"scheme"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/floating-point-in-elschemo"
},
"propaganda-makes-me-sick": {
"title": "Propaganda makes me sick",
"date": "June 25, 2007",
"timestamp": 1182768900,
"tags": [
"propaganda"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/propaganda-makes-me-sick"
},
"rtfm": {
"title": "RTFM!",
"date": "June 26, 2007",
"timestamp": 1182806340,
"tags": [
"emacs",
"rtfm"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/rtfm"
},
"emacs-tagify-region-or-insert-tag": {
"title": "Emacs: tagify-region-or-insert-tag",
"date": "June 25, 2007",
"timestamp": 1182809580,
"tags": [
"emacs",
"tagify"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/emacs-tagify-region-or-insert-tag"
},
"recent-ruby-and-rails-regales": {
"title": "Recent Ruby and Rails Regales",
"date": "June 28, 2007",
"timestamp": 1183058580,
"tags": [
"rails",
"rails on rules",
"regular expressions",
"ruby",
"sake",
"secure associations",
"regex"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/recent-ruby-and-rails-regales"
},
"controlling-volume-via-the-keyboard-on-linux": {
"title": "Controlling volume via the keyboard on Linux",
"date": "June 30, 2007",
"timestamp": 1183245180,
"tags": [
"alsa",
"linux",
"ruby",
"volume"
],
"author": "Sami Samhuri",
"url": "/posts/2007/06/controlling-volume-via-the-keyboard-on-linux"
}
}

Some files were not shown because too many files have changed in this diff Show more