<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-16893922</id><updated>2011-10-17T05:40:22.382+11:00</updated><category term='wwdc06 student sunday pixar'/><category term='NSBezierPath Cocoa'/><category term='software sorcery quote'/><category term='quote Bill Atkinson software design'/><title type='text'>Mathieu Tozer's Dev Blog</title><subtitle type='html'>Cocoa, the development of Words, and other software projects (including those dang assessment tasks).</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default?start-index=101&amp;max-results=100'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>244</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-16893922.post-4859932203491930043</id><published>2008-02-16T04:00:00.002+11:00</published><updated>2008-02-16T04:03:08.025+11:00</updated><title type='text'>This Blog is Closed</title><content type='html'>This blog has been closed. It represents the initial journey I took while learning my first framework, Cocoa, right from the beginning.&lt;br /&gt;&lt;br /&gt;Since that topic is the bulk of this blog, and that part of my life is over, I'm closing the blog. I'll be starting a new code and developer related blog at &lt;a href="http://www.mathieutozer.com/code"&gt;http://www.mathieutozer.com/code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Feel free to read the archives or follow along with the new blog!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-4859932203491930043?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/4859932203491930043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=4859932203491930043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/4859932203491930043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/4859932203491930043'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2008/02/this-blog-is-closed.html' title='This Blog is Closed'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-9153922388494876828</id><published>2007-08-14T19:10:00.001+10:00</published><updated>2007-08-14T19:12:27.925+10:00</updated><title type='text'></title><content type='html'>&lt;b&gt;2007-08-14 19:09:36.041 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.042 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.052 XXX[2591:10b] animating to: {{50, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.057 XXX[2591:10b] animating to: {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.058 XXX[2591:10b] animating to: {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.060 XXX[2591:10b] {{50, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.087 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.134 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.168 XXX[2591:10b] {{50, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.169 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.169 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.211 XXX[2591:10b] {{50, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.212 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.214 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.261 XXX[2591:10b] {{0, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.261 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.262 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.294 XXX[2591:10b] {{0, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.294 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.295 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.304 XXX[2591:10b] {{0, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.310 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.316 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.326 XXX[2591:10b] {{0, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.326 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.328 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.330 XXX[2591:10b] {{0, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.330 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.331 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.335 XXX[2591:10b] {{0, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.336 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.336 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.358 XXX[2591:10b] {{0, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.359 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.360 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.362 XXX[2591:10b] {{0, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.363 XXX[2591:10b] {{134.808, 62}, {84.8077, 66}}&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2007-08-14 19:09:36.364 XXX[2591:10b] {{219.615, 62}, {84.8077, 66}}&lt;br&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br class="webkit-block-placeholder"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;etc etc helped me fix that curious bug.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-9153922388494876828?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/9153922388494876828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=9153922388494876828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/9153922388494876828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/9153922388494876828'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/08/2007-08-14-190936.html' title=''/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-4084266368088635934</id><published>2007-08-14T14:13:00.001+10:00</published><updated>2007-08-14T14:13:12.811+10:00</updated><title type='text'></title><content type='html'>ZINGLES!!! ZINGLE ZINGLE ZINGLE!!! IT WORKED!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-4084266368088635934?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/4084266368088635934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=4084266368088635934' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/4084266368088635934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/4084266368088635934'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/08/zingles-zingle-zingle-zingle-it-worked.html' title=''/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-7580527385291671886</id><published>2007-08-14T14:08:00.001+10:00</published><updated>2007-08-14T14:08:20.958+10:00</updated><title type='text'></title><content type='html'>&lt;a href="http://www.flickr.com/photos/mathieutozer/1111624782/" title="Photo Sharing"&gt;&lt;img src="http://farm2.static.flickr.com/1226/1111624782_f92dfecac9.jpg" width="500" height="296" alt="skitchWFGgG9"&gt;&lt;/a&gt;&lt;br class="khtml-block-placeholder"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-7580527385291671886?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/7580527385291671886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=7580527385291671886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/7580527385291671886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/7580527385291671886'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/08/photo-sharing.html' title=''/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1226/1111624782_f92dfecac9_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-854238394824776755</id><published>2007-08-14T14:07:00.001+10:00</published><updated>2007-08-14T14:07:32.997+10:00</updated><title type='text'></title><content type='html'>About to code something into my project which could either go really well or really bad.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-854238394824776755?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/854238394824776755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=854238394824776755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/854238394824776755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/854238394824776755'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/08/about-to-code-something-into-my-project.html' title=''/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-4578001710309791063</id><published>2007-08-14T12:00:00.001+10:00</published><updated>2007-08-14T12:00:28.941+10:00</updated><title type='text'></title><content type='html'>Thinking it would have been better to not have been so drunk while talking to all those gods and gurus in San Francisco?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-4578001710309791063?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/4578001710309791063/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=4578001710309791063' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/4578001710309791063'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/4578001710309791063'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/08/thinking-it-would-have-been-better-to.html' title=''/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-2952895420815910300</id><published>2007-08-14T11:50:00.001+10:00</published><updated>2007-08-14T11:50:46.887+10:00</updated><title type='text'></title><content type='html'>It's funny how I tend to hold my breath while using my own software.&lt;br /&gt;&lt;br /&gt;*Just work please work don't crash please please please!*&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-2952895420815910300?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/2952895420815910300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=2952895420815910300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/2952895420815910300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/2952895420815910300'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/08/its-funny-how-i-tend-to-hold-my-breath.html' title=''/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-5161392155294407566</id><published>2007-08-08T14:50:00.000+10:00</published><updated>2007-08-08T14:52:09.535+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wwdc06 student sunday pixar'/><title type='text'>WWDC2006 Student Sunday notes from the Pixar Guy</title><content type='html'>I took these notes at student sunday last year. There's some truisms in there that I like. Thought to share. Sorry about the fragmented nature of them, I was heavily jet lagged! Oh and the guy who was speaking ended up doing a talk in 07 (a similar one). Amazing guy.&lt;br /&gt;&lt;br /&gt;-BEGIN-&lt;br /&gt;&lt;br /&gt;and that other people can't. It's about giving power to the users of systems.&lt;br /&gt;&lt;br /&gt;You're taking things that were in a pipeline, and brining them all together.&lt;br /&gt;&lt;br /&gt;Tools are about power. &lt;br /&gt;&lt;br /&gt;It's a redistribution of power that works (win/win).&lt;br /&gt;&lt;br /&gt;You make a bad thing go away. When you do that, you know you're made a good tool.&lt;br /&gt;&lt;br /&gt;Leverage&lt;br /&gt;Passion&lt;br /&gt;  It's about following your bliss. Write what you know!&lt;br /&gt;  You should be trying to write a real app. &lt;br /&gt;&lt;br /&gt;Challenge yourself, but not too much. You want to get better, but be realistic.&lt;br /&gt;Know what you write!&lt;br /&gt;&lt;br /&gt;Pick something you know about so you can get better at it.&lt;br /&gt;&lt;br /&gt;Join the justice league. &lt;br /&gt;&lt;br /&gt;Be world class at something, so you know how it feels.&lt;br /&gt;Pixar hire people because they're really good at one thing.&lt;br /&gt;&lt;br /&gt;Have just one thing (even for the interview's sake). &lt;br /&gt;&lt;br /&gt;If you've never been really good at something, then you don't know what you feel like, and if you work with people who are better than you, you get better yourself.&lt;br /&gt;Acknowledge your ego, exercise humility.&lt;br /&gt;&lt;br /&gt;Play well with you.&lt;br /&gt;&lt;br /&gt;Be someone people want to work with.&lt;br /&gt;You know what you don't like in others, don't do that to them.&lt;br /&gt;Become the person you aspire to be.&lt;br /&gt;Learn the skills you need&lt;br /&gt;Meet the people that person would know.&lt;br /&gt;Take the long view&lt;br /&gt;&lt;br /&gt;Identify problems by type.&lt;br /&gt;&lt;br /&gt;"Yes, it's stupid, fix it"&lt;br /&gt;&lt;br /&gt;Or, Actually, it's subtle, and a feature, not a bug.&lt;br /&gt;&lt;br /&gt;That was a problem at the last place you worked, not here.&lt;br /&gt;&lt;br /&gt;"Nail in the head". Identify problems that you should just not work on. &lt;br /&gt;&lt;br /&gt;Just walk away! It's one of the most valuable things you can learn as an engineer. Engineers about the right solutions to something. About elegance. &lt;br /&gt;&lt;br /&gt;Criticism.&lt;br /&gt;Seek it out, early and often.&lt;br /&gt;Get it from people who respect you, otherwise you won't get the truth.&lt;br /&gt;Make sure your application is pull not push.&lt;br /&gt;Support promotes ownership, ownership promotes elegance.&lt;br /&gt;If you've only got one idea, you're only going to defend it.&lt;br /&gt;&lt;br /&gt;Your first real app&lt;br /&gt;Scalpel, not swiss army knife&lt;br /&gt;assume it will crash, and code accordingly&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-5161392155294407566?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/5161392155294407566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=5161392155294407566' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/5161392155294407566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/5161392155294407566'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/08/wwdc2006-student-sunday-notes-from.html' title='WWDC2006 Student Sunday notes from the Pixar Guy'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-4740822419778067795</id><published>2007-05-07T19:05:00.000+10:00</published><updated>2007-05-07T19:07:45.319+10:00</updated><title type='text'>Smart Lists Revisited</title><content type='html'>Thanks to the weeks spent implementing them when I was brand new to cocoa, the word "SmartGroups" strikes mortal fear into mine heart.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;br /&gt;Luckily my experience has improved and I managed to implement a working system in a few hours! This was for a seperate pet project I did on Sunday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-4740822419778067795?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/4740822419778067795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=4740822419778067795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/4740822419778067795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/4740822419778067795'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/05/smart-lists-revisited.html' title='Smart Lists Revisited'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-8681548686233520305</id><published>2007-04-23T01:30:00.000+10:00</published><updated>2007-04-23T01:32:29.372+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NSBezierPath Cocoa'/><title type='text'>Grokking NSBezierPaths</title><content type='html'>Bezier path drawing (I like to think of it as painting!) - I think I'm finally starting to get it! The possibilities aren't exactly endless, but the power it provides through the simple cocoa interface is exciting, and makes me want to draw more with it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-8681548686233520305?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/8681548686233520305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=8681548686233520305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/8681548686233520305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/8681548686233520305'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/04/grokking-nsbezierpaths.html' title='Grokking NSBezierPaths'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-3290102200503940059</id><published>2007-04-15T12:47:00.000+10:00</published><updated>2007-04-15T12:48:56.954+10:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software sorcery quote'/><title type='text'>Quote</title><content type='html'>Gunna try and start blogging again.&lt;br /&gt;&lt;br /&gt;Here's a nice quite I found:&lt;br /&gt;&lt;br /&gt;Of software and sorcery&lt;br /&gt;#&lt;br /&gt;A computational process is indeed much like a sorcerer’s idea of a spirit. It cannot be seen or touched. It is not composed of matter at all. However, it is very real. It can perform intellectual work. It can answer questions. It can affect the world by disbursing money at a bank or by controlling a robot arm in a factory. The programs we use to conjure processes are like a sorcerer’s spells. —Abelson and Sussman, Structure and Interpretation of Computer Programs (1984)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-3290102200503940059?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/3290102200503940059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=3290102200503940059' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/3290102200503940059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/3290102200503940059'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/04/quote.html' title='Quote'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-5473366888023863657</id><published>2007-01-20T14:51:00.000+11:00</published><updated>2007-01-20T14:52:40.558+11:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quote Bill Atkinson software design'/><title type='text'>The Craft Of Designing and Building Software</title><content type='html'>I learned from MacPaint that in order to get a piece of software to be smooth, you must start over a number of times. You need to test it on a lot of different people and have them use the program. A lot of what I would do was just watch Susan Kare using it. &lt;br /&gt;&lt;br /&gt;"What is it that you'd like to be able to do?" I would ask her, "What's the most frustrating thing about this?" &lt;br /&gt;&lt;br /&gt;Then I would go back and see what I could do about that. I think that the more user testing a piece of software has, the smoother it can become. The process of software design really is one where you start with a vague notion of what you're trying to make, and that vague notion slowly congeals and gets better defined. As you work with it more, it gets to the point where it is something, but as you try it you realize, "You know, I've kind of missed the mark here. This is sort of what I want to do, but what I really want is more like that!" &lt;br /&gt;&lt;br /&gt;For example, first you pit it and pat it, and you realize it's some kind of a table. Then you throwaway all of the code and build a table from scratch, and you've got a clear, clean model. Then you start pitting it and patting it, and adding things that people want and it gets a little lopsided and difficult, and you realize after a while, "You know, what I'm really building here is more like a cobbler's bench." That's when you have to put it aside and build a cobbler's bench deliberately, and craft it to be right for a cobbler's bench. You iterate like that, testing, and then being willing to set aside and build from scratch again. So much software today doesn't get that luxury. Partly because the Macintosh hardware wasn't quite ready yet, I got that luxury. Too many pieces of software today ship when their first prototype is built, and then it's much harder for them to evolve, because they have to keep everybody happy by keeping all of the features the way people have become familiar with. &lt;br /&gt;&lt;br /&gt;The original Mac only had 128 k-bytes of memory. Alan Kay referred to it as a "Ferrari with a one-pint gas tank." It was particularly challenging to design a painting program that would do a lot with a small amount of memory, as a copy of the whole screen had to be kept in a buffer to allow the undo command. Bill remembers the worst-case scenario, when you typed using one of the bigger fonts, you had an undo buffer and a selection going at the same time, leaving only 138 bytes free. He knew he could only succeed under those conditions by rigorous testing. Large parts of the Macintosh were rewritten in Assembly language for no other reason than compactness; and later they had to be rewritten again in a high-level language to be more maintainable. &lt;br /&gt;&lt;br /&gt;Bill Atkinson, as quoted in Designing Interactions, by Bill Moggridge, page 102 - 103.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-5473366888023863657?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/5473366888023863657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=5473366888023863657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/5473366888023863657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/5473366888023863657'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2007/01/craft-of-designing-and-building.html' title='The Craft Of Designing and Building Software'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116315391056312486</id><published>2006-11-10T21:18:00.000+11:00</published><updated>2006-11-10T21:18:52.260+11:00</updated><title type='text'>試験地獄</title><content type='html'>&lt;p class="mobile-post"&gt;一応試験をとるけど、パスしないと今は思ってい &lt;br /&gt;る。あまり勉強していなかったから落ちると思う。 &lt;br /&gt;もう仕方がない。時間をもっと大事にすれば、パス &lt;br /&gt;できたかもしれないけど、もう時間がない。。。 &lt;br /&gt;ちょっと悲しいけど。来年どうするじゃ？また大学 &lt;br /&gt;に戻る？それかdeferされる？&lt;br /&gt;最悪なのは、AIはとても面白いと前も今も思うけ &lt;br /&gt;ど、教え方は私には会わなかったと思う。それと、 &lt;br /&gt;他のアサインメントの開発を本応に頑張ってたか &lt;br /&gt;ら、勉強しなかった。&lt;/p&gt;&lt;p class="mobile-post"&gt;落ちたらまたこういうことを考えるけど。いや、二 &lt;br /&gt;つか三つのある道のプランを作る。&lt;br /&gt;私のこの先のある道：&lt;br /&gt;１。プラスクの三ヶ月間後に海外に引っ越しして、 &lt;br /&gt;ソフトを書きながら働く（ワーホリで？）これは&lt;br /&gt;ニューヨーク、パリ、イタリア、ブラジル！！いい &lt;br /&gt;なブラジルって。サンフランチスコ。ゴルドコース &lt;br /&gt;ト。東京！&lt;br /&gt;これは一月の終わりに出発するプラン。ここでサ &lt;br /&gt;マー、海外でサマー！&lt;br /&gt;２。メルボルンに住み続けて、大学の落ちた点数を &lt;br /&gt;また撮る。&lt;br /&gt;３。メルボルンに住み続けて、自分の会社を始まる。&lt;br /&gt;４。他のマック開発している会社を探して、就職す &lt;br /&gt;る。&lt;/p&gt;&lt;p class="mobile-post"&gt;非実業の専門をやっちゃたので、会社でプログラミ &lt;br /&gt;ング活動をしたければ（したくない）一人で経験を &lt;br /&gt;得ないといけない。&lt;/p&gt;&lt;p class="mobile-post"&gt;したいくないって言うけど、面白いことをやってい &lt;br /&gt;る会社ならばいいけど。とりあえず自分で働きたい &lt;br /&gt;な。&lt;/p&gt;&lt;p class="mobile-post"&gt;その三つの道の良い点と悪点をそれぞれ書かないと &lt;br /&gt;行けない。&lt;/p&gt;&lt;p class="mobile-post"&gt;フォトテーブルを上手にやってたら、アップルにも &lt;br /&gt;就職できるかな？まだ早い？一応頑張る。来週から &lt;br /&gt;本気に頑張る。でも楽しいから苦しくない。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116315391056312486?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116315391056312486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116315391056312486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116315391056312486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116315391056312486'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/11/blog-post.html' title='試験地獄'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116117703030377320</id><published>2006-10-18T23:10:00.000+10:00</published><updated>2006-10-18T23:10:30.753+10:00</updated><title type='text'>Image Bug Squashed... in one line</title><content type='html'>&lt;p class="mobile-post"&gt;What a hideous, hideous bug! It turns out that the nasty behaviour  &lt;br /&gt;that images weren't sticking around between launches (Why is it  &lt;br /&gt;loosing objects!!!!) was happening BECAUSE I WAS TELLING IT TO.&lt;/p&gt;&lt;p class="mobile-post"&gt;It was happening because of the old way the image system was  &lt;br /&gt;architectured, before I refactored. Every time the application quits,  &lt;br /&gt;images that aren't flagged to be 'kept' are promptly wiped.&lt;/p&gt;&lt;p class="mobile-post"&gt;And I had completely forgotten about this code and that it was running.&lt;/p&gt;&lt;p class="mobile-post"&gt;Now that it's commented out, let's see how it all goes.&lt;/p&gt;&lt;p class="mobile-post"&gt;Yup, sure enough, I comment out that cleanup method in  &lt;br /&gt;applicationShouldTerminate, and everything is dandy.&lt;/p&gt;&lt;p class="mobile-post"&gt;Not sure what the lesson is to take away from this... except that  &lt;br /&gt;maybe I'm silly. (Dumb is too strong :P)&lt;/p&gt;&lt;p class="mobile-post"&gt;I am starting to feel the weight of the application as it grows (and  &lt;br /&gt;groans). Perhaps this is one symptom of a growing application.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116117703030377320?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116117703030377320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116117703030377320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116117703030377320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116117703030377320'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/image-bug-squashed-in-one-line.html' title='Image Bug Squashed... in one line'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116114618639511748</id><published>2006-10-18T14:36:00.000+10:00</published><updated>2006-10-18T14:36:28.813+10:00</updated><title type='text'>Setting up SVN remotely</title><content type='html'>&lt;p class="mobile-post"&gt;So now I have a working copy locally on my MatBook, and a repository  &lt;br /&gt;ready to manage the source on the server.&lt;/p&gt;&lt;p class="mobile-post"&gt;Now that the databases assignment is done with, I am going to begin  &lt;br /&gt;work on the working version which I can actually roll out at some stage.&lt;/p&gt;&lt;p class="mobile-post"&gt;Like Pete said, I'll use a rails backend. Currently I'm reading a bit  &lt;br /&gt;more about how rails works. Because of my work done in Cocoa, I am  &lt;br /&gt;understanding it better than when I looked at it before.&lt;/p&gt;&lt;p class="mobile-post"&gt;People wouldn't want to log in to use a dictionary. They might log in  &lt;br /&gt;to play word games, but the basic dictionary lookup has to be user  &lt;br /&gt;free. And if I expect people to submit their own word lists, then  &lt;br /&gt;this has to be user free as well.&lt;/p&gt;&lt;p class="mobile-post"&gt;Construct it as a basic rails app, then open the database up with a  &lt;br /&gt;rails api (the type Pete said you could do pretty much for free with  &lt;br /&gt;the latest bleeding edge Rails).&lt;/p&gt;&lt;p class="mobile-post"&gt;So this means I have to&lt;br /&gt;1. Write the database migration, which will generate the database  &lt;br /&gt;schema.&lt;br /&gt;2. Modify the model objects to maintain their data integrity, and  &lt;br /&gt;increment their counts as required by Words&lt;br /&gt;3. Put up scaffolding, including custom scaffolding, that will enable  &lt;br /&gt;simple manipulation of the database.&lt;br /&gt;4. Set up an API for the database.&lt;br /&gt;5. Put the application on a rails server somewhere.&lt;/p&gt;&lt;p class="mobile-post"&gt;The issue with the rails front end is the inability of unicode. I  &lt;br /&gt;know a fix for this is in the works, and there are patch gems available.&lt;/p&gt;&lt;p class="mobile-post"&gt;Well Uni is finishing this week. Sure I have exams.&lt;br /&gt;I'm actually feeling all depressed about the whole thing really.  &lt;br /&gt;Like, almost I don't give a damn. Kind of like I want to just escape  &lt;br /&gt;by leaving the country entirely and moving to... India or something.&lt;/p&gt;&lt;p class="mobile-post"&gt;Kind of like I just want to take off once it's all done.&lt;/p&gt;&lt;p class="mobile-post"&gt;Maybe I'll stay down in Torquay for a week or something, give me some  &lt;br /&gt;time to gather my thoughts. One Week! That would be the longest stay  &lt;br /&gt;in 5 years.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116114618639511748?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116114618639511748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116114618639511748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116114618639511748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116114618639511748'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/setting-up-svn-remotely.html' title='Setting up SVN remotely'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116108603911485621</id><published>2006-10-17T21:53:00.000+10:00</published><updated>2006-10-17T21:53:59.276+10:00</updated><title type='text'>Words 0.16</title><content type='html'>&lt;p class="mobile-post"&gt;I guess my problem is that I need to download higher resolution  &lt;br /&gt;images of the same image given only the URL. My interface downloads  &lt;br /&gt;images by having them dragged into a custom view which accepts URL  &lt;br /&gt;drops of thumbs, but then I want to actually download a higher res  &lt;br /&gt;image behind the scenes. Is there enough information in the URL alone  &lt;br /&gt;to parse another well formed search to the API perhaps? I think there  &lt;br /&gt;is - it will be a bit annoying, but doable.&lt;/p&gt;&lt;p class="mobile-post"&gt;Hey. Isn't it nice when things Just Work. Especially when you  &lt;br /&gt;engineered it yourself! I had been thinking all along that  &lt;br /&gt;implementing type-to-define search would be difficult, but it seems I  &lt;br /&gt;already had the building blocks for it already. All I've done is  &lt;br /&gt;create another method, mostly a copy paste of the usual defining  &lt;br /&gt;method, but removed the word loop, because I pass it an individual  &lt;br /&gt;word. My thread is taking care of getting the definitions from the  &lt;br /&gt;dictionaries back to my user interface.&lt;/p&gt;&lt;p class="mobile-post"&gt;Geez. even the defining spinner gave me feedback on what it was doing!&lt;/p&gt;&lt;p class="mobile-post"&gt;Having said all that, I haven't tested it fully, of course, but  &lt;br /&gt;still, I wasn't expecting to get even this far on the first run.&lt;/p&gt;&lt;p class="mobile-post"&gt;Words is finally getting to a stage where I could probably start to  &lt;br /&gt;use it.&lt;/p&gt;&lt;p class="mobile-post"&gt;So there that's version 0.16&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116108603911485621?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116108603911485621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116108603911485621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116108603911485621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116108603911485621'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/words-016.html' title='Words 0.16'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116099503953508664</id><published>2006-10-16T20:37:00.000+10:00</published><updated>2006-10-16T20:37:19.646+10:00</updated><title type='text'>Some removals, some touches</title><content type='html'>&lt;p class="mobile-post"&gt;Perhaps I need to remove rankings all together from definitions, so  &lt;br /&gt;that it removes one of the data entry steps that users have to make  &lt;br /&gt;to get concise definitions into words.&lt;/p&gt;&lt;p class="mobile-post"&gt;Internally I can have a ranking which will be set from the server,  &lt;br /&gt;but that's quite a bit in the future. Users should still be able to  &lt;br /&gt;order their lists of definitions though.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'm going to have to go down the list of things I need to finish  &lt;br /&gt;before Friday.&lt;/p&gt;&lt;p class="mobile-post"&gt;One thing is the type to define thing. So that things can get defined  &lt;br /&gt;easily.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116099503953508664?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116099503953508664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116099503953508664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116099503953508664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116099503953508664'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/some-removals-some-touches.html' title='Some removals, some touches'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116082285743010843</id><published>2006-10-14T20:47:00.000+10:00</published><updated>2006-10-14T20:47:37.576+10:00</updated><title type='text'>If I had a dollar...</title><content type='html'>If I had a dollar every time I've typed with auto completion &lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;FONT class="Apple-style-span" face="Monaco" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;[[blobArrayController arrangedObjects] objectAtIndex:&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT class="Apple-style-span" color="#0000FF" face="Monaco" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;0&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT class="Apple-style-span" face="Monaco" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;];&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;BR class="khtml-block-placeholder"&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;...&lt;/DIV&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116082285743010843?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116082285743010843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116082285743010843' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116082285743010843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116082285743010843'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/if-i-had-dollar.html' title='If I had a dollar...'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116064692367116646</id><published>2006-10-12T19:55:00.000+10:00</published><updated>2006-10-12T19:55:23.853+10:00</updated><title type='text'>Some old thinkin' notes </title><content type='html'>&lt;p class="mobile-post"&gt;This means looking back at the description of what I want to achieve,  &lt;br /&gt;and deciding which checks and balances I need to be able to make when  &lt;br /&gt;words are inserted and stuff.&lt;/p&gt;&lt;p class="mobile-post"&gt;I have the basic database system working, now it's time to write the  &lt;br /&gt;wrapper to that database.&lt;/p&gt;&lt;p class="mobile-post"&gt;What I'm essentially doing is writing my very own API! The words API.&lt;/p&gt;&lt;p class="mobile-post"&gt;Triggers will be called when the user tries to do something idiotic.&lt;br /&gt;What kinds of things are idiotic in the context of Words?&lt;/p&gt;&lt;p class="mobile-post"&gt;Procedures can be wrappers to adding words and languages to databases.&lt;br /&gt;They can be used to see about sorting a way&lt;/p&gt;&lt;p class="mobile-post"&gt;They could be used to write API style things. Like "Give me the data  &lt;br /&gt;for the game:GameName".&lt;br /&gt;Or for retrieving commonly used sets of data.&lt;/p&gt;&lt;p class="mobile-post"&gt;They could be written to fetch the interesting statistical information.&lt;br /&gt;They will do the incrementing and calculating of the completeness and  &lt;br /&gt;validation levels. They can do the propagation to the rest of the  &lt;br /&gt;database of changes.&lt;br /&gt;They will be the interface for the client app to say "Give me  &lt;br /&gt;definitions for these words" A procedure will iterate though each  &lt;br /&gt;word passed to it and fetch out the words, and perform the updates it  &lt;br /&gt;needs to with any new data it finds in the submission.&lt;br /&gt;Basically it has to be able to sync up words together.&lt;/p&gt;&lt;p class="mobile-post"&gt;I might need to draw a big detailed flow chart of what will happen as  &lt;br /&gt;things flow through, and what interactions need to happen to make the  &lt;br /&gt;data all sync up.&lt;/p&gt;&lt;p class="mobile-post"&gt;So what I need to finalise is what exactly I need to do with the data  &lt;br /&gt;in the database.&lt;/p&gt;&lt;p class="mobile-post"&gt;I need some pseudo code about what I need to do.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116064692367116646?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116064692367116646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116064692367116646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116064692367116646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116064692367116646'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/some-old-thinkin-notes.html' title='Some old thinkin&apos; notes '/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116057187403965689</id><published>2006-10-11T23:04:00.000+10:00</published><updated>2006-10-11T23:04:35.093+10:00</updated><title type='text'>A Review So Far</title><content type='html'>&lt;p class="mobile-post"&gt;What can be done with my software as it is.&lt;br /&gt;Users can open a language which they are learning, and add words to  &lt;br /&gt;it, via a simple push button or though highlighting a word and  &lt;br /&gt;selecting a hot key.&lt;/p&gt;&lt;p class="mobile-post"&gt;Once in the system, users can organise the word as they please by  &lt;br /&gt;creating manual groups in which to contain the words, or by  &lt;br /&gt;organising them with smart groups. These are all ways in which the  &lt;br /&gt;list of words can be filtered.&lt;/p&gt;&lt;p class="mobile-post"&gt;Users can also search for the definitions of words by the search  &lt;br /&gt;menu, and if it isn't already found within your words database, it  &lt;br /&gt;will ask if you want to add it. Clicking add will add the word.&lt;/p&gt;&lt;p class="mobile-post"&gt;Users can set dictionaries which the words they enter will be looked  &lt;br /&gt;up in. These are set by checking them in the user preferences window.  &lt;br /&gt;More dictionaries can be downloaded from the Dictionary Downloader  &lt;br /&gt;view, via a simple drag and drop interface.&lt;/p&gt;&lt;p class="mobile-post"&gt;Once dictionaries are set up (a once of thing) users click 'define',  &lt;br /&gt;which will search all the dictionaries set up to use for definitions.  &lt;br /&gt;The definitions found are visible in a text view in the main window.  &lt;br /&gt;Which translation language is visible is selectable via the language  &lt;br /&gt;list on the left of the window. If there isn't a translation  &lt;br /&gt;available in the language they wish, they have the option of writing  &lt;br /&gt;one themselves in the main text view. Using the main text view, users  &lt;br /&gt;can choose their 'top four' translations / definitions, which will be  &lt;br /&gt;used for flash cards and quizzing.&lt;/p&gt;&lt;p class="mobile-post"&gt;While a word is selected, users can click on 'Find', and a simple tag  &lt;br /&gt;search will be performed on the flickr online image database, and a  &lt;br /&gt;number of images will be returned. The user can browse the images,  &lt;br /&gt;and check 'keep' to save the image against this word.&lt;/p&gt;&lt;p class="mobile-post"&gt;That is as of Wed 11th October 2006, here's what I have planned for  &lt;br /&gt;the future.&lt;/p&gt;&lt;p class="mobile-post"&gt;Instead of or in conjunction with, users will also be able to define  &lt;br /&gt;their words though the playing of games which use what data is  &lt;br /&gt;available, and get users to fill in the blanks.&lt;/p&gt;&lt;p class="mobile-post"&gt;This will happen in a number of ways, which keeps it interesting.&lt;/p&gt;&lt;p class="mobile-post"&gt;Connect a user with another user with the same language combination.&lt;br /&gt;Let them play games together and record all input. Where the data  &lt;br /&gt;input matches, record it as valid. Where it doesn't record it as  &lt;br /&gt;needs validating.&lt;br /&gt;This is a general model from which a number of word games  &lt;br /&gt;incorporating sound, images, and words can be invented.&lt;/p&gt;&lt;p class="mobile-post"&gt;Users will then be able to turn to these games firstly as a way of  &lt;br /&gt;learning. They will still be able to see their lists of words that  &lt;br /&gt;they have encountered though gaming or though reading email in the  &lt;br /&gt;regular views. They will be able to earn points towards their total  &lt;br /&gt;points kitty, and compete against other players in the game.&lt;/p&gt;&lt;p class="mobile-post"&gt;All the words will be kept on a central server, and word on the  &lt;br /&gt;client side will be kept asynchronously up to date with the servers  &lt;br /&gt;words.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116057187403965689?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116057187403965689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116057187403965689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116057187403965689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116057187403965689'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/review-so-far.html' title='A Review So Far'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116045693667002188</id><published>2006-10-10T15:08:00.000+10:00</published><updated>2006-10-10T15:08:56.803+10:00</updated><title type='text'>Words.sql</title><content type='html'>&lt;p class="mobile-post"&gt;Haven't updated for a while... here's why:&lt;br /&gt;As part of the DB assignment I am building the server side of Words.&lt;br /&gt;I have made an ER diagram of the data I want to be in the database,  &lt;br /&gt;converted it to relational tables, then written the SQL code (for  &lt;br /&gt;ORACLE) for create the tables.&lt;br /&gt;I have written code to export example data right from the Words  &lt;br /&gt;application which can be read by the Oracle database. I have written  &lt;br /&gt;'setter' API calls (embedded procedures) for the database which will  &lt;br /&gt;conveniently enter this data too, setting the default attributes for  &lt;br /&gt;each data item.&lt;br /&gt;I am engineering the database so that it exists in a series of .sql  &lt;br /&gt;files, and the entire thing can be set up with a single @words.sql  &lt;br /&gt;call at the Oracle command line. You can also clean the whole thing  &lt;br /&gt;up by calling @delete.sql.&lt;/p&gt;&lt;p class="mobile-post"&gt;My next challenge is to develop a more robust API that any client can  &lt;br /&gt;call to.&lt;br /&gt;This challenge is from a few angles which I can see:&lt;br /&gt;Insertion of data&lt;br /&gt;Updating the data&lt;br /&gt;Synchronising data between client and server.&lt;br /&gt;Performing complex queries on the data to retrieve meaningful  &lt;br /&gt;information which can be used by a client&lt;br /&gt;Searching the data for specific information.&lt;/p&gt;&lt;p class="mobile-post"&gt;Kinda looks like an API table of contents doesn't it!&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway it's due friday so I had better get on it.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116045693667002188?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116045693667002188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116045693667002188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116045693667002188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116045693667002188'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/wordssql.html' title='Words.sql'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116026115965762143</id><published>2006-10-08T08:45:00.000+10:00</published><updated>2006-10-08T08:45:59.790+10:00</updated><title type='text'>Older Notes</title><content type='html'>&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Whittling away at the errors. Taking what I need from other's source code. Making it build, compile. Other people's thoughts and thinking coming though the code. Learning about new coding styles.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Well I'm mighty proud of myself now... it was a long road, but the architecture I've set up to make words extensible for different dictionary types works! I plug in anything, and as long as the new dictionary is compatible with the application's API (actually as long as the correct API is provided by the new plug in) then Words will go and get the blob of definitions in the right way. The next thing to do is to complete the StardictDict class to actually look up blobs from the dictionary it is assigned to.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Next step is to actually do some searching and to move the dictionary in and out of the Words sphere with import and export, so that they can be packaged up and put on a server for downloading via the dictionary downloader.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;I need some kind of policy for dictionary naming conventions.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;File extension: .wordsDict&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Apparently, the unique naming convention I have inbuilt so far is by the "Name" attribute. So I have to make sure this is all unique and stuff, for all kinds. It would be probably best if there are no spaces allowed too. This name can be used for the file name, and also internally to determine uniqueness.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Pivot_Target_Location_Type.wordsDict&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Location is probably the hard bit. It would be something like dictDotOrg&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;It has to be the most.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Think about ordering in a list. Would it be more convenient to order the dictionaries by target? Or by protocol? In the case of non networked dictionaries, location would mean the name that it's generally given. Like en-ja or something. It doesn't really matter as long as it's a fairly unique name.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;This means that other protocols can have a en-ja dictionary but still not clash.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Ie&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Type_Pivot_Target_Location.wordsDict&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;It all seems to work, still more testing to do, and more data entry to do to support more dictionaries.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116026115965762143?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116026115965762143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116026115965762143' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116026115965762143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116026115965762143'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/older-notes.html' title='Older Notes'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-116002218875439109</id><published>2006-10-05T14:17:00.000+10:00</published><updated>2006-10-05T14:23:08.776+10:00</updated><title type='text'>Me, a little managedObject</title><content type='html'>I spent last night as a peaceful managedObject in his managedObjectContext, without worrying one little bit about all the programming and structure that I was being subjected to in the middle of the night.&lt;br /&gt;&lt;br /&gt;I never used to be able to sleep after a serious bout of code, but it seems like as you  do more code, you become more content with a nights sleep as an object being pushed around by while loops, being enumerated, and being smothered in objective-C wrappers, or as previously, spending the night as a well formed ascii file.&lt;br /&gt;&lt;br /&gt;Has anyone done any reasearch into this thing? I know it's not a programming only thing, but it's when I get it the worst. I'd like to think that it has something to do with the brain learning tings subconciously.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-116002218875439109?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/116002218875439109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=116002218875439109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116002218875439109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/116002218875439109'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/me-little-managedobject.html' title='Me, a little managedObject'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115989414898719981</id><published>2006-10-04T02:49:00.000+10:00</published><updated>2006-10-04T02:49:13.963+10:00</updated><title type='text'>Revolutionary new Asset Downloader!</title><content type='html'>&lt;p class="mobile-post"&gt;I need to bind something to all the words, so what about (yet  &lt;br /&gt;another) NSArrayController that always has in it all the words, and  &lt;br /&gt;knows about the changes within, so that it can do the stuff like  &lt;br /&gt;unpack the definitions for me, and update the UI as needed. Such an  &lt;br /&gt;object specifically designed for this purpose might be handy.&lt;/p&gt;&lt;p class="mobile-post"&gt;Rubbish all the above. All I needed to do was unpack it in the  &lt;br /&gt;WordMO. The distributed objects system did all the thread switching  &lt;br /&gt;for me!&lt;/p&gt;&lt;p class="mobile-post"&gt;Moving right along, I need to fix stardicts, because they're kind of  &lt;br /&gt;powerful and a major plus for users.&lt;/p&gt;&lt;p class="mobile-post"&gt;Because it's late, and because I want to, I'm going to work on my web  &lt;br /&gt;view downloader. Let's get dictionaries to the people, baby.&lt;/p&gt;&lt;p class="mobile-post"&gt;Yay! It's 2.40 AM, but I whittled away at it and I can now drag and  &lt;br /&gt;drop from a web view to download files. There's a really neat class  &lt;br /&gt;called NSURLDownload which is like fully threaded and sick man and  &lt;br /&gt;you can even have like progress meters and shit.&lt;/p&gt;&lt;p class="mobile-post"&gt;Ok bed time.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115989414898719981?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115989414898719981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115989414898719981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115989414898719981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115989414898719981'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/revolutionary-new-asset-downloader.html' title='Revolutionary new Asset Downloader!'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115987736246544868</id><published>2006-10-03T22:09:00.000+10:00</published><updated>2006-10-03T22:09:22.846+10:00</updated><title type='text'>Threading Issues</title><content type='html'>&lt;p class="mobile-post"&gt;Turns out my sneakly little plan to squeeze information back through  &lt;br /&gt;the managedObjects attributes into the main thread is working out. I  &lt;br /&gt;AM using a NSMutableDictionary and NSArchiver in the thread, but the  &lt;br /&gt;other thread isn't actually working on the objects I create with  &lt;br /&gt;those classes, so I'm hoping that will be ok?&lt;/p&gt;&lt;p class="mobile-post"&gt;I create a dashboard for each word, then archive it up and pop it in  &lt;br /&gt;the dashboardData attribute in the managedObject, which has been  &lt;br /&gt;passed to the thread through the communications port set up when the  &lt;br /&gt;worker thread is instantiated.&lt;/p&gt;&lt;p class="mobile-post"&gt;The information seems to get though the thread wall ok. My next job  &lt;br /&gt;is to unarchive it on the other side and put it where it belongs, as  &lt;br /&gt;blob managedObjects in the managedObjectContext proper.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115987736246544868?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115987736246544868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115987736246544868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115987736246544868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115987736246544868'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/threading-issues.html' title='Threading Issues'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115976867433281757</id><published>2006-10-02T15:57:00.000+10:00</published><updated>2006-10-02T15:57:54.463+10:00</updated><title type='text'>Ahh Finally some progress!</title><content type='html'>&lt;p class="mobile-post"&gt;I'm trying to think of  a way to deal with the bloat in my  &lt;br /&gt;NSArrayController subclasses, particularly to deal with the issue of  &lt;br /&gt;fetching and updating... although it might not actually deal with the  &lt;br /&gt;issue... but it would certainly cut down on bloat in those array  &lt;br /&gt;controllers.&lt;/p&gt;&lt;p class="mobile-post"&gt;Here are the symptoms&lt;br /&gt;Words are inserted into the moc&lt;br /&gt;'old' smart lists don't update themselves&lt;br /&gt;'new' smart lists will&lt;/p&gt;&lt;p class="mobile-post"&gt;So it's almost certainly an issue with the predicates save/refresh  &lt;br /&gt;cycle.&lt;/p&gt;&lt;p class="mobile-post"&gt;I think it has to do with my SmartGroup class. It's a bit of a hack  &lt;br /&gt;really. And it also might have something to do with the way I  &lt;br /&gt;identify smartgroups and tie them to languages, and how the simple  &lt;br /&gt;name value of the language is what is used to fetch words. I think it  &lt;br /&gt;would me more intelligent and better design to use the objectID as  &lt;br /&gt;the key across the system for language, and to get the name of the  &lt;br /&gt;language as needed.&lt;/p&gt;&lt;p class="mobile-post"&gt;I designed it this way because back then I didn't even realise the  &lt;br /&gt;all objects had an ID (well it's obvious NOW) that I could use to  &lt;br /&gt;identify the languages uniquely.&lt;/p&gt;&lt;p class="mobile-post"&gt;I had the idea of doing this, but I found I couldn't set an entire  &lt;br /&gt;entity object into a predicate field, but now I can get an object ID  &lt;br /&gt;string which will do the same thing as having the object itself.&lt;/p&gt;&lt;p class="mobile-post"&gt;So while I'm fixing this, I'm also going to try and iron out a few of  &lt;br /&gt;those warnings and things which also might be stuffing me around.&lt;/p&gt;&lt;p class="mobile-post"&gt;Nope, even forcing object directly into the ManagedObjectContext  &lt;br /&gt;doesn't fix the problem (it actually causes problems with updating).&lt;/p&gt;&lt;p class="mobile-post"&gt;What about this idea. What if all I store is a predicate string, and  &lt;br /&gt;then when the group is loaded, all it does is force a filter on the  &lt;br /&gt;words array controller, so that it filters out the words that I want.  &lt;br /&gt;Filtering works nicely. And I can set filter predicates programatically.&lt;br /&gt;So bind the filter predicate of the words array controller to the  &lt;br /&gt;selected group of the group array controller. But let's test this now  &lt;br /&gt;with that playgroud tableview I set up.&lt;/p&gt;&lt;p class="mobile-post"&gt;Woah if this thing works, then I have a big lesson to learn about  &lt;br /&gt;chucking one's own hard earned code away.  I DID have this idea  &lt;br /&gt;several times in the past... I hope to high heaven it works!&lt;/p&gt;&lt;p class="mobile-post"&gt;Tough Titties!&lt;br /&gt;Bad code is bad code.&lt;/p&gt;&lt;p class="mobile-post"&gt;Hey, it actually feels good to delete it all! And guess what, most of  &lt;br /&gt;it was complicated scwisseling code from the CoreRecipesApp anyway.&lt;/p&gt;&lt;p class="mobile-post"&gt;It IS noticeably slower, so I won't delete that caching thing just  &lt;br /&gt;yet. Well it worked just then. Perhaps it's tempremental.  &lt;br /&gt;Nevertheless, I have fixed a major bug anyway. Now I have to hook the  &lt;br /&gt;other stuff up again and hope it keeps on working!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115976867433281757?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115976867433281757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115976867433281757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115976867433281757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115976867433281757'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/10/ahh-finally-some-progress.html' title='Ahh Finally some progress!'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115954264692583594</id><published>2006-09-30T01:07:00.000+10:00</published><updated>2006-09-30T01:10:46.963+10:00</updated><title type='text'>Flickr Image Search</title><content type='html'>Thanks to a handy API, Words now does flickr tag search nicely. It was a bit confusing at first, but the API is well designed as it is and the author has further plans to make it really great, even "Sparkle like".&lt;br /&gt;&lt;br /&gt;If I get anything up and running myself, I might even contribute some code to it myself!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115954264692583594?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115954264692583594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115954264692583594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115954264692583594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115954264692583594'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/flickr-image-search.html' title='Flickr Image Search'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115949344879881589</id><published>2006-09-29T11:29:00.000+10:00</published><updated>2006-09-29T11:30:48.816+10:00</updated><title type='text'>Update to Jim</title><content type='html'>Posting this here because it's probably the most coherant bit of writing I've done for several weeks! And it explains what I'm doing at the moment, even with all the typos.&lt;br /&gt;--&lt;br /&gt;Jim,&lt;br /&gt;&lt;br /&gt;Since we haven't met up for a while, I'll give you a quick overview of&lt;br /&gt;where I'm at with the project. I've been working really hard on it (to&lt;br /&gt;the unfortunate detriment of my other studies) and I'm really excited&lt;br /&gt;about where its heading.&lt;br /&gt;&lt;br /&gt;First, sorry for not getting back to you on both accounts re the meeting&lt;br /&gt;and the objects! I have my application working now for onine Dict&lt;br /&gt;protocol dictionaries, which work quite well, and I have recently added&lt;br /&gt;basic support for stardict dictionaries, in a bundled format specific to&lt;br /&gt;my application. One of the goals for Words is to make it dead simple for&lt;br /&gt;users to download and install new dictionaries, and I'm working on a new&lt;br /&gt;interface to do this. I'm having issues with syncs while multithreading I&lt;br /&gt;think, although I haven't attempted to debug that part yet. I'm still not&lt;br /&gt;clear on how to use xjdic (minus the x for X11 part of course) to support&lt;br /&gt;the Edict format within the context of my application, but I'm still keen&lt;br /&gt;to&lt;br /&gt;&lt;br /&gt;I've also had some changes to the design of the user interface, which&lt;br /&gt;changes the proposed interaction for the app, and I've thought of a new&lt;br /&gt;direction in which I would like to take the networked side of things.&lt;br /&gt;&lt;br /&gt;Following seeing this&lt;br /&gt;video:http://video.google.com/videoplay?docid=-8246463980976635143 I was&lt;br /&gt;insired to aggregate user's word lists and definitions, uncluding images&lt;br /&gt;and sounds, into a central database, in order to construct a user&lt;br /&gt;generated multi language dictionary.&lt;br /&gt;&lt;br /&gt;Using some nifty networked, server side wizardry, the details of which I&lt;br /&gt;haven't even begun to fathom, you could make some very fun, data&lt;br /&gt;validating two player quiz games incorporating all the aggregated media.&lt;br /&gt;&lt;br /&gt;This also could potentially solve the hard problem of parsing the output&lt;br /&gt;of dictionary searches. Because Words can / will connect to many&lt;br /&gt;different dictionaries, it would be infeasable for me to write a parser&lt;br /&gt;for each one to fine tune the formatting. And who can decide on what&lt;br /&gt;definition is 'main' and should be used for quizzing. I cannot see how a&lt;br /&gt;computer can determine this. At the moment, I call what dictionaries spit&lt;br /&gt;out a 'definitionsBlob' or just a 'blob', and the user has the option of&lt;br /&gt;setting at the moment 4 'main' definitions, which will be used in&lt;br /&gt;quizzing etc. When networked, Words will first query the centralised&lt;br /&gt;dictionary, and if there is a match, it will set these fields for you,&lt;br /&gt;based on other users' submissions on the same word.&lt;br /&gt;&lt;br /&gt;And if there is a user community, I could create a plugin architecture&lt;br /&gt;for other interested people to write the 'blob' formatter for specific&lt;br /&gt;dictionaries for pretty printing.&lt;br /&gt;&lt;br /&gt;I've also decided against the smaller, minimised view in favour of a&lt;br /&gt;speech bubble which will appear above a word once it is highlighted and&lt;br /&gt;invoked by a right click menu or hotkey anywhere in the system, which&lt;br /&gt;will give you your definitions.&lt;br /&gt;&lt;br /&gt;Comments / Suggestions always welcome! It would be great if you had a Mac&lt;br /&gt;so you could test it ;-)&lt;br /&gt;&lt;br /&gt;-Mathieu&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115949344879881589?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115949344879881589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115949344879881589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115949344879881589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115949344879881589'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/update-to-jim.html' title='Update to Jim'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115933747010295272</id><published>2006-09-27T16:10:00.000+10:00</published><updated>2006-09-27T16:11:10.113+10:00</updated><title type='text'>Blog Lookup</title><content type='html'>&lt;a href="http://www.flickr.com/photos/mathieutozer/253887756/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/89/253887756_c1ac4a0523.jpg" width="405" height="215" alt="gotTheStardictBlob-1.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115933747010295272?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115933747010295272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115933747010295272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115933747010295272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115933747010295272'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/blog-lookup.html' title='Blog Lookup'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115917122147936262</id><published>2006-09-25T18:00:00.000+10:00</published><updated>2006-09-25T18:00:21.580+10:00</updated><title type='text'>Old Notes</title><content type='html'>&lt;p class="mobile-post"&gt;I want words to define words in a separate thread, so that it doesn't  &lt;br /&gt;take control of the application&lt;br /&gt;But I have to carefully design how this is going to happen?&lt;br /&gt;At the word level?&lt;br /&gt;At the word list level?&lt;/p&gt;&lt;p class="mobile-post"&gt;I think atomically at the word level it would be best.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'd imaging that it would work something like this.&lt;/p&gt;&lt;p class="mobile-post"&gt;Define Word(s)&lt;br /&gt;	Start a new (worker?) thread&lt;br /&gt;	Pass the words to it&lt;br /&gt;		For each word&lt;br /&gt;		Start a progress indicator&lt;br /&gt;	When the word has been returned&lt;br /&gt;	Stop the progress indicator for that word.&lt;/p&gt;&lt;p class="mobile-post"&gt;Might the network connection monitor actually be better in another  &lt;br /&gt;thread too?&lt;br /&gt;But that's not what takes all the time...&lt;br /&gt;The application at any time needs to have connected dictionaries.  &lt;br /&gt;Should each dictionary have its own thread?&lt;br /&gt;Or should the one thread manage all connected dictionaries.. or  &lt;br /&gt;should a connected dictionary itself be passed to the thread?&lt;br /&gt;Or should a connected dictionary start a new thread for each stream  &lt;br /&gt;of words it needs to define?&lt;/p&gt;&lt;p class="mobile-post"&gt;So, when you ask a dictionary to define:words, it connects (if it  &lt;br /&gt;can) and starts a new thread to define the words. And quits when it's  &lt;br /&gt;done.&lt;/p&gt;&lt;p class="mobile-post"&gt;This model might make it easier because I don't have to change much  &lt;br /&gt;of the existing code base. But is it good form for  a model object to  &lt;br /&gt;start a thread? Seems like a controller thing to do really.&lt;br /&gt;But we do want each word to be able to be defining itself atomically  &lt;br /&gt;and independently of everything else.&lt;br /&gt;And it would be nice to say "hey, you, try and define yourself!"  &lt;br /&gt;which could be done around a loop for each word, and it will go away  &lt;br /&gt;and create a thread for itself and look up everything in the right  &lt;br /&gt;dictionary etc.&lt;br /&gt;	&lt;br /&gt;For each word being defined&lt;br /&gt;	Start a new thread&lt;br /&gt;	Pass the define:word method to it&lt;br /&gt;	Kill the thread once the defining is done.&lt;/p&gt;&lt;p class="mobile-post"&gt;This could have too much overhead with starting and stopping all  &lt;br /&gt;those threads.&lt;/p&gt;&lt;p class="mobile-post"&gt;I kind of need to decide for certain though how I want the system to  &lt;br /&gt;define things.&lt;br /&gt;Obviously I want it to try to define stuff for itself, but there also  &lt;br /&gt;has to be some way to force it to define words through the user  &lt;br /&gt;interface as well.&lt;/p&gt;&lt;p class="mobile-post"&gt;But this is the way it WILL work, if each dictionary has it's own  &lt;br /&gt;thread. So it's dictionary thread centric. A new dictionary thread is  &lt;br /&gt;started and is fed a word object which it takes. It does the work of  &lt;br /&gt;defining the word, and then defines the word (if it can), and let's  &lt;br /&gt;us know when it's done.&lt;/p&gt;&lt;p class="mobile-post"&gt;So by this, the define method in the dictionary should create the  &lt;br /&gt;thread.&lt;/p&gt;&lt;p class="mobile-post"&gt;I wonder if I start a thread at the point in the code that takes a  &lt;br /&gt;lot of time and makes the program freeze, that it will just work. The  &lt;br /&gt;new threads will follow along, and return back to the main thread  &lt;br /&gt;when the work is done, and just proceed like normal...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115917122147936262?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115917122147936262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115917122147936262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115917122147936262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115917122147936262'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/old-notes.html' title='Old Notes'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115915093297342305</id><published>2006-09-25T12:22:00.000+10:00</published><updated>2006-09-25T12:22:13.090+10:00</updated><title type='text'>Making Improvements</title><content type='html'>&lt;p class="mobile-post"&gt;I think I need to start working to a timetable, with time constraints  &lt;br /&gt;and everything, because if I want things to be done in time, that's  &lt;br /&gt;how it's going to work.&lt;/p&gt;&lt;p class="mobile-post"&gt;Besides, it's what happens in the real world. Well I think. I guess  &lt;br /&gt;in the case of even Microsoft you ship when it's ready.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'm still not sure which language/implementation will be needed to  &lt;br /&gt;make the server, but again, that would be jumping the gun because I  &lt;br /&gt;have to have a thorough idea of what to build before I start deciding  &lt;br /&gt;what to build it in.&lt;/p&gt;&lt;p class="mobile-post"&gt;So leave that aside for the moment.&lt;/p&gt;&lt;p class="mobile-post"&gt;Get back to the stuff that is making Words!!&lt;/p&gt;&lt;p class="mobile-post"&gt;Now that I can import and export words, I feel better about killing  &lt;br /&gt;the sql file and changing the data model, because I (and users) have  &lt;br /&gt;a way of saving their words (the valuable bits) and getting on with  &lt;br /&gt;things. So now I can actually start using words a bit more for  &lt;br /&gt;recording all those funny words I hear here and there.&lt;/p&gt;&lt;p class="mobile-post"&gt;yaaay~&lt;/p&gt;&lt;p class="mobile-post"&gt;The selection of groups is now preserved!! The group you had selected  &lt;br /&gt;will be saved for you when you come back to it, whenever that might be.&lt;/p&gt;&lt;p class="mobile-post"&gt;Now I'm off to take care of my body, by running to Bells Beach&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115915093297342305?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115915093297342305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115915093297342305' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115915093297342305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115915093297342305'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/making-improvements.html' title='Making Improvements'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115906975300633621</id><published>2006-09-24T13:49:00.000+10:00</published><updated>2006-09-24T13:49:13.100+10:00</updated><title type='text'>More Musings re Networked Features</title><content type='html'>&lt;p class="mobile-post"&gt;Possible inclusions into what a words attributes should be:&lt;br /&gt;A generalised notes section.&lt;br /&gt;Flag definition as inappropriate / incorrect.&lt;br /&gt;Phonetics&lt;br /&gt;Pronunciation sound byte&lt;br /&gt;Terms (example usages)&lt;br /&gt;Idiomacity&lt;br /&gt;Misspellings, common misspellings and variant spellings&lt;br /&gt;tags?? For categories??&lt;br /&gt;Is submitted.&lt;/p&gt;&lt;p class="mobile-post"&gt;The system will have to be tested and run for a while to iron out the  &lt;br /&gt;bugs and discrepancies that are coded into the system.&lt;/p&gt;&lt;p class="mobile-post"&gt;After all, it is still meant to be a loose way of defining things.&lt;/p&gt;&lt;p class="mobile-post"&gt;I guess what I need to do is design this part of the system more  &lt;br /&gt;thoroughly from a user interface level.&lt;br /&gt;I need to know what kind of data a user might want about a word.&lt;/p&gt;&lt;p class="mobile-post"&gt;But how many should I allow?? 5? 10? As many as there are? As many as  &lt;br /&gt;there are on the server side, but on the client side, they should  &lt;br /&gt;only see their own, and the most popular.&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway, I need to set up the stand alone system first, and the  &lt;br /&gt;networked version CAN come later.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115906975300633621?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115906975300633621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115906975300633621' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115906975300633621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115906975300633621'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/more-musings-re-networked-features.html' title='More Musings re Networked Features'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115892945783516497</id><published>2006-09-22T22:50:00.000+10:00</published><updated>2006-09-22T22:50:57.943+10:00</updated><title type='text'>Bubble Popup specs</title><content type='html'>&lt;p class="mobile-post"&gt;Upon the services invocation to add to words&lt;br /&gt;Determine the highlighted word&lt;br /&gt;Determine the location of the highlighted word on the screen&lt;br /&gt;Start a new bubbleWindow at the location&lt;br /&gt;	The bubble window will be a cute little animated thing with some  &lt;br /&gt;whispering sounds&lt;br /&gt;Also start asking Words to define the highlighted word&lt;br /&gt;	Words searches the user's local dictionary first, then checks the  &lt;br /&gt;remote dictionaries second.&lt;br /&gt;The word is added to the user's history.&lt;br /&gt;And a summary of the definition is displayed in the bubble.&lt;br /&gt;The user can click in the bubble to display the word in the expanded  &lt;br /&gt;view of Words (the main window).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115892945783516497?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115892945783516497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115892945783516497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115892945783516497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115892945783516497'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/bubble-popup-specs.html' title='Bubble Popup specs'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115891819951061741</id><published>2006-09-22T19:43:00.000+10:00</published><updated>2006-09-22T19:43:19.616+10:00</updated><title type='text'>Multithreading</title><content type='html'>&lt;p class="mobile-post"&gt;It's been amazing the amount of fear that multi threading can instill  &lt;br /&gt;in the heart of a novice programmer! It's just such a break away from  &lt;br /&gt;the norm. But just now I've seen my first thread be spawned by my  &lt;br /&gt;application. Feels like I'm a Dragon Master in a Wyrn. Remember those  &lt;br /&gt;threads that rained fire from space?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115891819951061741?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115891819951061741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115891819951061741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115891819951061741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115891819951061741'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/multithreading.html' title='Multithreading'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115888198422140286</id><published>2006-09-22T09:39:00.000+10:00</published><updated>2006-09-22T09:39:44.243+10:00</updated><title type='text'>Nasty Bug, and Words 0.09</title><content type='html'>Nasty bug, dance, dance dance!&lt;br /&gt;&lt;br /&gt;I'm going to live with it for a bit longer. I've asked the community about it and am awaiting a reply.&lt;br /&gt;&lt;br /&gt;Some other changes I've made in the process is to remove the +Smart List button from the main window, as I believe it will be something that the user will only do occasionally, and it is a task which takes longer to complete anyway and thus the added commitment to go to the menu is a small in comparison overhead to adding a smart group (the predicate editor will have to be set etc).&lt;br /&gt;&lt;br /&gt;I've also recently decided on a new, secret direction for Words.&lt;br /&gt;&lt;br /&gt;So I'm going to move on ignoring the fetching issue on the smart groups after they have been through the data store.&lt;br /&gt;&lt;br /&gt;Hmm, the plot thickens! (I know I said I'd leave it aside) If I add a new smart list from the menu - it updates fine! Does it have something then to do with the way the predicate is being stored? It's not being stored so that it can be dynamic when it is fetched? Does it grow stale in the store? Might I work around this by saving it as a string instead and refreshing it when it's loaded?&lt;br /&gt;&lt;br /&gt;One thing that's holding be back from developing and exporting dictionaries further is this feeling (assuredness) that the data model is going to change again, which will mean that I'll have to build all the dictionaries and languages again from scratch.&lt;br /&gt;&lt;br /&gt;Perhaps the best bet is to simply build the languages and dictionaries to be custom to the testers who are using it.&lt;br /&gt;&lt;br /&gt;Words now supports Jargon and Sweedish as languages, with basic dictionaries for those languages available when connected to the internet. These come via dict.org.&lt;br /&gt;&lt;br /&gt;スエーデン語をサポートしました。日本語／スエーデン語に訳す辞書がありませんが、英語／スエーデン語はあります。どうぞお勉強を頑張り下さい。&lt;br /&gt;&lt;br /&gt;Words 0.09&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115888198422140286?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115888198422140286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115888198422140286' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115888198422140286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115888198422140286'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/nasty-bug-and-words-009.html' title='Nasty Bug, and Words 0.09'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115888174077583266</id><published>2006-09-22T09:35:00.000+10:00</published><updated>2006-09-22T09:35:40.893+10:00</updated><title type='text'>Yesterday's Thread Notes</title><content type='html'>&lt;p class="mobile-post"&gt;I want words to define words in a separate thread, so that it doesn't  &lt;br /&gt;take control of the application&lt;br /&gt;But I have to carefully design how this is going to happen?&lt;br /&gt;At the word level?&lt;br /&gt;At the word list level?&lt;/p&gt;&lt;p class="mobile-post"&gt;I think atomically at the word level it would be best.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'd imaging that it would work something like this.&lt;/p&gt;&lt;p class="mobile-post"&gt;Define Word(s)&lt;br /&gt;	Start a new (worker?) thread&lt;br /&gt;	Pass the words to it&lt;br /&gt;		For each word&lt;br /&gt;		Start a progress indicator&lt;br /&gt;	When the word has been returned&lt;br /&gt;	Stop the progress indicator for that word.&lt;/p&gt;&lt;p class="mobile-post"&gt;Might the network connection monitor actually be better in another  &lt;br /&gt;thread too?&lt;br /&gt;But that's not what takes all the time...&lt;br /&gt;The application at any time needs to have connected dictionaries.  &lt;br /&gt;Should each dictionary have its own thread?&lt;br /&gt;Or should the one thread manage all connected dictionaries.. or  &lt;br /&gt;should a connected dictionary itself be passed to the thread?&lt;br /&gt;Or should a connected dictionary start a new thread for each stream  &lt;br /&gt;of words it needs to define?&lt;/p&gt;&lt;p class="mobile-post"&gt;So, when you ask a dictionary to define:words, it connects (if it  &lt;br /&gt;can) and starts a new thread to define the words. And quits when it's  &lt;br /&gt;done.&lt;/p&gt;&lt;p class="mobile-post"&gt;This model might make it easier because I don't have to change much  &lt;br /&gt;of the existing code base. But is it good form for  a model object to  &lt;br /&gt;start a thread? Seems like a controller thing to do really.&lt;br /&gt;But we do want each word to be able to be defining itself atomically  &lt;br /&gt;and independently of everything else.&lt;br /&gt;And it would be nice to say "hey, you, try and define yourself!"  &lt;br /&gt;which could be done around a loop for each word, and it will go away  &lt;br /&gt;and create a thread for itself and look up everything in the right  &lt;br /&gt;dictionary etc.&lt;br /&gt;	&lt;br /&gt;For each word being defined&lt;br /&gt;	Start a new thread&lt;br /&gt;	Pass the define:word method to it&lt;br /&gt;	Kill the thread once the defining is done.&lt;/p&gt;&lt;p class="mobile-post"&gt;This could have too much overhead with starting and stopping all  &lt;br /&gt;those threads.&lt;/p&gt;&lt;p class="mobile-post"&gt;I kind of need to decide for certain though how I want the system to  &lt;br /&gt;define things.&lt;br /&gt;Obviously I want it to try to define stuff for itself, but there also  &lt;br /&gt;has to be some way to force it to define words through the user  &lt;br /&gt;interface as well.&lt;/p&gt;&lt;p class="mobile-post"&gt;But this is the way it WILL work, if each dictionary has it's own  &lt;br /&gt;thread. So it's dictionary thread centric. A new dictionary thread is  &lt;br /&gt;started and is fed a word object which it takes. It does the work of  &lt;br /&gt;defining the word, and then defines the word (if it can), and let's  &lt;br /&gt;us know when it's done.&lt;/p&gt;&lt;p class="mobile-post"&gt;So by this, the define method in the dictionary should create the  &lt;br /&gt;thread.&lt;/p&gt;&lt;p class="mobile-post"&gt;I wonder if I start a thread at the point in the code that takes a  &lt;br /&gt;lot of time and makes the program freeze, that it will just work. The  &lt;br /&gt;new threads will follow along, and return back to the main thread  &lt;br /&gt;when the work is done, and just proceed like normal...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115888174077583266?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115888174077583266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115888174077583266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115888174077583266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115888174077583266'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/yesterdays-thread-notes.html' title='Yesterday&apos;s Thread Notes'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115883403465017644</id><published>2006-09-21T20:20:00.000+10:00</published><updated>2006-09-21T20:20:34.750+10:00</updated><title type='text'>More Notes</title><content type='html'>&lt;p class="mobile-post"&gt;An undefined words smart group.&lt;/p&gt;&lt;p class="mobile-post"&gt;Perhaps try to implement the speech bubble as a plain box first that  &lt;br /&gt;appears with a definition. But before that happens, I want more stuff  &lt;br /&gt;'up top' to be working sufficiently.&lt;/p&gt;&lt;p class="mobile-post"&gt;I REALLY don't know the answer to my core data issues... :-(&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115883403465017644?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115883403465017644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115883403465017644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115883403465017644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115883403465017644'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/more-notes.html' title='More Notes'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115875179215421383</id><published>2006-09-20T21:29:00.000+10:00</published><updated>2006-09-20T21:29:52.310+10:00</updated><title type='text'>Returning to Defining Words With My New Found Dictionaries</title><content type='html'>&lt;p class="mobile-post"&gt;Now that I have set the architecture up for importing and exporting  &lt;br /&gt;languages and dictionaries, and then setting them into the project  &lt;br /&gt;bundle to be part of the next release of the software, I feel I must  &lt;br /&gt;return to the actual looking up of words, when that happens, and all  &lt;br /&gt;that.&lt;/p&gt;&lt;p class="mobile-post"&gt;Primarily, I want it to, as per the spec&lt;br /&gt;a) Attempt to define words *as they are entered*, and display and  &lt;br /&gt;indicator to that effect.&lt;br /&gt;b) Attempt to define undefined words.&lt;br /&gt;c) Be able to wipe definitions clean.&lt;br /&gt;d) Fix the network awareness.&lt;br /&gt;e) Let the user know when nothing was found.&lt;br /&gt;f) The definitions view, but that's another whole kettle of fish.&lt;br /&gt;g) Implement the buttons which add the main definitions&lt;br /&gt;h) When defining words, display a spiral progress indicator and let  &lt;br /&gt;the user keep working with Words.&lt;/p&gt;&lt;p class="mobile-post"&gt;yes yes Indicators Indicators INDICATORS! It's time to start telling  &lt;br /&gt;the user what's happening when Words takes control of the computer.&lt;/p&gt;&lt;p class="mobile-post"&gt;Another thing to think about is what I'm aiming for for first time  &lt;br /&gt;users.&lt;br /&gt;1) Launch Words&lt;br /&gt;2) See Some Example Languages Already Set Up (Maybe??)&lt;br /&gt;OR show the add languages view&lt;br /&gt;3)See the example words be defined automatically by the system.&lt;/p&gt;&lt;p class="mobile-post"&gt;I wouldn't mind having an even closer to user interface like a bubble  &lt;br /&gt;that appears above the highlighted word text.&lt;/p&gt;&lt;p class="mobile-post"&gt;It might be best for me to have a worker thread for defining words. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115875179215421383?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115875179215421383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115875179215421383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115875179215421383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115875179215421383'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/returning-to-defining-words-with-my.html' title='Returning to Defining Words With My New Found Dictionaries'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115866930668130823</id><published>2006-09-19T22:35:00.000+10:00</published><updated>2006-09-19T22:35:06.896+10:00</updated><title type='text'>Language and Dictionary Management: Next Steps</title><content type='html'>&lt;p class="mobile-post"&gt;Now that I can safely import and export dictionaries, it is up to me to&lt;br /&gt;a) Add support for as many dictionaries as possible.&lt;br /&gt;b) Create more languages which are supported to match those  &lt;br /&gt;dictionaries.&lt;br /&gt;c) Implement the add all supported dictionaries on startup procedure.&lt;/p&gt;&lt;p class="mobile-post"&gt;The problem is that sure, on first launch, import all the  &lt;br /&gt;dictionaries. But what about on updated versions of words? I guess if  &lt;br /&gt;a person is HANDED a dictionary, then they use the regular import  &lt;br /&gt;command.&lt;br /&gt;We are only talking about importing the supported dictionaries here,  &lt;br /&gt;the internal ones. So it is sufficient to add them all, or more  &lt;br /&gt;precisely, add all the dictionaries to the store on launch that  &lt;br /&gt;aren't already in the store.&lt;/p&gt;&lt;p class="mobile-post"&gt;This will slow start up down efficiently, but let's see how it goes.  &lt;br /&gt;The dictionaries are fairly light, and it wouldn't be too hard to  &lt;br /&gt;optimise the checking with versioning.&lt;/p&gt;&lt;p class="mobile-post"&gt;It seems to work. Haven't fully tested it yet though&lt;br /&gt;The question is now, of course, will it scale, and work well under  &lt;br /&gt;the pressure of the real world as opposed to the toy world situation.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115866930668130823?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115866930668130823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115866930668130823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115866930668130823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115866930668130823'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/language-and-dictionary-management.html' title='Language and Dictionary Management: Next Steps'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115864930698196743</id><published>2006-09-19T17:01:00.000+10:00</published><updated>2006-09-19T17:01:47.000+10:00</updated><title type='text'>Dictionary Management Advancements</title><content type='html'>&lt;p class="mobile-post"&gt;I can now use the dictionary factory view to pump out dictionaries.&lt;br /&gt;I still have more work to do to get it exporting those dictionaries,  &lt;br /&gt;and from there I still have to implement the 'available from launch'  &lt;br /&gt;dictionary method.&lt;/p&gt;&lt;p class="mobile-post"&gt;I am really excited about finishing this off because it is one of the  &lt;br /&gt;final fronteirs to getting words up and running the way I want it.  &lt;br /&gt;Until now it has been very touchy, and quite unusable to anyone but me.&lt;/p&gt;&lt;p class="mobile-post"&gt;But since I have started to implement the advanced dictionary and  &lt;br /&gt;language management, having kind of finished the word management  &lt;br /&gt;side, I feel more people will be ready to use it, because I can pass  &lt;br /&gt;them new dictionaries and languages, and then add them to the next  &lt;br /&gt;release of words.&lt;/p&gt;&lt;p class="mobile-post"&gt;There is still quite a bit of work to do, as I said. But it's nice to  &lt;br /&gt;see it coming together somewhat. I'll try to release Version 0.08 soon.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115864930698196743?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115864930698196743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115864930698196743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115864930698196743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115864930698196743'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/dictionary-management-advancements.html' title='Dictionary Management Advancements'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115864767560526598</id><published>2006-09-19T16:34:00.000+10:00</published><updated>2006-09-19T16:34:35.760+10:00</updated><title type='text'>Language Management</title><content type='html'>&lt;p class="mobile-post"&gt;It is now possible to create languages in the 'language  &lt;br /&gt;factory' (including an icon) export them to file, import them from  &lt;br /&gt;file using the language factory. Words will also look for files  &lt;br /&gt;contained within the bundle and display a list of them to choose from  &lt;br /&gt;in the 'supported languages' list when you add a language, and the  &lt;br /&gt;language will be added when you click add.&lt;/p&gt;&lt;p class="mobile-post"&gt;The next thing is to do the same for dictionaries, and see if it all  &lt;br /&gt;matches up. Perhaps language objects can keep an array of dictionary  &lt;br /&gt;names that it will try to set as 'in use' if they are available.&lt;/p&gt;&lt;p class="mobile-post"&gt;On export&lt;br /&gt;Put all the dictionaries that a language should try to set itself up  &lt;br /&gt;for when initialised into an array and archive it with the rest of  &lt;br /&gt;the language.&lt;/p&gt;&lt;p class="mobile-post"&gt;On import&lt;br /&gt;Fetch dictionaries to that capability.&lt;br /&gt;Take the array and search the available dictionary names and if there  &lt;br /&gt;is a match then connect it up!&lt;/p&gt;&lt;p class="mobile-post"&gt;Words will also need some initialiser text - the text that is  &lt;br /&gt;displayed first when you import a language.&lt;/p&gt;&lt;p class="mobile-post"&gt;But now I think I need to talk about dictionaries.&lt;br /&gt;They need to be created, for whichever type they are, able to be  &lt;br /&gt;exported, and then fetched by the system when it loads, imported into  &lt;br /&gt;the user's database (not the whole file of index / definitions for  &lt;br /&gt;local dictionaries of course, just their Words management part).&lt;/p&gt;&lt;p class="mobile-post"&gt;Once I manage to get it into the managed object context, the existing  &lt;br /&gt;code should take care of the rest.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115864767560526598?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115864767560526598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115864767560526598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115864767560526598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115864767560526598'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/language-management.html' title='Language Management'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115856578734594602</id><published>2006-09-18T17:49:00.000+10:00</published><updated>2006-09-18T17:49:47.446+10:00</updated><title type='text'>Changes To Internal Language Management</title><content type='html'>&lt;p class="mobile-post"&gt;I'm going to remove the second context because it doesn't really make  &lt;br /&gt;all that much sense to have a second managed object conext. It would  &lt;br /&gt;be better to simply have an import exporter function and automate  &lt;br /&gt;this process on the first start up or something. Ie, just keep them  &lt;br /&gt;in the bundle as .wordslanguage files or something.&lt;/p&gt;&lt;p class="mobile-post"&gt;What is the goal of what I'm working on now???&lt;br /&gt;To be able to have the user select from an internally supported list  &lt;br /&gt;of languages which have dictionary files already set up to use.&lt;br /&gt;So be able to export and import dictionaries first.&lt;br /&gt;Then implement a way to insert these dictionaries into the user's  &lt;br /&gt;dictionary sql file so that can start adding and learning words.&lt;/p&gt;&lt;p class="mobile-post"&gt;It is perhaps more intelligent to leave the dictionaries separate  &lt;br /&gt;from the languages when archived. This way languages too can be  &lt;br /&gt;passed about freely, without the weight of dictionaries attached to  &lt;br /&gt;them. Although it is not intended that languages be passed about as a  &lt;br /&gt;commodity like dictionaries will be.&lt;/p&gt;&lt;p class="mobile-post"&gt;Therefore when the user clicks export, a neat little bundle of  &lt;br /&gt;archived language data will be exported somewhere.&lt;/p&gt;&lt;p class="mobile-post"&gt;When a user adds a new language, the supported languages bundle will  &lt;br /&gt;be searched, the contents (or just their names) unarchived, and then  &lt;br /&gt;presented to the user. The user will then choose one of the supported  &lt;br /&gt;languages and then it will be copied into the user dictionary.&lt;br /&gt;This way unneeded and unused languages won't be making the database  &lt;br /&gt;heavy.&lt;/p&gt;&lt;p class="mobile-post"&gt;So the next step is to enable languages to archive and unarchive  &lt;br /&gt;themselves.&lt;br /&gt;This would include the words and that come default with that language...&lt;/p&gt;&lt;p class="mobile-post"&gt;The final release will be fine tuned, so leave that for later. Make a  &lt;br /&gt;simple import export method for what a language constitutes today.&lt;/p&gt;&lt;p class="mobile-post"&gt;Done! In a single train ride.&lt;/p&gt;&lt;p class="mobile-post"&gt;This stuff is too easy.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115856578734594602?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115856578734594602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115856578734594602' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115856578734594602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115856578734594602'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/changes-to-internal-language.html' title='Changes To Internal Language Management'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115839741423843630</id><published>2006-09-16T19:03:00.000+10:00</published><updated>2006-09-16T19:03:34.346+10:00</updated><title type='text'>New Version 0.07</title><content type='html'>&lt;p class="mobile-post"&gt;More meaningful startup messages when there are no languages  &lt;br /&gt;available, and libraries are now 'soft' fixed because of this new way  &lt;br /&gt;of adding languages. You can see the beginnings of the factories to  &lt;br /&gt;produce internal languages and dictionaries, but they are not  &lt;br /&gt;operational yet, so don't use them, and you can get a feel for where  &lt;br /&gt;I'm going with that.&lt;/p&gt;&lt;p class="mobile-post"&gt;You can also quiz yourself on a list of words by clicking the quiz me  &lt;br /&gt;button.&lt;/p&gt;&lt;p class="mobile-post"&gt;Words 0.07&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115839741423843630?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115839741423843630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115839741423843630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115839741423843630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115839741423843630'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/new-version-007.html' title='New Version 0.07'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115836742832191829</id><published>2006-09-16T10:43:00.000+10:00</published><updated>2006-09-16T10:43:48.440+10:00</updated><title type='text'>Quzzing System</title><content type='html'>&lt;p class="mobile-post"&gt;Have added a rudimentary quizzing system which was surprisingly easy  &lt;br /&gt;to implement. Hopefully other learning features will be a simple  &lt;br /&gt;matter of grabbing what's in the word array and playing with them in  &lt;br /&gt;whichever way!&lt;/p&gt;&lt;p class="mobile-post"&gt;It's still rudimentary because actually it relies on the 'main' defs,  &lt;br /&gt;of which there is still no fully implemented UI to specify. Might do  &lt;br /&gt;that next.&lt;/p&gt;&lt;p class="mobile-post"&gt;No languages defined - means that the intro tab is shown in the main  &lt;br /&gt;view... which gives a brief description of usage, and also allows one  &lt;br /&gt;to define one's first language to learn.&lt;/p&gt;&lt;p class="mobile-post"&gt;I want Words to ship with a number of supported languages and  &lt;br /&gt;dictionaries, so users can get started right away.&lt;/p&gt;&lt;p class="mobile-post"&gt;But where to store this data? The likely place is in a separate core  &lt;br /&gt;data managed persistent store. But how do I create this database?  &lt;br /&gt;With words itself? After all, the persistentStoreCoordinator will  &lt;br /&gt;just look for the sql in the spot that I tell it to. If it's not  &lt;br /&gt;there, then it should scream, but thing is, if it's INSIDE the  &lt;br /&gt;application bundle itself then there is no reason why it shouldn't be  &lt;br /&gt;there.&lt;/p&gt;&lt;p class="mobile-post"&gt;So let's say we have a separate managedObjectContect to manage  &lt;br /&gt;'wordsSupportedFilesData' or something like that. Something other  &lt;br /&gt;than what I've forever been calling my 'managedObjectContext. It  &lt;br /&gt;would be bad programming but it would be fun to call it  &lt;br /&gt;'magicObjectContext' :-)&lt;/p&gt;&lt;p class="mobile-post"&gt;So, if I set up this new dashboard, then I can copy objects from this  &lt;br /&gt;one dashboard to the next without much trouble.&lt;/p&gt;&lt;p class="mobile-post"&gt;Well it took a little bit of staring at code, but now I have two data  &lt;br /&gt;stores. The new one is to store my internals...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115836742832191829?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115836742832191829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115836742832191829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115836742832191829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115836742832191829'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/quzzing-system.html' title='Quzzing System'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115827669157571675</id><published>2006-09-15T09:31:00.000+10:00</published><updated>2006-09-15T09:31:31.676+10:00</updated><title type='text'>Burn Out</title><content type='html'>&lt;p class="mobile-post"&gt;I think I'm a little burnt out...&lt;/p&gt;&lt;p class="mobile-post"&gt;There are times when you look at it in think, why! Why won't this  &lt;br /&gt;work? Will it ever work? And then you think - what if it doesn't? And  &lt;br /&gt;even if it does, is anyone going to use it anyway?&lt;/p&gt;&lt;p class="mobile-post"&gt;Maybe it's time to take a quick step out of implementation land and  &lt;br /&gt;look at what end goal I am looking at.&lt;/p&gt;&lt;p class="mobile-post"&gt;One major area is the definitions view, because I can manage all the  &lt;br /&gt;words I want in neat little smart groups, but if I can't learn the  &lt;br /&gt;meaning of new words, then words is useless, right?&lt;/p&gt;&lt;p class="mobile-post"&gt;The definitions view should have some kind of divider between entries&lt;br /&gt;Should be able to indicate where the definitions came from.&lt;br /&gt;Should have some kind of mechanism for choosing definitions. This  &lt;br /&gt;must be 'quick and sloppy'.&lt;/p&gt;&lt;p class="mobile-post"&gt;What about a highlight and click system? Highlight the text that you  &lt;br /&gt;want to be set as 'main' and then click a button or press a hot key  &lt;br /&gt;to set it. E and D or D C or something configurable.&lt;/p&gt;&lt;p class="mobile-post"&gt;Extensible type system? Can people actually be bothered with this?&lt;/p&gt;&lt;p class="mobile-post"&gt;It's an added extra that we might not even need to worry about.&lt;/p&gt;&lt;p class="mobile-post"&gt;What if the goal of words was more general, so that it was a defining  &lt;br /&gt;system for any kind of terms?&lt;/p&gt;&lt;p class="mobile-post"&gt;Then a dictionary would be simply a data source, somewhere to get  &lt;br /&gt;data from.&lt;br /&gt;Google:define etc.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115827669157571675?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115827669157571675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115827669157571675' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115827669157571675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115827669157571675'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/burn-out.html' title='Burn Out'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115818761447143131</id><published>2006-09-14T08:46:00.000+10:00</published><updated>2006-09-14T08:46:54.660+10:00</updated><title type='text'>A big chunk of dev notes</title><content type='html'>&lt;p class="mobile-post"&gt;I have made 6 basic releases through sparkle now, and have gotten  &lt;br /&gt;some valuable feedback. Further, I have made some improvements to the  &lt;br /&gt;system.&lt;/p&gt;&lt;p class="mobile-post"&gt;I am sick of my crappy grouping system not working properly, and I  &lt;br /&gt;had a brain wave. Why not just bind the groupsArrayController to the  &lt;br /&gt;selection of the languageArrayController and ask language objects for  &lt;br /&gt;the aggregate lists? This seems to work nicely, and updating is all  &lt;br /&gt;working *for free*. I have to work on adding and removing objects.  &lt;br /&gt;I've got this working, but the array controller isn't refreshing  &lt;br /&gt;itself (you still have to click off the view and back again).&lt;/p&gt;&lt;p class="mobile-post"&gt;Just to clean off my desktop, here's some other dev notes from the  &lt;br /&gt;past week.&lt;/p&gt;&lt;p class="mobile-post"&gt;------&lt;/p&gt;&lt;p class="mobile-post"&gt;how about some highlighter tool that lets you select the text to be  &lt;br /&gt;used in quizzing? So I dump the text, and you just choose what needs  &lt;br /&gt;to be used by highlighting.&lt;/p&gt;&lt;p class="mobile-post"&gt;So the next step in usability for me is to have that freeform space  &lt;br /&gt;for defining words.&lt;br /&gt;(which includes images)&lt;/p&gt;&lt;p class="mobile-post"&gt;So today's goal is to have that free form space available.&lt;/p&gt;&lt;p class="mobile-post"&gt;Could even use google define and wikipedia search for terms.&lt;/p&gt;&lt;p class="mobile-post"&gt;And I want the flow of the program to be more intuitive to 'flow'  &lt;br /&gt;from the search bar, as you would in a regular online dictionary.  &lt;br /&gt;This will help people ease into using it. So you enter a word in the  &lt;br /&gt;search bar, the most natural thing to do, and it tells you&lt;/p&gt;&lt;p class="mobile-post"&gt;"WORD not found in MANUAL GROUP or in LANGUAGE, looking up word in  &lt;br /&gt;ENGLISH dictionary&lt;/p&gt;&lt;p class="mobile-post"&gt;Add WORD to ENGLISH?&lt;/p&gt;&lt;p class="mobile-post"&gt;And all the user has to do is hit enter to add it to their list.&lt;/p&gt;&lt;p class="mobile-post"&gt;Find out how it works (dict.h) and import it into words.&lt;/p&gt;&lt;p class="mobile-post"&gt;Sweet! Now I can export dictionary objects. It was fairly  &lt;br /&gt;straightforward.&lt;/p&gt;&lt;p class="mobile-post"&gt;Funny how when doing something for the first time in Cocoa you kind  &lt;br /&gt;of hold your breath, and loose confidence when things go wrong, but  &lt;br /&gt;then when it all comes through you feel more confident about doing  &lt;br /&gt;the same thing again elsewhere, and you also realise how simple it  &lt;br /&gt;all really is!&lt;/p&gt;&lt;p class="mobile-post"&gt;With this newfound knowledge I should be able to import and export  &lt;br /&gt;dictionaries at will from Words to Words, so that users can download  &lt;br /&gt;dictionaries of type 'wordsdict' willy nilly from my website, or be  &lt;br /&gt;emailed them from friends, or whatever, and then import them into  &lt;br /&gt;their dictionary managers.&lt;/p&gt;&lt;p class="mobile-post"&gt;I just thought of a nicer interface for managing dictionaries. What  &lt;br /&gt;about a column for selecting the languge onb the left, with the  &lt;br /&gt;number of available dictionaries in brackets on the right.&lt;br /&gt;English (4)&lt;br /&gt;Japanese (3)&lt;/p&gt;&lt;p class="mobile-post"&gt;Selecting them shows the current view. Shouldn't be hard to do.&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway before doing that it's time for an SVN commit.&lt;/p&gt;&lt;p class="mobile-post"&gt;The next step I think to make it usable is to support some local  &lt;br /&gt;dictionaries, not just remote ones.&lt;br /&gt;I should at this point Finalise the model attributes for dict  &lt;br /&gt;protocol dictionaries, because if I am going to start passing  &lt;br /&gt;dictionaries around, then I'm going to need them to work with later  &lt;br /&gt;versions of Words.&lt;br /&gt;I will also need a way to perhaps modify a dictiionary's attributes.&lt;/p&gt;&lt;p class="mobile-post"&gt;It's funny the way I cross my fingers every time I commit something  &lt;br /&gt;to SVN, because I expect I've broken something in the process.&lt;/p&gt;&lt;p class="mobile-post"&gt;Drag and Drop system. Moving Words around the system fluidly,  &lt;br /&gt;wherever the user wants.&lt;br /&gt;Take the selected words&lt;br /&gt;Bundle them up in the drag operation&lt;br /&gt;Drop them on something.&lt;/p&gt;&lt;p class="mobile-post"&gt;Which means that group objects and languages need to know how to  &lt;br /&gt;accept dropped bundles of words, and manage that appropriately.&lt;/p&gt;&lt;p class="mobile-post"&gt;I have implemented some basic drag and drop functionality for moving  &lt;br /&gt;words around the system.&lt;/p&gt;&lt;p class="mobile-post"&gt;What about if words actively supports some languages, but still lets  &lt;br /&gt;you use Words for languages what aren't actively supported? What  &lt;br /&gt;would the difference be?&lt;br /&gt;Making sure that encodings work on certain dictionaries which are  &lt;br /&gt;provided.&lt;/p&gt;&lt;p class="mobile-post"&gt;Custom view for the definitions view. So you can send  it  &lt;br /&gt;notifications to display certain things, and to behave in a certain way.&lt;/p&gt;&lt;p class="mobile-post"&gt;Wrap the table view in a custom view... maybe a tab view?, and  &lt;br /&gt;connect it up in the same way... then register the custom tab view to  &lt;br /&gt;change itself upon receiving a notification or an invocation of a  &lt;br /&gt;certain method or something.&lt;/p&gt;&lt;p class="mobile-post"&gt;How about 'edit type' for word type?? So that the user can specify if  &lt;br /&gt;they want. Otherwise, the available types are defined by the  &lt;br /&gt;supported language.&lt;/p&gt;&lt;p class="mobile-post"&gt;It's going to have to register for some3 notfication so that it can  &lt;br /&gt;run code when there is nothing or something in the wordArrayController.&lt;/p&gt;&lt;p class="mobile-post"&gt;When you search in the box, should you be searching for words in a  &lt;br /&gt;language, in all language, in the selected list, or what? What is the  &lt;br /&gt;scope of the search??&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115818761447143131?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115818761447143131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115818761447143131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115818761447143131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115818761447143131'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/big-chunk-of-dev-notes.html' title='A big chunk of dev notes'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115804952619570911</id><published>2006-09-12T18:24:00.000+10:00</published><updated>2006-09-12T18:25:26.210+10:00</updated><title type='text'>Words Very Beta 0.04</title><content type='html'>&lt;a href="http://www.flickr.com/photos/mathieutozer/241354492/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/84/241354492_5ec150b61c.jpg" width="500" height="453" alt="Words_0.04.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Here's where I'm at.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115804952619570911?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115804952619570911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115804952619570911' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115804952619570911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115804952619570911'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/words-very-beta-004.html' title='Words Very Beta 0.04'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115797835718561314</id><published>2006-09-11T22:39:00.000+10:00</published><updated>2006-09-11T22:39:17.416+10:00</updated><title type='text'>Stiiiil not happy with groups</title><content type='html'>&lt;p class="mobile-post"&gt;Dear oh Dear.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'm having bindings woes.&lt;/p&gt;&lt;p class="mobile-post"&gt;It's probably because either me or my bindings aren't gluing together  &lt;br /&gt;and being in sync.&lt;/p&gt;&lt;p class="mobile-post"&gt;Perhaps there's a better architecture for this?&lt;/p&gt;&lt;p class="mobile-post"&gt;I'll give it a rest tonight.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115797835718561314?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115797835718561314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115797835718561314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115797835718561314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115797835718561314'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/stiiiil-not-happy-with-groups.html' title='Stiiiil not happy with groups'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115795068520554822</id><published>2006-09-11T14:58:00.000+10:00</published><updated>2006-09-11T14:58:05.213+10:00</updated><title type='text'>Drag and Drop</title><content type='html'>&lt;p class="mobile-post"&gt;The next step I think to make it usable is to support some local  &lt;br /&gt;dictionaries, not just remote ones.&lt;br /&gt;I should at this point Finalise the model attributes for dict  &lt;br /&gt;protocol dictionaries, because if I am going to start passing  &lt;br /&gt;dictionaries around, then I'm going to need them to work with later  &lt;br /&gt;versions of Words.&lt;br /&gt;I will also need a way to perhaps modify a dictiionary's attributes.&lt;/p&gt;&lt;p class="mobile-post"&gt;It's funny the way I cross my fingers every time I commit something  &lt;br /&gt;to SVN, because I expect I've broken something in the process.&lt;/p&gt;&lt;p class="mobile-post"&gt;Drag and Drop system. Moving Words around the system fluidly,  &lt;br /&gt;wherever the user wants.&lt;br /&gt;Take the selected words&lt;br /&gt;Bundle them up in the drag operation&lt;br /&gt;Drop them on something.&lt;/p&gt;&lt;p class="mobile-post"&gt;Which means that group objects and languages need to know how to  &lt;br /&gt;accept dropped bundles of words, and manage that appropriately.&lt;/p&gt;&lt;p class="mobile-post"&gt;I have implemented some basic drag and drop functionality for moving  &lt;br /&gt;words around the system.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115795068520554822?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115795068520554822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115795068520554822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115795068520554822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115795068520554822'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/drag-and-drop.html' title='Drag and Drop'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115778587306310887</id><published>2006-09-09T17:11:00.002+10:00</published><updated>2006-09-09T17:11:14.183+10:00</updated><title type='text'>Dictionary Import and Export via NSKeyedArchiver</title><content type='html'>&lt;p class="mobile-post"&gt;Sweet! Now I can export dictionary objects. It was fairly  &lt;br /&gt;straightforward.&lt;/p&gt;&lt;p class="mobile-post"&gt;Funny how when doing something for the first time in Cocoa you kind  &lt;br /&gt;of hold your breath, and loose confidence when things go wrong, but  &lt;br /&gt;then when it all comes through you feel more confident about doing  &lt;br /&gt;the same thing again elsewhere, and you also realise how simple it  &lt;br /&gt;all really is!&lt;/p&gt;&lt;p class="mobile-post"&gt;With this newfound knowledge I should be able to import and export  &lt;br /&gt;dictionaries at will from Words to Words, so that users can download  &lt;br /&gt;dictionaries of type 'wordsdict' willy nilly from my website, or be  &lt;br /&gt;emailed them from friends, or whatever, and then import them into  &lt;br /&gt;their dictionary managers.&lt;/p&gt;&lt;p class="mobile-post"&gt;I just thought of a nicer interface for managing dictionaries. What  &lt;br /&gt;about a column for selecting the languge onb the left, with the  &lt;br /&gt;number of available dictionaries in brackets on the right.&lt;br /&gt;English (4)&lt;br /&gt;Japanese (3)&lt;/p&gt;&lt;p class="mobile-post"&gt;Selecting them shows the current view. Shouldn't be hard to do.&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway before doing that it's time for an SVN commit.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115778587306310887?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115778587306310887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115778587306310887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115778587306310887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115778587306310887'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/dictionary-import-and-export-via.html' title='Dictionary Import and Export via NSKeyedArchiver'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115778587306282194</id><published>2006-09-09T17:11:00.001+10:00</published><updated>2006-09-09T17:11:14.183+10:00</updated><title type='text'>Better Dictionary Management</title><content type='html'>&lt;p class="mobile-post"&gt;The next step I think to make it usable is to support some local  &lt;br /&gt;dictionaries, not just remote ones.&lt;br /&gt;I should at this point Finalise the model attributes for dict  &lt;br /&gt;protocol dictionaries, because if I am going to start passing  &lt;br /&gt;dictionaries around, then I'm going to need them to work with later  &lt;br /&gt;versions of Words.&lt;br /&gt;I will also need a way to perhaps modify a dictiionary's attributes.&lt;/p&gt;&lt;p class="mobile-post"&gt;It's funny the way I cross my fingers every time I commit something  &lt;br /&gt;to SVN, because I expect I've broken something in the process.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'll try to set up some networked dictionaries for my future beta  &lt;br /&gt;testers to download, import and use. That should get things started.&lt;/p&gt;&lt;p class="mobile-post"&gt;One day in the future it would be nice if you could download them  &lt;br /&gt;from right within words!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115778587306282194?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115778587306282194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115778587306282194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115778587306282194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115778587306282194'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/better-dictionary-management.html' title='Better Dictionary Management'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115778587306262425</id><published>2006-09-09T17:11:00.000+10:00</published><updated>2006-09-09T17:11:14.183+10:00</updated><title type='text'>Dictionary Plugin Architecture</title><content type='html'>&lt;p class="mobile-post"&gt;Has words gotten to the point where I can almost say I have basic  &lt;br /&gt;word management working? Because then I have to move to a slightly  &lt;br /&gt;higher level and add in the stuff that makes that basic functionality  &lt;br /&gt;more usable.&lt;/p&gt;&lt;p class="mobile-post"&gt;Dictionary management is hard. I think that's why I'm sort of  &lt;br /&gt;ignoring it a bit.&lt;br /&gt;But I have to have it work!&lt;/p&gt;&lt;p class="mobile-post"&gt;Which means thinking about how the system will add certain  &lt;br /&gt;dictionaries to itself when the program loads (for the first time).  &lt;br /&gt;Or is it better to ship words with a bundle of dictionary entities,  &lt;br /&gt;all neatly archived up, which are added to the user's own data  &lt;br /&gt;model.... this way the the sql database can still be kept in  &lt;br /&gt;Application support, but the available dictionaries can be added and  &lt;br /&gt;changed by me through the bundle.&lt;/p&gt;&lt;p class="mobile-post"&gt;I would have to fully specify and insert all the server and  &lt;br /&gt;dictionary database, set which languages it can translate to and  &lt;br /&gt;from, test them, paste all the needed info into the dictionary  &lt;br /&gt;(dictProtocolDictionary) and then put it in an archive that perhaps  &lt;br /&gt;the user can download.&lt;br /&gt;The user could specify his own dictionary objects through the add  &lt;br /&gt;custom, or just download the ones I've specified and import them in.  &lt;br /&gt;That way, the user can abstract as a 'word's dictionary.&lt;/p&gt;&lt;p class="mobile-post"&gt;The dictionary files themselves objects would have to be kept in some  &lt;br /&gt;seperate store.&lt;/p&gt;&lt;p class="mobile-post"&gt;It would be nice to be able to:&lt;br /&gt;Define a custom dictionary in words. EXPORT IT as a bundle.&lt;br /&gt;Upload it to the net, have everyone else download it.&lt;br /&gt;IMPORT the dictioanry file into their own words model&lt;/p&gt;&lt;p class="mobile-post"&gt;Having said that, I should be working towards building an import and  &lt;br /&gt;export function in words for dictionaries.&lt;/p&gt;&lt;p class="mobile-post"&gt;Essentially, it should be something along the lines of, for the user  &lt;br /&gt;(myself included!)&lt;br /&gt;EXPORT&lt;br /&gt;Select a dictionary in the dictionary preferences view.&lt;br /&gt;Click export&lt;br /&gt;choose a location for the file (filename wordsdict)&lt;br /&gt;click export&lt;/p&gt;&lt;p class="mobile-post"&gt;IMPORT&lt;br /&gt;Select import Dicitonary from the file menu&lt;br /&gt;Select the wordsdict to import&lt;br /&gt;click import&lt;br /&gt;Give confirmation of the import&lt;br /&gt;See the dictionary in the dictioanry preferences window.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115778587306262425?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115778587306262425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115778587306262425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115778587306262425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115778587306262425'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/dictionary-plugin-architecture.html' title='Dictionary Plugin Architecture'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115761789193604092</id><published>2006-09-07T18:31:00.000+10:00</published><updated>2006-09-07T18:31:31.940+10:00</updated><title type='text'>More ideas re: defining words</title><content type='html'>&lt;p class="mobile-post"&gt;how about some highlighter tool that lets you select the text to be  &lt;br /&gt;used in quizzing? So I dump the text, and you just choose what needs  &lt;br /&gt;to be used by highlighting.&lt;/p&gt;&lt;p class="mobile-post"&gt;So the next step in usability for me is to have that freeform space  &lt;br /&gt;for defining words.&lt;br /&gt;(which includes images)&lt;/p&gt;&lt;p class="mobile-post"&gt;So today's goal is to have that free form space available.&lt;/p&gt;&lt;p class="mobile-post"&gt;Could even use google define and wikipedia search for terms.&lt;/p&gt;&lt;p class="mobile-post"&gt;And I want the flow of the program to be more intuitive to 'flow'  &lt;br /&gt;from the search bar, as you would in a regular online dictionary.  &lt;br /&gt;This will help people ease into using it. So you enter a word in the  &lt;br /&gt;search bar, the most natural thing to do, and it tells you&lt;/p&gt;&lt;p class="mobile-post"&gt;"WORD not found in MANUAL GROUP or in LANGUAGE, looking up word in  &lt;br /&gt;ENGLISH dictionary&lt;/p&gt;&lt;p class="mobile-post"&gt;Add WORD to ENGLISH?&lt;/p&gt;&lt;p class="mobile-post"&gt;And all the user has to do is hit enter to add it to their list.&lt;/p&gt;&lt;p class="mobile-post"&gt;Find out how it works (dict.h) and import it into words.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115761789193604092?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115761789193604092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115761789193604092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115761789193604092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115761789193604092'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/more-ideas-re-defining-words.html' title='More ideas re: defining words'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115761784046550464</id><published>2006-09-07T18:30:00.000+10:00</published><updated>2006-09-07T18:30:40.596+10:00</updated><title type='text'>Yay! Blob style auto definitions</title><content type='html'>&lt;p class="mobile-post"&gt;Images will be displayed in the main window, and because I want to  &lt;br /&gt;show many images, I want to be able to cycle through them.&lt;br /&gt;I would like to enable the user to show the images in a grid view, or  &lt;br /&gt;to cycle through them.&lt;br /&gt;When images are being searched for, a progress indicator should be  &lt;br /&gt;shown.&lt;br /&gt;Images that are not relevant should be able to be removed from the  &lt;br /&gt;view and thus deleted.&lt;/p&gt;&lt;p class="mobile-post"&gt;I propose an array, or a set, which holds images, that can be  &lt;br /&gt;unarchived and shown in the view.&lt;/p&gt;&lt;p class="mobile-post"&gt;Phew&lt;/p&gt;&lt;p class="mobile-post"&gt;It took a bit of fiddling around, but I seem to have the blob thing  &lt;br /&gt;sorted out. Turns out I was trying to put a mere mutable string in a  &lt;br /&gt;text view, when it needs to be an attributed string. The archiver was  &lt;br /&gt;dutifully saving it for me in the textblob attribute in the core data  &lt;br /&gt;entity for definitions.&lt;/p&gt;&lt;p class="mobile-post"&gt;I think I have a more usable program already!&lt;/p&gt;&lt;p class="mobile-post"&gt;However&lt;/p&gt;&lt;p class="mobile-post"&gt;Mincing steps, Mincing steps....&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115761784046550464?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115761784046550464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115761784046550464' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115761784046550464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115761784046550464'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/yay-blob-style-auto-definitions.html' title='Yay! Blob style auto definitions'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115755042361994624</id><published>2006-09-06T23:47:00.000+10:00</published><updated>2006-09-06T23:47:03.753+10:00</updated><title type='text'>App Casted: Words 0.0 (VERY Beta!)</title><content type='html'>&lt;p class="mobile-post"&gt;I've made an app cast, put the sparkle frameworks in, and am now  &lt;br /&gt;serving Words 0.0 to a select few to try out.&lt;/p&gt;&lt;p class="mobile-post"&gt;I'm not ready to get too excited about it yet because the software  &lt;br /&gt;isn't anywhere near being done, but it's neat to think of it being  &lt;br /&gt;"App Casted" about the place.&lt;/p&gt;&lt;p class="mobile-post"&gt;Remembering that it's really nowhere near show-able to anyone, I've  &lt;br /&gt;released it to a few people.&lt;/p&gt;&lt;p class="mobile-post"&gt;Here are the release notes.&lt;/p&gt;&lt;p class="mobile-post"&gt;Known Issues&lt;br /&gt;Grouping System&lt;br /&gt;Updating of groups upon deletion is slack. Lack of GUI to predicate  &lt;br /&gt;setter is a barrier to usability. Ordering of the group system is  &lt;br /&gt;random.&lt;br /&gt;Dictionary Lookup&lt;br /&gt;Not recommended at the moment, behavior unpredictable! Use the  &lt;br /&gt;definition button to manually add definitions. That's your safest bet.&lt;br /&gt;Definitions&lt;br /&gt;Meaning / Definition table view is not complete, proposed system is  &lt;br /&gt;to have a 'fat' table view so you can see the whole dump of  &lt;br /&gt;dictionary text within the one cell. Comments on this please!&lt;br /&gt;No Icons!&lt;br /&gt;Any icon designers out there??&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115755042361994624?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115755042361994624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115755042361994624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115755042361994624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115755042361994624'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/app-casted-words-00-very-beta.html' title='App Casted: Words 0.0 (VERY Beta!)'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115754344663539362</id><published>2006-09-06T21:50:00.000+10:00</published><updated>2006-09-06T21:50:46.726+10:00</updated><title type='text'>Roll Back to Old Groups</title><content type='html'>&lt;p class="mobile-post"&gt;After trying to refactor the groups system, I have decided to roll  &lt;br /&gt;back to a previous and stable version. I am spending too much time  &lt;br /&gt;trying to get it working again, and the benefits of doing so are  &lt;br /&gt;slowly dissapearing, as my original solution worked just as well as  &lt;br /&gt;the refactored one would.&lt;/p&gt;&lt;p class="mobile-post"&gt;Through this exercise I have learnt again the value of version  &lt;br /&gt;control, and also the lesson of not refactoring too soon on in the  &lt;br /&gt;development process, especially if the current solution is working  &lt;br /&gt;and efficient. In fact, I was refactoring simply for the engineering  &lt;br /&gt;simplicity of the refactored model.&lt;/p&gt;&lt;p class="mobile-post"&gt;So now I have to&lt;br /&gt;Take some screens to show what I was attempting&lt;br /&gt;Take a copy of the nib, as the UI has been changed since re-factoring  &lt;br /&gt;as well.&lt;br /&gt;Export a copy of a previous revision of words from the repository.&lt;br /&gt;Import the new export in a branch of the Words directory&lt;br /&gt;Delete the export&lt;br /&gt;Checkout a new working copy of the roll back.&lt;br /&gt;Incorporate the new network awareness components into the new  &lt;br /&gt;checkout model&lt;br /&gt;Continue development...&lt;/p&gt;&lt;p class="mobile-post"&gt;I've also learnt that working on more than one thing at a time can be  &lt;br /&gt;an issue because if you need to roll back past those changes, you  &lt;br /&gt;have trouble!&lt;/p&gt;&lt;p class="mobile-post"&gt;Actually I was smart in not letting that happen, by not committing  &lt;br /&gt;broken versions of the grouping system.&lt;/p&gt;&lt;p class="mobile-post"&gt;So actually all I needed to do was&lt;br /&gt;Delete the crappy one&lt;br /&gt;Checkout a working copy from the correct revision.&lt;br /&gt;Revert to my old backup sql database that I had prudently kept  &lt;br /&gt;against this event.&lt;br /&gt;It all ran and loaded with no problem with all my old words and  &lt;br /&gt;languages in there!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115754344663539362?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115754344663539362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115754344663539362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115754344663539362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115754344663539362'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/roll-back-to-old-groups.html' title='Roll Back to Old Groups'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115750018214872198</id><published>2006-09-06T09:49:00.000+10:00</published><updated>2006-09-06T09:49:42.173+10:00</updated><title type='text'>Groups (AGAIN YOU ASK!?)</title><content type='html'>Bah! Silly me hadn't even put the framework I was including into my linked frameworks folder. Is compiling and linking fine now.&lt;br /&gt;&lt;br /&gt;The best way to describe the grouping system is IFFEY.&lt;br /&gt;&lt;br /&gt;I should redesign it so that one array controller contains all the list objects in the system.&lt;br /&gt;&lt;br /&gt;Anyway.&lt;br /&gt;My goal today is to have the dictionary lookup system working satisfactorily. It must only look up dictionary definitions or attempt to if the system can connect to the server. &lt;br /&gt;&lt;br /&gt;I kind of need to be able to toggle the internet connection somehow, which means developing within an active internet connection.&lt;br /&gt;&lt;br /&gt;How do I do progress indicators? How do I have something processing in the background but still have the system responsive?&lt;br /&gt;Is this where multi threading can help??&lt;br /&gt;&lt;br /&gt;Well, accumulatively I think I've spent 15 minutes refactoring the groups system, almost purely using bindings and a proper core data model, and what I spent weeks trying to achieve myself (and succeeded, mind you), I've made work in 15 minutes.&lt;br /&gt;&lt;br /&gt;The lesson learnt here is... well... don't be too afraid or too proud to completely write off all the code you've spent a long, hard time writing (on a Greyhound bus in California), because bad code is bad code, no matter how long it took to write it.&lt;br /&gt;&lt;br /&gt;Been thinking of new titles for myself and my web blog, which is kind of due for an update I think. I want a wordpress blog with tabs to the different sections.&lt;br /&gt;&lt;br /&gt;An interesting mix of Model/Computer Programmer (Yeah, I know)&lt;br /&gt;Model/Computer Programmer (Yeah, I know)&lt;br /&gt;Mac OS X Application Engineer / Model LOL&lt;br /&gt;&lt;br /&gt;Just what am I!?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115750018214872198?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115750018214872198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115750018214872198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115750018214872198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115750018214872198'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/groups-again-you-ask.html' title='Groups (AGAIN YOU ASK!?)'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115728469162153502</id><published>2006-09-03T21:58:00.000+10:00</published><updated>2006-09-03T21:58:11.743+10:00</updated><title type='text'>Refactoring Groups</title><content type='html'>&lt;p class="mobile-post"&gt;Bah! Silly me hadn't even put the framework I was including into my  &lt;br /&gt;linked frameworks folder. Is compiling and linking fine now.&lt;/p&gt;&lt;p class="mobile-post"&gt;The best way to describe the grouping system is IFFEY.&lt;/p&gt;&lt;p class="mobile-post"&gt;I should redesign it so that one array controller contains all the  &lt;br /&gt;list objects in the system.&lt;/p&gt;&lt;p class="mobile-post"&gt;Anyway.&lt;br /&gt;My goal today is to have the dictionary lookup system working  &lt;br /&gt;satisfactorily. It must only look up dictionary definitions or  &lt;br /&gt;attempt to if the system can connect to the server.&lt;/p&gt;&lt;p class="mobile-post"&gt;I kind of need to be able to toggle the internet connection somehow,  &lt;br /&gt;which means developing within an active internet connection.&lt;/p&gt;&lt;p class="mobile-post"&gt;How do I do progress indicators? How do I have something processing  &lt;br /&gt;in the background but still have the system responsive?&lt;br /&gt;Is this where multi threading can help??&lt;/p&gt;&lt;p class="mobile-post"&gt;Well, accumulatively I think I've spent 15 minutes refactoring the  &lt;br /&gt;groups system, almost purely using bindings and a proper core data  &lt;br /&gt;model, and what I spent weeks trying to achieve myself (and  &lt;br /&gt;succeeded, mind you), I've made work in 15 minutes.&lt;/p&gt;&lt;p class="mobile-post"&gt;The lesson learnt here is... well... don't be too afraid or too proud  &lt;br /&gt;to completely write off all the code you've spent a long, hard time  &lt;br /&gt;writing (on a Greyhound bus in California), because bad code is bad  &lt;br /&gt;code, no matter how long it took to write it.&lt;/p&gt;&lt;p class="mobile-post"&gt;Been thinking of new titles for myself and my web blog, which is kind  &lt;br /&gt;of due for an update I think. I want a wordpress blog with tabs to  &lt;br /&gt;the different sections.&lt;/p&gt;&lt;p class="mobile-post"&gt;An interesting mix of Model/Computer Programmer (Yeah, I know)&lt;br /&gt;Model/Computer Programmer (Yeah, I know)&lt;br /&gt;Mac OS X Application Engineer / Model LOL&lt;/p&gt;&lt;p class="mobile-post"&gt;Just what am I!?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115728469162153502?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115728469162153502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115728469162153502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115728469162153502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115728469162153502'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/refactoring-groups.html' title='Refactoring Groups'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115710639255275142</id><published>2006-09-01T20:14:00.000+10:00</published><updated>2006-09-01T20:26:32.576+10:00</updated><title type='text'>Network Reachability</title><content type='html'>Words is now network aware, however it is not exactly as I would like it.&lt;br /&gt;&lt;br /&gt;See, it would be ideal for it to check the reach-ability of individual servers, rather than just any old server. And as it stands, if one server is unavailable, all servers are made unavailable.&lt;br /&gt;&lt;br /&gt;This has to do with bridging the gap between the C and Objective C. I have only worked out a way to make the callback function &lt;br /&gt;&lt;br /&gt;&lt;&lt;Solved&gt;&gt;&lt;br /&gt;&lt;br /&gt;Thank-you Shawn!&lt;br /&gt;&lt;br /&gt;Network Awareness, It's a bit of a hack, because, one click of define will connect the networkObject, then you would have click again to actually do the definitions if you actually were online. The current implementation is such that it assumes you are offline to begin with, which is not what I want I suppose... the one click should show if you are online or not, then act accordingly. Tried the use of sleep but didn't work. Otherwise it's working pretty well I think.&lt;br /&gt;&lt;br /&gt;Memory is probably leaking too. Might try to use the Leopard Developer tools to solve that one.&lt;br /&gt;&lt;br /&gt;Yeah so it's a bit of a hack really. But it will work for now methinks.&lt;br /&gt;&lt;br /&gt;USe http://www.cocoadev.com/index.pl?ApplicationLinkingIssues when looking at sparkle&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115710639255275142?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115710639255275142/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115710639255275142' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115710639255275142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115710639255275142'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/09/network-reachability.html' title='Network Reachability'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115694308587030871</id><published>2006-08-30T23:04:00.000+10:00</published><updated>2006-08-30T23:04:45.986+10:00</updated><title type='text'>Bugs Squashed, Frameworks Fixed (deleted), All at Tequp!</title><content type='html'>&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Just spent about 7 hours at 'tequp', a Melbourne tech meetup with the guys from plasq, and plenty of others. It went quickly though and Pete, Keith and I ended up having vietnamese on Victoria St afterwards (which took us to 10pm)&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Demoed my app to them and Keith and Cris both gave great UI and interaction advice. Much appreciated guys. Thank-you!&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Also today I squashed a long standing linking error in my libdict framework, and I also took libdict OUT of a framework and put it right back into the main project. The framework was too finicky, and too much overhead for so little value really.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt; &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;So that error was fixed too.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;So seriously the next step is to stop that crash when offline or when something can't connect properly, because otherwise it's stable.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 12px/normal Helvetica; min-height: 14px; "&gt;&lt;BR&gt;&lt;/DIV&gt;&lt;DIV style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;FONT class="Apple-style-span" face="Helvetica" size="3"&gt;&lt;SPAN class="Apple-style-span" style="font-size: 12px;"&gt;Then it's time to sparkle... :D&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115694308587030871?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115694308587030871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115694308587030871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115694308587030871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115694308587030871'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/bugs-squashed-frameworks-fixed-deleted.html' title='Bugs Squashed, Frameworks Fixed (deleted), All at Tequp!'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115685223746758408</id><published>2006-08-29T21:45:00.000+10:00</published><updated>2006-08-29T21:50:37.483+10:00</updated><title type='text'>Planning Features</title><content type='html'>Well the whole purpose of this is to get definitions from dictionaries, right?&lt;br /&gt;&lt;br /&gt;So let's make Words look up words.&lt;br /&gt;&lt;br /&gt;Again back to the UI drawing board.&lt;br /&gt;&lt;br /&gt;Words should try to define themselves on awakeFromInsert&lt;br /&gt;They should know when they have been defined (checkbox)&lt;br /&gt;&lt;br /&gt;The application should be able to go through a list of words and define all the ones that haven't been defined yet, when the user indicates that it should be done (maybe via a menu system).&lt;br /&gt;&lt;br /&gt;So I have to write awakeFromInsert{}&lt;br /&gt;&lt;br /&gt;Maybe I need some kind of utility object that any object can just ask for definitions through. Like something awake from nib in the app delegate, and the object can be given to any other object via an accessor.&lt;br /&gt;&lt;br /&gt;This way the words themselves and their controllers (like the thing that goes through a list) can use it to define words.&lt;br /&gt;&lt;br /&gt;HEY! It worked first try. It's really nice when things JUST WORK!&lt;br /&gt;&lt;br /&gt;It's funny though how you can get something working, but then not want to try it out TOO much for fear of breaking it. Well I'd better get over that, because for my app to survive in the real world I can't allow people to tiptoe around it all the time! So let's really try it out.&lt;br /&gt;&lt;br /&gt;[] Connect only once per launch, reconnect as needed.&lt;br /&gt;&lt;br /&gt;Ok we had some issues. They have to do with failing gracefully. The one noted above about connecting only once per launch, not every time the dictionary entity object is fetched is important.&lt;br /&gt;&lt;br /&gt;Another important modification that needs to be made is with the UI of defining dictionaries.&lt;br /&gt;&lt;br /&gt;It took a few minutes of beach ball time, but 171 words auto defined at once, right there, but what good is a definition if you can't read it in the table view?&lt;br /&gt;&lt;br /&gt;[] eliminate duplicate words when importing.&lt;br /&gt;&lt;br /&gt;But shit, look at that. 171 words and the sql lite database is already 1.4 megabytes. I hope core data is up to the challenge! Access time is still reasonable though.&lt;br /&gt;&lt;br /&gt;Use sparkle to distribute from the start so that testers are kept up to date with the developments.&lt;br /&gt;&lt;br /&gt;I've been looking at the Cocoa APIs which will let my application know about the availability of networks.&lt;br /&gt;&lt;br /&gt;This is what I think it should look like&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/228134260/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/66/228134260_8d8c5c60c9.jpg" alt="LookupSystemToDo.jpg" height="488" width="500" /&gt;&lt;/a&gt;￼&lt;br /&gt;&lt;br /&gt;And for word input, there are a few things I need to implement&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/228134318/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/69/228134318_6ed54ac1fa.jpg" alt="ServicesMenuWordInputToDo.jpg" height="500" width="499" /&gt;&lt;/a&gt;￼&lt;br /&gt;This part is also important too for the viewing of definitions&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/228134218/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/60/228134218_bccaac543f.jpg" alt="DefiningWordsTodo.jpg" height="388" width="491" /&gt;&lt;/a&gt;￼&lt;br /&gt;&lt;br /&gt;I'm dreaming of the time when I can seed testers with my app.&lt;br /&gt;&lt;br /&gt;Along with sparkle, I would like to have a 'feature request' and 'comments / suggestions' menu item which emails them right through to me.&lt;br /&gt;&lt;br /&gt;Also, when adding a smart group, I'm still getting all the English words in the Chinese words list, which might mean that when I am creating words in the services menu, I am not properly associating them to a language. Or it could be that the smart group is still fetching for all languages from the moc rather than for the currently selected language to which the smart group belongs.&lt;br /&gt;So what's next?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115685223746758408?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115685223746758408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115685223746758408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115685223746758408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115685223746758408'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/planning-features.html' title='Planning Features'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115673751093240657</id><published>2006-08-28T13:57:00.000+10:00</published><updated>2006-08-28T14:07:10.706+10:00</updated><title type='text'>(Almost) Managing Dictionaries</title><content type='html'>&lt;a href="http://www.flickr.com/photos/mathieutozer/226796435/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/95/226796435_e85c009754.jpg" width="499" height="478" alt="Dictionary Management" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And here's the notes that made it all come about:&lt;br /&gt;&lt;br /&gt;I still have to think again about how the dictionaries can associate themselves to more than one language. Right now a to many relationship can not effectively be set because there is only one pivot language. &lt;br /&gt;&lt;br /&gt;Maybe playing around with the software will be more effective in determining what will work.&lt;br /&gt;&lt;br /&gt;I was thinking it would be nice if the dictionary always translated to your native language. What if I could get that from the system? But I decided that wouldn't be helpful anyway, because it's dangerous to assume that there are going to be always dictionaries available to translate to the user's native language.&lt;br /&gt;&lt;br /&gt;Ideally, what kind of setup do I want? I should implement a design. The design should force the implementation, NEVER the other way around. &lt;br /&gt;&lt;br /&gt;I've been dangerously creeping toward this so watch out!&lt;br /&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;Checked dictionaries will be used in looking up definitions for JAPANESE&lt;br /&gt;Here are the dictionaries that have Japanese capabilities.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Obviously the UI won't be so verbose, but it's helpful in determining what the implementation needs to cough up stating it in this way.&lt;br /&gt;&lt;br /&gt;Which means that the display shouldn't only show which &lt;br /&gt;&lt;br /&gt;Another problem is that I've set things up to work for lookup in a unidirectional manner... but.... that's kind of what Words does. It's unidirectional. Think about it.&lt;br /&gt;&lt;br /&gt;Users say they're learning "Japanese"&lt;br /&gt;But it also means that they're going to want to translate words from English INTO Japanese. How will words support this?&lt;br /&gt;&lt;br /&gt;Back to the UI drawing board. &lt;br /&gt;&lt;br /&gt;What would be nice is if the program KNEW which language the word being input was.&lt;br /&gt;&lt;br /&gt;Ok, so here's what I thought on the way home.&lt;br /&gt;&lt;br /&gt;The language will only know to ask along that pipeline for definitions, for whatever it considers a word. Therefore it's left up to the dictionary itself to spit definitions of the word back, or not to.&lt;br /&gt;&lt;br /&gt;So the dictionary manager should show the user a list of dictionaries that declare that they have the capabilities in EITHER direction for the currently selected language, and that I have been in error over the 'pivot' language idea.&lt;br /&gt;&lt;br /&gt;So I have to modify the predicate to be in accordance with what I have decided here. It might be wise to modify the model to have a 'capabilities' attribute.&lt;br /&gt;&lt;br /&gt;So the predicate will be more like:&lt;br /&gt;(capabilities contains[c] 'languagename')&lt;br /&gt;&lt;br /&gt;And then the user will be able to check the box to associate it with the currently selected language (ie, connect the pipeline).&lt;br /&gt;&lt;br /&gt;yeah! I think I got it working alright. &lt;br /&gt;&lt;br /&gt;See, I forgot about an old friend called [App delegate]&lt;br /&gt;&lt;br /&gt;Which gives you the object that is pretty much available to everyone, including model objects, which use it all the time when asking for [[App delegate] managedObjectContext];&lt;br /&gt;&lt;br /&gt;The next step is to set it up to actually do some word defining.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115673751093240657?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115673751093240657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115673751093240657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115673751093240657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115673751093240657'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/almost-managing-dictionaries.html' title='(Almost) Managing Dictionaries'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115668411011669622</id><published>2006-08-27T23:08:00.000+10:00</published><updated>2006-08-27T23:08:30.330+10:00</updated><title type='text'>New Design Decisions for Dictionary Management</title><content type='html'>&lt;p class="mobile-post"&gt;I'm trying to work out what the filter predicate for the  &lt;br /&gt;availableDictionaries arrayController should be.&lt;/p&gt;&lt;p class="mobile-post"&gt;It should fetch dictionary objects that have a pivot language that  &lt;br /&gt;matches the selection of the languageArrayController.&lt;/p&gt;&lt;p class="mobile-post"&gt;availableDictionaryController.filterPredicate =  &lt;br /&gt;languageArrayController.selection.name == Dictionary.pivotLanguage&lt;/p&gt;&lt;p class="mobile-post"&gt;(name contains[c] $value) or (pivotLanguage contains[c] $value) or  &lt;br /&gt;(targetLanguages contains[c] $value)&lt;/p&gt;&lt;p class="mobile-post"&gt;(name contains[c] $value)&lt;/p&gt;&lt;p class="mobile-post"&gt;Words: Have made some good progress in dictionary management today.  &lt;br /&gt;Still having some issues though. It's stable but I don't know how to  &lt;br /&gt;update the view each time a dictionary is added, and I can't get it  &lt;br /&gt;to show only those dictionaries that apply to a certain language.&lt;/p&gt;&lt;p class="mobile-post"&gt;Maybe I can put a clause in to say&lt;br /&gt;if currentLanguage.name is null, then skip this part&lt;/p&gt;&lt;p class="mobile-post"&gt;I'm also going to have to make a design decision about whether a  &lt;br /&gt;dictionary can be used for more than one kind of language or not. As  &lt;br /&gt;it is at the moment, a dictionary can only be used by a single  &lt;br /&gt;language. But what if a dictionary looks up both Japanese and  &lt;br /&gt;English, both ways, and a user is a native Japanese speaker, but  &lt;br /&gt;wants to have JPL-JPL and ENG-JPL dictionaries. It doesn't make sense  &lt;br /&gt;to have two different ones, it would be best to use the same  &lt;br /&gt;dictionary for both 'languages'. So its a many to many relationship  &lt;br /&gt;then. The next task is then to, when the selection changes, the  &lt;br /&gt;dictionary view updates itself so that all the checkboxes reflect if  &lt;br /&gt;the current language is using them or not.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115668411011669622?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115668411011669622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115668411011669622' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115668411011669622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115668411011669622'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/new-design-decisions-for-dictionary.html' title='New Design Decisions for Dictionary Management'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115665477443536071</id><published>2006-08-27T14:58:00.000+10:00</published><updated>2006-08-27T14:59:34.446+10:00</updated><title type='text'>Dictionaries with a checkbox to set relationships up.</title><content type='html'>I've run into a bit of trouble with implementing this drag and drop interface for dictionaries, and I think it has to do with the limitations of bindings and core data. &lt;br /&gt;&lt;br /&gt;But I just had a thought...&lt;br /&gt;&lt;br /&gt;Wouldn't it be better to just have a checkbox to indicate which dictionaries are 'active' or not? This is probably better UI and it's certainly going to be easier to implement too!&lt;br /&gt;&lt;br /&gt;But it has been good to fiddle around with this because I've learnt about how the drag and drop mechanism works, and how I can set it up with my other tableViews in the future.&lt;br /&gt;&lt;br /&gt;Is setting a relationship the only way to go about it? Is it the best way? Why not have the system merely go though the whole list? There would be less processing and room for error if I set the relationship, and it also ties the dictionary object to a particular language, which is what I want.&lt;br /&gt;&lt;br /&gt;The arrayController says, give me all dictionaries for THIS language. The model objects themselves know which language they are applicable to (by language name KVO) and they also know in their model if they are 'in use' or not.&lt;br /&gt;&lt;br /&gt;Ok it's talken an afternoon but I think I can see this working.&lt;br /&gt;&lt;br /&gt;In fact I got right down into the debugger MAKING SURE that what I thought was happening was actually happening. Asking it things like [[languageController selectedObjects] objectAtIndex:0] which help with seeing whether core data relationships are being set and removed as I want them to.&lt;br /&gt;&lt;br /&gt;Going to go to the gym now for a bit of physical activity :-)&lt;br /&gt;&lt;br /&gt;Then back to it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115665477443536071?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115665477443536071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115665477443536071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115665477443536071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115665477443536071'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/dictionaries-with-checkbox-to-set.html' title='Dictionaries with a checkbox to set relationships up.'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115658366096778542</id><published>2006-08-26T19:13:00.000+10:00</published><updated>2006-08-26T19:14:20.980+10:00</updated><title type='text'>Dictionary Management to Drag and Drop</title><content type='html'>Fixed the SVN commit but just creating a new folder for Words. &lt;br /&gt;&lt;br /&gt;Seems like this skeleton I'm building should work in the end.&lt;br /&gt;&lt;br /&gt;Does every language have a pivot language?&lt;br /&gt;&lt;br /&gt;What if the array controller just fetched ALL dictionary objects, and I set a filter on it which can then further be filtered by the user searching with a search field to narrow it down?? If that was even needed. They will easily be able to see by looking at the table view which language the dictionary being reperesented will translate to. I don't need to do EVERYTHING for them!&lt;br /&gt;That's the way to go about it!&lt;br /&gt;Just chuck a dictionary into core data, and fetch it as I need it by setting the predicate on the arraycontroller.&lt;br /&gt;&lt;br /&gt;Here's the pseudo code that creates dictionary objects&lt;br /&gt;// interface action which gathers the needed data and creates a new dictionary object.&lt;br /&gt;- (IBAction)createNewDictionary:(id)sender{&lt;br /&gt; //get the currently selected language. &lt;br /&gt; //create a new dict protocol dictionary (because that's the tab view that is selected)&lt;br /&gt;  // create a new dict protocol dictionary in the moc&lt;br /&gt;  // set the name, server, database etc&lt;br /&gt;  // test the connection &lt;br /&gt;   //if connection is bad, report error to errorField&lt;br /&gt;  // set the target language to current Language + xxx (for use in fetching)&lt;br /&gt;  //close the window (and dictionary should be fetched by the arraycontroller to show in &lt;br /&gt;  // "available dictionaries"&lt;br /&gt; [customDictPanel close];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Working on drag and drop using sample code from mmalc and other Apple documentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115658366096778542?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115658366096778542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115658366096778542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115658366096778542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115658366096778542'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/dictionary-management-to-drag-and-drop.html' title='Dictionary Management to Drag and Drop'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115655300696257493</id><published>2006-08-26T10:42:00.000+10:00</published><updated>2006-08-26T10:43:26.973+10:00</updated><title type='text'>System Apocalypse</title><content type='html'>Boy did I have some nasty stuff going on for the last few days!&lt;br /&gt;Installed Leopard, archive and installed Tiger, trying to migrate user info over from backups etc.&lt;br /&gt;&lt;br /&gt;It still feels like I'm not using my own computer yet, but I'm getting there.&lt;br /&gt;&lt;br /&gt;On the bright side (of XCode being broken, and taking 3 reinstalls and kills to fix it) I have somehow freed up 10 GB or so of space on my main drive, which is great considering I was always pushing up against FULL. Turns out all those libraries were adding up to a whole lot of crud.&lt;br /&gt;&lt;br /&gt;It's not quite dlll, but it's certainly Library hell!&lt;br /&gt;&lt;br /&gt;And it does feel refreshing because it feels like a new computer. &lt;br /&gt;&lt;br /&gt;On the Words dev side, I have had a meeting with Jim Breen and discussed dictionary formats.&lt;br /&gt;&lt;br /&gt;I'm going to support the EDICT format next.&lt;br /&gt;&lt;br /&gt;But first I must have the dictionary management system up and running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115655300696257493?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115655300696257493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115655300696257493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115655300696257493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115655300696257493'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/system-apocalypse.html' title='System Apocalypse'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115650971922492073</id><published>2006-08-25T22:41:00.000+10:00</published><updated>2006-08-25T22:41:59.243+10:00</updated><title type='text'>Dictionary Management Design Notes</title><content type='html'>The UI of the dictionary management system.&lt;br /&gt;&lt;br /&gt;As documented in my specifications document, &lt;br /&gt;&lt;br /&gt;In the preferences menu, only the dictionaries that are applicable to the languages the user has defined should be shown, this is to avoid long lists of languages for the user to search through if the system actually supports many languages.&lt;br /&gt;&lt;br /&gt;Disadvantage is that yes, you won't be able to 'browse what's available' but MOST people won't be bothered with that anyway.&lt;br /&gt;&lt;br /&gt;The view will be bound to a something which will tell it which languages are defined. (The language array?) Something will take the language names and use them as keys or fields in a predicate which will fetch the dictionaries that are applicable to that language combination from the 'bag of dictionaries' in the managedObjectContext.&lt;br /&gt;&lt;br /&gt;On the left hand side of the preferences pane will be a view displaying all these fetched dictionaries. On the right hand side will be a view of the objects on the left hand side that currently have their relationship set to the language object in question. Ie, it is being used in finding definitions. If the language is in the right hand view, then it should be visible, but greyed in the left hand side.&lt;br /&gt;&lt;br /&gt;View: &lt;br /&gt;The two 'available dictionary' tableviews&lt;br /&gt;Language Chooser in the preferences - &gt; dictionaries pane&lt;br /&gt;The create new dictionary &lt;br /&gt;&lt;br /&gt;Controllers:&lt;br /&gt;This is always the tricky part.&lt;br /&gt;I'll use the language array controller to see which languages are available.&lt;br /&gt;The controller should manage the creation of the new dictionaries.&lt;br /&gt;&lt;br /&gt;Model&lt;br /&gt;Dictionary Objects&lt;br /&gt;Some related to languages, some not.&lt;br /&gt;A generic dictionary entity which more specific dictionary types can be children of. &lt;br /&gt;&lt;br /&gt;I would also be nice to have the preferences in a separate nib file.&lt;br /&gt;&lt;br /&gt;I need to decide which dictionaries I am going to support, and how. Actually, I should engineer it so that I don't have to make that decision at all. The software should be extensible. &lt;br /&gt;&lt;br /&gt;So let's start by looking at managing whatever the dictionaries might become. Build the framework for the dictionaries and fill in the details later.&lt;br /&gt;&lt;br /&gt;I have to think about what all dictionaries have in common.&lt;br /&gt;&lt;br /&gt;Perhaps I should just directly bind the combo box to the languageArrayController, after all, it is likely that a user has been editing in a language and has decided to check or change the dictionary preferences. And there is no harm done in switching languages in the main view when changing preferences, in fact this could be a feature of the application. Kind of like a big context switch from language to language.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115650971922492073?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115650971922492073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115650971922492073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115650971922492073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115650971922492073'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/dictionary-management-design-notes.html' title='Dictionary Management Design Notes'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115617434599931259</id><published>2006-08-22T01:31:00.000+10:00</published><updated>2006-08-22T01:32:26.020+10:00</updated><title type='text'>What To Do Next</title><content type='html'>What should I do next?&lt;br /&gt;I'm at a bit of a loss at which feature to attack next.&lt;br /&gt;Dictionary lookup? This is the crux of the app, learning the meaning of words. So having the meaning there should be paramount!&lt;br /&gt;&lt;br /&gt;There are core features, essential to the application, then there are the auxillary nicieties that yes, must be there, but are easier to implement when you have the product features there to prop them up.&lt;br /&gt;&lt;br /&gt;For example, I couldn't hope to implement drag and drop before I had implemented the grouping system.&lt;br /&gt;And before I have a dictionary management system, there isn't really any point in making a lovely preference pane or tool bar to hold the pretty icons. &lt;br /&gt;&lt;br /&gt;So I could probably work on the dictionary lookup system.&lt;br /&gt;&lt;br /&gt;Thinking about the problem.&lt;br /&gt;Dictionaries are managed by core data. Their attributes and association to a language are set up so. &lt;br /&gt;However, how am I going to make it possible to give suggested dictionaries to users, as well as allowing them to define their own custom dictionaries?&lt;br /&gt;And I'm going to want to be able to see them in the same view. &lt;br /&gt;&lt;br /&gt;Starting at the elemetary level of a dictionary object, I'm going to go right ahead and design the attributes I think each dictionary will need.&lt;br /&gt;&lt;br /&gt;It's Name : JEDict&lt;br /&gt;The Language it can translate to : ENG-JAP&lt;br /&gt;The language it can translate from : ENG-JAP&lt;br /&gt;It's own icon&lt;br /&gt;&lt;br /&gt;Is there an industry standard for codifying this up?&lt;br /&gt;I should discuss this with Jim this Friday if possible&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115617434599931259?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115617434599931259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115617434599931259' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115617434599931259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115617434599931259'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/what-to-do-next.html' title='What To Do Next'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115596866042965096</id><published>2006-08-19T15:47:00.000+10:00</published><updated>2006-08-19T16:24:20.600+10:00</updated><title type='text'>Words: Milestone. Basic Manual and Smart Grouping System Implemented</title><content type='html'>Yaaaaahoooo!&lt;br /&gt;&lt;br /&gt;I've integrated subproject Groups into the main pproject Words.&lt;br /&gt;&lt;br /&gt;Had one hiccup, and I spent WAY too much time on it before going to google, where I found this apple documentation, right in the Core Data trouble shooting section. I had the intuition to know it was something to do with the Model.&lt;br /&gt;&lt;br /&gt;Anyway, I found the following:&lt;br /&gt;-_-_-_-&lt;br /&gt;Cannot create new objects with array controller&lt;br /&gt;Problem: You cannot create new objects using an NSArrayController. For example, when you click the button assigned to the add: action, you get an error similar to the following:&lt;br /&gt;2005-05-05 12:00:)).000 MyApp[1234] *** NSRunLoop&lt;br /&gt;&lt;br /&gt;ignoring exception 'Failed to create new object' that raised&lt;br /&gt;&lt;br /&gt;during posting of delayed perform with target 123456&lt;br /&gt;&lt;br /&gt;and selector 'invokeWithTarget:'&lt;br /&gt;&lt;br /&gt;Cause: In your managed object model, you have probably specified a custom class for the entity, but you have not implemented the class.&lt;br /&gt;Remedy: Implement the custom class, or specify that the entity is represented by NSManagedObject.&lt;br /&gt;&lt;br /&gt;-_-_-_-&lt;br /&gt;&lt;br /&gt;Which was exactly my problem.&lt;br /&gt;I read it carefully, but already knew what my problem was. Since I had tested and could create Languages and groups if the array controllers managed NSManagedObjects, I could tell there was something up with the custom classes. They weren't being included in the target or something... turns out I wasn't even COMPILING them. So of course I was getting stupid errors.&lt;br /&gt;&lt;br /&gt;Anyway the good news is that it seems to work pretty well. Every thing has slotted together and I can import lots of words at once, and see them in my library, and divvey them up in manual groups and.&lt;br /&gt;&lt;br /&gt;Standby for some delicious screenshots :-)&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/218947875/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/82/218947875_57a9bb4d1d.jpg" width="500" height="453" alt="Piq_060818_111236_83_Words.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;This is a screen with a perfectly pedestrian list of words containted within the manual group called "Word of the Day".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/218947898/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/82/218947898_d8932d67d6.jpg" width="500" height="453" alt="Piq_060818_111253_86_Words.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;And by setting a simple predicate to the smartgroup, we can automagically specify whichever words we want to see! &lt;br /&gt;&lt;br /&gt;Still left to do is write my weekly reports, which the blog should make relatively painless, but that still is something that remains to be seen.&lt;br /&gt;&lt;br /&gt;I am going to try out use case, test driven development as a means to creating healthier code which breaks less, and when it does, I know why.&lt;br /&gt;&lt;br /&gt;There are still things to implement with regard to smart groups. Right now it's hard to tell which is smart and which is dumb in the list, so it would be nice to have an icon. It would also be sweet if the list was ordered nicely. But that's all UI stuff. The model works! The model works! Yippeee!!&lt;br /&gt;&lt;br /&gt;Uh, of course I KNEW it would word, just for the record :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115596866042965096?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115596866042965096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115596866042965096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115596866042965096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115596866042965096'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/words-milestone-basic-manual-and-smart.html' title='Words: Milestone. Basic Manual and Smart Grouping System Implemented'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115579130305502131</id><published>2006-08-17T15:07:00.000+10:00</published><updated>2006-08-17T15:08:23.076+10:00</updated><title type='text'>Is Done, Is Groups</title><content type='html'>Right now the SmartGroups object is trying to do some optimisation schwisseling to determine whether things need updating or not.&lt;br /&gt;&lt;br /&gt;It works by setting wordSet to nil if the refresh function determines that the wordset needs updating, if it doesn't then it leaves the current wordset attached to the wordSet variable, and the 'words' function that is called by the bindings is simply returned this old, unrefreshed set.&lt;br /&gt;&lt;br /&gt;What seems to be happening in my program is that the refresh function isn't setting wordSet to an appropriate setting.&lt;br /&gt;&lt;br /&gt;Ok, so there are a few issues with the groups system. Adding words aren't updating themselves without a restart, which is pretty bad, considering delete works. For some reason they won't fetch. But I am sick of trying to find out why for the moment. So I'm going to leave it and move on. &lt;br /&gt;&lt;br /&gt;I seem to be able to type predicates into the predicate box, and they set themselves fine, and the view resets itself to show a nice list of the words that match the predicate in that language.&lt;br /&gt;&lt;br /&gt;Features associated with this system that I would like to implement are&lt;br /&gt;1) Drag and drop from manual group to manual group, which adds the receiving manual group object to the set of manualGroups that the word object maintains. &lt;br /&gt;&lt;br /&gt;2)User Friendly, graphical user interface for the predicate editor. This would only be able to be built after the groups sub project is incorporated into the main project.&lt;br /&gt;This is because the predicates would have to be set to a more diverse set of object attributes than in the example. It's only once you have interesting meta data that predicates can really show their power.&lt;br /&gt;&lt;br /&gt;Along the way i have had some issues with the SVN repository. I have made several project ressurective rollbacks, so I greatly value and ,make use of it's benifits, but I still have some way to go before I can use it seamlessly.&lt;br /&gt;&lt;br /&gt;The next task before me is to incorporate the groups sub project into the words project. &lt;br /&gt;I don't think it really makes sense to import it as a framework, because the code is pretty application specific, and while the underlying idea beneath it is useable, I don't think it warrants factoring it out as a framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115579130305502131?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115579130305502131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115579130305502131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115579130305502131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115579130305502131'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/is-done-is-groups.html' title='Is Done, Is Groups'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115570956037664381</id><published>2006-08-16T16:24:00.000+10:00</published><updated>2006-08-16T16:26:00.386+10:00</updated><title type='text'>Grroooooooooups</title><content type='html'>Languages will be set via the preferences menu, where the user can set the various settings for the language.&lt;br /&gt;&lt;br /&gt;I need to be able to set the predicate to find WORDS that have their language relationship set to &lt;br /&gt;&lt;br /&gt;language.name LIKE[c] "English"&lt;br /&gt;&lt;br /&gt;language.name like[c] 'Japanese' AND word like[c] 'テスト*'&lt;br /&gt;&lt;br /&gt;Will give me a nice smart list of all the words in my Japanese language that have テスト and anything after that (wildcard *). &lt;br /&gt;&lt;br /&gt;I'm thinking that if I hard code the first part of the predicate into all smart groups then this would be better design.&lt;br /&gt;&lt;br /&gt;So when a smart group is created, it is automatically bound to that language.&lt;br /&gt;&lt;br /&gt;If all Language editing is done via the preferences menu, then we might have a model in which to implement this.&lt;br /&gt;&lt;br /&gt;Ultimately, what we want to be able to do is simply tell a smart group via a predicate what to display, and have it do that. It's not going to do it automatically (the setting of it) but once it knows what it needs to display, then it's up to us to keep on displaying it without error. &lt;br /&gt;&lt;br /&gt;I just committed to SVN probably the most stable version of the system yet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115570956037664381?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115570956037664381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115570956037664381' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115570956037664381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115570956037664381'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/grroooooooooups.html' title='Grroooooooooups'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115647803153856693</id><published>2006-08-13T13:53:00.000+10:00</published><updated>2006-08-25T13:56:07.173+10:00</updated><title type='text'>Weekly Review: 08-13</title><content type='html'>- Continued development of the smart group system.&lt;br /&gt;- Specified more requirements for the grouping system.&lt;br /&gt;- Achieved a milestone implementation of 'the most stable' group system yet.&lt;br /&gt;- Completed the group system, understanding exactly how the Apple sample code worked, and accepting some faults of the system as implemented, because of the constraints of time.&lt;br /&gt;- Documented the features that still need to be implemented.&lt;br /&gt;- Completed the integration of  groups into the main words project.&lt;br /&gt;- Words can be seen in manual and smart groups in the main window, and the predicate for the smart groups can be set manually.&lt;br /&gt;- Decided to try to begin use case driven development.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115647803153856693?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115647803153856693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115647803153856693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115647803153856693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115647803153856693'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/weekly-review-08-13.html' title='Weekly Review: 08-13'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115516019938661555</id><published>2006-08-10T07:49:00.000+10:00</published><updated>2006-08-10T07:49:59.400+10:00</updated><title type='text'>WWDC Day 2</title><content type='html'>Waking refreshed at 7 am, I took the window opportunity for exercise. The treadmills downstairs were all in use and the only working one was out of order, but that turned out to be a blessing in disguise, because I ended up jogging right out of the building onto the streets, down 2nd St, Past Market St, then up a steep San Francisco hill all the way to the top, where I got near 360 degree views of the city and bay. The bay bridge was silhouetted against the glaring water with the morning sun, and looking south I could just see the Golden Gate bridge (my first glimpse) and Alcatraz in the distance. &lt;br /&gt;&lt;br /&gt;Yesterday was a conference day, and the highlights were lunch, and the break between the session! Let me explain - I chose a random table at lunch, and after a while I said hello to everyone and found that one guy worked at Apple. On what team? I ask, "The Finder team" he tells me. So I proceed to tell him about my finder issue, which everyone has been saying is reallllly strange. &lt;br /&gt;&lt;br /&gt;He poked around in the terminal, examining the setup and even the dock preferences, but he actually couldn't find the problem, right there at lunch. But it was neat to have the finder guy explaining it to me, even if the problem itself was out of his ability to fix immediately.&lt;br /&gt;&lt;br /&gt;Even greater was when I went to the OS X lab to ask about my smart list problem, and finding a guys name under 'Core Data' on the white board I explained what I was doing and he told me that in fact he was just doing smart lists in core data that morning, and flipped open his laptop and there it was right on his screen. It actually was similar to my solution. I showed him my code and he said it all looked fine.&lt;br /&gt;&lt;br /&gt;It was really great to know that something I had been going it alone with was turning out to be in the right direction. &lt;br /&gt;&lt;br /&gt;I also got tips on how to solve the rest of the problem, so now I can flesh it out without worrying if it's the wrong thing to do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115516019938661555?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115516019938661555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115516019938661555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115516019938661555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115516019938661555'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/wwdc-day-2.html' title='WWDC Day 2'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115647843301458365</id><published>2006-08-06T13:59:00.000+10:00</published><updated>2006-08-25T14:00:33.016+10:00</updated><title type='text'>Weekly Review: 08-06</title><content type='html'>This week I was attending WWDC.&lt;br /&gt;- Worked heavily on grouping system, when I had free time, and the system progressed steadily. &lt;br /&gt;- Had Apple Core data and Cocoa engineers review my system and give advice, and also help find bugs.&lt;br /&gt;- Learnt about many other Apple technologies that apply to Words and other software I plan to develop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115647843301458365?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115647843301458365/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115647843301458365' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115647843301458365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115647843301458365'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/weekly-review-08-06.html' title='Weekly Review: 08-06'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115458299227275430</id><published>2006-08-03T15:29:00.000+10:00</published><updated>2006-08-25T14:01:20.593+10:00</updated><title type='text'>Web Software Vs Desktop</title><content type='html'>Just a thouht I had in the shower a couple of days ago...&lt;br /&gt;&lt;br /&gt;All this debate over whether the future of software is on the web or on the desktop or whatever.... I believe the answer is that it's going to be on both. Because software designers need to step back and realise that it's not about software, it's about user information, and they also need to reassess their view of software to match something more like their views of hardware - generic boxes that house stuff. The attitude should be that software will be a generic housing too, for the really valuable stuff - people's information, and that information should be managed wherever the user is, whether it be on the web or desktop. Integrated and synchronised seamlessly, access to information should happen on whichever box, and whichever software.&lt;br /&gt;&lt;br /&gt;I think the two will coexist too, one won't push out the other.&lt;br /&gt;&lt;br /&gt;What is words ere networked software and people started to use it to develop their own languages? And kids started to build their own in group talk.&lt;br /&gt;&lt;br /&gt;Also words should have some mechanism for adding lists of words with their definitions from people's existing lists.&lt;br /&gt;&lt;br /&gt;And some kind of quixksilver-esque way of quickly adding and defining words.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115458299227275430?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115458299227275430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115458299227275430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115458299227275430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115458299227275430'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/web-software-vs-desktop.html' title='Web Software Vs Desktop'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115444228652358126</id><published>2006-08-02T00:24:00.000+10:00</published><updated>2006-08-02T00:24:46.540+10:00</updated><title type='text'>Groups: Smart Groups V1</title><content type='html'>Now that I'm moving on to developing the smart group system, I have to think about how users are going to edit the predicates.&lt;br /&gt;I have to first of all&lt;br /&gt;a) learn about predicates myself&lt;br /&gt;b) Implement it stupidly so that the user has to know something about them as well.&lt;br /&gt;c) implement or insert some kind of prefabricated UI predicate editor which sets the smart list predicates depending on word data.&lt;br /&gt;&lt;br /&gt;Let's start with the library.&lt;br /&gt;&lt;br /&gt;When a language is created, a smart list called 'library' is also created.&lt;br /&gt;A new word 'Welcome' is associated to the new language.&lt;br /&gt;When the word array is updated by the groupController with the Library smart list selected, it will fetch all words and plop the resulting array into the word array.&lt;br /&gt;&lt;br /&gt;Then we should be done.&lt;br /&gt;&lt;br /&gt;Hard code the library predicate into the library object, and don't allow users to change it.&lt;br /&gt;&lt;br /&gt;I used the smartgroup code from CoreRecipes and it built me first go a class which provides me with a nice accessor method - (NSSet *) words; which will do all the hard work and give me a set to put wherever I like for all the words that are in the smart group. I can also use a similar interface method to set the predicate too.&lt;br /&gt;&lt;br /&gt;Might have screwed up something with my manual groups though... some objects aren't lasting! :-(&lt;br /&gt;&lt;br /&gt;Anyway it's time for bed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115444228652358126?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115444228652358126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115444228652358126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115444228652358126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115444228652358126'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/groups-smart-groups-v1.html' title='Groups: Smart Groups V1'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115440044198715657</id><published>2006-08-01T12:41:00.000+10:00</published><updated>2006-08-01T12:47:21.996+10:00</updated><title type='text'>Groups... Almost there... Promise!</title><content type='html'>Groups&lt;br /&gt;The sets aren't persisting.... actually, they were! I just wasn't telling my code that a ManualGroup was a manualGroup, and the program was skipping right over the display update code.&lt;br /&gt;&lt;br /&gt;Nice to use the debugger to fix this and then find some old word objects I thought I had lost forever attached to some old manual groups :)&lt;br /&gt;&lt;br /&gt;Another bug to iron out. &lt;br /&gt;&lt;br /&gt;2006-08-01 11:59:09.912 Groups[10213] Filling the word array with words from this manual group&lt;br /&gt;2006-08-01 11:59:10.091 Groups[10213] Exception raised during posting of notification.  Ignored.  exception: Cannot perform operation without a managed object context&lt;br /&gt;&lt;br /&gt;Who is calling this. WHAT doesn't have access to a moc?&lt;br /&gt;Do we ever really know how what we've created works?&lt;br /&gt;&lt;br /&gt;Anyway, it seems my update isn't working properly, But it looks as though objects are being added properly and managed in the right way. My MODEL is correct, but my methods for the VIEW is still struggling somewhat.&lt;br /&gt;&lt;br /&gt;Hmm. I know.&lt;br /&gt;&lt;br /&gt;WELL GET A MANAGED OBJECT CONTEXT!!!!!!&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/203458114/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/78/203458114_737169a247_o.jpg" width="202" height="79" alt="managedObjectContext connection" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've got word objects associating themselves to manual groups, and being managed by their selection. &lt;br /&gt;They stay in the application from launch to launch (they persist) and all is well and dandy.&lt;br /&gt;&lt;br /&gt;Moving right along.&lt;br /&gt;&lt;br /&gt;It was ASKING for a managedObjectContext, so I gave it one, right within interface builder :D&lt;br /&gt;Seems to update itself with each click now. Will it persist....? Hey hey hey!!! It all works.&lt;br /&gt;&lt;br /&gt;All shiny and sparky...&lt;br /&gt;&lt;br /&gt;Manuaaaaaal Groups!!!!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/203452869/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/73/203452869_c5addc17d5.jpg" width="500" height="419" alt="Manual Groups Working" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115440044198715657?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115440044198715657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115440044198715657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115440044198715657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115440044198715657'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/08/groups-almost-there-promise.html' title='Groups... Almost there... Promise!'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115435141186059091</id><published>2006-07-31T23:03:00.000+10:00</published><updated>2006-07-31T23:10:11.873+10:00</updated><title type='text'>Words Specification V2</title><content type='html'>Just finished V2 of this document for the sake of formalising what I want to achieve in the final project this semester.&lt;br /&gt;&lt;a href= "http://users.monash.edu.au/~mbtoz1/WordsSpecV2.pdf"&gt;You can read it&lt;/a&gt; in PDF format. It will be there as long as I am a Monash Student (it's hosted on their server).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115435141186059091?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115435141186059091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115435141186059091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115435141186059091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115435141186059091'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-specification-v2.html' title='Words Specification V2'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115647915162928674</id><published>2006-07-30T14:11:00.000+10:00</published><updated>2006-08-25T14:12:31.630+10:00</updated><title type='text'>Weekly Review: 07-30</title><content type='html'>-Completed Words Specification Version 2.0, which is a stripped version of the original document which was unnecessarily lengthy.&lt;br /&gt;-Continued work on Groups, mistakenly believing that I was almost done with it.&lt;br /&gt;-Effectively used the debugger to find errors in my code.&lt;br /&gt;-Added a Managed Object Context in Interface Builder which eventually turned out to be in error, but solved a problem at the time. &lt;br /&gt;-Manual grouping system worked with word objects persisting in the store.&lt;br /&gt;-Identified the challenges and things I would need to know about to implement smart groups.&lt;br /&gt;-While attempting implementation of smart groups broke manual groups, indicating that perhaps the design is not as modular as might be desirable.&lt;br /&gt;-Had an 'ideas day' where several new and high level feature ideas for Words came about.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115647915162928674?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115647915162928674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115647915162928674' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115647915162928674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115647915162928674'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/weekly-review-07-30.html' title='Weekly Review: 07-30'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115415060211396498</id><published>2006-07-29T15:23:00.000+10:00</published><updated>2006-07-29T15:23:23.833+10:00</updated><title type='text'>Back to Specs and UI</title><content type='html'>&lt;p class="mobile-post"&gt;It's interesting the swing I've made from spending a heap of time on  &lt;br /&gt;UI, to wanting to always get back to the implementation side. It's  &lt;br /&gt;probably because before, UI design is all that I really knew how to  &lt;br /&gt;do! It's a bit of a mind flip to get back to thinking about UI, and  &lt;br /&gt;actually caring about UI.&lt;/p&gt;&lt;p class="mobile-post"&gt;I had a meeting with Jim Breen yesterday and he said he needed a sure  &lt;br /&gt;and fast specifications document, so I'm fleshing it out at the  &lt;br /&gt;moment. Mostly rewriting everything really, although I thought I  &lt;br /&gt;would be able to rehash the dated stuff. But I need screen shots  &lt;br /&gt;now...  so off I go!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115415060211396498?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115415060211396498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115415060211396498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115415060211396498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115415060211396498'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/back-to-specs-and-ui.html' title='Back to Specs and UI'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115406164163266980</id><published>2006-07-28T14:38:00.000+10:00</published><updated>2006-07-28T14:40:41.650+10:00</updated><title type='text'>Words as my Final Year Project</title><content type='html'>It's all happening! Here's the &lt;a href="http://www.csse.monash.edu.au/courseware/cse3301/cse3301supervisors_2006.html"&gt;Monash project list&lt;/a&gt; for second semester, with my own one right in there, and here is &lt;a href="http://www.csse.monash.edu.au/courseware/cse3301/proj2006/jwb_sem2/index.html"&gt;the project news&lt;/a&gt; site.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115406164163266980?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115406164163266980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115406164163266980' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115406164163266980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115406164163266980'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-as-my-final-year-project.html' title='Words as my Final Year Project'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115405625748536204</id><published>2006-07-28T13:10:00.000+10:00</published><updated>2006-07-28T13:25:10.910+10:00</updated><title type='text'>Groups! Oh Groups!</title><content type='html'>My job is to teach the groupController to chuck word objects into the arrayController.&lt;br /&gt;&lt;br /&gt;This involves teaching the SmartGroup and ManualGroup entities how to store or fetch certain words, so THEY can tell the groupController that 'I look at these word objects'.&lt;br /&gt;&lt;br /&gt;Thank-you Justin! I think you may have solved my problem. Justin Anderson&lt;br /&gt;http://www.tensaimac.com/&lt;br /&gt;&lt;br /&gt;I'm getting a proxyObject which, while is keyValueCoding Compliant, will not allow me to use the full functionality of the object.&lt;br /&gt;I need to grab the actual object with &lt;br /&gt;[[controller selectedObjects] objectAtIndex:0]&lt;br /&gt;&lt;br /&gt;Ok, so I'm probably adding words to manual groups now, and setting their relationship, it's just that I can't see them!&lt;br /&gt;&lt;br /&gt;But from the way it's looking and working at the moment, I think I have finally built a structure that will work. &lt;br /&gt;It's a bit finneky though, and I worry about scalability. But let's work for a proof of concept first. &lt;br /&gt;&lt;br /&gt;[]On program launch, update the group view&lt;br /&gt;[]Remove the update button, it is no longer needed.&lt;br /&gt;[]set the first 'language' word to be 'welcome'&lt;br /&gt;[]It is adding a new word each time I click update. Stop that.&lt;br /&gt;&lt;br /&gt;My database class is going to help with my data modelling too, since it is teaching me sound database concepts that I'm just faffing through at the moment. It's really really boring, but so powerful and important for data storage. Somehow I've got to make data storage exciting... ;-/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Anyway, back on the bus, I think it's safe to say that NSArrayController doesn't have any delegates,  so I should probably try to stop checking, and just get on with connecting things up with outlets.&lt;br /&gt;&lt;br /&gt;Fri 28th July&lt;br /&gt;Groups! Oh Groups! &lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/200026381/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/64/200026381_4833344395.jpg" width="500" height="417" alt="Piq_060728_115056_14_Groups" /&gt;&lt;/a&gt;&lt;br /&gt;I had been getting a bit emotional about the fact that I couldn't get groups to work. But somehow I've managed to get something like it working. Admittedly the groups don't manage any words yet, but I think I'm well on my way to having that work. &lt;br /&gt;The view is updated each time the language changes to reflect the groups that are associated with that language. You can create and delete the different types of groups. &lt;br /&gt;The next thing to do is to &lt;br /&gt;[]Order the groups by type, with the special 'library' smartgroup at the top.&lt;br /&gt;[]Remove groups o&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115405625748536204?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115405625748536204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115405625748536204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115405625748536204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115405625748536204'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/groups-oh-groups.html' title='Groups! Oh Groups!'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115387924382188028</id><published>2006-07-26T12:00:00.000+10:00</published><updated>2006-07-26T12:00:43.836+10:00</updated><title type='text'>Project Description</title><content type='html'>Project Title: Words - Computer Aided Vocabulary Management for Language Learning.&lt;br /&gt;&lt;br /&gt;Learning languages often involves a certain amount of raw vocabulary learning, and the student can often spend much time managing stacks of flash cards, lists of words 'to learn', creating these cards and lists, and looking up definitions for words in dictionaries. The end result is a system which is sluggish and boring for the student, and implementing techniques such as the Sebastian Leitner learning method difficult enough not to bother.&lt;br /&gt;Words will aim to implement a systematic, but flexible, and importantly *usable* system for the user to manage a complete cycle of vocabulary learning for whichever language the student is studying. It will manage the process right from when the user encounters a new word, through its definition and learning (using various techniques, ie quizzing) and revision.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115387924382188028?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115387924382188028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115387924382188028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115387924382188028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115387924382188028'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/project-description.html' title='Project Description'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115382559098715669</id><published>2006-07-25T21:02:00.000+10:00</published><updated>2006-07-25T23:09:20.986+10:00</updated><title type='text'>Words: Groups: Kinda working.</title><content type='html'>Well, not working, but it is something at least.&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/197921739/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/62/197921739_016d74dd35.jpg" width="500" height="418" alt="MilestoneAggregatingGroupObjectsTogether_Phew.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;When I click the update button, the aggregation of the manual and smart lists go in the same table view. Now to actually get them managing word entities...&lt;br /&gt;&lt;br /&gt;Here's today's thinking that led to this discovery....&lt;br /&gt;&lt;br /&gt;What I might be mistakenly doing is creating a data entity for something that is actually a controller object. Am I storing something that in fact does not need to be stored? After all, it merely presents the aggregated values of two other entities, and this can be loaded when the program is run. The entity itself doesn't and shouldn't store anything to itself, it should only reflect what is stored elsewhere. Indeed, it is a controller object. So I shouldn't really have one in my data model at all.&lt;br /&gt;&lt;br /&gt;TableView&lt;br /&gt;NSObjectController GroupCoordinatorController &lt;br /&gt;Enitity GroupCoordinator&lt;br /&gt;&lt;br /&gt;I guess that is what I am making, a controller controller in a sense. So the cascading call is normal. &lt;br /&gt;&lt;br /&gt;What a mess.&lt;br /&gt;&lt;br /&gt;Had a walk at lunch time and decided this:&lt;br /&gt;&lt;br /&gt;Anyway I've decided that the groups controller object need not be persisting anywhere at all. It's just an object to churn out an aggregated list of two different types of group objects so that a tableView can display them. It also keeps track of what is selected in the table view, and pops the selected group, whatever it is, into an ManagedObjectController object that is accessed by the word array controller for it's content set.&lt;br /&gt;&lt;br /&gt;This is gold.&lt;br /&gt;&lt;br /&gt;I actually did this yesterday, but it reflects what I'm doing:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/197984759/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/76/197984759_10665542a2_o.jpg" width="541" height="461" alt="ObjectStructreForGroups.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115382559098715669?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115382559098715669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115382559098715669' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115382559098715669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115382559098715669'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-groups-kinda-working.html' title='Words: Groups: Kinda working.'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115373976870117370</id><published>2006-07-24T21:15:00.000+10:00</published><updated>2006-07-24T21:16:08.716+10:00</updated><title type='text'>Groups: A New Sub Project</title><content type='html'>(Sorry about all the blogging these past few days, I've just been rather active!)&lt;br /&gt;New Project: Groups&lt;br /&gt;I'm starting a new sub development app for Words called Groups in light of what I discussed in my last post.&lt;br /&gt;This would also reduce the run / execute cycle too.&lt;br /&gt;&lt;br /&gt;Data modelling. Here's what I propose.&lt;br /&gt;Group is an object that an application can have many of, but a language can only have one group object associated with it.&lt;br /&gt;A group object can have many ManualGroups associated to it, and many smart groups associated to it.&lt;br /&gt;A language can have many words associated to it. &lt;br /&gt;A ManualGroup maintains a list of words that are 'in it'&lt;br /&gt;A SmartList maintains a fetch predicate of words that are 'in it'.&lt;br /&gt;  &lt;br /&gt;Group, ManualGroup and SmartGroup will be managed by NSManagedObject subclasses which will prove the functionality. The model simply shows who owns what.&lt;br /&gt;&lt;br /&gt;Should also create the 'library' smart group programatically at first instance too.&lt;br /&gt;&lt;br /&gt;When you 'add' a new group, whether it be a smart or manual, you have to set it's association to the currently selected language's group object.&lt;br /&gt;&lt;br /&gt;All these entities will need to be managed with some controlling arrays. That's essentially what they are.&lt;br /&gt;&lt;br /&gt;I have set up a groupObjectController in IB to hold whichever instance of Group is active.&lt;br /&gt;&lt;br /&gt;I'm getting a bit lost.&lt;br /&gt;&lt;br /&gt;Ok.&lt;br /&gt;&lt;br /&gt;When you create a new language object, it needs to create a &lt;br /&gt;1. Group object for itself&lt;br /&gt;2. A library smartyPantsGroup object for itself too.&lt;br /&gt;3. Any other default smart groups.&lt;br /&gt;4. The word welcome as the language's new word.&lt;br /&gt;&lt;br /&gt;So let's start from there. Subclassing Language to get a feel for what it needs to do, and cascading from there we'll need additional objects and methods which will force us to subclass the other entities in the model.&lt;br /&gt;&lt;br /&gt;Heyheyhey! I just discovered a powerpoint in my makeshift Mac Lab with my toe as I stretched! Hooray.&lt;br /&gt;&lt;br /&gt;I'm now wrestling with this idea of what the GroupController should be called, because I'm not sure exactly how it will function. &lt;br /&gt;The groupController has to present to the UI a list of all the manual and smart groups that are associated with the Group object that it is controlling. It's an array, but it's probably not ...&lt;br /&gt;&lt;br /&gt;When the user clicks addSmartGroup, the message is going to be sent to the groupController, which will&lt;br /&gt;1. Create a new instance of the SmartGroupEntity.&lt;br /&gt;2. Associate this newSmartGroup to itself (toManyRelationship).&lt;br /&gt;3. Somehow show the user a representation of this newSmartGroup in the group list. &lt;br /&gt;4. Set the wordArrayController to answer to the newSmartGroup.&lt;br /&gt;&lt;br /&gt;Or am I using the entirely incorrect structre?&lt;br /&gt;Should I, like the CoreRecipes example, make it so that &lt;br /&gt; - Languages can have many group objects, which are managed by a regular NSArrayController&lt;br /&gt; - But a group object can be either a smartgroup or a manualgroup. We don't care which.&lt;br /&gt; &lt;br /&gt;Might I create a branch of my new groups project and do this.&lt;br /&gt;&lt;br /&gt;Groups is now an abstract entity, whenever you go to create one of these, you actually create a smartList or a ...&lt;br /&gt;&lt;br /&gt;damn. Now I just thought of another stucture!&lt;br /&gt;&lt;br /&gt;What about if languages themselves can have many smart lists and manual lists, and then I have a subclassed NSArrayController that simply pushes these around?&lt;br /&gt;--&lt;br /&gt;I got three-thirty-itis around 3.30 and went home... I might have another crack at it later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115373976870117370?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115373976870117370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115373976870117370' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115373976870117370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115373976870117370'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/groups-new-sub-project.html' title='Groups: A New Sub Project'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115364445875758701</id><published>2006-07-23T18:47:00.000+10:00</published><updated>2006-07-23T18:47:38.756+10:00</updated><title type='text'>Thinking... Groups Again</title><content type='html'>I would really like my groups and listing system working a bit better. I mean at all. &lt;br /&gt;The wordsArrayController must answer to some as yet undefined 'groupArrayController' object that coordinates what is going to go in the main words array. What it displays depends on&lt;br /&gt;1. Which language is selected&lt;br /&gt;2. Which group is selected.&lt;br /&gt;&lt;br /&gt;It needs to maintain an array of two different kinds of objects. &lt;br /&gt;SmartGroup objects and ManualGroup objects. It presents to a tableview the smartGroup objects that are in the system at the moment. These entities are managed by Core Data. An application can have many ManualGroups and many SmartGroups, but only one groupArrayController. What set of groups go in the array controller depends on the currently selected language.&lt;br /&gt;&lt;br /&gt;GroupArrayController&lt;br /&gt;|S|M|S|S|M|M| | | | | &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; LanguageArrayController&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;SmartGroup &lt;br /&gt;&lt;br /&gt;Here's what it's likely to look and work like:&lt;br /&gt;&lt;br /&gt;View  GroupTableView&lt;br /&gt;          .&lt;br /&gt;          .&lt;br /&gt;Control  GroupArrayController (subclass to add arrays of smart and manual groups and aggregate them)&lt;br /&gt;          .           .&lt;br /&gt;          .           .&lt;br /&gt;Model  SmartGroups ManualGroups&lt;br /&gt;&lt;br /&gt;Using the (reasonable) success of the Lookup sub project, maybe it's best to develop this system independently of Words and then import it? The controller will contain all of the custom code though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115364445875758701?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115364445875758701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115364445875758701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115364445875758701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115364445875758701'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/thinking-groups-again.html' title='Thinking... Groups Again'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115364404043780836</id><published>2006-07-23T18:32:00.000+10:00</published><updated>2006-07-23T18:41:12.196+10:00</updated><title type='text'>Words: Milestone: Automatic Word Lookup (from dict protocol dictionaries)</title><content type='html'>modify the DictProtocolDictionary class so that handle Definition entities instead of instances of the custom Definition class.&lt;br /&gt;The define method should return an array of these instead of the other types of objects.&lt;br /&gt;&lt;br /&gt;MEMORY! Ugh. I was releasing autoreleased objects again. And you think you're doing the right thing! Yuck.&lt;br /&gt;&lt;br /&gt;Anyway it's been a bit of a struggle so I haven't been taking notes today, but I've developed what you can see in the following screen shot.&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/195968216/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/57/195968216_b950344785.jpg" width="500" height="452" alt="WordsMilestoneAutomaticWordLookup.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What I think I need next is a 'isConnected' checker method that the system can ask about the network status from where ever.&lt;br /&gt;&lt;br /&gt;I'm also going to have to program it to flatted the returned definitions down into a more readable format.&lt;br /&gt;1. See what a variety of dictionaries return in the command line&lt;br /&gt;2. Try removing the \n from the responses.&lt;br /&gt;3. See what it looks like in a tableview&lt;br /&gt;&lt;br /&gt;I might have to make a subclass of the tableView to enable more than one line to be visible in a cell. In this way the user will be able to read a few lines of text of the definition.&lt;br /&gt;&lt;br /&gt;Also the next step is to start using words for English, French and Italian. I have to start learning some languages! &lt;br /&gt;&lt;br /&gt;Here's what the French dictionary responds with:&lt;br /&gt;&lt;br /&gt;today         &lt;remove this line&lt;br /&gt; t…ôdei]    &lt;pronunciation can go in it's own field.&lt;br /&gt; aujourd'hui &lt;This doesn't ring a bell but hey.&lt;br /&gt; &lt;br /&gt;English returns&lt;br /&gt;&lt;br /&gt;exculpate    &lt;remove this&lt;br /&gt;     v : pronounce not guilty of criminal charges; "The suspect was   &lt;take the v&lt;br /&gt;         cleared of the murder charges" [syn: {acquit}, {assoil},&lt;br /&gt;         {clear}, {discharge}, {exonerate}] [ant: {convict}]&lt;br /&gt;         &lt;br /&gt;         Exculpate \Ex*cul"pate\, v. t. [imp. &amp; p. p. {Exculpated}, p.&lt;br /&gt;            pr. &amp; vb. n.. {Exculpating} (?).] [L. ex out + culpatus, p.&lt;br /&gt;            p. of culpare to find fault with, to blame, culpa fault. See&lt;br /&gt;            {Culpable}.]&lt;br /&gt;            To clear from alleged fault or guilt; to prove to be&lt;br /&gt;            guiltless; to relieve of blame; to acquit.&lt;br /&gt;            [1913 Webster]&lt;br /&gt;&lt;br /&gt;                  He exculpated himself from being the author of the&lt;br /&gt;                  heroic epistle.                          --Mason.&lt;br /&gt;            [1913 Webster]&lt;br /&gt;&lt;br /&gt;                  I exculpate him further for his writing against me.&lt;br /&gt;                                                           --Milman.&lt;br /&gt;&lt;br /&gt;            Syn: To exonerate; absolve; clear; acquit; excuse; vindicate;&lt;br /&gt;                 justify.&lt;br /&gt;                 [1913 Webster]&lt;br /&gt;                 &lt;br /&gt;                 &lt;Nice - some example sentences! I need to do clear study of a selection of words and what they return.&lt;br /&gt; &lt;br /&gt;It would be nice if the dict protocol was more XMLey and tagged metadata to the results returned. Parsing is going to be a bitch because all dictionaries seems to abide by their own format.&lt;br /&gt;Ah. See this http://xdxf.revdanica.com/&lt;br /&gt;&lt;br /&gt;This might be the next 'type' or 'protocol' of dictionary that I could support.&lt;br /&gt;&lt;br /&gt;Maybe developing dictionary 'packs' are in order. A plugin architecture so that parsers for various specific (and popular) dictionaries can be added and then made to work with Words nicely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115364404043780836?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115364404043780836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115364404043780836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115364404043780836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115364404043780836'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-milestone-automatic-word-lookup_23.html' title='Words: Milestone: Automatic Word Lookup (from dict protocol dictionaries)'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115648068871525623</id><published>2006-07-23T14:37:00.000+10:00</published><updated>2006-08-25T14:38:08.726+10:00</updated><title type='text'>Weekly Review: 07-23</title><content type='html'>-Reached a milestone for words by implementing lookup for words in dict protocol dictionaries.&lt;br /&gt;-Learnt first hand the perils of incorrect memory management in Cocoa Objective-C.&lt;br /&gt;-Identified limitations and features that need to be implemented beyond the basics that I have working.&lt;br /&gt;-Realised yet again that I should be using the software day to day in order to determine which features are most crucial to the software.&lt;br /&gt;-Found a project which is trying to bring XML to the dict protocol, something which would be desirable in words.&lt;br /&gt;-Considered supporting the protocol in the future.&lt;br /&gt;-Began thinking again about a more advanced grouping system for Words, and laying out an initial design, and conceiving of a proposed framework for the system.&lt;br /&gt;-Started a new sub project separate from the Words project called “Groups” in which to implement the grouping system in isolation.&lt;br /&gt;-Reached a 'kind of working' state for groups, where smart and manual groups were displayed in the same window. &lt;br /&gt;-Jubilantly discovered a power outlet in the spot in building 75 where I'd been lurking for the past few days.&lt;br /&gt;-Doubted myself for diverting from the sample code provided by Apple for implementing smart groups with Core data, as I felt it was convoluted and that there “must be a simpler way”. (It turned out after speaking with the Core Data engineers that this was perfectly fine).&lt;br /&gt;-Wrote the project description for the subject web page, and the project is made officially my final year Project &lt;br /&gt;-Made use of online mailing list forums to solve issues successfully. &lt;br /&gt;-Gained confidence that the group framework I was building was one that will work, although I worried about scalability.&lt;br /&gt;-The ugly emotional side of software development reared its head this week, and I steel myself against times in the future when things just don't work and loose confidence.&lt;br /&gt;-Began Version 2 of Words specification document.&lt;br /&gt;-Noted change from previous heavy UI design to 'under the hood' implementation, back to UI again for the specification document.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115648068871525623?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115648068871525623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115648068871525623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115648068871525623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115648068871525623'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/weekly-review-07-23.html' title='Weekly Review: 07-23'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115357477621506949</id><published>2006-07-22T23:25:00.000+10:00</published><updated>2006-07-22T23:26:16.280+10:00</updated><title type='text'>Words: Merging Lookup and Words</title><content type='html'>Ok, I'm going to try and merge the two projects so that I can automatically search for word definitions when I add them.&lt;br /&gt;&lt;br /&gt;I've just realised I can hand the management of dictionaries to core data. This way they'll persist.&lt;br /&gt;&lt;br /&gt;This isn't turning out to be as easy as I would have liked. So there are going to have to be some minor changes to the model and the controller. I've subclassed NSArrayController to DictionariesArrayController which takes care of the UI outlets and actions, and automatically prepares CD Dictionary entities. The only action to far is 'connect' which will be invoked when the user has entered dictionary details. It will create a new entitiy with the appropriate relationship to whichever language is selected, and plop the data that must persist between launches of the application into the entity (server, database, username, password). Then it should invoke the dictProtocolDictionary's own awakeFromInsert method which will then make the actual connection. In this way, when dictionaries are loaded at launch time into the array, they can reconnect to their servers and be ready to define words.&lt;br /&gt;&lt;br /&gt;I've got a problem: The NSArrayController seems to only want to handle objects of one type. Why is this so? Surely I should be able to string up any kind of object I like in it. addObject:object kind of situation. &lt;br /&gt;Maybe it's bindings that's restricting me. The tableview needs to know what to display. But I've told the arrayController that it's got to manage entities of type Dictionary, which is an abstract class. Which means that you can't actually make of these objects, to do so is useless! It's actually the same problem I've had with trying to get smart lists and manual lists in the same view. What if the array controller managed two separate arraycontrollers, then then pulled the two together into the same array? That would be a bit messy methinks.&lt;br /&gt;&lt;br /&gt;I possibly don't need to have core data manage the Dictionary entity as such. I mean, if I never actually have an instance of one, then why does core data need to know? Entity DictProtocolDictionary can still have a relationship with Language, so that dictionaries of that type can know to whom they belong. The subclass behaviour can come from the manual hardcoding of the entities classes. The ArrayController can directly manage dictProtocolDictionaries for now.&lt;br /&gt;&lt;br /&gt;Here's what the connect button in the controller object should do, as far as I can see so far.&lt;br /&gt;- (IBAction)connect:(id)sender&lt;br /&gt;{&lt;br /&gt; //create a new DictProtocolDictionary in the moc &lt;br /&gt; //create a new dictionary entity and populate it's data. &lt;br /&gt; //add it to the array&lt;br /&gt; //(this should invoke the entity's awake from insert method which will make the actual connection)&lt;br /&gt; //once you're connected and there were no errors, clear the UI, ready for the next connection&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Actually, awakeFromInsert isn't entirely appropriate. Because it isn't called when the object is being recalled from the moc. What we need is something that will go through the dictionaries in the system and connect them when they are summoned out of the moc.&lt;br /&gt;awakeFromFetch is more appropriate! (For reconnecting).&lt;br /&gt;&lt;br /&gt;So now I am able to create and delete persisting dictProtocolDictionaries in Words proper, which associate themselves to languages. The next thing to do is to make sure they are connected not only when they are fetched by the window, but at launch time too, so that they are connected and available even when the dictionary pane hasn't been opened yet (can work around this for a while).&lt;br /&gt;Each time a word is entered, the applicationController should try to find definitions for it. Words that have been defined are checked off as having been done so. This is so that later on the application can go though and find undefined words and define them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Still more work before I can call a milestone with a screenshot ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115357477621506949?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115357477621506949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115357477621506949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115357477621506949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115357477621506949'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-merging-lookup-and-words.html' title='Words: Merging Lookup and Words'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115330650399647408</id><published>2006-07-19T20:54:00.000+10:00</published><updated>2006-07-19T20:55:04.006+10:00</updated><title type='text'>Nothing Much New Today</title><content type='html'>Ok, so I've got words (lookup) connecting to any dict protocol dictionary in the world, but I still have plenty of issues to address.&lt;br /&gt;&lt;br /&gt;The results being returned are themselves hard to read in a table view. It may be necessary to parse them into one line, so that at least the first few words can be read. &lt;br /&gt;&lt;br /&gt;Right now when people walk away from the internet, they have gone from having plenty of dictionaries, to having none.&lt;br /&gt;&lt;br /&gt;Also, as words are added enmasse, the dictionary lookup service adds things to the array one by one, but the user interface isn't updated until the very last definition has been found. It would be nice to add each as they are found.. but having thought about that the dict protocol returns one struct for each query containing all things found as it is, so it wouldn't work that way definition by definition, but it could work for word by word, and it will work this way without any modification.&lt;br /&gt;&lt;br /&gt;In the dictionaries preferences pane, whether the dictionary is available online or offline should be indicated. Users should be able to specify the name, and kind of dictionary, and if needed specify the location, whether it be server or local file. &lt;br /&gt;&lt;br /&gt;There should be some indication of what is being done in the user interface. A spiral progress indicator should be spun while the definitions are being hunted down.&lt;br /&gt;&lt;br /&gt;Kind of need to write up my application to do this as final year project.&lt;br /&gt;&lt;br /&gt;Submitted the application today. I'm pretty tired tonight so might take a rest from Cocoa until tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115330650399647408?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115330650399647408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115330650399647408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115330650399647408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115330650399647408'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/nothing-much-new-today.html' title='Nothing Much New Today'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115322614815597839</id><published>2006-07-18T22:31:00.000+10:00</published><updated>2006-07-18T22:35:48.166+10:00</updated><title type='text'>Words: Milestone Automatic Word lookup in Multiple Dict Protocol Dicts and Databases</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p/&gt;  &lt;p&gt;More notes that I took while thinking through today's developments...&lt;br/&gt; &lt;/p&gt;  &lt;p&gt;I'm going to create a new interface to the UI AND to the class that will allow me to initialise a new dict Protocol object. It will then be available to the user to query while the program is running, and the results will be displayed on the right.&lt;/p&gt;  &lt;br/&gt; Hmmm&lt;br/&gt; &lt;br/&gt; But how is this going to help words?&lt;br/&gt; &lt;br/&gt; Within the Words system, whenever there are &lt;br/&gt; 1. Undefined words&lt;br/&gt; 2. A suitable dictionary available wither locally or remotely&lt;br/&gt; &lt;br/&gt; it should try to automatically find definitions for each undefined words.&lt;br/&gt; &lt;br/&gt; Fetch from the ManagedObjectContext all instances of the Word entity that have not been defined.&lt;br/&gt; Order them in some way (or not). Importance??&lt;br/&gt; Start from the top of the list and go to the bottom. For each Word object in the array.&lt;br/&gt; [Dictionary define:word]&lt;br/&gt; Place the definition&lt;br/&gt; &lt;br/&gt; But I'm getting such varied quantities back from the dictionary. And that's only from the one server, in one database! What about when the possible servers and databases increases!? &lt;br/&gt; The exact results are unpredictable, but they will be within reason. And we know how to handle definition objects well enough. Generally, the first few results fired back from the dictionary are the most relevant.&lt;br/&gt; However, we cannot safely disregard the other definitions. &lt;br/&gt; If the default is inappropriate, then the user must decide which definition they want to be 'Number 1', and promote it to the top of the definitions list. This is the definition that is used for quizzing, word lists etc, however, the alternative definitions are still available.&lt;br/&gt; &lt;br/&gt; In the UI, all definitions will be available via an auxiliary window. The main definition will of course be viewable against the original word.&lt;br/&gt; &lt;br/&gt; I could probably go right ahead and put the DictProtocolDictionary class right into my existing words prototype, but I want to make sure it is ready and will be able to do everything that I want it to do. But I suppose I can always add to it and modify its behaviour later.&lt;br/&gt; &lt;br/&gt; What I think I need to workout next is the UI for this system. Words now has the ability to connect to any server that implements the dict protocol. How is the user going to&lt;br/&gt; 1. Create a new dictionary.&lt;br/&gt; 2. Specify which dictionary they want to use.&lt;br/&gt; 3. Remove Dictionaries.&lt;br/&gt; &lt;br/&gt; I also have to make sure there is an internet connection available when the dictionary tries to connect, and to fail gracefully when there isn't (rather than crashing which is what lookup does at the moment!)&lt;br/&gt; &lt;br/&gt; Possibly, the user can set any number of dictionaries themselves (or select a suggestion from the list) which then associates itself to the actively selected language. &lt;br/&gt; The special case is that it's not a foreign language to you, in which case you are looking for only definitions, not translations to words. There might be a checkbox to allow the user to specify whether the dictionary is going to be used as translation or a definition dictionary. &lt;br/&gt; &lt;br/&gt; I just sketched a preference pane which allows you to choose language, add and remove available dictionaries, check whether they are active or not, a text field to change the server and database, and below that the other dictionary settings. &lt;br/&gt; &lt;br/&gt; The application will take from these available dictionaries their definitions. &lt;br/&gt; &lt;br/&gt; Therefore dict class should have Cocoa compliant Getters and Setters so I can hook them up to an IB GUI. &lt;br/&gt; &lt;br/&gt; Before I set up preferences and the like in Words proper, I need to make sure that the classes can handle all the setters and options etc within the cocoa environment. Can I create more than one dictProtocol dictionary and change it's database etc dynamically. This should be developed in the Lookup application.&lt;br/&gt; &lt;br/&gt; &lt;p&gt;Aaand here's the fruits of today's labours. What fun! I can't wait to make it easy for anyone to connect to any dictionary in the world with such a simple interface.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/13346234@N00/192545935" title="WordsMultipleDictDictionarySupport.jpg"&gt;&lt;img src="http://static.flickr.com/66/192545935_1f78ed64f1_m.jpg"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(Click) and look! It's translated cheese to fromage! &lt;br/&gt; &lt;/p&gt;  &lt;p&gt;Of course, the end goal is to hook the above with what is in this image:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/13346234@N00/192545870" title="AddWordsViaTheServicesMenuEnMasse.jpg"&gt;&lt;img src="http://static.flickr.com/60/192545870_414aa04d2e_m.jpg"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Use the services menu to add you existing word lists (or just a single word) to Words, and have it find the meaning for you, and then save it for later. &lt;br/&gt; &lt;/p&gt;  &lt;p&gt;fyi&lt;br/&gt; &lt;/p&gt;  &lt;p&gt;THESE are the dictionaries that reside on dict.org alone!&lt;br/&gt; &lt;/p&gt;  Database list:&lt;br/&gt; gcide&lt;br/&gt;         The Collaborative International Dictionary of English v.0.48&lt;br/&gt; wn&lt;br/&gt;         WordNet (r) 2.0&lt;br/&gt; moby-thes&lt;br/&gt;         Moby Thesaurus II by Grady Ward, 1.0&lt;br/&gt; elements&lt;br/&gt;         Elements database 20001107&lt;br/&gt; vera&lt;br/&gt;         Virtual Entity of Relevant Acronyms (Version 1.9, June 2002)&lt;br/&gt; jargon&lt;br/&gt;         Jargon File (4.3.1, 29 Jun 2001)&lt;br/&gt; foldoc&lt;br/&gt;         The Free On-line Dictionary of Computing (27 SEP 03)&lt;br/&gt; easton&lt;br/&gt;         Easton's 1897 Bible Dictionary&lt;br/&gt; hitchcock&lt;br/&gt;         Hitchcock's Bible Names Dictionary (late 1800's)&lt;br/&gt; bouvier&lt;br/&gt;         Bouvier's Law Dictionary, Revised 6th Ed (1856)&lt;br/&gt; devils&lt;br/&gt;         THE DEVIL'S DICTIONARY ((C)1911 Released April 15 1993)&lt;br/&gt; world02&lt;br/&gt;         CIA World Factbook 2002&lt;br/&gt; gazetteer&lt;br/&gt;         U.S. Gazetteer (1990)&lt;br/&gt; gaz-county&lt;br/&gt;         U.S. Gazetteer Counties (2000)&lt;br/&gt; gaz-place&lt;br/&gt;         U.S. Gazetteer Places (2000)&lt;br/&gt; gaz-zip&lt;br/&gt;         U.S. Gazetteer Zip Code Tabulation Areas (2000)&lt;br/&gt; --exit--&lt;br/&gt;         Stop default search here.&lt;br/&gt; afr-deu&lt;br/&gt;         Africaan-German Freedict dictionary&lt;br/&gt; afr-eng&lt;br/&gt;         Africaan-English Freedict Dictionary&lt;br/&gt; ara-eng&lt;br/&gt;         English-Arabic Freedict Dictionary&lt;br/&gt; cro-eng&lt;br/&gt;         Croatian-English Freedict Dictionary&lt;br/&gt; cze-eng&lt;br/&gt;         Czech-English Freedict dictionary&lt;br/&gt; dan-eng&lt;br/&gt;         Danish-English Freedict dictionary&lt;br/&gt; deu-eng&lt;br/&gt;         German-English Freedict dictionary&lt;br/&gt; deu-fra&lt;br/&gt;         German-French Freedict dictionary&lt;br/&gt; deu-ita&lt;br/&gt;         German-Italian Freedict dictionary&lt;br/&gt; deu-nld&lt;br/&gt;         German-Nederland Freedict dictionary&lt;br/&gt; deu-por&lt;br/&gt;         German-Portugese Freedict dictionary&lt;br/&gt; eng-afr&lt;br/&gt;         English-Africaan Freedict Dictionary&lt;br/&gt; eng-ara&lt;br/&gt;         English-Arabic FreeDict Dictionary&lt;br/&gt; eng-cro&lt;br/&gt;         English-Croatian Freedict Dictionary&lt;br/&gt; eng-cze&lt;br/&gt;         English-Czech fdicts/FreeDict Dictionary&lt;br/&gt; eng-deu&lt;br/&gt;         English-German Freedict dictionary&lt;br/&gt; eng-fra&lt;br/&gt;         English-French Freedict Dictionary&lt;br/&gt; eng-hin&lt;br/&gt;         English-Hindi Freedict Dictionary&lt;br/&gt; eng-hun&lt;br/&gt;         English-Hungarian Freedict Dictionary&lt;br/&gt; eng-iri&lt;br/&gt;         English-Irish Freedict dictionary&lt;br/&gt; eng-ita&lt;br/&gt;         English-Italian Freedict dictionary&lt;br/&gt; eng-lat&lt;br/&gt;         English-Latin Freedict dictionary&lt;br/&gt; eng-nld&lt;br/&gt;         English-Netherlands Freedict dictionary&lt;br/&gt; eng-por&lt;br/&gt;         English-Portugese Freedict dictionary&lt;br/&gt; eng-rom&lt;br/&gt;         English-Romanian FreeDict dictionary&lt;br/&gt; eng-rus&lt;br/&gt;         English-Russian Freedict dictionary&lt;br/&gt; eng-spa&lt;br/&gt;         English-Spanish Freedict dictionary&lt;br/&gt; eng-swa&lt;br/&gt;         English-Swahili xFried/FreeDict Dictionary&lt;br/&gt; eng-swe&lt;br/&gt;         English-Swedish Freedict dictionary&lt;br/&gt; eng-tur&lt;br/&gt;         English-Turkish FreeDict Dictionary&lt;br/&gt; eng-wel&lt;br/&gt;         English-Welsh Freedict dictionary&lt;br/&gt; fra-deu&lt;br/&gt;         French-German Freedict dictionary&lt;br/&gt; fra-eng&lt;br/&gt;         French-English Freedict dictionary&lt;br/&gt; fra-nld&lt;br/&gt;         French-Nederlands Freedict dictionary&lt;br/&gt; hin-eng&lt;br/&gt;         English-Hindi Freedict Dictionary [reverse index]&lt;br/&gt; hun-eng&lt;br/&gt;         Hungarian-English FreeDict Dictionary&lt;br/&gt; iri-eng&lt;br/&gt;         Irish-English Freedict dictionary&lt;br/&gt; ita-deu&lt;br/&gt;         Italian-German Freedict dictionary&lt;br/&gt; jpn-deu&lt;br/&gt;         Japanese-German Freedict dictionary&lt;br/&gt; kha-deu&lt;br/&gt;         Khasi-German FreeDict Dictionary&lt;br/&gt; lat-deu&lt;br/&gt;         Latin-German Freedict dictionary&lt;br/&gt; lat-eng&lt;br/&gt;         Latin-English Freedict dictionary&lt;br/&gt; nld-deu&lt;br/&gt;         Nederlands-German Freedict dictionary&lt;br/&gt; nld-eng&lt;br/&gt;         Nederlands-English Freedict dictionary&lt;br/&gt; nld-fra&lt;br/&gt;         Nederlands-French Freedict dictionary&lt;br/&gt; por-deu&lt;br/&gt;         Portugese-German Freedict dictionary&lt;br/&gt; por-eng&lt;br/&gt;         Portugese-English Freedict dictionary&lt;br/&gt; sco-deu&lt;br/&gt;         Scottish-German Freedict dictionary&lt;br/&gt; scr-eng&lt;br/&gt;         Serbo-Croat-English Freedict dictionary&lt;br/&gt; slo-eng&lt;br/&gt;         Slovenian-English Freedict dictionary&lt;br/&gt; spa-eng&lt;br/&gt;         Spanish-English Freedict dictionary&lt;br/&gt; swa-eng&lt;br/&gt;         Swahili-English xFried/FreeDict Dictionary&lt;br/&gt; swe-eng&lt;br/&gt;         Swedish-English Freedict dictionary&lt;br/&gt; tur-deu&lt;br/&gt;         Turkish-German Freedict dictionary&lt;br/&gt; tur-eng&lt;br/&gt;         Turkish-English Freedict dictionary&lt;br/&gt; english&lt;br/&gt;         English Monolingual Dictionaries&lt;br/&gt; trans&lt;br/&gt;         Translating Dictionaries&lt;br/&gt; all&lt;br/&gt;         All Dictionaries (English-Only and Translating)&lt;br/&gt; web1913&lt;br/&gt;         Webster's Revised Unabridged Dictionary (1913)&lt;br/&gt; world95&lt;br/&gt;         The CIA World Factbook (1995)&lt;br/&gt; &lt;br/&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115322614815597839?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115322614815597839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115322614815597839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115322614815597839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115322614815597839'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-milestone-automatic-word-lookup.html' title='Words: Milestone Automatic Word lookup in Multiple Dict Protocol Dicts and Databases'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115314116177370388</id><published>2006-07-17T22:43:00.000+10:00</published><updated>2006-07-17T22:59:22.140+10:00</updated><title type='text'>Words: Milestone. Dict Protocol Word Lookup</title><content type='html'>After yesterday's productivity, today has seemed rather disappointing. What I have to remember is that even though I might not get on screen progress done, what I'm learning from my mistakes will help me program better in the future.&lt;br /&gt;&lt;br /&gt;For example, I've learnt one lesson today - the less C++ there is my life that happier I think I'll be!&lt;br /&gt;&lt;br /&gt;You see, there's this free program to access dict protocol compatible servers written in C, and there was a convenient wrapper to it written in C++. I tried to link it into my Lookup app, but it threw nasty errors at me for hours. Maybe I don't know the mechanics of it yet, and there is a simple way to do it. Anyway I realised that the C++ wrapper around the C code was actually what I should probably be rewriting for my own app in Objective-C.&lt;br /&gt;&lt;br /&gt;Many hours, castings, photographs with &lt;a href="http://www.melbourne.vic.gov.au/info.cfm?top=190&amp;pa=1317&amp;amp;pg=1995"&gt;Lord Mayor John So&lt;/a&gt; later...&lt;br /&gt;@ 10.19pm&lt;br /&gt;&lt;br /&gt;Bingo!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/191670342/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/75/191670342_a700541705.jpg" alt="bingo!.jpg" height="274" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another milestone! I now have my DictProtocolDictionary instance importing definitions right into the object from somewhere in Alaska I believe. Should only be short work to extract the data from the struct it's currently residing in, and plop it into the definitions array controller to be shown in the table view.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/191670398/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/65/191670398_7d0518ad7c.jpg" alt="bugGone.jpg" height="281" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;Done! Of course it's not perfect. There are multiple rows displayed in the table, and I'm going to have to parse the definitions for those that are meaningful, and take out things like procunciation, and word type in some handy variables. And give the dictionary server and dictionary database itself credit for the service.&lt;br /&gt;&lt;br /&gt;Next I think I should create an interface which allows the user to specify which dict server and which dictionary on that server they wish to query.&lt;br /&gt;&lt;br /&gt;Actually there still is some work to be done with the DictProtocolDictionary class. I haven't implemented all of the code that the C++ wrapper did that I was wrangling with on the tram this morning.&lt;br /&gt;&lt;br /&gt;All this stuff is really starting to make sense now, and I'm loving it! You come across something tricky and you apply yourself for a few minutes, debug, think some more, realise something, then come up with something beautiful like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;&lt;blockquote&gt;Definition *newDefinition = [[Definition alloc] initWith:[NSString stringWithCString:(theDefinition[idx]-&gt;ld_answord)] andDefinition:[NSString stringWithCString:(theDefinition[idx]-&gt;ld_ansdef)]];&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Mwah! Bellissimo!&lt;br /&gt;&lt;br /&gt;I start back at Uni tomorrow, and with any luck something from this blog will become my final year project and I will be able to spend even more time developing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115314116177370388?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115314116177370388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115314116177370388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115314116177370388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115314116177370388'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-milestone-dict-protocol-word.html' title='Words: Milestone. Dict Protocol Word Lookup'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115305340589490762</id><published>2006-07-16T22:32:00.000+10:00</published><updated>2006-07-16T22:42:12.556+10:00</updated><title type='text'>Words: Lookup</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Since I've hit a bit of a wall with smart lists (ideas anyone??), I'm going to put it aside and try to develop in isolation another hairy part of Words. The definition lookup feature.&lt;br /&gt;&lt;p&gt;By isolation I mean that I will start a new project, with a simple UI that is the front end to the lookup class (or classes) that take a word string as an argument, and return 'definition' objects. This is how I envision the system will work.&lt;/p&gt;  &lt;p style="font-style: italic;"&gt;The following are the notes I took today while thinking and devloping what the screenshot shows below. They don't flow very well!&lt;br /&gt;&lt;/p&gt;  &lt;p&gt;While I am aiming for language generality, I still believe that there will be language specific things that will need to be handled by a subclass of the generic 'dictionary' object.&lt;/p&gt;  LookupUtility has the function "(NSArray *)lookupWord:(NSString *)word inDict:(Dictionary *)dict" which is the interface for whatever needs to lookup a word in whatever dictionary. It returns an array of definition objects for word.&lt;br /&gt;&lt;br /&gt;There should only ever be one LookupUtility instance per application.&lt;br /&gt;&lt;br /&gt;This diagram shows neither the lookup utility (as I scrapped it in the end) nor a generic 'dict' protocol class (yet to be implemented).&lt;br /&gt;&lt;a href="http://flickr.com/photos/13346234@N00/190694295" title="Class Diagram.jpg"&gt;&lt;img src="http://static.flickr.com/45/190694295_35923144da_m.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Dictionary is an Abstract Class. The application should create instances of a Dictionary subclass that is applicable to the particular user's needs. Ie, If a user has specified that they are learning Japanese and their native language is English, then the application should instantiate a JapEngDictionary object that can churn out definitions when queried with a string.&lt;br /&gt;&lt;br /&gt;The DictProtocolDictionary can be instantiated (not shown in the image), one for each dictionary that can be accessed via the dict protocol. In the user interface, the user might be able to cause this to happen&lt;br /&gt;&lt;br /&gt;The user should be able to select which dictionary object the application should use to find definitions to their words by default. The application controller (delegate) should keep check of what dictionary objects are available (a dictionary manager view??). From here a user might be able to select a word and search again in dict:selectedDictionary for example, if they feel they can find better results elsewhere.&lt;br /&gt;&lt;br /&gt;So to make the development easier and modularised from the main Words app, I am starting Lookup.xcodeproj (or whatever that filename is these days). With luck, the classes I develop should be able to be imported directly into Words and hooked up to the WordsAppDelegate no problem.&lt;br /&gt;&lt;br /&gt;Because Lookup.application doesn't really need to STORE anything, I'll use the Cocoa Application template from within Xcode.&lt;br /&gt;&lt;br /&gt;I've created a simple interface in IB, and have created AppController, with an action 'search' and an outlet 'wordToLookup'. Later I will add two NSArrayControllers, which will control the Dictionary and definition objects contained in the NSArrays returned by the dictionary objects. Bindings should take care of the display of this.&lt;br /&gt;&lt;br /&gt;First I am going to check that this structure works by creating the classes with stubs that return static example Arrays.&lt;br /&gt;&lt;br /&gt;Actually, I've just realised that the AppController doesn't control which dictionaries are available, the NSArrayController called dictionaries does. It can co-ordinate adding and deletion from the model... but in fact we don't want it to be able to do that. We want to do that programatically by asking the Controller nicely if it would please add this new dictionary object we've just created to its trusted care. Then we can autorelease it :-)&lt;br /&gt;&lt;br /&gt;Ok, so now I've got some to-be dictionary object in the array.&lt;br /&gt;&lt;br /&gt;How I handle these dictionaries has to be separate to how they work.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Later on that night...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://flickr.com/photos/13346234@N00/190694358" title="WordsLookup.jpg"&gt;&lt;img src="http://static.flickr.com/48/190694358_e419e1993c_m.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;br /&gt;I believe I've got the mechanics of it working well. Next step is to test whether its architecture is suitable for scalability. I'll create a new class for a French and English dictionary, and see if I can add it to the list of dictionaries, and ask it for definitions dynamically. Wait a sec... Yahaaa! I had checked 'Automatically Prepares Content' - a throwback to my yesterday Code Data ways. Of course, It's not to automatically prepare any content at all - I'm deciding to do all the work! This also explains the added extra definition object that was being automatically prepared in the Array.&lt;/p&gt;  &lt;a href="http://flickr.com/photos/13346234@N00/190694309" title="LookupDictionarySelection.jpg"&gt;&lt;img src="http://static.flickr.com/66/190694309_34a4766f18_m.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So there I have it, a kind of 'framework' for me to handle multiple languages. A little simplistic, but a proof of concept.&lt;/p&gt;  Next is nothing but&lt;br /&gt;1. Adding the code to actually access the dictionary databases (probably messy)&lt;br /&gt;2. Parsing the results into nice rich fields that can go in the definition class / entity.&lt;br /&gt;3. Creating as many Dictionary class subclasses for the dictionary databases that I can find.&lt;br /&gt;&lt;br /&gt;And then attaching the whole lot the main Words app and running it all on each word that is input.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Brainwave. Have a thesaurus as well so that writers can use Words to search for alternative words, and keep track even of when they have used them.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115305340589490762?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115305340589490762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115305340589490762' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115305340589490762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115305340589490762'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-lookup.html' title='Words: Lookup'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115650267542587058</id><published>2006-07-16T20:43:00.000+10:00</published><updated>2006-08-25T20:44:35.446+10:00</updated><title type='text'>Weekly Review: 07-16</title><content type='html'>- Having difficulty with grouping system, so began work on dictionary management and lookup.&lt;br /&gt;- Started a new, isolated project 'Lookup' to do so.&lt;br /&gt;- Did preliminary design and brainstorming of how the system might work.&lt;br /&gt;- Got the initial structure of the system working, which proved the concept&lt;br /&gt;-Outlay what needed to be done.&lt;br /&gt;- Utilised an open source dict protocol program by writing an Objective-c wrapper around it.&lt;br /&gt;- Linked it to the Lookup project and connected the user interface to define words from dict.org, and display the results in the table view.&lt;br /&gt;-Identified areas that needed improvement&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115650267542587058?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115650267542587058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115650267542587058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115650267542587058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115650267542587058'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/weekly-review-07-16.html' title='Weekly Review: 07-16'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115276825445478221</id><published>2006-07-13T15:20:00.000+10:00</published><updated>2006-07-13T15:24:14.560+10:00</updated><title type='text'>Words: A Conservative Milestone - Manual Lists</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;p&gt;Been a bit quiet here for the past couple of days, been working on implementing groups for Words. I tried to follow the example of Apple's CoreRecipes app, but while I understood what was going on, the implementation directly ported wouldn't have worked with Words. In the recipes app, the highest Entity is the Recipe, whereas in Words, it is Language. Anyway to cut a long story short, I've taken the Mr. Obvious route and used a simple model for groups. I think I should be able to set up smart lists using a fetched property in a SmartList entity without too much hassle, which will fetch 'whatever' (whatever being specified by the user / system) and tell the WordArrayController to display it. Which will also allow me to have a 'fetch all the words in this language' which will be set as default and will be, in fact, the Words equivalent of the iTunes 'Library'.&lt;br/&gt; &lt;/p&gt;  &lt;p&gt;If I WERE to use the fangled smart list stuff, I thought that a Language Array Controller would then in turn manage which GroupTreeController was active, which would then determine what words were accessable by the WordsArrayController. Anyway maybe that's for a later day when I am feeling more comfortable with Cocoa and Core Data. Right now while I'm essentially prototyping my App I'm going to TELL MYSELF it's OK to take the easy road. For Now. Ok I'm done. No really.&lt;/p&gt;  &lt;p&gt;Sigh.&lt;/p&gt;  &lt;p&gt;Honestly I really would have rathered I'd gotten the more fancy stuff working.&lt;/p&gt;  &lt;p&gt;Here's what we have then:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/13346234@N00/188557837" title="WordsMilestoneManualGroups.jpg"&gt;&lt;img src="http://static.flickr.com/60/188557837_362963cd61_m.jpg"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;With this data model&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/13346234@N00/188564281" title="WordsGroupModel.jpg"&gt;&lt;img src="http://static.flickr.com/60/188564281_0b18a69c07_m.jpg"/&gt;&lt;/a&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115276825445478221?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115276825445478221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115276825445478221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115276825445478221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115276825445478221'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-conservative-milestone-manual.html' title='Words: A Conservative Milestone - Manual Lists'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115244681252927107</id><published>2006-07-09T22:05:00.000+10:00</published><updated>2006-07-09T22:06:52.540+10:00</updated><title type='text'>Words Milestone</title><content type='html'>Imported my parser class from a previous project that adds words enmasse. Used memory management and arrays to pass around the words from an industrious parser class, and I'm satisfied with the results. Go Cocoa! I was also enjoying thinking about the modularity of the classes and code, and about what consists best design. UI still a mess, so no screenshot ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115244681252927107?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115244681252927107/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115244681252927107' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115244681252927107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115244681252927107'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/words-milestone.html' title='Words Milestone'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115604869866211469</id><published>2006-07-09T14:36:00.000+10:00</published><updated>2006-08-20T14:38:18.673+10:00</updated><title type='text'>Weekly Review: 07-09</title><content type='html'>- Learnt first hand the advantages of using subversion for revision control.&lt;br /&gt;- Found an old project in my archives that tokenises words. Still needs work done on it though, but it was nice to have such simple code reusability.&lt;br /&gt;-Began experimenting with a grouping system, and decided to go against the example code provided by Apple to do smart groups with Core Data. Was a little disappointed in myself to taking the obvious route, however. Manual group system working.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115604869866211469?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115604869866211469/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115604869866211469' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115604869866211469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115604869866211469'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/weekly-review-07-09.html' title='Weekly Review: 07-09'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115240818141045731</id><published>2006-07-09T11:21:00.000+10:00</published><updated>2006-07-09T11:23:01.420+10:00</updated><title type='text'>Subversion</title><content type='html'>Setting up subversion for my noodle timer project this morning, I tried adding to the custom class for my managed object. It all went pair shaped, and I decided that I need to read up more on how to do it. Previously, I would have sifted though the code and removed my changes, this time, I simple killed the working folder I made the modifications in, and 'rolled back' to the stable copy by checking out what I had checked in earlier. All worked perfectly. What a system! I saved time and now I am sure nothing has been broken by my own blunders.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115240818141045731?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115240818141045731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115240818141045731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115240818141045731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115240818141045731'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/subversion.html' title='Subversion'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115225446003438065</id><published>2006-07-07T16:39:00.000+10:00</published><updated>2006-07-07T16:41:00.046+10:00</updated><title type='text'>Cocoa Workshop Day 3</title><content type='html'>Today is about learning how to create a really interactive application. Graphics, archiving. Storing objects in the model and havin the view display them.&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/mathieutozer/183897419/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/58/183897419_cb06387476.jpg" width="500" height="313" alt="CocoaWorkshopDay3CustomView" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Custom view - just a generic view, it doesn't have a class associated with it. You do this via the custom classes attribute. You could assign it to anything, but you make your own!&lt;br /&gt;&lt;br /&gt;Quartz Debug (the flashy thing) can show what is being redrawn in your app by quartz. Use it while optimizing.&lt;br /&gt;&lt;br /&gt;Event methods&lt;br /&gt;–  mouseDown:  &lt;br /&gt;–  mouseDragged:  &lt;br /&gt;–  mouseUp:  &lt;br /&gt;–  mouseMoved:  &lt;br /&gt;–  mouseEntered:  &lt;br /&gt;–  mouseExited:  &lt;br /&gt;...&lt;br /&gt;All these tell you the events that we can monitor and watch for.&lt;br /&gt;&lt;br /&gt;Floating point numbers for pixel referencing makes for antialiasing and blurring of lines. Nice!&lt;br /&gt;&lt;br /&gt;Option double click! Wow!&lt;br /&gt;&lt;br /&gt;The receiver is always what is on the left hand side of the method call.&lt;br /&gt;&lt;br /&gt;Make sure you know which nib file you are working on and that it corresponds to the current Xcode project!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;だからこのように自分で設けて、モデルしながらプログラミングする。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115225446003438065?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115225446003438065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115225446003438065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115225446003438065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115225446003438065'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/cocoa-workshop-day-3.html' title='Cocoa Workshop Day 3'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-16893922.post-115216854230196118</id><published>2006-07-06T16:45:00.000+10:00</published><updated>2006-07-06T16:49:02.313+10:00</updated><title type='text'>Cocoa Workshop Day 2</title><content type='html'>Today we learnt about interface builder, actions, outlets, MCV. We had a go at creating a model object for managing Person objects from yesterday. We made a simple address book.&lt;br /&gt;&lt;br /&gt;I also finally used SVN. So now I feel more confident with repositories and such, and mwill endeavour to use it in my own projects.&lt;br /&gt;&lt;br /&gt;KTV notes&lt;br /&gt;Quicktime kit with the attributed lyrics, with multiple language support. &lt;br /&gt;It would require creating a custom view so that you can overlay the lyrics on the iSight video&lt;br /&gt;[]Download SVNX&lt;br /&gt;&lt;br /&gt;Actions are associated with methods, outlets with controls.&lt;br /&gt;&lt;br /&gt;In terms of UML, the outlets are the attributes, and the actions are connected to the methods. Think of a class diagram.&lt;br /&gt;&lt;br /&gt;Am becoming more confident with the debugger too which is great.&lt;br /&gt;Also about the organisation and structure of the class heirarchies and how to learn more about them in the documentation.&lt;br /&gt;&lt;br /&gt;Code completion! Wow!&lt;br /&gt;&lt;br /&gt;Core data is good for quickly prototyping something, but there are versioning issues that Apple haven't addressed. Should probably prototype using it, then implement using more traditional methods next.&lt;br /&gt;&lt;br /&gt;Access? Isn't that a curse word?&lt;br /&gt;&lt;br /&gt;I'll try to add a link to the&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/16893922-115216854230196118?l=matdev.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://matdev.blogspot.com/feeds/115216854230196118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=16893922&amp;postID=115216854230196118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115216854230196118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/16893922/posts/default/115216854230196118'/><link rel='alternate' type='text/html' href='http://matdev.blogspot.com/2006/07/cocoa-workshop-day-2.html' title='Cocoa Workshop Day 2'/><author><name>Mathieu</name><uri>http://www.blogger.com/profile/10988240674154998955</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://s3.amazonaws.com/twitter_production/profile_images/25699622/m_812504c805473ce1309f7b51254bc830_normal.jpg'/></author><thr:total>0</thr:total></entry></feed>
