Posted by matijs
Sun, 27 Jun 2010 21:10:00 GMT
In some of my Rails projects, I have been a contented user of the memory_test_fix plugin. However, I rather dislike the use of Rails plugins, because I find updating them later on rather difficult, and I don’t like including external libraries in my own source tree (hence, I don’t like the practice of vendoring gems much either). When the concept of ‘gem plugins’ was introduced, I created a fork on github and created the necessary files to build the plugin as a gem, and have Rails properly load it.
Somehow I never got around to seeing if all this actually worked. However, recently I revisited an old project that I never quite finished, updated it to Rails 2.3.8, and decided to try replacing the memory_test_fix plugin code it included with a simple call to config.gem. It worked fine.
After incorporating a patch to allow the use of in-memory databases for any environment (use for development and production is of course not recommended), the gem is now at version 0.1.3, and has been pushed to gemcutter.
From the README:
Install the gem:
gem install memory_test_fix
In your config/environments.rb, use:
config.gem 'memory_test_fix'
In your database.yml, use:
test:
adapter: sqlite3
database: ":memory:"
It runs much faster!
This makes me the official maintainer of this gem, which may not be ideal in the long run, since I’m not really the main author of this code. Feel free to ask me for access or to contact me to discuss other options.
Posted in software | Tags gem, memory_test_fix, plugin, rails, ruby | no comments | no trackbacks
Posted by matijs
Thu, 15 Apr 2010 05:42:00 GMT
You can implement a programming language in assembly. C is an example. This
has the advantage of being able to leave your language and use assembly
when necessary. You drop down to assembly for speed.
You can also implement a programming language in lisp. CLPython is an
example. This has the advantage of being able to leave your language and
use lisp when necessary. You drop down to lisp for expressiveness.
If lisp is the ultimate language, does this not make it the best option for
implementing other languages?
Posted in software | Tags design, language, lisp | no comments | no trackbacks
Posted by matijs
Sun, 11 Apr 2010 12:22:00 GMT
Because URL shortening services can go away at any time, I decided
to install my own. In the spirit of your-own-dogfood, and to make hacking
it as enjoyable as possible, it had to be in Ruby (this ruled out
YOURLS, which otherwise does exactly what I want). There are tons
of URL shortening projects in Ruby on GitHub. Unfortunately, they all
lacked one feature: password protection for the adding of URLs. In the end,
I picked a nice simple one and changed it to my liking. The result can be
found in my fork of turl.
Why is this safer than using one of the existing services? The reason tr.im
went under is that they couldn't make it pay for itself, and there was a
lot of abuse from spammers. Both problems are absent for my own service: I
don't need to make any money off of it, and I'm the only one who can create
new short URLs.
Some observations on developing this software:
For a small project like this, putting everything in one file is very,
very nice. Ramaze allows you to do this (as do other frameworks),
Ruby on Rails does not. I wonder how seamless the transition is if
your project starts small like this and then gradually becomes big enough
that you need to split it into different files.
Ramaze's documentation needs some love. Everything is documented well in
principle, but with the split-off of the innate library, it took me
ages to find the documentation for the a method and friends.
I really like the idea of [Sequel][sq]::Model where you define the
table schema right in the model. I'm not sure how or how well it works
with migrations, but for a small project like this, it's nice and clean.
Ramaze could use some more options for session storage. In particular,
something file-based shouldn't be too much to ask for. I'm using the
LocalMemCache option, and keep having to log in.
I really like Ramaze, and am eager to try Sinatra. I have been
ignoring these more light-weight frameworks for far too long.
Posted in software, web | Tags ramaze, ruby, shorten | no comments | no trackbacks
Posted by matijs
Thu, 18 Feb 2010 19:15:00 GMT
Efficiency without ethics is psychopathic
Pecking Order by Peter Lennox via Kottke
Posted in world | Tags chicken, efficiency, ethics, quote | no comments | no trackbacks
Posted by matijs
Tue, 02 Feb 2010 09:20:00 GMT
Daring Fireball quotes Zeldman:
Flash won’t die tomorrow, but plug-in technology is on its way out.
Exactly. And good riddance.
Posted in software, web | Tags browser, flash, ins, ipad, plug | no comments | no trackbacks
Posted by matijs
Sun, 31 Jan 2010 12:18:00 GMT
Today I got an email from someone using a hotmail account. At the bottom was the following text:
Hotmail: Trusted email with Microsoft’s powerful SPAM protection.
Sign up now.
The text “Sign up now” links to a URL that is completely opaque. Not in the old-style non-Web-2.0 company website way, where at least the domain name would tell you it’s a legitimate link to one of the company’s websites. No, it’s domain part was clk.atdmt.com.
If we/they/whoever expect people to click such links, how can we ever expect people stop clicking links like http://hotmail.com.xdfsf.cn/please/hack/me/totally?
It’s almost as bad as training people to give their email login and password to any site that asks them to.
Posted in web | no comments | no trackbacks
Posted by matijs
Fri, 29 Jan 2010 12:47:00 GMT
Learning about monads is hard, and there seems to be no magic pill. Probably one reason is that they have several different uses. Many articles focus on one of those uses, making it hard to get the whole picture. On the other hand, articles that try to directly explain what monads are leave the reader wandering what they're good for. Some links.
- Brent Yorgey argues that any shortcut by focusing on a particular metaphor (e.g., monads are like burritos) will not work.
- Mark Dominus argues why monads are indeed like burritos.
- [Monads as Containers][cont] fits in nicely by abstracting away from burritos (or space suits) to containers. It goes on to talk about how this relates to IO and other uses for monads. I'm still working on reading through this article.
- sigfpe starts from the other end, showing how certain needs could automatically lead to monads. I haven't finished that one either, but so far it's been very insightful.
- I also found The Continuation Monad in Clojure very insightful. Again, it focuses more in the use and implementation, rather than abstract theory. I'm not yet sure whether the insights I myself got from it are actually correct. More on that later, perhaps.
Posted in software | no comments | no trackbacks
Posted by matijs
Sun, 13 Dec 2009 18:58:00 GMT
The Problem
You have been running a Typo blog since 2005, but you still can’t
quite get your Apache configuration right. In particular, you still get the
occasional
Not found: http://www.matijs.net/blog/2005/07.html/24/from-bryar-to-typo
Note the weird 07.html part.
The Solution
This particular message turns up if you have turned the MultiViews option
on: The file 07.html was cached earlier, and Apache finds it a good
candidate for the 07 part of the URL. Of course it can’t find a
subdirectory 24 inside that file! I personally consider this behavior
extremely weird, but that doesn’t make it go away.
The solution is to turn off MultiViews and implement a poor man’s version
that does no more than what’s needed.
# Turn off MultiViews
<Directory /var/www/www.matijs.net/public>
Options FollowSymLinks -MultiViews
</Directory>
# Rewriting must be on
RewriteEngine on
# Implement simplistic MultiViews in the blog sub-uri
RewriteCond %{QUERY_STRING} "^$"
RewriteRule ^/blog/?$ /blog/index.html [QSA,L]
RewriteCond %{QUERY_STRING} "^$"
RewriteRule ^/blog([^.]+)/?$ /blog$1.html [QSA,L]
# Implement simplistic MultiViews elsewhere (static content)
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
RewriteRule ^([^.]*)$ $1/index.html [QSA,L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.html -f
RewriteRule ^([^.]*)$ $1.html [QSA,L]
That ‘s it.
Some notes:
The mapping to html files is implemented differently in the $/blog$
sub-uri than elsewhere. In the static part of the site, if there’s an
URI /some/where, and and URI /some/where/else, this is stored on
disk as /some/where/index.html and /some/where/else.html,
respectively. In the blog part, Rails’ static caching system uses
/some/where.html and /some/where/else.html.
Turning on MultiViews for the static part of the site is not possible,
since turning it off for the blog then does not seem to work. This may
have something to do with the directory layout demanded by Passenger.
It’s easy to get this wrong and cause Apache to never see the cached
files. It’s also easy to get this wrong in other ways.
The QSA part is probably not necessary. Call its presence a case of
cargo-cult configuration.
If your blog is not in the sub-URL blog you’ll have to change things,
of course. Good luck.
Posted in software, meta, howto | Tags apache, typo | no comments | no trackbacks
Posted by matijs
Sun, 29 Nov 2009 10:56:00 GMT
We recently returned from a trip to visit Naoko’s parents in Tokyo. We took
lots of pictures. Here are some of them.

A nice bowl of ramen with creamy broth, crunchy bean sprouts and delicious
soft pork. I love ramen.

A wedding at Meiji Shrine. We went to the shrine during
Shichi-Go-San, so there were lots of little girls and a couple of
little boys all dressed up in kimono. Our daughter, having just
turned three, was one of them.

Of course, it is the season of beautiful autumn leaves. It is actually
quite hard to capture the beauty of these maples.

This picture of a female Nephila clavata spider was taken near
Chichibu. This one measured about 6 or 7 cm diameter
(including legs). One of the locals told us that they let the spiders fight
each other for entertainment. Of the locals, that is.

A pile of small raw octopus at the famous Tsukiji fish market,
which I finally managed to visit.
Posted in life | Tags japan, photos | no comments | no trackbacks
Posted by matijs
Sun, 25 Oct 2009 11:25:00 GMT
I run rake spec and get:
Test::Unit::AssertionFailedError in 'XmlController test_bad_format'
Expected response to be a <:missing>, but was <301>
/var/lib/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/test_case.rb:114:in `clean_backtrace'
./spec/controllers/xml_controller_spec.rb:152:in `test_bad_format'
So, things fail in xml_controller_spec, right? So, I run:
./script/spec spec/controllers/xml_controller_spec.rb
And I get this:
27 examples, 0 failures
WTF??
Yes, this turns out to be due to the fact that the spec in question was in its original form as migrated from Test::Unit. But that’s not really an excuse: Either Test::Unit style tests work in RSpec, or they don’t. They shouldn’t work some of the time. Now I suddenly can’t trust any of the Test::Unit style tests in Typo anymore: Are they passing because the code works, or because of some mystical internal RSpec magic?
I am mass-replacing lines of def test_bla_bla by it "test_bla_bla" do right now.
Posted in software | no comments | no trackbacks