{"exhaustive":{"nbHits":true,"typo":true},"exhaustiveNbHits":true,"exhaustiveTypo":true,"hits":[{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Klong for the Web"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/klong/"}},"_tags":["story","author_wooby","story_48962629"],"author":"wooby","created_at":"2026-07-18T21:31:37Z","created_at_i":1784410297,"num_comments":0,"objectID":"48962629","points":3,"story_id":48962629,"title":"Klong for the Web","updated_at":"2026-07-18T22:19:48Z","url":"https://tailrecursion.com/klong/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Klong for the Web"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/Klong.html"}},"_tags":["story","author_wooby","story_48929700"],"author":"wooby","created_at":"2026-07-16T02:26:26Z","created_at_i":1784168786,"num_comments":0,"objectID":"48929700","points":2,"story_id":48929700,"title":"Klong for the Web","updated_at":"2026-07-16T04:03:07Z","url":"https://tailrecursion.com/~alan/Klong.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Programmable Phones"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/ProgrammablePhones.html"}},"_tags":["story","author_wooby","story_48145037"],"author":"wooby","created_at":"2026-05-15T05:55:05Z","created_at_i":1778824505,"num_comments":0,"objectID":"48145037","points":3,"story_id":48145037,"title":"Programmable Phones","updated_at":"2026-05-15T06:28:11Z","url":"https://tailrecursion.com/~alan/ProgrammablePhones.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Thank you! I spent a lot of time eliminating launch-time work. Most state is precomputed or lazily initialized after first render. I wanted it to feel like a calculator, not an app."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"GridCalc: An RPN Spreadsheet for iOS"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/GridCalc.html"}},"_tags":["comment","author_wooby","story_47154127"],"author":"wooby","comment_text":"Thank you! I spent a lot of time eliminating launch-time work. Most state is precomputed or lazily initialized after first render. I wanted it to feel like a calculator, not an app.","created_at":"2026-02-25T17:18:40Z","created_at_i":1772039920,"objectID":"47154473","parent_id":47154336,"story_id":47154127,"story_title":"GridCalc: An RPN Spreadsheet for iOS","story_url":"https://tailrecursion.com/~alan/GridCalc.html","updated_at":"2026-03-05T23:37:14Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I built GridCalc because spreadsheets on phones feel fundamentally wrong.<p>On desktop, spreadsheets work because you can see formulas, references, and structure all at once. On mobile, that collapses. You\u2019re constantly panning, zooming, tapping small cells, and losing context.<p>RPN (Reverse Polish Notation) removes parentheses and operator precedence by using a stack. Instead of writing = (a + b) * c, you enter a b + c *. The order of operations is explicit and linear.<p>GridCalc combines those ideas: a visible RPN stack with a reference grid.<p>It\u2019s built for quick, ad-hoc modeling on a phone: loan calculations, position sizing, cash flow scenarios, engineering back-of-napkin math.<p>It\u2019s not trying to replace Excel. It\u2019s trying to make mobile calculation feel native instead of cramped.<p>Happy to answer questions about design decisions or implementation."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"GridCalc: An RPN Spreadsheet for iOS"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/GridCalc.html"}},"_tags":["comment","author_wooby","story_47154127"],"author":"wooby","children":[47154336],"comment_text":"I built GridCalc because spreadsheets on phones feel fundamentally wrong.<p>On desktop, spreadsheets work because you can see formulas, references, and structure all at once. On mobile, that collapses. You\u2019re constantly panning, zooming, tapping small cells, and losing context.<p>RPN (Reverse Polish Notation) removes parentheses and operator precedence by using a stack. Instead of writing = (a + b) * c, you enter a b + c *. The order of operations is explicit and linear.<p>GridCalc combines those ideas: a visible RPN stack with a reference grid.<p>It\u2019s built for quick, ad-hoc modeling on a phone: loan calculations, position sizing, cash flow scenarios, engineering back-of-napkin math.<p>It\u2019s not trying to replace Excel. It\u2019s trying to make mobile calculation feel native instead of cramped.<p>Happy to answer questions about design decisions or implementation.","created_at":"2026-02-25T16:58:42Z","created_at_i":1772038722,"objectID":"47154195","parent_id":47154127,"story_id":47154127,"story_title":"GridCalc: An RPN Spreadsheet for iOS","story_url":"https://tailrecursion.com/~alan/GridCalc.html","updated_at":"2026-03-05T23:37:14Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"GridCalc: An RPN Spreadsheet for iOS"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/GridCalc.html"}},"_tags":["story","author_wooby","story_47154127"],"author":"wooby","children":[47154195],"created_at":"2026-02-25T16:54:10Z","created_at_i":1772038450,"num_comments":3,"objectID":"47154127","points":4,"story_id":47154127,"title":"GridCalc: An RPN Spreadsheet for iOS","updated_at":"2026-03-05T23:37:14Z","url":"https://tailrecursion.com/~alan/GridCalc.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I built GridCalc because spreadsheets on phones feel fundamentally wrong.<p>On desktop, spreadsheets work because you can see formulas, references, and structure all at once. On mobile, that collapses. You\u2019re constantly panning, zooming, tapping small cells, and losing context.<p>RPN (Reverse Polish Notation) removes parentheses and operator precedence by using a stack. Instead of writing = (a + b) * c, you enter a b + c *. The order of operations is explicit and linear.<p>GridCalc combines those ideas: a visible RPN stack with a reference grid.<p>It\u2019s built for quick, ad-hoc modeling on a phone: loan calculations, position sizing, cash flow scenarios, engineering back-of-napkin math.<p>It\u2019s not trying to replace Excel. It\u2019s trying to make mobile calculation feel native instead of cramped.<p>Happy to answer questions about design decisions or implementation."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"GridCalc: An RPN Spreadsheet for iOS"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/GridCalc.html"}},"_tags":["comment","author_wooby","story_47141571"],"author":"wooby","comment_text":"I built GridCalc because spreadsheets on phones feel fundamentally wrong.<p>On desktop, spreadsheets work because you can see formulas, references, and structure all at once. On mobile, that collapses. You\u2019re constantly panning, zooming, tapping small cells, and losing context.<p>RPN (Reverse Polish Notation) removes parentheses and operator precedence by using a stack. Instead of writing = (a + b) * c, you enter a b + c *. The order of operations is explicit and linear.<p>GridCalc combines those ideas: a visible RPN stack with a reference grid.<p>It\u2019s built for quick, ad-hoc modeling on a phone: loan calculations, position sizing, cash flow scenarios, engineering back-of-napkin math.<p>It\u2019s not trying to replace Excel. It\u2019s trying to make mobile calculation feel native instead of cramped.<p>Happy to answer questions about design decisions or implementation.","created_at":"2026-02-24T19:48:39Z","created_at_i":1771962519,"objectID":"47141876","parent_id":47141571,"story_id":47141571,"story_title":"GridCalc: An RPN Spreadsheet for iOS","story_url":"https://tailrecursion.com/~alan/GridCalc.html","updated_at":"2026-03-05T23:36:34Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"GridCalc: An RPN Spreadsheet for iOS"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/GridCalc.html"}},"_tags":["story","author_wooby","story_47141571"],"author":"wooby","children":[47141876],"created_at":"2026-02-24T19:30:48Z","created_at_i":1771961448,"num_comments":1,"objectID":"47141571","points":1,"story_id":47141571,"title":"GridCalc: An RPN Spreadsheet for iOS","updated_at":"2026-03-05T23:36:33Z","url":"https://tailrecursion.com/~alan/GridCalc.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":"I built GridCalc, an RPN spreadsheet for iOS.<p>It combines the efficiency of Reverse Polish Notation with the visible structure and reactivity of a spreadsheet. You enter numbers and operators step by step, and you can retroactively change any value. All dependent calculations update immediately.<p>I love spreadsheets but I've never liked how cramped traditional spreadsheets feel on a phone. My goal was to make ad\u2011hoc, spreadsheet-like calculation on a phone feel direct and fluid.<p>Here\u2019s a short demo:\n<a href=\"https://youtu.be/M0HwzrGGuyc\" rel=\"nofollow\">https://youtu.be/M0HwzrGGuyc</a><p>App Store link:\n<a href=\"https://apps.apple.com/us/app/gridcalc/id6759011187\">https://apps.apple.com/us/app/gridcalc/id6759011187</a><p>Happy to answer questions."},"title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: GridCalc, an RPN Spreadsheet for iOS"}},"_tags":["story","author_wooby","story_47063311","show_hn"],"author":"wooby","created_at":"2026-02-18T17:07:43Z","created_at_i":1771434463,"num_comments":0,"objectID":"47063311","points":2,"story_id":47063311,"story_text":"I built GridCalc, an RPN spreadsheet for iOS.<p>It combines the efficiency of Reverse Polish Notation with the visible structure and reactivity of a spreadsheet. You enter numbers and operators step by step, and you can retroactively change any value. All dependent calculations update immediately.<p>I love spreadsheets but I've never liked how cramped traditional spreadsheets feel on a phone. My goal was to make ad\u2011hoc, spreadsheet-like calculation on a phone feel direct and fluid.<p>Here\u2019s a short demo:\n<a href=\"https://youtu.be/M0HwzrGGuyc\" rel=\"nofollow\">https://youtu.be/M0HwzrGGuyc</a><p>App Store link:\n<a href=\"https://apps.apple.com/us/app/gridcalc/id6759011187\">https://apps.apple.com/us/app/gridcalc/id6759011187</a><p>Happy to answer questions.","title":"Show HN: GridCalc, an RPN Spreadsheet for iOS","updated_at":"2026-03-05T23:35:13Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"ActorAgents"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/ActorAgents.html"}},"_tags":["story","author_wooby","story_46532079"],"author":"wooby","created_at":"2026-01-07T20:26:11Z","created_at_i":1767817571,"num_comments":0,"objectID":"46532079","points":1,"story_id":46532079,"title":"ActorAgents","updated_at":"2026-03-05T23:18:37Z","url":"https://tailrecursion.com/~alan/ActorAgents.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Destination Driven Compilation"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/Lisp/DestinationDrivenCompilation.html"}},"_tags":["story","author_wooby","story_46462473"],"author":"wooby","created_at":"2026-01-02T07:54:24Z","created_at_i":1767340464,"num_comments":0,"objectID":"46462473","points":2,"story_id":46462473,"title":"Destination Driven Compilation","updated_at":"2026-03-05T23:17:47Z","url":"https://tailrecursion.com/~alan/Lisp/DestinationDrivenCompilation.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The book looks awesome. However, I find some irony in the presence of a \u201cno AI\u201d badge on the back cover considering Lisp was AI research."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Lisp from Nothing, Second Edition"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://t3x.org/lfn/index.html"}},"_tags":["comment","author_wooby","story_45037419"],"author":"wooby","children":[45073121,45070496],"comment_text":"The book looks awesome. However, I find some irony in the presence of a \u201cno AI\u201d badge on the back cover considering Lisp was AI research.","created_at":"2025-08-29T22:23:24Z","created_at_i":1756506204,"objectID":"45070089","parent_id":45037419,"story_id":45037419,"story_title":"Lisp from Nothing, Second Edition","story_url":"http://t3x.org/lfn/index.html","updated_at":"2026-03-05T22:34:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":"This is an AI side project I've been having a lot of fun with. I start with an absurd premise, then generate "source documents" with ChatGPT. Then I feed those into NotebookLM and generate a podcast. The theme is from Suno. I use ffmpeg and sox to composite and edit audio. I'm actively looking for alternatives to NotebookLM for the audio synthesis, if anyone knows any."},"title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Operation Voidstar, AI-Generated Conspiracy Comedy"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://open.spotify.com/show/5T6VfCMkkntOE7R7L15Wk4"}},"_tags":["story","author_wooby","story_42769228","show_hn"],"author":"wooby","children":[42769240],"created_at":"2025-01-20T14:44:52Z","created_at_i":1737384292,"num_comments":0,"objectID":"42769228","points":1,"story_id":42769228,"story_text":"This is an AI side project I've been having a lot of fun with. I start with an absurd premise, then generate "source documents" with ChatGPT. Then I feed those into NotebookLM and generate a podcast. The theme is from Suno. I use ffmpeg and sox to composite and edit audio. I'm actively looking for alternatives to NotebookLM for the audio synthesis, if anyone knows any.","title":"Show HN: Operation Voidstar, AI-Generated Conspiracy Comedy","updated_at":"2025-01-20T14:49:06Z","url":"https://open.spotify.com/show/5T6VfCMkkntOE7R7L15Wk4"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"EForth and Zen"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.ultratechnology.com/efzen.htm"}},"_tags":["story","author_wooby","story_42640678"],"author":"wooby","created_at":"2025-01-09T01:41:55Z","created_at_i":1736386915,"num_comments":0,"objectID":"42640678","points":3,"story_id":42640678,"title":"EForth and Zen","updated_at":"2025-01-09T16:06:13Z","url":"https://www.ultratechnology.com/efzen.htm"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Laws of Computing, Version 2.0 by CH Ting [pdf]"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://wiki.forth-ev.de/lib/exe/fetch.php/projects:laws_of_computing_pages_10_v5.pdf"}},"_tags":["story","author_wooby","story_42635532"],"author":"wooby","children":[42635688],"created_at":"2025-01-08T16:00:32Z","created_at_i":1736352032,"num_comments":1,"objectID":"42635532","points":1,"story_id":42635532,"title":"Laws of Computing, Version 2.0 by CH Ting [pdf]","updated_at":"2025-01-08T16:19:46Z","url":"https://wiki.forth-ev.de/lib/exe/fetch.php/projects:laws_of_computing_pages_10_v5.pdf"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Bat Bomb"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Bat_bomb"}},"_tags":["story","author_wooby","story_34875932"],"author":"wooby","children":[34875963],"created_at":"2023-02-21T03:03:25Z","created_at_i":1676948605,"num_comments":0,"objectID":"34875932","points":2,"story_id":34875932,"title":"Bat Bomb","updated_at":"2024-12-19T07:25:28Z","url":"https://en.wikipedia.org/wiki/Bat_bomb"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Photoprism rocks. I wrote up my experience with it in 2021, and I'm still happily using it: <a href=\"https://tailrecursion.com/~alan/HomePhotos.html\" rel=\"nofollow\">https://tailrecursion.com/~alan/HomePhotos.html</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Photoprism \u2013 open-source Google Photos Alternative"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.photoprism.app/"}},"_tags":["comment","author_wooby","story_34716924"],"author":"wooby","comment_text":"Photoprism rocks. I wrote up my experience with it in 2021, and I'm still happily using it: <a href=\"https://tailrecursion.com/~alan/HomePhotos.html\" rel=\"nofollow\">https://tailrecursion.com/~alan/HomePhotos.html</a>","created_at":"2023-02-09T02:55:52Z","created_at_i":1675911352,"objectID":"34719203","parent_id":34716924,"story_id":34716924,"story_title":"Photoprism \u2013 open-source Google Photos Alternative","story_url":"https://www.photoprism.app/","updated_at":"2024-09-20T13:12:00Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"AbcDatalog"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://abcdatalog.seas.harvard.edu/"}},"_tags":["story","author_wooby","story_28076607"],"author":"wooby","created_at":"2021-08-05T17:13:56Z","created_at_i":1628183636,"num_comments":0,"objectID":"28076607","points":3,"story_id":28076607,"title":"AbcDatalog","updated_at":"2024-09-20T09:08:54Z","url":"https://abcdatalog.seas.harvard.edu/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"> Realize a successful 51% attack is just the beginning of the war, not the end of it.<p>I think you're right; the war will go on for awhile. But I'm convinced by <a href=\"https://news.ycombinator.com/item?id=28028542\" rel=\"nofollow\">https://news.ycombinator.com/item?id=28028542</a> that in the end, if anything bests fiat, it will be gold.<p>Barring some new technological breakthrough, it seems to me that bitcoin has no value in a fiat world, and no value proposition in a sound money world. It's a noble dead end."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The U.S. Government Can Nationalize the Bitcoin Network at Any Time"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://pastebin.com/7edhybHS"}},"_tags":["comment","author_wooby","story_28022363"],"author":"wooby","comment_text":"> Realize a successful 51% attack is just the beginning of the war, not the end of it.<p>I think you're right; the war will go on for awhile. But I'm convinced by <a href=\"https://news.ycombinator.com/item?id=28028542\" rel=\"nofollow\">https://news.ycombinator.com/item?id=28028542</a> that in the end, if anything bests fiat, it will be gold.<p>Barring some new technological breakthrough, it seems to me that bitcoin has no value in a fiat world, and no value proposition in a sound money world. It's a noble dead end.","created_at":"2021-08-02T20:42:55Z","created_at_i":1627936975,"objectID":"28042351","parent_id":28041728,"story_id":28022363,"story_title":"The U.S. Government Can Nationalize the Bitcoin Network at Any Time","story_url":"https://pastebin.com/7edhybHS","updated_at":"2024-09-20T09:05:12Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Turbo Pascal navigational aids that saved my life in 1991"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/timonoko/sextant/blob/master/README.md"}},"_tags":["story","author_wooby","story_27997154"],"author":"wooby","created_at":"2021-07-29T14:45:10Z","created_at_i":1627569910,"num_comments":0,"objectID":"27997154","points":2,"story_id":27997154,"title":"Turbo Pascal navigational aids that saved my life in 1991","updated_at":"2024-09-20T09:09:17Z","url":"https://github.com/timonoko/sextant/blob/master/README.md"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Home Photo Management with PhotoPrism"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/HomePhotos.html"}},"_tags":["story","author_wooby","story_27714460"],"author":"wooby","children":[27718428],"created_at":"2021-07-02T17:40:56Z","created_at_i":1625247656,"num_comments":1,"objectID":"27714460","points":8,"story_id":27714460,"title":"Home Photo Management with PhotoPrism","updated_at":"2024-09-20T08:51:27Z","url":"https://tailrecursion.com/~alan/HomePhotos.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Electricity"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.emacswiki.org/emacs/Electricity"}},"_tags":["story","author_wooby","story_27695889"],"author":"wooby","created_at":"2021-07-01T03:08:39Z","created_at_i":1625108919,"num_comments":0,"objectID":"27695889","points":3,"story_id":27695889,"title":"Electricity","updated_at":"2024-09-20T08:58:19Z","url":"https://www.emacswiki.org/emacs/Electricity"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"PhotoPrism, a privately hosted photos app"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://photoprism.app/"}},"_tags":["story","author_wooby","story_27595605"],"author":"wooby","created_at":"2021-06-22T18:53:07Z","created_at_i":1624387987,"num_comments":0,"objectID":"27595605","points":2,"story_id":27595605,"title":"PhotoPrism, a privately hosted photos app","updated_at":"2024-09-20T08:52:18Z","url":"https://photoprism.app/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Trillion-Dollar Coin"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Trillion-dollar_coin"}},"_tags":["story","author_wooby","story_26257735"],"author":"wooby","created_at":"2021-02-24T23:40:02Z","created_at_i":1614210002,"num_comments":0,"objectID":"26257735","points":1,"story_id":26257735,"title":"Trillion-Dollar Coin","updated_at":"2024-09-20T08:02:08Z","url":"https://en.wikipedia.org/wiki/Trillion-dollar_coin"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"The Irish of Barbados (2015)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://irishamerica.com/2015/10/the-irish-of-barbados-photos/"}},"_tags":["story","author_wooby","story_26257364"],"author":"wooby","created_at":"2021-02-24T23:02:00Z","created_at_i":1614207720,"num_comments":0,"objectID":"26257364","points":1,"story_id":26257364,"title":"The Irish of Barbados (2015)","updated_at":"2024-09-20T08:02:08Z","url":"https://irishamerica.com/2015/10/the-irish-of-barbados-photos/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Earth\u2013Moon\u2013Earth Communication"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Earth%E2%80%93Moon%E2%80%93Earth_communication"}},"_tags":["story","author_wooby","story_26092707"],"author":"wooby","created_at":"2021-02-10T18:09:40Z","created_at_i":1612980580,"num_comments":0,"objectID":"26092707","points":2,"story_id":26092707,"title":"Earth\u2013Moon\u2013Earth Communication","updated_at":"2024-09-20T07:57:20Z","url":"https://en.wikipedia.org/wiki/Earth%E2%80%93Moon%E2%80%93Earth_communication"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Debugging Lisp (2015)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://malisper.me/category/debugging-common-lisp/"}},"_tags":["story","author_wooby","story_25661701"],"author":"wooby","children":[25670264,25663082,25664647,25667329],"created_at":"2021-01-06T20:11:48Z","created_at_i":1609963908,"num_comments":32,"objectID":"25661701","points":117,"story_id":25661701,"title":"Debugging Lisp (2015)","updated_at":"2024-09-20T07:41:15Z","url":"https://malisper.me/category/debugging-common-lisp/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Argumentation Ethics"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Argumentation_ethics"}},"_tags":["story","author_wooby","story_25645223"],"author":"wooby","created_at":"2021-01-05T13:24:48Z","created_at_i":1609853088,"num_comments":0,"objectID":"25645223","points":1,"story_id":25645223,"title":"Argumentation Ethics","updated_at":"2024-09-20T07:39:36Z","url":"https://en.wikipedia.org/wiki/Argumentation_ethics"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Oberon"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://ignorethecode.net/blog/2009/04/22/oberon/"}},"_tags":["story","author_wooby","story_25641016"],"author":"wooby","created_at":"2021-01-05T01:44:47Z","created_at_i":1609811087,"num_comments":0,"objectID":"25641016","points":3,"story_id":25641016,"title":"Oberon","updated_at":"2024-09-20T07:39:13Z","url":"http://ignorethecode.net/blog/2009/04/22/oberon/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Indent with Tabs, Align with Spaces"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://dmitryfrank.com/articles/indent_with_tabs_align_with_spaces"}},"_tags":["story","author_wooby","story_25608608"],"author":"wooby","children":[25609296],"created_at":"2021-01-01T23:50:09Z","created_at_i":1609545009,"num_comments":1,"objectID":"25608608","points":1,"story_id":25608608,"title":"Indent with Tabs, Align with Spaces","updated_at":"2024-09-20T07:35:47Z","url":"https://dmitryfrank.com/articles/indent_with_tabs_align_with_spaces"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Bastiat's famous Candlestick makers' Petition"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://bastiat.org/en/petition.html"}},"_tags":["story","author_wooby","story_25435346"],"author":"wooby","created_at":"2020-12-15T21:14:37Z","created_at_i":1608066877,"num_comments":0,"objectID":"25435346","points":2,"story_id":25435346,"title":"Bastiat's famous Candlestick makers' Petition","updated_at":"2024-09-20T07:28:20Z","url":"http://bastiat.org/en/petition.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"The Machine Stops by E.M. Forster (1909)"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.visbox.com/prajlich/forster.html"}},"_tags":["story","author_wooby","story_25421738"],"author":"wooby","created_at":"2020-12-14T19:07:41Z","created_at_i":1607972861,"num_comments":0,"objectID":"25421738","points":1,"story_id":25421738,"title":"The Machine Stops by E.M. Forster (1909)","updated_at":"2024-09-20T07:26:49Z","url":"http://www.visbox.com/prajlich/forster.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Herbert Dow and Predatory Pricing"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://fee.org/articles/herbert-dow-and-predatory-pricing/"}},"_tags":["story","author_wooby","story_25387394"],"author":"wooby","created_at":"2020-12-11T16:17:40Z","created_at_i":1607703460,"num_comments":0,"objectID":"25387394","points":1,"story_id":25387394,"title":"Herbert Dow and Predatory Pricing","updated_at":"2024-09-20T07:32:55Z","url":"https://fee.org/articles/herbert-dow-and-predatory-pricing/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"The Invention of the Chilean Sea Bass"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://priceonomics.com/the-invention-of-the-chilean-sea-bass/"}},"_tags":["story","author_wooby","story_25328594"],"author":"wooby","created_at":"2020-12-07T01:47:45Z","created_at_i":1607305665,"num_comments":0,"objectID":"25328594","points":3,"story_id":25328594,"title":"The Invention of the Chilean Sea Bass","updated_at":"2024-09-20T07:26:42Z","url":"https://priceonomics.com/the-invention-of-the-chilean-sea-bass/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Zero One Infinity Rule"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Zero_one_infinity_rule"}},"_tags":["story","author_wooby","story_25250165"],"author":"wooby","created_at":"2020-11-30T02:26:23Z","created_at_i":1606703183,"num_comments":0,"objectID":"25250165","points":3,"story_id":25250165,"title":"Zero One Infinity Rule","updated_at":"2024-09-20T07:27:35Z","url":"https://en.wikipedia.org/wiki/Zero_one_infinity_rule"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"How Private Property Saved the Pilgrims"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.hoover.org/research/how-private-property-saved-pilgrims"}},"_tags":["story","author_wooby","story_25223021"],"author":"wooby","created_at":"2020-11-26T19:49:02Z","created_at_i":1606420142,"num_comments":0,"objectID":"25223021","points":2,"story_id":25223021,"title":"How Private Property Saved the Pilgrims","updated_at":"2024-09-20T07:25:10Z","url":"https://www.hoover.org/research/how-private-property-saved-pilgrims"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It's not a crazy thought at all. Many Americans see government in this light. Others do not:<p>"No one will really understand politics until they understand that politicians are not trying to solve our problems. They are trying to solve their own problems -- of which getting elected and re-elected are No. 1 and No. 2. Whatever is No. 3 is far behind".<p>Thomas Sowell"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Doctors and Nurses Are Running on Empty"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nytimes.com/2020/11/25/health/doctors-nurses-covid-stress.html"}},"_tags":["comment","author_wooby","story_25211212"],"author":"wooby","comment_text":"It's not a crazy thought at all. Many Americans see government in this light. Others do not:<p>"No one will really understand politics until they understand that politicians are not trying to solve our problems. They are trying to solve their own problems -- of which getting elected and re-elected are No. 1 and No. 2. Whatever is No. 3 is far behind".<p>Thomas Sowell","created_at":"2020-11-26T16:06:29Z","created_at_i":1606406789,"objectID":"25221146","parent_id":25218839,"story_id":25211212,"story_title":"Doctors and Nurses Are Running on Empty","story_url":"https://www.nytimes.com/2020/11/25/health/doctors-nurses-covid-stress.html","updated_at":"2024-09-20T07:24:58Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Moving fast and breaking people is, horrifically, the status quo. Special interests in healthcare, enabled by heavy regulation, go great lengths to insulate doctors from the consequences of providing poor care and the rewards of providing excellent care. We all suffer as a result.<p>Your experience with healthcare might be different, but my own experience in the US has been this: I rarely see doctors that have later contacted me to see how the treatment they prescribed was working. Nearly every other service or product I purchase entreats me with a satisfaction survey at some point. I've asked myself: why don't doctors care about my outcome?<p>I have concluded that while I am the one with the sick body and paying money to fix myself, I am not the only customer. The regulatory agencies, credentialing schools, special interest groups, pharmaceutical companies, and healthcare unions are too."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Doctors and Nurses Are Running on Empty"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nytimes.com/2020/11/25/health/doctors-nurses-covid-stress.html"}},"_tags":["comment","author_wooby","story_25211212"],"author":"wooby","comment_text":"Moving fast and breaking people is, horrifically, the status quo. Special interests in healthcare, enabled by heavy regulation, go great lengths to insulate doctors from the consequences of providing poor care and the rewards of providing excellent care. We all suffer as a result.<p>Your experience with healthcare might be different, but my own experience in the US has been this: I rarely see doctors that have later contacted me to see how the treatment they prescribed was working. Nearly every other service or product I purchase entreats me with a satisfaction survey at some point. I've asked myself: why don't doctors care about my outcome?<p>I have concluded that while I am the one with the sick body and paying money to fix myself, I am not the only customer. The regulatory agencies, credentialing schools, special interest groups, pharmaceutical companies, and healthcare unions are too.","created_at":"2020-11-25T20:12:23Z","created_at_i":1606335143,"objectID":"25213735","parent_id":25213165,"story_id":25211212,"story_title":"Doctors and Nurses Are Running on Empty","story_url":"https://www.nytimes.com/2020/11/25/health/doctors-nurses-covid-stress.html","updated_at":"2024-09-20T07:24:14Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Arguably, regulatory forces <i>created</i> the environment in which money could be used to so effectively manipulate doctors at the cost of patient outcomes. If doctors stood to lose business when they lost patients -- instead of fearing only for their license being revoked -- perhaps they'd be incentivized more to treat patients well than to engage in opioid schemes."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Doctors and Nurses Are Running on Empty"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nytimes.com/2020/11/25/health/doctors-nurses-covid-stress.html"}},"_tags":["comment","author_wooby","story_25211212"],"author":"wooby","children":[25218839],"comment_text":"Arguably, regulatory forces <i>created</i> the environment in which money could be used to so effectively manipulate doctors at the cost of patient outcomes. If doctors stood to lose business when they lost patients -- instead of fearing only for their license being revoked -- perhaps they'd be incentivized more to treat patients well than to engage in opioid schemes.","created_at":"2020-11-25T19:17:39Z","created_at_i":1606331859,"objectID":"25213086","parent_id":25212424,"story_id":25211212,"story_title":"Doctors and Nurses Are Running on Empty","story_url":"https://www.nytimes.com/2020/11/25/health/doctors-nurses-covid-stress.html","updated_at":"2024-09-20T07:24:14Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If you have good Yelp reviews or if I could speak with happy patients I would consider taking you up on it. Seriously.<p>I've received enough terrible medical and dental care from various "trained" and "registered" practitioners to value referrals much more than any credential or certification.<p>If you yourself truly believe that a professional registration is satisfactory, then I trust you practice what you preach by never researching doctor reviews. To do so would invalidate your argument."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Doctors and Nurses Are Running on Empty"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nytimes.com/2020/11/25/health/doctors-nurses-covid-stress.html"}},"_tags":["comment","author_wooby","story_25211212"],"author":"wooby","children":[25213165],"comment_text":"If you have good Yelp reviews or if I could speak with happy patients I would consider taking you up on it. Seriously.<p>I've received enough terrible medical and dental care from various "trained" and "registered" practitioners to value referrals much more than any credential or certification.<p>If you yourself truly believe that a professional registration is satisfactory, then I trust you practice what you preach by never researching doctor reviews. To do so would invalidate your argument.","created_at":"2020-11-25T18:55:39Z","created_at_i":1606330539,"objectID":"25212854","parent_id":25212526,"story_id":25211212,"story_title":"Doctors and Nurses Are Running on Empty","story_url":"https://www.nytimes.com/2020/11/25/health/doctors-nurses-covid-stress.html","updated_at":"2024-09-20T07:24:08Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"The Origin of the Name Posix"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://stallman.org/articles/posix.html"}},"_tags":["story","author_wooby","story_25205384"],"author":"wooby","created_at":"2020-11-25T02:33:16Z","created_at_i":1606271596,"num_comments":0,"objectID":"25205384","points":3,"story_id":25205384,"title":"The Origin of the Name Posix","updated_at":"2024-09-20T07:23:28Z","url":"https://stallman.org/articles/posix.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Common Lisp Iteration"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/Lisp/CommonLispIteration.html"}},"_tags":["story","author_wooby","story_25198573"],"author":"wooby","created_at":"2020-11-24T14:14:50Z","created_at_i":1606227290,"num_comments":0,"objectID":"25198573","points":3,"story_id":25198573,"title":"Common Lisp Iteration","updated_at":"2024-09-20T07:22:47Z","url":"https://tailrecursion.com/~alan/Lisp/CommonLispIteration.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Government Cheese"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Government_cheese"}},"_tags":["story","author_wooby","story_25183784"],"author":"wooby","children":[25184362],"created_at":"2020-11-23T05:11:15Z","created_at_i":1606108275,"num_comments":1,"objectID":"25183784","points":4,"story_id":25183784,"title":"Government Cheese","updated_at":"2024-09-20T07:21:33Z","url":"https://en.wikipedia.org/wiki/Government_cheese"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Computer Science Explains Why Communism Can't Work"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://mindmatters.ai/2020/11/computer-science-explains-why-communism-cant-work/"}},"_tags":["story","author_wooby","story_25132998"],"author":"wooby","created_at":"2020-11-18T03:49:41Z","created_at_i":1605671381,"num_comments":0,"objectID":"25132998","points":7,"story_id":25132998,"title":"Computer Science Explains Why Communism Can't Work","updated_at":"2024-09-20T07:17:03Z","url":"https://mindmatters.ai/2020/11/computer-science-explains-why-communism-cant-work/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"History of Gherkin, a Lisp Interpreter in Bash"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/Lisp/GherkinHistory.html"}},"_tags":["story","author_wooby","story_25084177"],"author":"wooby","created_at":"2020-11-13T16:50:48Z","created_at_i":1605286248,"num_comments":0,"objectID":"25084177","points":1,"story_id":25084177,"title":"History of Gherkin, a Lisp Interpreter in Bash","updated_at":"2024-09-20T07:22:14Z","url":"https://tailrecursion.com/~alan/Lisp/GherkinHistory.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"FairDivision"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/~alan/FairDivision.html"}},"_tags":["story","author_wooby","story_25073516"],"author":"wooby","created_at":"2020-11-12T19:04:02Z","created_at_i":1605207842,"num_comments":0,"objectID":"25073516","points":2,"story_id":25073516,"title":"FairDivision","updated_at":"2024-09-20T07:21:06Z","url":"https://tailrecursion.com/~alan/FairDivision.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"See also: <a href=\"https://github.com/micha/json-table\" rel=\"nofollow\">https://github.com/micha/json-table</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Gron \u2013 Make JSON Greppable"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/tomnomnom/gron"}},"_tags":["comment","author_wooby","story_25006277"],"author":"wooby","comment_text":"See also: <a href=\"https://github.com/micha/json-table\" rel=\"nofollow\">https://github.com/micha/json-table</a>","created_at":"2020-11-06T14:58:51Z","created_at_i":1604674731,"objectID":"25008007","parent_id":25006277,"story_id":25006277,"story_title":"Gron \u2013 Make JSON Greppable","story_url":"https://github.com/tomnomnom/gron","updated_at":"2024-09-20T07:14:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"GTK+ with Broadway"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://developer.gnome.org/gtk3/stable/gtk-broadway.html"}},"_tags":["story","author_wooby","story_24992226"],"author":"wooby","created_at":"2020-11-04T19:29:21Z","created_at_i":1604518161,"num_comments":0,"objectID":"24992226","points":1,"story_id":24992226,"title":"GTK+ with Broadway","updated_at":"2024-09-20T07:21:38Z","url":"https://developer.gnome.org/gtk3/stable/gtk-broadway.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Last Diminisher"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Last_diminisher"}},"_tags":["story","author_wooby","story_24830329"],"author":"wooby","created_at":"2020-10-19T20:02:41Z","created_at_i":1603137761,"num_comments":0,"objectID":"24830329","points":1,"story_id":24830329,"title":"Last Diminisher","updated_at":"2024-09-20T07:06:52Z","url":"https://en.wikipedia.org/wiki/Last_diminisher"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Your concept of a de-fanged FDA reminds me of the NTSB and is interesting to think about."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","comment_text":"Your concept of a de-fanged FDA reminds me of the NTSB and is interesting to think about.","created_at":"2020-08-19T23:10:31Z","created_at_i":1597878631,"objectID":"24217931","parent_id":24213445,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:44:27Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I don't see how you can contest that they're both products and that they can both kill people if they're defective. To me these two similarities are plainly true, and it is only these two similarities that are material to my argument.<p>I might misunderstand, but the direction your argument seems to be heading is that the free market is somehow incompatible with products that have complex failure modes or that can be defective in subtle ways, and that the FDA is thus necessary. Is that right?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","comment_text":"I don't see how you can contest that they're both products and that they can both kill people if they're defective. To me these two similarities are plainly true, and it is only these two similarities that are material to my argument.<p>I might misunderstand, but the direction your argument seems to be heading is that the free market is somehow incompatible with products that have complex failure modes or that can be defective in subtle ways, and that the FDA is thus necessary. Is that right?","created_at":"2020-08-19T21:48:37Z","created_at_i":1597873717,"objectID":"24217082","parent_id":24215776,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:44:27Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"You're right, that last paragraph is a flawed argument. I retract it, and your findings compel me to assert that I think there was probably never a good reason for the FDA.<p>But it's the second, and weaker, of the two arguments I made. The argument I develop in my first three paragraphs stands."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","comment_text":"You're right, that last paragraph is a flawed argument. I retract it, and your findings compel me to assert that I think there was probably never a good reason for the FDA.<p>But it's the second, and weaker, of the two arguments I made. The argument I develop in my first three paragraphs stands.","created_at":"2020-08-19T20:31:32Z","created_at_i":1597869092,"objectID":"24215986","parent_id":24215702,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:44:15Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"What upsets you about other people using their own money to buy placebos, other than the fact that you can't understand why? At this very moment, millions of people across the globe are buying things for themselves you would never buy for yourself.<p>Has it occurred to you that the health supplement buyer is in a much better position to decide how to allocate their money than you are? You have limited, aggregate information; they have a total view of their own finances and life situation, and are willing to devote their own time to research their personal decision to buy. For example, they might discover through research that a supplement generally regarded as a placebo has a benefit under circumstances known only to the them.<p>When you limit the choices of others, based only on general information or your personal perspective, you limit the set of choices others may take. If you do this long enough, you might find yourself some day prohibited from buying something you desperately need, because your situation is an exception to some general rule that nobody ever considered.<p>The FDA might have made sense at a time when most people were illiterate and information was hard to come by. Now that most (at least in the US) are literate, and own smartphones, taking away choices for the benefit of some hypothetical illiterate serves only to worsen the life of the average person."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","children":[24215702],"comment_text":"What upsets you about other people using their own money to buy placebos, other than the fact that you can't understand why? At this very moment, millions of people across the globe are buying things for themselves you would never buy for yourself.<p>Has it occurred to you that the health supplement buyer is in a much better position to decide how to allocate their money than you are? You have limited, aggregate information; they have a total view of their own finances and life situation, and are willing to devote their own time to research their personal decision to buy. For example, they might discover through research that a supplement generally regarded as a placebo has a benefit under circumstances known only to the them.<p>When you limit the choices of others, based only on general information or your personal perspective, you limit the set of choices others may take. If you do this long enough, you might find yourself some day prohibited from buying something you desperately need, because your situation is an exception to some general rule that nobody ever considered.<p>The FDA might have made sense at a time when most people were illiterate and information was hard to come by. Now that most (at least in the US) are literate, and own smartphones, taking away choices for the benefit of some hypothetical illiterate serves only to worsen the life of the average person.","created_at":"2020-08-19T19:26:53Z","created_at_i":1597865213,"objectID":"24215041","parent_id":24214538,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:44:15Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It is my understanding that malnutrition, clean water, and access to education/information are foremost among the problems of the developing world, and it's not at all clear to me that regulating medication in those countries would improve anyone's situation measurably.<p>For my part, here in the "developed" world, I have a family member with a rare autoimmune condition, and access to comparatively few medications. Those that are available are very expensive and not covered by any insurance. There is little competition between their manufacturers.<p>Because it costs at least 1.4B to bring a drug to market, and because of the rarity of her illness, it's unlikely any company will pursue new research. Thanks to the FDA's inordinately expensive approval process, no company is incentivized to bring a drug to market with an upside of <= 1.4B, regardless of how many people it could help."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","comment_text":"It is my understanding that malnutrition, clean water, and access to education/information are foremost among the problems of the developing world, and it's not at all clear to me that regulating medication in those countries would improve anyone's situation measurably.<p>For my part, here in the "developed" world, I have a family member with a rare autoimmune condition, and access to comparatively few medications. Those that are available are very expensive and not covered by any insurance. There is little competition between their manufacturers.<p>Because it costs at least 1.4B to bring a drug to market, and because of the rarity of her illness, it's unlikely any company will pursue new research. Thanks to the FDA's inordinately expensive approval process, no company is incentivized to bring a drug to market with an upside of <= 1.4B, regardless of how many people it could help.","created_at":"2020-08-19T18:08:14Z","created_at_i":1597860494,"objectID":"24213781","parent_id":24212027,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:44:02Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I mean only to say that they are both products, and that they may both result in injury or death if they are produced irresponsibly.<p>Would you not agree with those two points of comparison?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","children":[24215776],"comment_text":"I mean only to say that they are both products, and that they may both result in injury or death if they are produced irresponsibly.<p>Would you not agree with those two points of comparison?","created_at":"2020-08-19T17:45:39Z","created_at_i":1597859139,"objectID":"24213432","parent_id":24213200,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:44:02Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I can think of a few systems in place that mitigate cases like the one you mention.<p>First, I can think of very few things that could happen to someone's car that would disadvantage you without disadvantaging them. In the case you mention, the missing tire would render the jalopy inoperable, and so the buyer suffers for their poor choice of vehicle. Any buyer thus factors reliability and safety into their decision, whether or not they are particularly concerned about the safety of others. Plus, now they have to walk, and you probably won't be giving them a ride. A counter-argument to this would be effect on climate, an externality that's maybe best left out for now :-)<p>Second, individuals may sue other individuals for personal or property damage. So, at least one factor preventing everyone from terrorizing you with their jalopies is that they are liable for damage their jalopy causes to others. The decision to purchase a jalopy includes this risk, disincentivizing the purchase of dangerous (to others) vehicles.<p>Third, it's already a requirement in most jurisdictions that drivers are insured because of the above liability, and insurance companies could easily deny coverage to unsafe vehicles, as determined by any (private) mutually agreed 3rd NHTSA/DOT-like party.<p>Finally, because there is no competition in the area of safety certification, it seems highly unlikely that the government's assessments of risk correspond to the risk assessed by the average consumer. The fact that most people choose to drive used vehicles that don't meet the government's latest safety standards feels like implicit proof of this."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","children":[24215755],"comment_text":"I can think of a few systems in place that mitigate cases like the one you mention.<p>First, I can think of very few things that could happen to someone's car that would disadvantage you without disadvantaging them. In the case you mention, the missing tire would render the jalopy inoperable, and so the buyer suffers for their poor choice of vehicle. Any buyer thus factors reliability and safety into their decision, whether or not they are particularly concerned about the safety of others. Plus, now they have to walk, and you probably won't be giving them a ride. A counter-argument to this would be effect on climate, an externality that's maybe best left out for now :-)<p>Second, individuals may sue other individuals for personal or property damage. So, at least one factor preventing everyone from terrorizing you with their jalopies is that they are liable for damage their jalopy causes to others. The decision to purchase a jalopy includes this risk, disincentivizing the purchase of dangerous (to others) vehicles.<p>Third, it's already a requirement in most jurisdictions that drivers are insured because of the above liability, and insurance companies could easily deny coverage to unsafe vehicles, as determined by any (private) mutually agreed 3rd NHTSA/DOT-like party.<p>Finally, because there is no competition in the area of safety certification, it seems highly unlikely that the government's assessments of risk correspond to the risk assessed by the average consumer. The fact that most people choose to drive used vehicles that don't meet the government's latest safety standards feels like implicit proof of this.","created_at":"2020-08-19T17:42:34Z","created_at_i":1597858954,"objectID":"24213376","parent_id":24212253,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:44:02Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If you have any choice in how you are treated, you will make your best judgement based on information available to you, such as by the recommendation of a friend, or a Yelp review. This is the same process you use to make any important purchase.<p>Before you have work done on your car, do you fly to China to inspect the part factory? You don't, because the relatively low risk you perceive that these parts will fail doesn't justify the expense of travel.<p>Do you perceive low risk because a government agency put a stamp of approval on the part? Probably not. Most likely, your risk assessment is based on information you've gathered about the final product, the auto shop -- that it is well-reviewed, and that your mechanic seems knowledgeable.<p>Furthermore, <i>only you</i> really know your exact needs. An expensive high-performance car part might provide you some marginal benefit, but not so much benefit that you're willing to buy that part at the expense of something else that's important to you, like your electric bill. A race car or Uber driver might make a different decision and choose a different part to suit their needs.<p>Medicine is like car parts. Bad ones can kill. But through the free market, a system of feedback is established that tends toward a wider variety, and higher quality, of parts overall.<p>When politicians prioritize some drugs over others, they interfere with this system, and money is spent on drugs and research that people don't necessarily want or need. You can imagine race car drivers getting together and lobbying politicians to subsidize high performance parts. Because these subsidies are funded by taxes, money is effectively taken from individuals who might prefer a different part. Now, those individuals who are not race car drivers have less purchasing power, and fewer choices overall.<p>You're correct that this is more or less the libertarian perspective, but I find it in no way extreme. I find it principled, direct, and humane. In our society, where nearly everyone has a smart phone and may conduct research at any time, I can't imagine a more effective system. I'm sure it was much easier to criticize the free market in a time when people couldn't read, or didn't have a global information database accessible on their person at every waking moment."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","children":[24214538,24213200],"comment_text":"If you have any choice in how you are treated, you will make your best judgement based on information available to you, such as by the recommendation of a friend, or a Yelp review. This is the same process you use to make any important purchase.<p>Before you have work done on your car, do you fly to China to inspect the part factory? You don't, because the relatively low risk you perceive that these parts will fail doesn't justify the expense of travel.<p>Do you perceive low risk because a government agency put a stamp of approval on the part? Probably not. Most likely, your risk assessment is based on information you've gathered about the final product, the auto shop -- that it is well-reviewed, and that your mechanic seems knowledgeable.<p>Furthermore, <i>only you</i> really know your exact needs. An expensive high-performance car part might provide you some marginal benefit, but not so much benefit that you're willing to buy that part at the expense of something else that's important to you, like your electric bill. A race car or Uber driver might make a different decision and choose a different part to suit their needs.<p>Medicine is like car parts. Bad ones can kill. But through the free market, a system of feedback is established that tends toward a wider variety, and higher quality, of parts overall.<p>When politicians prioritize some drugs over others, they interfere with this system, and money is spent on drugs and research that people don't necessarily want or need. You can imagine race car drivers getting together and lobbying politicians to subsidize high performance parts. Because these subsidies are funded by taxes, money is effectively taken from individuals who might prefer a different part. Now, those individuals who are not race car drivers have less purchasing power, and fewer choices overall.<p>You're correct that this is more or less the libertarian perspective, but I find it in no way extreme. I find it principled, direct, and humane. In our society, where nearly everyone has a smart phone and may conduct research at any time, I can't imagine a more effective system. I'm sure it was much easier to criticize the free market in a time when people couldn't read, or didn't have a global information database accessible on their person at every waking moment.","created_at":"2020-08-19T17:11:27Z","created_at_i":1597857087,"objectID":"24212860","parent_id":24212157,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:43:56Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Like the FDA, and as monopolies, NHTSA and DOT have much less stake in the safety of a consumer than do either car producers and drivers.<p>Personally, I trust myself not to buy a car that I've heard explodes. You may not, and I respect that. But I see no reason to pay for a service that assures you when I myself require no such assurance.<p>If NHTSA and DOT operated like UL, products that were less safe probably wouldn't have NHTSA or DOT seals, and those products would be much cheaper. People willing to trade safety for cost would be able to own a car. People willing to pay for safety would pay more. Because of the lower barrier to production, there would be probably much greater choice in car buying, and cars would be universally cheaper. In either case, the choice would rest with individual consumers, who know best their situation and risk tolerance."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","children":[24212253],"comment_text":"Like the FDA, and as monopolies, NHTSA and DOT have much less stake in the safety of a consumer than do either car producers and drivers.<p>Personally, I trust myself not to buy a car that I've heard explodes. You may not, and I respect that. But I see no reason to pay for a service that assures you when I myself require no such assurance.<p>If NHTSA and DOT operated like UL, products that were less safe probably wouldn't have NHTSA or DOT seals, and those products would be much cheaper. People willing to trade safety for cost would be able to own a car. People willing to pay for safety would pay more. Because of the lower barrier to production, there would be probably much greater choice in car buying, and cars would be universally cheaper. In either case, the choice would rest with individual consumers, who know best their situation and risk tolerance.","created_at":"2020-08-19T16:20:38Z","created_at_i":1597854038,"objectID":"24212155","parent_id":24211854,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:43:56Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Pharmaceutical companies have every incentive to make their drugs safe, because if their drugs hurt people, the drugs will not sell.<p>Many drugs have passed FDA approval but later killed people. If the FDA were a private company, it might have gone out of business. But as a government monopoly, it's very hard to stop paying for. Between pharma companies, the government, and individual patients, the FDA has the least stake in the health of a particular patient.<p>UL is an example of a non-government organization that offers product safety certification. You see the UL seal on most consumer electric appliances. Imagine an FDA seal.<p>Drugs are not magical or special. They are a product like any other, and it is the consumer's right to choose a doctor, and for that doctor to choose proper medication. We regularly choose the best mechanics, plumbers, and other specialists we can find, and their reputation is partly a function of the type and quality of the parts and tools they use."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","children":[24212027,24212220],"comment_text":"Pharmaceutical companies have every incentive to make their drugs safe, because if their drugs hurt people, the drugs will not sell.<p>Many drugs have passed FDA approval but later killed people. If the FDA were a private company, it might have gone out of business. But as a government monopoly, it's very hard to stop paying for. Between pharma companies, the government, and individual patients, the FDA has the least stake in the health of a particular patient.<p>UL is an example of a non-government organization that offers product safety certification. You see the UL seal on most consumer electric appliances. Imagine an FDA seal.<p>Drugs are not magical or special. They are a product like any other, and it is the consumer's right to choose a doctor, and for that doctor to choose proper medication. We regularly choose the best mechanics, plumbers, and other specialists we can find, and their reputation is partly a function of the type and quality of the parts and tools they use.","created_at":"2020-08-19T15:31:13Z","created_at_i":1597851073,"objectID":"24211437","parent_id":24210997,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:43:49Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":""Antibiotics present an enduring economic puzzle. These drugs changed the world. Yet despite their unique power, the free market doesn\u2019t value them."<p>No. The free market -- people -- values these drugs. If there wasn't demand, this article wouldn't have been written. The problem is that drugs are too expensive to bring to market for their developers to profit, and that the single greatest cost is often FDA approval.<p>The article implies that the solution is to funnel more BARDA grants to companies in order to make drug development profitable. This amounts to using taxpayer money to help private companies pay government fees, with lots of bureaucratic overhead (employees, forms, computer systems, buildings) at each end of the transaction. This is dramatically suboptimal.<p>Instead of this, the FDA process should be cheaper, or the FDA itself should be privatized, and operate as an entity like Consumer Reports or any other review organization. Government need only be involved with prosecuting fake producers. The consumer requires only access to information, and assurances that a substance they bought is the same they have researched.<p>Paying government expenses with taxes is an unsustainable Ponzi scheme, and takes us further away from a real solution."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.nature.com/articles/d41586-020-02418-x"}},"_tags":["comment","author_wooby","story_24209948"],"author":"wooby","children":[24210997,24211317,24212157],"comment_text":""Antibiotics present an enduring economic puzzle. These drugs changed the world. Yet despite their unique power, the free market doesn\u2019t value them."<p>No. The free market -- people -- values these drugs. If there wasn't demand, this article wouldn't have been written. The problem is that drugs are too expensive to bring to market for their developers to profit, and that the single greatest cost is often FDA approval.<p>The article implies that the solution is to funnel more BARDA grants to companies in order to make drug development profitable. This amounts to using taxpayer money to help private companies pay government fees, with lots of bureaucratic overhead (employees, forms, computer systems, buildings) at each end of the transaction. This is dramatically suboptimal.<p>Instead of this, the FDA process should be cheaper, or the FDA itself should be privatized, and operate as an entity like Consumer Reports or any other review organization. Government need only be involved with prosecuting fake producers. The consumer requires only access to information, and assurances that a substance they bought is the same they have researched.<p>Paying government expenses with taxes is an unsustainable Ponzi scheme, and takes us further away from a real solution.","created_at":"2020-08-19T14:40:11Z","created_at_i":1597848011,"objectID":"24210828","parent_id":24209948,"story_id":24209948,"story_title":"The antibiotic paradox: why companies can\u2019t afford to create life-saving drugs","story_url":"https://www.nature.com/articles/d41586-020-02418-x","updated_at":"2024-09-20T06:43:42Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Secretary Problem"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Secretary_problem"}},"_tags":["story","author_wooby","story_24071263"],"author":"wooby","created_at":"2020-08-06T14:36:29Z","created_at_i":1596724589,"num_comments":0,"objectID":"24071263","points":2,"story_id":24071263,"title":"Secretary Problem","updated_at":"2024-09-20T06:46:50Z","url":"https://en.wikipedia.org/wiki/Secretary_problem"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Closos Specification of a Lisp operating system [pdf]"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://metamodular.com/lispos.pdf"}},"_tags":["story","author_wooby","story_23272987"],"author":"wooby","created_at":"2020-05-22T15:15:05Z","created_at_i":1590160505,"num_comments":0,"objectID":"23272987","points":1,"story_id":23272987,"title":"Closos Specification of a Lisp operating system [pdf]","updated_at":"2024-09-20T06:16:42Z","url":"http://metamodular.com/lispos.pdf"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I believe the answer to your question of why developers don't generally treat quality the way dentists do is one of economics.<p>The world needs enough software, and the world's requirements for quality are low enough, and the average developer writes reliable-enough code, that in most cases money can be made without special attention to quality.<p>In some domains, quality is paramount. I imagine that quality and bug mitigation are the primary concerns of someone who manages, say, an X-ray machine firmware project, or avionics software. Software for these purposes that is not extremely reliable cannot compete in that market. For other kinds of software people are paid to write -- like social networks for pets -- reliability is a much lower priority.<p>Certain kinds of software needs to be rewritten constantly to meet the demands of highly-evolving markets. Games are an example of this. Reliability is important, but not paramount, because the underlying business can only continue to compete by at some point stopping work on the reliability of existing games, and moving on to developing new games.<p>I'm sympathetic to the respect you have for the value of high quality software. But the reality is, the value of quality varies dramatically within the software industry -- much more than it does within, say, dentistry, or medicine, or aviation.<p>Fewer bugs isn't necessarily the primary concern of those using and buying any particular kind of software."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"I\u2019ve made a conscious effort to stop apologizing for bugs in my code"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://blog.danslimmon.com/2019/08/02/stop-apologizing-for-bugs"}},"_tags":["comment","author_wooby","story_22961296"],"author":"wooby","comment_text":"I believe the answer to your question of why developers don't generally treat quality the way dentists do is one of economics.<p>The world needs enough software, and the world's requirements for quality are low enough, and the average developer writes reliable-enough code, that in most cases money can be made without special attention to quality.<p>In some domains, quality is paramount. I imagine that quality and bug mitigation are the primary concerns of someone who manages, say, an X-ray machine firmware project, or avionics software. Software for these purposes that is not extremely reliable cannot compete in that market. For other kinds of software people are paid to write -- like social networks for pets -- reliability is a much lower priority.<p>Certain kinds of software needs to be rewritten constantly to meet the demands of highly-evolving markets. Games are an example of this. Reliability is important, but not paramount, because the underlying business can only continue to compete by at some point stopping work on the reliability of existing games, and moving on to developing new games.<p>I'm sympathetic to the respect you have for the value of high quality software. But the reality is, the value of quality varies dramatically within the software industry -- much more than it does within, say, dentistry, or medicine, or aviation.<p>Fewer bugs isn't necessarily the primary concern of those using and buying any particular kind of software.","created_at":"2020-04-24T15:07:47Z","created_at_i":1587740867,"objectID":"22968756","parent_id":22968290,"story_id":22961296,"story_title":"I\u2019ve made a conscious effort to stop apologizing for bugs in my code","story_url":"https://blog.danslimmon.com/2019/08/02/stop-apologizing-for-bugs","updated_at":"2024-09-20T06:05:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Yes. My plan is for the image dumping facility to support tree-shaking and direct linking. I think tree-shaking by itself might produce reasonably-sized images, for my purposes at least. If not, the direct-linking would make Babel/Google Closure applicable."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"JACL: JavaScript Assisted Common Lisp"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/JACL/"}},"_tags":["comment","author_wooby","story_22907138"],"author":"wooby","children":[22952988],"comment_text":"Yes. My plan is for the image dumping facility to support tree-shaking and direct linking. I think tree-shaking by itself might produce reasonably-sized images, for my purposes at least. If not, the direct-linking would make Babel/Google Closure applicable.","created_at":"2020-04-22T16:13:22Z","created_at_i":1587572002,"objectID":"22947134","parent_id":22921171,"story_id":22907138,"story_title":"JACL: JavaScript Assisted Common Lisp","story_url":"https://tailrecursion.com/JACL/","updated_at":"2024-09-20T06:03:15Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Thanks for your interest and the pointer to Amber. I'll check it out. With JACL I hope to find a good balance of internal vs. external development tools, without necessarily ruling out either by design."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"JACL: JavaScript Assisted Common Lisp"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/JACL/"}},"_tags":["comment","author_wooby","story_22907138"],"author":"wooby","comment_text":"Thanks for your interest and the pointer to Amber. I'll check it out. With JACL I hope to find a good balance of internal vs. external development tools, without necessarily ruling out either by design.","created_at":"2020-04-19T20:57:52Z","created_at_i":1587329872,"objectID":"22918727","parent_id":22916063,"story_id":22907138,"story_title":"JACL: JavaScript Assisted Common Lisp","story_url":"https://tailrecursion.com/JACL/","updated_at":"2024-09-20T06:00:03Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The JACL reader is asynchronous, and so JACL can read characters from external sources (in-browser REPL, DevTools connection, websocket, experimental File API) without blocking the event loop and without relying on an external tool. JACL app artifacts will be created by dumping the Lisp image using a Lisp function.<p>Other than these technical differences, there seems to be a difference in "philosophy of use". I have the sense that the ClojureScript project does not emphasize or particularly support the idea of using self-hosted ClojureScript to build web apps."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"JACL: JavaScript Assisted Common Lisp"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/JACL/"}},"_tags":["comment","author_wooby","story_22907138"],"author":"wooby","children":[22921171],"comment_text":"The JACL reader is asynchronous, and so JACL can read characters from external sources (in-browser REPL, DevTools connection, websocket, experimental File API) without blocking the event loop and without relying on an external tool. JACL app artifacts will be created by dumping the Lisp image using a Lisp function.<p>Other than these technical differences, there seems to be a difference in "philosophy of use". I have the sense that the ClojureScript project does not emphasize or particularly support the idea of using self-hosted ClojureScript to build web apps.","created_at":"2020-04-19T16:03:21Z","created_at_i":1587312201,"objectID":"22916723","parent_id":22914397,"story_id":22907138,"story_title":"JACL: JavaScript Assisted Common Lisp","story_url":"https://tailrecursion.com/JACL/","updated_at":"2024-09-20T05:59:51Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Hi, thanks for your interest. The main thing I'm after is a "residential" [1] Lisp development system, where applications and tools co-evolve in the same environment.<p>Most contemporary compile-to-JS languages <i>target</i> the browser, but do not <i>inhabit</i> it. I'm excited about a system that encourages apps and tools to evolve organically together, instead of tools developing separately from applications, which is the status quo.<p>Other than that, Common Lisp has some really interesting capabilities relative to ClojureScript, and is also fun!<p>1:<a href=\"http://bitsavers.org/pdf/xerox/interlisp/Interlisp_Reference_Manual_Oct_1983.pdf\" rel=\"nofollow\">http://bitsavers.org/pdf/xerox/interlisp/Interlisp_Reference...</a> section 1.2"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"JACL: JavaScript Assisted Common Lisp"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/JACL/"}},"_tags":["comment","author_wooby","story_22907138"],"author":"wooby","children":[22914397,22916063],"comment_text":"Hi, thanks for your interest. The main thing I'm after is a "residential" [1] Lisp development system, where applications and tools co-evolve in the same environment.<p>Most contemporary compile-to-JS languages <i>target</i> the browser, but do not <i>inhabit</i> it. I'm excited about a system that encourages apps and tools to evolve organically together, instead of tools developing separately from applications, which is the status quo.<p>Other than that, Common Lisp has some really interesting capabilities relative to ClojureScript, and is also fun!<p>1:<a href=\"http://bitsavers.org/pdf/xerox/interlisp/Interlisp_Reference_Manual_Oct_1983.pdf\" rel=\"nofollow\">http://bitsavers.org/pdf/xerox/interlisp/Interlisp_Reference...</a> section 1.2","created_at":"2020-04-19T04:33:22Z","created_at_i":1587270802,"objectID":"22913534","parent_id":22912853,"story_id":22907138,"story_title":"JACL: JavaScript Assisted Common Lisp","story_url":"https://tailrecursion.com/JACL/","updated_at":"2024-09-20T05:59:32Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":""C is JQuery for the computer."<p>-- Micha Niskin"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"\u201cC is how the computer works\u201d is a dangerous mindset for C programmers"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://words.steveklabnik.com/c-is-how-the-computer-works-is-a-dangerous-mindset-for-c-programmers"}},"_tags":["comment","author_wooby","story_22737612"],"author":"wooby","comment_text":""C is JQuery for the computer."<p>-- Micha Niskin","created_at":"2020-03-31T15:17:39Z","created_at_i":1585667859,"objectID":"22738316","parent_id":22737612,"story_id":22737612,"story_title":"\u201cC is how the computer works\u201d is a dangerous mindset for C programmers","story_url":"https://words.steveklabnik.com/c-is-how-the-computer-works-is-a-dangerous-mindset-for-c-programmers","updated_at":"2024-09-20T05:52:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"A Non-Conformist's Guide to Success in a Conformist World (2014)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.econlib.org/archives/2014/07/a_non-conformis.html"}},"_tags":["story","author_wooby","story_22628873"],"author":"wooby","created_at":"2020-03-19T16:13:43Z","created_at_i":1584634423,"num_comments":0,"objectID":"22628873","points":3,"story_id":22628873,"title":"A Non-Conformist's Guide to Success in a Conformist World (2014)","updated_at":"2024-09-20T05:50:12Z","url":"https://www.econlib.org/archives/2014/07/a_non-conformis.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Why the cynical view? People have fun, organizers make money, and a charity makes money. Without the event, nobody has fun, and nobody (including the charity) makes money."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Parachuting for Charity: A 5-year audit (1999)"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.ncbi.nlm.nih.gov/pubmed/10476298"}},"_tags":["comment","author_wooby","story_22065632"],"author":"wooby","comment_text":"Why the cynical view? People have fun, organizers make money, and a charity makes money. Without the event, nobody has fun, and nobody (including the charity) makes money.","created_at":"2020-01-17T15:22:04Z","created_at_i":1579274524,"objectID":"22075324","parent_id":22066501,"story_id":22065632,"story_title":"Parachuting for Charity: A 5-year audit (1999)","story_url":"https://www.ncbi.nlm.nih.gov/pubmed/10476298","updated_at":"2024-09-20T05:32:40Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Moon's Mark Down"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://users.rcn.com/david-moon/MMD/HTML/index.html"}},"_tags":["story","author_wooby","story_22061716"],"author":"wooby","created_at":"2020-01-16T04:35:28Z","created_at_i":1579149328,"num_comments":0,"objectID":"22061716","points":1,"story_id":22061716,"title":"Moon's Mark Down","updated_at":"2024-09-20T05:31:25Z","url":"http://users.rcn.com/david-moon/MMD/HTML/index.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"A Bootstrapping Dynamic Forth Interpreter/Compiler for WebAssembly"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/remko/waforth"}},"_tags":["story","author_wooby","story_22056498"],"author":"wooby","created_at":"2020-01-15T17:56:17Z","created_at_i":1579110977,"num_comments":0,"objectID":"22056498","points":2,"story_id":22056498,"title":"A Bootstrapping Dynamic Forth Interpreter/Compiler for WebAssembly","updated_at":"2024-09-20T05:30:58Z","url":"https://github.com/remko/waforth"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Shrdlu"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://hci.stanford.edu/winograd/shrdlu/"}},"_tags":["story","author_wooby","story_22014705"],"author":"wooby","created_at":"2020-01-10T19:54:14Z","created_at_i":1578686054,"num_comments":0,"objectID":"22014705","points":1,"story_id":22014705,"title":"Shrdlu","updated_at":"2024-09-20T05:27:10Z","url":"http://hci.stanford.edu/winograd/shrdlu/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Collecting Without Loop: Macro Edition"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/jlt/posts/collecting-macro-edition.html"}},"_tags":["story","author_wooby","story_21984710"],"author":"wooby","created_at":"2020-01-07T20:54:35Z","created_at_i":1578430475,"num_comments":0,"objectID":"21984710","points":1,"story_id":21984710,"title":"Collecting Without Loop: Macro Edition","updated_at":"2024-09-20T05:34:35Z","url":"https://tailrecursion.com/jlt/posts/collecting-macro-edition.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Colonies in Space"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://space.nss.org/colonies-in-space-by-t-a-heppenheimer/"}},"_tags":["story","author_wooby","story_21981866"],"author":"wooby","created_at":"2020-01-07T17:03:44Z","created_at_i":1578416624,"num_comments":0,"objectID":"21981866","points":1,"story_id":21981866,"title":"Colonies in Space","updated_at":"2024-09-20T05:34:19Z","url":"https://space.nss.org/colonies-in-space-by-t-a-heppenheimer/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Collecting Without Loop"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/jlt/posts/collecting.html"}},"_tags":["story","author_wooby","story_21764906"],"author":"wooby","created_at":"2019-12-11T17:52:17Z","created_at_i":1576086737,"num_comments":0,"objectID":"21764906","points":1,"story_id":21764906,"title":"Collecting Without Loop","updated_at":"2024-09-20T05:21:45Z","url":"https://tailrecursion.com/jlt/posts/collecting.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"B-58A Escape Capsule"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.ejectionsite.com/eb58caps.htm"}},"_tags":["story","author_wooby","story_21608403"],"author":"wooby","children":[21610092],"created_at":"2019-11-22T18:27:49Z","created_at_i":1574447269,"num_comments":1,"objectID":"21608403","points":2,"story_id":21608403,"title":"B-58A Escape Capsule","updated_at":"2024-09-20T05:15:42Z","url":"http://www.ejectionsite.com/eb58caps.htm"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I am working on a CL for JS that I will likely share at some point. I post updates about it occasionally to Mastodon [1] if anyone is interested in following my progress. I'm also happy to discuss rationale, design, and implementation -- it's been really fun to work on.<p>1. <a href=\"https://mytoot.net/@alandipert/103120653862853368\" rel=\"nofollow\">https://mytoot.net/@alandipert/103120653862853368</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"PAIP: Run Common Lisp in Browser?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/norvig/paip-lisp/issues/10"}},"_tags":["comment","author_wooby","story_21535165"],"author":"wooby","comment_text":"I am working on a CL for JS that I will likely share at some point. I post updates about it occasionally to Mastodon [1] if anyone is interested in following my progress. I'm also happy to discuss rationale, design, and implementation -- it's been really fun to work on.<p>1. <a href=\"https://mytoot.net/@alandipert/103120653862853368\" rel=\"nofollow\">https://mytoot.net/@alandipert/103120653862853368</a>","created_at":"2019-11-18T15:09:32Z","created_at_i":1574089772,"objectID":"21564842","parent_id":21535165,"story_id":21535165,"story_title":"PAIP: Run Common Lisp in Browser?","story_url":"https://github.com/norvig/paip-lisp/issues/10","updated_at":"2024-09-20T05:11:27Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Genetic Algorithm Walkers"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://rednuht.org/genetic_walkers/"}},"_tags":["story","author_wooby","story_21391169"],"author":"wooby","children":[21417129],"created_at":"2019-10-29T19:35:13Z","created_at_i":1572377713,"num_comments":1,"objectID":"21391169","points":2,"story_id":21391169,"title":"Genetic Algorithm Walkers","updated_at":"2024-09-20T05:13:02Z","url":"https://rednuht.org/genetic_walkers/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Homunculus"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Homunculus"}},"_tags":["story","author_wooby","story_21263576"],"author":"wooby","created_at":"2019-10-15T20:50:08Z","created_at_i":1571172608,"num_comments":0,"objectID":"21263576","points":3,"story_id":21263576,"title":"Homunculus","updated_at":"2024-09-20T05:00:43Z","url":"https://en.wikipedia.org/wiki/Homunculus"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"In-Memory-Only ELF Execution Without Tmpfs"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html"}},"_tags":["story","author_wooby","story_21138290"],"author":"wooby","children":[21147760,21149393,21147516,21145336,21148703],"created_at":"2019-10-02T16:31:55Z","created_at_i":1570033915,"num_comments":23,"objectID":"21138290","points":63,"story_id":21138290,"title":"In-Memory-Only ELF Execution Without Tmpfs","updated_at":"2024-10-04T10:37:52Z","url":"https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Kowloon Walled City"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Kowloon_Walled_City"}},"_tags":["story","author_wooby","story_21085899"],"author":"wooby","created_at":"2019-09-26T21:44:33Z","created_at_i":1569534273,"num_comments":0,"objectID":"21085899","points":3,"story_id":21085899,"title":"Kowloon Walled City","updated_at":"2024-09-20T05:02:17Z","url":"https://en.wikipedia.org/wiki/Kowloon_Walled_City"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Sprite (Operating System)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Sprite_(operating_system)"}},"_tags":["story","author_wooby","story_20567434"],"author":"wooby","created_at":"2019-07-30T18:01:05Z","created_at_i":1564509665,"num_comments":0,"objectID":"20567434","points":3,"story_id":20567434,"title":"Sprite (Operating System)","updated_at":"2024-09-20T04:39:42Z","url":"https://en.wikipedia.org/wiki/Sprite_(operating_system)"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Curt Herzstark and His Pocket Calculator CURTA"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.vcalc.net/cu-bckup.htm"}},"_tags":["story","author_wooby","story_20443592"],"author":"wooby","children":[20443659],"created_at":"2019-07-15T18:19:00Z","created_at_i":1563214740,"num_comments":0,"objectID":"20443592","points":2,"story_id":20443592,"title":"Curt Herzstark and His Pocket Calculator CURTA","updated_at":"2024-09-20T04:36:06Z","url":"http://www.vcalc.net/cu-bckup.htm"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I haven't seen that one, but it looks very similar to the one I use: <a href=\"https://github.com/micha/json-table\" rel=\"nofollow\">https://github.com/micha/json-table</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Catj \u2013 A new way to display JSON files"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/soheilpro/catj"}},"_tags":["comment","author_wooby","story_20245913"],"author":"wooby","comment_text":"I haven't seen that one, but it looks very similar to the one I use: <a href=\"https://github.com/micha/json-table\" rel=\"nofollow\">https://github.com/micha/json-table</a>","created_at":"2019-06-21T22:28:04Z","created_at_i":1561156084,"objectID":"20246785","parent_id":20246266,"story_id":20245913,"story_title":"Show HN: Catj \u2013 A new way to display JSON files","story_url":"https://github.com/soheilpro/catj","updated_at":"2024-09-20T04:27:13Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"L. Peter Deutsch in Conversation with Stig Hackv\u00e4n (1998)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://web.archive.org/web/20041013082602/http://devlinux.org/deutsch-interview.html"}},"_tags":["story","author_wooby","story_20126351"],"author":"wooby","created_at":"2019-06-07T16:37:11Z","created_at_i":1559925431,"num_comments":0,"objectID":"20126351","points":1,"story_id":20126351,"title":"L. Peter Deutsch in Conversation with Stig Hackv\u00e4n (1998)","updated_at":"2024-09-20T04:22:40Z","url":"https://web.archive.org/web/20041013082602/http://devlinux.org/deutsch-interview.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Brennan Torpedo"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Brennan_torpedo"}},"_tags":["story","author_wooby","story_20117867"],"author":"wooby","created_at":"2019-06-06T19:01:00Z","created_at_i":1559847660,"num_comments":0,"objectID":"20117867","points":2,"story_id":20117867,"title":"Brennan Torpedo","updated_at":"2024-09-20T04:21:37Z","url":"https://en.wikipedia.org/wiki/Brennan_torpedo"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Doomsday rule"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Doomsday_rule"}},"_tags":["story","author_wooby","story_20004046"],"author":"wooby","created_at":"2019-05-24T18:23:59Z","created_at_i":1558722239,"num_comments":0,"objectID":"20004046","points":3,"story_id":20004046,"title":"Doomsday rule","updated_at":"2024-09-20T04:12:36Z","url":"https://en.wikipedia.org/wiki/Doomsday_rule"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Re-Introducing Reform"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://mntre.com/media/news_md/2019-05-20-reintroducing-reform.html"}},"_tags":["story","author_wooby","story_20003385"],"author":"wooby","created_at":"2019-05-24T16:56:51Z","created_at_i":1558717011,"num_comments":0,"objectID":"20003385","points":2,"story_id":20003385,"title":"Re-Introducing Reform","updated_at":"2024-09-20T04:12:30Z","url":"https://mntre.com/media/news_md/2019-05-20-reintroducing-reform.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If you're interested, it's also possible to run the actual original Lisp 1.5 on emulated hardware via SIMH.<p>See this page: <a href=\"http://web.sonoma.edu/users/l/luvisi/\" rel=\"nofollow\">http://web.sonoma.edu/users/l/luvisi/</a><p>I got it running on my Mac a few months ago. SIMH is on Homebrew."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Let\u2019s LISP like it\u2019s 1959 [video]"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.youtube.com/watch?v=hGY3uBHVVr4"}},"_tags":["comment","author_wooby","story_19270886"],"author":"wooby","comment_text":"If you're interested, it's also possible to run the actual original Lisp 1.5 on emulated hardware via SIMH.<p>See this page: <a href=\"http://web.sonoma.edu/users/l/luvisi/\" rel=\"nofollow\">http://web.sonoma.edu/users/l/luvisi/</a><p>I got it running on my Mac a few months ago. SIMH is on Homebrew.","created_at":"2019-02-28T16:27:30Z","created_at_i":1551371250,"objectID":"19272504","parent_id":19270886,"story_id":19270886,"story_title":"Let\u2019s LISP like it\u2019s 1959 [video]","story_url":"https://www.youtube.com/watch?v=hGY3uBHVVr4","updated_at":"2024-09-20T03:54:11Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"ViolaWWW"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/ViolaWWW"}},"_tags":["story","author_wooby","story_19132604"],"author":"wooby","created_at":"2019-02-11T07:17:40Z","created_at_i":1549869460,"num_comments":0,"objectID":"19132604","points":3,"story_id":19132604,"title":"ViolaWWW","updated_at":"2024-09-20T03:42:05Z","url":"https://en.wikipedia.org/wiki/ViolaWWW"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Coroutines in C (2000)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html"}},"_tags":["story","author_wooby","story_19106796"],"author":"wooby","children":[19107246,19107013,19107062,19109509,19107468,19107854,19107073,19108172,19109837,19107384,19108107,19106948,19107086,19108782,19107619,19107085],"created_at":"2019-02-07T17:40:35Z","created_at_i":1549561235,"num_comments":59,"objectID":"19106796","points":181,"story_id":19106796,"title":"Coroutines in C (2000)","updated_at":"2025-07-31T03:46:28Z","url":"https://www.chiark.greenend.org.uk/~sgtatham/coroutines.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"How to Give an OK Presentation"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/wondr/posts/how-to-give-an-ok-presentation.html"}},"_tags":["story","author_wooby","story_19027224"],"author":"wooby","created_at":"2019-01-29T15:47:00Z","created_at_i":1548776820,"num_comments":0,"objectID":"19027224","points":2,"story_id":19027224,"title":"How to Give an OK Presentation","updated_at":"2024-09-20T03:39:35Z","url":"https://tailrecursion.com/wondr/posts/how-to-give-an-ok-presentation.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Thanks for clarifying. I remembered it as a point of contention in the Scheme community."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"How innovative is Clojure as a Lisp dialect from Lisp expert's perspective?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.reddit.com/r/lisp/comments/acid7a/how_innovative_is_clojure_as_a_lisp_dialect_from/"}},"_tags":["comment","author_wooby","story_18834945"],"author":"wooby","comment_text":"Thanks for clarifying. I remembered it as a point of contention in the Scheme community.","created_at":"2019-01-07T07:01:29Z","created_at_i":1546844489,"objectID":"18843341","parent_id":18843232,"story_id":18834945,"story_title":"How innovative is Clojure as a Lisp dialect from Lisp expert's perspective?","story_url":"https://www.reddit.com/r/lisp/comments/acid7a/how_innovative_is_clojure_as_a_lisp_dialect_from/","updated_at":"2024-09-20T03:31:30Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Strictly speaking: yes. But whether conses (aka pairs), lists, or other derivative structures support pervasive FP in a language is probably most influenced by whether conses are mutable or not.<p>In Common Lisp, they are. In Scheme, they are not.<p>Mutable conses are useful because at least because values can be accumulated in a list from the end by retaining and mutating the tail.<p>However, the presence of mutable conses detracts from a language's ability to support FP, since it must be done by convention and with much copying.<p>I see Clojure's innovation in this area not in the fact that its lists are immutable (Scheme did this already) but in the fact that its lists are immutable <i>and</i> there's never a need to mutate the tail, because lazy sequences are supported throughout the language. The icing on the top of the story is that concrete lists and lazy sequences both inhabit the "Seq abstraction", and so don't require different APIs most of the time.<p>Of course, I'm pretty sure lazy sequences existed before CL was standardized (they're in SICP), but I can imagine how the designers would have preferred a simple, well-known tool (mutable conses) over admitting a whole other sequence abstraction. Plus, immutable conses would have been a breaking change.<p>So, it's not that anything that Clojure does with regard to lists couldn't have been done before, just that it wasn't -- while also being packaged in a vehicle that was wildly compelling for many other unrelated reasons."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"How innovative is Clojure as a Lisp dialect from Lisp expert's perspective?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.reddit.com/r/lisp/comments/acid7a/how_innovative_is_clojure_as_a_lisp_dialect_from/"}},"_tags":["comment","author_wooby","story_18834945"],"author":"wooby","children":[18843888,18843232,18844415],"comment_text":"Strictly speaking: yes. But whether conses (aka pairs), lists, or other derivative structures support pervasive FP in a language is probably most influenced by whether conses are mutable or not.<p>In Common Lisp, they are. In Scheme, they are not.<p>Mutable conses are useful because at least because values can be accumulated in a list from the end by retaining and mutating the tail.<p>However, the presence of mutable conses detracts from a language's ability to support FP, since it must be done by convention and with much copying.<p>I see Clojure's innovation in this area not in the fact that its lists are immutable (Scheme did this already) but in the fact that its lists are immutable <i>and</i> there's never a need to mutate the tail, because lazy sequences are supported throughout the language. The icing on the top of the story is that concrete lists and lazy sequences both inhabit the "Seq abstraction", and so don't require different APIs most of the time.<p>Of course, I'm pretty sure lazy sequences existed before CL was standardized (they're in SICP), but I can imagine how the designers would have preferred a simple, well-known tool (mutable conses) over admitting a whole other sequence abstraction. Plus, immutable conses would have been a breaking change.<p>So, it's not that anything that Clojure does with regard to lists couldn't have been done before, just that it wasn't -- while also being packaged in a vehicle that was wildly compelling for many other unrelated reasons.","created_at":"2019-01-07T04:04:25Z","created_at_i":1546833865,"objectID":"18842694","parent_id":18842024,"story_id":18834945,"story_title":"How innovative is Clojure as a Lisp dialect from Lisp expert's perspective?","story_url":"https://www.reddit.com/r/lisp/comments/acid7a/how_innovative_is_clojure_as_a_lisp_dialect_from/","updated_at":"2024-09-20T03:31:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"At a Clojure meetup I attended a couple years ago, a long-time Java programmer asked "how do you manage huge projects without static types?"<p>The best answer I could think of was, "don't manage huge projects." Instead, divide projects as early as possible in development into supporting libraries, each capable of being independently tested and maintained.<p>In my experience, applications developed with this attitude coalesce themselves into a small ecosystem of mostly generic library code with a domain-specific apex "application" entrypoint to bind them.<p>In an application factored like this, type checking isn't something you want as much anymore, since the constituent libraries interface with one another at a level above. They present and consume "public" (intra-application) APIs, the behavior of which are defined not just by types but by at least documentation and tests. The thing that static types let you do -- have huge amounts of code, woven together with structural dependencies -- is no longer a thing you need or want. It would seem bad, actually, since what you'd have is an inscrutable mass only a machine can understand.<p>I haven't worked enough with large non-Clojure codebases to say whether or not this approach is superior, but I can say that it scales. Another nice thing about it in a business setting is that supporting libraries lend themselves to open-sourcing, and a relationship with an open source community is a good thing for a company's development efforts/hiring/contracting in my experience.<p>To answer your specific questions:<p>* I don't think I write more unit tests (I should probably write more tests in every language I use)<p>* I don't have any experience with clojure.spec<p>* All of the features of Lisp work together to make it awesome, including macros. In particular, in the context of an "ecosystem of libraries" approach, macros are a fantastic tool for exporting a DSL from a supporting library. They're also use for DSLs in the apex code, where application-specific behavior can be defined in terms of a DSL.<p>* I don't really wish I had static types - I love Lisp the way it is. But I have found various languages for structural checking useful with certain kinds of sub-program, like receiving data from the outside world, and for writing compilers. If you write a compiler as a series of transformations, it's nice if the shape of the code between transformations is well-defined somehow.<p>You're definitely smart enough to use Lisp. I think the key to success is not necessarily smarts, but attentiveness to modularity or cognizance of the difference between "library" and "application" types of code.<p>* There's a Paul Graham essay related to this idea: <a href=\"http://www.paulgraham.com/progbot.html\" rel=\"nofollow\">http://www.paulgraham.com/progbot.html</a><p>* I think this approach is applicable not just to Lisp, but maybe to any dynamic language with a sufficiently rich set of generic collections and with the concepts of a "module" or "package"."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Clojure is Capable"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://ahungry.com/blog/2018-12-26-Clojure-is-Capable.html"}},"_tags":["comment","author_wooby","story_18767592"],"author":"wooby","children":[18775200,18775165],"comment_text":"At a Clojure meetup I attended a couple years ago, a long-time Java programmer asked "how do you manage huge projects without static types?"<p>The best answer I could think of was, "don't manage huge projects." Instead, divide projects as early as possible in development into supporting libraries, each capable of being independently tested and maintained.<p>In my experience, applications developed with this attitude coalesce themselves into a small ecosystem of mostly generic library code with a domain-specific apex "application" entrypoint to bind them.<p>In an application factored like this, type checking isn't something you want as much anymore, since the constituent libraries interface with one another at a level above. They present and consume "public" (intra-application) APIs, the behavior of which are defined not just by types but by at least documentation and tests. The thing that static types let you do -- have huge amounts of code, woven together with structural dependencies -- is no longer a thing you need or want. It would seem bad, actually, since what you'd have is an inscrutable mass only a machine can understand.<p>I haven't worked enough with large non-Clojure codebases to say whether or not this approach is superior, but I can say that it scales. Another nice thing about it in a business setting is that supporting libraries lend themselves to open-sourcing, and a relationship with an open source community is a good thing for a company's development efforts/hiring/contracting in my experience.<p>To answer your specific questions:<p>* I don't think I write more unit tests (I should probably write more tests in every language I use)<p>* I don't have any experience with clojure.spec<p>* All of the features of Lisp work together to make it awesome, including macros. In particular, in the context of an "ecosystem of libraries" approach, macros are a fantastic tool for exporting a DSL from a supporting library. They're also use for DSLs in the apex code, where application-specific behavior can be defined in terms of a DSL.<p>* I don't really wish I had static types - I love Lisp the way it is. But I have found various languages for structural checking useful with certain kinds of sub-program, like receiving data from the outside world, and for writing compilers. If you write a compiler as a series of transformations, it's nice if the shape of the code between transformations is well-defined somehow.<p>You're definitely smart enough to use Lisp. I think the key to success is not necessarily smarts, but attentiveness to modularity or cognizance of the difference between "library" and "application" types of code.<p>* There's a Paul Graham essay related to this idea: <a href=\"http://www.paulgraham.com/progbot.html\" rel=\"nofollow\">http://www.paulgraham.com/progbot.html</a><p>* I think this approach is applicable not just to Lisp, but maybe to any dynamic language with a sufficiently rich set of generic collections and with the concepts of a "module" or "package".","created_at":"2018-12-28T05:17:53Z","created_at_i":1545974273,"objectID":"18775023","parent_id":18774888,"story_id":18767592,"story_title":"Clojure is Capable","story_url":"http://ahungry.com/blog/2018-12-26-Clojure-is-Capable.html","updated_at":"2024-09-20T03:33:08Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Snap-dragon (game)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Snap-dragon_(game)"}},"_tags":["story","author_wooby","story_18760227"],"author":"wooby","created_at":"2018-12-26T03:11:35Z","created_at_i":1545793895,"num_comments":0,"objectID":"18760227","points":2,"story_id":18760227,"title":"Snap-dragon (game)","updated_at":"2024-09-20T03:31:40Z","url":"https://en.wikipedia.org/wiki/Snap-dragon_(game)"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Richard Stallman: How I do my computing"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://stallman.org/stallman-computing.html"}},"_tags":["story","author_wooby","story_18564037"],"author":"wooby","children":[18565783,18566117,18565883,18570495,18565164,18567453,18567494,18565728,18564332],"created_at":"2018-11-29T21:09:17Z","created_at_i":1543525757,"num_comments":22,"objectID":"18564037","points":54,"story_id":18564037,"title":"Richard Stallman: How I do my computing","updated_at":"2024-09-20T03:22:56Z","url":"https://stallman.org/stallman-computing.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"IBM and the Holocaust"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/IBM_and_the_Holocaust"}},"_tags":["story","author_wooby","story_18499984"],"author":"wooby","created_at":"2018-11-21T03:35:44Z","created_at_i":1542771344,"num_comments":0,"objectID":"18499984","points":3,"story_id":18499984,"title":"IBM and the Holocaust","updated_at":"2024-09-20T03:24:47Z","url":"https://en.wikipedia.org/wiki/IBM_and_the_Holocaust"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I've been using it daily for about a year. I run it behind Apache (for SSL with LetsEncrypt) on a 1 year reserved T2.Nano VM in AWS ($3.125/month) that I also occasionally use for other things.<p>I'm involved in a lot of open source but had used IRC only intermittently until I got The Lounge running.<p>I've really enjoyed it. I'm able to log in and see the same unreads and direct messages across my work PC, personal PC, and phone and iPad. The software has been reliable and relatively painless to update. The UI functions nicely on touch devices.<p>Before The Lounge I operated ZNC in EC2, but configuring device-specific clients to use it was a chore, and I didn't find myself using IRC very much. Now, I use IRC all the time.<p>Obviously if you're not comfortable maintaining a server then this isn't the option for you, but as a "power user" I've found the web UI perfectly tolerable. Instead of maintaining IRC clients on multiple devices and pointing them at ZNC, I maintain a single IRC client -- The Lounge."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The Lounge \u2013 Modern cross-platform, self-hosted web IRC client"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/thelounge/thelounge"}},"_tags":["comment","author_wooby","story_18406684"],"author":"wooby","children":[18412574],"comment_text":"I've been using it daily for about a year. I run it behind Apache (for SSL with LetsEncrypt) on a 1 year reserved T2.Nano VM in AWS ($3.125/month) that I also occasionally use for other things.<p>I'm involved in a lot of open source but had used IRC only intermittently until I got The Lounge running.<p>I've really enjoyed it. I'm able to log in and see the same unreads and direct messages across my work PC, personal PC, and phone and iPad. The software has been reliable and relatively painless to update. The UI functions nicely on touch devices.<p>Before The Lounge I operated ZNC in EC2, but configuring device-specific clients to use it was a chore, and I didn't find myself using IRC very much. Now, I use IRC all the time.<p>Obviously if you're not comfortable maintaining a server then this isn't the option for you, but as a "power user" I've found the web UI perfectly tolerable. Instead of maintaining IRC clients on multiple devices and pointing them at ZNC, I maintain a single IRC client -- The Lounge.","created_at":"2018-11-08T21:43:37Z","created_at_i":1541713417,"objectID":"18410320","parent_id":18409989,"story_id":18406684,"story_title":"The Lounge \u2013 Modern cross-platform, self-hosted web IRC client","story_url":"https://github.com/thelounge/thelounge","updated_at":"2024-09-20T03:15:38Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Lisp Machine Inc. K-machine"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://fare.tunes.org/tmp/emergent/kmachine.htm"}},"_tags":["story","author_wooby","story_18338835"],"author":"wooby","created_at":"2018-10-30T17:04:41Z","created_at_i":1540919081,"num_comments":0,"objectID":"18338835","points":3,"story_id":18338835,"title":"Lisp Machine Inc. K-machine","updated_at":"2024-09-20T03:16:57Z","url":"http://fare.tunes.org/tmp/emergent/kmachine.htm"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"The Jesuit Republic of South America"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.vqronline.org/essay/jesuit-republic-south-america"}},"_tags":["story","author_wooby","story_18191511"],"author":"wooby","created_at":"2018-10-11T07:17:23Z","created_at_i":1539242243,"num_comments":0,"objectID":"18191511","points":2,"story_id":18191511,"title":"The Jesuit Republic of South America","updated_at":"2024-09-20T03:12:58Z","url":"https://www.vqronline.org/essay/jesuit-republic-south-america"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Querying Trees in R"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/wondr/posts/querying-trees-in-r.html"}},"_tags":["story","author_wooby","story_17701048"],"author":"wooby","created_at":"2018-08-06T19:45:29Z","created_at_i":1533584729,"num_comments":0,"objectID":"17701048","points":1,"story_id":17701048,"title":"Querying Trees in R","updated_at":"2024-09-20T02:48:33Z","url":"https://tailrecursion.com/wondr/posts/querying-trees-in-r.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Coin Operated Television Chairs, Circa 1970"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.tvobscurities.com/2008/12/coin-operated-television-chairs-circa-1970/"}},"_tags":["story","author_wooby","story_17614533"],"author":"wooby","created_at":"2018-07-26T01:52:14Z","created_at_i":1532569934,"num_comments":0,"objectID":"17614533","points":2,"story_id":17614533,"title":"Coin Operated Television Chairs, Circa 1970","updated_at":"2024-09-20T02:44:08Z","url":"https://www.tvobscurities.com/2008/12/coin-operated-television-chairs-circa-1970/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"A worthwhile alternative to this approach (a JSON-specific query language) is a language for converting JSON structures to newline-delimited records. Then, standard shell tools can be used to query and join: <a href=\"https://github.com/micha/json-table\" rel=\"nofollow\">https://github.com/micha/json-table</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"JMESPath \u2013 A query language for JSON"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://jmespath.org/"}},"_tags":["comment","author_wooby","story_16400320"],"author":"wooby","comment_text":"A worthwhile alternative to this approach (a JSON-specific query language) is a language for converting JSON structures to newline-delimited records. Then, standard shell tools can be used to query and join: <a href=\"https://github.com/micha/json-table\" rel=\"nofollow\">https://github.com/micha/json-table</a>","created_at":"2018-02-17T15:58:13Z","created_at_i":1518883093,"objectID":"16401199","parent_id":16400320,"story_id":16400320,"story_title":"JMESPath \u2013 A query language for JSON","story_url":"http://jmespath.org/","updated_at":"2024-09-20T01:59:20Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"The Cardinal Rule of Functions"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.cs.northwestern.edu/academics/courses/325/readings/cardinal-rule.php"}},"_tags":["story","author_wooby","story_16141632"],"author":"wooby","created_at":"2018-01-13T21:52:34Z","created_at_i":1515880354,"num_comments":0,"objectID":"16141632","points":2,"story_id":16141632,"title":"The Cardinal Rule of Functions","updated_at":"2024-09-20T01:52:43Z","url":"http://www.cs.northwestern.edu/academics/courses/325/readings/cardinal-rule.php"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Structural Regular Expressions"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.perlmonks.org/?node_id=665719"}},"_tags":["story","author_wooby","story_15754605"],"author":"wooby","created_at":"2017-11-22T05:57:38Z","created_at_i":1511330258,"num_comments":0,"objectID":"15754605","points":1,"story_id":15754605,"title":"Structural Regular Expressions","updated_at":"2024-09-20T01:41:18Z","url":"http://www.perlmonks.org/?node_id=665719"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Not sure if this is what you meant by tag browsing, but I've been using <a href=\"https://github.com/kupospelov/vis-ctags\" rel=\"nofollow\">https://github.com/kupospelov/vis-ctags</a> successfully today."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Vis \u2013 A vi-like editor based on Plan 9's structural regular expressions"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/martanne/vis"}},"_tags":["comment","author_wooby","story_15710533"],"author":"wooby","children":[15716788],"comment_text":"Not sure if this is what you meant by tag browsing, but I've been using <a href=\"https://github.com/kupospelov/vis-ctags\" rel=\"nofollow\">https://github.com/kupospelov/vis-ctags</a> successfully today.","created_at":"2017-11-16T20:20:32Z","created_at_i":1510863632,"objectID":"15716213","parent_id":15713904,"story_id":15710533,"story_title":"Vis \u2013 A vi-like editor based on Plan 9's structural regular expressions","story_url":"https://github.com/martanne/vis","updated_at":"2024-09-20T01:37:14Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Where does Guy Steele make this point? I'm curious to know the context, thank you."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Vis \u2013 A vi-like editor based on Plan 9's structural regular expressions"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/martanne/vis"}},"_tags":["comment","author_wooby","story_15710533"],"author":"wooby","children":[15718227],"comment_text":"Where does Guy Steele make this point? I'm curious to know the context, thank you.","created_at":"2017-11-16T19:57:46Z","created_at_i":1510862266,"objectID":"15716007","parent_id":15712878,"story_id":15710533,"story_title":"Vis \u2013 A vi-like editor based on Plan 9's structural regular expressions","story_url":"https://github.com/martanne/vis","updated_at":"2024-09-20T01:37:14Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Vis \u2013 A vi-like editor based on Plan 9's structural regular expressions"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/martanne/vis"}},"_tags":["story","author_wooby","story_15710533"],"author":"wooby","children":[15713904,15714169,15712870,15712878,15717558,15715942,15712710,15714097,15716872,15716450],"created_at":"2017-11-16T05:56:55Z","created_at_i":1510811815,"num_comments":39,"objectID":"15710533","points":170,"story_id":15710533,"title":"Vis \u2013 A vi-like editor based on Plan 9's structural regular expressions","updated_at":"2026-07-17T06:03:40Z","url":"https://github.com/martanne/vis"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Dogs can predict epileptic seizures (2004)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.newscientist.com/article/dn6047-dogs-can-predict-epileptic-seizures/"}},"_tags":["story","author_wooby","story_15543438"],"author":"wooby","created_at":"2017-10-24T17:38:46Z","created_at_i":1508866726,"num_comments":0,"objectID":"15543438","points":3,"story_id":15543438,"title":"Dogs can predict epileptic seizures (2004)","updated_at":"2024-09-20T01:30:46Z","url":"https://www.newscientist.com/article/dn6047-dogs-can-predict-epileptic-seizures/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Tail Recursion in R with Trampolines"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://tailrecursion.com/wondr/posts/tail-recursion-in-r.html"}},"_tags":["story","author_wooby","story_15473524"],"author":"wooby","created_at":"2017-10-14T18:39:34Z","created_at_i":1508006374,"num_comments":0,"objectID":"15473524","points":5,"story_id":15473524,"title":"Tail Recursion in R with Trampolines","updated_at":"2024-09-20T01:32:08Z","url":"https://tailrecursion.com/wondr/posts/tail-recursion-in-r.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Statically Recompiling NES Games into Native Executables with LLVM and Go (2013)"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://andrewkelley.me/post/jamulator.html"}},"_tags":["story","author_wooby","story_15254506"],"author":"wooby","children":[15255116,15258827,15254672,15255499,15256770,15255120,15256376,15256065,15254878,15254860],"created_at":"2017-09-15T03:54:15Z","created_at_i":1505447655,"num_comments":44,"objectID":"15254506","points":265,"story_id":15254506,"title":"Statically Recompiling NES Games into Native Executables with LLVM and Go (2013)","updated_at":"2024-09-20T01:20:58Z","url":"http://andrewkelley.me/post/jamulator.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Generational GC, Write Barriers/Write Protection and userfaultfd(2)"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://medium.com/@MartinCracauer/generational-garbage-collection-write-barriers-write-protection-and-userfaultfd-2-8b0e796b8f7f"}},"_tags":["story","author_wooby","story_15132494"],"author":"wooby","created_at":"2017-08-30T14:44:45Z","created_at_i":1504104285,"num_comments":0,"objectID":"15132494","points":2,"story_id":15132494,"title":"Generational GC, Write Barriers/Write Protection and userfaultfd(2)","updated_at":"2024-09-20T01:17:45Z","url":"https://medium.com/@MartinCracauer/generational-garbage-collection-write-barriers-write-protection-and-userfaultfd-2-8b0e796b8f7f"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"The Surprising Psychology of Rock-Paper-Scissors"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.psychologytoday.com/blog/the-blame-game/201504/the-surprising-psychology-rock-paper-scissors"}},"_tags":["story","author_wooby","story_14721284"],"author":"wooby","created_at":"2017-07-07T19:23:50Z","created_at_i":1499455430,"num_comments":0,"objectID":"14721284","points":2,"story_id":14721284,"title":"The Surprising Psychology of Rock-Paper-Scissors","updated_at":"2024-09-20T01:00:58Z","url":"https://www.psychologytoday.com/blog/the-blame-game/201504/the-surprising-psychology-rock-paper-scissors"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"It's a Nonlinear World \u2013 Interactive Dashboard"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.linkedin.com/pulse/its-nonlinear-world-interactive-dashboard-edgar-ruiz"}},"_tags":["story","author_wooby","story_14720754"],"author":"wooby","created_at":"2017-07-07T18:23:15Z","created_at_i":1499451795,"num_comments":0,"objectID":"14720754","points":1,"story_id":14720754,"title":"It's a Nonlinear World \u2013 Interactive Dashboard","updated_at":"2024-09-20T01:00:50Z","url":"https://www.linkedin.com/pulse/its-nonlinear-world-interactive-dashboard-edgar-ruiz"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The "801 paper" (I think): <a href=\"http://www.ece.ucdavis.edu/~vojin/CLASSES/EEC272/S2005/Papers/801-report_nov81.pdf\" rel=\"nofollow\">http://www.ece.ucdavis.edu/~vojin/CLASSES/EEC272/S2005/Paper...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Improvements to the Xerox Alto Mandelbrot drop runtime from 1 hour to 9 minutes"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.righto.com/2017/06/improvements-to-xerox-alto-mandelbrot.html"}},"_tags":["comment","author_wooby","story_14637763"],"author":"wooby","comment_text":"The "801 paper" (I think): <a href=\"http://www.ece.ucdavis.edu/~vojin/CLASSES/EEC272/S2005/Papers/801-report_nov81.pdf\" rel=\"nofollow\">http://www.ece.ucdavis.edu/~vojin/CLASSES/EEC272/S2005/Paper...</a>","created_at":"2017-06-26T21:36:59Z","created_at_i":1498513019,"objectID":"14640597","parent_id":14639321,"story_id":14637763,"story_title":"Improvements to the Xerox Alto Mandelbrot drop runtime from 1 hour to 9 minutes","story_url":"http://www.righto.com/2017/06/improvements-to-xerox-alto-mandelbrot.html","updated_at":"2024-09-20T00:58:32Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"> more readable\n...to you.<p>It's possible I suck at what I do, but somehow I've enjoyed building, shipping, and maintaining services and applications in dynamic languages.<p>I used a lot of Clojure, and it was basically smooth sailing, even on teams.<p>Along the way I used various statically typed languages, such as C# and a tiny bit of SML (to be able to read Okasaki), and enjoyed them too. Just not as much.<p>Anyway, I can't refute your experience programming, or the way that you feel. With more experience, perhaps some day I will agree with you. But right now, for whatever it's worth, I don't.<p>Dynamic (functional) languages all the way."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"LambdaNative \u2013 Cross-platform mobile apps in Scheme"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.lambdanative.org"}},"_tags":["comment","author_wooby","story_14619888"],"author":"wooby","children":[14624284,14623285],"comment_text":"> more readable\n...to you.<p>It's possible I suck at what I do, but somehow I've enjoyed building, shipping, and maintaining services and applications in dynamic languages.<p>I used a lot of Clojure, and it was basically smooth sailing, even on teams.<p>Along the way I used various statically typed languages, such as C# and a tiny bit of SML (to be able to read Okasaki), and enjoyed them too. Just not as much.<p>Anyway, I can't refute your experience programming, or the way that you feel. With more experience, perhaps some day I will agree with you. But right now, for whatever it's worth, I don't.<p>Dynamic (functional) languages all the way.","created_at":"2017-06-23T21:09:41Z","created_at_i":1498252181,"objectID":"14622818","parent_id":14622552,"story_id":14619888,"story_title":"LambdaNative \u2013 Cross-platform mobile apps in Scheme","story_url":"http://www.lambdanative.org","updated_at":"2024-09-20T00:56:52Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"pigz: A parallel implementation of gzip"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://zlib.net/pigz/"}},"_tags":["story","author_wooby","story_14268306"],"author":"wooby","children":[14268467],"created_at":"2017-05-04T20:09:11Z","created_at_i":1493928551,"num_comments":1,"objectID":"14268306","points":2,"story_id":14268306,"title":"pigz: A parallel implementation of gzip","updated_at":"2024-09-20T00:48:30Z","url":"http://zlib.net/pigz/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Lisp macros for C"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/eudoxia0/cmacro"}},"_tags":["story","author_wooby","story_14145297"],"author":"wooby","children":[14153495,14154660,14154097,14154227,14155898],"created_at":"2017-04-19T03:47:36Z","created_at_i":1492573656,"num_comments":14,"objectID":"14145297","points":113,"story_id":14145297,"title":"Lisp macros for C","updated_at":"2024-09-20T00:41:53Z","url":"https://github.com/eudoxia0/cmacro"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Getting Started with Datomic"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://docs.datomic.com/getting-started/brief-overview.html"}},"_tags":["story","author_wooby","story_13941081"],"author":"wooby","created_at":"2017-03-23T16:11:35Z","created_at_i":1490285495,"num_comments":0,"objectID":"13941081","points":3,"story_id":13941081,"title":"Getting Started with Datomic","updated_at":"2024-09-20T00:34:47Z","url":"http://docs.datomic.com/getting-started/brief-overview.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"cdecl: translate C declarations to English and vice versa"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://cdecl.org"}},"_tags":["story","author_wooby","story_13385049"],"author":"wooby","created_at":"2017-01-12T18:59:46Z","created_at_i":1484247586,"num_comments":0,"objectID":"13385049","points":2,"story_id":13385049,"title":"cdecl: translate C declarations to English and vice versa","updated_at":"2024-09-20T00:17:28Z","url":"http://cdecl.org"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Burning Down Your Back End"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2017/01/burning-down-your-backend/"}},"_tags":["story","author_wooby","story_13331169"],"author":"wooby","children":[13332282],"created_at":"2017-01-05T20:40:14Z","created_at_i":1483648814,"num_comments":1,"objectID":"13331169","points":1,"story_id":13331169,"title":"Burning Down Your Back End","updated_at":"2024-09-20T00:11:51Z","url":"http://adzerk.com/blog/2017/01/burning-down-your-backend/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"How boot solved our FTP problem"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://ingesolvoll.github.io/2016/12/26/how-boot-solved-our-ftp-upload-problem.html"}},"_tags":["story","author_wooby","story_13286727"],"author":"wooby","created_at":"2016-12-30T19:37:13Z","created_at_i":1483126633,"num_comments":0,"objectID":"13286727","points":1,"story_id":13286727,"title":"How boot solved our FTP problem","updated_at":"2024-09-20T00:13:25Z","url":"http://ingesolvoll.github.io/2016/12/26/how-boot-solved-our-ftp-upload-problem.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Scripting with C"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2016/12/scripting-with-c/"}},"_tags":["story","author_wooby","story_13246424"],"author":"wooby","created_at":"2016-12-23T18:36:40Z","created_at_i":1482518200,"num_comments":0,"objectID":"13246424","points":4,"story_id":13246424,"title":"Scripting with C","updated_at":"2024-09-20T00:09:13Z","url":"http://adzerk.com/blog/2016/12/scripting-with-c/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Supertasks"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://plato.stanford.edu/entries/spacetime-supertasks/"}},"_tags":["story","author_wooby","story_12677662"],"author":"wooby","created_at":"2016-10-10T15:35:34Z","created_at_i":1476113734,"num_comments":0,"objectID":"12677662","points":1,"story_id":12677662,"title":"Supertasks","updated_at":"2024-09-19T23:50:26Z","url":"http://plato.stanford.edu/entries/spacetime-supertasks/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Halloween documents"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://en.wikipedia.org/wiki/Halloween_documents"}},"_tags":["story","author_wooby","story_12317928"],"author":"wooby","created_at":"2016-08-19T04:09:14Z","created_at_i":1471579754,"num_comments":0,"objectID":"12317928","points":1,"story_id":12317928,"title":"Halloween documents","updated_at":"2024-09-19T23:34:00Z","url":"https://en.wikipedia.org/wiki/Halloween_documents"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Kanban and the Stages of Grief: A Semi-Agile Model for Software Development"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2016/04/kanban-and-the-stages-of-grief/"}},"_tags":["story","author_wooby","story_11405875"],"author":"wooby","created_at":"2016-04-01T16:09:07Z","created_at_i":1459526947,"num_comments":0,"objectID":"11405875","points":2,"story_id":11405875,"title":"Kanban and the Stages of Grief: A Semi-Agile Model for Software Development","updated_at":"2024-09-19T22:58:58Z","url":"http://adzerk.com/blog/2016/04/kanban-and-the-stages-of-grief/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Json-table: Transform nested JSON data into tabular data in the shell"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/micha/json-table"}},"_tags":["story","author_wooby","story_11106136"],"author":"wooby","created_at":"2016-02-15T21:26:48Z","created_at_i":1455571608,"num_comments":0,"objectID":"11106136","points":1,"story_id":11106136,"title":"Json-table: Transform nested JSON data into tabular data in the shell","updated_at":"2024-09-19T22:47:55Z","url":"https://github.com/micha/json-table"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Use S3 as a Private Git Repository with Jgit"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.fancybeans.com/blog/2012/08/24/how-to-use-s3-as-a-private-git-repository/"}},"_tags":["story","author_wooby","story_10972938"],"author":"wooby","created_at":"2016-01-26T11:50:50Z","created_at_i":1453809050,"num_comments":0,"objectID":"10972938","points":4,"story_id":10972938,"title":"Use S3 as a Private Git Repository with Jgit","updated_at":"2023-09-07T00:39:43Z","url":"http://www.fancybeans.com/blog/2012/08/24/how-to-use-s3-as-a-private-git-repository/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Thanks for Trumpet Winsock"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://thanksfortrumpetwinsock.com/"}},"_tags":["story","author_wooby","story_10935532"],"author":"wooby","children":[10935877,10936357,10936025,10935897,10935858,10936262,10935905,10936883,10935992,10935947,10936134,10935962,10936975,10936005,10937463,10936326,10937208,10936385,10937818,10937811,10936510,10936539,10937138,10937343,10936324,10936495,10936082,10936313,10937432,10937380,10936704,10936436,10936681,10936245,10936062,10936342],"created_at":"2016-01-20T01:53:03Z","created_at_i":1453254783,"num_comments":117,"objectID":"10935532","points":415,"story_id":10935532,"title":"Thanks for Trumpet Winsock","updated_at":"2024-10-27T03:06:34Z","url":"http://thanksfortrumpetwinsock.com/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"They aren't a problem if the operations at the leaves of the graph are idempotent, which is usually the case if these operations are UI repaints.<p>If the operations are for other effects - such as Ajax calls - then glitch elimination is handy. Eliminating glitches at the dataflow level prevents debounce logic from leaking out to the code performing the effects, preserving the clarity and generality of that code.<p>I find glitch elimination most useful when the dataflow graph is value-propagated, vs. event-propagated, as it is in the dataflow library I helped implement, Javelin - <a href=\"https://github.com/hoplon/javelin/\" rel=\"nofollow\">https://github.com/hoplon/javelin/</a><p>Javelin also supports transactional input, another feature that's helpful when building dataflow graphs on which effects other than UI-repaint are hung."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Rx glitches aren't actually a problem"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://staltz.com/rx-glitches-arent-actually-a-problem.html"}},"_tags":["comment","author_wooby","story_10746336"],"author":"wooby","comment_text":"They aren't a problem if the operations at the leaves of the graph are idempotent, which is usually the case if these operations are UI repaints.<p>If the operations are for other effects - such as Ajax calls - then glitch elimination is handy. Eliminating glitches at the dataflow level prevents debounce logic from leaking out to the code performing the effects, preserving the clarity and generality of that code.<p>I find glitch elimination most useful when the dataflow graph is value-propagated, vs. event-propagated, as it is in the dataflow library I helped implement, Javelin - <a href=\"https://github.com/hoplon/javelin/\" rel=\"nofollow\">https://github.com/hoplon/javelin/</a><p>Javelin also supports transactional input, another feature that's helpful when building dataflow graphs on which effects other than UI-repaint are hung.","created_at":"2015-12-17T14:09:13Z","created_at_i":1450361353,"objectID":"10751495","parent_id":10746336,"story_id":10746336,"story_title":"Rx glitches aren't actually a problem","story_url":"http://staltz.com/rx-glitches-arent-actually-a-problem.html","updated_at":"2024-09-19T22:35:38Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Getting Your First Programming Job: Not as Hard as You Think"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2015/11/getting-your-first-programming-job-not-as-hard-as-you-think/"}},"_tags":["story","author_wooby","story_10587663"],"author":"wooby","created_at":"2015-11-18T13:57:34Z","created_at_i":1447855054,"num_comments":0,"objectID":"10587663","points":2,"story_id":10587663,"title":"Getting Your First Programming Job: Not as Hard as You Think","updated_at":"2024-09-19T22:35:25Z","url":"http://adzerk.com/blog/2015/11/getting-your-first-programming-job-not-as-hard-as-you-think/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Hoplon and Javelin, WebDev Alternate Reality"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://www.youtube.com/watch?v=UoZyyo2Bwr8"}},"_tags":["story","author_wooby","story_10265194"],"author":"wooby","created_at":"2015-09-23T14:33:51Z","created_at_i":1443018831,"num_comments":0,"objectID":"10265194","points":2,"story_id":10265194,"title":"Hoplon and Javelin, WebDev Alternate Reality","updated_at":"2023-09-06T23:40:49Z","url":"https://www.youtube.com/watch?v=UoZyyo2Bwr8"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Learn from AWS Outages with After-Action Reviews"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2015/09/team-learning-by-aar/"}},"_tags":["story","author_wooby","story_10251633"],"author":"wooby","created_at":"2015-09-21T12:04:10Z","created_at_i":1442837050,"num_comments":0,"objectID":"10251633","points":2,"story_id":10251633,"title":"Learn from AWS Outages with After-Action Reviews","updated_at":"2024-09-19T22:20:48Z","url":"http://adzerk.com/blog/2015/09/team-learning-by-aar/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Legacy code remains accessible to cheaper contractors, expense of overhauling build/deploy in sunsetting legacy app not justifiable. Gives us the ability to direct most of our effort toward the (Hoplon) all-Clojure/Script replacement."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Introducing Elm to a JavaScript Web App"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://noredinktech.tumblr.com/post/126978281075/walkthrough-introducing-elm-to-a-js-web-app"}},"_tags":["comment","author_wooby","story_10081305"],"author":"wooby","children":[10089374],"comment_text":"Legacy code remains accessible to cheaper contractors, expense of overhauling build/deploy in sunsetting legacy app not justifiable. Gives us the ability to direct most of our effort toward the (Hoplon) all-Clojure/Script replacement.","created_at":"2015-08-19T20:50:26Z","created_at_i":1440017426,"objectID":"10088390","parent_id":10087306,"story_id":10081305,"story_title":"Introducing Elm to a JavaScript Web App","story_url":"http://noredinktech.tumblr.com/post/126978281075/walkthrough-introducing-elm-to-a-js-web-app","updated_at":"2024-09-19T22:16:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If you're interested in bringing functional/reactive style code to an existing application, you might also be interested in splint.js: <a href=\"https://github.com/adzerk-oss/splint.js\" rel=\"nofollow\">https://github.com/adzerk-oss/splint.js</a><p>I wrote a blog post about it recently: <a href=\"http://adzerk.com/blog/2015/06/splint-functional-first-aid-jquery/\" rel=\"nofollow\">http://adzerk.com/blog/2015/06/splint-functional-first-aid-j...</a><p>In a nutshell, it's a jQuery-friendly packaging of the ClojureScript runtime and the Javelin cell library, usable in existing applications. You basically write ClojureScript in JavaScript syntax."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Introducing Elm to a JavaScript Web App"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://noredinktech.tumblr.com/post/126978281075/walkthrough-introducing-elm-to-a-js-web-app"}},"_tags":["comment","author_wooby","story_10081305"],"author":"wooby","children":[10087306],"comment_text":"If you're interested in bringing functional/reactive style code to an existing application, you might also be interested in splint.js: <a href=\"https://github.com/adzerk-oss/splint.js\" rel=\"nofollow\">https://github.com/adzerk-oss/splint.js</a><p>I wrote a blog post about it recently: <a href=\"http://adzerk.com/blog/2015/06/splint-functional-first-aid-jquery/\" rel=\"nofollow\">http://adzerk.com/blog/2015/06/splint-functional-first-aid-j...</a><p>In a nutshell, it's a jQuery-friendly packaging of the ClojureScript runtime and the Javelin cell library, usable in existing applications. You basically write ClojureScript in JavaScript syntax.","created_at":"2015-08-19T04:33:11Z","created_at_i":1439958791,"objectID":"10083697","parent_id":10081305,"story_id":10081305,"story_title":"Introducing Elm to a JavaScript Web App","story_url":"http://noredinktech.tumblr.com/post/126978281075/walkthrough-introducing-elm-to-a-js-web-app","updated_at":"2024-09-19T22:15:51Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Raspberry Pi Displays for the Adzerk Office"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2015/07/Raspberry-Pi-Displays-for-the-Adzerk-Office/"}},"_tags":["story","author_wooby","story_10012183"],"author":"wooby","created_at":"2015-08-05T19:23:10Z","created_at_i":1438802590,"num_comments":0,"objectID":"10012183","points":10,"story_id":10012183,"story_text":"","title":"Raspberry Pi Displays for the Adzerk Office","updated_at":"2023-09-06T23:19:00Z","url":"http://adzerk.com/blog/2015/07/Raspberry-Pi-Displays-for-the-Adzerk-Office/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Spreadsheets rule. For ClojureScript there is the Javelin library: <a href=\"https://github.com/tailrecursion/javelin\" rel=\"nofollow\">https://github.com/tailrecursion/javelin</a><p>It has a few novel features like transactional input.<p>We use Javelin for state management in the hoplon.io web framework."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"How to implement a spreadsheet"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://semantic-domain.blogspot.com/2015/07/how-to-implement-spreadsheet.html"}},"_tags":["comment","author_wooby","story_9940126"],"author":"wooby","comment_text":"Spreadsheets rule. For ClojureScript there is the Javelin library: <a href=\"https://github.com/tailrecursion/javelin\" rel=\"nofollow\">https://github.com/tailrecursion/javelin</a><p>It has a few novel features like transactional input.<p>We use Javelin for state management in the hoplon.io web framework.","created_at":"2015-07-24T14:50:01Z","created_at_i":1437749401,"objectID":"9942357","parent_id":9940126,"story_id":9940126,"story_title":"How to implement a spreadsheet","story_url":"http://semantic-domain.blogspot.com/2015/07/how-to-implement-spreadsheet.html","updated_at":"2024-09-19T22:09:11Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Splint.js: ClojureScript first-aid for legacy JavaScript"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2015/06/splint-functional-first-aid-jquery/"}},"_tags":["story","author_wooby","story_9700488"],"author":"wooby","created_at":"2015-06-11T16:03:59Z","created_at_i":1434038639,"num_comments":0,"objectID":"9700488","points":3,"story_id":9700488,"story_text":"","title":"Splint.js: ClojureScript first-aid for legacy JavaScript","updated_at":"2023-09-07T02:57:11Z","url":"http://adzerk.com/blog/2015/06/splint-functional-first-aid-jquery/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Throwing together a weekend project with boot-clj"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adambard.com/blog/throwing-together-worldclassifiedlist/"}},"_tags":["story","author_wooby","story_9685331"],"author":"wooby","created_at":"2015-06-09T11:59:16Z","created_at_i":1433851156,"num_comments":0,"objectID":"9685331","points":2,"story_id":9685331,"story_text":"","title":"Throwing together a weekend project with boot-clj","updated_at":"2024-09-19T22:02:39Z","url":"http://adambard.com/blog/throwing-together-worldclassifiedlist/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Boot 2.0 Released"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2015/05/boot-2.0.0-released/"}},"_tags":["story","author_wooby","story_9634021"],"author":"wooby","created_at":"2015-05-31T12:59:08Z","created_at_i":1433077148,"num_comments":0,"objectID":"9634021","points":4,"story_id":9634021,"story_text":"","title":"Boot 2.0 Released","updated_at":"2023-09-07T02:52:08Z","url":"http://adzerk.com/blog/2015/05/boot-2.0.0-released/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"What I've Learned about Lisp (Clojure)"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://tailrecursion.com/~alan/index.cgi/wiki?name=What+I%27ve+Learned+about+Lisp"}},"_tags":["story","author_wooby","story_9564008"],"author":"wooby","created_at":"2015-05-18T12:30:07Z","created_at_i":1431952207,"num_comments":0,"objectID":"9564008","points":2,"story_id":9564008,"story_text":"","title":"What I've Learned about Lisp (Clojure)","updated_at":"2023-09-07T02:46:43Z","url":"http://tailrecursion.com/~alan/index.cgi/wiki?name=What+I%27ve+Learned+about+Lisp"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Adopt DevOps Practices Organically, but Don\u2019t \"DO DevOps\""},"url":{"matchLevel":"none","matchedWords":[],"value":"http://devops.com/features/adopt-devops-practices-organically-dont-devops/"}},"_tags":["story","author_wooby","story_9256904"],"author":"wooby","created_at":"2015-03-24T14:48:24Z","created_at_i":1427208504,"num_comments":0,"objectID":"9256904","points":1,"story_id":9256904,"story_text":"","title":"Adopt DevOps Practices Organically, but Don\u2019t \"DO DevOps\"","updated_at":"2023-09-07T02:22:23Z","url":"http://devops.com/features/adopt-devops-practices-organically-dont-devops/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I hope that you are mis-representing Rust. I'd be pretty discouraged if I was learning a new language and one of the first interactions I had with a notable community member was a notice of take-down containing neither encouragement nor constructive criticism."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Make a Lisp in Nim"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://hookrace.net/blog/make-a-lisp-in-nim/"}},"_tags":["comment","author_wooby","story_9145360"],"author":"wooby","children":[9147771,9153766,9147687],"comment_text":"I hope that you are mis-representing Rust. I'd be pretty discouraged if I was learning a new language and one of the first interactions I had with a notable community member was a notice of take-down containing neither encouragement nor constructive criticism.","created_at":"2015-03-04T21:57:37Z","created_at_i":1425506257,"objectID":"9147640","parent_id":9147141,"points":null,"story_id":9145360,"story_title":"Make a Lisp in Nim","story_url":"http://hookrace.net/blog/make-a-lisp-in-nim/","updated_at":"2023-09-07T02:13:54Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"GitHub Streaking for Fun and Profit"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2015/02/github-streaking-for-fun-and-profit/"}},"_tags":["story","author_wooby","story_9121459"],"author":"wooby","created_at":"2015-02-27T21:26:22Z","created_at_i":1425072382,"num_comments":0,"objectID":"9121459","points":2,"story_id":9121459,"story_text":"","title":"GitHub Streaking for Fun and Profit","updated_at":"2023-09-07T02:11:46Z","url":"http://adzerk.com/blog/2015/02/github-streaking-for-fun-and-profit/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Unfortunately Clojure start time is about the same regardless of build tool, and it's especially not good on the RPi."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Boot: Getting Started with Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://lionfacelemonface.wordpress.com/2015/01/17/boot-getting-started-with-clojure-in-10-minutes/"}},"_tags":["comment","author_wooby","story_8956313"],"author":"wooby","children":[8974517],"comment_text":"Unfortunately Clojure start time is about the same regardless of build tool, and it's especially not good on the RPi.","created_at":"2015-01-28T23:11:52Z","created_at_i":1422486712,"objectID":"8963160","parent_id":8961530,"points":null,"story_id":8956313,"story_title":"Boot: Getting Started with Clojure","story_url":"https://lionfacelemonface.wordpress.com/2015/01/17/boot-getting-started-with-clojure-in-10-minutes/","updated_at":"2023-09-06T23:23:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The reason we use a different extension is because a build.boot file is not semantically a Clojure file.<p>Clojure's default namespace is 'user'; .boot files run in 'boot.user'. Clojure only automatically refers clojure.core; we refer clojure.core and also boot.core.<p>So, dependencies notwithstanding, Clojure wouldn't be able to make sense of a build.boot file, and we think the .clj extension would be disingenuous.<p>We differ in these ways from .clj because one of our goals was to make it easy to create Clojure applications as single scripts.<p>The downside is users must configure their editors to get syntax highlighting, but we think this is the lesser evil."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Boot: Getting Started with Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://lionfacelemonface.wordpress.com/2015/01/17/boot-getting-started-with-clojure-in-10-minutes/"}},"_tags":["comment","author_wooby","story_8956313"],"author":"wooby","children":[8965652],"comment_text":"The reason we use a different extension is because a build.boot file is not semantically a Clojure file.<p>Clojure's default namespace is 'user'; .boot files run in 'boot.user'. Clojure only automatically refers clojure.core; we refer clojure.core and also boot.core.<p>So, dependencies notwithstanding, Clojure wouldn't be able to make sense of a build.boot file, and we think the .clj extension would be disingenuous.<p>We differ in these ways from .clj because one of our goals was to make it easy to create Clojure applications as single scripts.<p>The downside is users must configure their editors to get syntax highlighting, but we think this is the lesser evil.","created_at":"2015-01-28T14:25:33Z","created_at_i":1422455133,"objectID":"8959931","parent_id":8957971,"story_id":8956313,"story_title":"Boot: Getting Started with Clojure","story_url":"https://lionfacelemonface.wordpress.com/2015/01/17/boot-getting-started-with-clojure-in-10-minutes/","updated_at":"2024-09-19T21:30:21Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"This is a good comparison: <a href=\"https://groups.google.com/d/msg/clojurescript/yxpDGv6RrXQ/FsyxlK9pf44J\" rel=\"nofollow\">https://groups.google.com/d/msg/clojurescript/yxpDGv6RrXQ/Fs...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Boot: Getting Started with Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://lionfacelemonface.wordpress.com/2015/01/17/boot-getting-started-with-clojure-in-10-minutes/"}},"_tags":["comment","author_wooby","story_8956313"],"author":"wooby","comment_text":"This is a good comparison: <a href=\"https://groups.google.com/d/msg/clojurescript/yxpDGv6RrXQ/FsyxlK9pf44J\" rel=\"nofollow\">https://groups.google.com/d/msg/clojurescript/yxpDGv6RrXQ/Fs...</a>","created_at":"2015-01-28T00:22:14Z","created_at_i":1422404534,"objectID":"8957156","parent_id":8956953,"points":null,"story_id":8956313,"story_title":"Boot: Getting Started with Clojure","story_url":"https://lionfacelemonface.wordpress.com/2015/01/17/boot-getting-started-with-clojure-in-10-minutes/","updated_at":"2023-09-06T23:22:45Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Boot: Getting Started with Clojure"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://lionfacelemonface.wordpress.com/2015/01/17/boot-getting-started-with-clojure-in-10-minutes/"}},"_tags":["story","author_wooby","story_8956313"],"author":"wooby","children":[8957971,8961530,8956953,8958520,8958464,8957797],"created_at":"2015-01-27T22:01:03Z","created_at_i":1422396063,"num_comments":15,"objectID":"8956313","points":61,"story_id":8956313,"title":"Boot: Getting Started with Clojure","updated_at":"2023-09-06T23:22:40Z","url":"https://lionfacelemonface.wordpress.com/2015/01/17/boot-getting-started-with-clojure-in-10-minutes/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"This was a great example, and I think you are absolutely right that it\nis the identical in function, if not in form, to mine.<p>Interestingly, in the course of concocting a counter-counter example,\nI came up with this in an effort to show the two dynamic variables we\nstipulate - <i>host</i> and <i>target</i> - were absolutely required:<p><pre><code> #+clj\n (defmacro my-macro []\n (cond\n (contains? *features* :clj) `(some-clojure-thing)\n (contains? *features* :cljs) `~(do (require 'some-ns)\n ((resolve 'some-ns/some-fn)))))\n</code></pre>\nMy hope was to make the point that 'some-ns/some-fn would run in a\ncontext where (<i>features</i> :cljs) is true - as it is in the caller's\n(macro body) environment - which would result in the system attempting\nto run ClojureScript code, which would explode because the macro is\nClojure. Then I realized that require runs load, and load is in the\nmacro body. The load/require available in the environment is\nClojure-specific! Thus, load/require can bind disj :cljs and conj\n:clj before reading and compiling some-ns.<p>My counter-example failed, but did bring me a little closer to the\ntruth - that we only need one dynamic variable, <i>platform</i>. Any\nplatform that has the ability to load code also has an opportunity to\nbind <i>platform</i> and thereby inform macros of target. This simplifies\nthe Feature Macro proposal by half and we are excited to amend it.<p>Our updated cross-platform example becomes:<p><pre><code> (case-platform\n :cljs nil\n :clj (defmacro my-macro []\n (condp = *platform*\n :clj `(some-clojure-thing)\n :cljs `(some-cljs-thing))))\n</code></pre>\nInstead of <i>host</i> and <i>target</i>, we are down to just <i>platform</i>. We\ncontinue to see no need for a <i>features</i> set because of Clojure's\nplatform-symbiosis."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Feature Macros, an Alternative to Feature Expressions in Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo"}},"_tags":["comment","author_wooby","story_8923385"],"author":"wooby","comment_text":"This was a great example, and I think you are absolutely right that it\nis the identical in function, if not in form, to mine.<p>Interestingly, in the course of concocting a counter-counter example,\nI came up with this in an effort to show the two dynamic variables we\nstipulate - <i>host</i> and <i>target</i> - were absolutely required:<p><pre><code> #+clj\n (defmacro my-macro []\n (cond\n (contains? *features* :clj) `(some-clojure-thing)\n (contains? *features* :cljs) `~(do (require 'some-ns)\n ((resolve 'some-ns/some-fn)))))\n</code></pre>\nMy hope was to make the point that 'some-ns/some-fn would run in a\ncontext where (<i>features</i> :cljs) is true - as it is in the caller's\n(macro body) environment - which would result in the system attempting\nto run ClojureScript code, which would explode because the macro is\nClojure. Then I realized that require runs load, and load is in the\nmacro body. The load/require available in the environment is\nClojure-specific! Thus, load/require can bind disj :cljs and conj\n:clj before reading and compiling some-ns.<p>My counter-example failed, but did bring me a little closer to the\ntruth - that we only need one dynamic variable, <i>platform</i>. Any\nplatform that has the ability to load code also has an opportunity to\nbind <i>platform</i> and thereby inform macros of target. This simplifies\nthe Feature Macro proposal by half and we are excited to amend it.<p>Our updated cross-platform example becomes:<p><pre><code> (case-platform\n :cljs nil\n :clj (defmacro my-macro []\n (condp = *platform*\n :clj `(some-clojure-thing)\n :cljs `(some-cljs-thing))))\n</code></pre>\nInstead of <i>host</i> and <i>target</i>, we are down to just <i>platform</i>. We\ncontinue to see no need for a <i>features</i> set because of Clojure's\nplatform-symbiosis.","created_at":"2015-01-22T01:33:42Z","created_at_i":1421890422,"objectID":"8926982","parent_id":8925690,"points":null,"story_id":8923385,"story_title":"Feature Macros, an Alternative to Feature Expressions in Clojure","story_url":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo","updated_at":"2023-09-06T23:19:56Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The proposal is not dependent on boot, only our demonstration of it is."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Feature Macros, an Alternative to Feature Expressions in Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo"}},"_tags":["comment","author_wooby","story_8923385"],"author":"wooby","comment_text":"The proposal is not dependent on boot, only our demonstration of it is.","created_at":"2015-01-21T20:20:04Z","created_at_i":1421871604,"objectID":"8925445","parent_id":8925376,"points":null,"story_id":8923385,"story_title":"Feature Macros, an Alternative to Feature Expressions in Clojure","story_url":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo","updated_at":"2023-09-06T23:19:51Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I agree that Feature Expressions don't add power, because yes, they are semantically equivalent to C preprocessing and orthogonal to the idea of Lisp.<p>What excites us most about Feature Macros is that they <i>do</i> add power. Here is an example of something we think is powerful from the proposal - a cross-platform macro:<p><pre><code> (case-host\n :cljs nil\n :clj (defmacro my-macro [name & body]\n (case-target\n :clj `(.println (System/-out) (str (do ~@body)))\n :cljs `(.log js/console (str (do ~@body))))))</code></pre>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Feature Macros, an Alternative to Feature Expressions in Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo"}},"_tags":["comment","author_wooby","story_8923385"],"author":"wooby","children":[8924545],"comment_text":"I agree that Feature Expressions don't add power, because yes, they are semantically equivalent to C preprocessing and orthogonal to the idea of Lisp.<p>What excites us most about Feature Macros is that they <i>do</i> add power. Here is an example of something we think is powerful from the proposal - a cross-platform macro:<p><pre><code> (case-host\n :cljs nil\n :clj (defmacro my-macro [name & body]\n (case-target\n :clj `(.println (System/-out) (str (do ~@body)))\n :cljs `(.log js/console (str (do ~@body))))))</code></pre>","created_at":"2015-01-21T17:51:31Z","created_at_i":1421862691,"objectID":"8924337","parent_id":8924227,"points":null,"story_id":8923385,"story_title":"Feature Macros, an Alternative to Feature Expressions in Clojure","story_url":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo","updated_at":"2023-09-06T23:19:46Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Ah, point taken. Here is a valid version:<p><pre><code> (case-host\n :clj\n (deftype Foo []\n JvmOnlyInterface\n (aMethod [blah blah] ...))\n :cljs\n (deftype Foo []))\n \n (extend-type Foo\n SomeCommonProtocol\n (someMethod [blah] ...))\n</code></pre>\nIt is true there are countless examples. There are also countless counter-examples. And for the examples that are competitive in terseness, there is already cljx.<p>I personally don't "just want to hack it", especially when it comes to writing portable code. I agree that portability poses subtle new challenges to application design. I just prefer to meet those challenges in a way that is programmable, which syntactic extension is definitely not."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Feature Macros, an Alternative to Feature Expressions in Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo"}},"_tags":["comment","author_wooby","story_8923385"],"author":"wooby","children":[8924227],"comment_text":"Ah, point taken. Here is a valid version:<p><pre><code> (case-host\n :clj\n (deftype Foo []\n JvmOnlyInterface\n (aMethod [blah blah] ...))\n :cljs\n (deftype Foo []))\n \n (extend-type Foo\n SomeCommonProtocol\n (someMethod [blah] ...))\n</code></pre>\nIt is true there are countless examples. There are also countless counter-examples. And for the examples that are competitive in terseness, there is already cljx.<p>I personally don't "just want to hack it", especially when it comes to writing portable code. I agree that portability poses subtle new challenges to application design. I just prefer to meet those challenges in a way that is programmable, which syntactic extension is definitely not.","created_at":"2015-01-21T17:17:02Z","created_at_i":1421860622,"objectID":"8924093","parent_id":8923939,"points":null,"story_id":8923385,"story_title":"Feature Macros, an Alternative to Feature Expressions in Clojure","story_url":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo","updated_at":"2023-09-06T23:19:46Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"What's wrong with:<p><pre><code> (deftype Foo\n SomeCommonProtocol\n (aMethod [blah blah] ...))\n\n (+clj\n (extend-type Foo\n JvmOnlyInterface\n (someMethod [blah] ...)))\n</code></pre>\nCan you come up with another example you consider intractable?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Feature Macros, an Alternative to Feature Expressions in Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo"}},"_tags":["comment","author_wooby","story_8923385"],"author":"wooby","children":[8923939,8923889],"comment_text":"What's wrong with:<p><pre><code> (deftype Foo\n SomeCommonProtocol\n (aMethod [blah blah] ...))\n\n (+clj\n (extend-type Foo\n JvmOnlyInterface\n (someMethod [blah] ...)))\n</code></pre>\nCan you come up with another example you consider intractable?","created_at":"2015-01-21T16:39:02Z","created_at_i":1421858342,"objectID":"8923835","parent_id":8923776,"points":null,"story_id":8923385,"story_title":"Feature Macros, an Alternative to Feature Expressions in Clojure","story_url":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo","updated_at":"2023-09-06T23:19:41Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Feature Macros, an Alternative to Feature Expressions in Clojure"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo"}},"_tags":["story","author_wooby","story_8923385"],"author":"wooby","children":[8923816,8923776,8925386,8925045,8924018,8923499,8923521,8923558],"created_at":"2015-01-21T15:13:31Z","created_at_i":1421853211,"num_comments":32,"objectID":"8923385","points":80,"story_id":8923385,"story_text":"","title":"Feature Macros, an Alternative to Feature Expressions in Clojure","updated_at":"2023-09-06T23:19:41Z","url":"https://github.com/feature-macros/clojurescript/tree/feature-macros/feature-macros-demo"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Wow, that all sounds like an absolute nightmare!<p>Have you taken a look at broccoli[1]? We ran across it after going the Fileset route, but were refreshed to see that it also does a kind of Fileset thing (they call them "trees")[2]. I don't know much more about it other than that it's what's underneath ember-cli, and the Ember people do a lot of good work in tools realm. Anyway, it could be a way for you to realize some of the niceties of the boot approach over in JS-land.<p>1. <a href=\"https://github.com/broccolijs/broccoli\" rel=\"nofollow\">https://github.com/broccolijs/broccoli</a><p>2. <a href=\"http://www.solitr.com/blog/2014/02/broccoli-first-release/\" rel=\"nofollow\">http://www.solitr.com/blog/2014/02/broccoli-first-release/</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Clojure build tool Boot 2.0 RC1 out now"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2014/12/boot2-rc1-out/"}},"_tags":["comment","author_wooby","story_8763060"],"author":"wooby","comment_text":"Wow, that all sounds like an absolute nightmare!<p>Have you taken a look at broccoli[1]? We ran across it after going the Fileset route, but were refreshed to see that it also does a kind of Fileset thing (they call them "trees")[2]. I don't know much more about it other than that it's what's underneath ember-cli, and the Ember people do a lot of good work in tools realm. Anyway, it could be a way for you to realize some of the niceties of the boot approach over in JS-land.<p>1. <a href=\"https://github.com/broccolijs/broccoli\" rel=\"nofollow\">https://github.com/broccolijs/broccoli</a><p>2. <a href=\"http://www.solitr.com/blog/2014/02/broccoli-first-release/\" rel=\"nofollow\">http://www.solitr.com/blog/2014/02/broccoli-first-release/</a>","created_at":"2014-12-18T14:16:10Z","created_at_i":1418912170,"objectID":"8767262","parent_id":8765956,"story_id":8763060,"story_title":"Clojure build tool Boot 2.0 RC1 out now","story_url":"http://adzerk.com/blog/2014/12/boot2-rc1-out/","updated_at":"2024-09-19T21:27:47Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Sure! A minimal Java project with boot might look like:<p><pre><code> mkdir -p boot-java/src\n cd boot-java\n echo 'public class Main{public static void main(String[]args){System.out.println("hi!");}}' > src/Main.java\n boot -s src/ javac jar -m Main\n java -jar target/project.jar</code></pre>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Clojure build tool Boot 2.0 RC1 out now"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2014/12/boot2-rc1-out/"}},"_tags":["comment","author_wooby","story_8763060"],"author":"wooby","comment_text":"Sure! A minimal Java project with boot might look like:<p><pre><code> mkdir -p boot-java/src\n cd boot-java\n echo 'public class Main{public static void main(String[]args){System.out.println("hi!");}}' > src/Main.java\n boot -s src/ javac jar -m Main\n java -jar target/project.jar</code></pre>","created_at":"2014-12-17T18:09:33Z","created_at_i":1418839773,"objectID":"8763411","parent_id":8763225,"points":null,"story_id":8763060,"story_title":"Clojure build tool Boot 2.0 RC1 out now","story_url":"http://adzerk.com/blog/2014/12/boot2-rc1-out/","updated_at":"2023-09-06T23:04:46Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Clojure build tool Boot 2.0 RC1 out now"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2014/12/boot2-rc1-out/"}},"_tags":["story","author_wooby","story_8763060"],"author":"wooby","children":[8765518,8765463,8763225,8763188],"created_at":"2014-12-17T17:06:58Z","created_at_i":1418836018,"num_comments":11,"objectID":"8763060","points":25,"story_id":8763060,"story_text":"","title":"Clojure build tool Boot 2.0 RC1 out now","updated_at":"2023-09-06T23:04:46Z","url":"http://adzerk.com/blog/2014/12/boot2-rc1-out/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"The Genealogy of Eliza"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://elizagen.org/"}},"_tags":["story","author_wooby","story_8551830"],"author":"wooby","children":[8553357],"created_at":"2014-11-03T16:54:44Z","created_at_i":1415033684,"num_comments":2,"objectID":"8551830","points":17,"story_id":8551830,"story_text":"","title":"The Genealogy of Eliza","updated_at":"2024-09-19T21:17:50Z","url":"http://elizagen.org/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"A Dashboard with Hoplon"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://adzerk.com/blog/2014/10/a-dashboard-with-hoplon/"}},"_tags":["story","author_wooby","story_8515430"],"author":"wooby","created_at":"2014-10-27T13:57:48Z","created_at_i":1414418268,"num_comments":0,"objectID":"8515430","points":14,"story_id":8515430,"story_text":"","title":"A Dashboard with Hoplon","updated_at":"2024-09-19T21:14:19Z","url":"http://adzerk.com/blog/2014/10/a-dashboard-with-hoplon/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"CSS, Lisp, names, scopes, predicate dispatch, Cassowary, and a plot to kill CSS"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://hoplon.discoursehosting.net/t/lets-talk-about-layout/223/6?u=alandipert"}},"_tags":["story","author_wooby","story_8075564"],"author":"wooby","created_at":"2014-07-23T17:16:56Z","created_at_i":1406135816,"num_comments":0,"objectID":"8075564","points":2,"story_id":8075564,"story_text":"","title":"CSS, Lisp, names, scopes, predicate dispatch, Cassowary, and a plot to kill CSS","updated_at":"2023-09-06T22:02:00Z","url":"http://hoplon.discoursehosting.net/t/lets-talk-about-layout/223/6?u=alandipert"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Writing the Prince symbol in Unicode"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://parkerhiggins.net/2013/01/writing-the-prince-symbol-in-unicode/"}},"_tags":["story","author_wooby","story_7097223"],"author":"wooby","created_at":"2014-01-21T18:36:25Z","created_at_i":1390329385,"num_comments":0,"objectID":"7097223","points":2,"story_id":7097223,"story_text":"","title":"Writing the Prince symbol in Unicode","updated_at":"2023-09-06T21:58:33Z","url":"http://parkerhiggins.net/2013/01/writing-the-prince-symbol-in-unicode/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Yes, the arithmetic primitives don't support variadic arguments. You can see how + works - and that it only deals with the first two arguments - here: <a href=\"https://github.com/alandipert/gherkin/blob/278354246aebf14b86e05c726cb7a4db31658f56/gherkin#L914\" rel=\"nofollow\">https://github.com/alandipert/gherkin/blob/278354246aebf14b8...</a>. A pull request fixing this would be welcome.<p>In the meantime, for variadic addition, one can do:<p>(load-file "core.gk")\n(reduce + 0 '(1 2 3)) ;=> 6"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"A Lisp interpeter in a thousand lines of Bash"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/alandipert/gherkin/blob/master/gherkin"}},"_tags":["comment","author_wooby","story_7051877"],"author":"wooby","comment_text":"Yes, the arithmetic primitives don't support variadic arguments. You can see how + works - and that it only deals with the first two arguments - here: <a href=\"https://github.com/alandipert/gherkin/blob/278354246aebf14b86e05c726cb7a4db31658f56/gherkin#L914\" rel=\"nofollow\">https://github.com/alandipert/gherkin/blob/278354246aebf14b8...</a>. A pull request fixing this would be welcome.<p>In the meantime, for variadic addition, one can do:<p>(load-file "core.gk")\n(reduce + 0 '(1 2 3)) ;=> 6","created_at":"2014-01-14T19:04:21Z","created_at_i":1389726261,"objectID":"7058976","parent_id":7054720,"story_id":7051877,"story_title":"A Lisp interpeter in a thousand lines of Bash","story_url":"https://github.com/alandipert/gherkin/blob/master/gherkin","updated_at":"2024-09-19T20:25:21Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Bash has many features and for me has been useful to know because it's almost everywhere, but it was never designed to be what it has become. I'm working on escaping it forever with gherkin, a Lisp I wrote in Bash 4.<p>gherkin is still in its early days, but if you're interested in such a thing see <a href=\"https://github.com/alandipert/gherkin\" rel=\"nofollow\">https://github.com/alandipert/gherkin</a> or join us in #gherkin on freenode."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"BASH as a Modern Programming Language [ppt]"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://cdn.oreillystatic.com/en/assets/1/event/95/BASH%20as%20a%20Modern%20Programming%20Language%20Presentation%201.ppt"}},"_tags":["comment","author_wooby","story_6866085"],"author":"wooby","comment_text":"Bash has many features and for me has been useful to know because it's almost everywhere, but it was never designed to be what it has become. I'm working on escaping it forever with gherkin, a Lisp I wrote in Bash 4.<p>gherkin is still in its early days, but if you're interested in such a thing see <a href=\"https://github.com/alandipert/gherkin\" rel=\"nofollow\">https://github.com/alandipert/gherkin</a> or join us in #gherkin on freenode.","created_at":"2013-12-07T16:09:10Z","created_at_i":1386432550,"objectID":"6866697","parent_id":6866085,"story_id":6866085,"story_title":"BASH as a Modern Programming Language [ppt]","story_url":"http://cdn.oreillystatic.com/en/assets/1/event/95/BASH%20as%20a%20Modern%20Programming%20Language%20Presentation%201.ppt","updated_at":"2024-09-19T20:15:01Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I enjoyed the article but was also a little bummed `for` wasn't mentioned at all.<p>Minor nit: `for` is a macro in the clojure.core namespace, not a special form. Special forms in Clojure are these: <a href=\"http://clojure.org/special_forms\" rel=\"nofollow\">http://clojure.org/special_forms</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"List Comprehensions in Eight Lines of Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.hackerschool.com/blog/13-list-comprehensions-in-eight-lines-of-clojure"}},"_tags":["comment","author_wooby","story_4994208"],"author":"wooby","comment_text":"I enjoyed the article but was also a little bummed `for` wasn't mentioned at all.<p>Minor nit: `for` is a macro in the clojure.core namespace, not a special form. Special forms in Clojure are these: <a href=\"http://clojure.org/special_forms\" rel=\"nofollow\">http://clojure.org/special_forms</a>","created_at":"2013-01-02T01:29:04Z","created_at_i":1357090144,"objectID":"4994836","parent_id":4994624,"points":null,"story_id":4994208,"story_title":"List Comprehensions in Eight Lines of Clojure","story_url":"https://www.hackerschool.com/blog/13-list-comprehensions-in-eight-lines-of-clojure","updated_at":"2023-09-06T21:48:51Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"A History of the Sentence \"Buffalo buffalo buffalo buffalo buffalo.\""},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.cse.buffalo.edu/~rapaport/BuffaloBuffalo/buffalobuffalo.html"}},"_tags":["story","author_wooby","story_4893813"],"author":"wooby","children":[4894172],"created_at":"2012-12-09T04:38:57Z","created_at_i":1355027937,"num_comments":1,"objectID":"4893813","points":4,"story_id":4893813,"title":"A History of the Sentence \"Buffalo buffalo buffalo buffalo buffalo.\"","updated_at":"2023-09-08T04:23:19Z","url":"http://www.cse.buffalo.edu/~rapaport/BuffaloBuffalo/buffalobuffalo.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"My point is that they desugar directly to data structures (instantiated in Java, in LispReader) instead of operation forms that evaluate to data structures.<p>See vector creation: <a href=\"https://github.com/clojure/clojure/blob/52633274225370dfb0581c1c6fa1e14a2ec56061/src/jvm/clojure/lang/LispReader.java#L1080\" rel=\"nofollow\">https://github.com/clojure/clojure/blob/52633274225370dfb058...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"A Practical Optional Type System for Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://cloud.github.com/downloads/frenchy64/papers/paper.pdf"}},"_tags":["comment","author_wooby","story_4697634"],"author":"wooby","children":[4705990],"comment_text":"My point is that they desugar directly to data structures (instantiated in Java, in LispReader) instead of operation forms that evaluate to data structures.<p>See vector creation: <a href=\"https://github.com/clojure/clojure/blob/52633274225370dfb0581c1c6fa1e14a2ec56061/src/jvm/clojure/lang/LispReader.java#L1080\" rel=\"nofollow\">https://github.com/clojure/clojure/blob/52633274225370dfb058...</a>","created_at":"2012-10-26T20:33:47Z","created_at_i":1351283627,"objectID":"4704149","parent_id":4701476,"story_id":4697634,"story_title":"A Practical Optional Type System for Clojure","story_url":"http://cloud.github.com/downloads/frenchy64/papers/paper.pdf","updated_at":"2024-09-19T18:54:23Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Your example is nonsense. Clojure's keep is based on lazy sequences instead of concrete lists, and is also optimized for performance.<p>That said, you raise a point that occurred to me recently, and it relates to Clojure's literal representation of data beyond lists and your point about the \"ruined magic\".<p>In most Lisps, the only evaluation semantic is that of the \"operator form\": a list of operator car and arguments cdr, both of which are evaluated themselves.<p>Clojure, however, adds an evaluation semantic for its data literals. Consider this code:<p>{(+ 1 2) (+ 3 4)}<p>It results in the map {3 7}, but where is the \"operator form\" that caused the top-level evaluation?<p>In Lisps with reader macros, an expression like above boils into code resembling (hash-map (+ 1 2) (+ 3 4)), a classic \"operator form\", which is then evaluated.<p>In Clojure, however, which does not provide reader macros, there is no intermediate list representation of the expression accessible to the programmer. Effectively, Clojure adds evaluation semantics to Lisp beyond \"operator forms\": data literals evaluate their contents, and qualify in many ways as \"special forms\".<p>I have run into at least one implication of this design having to do with the structural representation of Clojure code. With a \"classic\" Lisp, an IDE or editor is empowered to present to the user any representation of the code, and can convert it to Lisp expressions arbitrarily the same way reader macros do.<p>With Clojure, this type of \"skinning\" is harder, because IDE-like navigation of data implies ordering. The ordering exists in the character-wise representation of a map like {3 4} but not in its evaluated counterpart."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"A Practical Optional Type System for Clojure"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://cloud.github.com/downloads/frenchy64/papers/paper.pdf"}},"_tags":["comment","author_wooby","story_4697634"],"author":"wooby","children":[4701476],"comment_text":"Your example is nonsense. Clojure's keep is based on lazy sequences instead of concrete lists, and is also optimized for performance.<p>That said, you raise a point that occurred to me recently, and it relates to Clojure's literal representation of data beyond lists and your point about the \"ruined magic\".<p>In most Lisps, the only evaluation semantic is that of the \"operator form\": a list of operator car and arguments cdr, both of which are evaluated themselves.<p>Clojure, however, adds an evaluation semantic for its data literals. Consider this code:<p>{(+ 1 2) (+ 3 4)}<p>It results in the map {3 7}, but where is the \"operator form\" that caused the top-level evaluation?<p>In Lisps with reader macros, an expression like above boils into code resembling (hash-map (+ 1 2) (+ 3 4)), a classic \"operator form\", which is then evaluated.<p>In Clojure, however, which does not provide reader macros, there is no intermediate list representation of the expression accessible to the programmer. Effectively, Clojure adds evaluation semantics to Lisp beyond \"operator forms\": data literals evaluate their contents, and qualify in many ways as \"special forms\".<p>I have run into at least one implication of this design having to do with the structural representation of Clojure code. With a \"classic\" Lisp, an IDE or editor is empowered to present to the user any representation of the code, and can convert it to Lisp expressions arbitrarily the same way reader macros do.<p>With Clojure, this type of \"skinning\" is harder, because IDE-like navigation of data implies ordering. The ordering exists in the character-wise representation of a map like {3 4} but not in its evaluated counterpart.","created_at":"2012-10-25T19:21:53Z","created_at_i":1351192913,"objectID":"4699056","parent_id":4697874,"story_id":4697634,"story_title":"A Practical Optional Type System for Clojure","story_url":"http://cloud.github.com/downloads/frenchy64/papers/paper.pdf","updated_at":"2024-09-19T19:01:13Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Write Your Own Compiler in 20 Minutes"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://vimeo.com/51721992"}},"_tags":["story","author_wooby","story_4674910"],"author":"wooby","created_at":"2012-10-19T18:47:31Z","created_at_i":1350672451,"num_comments":0,"objectID":"4674910","points":5,"story_id":4674910,"story_text":"","title":"Write Your Own Compiler in 20 Minutes","updated_at":"2024-09-19T18:58:37Z","url":"https://vimeo.com/51721992"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"MMO in loving tribute to xkcd-1110"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://1110.n01se.net/"}},"_tags":["story","author_wooby","story_4576140"],"author":"wooby","children":[4576186,4576862,4577248,4576420,4576684,4576476,4576303,4576883,4580015,4578652,4576541,4576227,4579827,4577021,4576404,4576585,4577302,4576451,4577097,4576485,4577214,4576165,4577387,4577462,4576353,4576593],"created_at":"2012-09-26T15:33:41Z","created_at_i":1348673621,"num_comments":61,"objectID":"4576140","points":204,"story_id":4576140,"story_text":"","title":"MMO in loving tribute to xkcd-1110","updated_at":"2024-09-19T18:59:07Z","url":"http://1110.n01se.net/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Clojure on the Raspberry Pi"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://pi.tailrecursion.com/"}},"_tags":["story","author_wooby","story_4493141"],"author":"wooby","created_at":"2012-09-08T15:42:56Z","created_at_i":1347118976,"num_comments":0,"objectID":"4493141","points":2,"story_id":4493141,"story_text":"","title":"Clojure on the Raspberry Pi","updated_at":"2024-09-19T18:52:58Z","url":"http://pi.tailrecursion.com/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Learn the basics of programming using LOLCODE."},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.youtube.com/watch?v=NkmJcgbXkJA"}},"_tags":["story","author_wooby","story_4486623"],"author":"wooby","created_at":"2012-09-06T22:28:16Z","created_at_i":1346970496,"num_comments":0,"objectID":"4486623","points":1,"story_id":4486623,"story_text":"","title":"Learn the basics of programming using LOLCODE.","updated_at":"2024-09-19T18:52:21Z","url":"http://www.youtube.com/watch?v=NkmJcgbXkJA"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Rich has a CS master's degree."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Rich Hickey: Deconstructing the Database"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.youtube.com/watch?v=Cym4TZwTCNU"}},"_tags":["comment","author_wooby","story_4444793"],"author":"wooby","children":[4447035],"comment_text":"Rich has a CS master's degree.","created_at":"2012-08-29T02:01:53Z","created_at_i":1346205713,"objectID":"4446745","parent_id":4446668,"points":null,"story_id":4444793,"story_title":"Rich Hickey: Deconstructing the Database","story_url":"https://www.youtube.com/watch?v=Cym4TZwTCNU","updated_at":"2023-09-06T21:03:23Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Also using underscore, with sortBy:<p><pre><code> _.chain(people)\n .sortBy(function(person) { \n return person.firstName.length + person.lastName.length; })\n .last()\n .value()</code></pre>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Learn from Haskell - Functional, Reusable JavaScript"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://seanhess.github.com/2012/02/20/functional_javascript.html"}},"_tags":["comment","author_wooby","story_3614099"],"author":"wooby","children":[3615439],"comment_text":"Also using underscore, with sortBy:<p><pre><code> _.chain(people)\n .sortBy(function(person) { \n return person.firstName.length + person.lastName.length; })\n .last()\n .value()</code></pre>","created_at":"2012-02-21T04:12:41Z","created_at_i":1329797561,"objectID":"3615192","parent_id":3614613,"points":null,"story_id":3614099,"story_title":"Learn from Haskell - Functional, Reusable JavaScript","story_url":"http://seanhess.github.com/2012/02/20/functional_javascript.html","updated_at":"2023-09-06T21:10:32Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"That, and they handle transcoding to all kinds of different formats for us."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"All Conj 2011 Videos Available"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://clojure.com/blog/2012/02/20/all-conj-2011-videos-available.html"}},"_tags":["comment","author_wooby","story_3613634"],"author":"wooby","children":[3614216],"comment_text":"That, and they handle transcoding to all kinds of different formats for us.","created_at":"2012-02-20T22:14:59Z","created_at_i":1329776099,"objectID":"3614186","parent_id":3614060,"points":null,"story_id":3613634,"story_title":"All Conj 2011 Videos Available","story_url":"http://clojure.com/blog/2012/02/20/all-conj-2011-videos-available.html","updated_at":"2023-09-06T21:10:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Rich Hickey's \"Simple Made Easy\" talk from Strange Loop is filled with great ammo: <a href=\"http://www.infoq.com/presentations/Simple-Made-Easy\" rel=\"nofollow\">http://www.infoq.com/presentations/Simple-Made-Easy</a><p>Personally, it gave me new vocabulary and conceptual tools for explaining why I like Clojure so much."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"ClojureScript One"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://clojurescriptone.com/"}},"_tags":["comment","author_wooby","story_3453208"],"author":"wooby","comment_text":"Rich Hickey's \"Simple Made Easy\" talk from Strange Loop is filled with great ammo: <a href=\"http://www.infoq.com/presentations/Simple-Made-Easy\" rel=\"nofollow\">http://www.infoq.com/presentations/Simple-Made-Easy</a><p>Personally, it gave me new vocabulary and conceptual tools for explaining why I like Clojure so much.","created_at":"2012-01-11T22:54:12Z","created_at_i":1326322452,"objectID":"3454091","parent_id":3453674,"points":null,"story_id":3453208,"story_title":"ClojureScript One","story_url":"http://clojurescriptone.com/","updated_at":"2023-09-06T20:57:19Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Of Aviation Crashes and Software Bugs"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://duartes.org/gustavo/blog/post/of-aviation-crashes-and-software-bugs"}},"_tags":["story","author_wooby","story_3250632"],"author":"wooby","children":[3250730],"created_at":"2011-11-18T04:43:42Z","created_at_i":1321591422,"num_comments":1,"objectID":"3250632","points":2,"story_id":3250632,"story_text":"","title":"Of Aviation Crashes and Software Bugs","updated_at":"2024-09-19T18:06:40Z","url":"http://duartes.org/gustavo/blog/post/of-aviation-crashes-and-software-bugs"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Original Spacewar! on JavaScript PDP-1 emulator"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://spacewar.oversigma.com/html5/"}},"_tags":["story","author_wooby","story_3128919"],"author":"wooby","created_at":"2011-10-19T05:51:59Z","created_at_i":1319003519,"num_comments":0,"objectID":"3128919","points":4,"story_id":3128919,"story_text":"","title":"Original Spacewar! on JavaScript PDP-1 emulator","updated_at":"2023-09-06T20:30:31Z","url":"http://spacewar.oversigma.com/html5/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Do aliens have LISP?"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.quora.com/Do-aliens-have-LISP"}},"_tags":["story","author_wooby","story_2940060"],"author":"wooby","created_at":"2011-08-30T04:01:54Z","created_at_i":1314676914,"num_comments":0,"objectID":"2940060","points":6,"story_id":2940060,"story_text":"","title":"Do aliens have LISP?","updated_at":"2024-09-19T17:54:40Z","url":"http://www.quora.com/Do-aliens-have-LISP"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"The Evolution of Lisp"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.dreamsongs.com/Files/HOPL2-Uncut.pdf"}},"_tags":["story","author_wooby","story_2885316"],"author":"wooby","created_at":"2011-08-15T03:21:50Z","created_at_i":1313378510,"num_comments":0,"objectID":"2885316","points":4,"story_id":2885316,"story_text":"","title":"The Evolution of Lisp","updated_at":"2023-09-06T20:20:15Z","url":"http://www.dreamsongs.com/Files/HOPL2-Uncut.pdf"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Processing arrays using CPS"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.n01se.net/?p=362"}},"_tags":["story","author_wooby","story_2848187"],"author":"wooby","created_at":"2011-08-04T23:08:45Z","created_at_i":1312499325,"num_comments":0,"objectID":"2848187","points":2,"story_id":2848187,"story_text":"","title":"Processing arrays using CPS","updated_at":"2024-09-19T17:53:23Z","url":"http://blog.n01se.net/?p=362"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It's a one-time cost, but we're also not done improving Closure Compiler's ability to minify core.<p>There's a lot of Closure Compiler-specific metadata we're not leveraging yet, and our goal is to reduce the baseline to much, much less."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Introducing ClojureScript"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://clojure.com/blog/2011/07/22/introducing-clojurescript.html"}},"_tags":["comment","author_wooby","story_2795803"],"author":"wooby","comment_text":"It's a one-time cost, but we're also not done improving Closure Compiler's ability to minify core.<p>There's a lot of Closure Compiler-specific metadata we're not leveraging yet, and our goal is to reduce the baseline to much, much less.","created_at":"2011-07-23T06:05:46Z","created_at_i":1311401146,"objectID":"2796309","parent_id":2796035,"story_id":2795803,"story_title":"Introducing ClojureScript","story_url":"http://clojure.com/blog/2011/07/22/introducing-clojurescript.html","updated_at":"2024-09-19T17:55:35Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"WebRTC"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://sites.google.com/site/webrtc/"}},"_tags":["story","author_wooby","story_2749150"],"author":"wooby","children":[2749179,2749940,2749538,2749274,2749956,2749360,2749288,2749300],"created_at":"2011-07-11T01:43:45Z","created_at_i":1310348625,"num_comments":15,"objectID":"2749150","points":54,"story_id":2749150,"title":"WebRTC","updated_at":"2024-09-19T17:50:57Z","url":"https://sites.google.com/site/webrtc/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Do-it-Yourself DNA extraction"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://vimeo.com/23146278"}},"_tags":["story","author_wooby","story_2745083"],"author":"wooby","created_at":"2011-07-09T05:22:57Z","created_at_i":1310188977,"num_comments":0,"objectID":"2745083","points":3,"story_id":2745083,"story_text":"","title":"Do-it-Yourself DNA extraction","updated_at":"2024-09-19T17:50:34Z","url":"http://vimeo.com/23146278"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Implementing Monads in Emacs Lisp"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://dorophone.blogspot.com/2011/04/deep-emacs-part-1.html"}},"_tags":["story","author_wooby","story_2465303"],"author":"wooby","created_at":"2011-04-20T04:57:20Z","created_at_i":1303275440,"num_comments":0,"objectID":"2465303","points":3,"story_id":2465303,"story_text":"","title":"Implementing Monads in Emacs Lisp","updated_at":"2024-09-19T17:42:26Z","url":"http://dorophone.blogspot.com/2011/04/deep-emacs-part-1.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Why BASIC?"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.basic256.org/whybasic"}},"_tags":["story","author_wooby","story_2454014"],"author":"wooby","created_at":"2011-04-16T14:35:59Z","created_at_i":1302964559,"num_comments":0,"objectID":"2454014","points":1,"story_id":2454014,"story_text":"","title":"Why BASIC?","updated_at":"2024-09-19T17:41:25Z","url":"http://www.basic256.org/whybasic"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"The autobiography of SAIL "},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.inwap.com/pdp10/sail-shutdown.txt"}},"_tags":["story","author_wooby","story_2215223"],"author":"wooby","created_at":"2011-02-14T04:11:29Z","created_at_i":1297656689,"num_comments":0,"objectID":"2215223","points":2,"story_id":2215223,"story_text":"","title":"The autobiography of SAIL ","updated_at":"2024-09-19T17:29:56Z","url":"http://www.inwap.com/pdp10/sail-shutdown.txt"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The episode \"The Thinking Machine\" of the Nova miniseries \"The Machine That Changed the World\" is my favorite introduction to the history of AI up until around AI winter.<p>The episode, along with four others, are available here: <a href=\"http://waxy.org/2008/06/the_machine_that_changed_the_world_the_thinking_machine/\" rel=\"nofollow\">http://waxy.org/2008/06/the_machine_that_changed_the_world_t...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Peter Norvig: The machine age"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.nypost.com/p/news/opinion/opedcolumnists/the_machine_age_tM7xPAv4pI4JslK0M1JtxI"}},"_tags":["comment","author_wooby","story_2214534"],"author":"wooby","comment_text":"The episode \"The Thinking Machine\" of the Nova miniseries \"The Machine That Changed the World\" is my favorite introduction to the history of AI up until around AI winter.<p>The episode, along with four others, are available here: <a href=\"http://waxy.org/2008/06/the_machine_that_changed_the_world_the_thinking_machine/\" rel=\"nofollow\">http://waxy.org/2008/06/the_machine_that_changed_the_world_t...</a>","created_at":"2011-02-14T03:41:54Z","created_at_i":1297654914,"objectID":"2215140","parent_id":2214534,"story_id":2214534,"story_title":"Peter Norvig: The machine age","story_url":"http://www.nypost.com/p/news/opinion/opedcolumnists/the_machine_age_tM7xPAv4pI4JslK0M1JtxI","updated_at":"2024-09-19T17:29:56Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Three Questions About Each Bug You Find"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.multicians.org/thvv/threeq.html"}},"_tags":["story","author_wooby","story_2157075"],"author":"wooby","created_at":"2011-01-30T01:50:34Z","created_at_i":1296352234,"num_comments":0,"objectID":"2157075","points":3,"story_id":2157075,"story_text":"","title":"Three Questions About Each Bug You Find","updated_at":"2023-09-06T19:15:40Z","url":"http://www.multicians.org/thvv/threeq.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Using Haskell\u2019s \u2018newtype\u2019 in C"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.nelhage.com/2010/10/using-haskells-newtype-in-c/"}},"_tags":["story","author_wooby","story_2130133"],"author":"wooby","children":[2130376],"created_at":"2011-01-22T07:28:17Z","created_at_i":1295681297,"num_comments":3,"objectID":"2130133","points":27,"story_id":2130133,"story_text":"","title":"Using Haskell\u2019s \u2018newtype\u2019 in C","updated_at":"2024-09-19T17:28:56Z","url":"http://blog.nelhage.com/2010/10/using-haskells-newtype-in-c/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Reversible Computation"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://strangepaths.com/reversible-computation/2008/01/20/en/"}},"_tags":["story","author_wooby","story_2065803"],"author":"wooby","created_at":"2011-01-04T04:02:43Z","created_at_i":1294113763,"num_comments":0,"objectID":"2065803","points":2,"story_id":2065803,"title":"Reversible Computation","updated_at":"2024-09-19T17:25:38Z","url":"http://strangepaths.com/reversible-computation/2008/01/20/en/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"The Two Things"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.csun.edu/~dgw61315/thetwothings.html"}},"_tags":["story","author_wooby","story_1903408"],"author":"wooby","created_at":"2010-11-14T15:55:44Z","created_at_i":1289750144,"num_comments":0,"objectID":"1903408","points":3,"story_id":1903408,"story_text":"","title":"The Two Things","updated_at":"2024-09-19T17:17:36Z","url":"http://www.csun.edu/~dgw61315/thetwothings.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"HAKMEM"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://home.pipeline.com/~hbaker1/hakmem/hakmem.html"}},"_tags":["story","author_wooby","story_1845443"],"author":"wooby","created_at":"2010-10-28T23:41:32Z","created_at_i":1288309292,"num_comments":0,"objectID":"1845443","points":2,"story_id":1845443,"story_text":"","title":"HAKMEM","updated_at":"2023-09-06T20:13:22Z","url":"http://home.pipeline.com/~hbaker1/hakmem/hakmem.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Cyberwars: Already Underway with No Geneva Conventions to Guide Them"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.buffalo.edu/news/11862"}},"_tags":["story","author_wooby","story_1791378"],"author":"wooby","created_at":"2010-10-14T16:01:33Z","created_at_i":1287072093,"num_comments":0,"objectID":"1791378","points":1,"story_id":1791378,"story_text":"","title":"Cyberwars: Already Underway with No Geneva Conventions to Guide Them","updated_at":"2024-09-19T17:18:00Z","url":"http://www.buffalo.edu/news/11862"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Clojure Concurrency Tutorial"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.pluralsight-training.net/microsoft/olt/course/toc.aspx?n=clojure-concurrency-tutorial"}},"_tags":["story","author_wooby","story_1766527"],"author":"wooby","created_at":"2010-10-07T01:34:24Z","created_at_i":1286415264,"num_comments":0,"objectID":"1766527","points":2,"story_id":1766527,"story_text":"","title":"Clojure Concurrency Tutorial","updated_at":"2024-09-19T17:15:39Z","url":"http://www.pluralsight-training.net/microsoft/olt/course/toc.aspx?n=clojure-concurrency-tutorial"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"A DIY Telepresence Robot"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://spectrum.ieee.org/geek-life/hands-on/a-diy-telepresence-robot/"}},"_tags":["story","author_wooby","story_1758601"],"author":"wooby","created_at":"2010-10-05T04:31:59Z","created_at_i":1286253119,"num_comments":0,"objectID":"1758601","points":2,"story_id":1758601,"story_text":"","title":"A DIY Telepresence Robot","updated_at":"2024-09-19T17:14:51Z","url":"http://spectrum.ieee.org/geek-life/hands-on/a-diy-telepresence-robot/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Fun with Clojure: Turning Cats into Dogs in Hanoi"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://jkkramer.wordpress.com/2010/08/27/fun-with-clojure%C2%A0turning-cats-into-dogs-in-hanoi/"}},"_tags":["story","author_wooby","story_1753108"],"author":"wooby","children":[1753497,1754194,1753332],"created_at":"2010-10-03T17:25:53Z","created_at_i":1286126753,"num_comments":7,"objectID":"1753108","points":40,"story_id":1753108,"story_text":"","title":"Fun with Clojure: Turning Cats into Dogs in Hanoi","updated_at":"2024-09-19T17:14:13Z","url":"http://jkkramer.wordpress.com/2010/08/27/fun-with-clojure%C2%A0turning-cats-into-dogs-in-hanoi/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"\"We're an XML shop\": who says that?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"What's frustrating with XML?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://stackoverflow.com/questions/3536893/whats-frustrating-with-xml"}},"_tags":["comment","author_wooby","story_1622477"],"author":"wooby","comment_text":"\"We're an XML shop\": who says that?","created_at":"2010-08-21T16:35:26Z","created_at_i":1282408526,"objectID":"1623154","parent_id":1622477,"story_id":1622477,"story_title":"What's frustrating with XML?","story_url":"http://stackoverflow.com/questions/3536893/whats-frustrating-with-xml","updated_at":"2024-09-19T17:09:01Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"A friend and I have a WIP lisp compiler targeting JS that uses this <a href=\"http://github.com/alandipert/pantless\" rel=\"nofollow\">http://github.com/alandipert/pantless</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Jison"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://zaach.github.com/jison/docs/"}},"_tags":["comment","author_wooby","story_1621714"],"author":"wooby","comment_text":"A friend and I have a WIP lisp compiler targeting JS that uses this <a href=\"http://github.com/alandipert/pantless\" rel=\"nofollow\">http://github.com/alandipert/pantless</a>","created_at":"2010-08-21T01:31:01Z","created_at_i":1282354261,"objectID":"1622047","parent_id":1621714,"story_id":1621714,"story_title":"Jison","story_url":"http://zaach.github.com/jison/docs/","updated_at":"2024-09-19T17:08:55Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"You might check out bashreduce: <a href=\"http://github.com/erikfrey/bashreduce\" rel=\"nofollow\">http://github.com/erikfrey/bashreduce</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Sorting massive text files?"}},"_tags":["comment","author_wooby","story_1603381"],"author":"wooby","comment_text":"You might check out bashreduce: <a href=\"http://github.com/erikfrey/bashreduce\" rel=\"nofollow\">http://github.com/erikfrey/bashreduce</a>","created_at":"2010-08-14T16:20:50Z","created_at_i":1281802850,"objectID":"1603517","parent_id":1603381,"story_id":1603381,"story_title":"Ask HN: Sorting massive text files?","updated_at":"2024-09-19T17:07:05Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Automated Antenna Design"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://ti.arc.nasa.gov/projects/esg/research/antenna.htm"}},"_tags":["story","author_wooby","story_1583845"],"author":"wooby","created_at":"2010-08-07T17:03:42Z","created_at_i":1281200622,"num_comments":0,"objectID":"1583845","points":2,"story_id":1583845,"story_text":"","title":"Automated Antenna Design","updated_at":"2024-09-19T17:13:28Z","url":"http://ti.arc.nasa.gov/projects/esg/research/antenna.htm"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Unlikelier considering the Stinger is filled with oddball proprietary batteries, and a canister of argon (for cooling the seeker head right before launch) that I've been told leaks over time."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The War Logs: An archive of classified military documents"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.nytimes.com/interactive/world/war-logs.html"}},"_tags":["comment","author_wooby","story_1546500"],"author":"wooby","children":[1547014],"comment_text":"Unlikelier considering the Stinger is filled with oddball proprietary batteries, and a canister of argon (for cooling the seeker head right before launch) that I've been told leaks over time.","created_at":"2010-07-26T02:59:07Z","created_at_i":1280113147,"objectID":"1546982","parent_id":1546924,"story_id":1546500,"story_title":"The War Logs: An archive of classified military documents","story_url":"http://www.nytimes.com/interactive/world/war-logs.html","updated_at":"2024-09-19T17:09:30Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Incanter now has standalone executables"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://data-sorcery.org/2010/06/12/incanter-executables/"}},"_tags":["story","author_wooby","story_1426729"],"author":"wooby","children":[1426959],"created_at":"2010-06-13T00:00:33Z","created_at_i":1276387233,"num_comments":1,"objectID":"1426729","points":25,"story_id":1426729,"story_text":"","title":"Incanter now has standalone executables","updated_at":"2024-09-19T17:01:10Z","url":"http://data-sorcery.org/2010/06/12/incanter-executables/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If you're into this article, you might like \"Guns, Germs and Steel\" by Jared Diamond. I'm reading it on the recommendation of my favorite anthropology professor, and it's great."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Humans: Why They Triumphed"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://online.wsj.com/article/SB20001424052748703691804575254533386933138.html"}},"_tags":["comment","author_wooby","story_1374718"],"author":"wooby","comment_text":"If you're into this article, you might like \"Guns, Germs and Steel\" by Jared Diamond. I'm reading it on the recommendation of my favorite anthropology professor, and it's great.","created_at":"2010-05-24T19:33:38Z","created_at_i":1274729618,"objectID":"1375479","parent_id":1374718,"points":null,"story_id":1374718,"story_title":"Humans: Why They Triumphed","story_url":"http://online.wsj.com/article/SB20001424052748703691804575254533386933138.html","updated_at":"2023-09-06T19:32:19Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Clojure's Approach to Polymorphism"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.developer.com/features/article.phpr/3878656/Clojures-Approach-to-Polymorphism-Method-Dispatch.htm"}},"_tags":["story","author_wooby","story_1296423"],"author":"wooby","children":[1296771],"created_at":"2010-04-26T22:33:23Z","created_at_i":1272321203,"num_comments":1,"objectID":"1296423","points":22,"story_id":1296423,"story_text":"","title":"Clojure's Approach to Polymorphism","updated_at":"2024-09-19T17:03:40Z","url":"http://www.developer.com/features/article.phpr/3878656/Clojures-Approach-to-Polymorphism-Method-Dispatch.htm"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Shepard's Tones"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.cs.ubc.ca/nest/imager/contributions/flinn/Illusions/ST/st.html"}},"_tags":["story","author_wooby","story_1230894"],"author":"wooby","created_at":"2010-03-31T03:58:28Z","created_at_i":1270007908,"num_comments":0,"objectID":"1230894","points":1,"story_id":1230894,"story_text":"","title":"Shepard's Tones","updated_at":"2024-09-19T16:57:15Z","url":"http://www.cs.ubc.ca/nest/imager/contributions/flinn/Illusions/ST/st.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Zen and the Art of Motorcycle Maintenance"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Interesting (Non software) books?"}},"_tags":["comment","author_wooby","story_1226736"],"author":"wooby","children":[1227086,1228877,1227366,1228381,1227352],"comment_text":"Zen and the Art of Motorcycle Maintenance","created_at":"2010-03-29T16:03:40Z","created_at_i":1269878620,"objectID":"1226762","parent_id":1226736,"story_id":1226736,"story_title":"Ask HN: Interesting (Non software) books?","updated_at":"2024-09-19T16:56:54Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Sure. You can do it with a regular function, for an example see page 12 of the upcoming Joy of Clojure book: <a href=\"http://www.manning.com/fogus/Fogus_MEAP_Ch1.pdf\" rel=\"nofollow\">http://www.manning.com/fogus/Fogus_MEAP_Ch1.pdf</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Fast Clojure Vectors and Multidimensional Arrays"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://measuringmeasures.com/blog/2010/3/27/fast-clojure-vectors-and-multidimensional-arrays.html"}},"_tags":["comment","author_wooby","story_1223288"],"author":"wooby","comment_text":"Sure. You can do it with a regular function, for an example see page 12 of the upcoming Joy of Clojure book: <a href=\"http://www.manning.com/fogus/Fogus_MEAP_Ch1.pdf\" rel=\"nofollow\">http://www.manning.com/fogus/Fogus_MEAP_Ch1.pdf</a>","created_at":"2010-03-27T19:46:32Z","created_at_i":1269719192,"objectID":"1223518","parent_id":1223492,"story_id":1223288,"story_title":"Fast Clojure Vectors and Multidimensional Arrays","story_url":"http://measuringmeasures.com/blog/2010/3/27/fast-clojure-vectors-and-multidimensional-arrays.html","updated_at":"2024-09-19T16:56:38Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Whoops, it's supposed to be x11proto-print-dev. I've updated the deps in the README, should build no problem on 9.10 now."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"NCSA Mosaic on GitHub"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/alandipert/ncsa-mosaic"}},"_tags":["comment","author_wooby","story_1175136"],"author":"wooby","comment_text":"Whoops, it's supposed to be x11proto-print-dev. I've updated the deps in the README, should build no problem on 9.10 now.","created_at":"2010-03-09T01:50:21Z","created_at_i":1268099421,"objectID":"1177210","parent_id":1175799,"points":null,"story_id":1175136,"story_title":"NCSA Mosaic on GitHub","story_url":"http://github.com/alandipert/ncsa-mosaic","updated_at":"2023-09-06T19:16:13Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"NCSA Mosaic on GitHub"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/alandipert/ncsa-mosaic"}},"_tags":["story","author_wooby","story_1175136"],"author":"wooby","children":[1175365,1175196,1175328,1175195,1175776,1175799],"created_at":"2010-03-08T11:11:20Z","created_at_i":1268046680,"num_comments":10,"objectID":"1175136","points":47,"story_id":1175136,"story_text":"","title":"NCSA Mosaic on GitHub","updated_at":"2023-09-06T19:16:04Z","url":"http://github.com/alandipert/ncsa-mosaic"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"The Doctor's Dilemma"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www-formal.stanford.edu/jmc/docdil.html"}},"_tags":["story","author_wooby","story_1153626"],"author":"wooby","created_at":"2010-02-26T17:43:51Z","created_at_i":1267206231,"num_comments":0,"objectID":"1153626","points":5,"story_id":1153626,"story_text":"","title":"The Doctor's Dilemma","updated_at":"2023-09-06T19:14:08Z","url":"http://www-formal.stanford.edu/jmc/docdil.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The US military has a standardized test called the DLAB (Defense Language Aptitude Battery) that tests not your ability to use a particular language, but to learn a new, fictitious language - much like this programming test."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The Non-Programming Programmer"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.codinghorror.com/blog/2010/02/the-nonprogramming-programmer.html"}},"_tags":["comment","author_wooby","story_1142398"],"author":"wooby","comment_text":"The US military has a standardized test called the DLAB (Defense Language Aptitude Battery) that tests not your ability to use a particular language, but to learn a new, fictitious language - much like this programming test.","created_at":"2010-02-22T15:00:50Z","created_at_i":1266850850,"objectID":"1142766","parent_id":1142685,"story_id":1142398,"story_title":"The Non-Programming Programmer","story_url":"http://www.codinghorror.com/blog/2010/02/the-nonprogramming-programmer.html","updated_at":"2024-09-19T16:52:35Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Compile-time metaprogramming for PHP with no performance penalty"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/jaz303/phpx"}},"_tags":["story","author_wooby","story_1109632"],"author":"wooby","created_at":"2010-02-08T13:15:03Z","created_at_i":1265634903,"num_comments":0,"objectID":"1109632","points":1,"story_id":1109632,"story_text":"","title":"Compile-time metaprogramming for PHP with no performance penalty","updated_at":"2024-09-19T16:49:21Z","url":"http://github.com/jaz303/phpx"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Here's another throwback: <a href=\"http://web.archive.org/web/20011024015856/www.apple.com/ipod/\" rel=\"nofollow\">http://web.archive.org/web/20011024015856/www.apple.com/ipod...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Apple's New Thing (iPod) - Oct. 2001"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://forums.macrumors.com/showthread.php?t=500"}},"_tags":["comment","author_wooby","story_1085135"],"author":"wooby","comment_text":"Here's another throwback: <a href=\"http://web.archive.org/web/20011024015856/www.apple.com/ipod/\" rel=\"nofollow\">http://web.archive.org/web/20011024015856/www.apple.com/ipod...</a>","created_at":"2010-01-29T07:09:24Z","created_at_i":1264748964,"objectID":"1086016","parent_id":1085398,"story_id":1085135,"story_title":"Apple's New Thing (iPod) - Oct. 2001","story_url":"http://forums.macrumors.com/showthread.php?t=500","updated_at":"2024-09-19T16:54:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"As a friend of mine pointed out, how is this possible? Shouldn't fraudulent numbers also follow Benford's law?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Why 30.1% of numbers start with 1"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.dspguide.com/ch34/1.htm"}},"_tags":["comment","author_wooby","story_1076405"],"author":"wooby","children":[1076781,1076948,1076857],"comment_text":"As a friend of mine pointed out, how is this possible? Shouldn't fraudulent numbers also follow Benford's law?","created_at":"2010-01-26T01:21:38Z","created_at_i":1264468898,"objectID":"1076753","parent_id":1076488,"story_id":1076405,"story_title":"Why 30.1% of numbers start with 1","story_url":"http://www.dspguide.com/ch34/1.htm","updated_at":"2024-09-19T16:53:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I too had done diverse programming until Scala, and the language introduced me to the functional paradigms which I now hold very dear. That being said, I was completely - and unprecedentedly - blown away by Clojure, as, in the Perlis-quote tradition, it completely changed the way I think about programming in ways that Scala did not. I've since decided that if I was going to master a JVM lang, it would be Clojure, and I've had the most fun programming Clojure since my Commodore Basic days.<p>If you haven't seen any of the Rich Hickey videos on InfoQ, particularly \"Are We There Yet,\" I can't recommend seeing them more. It sounds like you might be following a similar path to mine, and I can't recommend Clojure more highly.<p>In the meantime though, enjoy your Scala trip - I did! :)"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Scala: A Postfunctional Language"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.scala-lang.org/node/4960"}},"_tags":["comment","author_wooby","story_1068781"],"author":"wooby","comment_text":"I too had done diverse programming until Scala, and the language introduced me to the functional paradigms which I now hold very dear. That being said, I was completely - and unprecedentedly - blown away by Clojure, as, in the Perlis-quote tradition, it completely changed the way I think about programming in ways that Scala did not. I've since decided that if I was going to master a JVM lang, it would be Clojure, and I've had the most fun programming Clojure since my Commodore Basic days.<p>If you haven't seen any of the Rich Hickey videos on InfoQ, particularly \"Are We There Yet,\" I can't recommend seeing them more. It sounds like you might be following a similar path to mine, and I can't recommend Clojure more highly.<p>In the meantime though, enjoy your Scala trip - I did! :)","created_at":"2010-01-22T03:43:47Z","created_at_i":1264131827,"objectID":"1069060","parent_id":1069003,"story_id":1068781,"story_title":"Scala: A Postfunctional Language","story_url":"http://www.scala-lang.org/node/4960","updated_at":"2024-09-19T16:52:42Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Parrying Programs"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://maclisp.info/pitmanual/funnies.html#parrying_programs"}},"_tags":["story","author_wooby","story_1059546"],"author":"wooby","created_at":"2010-01-18T06:44:00Z","created_at_i":1263797040,"num_comments":0,"objectID":"1059546","points":2,"story_id":1059546,"story_text":"","title":"Parrying Programs","updated_at":"2024-09-19T16:51:49Z","url":"http://maclisp.info/pitmanual/funnies.html#parrying_programs"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Lazy sequences in Javascript"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/333763676/lazy-functions-lazy-sequences-in-javascript"}},"_tags":["story","author_wooby","story_1052150"],"author":"wooby","created_at":"2010-01-14T07:21:20Z","created_at_i":1263453680,"num_comments":0,"objectID":"1052150","points":1,"story_id":1052150,"story_text":"","title":"Lazy sequences in Javascript","updated_at":"2024-09-19T16:51:06Z","url":"http://alan.dipert.org/post/333763676/lazy-functions-lazy-sequences-in-javascript"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Multics Emacs: The History, Design and Implementation"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.multicians.org/mepap.html"}},"_tags":["story","author_wooby","story_1049773"],"author":"wooby","created_at":"2010-01-13T08:51:19Z","created_at_i":1263372679,"num_comments":0,"objectID":"1049773","points":20,"story_id":1049773,"story_text":"","title":"Multics Emacs: The History, Design and Implementation","updated_at":"2023-09-06T19:05:19Z","url":"http://www.multicians.org/mepap.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If we're all supposed to vote the same way, what's the point of voting at all?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"[dead]"}},"_tags":["comment","author_wooby","story_1030732"],"author":"wooby","comment_text":"If we're all supposed to vote the same way, what's the point of voting at all?","created_at":"2010-01-04T19:28:48Z","created_at_i":1262633328,"objectID":"1030997","parent_id":1030732,"story_id":1030732,"story_title":"[dead]","updated_at":"2024-09-19T16:48:58Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I thought this headline was about some esoteric higher order function"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"[dead]"}},"_tags":["comment","author_wooby","story_1022904"],"author":"wooby","comment_text":"I thought this headline was about some esoteric higher order function","created_at":"2009-12-30T19:18:46Z","created_at_i":1262200726,"objectID":"1023022","parent_id":1022904,"story_id":1022904,"story_title":"[dead]","updated_at":"2024-09-19T16:48:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If you're into brainfuck and compilers, here's one that compiles BASIC into brainfuck and is written in java: <a href=\"http://esolangs.org/wiki/BFBASIC\" rel=\"nofollow\">http://esolangs.org/wiki/BFBASIC</a><p>It's advanced enough to compile things like text adventures.<p>I haven't been in #esolangs on freenode for a long time, but a few years ago there was talk of a brainfuck to C compiler floating around that was being actively developed. It as called bf2c."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"bfc.rb : Compile BrainF*** code to Ruby, C, Haskell, Scheme and LLVM"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://ujihisa.blogspot.com/2009/12/bfc-brainfk-compilers.html"}},"_tags":["comment","author_wooby","story_1017740"],"author":"wooby","comment_text":"If you're into brainfuck and compilers, here's one that compiles BASIC into brainfuck and is written in java: <a href=\"http://esolangs.org/wiki/BFBASIC\" rel=\"nofollow\">http://esolangs.org/wiki/BFBASIC</a><p>It's advanced enough to compile things like text adventures.<p>I haven't been in #esolangs on freenode for a long time, but a few years ago there was talk of a brainfuck to C compiler floating around that was being actively developed. It as called bf2c.","created_at":"2009-12-27T23:46:06Z","created_at_i":1261957566,"objectID":"1017808","parent_id":1017740,"story_id":1017740,"story_title":"bfc.rb : Compile BrainF*** code to Ruby, C, Haskell, Scheme and LLVM","story_url":"http://ujihisa.blogspot.com/2009/12/bfc-brainfk-compilers.html","updated_at":"2024-09-19T16:47:43Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Your point is interesting, and made me think about the way people primarily look for classical music - by composer.<p>If this whole scheme is to be based on some notion of \"creator,\" then the the way this would be organized seems to be pretty dependent on some standard definition of creation, and maybe even of art.<p>Seems like it could get pretty hairy."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Music Browser, Not \"Music Service Client\""},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://zedshaw.com/blog/2009-12-23.html"}},"_tags":["comment","author_wooby","story_1012609"],"author":"wooby","comment_text":"Your point is interesting, and made me think about the way people primarily look for classical music - by composer.<p>If this whole scheme is to be based on some notion of \"creator,\" then the the way this would be organized seems to be pretty dependent on some standard definition of creation, and maybe even of art.<p>Seems like it could get pretty hairy.","created_at":"2009-12-24T06:55:05Z","created_at_i":1261637705,"objectID":"1013526","parent_id":1012960,"story_id":1012609,"story_title":"Music Browser, Not \"Music Service Client\"","story_url":"http://zedshaw.com/blog/2009-12-23.html","updated_at":"2024-09-19T16:47:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Nanowire lithium-ion batteries last 10x longer, are 1000x stronger"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.news.colostate.edu/Release/4951"}},"_tags":["story","author_wooby","story_1000461"],"author":"wooby","created_at":"2009-12-17T05:14:29Z","created_at_i":1261026869,"num_comments":0,"objectID":"1000461","points":1,"story_id":1000461,"story_text":"","title":"Nanowire lithium-ion batteries last 10x longer, are 1000x stronger","updated_at":"2024-09-19T16:46:07Z","url":"http://www.news.colostate.edu/Release/4951"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"For slime-like editing with vim for Clojure, check out VimClojure. It's really great."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Like Slime, for Vim"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://technotales.wordpress.com/2007/10/03/like-slime-for-vim/"}},"_tags":["comment","author_wooby","story_976515"],"author":"wooby","children":[976797,976972],"comment_text":"For slime-like editing with vim for Clojure, check out VimClojure. It's really great.","created_at":"2009-12-04T17:10:24Z","created_at_i":1259946624,"objectID":"976697","parent_id":976515,"story_id":976515,"story_title":"Like Slime, for Vim","story_url":"http://technotales.wordpress.com/2007/10/03/like-slime-for-vim/","updated_at":"2024-09-19T16:51:58Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Knowledge work productivity"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://en.wikipedia.org/wiki/Knowledge_work_productivity"}},"_tags":["story","author_wooby","story_973805"],"author":"wooby","created_at":"2009-12-03T05:46:13Z","created_at_i":1259819173,"num_comments":0,"objectID":"973805","points":1,"story_id":973805,"story_text":"","title":"Knowledge work productivity","updated_at":"2023-09-06T20:17:11Z","url":"http://en.wikipedia.org/wiki/Knowledge_work_productivity"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Thank you for your input, I really like the idea of \"turning things around.\""},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Things you wish you'd learned about programming in college?"}},"_tags":["comment","author_wooby","story_966986"],"author":"wooby","children":[968173],"comment_text":"Thank you for your input, I really like the idea of \"turning things around.\"","created_at":"2009-11-30T05:03:00Z","created_at_i":1259557380,"objectID":"967371","parent_id":967234,"story_id":966986,"story_title":"Ask HN: Things you wish you'd learned about programming in college?","updated_at":"2024-09-19T16:51:07Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Yes, it's on December 11th, and will be recorded and available here: <a href=\"http://www.vimeo.com/user1295234\" rel=\"nofollow\">http://www.vimeo.com/user1295234</a> sometime in mid-December. Thanks for your interest! I'm looking forward to it."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Things you wish you'd learned about programming in college?"}},"_tags":["comment","author_wooby","story_966986"],"author":"wooby","comment_text":"Yes, it's on December 11th, and will be recorded and available here: <a href=\"http://www.vimeo.com/user1295234\" rel=\"nofollow\">http://www.vimeo.com/user1295234</a> sometime in mid-December. Thanks for your interest! I'm looking forward to it.","created_at":"2009-11-30T05:01:25Z","created_at_i":1259557285,"objectID":"967370","parent_id":967298,"story_id":966986,"story_title":"Ask HN: Things you wish you'd learned about programming in college?","updated_at":"2024-09-19T16:51:07Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":"A friend and I will be giving a talk to a group of computer science students in a few weeks. We're both students ourselves, but are a bit older and have more working experience than the average attendee will probably have.<p>Here are some of the ideas we've had so far:<p>- Present on \"using and knowing the tools\" from OS to editor to libraries.<p>- Something interactive, like working as a group through one of the problems from the New Turing Omnibus.<p>- Talk about the social aspects of coding, like group dynamic and collaboration tools, and maybe introduce pair programming.<p>The audience will be mostly undergraduate CS students. My friend and I are 25, and have worked freelance and at startups/medium sized companies on mostly Rails, PHP, and Java web apps for 5+ years. We have a lot to learn ourselves, and see this speaking opportunity as a way to better ourselves as presenters and learn more about the topic we pick.<p>So, what's a good topic? What's something every CS grad wishes they had learned or heard about? Thanks in advance for your suggestions!"},"title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Things you wish you'd learned about programming in college?"}},"_tags":["story","author_wooby","story_966986","ask_hn"],"author":"wooby","children":[967083,967025,967099,967072,967033,967150,967106,967092,967201,967161,967016,967230,967095,967077,969239,967234,967145,967509,967671,967023,967100,967034,967300,967179,967110,967480,967013,967298],"created_at":"2009-11-29T22:54:49Z","created_at_i":1259535289,"num_comments":62,"objectID":"966986","points":44,"story_id":966986,"story_text":"A friend and I will be giving a talk to a group of computer science students in a few weeks. We're both students ourselves, but are a bit older and have more working experience than the average attendee will probably have.<p>Here are some of the ideas we've had so far:<p>- Present on \"using and knowing the tools\" from OS to editor to libraries.<p>- Something interactive, like working as a group through one of the problems from the New Turing Omnibus.<p>- Talk about the social aspects of coding, like group dynamic and collaboration tools, and maybe introduce pair programming.<p>The audience will be mostly undergraduate CS students. My friend and I are 25, and have worked freelance and at startups/medium sized companies on mostly Rails, PHP, and Java web apps for 5+ years. We have a lot to learn ourselves, and see this speaking opportunity as a way to better ourselves as presenters and learn more about the topic we pick.<p>So, what's a good topic? What's something every CS grad wishes they had learned or heard about? Thanks in advance for your suggestions!","title":"Ask HN: Things you wish you'd learned about programming in college?","updated_at":"2023-09-06T20:16:37Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"<a href=\"http://280atlas.com/\" rel=\"nofollow\">http://280atlas.com/</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Atlas Beta Program Launched"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://atlas-beta.heroku.com/users/new"}},"_tags":["comment","author_wooby","story_943616"],"author":"wooby","comment_text":"<a href=\"http://280atlas.com/\" rel=\"nofollow\">http://280atlas.com/</a>","created_at":"2009-11-16T02:03:38Z","created_at_i":1258337018,"objectID":"943772","parent_id":943747,"points":null,"story_id":943616,"story_title":"Atlas Beta Program Launched","story_url":"https://atlas-beta.heroku.com/users/new","updated_at":"2023-09-06T20:14:40Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"Atlas Beta Program Launched"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://atlas-beta.heroku.com/users/new"}},"_tags":["story","author_wooby","story_943616"],"author":"wooby","children":[943805,943747,944054,943654,943643,943872],"created_at":"2009-11-16T00:24:58Z","created_at_i":1258331098,"num_comments":38,"objectID":"943616","points":46,"story_id":943616,"title":"Atlas Beta Program Launched","updated_at":"2026-03-22T17:46:16Z","url":"https://atlas-beta.heroku.com/users/new"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I agree - this TDD-koan stuff really turns me off. What's preventing the author from just writing fibonacci as an infinite series of tests, and an infinitely long switch statement?<p>What the article doesn't mention is that full coverage on a function taking all positive integers is impossible unless you're comfortable making some assumptions about the behavior of your program.<p>The 'leap of faith' here is induction and the transition from simple testability to recursive implementation is huge, and left basically unexplained.<p>I personally think TDD is a great tool and an awesome way to write code. But it doesn't have to be this mysterious; I just think a function like fib is not a good way to show the benefits."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"How I Started TDD"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.extracheese.org/2009/11/how_i_started_tdd.html"}},"_tags":["comment","author_wooby","story_933290"],"author":"wooby","children":[933782],"comment_text":"I agree - this TDD-koan stuff really turns me off. What's preventing the author from just writing fibonacci as an infinite series of tests, and an infinitely long switch statement?<p>What the article doesn't mention is that full coverage on a function taking all positive integers is impossible unless you're comfortable making some assumptions about the behavior of your program.<p>The 'leap of faith' here is induction and the transition from simple testability to recursive implementation is huge, and left basically unexplained.<p>I personally think TDD is a great tool and an awesome way to write code. But it doesn't have to be this mysterious; I just think a function like fib is not a good way to show the benefits.","created_at":"2009-11-10T19:16:13Z","created_at_i":1257880573,"objectID":"933711","parent_id":933673,"points":null,"story_id":933290,"story_title":"How I Started TDD","story_url":"http://blog.extracheese.org/2009/11/how_i_started_tdd.html","updated_at":"2023-09-06T20:13:49Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"The Robot and the Baby"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www-formal.stanford.edu/jmc/robotandbaby/robotandbaby.html "}},"_tags":["story","author_wooby","story_931633"],"author":"wooby","created_at":"2009-11-09T20:08:49Z","created_at_i":1257797329,"num_comments":0,"objectID":"931633","points":1,"story_id":931633,"story_text":"","title":"The Robot and the Baby","updated_at":"2024-09-19T16:47:56Z","url":"http://www-formal.stanford.edu/jmc/robotandbaby/robotandbaby.html "},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Shunting-yard Algorithm"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://en.wikipedia.org/wiki/Shunting-yard_algorithm"}},"_tags":["story","author_wooby","story_928452"],"author":"wooby","children":[928524],"created_at":"2009-11-07T23:14:02Z","created_at_i":1257635642,"num_comments":2,"objectID":"928452","points":8,"story_id":928452,"story_text":"","title":"Shunting-yard Algorithm","updated_at":"2024-09-19T16:47:39Z","url":"http://en.wikipedia.org/wiki/Shunting-yard_algorithm"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It's a great read, I'm glad we were able to salvage it from Geocities.<p>This quote from yosefk.com sums up the article more or less:<p>One of the key traits of good code is the ease at which it can be modified. One of the key traits of bad code is the high cost of modifying it. So good code is likely to deteriorate until it\u2019s bad enough to become hard to change, and bad code is likely to stay bad. In short, code has a strong tendency to end up bad."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Big Ball of Mud"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.laputan.org/mud"}},"_tags":["comment","author_wooby","story_911445"],"author":"wooby","children":[911701],"comment_text":"It's a great read, I'm glad we were able to salvage it from Geocities.<p>This quote from yosefk.com sums up the article more or less:<p>One of the key traits of good code is the ease at which it can be modified. One of the key traits of bad code is the high cost of modifying it. So good code is likely to deteriorate until it\u2019s bad enough to become hard to change, and bad code is likely to stay bad. In short, code has a strong tendency to end up bad.","created_at":"2009-10-30T05:05:23Z","created_at_i":1256879123,"objectID":"911560","parent_id":911445,"points":null,"story_id":911445,"story_title":"Big Ball of Mud","story_url":"http://www.laputan.org/mud","updated_at":"2023-09-06T20:11:46Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"We meet at RIT and this will be our third meeting. There will be a presentation on GPU programming with CUDA, and pizza! (as long as it lasts ;)<p>I made an announcement a few months ago, but school wasn't in session yet. So, if you're in school in the area come on by! If you need a ride to RIT drop a note to either me or on the Meetup page and we'll figure something out."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Tell HN: Rochester, NY Meetup"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.meetup.com/Rochester-Hackers/calendar/11365915/"}},"_tags":["comment","author_wooby","story_911470"],"author":"wooby","comment_text":"We meet at RIT and this will be our third meeting. There will be a presentation on GPU programming with CUDA, and pizza! (as long as it lasts ;)<p>I made an announcement a few months ago, but school wasn't in session yet. So, if you're in school in the area come on by! If you need a ride to RIT drop a note to either me or on the Meetup page and we'll figure something out.","created_at":"2009-10-30T03:25:55Z","created_at_i":1256873155,"objectID":"911473","parent_id":911470,"points":null,"story_id":911470,"story_title":"Tell HN: Rochester, NY Meetup","story_url":"http://www.meetup.com/Rochester-Hackers/calendar/11365915/","updated_at":"2023-09-06T20:11:46Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Tell HN: Rochester, NY Meetup"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.meetup.com/Rochester-Hackers/calendar/11365915/"}},"_tags":["story","author_wooby","story_911470"],"author":"wooby","children":[911473],"created_at":"2009-10-30T03:23:13Z","created_at_i":1256872993,"num_comments":1,"objectID":"911470","points":2,"story_id":911470,"story_text":"","title":"Tell HN: Rochester, NY Meetup","updated_at":"2023-09-06T20:11:46Z","url":"http://www.meetup.com/Rochester-Hackers/calendar/11365915/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Java directly on Xen"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://research.sun.com/projects/dashboard.php?id=185"}},"_tags":["story","author_wooby","story_908226"],"author":"wooby","children":[908913,908474,908408,909606,908369,908480,909378],"created_at":"2009-10-28T17:03:33Z","created_at_i":1256749413,"num_comments":30,"objectID":"908226","points":76,"story_id":908226,"story_text":"","title":"Java directly on Xen","updated_at":"2023-09-06T20:11:32Z","url":"http://research.sun.com/projects/dashboard.php?id=185"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I started on a Lisp interpreter in Scala but only got as far as a prefix notation/sexp parser: <a href=\"http://gist.github.com/215712\" rel=\"nofollow\">http://gist.github.com/215712</a><p>You can load it into the REPL with scala -i PNCalc.scala and try an expression with PNCalc.test:<p><pre><code> scala> PNCalc.test(\"(+ (/ 3 1) (- 10 5))\")\n Tree: ESum(List(EDiv(List(EValue(3.0), EValue(1.0))), ESubtract(List(EValue(10.0), EValue(5.0)))))\n Eval: 8.0\n</code></pre>\nThe Scala parsing stuff is really nice."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Parsing Text with Scala"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.xebia.com/2009/10/21/parsing-text-with-scala/"}},"_tags":["comment","author_wooby","story_896077"],"author":"wooby","comment_text":"I started on a Lisp interpreter in Scala but only got as far as a prefix notation/sexp parser: <a href=\"http://gist.github.com/215712\" rel=\"nofollow\">http://gist.github.com/215712</a><p>You can load it into the REPL with scala -i PNCalc.scala and try an expression with PNCalc.test:<p><pre><code> scala> PNCalc.test(\"(+ (/ 3 1) (- 10 5))\")\n Tree: ESum(List(EDiv(List(EValue(3.0), EValue(1.0))), ESubtract(List(EValue(10.0), EValue(5.0)))))\n Eval: 8.0\n</code></pre>\nThe Scala parsing stuff is really nice.","created_at":"2009-10-22T03:45:22Z","created_at_i":1256183122,"objectID":"896183","parent_id":896077,"story_id":896077,"story_title":"Parsing Text with Scala","story_url":"http://blog.xebia.com/2009/10/21/parsing-text-with-scala/","updated_at":"2024-09-19T16:47:36Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"My favorite computer of all time was the Powerbook G4 12\". Sturdy build, full size keys, and internal DVD. Were it not for Apple's switch to Intel, I'd still be using it.<p>Was that a netbook? Not quite, but I really wish Apple would bring it back."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Daring Fireball: Apple Netbook Claim Chowder"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://daringfireball.net/2009/10/apple_netbook_claim_chowder"}},"_tags":["comment","author_wooby","story_895535"],"author":"wooby","children":[895907,895870],"comment_text":"My favorite computer of all time was the Powerbook G4 12\". Sturdy build, full size keys, and internal DVD. Were it not for Apple's switch to Intel, I'd still be using it.<p>Was that a netbook? Not quite, but I really wish Apple would bring it back.","created_at":"2009-10-21T23:04:32Z","created_at_i":1256166272,"objectID":"895841","parent_id":895535,"story_id":895535,"story_title":"Daring Fireball: Apple Netbook Claim Chowder","story_url":"http://daringfireball.net/2009/10/apple_netbook_claim_chowder","updated_at":"2024-09-19T16:47:30Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Very awesome, thank you for the link!"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Wikipedia In Your Pocket for $99"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.thewikireader.com/index.html"}},"_tags":["comment","author_wooby","story_880140"],"author":"wooby","comment_text":"Very awesome, thank you for the link!","created_at":"2009-10-14T15:00:13Z","created_at_i":1255532413,"objectID":"881414","parent_id":880474,"story_id":880140,"story_title":"Wikipedia In Your Pocket for $99","story_url":"http://www.thewikireader.com/index.html","updated_at":"2024-09-19T16:46:09Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Anyone have an idea as to how hackable this thing is? A friend of mine and I are looking for a good platform upon which to build a programmable and pocket-sized RPN calculator."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Wikipedia In Your Pocket for $99"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.thewikireader.com/index.html"}},"_tags":["comment","author_wooby","story_880140"],"author":"wooby","children":[880474],"comment_text":"Anyone have an idea as to how hackable this thing is? A friend of mine and I are looking for a good platform upon which to build a programmable and pocket-sized RPN calculator.","created_at":"2009-10-13T22:33:37Z","created_at_i":1255473217,"objectID":"880251","parent_id":880140,"story_id":880140,"story_title":"Wikipedia In Your Pocket for $99","story_url":"http://www.thewikireader.com/index.html","updated_at":"2024-09-19T16:46:01Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"New hires were \"...told to play Lemmings for a couple of weeks to get the idea\"<p>So awesome. That was a great game."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The Complete History of Lemmings"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.dmadesign.org/Lem_1.htm"}},"_tags":["comment","author_wooby","story_876436"],"author":"wooby","comment_text":"New hires were \"...told to play Lemmings for a couple of weeks to get the idea\"<p>So awesome. That was a great game.","created_at":"2009-10-12T12:19:18Z","created_at_i":1255349958,"objectID":"876559","parent_id":876436,"points":null,"story_id":876436,"story_title":"The Complete History of Lemmings","story_url":"http://www.dmadesign.org/Lem_1.htm","updated_at":"2023-09-06T20:08:47Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Won't every interface end up obsolete? Seems like the only interfaces with real staying power are serial and mini phonoplug."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The real Ajay Bhatt, co-inventor of the USB port"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.engadget.com/2009/10/10/conan-obrien-talks-to-the-co-creator-of-usb-on-the-tonight-show/"}},"_tags":["comment","author_wooby","story_874030"],"author":"wooby","children":[874871,874877,875338],"comment_text":"Won't every interface end up obsolete? Seems like the only interfaces with real staying power are serial and mini phonoplug.","created_at":"2009-10-11T15:45:10Z","created_at_i":1255275910,"objectID":"874799","parent_id":874342,"story_id":874030,"story_title":"The real Ajay Bhatt, co-inventor of the USB port","story_url":"http://www.engadget.com/2009/10/10/conan-obrien-talks-to-the-co-creator-of-usb-on-the-tonight-show/","updated_at":"2024-09-19T16:45:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Apparently you can also use this as a video output for routers with USB ports running OpenWRT: <a href=\"http://sven.killig.de/openwrt/slugterm_dl.html\" rel=\"nofollow\">http://sven.killig.de/openwrt/slugterm_dl.html</a><p>Pretty awesome."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Follow-up to my \"Hell of Apple Video Adapters\" blog post"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.jgc.org/blog/2009/10/displaylink-usb-video-adapter-just.html"}},"_tags":["comment","author_wooby","story_871348"],"author":"wooby","children":[872121],"comment_text":"Apparently you can also use this as a video output for routers with USB ports running OpenWRT: <a href=\"http://sven.killig.de/openwrt/slugterm_dl.html\" rel=\"nofollow\">http://sven.killig.de/openwrt/slugterm_dl.html</a><p>Pretty awesome.","created_at":"2009-10-09T17:54:27Z","created_at_i":1255110867,"objectID":"872043","parent_id":871606,"story_id":871348,"story_title":"Follow-up to my \"Hell of Apple Video Adapters\" blog post","story_url":"http://www.jgc.org/blog/2009/10/displaylink-usb-video-adapter-just.html","updated_at":"2024-09-19T16:45:14Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The alternative to preforking is select(2), which lets you get away with a single-process server and avoid IPC in certain scenarios: <a href=\"http://www.lowtek.com/sockets/select.html\" rel=\"nofollow\">http://www.lowtek.com/sockets/select.html</a><p>I think Boa and thttpd use select instead of forking for clients."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"* is Unix"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://jacobian.org/writing/star-is-unix/"}},"_tags":["comment","author_wooby","story_867452"],"author":"wooby","children":[867604,867566,867527],"comment_text":"The alternative to preforking is select(2), which lets you get away with a single-process server and avoid IPC in certain scenarios: <a href=\"http://www.lowtek.com/sockets/select.html\" rel=\"nofollow\">http://www.lowtek.com/sockets/select.html</a><p>I think Boa and thttpd use select instead of forking for clients.","created_at":"2009-10-07T20:02:19Z","created_at_i":1254945739,"objectID":"867519","parent_id":867452,"story_id":867452,"story_title":"* is Unix","story_url":"http://jacobian.org/writing/star-is-unix/","updated_at":"2024-09-19T16:44:43Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Tiny Clojure web server"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.xen.prgmr.com/"}},"_tags":["story","author_wooby","story_866296"],"author":"wooby","created_at":"2009-10-07T07:56:50Z","created_at_i":1254902210,"num_comments":0,"objectID":"866296","points":4,"story_id":866296,"story_text":"","title":"Tiny Clojure web server","updated_at":"2024-09-19T16:44:37Z","url":"http://alan.xen.prgmr.com/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I know it's possible, because I did it a few years ago. As I recall, I installed a plugin.<p>Unfortunately, that's all I remember - I haven't used Eclipse in several years."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Awesome/neat/favourite Eclipse techniques?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_859755"],"author":"wooby","comment_text":"I know it's possible, because I did it a few years ago. As I recall, I installed a plugin.<p>Unfortunately, that's all I remember - I haven't used Eclipse in several years.","created_at":"2009-10-04T07:23:22Z","created_at_i":1254641002,"objectID":"859799","parent_id":859762,"story_id":859755,"story_title":"Ask HN: Awesome/neat/favourite Eclipse techniques?","story_url":"","updated_at":"2024-09-19T16:43:53Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Seriously - \"show me the code.\" I like to listen to people when they're brilliant, even if they don't have great speaking skills."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"How to Get Speaking Gigs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://webwallflower.wordpress.com/2009/09/28/5-gig-tips/"}},"_tags":["comment","author_wooby","story_850251"],"author":"wooby","children":[850583],"comment_text":"Seriously - \"show me the code.\" I like to listen to people when they're brilliant, even if they don't have great speaking skills.","created_at":"2009-09-29T15:16:29Z","created_at_i":1254237389,"objectID":"850533","parent_id":850303,"story_id":850251,"story_title":"How to Get Speaking Gigs","story_url":"http://webwallflower.wordpress.com/2009/09/28/5-gig-tips/","updated_at":"2024-09-19T16:42:54Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Yeah, The Abyss."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Liquid breathing"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://en.wikipedia.org/wiki/Liquid_breathing"}},"_tags":["comment","author_wooby","story_847953"],"author":"wooby","comment_text":"Yeah, The Abyss.","created_at":"2009-09-28T07:16:20Z","created_at_i":1254122180,"objectID":"847986","parent_id":847979,"story_id":847953,"story_title":"Liquid breathing","story_url":"http://en.wikipedia.org/wiki/Liquid_breathing","updated_at":"2024-09-19T16:42:36Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Jsawk - like awk, but for JSON"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/micha/jsawk"}},"_tags":["story","author_wooby","story_845251"],"author":"wooby","children":[845561],"created_at":"2009-09-26T08:02:34Z","created_at_i":1253952154,"num_comments":1,"objectID":"845251","points":4,"story_id":845251,"story_text":"","title":"Jsawk - like awk, but for JSON","updated_at":"2024-09-19T16:42:25Z","url":"http://github.com/micha/jsawk"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"You can always open files as tabs at startup too with -p, like this: vim -p foo.c foo.h"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Efficient Editing With vim"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://jmcpherson.org/editing.html"}},"_tags":["comment","author_wooby","story_843732"],"author":"wooby","children":[844973],"comment_text":"You can always open files as tabs at startup too with -p, like this: vim -p foo.c foo.h","created_at":"2009-09-26T00:15:16Z","created_at_i":1253924116,"objectID":"844754","parent_id":843951,"story_id":843732,"story_title":"Efficient Editing With vim","story_url":"http://jmcpherson.org/editing.html","updated_at":"2024-09-19T16:42:20Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"You can always get vim keys in any readline-enabled terminal program (like bash) by creating ~/.inputrc and putting this in it:<p>set editing-mode vi\nset keymap vi<p><a href=\"http://vim.wikia.com/wiki/Use_vi_shortcuts_in_terminal\" rel=\"nofollow\">http://vim.wikia.com/wiki/Use_vi_shortcuts_in_terminal</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Efficient Editing With vim"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://jmcpherson.org/editing.html"}},"_tags":["comment","author_wooby","story_843732"],"author":"wooby","comment_text":"You can always get vim keys in any readline-enabled terminal program (like bash) by creating ~/.inputrc and putting this in it:<p>set editing-mode vi\nset keymap vi<p><a href=\"http://vim.wikia.com/wiki/Use_vi_shortcuts_in_terminal\" rel=\"nofollow\">http://vim.wikia.com/wiki/Use_vi_shortcuts_in_terminal</a>","created_at":"2009-09-26T00:13:02Z","created_at_i":1253923982,"objectID":"844751","parent_id":844050,"story_id":843732,"story_title":"Efficient Editing With vim","story_url":"http://jmcpherson.org/editing.html","updated_at":"2024-09-19T16:42:20Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The best resource I've found was \"The Unix Programming Environment,\" which goes beyond the C language and into using common libraries and organizing C projects with make and other tools.<p>Other than that, some food for thought on use of C in the real world is this article by Rob Pike, \"Notes on Programming in C:\"<p><a href=\"http://www.lysator.liu.se/c/pikestyle.html\" rel=\"nofollow\">http://www.lysator.liu.se/c/pikestyle.html</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"30 years of C"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.dadhacker.com/blog/?p=1132"}},"_tags":["comment","author_wooby","story_837124"],"author":"wooby","comment_text":"The best resource I've found was \"The Unix Programming Environment,\" which goes beyond the C language and into using common libraries and organizing C projects with make and other tools.<p>Other than that, some food for thought on use of C in the real world is this article by Rob Pike, \"Notes on Programming in C:\"<p><a href=\"http://www.lysator.liu.se/c/pikestyle.html\" rel=\"nofollow\">http://www.lysator.liu.se/c/pikestyle.html</a>","created_at":"2009-09-22T17:54:09Z","created_at_i":1253642049,"objectID":"837531","parent_id":837503,"story_id":837124,"story_title":"30 years of C","story_url":"http://www.dadhacker.com/blog/?p=1132","updated_at":"2024-09-19T16:41:39Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Is this a preference? I've tried in the past to dig up research actually proving the \"most visible combination\" through experimentation. I've always assumed that road signs are the combination of colors they are because some empirical research proves it. Never found anything though."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Learning Advanced JavaScript"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://ejohn.org/apps/learn"}},"_tags":["comment","author_wooby","story_823347"],"author":"wooby","comment_text":"Is this a preference? I've tried in the past to dig up research actually proving the \"most visible combination\" through experimentation. I've always assumed that road signs are the combination of colors they are because some empirical research proves it. Never found anything though.","created_at":"2009-09-16T07:08:50Z","created_at_i":1253084930,"objectID":"825425","parent_id":823805,"story_id":823347,"story_title":"Learning Advanced JavaScript","story_url":"http://ejohn.org/apps/learn","updated_at":"2024-09-19T16:40:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I like it. Although I think you were going for \"affects.\""},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review our elevator pitch (Stormpulse)"}},"_tags":["comment","author_wooby","story_814685"],"author":"wooby","children":[814704],"comment_text":"I like it. Although I think you were going for \"affects.\"","created_at":"2009-09-10T05:16:46Z","created_at_i":1252559806,"objectID":"814700","parent_id":814685,"story_id":814685,"story_title":"Ask HN: Review our elevator pitch (Stormpulse)","updated_at":"2024-09-19T16:39:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Division Tricks"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://mathforum.org/k12/mathtips/division.tips.html"}},"_tags":["story","author_wooby","story_811198"],"author":"wooby","created_at":"2009-09-08T15:33:27Z","created_at_i":1252424007,"num_comments":0,"objectID":"811198","points":1,"story_id":811198,"story_text":"","title":"Division Tricks","updated_at":"2024-09-19T16:39:04Z","url":"http://mathforum.org/k12/mathtips/division.tips.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Me too. Find also has -delete, so you don't have to type -exec rm -rf '{}' ';'"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Best Unix Tricks?"}},"_tags":["comment","author_wooby","story_810518"],"author":"wooby","children":[815444],"comment_text":"Me too. Find also has -delete, so you don't have to type -exec rm -rf '{}' ';'","created_at":"2009-09-08T12:23:33Z","created_at_i":1252412613,"objectID":"810768","parent_id":810652,"story_id":810518,"story_title":"Ask HN: Best Unix Tricks?","updated_at":"2024-09-19T16:38:56Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"The Machine That Changed the World: The Thinking Machine"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://waxy.org/2008/06/the_machine_that_changed_the_world_the_thinking_machine/"}},"_tags":["story","author_wooby","story_797901"],"author":"wooby","created_at":"2009-09-01T12:45:52Z","created_at_i":1251809152,"num_comments":0,"objectID":"797901","points":3,"story_id":797901,"story_text":"","title":"The Machine That Changed the World: The Thinking Machine","updated_at":"2024-09-19T16:45:27Z","url":"http://waxy.org/2008/06/the_machine_that_changed_the_world_the_thinking_machine/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I think a verifiable history of open source contributions (or an active github repo) show the same sort of passion."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Some \u201cDevelopers\u201d Just Can\u2019t Develop"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://richardsbraindump.blogspot.com/2009/08/some-developers-just-cant-develop.html"}},"_tags":["comment","author_wooby","story_794592"],"author":"wooby","comment_text":"I think a verifiable history of open source contributions (or an active github repo) show the same sort of passion.","created_at":"2009-08-31T08:27:45Z","created_at_i":1251707265,"objectID":"795606","parent_id":795310,"story_id":794592,"story_title":"Some \u201cDevelopers\u201d Just Can\u2019t Develop","story_url":"http://richardsbraindump.blogspot.com/2009/08/some-developers-just-cant-develop.html","updated_at":"2024-09-19T16:45:17Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Dot itself is also a command line tool, so it's easy to make documents and presentations with TeX that have text-format diagrams in the dot language. You can also do things like generate call graphs for programs, or parse log files into sequence diagrams by parsing input somehow and generating dot files."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Create and share diagrams by writing sentences"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://diagrammr.com/"}},"_tags":["comment","author_wooby","story_789120"],"author":"wooby","comment_text":"Dot itself is also a command line tool, so it's easy to make documents and presentations with TeX that have text-format diagrams in the dot language. You can also do things like generate call graphs for programs, or parse log files into sequence diagrams by parsing input somehow and generating dot files.","created_at":"2009-08-27T20:11:34Z","created_at_i":1251403894,"objectID":"789931","parent_id":789642,"story_id":789120,"story_title":"Create and share diagrams by writing sentences","story_url":"http://diagrammr.com/","updated_at":"2024-09-19T16:44:44Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I don't know. I ran across the article after watching ridiculous late-night news commentary on \"sexting\" with the headline of \"How should teens be punished for sexting?\""},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Deviancy amplification spiral"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://en.wikipedia.org/wiki/Deviancy_amplification_spiral"}},"_tags":["comment","author_wooby","story_788899"],"author":"wooby","comment_text":"I don't know. I ran across the article after watching ridiculous late-night news commentary on \"sexting\" with the headline of \"How should teens be punished for sexting?\"","created_at":"2009-08-27T10:27:48Z","created_at_i":1251368868,"objectID":"788964","parent_id":788922,"story_id":788899,"story_title":"Deviancy amplification spiral","story_url":"http://en.wikipedia.org/wiki/Deviancy_amplification_spiral","updated_at":"2024-09-19T16:44:39Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Deviancy amplification spiral"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://en.wikipedia.org/wiki/Deviancy_amplification_spiral"}},"_tags":["story","author_wooby","story_788899"],"author":"wooby","children":[788922],"created_at":"2009-08-27T08:55:36Z","created_at_i":1251363336,"num_comments":2,"objectID":"788899","points":1,"story_id":788899,"story_text":"","title":"Deviancy amplification spiral","updated_at":"2024-09-19T16:44:39Z","url":"http://en.wikipedia.org/wiki/Deviancy_amplification_spiral"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Hi, looks like it was a fun project. While you save yourself from checking the DB for a duplicate hash with your hex id strategy, a side effect of this technique is that every URL created with your service is effectively public. For instance, I could start at <a href=\"http://briancray.com/tests/shorturl/0\" rel=\"nofollow\">http://briancray.com/tests/shorturl/0</a> and work my way up through every URL ever shortened by incrementing the id in hex. Whether this is a vulnerability or undocumented feature is up to you to decide :)<p>I bring it up because I ran across the same issue with my own site, droplink.me. It was a more serious problem for me, because user uploaded files are supposed to be private. I went with randomly generated URLs."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Free PHP URL shortener script that can shorten over 4 billion URLs"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://briancray.com/2009/08/26/free-php-url-shortener-script/"}},"_tags":["comment","author_wooby","story_788413"],"author":"wooby","children":[788969],"comment_text":"Hi, looks like it was a fun project. While you save yourself from checking the DB for a duplicate hash with your hex id strategy, a side effect of this technique is that every URL created with your service is effectively public. For instance, I could start at <a href=\"http://briancray.com/tests/shorturl/0\" rel=\"nofollow\">http://briancray.com/tests/shorturl/0</a> and work my way up through every URL ever shortened by incrementing the id in hex. Whether this is a vulnerability or undocumented feature is up to you to decide :)<p>I bring it up because I ran across the same issue with my own site, droplink.me. It was a more serious problem for me, because user uploaded files are supposed to be private. I went with randomly generated URLs.","created_at":"2009-08-27T08:42:09Z","created_at_i":1251362529,"objectID":"788884","parent_id":788413,"story_id":788413,"story_title":"Free PHP URL shortener script that can shorten over 4 billion URLs","story_url":"http://briancray.com/2009/08/26/free-php-url-shortener-script/","updated_at":"2024-09-19T16:44:39Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If there's anything good about PHP that I can tell, its that development is heavily community driven and has been since the early days. However, I think PHP got so popular, and so quickly, that in many cases the community's desire for features has led to an inconsistent, and in your view, 'broken' system. The need for backwards compatibility from almost the very beginning has taken its toll, I think. Is it really 'broken' though? Of course, similar concepts have been implemented in other languages much more elegantly. But PHP is not about elegance - it's about backwards compatibility, and responding to community feature requests.<p>I'm not a part of the community, and I'm no longer a PHP developer (if I can help it) but I can't think of any other reason the global functions would still have inconsistent argument orders almost 14 years on. So, if the 'correctness' of their implementation bothers you, do what I did: move on. Because it will never get any better.<p>Incidentally, I wrote an anti-PHP rant last year called \"Why PHP Won\" that made its rounds here. It's pretty easy to get fed up with PHP, especially when you know there's better stuff out there. Once you're at that point though, you're done. It's anything-else time."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"PHP Is A Husk"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://lucasoman.blogspot.com/2009/08/php-is-dead.html"}},"_tags":["comment","author_wooby","story_787334"],"author":"wooby","comment_text":"If there's anything good about PHP that I can tell, its that development is heavily community driven and has been since the early days. However, I think PHP got so popular, and so quickly, that in many cases the community's desire for features has led to an inconsistent, and in your view, 'broken' system. The need for backwards compatibility from almost the very beginning has taken its toll, I think. Is it really 'broken' though? Of course, similar concepts have been implemented in other languages much more elegantly. But PHP is not about elegance - it's about backwards compatibility, and responding to community feature requests.<p>I'm not a part of the community, and I'm no longer a PHP developer (if I can help it) but I can't think of any other reason the global functions would still have inconsistent argument orders almost 14 years on. So, if the 'correctness' of their implementation bothers you, do what I did: move on. Because it will never get any better.<p>Incidentally, I wrote an anti-PHP rant last year called \"Why PHP Won\" that made its rounds here. It's pretty easy to get fed up with PHP, especially when you know there's better stuff out there. Once you're at that point though, you're done. It's anything-else time.","created_at":"2009-08-26T16:31:58Z","created_at_i":1251304318,"objectID":"787487","parent_id":787420,"story_id":787334,"story_title":"PHP Is A Husk","story_url":"http://lucasoman.blogspot.com/2009/08/php-is-dead.html","updated_at":"2024-09-19T16:44:34Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Translating Java bytecode to X86 assembly code"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.cis.nctu.edu.tw/~wuuyang/papers/bytecode2X86.BRIEF.pdf"}},"_tags":["story","author_wooby","story_783906"],"author":"wooby","created_at":"2009-08-25T01:45:58Z","created_at_i":1251164758,"num_comments":0,"objectID":"783906","points":1,"story_id":783906,"story_text":"","title":"Translating Java bytecode to X86 assembly code","updated_at":"2024-09-19T16:44:11Z","url":"http://www.cis.nctu.edu.tw/~wuuyang/papers/bytecode2X86.BRIEF.pdf"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Hey, I'm using 2.7.5 and it worked for me. There's a tidbit of 2.8 specific code in there, but it's noted. I'm also the dude that wrote it, so if you have any problems or questions drop a line. Scala, for me, has been worth learning."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Tiny Scala Primer"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://people.rit.edu/~awd4182/scala_handout.pdf"}},"_tags":["comment","author_wooby","story_782997"],"author":"wooby","comment_text":"Hey, I'm using 2.7.5 and it worked for me. There's a tidbit of 2.8 specific code in there, but it's noted. I'm also the dude that wrote it, so if you have any problems or questions drop a line. Scala, for me, has been worth learning.","created_at":"2009-08-24T20:43:23Z","created_at_i":1251146603,"objectID":"783302","parent_id":783297,"story_id":782997,"story_title":"Tiny Scala Primer","story_url":"http://people.rit.edu/~awd4182/scala_handout.pdf","updated_at":"2024-09-19T16:44:11Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Tiny Scala Primer"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://people.rit.edu/~awd4182/scala_handout.pdf"}},"_tags":["story","author_wooby","story_782997"],"author":"wooby","children":[783297],"created_at":"2009-08-24T19:15:34Z","created_at_i":1251141334,"num_comments":2,"objectID":"782997","points":2,"story_id":782997,"story_text":"","title":"Tiny Scala Primer","updated_at":"2024-09-19T16:44:05Z","url":"http://people.rit.edu/~awd4182/scala_handout.pdf"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Here's one my friend wrote, we're using it for in-place editing of html files stored on S3: <a href=\"http://github.com/micha/jquery-eip/tree/master\" rel=\"nofollow\">http://github.com/micha/jquery-eip/tree/master</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Best plugin for Jquery edit-in-place"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_780568"],"author":"wooby","comment_text":"Here's one my friend wrote, we're using it for in-place editing of html files stored on S3: <a href=\"http://github.com/micha/jquery-eip/tree/master\" rel=\"nofollow\">http://github.com/micha/jquery-eip/tree/master</a>","created_at":"2009-08-23T16:24:53Z","created_at_i":1251044693,"objectID":"780612","parent_id":780568,"story_id":780568,"story_title":"Ask HN: Best plugin for Jquery edit-in-place","story_url":"","updated_at":"2024-09-19T16:43:53Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Has anyone managed to get this running on OS X? A few weeks ago I played with some header files but didn't have any luck."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Mythryl: second public release featuring \"first-cut OOP support\""},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://mythryl.org/my-2009-08-19-14_01_49.html"}},"_tags":["comment","author_wooby","story_775257"],"author":"wooby","comment_text":"Has anyone managed to get this running on OS X? A few weeks ago I played with some header files but didn't have any luck.","created_at":"2009-08-20T15:52:59Z","created_at_i":1250783579,"objectID":"775305","parent_id":775257,"story_id":775257,"story_title":"Mythryl: second public release featuring \"first-cut OOP support\"","story_url":"http://mythryl.org/my-2009-08-19-14_01_49.html","updated_at":"2024-09-19T16:43:17Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Strikes me as dated and pointless; reads like a high school \"compare and contrast\" essay and the guy is hell bent on flaming Lisp. Apples and Oranges dude."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Python vs. Lisp"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.strout.net/python/pythonvslisp.html"}},"_tags":["comment","author_wooby","story_762859"],"author":"wooby","comment_text":"Strikes me as dated and pointless; reads like a high school \"compare and contrast\" essay and the guy is hell bent on flaming Lisp. Apples and Oranges dude.","created_at":"2009-08-14T14:59:29Z","created_at_i":1250261969,"objectID":"763119","parent_id":762859,"story_id":762859,"story_title":"Python vs. Lisp","story_url":"http://www.strout.net/python/pythonvslisp.html","updated_at":"2024-09-19T16:42:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The way I see it, programming for the web is, for simple apps, the easiest way to build anything in any language that provides an interface and does something useful. It's also, in my opinion, the most difficult platform to develop more complex software for.<p>The statelessness of HTTP, and the long list of requisite skills (JS/HTML/CSS/SQL) needed to build something application-like are pretty serious. And that's before you even get into messaging, caching, and optimization. In the blog post the buffoon spends a paragraph decreeing the nightmares of web development, and the next calling those who want to develop for it \"dumb.\" I'd say the opposite is true.<p>Alas, there is somewhere in the middle of the spectrum where it's pretty boring for someone who enjoys programming. But I think any technology can get boring when the job becomes more a task of memorizing an API and using it the way you're supposed to than actually hacking. While C is \"hard core,\" doing something in C with X11 is an exercise in rote and memorization.<p>He goes on about his IDEs and debuggers. What's with the debuggers guy, too dumb to not make mistakes? What's he working with that he's so happy using, Squeak?<p>So yes - this guy is an idiot. If you're result oriented, the web is a great place to build an app because there are fantastic frameworks to create things quickly that anyone with a browser can use. And if you're hacking oriented, you can write your own framework."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Coding Horror: All Programming is Web Programming"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.codinghorror.com/blog/archives/001296.html"}},"_tags":["comment","author_wooby","story_762858"],"author":"wooby","comment_text":"The way I see it, programming for the web is, for simple apps, the easiest way to build anything in any language that provides an interface and does something useful. It's also, in my opinion, the most difficult platform to develop more complex software for.<p>The statelessness of HTTP, and the long list of requisite skills (JS/HTML/CSS/SQL) needed to build something application-like are pretty serious. And that's before you even get into messaging, caching, and optimization. In the blog post the buffoon spends a paragraph decreeing the nightmares of web development, and the next calling those who want to develop for it \"dumb.\" I'd say the opposite is true.<p>Alas, there is somewhere in the middle of the spectrum where it's pretty boring for someone who enjoys programming. But I think any technology can get boring when the job becomes more a task of memorizing an API and using it the way you're supposed to than actually hacking. While C is \"hard core,\" doing something in C with X11 is an exercise in rote and memorization.<p>He goes on about his IDEs and debuggers. What's with the debuggers guy, too dumb to not make mistakes? What's he working with that he's so happy using, Squeak?<p>So yes - this guy is an idiot. If you're result oriented, the web is a great place to build an app because there are fantastic frameworks to create things quickly that anyone with a browser can use. And if you're hacking oriented, you can write your own framework.","created_at":"2009-08-14T14:45:31Z","created_at_i":1250261131,"objectID":"763079","parent_id":762939,"story_id":762858,"story_title":"Coding Horror: All Programming is Web Programming","story_url":"http://www.codinghorror.com/blog/archives/001296.html","updated_at":"2024-09-19T16:42:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Swing by, it will be worth the drive :)"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Tell HN: Rochester, NY Hackers - Unite!"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.meetup.com/Rochester-Hackers/"}},"_tags":["comment","author_wooby","story_762266"],"author":"wooby","comment_text":"Swing by, it will be worth the drive :)","created_at":"2009-08-14T05:04:12Z","created_at_i":1250226252,"objectID":"762410","parent_id":762369,"story_id":762266,"story_title":"Tell HN: Rochester, NY Hackers - Unite!","story_url":"http://www.meetup.com/Rochester-Hackers/","updated_at":"2024-09-19T16:42:11Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Yeah, I saw that... I think I met a handful of members at the most recent RIT Barcamp. Awesome guys, but I wanted to test the waters for interest in a group that's language and platform agnostic and has the entrepreneur/startup angle."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Tell HN: Rochester, NY Hackers - Unite!"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.meetup.com/Rochester-Hackers/"}},"_tags":["comment","author_wooby","story_762266"],"author":"wooby","comment_text":"Yeah, I saw that... I think I met a handful of members at the most recent RIT Barcamp. Awesome guys, but I wanted to test the waters for interest in a group that's language and platform agnostic and has the entrepreneur/startup angle.","created_at":"2009-08-14T04:45:11Z","created_at_i":1250225111,"objectID":"762385","parent_id":762376,"story_id":762266,"story_title":"Tell HN: Rochester, NY Hackers - Unite!","story_url":"http://www.meetup.com/Rochester-Hackers/","updated_at":"2024-09-19T16:42:11Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Cool, you should join the group anyways and then you'll get notified when the next meetup goes down. Thanks for checking it out!"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Tell HN: Rochester, NY Hackers - Unite!"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.meetup.com/Rochester-Hackers/"}},"_tags":["comment","author_wooby","story_762266"],"author":"wooby","children":[762376],"comment_text":"Cool, you should join the group anyways and then you'll get notified when the next meetup goes down. Thanks for checking it out!","created_at":"2009-08-14T04:25:43Z","created_at_i":1250223943,"objectID":"762355","parent_id":762351,"story_id":762266,"story_title":"Tell HN: Rochester, NY Hackers - Unite!","story_url":"http://www.meetup.com/Rochester-Hackers/","updated_at":"2024-09-19T16:42:11Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Hi everyone, I was cruising around looking for a hacker oriented club or group in Rochester, NY or Western NY and didn't find anything... so I made a meetup group. We'll be tentatively meeting on either the RIT campus (if I can swing it) or the Penfield Panera (Panorama Plaza). I've got a Scala presentation/workshop planned, but I'm more than open to anything else anyone would want to share. Thanks for getting the word out."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Tell HN: Rochester, NY Hackers - Unite!"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.meetup.com/Rochester-Hackers/"}},"_tags":["comment","author_wooby","story_762266"],"author":"wooby","children":[762351,762400],"comment_text":"Hi everyone, I was cruising around looking for a hacker oriented club or group in Rochester, NY or Western NY and didn't find anything... so I made a meetup group. We'll be tentatively meeting on either the RIT campus (if I can swing it) or the Penfield Panera (Panorama Plaza). I've got a Scala presentation/workshop planned, but I'm more than open to anything else anyone would want to share. Thanks for getting the word out.","created_at":"2009-08-14T03:11:09Z","created_at_i":1250219469,"objectID":"762271","parent_id":762266,"story_id":762266,"story_title":"Tell HN: Rochester, NY Hackers - Unite!","story_url":"http://www.meetup.com/Rochester-Hackers/","updated_at":"2024-09-19T16:42:11Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Tell HN: Rochester, NY Hackers - Unite!"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.meetup.com/Rochester-Hackers/"}},"_tags":["story","author_wooby","story_762266"],"author":"wooby","children":[762271,762477,762369,762795],"created_at":"2009-08-14T03:08:37Z","created_at_i":1250219317,"num_comments":10,"objectID":"762266","points":26,"story_id":762266,"story_text":"","title":"Tell HN: Rochester, NY Hackers - Unite!","updated_at":"2024-09-19T16:42:11Z","url":"http://www.meetup.com/Rochester-Hackers/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Situation calculus"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://en.wikipedia.org/wiki/Situation_calculus"}},"_tags":["story","author_wooby","story_757391"],"author":"wooby","created_at":"2009-08-12T05:47:41Z","created_at_i":1250056061,"num_comments":0,"objectID":"757391","points":2,"story_id":757391,"story_text":"","title":"Situation calculus","updated_at":"2024-09-19T16:41:47Z","url":"http://en.wikipedia.org/wiki/Situation_calculus"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Me too - using Gmail + Gears w/ Safari 4 Fluid app, and a dock badge 'inbox count' userscript. Google will tell you you can't install gears with safari 4 - but it works."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: What email client do you use?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_756653"],"author":"wooby","comment_text":"Me too - using Gmail + Gears w/ Safari 4 Fluid app, and a dock badge 'inbox count' userscript. Google will tell you you can't install gears with safari 4 - but it works.","created_at":"2009-08-12T05:28:58Z","created_at_i":1250054938,"objectID":"757362","parent_id":756869,"story_id":756653,"story_title":"Ask HN: What email client do you use?","story_url":"","updated_at":"2024-09-19T16:41:47Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I'm not sure this kind of entrenchment is endemic of COBOL programmers specifically. I knew plenty of people in college who, once they knew Java, were perfectly content with their ability to program, and will probably be happily employed for the foreseeable future. I think it just boils down to the difference between the 9am-5pm'ers and the 5pm-9am'ers."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"COBOL: Everywhere and Nowhere"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.codinghorror.com/blog/archives/001294.html"}},"_tags":["comment","author_wooby","story_752398"],"author":"wooby","comment_text":"I'm not sure this kind of entrenchment is endemic of COBOL programmers specifically. I knew plenty of people in college who, once they knew Java, were perfectly content with their ability to program, and will probably be happily employed for the foreseeable future. I think it just boils down to the difference between the 9am-5pm'ers and the 5pm-9am'ers.","created_at":"2009-08-10T13:47:07Z","created_at_i":1249912027,"objectID":"752866","parent_id":752843,"story_id":752398,"story_title":"COBOL: Everywhere and Nowhere","story_url":"http://www.codinghorror.com/blog/archives/001294.html","updated_at":"2024-09-19T16:41:21Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Handy; a task better suited for a Greasemonkey script though?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Let me put that in one page for you - makes multipage articles one page"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://lmpiopfy.appspot.com/"}},"_tags":["comment","author_wooby","story_750854"],"author":"wooby","comment_text":"Handy; a task better suited for a Greasemonkey script though?","created_at":"2009-08-10T02:55:55Z","created_at_i":1249872955,"objectID":"751802","parent_id":750854,"story_id":750854,"story_title":"Let me put that in one page for you - makes multipage articles one page","story_url":"http://lmpiopfy.appspot.com/","updated_at":"2024-09-19T16:41:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Write tests before you code, and spend more time planning software with pen and paper before you actually write it. If you're having doubts about your abilities or solutions and work as part of a team, ping team members or friends."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: How to reduce sloppy mistakes?"}},"_tags":["comment","author_wooby","story_751307"],"author":"wooby","comment_text":"Write tests before you code, and spend more time planning software with pen and paper before you actually write it. If you're having doubts about your abilities or solutions and work as part of a team, ping team members or friends.","created_at":"2009-08-09T21:44:07Z","created_at_i":1249854247,"objectID":"751347","parent_id":751307,"story_id":751307,"story_title":"Ask HN: How to reduce sloppy mistakes?","updated_at":"2024-09-19T16:41:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Me too. And absolutely it counts; VB programmers are still programmers aren't they?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: If you play an instrument, which is it?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_746708"],"author":"wooby","comment_text":"Me too. And absolutely it counts; VB programmers are still programmers aren't they?","created_at":"2009-08-07T07:56:08Z","created_at_i":1249631768,"objectID":"747243","parent_id":746939,"story_id":746708,"story_title":"Ask HN: If you play an instrument, which is it?","story_url":"","updated_at":"2024-09-19T16:40:54Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Awesome - reminiscent of HotRuby, except cooler/faster/parses and executes all by itself. It would be nice if there was a JS Parrot VM."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Python, client side: Skulpt"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.skulpt.org/"}},"_tags":["comment","author_wooby","story_747086"],"author":"wooby","comment_text":"Awesome - reminiscent of HotRuby, except cooler/faster/parses and executes all by itself. It would be nice if there was a JS Parrot VM.","created_at":"2009-08-07T07:52:13Z","created_at_i":1249631533,"objectID":"747239","parent_id":747086,"story_id":747086,"story_title":"Python, client side: Skulpt","story_url":"http://www.skulpt.org/","updated_at":"2024-09-19T16:40:54Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I feel the same way. Why not just save everyone some hassle, admit to ourselves we never click on ads, and employ an extension or userscript."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Massacre Gmail Ads with These Two Sentences (and Some Tragic Words)"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://lifehacker.com/5330642/massacre-gmail-ads-with-these-two-sentences-and-some-tragic-words"}},"_tags":["comment","author_wooby","story_744040"],"author":"wooby","comment_text":"I feel the same way. Why not just save everyone some hassle, admit to ourselves we never click on ads, and employ an extension or userscript.","created_at":"2009-08-05T20:40:19Z","created_at_i":1249504819,"objectID":"744211","parent_id":744195,"story_id":744040,"story_title":"Massacre Gmail Ads with These Two Sentences (and Some Tragic Words)","story_url":"http://lifehacker.com/5330642/massacre-gmail-ads-with-these-two-sentences-and-some-tragic-words","updated_at":"2024-09-19T16:40:40Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"There have existed, and do exist, cultures which value human lives lost in combat the same way we will view robots lost in combat. In a sense, our enemy already thinks this way. Each Jihadist's death, to them, is a victory in itself, and but one of many to come; a mark of progress in what is certainly the most glorious and successful guerilla campaign of all time.<p>I thought the author's arguments were heavily culturally-bound, and I don't think the use of robots in combat will change anything about the nature of war. Killing can be automated; war, and winning wars, cannot. There will always be repercussions the belligerent's society will be able to understand as \"loss.\" Our current definition is lost troops. Our future enemies will figure it out if it changes, and make it as clear to us as possible in terms we can understand why we will not win. Nowadays, their tools are insurgency and domestic terrorism. Who knows what they will be in the future.<p>Preventing the start of future wars doesn't have anything, in my view, to do with stopping the Pentagon from further automating killing. As long as we as a country feel the need to maintain a military, we must continue innovating with the tools and techniques of war.<p>A larger and scarier problem with our country, in my view, is our society's perspectives - on itself, on the world, on the meaning of life and death in general. It is this perspective, and collective awareness, that will guide the way we use both our military and its robots in the future to solve problems and protect ourselves. The average American has never served in the military, seen directly or even heard second-hand the nature of war or the military. The average American hasn't even ever left the country, nor spoken another language. How can our leaders, products of such a society, be expected to make decisions about the application of war?<p>It's a question that saddens me because I don't think there's an answer, and this post has turned into a rant. Forgive me, back to coding!"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The Second Amendment in Iraq, Combat Robotics, and the Future of Human Liberty"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://vinay.howtolivewiki.com/blog/global/the-second-amendment-in-iraq-combat-robotics-and-the-future-of-human-liberty-820?"}},"_tags":["comment","author_wooby","story_741518"],"author":"wooby","comment_text":"There have existed, and do exist, cultures which value human lives lost in combat the same way we will view robots lost in combat. In a sense, our enemy already thinks this way. Each Jihadist's death, to them, is a victory in itself, and but one of many to come; a mark of progress in what is certainly the most glorious and successful guerilla campaign of all time.<p>I thought the author's arguments were heavily culturally-bound, and I don't think the use of robots in combat will change anything about the nature of war. Killing can be automated; war, and winning wars, cannot. There will always be repercussions the belligerent's society will be able to understand as \"loss.\" Our current definition is lost troops. Our future enemies will figure it out if it changes, and make it as clear to us as possible in terms we can understand why we will not win. Nowadays, their tools are insurgency and domestic terrorism. Who knows what they will be in the future.<p>Preventing the start of future wars doesn't have anything, in my view, to do with stopping the Pentagon from further automating killing. As long as we as a country feel the need to maintain a military, we must continue innovating with the tools and techniques of war.<p>A larger and scarier problem with our country, in my view, is our society's perspectives - on itself, on the world, on the meaning of life and death in general. It is this perspective, and collective awareness, that will guide the way we use both our military and its robots in the future to solve problems and protect ourselves. The average American has never served in the military, seen directly or even heard second-hand the nature of war or the military. The average American hasn't even ever left the country, nor spoken another language. How can our leaders, products of such a society, be expected to make decisions about the application of war?<p>It's a question that saddens me because I don't think there's an answer, and this post has turned into a rant. Forgive me, back to coding!","created_at":"2009-08-05T09:42:17Z","created_at_i":1249465337,"objectID":"743105","parent_id":742062,"story_id":741518,"story_title":"The Second Amendment in Iraq, Combat Robotics, and the Future of Human Liberty","story_url":"http://vinay.howtolivewiki.com/blog/global/the-second-amendment-in-iraq-combat-robotics-and-the-future-of-human-liberty-820?","updated_at":"2024-09-19T16:40:35Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I wish! Another progressive computing project I'm aware of in the same vein was Japan's \"Fifth Generation Computer\" initiative, which bore, among other things, a concurrent dialect of Prolog called KL0. <a href=\"http://en.wikipedia.org/wiki/Fifth_generation_computer\" rel=\"nofollow\">http://en.wikipedia.org/wiki/Fifth_generation_computer</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Has anybody here worked with the Connection Machine or the Lisp Machine?"}},"_tags":["comment","author_wooby","story_743053"],"author":"wooby","comment_text":"I wish! Another progressive computing project I'm aware of in the same vein was Japan's \"Fifth Generation Computer\" initiative, which bore, among other things, a concurrent dialect of Prolog called KL0. <a href=\"http://en.wikipedia.org/wiki/Fifth_generation_computer\" rel=\"nofollow\">http://en.wikipedia.org/wiki/Fifth_generation_computer</a>","created_at":"2009-08-05T08:48:35Z","created_at_i":1249462115,"objectID":"743062","parent_id":743053,"story_id":743053,"story_title":"Ask HN: Has anybody here worked with the Connection Machine or the Lisp Machine?","updated_at":"2024-09-19T16:40:35Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"<p><pre><code> Python Ruby\n map collect,map\n lambda block\n filter select\n ? reject\n reduce (functools) inject (native)\n</code></pre>\nGuido van Rossum on inclusion of 'reduce' in Python 3.0, in 2005:<p>\"This is actually the one I've always hated most, because, apart from a few examples involving + or *, almost every time I see a reduce() call with a non-trivial function argument, I need to grab pen and paper to diagram what's actually being fed into that function before I understand what the reduce() is supposed to do. So in my mind, the applicability of reduce() is pretty much limited to associative operators, and in all other cases it's better to write out the accumulation loop explicitly\" (<a href=\"http://www.artima.com/weblogs/viewpost.jsp?thread=98196\" rel=\"nofollow\">http://www.artima.com/weblogs/viewpost.jsp?thread=98196</a>)<p>Ruby lets you do it however you want to. I don't see myself learning Python any time soon."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Python vs Ruby, slightly more in-depth"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://rapd.wordpress.com/2009/07/13/python-vs-ruby-slightly-more-in-depth/"}},"_tags":["comment","author_wooby","story_741257"],"author":"wooby","comment_text":"<p><pre><code> Python Ruby\n map collect,map\n lambda block\n filter select\n ? reject\n reduce (functools) inject (native)\n</code></pre>\nGuido van Rossum on inclusion of 'reduce' in Python 3.0, in 2005:<p>\"This is actually the one I've always hated most, because, apart from a few examples involving + or *, almost every time I see a reduce() call with a non-trivial function argument, I need to grab pen and paper to diagram what's actually being fed into that function before I understand what the reduce() is supposed to do. So in my mind, the applicability of reduce() is pretty much limited to associative operators, and in all other cases it's better to write out the accumulation loop explicitly\" (<a href=\"http://www.artima.com/weblogs/viewpost.jsp?thread=98196\" rel=\"nofollow\">http://www.artima.com/weblogs/viewpost.jsp?thread=98196</a>)<p>Ruby lets you do it however you want to. I don't see myself learning Python any time soon.","created_at":"2009-08-04T23:09:39Z","created_at_i":1249427379,"objectID":"742408","parent_id":741257,"story_id":741257,"story_title":"Python vs Ruby, slightly more in-depth","story_url":"http://rapd.wordpress.com/2009/07/13/python-vs-ruby-slightly-more-in-depth/","updated_at":"2024-09-19T16:40:30Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I have very fond memories of Radio Shack also. It's where my dad bought the first family computer, a Tandy 486, when I was in elementary school. The guy who sold it to us was friendly and knowledgeable. I remember asking him how I might program the computer myself. He said \"Try QuickBASIC, and make an effort to learn how to touch type. It will pay off.\" It was some of the best programming advice I've ever gotten.<p>It seems like the \"hacker\" side of Radio Shack has fallen victim to the age of comparison shopping and online communication. For me growing up in a small town, Radio Shack was the place to go for technical advice from very smart people. And really, it was; Radio Shack was one of the few places where tech-savvy people could make money at a 9-5 with their skills and knowledge in just about every town in America. It was an ubiquitous bastion of DIY and technological enlightenment.<p>The few times I've been to a store since childhood I've been less than impressed with both the salespeople and products. It seemed like each time I was there, another drawer had disappeared from the electronic component rack.<p>So, whether they're changing the name or not, the real Radio Shack was gone a long time ago."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Nine reasons RadioShack shouldn't change its name."},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://technologizer.com/2009/08/03/nin-reasons-radioshack-shouldnt-change-its-name/"}},"_tags":["comment","author_wooby","story_738812"],"author":"wooby","comment_text":"I have very fond memories of Radio Shack also. It's where my dad bought the first family computer, a Tandy 486, when I was in elementary school. The guy who sold it to us was friendly and knowledgeable. I remember asking him how I might program the computer myself. He said \"Try QuickBASIC, and make an effort to learn how to touch type. It will pay off.\" It was some of the best programming advice I've ever gotten.<p>It seems like the \"hacker\" side of Radio Shack has fallen victim to the age of comparison shopping and online communication. For me growing up in a small town, Radio Shack was the place to go for technical advice from very smart people. And really, it was; Radio Shack was one of the few places where tech-savvy people could make money at a 9-5 with their skills and knowledge in just about every town in America. It was an ubiquitous bastion of DIY and technological enlightenment.<p>The few times I've been to a store since childhood I've been less than impressed with both the salespeople and products. It seemed like each time I was there, another drawer had disappeared from the electronic component rack.<p>So, whether they're changing the name or not, the real Radio Shack was gone a long time ago.","created_at":"2009-08-03T10:16:31Z","created_at_i":1249294591,"objectID":"738929","parent_id":738856,"story_id":738812,"story_title":"Nine reasons RadioShack shouldn't change its name.","story_url":"http://technologizer.com/2009/08/03/nin-reasons-radioshack-shouldnt-change-its-name/","updated_at":"2024-09-19T16:40:06Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Functional (kinda) PHP with Phunctional"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/154093030/functional-kinda-php-with-phunctional"}},"_tags":["story","author_wooby","story_737190"],"author":"wooby","children":[737195],"created_at":"2009-08-02T07:45:54Z","created_at_i":1249199154,"num_comments":1,"objectID":"737190","points":3,"story_id":737190,"story_text":"","title":"Functional (kinda) PHP with Phunctional","updated_at":"2024-09-19T16:40:01Z","url":"http://alan.dipert.org/post/154093030/functional-kinda-php-with-phunctional"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Functionally-inspired array tools for PHP"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/alandipert/phunctional/tree/master"}},"_tags":["story","author_wooby","story_736612"],"author":"wooby","created_at":"2009-08-01T20:11:08Z","created_at_i":1249157468,"num_comments":0,"objectID":"736612","points":1,"story_id":736612,"story_text":"","title":"Functionally-inspired array tools for PHP","updated_at":"2024-09-19T16:39:56Z","url":"http://github.com/alandipert/phunctional/tree/master"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Formal Language Processing in Scala"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://szeiger.de/blog/2008/07/27/formal-language-processing-in-scala-part-1/"}},"_tags":["story","author_wooby","story_726840"],"author":"wooby","created_at":"2009-07-27T21:52:24Z","created_at_i":1248731544,"num_comments":0,"objectID":"726840","points":3,"story_id":726840,"story_text":"","title":"Formal Language Processing in Scala","updated_at":"2024-09-19T16:39:05Z","url":"http://szeiger.de/blog/2008/07/27/formal-language-processing-in-scala-part-1/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"That makes sense, I might test it sometime."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"My Engineyard Contest Odyssey"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey"}},"_tags":["comment","author_wooby","story_718147"],"author":"wooby","comment_text":"That makes sense, I might test it sometime.","created_at":"2009-07-23T03:57:38Z","created_at_i":1248321458,"objectID":"719037","parent_id":718762,"story_id":718147,"story_title":"My Engineyard Contest Odyssey","story_url":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey","updated_at":"2024-09-19T16:38:27Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Uhoh - I missed decimal place. 3 billion/sec would mean about 3000 of the cheapest Rackspace cloud machines, which could have been operated for 18 hours for about $810. I'm not sure Rackspace lets you have that many though."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"My Engineyard Contest Odyssey"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey"}},"_tags":["comment","author_wooby","story_718147"],"author":"wooby","comment_text":"Uhoh - I missed decimal place. 3 billion/sec would mean about 3000 of the cheapest Rackspace cloud machines, which could have been operated for 18 hours for about $810. I'm not sure Rackspace lets you have that many though.","created_at":"2009-07-23T00:01:35Z","created_at_i":1248307295,"objectID":"718794","parent_id":718736,"story_id":718147,"story_title":"My Engineyard Contest Odyssey","story_url":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey","updated_at":"2024-09-19T16:38:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If I was using just my own machine, or spent a few grand to put together my own CUDA farm, CUDA would have been great.<p>I think using cloud resources was the way to go though, because it's easy to search for keys concurrently, and you can summon an effectively unlimited amount of computing power pretty cheaply. You can add as many cloud servers as you want to your cluster without worrying about locking or divvying up work, and the number of keys your cluster is able to check per second increases linearly with the number of machines.<p>The winning team, awesome guys with a cluster of 8 very powerful computers and a CUDA program, were able to check just over 400 million keys per second. If I would have used 400 Rackspace cloud servers, it would have cost me about $100 to run them for the duration of the contest and I would have been achieving similar speeds."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"My Engineyard Contest Odyssey"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey"}},"_tags":["comment","author_wooby","story_718147"],"author":"wooby","children":[718941,718736],"comment_text":"If I was using just my own machine, or spent a few grand to put together my own CUDA farm, CUDA would have been great.<p>I think using cloud resources was the way to go though, because it's easy to search for keys concurrently, and you can summon an effectively unlimited amount of computing power pretty cheaply. You can add as many cloud servers as you want to your cluster without worrying about locking or divvying up work, and the number of keys your cluster is able to check per second increases linearly with the number of machines.<p>The winning team, awesome guys with a cluster of 8 very powerful computers and a CUDA program, were able to check just over 400 million keys per second. If I would have used 400 Rackspace cloud servers, it would have cost me about $100 to run them for the duration of the contest and I would have been achieving similar speeds.","created_at":"2009-07-22T19:57:55Z","created_at_i":1248292675,"objectID":"718425","parent_id":718399,"story_id":718147,"story_title":"My Engineyard Contest Odyssey","story_url":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey","updated_at":"2024-09-19T16:38:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Thanks for the tips. gcc builtins are definitely the next level for me.<p>I'm curious about your scanf point though. I'm using scanf/strdup before the check loop to load the words into memory. Are subsequent memcpy calls on an implicitly loaded *char dict[] array faster on non-malloc'd memory for some reason?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"My Engineyard Contest Odyssey"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey"}},"_tags":["comment","author_wooby","story_718147"],"author":"wooby","children":[718762],"comment_text":"Thanks for the tips. gcc builtins are definitely the next level for me.<p>I'm curious about your scanf point though. I'm using scanf/strdup before the check loop to load the words into memory. Are subsequent memcpy calls on an implicitly loaded *char dict[] array faster on non-malloc'd memory for some reason?","created_at":"2009-07-22T19:18:40Z","created_at_i":1248290320,"objectID":"718342","parent_id":718283,"story_id":718147,"story_title":"My Engineyard Contest Odyssey","story_url":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey","updated_at":"2024-09-19T16:38:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"My Engineyard Contest Odyssey"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey"}},"_tags":["story","author_wooby","story_718147"],"author":"wooby","children":[718283,718399,719365],"created_at":"2009-07-22T16:55:10Z","created_at_i":1248281710,"num_comments":10,"objectID":"718147","points":21,"story_id":718147,"story_text":"","title":"My Engineyard Contest Odyssey","updated_at":"2024-09-19T16:38:22Z","url":"http://alan.dipert.org/post/146555473/my-engineyard-contest-odyssey"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"In Nielsen's \"Designing Web Usability\" I remember him frowning on the use of \"here\" and \"click here\" as links. Since around 2000, when I first read the book, I heeded his advice.<p><pre><code> For more information: click here\n To sign up, go here\n</code></pre>\nwere cardinal no-nos, if I remember correctly.<p>But it looks like everybody else uses this technique, and the average web surfer is more likely to click give the redundant area to click on.<p>Maybe people are just more comfortable with \"click here\" when the links lead to an undefined word, like Twitter. Would it be true to say that most people on the web don't know what Twitter is? Do most of Curtis's visitors know what it is? If most of his visitors don't know, are they clicking on \"here\" because it's a more comfortable link given Twitter is undefined? While each of his test cases vary in wording, the first 3 are all alike in that twitter is the only word hyperlinked.<p>My theory is that people are less likely to click on hyperlinks if the hyperlinked text or word is something they don't know about. If you're talking about a brand name, service, or anything not general knowledge than you're better off with \"click here.\""},"story_title":{"matchLevel":"none","matchedWords":[],"value":"You should follow me on Twitter"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://dustincurtis.com/you_should_follow_me_on_twitter.html"}},"_tags":["comment","author_wooby","story_704738"],"author":"wooby","comment_text":"In Nielsen's \"Designing Web Usability\" I remember him frowning on the use of \"here\" and \"click here\" as links. Since around 2000, when I first read the book, I heeded his advice.<p><pre><code> For more information: click here\n To sign up, go here\n</code></pre>\nwere cardinal no-nos, if I remember correctly.<p>But it looks like everybody else uses this technique, and the average web surfer is more likely to click give the redundant area to click on.<p>Maybe people are just more comfortable with \"click here\" when the links lead to an undefined word, like Twitter. Would it be true to say that most people on the web don't know what Twitter is? Do most of Curtis's visitors know what it is? If most of his visitors don't know, are they clicking on \"here\" because it's a more comfortable link given Twitter is undefined? While each of his test cases vary in wording, the first 3 are all alike in that twitter is the only word hyperlinked.<p>My theory is that people are less likely to click on hyperlinks if the hyperlinked text or word is something they don't know about. If you're talking about a brand name, service, or anything not general knowledge than you're better off with \"click here.\"","created_at":"2009-07-15T01:10:37Z","created_at_i":1247620237,"objectID":"704930","parent_id":704738,"story_id":704738,"story_title":"You should follow me on Twitter","story_url":"http://dustincurtis.com/you_should_follow_me_on_twitter.html","updated_at":"2024-09-19T16:37:08Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"How much they've made so far, with scala:<p><pre><code> scala> def income(n_users:Int) = (1 to n_users) map(i => (i-1)*.001) reduceLeft(_+_)\n income: (Int)Double\n\n scala> income(2901)\n res0: Double = 4206.45</code></pre>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Pinboard - antisocial bookmarking"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.pinboard.in"}},"_tags":["comment","author_wooby","story_702914"],"author":"wooby","children":[703275],"comment_text":"How much they've made so far, with scala:<p><pre><code> scala> def income(n_users:Int) = (1 to n_users) map(i => (i-1)*.001) reduceLeft(_+_)\n income: (Int)Double\n\n scala> income(2901)\n res0: Double = 4206.45</code></pre>","created_at":"2009-07-14T05:23:20Z","created_at_i":1247549000,"objectID":"703148","parent_id":702952,"story_id":702914,"story_title":"Pinboard - antisocial bookmarking","story_url":"http://www.pinboard.in","updated_at":"2024-09-19T16:37:02Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Hi, I've been there, and seen more than one up close.<p>You're right - there are a number of triggering methods in use, to include IR, GPRS/\"family band\" radio, and cell. More sophisticated devices use a combination, like cell arming and IR/pressure plate/trip cord detonation. Simple command-wire detonation begat command-wire with a stand-off cell phone arming unit. This was so we couldn't follow wires to the bomber. For a time fake command wires were set up and boobytrapped. When we stopped following wires, they'd do it again. Or use something really simple like a washing machine timer for a regularly scheduled convoy.<p>In Afghanistan (at least 5 years ago), \"long range cordless\" was a popular option in remote areas without cell grids. These are Chinese-made cordless phones operating in the 20-40mhz frequencies with ranges of 10 miles or more. These are also popular in areas of Iraq without cell infrastructure.<p>It is a cat and mouse game of trigger mechanisms versus detection/deterrent. New detonation methods would show up all the time, with various techniques being popular in different regions at any given time (in both Iraq and Afghanistan). New methods are analyzed, equipment is designed to counter, companies bid on devices, and the countermeasures are pushed into the warzone as quickly as possible. Unfortunately, in my experience, these devices are always behind the curve.<p>It wouldn't be a good idea for me to go into detail about what these detection and deterrence methods do specifically. Sufficed to say I browsed this article's responses and didn't run into any suggestions or techniques that I hadn't personally used or seen implemented.<p>There's a wide variety of communications equipment insurgents have access to, because there aren't Iraqi or Afghan equivalents of the FCC. There is access to consumer radios and devices of all frequencies and outputs in these countries. The entire spectrum is game. I don't think there's a magic deterrent or detection method here.<p>Our best bet was always to schedule movements and map routes as erratically and randomly as possible. If we could, we would mix vehicle movements with foot and air movement. Keeping a good relationship with locals and randomizing movement as much as possible proved much more valuable than using the hottest new gizmo. Pulling over and buying a soda from a street vendor and chatting with the local police generally yielded better information about the road ahead than sitting sealed in an armored vehicle staring at computer displays."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"'This is what an IED looks like. I took this photo near Kandahar.'"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://trueslant.com/pjtobia/2009/07/13/this-is-what-an-ied-looks-like/"}},"_tags":["comment","author_wooby","story_702086"],"author":"wooby","children":[702614],"comment_text":"Hi, I've been there, and seen more than one up close.<p>You're right - there are a number of triggering methods in use, to include IR, GPRS/\"family band\" radio, and cell. More sophisticated devices use a combination, like cell arming and IR/pressure plate/trip cord detonation. Simple command-wire detonation begat command-wire with a stand-off cell phone arming unit. This was so we couldn't follow wires to the bomber. For a time fake command wires were set up and boobytrapped. When we stopped following wires, they'd do it again. Or use something really simple like a washing machine timer for a regularly scheduled convoy.<p>In Afghanistan (at least 5 years ago), \"long range cordless\" was a popular option in remote areas without cell grids. These are Chinese-made cordless phones operating in the 20-40mhz frequencies with ranges of 10 miles or more. These are also popular in areas of Iraq without cell infrastructure.<p>It is a cat and mouse game of trigger mechanisms versus detection/deterrent. New detonation methods would show up all the time, with various techniques being popular in different regions at any given time (in both Iraq and Afghanistan). New methods are analyzed, equipment is designed to counter, companies bid on devices, and the countermeasures are pushed into the warzone as quickly as possible. Unfortunately, in my experience, these devices are always behind the curve.<p>It wouldn't be a good idea for me to go into detail about what these detection and deterrence methods do specifically. Sufficed to say I browsed this article's responses and didn't run into any suggestions or techniques that I hadn't personally used or seen implemented.<p>There's a wide variety of communications equipment insurgents have access to, because there aren't Iraqi or Afghan equivalents of the FCC. There is access to consumer radios and devices of all frequencies and outputs in these countries. The entire spectrum is game. I don't think there's a magic deterrent or detection method here.<p>Our best bet was always to schedule movements and map routes as erratically and randomly as possible. If we could, we would mix vehicle movements with foot and air movement. Keeping a good relationship with locals and randomizing movement as much as possible proved much more valuable than using the hottest new gizmo. Pulling over and buying a soda from a street vendor and chatting with the local police generally yielded better information about the road ahead than sitting sealed in an armored vehicle staring at computer displays.","created_at":"2009-07-13T21:49:12Z","created_at_i":1247521752,"objectID":"702566","parent_id":702476,"story_id":702086,"story_title":"'This is what an IED looks like. I took this photo near Kandahar.'","story_url":"http://trueslant.com/pjtobia/2009/07/13/this-is-what-an-ied-looks-like/","updated_at":"2024-09-19T16:36:56Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It would be cool to have HTTP proxy software that did this. So you set it as 'ie6' and it looks at your CSS and HTML and translates it into the \"ie6 view\" with problems annotated."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Why everyone should use Safari for rich web development"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://mir.aculo.us/2009/07/09/why-i-use-safari-for-development/"}},"_tags":["comment","author_wooby","story_695708"],"author":"wooby","comment_text":"It would be cool to have HTTP proxy software that did this. So you set it as 'ie6' and it looks at your CSS and HTML and translates it into the \"ie6 view\" with problems annotated.","created_at":"2009-07-09T19:52:45Z","created_at_i":1247169165,"objectID":"696549","parent_id":696347,"story_id":695708,"story_title":"Why everyone should use Safari for rich web development","story_url":"http://mir.aculo.us/2009/07/09/why-i-use-safari-for-development/","updated_at":"2024-09-19T16:44:32Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Slackware is pretty BSD-like also; I know it's pretty straightforward to use NetBSD's pkgsrc (a fork of FreeBSD's ports mentioned in the link) on Slack. Like Arch, Slackware uses the BSD init system."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"BSD For Linux Users"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.over-yonder.net/~fullermd/rants/bsd4linux/bsd4linux1.php"}},"_tags":["comment","author_wooby","story_690943"],"author":"wooby","children":[691678],"comment_text":"Slackware is pretty BSD-like also; I know it's pretty straightforward to use NetBSD's pkgsrc (a fork of FreeBSD's ports mentioned in the link) on Slack. Like Arch, Slackware uses the BSD init system.","created_at":"2009-07-07T07:55:50Z","created_at_i":1246953350,"objectID":"691115","parent_id":691089,"story_id":690943,"story_title":"BSD For Linux Users","story_url":"http://www.over-yonder.net/~fullermd/rants/bsd4linux/bsd4linux1.php","updated_at":"2024-09-19T16:44:02Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Sometimes even when I define what done means before I start a project, I embarrass myself with my underestimates of complexity. Software is just plain fickle. Proof of concept on most any web app? Weekend. Something that satisfies anyone but me? At least two weekends :)"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The Mythical Man Weekend"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.clickdeck360.com/the-mythical-man-weekend"}},"_tags":["comment","author_wooby","story_690227"],"author":"wooby","children":[690393,690369],"comment_text":"Sometimes even when I define what done means before I start a project, I embarrass myself with my underestimates of complexity. Software is just plain fickle. Proof of concept on most any web app? Weekend. Something that satisfies anyone but me? At least two weekends :)","created_at":"2009-07-06T20:12:33Z","created_at_i":1246911153,"objectID":"690364","parent_id":690351,"story_id":690227,"story_title":"The Mythical Man Weekend","story_url":"http://blog.clickdeck360.com/the-mythical-man-weekend","updated_at":"2024-09-19T16:43:56Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I agree 100%. Despite Scala's hype and functional influences, it's most exciting to me simply as another option for the JVM, and another \"tool in the toolbox.\"<p>Assuming you consider something JVM-based an eligible tool for a job, you have a wide variety of programming languages on a common platform to pick from. While it's probably not a good idea to apply them all in a project, it's nice to know that in the future the probability of you being able to reuse code in disparate languages increases."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Scala as long-term replacement for Java"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html"}},"_tags":["comment","author_wooby","story_689496"],"author":"wooby","children":[689762],"comment_text":"I agree 100%. Despite Scala's hype and functional influences, it's most exciting to me simply as another option for the JVM, and another \"tool in the toolbox.\"<p>Assuming you consider something JVM-based an eligible tool for a job, you have a wide variety of programming languages on a common platform to pick from. While it's probably not a good idea to apply them all in a project, it's nice to know that in the future the probability of you being able to reuse code in disparate languages increases.","created_at":"2009-07-06T12:55:14Z","created_at_i":1246884914,"objectID":"689553","parent_id":689513,"story_id":689496,"story_title":"Scala as long-term replacement for Java","story_url":"http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html","updated_at":"2024-09-19T16:43:51Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"You can, sort of - create \"mindmap\", \"django\", and \"project31\" directories and in each of them put a symbolic link to your file. Tagging, the unix way. A script or GUI for doing that might be useful, maybe."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Idea: Labels in OS instead of folders"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_686443"],"author":"wooby","comment_text":"You can, sort of - create \"mindmap\", \"django\", and \"project31\" directories and in each of them put a symbolic link to your file. Tagging, the unix way. A script or GUI for doing that might be useful, maybe.","created_at":"2009-07-03T21:10:39Z","created_at_i":1246655439,"objectID":"686620","parent_id":686443,"story_id":686443,"story_title":"Idea: Labels in OS instead of folders","story_url":"","updated_at":"2024-09-19T16:43:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Still very cool though, thanks for the link."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Books About Parsing"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.reverberate.org/2009/06/26/books-about-parsing/"}},"_tags":["comment","author_wooby","story_679300"],"author":"wooby","comment_text":"Still very cool though, thanks for the link.","created_at":"2009-06-29T22:22:38Z","created_at_i":1246314158,"objectID":"679808","parent_id":679625,"story_id":679300,"story_title":"Books About Parsing","story_url":"http://blog.reverberate.org/2009/06/26/books-about-parsing/","updated_at":"2024-09-19T16:42:49Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The definition of \"everyone\" is even more difficult than \"opposite,\" I think. If the definition of \"everyone\" is \"most people on the planet,\" then developing Web apps is as close to the opposite of subsisting in a developing country I can think of.<p>This post is a pretty useless generalization, notable only because the guy who wrote it is wildly successful. And somehow, we're supposed to learn something from it -- \"Thanks.\""},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Doing the opposite of everyone is valuable"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://sivers.org/contrarian"}},"_tags":["comment","author_wooby","story_672481"],"author":"wooby","comment_text":"The definition of \"everyone\" is even more difficult than \"opposite,\" I think. If the definition of \"everyone\" is \"most people on the planet,\" then developing Web apps is as close to the opposite of subsisting in a developing country I can think of.<p>This post is a pretty useless generalization, notable only because the guy who wrote it is wildly successful. And somehow, we're supposed to learn something from it -- \"Thanks.\"","created_at":"2009-06-25T02:28:18Z","created_at_i":1245896898,"objectID":"673054","parent_id":672796,"story_id":672481,"story_title":"Doing the opposite of everyone is valuable","story_url":"http://sivers.org/contrarian","updated_at":"2024-09-19T16:42:18Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Were you \"pestering him with irrational questions\" just to test his limits? If so, then the question in your post can probably be answered by people who know you."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN; How to gain control over frustration? "}},"_tags":["comment","author_wooby","story_666123"],"author":"wooby","comment_text":"Were you \"pestering him with irrational questions\" just to test his limits? If so, then the question in your post can probably be answered by people who know you.","created_at":"2009-06-20T05:18:16Z","created_at_i":1245475096,"objectID":"666163","parent_id":666123,"points":null,"story_id":666123,"story_title":"Ask HN; How to gain control over frustration? ","updated_at":"2023-09-06T19:51:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I ran into a paper called \"The Next 700 Languages\" while doing Scala research. The paper, written in 1966, is lengthy but awesome. Its conclusion reminded me a lot of PGs paper, which I hadn't read:<p>The languages people use to communicate with computers differ in their intended aptitudes, towards either a particular application area, or a particular phase of computer use (high level programming, program assembly, job scheduling, etc). They also differ in physical appearance, and more important, in logical structure. The question arises, do the idiosyncracies reflect basic logical properties of the situations that are being catered for? Or are they accidents of history and personal background that may be obscuring fruitful developments? This question is clearly important if we are trying to predict or influence language evolution.<p>To answer it we must think in terms, not of languages, but of families of languages. That is to say we must systematize their design so that a new language is a point chosen from a well-mapped space, rather than a laboriously devised construction.<p>PDF: <a href=\"http://ttic.uchicago.edu/~blume/classes/aut2008/proglang/papers/Landin-next-700.pdf\" rel=\"nofollow\">http://ttic.uchicago.edu/~blume/classes/aut2008/proglang/pap...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Someone at Wired.com just found pg's \"The Hundred Year Language\"."},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.wired.com/beyond_the_beyond/2009/06/dead-media-beat-evolution-of-computer-languages/"}},"_tags":["comment","author_wooby","story_656641"],"author":"wooby","comment_text":"I ran into a paper called \"The Next 700 Languages\" while doing Scala research. The paper, written in 1966, is lengthy but awesome. Its conclusion reminded me a lot of PGs paper, which I hadn't read:<p>The languages people use to communicate with computers differ in their intended aptitudes, towards either a particular application area, or a particular phase of computer use (high level programming, program assembly, job scheduling, etc). They also differ in physical appearance, and more important, in logical structure. The question arises, do the idiosyncracies reflect basic logical properties of the situations that are being catered for? Or are they accidents of history and personal background that may be obscuring fruitful developments? This question is clearly important if we are trying to predict or influence language evolution.<p>To answer it we must think in terms, not of languages, but of families of languages. That is to say we must systematize their design so that a new language is a point chosen from a well-mapped space, rather than a laboriously devised construction.<p>PDF: <a href=\"http://ttic.uchicago.edu/~blume/classes/aut2008/proglang/papers/Landin-next-700.pdf\" rel=\"nofollow\">http://ttic.uchicago.edu/~blume/classes/aut2008/proglang/pap...</a>","created_at":"2009-06-14T02:20:44Z","created_at_i":1244946044,"objectID":"656730","parent_id":656641,"story_id":656641,"story_title":"Someone at Wired.com just found pg's \"The Hundred Year Language\".","story_url":"http://www.wired.com/beyond_the_beyond/2009/06/dead-media-beat-evolution-of-computer-languages/","updated_at":"2024-09-19T16:40:50Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"That's a really, really awesome idea. It's like combining the best of twitter with the best of social news."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Would you guys visit a purely hacker-oriented version of HN?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_655711"],"author":"wooby","comment_text":"That's a really, really awesome idea. It's like combining the best of twitter with the best of social news.","created_at":"2009-06-13T09:52:43Z","created_at_i":1244886763,"objectID":"656009","parent_id":655975,"story_id":655711,"story_title":"Ask HN: Would you guys visit a purely hacker-oriented version of HN?","story_url":"","updated_at":"2024-09-19T16:40:50Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I enjoy the engineering tunnel vision that good days on HN provide me. On the bad days, HN, for me, is sort of only the culture and pieces of society that those who don't know much about either are interested in. To learn about people, places, and things I don't know anything about that aren't hacking related - I go outside."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Would you guys visit a purely hacker-oriented version of HN?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_655711"],"author":"wooby","comment_text":"I enjoy the engineering tunnel vision that good days on HN provide me. On the bad days, HN, for me, is sort of only the culture and pieces of society that those who don't know much about either are interested in. To learn about people, places, and things I don't know anything about that aren't hacking related - I go outside.","created_at":"2009-06-13T07:04:57Z","created_at_i":1244876697,"objectID":"655927","parent_id":655895,"points":null,"story_id":655711,"story_title":"Ask HN: Would you guys visit a purely hacker-oriented version of HN?","story_url":"","updated_at":"2023-09-06T19:50:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Have you checked out <a href=\"http://prgmr.com/xen/\" rel=\"nofollow\">http://prgmr.com/xen/</a>? With their cheapest yearly plan and something like <a href=\"https://www.backblaze.com/\" rel=\"nofollow\">https://www.backblaze.com/</a>, you can get a VPS and off-site backups for about $10 a month.<p>I'm not on prgmr yet but I've heard good things. And Backblaze is awesome."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Self-hosted vs outsourcing"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.puncht.com/2009/06/10/self-vs-outsourcing/"}},"_tags":["comment","author_wooby","story_650761"],"author":"wooby","children":[650825],"comment_text":"Have you checked out <a href=\"http://prgmr.com/xen/\" rel=\"nofollow\">http://prgmr.com/xen/</a>? With their cheapest yearly plan and something like <a href=\"https://www.backblaze.com/\" rel=\"nofollow\">https://www.backblaze.com/</a>, you can get a VPS and off-site backups for about $10 a month.<p>I'm not on prgmr yet but I've heard good things. And Backblaze is awesome.","created_at":"2009-06-10T11:19:43Z","created_at_i":1244632783,"objectID":"650820","parent_id":650803,"points":null,"story_id":650761,"story_title":"Self-hosted vs outsourcing","story_url":"http://blog.puncht.com/2009/06/10/self-vs-outsourcing/","updated_at":"2023-09-06T19:50:05Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"GitHub Firewall Install is a turnkey, local GitHub. I'm not into hosting commercial software in private repos on GitHub though. It's periodically down, and that stuff needs to work. And GitHub FI looks pricey.<p>I think I'm better off with a VPS, gitosis, and local backups. It's cheap, it works, and it doesn't matter that I don't have all the cool social networking aspects of GitHub."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Self-hosted vs outsourcing"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.puncht.com/2009/06/10/self-vs-outsourcing/"}},"_tags":["comment","author_wooby","story_650761"],"author":"wooby","children":[650913,650805,650803],"comment_text":"GitHub Firewall Install is a turnkey, local GitHub. I'm not into hosting commercial software in private repos on GitHub though. It's periodically down, and that stuff needs to work. And GitHub FI looks pricey.<p>I think I'm better off with a VPS, gitosis, and local backups. It's cheap, it works, and it doesn't matter that I don't have all the cool social networking aspects of GitHub.","created_at":"2009-06-10T10:41:49Z","created_at_i":1244630509,"objectID":"650794","parent_id":650787,"points":null,"story_id":650761,"story_title":"Self-hosted vs outsourcing","story_url":"http://blog.puncht.com/2009/06/10/self-vs-outsourcing/","updated_at":"2023-09-06T19:50:05Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"There's a checkbox in the preferences to 'send updates to google.' Here's for hoping unchecking it works - this is pretty cool."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Official Google Mac Blog: Introducing Google Quick Search Box"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://googlemac.blogspot.com/2009/06/introducing-google-quick-search-box.html"}},"_tags":["comment","author_wooby","story_650139"],"author":"wooby","comment_text":"There's a checkbox in the preferences to 'send updates to google.' Here's for hoping unchecking it works - this is pretty cool.","created_at":"2009-06-10T02:01:06Z","created_at_i":1244599266,"objectID":"650397","parent_id":650350,"points":null,"story_id":650139,"story_title":"Official Google Mac Blog: Introducing Google Quick Search Box","story_url":"http://googlemac.blogspot.com/2009/06/introducing-google-quick-search-box.html","updated_at":"2023-09-06T19:50:05Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It's not negative in that, people can program using whatever language they want using whatever language constructs they want.<p>But for PHP, which is mostly for web development, I would think using exceptions is a much peer-friendlier way of handling what you'd probably be using goto for in a web app.<p>If you're writing state machines or parsers, PHP probably isn't the way to go anyway. But hey - whatever floats your boat."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"PHP introduces \"goto\""},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.php.net/manual/en/control-structures.goto.php"}},"_tags":["comment","author_wooby","story_649507"],"author":"wooby","comment_text":"It's not negative in that, people can program using whatever language they want using whatever language constructs they want.<p>But for PHP, which is mostly for web development, I would think using exceptions is a much peer-friendlier way of handling what you'd probably be using goto for in a web app.<p>If you're writing state machines or parsers, PHP probably isn't the way to go anyway. But hey - whatever floats your boat.","created_at":"2009-06-09T20:03:41Z","created_at_i":1244577821,"objectID":"649856","parent_id":649804,"points":null,"story_id":649507,"story_title":"PHP introduces \"goto\"","story_url":"http://www.php.net/manual/en/control-structures.goto.php","updated_at":"2023-09-06T19:49:57Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"In the example where he shows that the PayPal logo requires a bit of microcopy to explain you don't need a PayPal account to purchase, might it be cleaner to just feature the PayPal logo alongside the other credit card icons? The other example, where he specifies the billing address - well, I can't really think of a better way.<p>While I use it from time to time myself, my gut feeling is that if you find yourself needing microcopy, you might be missing something.<p>I refer back to this Nielsen Alertbox from 2005 <a href=\"http://www.useit.com/alertbox/forms.html\" rel=\"nofollow\">http://www.useit.com/alertbox/forms.html</a> from time to time. Basically, Nielsen thinks that \"help\" items are fine, as long as they're on the same page, in the same context, and your form is as short as possible."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Writing Microcopy"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://bokardo.com/archives/writing-microcopy/"}},"_tags":["comment","author_wooby","story_649229"],"author":"wooby","children":[650510],"comment_text":"In the example where he shows that the PayPal logo requires a bit of microcopy to explain you don't need a PayPal account to purchase, might it be cleaner to just feature the PayPal logo alongside the other credit card icons? The other example, where he specifies the billing address - well, I can't really think of a better way.<p>While I use it from time to time myself, my gut feeling is that if you find yourself needing microcopy, you might be missing something.<p>I refer back to this Nielsen Alertbox from 2005 <a href=\"http://www.useit.com/alertbox/forms.html\" rel=\"nofollow\">http://www.useit.com/alertbox/forms.html</a> from time to time. Basically, Nielsen thinks that \"help\" items are fine, as long as they're on the same page, in the same context, and your form is as short as possible.","created_at":"2009-06-09T16:27:06Z","created_at_i":1244564826,"objectID":"649326","parent_id":649229,"points":null,"story_id":649229,"story_title":"Writing Microcopy","story_url":"http://bokardo.com/archives/writing-microcopy/","updated_at":"2023-09-06T19:49:57Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The government should fund code development? How would individual programmers pitch their projects to the government? Not all code that's created, even if it's free, is ever useful to anybody. Figuring out how to \"turn code into consumer value\" is a very hard problem, as I'm sure any entrepreneur would tell you. And it's sort of a backwards way of looking at how software, and the people that make it, can benefit themselves and society best. First, there needs to a problem. Then, you solve it.<p>Anyways, I think the kind of thing you're talking about already exists in a more general way - government contracts. The government decides they have a problem, comes up with a list of specifications, and bidding on the proposed solution is open. The most qualified company that solves the problem for the least amount of money or in the shortest amount of time wins. (At least, that's how it's supposed to work.)<p>Many contractors that develop for the government, and bid on these contracts, already use FOSS because it gives them a competitive edge when bidding. For instance, some versions of the FBCB2, a communications system for humvees and other military vehicles, run on Red Hat: <a href=\"http://en.wikipedia.org/wiki/FBCB2\" rel=\"nofollow\">http://en.wikipedia.org/wiki/FBCB2</a> and <a href=\"http://74.125.95.132/search?q=cache:LLwHBOS8JmYJ:www.cjmtk.com/EventRegistration/CjmtkConf07/04_FBCB2_CJMTK_Migration.PDF\" rel=\"nofollow\">http://74.125.95.132/search?q=cache:LLwHBOS8JmYJ:www.cjmtk.c...</a><p>I think that academia and savvy businesses are really where it's at with open source. As bad as academic bureaucracy can be, government bureaucracy is in my experience much, much worse.<p>So, all things considered, I'd think that even if the government had a direct interest in improving open source software, the best way to do it is through more funding for education - get more people to school, and get more people programming."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Taxpayer funded open source?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_647502"],"author":"wooby","children":[648263],"comment_text":"The government should fund code development? How would individual programmers pitch their projects to the government? Not all code that's created, even if it's free, is ever useful to anybody. Figuring out how to \"turn code into consumer value\" is a very hard problem, as I'm sure any entrepreneur would tell you. And it's sort of a backwards way of looking at how software, and the people that make it, can benefit themselves and society best. First, there needs to a problem. Then, you solve it.<p>Anyways, I think the kind of thing you're talking about already exists in a more general way - government contracts. The government decides they have a problem, comes up with a list of specifications, and bidding on the proposed solution is open. The most qualified company that solves the problem for the least amount of money or in the shortest amount of time wins. (At least, that's how it's supposed to work.)<p>Many contractors that develop for the government, and bid on these contracts, already use FOSS because it gives them a competitive edge when bidding. For instance, some versions of the FBCB2, a communications system for humvees and other military vehicles, run on Red Hat: <a href=\"http://en.wikipedia.org/wiki/FBCB2\" rel=\"nofollow\">http://en.wikipedia.org/wiki/FBCB2</a> and <a href=\"http://74.125.95.132/search?q=cache:LLwHBOS8JmYJ:www.cjmtk.com/EventRegistration/CjmtkConf07/04_FBCB2_CJMTK_Migration.PDF\" rel=\"nofollow\">http://74.125.95.132/search?q=cache:LLwHBOS8JmYJ:www.cjmtk.c...</a><p>I think that academia and savvy businesses are really where it's at with open source. As bad as academic bureaucracy can be, government bureaucracy is in my experience much, much worse.<p>So, all things considered, I'd think that even if the government had a direct interest in improving open source software, the best way to do it is through more funding for education - get more people to school, and get more people programming.","created_at":"2009-06-08T20:04:13Z","created_at_i":1244491453,"objectID":"647885","parent_id":647557,"story_id":647502,"story_title":"Ask HN: Taxpayer funded open source?","story_url":"","updated_at":"2024-09-19T16:40:01Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"lynx -dump <a href=\"http://www.google.com\" rel=\"nofollow\">http://www.google.com</a> | figlet"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Your web site as an ASCII art"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.sucuri.net/?page=tools&title=site2ascii"}},"_tags":["comment","author_wooby","story_646092"],"author":"wooby","comment_text":"lynx -dump <a href=\"http://www.google.com\" rel=\"nofollow\">http://www.google.com</a> | figlet","created_at":"2009-06-07T23:24:15Z","created_at_i":1244417055,"objectID":"646520","parent_id":646092,"story_id":646092,"story_title":"Your web site as an ASCII art","story_url":"http://www.sucuri.net/?page=tools&title=site2ascii","updated_at":"2024-09-19T16:39:57Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It's a C compiler that targets (generates code written in) higher level languages.<p>Usually, C compilers target machine code for a particular processor architecture. gcc, for instance, can 'generate code written in' x86 machine code."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Clue: an ANSI C compiler targeting high level languages"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://cluecc.sourceforge.net/"}},"_tags":["comment","author_wooby","story_640932"],"author":"wooby","comment_text":"It's a C compiler that targets (generates code written in) higher level languages.<p>Usually, C compilers target machine code for a particular processor architecture. gcc, for instance, can 'generate code written in' x86 machine code.","created_at":"2009-06-04T07:38:23Z","created_at_i":1244101103,"objectID":"641084","parent_id":641079,"points":null,"story_id":640932,"story_title":"Clue: an ANSI C compiler targeting high level languages","story_url":"http://cluecc.sourceforge.net/","updated_at":"2023-09-06T19:49:20Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"epic shave"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Clue: an ANSI C compiler targeting high level languages"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://cluecc.sourceforge.net/"}},"_tags":["comment","author_wooby","story_640932"],"author":"wooby","comment_text":"epic shave","created_at":"2009-06-04T07:04:13Z","created_at_i":1244099053,"objectID":"641068","parent_id":640932,"points":null,"story_id":640932,"story_title":"Clue: an ANSI C compiler targeting high level languages","story_url":"http://cluecc.sourceforge.net/","updated_at":"2023-09-06T19:49:20Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I worked briefly on a C FastCGI that matched routes to function pointers, sort of like Sinatra.<p>I think the \"real\" way to do it is with Apache Axis2/C, though."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"When announcing your new web framework, don't be a douche"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://jrmehle.com/2009/06/02/dont-be-a-douche/"}},"_tags":["comment","author_wooby","story_638198"],"author":"wooby","comment_text":"I worked briefly on a C FastCGI that matched routes to function pointers, sort of like Sinatra.<p>I think the \"real\" way to do it is with Apache Axis2/C, though.","created_at":"2009-06-02T23:20:49Z","created_at_i":1243984849,"objectID":"638867","parent_id":638482,"points":null,"story_id":638198,"story_title":"When announcing your new web framework, don't be a douche","story_url":"http://jrmehle.com/2009/06/02/dont-be-a-douche/","updated_at":"2023-09-06T19:49:07Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I wrote the upload and download handlers for droplink.me in C as FastCGIs, anticipating performance problems. I built it; but they never really came. It was a fun exercise, but if I wasn't interested in having fun with C, I would have written it in a dynamic language.<p>I think the reason there isn't a \"C web development community\" is that programmers are more than willing to trade time for performance. Safe, readable code can be written in high level languages in a snap. You can see your ideas happen very quickly. If you run into performance problems (which I think is safe to say is a fairly rare occurrence for the average web developer who produces decent code, in any language), you can a) refactor or streamline what you already have or b) start fresh, lessons learned, in something lower level.<p>An aside: the site <a href=\"http://halfbakery.com\" rel=\"nofollow\">http://halfbakery.com</a> is implemented entirely as an Apache module."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Web Applications Should Be Compiled"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://ediblepet.net/2009/05/23/web-applications-should-be-compile/"}},"_tags":["comment","author_wooby","story_637676"],"author":"wooby","comment_text":"I wrote the upload and download handlers for droplink.me in C as FastCGIs, anticipating performance problems. I built it; but they never really came. It was a fun exercise, but if I wasn't interested in having fun with C, I would have written it in a dynamic language.<p>I think the reason there isn't a \"C web development community\" is that programmers are more than willing to trade time for performance. Safe, readable code can be written in high level languages in a snap. You can see your ideas happen very quickly. If you run into performance problems (which I think is safe to say is a fairly rare occurrence for the average web developer who produces decent code, in any language), you can a) refactor or streamline what you already have or b) start fresh, lessons learned, in something lower level.<p>An aside: the site <a href=\"http://halfbakery.com\" rel=\"nofollow\">http://halfbakery.com</a> is implemented entirely as an Apache module.","created_at":"2009-06-02T12:51:52Z","created_at_i":1243947112,"objectID":"637714","parent_id":637676,"story_id":637676,"story_title":"Web Applications Should Be Compiled","story_url":"http://ediblepet.net/2009/05/23/web-applications-should-be-compile/","updated_at":"2024-09-19T16:39:09Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"For sure. I'm just using XML literals in the example because it looks cool. But I'm also using this for a client job, and it's producing JSON.<p>It's not nearly as powerful as the real Sinatra, but it saves me the shenanigans of warbling Sinatra apps for servlet deployment."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Sinatra clone in Scala"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/alandipert/step/tree/master"}},"_tags":["comment","author_wooby","story_634576"],"author":"wooby","comment_text":"For sure. I'm just using XML literals in the example because it looks cool. But I'm also using this for a client job, and it's producing JSON.<p>It's not nearly as powerful as the real Sinatra, but it saves me the shenanigans of warbling Sinatra apps for servlet deployment.","created_at":"2009-05-31T19:33:55Z","created_at_i":1243798435,"objectID":"634992","parent_id":634937,"points":null,"story_id":634576,"story_title":"Sinatra clone in Scala","story_url":"http://github.com/alandipert/step/tree/master","updated_at":"2023-09-06T19:48:47Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I haven't used maven (the first version of this thing used ant+ivy), but it was pretty messy compared to what I have going now. I'd say if you have the luxury of working with a Scala-only project, sbt is definitely the way to go."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Sinatra clone in Scala"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/alandipert/step/tree/master"}},"_tags":["comment","author_wooby","story_634576"],"author":"wooby","comment_text":"I haven't used maven (the first version of this thing used ant+ivy), but it was pretty messy compared to what I have going now. I'd say if you have the luxury of working with a Scala-only project, sbt is definitely the way to go.","created_at":"2009-05-31T13:49:42Z","created_at_i":1243777782,"objectID":"634682","parent_id":634679,"points":null,"story_id":634576,"story_title":"Sinatra clone in Scala","story_url":"http://github.com/alandipert/step/tree/master","updated_at":"2023-09-06T19:48:47Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Yeah it's pretty small. With Scala you basically get free HTML templating because of XML literal support. It's missing a lot of Sinatra stuff though: 'splat' and regex URI pattern matching, file uploads, sessions..."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Sinatra clone in Scala"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/alandipert/step/tree/master"}},"_tags":["comment","author_wooby","story_634576"],"author":"wooby","children":[634647,634734],"comment_text":"Yeah it's pretty small. With Scala you basically get free HTML templating because of XML literal support. It's missing a lot of Sinatra stuff though: 'splat' and regex URI pattern matching, file uploads, sessions...","created_at":"2009-05-31T10:49:03Z","created_at_i":1243766943,"objectID":"634611","parent_id":634607,"points":null,"story_id":634576,"story_title":"Sinatra clone in Scala","story_url":"http://github.com/alandipert/step/tree/master","updated_at":"2023-09-06T19:48:47Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Sinatra clone in Scala"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/alandipert/step/tree/master"}},"_tags":["story","author_wooby","story_634576"],"author":"wooby","children":[634607,635411,634702,634679,634736],"created_at":"2009-05-31T09:33:59Z","created_at_i":1243762439,"num_comments":12,"objectID":"634576","points":31,"story_id":634576,"story_text":"","title":"Sinatra clone in Scala","updated_at":"2023-09-06T19:48:47Z","url":"http://github.com/alandipert/step/tree/master"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":"I find myself writing comments, looking them over, and then not submitting them pretty often. A friend of mine is the same way.<p>I'm just curious how common this is."},"title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Do you write comments, and then not submit them?"},"url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["story","author_wooby","story_629572","ask_hn"],"author":"wooby","children":[629592,629637,629619,629610,629603,629723,629589,629785,629838,629799,629661,630107,629626,631304,629600,629727,631786,629957,629590,629837,629905,629691,629635,629932,629886,629744,629725,629721,629728,629757,630042,630053,629748,629734,629699,629620,629704,629638,629992,629787],"created_at":"2009-05-28T02:03:29Z","created_at_i":1243476209,"num_comments":50,"objectID":"629572","points":61,"story_id":629572,"story_text":"I find myself writing comments, looking them over, and then not submitting them pretty often. A friend of mine is the same way.<p>I'm just curious how common this is.","title":"Ask HN: Do you write comments, and then not submit them?","updated_at":"2023-09-06T19:48:24Z","url":""},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It's nice when traveling to have electronics that all runs from AAs.<p>AAs can be found all over the world. And, if all your stuff runs the same battery, you can swap them between devices in a pinch. This computer looks awesome."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Netbook powered by 8 AA batteries"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.norhtec.com/products/gecko/index.html"}},"_tags":["comment","author_wooby","story_625498"],"author":"wooby","comment_text":"It's nice when traveling to have electronics that all runs from AAs.<p>AAs can be found all over the world. And, if all your stuff runs the same battery, you can swap them between devices in a pinch. This computer looks awesome.","created_at":"2009-05-25T17:59:34Z","created_at_i":1243274374,"objectID":"625684","parent_id":625498,"story_id":625498,"story_title":"Netbook powered by 8 AA batteries","story_url":"http://www.norhtec.com/products/gecko/index.html","updated_at":"2024-09-19T16:38:03Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Javascript Lint is a nice Spidermonkey-based syntax checker you can integrate into your IDE. I installed it with macports, but it's here: <a href=\"http://www.javascriptlint.com/index.htm\" rel=\"nofollow\">http://www.javascriptlint.com/index.htm</a><p>In vim, I do:\n:set makeprg=jsl\\ -process\\ % which binds :make to a syntax check of the current file. It's a cool thing to put in an ftplugin."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"JSLint, The Javascript Verifier"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.jslint.com/"}},"_tags":["comment","author_wooby","story_624671"],"author":"wooby","comment_text":"Javascript Lint is a nice Spidermonkey-based syntax checker you can integrate into your IDE. I installed it with macports, but it's here: <a href=\"http://www.javascriptlint.com/index.htm\" rel=\"nofollow\">http://www.javascriptlint.com/index.htm</a><p>In vim, I do:\n:set makeprg=jsl\\ -process\\ % which binds :make to a syntax check of the current file. It's a cool thing to put in an ftplugin.","created_at":"2009-05-25T03:29:42Z","created_at_i":1243222182,"objectID":"624988","parent_id":624671,"story_id":624671,"story_title":"JSLint, The Javascript Verifier","story_url":"http://www.jslint.com/","updated_at":"2024-09-19T16:37:57Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Similar setup for PHP: <a href=\"http://gravitonic.com/files/talks/php-quebec-2009/vim-for-php-programmers.pdf\" rel=\"nofollow\">http://gravitonic.com/files/talks/php-quebec-2009/vim-for-ph...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"VIM as Python IDE"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/"}},"_tags":["comment","author_wooby","story_623934"],"author":"wooby","comment_text":"Similar setup for PHP: <a href=\"http://gravitonic.com/files/talks/php-quebec-2009/vim-for-php-programmers.pdf\" rel=\"nofollow\">http://gravitonic.com/files/talks/php-quebec-2009/vim-for-ph...</a>","created_at":"2009-05-24T03:27:54Z","created_at_i":1243135674,"objectID":"624068","parent_id":623934,"story_id":623934,"story_title":"VIM as Python IDE","story_url":"http://blog.dispatched.ch/2009/05/24/vim-as-python-ide/","updated_at":"2024-09-19T16:37:57Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Resty - a bash REST client"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://github.com/micha/resty/tree/master"}},"_tags":["story","author_wooby","story_614120"],"author":"wooby","children":[614796,614600],"created_at":"2009-05-18T00:28:46Z","created_at_i":1242606526,"num_comments":4,"objectID":"614120","points":44,"story_id":614120,"story_text":"","title":"Resty - a bash REST client","updated_at":"2023-09-06T19:47:12Z","url":"http://github.com/micha/resty/tree/master"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"He's the dude who made all the builtin scripts on FreeBSD that are also in OS X, duh!<p>file /usr/bin/* | grep Bourne | cat `cut -d: -f1` | grep cperciva"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Bcrypt is now obsolete"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.daemonology.net/blog/2009-05-09-scrypt-key-derivation.html"}},"_tags":["comment","author_wooby","story_601408"],"author":"wooby","children":[601626],"comment_text":"He's the dude who made all the builtin scripts on FreeBSD that are also in OS X, duh!<p>file /usr/bin/* | grep Bourne | cat `cut -d: -f1` | grep cperciva","created_at":"2009-05-09T22:46:47Z","created_at_i":1241909207,"objectID":"601533","parent_id":601446,"story_id":601408,"story_title":"Bcrypt is now obsolete","story_url":"http://www.daemonology.net/blog/2009-05-09-scrypt-key-derivation.html","updated_at":"2024-09-19T16:35:55Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Flame PHP."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: quickest way to earn some hacker news points?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_597530"],"author":"wooby","comment_text":"Flame PHP.","created_at":"2009-05-07T06:05:07Z","created_at_i":1241676307,"objectID":"597531","parent_id":597530,"story_id":597530,"story_title":"Ask HN: quickest way to earn some hacker news points?","story_url":"","updated_at":"2024-09-19T16:37:16Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I think it's a good start, and I like the layout.<p>The easiest thing for you to blog about will be your current problems and interests as they're related to software.<p>If you post things like that, without worrying too much about whether the posts are \"interesting,\" at the very least your blog will stand as a personal journal of your progress that you can refer back to it yourself.<p>I have a blog, and I refer back to it all the time. Do I have a large readership? No.<p>In your other post an HNer suggested you blog in your native language, which I take it is Arabic. If you're interested in increasing readership, this isn't a bad idea - there are many fewer Arabic language development blogs than there are English. By choosing English, you're \"competing\" with the thousands of English blogs out there.<p>So maybe, blog in both languages? It can't hurt. Good luck!"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: what do you think of my new blog"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_592155"],"author":"wooby","comment_text":"I think it's a good start, and I like the layout.<p>The easiest thing for you to blog about will be your current problems and interests as they're related to software.<p>If you post things like that, without worrying too much about whether the posts are \"interesting,\" at the very least your blog will stand as a personal journal of your progress that you can refer back to it yourself.<p>I have a blog, and I refer back to it all the time. Do I have a large readership? No.<p>In your other post an HNer suggested you blog in your native language, which I take it is Arabic. If you're interested in increasing readership, this isn't a bad idea - there are many fewer Arabic language development blogs than there are English. By choosing English, you're \"competing\" with the thousands of English blogs out there.<p>So maybe, blog in both languages? It can't hurt. Good luck!","created_at":"2009-05-04T16:49:34Z","created_at_i":1241455774,"objectID":"592633","parent_id":592155,"story_id":592155,"story_title":"Ask HN: what do you think of my new blog","story_url":"","updated_at":"2024-09-19T16:36:50Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Usually bootlegging - many 'clone' phones use a re-themed and modified Windows Mobile 6.<p>What's interesting is that with Google Android, the phone OS is now an open game. However, Android requires significant CPU horsepower generally not found in Chinese phones.<p>This didn't stop the manufacturers of the 'Dream G2,' a phone designed to look like Android. But (unfortunately) it's not: <a href=\"http://www.engadget.com/2009/01/15/dream-g2-doesnt-get-the-irony-of-ripping-off-an-open-source-os/\" rel=\"nofollow\">http://www.engadget.com/2009/01/15/dream-g2-doesnt-get-the-i...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"In Major Shift, Apple Builds Its Own Team to Design Chips"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://online.wsj.com/article/SB124104666426570729.html"}},"_tags":["comment","author_wooby","story_586313"],"author":"wooby","comment_text":"Usually bootlegging - many 'clone' phones use a re-themed and modified Windows Mobile 6.<p>What's interesting is that with Google Android, the phone OS is now an open game. However, Android requires significant CPU horsepower generally not found in Chinese phones.<p>This didn't stop the manufacturers of the 'Dream G2,' a phone designed to look like Android. But (unfortunately) it's not: <a href=\"http://www.engadget.com/2009/01/15/dream-g2-doesnt-get-the-irony-of-ripping-off-an-open-source-os/\" rel=\"nofollow\">http://www.engadget.com/2009/01/15/dream-g2-doesnt-get-the-i...</a>","created_at":"2009-04-30T05:17:46Z","created_at_i":1241068666,"objectID":"586437","parent_id":586411,"story_id":586313,"story_title":"In Major Shift, Apple Builds Its Own Team to Design Chips","story_url":"http://online.wsj.com/article/SB124104666426570729.html","updated_at":"2024-09-19T16:36:20Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"1. K&R - an absolute essential. I found myself in your shoes about two years ago, picked this up, and worked through it.<p>2. \"The Unix Programming Environment\" (<a href=\"http://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X\" rel=\"nofollow\">http://www.amazon.com/Unix-Programming-Environment-Prentice-...</a>) This is a recent find, but covers more application. It's almost a Part 2 of K&R and covers building problems and the Unix signal and file APIs. The examples are in an ancient syntax, but part of the fun is coding them and getting them to compile.<p>3. \"The C Puzzle Book\" (<a href=\"http://www.amazon.com/Puzzle-Book-Alan-R-Feuer/dp/0201604612\" rel=\"nofollow\">http://www.amazon.com/Puzzle-Book-Alan-R-Feuer/dp/0201604612</a>) I found this one day at Fry's, and it's fucking awesome. You can effectively learn C using it without a compiler.<p>Good luck!"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Learning C"}},"_tags":["comment","author_wooby","story_580332"],"author":"wooby","comment_text":"1. K&R - an absolute essential. I found myself in your shoes about two years ago, picked this up, and worked through it.<p>2. \"The Unix Programming Environment\" (<a href=\"http://www.amazon.com/Unix-Programming-Environment-Prentice-Hall-Software/dp/013937681X\" rel=\"nofollow\">http://www.amazon.com/Unix-Programming-Environment-Prentice-...</a>) This is a recent find, but covers more application. It's almost a Part 2 of K&R and covers building problems and the Unix signal and file APIs. The examples are in an ancient syntax, but part of the fun is coding them and getting them to compile.<p>3. \"The C Puzzle Book\" (<a href=\"http://www.amazon.com/Puzzle-Book-Alan-R-Feuer/dp/0201604612\" rel=\"nofollow\">http://www.amazon.com/Puzzle-Book-Alan-R-Feuer/dp/0201604612</a>) I found this one day at Fry's, and it's fucking awesome. You can effectively learn C using it without a compiler.<p>Good luck!","created_at":"2009-04-26T20:57:19Z","created_at_i":1240779439,"objectID":"580428","parent_id":580332,"story_id":580332,"story_title":"Ask HN: Learning C","updated_at":"2024-09-19T16:35:47Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Autonomous, buoyancy-powered subs: <a href=\"http://spray.ucsd.edu/\" rel=\"nofollow\">http://spray.ucsd.edu/</a><p>A fleet of them - the future of drug trafficking?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"\"Home-made\" Submarine"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.nytimes.com/2009/04/26/magazine/26drugs-t.html"}},"_tags":["comment","author_wooby","story_578887"],"author":"wooby","children":[579191,579608,579287],"comment_text":"Autonomous, buoyancy-powered subs: <a href=\"http://spray.ucsd.edu/\" rel=\"nofollow\">http://spray.ucsd.edu/</a><p>A fleet of them - the future of drug trafficking?","created_at":"2009-04-25T18:47:14Z","created_at_i":1240685234,"objectID":"579173","parent_id":578887,"story_id":578887,"story_title":"\"Home-made\" Submarine","story_url":"http://www.nytimes.com/2009/04/26/magazine/26drugs-t.html","updated_at":"2024-09-19T16:35:41Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"If you're comfortable with Linux, an option for you is running a Linode or Slicehost ($20/month) and hosting your clients on it. This will give you total control of the hosting environment, and a residual income. You'll have plenty of horsepower for Rails or whatever else you want to use, and as you grow, you can buy more nodes.<p>Beware, though: when you put on a system administration hat you're taking on a lot of new responsibilities, including backups and security. It's also a good idea to bring your friends in on it, so if something goes wrong they can look into it for your client if you're away.<p>So, it really depends on your level of comfort with sys admin stuff, and the kind of relationship you have with your clients. Good luck!"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: I can't stand PHP anymore. What else can I choose?"}},"_tags":["comment","author_wooby","story_578996"],"author":"wooby","children":[579238,579167],"comment_text":"If you're comfortable with Linux, an option for you is running a Linode or Slicehost ($20/month) and hosting your clients on it. This will give you total control of the hosting environment, and a residual income. You'll have plenty of horsepower for Rails or whatever else you want to use, and as you grow, you can buy more nodes.<p>Beware, though: when you put on a system administration hat you're taking on a lot of new responsibilities, including backups and security. It's also a good idea to bring your friends in on it, so if something goes wrong they can look into it for your client if you're away.<p>So, it really depends on your level of comfort with sys admin stuff, and the kind of relationship you have with your clients. Good luck!","created_at":"2009-04-25T18:32:55Z","created_at_i":1240684375,"objectID":"579158","parent_id":578996,"story_id":578996,"story_title":"Ask HN: I can't stand PHP anymore. What else can I choose?","updated_at":"2024-09-19T16:35:41Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I like reading little personal accounts like this by programmers. Have a problem, try a hack, fail. Sleep. Bring in some good friends. Things improve. Happen on some software or third party lib or blog post that opens your eyes. Succeed."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The Sound of iPod"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://web.archive.org/web/20060529120135/http://ipodlinux.org/stories/piezo/"}},"_tags":["comment","author_wooby","story_578873"],"author":"wooby","comment_text":"I like reading little personal accounts like this by programmers. Have a problem, try a hack, fail. Sleep. Bring in some good friends. Things improve. Happen on some software or third party lib or blog post that opens your eyes. Succeed.","created_at":"2009-04-25T15:25:16Z","created_at_i":1240673116,"objectID":"578956","parent_id":578873,"story_id":578873,"story_title":"The Sound of iPod","story_url":"http://web.archive.org/web/20060529120135/http://ipodlinux.org/stories/piezo/","updated_at":"2024-09-19T16:35:36Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"As far as I understand this page, it's actually possible to implement continuations in C:<p><a href=\"http://homepage.mac.com/sigfpe/Computing/continuations.html\" rel=\"nofollow\">http://homepage.mac.com/sigfpe/Computing/continuations.html</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Scala 2.8 Preview"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.scala-lang.org/node/1564"}},"_tags":["comment","author_wooby","story_575472"],"author":"wooby","comment_text":"As far as I understand this page, it's actually possible to implement continuations in C:<p><a href=\"http://homepage.mac.com/sigfpe/Computing/continuations.html\" rel=\"nofollow\">http://homepage.mac.com/sigfpe/Computing/continuations.html</a>","created_at":"2009-04-24T05:57:27Z","created_at_i":1240552647,"objectID":"577048","parent_id":576056,"points":null,"story_id":575472,"story_title":"Scala 2.8 Preview","story_url":"http://www.scala-lang.org/node/1564","updated_at":"2023-09-06T19:44:15Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"\"Support for continuations. A compiler plugin will support continuations as an optional feature of Scala, using a type-directed continuation passing transform. Continuations are useful to implement advanced control constructs, for instance for asynchronous I/O, user interface event handling, or dataflow concurrency.\"<p>I didn't think continuations were possible on the JVM. Any idea how they're doing this?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Scala 2.8 Preview"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.scala-lang.org/node/1564"}},"_tags":["comment","author_wooby","story_575472"],"author":"wooby","children":[575934,576056,576213],"comment_text":"\"Support for continuations. A compiler plugin will support continuations as an optional feature of Scala, using a type-directed continuation passing transform. Continuations are useful to implement advanced control constructs, for instance for asynchronous I/O, user interface event handling, or dataflow concurrency.\"<p>I didn't think continuations were possible on the JVM. Any idea how they're doing this?","created_at":"2009-04-23T15:54:48Z","created_at_i":1240502088,"objectID":"575858","parent_id":575472,"story_id":575472,"story_title":"Scala 2.8 Preview","story_url":"http://www.scala-lang.org/node/1564","updated_at":"2024-09-19T16:35:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Hm, yes - it would be interesting to turn crontabs directly into .ics files for export into Google Calendar or iCal."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"GCalCron Automates Your Linux System with Google Calendar"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://lifehacker.com/5179566/gcalcron-automates-your-linux-system-with-google-calendar"}},"_tags":["comment","author_wooby","story_532452"],"author":"wooby","comment_text":"Hm, yes - it would be interesting to turn crontabs directly into .ics files for export into Google Calendar or iCal.","created_at":"2009-03-26T05:56:04Z","created_at_i":1238046964,"objectID":"533091","parent_id":532786,"points":null,"story_id":532452,"story_title":"GCalCron Automates Your Linux System with Google Calendar","story_url":"http://lifehacker.com/5179566/gcalcron-automates-your-linux-system-with-google-calendar","updated_at":"2023-09-06T19:40:52Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"GCalCron Automates Your Linux System with Google Calendar"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://lifehacker.com/5179566/gcalcron-automates-your-linux-system-with-google-calendar"}},"_tags":["story","author_wooby","story_532452"],"author":"wooby","children":[532775,532786,532732],"created_at":"2009-03-25T21:20:13Z","created_at_i":1238016013,"num_comments":4,"objectID":"532452","points":12,"story_id":532452,"story_text":"","title":"GCalCron Automates Your Linux System with Google Calendar","updated_at":"2023-09-06T19:40:48Z","url":"http://lifehacker.com/5179566/gcalcron-automates-your-linux-system-with-google-calendar"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"The Hoc programming language"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://en.wikipedia.org/wiki/Hoc_%28programming_language%29"}},"_tags":["story","author_wooby","story_531540"],"author":"wooby","created_at":"2009-03-25T06:26:30Z","created_at_i":1237962390,"num_comments":0,"objectID":"531540","points":1,"story_id":531540,"story_text":"","title":"The Hoc programming language","updated_at":"2023-09-06T19:40:42Z","url":"http://en.wikipedia.org/wiki/Hoc_%28programming_language%29"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"<a href=\"http://stainlessapp.com/\" rel=\"nofollow\">http://stainlessapp.com/</a> - at version .5, an interesting Mac alternative."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"New Google Chrome Beta"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://chrome.blogspot.com/2009/03/google-chrome-has-new-beta_17.html"}},"_tags":["comment","author_wooby","story_520189"],"author":"wooby","children":[521212],"comment_text":"<a href=\"http://stainlessapp.com/\" rel=\"nofollow\">http://stainlessapp.com/</a> - at version .5, an interesting Mac alternative.","created_at":"2009-03-18T01:01:12Z","created_at_i":1237338072,"objectID":"520923","parent_id":520597,"story_id":520189,"story_title":"New Google Chrome Beta","story_url":"http://chrome.blogspot.com/2009/03/google-chrome-has-new-beta_17.html","updated_at":"2024-09-19T16:29:58Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"A Scala Tutorial for Java Programmers [pdf]"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.scala-lang.org/docu/files/ScalaTutorial.pdf"}},"_tags":["story","author_wooby","story_517628"],"author":"wooby","created_at":"2009-03-16T02:13:14Z","created_at_i":1237169594,"num_comments":0,"objectID":"517628","points":1,"story_id":517628,"story_text":"","title":"A Scala Tutorial for Java Programmers [pdf]","updated_at":"2024-09-19T16:29:44Z","url":"http://www.scala-lang.org/docu/files/ScalaTutorial.pdf"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Use Kismac to collect MAC addresses with significant packets in/out, clone a MAC, ssh -D9091 to my remote server, tunnel everything through my local SOCKS5 port 9091. Works well enough for me."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Tunneling traffic through DNS, a.k.a free internet in cafes/airports"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.dnstunnel.de/"}},"_tags":["comment","author_wooby","story_511908"],"author":"wooby","children":[513936],"comment_text":"Use Kismac to collect MAC addresses with significant packets in/out, clone a MAC, ssh -D9091 to my remote server, tunnel everything through my local SOCKS5 port 9091. Works well enough for me.","created_at":"2009-03-11T23:00:32Z","created_at_i":1236812432,"objectID":"512785","parent_id":511908,"story_id":511908,"story_title":"Tunneling traffic through DNS, a.k.a free internet in cafes/airports","story_url":"http://www.dnstunnel.de/","updated_at":"2024-09-19T16:29:20Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Sketchpad, by Dr. Ivan Sutherland with comments by Alan Kay"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.youtube.com/watch?v=495nCzxM9PI"}},"_tags":["story","author_wooby","story_507975"],"author":"wooby","created_at":"2009-03-09T05:50:53Z","created_at_i":1236577853,"num_comments":0,"objectID":"507975","points":2,"story_id":507975,"story_text":"","title":"Sketchpad, by Dr. Ivan Sutherland with comments by Alan Kay","updated_at":"2024-09-19T16:28:50Z","url":"http://www.youtube.com/watch?v=495nCzxM9PI"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"That rocks dude."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: how can I generate youtube style id?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_485423"],"author":"wooby","comment_text":"That rocks dude.","created_at":"2009-03-09T02:33:17Z","created_at_i":1236565997,"objectID":"507848","parent_id":485480,"story_id":485423,"story_title":"Ask HN: how can I generate youtube style id?","story_url":"","updated_at":"2024-09-19T16:28:50Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Or, using C with /dev/urandom: <a href=\"http://alan.dipert.org/post/84526522/random-strings-with-c\" rel=\"nofollow\">http://alan.dipert.org/post/84526522/random-strings-with-c</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: how can I generate youtube style id?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["comment","author_wooby","story_485423"],"author":"wooby","comment_text":"Or, using C with /dev/urandom: <a href=\"http://alan.dipert.org/post/84526522/random-strings-with-c\" rel=\"nofollow\">http://alan.dipert.org/post/84526522/random-strings-with-c</a>","created_at":"2009-03-09T02:32:06Z","created_at_i":1236565926,"objectID":"507846","parent_id":485423,"story_id":485423,"story_title":"Ask HN: how can I generate youtube style id?","story_url":"","updated_at":"2024-09-19T16:28:50Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I really like this. I love programming but I hate photoshopping, and I'll probably use this all the time. It would be nice if I could upload my own font. Response time was quick and I like the history saving."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Please review my webapp: Da Button Factory - create shiny buttons"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://dabuttonfactory.com"}},"_tags":["comment","author_wooby","story_507212"],"author":"wooby","comment_text":"I really like this. I love programming but I hate photoshopping, and I'll probably use this all the time. It would be nice if I could upload my own font. Response time was quick and I like the history saving.","created_at":"2009-03-08T21:16:49Z","created_at_i":1236547009,"objectID":"507538","parent_id":507212,"story_id":507212,"story_title":"Ask HN: Please review my webapp: Da Button Factory - create shiny buttons","story_url":"http://dabuttonfactory.com","updated_at":"2024-09-19T16:28:50Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I really appreciate your insights here, you bring up some really good points. I went ahead and wired in as much data collection / monitoring as I can so through the beta I can see how the service is actually used before I get too concerned with abuse prevention."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","comment_text":"I really appreciate your insights here, you bring up some really good points. I went ahead and wired in as much data collection / monitoring as I can so through the beta I can see how the service is actually used before I get too concerned with abuse prevention.","created_at":"2009-03-05T23:47:14Z","created_at_i":1236296834,"objectID":"504946","parent_id":502614,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:36Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"It's a question of markets, I think, and it's something we haven't really decided on. 1 hour covers IM, mostly. 8-24 probably covers most e-mail use (maybe?) What we don't want this to become is something like Rapidshare, and limiting file lifetimes is our attempt at not letting that happen. The service is designed primarily to share files with people you know personally, within a finite time period. But we'll see how it gets used, and maybe change our policy."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","children":[502614],"comment_text":"It's a question of markets, I think, and it's something we haven't really decided on. 1 hour covers IM, mostly. 8-24 probably covers most e-mail use (maybe?) What we don't want this to become is something like Rapidshare, and limiting file lifetimes is our attempt at not letting that happen. The service is designed primarily to share files with people you know personally, within a finite time period. But we'll see how it gets used, and maybe change our policy.","created_at":"2009-03-04T04:33:29Z","created_at_i":1236141209,"objectID":"502542","parent_id":502478,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"100mb max uploads, files last for 24 hours"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","children":[502478],"comment_text":"100mb max uploads, files last for 24 hours","created_at":"2009-03-04T03:03:10Z","created_at_i":1236135790,"objectID":"502464","parent_id":502451,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I just made some tweaks, and now, files last for 24 hours."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","comment_text":"I just made some tweaks, and now, files last for 24 hours.","created_at":"2009-03-04T02:08:03Z","created_at_i":1236132483,"objectID":"502414","parent_id":502300,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"This is fixed in the latest version, which can be downloaded here: <a href=\"http://droplink.me/Droplink.zip\" rel=\"nofollow\">http://droplink.me/Droplink.zip</a><p>Thanks for the feedback, and enjoy the software!<p>Alan"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","comment_text":"This is fixed in the latest version, which can be downloaded here: <a href=\"http://droplink.me/Droplink.zip\" rel=\"nofollow\">http://droplink.me/Droplink.zip</a><p>Thanks for the feedback, and enjoy the software!<p>Alan","created_at":"2009-03-04T01:32:39Z","created_at_i":1236130359,"objectID":"502377","parent_id":502335,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"The latest version just pastes URLS. It can be found here:\n<a href=\"http://droplink.me/Droplink.zip\" rel=\"nofollow\">http://droplink.me/Droplink.zip</a><p>You can use the registration code from the signup e-mail. Cheers!<p>For help using or installing, please check here:\n<a href=\"http://blog.droplink.me/post/83016847/installing-and-using-droplink\" rel=\"nofollow\">http://blog.droplink.me/post/83016847/installing-and-using-d...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","comment_text":"The latest version just pastes URLS. It can be found here:\n<a href=\"http://droplink.me/Droplink.zip\" rel=\"nofollow\">http://droplink.me/Droplink.zip</a><p>You can use the registration code from the signup e-mail. Cheers!<p>For help using or installing, please check here:\n<a href=\"http://blog.droplink.me/post/83016847/installing-and-using-droplink\" rel=\"nofollow\">http://blog.droplink.me/post/83016847/installing-and-using-d...</a>","created_at":"2009-03-04T01:31:30Z","created_at_i":1236130290,"objectID":"502376","parent_id":502363,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Hi, thanks for trying it. And yes; I can see how it's not exhibiting the expected behavior. I started by adding a Growl note to the \"no files dropped\" case post-registration. There's also a simple help document here, which I'll start sending with registration emails:<p><a href=\"http://blog.droplink.me/post/83016847/using-droplink\" rel=\"nofollow\">http://blog.droplink.me/post/83016847/using-droplink</a><p>Re DMG: Yes - a DMG is something it needs. Workin' on it.\nRe Downloads: Your Downloads icon is the same as Droplink's because the Droplink application is probably the last thing you downloaded. You can move it to your Applications directory, and then drag it back down to the dock.<p>Thanks again for testing, you guys are coming up with really good feedback :)"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","comment_text":"Hi, thanks for trying it. And yes; I can see how it's not exhibiting the expected behavior. I started by adding a Growl note to the \"no files dropped\" case post-registration. There's also a simple help document here, which I'll start sending with registration emails:<p><a href=\"http://blog.droplink.me/post/83016847/using-droplink\" rel=\"nofollow\">http://blog.droplink.me/post/83016847/using-droplink</a><p>Re DMG: Yes - a DMG is something it needs. Workin' on it.\nRe Downloads: Your Downloads icon is the same as Droplink's because the Droplink application is probably the last thing you downloaded. You can move it to your Applications directory, and then drag it back down to the dock.<p>Thanks again for testing, you guys are coming up with really good feedback :)","created_at":"2009-03-04T00:30:26Z","created_at_i":1236126626,"objectID":"502305","parent_id":502290,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Sorry, yes - after registration, clicking on the icon will do nothing. It only does stuff if you drag-and-drop a file on the icon.<p>Please see this blog post for installation/usage help:\n<a href=\"http://blog.droplink.me/post/83016847/using-droplink\" rel=\"nofollow\">http://blog.droplink.me/post/83016847/using-droplink</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","comment_text":"Sorry, yes - after registration, clicking on the icon will do nothing. It only does stuff if you drag-and-drop a file on the icon.<p>Please see this blog post for installation/usage help:\n<a href=\"http://blog.droplink.me/post/83016847/using-droplink\" rel=\"nofollow\">http://blog.droplink.me/post/83016847/using-droplink</a>","created_at":"2009-03-04T00:26:22Z","created_at_i":1236126382,"objectID":"502301","parent_id":502297,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Thanks for giving it a look, I'll try and see whats up with it."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["comment","author_wooby","story_502236"],"author":"wooby","children":[502294],"comment_text":"Thanks for giving it a look, I'll try and see whats up with it.","created_at":"2009-03-03T23:54:23Z","created_at_i":1236124463,"objectID":"502252","parent_id":502243,"story_id":502236,"story_title":"Ask HN: Review my startup, Droplink for OS X","story_url":"http://droplink.me/","updated_at":"2024-09-19T16:28:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Review my startup, Droplink for OS X"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://droplink.me/"}},"_tags":["story","author_wooby","story_502236"],"author":"wooby","children":[502300,502335,502290,502399,502314,502451,502804,502342,502243,502339,502293,502950],"created_at":"2009-03-03T23:40:00Z","created_at_i":1236123600,"num_comments":34,"objectID":"502236","points":27,"story_id":502236,"story_text":"","title":"Ask HN: Review my startup, Droplink for OS X","updated_at":"2024-09-19T16:28:24Z","url":"http://droplink.me/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"title":{"matchLevel":"none","matchedWords":[],"value":"How Samba was written"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://samba.org/ftp/tridge/misc/french_cafe.txt"}},"_tags":["story","author_wooby","story_488089"],"author":"wooby","children":[488233],"created_at":"2009-02-20T00:21:28Z","created_at_i":1235089288,"num_comments":3,"objectID":"488089","points":37,"story_id":488089,"title":"How Samba was written","updated_at":"2025-03-28T15:24:05Z","url":"http://samba.org/ftp/tridge/misc/french_cafe.txt"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"MySQL general purpose routine library"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://datacharmer.blogspot.com/2005/11/mysql-5-general-purpose-routine_28.html"}},"_tags":["story","author_wooby","story_476082"],"author":"wooby","created_at":"2009-02-10T22:08:35Z","created_at_i":1234303715,"num_comments":0,"objectID":"476082","points":1,"story_id":476082,"story_text":"","title":"MySQL general purpose routine library","updated_at":"2024-09-19T16:33:58Z","url":"http://datacharmer.blogspot.com/2005/11/mysql-5-general-purpose-routine_28.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"A related argument against table-based layouts, which I don't see any discussion about yet, is that \"it's important to maintain a high ratio of content to markup for SEO purposes.\"<p>In my view, a complicated div-based layout is just about as markup-heavy as a table layout, given separate CSS files in both cases. So I would think the point is moot. And my suspicion is it's just SEO firms blowing smoke in an effort to figure out things to sell.<p>So, is this at all a substantiative claim?"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Why CSS should not be used for layout"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.flownet.com/ron/css-rant.html"}},"_tags":["comment","author_wooby","story_463234"],"author":"wooby","comment_text":"A related argument against table-based layouts, which I don't see any discussion about yet, is that \"it's important to maintain a high ratio of content to markup for SEO purposes.\"<p>In my view, a complicated div-based layout is just about as markup-heavy as a table layout, given separate CSS files in both cases. So I would think the point is moot. And my suspicion is it's just SEO firms blowing smoke in an effort to figure out things to sell.<p>So, is this at all a substantiative claim?","created_at":"2009-02-03T15:20:54Z","created_at_i":1233674454,"objectID":"464081","parent_id":463234,"story_id":463234,"story_title":"Why CSS should not be used for layout","story_url":"http://www.flownet.com/ron/css-rant.html","updated_at":"2024-09-19T16:32:52Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"You're right. By \"current job,\" I meant the job I was supposed to be doing as I wrote that post. I was pissed off when I connected finger to key.<p>And there are more than a few discrepancies in what I wrote. The \"community\" I bill as PHP's greatest asset also ironically produced the fellow whose code I'm maintaining. And, me. So it goes.<p>The underlying reason for my frustration, and the reason I wrote what I did, go far beyond the scope of PHP."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Why PHP really won"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/70990749/why-php-really-won"}},"_tags":["comment","author_wooby","story_437315"],"author":"wooby","children":[437571],"comment_text":"You're right. By \"current job,\" I meant the job I was supposed to be doing as I wrote that post. I was pissed off when I connected finger to key.<p>And there are more than a few discrepancies in what I wrote. The \"community\" I bill as PHP's greatest asset also ironically produced the fellow whose code I'm maintaining. And, me. So it goes.<p>The underlying reason for my frustration, and the reason I wrote what I did, go far beyond the scope of PHP.","created_at":"2009-01-16T23:39:30Z","created_at_i":1232149170,"objectID":"437482","parent_id":437443,"story_id":437315,"story_title":"Why PHP really won","story_url":"http://alan.dipert.org/post/70990749/why-php-really-won","updated_at":"2024-09-19T16:30:33Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Why PHP really won"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://alan.dipert.org/post/70990749/why-php-really-won"}},"_tags":["story","author_wooby","story_437315"],"author":"wooby","children":[437443,437360,437700,437415,437410,437649,438899,437468,437355,437813,437714],"created_at":"2009-01-16T21:31:46Z","created_at_i":1232141506,"num_comments":45,"objectID":"437315","points":77,"story_id":437315,"story_text":"","title":"Why PHP really won","updated_at":"2024-09-19T16:30:33Z","url":"http://alan.dipert.org/post/70990749/why-php-really-won"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"In the late 90s, when I began making webpages, there was a mysterious folder in my shared hosting FTP account called \"cgi-bin.\" What is \"Bin.\" I was on Windows. What is \"CGI.\" A friend told me it had something to do with Perl. I didn't know anything about Perl, and everything I found on the web about it was difficult to understand.<p>After some experimenting with FrontPage extensions, I began to experiment more. I found a site called Matt's script archive that had Perl CGIs that I could actually understand. It was slow, slow going. I was coming from QBasic. I scoured the Web, mixing and matching bits of example code I'd found to make things like random quotation generators. Then a friend showed me something called PHP.<p>PHP, to me at the time, wasn't just a language - it was an ecosystem of developers, example code, and practices that was flourishing. There was consolidated documentation. There were global functions for any string operation I could conceive. But most importantly to me at the time, there was an active community who was interested in more than showing off their most arcane, clever, and obfuscated programs. Very early on, the PHP community could be characterized as \"welcoming.\"<p>I would argue that PHP \"won\" not because of any innate technical superiority over any of the other languages available for web programming in the mid to late 90s. It won because it had the right kind of community for a new breed of developer - the \"web programmer.\" It didn't have the stigma of snootiness that came with trying to figure out Perl. PHP was not for geniuses or academics; PHP was for people who wanted to make dynamic websites and not have to catch attitude from some asshole in IRC about not knowing what tail recursion is.<p>I don't use PHP anymore. I don't like PHP any more. I got into Java, JavaScript, C, even Prolog; and now, I'm into whatever will save me time, and scale. Language agnostic. I'm into parallelization and web services; why would I use PHP for anything more than toy projects? Yes - PHP is \"easy.\" But at my current (thankfully temporary) job, I'm in charge of adding features and debugging a massive functionally-written PHP codebase. It is horrifying.<p>I think PHP is a great language for anyone to learn how to program with. I think there's a lot of shitty PHP code out there and it's easy to make a living by billing yourself as a PHP developer. It introduced me to \"C-like\" syntax of brackets and semicolons. It's an easy way to learn how to do neat things with SQL. Beyond that, it really just sucks, and no matter how much more crap they add on to it, I think it always will.<p>So what is the lesson here? PHP won because it had an excellent community. The Ruby/Rails uprising of the past few years reminds me a lot of the early PHP days. PHP made it easy for independent, inexperienced programmers to create dynamic web applications. Which was great. But having grown up and seen the world, I've rarely seen or worked with small teams of professionals, fluent in several languages, who have decided that PHP is the best way to implement a website. But hey - whatever floats your boat."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Why PHP won"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://startuplessonslearned.blogspot.com/2009/01/why-php-won.html"}},"_tags":["comment","author_wooby","story_436870"],"author":"wooby","comment_text":"In the late 90s, when I began making webpages, there was a mysterious folder in my shared hosting FTP account called \"cgi-bin.\" What is \"Bin.\" I was on Windows. What is \"CGI.\" A friend told me it had something to do with Perl. I didn't know anything about Perl, and everything I found on the web about it was difficult to understand.<p>After some experimenting with FrontPage extensions, I began to experiment more. I found a site called Matt's script archive that had Perl CGIs that I could actually understand. It was slow, slow going. I was coming from QBasic. I scoured the Web, mixing and matching bits of example code I'd found to make things like random quotation generators. Then a friend showed me something called PHP.<p>PHP, to me at the time, wasn't just a language - it was an ecosystem of developers, example code, and practices that was flourishing. There was consolidated documentation. There were global functions for any string operation I could conceive. But most importantly to me at the time, there was an active community who was interested in more than showing off their most arcane, clever, and obfuscated programs. Very early on, the PHP community could be characterized as \"welcoming.\"<p>I would argue that PHP \"won\" not because of any innate technical superiority over any of the other languages available for web programming in the mid to late 90s. It won because it had the right kind of community for a new breed of developer - the \"web programmer.\" It didn't have the stigma of snootiness that came with trying to figure out Perl. PHP was not for geniuses or academics; PHP was for people who wanted to make dynamic websites and not have to catch attitude from some asshole in IRC about not knowing what tail recursion is.<p>I don't use PHP anymore. I don't like PHP any more. I got into Java, JavaScript, C, even Prolog; and now, I'm into whatever will save me time, and scale. Language agnostic. I'm into parallelization and web services; why would I use PHP for anything more than toy projects? Yes - PHP is \"easy.\" But at my current (thankfully temporary) job, I'm in charge of adding features and debugging a massive functionally-written PHP codebase. It is horrifying.<p>I think PHP is a great language for anyone to learn how to program with. I think there's a lot of shitty PHP code out there and it's easy to make a living by billing yourself as a PHP developer. It introduced me to \"C-like\" syntax of brackets and semicolons. It's an easy way to learn how to do neat things with SQL. Beyond that, it really just sucks, and no matter how much more crap they add on to it, I think it always will.<p>So what is the lesson here? PHP won because it had an excellent community. The Ruby/Rails uprising of the past few years reminds me a lot of the early PHP days. PHP made it easy for independent, inexperienced programmers to create dynamic web applications. Which was great. But having grown up and seen the world, I've rarely seen or worked with small teams of professionals, fluent in several languages, who have decided that PHP is the best way to implement a website. But hey - whatever floats your boat.","created_at":"2009-01-16T21:01:56Z","created_at_i":1232139716,"objectID":"437261","parent_id":436870,"story_id":436870,"story_title":"Why PHP won","story_url":"http://startuplessonslearned.blogspot.com/2009/01/why-php-won.html","updated_at":"2024-09-19T16:30:33Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"webkit people can paste this into the address bar:<p>javascript:document.getElementById(\"sideposts\").style.setProperty(\"display\", \"none\");"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"When the Education Bubble Finally Pops"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.jamtoday.org/post/70265208/when-the-education-bubble-finally-pops"}},"_tags":["comment","author_wooby","story_432743"],"author":"wooby","comment_text":"webkit people can paste this into the address bar:<p>javascript:document.getElementById(\"sideposts\").style.setProperty(\"display\", \"none\");","created_at":"2009-01-13T23:03:07Z","created_at_i":1231887787,"objectID":"432887","parent_id":432782,"story_id":432743,"story_title":"When the Education Bubble Finally Pops","story_url":"http://blog.jamtoday.org/post/70265208/when-the-education-bubble-finally-pops","updated_at":"2024-09-19T16:30:05Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"A web-focused Git workflow"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://joemaller.com/2008/11/25/a-web-focused-git-workflow/"}},"_tags":["story","author_wooby","story_406784"],"author":"wooby","created_at":"2008-12-22T19:44:59Z","created_at_i":1229975099,"num_comments":0,"objectID":"406784","points":7,"story_id":406784,"story_text":"","title":"A web-focused Git workflow","updated_at":"2023-09-06T19:31:05Z","url":"http://joemaller.com/2008/11/25/a-web-focused-git-workflow/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Cross-domain POST with jsonptunnel.cgi"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://ubergibson.com/~alan/calc/"}},"_tags":["story","author_wooby","story_398945"],"author":"wooby","created_at":"2008-12-15T22:44:01Z","created_at_i":1229381041,"num_comments":0,"objectID":"398945","points":2,"story_id":398945,"story_text":"","title":"Cross-domain POST with jsonptunnel.cgi","updated_at":"2024-09-19T16:35:17Z","url":"http://ubergibson.com/~alan/calc/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Completely homebuilt computer running Minix"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.homebrewcpu.com/"}},"_tags":["story","author_wooby","story_398273"],"author":"wooby","created_at":"2008-12-15T12:30:42Z","created_at_i":1229344242,"num_comments":0,"objectID":"398273","points":6,"story_id":398273,"story_text":"","title":"Completely homebuilt computer running Minix","updated_at":"2024-09-19T16:35:16Z","url":"http://www.homebrewcpu.com/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Lenat's been working on this since the 80s: <a href=\"http://en.wikipedia.org/wiki/Cyc\" rel=\"nofollow\">http://en.wikipedia.org/wiki/Cyc</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Eurisko, The Computer With A Mind Of Its Own"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://www.aliciapatterson.org/APF0704/Johnson/Johnson.html"}},"_tags":["comment","author_wooby","story_396796"],"author":"wooby","comment_text":"Lenat's been working on this since the 80s: <a href=\"http://en.wikipedia.org/wiki/Cyc\" rel=\"nofollow\">http://en.wikipedia.org/wiki/Cyc</a>","created_at":"2008-12-14T00:10:35Z","created_at_i":1229213435,"objectID":"397091","parent_id":396796,"story_id":396796,"story_title":"Eurisko, The Computer With A Mind Of Its Own","story_url":"http://www.aliciapatterson.org/APF0704/Johnson/Johnson.html","updated_at":"2024-09-19T16:35:12Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"List of manufacturers reportedly developing Android phones"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://clonedroidphone.com/post/63923821/clonedroidphone-com-roundup"}},"_tags":["story","author_wooby","story_394470"],"author":"wooby","created_at":"2008-12-11T17:10:55Z","created_at_i":1229015455,"num_comments":0,"objectID":"394470","points":1,"story_id":394470,"story_text":"","title":"List of manufacturers reportedly developing Android phones","updated_at":"2023-09-06T19:30:11Z","url":"http://clonedroidphone.com/post/63923821/clonedroidphone-com-roundup"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"PHP"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://www.myninjaplease.com/wp-content/uploads/2008/03/swiss1.jpg"}},"_tags":["story","author_wooby","story_393508"],"author":"wooby","created_at":"2008-12-10T21:34:31Z","created_at_i":1228944871,"num_comments":0,"objectID":"393508","points":2,"story_id":393508,"story_text":"","title":"PHP","updated_at":"2024-09-19T16:34:46Z","url":"http://www.myninjaplease.com/wp-content/uploads/2008/03/swiss1.jpg"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"Big fan of this: <a href=\"http://developer.apple.com/documentation/OpenSource/Conceptual/ShellScripting/ShellScripting.pdf\" rel=\"nofollow\">http://developer.apple.com/documentation/OpenSource/Conceptu...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Damn Useful: When You Forget to type Sudo"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://codeulate.com/?p=22"}},"_tags":["comment","author_wooby","story_391408"],"author":"wooby","comment_text":"Big fan of this: <a href=\"http://developer.apple.com/documentation/OpenSource/Conceptual/ShellScripting/ShellScripting.pdf\" rel=\"nofollow\">http://developer.apple.com/documentation/OpenSource/Conceptu...</a>","created_at":"2008-12-09T19:26:15Z","created_at_i":1228850775,"objectID":"391627","parent_id":391408,"points":null,"story_id":391408,"story_title":"Damn Useful: When You Forget to type Sudo","story_url":"http://codeulate.com/?p=22","updated_at":"2023-09-06T19:29:58Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"What's your Mondrian number?"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://mondrian.ubergibson.com/"}},"_tags":["story","author_wooby","story_380474"],"author":"wooby","created_at":"2008-11-30T00:01:40Z","created_at_i":1228003300,"num_comments":0,"objectID":"380474","points":1,"story_id":380474,"story_text":"","title":"What's your Mondrian number?","updated_at":"2024-09-19T16:33:17Z","url":"http://mondrian.ubergibson.com/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":"Godaddy used to be the best but is now a mess of hot garbage. What's the cheapest, simplest registrar?"},"title":{"matchLevel":"none","matchedWords":[],"value":"Ask YC: Where do you buy domain names?"},"url":{"matchLevel":"none","matchedWords":[],"value":""}},"_tags":["story","author_wooby","story_377301","ask_hn"],"author":"wooby","children":[377302,377325,377674,377317,377689,377353,377357,377360,377643,377351,377369,377342,377464,377778],"created_at":"2008-11-26T05:11:43Z","created_at_i":1227676303,"num_comments":31,"objectID":"377301","points":28,"story_id":377301,"story_text":"Godaddy used to be the best but is now a mess of hot garbage. What's the cheapest, simplest registrar?","title":"Ask YC: Where do you buy domain names?","updated_at":"2024-09-19T16:33:01Z","url":""},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Bryan Cantrill Rules"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://cryptnet.net/mirrors/texts/kissedagirl.html"}},"_tags":["story","author_wooby","story_368997"],"author":"wooby","created_at":"2008-11-19T01:27:16Z","created_at_i":1227058036,"num_comments":0,"objectID":"368997","points":1,"story_id":368997,"story_text":"","title":"Bryan Cantrill Rules","updated_at":"2023-09-06T19:28:15Z","url":"http://cryptnet.net/mirrors/texts/kissedagirl.html"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Crazy JavaScript Web Framework"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://golfscript.org/"}},"_tags":["story","author_wooby","story_345701"],"author":"wooby","created_at":"2008-10-27T22:24:41Z","created_at_i":1225146281,"num_comments":0,"objectID":"345701","points":3,"story_id":345701,"story_text":"","title":"Crazy JavaScript Web Framework","updated_at":"2023-09-06T19:26:33Z","url":"http://golfscript.org/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"wooby"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"matchLevel":"none","matchedWords":[],"value":"Clonedroid - Google Android running on Chinese iPhone clones"},"url":{"matchLevel":"none","matchedWords":[],"value":"http://clonedroid.ubergibson.com/"}},"_tags":["story","author_wooby","story_338392"],"author":"wooby","created_at":"2008-10-20T22:25:04Z","created_at_i":1224541504,"num_comments":0,"objectID":"338392","points":1,"story_id":338392,"story_text":"","title":"Clonedroid - Google Android running on Chinese iPhone clones","updated_at":"2023-09-06T19:26:02Z","url":"http://clonedroid.ubergibson.com/"}],"hitsPerPage":1000,"nbHits":381,"nbPages":1,"page":0,"params":"tags=author_wooby&hitsPerPage=1000&advancedSyntax=true&analyticsTags=backend","processingTimeMS":218,"processingTimingsMS":{"_request":{"roundTrip":22},"afterFetch":{"format":{"highlighting":6,"total":8},"merge":{"entries":{"parse":1,"total":1},"mergeLoop":{"prepareNextHit":216,"total":216},"total":216},"total":216},"fetch":{"query":1},"total":218},"query":"","serverTimeMS":227}