[{"data":1,"prerenderedAt":4843},["ShallowReactive",2],{"tags-pages-list-project":3},[4,493,633,670,941,991,1012,1076,1114,1157,1281,1306,1428,1453,1969,2095,2140,2314,2402,2453,2574,2742,2764,2797,2861,2902,2929,2956,2984,3005,3026,3059,3094,3139,3225,3264,3431,3485,3531,3567,3757,3829,3871,4011,4084,4381,4430,4466,4565,4687,4720,4785,4802,4819],{"id":5,"title":6,"body":7,"createdAt":481,"description":13,"draft":482,"extension":483,"image":17,"mastodonThread":484,"meta":485,"navigation":486,"path":487,"seo":488,"stem":6,"tags":489,"updatedAt":491,"__hash__":492},"content\u002FProjects.md","Projects",{"type":8,"value":9,"toc":473},"minimark",[10,14,18,29,34,37,97,101,104,127,131,134,443,446,450],[11,12,13],"p",{},"I present here a very incomplete list of programming-related projects, and the tools and languages I might use to create them.",[15,16],"img",{"src":17},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FROqn3i8m40JxUyKgFKym4gAYInzHd3adje0xomuIKfI_KuM0v7fsPYLDXNF4X8K0DGaOQkGSdBVtbO2B1CRXYAulPYDinDdq5lBSOP1KdBSv_kxwbt-a6jlmv5d5z1ysodk7y2tkFW4B2klTLNw6Lc1pjiELrWy0",[11,19,20,21,28],{},"Also see ",[22,23,27],"a",{"href":24,"rel":25},"https:\u002F\u002Fgithub.com\u002Fawwaiid",[26],"nofollow","the awwaiid github repo"," for more projects!",[30,31,33],"h2",{"id":32},"current-projects","Current Projects",[11,35,36],{},"If you were to ask me what I'm working on right now, I might say one of these.",[38,39,40,48,55,62,69,76,83,90],"ul",{},[41,42,43,47],"li",{},[22,44,46],{"href":45},"\u002Frotae-versantur","Rotae Versantur"," - Norns Monome+Arc based four track recorder",[41,49,50,54],{},[22,51,53],{"href":52},"\u002Fghostwriter","Ghostwriter"," - Use the reMarkable2 as an interface to vision-LLMs. Ghost in the machine!",[41,56,57,61],{},[22,58,60],{"href":59},"\u002Fhuman-essentials","Human Essentials"," - Part of the Ruby For Good organization; inventory control for diaper and period-supply banks",[41,63,64,68],{},[22,65,67],{"href":66},"\u002Frepl-looper","REPL Looper"," - Making music with a code console",[41,70,71,75],{},[22,72,74],{"href":73},"\u002Ffairy-lights","Fairy Lights"," - Programming decorative LED lights in my living room and Christmas tree",[41,77,78,82],{},[22,79,81],{"href":80},"\u002Fchompie","Chompie"," - Chomp a codebase down to the bone",[41,84,85,89],{},[22,86,88],{"href":87},"\u002Fmetl","METL"," - Research around extracting and using Formal Models from an existing codebase",[41,91,92,96],{},[22,93,95],{"href":94},"\u002Fmeta-tlt","Meta TLT"," - Messing around with this website or tooling",[30,98,100],{"id":99},"backburner","Backburner",[11,102,103],{},"If you had asked me what I was working on last week, or if you ask me next week, I might mention one of these.",[38,105,106,113,120],{},[41,107,108,112],{},[22,109,111],{"href":110},"\u002Fmizik","Mizik"," - A game of memory, sound, shape",[41,114,115,119],{},[22,116,118],{"href":117},"\u002Fgremllm","Gremllm"," - Put a monster into your codebase",[41,121,122,126],{},[22,123,125],{"href":124},"\u002Ftask-seeder","Task Seeder"," - Interactively rank your tasks using different tournament and sorting algorithms",[30,128,130],{"id":129},"inactive","Inactive",[11,132,133],{},"I probably won't be doing much with these. This ''could'' mean that they are in a fairly completed state. It could also mean that they are abandoned. But feel free to ask me about them anyway!",[38,135,136,142,149,156,163,170,177,184,191,198,205,212,219,226,233,240,247,254,261,268,275,282,289,296,303,310,317,324,331,338,345,352,359,366,373,380,387,394,401,408,415,422,429,436],{},[41,137,138],{},[22,139,141],{"href":140},"\u002Fan-introduction-to-programming-via-perl","An Introduction to Programming via Perl",[41,143,144,148],{},[22,145,147],{"href":146},"\u002Fcgi-inspect","CGI Inspect"," - Inspect running CGI apps",[41,150,151,155],{},[22,152,154],{"href":153},"\u002Fcaravan","Caravan"," - OCaml implementation of the sequential data mining algorithms",[41,157,158,162],{},[22,159,161],{"href":160},"\u002Fcensus-data-extraction","Census Data Extraction"," - Small project to help a researcher correlate some data",[41,164,165,169],{},[22,166,168],{"href":167},"\u002Fcontinuity","Continuity"," - Continuation-based web-application framework for Perl",[41,171,172,176],{},[22,173,175],{"href":174},"\u002Fcontize","Contize"," - Provide a perl object with a way to fake continuations (complete and abandoned)",[41,178,179,183],{},[22,180,182],{"href":181},"\u002Fcovid-can-i-do-it","Covid Can I Do It"," - An interactive harm-reduction dataset built during the COVID pandemic",[41,185,186,190],{},[22,187,189],{"href":188},"\u002Fdhtml-combo","DHTML Combo"," - A combo box made using DHTML\u002FJavascript",[41,192,193,197],{},[22,194,196],{"href":195},"\u002Fdot2html","Dot2html"," - Convert graphviz files to HTML and Javascript",[41,199,200,204],{},[22,201,203],{"href":202},"\u002Fepfarms-panel","EPFarms Panel"," - A control panel for hosting clients",[41,206,207,211],{},[22,208,210],{"href":209},"\u002Fgoe","GOE"," - Smalltalk-like environment for Perl",[41,213,214,218],{},[22,215,217],{"href":216},"\u002Fgecko-based-html2ps","Gecko-based html2ps"," - Render html -> postscript using the gecko",[41,220,221,225],{},[22,222,224],{"href":223},"\u002Fgraph-module","Graph Module"," - OddMuse plugin to make GraphViz graphs (complete)",[41,227,228,232],{},[22,229,231],{"href":230},"\u002Fjquery-autoindent","JQuery Autoindent"," - I've always wanted a textbox that auto-indents",[41,234,235,239],{},[22,236,238],{"href":237},"\u002Fllm-token-tree-visualization","LLM Token Tree Visualization"," - Visualize LLM token selection",[41,241,242,246],{},[22,243,245],{"href":244},"\u002Fmhtml","MHTML"," - An HTML (XML?) Macro language (complete? old)",[41,248,249,253],{},[22,250,252],{"href":251},"\u002Fmobilefs","MobileFS"," - Fuse filesystem to cache files for mobile reading",[41,255,256,260],{},[22,257,259],{"href":258},"\u002Fmodule-level-polyglot","Module Level Polyglot"," - Advocacy and projects, sharing libs between langs",[41,262,263,267],{},[22,264,266],{"href":265},"\u002Fnoisegen","NoiseGen"," - Playing with PortAudio and generators",[41,269,270,274],{},[22,271,273],{"href":272},"\u002Focaml-eval","OCaml Eval"," - Evaluate OCaml code dynamically (complete, old)",[41,276,277,281],{},[22,278,280],{"href":279},"\u002Focaml-grabbag","OCaml GrabBag"," - Datastructure for a random-retrieval collection (complete)",[41,283,284,288],{},[22,285,287],{"href":286},"\u002Fogpf","OGPF"," - OCaml Genetic Programming Framework",[41,290,291,295],{},[22,292,294],{"href":293},"\u002Foddmuse-pingback","OddMuse Pingback"," - A pingback server for oddmuse comment pages (abandoned)",[41,297,298,302],{},[22,299,301],{"href":300},"\u002Foddmuse-editsection","Oddmuse EditSection"," - Edit things on a per-section basis in oddmuse",[41,304,305,309],{},[22,306,308],{"href":307},"\u002Foddmuse-editfile","Oddmuse Editfile"," - Edit a file (especially perl) through oddmuse",[41,311,312,316],{},[22,313,315],{"href":314},"\u002Foddmuse-ref-links","Oddmuse Ref Links"," - Module for a sidebar list of incoming links for a page",[41,318,319,323],{},[22,320,322],{"href":321},"\u002Foddmuse-search-tags","Oddmuse Search Tags"," - Module for a simple tagging mechanism",[41,325,326,330],{},[22,327,329],{"href":328},"\u002Fopenmoko","Openmoko"," - Customizing the Open Phone",[41,332,333,337],{},[22,334,336],{"href":335},"\u002Fperl-6-use-libs-from-ruby","Perl 6 Use Libs From Ruby"," - Perl 6 to Ruby bridge",[41,339,340,344],{},[22,341,343],{"href":342},"\u002Fperl-htmlunit","Perl HtmlUnit"," - A perl interface to the java HtmlUnit library",[41,346,347,351],{},[22,348,350],{"href":349},"\u002Fpolly","Polly"," - A very simple perl wrapper around some command-line audio players",[41,353,354,358],{},[22,355,357],{"href":356},"\u002Frubiks-cube-solver","Rubiks Cube Solver"," - I finally got my very own Rubik's Cube!",[41,360,361,365],{},[22,362,364],{"href":363},"\u002Fscrutiny-debugger","Scrutiny Debugger"," - PSGI\u002FPlack Middleware providing a debugger",[41,367,368,372],{},[22,369,371],{"href":370},"\u002Fsetdb","SetDB"," - A set-theoretical database interface",[41,374,375,379],{},[22,376,378],{"href":377},"\u002Fskechiki","Skechiki"," - A Perl\u002FGTK sketchbook for small touch-screen devices",[41,381,382,386],{},[22,383,385],{"href":384},"\u002Fsport-logo-quiz-game","Sport Logo Quiz Game"," - Test your knowledge of sport team logos!",[41,388,389,393],{},[22,390,392],{"href":391},"\u002Fthe-fridge","The Fridge"," - A javascript\u002Fphp refrigerator (complete)",[41,395,396,400],{},[22,397,399],{"href":398},"\u002Funtyped-lambda-calculus-in-ocaml","Untyped Lambda Calculus in OCaml"," - Exactly what it sounds like (complete? old)",[41,402,403,407],{},[22,404,406],{"href":405},"\u002Fuse-everywhere","Use Everywhere"," - Use a perl module all over the place",[41,409,410,414],{},[22,411,413],{"href":412},"\u002Fvladimirbot","VladimirBot"," - Personal assistant bot",[41,416,417,421],{},[22,418,420],{"href":419},"\u002Fwayv","WayV"," - Building on Mike Bennett's gesture recognition app",[41,423,424,428],{},[22,425,427],{"href":426},"\u002Fweb-board-games","Web Board Games"," - Web based 2D board games",[41,430,431,435],{},[22,432,434],{"href":433},"\u002Fwhite-elephant-gift-selector","White Elephant Gift Selector"," - Web app to pick the perfect gift!",[41,437,438,442],{},[22,439,441],{"href":440},"\u002Fzend-hacking","Zend Hacking"," - Feeling my way around (abandoned)",[444,445],"hr",{},[30,447,449],{"id":448},"tools","Tools",[38,451,452,459,466],{},[41,453,454,458],{},[22,455,457],{"href":456},"\u002Fi-love-vim","I love Vim"," - my preferred IDE",[41,460,461,462],{},"See a ",[22,463,465],{"href":464},"\u002Fscreenshot-on-2003.10.17","Screenshot on 2003.10.17",[41,467,468,472],{},[22,469,471],{"href":470},"\u002Fdarcs","Darcs"," - revision\u002Fbranch management. It's fun.",{"title":474,"searchDepth":475,"depth":475,"links":476},"",2,[477,478,479,480],{"id":32,"depth":475,"text":33},{"id":99,"depth":475,"text":100},{"id":129,"depth":475,"text":130},{"id":448,"depth":475,"text":449},"2005-01-04T11:35-05:00",false,"md",null,{},true,"\u002Fprojects",{"title":6,"description":13},[490],"project","2026-01-03","oiksJ8Uf5W0e-wwxKqNYXqJ4iPA4cpxgrnhSELkQNHo",{"id":494,"title":46,"body":495,"createdAt":491,"description":499,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":629,"navigation":486,"path":45,"seo":630,"stem":46,"tags":631,"updatedAt":491,"__hash__":632},"content\u002FRotae Versantur.md",{"type":8,"value":496,"toc":624},[497,500,504,507,515,533,538,545,550,554,617,621],[11,498,499],{},"The Wheels Turn. A monome norns+arc four track inspired recorder.",[30,501,503],{"id":502},"concept","Concept",[11,505,506],{},"The idea is to have four audio tracks that we play back and record against, one assigned to each wheel (knob control on the Arc).",[11,508,509,510],{},"See the project on ",[22,511,514],{"href":512,"rel":513},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Frotae_versantur",[26],"github",[11,516,517,518,521,526,527,532],{},"Equipment:",[519,520],"br",{},[22,522,525],{"href":523,"rel":524},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Fnorns\u002F",[26],"Monome Norns"," (though I technically have the ",[22,528,531],{"href":529,"rel":530},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Fnorns\u002Fshield\u002F",[26],"Monome Norns Shield",")",[11,534,535],{},[15,536],{"alt":474,"src":537},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Fnorns\u002Fimage\u002Fnorns-shield.png",[11,539,540],{},[22,541,544],{"href":542,"rel":543},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Farc\u002F",[26],"Monome Arc",[11,546,547],{},[15,548],{"alt":474,"src":549},"https:\u002F\u002Fmonome.org\u002Fdocs\u002Farc\u002Fimages\u002Farc.jpg",[30,551,553],{"id":552},"instructions","Instructions",[38,555,556,559,567,583,591,601,609],{},[41,557,558],{},"Use the Arc to visualize and control a four-track recording and playback machine",[41,560,561,562],{},"Button release\n",[38,563,564],{},[41,565,566],{},"Toggle Rolling vs Stopped",[41,568,569,570],{},"Turn a Wheel\n",[38,571,572,580],{},[41,573,574,575,579],{},"Set ",[576,577,578],"span",{},"MODE"," for that track",[41,581,582],{},"Amp, Pan, Reverb, Tone",[41,584,585,586],{},"Button + Wheel 1\n",[38,587,588],{},[41,589,590],{},"Seek",[41,592,593,594],{},"Button + Wheel 2\n",[38,595,596,599],{},[41,597,598],{},"Set MODE",[41,600,582],{},[41,602,603,604],{},"Button + Wheel 3\n",[38,605,606],{},[41,607,608],{},"Select recording track",[41,610,611,612],{},"Button + Wheel 4\n",[38,613,614],{},[41,615,616],{},"Select bounced tracks, they then feed recording",[30,618,620],{"id":619},"thoughts","Thoughts",[11,622,623],{},"This is a non-DAW setup, the idea being that we want more than a single recording but less than the distraction of an overly powerful computer. Four track recorders have been used to make a lot of great things, they appear to be sufficient for some complex pieces. Why buy one when I could buy something even more expensive and write some Lua and Supercollider code?",{"title":474,"searchDepth":475,"depth":475,"links":625},[626,627,628],{"id":502,"depth":475,"text":503},{"id":552,"depth":475,"text":553},{"id":619,"depth":475,"text":620},{},{"title":46,"description":499},[490],"PQGOCnwzcAx-ntHJkNZdquecQRiduwHeLKBsWsFR3FQ",{"id":634,"title":53,"body":635,"createdAt":665,"description":639,"draft":482,"extension":483,"image":645,"mastodonThread":484,"meta":666,"navigation":486,"path":52,"seo":667,"stem":53,"tags":668,"updatedAt":665,"__hash__":669},"content\u002FGhostwriter.md",{"type":8,"value":636,"toc":662},[637,640,646,650,653],[11,638,639],{},"Use the reMarkable2 as an interface to vision-LLMs. Ghost in the machine!",[11,641,642],{},[15,643],{"alt":644,"src":645},"Ghostwriter simple Chihuahua","https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fghostwriter\u002Fraw\u002Fmain\u002Fdocs\u002Fsimple-chihuahua.jpg",[30,647,649],{"id":648},"the-idea","The Idea",[11,651,652],{},"This is an exploration of another way to interact with vision LLMs, effectively pen-and-paper.",[11,654,655,656,661],{},"All of the up to date info and some notes are at ",[22,657,660],{"href":658,"rel":659},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fghostwriter",[26],"github.com\u002Fawwaiid\u002Fghostwriter",".",{"title":474,"searchDepth":475,"depth":475,"links":663},[664],{"id":648,"depth":475,"text":649},"2024-11-17T00:00:00.000Z",{},{"title":53,"description":639},[490],"6L7dNR0nI3ISdnlTtA0Kti4xY-I1IcO2dM9ZZdRWBG0",{"id":671,"title":238,"body":672,"createdAt":934,"description":935,"draft":482,"extension":483,"image":858,"mastodonThread":484,"meta":936,"navigation":486,"path":237,"seo":937,"stem":238,"tags":938,"updatedAt":939,"__hash__":940},"content\u002FLLM Token Tree Visualization.md",{"type":8,"value":673,"toc":928},[674,683,687,700,708,714,736,747,751,758,770,773,819,822,828,831,834,837,840,846,853,859,870,874,877,883,892,898,901,904,910,913,916],[11,675,676,677,682],{},"Each token is one choice from many forking paths. Let's see some of the other possibilities. Also try the ",[22,678,681],{"href":679,"rel":680},"https:\u002F\u002Fthelackthereof.org\u002Ftoken-tree\u002F",[26],"Live LLM Token Tree Visualization Tool","!",[30,684,686],{"id":685},"the-next-token-machine","The Next-Token Machine",[11,688,689,690,694,695,699],{},"Mostly we talk about LLMs (Large Language Models) as generating one ",[691,692,693],"strong",{},"token"," (roughly a syllable, it depends) at a time. But that's not really the whole picture. Given the context, all of the text that has led up to this point, the model will rank ",[696,697,698],"em",{},"all of the possible tokens"," and assign each a weight (a probability).",[11,701,702,703,707],{},"So if you have ",[704,705,706],"code",{},"\"Once upon a time there was a cat named\""," as the prompt, the LLM will internally score and rank every word (token) that it knows by how good a next-token it would be. The vast majority of next-tokens are very bad choices, and are scored low. But some of the next-token choices are viable choices, and some are even a bit arbitrary.",[11,709,710],{},[15,711],{"alt":712,"src":713},"Token Tree - Linear","img\u002FToken_Tree_-_Linear.png",[11,715,716,717,720,721,724,725,728,729,731,732,735],{},"Here you can see a list of tokens of what could come after our prompt. First is ",[704,718,719],{},"Wh",". Once a token is generated it is pretty locked in, so the next ",[704,722,723],{},"isk"," and then ",[704,726,727],{},"ers"," aren't too surprising. The first ",[704,730,719],{}," could have been ",[704,733,734],{},"z"," ... but that sort of nonsense token is ranked very low.",[11,737,738,739,742,743,746],{},"But each ",[691,740,741],{},"step"," of the selection doesn't look like this. Instead, at each step the overall execution is ",[696,744,745],{},"sampling"," one of the possible next-tokens.",[30,748,750],{"id":749},"token-vocabulary","Token Vocabulary",[11,752,753,754,757],{},"People talk about the \"length\" of a token -- that it is one word or one syllable and so on. But ... how many tokens ",[696,755,756],{},"are"," there?",[11,759,760,761,766,767,769],{},"Each token gets turned into a number, a single integer that represents that particular set of letters or symbols. You may have seen this before with simple A=1, B=2, C=3 type codes. Or with ",[22,762,765],{"href":763,"rel":764},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FASCII",[26],"ASCII"," where we also include some control characters. Or with Unicode where there are a bunch of symbols and things -- now we're getting into ",[704,768,693],{}," territory.",[11,771,772],{},"Let's look at some example Tokens from GPT-4o:",[38,774,775,781,787,793,805,810],{},[41,776,777,780],{},[704,778,779],{},"A"," = 32",[41,782,783,786],{},[704,784,785],{},"B"," = 33",[41,788,789,792],{},[704,790,791],{},"C"," = 34",[41,794,795,797,798,801,802],{},[704,796,719],{}," = 2073; Yes this is a capital-",[704,799,800],{},"W"," and lower-case-",[704,803,804],{},"h",[41,806,807,809],{},[704,808,723],{}," = 3295; Yes this is three letters",[41,811,812,815,816],{},[704,813,814],{},"⎵cozy"," = 45980; That is a space followed by ",[704,817,818],{},"cozy",[11,820,821],{},"A LOT of tokens are bits of sentences with a space in them already, rather than space being a separate token. In the visualizer you can turn on \"Show ID\" to see the numeric value for each token. Here is an example:",[11,823,824],{},[15,825],{"alt":826,"src":827},"Token Tree - with token ids","img\u002FToken_Tree_-_with_token_ids.png",[30,829,830],{"id":745},"Sampling",[11,832,833],{},"A lot of models have a 32,000 token vocabulary. That is to say, there are 32,000 possible different tokens that could come next after the context. At each step these are fully ranked and weighted -- so the top-ranked might be choice-1, the second-best choice would be choice-2, and so on. Each of the tokens is assigned a weight (a \"logprob\", or logarithmic probability), and then ranking is basically the sorted list based on this weight.",[11,835,836],{},"There are typically two token selection layers. First, most implementations narrow down to the top 40 or so possible tokens. Next they use a \"temperature\" multiplier and use the weights to randomly pick one of the tokens. If there is only one really-good choice, then the weights will make it so that it is VERY unlikely, if not impossible, for some worse token to be chosen.",[11,838,839],{},"We can see this by running the same prompt over and over again. Each time we run it we'll note each token, and then we'll build out a tree based on how the tokens showed up time after time.",[11,841,842],{},[15,843],{"alt":844,"src":845},"Token Tree - Simple","img\u002FToken_Tree_-_Simple.png",[11,847,848,849,852],{},"To make this a bit more visible, here we can see the tree with ",[696,850,851],{},"counts"," for how many times a particular path was taken.",[11,854,855],{},[15,856],{"alt":857,"src":858},"Token Tree - Simple With Counts","img\u002FToken_Tree_-_Simple_With_Counts.png",[11,860,861,862,865,866,869],{},"We can already learn a lot! For one thing, ",[704,863,864],{},"Whiskers"," appears to be a very common name for our kitten. Though after the name, the story goes on to either have a comma (",[704,867,868],{},",","), or maybe NOT have a comma, and talk about where Whiskers lived.",[30,871,873],{"id":872},"kittens","Kittens",[11,875,876],{},"Out of some curiosity, let's ask GPT-4o to do something similar. We have to change the prompt a little to get it to tell us the story (these public models have a BUNCH of additional context when run interactively).",[11,878,879],{},[15,880],{"alt":881,"src":882},"Token Tree - GPT-4o kitten","img\u002FToken_Tree_-_GPT-4o_kitten.png",[11,884,885,886,891],{},"OK ... now let's try ",[22,887,890],{"href":888,"rel":889},"https:\u002F\u002Fclaude.ai",[26],"Claude (from Anthropic)","...",[11,893,894],{},[15,895],{"alt":896,"src":897},"Token Tree - Claude kitten","img\u002FToken_Tree_-_Claude_kitten.png",[11,899,900],{},"Yep. Kittens are named \"Whiskers\".",[11,902,903],{},"Now ... to be scientific about it, really I should run these chat interfaces over and over again to see how statistically likely it is for the kitten to be named Whiskers. Let's do that with the token-tree visualizer. Here I'll have it run 100 times to build the tree.",[11,905,906],{},[15,907],{"alt":908,"src":909},"Token Tree - Luna Too","img\u002FToken_Tree_-_Luna_Too.png",[11,911,912],{},"OK ... out of the 100 executions, 97 of them (!) named the kitten Whiskers. One of them started to tell the story from scratch. And then TWO of them named the kitten Luna!",[11,914,915],{},"Therefore all kittens in stories are named Whiskers, or maaaayybbeee Luna. Facts.",[11,917,918,919,923,924,661],{},"In conclusion, play around with this ",[22,920,922],{"href":679,"rel":921},[26],"LLM Token Tree Visualization Tool"," to form some new intuitions. You can get the source code over at ",[22,925,926],{"href":926,"rel":927},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Ftoken-tree",[26],{"title":474,"searchDepth":475,"depth":475,"links":929},[930,931,932,933],{"id":685,"depth":475,"text":686},{"id":749,"depth":475,"text":750},{"id":745,"depth":475,"text":830},{"id":872,"depth":475,"text":873},"2024-09-08","Each token is one choice from many forking paths. Let's see some of the other possibilities. Also try the Live LLM Token Tree Visualization Tool!",{},{"title":238,"description":935},[490],"2024-09-14","V0l1PWXe2iACmhHm0ckD6zDggBL9AEQPCOxBqf9zIW8",{"id":942,"title":60,"body":943,"createdAt":986,"description":947,"draft":482,"extension":483,"image":953,"mastodonThread":484,"meta":987,"navigation":486,"path":59,"seo":988,"stem":60,"tags":989,"updatedAt":986,"__hash__":990},"content\u002FHuman Essentials.md",{"type":8,"value":944,"toc":984},[945,948,954,963,972,981],[11,946,947],{},"Part of the Ruby For Good organization; inventory control for diaper and period-supply banks.",[11,949,950],{},[15,951],{"alt":952,"src":953},"human essentials admin","img\u002Fhuman_essentials_admin.png",[11,955,956,957,962],{},"See the ",[22,958,961],{"href":959,"rel":960},"https:\u002F\u002Fgithub.com\u002Frubyforgood\u002Fhuman_essentials",[26],"Human Essentials Github repo"," for the main project itself. I am but one contributor, though I've been working on this project very steadily since 2022 (with some smaller contributions in 2018-2019).",[11,964,965,966,971],{},"I got turned onto the ",[22,967,970],{"href":968,"rel":969},"https:\u002F\u002Frubyforgood.org\u002F",[26],"Ruby For Good"," project in 2018 via the local DC Ruby community (especially Sean). I attended one of the annual events where there were several projects to choose from, but Human Essentials (previously DiaperBase) matched my background in inventory\u002Fwarehousing very well. I distinctly thought .... \"I've never used my powers for GOOD before. Hmm!\"",[11,973,974,975,980],{},"Every week on Sunday morning (\"",[22,976,979],{"href":977,"rel":978},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=bhSB8EEnCAM",[26],"This Is My Church","\") I get together with the team on a Zoom. We triage inbound issues and projects, groom requirements, discuss some technical design or roadmap. Then over the week I spend some small amount of time (always wish it was more) picking up some tickets, reviewing PRs, etc. Lately I've been running the deploys and infrastructure.",[11,982,983],{},"Join Us!",{"title":474,"searchDepth":475,"depth":475,"links":985},[],"2024-09-07",{},{"title":60,"description":947},[490],"f_3xhH1PyU3xo7MEYK16pCa1S4wgQP65Q1ibu6ZGAKQ",{"id":992,"title":993,"body":994,"createdAt":1006,"description":1007,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":1008,"navigation":486,"path":181,"seo":1009,"stem":182,"tags":1010,"updatedAt":1006,"__hash__":1011},"content\u002FCovid Can I Do It.md","COVID Can I Do It",{"type":8,"value":995,"toc":1004},[996],[11,997,998,999,1003],{},"During the COVID-19 pandemic I worked with an awesome group to build a harm-reduction dataset. The ",[22,1000,1001],{"href":1001,"rel":1002},"https:\u002F\u002Fcovidcanidoit.org\u002F",[26]," website teaches people what to do and not to do based on current community-risk levels.",{"title":474,"searchDepth":475,"depth":475,"links":1005},[],"2022-09-25","During the COVID-19 pandemic I worked with an awesome group to build a harm-reduction dataset. The https:\u002F\u002Fcovidcanidoit.org\u002F website teaches people what to do and not to do based on current community-risk levels.",{},{"title":993,"description":1007},[490],"-3q1T8DX50OfoTJ93bcqqJXPKDDdZVjxD_jJOazHD80",{"id":1013,"title":1014,"body":1015,"createdAt":1006,"description":1019,"draft":482,"extension":483,"image":1071,"mastodonThread":484,"meta":1072,"navigation":486,"path":110,"seo":1073,"stem":111,"tags":1074,"updatedAt":1006,"__hash__":1075},"content\u002FMizik.md","Mizik Game",{"type":8,"value":1016,"toc":1069},[1017,1020,1024,1036,1039],[11,1018,1019],{},"A hexagon-grid sound and sequence memory game.",[15,1021],{"src":1022,"align":1023},"\u002Fimg\u002Fmizik-demo.gif","right",[11,1025,1026,1027,1031,1032,661],{},"This is a game inspired by ",[22,1028,1030],{"href":1029},"\u002Ftlt-2020.01.19-mobile-webaudio-synth","TLT - 2020.01.19 - Mobile WebAudio Synth",". The game has its own domain at ",[22,1033,1034],{"href":1034,"rel":1035},"https:\u002F\u002Fmizikgame.com\u002F",[26],[11,1037,1038],{},"Technologies:",[38,1040,1041,1048,1055,1062],{},[41,1042,1043],{},[22,1044,1047],{"href":1045,"rel":1046},"https:\u002F\u002Fvuejs.org\u002F",[26],"VueJS",[41,1049,1050],{},[22,1051,1054],{"href":1052,"rel":1053},"https:\u002F\u002Ftonejs.github.io\u002F",[26],"ToneJS",[41,1056,1057],{},[22,1058,1061],{"href":1059,"rel":1060},"https:\u002F\u002Fparseplatform.org\u002F",[26],"Parse",[41,1063,1064],{},[22,1065,1068],{"href":1066,"rel":1067},"https:\u002F\u002Fgithub.com\u002Fflauwekeul\u002Fhoneycomb",[26],"Honeycomb Grid",{"title":474,"searchDepth":475,"depth":475,"links":1070},[],"img\u002Fmizik-demo.gif",{},{"title":1014,"description":1019},[490],"TxyyMNnKDXxWmoTshrnc7IrnGGS8jG6s0sj2E3VaLh4",{"id":1077,"title":67,"body":1078,"createdAt":1006,"description":1109,"draft":482,"extension":483,"image":1098,"mastodonThread":484,"meta":1110,"navigation":486,"path":66,"seo":1111,"stem":67,"tags":1112,"updatedAt":1006,"__hash__":1113},"content\u002FREPL Looper.md",{"type":8,"value":1079,"toc":1107},[1080,1093,1099],[11,1081,1082,1083,1087,1088,1092],{},"Pair a keyboard with the ",[22,1084,1086],{"href":1085},"\u002Fnorns","Norns"," and ",[22,1089,1091],{"href":1090},"\u002Fgrid","Grid",". Then you record commands like a set of timed and sequenced macros visible and triggered on the grid. Like a guitar-looper mashed up with a REPL mashed up with a sequencer!",[11,1094,1095],{},[15,1096],{"alt":1097,"src":1098},"REPL-Looper Demo","https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Frepl-looper\u002Fraw\u002Fmain\u002Fdocs\u002F20211227-demo-running.gif",[11,1100,1101,1102,1106],{},"See ",[22,1103,1104],{"href":1104,"rel":1105},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Frepl-looper",[26]," for the code, documentation, and a journal of development.",{"title":474,"searchDepth":475,"depth":475,"links":1108},[],"Pair a keyboard with the Norns and Grid. Then you record commands like a set of timed and sequenced macros visible and triggered on the grid. Like a guitar-looper mashed up with a REPL mashed up with a sequencer!",{},{"title":67,"description":1109},[490],"NzBsJmvsJi2JExJOImvsNNV5-4TodJKsFnPgT5u6B-E",{"id":1115,"title":1116,"body":1117,"createdAt":1150,"description":1121,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":1151,"navigation":486,"path":1152,"seo":1153,"stem":1154,"tags":1155,"updatedAt":1150,"__hash__":1156},"content\u002FWhite Elephant Gift Selecter.md","White_Elephant_Gift_Selecter",{"type":8,"value":1118,"toc":1148},[1119,1122,1125],[11,1120,1121],{},"As both a learning exercise and a fun use of Bracketology, I built a web app to help you pick out a great white elephant gift! I did it initially with Clojure, ClojureScript, Reagent, Figwheel. I've now re-built it with Ruby, Opal, React.rb, and helped build the new opal-hot-reloader!",[11,1123,1124],{},"I'm looking forward to porting to Perl6 once rakudo-js is working :)",[38,1126,1127,1134,1141],{},[41,1128,1129,1133],{},[22,1130,1131],{"href":1131,"rel":1132},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fwhite-elephant",[26]," -- Clojure",[41,1135,1136,1140],{},[22,1137,1138],{"href":1138,"rel":1139},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Freactrb-elephant",[26]," -- Ruby",[41,1142,1143,1147],{},[22,1144,1145],{"href":1145,"rel":1146},"https:\u002F\u002Fgithub.com\u002Ffkchang\u002Fopal-hot-reloader",[26]," -- Opal Hot Reloader",{"title":474,"searchDepth":475,"depth":475,"links":1149},[],"2016-05-22T21:30-04:00",{},"\u002Fwhite-elephant-gift-selecter",{"title":1116,"description":1121},"White Elephant Gift Selecter",[490],"k1T9T4X3W6kMBTbgx5qOhvM6mB-P3_aBjO__-fZRSxo",{"id":1158,"title":1159,"body":1160,"createdAt":1275,"description":1164,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":1276,"navigation":486,"path":258,"seo":1277,"stem":259,"tags":1278,"updatedAt":1279,"__hash__":1280},"content\u002FModule Level Polyglot.md","Module_Level_Polyglot",{"type":8,"value":1161,"toc":1267},[1162,1165,1168,1172,1201,1205,1222,1226,1234,1238,1243,1247,1258,1262],[11,1163,1164],{},"I often see people porting libraries from language to language, and new languages often have a rush to re-implement a bunch of things. Some of this makes sense, some of it is madness.",[11,1166,1167],{},"Never implement pyplot again.",[30,1169,1171],{"id":1170},"types","Types",[38,1173,1174,1185,1193],{},[41,1175,1176,1177],{},"\"Hosted\" language\n",[38,1178,1179,1182],{},[41,1180,1181],{},"Clojure, Scala, others run on the JVM, allowing them to (usually) call and be-called-by other JVM languages",[41,1183,1184],{},"Elm, ClojureScript, others run on JavaScript",[41,1186,1187,1188],{},"C-level\n",[38,1189,1190],{},[41,1191,1192],{},"Compiled languages can output a C-compatible library. Most un-hosted languages you can think of as being hosted on C",[41,1194,1195,1196],{},"Embed language\n",[38,1197,1198],{},[41,1199,1200],{},"Typically this uses C-bindings for language B, so that from language A's perspective it is calling a C library call",[30,1202,1204],{"id":1203},"issues","Issues",[38,1206,1207,1210,1213,1216,1219],{},[41,1208,1209],{},"Performance - When you cross datastructures over from one system to another there is sometimes a translation, and that means overhead of time or space",[41,1211,1212],{},"Unmappable language constructs - Maybe a given language doesn't have a regex or a series generator",[41,1214,1215],{},"Idiomatic Mismatch - The \"feel\" of a library can be a mismatch. This is a good reason for you to have multiple implementations of the same general library even within a language",[41,1217,1218],{},"Language Extensions - A lot of libraries are language extensions, which wouldn't make sense in another language (and sometimes don't make sense in a second implementation of the same language)",[41,1220,1221],{},"Memory Management - One of the most likely mis-matches and causes of issues because systems rarely have identical memory management models. This might also be the largest source of overhead. Memory ownership must be known, and sometimes more complex (multi-threaded) management must be coordinated",[30,1223,1225],{"id":1224},"references","References",[38,1227,1228],{},[41,1229,1230],{},[22,1231,1232],{"href":1232,"rel":1233},"http:\u002F\u002Fblog.deepgram.com\u002Fimport-a-docker-container-in-python\u002F",[26],[30,1235,1237],{"id":1236},"from-perl5","From Perl5",[38,1239,1240],{},[41,1241,1242],{},"Inline::* work pretty darn well",[30,1244,1246],{"id":1245},"from-perl6","From Perl6",[38,1248,1249,1252,1255],{},[41,1250,1251],{},"I've been working on Inline::Ruby, which will let you do some pretty fancy things",[41,1253,1254],{},"Inline::Perl5 is how you can call Perl5 code at all",[41,1256,1257],{},"Lots of others",[30,1259,1261],{"id":1260},"from-clojure","From Clojure",[38,1263,1264],{},[41,1265,1266],{},"Built in support to call arbitrary JVM code",{"title":474,"searchDepth":475,"depth":475,"links":1268},[1269,1270,1271,1272,1273,1274],{"id":1170,"depth":475,"text":1171},{"id":1203,"depth":475,"text":1204},{"id":1224,"depth":475,"text":1225},{"id":1236,"depth":475,"text":1237},{"id":1245,"depth":475,"text":1246},{"id":1260,"depth":475,"text":1261},"2016-01-22T09:20-05:00",{},{"title":1159,"description":1164},[490],"2016-03-08T07:22-05:00","4u2t2HZL-NvAAyYjAUuULT3Cvg_m2O_xk3jzihtSS88",{"id":1282,"title":1283,"body":1284,"createdAt":1300,"description":1301,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":1302,"navigation":486,"path":335,"seo":1303,"stem":336,"tags":1304,"updatedAt":1300,"__hash__":1305},"content\u002FPerl 6 Use Libs From Ruby.md","Perl_6_Use_Libs_From_Ruby",{"type":8,"value":1285,"toc":1298},[1286,1293],[11,1287,1288,1289],{},"Github project: ",[22,1290,1291],{"href":1291,"rel":1292},"https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fp6-Inline-Ruby",[26],[11,1294,1295,1296,661],{},"This is part of my overall quest, ",[22,1297,259],{"href":258},{"title":474,"searchDepth":475,"depth":475,"links":1299},[],"2016-01-22T09:02-05:00","Github project: https:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fp6-Inline-Ruby",{},{"title":1283,"description":1301},[490],"rUn75D-4zvRccG-Gz63bLp0wfvU-_XUXypABF9KL7Cw",{"id":1307,"title":266,"body":1308,"createdAt":1422,"description":1316,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":1423,"navigation":486,"path":265,"seo":1424,"stem":266,"tags":1425,"updatedAt":1426,"__hash__":1427},"content\u002FNoiseGen.md",{"type":8,"value":1309,"toc":1418},[1310,1314,1317,1328,1331,1352,1369,1386,1395,1400],[1311,1312,266],"h1",{"id":1313},"noisegen",[11,1315,1316],{},"20-Minute Software Synth",[11,1318,1319,1320],{},"[YouTube:pMZ4ilLzKW8](\u002F",[1321,1322],"iframe",{"width":1323,"height":1324,"src":1325,"frameBorder":1326,"allow":1327,"allowFullScreen":486},560,315,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fpmz4illzkw8)","0","accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture",[11,1329,1330],{},"Digital sound isn't really much more than a stream of floating point numbers from -1..1 sent to the sound card at a constant rate. So... let's use that concept to generate some noise using simple programming. Here I'm using 'unit generators', built in high-level dynamic programming languages, to make my speakers jump around a bit.",[11,1332,1333,1336,1337,1341,1342,1341,1347],{},[691,1334,1335],{},"Perl:"," ",[22,1338,514],{"href":1339,"rel":1340},"http:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fperl-noise",[26]," | ",[22,1343,1346],{"href":1344,"rel":1345},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FAudio-NoiseGen\u002F",[26],"local browse",[22,1348,1351],{"href":1349,"rel":1350},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FAudio-NoiseGen\u002F.git",[26],"local git",[11,1353,1354,1336,1357,1341,1361,1341,1365],{},[691,1355,1356],{},"Python:",[22,1358,514],{"href":1359,"rel":1360},"http:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fpython-noise",[26],[22,1362,1346],{"href":1363,"rel":1364},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fpython\u002Fnoisegen\u002F",[26],[22,1366,1351],{"href":1367,"rel":1368},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fpython\u002Fnoisegen\u002F.git",[26],[11,1370,1371,1336,1374,1341,1378,1341,1382],{},[691,1372,1373],{},"Ruby:",[22,1375,514],{"href":1376,"rel":1377},"http:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fruby-noise",[26],[22,1379,1346],{"href":1380,"rel":1381},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fruby\u002Fnoisegen\u002F",[26],[22,1383,1351],{"href":1384,"rel":1385},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fruby\u002Fnoisegen\u002F.git",[26],[1387,1388,1393],"pre",{"className":1389,"code":1391,"language":1392},[1390],"language-text","  # Alien Death Ray Sound?\n  \n  my $lfo = sine( freq => 5 );\n  \n  my $vfreq = sub {\n    $lfo->() * 100 + 440\n  }\n  \n  play( gen =>\n    sine( freq => $vfreq )\n  )\n","text",[704,1394,1391],{"__ignoreMap":474},[1396,1397,1399],"h3",{"id":1398},"news","News",[38,1401,1402,1410],{},[41,1403,1404,1405,682],{},"2012.06.23 - Presented at YAPC::NA 2012. Video is up on ",[22,1406,1409],{"href":1407,"rel":1408},"http:\u002F\u002Fyoutu.be\u002FpMZ4ilLzKW8",[26],"YouTube",[41,1411,1412,1413],{},"2012.05.31 - Presented NoiseGen at ",[22,1414,1417],{"href":1415,"rel":1416},"http:\u002F\u002Fwww.meetup.com\u002FArlington-Ruby\u002Fevents\u002F63925872\u002F",[26],"Arlington Ruby",{"title":474,"searchDepth":475,"depth":475,"links":1419},[1420],{"id":1398,"depth":1421,"text":1399},3,"2012-05-22T19:48-04:00",{},{"title":266,"description":1316},[490],"2014-10-01T18:15-04:00","JcMHWmzNmyPBeA2mD98hyfJ0TMukS_YQ6R4lzDeM01s",{"id":1429,"title":1430,"body":1431,"createdAt":1448,"description":1435,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":1449,"navigation":486,"path":363,"seo":1450,"stem":364,"tags":1451,"updatedAt":1448,"__hash__":1452},"content\u002FScrutiny Debugger.md","Scrutiny_Debugger",{"type":8,"value":1432,"toc":1446},[1433,1436,1439],[11,1434,1435],{},"After giving a talk on debugging techniques, I started wondering why I (and many others) don't use the debugger in perl much... but generally do use the debugger provided by other systems (firebug). The general idea I came up with isn't that using a step-based debugger is flawed philosophically, as I had initial suspected. Instead I think it is just because it isn't at our fingertips.",[11,1437,1438],{},"This project is an experiment to bring a debugging tool into a popular perl application chain - Plack\u002FPSGI middleware.",[11,1440,1441,1442],{},"Code: git clone ",[22,1443,1444],{"href":1444,"rel":1445},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FPlack-Middleware-Scrutiny\u002F.git",[26],{"title":474,"searchDepth":475,"depth":475,"links":1447},[],"2011-11-05T15:46-04:00",{},{"title":1430,"description":1435},[490],"zboBwaoyMwr2kYZa-AJgd2JrdKGHW9b9NA9tOE81_jc",{"id":1454,"title":1455,"body":1456,"createdAt":1960,"description":1961,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":1962,"navigation":486,"path":1963,"seo":1964,"stem":1455,"tags":1965,"updatedAt":1967,"__hash__":1968},"content\u002FMusic.md","Music",{"type":8,"value":1457,"toc":1958},[1458,1465,1474,1477],[11,1459,1460,1461,682],{},"START HERE! This page is an overview; much of the music I've written or been involved with in one lovely place. Also check out my ",[22,1462,1464],{"href":1463},"\u002Fmusic-gear-and-setup","Music Gear and Setup",[11,1466,1467,1468,1473],{},"These works are licensed under a ",[22,1469,1472],{"href":1470,"rel":1471},"http:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-sa\u002F3.0\u002F",[26],"Creative Commons Attribution-ShareAlike (CC BY-SA)"," License (or maybe CC BY-NC... feel free to ask).",[11,1475,1476],{},"Here are a bunch of songs! Some of these are more proof-of-concept than anything :) . These include both solo efforts and collaborations, follow the links to learn more and maybe get some lyrics, variations, and background.",[1478,1479,1480,1493],"table",{},[1481,1482,1483],"thead",{},[1484,1485,1486,1490],"tr",{},[1487,1488,1489],"th",{},"Song",[1487,1491,1492],{},"Play!",[1494,1495,1496,1517,1533,1549,1565,1581,1597,1610,1626,1642,1658,1674,1690,1706,1722,1738,1754,1767,1783,1796,1809,1822,1835,1848,1861,1874,1890,1906,1922,1938,1948],"tbody",{},[1484,1497,1498,1505],{},[1499,1500,1501],"td",{},[22,1502,1504],{"href":1503},"\u002Fgot-one-shoe","Got One Shoe",[1499,1506,1507,1512,1513,532],{},[1508,1509],"audio",{"controls":486,"preload":1510,"src":1511},"metadata","\u002Fdocs\u002Fmusic\u002Foneshoe.mp3"," (",[22,1514,1516],{"download":1515,"external":474,"href":1511},"docs\u002Fmusic\u002Foneshoe.mp3","download",[1484,1518,1519,1525],{},[1499,1520,1521],{},[22,1522,1524],{"href":1523},"\u002Ffrog-prince","Frog Prince",[1499,1526,1527,1512,1530,532],{},[1508,1528],{"controls":486,"preload":1510,"src":1529},"\u002Fdocs\u002Fmusic\u002Ffrog_prince_v5.mp3",[22,1531,1516],{"download":1532,"external":474,"href":1529},"docs\u002Fmusic\u002Ffrog_prince_v5.mp3",[1484,1534,1535,1541],{},[1499,1536,1537],{},[22,1538,1540],{"href":1539},"\u002Fumbrellas","Umbrellas",[1499,1542,1543,1512,1546,532],{},[1508,1544],{"controls":486,"preload":1510,"src":1545},"\u002Fdocs\u002Fmusic\u002Fumbrellas.mp3",[22,1547,1516],{"download":1548,"external":474,"href":1545},"docs\u002Fmusic\u002Fumbrellas.mp3",[1484,1550,1551,1557],{},[1499,1552,1553],{},[22,1554,1556],{"href":1555},"\u002Fi-like-caffeine","I Like Caffeine",[1499,1558,1559,1512,1562,532],{},[1508,1560],{"controls":486,"preload":1510,"src":1561},"\u002Fdocs\u002Fmusic\u002Fi_like_caffeine.mp3",[22,1563,1516],{"download":1564,"external":474,"href":1561},"docs\u002Fmusic\u002Fi_like_caffeine.mp3",[1484,1566,1567,1573],{},[1499,1568,1569],{},[22,1570,1572],{"href":1571},"\u002Fsegfault","Segfault",[1499,1574,1575,1512,1578,532],{},[1508,1576],{"controls":486,"preload":1510,"src":1577},"\u002Fdocs\u002Fmusic\u002FSegfault_v1_2016-02-14.mp3",[22,1579,1516],{"download":1580,"external":474,"href":1577},"docs\u002Fmusic\u002FSegfault_v1_2016-02-14.mp3",[1484,1582,1583,1589],{},[1499,1584,1585],{},[22,1586,1588],{"href":1587},"\u002Fknit-some-shit","Knit Some Shit",[1499,1590,1591,1512,1594,532],{},[1508,1592],{"controls":486,"preload":1510,"src":1593},"\u002Fdocs\u002Fmusic\u002Fknit-some-shit-1.mp3",[22,1595,1516],{"download":1596,"external":474,"href":1593},"docs\u002Fmusic\u002Fknit-some-shit-1.mp3",[1484,1598,1599,1602],{},[1499,1600,1601],{},"Late Blues",[1499,1603,1604,1512,1607,532],{},[1508,1605],{"controls":486,"preload":1510,"src":1606},"\u002Fdocs\u002Fmusic\u002Flateblues.mp3",[22,1608,1516],{"download":1609,"external":474,"href":1606},"docs\u002Fmusic\u002Flateblues.mp3",[1484,1611,1612,1618],{},[1499,1613,1614],{},[22,1615,1617],{"href":1616},"\u002Fimmaterial-things","Immaterial Things",[1499,1619,1620,1512,1623,532],{},[1508,1621],{"controls":486,"preload":1510,"src":1622},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F03_-_Immaterial_Things.mp3",[22,1624,1516],{"download":1625,"external":474,"href":1622},"docs\u002Fmusic\u002Falbum1\u002F03_-_Immaterial_Things.mp3",[1484,1627,1628,1634],{},[1499,1629,1630],{},[22,1631,1633],{"href":1632},"\u002Fcdoltm","CDOLTM",[1499,1635,1636,1512,1639,532],{},[1508,1637],{"controls":486,"preload":1510,"src":1638},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F08_-_CDOLTM.mp3",[22,1640,1516],{"download":1641,"external":474,"href":1638},"docs\u002Fmusic\u002Falbum1\u002F08_-_CDOLTM.mp3",[1484,1643,1644,1650],{},[1499,1645,1646],{},[22,1647,1649],{"href":1648},"\u002Fcode-on-my-mind","Code On My Mind",[1499,1651,1652,1512,1655,532],{},[1508,1653],{"controls":486,"preload":1510,"src":1654},"\u002Fdocs\u002Fmusic\u002Fcode_on_my_mind.mp3",[22,1656,1516],{"download":1657,"external":474,"href":1654},"docs\u002Fmusic\u002Fcode_on_my_mind.mp3",[1484,1659,1660,1666],{},[1499,1661,1662],{},[22,1663,1665],{"href":1664},"\u002Fdont-repeat-yourself","Dont Repeat Yourself",[1499,1667,1668,1512,1671,532],{},[1508,1669],{"controls":486,"preload":1510,"src":1670},"\u002Fdocs\u002Fmusic\u002Fdont_repeat_yourself.mp3",[22,1672,1516],{"download":1673,"external":474,"href":1670},"docs\u002Fmusic\u002Fdont_repeat_yourself.mp3",[1484,1675,1676,1682],{},[1499,1677,1678],{},[22,1679,1681],{"href":1680},"\u002Fmy-little-dog","My Little Dog",[1499,1683,1684,1512,1687,532],{},[1508,1685],{"controls":486,"preload":1510,"src":1686},"\u002Fdocs\u002Fmusic\u002Frpm2023\u002FMy_Little_Dog_r3_20230211_2112.mp3",[22,1688,1516],{"download":1689,"external":474,"href":1686},"docs\u002Fmusic\u002Frpm2023\u002FMy_Little_Dog_r3_20230211_2112.mp3",[1484,1691,1692,1698],{},[1499,1693,1694],{},[22,1695,1697],{"href":1696},"\u002Fimmortal-crowd","Immortal Crowd",[1499,1699,1700,1512,1703,532],{},[1508,1701],{"controls":486,"preload":1510,"src":1702},"\u002Fdocs\u002Fmusic\u002Fimmortal_crowd.mp3",[22,1704,1516],{"download":1705,"external":474,"href":1702},"docs\u002Fmusic\u002Fimmortal_crowd.mp3",[1484,1707,1708,1714],{},[1499,1709,1710],{},[22,1711,1713],{"href":1712},"\u002Fcall-on-borbyu","Call On Borbyu",[1499,1715,1716,1512,1719,532],{},[1508,1717],{"controls":486,"preload":1510,"src":1718},"\u002Fdocs\u002Fmusic\u002Fcall_on_borbyu.mp3",[22,1720,1516],{"download":1721,"external":474,"href":1718},"docs\u002Fmusic\u002Fcall_on_borbyu.mp3",[1484,1723,1724,1730],{},[1499,1725,1726],{},[22,1727,1729],{"href":1728},"\u002Fpi-girl","Pi Girl",[1499,1731,1732,1512,1735,532],{},[1508,1733],{"controls":486,"preload":1510,"src":1734},"\u002Fdocs\u002Fmusic\u002Fpigirl7.mp3",[22,1736,1516],{"download":1737,"external":474,"href":1734},"docs\u002Fmusic\u002Fpigirl7.mp3",[1484,1739,1740,1746],{},[1499,1741,1742],{},[22,1743,1745],{"href":1744},"\u002Fgitmo","Gitmo",[1499,1747,1748,1512,1751,532],{},[1508,1749],{"controls":486,"preload":1510,"src":1750},"\u002Fdocs\u002Fmusic\u002Fgitmo_v1.mp3",[22,1752,1516],{"download":1753,"external":474,"href":1750},"docs\u002Fmusic\u002Fgitmo_v1.mp3",[1484,1755,1756,1759],{},[1499,1757,1758],{},"Hotel Yorba (cover)",[1499,1760,1761,1512,1764,532],{},[1508,1762],{"controls":486,"preload":1510,"src":1763},"\u002Fdocs\u002Fmusic\u002Fyorba.mp3",[22,1765,1516],{"download":1766,"external":474,"href":1763},"docs\u002Fmusic\u002Fyorba.mp3",[1484,1768,1769,1775],{},[1499,1770,1771],{},[22,1772,1774],{"href":1773},"\u002Fzombie-love","Zombie Love",[1499,1776,1777,1512,1780,532],{},[1508,1778],{"controls":486,"preload":1510,"src":1779},"\u002Fdocs\u002Fmusic\u002Fzombielove.mp3",[22,1781,1516],{"download":1782,"external":474,"href":1779},"docs\u002Fmusic\u002Fzombielove.mp3",[1484,1784,1785,1788],{},[1499,1786,1787],{},"Big Brown Spider",[1499,1789,1790,1512,1793,532],{},[1508,1791],{"controls":486,"preload":1510,"src":1792},"\u002Fdocs\u002Fmusic\u002Fbig_brown_spider_test.mp3",[22,1794,1516],{"download":1795,"external":474,"href":1792},"docs\u002Fmusic\u002Fbig_brown_spider_test.mp3",[1484,1797,1798,1801],{},[1499,1799,1800],{},"I Knew A Girl",[1499,1802,1803,1512,1806,532],{},[1508,1804],{"controls":486,"preload":1510,"src":1805},"\u002Fdocs\u002Fmusic\u002Fi_knew_a_girl.mp3",[22,1807,1516],{"download":1808,"external":474,"href":1805},"docs\u002Fmusic\u002Fi_knew_a_girl.mp3",[1484,1810,1811,1814],{},[1499,1812,1813],{},"Happiness Blues",[1499,1815,1816,1512,1819,532],{},[1508,1817],{"controls":486,"preload":1510,"src":1818},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F05_-_Happiness_Blues.mp3",[22,1820,1516],{"download":1821,"external":474,"href":1818},"docs\u002Fmusic\u002Falbum1\u002F05_-_Happiness_Blues.mp3",[1484,1823,1824,1827],{},[1499,1825,1826],{},"Groovin",[1499,1828,1829,1512,1832,532],{},[1508,1830],{"controls":486,"preload":1510,"src":1831},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F09_-_Groovin.mp3",[22,1833,1516],{"download":1834,"external":474,"href":1831},"docs\u002Fmusic\u002Falbum1\u002F09_-_Groovin.mp3",[1484,1836,1837,1840],{},[1499,1838,1839],{},"Shaseys",[1499,1841,1842,1512,1845,532],{},[1508,1843],{"controls":486,"preload":1510,"src":1844},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F10_-_Shaseys.mp3",[22,1846,1516],{"download":1847,"external":474,"href":1844},"docs\u002Fmusic\u002Falbum1\u002F10_-_Shaseys.mp3",[1484,1849,1850,1853],{},[1499,1851,1852],{},"Marie Laveau (Bobby Bare cover)",[1499,1854,1855,1512,1858,532],{},[1508,1856],{"controls":486,"preload":1510,"src":1857},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F11_-_Marie_Laveau_(Bobby_Bare_cover).mp3",[22,1859,1516],{"download":1860,"external":474,"href":1857},"docs\u002Fmusic\u002Falbum1\u002F11_-_Marie_Laveau_(Bobby_Bare_cover).mp3",[1484,1862,1863,1866],{},[1499,1864,1865],{},"SIC",[1499,1867,1868,1512,1871,532],{},[1508,1869],{"controls":486,"preload":1510,"src":1870},"\u002Fdocs\u002Fmusic\u002Falbum1\u002F04_-_SIC.mp3",[22,1872,1516],{"download":1873,"external":474,"href":1870},"docs\u002Fmusic\u002Falbum1\u002F04_-_SIC.mp3",[1484,1875,1876,1882],{},[1499,1877,1878],{},[22,1879,1881],{"href":1880},"\u002Flivingroom-adventures","Livingroom Adventures",[1499,1883,1884,1512,1887,532],{},[1508,1885],{"controls":486,"preload":1510,"src":1886},"\u002Fdocs\u002Fmusic\u002Flivingroom_adventures.mp3",[22,1888,1516],{"download":1889,"external":474,"href":1886},"docs\u002Fmusic\u002Flivingroom_adventures.mp3",[1484,1891,1892,1898],{},[1499,1893,1894],{},[22,1895,1897],{"href":1896},"\u002Fwanda-vision-jam","Wanda Vision Jam",[1499,1899,1900,1512,1903,532],{},[1508,1901],{"controls":486,"preload":1510,"src":1902},"\u002Fdocs\u002Fmusic\u002Fwandavision_jam.mp3",[22,1904,1516],{"download":1905,"external":474,"href":1902},"docs\u002Fmusic\u002Fwandavision_jam.mp3",[1484,1907,1908,1914],{},[1499,1909,1910],{},[22,1911,1913],{"href":1912},"\u002Fyo-oliver","Yo Oliver",[1499,1915,1916,1512,1919,532],{},[1508,1917],{"controls":486,"preload":1510,"src":1918},"\u002Fdocs\u002Fmusic\u002Fyo_oliver_v1.mp3",[22,1920,1516],{"download":1921,"external":474,"href":1918},"docs\u002Fmusic\u002Fyo_oliver_v1.mp3",[1484,1923,1924,1930],{},[1499,1925,1926],{},[22,1927,1929],{"href":1928},"\u002Fwhite-roses","White Roses",[1499,1931,1932,1512,1935,532],{},[1508,1933],{"controls":486,"preload":1510,"src":1934},"\u002Fdocs\u002Fmusic\u002Felectric_accordion_white_roses.mp3",[22,1936,1516],{"download":1937,"external":474,"href":1934},"docs\u002Fmusic\u002Felectric_accordion_white_roses.mp3",[1484,1939,1940,1946],{},[1499,1941,1942],{},[22,1943,1945],{"href":1944},"\u002Fit-takes-all-sorts","It Takes All Sorts",[1499,1947],{},[1484,1949,1950,1956],{},[1499,1951,1952],{},[22,1953,1955],{"href":1954},"\u002Ftalking-dc-vote-blues","Talking DC Vote Blues",[1499,1957],{},{"title":474,"searchDepth":475,"depth":475,"links":1959},[],"2010-11-27T14:22-05:00","START HERE! This page is an overview; much of the music I've written or been involved with in one lovely place. Also check out my Music Gear and Setup!",{},"\u002Fmusic",{"title":1455,"description":1961},[490,1966],"music","2023-03-25","3NiAYLFcHqDxolTJpZ6iJfQALqOPpt5TnQYfzB1GZck",{"id":1970,"title":154,"body":1971,"createdAt":2089,"description":1975,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2090,"navigation":486,"path":153,"seo":2091,"stem":154,"tags":2092,"updatedAt":2093,"__hash__":2094},"content\u002FCaravan.md",{"type":8,"value":1972,"toc":2084},[1973,1976,1979,1993,2000,2004,2007,2011,2014,2018,2025,2029,2035,2043,2047,2050,2053],[11,1974,1975],{},"For my cs512 class (Advanced Data Mining), I'm re-implementing CloSpan and CISpan, and am going to add to them FloSpan (or whatever I call it). In order to do this, I've built up some common libraries and I'm calling the overall framework 'Caravan'. I've actually started from scratch twice already!",[11,1977,1978],{},"Planned algorithms:",[38,1980,1981,1984,1987,1990],{},[41,1982,1983],{},"PrefixPan - Base algorithm, uses a prefix tree to hold sequential patterns",[41,1985,1986],{},"CloSpan - Builds off of PrefixPan, but does Closed Sequential Patterns",[41,1988,1989],{},"CISpan - Builds off of CloSpan, but allows a single 'diff' on top of the base data",[41,1991,1992],{},"FloSpan - Builds off of CISpan, but uses ideas from IncSpan to allow continuous updates",[11,1994,1101,1995,1999],{},[22,1996,1998],{"href":1997},"\u002Fintroduction-to-frequent-sequential-pattern-mining","Introduction to Frequent Sequential Pattern Mining"," for some background information on what this is all about, and what it is good for.",[30,2001,2003],{"id":2002},"the-paper","The Paper",[11,2005,2006],{},"Since this is an assignment, I'm going to be writing a paper. Someday I'll link to it.",[30,2008,2010],{"id":2009},"get-the-code","Get The Code",[11,2012,2013],{},"As usual, my code is in darcs, grab it with:",[1311,2015,2017],{"id":2016},"original-modular-version","Original, modular version",[11,2019,2020,2021],{},"darcs get ",[22,2022,2023],{"href":2023,"rel":2024},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fcaravan",[26],[1311,2026,2028],{"id":2027},"new-fancy-object-oriented-version","New fancy object-oriented version",[11,2030,2020,2031],{},[22,2032,2033],{"href":2033,"rel":2034},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fcaravan2",[26],[11,2036,2037,2038,2042],{},"or from my github mirror. See ",[22,2039,2041],{"href":2040},"\u002Fcontributing","Contributing"," for general hacking info.",[30,2044,2046],{"id":2045},"use-the-code","Use The Code",[11,2048,2049],{},"I should put together an example usage :)",[11,2051,2052],{},"Plan\u002FTodo:",[38,2054,2055,2072,2075,2078,2081],{},[41,2056,2057,2058],{},"Command line interface\n",[38,2059,2060,2063,2066,2069],{},[41,2061,2062],{},"Switch to control which algorithm",[41,2064,2065],{},"Input in the standard binary and ascii formats",[41,2067,2068],{},"Output in a human readable format",[41,2070,2071],{},"Output in a machine readable format",[41,2073,2074],{},"OCaml library interface",[41,2076,2077],{},"C-library interface? Others?",[41,2079,2080],{},"Validate CloSpan against the Illimine (C++) implementation",[41,2082,2083],{},"Benchmark CloSpan against the Illimine implementation",{"title":474,"searchDepth":475,"depth":475,"links":2085},[2086,2087,2088],{"id":2002,"depth":475,"text":2003},{"id":2009,"depth":475,"text":2010},{"id":2045,"depth":475,"text":2046},"2010-08-16T02:07-04:00",{},{"title":154,"description":1975},[490],"2010-08-16T02:29-04:00","00QDSk6Qhl0tE3fyXl334uU0Htw1IXZIu7YVS_83VIo",{"id":2096,"title":2097,"body":2098,"createdAt":2135,"description":2102,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2136,"navigation":486,"path":405,"seo":2137,"stem":406,"tags":2138,"updatedAt":2135,"__hash__":2139},"content\u002FUse Everywhere.md","Use_Everywhere",{"type":8,"value":2099,"toc":2132},[2100,2103,2109,2112,2118,2121],[11,2101,2102],{},"I strongly believe that new versions of perl should enable all the features by default. Every time I write \"use 5.010\" at the top of my programs I am bothered... so now I can do:",[1387,2104,2107],{"className":2105,"code":2106,"language":1392},[1390],"use everywhere '5.010';\n",[704,2108,2106],{"__ignoreMap":474},[11,2110,2111],{},"... in only the toplevel .pl and never again in any of the .pm files in the whole program. Not as good as having it on by default, but not too bad. This is what I have in EPFarms.pm:",[1387,2113,2116],{"className":2114,"code":2115,"language":1392},[1390],"use everywhere 'MooseX::Declare; use 5.010',\n  matching => '^EPFarms',\n  use_here => 1;\n",[704,2117,2115],{"__ignoreMap":474},[30,2119,2120],{"id":704},"Code",[38,2122,2123,2129],{},[41,2124,2020,2125],{},[22,2126,2127],{"href":2127,"rel":2128},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Feverywhere",[26],[41,2130,2131],{},"cpan:everywhere",{"title":474,"searchDepth":475,"depth":475,"links":2133},[2134],{"id":704,"depth":475,"text":2120},"2010-03-07T23:49-05:00",{},{"title":2097,"description":2102},[490],"-oX-EY4ly6C6qpSQGDrF9KW79LzXVll8jHLrhoStsoM",{"id":2141,"title":378,"body":2142,"createdAt":2308,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2309,"navigation":486,"path":377,"seo":2310,"stem":378,"tags":2311,"updatedAt":2312,"__hash__":2313},"content\u002FSkechiki.md",{"type":8,"value":2143,"toc":2303},[2144,2148,2157,2189,2192,2236,2238,2255,2258,2282,2285,2291,2295],[30,2145,2147],{"id":2146},"goal","Goal",[11,2149,2150,2151,2156],{},"Ultimately the goal is to digitalize my long-time usage of a ",[22,2152,2155],{"href":2153,"rel":2154},"http:\u002F\u002Fwww.moleskine.com\u002Fcatalogue\u002Fclassic\u002Fhard_black_cover\u002Fsketchbook__pocket.php",[26],"Moleskine Pocket Sketchbook",". There are several things that can never be digitalized (battery life!), and several advantages that digitalization provides (backups!). I'll use the word \"sketch\" even though most of the time I'm actually taking notes... the point is that I'm doing handwriting not typing. Here is the gist of it:",[38,2158,2159,2167,2170,2178,2181],{},[41,2160,2161,2162],{},"Quickly get to where I can start making a new sketch\n",[38,2163,2164],{},[41,2165,2166],{},"When someone is telling me what to buy them at subway, I don't have time to wait for a lot of loading and button pressing before I can even start writing.",[41,2168,2169],{},"Quickly get to a recent sketch",[41,2171,2172,2173],{},"Use a stylus (or finger) to accurately sketch\n",[38,2174,2175],{},[41,2176,2177],{},"I should be able to sketch an actual picture, or write in a normal small font",[41,2179,2180],{},"Flip through not-so-recent sketches",[41,2182,2183,2184],{},"Have enough room to generally avoid scrolling\n",[38,2185,2186],{},[41,2187,2188],{},"I never had to scroll with my Moleskine!",[11,2190,2191],{},"And some things that my Moleskine couldn't do:",[38,2193,2194,2197,2200,2203,2206,2209,2220,2228],{},[41,2195,2196],{},"Undo\u002FRedo",[41,2198,2199],{},"Object-based delete",[41,2201,2202],{},"Object-based move\u002Fresize",[41,2204,2205],{},"Backups!",[41,2207,2208],{},"Tag or name sketches",[41,2210,2211,2212],{},"Search sketches\n",[38,2213,2214,2217],{},[41,2215,2216],{},"By tag, name, or date at least",[41,2218,2219],{},"By sketching would be cool :)",[41,2221,2222,2223],{},"Link pages\n",[38,2224,2225],{},[41,2226,2227],{},"This is where the wiki bit comes in!",[41,2229,2230,2231],{},"Zoom?\n",[38,2232,2233],{},[41,2234,2235],{},"Not sure I want this",[30,2237,2120],{"id":704},[11,2239,2240,2241,2246,2247,2251,2252,2254],{},"I've gotten a huge head start on this by building on ",[22,2242,2245],{"href":2243,"rel":2244},"http:\u002F\u002Fwww.adebenham.com\u002Fold-stuff\u002Fgournal\u002F",[26],"Gournal",", a Perl\u002FGTK application by Chris Debenham. Chris was targeting a much larger tablet, whereas my immediate target is the ",[22,2248,2250],{"href":2249},"\u002Fn900","n900"," (and originally the ",[22,2253,329],{"href":328},"), which has a 800x480 screen but is only a few inches in size. Gournal stores individual sketches as .svgz (gziped svg), which sounds good to me.",[11,2256,2257],{},"Things I've done so far:",[38,2259,2260,2263,2266,2274],{},[41,2261,2262],{},"Make all the icons smaller",[41,2264,2265],{},"Move the sideways tabbar to the top",[41,2267,2268,2269],{},"Switch to goocanvas\n",[38,2270,2271],{},[41,2272,2273],{},"This will make it easier to do linking and other stuff, I think",[41,2275,2276,2277],{},"Switch to cpan:SVG::Parser instead of cpan:XML::Mini::Document\n",[38,2278,2279],{},[41,2280,2281],{},"Got a significant speedup!",[11,2283,2284],{},"Get the code:",[11,2286,2020,2287],{},[22,2288,2289],{"href":2289,"rel":2290},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fskechiki\u002F",[26],[30,2292,2294],{"id":2293},"resources","Resources",[38,2296,2297],{},[41,2298,2299],{},[22,2300,2301],{"href":2301,"rel":2302},"https:\u002F\u002Fwiki.ubuntu.com\u002FMeetingLogs\u002FOpWeek1003\u002FGooey",[26],{"title":474,"searchDepth":475,"depth":475,"links":2304},[2305,2306,2307],{"id":2146,"depth":475,"text":2147},{"id":704,"depth":475,"text":2120},{"id":2293,"depth":475,"text":2294},"2010-03-07T22:15-05:00",{},{"title":378,"description":474},[490],"2010-03-10T22:44-05:00","oIO-sl4pLXh-FOw8rpfLA4emM1W01zo86FaCb1WK2YU",{"id":2315,"title":2316,"body":2317,"createdAt":2396,"description":2321,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2397,"navigation":486,"path":146,"seo":2398,"stem":147,"tags":2399,"updatedAt":2400,"__hash__":2401},"content\u002FCGI Inspect.md","CGI_Inspect",{"type":8,"value":2318,"toc":2392},[2319,2322,2325,2327,2330,2334,2340,2344,2347,2351,2358,2361],[11,2320,2321],{},"CGI::Inspect info goes here.",[11,2323,2324],{},"This, along with Continuity::Monitor::CGI, allows you to inspect a running web application.",[30,2326,2120],{"id":704},[11,2328,2329],{},"The easiest way is to get it from CPAN. But if you want something a little more raw:",[1311,2331,2333],{"id":2332},"real-darcs-repo","Real Darcs Repo",[11,2335,2020,2336],{},[22,2337,2338],{"href":2338,"rel":2339},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FCGI-Inspect",[26],[1311,2341,2343],{"id":2342},"github-mirror","Github mirror",[11,2345,2346],{},"git clone git:\u002F\u002Fgithub.com\u002Fawwaiid\u002Fcgi-inspect.git",[30,2348,2350],{"id":2349},"yapcna-2009-presentation","YAPC::NA 2009 Presentation",[11,2352,2353,2354],{},"You can get the slides at ",[22,2355,2356],{"href":2356,"rel":2357},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fyapcna-2009\u002Fcgi-inspect\u002F",[26],[11,2359,2360],{},"Abstract:",[2362,2363,2364,2365],"blockquote",{},"\nOne of the tried and true ways of debugging is to sprinkle 'print \"Here! $val\\n\"' around and see what happens or if the program even reaches that point. Simple and effective! Carp::REPL lets you take this a step further by starting an interactive Read-Eval-Print Loop (REPL) at an arbitrary point in your program.\n",[2362,2366,2367,2368],{},"\nI've taken this technique and mixed in a splash of Continuity to build an interactive web-based REPL and inspector for your application. The REPL lets you execute arbitrary code, the inspector gives you a GUI for traversing your callstack and manipulating your variables. It works on regular applications and CGI scripts too. You just add a single \"inspect()\" where you like and you'll be whackin' those bugs DOWN!\n",[2362,2369,2370,2371,2375,2383],{},"\nIn this talk I'll show you how to use the tool and how it's built... and how you can add to it with plugins.\n",[30,2372,2374],{"id":2373},"ppw-2008-presentation","PPW 2008 Presentation",[11,2376,2377,2378,2382],{},"I presented the earlier incarnation of this module, Continuity::Monitor::CGI, at PPW 2008 to about 30 people. If you missed it you can get the ",[22,2379,2381],{"href":2380},"\u002Fppw-2008-continuity-monitor-slides","PPW 2008 Continuity-Monitor Slides",". Here is the abstract:",[2362,2384,2385,2386],{},"\nOne of the tried and true ways of debugging is to sprinkle 'print \"Here! $val\\n\"' around and see what happens or if the program even reaches that point. Simple and effective! Carp::REPL lets you take this a step further by starting an interactive read-eval-print loop (REPL) at an arbitrary point in your program.\n",[2362,2387,2388,2389],{},"\nI've taken this technique and mixed in a splash of Continuity to build an interactive web-based REPL and inspector for your application. It works on CGI scripts too (barring some fixable browser timeouts :) ). If you're nice to it, it might even let you edit your source file, reload it, and continue execution. You just add a single \"inspect()\" where you like and you'll be whackin' those bugs DOWN!\n",[2362,2390,2391],{},"\nIn this talk I'll show you how to use the tool and how it's built... and how you can add to it. And by then it'll be on CPAN :) ",{"title":474,"searchDepth":475,"depth":475,"links":2393},[2394,2395],{"id":704,"depth":475,"text":2120},{"id":2349,"depth":475,"text":2350},"2009-05-30T01:24-04:00",{},{"title":2316,"description":2321},[490],"2011-01-19T22:14-05:00","UH15OBirfFooD7VF-TnaDxxtfnfYSyr8AQ8SNnRyCEU",{"id":2403,"title":2404,"body":2405,"createdAt":2447,"description":2409,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2448,"navigation":486,"path":342,"seo":2449,"stem":343,"tags":2450,"updatedAt":2451,"__hash__":2452},"content\u002FPerl HtmlUnit.md","Perl_HtmlUnit",{"type":8,"value":2406,"toc":2444},[2407,2410,2413,2416,2418,2433],[11,2408,2409],{},"This is a perl interface to the HtmlUnit library.",[11,2411,2412],{},"This is kinda like WWW::Mechanize, in that it is a library that acts as a browser. HtmlUnit, however, includes quite complete javascript support.",[11,2414,2415],{},"This implementation is a very straightforward use of Inline::Java.",[30,2417,2120],{"id":704},[38,2419,2420,2427],{},[41,2421,2422],{},[22,2423,2426],{"href":2424,"rel":2425},"http:\u002F\u002Fsearch.cpan.org\u002Fperldoc?WWW::HtmlUnit",[26],"HtmlUnit on CPAN",[41,2428,2020,2429],{},[22,2430,2431],{"href":2431,"rel":2432},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FWWW-HtmlUnit",[26],[11,2434,2435,2436,2438,2439],{},"Recent Changes:",[519,2437],{},"\n\u003Crss ",[22,2440,2443],{"href":2441,"rel":2442},"http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-WWW-HtmlUnit.rss%3E",[26],"http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-WWW-HtmlUnit.rss>",{"title":474,"searchDepth":475,"depth":475,"links":2445},[2446],{"id":704,"depth":475,"text":2120},"2008-12-30T11:44-05:00",{},{"title":2404,"description":2409},[490],"2010-12-02T23:23-05:00","cWLS8KUbfBfEhZTFmQyq1U6zeLa3l1nw31DvlWtKy7A",{"id":2454,"title":420,"body":2455,"createdAt":2568,"description":2459,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2569,"navigation":486,"path":419,"seo":2570,"stem":420,"tags":2571,"updatedAt":2572,"__hash__":2573},"content\u002FWayV.md",{"type":8,"value":2456,"toc":2564},[2457,2460,2464,2468,2476,2478,2481,2487,2490,2494,2500,2503,2531,2534],[11,2458,2459],{},"From Mike Bennett's WayV page, WayV is...",[1311,2461,2463],{"id":2462},"experiment-with-human-computer-interaction-especially-gesture-based-computing","Experiment with human computer interaction, especially gesture based computing.",[1311,2465,2467],{"id":2466},"initially-some-software-that-does-hand-writinggesture-recognition-shapes-represent-actions-and-are-input-via-the-mouse-ie-draw-a-b-and-the-b-key-press-is-sent-to-your-xterm-draw-a-c-and-xcalc-starts-draw-an-n-and-netscape-starts-etc","Initially some software that does hand writing\u002Fgesture recognition. Shapes represent actions and are input via the mouse, i.e. draw a B and the \"b\" key press is sent to your Xterm, draw a C and xcalc starts, draw an N and Netscape starts, etc.",[11,2469,2470,2471,2475],{},"The main site is at ",[22,2472,2473],{"href":2473,"rel":2474},"http:\u002F\u002Fwww.stressbunny.com\u002Fwayv\u002F",[26]," and the current version is 0.3 (released 2003-08-14).",[30,2477,2120],{"id":704},[11,2479,2480],{},"You can get my modifications to this app via:",[11,2482,2020,2483],{},[22,2484,2485],{"href":2485,"rel":2486},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fc\u002Fwayv",[26],[11,2488,2489],{},"All I've done so far is to slightly improve the directional weight for pattern matching. Before a straight up and a straight down both got a score of 0 (lower is better), and then the \"down\" score was divided by two since the direction was correct. But 0\u002F2 == 0 ! So I add one and scale a bit.",[30,2491,2493],{"id":2492},"plan","Plan",[11,2495,2496,2497,2499],{},"I'm exploring data input mechanisms for the ",[22,2498,329],{"href":328},", and ran into this app. It's pretty neat, but there are some things it doesn't do or could do better that I'd like to add. I'm starting with WayV, but might end up starting a different WayV-inspired project.",[11,2501,2502],{},"Things to add:",[38,2504,2505,2508,2511,2525,2528],{},[41,2506,2507],{},"Per-app or other context-sensitive gestures",[41,2509,2510],{},"Pass-through to the app below when no gesture is recognized, especially clicks",[41,2512,2513,2514],{},"Somehow differentiate between long and short strokes?\n",[38,2515,2516,2519,2522],{},[41,2517,2518],{},"This looks to be outside the gesture recognition algorithm WayV uses",[41,2520,2521],{},"Could maybe tile a couple WayV instances",[41,2523,2524],{},"Could maybe just include a \"size\" metric for the action to utilize",[41,2526,2527],{},"Flickerless refresh",[41,2529,2530],{},"Configure whether lines are drawn on the screen",[11,2532,2533],{},"Things to augment:",[38,2535,2536,2550],{},[41,2537,2538,2539],{},"Kenetic scrolling\n",[38,2540,2541,2544,2547],{},[41,2542,2543],{},"A \"down\" command would send down keypresses at a slowing rate",[41,2545,2546],{},"Interrupt\u002Faugment a running key-animation upon the next press",[41,2548,2549],{},"Could be a separate app altogether",[41,2551,2552,2553],{},"Config chooser\n",[38,2554,2555,2558,2561],{},[41,2556,2557],{},"Press aux button to get list of configs",[41,2559,2560],{},"Hopefully context-sensing will work so this won't be necessary",[41,2562,2563],{},"Might be nice in the meantime!",{"title":474,"searchDepth":475,"depth":475,"links":2565},[2566,2567],{"id":704,"depth":475,"text":2120},{"id":2492,"depth":475,"text":2493},"2008-09-11T10:22-04:00",{},{"title":420,"description":2459},[490],"2008-09-11T10:34-04:00","QMmUWTTQl4Jfjby3a19Y253ll037qPIn-0vS1OA_AnE",{"id":2575,"title":329,"body":2576,"createdAt":2736,"description":2580,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2737,"navigation":486,"path":328,"seo":2738,"stem":329,"tags":2739,"updatedAt":2740,"__hash__":2741},"content\u002FOpenmoko.md",{"type":8,"value":2577,"toc":2723},[2578,2581,2584,2588,2591,2597,2603,2609,2615,2621,2625,2628,2632,2635,2639,2642,2646,2649,2653,2656,2659,2663,2666,2669,2673,2676,2680,2683,2694,2698,2701,2705],[11,2579,2580],{},"I got my Openmoko on 2008-09-04!",[11,2582,2583],{},"I'll be keeping notes here for now.",[30,2585,2587],{"id":2586},"distributions","Distributions",[11,2589,2590],{},"I've tried several, here's a run-down.",[11,2592,2593,2594,2596],{},"; Om 2007.02 :",[519,2595],{},"\nThis is what the phone comes with. It is very minimal and works a little... but not much. But you can ssh into it! You might be able to make calls... but I blew it away before I got my sim card.",[11,2598,2599,2600,2602],{},"; Om 2008.08 :",[519,2601],{},"\nThis is the first one I installed. At first it didn't seem quite right.... but somehow it got better. Or perhaps I became more patient.",[11,2604,2605,2606,2608],{},"; FDOM :",[519,2607],{},"\nJust like the latest Om distro, but with apps and some minor fixes already installed. Pretty nice!",[11,2610,2611,2612,2614],{},"; Qtopia :",[519,2613],{},"\nI dropped the latest qtopia on there. It looks nice, but not being able to run gtk apps killed it for me. Again, I haven't tested the phone call abilities because it was before I had the sim card. I went back to Om 2008.08.",[11,2616,2617,2618,2620],{},"; Debian :",[519,2619],{},"\nSo far this is my favorite. I used their fancy install script to nuke my 8gig microSD card and set everything up. It took something like 2 hours to run, and had no issues at all. Once running, via ssh (since zhone-only is the default UI and there is no terminal to be found) I switched to xfce and have been having a wonderful time ever since. Zhone itself can run in a window in xfce. With this distro I have apt-get access to all of debian and a full linux desktop. Easier to start out full and complex and whittle back down to simplicity, I say!",[30,2622,2624],{"id":2623},"microsd-card","MicroSD Card",[11,2626,2627],{},"I got the SanDisk 8gb card, and so far it works perfectly.",[30,2629,2631],{"id":2630},"sim-card","Sim Card",[11,2633,2634],{},"I walked in to a T-Mobile and bought a pre-paid card for testing. I can't use the internet on it, only voice, and so far it works perfectly. It is very flimsy looking though.",[30,2636,2638],{"id":2637},"headphone-adapter","Headphone Adapter",[11,2640,2641],{},"I got a 2.5mm -> 3.5mm adapter from radio shack that works perfectly. It is the radio shack brand (says 274-004 in the corner). I had to mess with alsa to get sound going through it. I didn't notice if it was stereo or mono yet, but definitely out of both speakers.",[30,2643,2645],{"id":2644},"gps","GPS",[11,2647,2648],{},"GPS works in that I got it to give me my coordinates (this was in Om 2008.08) but didn't have any maps loaded. I haven't played with this much as far as sim-card interaction goes, and it's too cloudy to mess with it right now.",[30,2650,2652],{"id":2651},"touch-screen","Touch Screen",[11,2654,2655],{},"I installed xournal in debian. It is a bit slow, though turning off its xinput support made it faster. The resolution of the screen is great! With the stylus I can write almost as small as I could with a regular pen... well within the comfort zone for note taking and doodling.",[11,2657,2658],{},"In debian the only real finger-friendly app I've used so far has been zhone itself. And for that fingers worked great. The om 2008.08 install had several finger-friendly apps that worked pretty well... system load or feedback did make it feel a bit odd sometimes. Om 2008.08 also has apps with the magical finger scroll stuff.",[30,2660,2662],{"id":2661},"suspend","Suspend",[11,2664,2665],{},"After doing a full image-backup of the debian install on the microSD card and applying the suggested suspend\u002Fresume scripts, suspend seems to work!",[11,2667,2668],{},"We'll see if it keeps working :)",[30,2670,2672],{"id":2671},"general-software","General Software",[11,2674,2675],{},"Debian has everything! I even got iceweasel (aka firefox) running without any problems at all.",[30,2677,2679],{"id":2678},"perl","Perl",[11,2681,2682],{},"CPAN took a reallllyyyyyy long time to run... something about building up some list of something or other. But then it went much faster. The machine (I'm increasingly thinking of this as just-another-machine) crawled to a near standstill that I was only barely convinced it wasn't stuck.",[11,2684,2685,2686,2690,2691,2693],{},"But then... ROCK ON! ",[22,2687,2689],{"href":2688},"\u002Fcoro","Coro"," works, and thus ",[22,2692,168],{"href":167}," works!",[30,2695,2697],{"id":2696},"misc","Misc",[11,2699,2700],{},"The screen is 16bit color, so when you display full color images it downsamples it without dithering. For actual images this is fine, but for fancy graphics with gradients this is sometimes noticeable. You can do \"convert -treedepth 5 -colors 1000 -dither infile.png outfile.png\" to drop the number of colors in an image. The 1000 is just an example, you should get it as high as you can such that the image still looks good.",[30,2702,2704],{"id":2703},"todo","TODO",[38,2706,2707,2714,2717,2720],{},[41,2708,2709,2713],{},[22,2710,2711],{"href":2711,"rel":2712},"http:\u002F\u002Fwww.tinymail.org\u002Ftrac\u002Ftmut",[26]," - mail reader",[41,2715,2716],{},"wordtrans-qt",[41,2718,2719],{},"dasher",[41,2721,2722],{},"wayv",{"title":474,"searchDepth":475,"depth":475,"links":2724},[2725,2726,2727,2728,2729,2730,2731,2732,2733,2734,2735],{"id":2586,"depth":475,"text":2587},{"id":2623,"depth":475,"text":2624},{"id":2630,"depth":475,"text":2631},{"id":2637,"depth":475,"text":2638},{"id":2644,"depth":475,"text":2645},{"id":2651,"depth":475,"text":2652},{"id":2661,"depth":475,"text":2662},{"id":2671,"depth":475,"text":2672},{"id":2678,"depth":475,"text":2679},{"id":2696,"depth":475,"text":2697},{"id":2703,"depth":475,"text":2704},"2008-09-06T10:20-04:00",{},{"title":329,"description":2580},[490],"2008-09-18T12:49-04:00","ZjZVk3h5j-Y5HbbX-eR4FXogxkTPlfLnuvQVIP2BVLg",{"id":2743,"title":2744,"body":2745,"createdAt":2759,"description":2749,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2760,"navigation":486,"path":426,"seo":2761,"stem":427,"tags":2762,"updatedAt":2759,"__hash__":2763},"content\u002FWeb Board Games.md","Web_Board_Games",{"type":8,"value":2746,"toc":2757},[2747,2750],[11,2748,2749],{},"As a demo for Continuity, and also for the fun of it, this is an engine for web-based board games. I'm starting off with multi-player Go and Ataxx.",[11,2751,2752,2753],{},"Code: darcs get ",[22,2754,2755],{"href":2755,"rel":2756},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fwebboardgames",[26],{"title":474,"searchDepth":475,"depth":475,"links":2758},[],"2008-04-14T13:08-04:00",{},{"title":2744,"description":2749},[490],"xF6FFaxm_2fpCN3d6Y0fXJCjeIJe2tdFoktnf5eVCKA",{"id":2765,"title":196,"body":2766,"createdAt":2792,"description":2770,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2793,"navigation":486,"path":195,"seo":2794,"stem":196,"tags":2795,"updatedAt":2792,"__hash__":2796},"content\u002FDot2html.md",{"type":8,"value":2767,"toc":2789},[2768,2771,2777,2781],[11,2769,2770],{},"I've always wanted some sort of slick web-based wysiwyg-ish graphviz editor. My first step toward that is to convert a graphviz specification file (.dot file) into HTML and javascript. The javascript is mostly for drawing lines.",[11,2772,2020,2773],{},[22,2774,2775],{"href":2775,"rel":2776},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fdot2html",[26],[30,2778,2780],{"id":2779},"recent-development-feed","Recent Development Feed",[11,2782,2783,2784],{},"\u003Crss 5 ",[22,2785,2788],{"href":2786,"rel":2787},"http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-dot2html.rss%3E",[26],"http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-dot2html.rss>",{"title":474,"searchDepth":475,"depth":475,"links":2790},[2791],{"id":2779,"depth":475,"text":2780},"2007-12-17T00:32-05:00",{},{"title":196,"description":2770},[490],"Xt5dzE92mdCUsnPz-pyb0PbvFCsGPvJ1LDv7l-UUiLU",{"id":2798,"title":252,"body":2799,"createdAt":2854,"description":2855,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2856,"navigation":486,"path":251,"seo":2857,"stem":252,"tags":2858,"updatedAt":2859,"__hash__":2860},"content\u002FMobileFS.md",{"type":8,"value":2800,"toc":2849},[2801,2808,2811,2814,2818,2832,2834,2840,2842],[11,2802,2803,2804,2807],{},"This is a Fuse filesystem to ease going mobile. At home I have a central server for music files, for example. But the archive is too big to take with me. I don't usually listen to ",[696,2805,2806],{},"all"," of the songs, however, really I only listen to certain ones.",[11,2809,2810],{},"So I created a caching filesystem. When I open a file it copies it to my laptop's cache. Then, when I'm disconnected and try to access the file, it falls back to this cached copy.",[11,2812,2813],{},"It is NOT meant for distributed work, this is pretty targeted for this one use case of a large amount of basically read-only data of which you want to cache only the most recently (or most frequently) used bit.",[30,2815,2817],{"id":2816},"features","Features",[38,2819,2820,2823,2826,2829],{},[41,2821,2822],{},"Looks like it works!",[41,2824,2825],{},"For mp3\u002Fogg files it waits until 15 seconds or so into the song before caching",[41,2827,2828],{},"That also means it ignores pure id3 reads and song length checks",[41,2830,2831],{},"Transparently reads files from cache if source unavailable (even in the middle of a song!)",[30,2833,2120],{"id":704},[11,2835,2020,2836],{},[22,2837,2838],{"href":2838,"rel":2839},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fmobilefs",[26],[30,2841,2780],{"id":2779},[11,2843,2783,2844],{},[22,2845,2848],{"href":2846,"rel":2847},"http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-mobilefs.rss%3E",[26],"http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-mobilefs.rss>",{"title":474,"searchDepth":475,"depth":475,"links":2850},[2851,2852,2853],{"id":2816,"depth":475,"text":2817},{"id":704,"depth":475,"text":2120},{"id":2779,"depth":475,"text":2780},"2007-11-15T23:06-05:00","This is a Fuse filesystem to ease going mobile. At home I have a central server for music files, for example. But the archive is too big to take with me. I don't usually listen to all of the songs, however, really I only listen to certain ones.",{},{"title":252,"description":2855},[490],"2008-01-21T20:54-05:00","OMN25c9X2jDV8S1AOuNHkiYyVDkIRjH626aMMW1NBb8",{"id":2862,"title":2863,"body":2864,"createdAt":2896,"description":2868,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2897,"navigation":486,"path":230,"seo":2898,"stem":231,"tags":2899,"updatedAt":2900,"__hash__":2901},"content\u002FJQuery Autoindent.md","JQuery_Autoindent",{"type":8,"value":2865,"toc":2894},[2866,2869,2872,2878,2886],[11,2867,2868],{},"Parent: Projects",[11,2870,2871],{},"Pulling together random snippets that lie around the internet, I know that it's possible to build a textarea auto-indent. So I did.",[11,2873,2020,2874],{},[22,2875,2876],{"href":2876,"rel":2877},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fjavascript\u002Fautoindent\u002F",[26],[11,2879,2880,2881,2885],{},"It is based off of the somewhat incomplete jquery extension at ",[22,2882,2883],{"href":2883,"rel":2884},"http:\u002F\u002Flaboratorium.0xab.cd\u002Fjquery\u002Ffieldselection\u002F0.2.3-test\u002F",[26],". I haven't decided if I will turn this into a jquery extension, and I haven't decided if I'm going to try to make it work in IE.",[11,2887,2888,2889,682],{},"Check out the ",[22,2890,2893],{"href":2891,"rel":2892},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fjavascript\u002Fautoindent\u002Feditor-test.html",[26],"jquery autoindent demo",{"title":474,"searchDepth":475,"depth":475,"links":2895},[],"2007-07-29T22:54-04:00",{},{"title":2863,"description":2868},[490],"2007-08-07T16:08-04:00","-XvW3Qlb_Jql5tlV4x6wIV89eJZTDpg3S4whz_KmP-o",{"id":2903,"title":2904,"body":2905,"createdAt":2924,"description":2909,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2925,"navigation":486,"path":307,"seo":2926,"stem":308,"tags":2927,"updatedAt":2924,"__hash__":2928},"content\u002FOddmuse Editfile.md","Oddmuse_Editfile",{"type":8,"value":2906,"toc":2922},[2907,2910,2916,2919],[11,2908,2909],{},"I like to do documentation both directly in a program (like with POD) and in an associated wiki (like here). I do not, however, want to duplicate effort.",[11,2911,2912,2913,2915],{},"This oddmuse module allows me to expose a raw file for display and editing through the wiki interface. Changes to the file will be recorded through ",[22,2914,471],{"href":470},", and after review pulled into the main tree.",[11,2917,2918],{},"Additionally it will have a documentation-only view, displaying only the HTML version of the documentation without the code, just like you were viewing it in perldoc.",[11,2920,2921],{},"A cron job will periodically pull in changes from the main source tree, so that when I update the documentation there it will be reflected on the wiki as well.",{"title":474,"searchDepth":475,"depth":475,"links":2923},[],"2007-07-15T23:03-04:00",{},{"title":2904,"description":2909},[490],"vL7uU8XcJxmlmIYJRXwmHm6s4aFUKIM5DB_zccJ6GzQ",{"id":2930,"title":81,"body":2931,"createdAt":2950,"description":2935,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2951,"navigation":486,"path":80,"seo":2952,"stem":81,"tags":2953,"updatedAt":2954,"__hash__":2955},"content\u002FChompie.md",{"type":8,"value":2932,"toc":2948},[2933,2936,2939,2942],[11,2934,2935],{},"I saw this really cool presentation at CodeCon one time... and stole their idea. I'll have to find a link.",[11,2937,2938],{},"The goal is to automate a specific type of debugging. After you get tired of sprinkling print statements through your code, and have become dizzy from all of the layers and layers of calls during an interactive trace, you start commenting out huge chunks of code to minimize the problem.",[11,2940,2941],{},"Chompie is an automated way to do this last type of debugging. You give it a file and a tester. It will chomp down on your program until it's gotten the smallest thing it can while still having the same result from your tester.",[11,2943,2020,2944],{},[22,2945,2946],{"href":2946,"rel":2947},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fchompie\u002F",[26],{"title":474,"searchDepth":475,"depth":475,"links":2949},[],"2007-07-15T22:57-04:00",{},{"title":81,"description":2935},[490],"2007-07-15T22:59-04:00","Kxnh_t3dbM93A-QinICgTf_A5wgtNeS_4NI4r9Ox9EM",{"id":2957,"title":2958,"body":2959,"createdAt":2979,"description":2963,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":2980,"navigation":486,"path":321,"seo":2981,"stem":322,"tags":2982,"updatedAt":2979,"__hash__":2983},"content\u002FOddmuse Search Tags.md","Oddmuse_Search_Tags",{"type":8,"value":2960,"toc":2977},[2961,2964,2967,2970],[11,2962,2963],{},"This is an extremely simple Oddmuse module for tagging. It works by looking for a line like:",[11,2965,2966],{},"Tags: dog, cat, fish, catfish, killer dolphins",[11,2968,2969],{},"and then turns each tag into a link to a search for other pages which also have that tag (in the same style of tag-line).",[11,2971,2972,2973],{},"Source: ",[22,2974,2975],{"href":2975,"rel":2976},"http:\u002F\u002Fthelackthereof.org\u002Fwiki_data\u002Fmodules\u002Fsearchtags.pl",[26],{"title":474,"searchDepth":475,"depth":475,"links":2978},[],"2006-11-19T23:35-05:00",{},{"title":2958,"description":2963},[490],"1cqESTsENW6iYBxGnOMvibMRqFzUaP6s0W_DMkg5rKs",{"id":2985,"title":2986,"body":2987,"createdAt":3000,"description":2991,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3001,"navigation":486,"path":314,"seo":3002,"stem":315,"tags":3003,"updatedAt":3000,"__hash__":3004},"content\u002FOddmuse Ref Links.md","Oddmuse_Ref_Links",{"type":8,"value":2988,"toc":2998},[2989,2992],[11,2990,2991],{},"This is a simple oddmuse module to list all the pages linked to the current page (kinda like when you click on the title). It is specifically designed to be placed in the SideBar.",[11,2993,2972,2994],{},[22,2995,2996],{"href":2996,"rel":2997},"http:\u002F\u002Fthelackthereof.org\u002Fwiki_data\u002Fmodules\u002Fref-list.pl",[26],{"title":474,"searchDepth":475,"depth":475,"links":2999},[],"2006-11-19T23:34-05:00",{},{"title":2986,"description":2991},[490],"sGSv42jlH4uBOtJdN4GYB2zNR4g9kmekE_hBX718XTU",{"id":3006,"title":3007,"body":3008,"createdAt":3021,"description":3012,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3022,"navigation":486,"path":356,"seo":3023,"stem":357,"tags":3024,"updatedAt":3021,"__hash__":3025},"content\u002FRubiks Cube Solver.md","Rubik's_Cube_Solver",{"type":8,"value":3009,"toc":3019},[3010,3013,3016],[11,3011,3012],{},"I finally got my own Rubik's Cube! The things were initially marketed the year I was born, and though I adore puzzles of the sort I never did get one. I hinted and hinted but friends and family never got me one. They must've assumed that I already had one or something.",[11,3014,3015],{},"Thing is -- I can't figure the stupid thing out. I have refused to learn the tricks all these years and won't be starting now, so don't even bother mentioning that to me.",[11,3017,3018],{},"After messing with it by hand I've decided that it is OK to cheat -- so I've put together a few programs to do some simulations and test some theories. No luck yet... I feel like I still haven't found a succinct notation for the thing.",{"title":474,"searchDepth":475,"depth":475,"links":3020},[],"2006-08-29T02:53-04:00",{},{"title":3007,"description":3012},[490],"lRWEnLA4SWYXFDvnzrndJ4sXtGWnPddcjM6PIOAu1YM",{"id":3027,"title":3028,"body":3029,"createdAt":3053,"description":3054,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3055,"navigation":486,"path":398,"seo":3056,"stem":399,"tags":3057,"updatedAt":3053,"__hash__":3058},"content\u002FUntyped Lambda Calculus in OCaml.md","Untyped_Lambda_Calculus_in_OCaml",{"type":8,"value":3030,"toc":3051},[3031,3037,3040,3043],[11,3032,3033,3034,3036],{},"I wrote this specifically so that I could use it as a genotype in ",[22,3035,287],{"href":286},". I'm not sure that I ever actually did that... but I'm not dead yet!",[11,3038,3039],{},"It seems to work pretty well, and there might even be some comments in the code. This might be a reasonable example of how to write a lambda calculus parser and interpreter in OCaml.",[11,3041,3042],{},"Get the code at:",[38,3044,3045],{},[41,3046,3047],{},[22,3048,3049],{"href":3049,"rel":3050},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Funtyped-lambda-calc\u002F",[26],{"title":474,"searchDepth":475,"depth":475,"links":3052},[],"2006-04-04T01:51-04:00","I wrote this specifically so that I could use it as a genotype in OGPF. I'm not sure that I ever actually did that... but I'm not dead yet!",{},{"title":3028,"description":3054},[490],"Oj4UymutIxSObntc_3fXw8MwfDrYznLt1uvITcsfjFA",{"id":3060,"title":245,"body":3061,"createdAt":3088,"description":3089,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3090,"navigation":486,"path":244,"seo":3091,"stem":245,"tags":3092,"updatedAt":3088,"__hash__":3093},"content\u002FMHTML.md",{"type":8,"value":3062,"toc":3086},[3063,3070,3073,3076,3078],[11,3064,3065,3066],{},"At some point a long time ago I thought it would be cool to have macros in HTML.  I originally wrote it in Perl, but then switched over to OCaml. I used it both in an interpreted (#!\u002Fusr\u002Fbin\u002Fmhtml) context and a pre-compiled context. The idea was to add a few tags, such as ",[3067,3068,3069],"macro",{},", which would allow me to add some magic tags to HTML in a natural way.",[11,3071,3072],{},"I've since decided that I don't care for this much. You could consider this as a form of XML transform, along the lines of XSLT. I don't care for XSLT much either.",[11,3074,3075],{},"If nothing else this is a good example of writing such a thing in OCaml, including parsing and interpreting the macro language.",[11,3077,3042],{},[38,3079,3080],{},[41,3081,3082],{},[22,3083,3084],{"href":3084,"rel":3085},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fmhtml\u002F",[26],{"title":474,"searchDepth":475,"depth":475,"links":3087},[],"2006-04-04T01:48-04:00","At some point a long time ago I thought it would be cool to have macros in HTML.  I originally wrote it in Perl, but then switched over to OCaml. I used it both in an interpreted (#!\u002Fusr\u002Fbin\u002Fmhtml) context and a pre-compiled context. The idea was to add a few tags, such as , which would allow me to add some magic tags to HTML in a natural way.",{},{"title":245,"description":3089},[490],"YFE1JNTa9HjRqa60kSmmiQo_KJFSMokI4rhiDfP_fMA",{"id":3095,"title":350,"body":3096,"createdAt":3134,"description":3100,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3135,"navigation":486,"path":349,"seo":3136,"stem":350,"tags":3137,"updatedAt":3134,"__hash__":3138},"content\u002FPolly.md",{"type":8,"value":3097,"toc":3132},[3098,3101,3104,3112,3115],[11,3099,3100],{},"I have a mix of ogg and mp3 files, and got tired of switching between mpg123 and ogg123, or worse not being able to play a mix of ogg's and mp3's at the same time. So I went ahead and wrote my very own wrapper.",[11,3102,3103],{},"You can get it at:",[38,3105,3106],{},[41,3107,3108],{},[22,3109,3110],{"href":3110,"rel":3111},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fpolly\u002F",[26],[11,3113,3114],{},"Features:",[38,3116,3117,3120,3123,3126,3129],{},[41,3118,3119],{},"Plays ogg's and mp3's!",[41,3121,3122],{},"Can shuffle the list of songs",[41,3124,3125],{},"Can do the mpg123 trick of hitting ^C to go to the next song, or ^C^C to halt",[41,3127,3128],{},"Playlist can come from STDIN if you like",[41,3130,3131],{},"Extendable! :)",{"title":474,"searchDepth":475,"depth":475,"links":3133},[],"2006-04-04T01:39-04:00",{},{"title":350,"description":3100},[490],"Yb9afZuRqCQYQu9Hma8PB8xM4xgVx6bQFf2i3bggYhQ",{"id":3140,"title":3141,"body":3142,"createdAt":3219,"description":3146,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3220,"navigation":486,"path":160,"seo":3221,"stem":161,"tags":3222,"updatedAt":3223,"__hash__":3224},"content\u002FCensus Data Extraction.md","Census_Data_Extraction",{"type":8,"value":3143,"toc":3214},[3144,3147,3151,3154,3158,3178,3182],[11,3145,3146],{},"I've been working for some time now on extracting some 2000 and 1990 census data. After a few failed starts, here I'll document what I've actually come up with. A bit.",[30,3148,3150],{"id":3149},"input-data","Input Data",[11,3152,3153],{},"Here I'll describe what I have",[30,3155,3157],{"id":3156},"_2000-census-data","2000 Census Data",[38,3159,3160,3165,3170],{},[41,3161,3162],{},[576,3163,3164],{},"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_2000\u002Fdatasets\u002FSummary_File_1 FTP Root for 2000 data",[41,3166,3167],{},[576,3168,3169],{},"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_2000\u002Fdatasets\u002FSummary_File_1\u002FArizona Arizona data",[41,3171,3172,3177],{},[22,3173,3176],{"href":3174,"rel":3175},"http:\u002F\u002Fwww.census.gov\u002Fprod\u002Fcen2000\u002Fdoc\u002Fsf1.pdf",[26],"Data documentation PDF",", see chapter 7",[30,3179,3181],{"id":3180},"_1990-census-data","1990 Census Data",[38,3183,3184,3189,3194,3199,3204,3209],{},[41,3185,3186],{},[576,3187,3188],{},"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002F FTP Root for 1990 data",[41,3190,3191],{},[576,3192,3193],{},"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_1A_8\u002F Arizona data (1A)",[41,3195,3196],{},[576,3197,3198],{},"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_3A_03\u002F Arizona data (3A)",[41,3200,3201],{},[576,3202,3203],{},"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_1A_8\u002Fdocument\u002Fhowtouse.asc General usage documentation",[41,3205,3206],{},[576,3207,3208],{},"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_1A_8\u002Fdocument\u002Flist_tbl.asc Summarized field descriptions",[41,3210,3211],{},[576,3212,3213],{},"ftp:\u002F\u002Fftp2.census.gov\u002Fcensus_1990\u002FCD90_1A_8\u002Fdocument\u002Ftbl_mtx.asc Detailed field descriptions",{"title":474,"searchDepth":475,"depth":475,"links":3215},[3216,3217,3218],{"id":3149,"depth":475,"text":3150},{"id":3156,"depth":475,"text":3157},{"id":3180,"depth":475,"text":3181},"2006-03-06T14:41-05:00",{},{"title":3141,"description":3146},[490],"2006-06-16T04:49-04:00","oHGFYINi-gtAfV-nwkbi1E-olL3oZgglQJ0H7NPDOyI",{"id":3226,"title":3227,"body":3228,"createdAt":3258,"description":3232,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3259,"navigation":486,"path":188,"seo":3260,"stem":189,"tags":3261,"updatedAt":3262,"__hash__":3263},"content\u002FDHTML Combo.md","DHTML_Combo",{"type":8,"value":3229,"toc":3256},[3230,3233,3242,3249],[11,3231,3232],{},"This is exactly what it sounds like. I looked around for a solution,  but got tired of that quite quickly so just wrote my own. I use a plain textbox and a hidden listbox (SELECT box). When the textbox gets focus the list is displayed right under it, just like a real combo box.",[11,3234,3235,3236,3241],{},"This depends on the lovely ",[22,3237,3240],{"href":3238,"rel":3239},"http:\u002F\u002Fbennolan.com\u002Fbehaviour\u002F",[26],"behaviour.js"," library. It is a light dependency -- easily removed probably. But I like it and recommend you use it for other stuff anyway!",[11,3243,3244,3245],{},"See a demo at ",[22,3246,3247],{"href":3247,"rel":3248},"http:\u002F\u002Fthelackthereof.org\u002Fdev\u002Fdhtml_combo\u002Fcombo.html",[26],[11,3250,3251,3252],{},"Get the code: darcs get ",[22,3253,3254],{"href":3254,"rel":3255},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fjavascript\u002Fdhtml_combo",[26],{"title":474,"searchDepth":475,"depth":475,"links":3257},[],"2006-01-25T14:50-05:00",{},{"title":3227,"description":3232},[490],"2006-01-25T14:57-05:00","2Tvqnqm3yuaTlGdoNmBSjrGKuiH8_ozO-CG1rDb0Hhs",{"id":3265,"title":3266,"body":3267,"createdAt":3425,"description":3271,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3426,"navigation":486,"path":440,"seo":3427,"stem":441,"tags":3428,"updatedAt":3429,"__hash__":3430},"content\u002FZend Hacking.md","Zend_Hacking",{"type":8,"value":3268,"toc":3420},[3269,3272,3275,3278,3280,3291,3294,3313,3331,3333,3355,3359,3368,3372,3375,3383,3386,3389,3392,3395,3398,3400,3403,3417],[11,3270,3271],{},"Zend (PHP) isn't really documented all that much, besides the source itself. It looks like once you understand the beast the documentation wouldn't be all that necessary -- silly I know, but that's the way it looks.",[11,3273,3274],{},"Well I'm going to try writing a Zend extension. So I'm having a look at APD and eAccelerator and Zend itself to see what is going on in there. They make it relatively easy to do an extension, with magical build scripts and such.",[11,3276,3277],{},"Tips \u002F Documentation recommendations are appreciated if anyone out there knows of some magical wiki in the sky diagraming and analyzing all the components.",[30,3279,2147],{"id":2146},[11,3281,3282,3283,3287,3288,3290],{},"Well for anyone who doesn't know, I am obsessed with ",[22,3284,3286],{"href":3285},"\u002Fcontinuation-based-web-programming","Continuation-based Web Programming",". To this end I've created ",[22,3289,175],{"href":174}," for Perl and PHP (which is just a hack, not really continuations). I've examined cpan:Coro::Cont to see if I can get these continuations to serialize, but even the author of that module things it isn't possible. At work I'm doing all of this in PHP, so this is an experiment to see if I can hack up Zend to do (serializable) continuations.",[11,3292,3293],{},"So I want a few functions:",[38,3295,3296,3304,3307,3310],{},[41,3297,3298,3299],{},"contize($function_name) - Indicate a function\u002Fobject that I want to be a continuation\n",[38,3300,3301],{},[41,3302,3303],{},"or perhaps call($func_name, $arg_array) - like callcc",[41,3305,3306],{},"yield $val - Indicate where the continuation exits",[41,3308,3309],{},"$serial = serialize_continuation($function_name) - Serialize the continuation",[41,3311,3312],{},"unserialize_continuation($serial) - De-Serialize the continuation",[11,3314,3315,3316,3318,3319,3321,3322,3324,3325,3327,3328,3330],{},"So maybe like:",[519,3317],{},"\nmake_continuation(\"func\");",[519,3320],{},"\n$result = func($p1, $p2, ...);",[519,3323],{},"\n$s = serialize_continuation(\"func\");",[519,3326],{},"\nunserialize_continuation($s);",[519,3329],{},"\nfunc($p1, $p2, ...);",[1311,3332,891],{"id":474},[11,3334,3335,3336,3338,3339,3341,3342,3338,3344,3346,3347,3338,3349,3351,3352,3354],{},"function func($p1, $p2, $p3) {",[519,3337],{},"\n# stuff",[519,3340],{},"\nyield $result1;",[519,3343],{},[519,3345],{},"\nyield $result2;",[519,3348],{},[519,3350],{},"\nreturn $result3 ;",[519,3353],{},"\n}",[30,3356,3358],{"id":3357},"files","Files",[38,3360,3361],{},[41,3362,3363,3367],{},[22,3364,3365],{"href":3365,"rel":3366},"http:\u002F\u002Flxr.php.net\u002Fsource\u002FZendEngine2\u002Fzend_globals.h",[26]," - especially see the Zend Executor Globals (and maybe the compiler gloabals too)",[30,3369,3371],{"id":3370},"notes","Notes",[11,3373,3374],{},"OK, I have a basic thing going now. Just ripped stuff out of various examples and grabbed call_user_func_array.",[38,3376,3377,3380],{},[41,3378,3379],{},"hold the current status of a call",[41,3381,3382],{},"hold the return state, or a set of pointers, so we can jump directly out of a func",[11,3384,3385],{},"call -- save the current state for a later yield. Initialize\u002Frestore the continuation state for the function we're calling",[11,3387,3388],{},"yield -- save all the state between the call and here. restore the state of the initial call, pretending the parameter to yield was returned from the function like it exited normally",[11,3390,3391],{},"So we need two storage areas -- one for current state and one for continuation state. The current state might end up being pointers or something. both should be stacks so that we can have nested continuations.",[11,3393,3394],{},"Should the continuation state be stored by-name of the function?",[11,3396,3397],{},"I should look at other documentation on partial continuations to see if there is a standard naming scheme for all of this.",[444,3399],{},[11,3401,3402],{},"OK, here's an idea -- we abuse the exception handler framework a bit. So the code pretends to be like this:",[11,3404,3405,3406,3408,3409,3411,3412,3414,3415,3354],{},"try {",[519,3407],{},"\nccall('func',$p1,$p2,...);",[519,3410],{},"\n} catch(cont) {",[519,3413],{},"\n\u002F\u002F Do nothing, just continue",[519,3416],{},[11,3418,3419],{},"And I'm interested in this because it is easy enough to save the current state stuff, but not so easy to escape during the middle of the computation.",{"title":474,"searchDepth":475,"depth":475,"links":3421},[3422,3423,3424],{"id":2146,"depth":475,"text":2147},{"id":3357,"depth":475,"text":3358},{"id":3370,"depth":475,"text":3371},"2005-06-11T18:53-04:00",{},{"title":3266,"description":3271},[490],"2005-06-17T17:12-04:00","WhEjqMKnDX1LIDG-OEU30nm1GybR2eQfTlA60sOtoyc",{"id":3432,"title":3433,"body":3434,"createdAt":3480,"description":3438,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3481,"navigation":486,"path":391,"seo":3482,"stem":392,"tags":3483,"updatedAt":3480,"__hash__":3484},"content\u002FThe Fridge.md","The_Fridge",{"type":8,"value":3435,"toc":3478},[3436,3439,3458,3461,3464],[11,3437,3438],{},"Ideas:",[38,3440,3441,3444,3447],{},[41,3442,3443],{},"Multiple fridges. Anyone can create a fridge, and it gets a password",[41,3445,3446],{},"Fridges expire after n days of disuse",[41,3448,3449,3450],{},"Fridges get options\n",[38,3451,3452,3455],{},[41,3453,3454],{},"Public\u002FPrivate fridges (by view-password)",[41,3456,3457],{},"Limit to the number of words. When you get >n words, the first word would disappear",[11,3459,3460],{},"So the front page would be a list of fridges",[11,3462,3463],{},"Modes:",[38,3465,3466,3469,3472,3475],{},[41,3467,3468],{},"View fridge list",[41,3470,3471],{},"Create fridge -- fridge name, owner password",[41,3473,3474],{},"Fridge preferences -- private password, word-limit",[41,3476,3477],{},"Fridge itself -- manipulate the fridge!",{"title":474,"searchDepth":475,"depth":475,"links":3479},[],"2005-06-09T14:27-04:00",{},{"title":3433,"description":3438},[490],"o7TCnyej3txqyEXyd-7bP3xvevblUoIBIp8VwDrFjmQ",{"id":3486,"title":3487,"body":3488,"createdAt":3525,"description":3492,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3526,"navigation":486,"path":216,"seo":3527,"stem":217,"tags":3528,"updatedAt":3529,"__hash__":3530},"content\u002FGecko-based html2ps.md","Gecko-based_html2ps",{"type":8,"value":3489,"toc":3520},[3490,3493,3497,3500,3502,3505,3508,3510],[11,3491,3492],{},"This is an idea I (and lots of other people) have been toying with for a long time. Well its about time that I actually DO something about it.",[30,3494,3496],{"id":3495},"status","Status",[11,3498,3499],{},"Broken.",[30,3501,2493],{"id":2492},[11,3503,3504],{},"While I'm still trying to figure out the '''best''' way to do this, I've decided that to ever get it done I may as well start with a direct way to do it. So I've grabbed the firefox source and built it. I am exploring the TestGtkEmbed application and for my first trick I will make it print to postscript from the command line. I will then rip all the graphical stuff (including GTK itself) out if I can and will be left with html2ps.gecko.",[11,3506,3507],{},"Update: OK, I tried that. I got frustrated and bored, so then I moved on. My NEW attempt is to just Go For It, trying to directly implement what I desire. I have since learned that Gecko has some serious limitations when it comes to rendering things off-screen... but I'm still researching that.",[30,3509,2120],{"id":704},[38,3511,3512],{},[41,3513,3514,1512,3518,532],{},[22,3515,3516],{"href":3516,"rel":3517},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fcpp\u002Fhtml2ps\u002F",[26],[22,3519,471],{"href":470},{"title":474,"searchDepth":475,"depth":475,"links":3521},[3522,3523,3524],{"id":3495,"depth":475,"text":3496},{"id":2492,"depth":475,"text":2493},{"id":704,"depth":475,"text":2120},"2005-02-25T10:46-05:00",{},{"title":3487,"description":3492},[490],"2005-03-02T17:18-05:00","cRpN0SDdphG8I71SWqctzo6WaQpbdggJllIiM25MzmM",{"id":3532,"title":3533,"body":3534,"createdAt":3560,"description":3561,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3562,"navigation":486,"path":300,"seo":3563,"stem":301,"tags":3564,"updatedAt":3565,"__hash__":3566},"content\u002FOddmuse EditSection.md","Oddmuse_EditSection",{"type":8,"value":3535,"toc":3558},[3536,3547,3555],[11,3537,3538,3539,3542,3543,661],{},"This extension adds an \"",[576,3540,3541],{},"Edit","\" link to sections, so that you can edit them one-by-one. This is to clone the feature in ",[22,3544,3545],{"href":3545,"rel":3546},"http:\u002F\u002Fwww.wikipedia.org\u002F",[26],[38,3548,3549],{},[41,3550,3551],{},[22,3552,3553],{"href":3553,"rel":3554},"http:\u002F\u002Fthelackthereof.org\u002Fwiki_data\u002Fmodules\u002Fzzz-editsection.pl.bak",[26],[11,3556,3557],{},"For now this depends a bit on the oddmuse plugin (because it uses == ... == as the section identifier, basically). That means that it has to be loaded after oddmuse... hence the 'zzz-' part of the name.",{"title":474,"searchDepth":475,"depth":475,"links":3559},[],"2005-02-16T03:47-05:00","This extension adds an \"Edit\" link to sections, so that you can edit them one-by-one. This is to clone the feature in http:\u002F\u002Fwww.wikipedia.org\u002F.",{},{"title":3533,"description":3561},[490],"2006-04-27T20:22-04:00","rppddg8OyF8wVAPtvKdti355FCnLY7RQD9PHLWpxn5w",{"id":3568,"title":168,"body":3569,"createdAt":3750,"description":3751,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3752,"navigation":486,"path":167,"seo":3753,"stem":168,"tags":3754,"updatedAt":3755,"__hash__":3756},"content\u002FContinuity.md",{"type":8,"value":3570,"toc":3742},[3571,3580,3584,3587,3593,3596,3602,3606,3614,3618,3621,3638,3642,3650,3654,3684,3688],[11,3572,3573,3574,3579],{},"I think maybe this is outdated. You should go over to ",[22,3575,3578],{"href":3576,"rel":3577},"http:\u002F\u002Fcontinuity.tlt42.org\u002F",[26],"the continuity website"," now.",[30,3581,3583],{"id":3582},"continuation-based-web-programming-library-for-perl","Continuation-Based Web-Programming Library for Perl",[11,3585,3586],{},"This is a slightly ''different'' approach to web-programming. Here we view a web application a lot more like a command-line driven program. Instead of your program being restarted with each request, we will pretend that your program picks up right where it left off. Here is a small example of a function in this context:",[1387,3588,3591],{"className":3589,"code":3590,"language":1392},[1390],"sub addTwo {\n  my ($self) = @_;\n  my $a = $self->getNum(\"Enter first number: \");\n  my $b = $self->getNum(\"Enter second number: \");\n  $self->disp(\"The sum of $a and $b is \" . ($a + $b));\n}\n",[704,3592,3590],{"__ignoreMap":474},[11,3594,3595],{},"Now looking at this code it is very clear what is going on. First we prompt the user for the first number by calling the getNum method. At this point the progam is suspended, waiting for input from the user. The user sees a webpage with the prompt and an input box. Once they submit their answer, the program picks up where it left off, putting the value given into $a. The process is repeated for getting the second number and putting it into $b.",[11,3597,3598,3599,3601],{},"And that's the idea. This uses some Deep Magic called Continuations to make this work. Unfortunately Perl doesn't directly support this programming language concept (yet), so Continuity utilizes the ",[22,3600,175],{"href":174}," module to let Perl ''pretend'' that it has this power. In the tutorials we'll see how this will slightly change the way you code your applications.",[30,3603,3605],{"id":3604},"tutorial","Tutorial",[11,3607,3608,3609,3613],{},"Some of you don't want to hear so much discussion... you'd rather see code. So I've started a ",[22,3610,3612],{"href":3611},"\u002Fcontinuity-tutorials","Continuity Tutorials"," page so that you can dive right in. Have fun.",[30,3615,3617],{"id":3616},"development","Development",[11,3619,3620],{},"Notes \u002F Ideas:",[38,3622,3623,3626,3632],{},[41,3624,3625],{},"Use cpan:Pixie to store stuff, or rip their storage code. Should work better than the way I'm doing it now.",[41,3627,3628],{},[22,3629,3631],{"href":3630},"\u002Fclassdbi-aware-templates","ClassDBI-Aware Templates",[41,3633,3634],{},[22,3635,3637],{"href":3636},"\u002Fdom-templates-and-ajax","DOM Templates and AJAX",[30,3639,3641],{"id":3640},"comments-contact","Comments \u002F Contact",[11,3643,3644,3645,3649],{},"For comments there is a link at the bottom of this page, but also feel free to email me questions and thoughts (mailto:",[22,3646,3648],{"href":3647},"mailto:awwaiid@thelackthereof.org","awwaiid@thelackthereof.org","). This is of course an ongoing project which needs quite a bit of refinement. Your questions, comments, and contributions will give me the feedback I need to make this system useable and clean. If enough people inquire about this project, I'll set up a mailing list.",[30,3651,3653],{"id":3652},"related-similar-stuff","Related \u002F Similar Stuff",[38,3655,3656,3663,3670,3677],{},[41,3657,3658,3662],{},[22,3659,3660],{"href":3660,"rel":3661},"http:\u002F\u002Fwww.beta4.com\u002Fseaside2\u002F",[26]," - Seaside2, a smalltalk continuation-based web programming thingie",[41,3664,3665,3669],{},[22,3666,3667],{"href":3667,"rel":3668},"http:\u002F\u002Fborges.rubyforge.org\u002F",[26]," - Seaside2, ported to Ruby. pretty much.",[41,3671,3672,3676],{},[22,3673,3674],{"href":3674,"rel":3675},"http:\u002F\u002Fcsoki.ki.iif.hu\u002F~vitezg\u002Fimpostor\u002F",[26]," - A similar framework for Python. They use an Apache module though... cheating I'd say :)",[41,3678,3679,3683],{},[22,3680,3681],{"href":3681,"rel":3682},"http:\u002F\u002Frubyforge.org\u002Fprojects\u002Fwee\u002F",[26]," - Another Ruby framework... this one doesn't necessarily need continuations, getting by with a nice callback and state serialization system",[30,3685,3687],{"id":3686},"see-also","See Also",[38,3689,3690,3693,3697,3703,3707,3714,3721,3728,3735],{},[41,3691,3692],{},"cpan:Continuity - CPAN entry for this project",[41,3694,3695],{},[22,3696,175],{"href":174},[41,3698,3699],{},[22,3700,3702],{"href":3701},"\u002Fweb-programming-with-contize","Web Programming With Contize",[41,3704,3705],{},[22,3706,203],{"href":202},[41,3708,3709,3713],{},[22,3710,3711],{"href":3711,"rel":3712},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FContinuity\u002F",[26]," - Current sourcecode",[41,3715,3716,3720],{},[22,3717,3718],{"href":3718,"rel":3719},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FContinuity\u002Feg\u002Fanimals\u002F",[26]," - Animals example (in progress)",[41,3722,3723,3727],{},[22,3724,3725],{"href":3725,"rel":3726},"http:\u002F\u002Fthelackthereof.org\u002Fdev\u002Fguess\u002F",[26]," - Guessing Game demo",[41,3729,3730,3734],{},[22,3731,3732],{"href":3732,"rel":3733},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002FContinuity\u002Feg\u002Fguess\u002F",[26]," - Guessing game example source",[41,3736,3737,3741],{},[22,3738,3739],{"href":3739,"rel":3740},"http:\u002F\u002Ffreshmeat.net\u002Fprojects\u002Fcontinuityperl\u002F",[26]," - Freshmeat entry",{"title":474,"searchDepth":475,"depth":475,"links":3743},[3744,3745,3746,3747,3748,3749],{"id":3582,"depth":475,"text":3583},{"id":3604,"depth":475,"text":3605},{"id":3616,"depth":475,"text":3617},{"id":3640,"depth":475,"text":3641},{"id":3652,"depth":475,"text":3653},{"id":3686,"depth":475,"text":3687},"2005-01-21T19:05-05:00","I think maybe this is outdated. You should go over to the continuity website now.",{},{"title":168,"description":3751},[490],"2008-12-20T16:31-05:00","bcGkqrECwOgvUGLUvRoIuFeK6CfvqhJTw-SJrg2lfLM",{"id":3758,"title":3759,"body":3760,"createdAt":3823,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3824,"navigation":486,"path":202,"seo":3825,"stem":203,"tags":3826,"updatedAt":3827,"__hash__":3828},"content\u002FEPFarms Panel.md","EPFarms_Panel",{"type":8,"value":3761,"toc":3817},[3762,3766,3778,3782,3790,3792,3808,3810],[30,3763,3765],{"id":3764},"structure","Structure",[11,3767,3768,3769,3771,3772,3774,3775,3777],{},"The panel is built around ",[22,3770,175],{"href":174}," (and eventually ",[22,3773,168],{"href":167},"), which gives the whole thing a completely different feel, programming-wise, from other web-based applications. The goal is to remove the obsessive state management from the programmer's tasks and transfer the task back to the language. Instead of the programmer keeping track of the current state in a variable, for example, the current place of execution in the code ''is'' the current state of the program. Since this project was created I started ",[22,3776,168],{"href":167},", so someday the panel will move to use that (and will thus be a little cleaner).",[30,3779,3781],{"id":3780},"modules","Modules",[11,3783,3784,3785,3789],{},"Modules are easy to create and yet very powerful. This combination is achieved though the infrastructure which is inherited when a module is created. See ",[22,3786,3788],{"href":3787},"\u002Fepfarms-panel-module-development","EPFarms Panel Module Development"," for technical details.",[30,3791,3687],{"id":3686},[38,3793,3794,3800],{},[41,3795,3796],{},[22,3797,3798],{"href":3798,"rel":3799},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fepfarms-panel\u002F",[26],[41,3801,3802,3807],{},[22,3803,3806],{"href":3804,"rel":3805},"http:\u002F\u002Fcommunity.epfarms.net\u002Ftiki-index.php?page=Eggplant+Farms+Panel+-+Development+Project",[26],"Eggplant Farms Panel Development Project"," on the epfarms wiki",[30,3809,2780],{"id":2779},[11,3811,2783,3812],{},[22,3813,3816],{"href":3814,"rel":3815},"http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-EPFarms-Panel.rss%3E",[26],"http:\u002F\u002Fthelackthereof.org\u002Fdarcs-rss\u002Ffeed\u002Fperl-EPFarms-Panel.rss>",{"title":474,"searchDepth":475,"depth":475,"links":3818},[3819,3820,3821,3822],{"id":3764,"depth":475,"text":3765},{"id":3780,"depth":475,"text":3781},{"id":3686,"depth":475,"text":3687},{"id":2779,"depth":475,"text":2780},"2005-01-16T17:34-05:00",{},{"title":3759,"description":474},[490],"2007-08-27T09:13-04:00","YtCu57ZNZLdRAjshpMJBqpbIrcCfFrmOLzGc_JNxnQY",{"id":3830,"title":3831,"body":3832,"createdAt":3865,"description":3866,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":3867,"navigation":486,"path":279,"seo":3868,"stem":280,"tags":3869,"updatedAt":3865,"__hash__":3870},"content\u002FOCaml GrabBag.md","OCaml_GrabBag",{"type":8,"value":3833,"toc":3863},[3834,3840,3848],[11,3835,3836,3837,3839],{},"I wrote GrabBag as a datastructure to hold genetically evolving programs (see ",[22,3838,287],{"href":286},"). Unlike most collections, this one assumes that when you add an element you don't care where it goes (unordered insertion) and that when you pull out an element you specifically want a uniformly random element.",[11,3841,1101,3842,3847],{},[22,3843,3846],{"href":3844,"rel":3845},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fgrabbag\u002F",[26],"the grabbag directory"," for the source code (GPLed unless you talk to me).",[11,3849,3850,3851,3854,3855,3858,3859,3862],{},"This particular implementation is based on a binary tree which keeps track of how many leaves it has on both its left and right side (the actual data is stored in the leaves). This makes it easy to find the size -- you just add those two numbers from the root of the tree. To grab something at random we take the size (total number of things we have), pick a random number up to that. Then we start at the root... if the number is bigger than the left, we go right and so on until we find the node and pull it out. We make a note of the removal by subtraction on the way back out. ",[704,3852,3853],{},"2^n"," nodes can thus be accessed in ",[704,3856,3857],{},"2*n"," operations (which is equivalent to ",[704,3860,3861],{},"O(ln n)"," I believe). Adding works similarly -- we move down the tree finding out where it is lopsided and add the new thingie there, thereby keeping things pretty even.",{"title":474,"searchDepth":475,"depth":475,"links":3864},[],"2004-12-11T03:10-05:00","I wrote GrabBag as a datastructure to hold genetically evolving programs (see OGPF). Unlike most collections, this one assumes that when you add an element you don't care where it goes (unordered insertion) and that when you pull out an element you specifically want a uniformly random element.",{},{"title":3831,"description":3866},[490],"vLvj45b8eJYLqEzTRQXzykDRgKM9syytLZ01bsgLAkU",{"id":3872,"title":287,"body":3873,"createdAt":4005,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4006,"navigation":486,"path":286,"seo":4007,"stem":287,"tags":4008,"updatedAt":4009,"__hash__":4010},"content\u002FOGPF.md",{"type":8,"value":3874,"toc":3998},[3875,3879,3887,3901,3914,3916,3959,3961,3964,3968,3971,3988,3992],[30,3876,3878],{"id":3877},"ocaml-genetic-programming-framework","OCaml Genetic Programming Framework",[11,3880,3881,3882,3886],{},"One of the greatest strengths of ",[22,3883,3885],{"href":3884},"\u002Focaml","OCaml"," is in data structure manipulation, which is essentially what makes up a genetic programming framework. Thus OCaml is an excellent choice for such an endeavor.",[11,3888,3889,3890,3892,3893,3895,3896,3900],{},"The goal of ",[22,3891,287],{"href":286}," is to create a modular framework for building genetic programming systems in ",[22,3894,3885],{"href":3884},". It is additionally an experiment in modular framework design, making heavy use of ",[22,3897,3899],{"href":3898},"\u002Ffunctors","Functors",". OGPF seeks to be a clean, elegant, and efficient solution to the question \"How do I do genetic programming in OCaml?\"",[11,3902,3903,3904,3906,3907,3913],{},"If you are interested in using ",[22,3905,287],{"href":286}," please ",[576,3908,3909,3910,3912],{},"mailto:",[22,3911,3648],{"href":3647}," email me"," and I'll help you get started. The more people who use the system and contribute components the easier everything will get.",[30,3915,3687],{"id":3686},[38,3917,3918,3925,3932,3938,3953],{},[41,3919,3920],{},[22,3921,3924],{"href":3922,"rel":3923},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fogpf\u002F",[26],"The OGPF project directory",[41,3926,3927],{},[22,3928,3931],{"href":3929,"rel":3930},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fogpf\u002Fsnapshots\u002F",[26],"Snapshots of the code",[41,3933,3934],{},[22,3935,3937],{"href":3936},"\u002Fogpf-background","OGPF Background",[41,3939,3940,3941,3950,3951,532],{},"do ",[3942,3943,3944,3945,3949],"nowiki",{}," \"darcs get ",[22,3946,3947],{"href":3947,"rel":3948},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Fogpf",[26],"\" "," to join development (see ",[22,3952,471],{"href":470},[41,3954,3955],{},[22,3956,3957],{"href":3957,"rel":3958},"http:\u002F\u002Fwww.lri.fr\u002F~marc\u002FEO\u002Feo\u002Ftutorial\u002Fhtml\u002FeoBottomUp.html",[26],[30,3960,3496],{"id":3495},[11,3962,3963],{},"The framework itself is now functional, but to be useful to others I must still implement some common components. For example, I am now implementing Koza-lisp style genotype (just simple functions and terminals) in a couple different ways; I need to implement a Koza-style population management scheme, and using these reproduce some Koza-style problems (straight from the Genetic Programming books, probably). There are still some modularity issues.",[30,3965,3967],{"id":3966},"plans","Plans",[11,3969,3970],{},"Other things that this thing needs (long-term stuff):",[38,3972,3973,3976,3979,3982,3985],{},[41,3974,3975],{},"UI for managing runs",[41,3977,3978],{},"Statistical analysis of runs",[41,3980,3981],{},"Graphs of said statistics",[41,3983,3984],{},"History \u002F Genealogy in runs (also for analysis)",[41,3986,3987],{},"Preemption of runs",[30,3989,3991],{"id":3990},"documentation","Documentation",[11,3993,3994],{},[22,3995,3997],{"href":3996},"\u002Fogpf-layout","OGPF Layout",{"title":474,"searchDepth":475,"depth":475,"links":3999},[4000,4001,4002,4003,4004],{"id":3877,"depth":475,"text":3878},{"id":3686,"depth":475,"text":3687},{"id":3495,"depth":475,"text":3496},{"id":3966,"depth":475,"text":3967},{"id":3990,"depth":475,"text":3991},"2004-12-11T03:08-05:00",{},{"title":287,"description":474},[490],"2005-04-23T22:19-04:00","2ySFd-jj0wCt8R4RZseAJmP3M27mYCniDpfRA3Iqc0w",{"id":4012,"title":175,"body":4013,"createdAt":4078,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4079,"navigation":486,"path":174,"seo":4080,"stem":175,"tags":4081,"updatedAt":4082,"__hash__":4083},"content\u002FContize.md",{"type":8,"value":4014,"toc":4074},[4015,4019,4032,4035,4044,4050,4053,4059,4061],[30,4016,4018],{"id":4017},"fake-continuations-for-a-perl-object","Fake Continuations for a Perl Object",[11,4020,4021],{},[4022,4023,4024,4028,4029,4031],"i",{},[4025,4026,4027],"b",{},"NOTE:"," I'm not doing any active work on this project. This project spawned ",[22,4030,168],{"href":167}," and that's where I've followed it :)",[11,4033,4034],{},"Contize is a sort of proxy object. You create an instance of your original object, and then give it to Contize. Contize then takes over that object (and you work with the Contize object but pretend it is still the original) and lets the object pretend that it can be suspended and restarted.",[11,4036,4037,4038,4040,4041,4043],{},"This is a pretty trick concept, and the best way to get your brain around the whole thing is to contemplate why I created it in the first place, namely so that I can do ",[22,4039,3286],{"href":3285}," in Perl CGI programs (See ",[22,4042,3702],{"href":3701},". Well... actually the ''best'' way to make sense of this is to see some code, and the most relevant code is CGI programming stuff. So let's see some!",[1387,4045,4048],{"className":4046,"code":4047,"language":1392},[1390],"#!\u002Fusr\u002Fbin\u002Fperl\n\npackage WebGuess;\nuse strict;\nuse Contize;\n\nsub new {\n  my $self = {};\n  bless $self;\n  $self = new Contize($self);\n  return $self;\n}\n\nsub setNumber {\n  my $self = shift;\n  $self->{number} = int(rand(100)) + 1;\n}\n\nsub display {\n  my ($self, $content) = @_;\n  print $content;\n  $self->suspend();\n}\n\nsub getNum {\n  my $self = shift;\n  $self->display(\u003C\u003C\"END\");\n    \u003Cform method=\"POST\">\n      Enter Guess: \u003Cinput name=\"num\">\n      \u003Cinput type=submit value=\"Guess\"> \u003Cinput type=submit name=\"done\">\u003Cbr>\n    \u003C\u002Fform>\nEND\n  return $::q->param('num');\n}\n\nsub run {\n  my $self = shift;\n  $self->setNumber();\n  my $guess;\n  my $tries = 0;\n  print \"Hi! I'm thinking of a number from 1 to 100... can you guess it?\u003Cbr>\\n\";\n  do {\n    $tries++;\n    $guess = $self->getNum();\n    print \"It is smaller than $guess.\u003Cbr>\\n\" if($guess > $self->{number});\n    print \"It is bigger than $guess.\u003Cbr>\\n\" if($guess \u003C $self->{number});\n  } until ($guess == $self->{number});\n  print \"You got it! My number was in fact $self->{number}.\u003Cbr>\\n\";\n  print \"It took you $tries tries.\u003Cbr>\\n\";\n}\n\npackage Main;\n\nuse strict;\nuse CGI;\nuse CGI::Session;\nuse Data::Dumper;\n\n# Set up the CGI session and print the header\n$::q = new CGI();\nmy $session = new CGI::Session(undef, $::q, {Directory=>'\u002Ftmp'});\nprint $session->header();\n\n# If there is a guess object in the session use it, otherwise create a new\n# WebGuess object and Contize it.\nmy $g = $session->param('guess') || new WebGuess();\n\n# Fix stuff -- most importantly the Data::Dumper version of the object doesn't\n# get recreated correctly (I don't know why)... so to work around it I re-eval\n# the thing. And we must reset the callstack and the callcount.\nmy $VAR1;\neval(Dumper($g));\n$g = $VAR1;\n$g->reset();\n\n# Add the WebGuess object to the session\n$session->param('guess', $g);\n\n# Enter the main loop of the WebGuess object\nuntil($::q->param('done')) {\n  $g->run();\n}\n\n# We won't get here until that exits cleanly (never!)\nprint \"Done.\";\n",[704,4049,4047],{"__ignoreMap":474},[11,4051,4052],{},"Now this is long and maybe a bit complicated... but it shows the idea (and some warts that I am still working out, such as having to re-eval through Data::Dumper to fix the sessionization of the main object).",[11,4054,4055,4056,4058],{},"As a much larger example, and also to work out more problems (both conceptual and practical) I am working on ",[22,4057,203],{"href":202}," as a testbed application for this method and this module.",[30,4060,3687],{"id":3686},[38,4062,4063,4066,4070],{},[41,4064,4065],{},"cpan:Contize on CPAN",[41,4067,4068],{},[22,4069,3702],{"href":3701},[41,4071,4072],{},[22,4073,3286],{"href":3285},{"title":474,"searchDepth":475,"depth":475,"links":4075},[4076,4077],{"id":4017,"depth":475,"text":4018},{"id":3686,"depth":475,"text":3687},"2004-07-24T15:56-04:00",{},{"title":175,"description":474},[490],"2007-09-28T12:28-04:00","WuykTSqhjz6p2Sk_8W_eHHMyBo-snvNWqd4u1cKpqqs",{"id":4085,"title":371,"body":4086,"createdAt":4375,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4376,"navigation":486,"path":370,"seo":4377,"stem":371,"tags":4378,"updatedAt":4379,"__hash__":4380},"content\u002FSetDB.md",{"type":8,"value":4087,"toc":4365},[4088,4092,4100,4103,4107,4137,4141,4164,4168,4191,4195,4202,4206,4209,4215,4217,4273,4275,4279,4306],[1396,4089,4091],{"id":4090},"a-set-theoretical-database-interface","A Set-Theoretical Database Interface",[11,4093,4094,4095,4099],{},"There have been quite a few RDBMS->OO Mappers (see ",[22,4096,4097],{"href":4097,"rel":4098},"http:\u002F\u002Fpoop.sourceforge.net\u002F",[26],") but none of them have satisfied me. Usually this is because they map on a table-to-object basis, whereas I want something a bit more abstract. Thus was born SetDB. SetDB allows the programmer to view a database in the same way that a database designer would -- as sets of things and relationships between the sets. In general a programmer only sees this world when composing SQL, and from then on sees only a series of rows.",[11,4101,4102],{},"SetDB is a work in progress and the state of the project reflects that fact. Just a warning!",[1396,4104,4106],{"id":4105},"vocabulary","Vocabulary",[38,4108,4109,4112,4115,4118,4121,4124,4127,4130],{},[41,4110,4111],{},"''Values'' are things like names or phone numbers or zip codes or such.",[41,4113,4114],{},"A ''tuple'' holds a bunch of values.",[41,4116,4117],{},"A ''set'' contains a bunch of same-structured tuples.",[41,4119,4120],{},"Each table is a ''simple set''.",[41,4122,4123],{},"Sets relate to one another through references (pointers).",[41,4125,4126],{},"A ''schema'' is a description of simple sets, their tuples, the tuples' values, and the references between these sets.",[41,4128,4129],{},"''Compound sets'' are sets which can have other sets as values.",[41,4131,4132,4133,4136],{},"Doing \"$everyone = $db->newSet(person, ",[576,4134,4135],{},"address",");\" is really creating a compound set.",[1396,4138,4140],{"id":4139},"things-that-are-done","Things that are done",[38,4142,4143,4149,4152,4155,4158,4161],{},[41,4144,1101,4145],{},[22,4146,4148],{"href":4147},"\u002Fsetdb-code-examples","SetDB Code Examples",[41,4150,4151],{},"Inferring connecting tables",[41,4153,4154],{},"Sets with simple childsets",[41,4156,4157],{},"Sets with multiple simple childsets",[41,4159,4160],{},"Simple tuple updates",[41,4162,4163],{},"Internal simple filters",[1396,4165,4167],{"id":4166},"things-to-be-done","Things to be done",[38,4169,4170,4173,4176,4179,4182,4185,4188],{},[41,4171,4172],{},"Sets with complex childsets (like path information)",[41,4174,4175],{},"Adding new tuples",[41,4177,4178],{},"Advanced tuple updates (updating complex childsets)",[41,4180,4181],{},"Tuple filters",[41,4183,4184],{},"Relationship filters",[41,4186,4187],{},"Set aliases",[41,4189,4190],{},"Set operations (union, minus, intersection)",[1396,4192,4194],{"id":4193},"inferring-connecting-tables","Inferring Connecting Tables",[11,4196,4197,4198,4201],{},"Translating \"(person, ",[576,4199,4200],{},"book",")\" into the \"person -> has_book -> book\" relationship is done by building an undirected network of all the relationships and doing a breadth-first search to find this sort of path.",[1396,4203,4205],{"id":4204},"desired-code-features","Desired Code Features",[11,4207,4208],{},"Here is some proposed stuff I want to work:",[1387,4210,4213],{"className":4211,"code":4212,"language":1392},[1390],"  $east_siders = $everyone->filter([school, [address]], \"side = 'east'\");\n\n  $non_east_siders = $everyone->minus($east_siders);\n  # OR\n  $non_east_siders = $everyone - $east_siders;\n\n  # Ideas for operator overloading\n  $c = $a +  $b;  # Union (With Overlap?)\n  $c = $a || $b;  # Union\n  $c = $a -  $b;  # Subtraction\n  $c = $a && $b;  # Intersection\n  $c = $a->filter([set], \"name LIKE '%x%'\");\n\n  # Things I might not ultimately like\n  $c->size(); # Number of elements in $c;\n  $c->uniqueSize(); # Number of unduplicated elements in $c\n  $c->duplicates; # Set of things which are duplicated in $c\n  $c->unique(); # Remove duplicates\n",[704,4214,4212],{"__ignoreMap":474},[1396,4216,3687],{"id":3686},[38,4218,4219,4222,4232,4238,4247],{},[41,4220,4221],{},"TLT:projects\u002Fperl\u002Fsetdb\u002F for currentish code",[41,4223,4224,4225,4229,4230,532],{},"do \"darcs get ",[22,4226,4227],{"href":4227,"rel":4228},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fsetdb",[26],"\" to join development (see ",[22,4231,471],{"href":470},[41,4233,4234],{},[22,4235,4237],{"href":4236},"\u002Fthoughts-and-issues-with-web-based-db-programming","Thoughts and issues with web-based DB programming",[41,4239,4240,4244,4245],{},[22,4241,4243],{"href":4242},"\u002Fsetdb-philosophy","SetDB Philosophy"," for a more abstract discussion of ",[22,4246,371],{"href":370},[41,4248,4249,4250],{},"Related \u002F Similar \u002F Cool modules\n",[38,4251,4252,4258,4261,4264,4267,4270],{},[41,4253,4254,4257],{},[22,4255,4097],{"href":4097,"rel":4256},[26]," for a list of RDBMS \u003C--> OO mappers",[41,4259,4260],{},"cpan:DBIx::Recordset",[41,4262,4263],{},"cpan:Class::DBI",[41,4265,4266],{},"cpan:Class::Tables",[41,4268,4269],{},"cpan:Tie::DBI",[41,4271,4272],{},"cpan:AnyData",[444,4274],{},[1396,4276,4278],{"id":4277},"on-adding-records","On Adding Records",[11,4280,4281,4282,4284],{},"It only makes sense to add records one layer away from a given context. That is -- if I have a person who has books, and each book has a list of places where it was published, then it would make sense to add a new book for that person. It would not make sense, however, to add a new place of publication for that person. So... an example schema would be:",[519,4283],{},[4285,4286,4287,4289,4290,4292,4293,4295,4296,4298,4299,4301,4302,3354,4304],"graph",{},[519,4288],{},"\ndigraph {",[519,4291],{},"\n\"has_book\" -> \"person\";",[519,4294],{},"\n\"has_book\" -> \"book\";",[519,4297],{},"\n\"place_published\" -> \"book\";",[519,4300],{},"\n\"place_published\" -> \"location\";",[519,4303],{},[519,4305],{},[4307,4308,4309,4328,4334,4337,4344,4354],"clear",{},[11,4310,4311,4312,4314,4315,4321,4322,532],{},"Set Structure:",[519,4313],{},"\n(person, ",[576,4316,4317,4318],{},"book, ",[576,4319,4320],{},"location",") \u003C==> (person, ",[576,4323,4324,4325],{},"has_book, book, ",[576,4326,4327],{},"place_published, location",[11,4329,4330,4331,4333],{},"Path:",[519,4332],{},"\nperson --> has_book --> book --> place_published --> location",[11,4335,4336],{},"So in this setup it would make sense to add a book to a person, or add a location to a book, but it would not make sense to add a location to a person. Hmm... in this case it actually does look like the set-structure is a good way of looking at when we can or cannot add things. If we have a parent we can add a child but not a grand-child.",[11,4338,4339,4340,4343],{},"Things would be different, however, if we were using: (person, ",[576,4341,4342],{},"book, location","). Here we are interpolating the book and its location into single tuples (so we would possibly have repeated books). Adding a record would imply adding both a book and a location.",[11,4345,4346,4347,4349,4350,4353],{},"Actually... When we refer to (person, ",[576,4348,4200],{},") this is equivalent to (person, ",[576,4351,4352],{},"has_book, book","). Then when we add a book, we also need to add a has_book. Thus a new entry in a subset means a new entry in all of the tables in that subset, including any linking tables. hmm. But as I said above it doesn't make sense to add too many linking tables. So there must be a way to tell the difference. Let's set up a situation...",[11,4355,4356,4357,4360,4361,4364],{},"Take (person, ",[576,4358,4359],{},"publisher",") -> (person, ",[576,4362,4363],{},"has_book, book, has_publisher, publisher","). It is actually ambiguous to add a publisher in this case... too many inferred tables and we don't know which ones need new records and which ones don't. But in the case that there is only ONE connecting table, we definitely want an entry.",{"title":474,"searchDepth":475,"depth":475,"links":4366},[4367,4368,4369,4370,4371,4372,4373,4374],{"id":4090,"depth":1421,"text":4091},{"id":4105,"depth":1421,"text":4106},{"id":4139,"depth":1421,"text":4140},{"id":4166,"depth":1421,"text":4167},{"id":4193,"depth":1421,"text":4194},{"id":4204,"depth":1421,"text":4205},{"id":3686,"depth":1421,"text":3687},{"id":4277,"depth":1421,"text":4278},"2004-06-12T01:31-04:00",{},{"title":371,"description":474},[490],"2006-03-06T14:33-05:00","8FJJAD2DgYXzbh6hsueIp0ERWIurS5ic6TQIxcc9Fh4",{"id":4382,"title":210,"body":4383,"createdAt":4425,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4426,"navigation":486,"path":209,"seo":4427,"stem":210,"tags":4428,"updatedAt":4425,"__hash__":4429},"content\u002FGOE.md",{"type":8,"value":4384,"toc":4421},[4385,4389,4392,4399,4402,4405,4407],[30,4386,4388],{"id":4387},"goe-object-environment","Goe Object Environment",[11,4390,4391],{},"The goal of this project is to create a smalltalk-like environment using perl as the foundation.",[11,4393,1101,4394,4398],{},[22,4395,4396],{"href":4396,"rel":4397},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Fgoe\u002Fhtml\u002F",[26]," for the website, though at some point this wiki will probably become more accurate. It at least has a pretty logo!",[11,4400,4401],{},"There are all sorts of neat ideas that have come out of this basic concept. Probably the coolest is using the Inline:: family of modules to allow the intermixing of languages on a per-method basis. The code browser and editors and such would all be aware of this and hide just a bit more of the complexity involved. Ultimately when adding a method (or function) to a package you would not just give it a name but give it a language.",[11,4403,4404],{},"(2003.10.19) I have been thinking lately that I haven't actually taken this treat-perl-like-smalltalk idea far enough. Its mostly conceptual I suppose... but little things like Smalltalk's way of having all instance variables private by default and all the methods public. Message-passing instead of method-calling is another one. At some point when trying various smalltalk implementations I saw one with a GUI builder that dumped static code into a method. I don't think it de-parsed the code later... it must have stuck it somewhere though of course.  But then the GUI editor sort of became an extension of the browser... it was just a more advanced interface for editing methods which draw GUI things.",[30,4406,3687],{"id":3686},[38,4408,4409,4415],{},[41,4410,4411],{},[22,4412,4413],{"href":4413,"rel":4414},"http:\u002F\u002Fc2.com\u002Fcgi\u002Fwiki?CanPerlBeSmalltalk",[26],[41,4416,4417],{},[22,4418,4419],{"href":4419,"rel":4420},"http:\u002F\u002Fminnow.cc.gatech.edu\u002Fsqueak\u002F665",[26],{"title":474,"searchDepth":475,"depth":475,"links":4422},[4423,4424],{"id":4387,"depth":475,"text":4388},{"id":3686,"depth":475,"text":3687},"2004-05-19T01:06-04:00",{},{"title":210,"description":474},[490],"eCy0fbH89Id45VsCHVRl6BOtaUEllWT-yPceX6Hrano",{"id":4431,"title":4432,"body":4433,"createdAt":4459,"description":4460,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4461,"navigation":486,"path":223,"seo":4462,"stem":224,"tags":4463,"updatedAt":4464,"__hash__":4465},"content\u002FGraph Module.md","Graph_Module",{"type":8,"value":4434,"toc":4457},[4435,4448,4451],[11,4436,4437,4438,4442,4443,4447],{},"The graph module uses GraphViz to draw graphs. Here are some examples I've put together, but much fancier things are possible. See ",[22,4439,4440],{"href":4440,"rel":4441},"http:\u002F\u002Fwww.research.att.com\u002Fsw\u002Ftools\u002Fgraphviz\u002Frefs.html",[26]," for GraphViz documentation, and see ",[22,4444,4445],{"href":4445,"rel":4446},"http:\u002F\u002Fwww.research.att.com\u002Fsw\u002Ftools\u002Fgraphviz\u002Fexamples\u002F",[26]," for some examples.",[15,4449],{"src":4450},"https:\u002F\u002Fwww.plantuml.com\u002Fplantuml\u002Fpng\u002FIybCBqeio51mLwZcAahCoqx9BBBr2UBAoqz9LOZcAiv8B4YrJSglu8hbKb18LD2rKqW24SbSjG00",[1387,4452,4455],{"className":4453,"code":4454,"language":1392},[1390],"\u003Cgraph abc>\n  digraph {\n    a -> b - > c;\n  }\n\u003C\u002Fgraph>\n\u003Cgraph>\ndigraph {\n  rankdir=LR;\n  node [ shape=plaintext fontsize=10 ];\n  struct1 [\n    label=\u003C\u003CTABLE border=\"0\" cellborder=\"1\" cellspacing=\"0\" cellpadding=\"0\" width=\"75\">\n      \u003CTR>\u003CTD bgcolor=\"lightgrey\">foo\u003C\u002FTD>\u003C\u002FTR>\n      \u003CTR>\u003CTD>columnx\u003C\u002FTD>\u003C\u002FTR>\n      \u003CTR>\u003CTD>id\u003C\u002FTD>\u003C\u002FTR>\n      \u003CTR>\u003CTD port=\"barid1\">bar_id\u003C\u002FTD>\u003C\u002FTR>\n      \u003CTR>\u003CTD>baz\u003C\u002FTD>\u003C\u002FTR>\n      \u003C\u002FTABLE>\n    >\n  ];\n  struct0 [\n    label=\u003C\u003CTABLE border=\"0\" cellborder=\"1\" cellspacing=\"0\">\n      \u003CTR>\u003CTD bgcolor=\"lightgrey\">bar\u003C\u002FTD>\u003C\u002FTR>\n      \u003CTR>\u003CTD port=\"barid0\">id\u003C\u002FTD>\u003C\u002FTR>\n      \u003CTR>\u003CTD>name\u003C\u002FTD>\u003C\u002FTR>\n      \u003CTR>\u003CTD>date\u003C\u002FTD>\u003C\u002FTR>\n      \u003C\u002FTABLE>\n    >\n  ];\n  struct1:barid1 -> struct0:barid0;\n}\n\u003C\u002Fgraph>\n\n\u003Cgraph>\n  digraph {\n    n1 -> n2;\n    n2 -> n3;\n    n3 -> n1;\n  }\n\u003C\u002Fgraph>\n\u003Cgraph>\n  digraph {\n    node [shape=box];\n    rankdir=LR;\n    n1 -> n2;\n    n2 -> n3;\n    n3 -> n1;\n  }\n\u003C\u002Fgraph>\n\n\u003Cgraph>\ndigraph G {\n\n    subgraph cluster_0 {\n        style=filled;\n        color=lightgrey;\n        node [style=filled,color=white];\n        a0 -> a1 -> a2 -> a3;\n        label = \"process #1\";\n    }\n\n    subgraph cluster_1 {\n        node [style=filled];\n        b0 -> b1 -> b2 -> b3;\n        label = \"process #2\";\n        color=blue\n    }\n    start -> a0;\n    start -> b0;\n    a1 -> b3;\n    b2 -> a3;\n    a3 -> a0;\n    a3 -> end;\n    b3 -> end;\n\n    start [shape=Mdiamond];\n    end [shape=Msquare];\n}\n\u003C\u002Fgraph>\n",[704,4456,4454],{"__ignoreMap":474},{"title":474,"searchDepth":475,"depth":475,"links":4458},[],"2004-05-13T10:51-04:00","The graph module uses GraphViz to draw graphs. Here are some examples I've put together, but much fancier things are possible. See http:\u002F\u002Fwww.research.att.com\u002Fsw\u002Ftools\u002Fgraphviz\u002Frefs.html for GraphViz documentation, and see http:\u002F\u002Fwww.research.att.com\u002Fsw\u002Ftools\u002Fgraphviz\u002Fexamples\u002F for some examples.",{},{"title":4432,"description":4460},[490],"2018-12-15T12:29-05:00","kLvnRZi29CdWaD9pWsxMhh3nNRXoLhrTNklvFp_MXCQ",{"id":4467,"title":4468,"body":4469,"createdAt":4560,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4561,"navigation":486,"path":272,"seo":4562,"stem":273,"tags":4563,"updatedAt":4560,"__hash__":4564},"content\u002FOCaml Eval.md","OCaml_Eval",{"type":8,"value":4470,"toc":4553},[4471,4475,4483,4485,4502,4506,4510,4513,4534,4550],[30,4472,4474],{"id":4473},"evaluate-ocaml-code-dynamically","Evaluate OCaml Code Dynamically",[11,4476,4477,4478,4482],{},"This is a horrid thing that you probably shouldn't do. That said -- sometimes it would be nice to evaluate some arbitrary OCaml code at runtime (in ",[22,4479,4481],{"href":4480},"\u002Fgenetic-programming","Genetic Programming",", for example). Based on some code in the interactive toplevel module this isn't hard to do.",[1396,4484,2010],{"id":2009},[38,4486,4487,4494],{},[41,4488,4489,4490],{},"Source directory: ",[22,4491,4492],{"href":4492,"rel":4493},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Focaml\u002Feval\u002F",[26],[41,4495,4496],{},[3942,4497,4498,4499],{},"\ndarcs get \n",[22,4500,4492],{"href":4492,"rel":4501},[26],[1396,4503,4505],{"id":4504},"usage","Usage",[30,4507,4509],{"id":4508},"evaltestml","evaltest.ml",[11,4511,4512],{},"open Eval",[11,4514,4515,4516,4518,4519,4521,4522,4524,4525,4527,4528,4530,4531,4533],{},"let _ =",[519,4517],{},"\neval_reset();",[519,4520],{},"\nevalp \"let add1 x = x +1;;\";",[519,4523],{},"\nlet n : int = eval \"n\" \"let n = add1 2;;\" in",[519,4526],{},"\nprint_string \"n = \";",[519,4529],{},"\nprint_int n;",[519,4532],{},"\nprint_newline()",[11,4535,4536,4537,4539,4540,4546,4547,4549],{},"Result:",[519,4538],{},"\nbrock@ihd103:",[4541,4542,4543,4544,4539],"del",{},"\u002Ftmp$ ocamlc -o evaltest toplevellib.cma eval.ml evaltest.ml",[519,4545],{},"\u002Ftmp$ .\u002Fevaltest",[519,4548],{},"\nn = 3",[11,4551,4552],{},"Just like magic. Be sure to compile toplevellib.cma in with your stuff. Oh, and I'm pretty sure this only works in bytecode. Sorry.",{"title":474,"searchDepth":475,"depth":475,"links":4554},[4555,4559],{"id":4473,"depth":475,"text":4474,"children":4556},[4557,4558],{"id":2009,"depth":1421,"text":2010},{"id":4504,"depth":1421,"text":4505},{"id":4508,"depth":475,"text":4509},"2004-04-18T13:48-04:00",{},{"title":4468,"description":474},[490],"tPJaLSGO30QpY10ms1tPeVCGpte7yPa50sN3yflH_18",{"id":4566,"title":4567,"body":4568,"createdAt":4681,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4682,"navigation":486,"path":140,"seo":4683,"stem":141,"tags":4684,"updatedAt":4685,"__hash__":4686},"content\u002FAn Introduction to Programming via Perl.md","An_Introduction_to_Programming_via_Perl",{"type":8,"value":4569,"toc":4674},[4570,4574,4582,4585,4589,4592,4595,4604,4607,4609,4613,4616,4623,4627],[30,4571,4573],{"id":4572},"introduction","Introduction",[11,4575,4576,4577,4581],{},"The first programming language I ever learned was ",[22,4578,4580],{"href":4579},"\u002Fbasic","BASIC"," on the Apple IIe. It was the best of times... it was the worst of times. I went on to learn lots and lots of other languages, but one of the things that really drew me in to programming was the ease of writing that first little proggie... the magic of being able to get the genie in the bottle to mock things back at me was enthralling.",[11,4583,4584],{},"Later, in High School, there was a wonderful series of programming classes taught by Mrs. Denton (DD as I now get to call her), and she too started her students out with BASIC, albeit a much revised version. I've often contemplated the beginning programmer and how best to introduce them to the art. The answer is unfortunately obvious -- different learners require different introductions. One thing I have decided upon, however, is that there needs to be as little as possible distracting the student from understanding the essence of what they are doing. In teaching mathematics, as an analogy, students are first taught counting, and then addition, and then multiplication. If it were taught the other way around -- with multiplication first and explaining exactly what was going on (the adding and counting stuff) later, then the learning process would be long and quite painful. The same is true of learning to program.",[1396,4586,4588],{"id":4587},"some-issues-confronting-beginners","Some Issues Confronting Beginners",[11,4590,4591],{},"Life is hard for a beginning programmer, these days. With the Apple IIe, along with a lot of microcomputers at the time, the ''default'' mode of the machine allowed you to immediately begin programming in BASIC. No disks or installation was necessary. I think that this encouraged me and others to dive in.",[11,4593,4594],{},"Nowadays just getting started programming can be a challenge. It is like you have to know what you are doing before you can learn what you are doing. Some books might come with a CD or something to make it easy -- but these CDs aren't in the books any longer once they reach the public library. The internet offers a plethora of resources, but you must have access to the internet to attain them at the very least. Some websites have applets for you to start in, and this seems like a good idea... but it still doesn't seem as wonderful as the good 'ole Apple IIe days.",[11,4596,4597,4598,4603],{},"There are solutions, however. Pre-packaged, easy-to-install languages. Web-based interfaces so that there is not even an installation step. Perhaps a ",[22,4599,4602],{"href":4600,"rel":4601},"http:\u002F\u002Fwww.knoppix.org\u002F",[26],"knoppix-like"," CD which boots right into a programming prompt. Or all three!",[11,4605,4606],{},"... to be continued! ...",[444,4608],{},[30,4610,4612],{"id":4611},"getting-set-up","Getting Set Up",[11,4614,4615],{},"Things you'll need:",[38,4617,4618,4621],{},[41,4619,4620],{},"A text editor (wordpad for example)",[41,4622,2679],{},[30,4624,4626],{"id":4625},"lessons","Lessons",[38,4628,4629,4635,4641,4647,4653,4659,4665,4668,4671],{},[41,4630,4631],{},[22,4632,4634],{"href":4633},"\u002Flesson-00-philosophy","Lesson 00 - Philosophy",[41,4636,4637],{},[22,4638,4640],{"href":4639},"\u002Flesson-01-printing","Lesson 01 - Printing",[41,4642,4643],{},[22,4644,4646],{"href":4645},"\u002Flesson-02-variables","Lesson 02 - Variables",[41,4648,4649],{},[22,4650,4652],{"href":4651},"\u002Flesson-03-input","Lesson 03 - Input",[41,4654,4655],{},[22,4656,4658],{"href":4657},"\u002Flesson-04-math","Lesson 04 - Math",[41,4660,4661],{},[22,4662,4664],{"href":4663},"\u002Flesson-05-if-then-else","Lesson 05 - IF THEN ELSE",[41,4666,4667],{},"lists of things",[41,4669,4670],{},"while loop",[41,4672,4673],{},"... lesson N - Genie in a bottle",{"title":474,"searchDepth":475,"depth":475,"links":4675},[4676,4679,4680],{"id":4572,"depth":475,"text":4573,"children":4677},[4678],{"id":4587,"depth":1421,"text":4588},{"id":4611,"depth":475,"text":4612},{"id":4625,"depth":475,"text":4626},"2004-03-24T04:48-05:00",{},{"title":4567,"description":474},[490],"2005-02-08T12:56-05:00","HoJV76qBryiozZ7NVqdNTXt4WRQcZA3rAfdkfpHi34Y",{"id":4688,"title":4689,"body":4690,"createdAt":4713,"description":4714,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4715,"navigation":486,"path":293,"seo":4716,"stem":294,"tags":4717,"updatedAt":4718,"__hash__":4719},"content\u002FOddMuse Pingback.md","OddMuse_Pingback",{"type":8,"value":4691,"toc":4711},[4692,4699,4708],[11,4693,1101,4694,4698],{},[22,4695,4696],{"href":4696,"rel":4697},"http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Foddmuse_pingback\u002F",[26]," for source (and darcs repo).",[11,4700,4701,4702,4707],{},"I would appreciate it if people could link to this page in a pingback-enabled post of some kind so that I can make sure it works. The only way I've tested it is with ",[22,4703,4706],{"href":4704,"rel":4705},"http:\u002F\u002Fsoftware.hixie.ch\u002Futilities\u002Fcgi\u002Fpingback-proxy\u002Fclient.html",[26],"this client",", which has worked swimmingly.",[11,4709,4710],{},"This is the first step. Second would be to make oddmuse work as a pingback client too. The trick there is to make sure we aren't over-pinging links and I'm not sure how that should be done.",{"title":474,"searchDepth":475,"depth":475,"links":4712},[],"2004-03-20T01:44-05:00","See http:\u002F\u002Fthelackthereof.org\u002Fprojects\u002Fperl\u002Foddmuse_pingback\u002F for source (and darcs repo).",{},{"title":4689,"description":4714},[490],"2004-03-20T01:45-05:00","8EkNn3mlLUFv0vc16MeYAO1WEVqwwfCdYVJWDShVsVw",{"id":4721,"title":413,"body":4722,"createdAt":4779,"description":474,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4780,"navigation":486,"path":412,"seo":4781,"stem":413,"tags":4782,"updatedAt":4783,"__hash__":4784},"content\u002FVladimirBot.md",{"type":8,"value":4723,"toc":4776},[4724,4728,4731,4734,4737,4740,4743,4757,4764],[30,4725,4727],{"id":4726},"a-personal-information-robot","A personal information robot",[11,4729,4730],{},"Vladimir was born out of a few smaller applications needing improvement. The idea is that from the commandline, email, an IM client, or a webbrowser I should be able to access important information. Vladimir will be the conceptual center of all these interfaces -- an information robot keeping track of things for me.",[11,4732,4733],{},"In addition to talking to me, Vladimir will talk to other people too. My ultimate goal is to tell people to \"email Vladimir\" and set up an appointment with me. Because of this I am investigating natural language interfaces to Vladimir. Natural language is a funny thing -- not nearly as efficient as cryptic short commands, but significantly more user-friendly.",[11,4735,4736],{},"Vladimir is structured through several layers. The outer shell is a very slim interface to the command line or email or AIM (etc). These interfaces do the bare necessities of their respective protocol, getting the conversation out and passing it on to the main layer.",[11,4738,4739],{},"The main layer is more of a moderator, allowing all the modules a chance to respond to whatever input he received. An arbitrator of sorts. The modules themselves do a lot of work. They each (in turn) get a whack at handling the input and handling it in some way. One thing I'm toying around with is an idea of \"context levels\" to assist the moderator. Here's a rundown:",[11,4741,4742],{},"Context Levels",[38,4744,4745,4748,4751,4754],{},[41,4746,4747],{},"0 - None. There is no need to reference any other part of any conversation.",[41,4749,4750],{},"1 - Immediate. Need to reference the immediately preceding statements",[41,4752,4753],{},"2 - Conversation. Need to reference arbitrary parts of current conversation",[41,4755,4756],{},"3 - Global. Must reference part of any conversation ever.",[11,4758,956,4759,4763],{},[22,4760,4762],{"href":4761},"\u002Fvladimirbot-module-api","VladimirBot Module API"," for specific information on the outer construction of a module. Modules could, of course, themselves be split into many modules... the moderator doesn't care one bit. The very important thing is that modules should decide whether they can handle the input as quickly as possible so that the moderator can give other modules a chance to try.",[11,4765,4766,4767,4771,4772,661],{},"On the natural language front, please see my work on using an ",[22,4768,4770],{"href":4769},"\u002Fearley-parser","Earley Parser"," to write context-free, non-deterministic, complex grammars for some of the modules. I've put this over at ",[22,4773,4775],{"href":4774},"\u002Fvladimirbot-earley-parsing","VladimirBot Earley Parsing",{"title":474,"searchDepth":475,"depth":475,"links":4777},[4778],{"id":4726,"depth":475,"text":4727},"2003-10-10T01:35-04:00",{},{"title":413,"description":474},[490],"2003-10-10T01:42-04:00","aqevVdea22KXxI1f1q2uzhBqesefjbeMywShQlC02-A",{"id":4786,"title":4787,"body":4788,"createdAt":4795,"description":4792,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4796,"navigation":486,"path":4797,"seo":4798,"stem":4799,"tags":4800,"updatedAt":4795,"__hash__":4801},"content\u002FProject Abstract - GOE.md","Project_Abstract_-_GOE",{"type":8,"value":4789,"toc":4793},[4790],[11,4791,4792],{},"In Goe Object Environment I'm trying to create a smalltalk-like environment in Perl. This is possible through use of GTK bindings for a environment browser and Perl's own reflexive nature. This project has a lot of potential but I only touch it every other year or so.",{"title":474,"searchDepth":475,"depth":475,"links":4794},[],"2003-08-31T19:39-04:00",{},"\u002Fproject-abstract-goe",{"title":4787,"description":4792},"Project Abstract - GOE",[490,704],"Td6QVtyHYoW-YiBOey78MO0NBlOjfLaEGgJaABgieY4",{"id":4803,"title":4804,"body":4805,"createdAt":4811,"description":4792,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4812,"navigation":486,"path":4813,"seo":4814,"stem":4815,"tags":4816,"updatedAt":4817,"__hash__":4818},"content\u002FProject - GOE.md","Project_-_GOE",{"type":8,"value":4806,"toc":4809},[4807],[11,4808,4792],{},{"title":474,"searchDepth":475,"depth":475,"links":4810},[],"2003-08-31T19:24-04:00",{},"\u002Fproject-goe",{"title":4804,"description":4792},"Project - GOE",[490,704],"2003-08-31T19:40-04:00","X-Gda_aDPPC28deyk_zaLxhcBeM-noWeVZbNBD3lCKs",{"id":4820,"title":4821,"body":4822,"createdAt":4834,"description":4835,"draft":482,"extension":483,"image":484,"mastodonThread":484,"meta":4836,"navigation":486,"path":4837,"seo":4838,"stem":4839,"tags":4840,"updatedAt":4841,"__hash__":4842},"content\u002FProject - GOE (abstract).md","Project_-_GOE_(abstract)",{"type":8,"value":4823,"toc":4832},[4824,4829],[11,4825,4826,4827],{},"GOE - Goe Object Environment, see ",[22,4828,4815],{"href":4813},[11,4830,4831],{},"This is a perl project relying heavily on Perl's reflexive nature. The idea is to build a smalltalk-like environment for Perl.",{"title":474,"searchDepth":475,"depth":475,"links":4833},[],"2003-08-31T19:15-04:00","GOE - Goe Object Environment, see Project - GOE",{},"\u002Fproject-goe-(abstract)",{"title":4821,"description":4835},"Project - GOE (abstract)",[490,704],"2003-08-31T19:19-04:00","_nGY8A6xx2KyCHaHy1nKAyuRAYXwKF82Hfh6Px3gYqk",1778988315841]