code logs -> 2008 -> Fri, 18 Jan 2008< code.20080117.log - code.20080119.log >
--- Log opened Fri Jan 18 00:00:54 2008
00:16 * McMartin now has Macbook Pro
00:16
< McMartin>
Now taking suggestions on names.
00:17
< Vornicus>
Mephistopheles
00:17 * McMartin is leaning Towards "Carlsbad", both for the caverns, and because it's one of San Diego's minor subcities that is Not Vista.
00:18
< Vornicus>
Lobashevsky
00:24
<@ToxicFrog>
I've found a bug in Lua!
00:28
< Vornicus>
Sweet.
00:30 Vornicus is now known as Finerty
00:35 * ToxicFrog deploys extra r0xx0r
00:41
< McMartin>
What is this bug?
00:42
< Finerty>
from #lua: <ToxicFrog> string.gsub(str, pattern, replacement, math.huge) does no replacements, as though you'd passed in 0 as n.
00:43
<@ToxicFrog>
More generally, lua_number2int drops numbers greater than UINT_MAX to 0, so using math.huge, 2^32, etc as the number of replacements to perform instead does no replacement.
00:49
< McMartin>
Aha
00:52 Derakon[AFK] is now known as Derakon
00:52
< Derakon>
Well, that could have gone better. :\
00:53
< Derakon>
Had a phone screen from Autodesk from a guy who actually does programming...and he leaps out with "what's the difference between JSP and a servlet" and "what's the difference between ArrayList and Vector" when I haven't done any Java in over a year now.
00:53 * Derakon shakes his fist at having done nothing but Perl hacks for the last year.
00:55
< McMartin>
... the difference between ArrayList and Vector is that You Don't Use Vector.
00:56
< McMartin>
IIRC, Vector these days is a compatibility wrapper around ArrayList, though IMNRC.
00:56 * Derakon nods.
00:56
< Derakon>
I tried to emphasize that I Don't Code Without References, but I'm not certain how much that will help. :(
00:56
< Derakon>
And I was so ready for the "How would you design an elevator controller?" kind of question, too!
00:56
< McMartin>
The difference between JSPs and Servlets is subtler than I'd like in an interview situation.
00:56
< Derakon>
Well, he asked because I called out a JSP app I'd written a year ago as my biggest accomplishment at Amazon.
00:57
< Derakon>
Which should tell you something about what light I hold the last year in.
00:57
< McMartin>
Heh.
00:57
< McMartin>
(JSPs compile to servlets. Servlets are the basic component class for server-side Java, and the meat upon which my deadly AIs feast)
00:57
< Derakon>
Heh.
00:58
< Derakon>
I pointed out that I'd spent the last year working in Perl...he noted he has no experience in Perl. This does not make a good framework for a nitty-gritty technical discussion.
00:58
< Derakon>
From Java's docs on the ArrayList class: "(This class is roughly equivalent to Vector, except that it is unsynchronized.)"
00:58
< McMartin>
Also, IMNSHO, using JSPs or servlets directly is a bad idea except for the simplest of cases.
00:58
< Derakon>
Which I assume has some meaning in a multithreaded environment...
00:59
< McMartin>
Almost.
00:59
< McMartin>
One of the reasons Vector is deprecated is because what people thought "thread-safe" meant back then wasn't.
00:59 * Derakon Googles for "Java synchronicity", gets "Synchronicity of volcanism on Ontong, Java, and manihiki plateaux with global oceanographic events"
00:59
< McMartin>
There were still plenty of opportunities for local caching to hose you, and the "guarantees" made by Java's library are not only nothing of the sort, no guarantees are possible. Ever.
01:00
< McMartin>
Search for "synchronized".
01:00
< McMartin>
That's the keyword.
01:00
< Derakon>
Roight.
01:00
< McMartin>
Basically, locks that automatically fail to deadlock on themselves and unlock themselves once the method is over.
01:00
< McMartin>
Or the code block.
01:00
< Derakon>
Cool.
01:00
< Derakon>
...the example includes a synchronized accessor. Why?
01:01
< McMartin>
Link?
01:01
< Derakon>
...I need voice to send URLs.
01:01 mode/#code [+o Derakon] by ToxicFrog
01:01 mode/#code [+o Derakon] by ChanServ
01:01
<@Derakon>
http://java.sun.com/docs/books/tutorial/essential/concurrency/syncmeth.html
01:01
<@Derakon>
There we go.
01:01
<@ToxicFrog>
Re "no guarantees are possible, ever"...um, we have a problem then.
01:01
< McMartin>
TF: Indeed we do.
01:01
< McMartin>
This is one reason I'm really skeptical about the OMG MULTICORES thing.
01:02
< McMartin>
Oh, and by "no guarantees are possible" I mean "the client can always fuck up a library if it gets to have threads itself."
01:02
<@ToxicFrog>
For one thing, this implies that all sychronization primitives in, say, pthreads are unreliable.
01:02
<@Derakon>
Hrm...okay, so if you call a synchronized methods, all other synchronized methods block until you're done?
01:02
<@ToxicFrog>
Which in turn completely hoses a bunch of my pet projects.
01:02
<@ToxicFrog>
And, err, all the systems I use on a daily basis.
01:02
< McMartin>
Derakon: No, only those synchronized methods in that calss.
01:02
<@Derakon>
Er, right, that's what I meant.
01:03
< McMartin>
TF: They're unreliable if you let anybody write to it.
01:03
< McMartin>
But you knew that, because people are idiots, in general.
01:03
<@ToxicFrog>
...what do you mean "let anybody write to it"?
01:03
< McMartin>
The belief was that by properly putting locks into the Java standard library, you wouldn't be able to get race conditions wihtin the standard library no matter how heavily clients abused it.
01:03
< McMartin>
And that turns out to be impossible unless you make java.lang.Thread package private.
01:04
<@ToxicFrog>
Aah.
01:04
< McMartin>
It's the "no matter how heavily clients abuse it" that's the impossible part.
01:04
< McMartin>
It's possible to write safe threaded code.
01:04
<@ToxicFrog>
So what you're saying is not "safe threading is inherently impossible", but that threading libraries which guarantee safety under all conditions are.
01:04
<@Derakon>
Sure. We learned how in college, on C.
01:04
< McMartin>
You just have to, well, write safe threaded code, at all levels.
01:04
<@ToxicFrog>
That makes much more sense.
01:04
< McMartin>
YEah.
01:04
< McMartin>
And actually, I think you can make stronger guarantees if you're stateless.
01:05
< McMartin>
BEcause then you only have to stop deadlocks, and all the breakages I know are stateful race conditions.
01:05 * ToxicFrog ponders
01:05
< McMartin>
Haskell: The Next Major Gaming Language.
01:05
< McMartin>
>_>
01:05
<@Derakon>
Heh.
01:05
< McMartin>
(The specific exploit involved caching the length of a StringBuffer in a local variable and then relying on it)
01:05
<@ToxicFrog>
Using message-passing, I think you can guarantee no deadlocks by ensuring that the pass graph is a DAG.
01:06 * Derakon looks up Haskell on Wikipedia. "...what in blazes kind of logo is that?"
01:06
<@ToxicFrog>
Well, unless you're implementing mutexes on top of it or something...
01:06
<@ToxicFrog>
Ok, never mind.
01:06
< McMartin>
Derakon: IIRC, it's a combination of the notation symbols for anonymous functions and the currying operator.
01:07
<@Derakon>
I'm just saying it makes a poor logo.
01:07
< Finerty>
It is rather a poor logo.
01:07
<@Derakon>
Also, please to not ask me about continuations, currying, or the like on interviews. ¬.¬
01:07
< McMartin>
The "Influenced" list speaks for itself.
01:07
<@Derakon>
Because that is theoretical compsci that I only barely got through.
01:07
< McMartin>
... if you're working somewhere where you need continuations, you probably don't want to work there.
01:07
<@ToxicFrog>
Curry is delicious.
01:08
<@Derakon>
That too.
01:08
< McMartin>
Curry is delicious.
01:08
< Finerty>
mmm, curry.
01:08
<@ToxicFrog>
In both senses.
01:08
<@ToxicFrog>
Unlimited continuations are awesome but scary.
01:08
< McMartin>
But it's hazardous to learn it because then you start missing it everywhere it isn't.
01:08 * Finerty ponders: curry cake.
01:08
<@Derakon>
(also also, apparently Autodesk, or at least the place I'm interviewing for, uses an open office floorplan)
01:08
<@ToxicFrog>
Limited continuations are damn useful.
01:08
<@ToxicFrog>
McMartin: too damn true
01:08 * Finerty likes Lua's logo.
01:09
<@ToxicFrog>
I occasionally think that learning Haskell was a bad idea.
01:09 * Derakon reminds himself of what currying is. "Oh. Right. Yes, well, we did that all the time in SML..."
01:09
< McMartin>
Yeah.
01:09
< McMartin>
Which is where I learned it.
01:10
< McMartin>
There's a similar mechanism you can use in single-dispatch OO to get multiple dispatch, as well.
01:10
<@ToxicFrog>
ML still scares the crap out of me.
01:10
< McMartin>
Which I abuse like nobody's business, but as it is the basic weapon in the compiler writer's armament, I am forgiven.
01:10
<@ToxicFrog>
Oh?
01:11 * McMartin checks for a decent link
01:11
< McMartin>
Googling it also turned up a "Visitor Pattern is useless because you can get the same effect with multimethods"
01:11
<@ToxicFrog>
(I may end up learning OcaML this year, too - friend of mine is taking a course in it)
01:11
< McMartin>
Which is, um, somebody Missing The Point.
01:12
< McMartin>
As the Visitor Pattern is an implementation of multimethods
01:12
< McMartin>
Though the pattern-matching call structure that ML and Haskell use, while not strictly speaking compiling to multimethods, is also semantically equivalent.
01:12
< McMartin>
Inform 7, too.
01:13
< McMartin>
... that reminds me, Mac support for the Z-Machine is about 100 times more awesome than on any other platform.
01:14
<@Derakon>
The problem with design patterns is that I have never used most of them. :\
01:14 * Derakon reads the Visitor pattern snippet. It is straightforward.
01:14
< McMartin>
Yes.
01:14
<@Derakon>
But if some interviewer asks me "So what do you think of the Alien design pattern" or whatever, I'll have no clue what to tell him!
01:14
< McMartin>
I found, upon reading the original Design Patterns book, that it largely descibed things I already did, and simply gave me new names for the spells I cast.
01:15 * McMartin suggests the original book on the subject; the rest is dross.
01:15
< McMartin>
That said, things like "Composite" and "Chain of Responsibility" are pretty straightforward in concept, implementation, and effect.
01:15
<@Derakon>
That'd be this? http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professiona l/dp/0201633612/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1200619048&sr=8-1
01:15
< McMartin>
"Composite" is what we non-OO types would call a "Struct".
01:15
<@Derakon>
Heh.
01:15
< McMartin>
That is the one.
01:15 * Derakon orders it.
01:16
<@Derakon>
Give me the appearance of competence!
01:16
< McMartin>
(The key bit about Composites is that far too many people use Inheritance when they should be using Composition instead.)
01:16
< McMartin>
(Far, far, far too many people.)
01:16
<@Derakon>
Heh.
01:16
<@Derakon>
Inheritance is for methods. Composition is for data.
01:16
< McMartin>
(I don't actually like OO, can you tell?)
01:16
<@Derakon>
OO is an accessible way of thinking about very large programs.
01:16
<@ToxicFrog>
...how, exactly, does Composition work?
01:17
<@Derakon>
A contains B.
01:17
< McMartin>
Well, to show it for methods.
01:17
<@ToxicFrog>
Aah.
01:17
< McMartin>
Let's say B and C each implement foo differently, and have nothing to do with one another.
01:17
< McMartin>
Say you'd like A to extend both B and C.
01:17
< McMartin>
This is a Problem.
01:17
<@Derakon>
Or maybe I'm wrong...
01:17
<@ToxicFrog>
typedef struct B { struct A foo; int bar; int baz; } ?
01:17
< McMartin>
TF: More or less.
01:17
<@ToxicFrog>
As opposed to struct B extends A { int bar; int baz; }
01:17
< McMartin>
Here's why it's useful.
01:17
< McMartin>
You put a B and a C in A, give A entirely different methods that forward to B.foo and C.foo
01:18 * ToxicFrog nods
01:18
<@Derakon>
Okay, McM was going for a more detailed approach.
01:18
< McMartin>
You also provide accessors that let you present A as something castable to B or C.
01:18
<@Derakon>
I just generally say "I want to be able to do what B does, but I'm not really making something that is a B..."
01:18
< McMartin>
But by the problem statement itself, A seriously isn't safely castable to B or C, and 98% of the multiple inheritance bullshit is an attempt to tapdance around this.
01:18
<@Derakon>
...now, that I don't do.
01:18
< McMartin>
So, Composites, with view methods.
01:19
< McMartin>
Well, I'm explicitly arguing against letting your language have MI.
01:19
<@Derakon>
Heh.
01:19
< McMartin>
Because views let you do it, and it's more work, but it's explicit, and this makes all the bullshit disappear, thus satisfying the principle of minimum astonishment cleanly.
01:19
<@Derakon>
"In object-oriented programming, a Composite is an object (e.g. a shape) designed as a composition of one-or-more similar objects (other kinds of shapes/geometries), all exhibiting similar functionality."
01:19
<@Derakon>
From http://en.wikipedia.org/wiki/Composite_pattern
01:20
< McMartin>
Oh. Right. The other place it comes in handy is when there are varying numbers of things being glommed together.
01:20
<@Derakon>
The important thing is not just the has-a relationship, but that the group has behaviors similar to the individual members.
01:20
< McMartin>
Yeah.
01:20
< McMartin>
But you can't do inheritance tricks there because it's not guaranteed that the whole suite of stuff is there.
01:20
< McMartin>
Or how to make the fields.
01:20
< McMartin>
GroupOfA extends A is just asking for trouble.
01:20
< McMartin>
And people typically don't do that, so it doesn't get my dander up~
01:21
<@Derakon>
So in Paper Mario, say, a Townsperson is a composition of Cubes and Circles.
01:21
<@ToxicFrog>
Still need toplay that.
01:21
< McMartin>
(Exception: Expression = Expression + Expression is pretty common, and I'm cool with that)
01:21
<@Derakon>
And it has draw, resize, rotate, etc. functions that call the respective functions on its cubes and circles.
01:21
< McMartin>
Heh.
01:21
< McMartin>
And then does the translation necessary.
01:21
<@Derakon>
Right.
01:21
<@ToxicFrog>
Hmm. ~/foo is expanded by the shell and not by fopen(), right?
01:21
< McMartin>
Right.
01:22
<@ToxicFrog>
Bum.
01:22
<@Derakon>
Heh.
01:22 * McMartin notes that the Coolest Trick he picked up from Design Patterns was the Flyweight pattern.
01:22
<@Derakon>
Clearly you should open a shell, tell it to expand ~/foo, read the result back as a string, and then call fopen on it.
01:22
< McMartin>
Which is a stunt for doing Singletons (which we all know and love) and getting a lot of mileage out of them.
01:23
<@Derakon>
...hey, I did that!
01:23
<@Derakon>
For the Space Invaders game that was my first Niobium project.
01:23
<@Derakon>
Every time you killed an alien, it respawned as a new alien.
01:23
< McMartin>
Heh.
01:23
< McMartin>
Anyway, back to the original question you had here, regarding synchronized methods...
01:23
< McMartin>
Each Object has an associated lock.
01:23
< McMartin>
A synchronized method locks and unlocks at method boundaries, and is re-entrant so recursion is safe.
01:24
<@Derakon>
Re-entrant meaning it recognizes that it owns the lock?
01:24
<@Derakon>
Or something like that?
01:24
< McMartin>
Right, and further more, how many times it's locked it.
01:24
<@Derakon>
Ahh, yes.
01:24
< McMartin>
You can also go synchronized (obj) { ......... } as a statement, which lets you grab a lock that isn't "this".
01:24
<@ToxicFrog>
Derakon: or I could just go assert(loadfile(os.getenv("HOME").."/.gamedb"))()
01:24
<@Derakon>
Well, yes.
01:24
< McMartin>
Handy for when you need to control multiple resources at once.
01:25
<@Derakon>
McM: not certain I follow that one...
01:25
<@Derakon>
Is that what's explained in more detail here? http://java.sun.com/docs/books/tutorial/essential/concurrency/locksync.html
01:25
< McMartin>
Yes.
01:25 * Finerty didn't know you could do that last.
01:26
< McMartin>
There are also condition variables associated with Objects.
01:26
< McMartin>
Don't use them.
01:26
< McMartin>
They're safe, if you can use them right.
01:26
<@Derakon>
E.g. object.isLocked?
01:26
< McMartin>
No, wait() and notify() and notifyAll().
01:26
<@Derakon>
Er, right.
01:26
< McMartin>
I don't think there are a thousand people on Earth that can actually use condition variables properly.
01:26
<@Derakon>
Anyway, synchronized(obj) {foo} puts a lock on obj while foo executes?
01:27
< McMartin>
It acquires foo's lock.
01:27
< McMartin>
Er.
01:27
< McMartin>
obj's.
01:27
<@Derakon>
Right.
01:27
< McMartin>
obj can still run its non-synched methods in other threads.
01:27
< McMartin>
obj can run anything inside of foo.
01:27
<@Derakon>
foo becomes an anonymous synchronized subroutine of obj, in other words.
01:28
< McMartin>
Yeah, pretty much, but without the invocation overhead
01:28
<@Derakon>
Which is immediately executed, unless obj is currently running another synchronized subroutine.
01:28
< McMartin>
Which is pretty significant in Java.
01:28 * Derakon nods.
01:32
< McMartin>
OK, home time.
01:32
<@Derakon>
Seeya.
01:32
< McMartin>
There to download dev tools, projects, and many other joys.
01:34
<@ToxicFrog>
Condition variables would be really useful if they weren't so tricky to use.
01:35
<@ToxicFrog>
As it is it's easier and safer to just implement message passing and implement them in terms of a ConditionVariableManagerThread, I think.
01:39
<@ToxicFrog>
Ok. I can now add, remove, list, and info games.
01:39
<@ToxicFrog>
And the db is persistent.
01:39
<@Derakon>
You making some kind of mod loader?
01:39
<@ToxicFrog>
No, something to keep track of my game collection.
01:39
<@ToxicFrog>
I just need to add a search feature and it'll be done enough to be used.
01:40
<@ToxicFrog>
For it to actually be done I need to add the ability to edit games in place, and give it a web interface.
01:41
<@Derakon>
Heh.
01:41
<@Derakon>
I probably would've made the games DB a flat file and just written the web interface as the only interface. ¬.¬
01:41
<@ToxicFrog>
Well, the db is the table structure it uses internally, saved and loaded with loadfile()/table.dump()
01:41
<@Derakon>
What language you using?
01:41
<@ToxicFrog>
So the persistency code is perhaps 20 lines, most of which is environment checks and error handling.
01:42
<@ToxicFrog>
The interface just reads lines from stdin and maps "foo bar baz" to foo("bar baz"), providing a pretty low-level interface to the db.
01:42
<@ToxicFrog>
Lua.
01:42
<@Derakon>
...right, why'd I ask?
01:43
<@ToxicFrog>
I don't know.
01:47
<@ToxicFrog>
...oh right, I overloaded pairs()!
01:47
<@ToxicFrog>
That makes this much cleaner.
03:29 Finerty is now known as Vornicus
03:30 Vornicus is now known as Vornicus-Latens
06:14 gnolam [lenin@Nightstar-10613.8.5.253.static.se.wasadata.net] has joined #Code
06:14 mode/#code [+o gnolam] by ChanServ
06:39 Derakon is now known as Derakon[AFK]
07:08 You're now known as TheWatcher
08:14 You're now known as TheWatcher[afk]
09:46 You're now known as TheWatcher
10:45 Attilla [~The.Attil@194.72.70.ns-11849] has quit [Quit: <Insert Humorous and/or serious exit message here>]
11:00 Attilla [~The.Attil@194.72.70.ns-11849] has joined #code
11:08 You're now known as TheWatcher[d00m]
11:47 Vornicus-Latens is now known as Vornicus
12:35 You're now known as TheWatcher
12:47
< Vornicus>
TF, you said you have the 6-player expansion to Catan, right? If so, I find myself in need of data.
13:36 * Serah gives Vornicus a spreadsheet.
13:37 * Vornicus has a spreadsheet, but it's empty.
13:51 * Serah gives Vorn data.
13:51
< Serah>
2+2=22
13:51
<@AbuDhabi>
I didn't know you did Java, Serah.
13:52
< Serah>
Just lik a+a=2a
14:22
<@ToxicFrog>
Vornicus: my -family- has the expansion. It's in Fergus.
14:22
< Vornicus>
Ah.
14:22
< Vornicus>
oh well
14:23
< Vornicus>
(the specific information I need is the layout of any "starter board" in the rules)
15:37 You're now known as TheWatcher[afk]
16:01
<@ToxicFrog>
tinydb operations: new db, load from file, save to file, create table, destroy table, insert row, remove row, get rows.
16:01
<@ToxicFrog>
Missing anything?
16:36
<@ToxicFrog>
Hmm. Index a table internally using the PK, or using integers?
16:36
<@ToxicFrog>
The former makes insert/remove faster, but get slower.
16:51 * ToxicFrog decides to go with the pk, it makes his code simpler
17:00
<@ToxicFrog>
function db.load(file)
17:00
<@ToxicFrog>
return setmetatable(assert(loadfile(file))(), dbmt)
17:00
<@ToxicFrog>
end
17:00
<@ToxicFrog>
I should clean that up a bit.
18:09 AbuDhabi is now known as Lerhir
18:18
<@ToxicFrog>
Hmm. I think a trip to the mall is in order this weekend.
18:19
<@ToxicFrog>
I need a F-F stereo audio cable and an M-M same.
18:19
<@ToxicFrog>
Or possibly a three-source one-output stereo audio switch.
18:19
<@ToxicFrog>
...
18:20
<@ToxicFrog>
I wonder if you could run RCA Video over stereo audio?
18:24
< Vornicus>
Yes.
18:24
< Vornicus>
Well, probably. I imagine the tolerances for video are tighter.
18:24
< Vornicus>
...there's got to be a better way to do this.
18:25
<@ToxicFrog>
Yeah, but I don't have the cables.
18:26 * ToxicFrog is planning to commit wiring so that he can switch Durandal's speakers between Durandal, the PS2, the cube, and the laptop easily.
18:26
< Vornicus>
heh
18:31
<@ToxicFrog>
At the moment, I have video working fine - Oculus is attached to the VGA input, Durandal to the DVI input, and L' gets the CRT.
18:32
<@ToxicFrog>
Well, mostly fine.
18:32
<@ToxicFrog>
Switching Oculus between the Cube and the PS2 means manually switching plugs.
18:32
<@ToxicFrog>
Audio is...less fine.
18:34
<@ToxicFrog>
I actually have an audio switch kicking around, but it's for routing one source to multiple sinks, not the converse.
18:42
< Vornicus>
Must be a better way to do this. I should not have to generate these things twice.
18:42 mode/#code [+o Vornicus] by Vornicus
18:42
<@Vornicus>
http://rafb.net/p/udT4Eb62.html
18:44 You're now known as TheWatcher
18:48
<@Vornicus>
Twice - no, three times - in that function, I do things twice because I can't figure out how to store the result from the first time to use it for the second time.
18:52 * Vornicus fiddles, reduces it by one.
18:56 * Vornicus uses a similar trick to drop another: return not only the thing found, but the thing that certifies that it works.
19:03
<@Vornicus>
But that still leaves me with one, and it's the hairy one.
19:14
<@gnolam>
Bookworm?
19:14 * gnolam hides.
19:14
<@Vornicus>
>_<
19:29
<@Vornicus>
Okay, down to one place that needs de-duplicating.
19:29
<@Vornicus>
...also, I need to clean up this line: swapping_red, swap_targets = find_by_function(adjacent_reds, lambda r: set(xrange(len(tokens))) - all_adjacent_to(set(red_indices).remove(r), adjacency_graph, True), True)
19:54 Vornicus [~vorn@Admin.Nightstar.Net] has quit [Ping Timeout]
20:24 Vornicus [~vorn@Admin.Nightstar.Net] has joined #code
20:24 mode/#code [+o Vornicus] by ChanServ
21:25 Vornicus [~vorn@Admin.Nightstar.Net] has quit [Ping Timeout]
21:26 Vornotron [~vorn@Admin.Nightstar.Net] has joined #code
21:26 Vornotron is now known as Vornicus
21:40
< McMartin>
Vornotron!
21:41
< McMartin>
Are there any good tutorials for using XCode?
21:41
< McMartin>
'cause the stuff it threw at me when I started it up was, if anything, worse than useless.
21:43
< Vornicus>
I don't know
21:43
< Vornicus>
I don't actually /use/ XCode.
21:45
< McMartin>
Hmm.
21:45 * McMartin will just have to play with it more, it seems.
21:45
< McMartin>
Sable doesn't appear to run on Carlsbad, so I guess it will make a good first project.
21:46
< McMartin>
And Disk images can apparently be much shinier, so I want to play with that too.
21:48
< Vornicus>
I know I have futzed with shell commands to create and manipulate .dmgs; I don't know what they are, but they're in the osx segment of the OpenTTD makefile.
21:48 * TheWatcher would like his game to work on a mac, but may have matters complicated by not having access to one
21:48
< McMartin>
Quite
21:48
< McMartin>
Vorn: Yeah.
21:49
< McMartin>
But there appears to be a way to toss images, text, and instructions directly into the Finder window of a .dmg
21:49
< McMartin>
Since OO.o and I7 both do this.
21:49
< Vornicus>
Oh, yes. I don't know how to do that.
21:49
< McMartin>
Thus, this looks like a good excuse to play with a new tool.
21:49
< McMartin>
(Also, I guess this means the next language I learn is Objective-C, now that I have something to do with it)
21:53
< McMartin>
What do you use for text editing?
21:54
< Vornicus>
TextWrangler
21:57 AnnoDomini [AnnoDomini@83.21.0.ns-20301] has joined #Code
21:57 mode/#code [+o AnnoDomini] by ChanServ
21:57 Lerhir [AnnoDomini@83.21.18.ns-4628] has quit [Ping Timeout]
21:57 AnnoDomini is now known as Lerhir
22:12
<@TheWatcher>
Not emacs? ¬¬
22:12
<@TheWatcher>
*ducks*
22:14
< Vornicus>
You can get emacs, it's just awful.
22:16
<@TheWatcher>
Question!
22:16
<@TheWatcher>
Do you consider emacs awful normally, or just the mac version?
22:16
< Vornicus>
Normally.
22:17
< McMartin>
That said, the fact that the Macbook has a slightly different keyboard layout would indeed make emacs on Mac a pain for me unless they remap Command to Meta instead of Alt.
22:17
< McMartin>
Since Alt Means Something Else.
22:18 * TheWatcher should someday build the ps2 interface for his old Type5...
22:18
< McMartin>
Actually, I should also ask if there are decent TeX-editing packages for that purpose.
22:18
< McMartin>
Something like WinEdt or TeXmaker.
22:19
< McMartin>
Though I imagine that even TextEdit will *basically* work for that.
22:19
< Vornicus>
TeXShop.app has everything
22:19
< McMartin>
... which means I better not download it over public wireless~
22:20
< Vornicus>
Quite, it's a 300MB package
22:22
< McMartin>
A quick check of the copy of emacs that came with devtools indicates that it is, indeed, inappropriate for serious use.
22:22
< McMartin>
Since the only functioning Meta key is ESC.
22:35
< Vornicus>
you can get aquaemacs.
22:48
< McMartin>
I'm still a little unclear on all the buzzwords.
22:49
< McMartin>
The only ones I regularly get straight are Cocoa (OS X standard GUI framework; Apple's MFC or GTK) and Carbon (OS 9 legacy app framework).
22:49
< McMartin>
Except "Framework" is also a buzzword, and IIRC Frameworks play merry hell with UNIX-world build tools.
22:57
< Vornicus>
Frameworks can be used with gcc etc - use, uh, --framework?
22:58
< Vornicus>
I don't really recall.
22:58
< Vornicus>
If you wonder about a buzzword, ask me or der
23:15 Lerhir is now known as AnnoDomini
23:25
< McMartin>
Aha, found the IDE tour
23:25
< McMartin>
Unfortunately, I have real work to do, so it mus wait.
23:27
< McMartin>
OK, I have a really stupid question.
23:27
< McMartin>
The symbol in accelerators that looks kind of like a stylized V
23:27
< McMartin>
What key is that?
23:29
< McMartin>
It always seems to be tied to dangerous things like "Hard Reset" so I'm not really in a good position to experiment.
23:41
< McMartin>
Aha!
23:41 * McMartin finds a safe application of it in TextEdit, determines it to be Option.
23:45
< Vornicus>
Yes, it is Option.
23:46
< Vornicus>
control is a ^, and shift is a white up arrow
23:48
< Vornicus>
By the way, the three-finger salute is cmd-opt-esc, and you use cmd-tab to switch apps and cmd-` to switch windows within an app.
23:48
< McMartin>
And beanie key is straightforward.
23:48
< McMartin>
Aha
23:48
< McMartin>
I'd been using cmd-[].
23:49 * McMartin has worked out how to make Spaces his friend, anyway
23:49
< McMartin>
I don't suppose, though, that you know offhand how to make the fn keys be fn keys by default?
23:49
< Vornicus>
"beanie key"?
23:50
< McMartin>
Cmd = "Beanie Key", since its image looks like a propellor beanie, top view.
23:50
< Vornicus>
System Preferences -> Dashboard & Expose.
23:51
< Vornicus>
To make it, say, option-f9, hold down the option key when clicking the combo box.
23:51
< Vornicus>
(for instance)
23:51
< McMartin>
That's not my question.
23:51
< McMartin>
This may be Macbook specific, actually.
23:51
< Vornicus>
Oh, macbook specific I have /no/ idea.
23:51
< McMartin>
The F8 key is actually "disable keyboard light".
23:51
< Vornicus>
O.o
23:51
< McMartin>
I need to hit Fn-F8 to get F8.
23:53
< McMartin>
Aha, here we go.
23:54
< McMartin>
Keyboard and Mouse -> Keyboard -> Use Function keys as Function Keys.
23:54
< Vornicus>
how... appropriate.
23:54
< McMartin>
Unchecked by deault!
23:54
< McMartin>
Bad Steve!
--- Log closed Sat Jan 19 00:00:00 2008
code logs -> 2008 -> Fri, 18 Jan 2008< code.20080117.log - code.20080119.log >